31{
   34 
   37 
   39  JRange_t               X;
   40  JRange_t               Y;
   41  bool                   invertX;
   42  bool                   invertY;
   43  int                    numberOfOutliers;
   44  map_type               zmap;
   46 
   47  try {
   48 
   49    JParser<> zap(
"Auxiliary program to test contents of 1D histograms.");
 
   50 
   51    zap[
'f'] = 
make_field(inputFile,  
"measurement histogram, e.g: <file name>:<object name>");
 
   52    zap[
'x'] = 
make_field(X,          
"accepted x-range values")   = JRange_t();
 
   53    zap[
'y'] = 
make_field(Y,          
"accepted y-range values")   = JRange_t();
 
   59 
   60    zap(argc, argv);
   61  }
   62  catch(const exception &error) {
   63    FATAL(error.what() << endl);
 
   64  }
   65 
   66 
   67  int number_of_failures = 0;
   68 
   69  for (vector<JRootObjectID>::const_iterator input = inputFile.begin(); input != inputFile.end(); ++input) {
   70 
   71    DEBUG(
"Input: " << *input << endl);
 
   72 
   74 
   75    if (dir == NULL) {
   76      FATAL(
"File: " << input->getFullFilename() << 
" not opened." << endl);
 
   77    }
   78 
   79    const TRegexp regexp(input->getObjectName());
   80 
   81    TIter iter(dir->GetListOfKeys());
   82 
   83    for (TKey* key; (
key = (TKey*) iter.Next()) != NULL; ) {
 
   84 
   85      const TString tag(
key->GetName());
 
   86 
   87      DEBUG(
"Key: " << tag << 
" match = " << tag.Contains(regexp) << endl);
 
   88        
   89      
   90 
   91      if (tag.Contains(regexp) && 
isTObject(key)) {
 
   92 
   94 
   95        const TH1*    h1 = ( dynamic_cast<TProfile*>(p) != NULL ? dynamic_cast<TProfile*>(p) :
   96                            (dynamic_cast<TH1*>(p)      != NULL ? dynamic_cast<TH1*>(p)      : NULL) );
   97        const TGraph* 
g1 = ( 
dynamic_cast<TGraph*
>(p)   != NULL ? 
dynamic_cast<TGraph*
>(p)   : NULL );
 
   98 
   99        for (map_type::const_iterator i = zmap.begin(); i != zmap.end(); ++i) {
  100 
  101          const double    value = 
getResult(i->first, p);
 
  102          const JRange_t& range = i->second;
  103 
  104          DEBUG(
"Global test " << i->first << 
' ' << (range(value) ? 
"passed" : 
"failed") << endl);
 
  105 
  107        }       
  108 
  109 
  110        int number_of_events   = 0;
  111        int number_of_outliers = 0;
  112 
  113        if        (h1 != NULL) {
  114 
  115          for (Int_t i = 1; i <= h1->GetNbinsX(); ++i) {
  116 
  117            const Double_t 
x = h1->GetBinCenter (i);
 
  118            const Double_t 
y = h1->GetBinContent(i);
 
  119          
  120            if (X(x) == !invertX) {
  121 
  122              ++number_of_events;
  123 
  124              const bool ok = (Y(y) == !invertY);
  125 
  126              DEBUG(
"Test outlier " << h1->GetName() << 
" bin (" << i << 
") (" << h1->GetXaxis()->GetBinLabel(i) << 
") " << y << 
' ' << (ok ? 
"passed" : 
"failed") << endl);
 
  127            
  128              if (!ok) {
  129                ++number_of_outliers;
  130              }
  131            }
  132          }
  133 
  134        } 
else if (
g1 != NULL) {
 
  135 
  136          for (Int_t i = 0; i != 
g1->GetN(); ++i) {
 
  137 
  138            const Double_t 
x = 
g1->GetX()[i];
 
  139            const Double_t 
y = 
g1->GetY()[i];
 
  140 
  141            if (X(x) == !invertX) {
  142 
  143              ++number_of_events;
  144 
  145              const bool ok = (Y(y) == !invertY);
  146 
  147              DEBUG(
"Test outlier " << 
g1->GetName() << 
" bin (" << i << 
") " << y << 
' ' << (ok ? 
"passed" : 
"failed") << endl);
 
  148            
  149              if (!ok) {
  150                ++number_of_outliers;
  151              }
  152            }
  153          }
  154 
  155        } else {
  156 
  157          FATAL(
"Object at " << *input << 
" is not TH1 nor TGraph." << endl);
 
  158        }
  159 
  160 
  161        cout << (number_of_outliers > numberOfOutliers ? RED : GREEN);
  162        NOTICE(
"Number of outliers \"" << p->GetName() << 
"\" = " << number_of_outliers << 
"/" << number_of_events << endl);
 
  163        cout << RESET;
  164 
  165        if (number_of_outliers > numberOfOutliers) {
  166          ++number_of_failures;
  167        }
  168      }
  169    }
  170  }
  171 
  172  ASSERT(number_of_failures == 0);
 
  173 
  174  return 0;
  175}
#define DEBUG(A)
Message macros.
 
#define ASSERT(A,...)
Assert macro.
 
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
 
Double_t g1(const Double_t x)
Function.
 
Utility class to parse command line options.
 
TDirectory * getDirectory(const JRootObjectID &id)
Get TDirectory pointer.
 
bool isTObject(const TKey *key)
Check if given key corresponds to a TObject.
 
Double_t getResult(const TString &text, TObject *object=NULL)
Get result of given textual formula.
 
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
 
Empty structure for specification of parser element that is initialised (i.e. does not require input)...