Jpp test-rotations-new
the software that should make you happy
Loading...
Searching...
No Matches
JTestRange1D.cc
Go to the documentation of this file.
1#include <string>
2#include <iostream>
3#include <iomanip>
4#include <vector>
5#include <map>
6
7#include "TROOT.h"
8#include "TFile.h"
9#include "TKey.h"
10#include "TString.h"
11#include "TRegexp.h"
12#include "TH1.h"
13#include "TProfile.h"
14#include "TGraph.h"
15
16#include "JTools/JRange.hh"
19
20#include "Jeep/JColor.hh"
21#include "Jeep/JParser.hh"
22#include "Jeep/JMessage.hh"
23
24
25/**
26 * \file
27 * Auxiliary program to test contents of of 1D histograms.
28 * \author mdejong
29 */
30int main(int argc, char **argv)
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 << ") (" << 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}
I/O coloring auxiliaries.
General purpose messaging.
#define DEBUG(A)
Message macros.
Definition JMessage.hh:62
#define ASSERT(A,...)
Assert macro.
Definition JMessage.hh:90
#define NOTICE(A)
Definition JMessage.hh:64
#define FATAL(A)
Definition JMessage.hh:67
int debug
debug level
Definition JSirene.cc:72
Utility class to parse command line options.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition JParser.hh:2142
Double_t g1(const Double_t x)
Function.
Definition JQuantiles.cc:25
Auxiliary class to define a range between two values.
int main(int argc, char **argv)
Utility class to parse command line options.
Definition JParser.hh:1698
Range of values.
Definition JRange.hh:42
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)...
Definition JParser.hh:68