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;