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;
  150  string parametersFile;
  151  string facet;
  152  string output_summary;
  153  string output_status;
  154  string detectorFile;
  156  int    number_of_failures = 0;
  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");
 
  164    zap[
'@'] = 
make_field(parametersFile,     
"ASCII formatted input file with test criteria (acoustics_monitor)");
 
  167    zap[
's'] = 
make_field(output_summary,     
"output summary file");
 
  168    zap[
'o'] = 
make_field(output_status,      
"output information file working/not working");
 
  171    zap(argc, argv);
  172  }
  173  catch(const exception &error) {
  174    FATAL(error.what() << endl);
 
  175  }
  176 
  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;
  181  
  182  ofstream out_status;
  183  out_status.open(output_status.c_str());
  184  out_status << "INFORMATION ABOUT RECEIVER STATUS \nRun: " << run << endl;
  185  
  186  
  187 
  189 
  190  map_type zmap;
  191 
  192  ifstream in(parametersFile.c_str());
  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 
  203        istringstream is(buffer);
  204 
  205        if (is >> key >> parameters) { zmap[
key] = parameters; }
 
  206      }
  207    }
  208 
  209    in.close();
  210 
  211  } else {
  212    FATAL(
"Error opening file: " << parametersFile << endl);
 
  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 
  234  const JRange         <int> floor1 (make_array(
detector.begin(), 
detector.end(), &JModule::getFloor));
 
  235 
  236  JManager<int, TH2D> H3(new TH2D("H[%].rate-test",        NULL,
  237                                  string1.size(),             - 0.5, string1.size() - 0.5,
  238                                  floor1.getUpperLimit() + 1, - 0.5, floor1.getUpperLimit() + 0.5));
  239 
  240  for (Int_t i = 1; i <= H3->GetXaxis()->GetNbins(); ++i) {
  241    H3->GetXaxis()->SetBinLabel(i, 
MAKE_CSTRING(string1.at(i-1)));
 
  242  }
  243 
  244  for (Int_t i = 1; i <= H3->GetYaxis()->GetNbins(); ++i) {
  246  }
  247 
  248  
  249 
  250  TFile* f = TFile::Open(inputFile.c_str());  
  251 
  253 
  255 
  256  
  257  int no_data = 0;
  258  if(objectIDs.empty()) { 
  259    ++number_of_failures;
  260    no_data += 1;
  261    out_summary << RED << "No acoustic data." << endl; 
  262    out_summary << RESET;    
  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 
  271    out_summary << "\nEmitter: " << i->first << endl;
  272    out_status << "\nEmitter: " << i->first << endl;
  273    const TRegexp regexp("H\\[" + i->first + "\\]");
  274 
  275    TH2D* h3 = H3[stoi(i->first)];
  276 
  277    
  278    if (no_data > 0) {
  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; 
  291        }
  292      }
  293    }
  294 
  295    
  296    for (vector<JRootObjectID>::const_iterator objectID = objectIDs.cbegin() ; objectID != objectIDs.cend() ; ++objectID) {
  297    
  298      const TString& objectName = objectID->getFullObjectName();
  299      
  300      if (objectName.Index(regexp) != -1) {
  301 
  302         
  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;
  308        }
  309 
  310        
  311        if (i->second.working) {
  313          TH2*     h2 = NULL;
  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          
  324          if (h2 != NULL) {
  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;
  331 
  332            for (Int_t ix = 1; ix <= h2->GetXaxis()->GetNbins(); ++ix) {
  333              for (Int_t iy = 1; iy <= h2->GetYaxis()->GetNbins(); ++iy) {
  334 
  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));
 
  338                
  339                du.insert(du.begin(), 4 - du.length(), '0');
  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                
  350                if (z < min_rate || z > max_rate) {
  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;
  361                      out_summary << RESET;
  362                      ++number_of_failures;
  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            }
  373          } 
else { 
FATAL(
"Object at " << objectName << 
" is not TH2." << endl); }
 
  374            
  375          out_summary << (number_of_outliers > outliers ? RED : GREEN) << "Number of outliers = " << number_of_outliers << "/" << number_of_bins << endl;
  376          out_summary << RESET;
  377            
  378          if (number_of_outliers > outliers) {
  379          
  380            ++number_of_failures;
  381            out_summary << (number_of_outliers > outliers ? RED : GREEN) << "Test failed." << endl;
  382            out_summary << RESET;
  383          } else {
  384        
  385          out_summary << (outliers >= number_of_outliers ? GREEN : RED) << "Test passed." << endl;
  386          out_summary << RESET;
  387          }
  388        }
  389        break;
  390 
  391      
  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;
  399        
  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; 
  406          }
  407        }
  408        
  409        
  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;
  414        } else {
  415          out_summary << "Emitter is expected to not work." << endl;
  416        }
  417      }
  418    }
  419  }
  420  out_summary.close();
  421  out_status.close();
  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.
 
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).