Reports failure if: no acoustic data, too large number of outliers, emitter expected to work is not working, hydrophone expected to work is not working.
145{
148
149 string inputFile;
151 string facet;
157 int run;
158
159 try {
160
161 JParser<> zap(
"Auxiliary program to apply test criteria to 2D histograms monitoring acoustic rate per emitter.");
162
163 zap[
'i'] =
make_field(inputFile,
"output root file from JAcousticsMonitorRateSummary");
172 }
173 catch(const exception &error) {
175 }
176
180 out_summary <<
"\n(Note: red highlights are the reason for the warning)" <<
endl;
181
184 out_status <<
"INFORMATION ABOUT RECEIVER STATUS \nRun: " << run <<
endl;
185
186
187
189
190 map_type zmap;
191
193
194 if (in) {
195
197 JParameters_t parameters;
198
199 for (
string buffer;
getline(in, buffer); ) {
200
201 if (!buffer.empty() && buffer[0] != JParameters_t::SKIPLINE) {
202
204
205 if (is >> key >> parameters) { zmap[
key] = parameters; }
206 }
207 }
208
209 in.close();
210
211 } else {
213 }
214
215
216
218
219 try {
221 }
224 }
225
227
228 for (JDetector::const_iterator i =
detector.begin(); i !=
detector.end(); ++i) {
229
230 receivers[i->getID()] = i->getLocation();
231 }
232
235
236 JManager<int, TH2D>
H3(
new TH2D(
"H[%].rate-test",
NULL,
238 floor1.getUpperLimit() + 1, - 0.5,
floor1.getUpperLimit() + 0.5));
239
242 }
243
246 }
247
248
249
250 TFile* f = TFile::Open(inputFile.c_str());
251
253
255
256
263 }
264
265
266
267 for (map_type::const_iterator i = zmap.begin(); i != zmap.end(); ++i) {
268
269 if (i->first[0] == '0') { continue; }
270
274
276
277
280 out_status <<
"expected rate: " << i->second.expected_rate <<
endl;
281 out_status <<
"min rate fraction: " << i->second.range.getLowerLimit() <<
endl;
282 out_status <<
"max rate fraction: " << i->second.range.getUpperLimit() <<
endl;
283 out_status <<
"max allowed outliers: " << i->second.number_of_outliers <<
endl;
284 out_status <<
"\nDU\tFloor\tOutOfRange\tSupposedToWork\tRate" <<
endl;
289 h3->Fill(
ix-1,
iy-1, 1.0);
290 out_status <<
du <<
"\t" << floor <<
"\t" << 1 <<
"\t" << i->second.working <<
"\t" << 0 <<
endl;
291 }
292 }
293 }
294
295
297
299
301
302
303 if (!i->second.working) {
304 out_summary << (i->second.working != 0 ? RED : GREEN);
308 }
309
310
311 if (i->second.working) {
314
315 int number_of_bins = 0;
316 int number_of_outliers = 0;
317
318 double min_rate = i->second.expected_rate * i->second.range.getLowerLimit();
319 double max_rate = i->second.expected_rate * i->second.range.getUpperLimit();
320 int outliers = i->second.number_of_outliers;
321
322 if (h2 ==
NULL &&
dynamic_cast<TH2*
>(p) !=
NULL) { h2 =
dynamic_cast<TH2*
>(p); };
323
326 out_status <<
"expected rate: " << i->second.expected_rate <<
endl;
327 out_status <<
"min rate fraction: " << i->second.range.getLowerLimit() <<
endl;
328 out_status <<
"max rate fraction: " << i->second.range.getUpperLimit() <<
endl;
329 out_status <<
"max allowed outliers: " << i->second.number_of_outliers <<
endl;
330 out_status <<
"\nDU\tFloor\tOutOfRange\tSupposedToWork\tRate" <<
endl;
331
332 for (
Int_t ix = 1;
ix <= h2->GetXaxis()->GetNbins(); ++
ix) {
333 for (
Int_t iy = 1;
iy <= h2->GetYaxis()->GetNbins(); ++
iy) {
334
337 string floor =
to_string(h2->GetYaxis()->GetBinLabel(
iy));
338
340 floor.insert(floor.begin(), 3 - floor.length(), '0');
341 const string id =
du +
'.' + floor;
342
343 int working = 1;
344 int status = 0;
345 if (zmap.find(id)!=zmap.end()) { working = zmap.find(id)->second.working; }
346
347 ++number_of_bins;
348
349
351
352 h3->Fill(
ix-1,
iy-1, 1.0);
353 status = 1;
354
355 ++number_of_outliers;
356
357 if (working) {
358
359 if (floor == "000" && z == 0) {
360 out_summary <<
"DU " <<
du <<
", floor " << floor <<
" : Acoustic rate out of range -> " << z <<
" Hz." << RED <<
" Hydrophone stopped working." <<
endl;
363 } else {
364 out_summary <<
"DU " <<
du <<
", floor " << floor <<
" : Acoustic rate out of range -> " << z <<
" Hz." <<
endl;
365 }
366 }
367 } else if (!working) {
368 out_summary <<
"DU " <<
du <<
", floor " << floor <<
" : Working again -> " << z <<
" Hz." <<
endl;
369 }
370 out_status <<
du <<
"\t" << floor <<
"\t" << status <<
"\t" << working <<
"\t" << z <<
endl;
371 }
372 }
374
375 out_summary << (number_of_outliers >
outliers ? RED : GREEN) <<
"Number of outliers = " << number_of_outliers <<
"/" << number_of_bins <<
endl;
377
378 if (number_of_outliers >
outliers) {
379
383 } else {
384
387 }
388 }
389 break;
390
391
394 out_status <<
"expected rate: " << i->second.expected_rate <<
endl;
395 out_status <<
"min rate fraction: " << i->second.range.getLowerLimit() <<
endl;
396 out_status <<
"max rate fraction: " << i->second.range.getUpperLimit() <<
endl;
397 out_status <<
"max allowed outliers: " << i->second.number_of_outliers <<
endl;
398 out_status <<
"\nDU\tFloor\tOutOfRange\tSupposedToWork\tRate" <<
endl;
399
404 h3->Fill(
ix-1,
iy-1, 1.0);
405 out_status <<
du <<
"\t" << floor <<
"\t" << 1 <<
"\t" << i->second.working <<
"\t" << 0 <<
endl;
406 }
407 }
408
409
410 if (i->second.working) {
412 out_summary << (i->second.working != 0 ? RED : GREEN) <<
"Emitter stopped working." <<
endl;
414 } else {
416 }
417 }
418 }
419 }
422
423 return 0;
424}
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
void readDir(TDirectory *dir, std::vector< TString > &v)
#define MAKE_CSTRING(A)
Make C-string.
Template definition of a multi-dimensional oscillation probability interpolation table.
Utility class to parse command line options.
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
std::string to_string(const T &value)
Convert value to string.
std::istream & getline(std::istream &in, JString &object)
Read string from input stream until end of line.
const array_type< JKey_t > & get_keys(const std::map< JKey_t, JValue_t, JComparator_t, JAllocator_t > &data)
Method to create array of keys of map.
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
virtual clone_type clone() const override
Get clone of this object.