Jpp  18.0.1-rc.2
the software that should make you happy
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Functions
JTestRange2D.cc File Reference

Auxiliary program to test contents of 2D histograms. More...

#include <string>
#include <iostream>
#include <iomanip>
#include <vector>
#include <map>
#include "TROOT.h"
#include "TFile.h"
#include "TKey.h"
#include "TString.h"
#include "TRegexp.h"
#include "TH2.h"
#include "TGraph2D.h"
#include "JTools/JRange.hh"
#include "JGizmo/JRootObjectID.hh"
#include "JGizmo/JGizmoToolkit.hh"
#include "Jeep/JColor.hh"
#include "Jeep/JParser.hh"
#include "Jeep/JMessage.hh"

Go to the source code of this file.

Functions

int main (int argc, char **argv)
 

Detailed Description

Auxiliary program to test contents of 2D histograms.

Author
mdejong

Definition in file JTestRange2D.cc.

Function Documentation

int main ( int  argc,
char **  argv 
)

Definition at line 29 of file JTestRange2D.cc.

30 {
31  using namespace std;
32  using namespace JPP;
33 
34  typedef JRange<Double_t> JRange_t;
35  typedef map<TString, JRange_t> map_type;
36 
37  vector<JRootObjectID> inputFile;
38  JRange_t X;
39  JRange_t Y;
40  JRange_t Z;
41  bool invertX;
42  bool invertY;
43  bool invertZ;
44  int numberOfOutliers;
45  map_type zmap;
46  int debug;
47 
48  try {
49 
50  JParser<> zap("Auxiliary program to test contents of 2D histograms.");
51 
52  zap['f'] = make_field(inputFile, "measurement histogram, e.g: <file name>:<object name>");
53  zap['x'] = make_field(X, "accepted x-range values") = JRange_t();
54  zap['y'] = make_field(Y, "accepted y-range values") = JRange_t();
55  zap['z'] = make_field(Z, "accepted z-range values") = JRange_t();
56  zap['X'] = make_field(invertX);
57  zap['Y'] = make_field(invertY);
58  zap['Z'] = make_field(invertZ);
59  zap['N'] = make_field(numberOfOutliers) = 0;
60  zap['H'] = make_field(zmap, "global tests") = JPARSER::initialised();
61  zap['d'] = make_field(debug) = 1;
62 
63  zap(argc, argv);
64  }
65  catch(const exception &error) {
66  FATAL(error.what() << endl);
67  }
68 
69  int number_of_failures = 0;
70 
71  for (vector<JRootObjectID>::const_iterator input = inputFile.begin(); input != inputFile.end(); ++input) {
72 
73  DEBUG("Input: " << *input << endl);
74 
75  TDirectory* dir = getDirectory(*input);
76 
77  if (dir == NULL) {
78  FATAL("File: " << input->getFullFilename() << " not opened." << endl);
79  }
80 
81  const TRegexp regexp(input->getObjectName());
82 
83  TIter iter(dir->GetListOfKeys());
84 
85  for (TKey* key; (key = (TKey*) iter.Next()) != NULL; ) {
86 
87  const TString tag(key->GetName());
88 
89  DEBUG("Key: " << tag << " match = " << tag.Contains(regexp) << endl);
90 
91  // option match
92 
93  if (tag.Contains(regexp) && isTObject(key)) {
94 
95  TObject* p = key->ReadObj();
96 
97  const TH2* h2 = (dynamic_cast<TH2*>(p) != NULL ? dynamic_cast<TH2*>(p) : NULL);
98  const TGraph2D* g2 = (dynamic_cast<TGraph2D*>(p) != NULL ? dynamic_cast<TGraph2D*>(p) : NULL);
99 
100  for (map_type::const_iterator i = zmap.begin(); i != zmap.end(); ++i) {
101 
102  const double value = getResult(i->first, p);
103  const JRange_t& range = i->second;
104 
105  DEBUG("Global test " << i->first << ' ' << (range(value) ? "passed" : "failed") << endl);
106 
107  ASSERT(range(value));
108  }
109 
110 
111  int number_of_events = 0;
112  int number_of_outliers = 0;
113 
114  if (h2 != NULL) {
115 
116  for (Int_t ix = 1; ix <= h2->GetXaxis()->GetNbins(); ++ix) {
117  for (Int_t iy = 1; iy <= h2->GetYaxis()->GetNbins(); ++iy) {
118 
119  const Double_t x = h2->GetXaxis()->GetBinCenter(ix);
120  const Double_t y = h2->GetYaxis()->GetBinCenter(iy);
121  const Double_t z = h2->GetBinContent(ix, iy);
122 
123  if (X(x) == !invertX &&
124  Y(y) == !invertY) {
125 
126  ++number_of_events;
127 
128  const bool ok = (Z(z) == !invertZ);
129 
130  DEBUG("Test outlier " << h2->GetName() << " bin (" << ix << "," << iy << ") " << z << ' ' << (ok ? "passed" : "failed") << endl);
131 
132  if (!ok) {
133  ++number_of_outliers;
134  }
135  }
136  }
137  }
138 
139  } else if (g2 != NULL) {
140 
141  for (Int_t i = 0; i != g2->GetN(); ++i) {
142 
143  const Double_t x = g2->GetX()[i];
144  const Double_t y = g2->GetY()[i];
145  const Double_t z = g2->GetZ()[i];
146 
147  if (X(x) == !invertX &&
148  Y(y) == !invertY) {
149 
150  ++number_of_events;
151 
152  const bool ok = (Z(z) == !invertZ);
153 
154  DEBUG("Test outlier " << g2->GetName() << " bin (" << i << ") " << z << ' ' << (ok ? "passed" : "failed") << endl);
155 
156  if (!ok) {
157  ++number_of_outliers;
158  }
159  }
160  }
161 
162  } else {
163 
164  FATAL("Object at " << *input << " is not TH2 nor TGraph2D." << endl);
165  }
166 
167 
168  cout << (number_of_outliers > numberOfOutliers ? RED : GREEN);
169  NOTICE("Number of outliers \"" << p->GetName() << "\" = " << number_of_outliers << "/" << number_of_events << endl);
170  cout << RESET;
171 
172  if (number_of_outliers > numberOfOutliers) {
173  ++number_of_failures;
174  }
175  }
176  }
177  }
178 
179  ASSERT(number_of_failures == 0);
180 
181  return 0;
182 }
Utility class to parse command line options.
Definition: JParser.hh:1514
Definition: JRoot.hh:19
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
Definition: JParser.hh:83
then fatal Wrong number of arguments fi set_variable STRING $argv[1] set_variable DETECTORXY_TXT $WORKDIR $DETECTORXY_TXT tail read X Y CHI2 RMS printf optimum n $X $Y $CHI2 $RMS awk v Y
#define ASSERT(A,...)
Assert macro.
Definition: JMessage.hh:90
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition: JParser.hh:1989
Double_t getResult(const TString &text, TObject *object=NULL)
Get result of given textual formula.
#define NOTICE(A)
Definition: JMessage.hh:64
#define FATAL(A)
Definition: JMessage.hh:67
z range($ZMAX-$ZMIN)< $MINIMAL_DZ." fi fi typeset -Z 4 STRING typeset -Z 2 FLOOR JPlot1D -f $
bool isTObject(const TKey *key)
Check if given key corresponds to a TObject.
no fit printf nominal n $STRING awk v X
TDirectory * getDirectory(const JRootObjectID &id)
Get TDirectory pointer.
do set_variable MODULE getModule a $WORKDIR detector_a datx L $STRING JEditDetector a $WORKDIR detector_a datx M $MODULE setz o $WORKDIR detector_a datx JEditDetector a $WORKDIR detector_b datx M $MODULE setz o $WORKDIR detector_b datx done echo Output stored at $WORKDIR detector_a datx and $WORKDIR tripod_a txt JDrawDetector2D a $WORKDIR detector_a datx a $WORKDIR detector_b datx L BL o detector $FORMAT $BATCH JDrawDetector2D T $WORKDIR tripod_a txt T $WORKDIR tripod_b txt L BL o tripod $FORMAT $BATCH JCompareDetector a $WORKDIR detector_a datx b $WORKDIR detector_b datx o $WORKDIR abc root &dev null for KEY in X Y Z
int debug
debug level
#define DEBUG(A)
Message macros.
Definition: JMessage.hh:62