150 string parametersFile;
152 string output_summary;
153 string output_status;
156 int number_of_failures = 0;
161 JParser<> zap(
"Auxiliary program to apply test criteria to 2D histograms monitoring acoustic rate per emitter.");
163 zap[
'i'] =
make_field(inputFile,
"output root file from JAcousticsMonitorRateSummary");
164 zap[
'@'] =
make_field(parametersFile,
"ASCII formatted input file with test criteria (acoustics_monitor)");
165 zap[
'F'] =
make_field(facet,
"Color facet") = get_keys(color_facets);
167 zap[
's'] =
make_field(output_summary,
"output summary file");
168 zap[
'o'] =
make_field(output_status,
"output information file working/not working");
173 catch(
const exception &error) {
174 FATAL(error.what() << endl);
177 ofstream out_summary(output_summary.c_str());
178 out_summary.imbue(locale(out_summary.getloc(), color_facets[facet]->clone()));
179 out_summary <<
"ACOUSTIC MONITORING \nRun: " << run << endl;
180 out_summary <<
"\n(Note: red highlights are the reason for the warning)" << endl;
183 out_status.open(output_status.c_str());
184 out_status <<
"INFORMATION ABOUT RECEIVER STATUS \nRun: " << run << endl;
192 ifstream in(parametersFile.c_str());
197 JParameters_t parameters;
199 for (
string buffer; getline(in, buffer); ) {
201 if (!buffer.empty() && buffer[0] != JParameters_t::SKIPLINE) {
203 istringstream is(buffer);
205 if (is >> key >> parameters) { zmap[key] = parameters; }
212 FATAL(
"Error opening file: " << parametersFile << endl);
228 for (JDetector::const_iterator i =
detector.begin(); i !=
detector.end(); ++i) {
230 receivers[i->getID()] = i->getLocation();
234 const JRange <int> floor1 (make_array(
detector.begin(),
detector.end(), &JModule::getFloor));
236 JManager<int, TH2D> H3(
new TH2D(
"H[%].rate-test", NULL,
237 string1.size(), - 0.5, string1.size() - 0.5,
240 for (Int_t i = 1; i <= H3->GetXaxis()->GetNbins(); ++i) {
241 H3->GetXaxis()->SetBinLabel(i,
MAKE_CSTRING(string1.at(i-1)));
244 for (Int_t i = 1; i <= H3->GetYaxis()->GetNbins(); ++i) {
250 TFile* f = TFile::Open(inputFile.c_str());
258 if(objectIDs.empty()) {
259 ++number_of_failures;
261 out_summary << RED <<
"No acoustic data." << endl;
262 out_summary << RESET;
267 for (map_type::const_iterator i = zmap.begin(); i != zmap.end(); ++i) {
269 if (i->first[0] ==
'0') {
continue; }
271 out_summary <<
"\nEmitter: " << i->first << endl;
272 out_status <<
"\nEmitter: " << i->first << endl;
273 const TRegexp regexp(
"H\\[" + i->first +
"\\]");
275 TH2D* h3 = H3[stoi(i->first)];
279 out_summary <<
"No data at all." << endl;
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;
285 for (Int_t ix = 1; ix <= h3->GetXaxis()->GetNbins(); ++ix) {
286 for (Int_t iy = 1; iy <= h3->GetYaxis()->GetNbins(); ++iy) {
287 string du = to_string(h3->GetXaxis()->GetBinLabel(ix));
288 string floor = to_string(h3->GetYaxis()->GetBinLabel(iy));
289 h3->Fill(ix-1, iy-1, 1.0);
290 out_status << du <<
"\t" << floor <<
"\t" << 1 <<
"\t" << i->second.working <<
"\t" << 0 << endl;
296 for (vector<JRootObjectID>::const_iterator objectID = objectIDs.cbegin() ; objectID != objectIDs.cend() ; ++objectID) {
298 const TString& objectName = objectID->getFullObjectName();
300 if (objectName.Index(regexp) != -1) {
303 if (!i->second.working) {
304 out_summary << (i->second.working != 0 ? RED : GREEN);
305 out_summary <<
"Emitter started working." << endl;
306 out_summary << RESET;
307 out_summary <<
"(Acoustic rates not tested)" << endl;
311 if (i->second.working) {
315 int number_of_bins = 0;
316 int number_of_outliers = 0;
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;
322 if (h2 == NULL &&
dynamic_cast<TH2*
>(p) != NULL) { h2 =
dynamic_cast<TH2*
>(p); };
325 out_summary <<
"Testing acoustic rate." << endl;
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;
332 for (Int_t ix = 1; ix <= h2->GetXaxis()->GetNbins(); ++ix) {
333 for (Int_t iy = 1; iy <= h2->GetYaxis()->GetNbins(); ++iy) {
335 const Double_t z = h2->GetBinContent(ix, iy);
336 string du = to_string(h2->GetXaxis()->GetBinLabel(ix));
337 string floor = to_string(h2->GetYaxis()->GetBinLabel(iy));
339 du.insert(du.begin(), 4 - du.length(),
'0');
340 floor.insert(floor.begin(), 3 - floor.length(),
'0');
341 const string id = du +
'.' + floor;
345 if (zmap.find(
id)!=zmap.end()) { working = zmap.find(
id)->second.working; }
350 if (z < min_rate || z > max_rate) {
352 h3->Fill(ix-1, iy-1, 1.0);
355 ++number_of_outliers;
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;
361 out_summary << RESET;
362 ++number_of_failures;
364 out_summary <<
"DU " << du <<
", floor " << floor <<
" : Acoustic rate out of range -> " << z <<
" Hz." << endl;
367 }
else if (!working) {
368 out_summary <<
"DU " << du <<
", floor " << floor <<
" : Working again -> " << z <<
" Hz." << endl;
370 out_status << du <<
"\t" << floor <<
"\t" << status <<
"\t" << working <<
"\t" << z << endl;
373 }
else {
FATAL(
"Object at " << objectName <<
" is not TH2." << endl); }
375 out_summary << (number_of_outliers > outliers ? RED : GREEN) <<
"Number of outliers = " << number_of_outliers <<
"/" << number_of_bins << endl;
376 out_summary << RESET;
378 if (number_of_outliers > outliers) {
380 ++number_of_failures;
381 out_summary << (number_of_outliers > outliers ? RED : GREEN) <<
"Test failed." << endl;
382 out_summary << RESET;
385 out_summary << (outliers >= number_of_outliers ? GREEN : RED) <<
"Test passed." << endl;
386 out_summary << RESET;
392 }
else if (objectID + 1 == objectIDs.cend()) {
393 out_summary <<
"Data from emitter not in input file." << endl;
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;
400 for (Int_t ix = 1; ix <= h3->GetXaxis()->GetNbins(); ++ix) {
401 for (Int_t iy = 1; iy <= h3->GetYaxis()->GetNbins(); ++iy) {
402 string du = to_string(h3->GetXaxis()->GetBinLabel(ix));
403 string floor = to_string(h3->GetYaxis()->GetBinLabel(iy));
404 h3->Fill(ix-1, iy-1, 1.0);
405 out_status << du <<
"\t" << floor <<
"\t" << 1 <<
"\t" << i->second.working <<
"\t" << 0 << endl;
410 if (i->second.working) {
411 ++number_of_failures;
412 out_summary << (i->second.working != 0 ? RED : GREEN) <<
"Emitter stopped working." << endl;
413 out_summary << RESET;
415 out_summary <<
"Emitter is expected to not work." << endl;