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. 
  150   string parametersFile;
 
  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[
'f'] = 
make_field(inputFile,          
"output root file from JAcousticsMonitor_short");
 
  164     zap[
'P'] = 
make_field(parametersFile,     
"ASCII formatted input file with test criteria (acoustic_monitor_00000XXX.txt)");
 
  167     zap[
'w'] = 
make_field(outputFile1,         
"output summary file");
 
  168     zap[
't'] = 
make_field(outputFile2,         
"output root file");
 
  173   catch(
const exception &error) {
 
  174     FATAL(error.what() << endl);
 
  177   ofstream out(outputFile1.c_str());
 
  178   out.imbue(locale(out.getloc(), 
color_facets[facet]->clone()));
 
  179   out << 
"ACOUSTIC MONITORING \nRun: " << run << endl;
 
  180   out << 
"\n(Note: red highlights are the reason for the warning)" << endl;
 
  188   ifstream 
in(parametersFile.c_str());
 
  195     for (
string buffer; 
getline(
in, buffer); ) {
 
  197       if (!buffer.empty() && buffer[0] != JParameters_t::SKIPLINE) {
 
  199         istringstream 
is(buffer);
 
  201         if (
is >> key >> parameters) { zmap[key] = 
parameters; }
 
  208     FATAL(
"Error opening file: " << parametersFile << endl);
 
  218   catch(
const JException& error) {
 
  222   JHashMap<int, JLocation>   receivers;
 
  224   for (JDetector::const_iterator i = 
detector.begin(); i != 
detector.end(); ++i) {
 
  226     receivers[i->getID()] = i->getLocation();
 
  232   JManager<int, TH2D> H3(
new TH2D(
"H[%].rate-test",        NULL,
 
  233                                   string1.size(),             - 0.5, string1.size() - 0.5,
 
  234                                   floor1.getUpperLimit() + 1, - 0.5, floor1.getUpperLimit() + 0.5));
 
  236   for (Int_t i = 1; i <= H3->GetXaxis()->GetNbins(); ++i) {
 
  237     H3->GetXaxis()->SetBinLabel(i, 
MAKE_CSTRING(string1.at(i-1)));
 
  240   for (Int_t i = 1; i <= H3->GetYaxis()->GetNbins(); ++i) {
 
  246   TFile* 
f = TFile::Open(inputFile.c_str());  
 
  254   if(objectIDs.empty()) { 
 
  255     ++number_of_failures;
 
  257     out << 
RED << 
"No acoustic data." << endl; 
 
  263   for (map_type::const_iterator i = zmap.begin(); i != zmap.end(); ++i) {
 
  265     if (i->first[0] == 
'0') { 
continue; } 
 
  267     out << 
"\nEmitter: " << i->first << endl;
 
  269     const TRegexp regexp(i->first);
 
  271     TH2D* h3 = H3[stoi(i->first)];
 
  275       for (Int_t ix = 1; ix <= h3->GetXaxis()->GetNbins(); ++ix) {
 
  276         for (Int_t iy = 1; iy <= h3->GetYaxis()->GetNbins(); ++iy) {
 
  277           h3->Fill(ix-1, iy-1, 1.0);
 
  285       const TString& objectName = objectID->getFullObjectName();
 
  288       if (objectName.Index(regexp) != -1) {
 
  291         if (!i->second.working) {
 
  292           out << (i->second.working != 0 ? 
RED : 
GREEN);
 
  293           out << 
"Emitter started working." << endl;
 
  295           out << 
"(Acoustic rates not tested)" << endl;
 
  299         if (i->second.working) {
 
  303           int number_of_bins   = 0;
 
  304           int number_of_outliers = 0;
 
  306           double min_rate = i->second.expected_rate * i->second.range.getLowerLimit();
 
  307           double max_rate = i->second.expected_rate * i->second.range.getUpperLimit();
 
  308           int outliers = i->second.number_of_outliers;
 
  310           if (h2 == NULL && dynamic_cast<TH2*>(p) != NULL) { h2 = 
dynamic_cast<TH2*
>(p); };
 
  314             for (Int_t ix = 1; ix <= h2->GetXaxis()->GetNbins(); ++ix) {
 
  315               for (Int_t iy = 1; iy <= h2->GetYaxis()->GetNbins(); ++iy) {
 
  317                 const Double_t z = h2->GetBinContent(ix, iy);
 
  318                 string du = 
to_string(h2->GetXaxis()->GetBinLabel(ix));
 
  319                 string floor = 
to_string(h2->GetYaxis()->GetBinLabel(iy));
 
  321                 du.insert(du.begin(), 4 - du.length(), 
'0');
 
  322                 floor.insert(floor.begin(), 3 - floor.length(), 
'0');
 
  323                 const string id = du + 
'.' + floor;
 
  326                 if (zmap.find(
id)!=zmap.end()) { working = zmap.find(
id)->second.working; }
 
  331                 if (z < min_rate || z > max_rate) {
 
  333                   h3->Fill(ix-1, iy-1, 1.0);
 
  335                   ++number_of_outliers;
 
  338                     if (floor == 
"000" && z == 0) { 
 
  339                       out << 
"DU " << du << 
", floor " << floor << 
" : Acoustic rate out of range -> " << z << 
" Hz." << 
RED << 
" Hydrophone stopped working." << endl;
 
  341                       ++number_of_failures;
 
  343                       out << 
"DU " << du << 
", floor " << floor << 
" : Acoustic rate out of range -> " << z << 
" Hz." << endl;
 
  346                 } 
else if (!working) { 
 
  347                   out << 
"DU " << du << 
", floor " << floor << 
" : Working again -> " << z << 
" Hz." << endl;
 
  352           } 
else { 
FATAL(
"Object at " << objectName << 
" is not TH2." << endl); }
 
  354           out << (number_of_outliers > outliers ? 
RED : 
GREEN) << 
"Number of outliers = " << number_of_outliers << 
"/" << number_of_bins << endl;
 
  357           if (number_of_outliers > outliers) {
 
  359             ++number_of_failures;
 
  360             out << (number_of_outliers > outliers ? 
RED : 
GREEN) << 
"Test failed." << endl;
 
  364             out << (outliers >= number_of_outliers ? 
GREEN : 
RED) << 
"Test passed." << endl;
 
  372       } 
else if (objectID + 1 == objectIDs.cend()) {
 
  375         for (Int_t ix = 1; ix <= h3->GetXaxis()->GetNbins(); ++ix) {
 
  376           for (Int_t iy = 1; iy <= h3->GetYaxis()->GetNbins(); ++iy) {
 
  377             h3->Fill(ix-1, iy-1, 1.0);
 
  382         if (i->second.working) {
 
  383           ++number_of_failures;
 
  384           out << (i->second.working != 0 ? 
RED : 
GREEN) << 
"Emitter stopped working." << endl;
 
  387           out << 
"Emitter is expected to not work." << endl;
 
  394   TFile out2(outputFile2.c_str(), 
"recreate");
 
  402   if (number_of_failures > 0) {
 
  403     number_of_failures = 1;
 
  404     cout << number_of_failures << endl;
 
Utility class to parse command line options. 
o $QUALITY_ROOT d $DEBUG!CHECK_EXIT_CODE JPlot1D f
*fatal Wrong number of arguments esac JCookie sh typeset Z DETECTOR typeset Z SOURCE_RUN typeset Z TARGET_RUN set_variable PARAMETERS_FILE $WORKDIR parameters
#define MAKE_CSTRING(A)
Make C-string. 
static const JColorFacetMap_t color_facets
Color facets. 
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object 
const array_type< JValue_t > & make_array(const JValue_t(&array)[N])
Method to create array of values. 
std::istream & getline(std::istream &in, JString &object)
Read string from input stream until end of line. 
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. 
do set_variable DETECTOR_TXT $WORKDIR detector
then fatal Wrong number of arguments fi set_variable DETECTOR $argv[1] set_variable INPUT_FILE $argv[2] eval JPrintDetector a $DETECTOR O IDENTIFIER eval JPrintDetector a $DETECTOR O SUMMARY JAcoustics sh $DETECTOR_ID source JAcousticsToolkit sh CHECK_EXIT_CODE typeset A EMITTERS get_tripods $WORKDIR tripod txt EMITTERS get_transmitters $WORKDIR transmitter txt EMITTERS for EMITTER in
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. 
void readDir(TDirectory *dir, std::vector< TString > &v)