Jpp  17.2.1-pre0
the software that should make you happy
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Functions
JTestRange1D.cc File Reference

Auxiliary program to test contents of of 1D 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 "TH1.h"
#include "TProfile.h"
#include "TGraph.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 of 1D histograms.

Author
mdejong

Definition in file JTestRange1D.cc.

Function Documentation

int main ( int  argc,
char **  argv 
)

Definition at line 30 of file JTestRange1D.cc.

31 {
32  using namespace std;
33  using namespace JPP;
34 
35  typedef JRange<Double_t> JRange_t;
36  typedef map<TString, JRange_t> map_type;
37 
38  vector<JRootObjectID> inputFile;
39  JRange_t X;
40  JRange_t Y;
41  bool invertX;
42  bool invertY;
43  int numberOfOutliers;
44  map_type zmap;
45  int debug;
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();
54  zap['X'] = make_field(invertX);
55  zap['Y'] = make_field(invertY);
56  zap['N'] = make_field(numberOfOutliers) = 0;
57  zap['H'] = make_field(zmap, "global tests") = JPARSER::initialised();
58  zap['d'] = make_field(debug) = 1;
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 
73  TDirectory* dir = getDirectory(*input);
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  // option match
90 
91  if (tag.Contains(regexp) && isTObject(key)) {
92 
93  TObject* p = key->ReadObj();
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 
106  ASSERT(range(value));
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 << ") " << 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 }
Utility class to parse command line options.
Definition: JParser.hh:1517
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:1993
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.
int debug
debug level
#define DEBUG(A)
Message macros.
Definition: JMessage.hh:62
Double_t g1(const Double_t x)
Function.
Definition: JQuantiles.cc:25