44   struct JParameters_t {
 
   46     static const char SKIPLINE  =  
'#';           
 
   66     friend inline std::istream& 
operator>>(std::istream& 
in, JParameters_t& 
object)
 
   69       return in >> 
object.working >> 
object.expected_rate >> 
object.range >> 
object.number_of_outliers;
 
   80     friend inline std::ostream& 
operator<<(std::ostream& out, 
const JParameters_t& 
object)
 
   85       return out << setw(6)     << 
object.working     << 
' ' 
   86                  << 
FIXED(2,6)  << 
object.expected_rate    << 
' ' 
   87                  << 
FIXED(2,6)  << 
object.range.getLowerLimit() << 
' ' 
   88                  << 
FIXED(2,6)  << 
object.range.getUpperLimit() << 
' ' 
   89                  << setw(4)     << 
object.number_of_outliers;
 
   95     int  number_of_outliers;
 
  107     TIter iter(dir->GetListOfKeys());
 
  109     for (TKey* key; (key = (TKey*) iter.Next()) != NULL; ) {
 
  111       if (key->IsFolder()){
 
  113         dir->cd(key->GetName());
 
  115         TDirectory *subdir = gDirectory;
 
  124         buffer.push_back(objectID);
 
  144 int main(
int argc, 
char **argv)
 
  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);
 
  224   for (JDetector::const_iterator i = 
detector.begin(); i != 
detector.end(); ++i) {
 
  226     receivers[i->getID()] = i->getLocation();
 
  233                                   string1.size(),             - 0.5, string1.size() - 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. 
 
int main(int argc, char *argv[])
 
General purpose class for hash map of unique elements. 
 
o $QUALITY_ROOT d $DEBUG!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. 
 
General purpose class for a hash collection of unique elements. 
 
Auxiliary class to handle file name, ROOT directory and object name. 
 
Dynamic ROOT object management. 
 
Auxiliary data structure for floating point format specification. 
 
Data structure for detector geometry and calibration. 
 
#define MAKE_STRING(A)
Make string. 
 
static const JColorFacetMap_t color_facets
Color facets. 
 
Auxiliary class to manage set of compatible ROOT objects (e.g. histograms) using unique keys...
 
I/O formatting auxiliaries. 
 
I/O coloring auxiliaries. 
 
#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. 
 
Auxiliary methods to convert data members or return values of member methods of a set of objects to a...
 
General purpose messaging. 
 
z range($ZMAX-$ZMIN)< $MINIMAL_DZ." fi fi typeset -Z 4 STRING typeset -Z 2 FLOOR JPlot1D -f $
 
std::istream & operator>>(std::istream &in, JAANET::JHead &header)
Read header from input. 
 
void load(const std::string &file_name, JDetector &detector)
Load detector from input file. 
 
Auxiliary class to define a range between two values. 
 
Utility class to parse command line options. 
 
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)