Jpp test-rotations-old
the software that should make you happy
Loading...
Searching...
No Matches
JTestRange3D.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 "TH3.h"
13
14#include "JTools/JRange.hh"
17
18#include "Jeep/JColor.hh"
19#include "Jeep/JParser.hh"
20#include "Jeep/JMessage.hh"
21
22
23/**
24 * \file
25 * Auxiliary program to test contents of 3D histograms.
26 * \author mdejong
27 */
28int main(int argc, char **argv)
29{
30 using namespace std;
31 using namespace JPP;
32
33 typedef JRange<Double_t> JRange_t;
34 typedef map<TString, JRange_t> map_type;
35
36 vector<JRootObjectID> inputFile;
37 JRange_t X;
38 JRange_t Y;
39 JRange_t Z;
40 JRange_t C;
41 bool invertX;
42 bool invertY;
43 bool invertZ;
44 bool invertC;
45 int numberOfOutliers;
46 map_type zmap;
47 int debug;
48
49 try {
50
51 JParser<> zap("Auxiliary program to test contents of 3D histograms.");
52
53 zap['f'] = make_field(inputFile, "measurement histogram, e.g: <file name>:<object name>");
54 zap['x'] = make_field(X, "accepted x-range values") = JRange_t();
55 zap['y'] = make_field(Y, "accepted y-range values") = JRange_t();
56 zap['z'] = make_field(Z, "accepted z-range values") = JRange_t();
57 zap['c'] = make_field(C, "accepted codomain values") = JRange_t();
58 zap['X'] = make_field(invertX);
59 zap['Y'] = make_field(invertY);
60 zap['Z'] = make_field(invertZ);
61 zap['C'] = make_field(invertC);
62 zap['N'] = make_field(numberOfOutliers) = 0;
63 zap['H'] = make_field(zmap, "global tests") = JPARSER::initialised();
64 zap['d'] = make_field(debug) = 1;
65
66 zap(argc, argv);
67 }
68 catch(const exception &error) {
69 FATAL(error.what() << endl);
70 }
71
72 int number_of_failures = 0;
73
74 for (vector<JRootObjectID>::const_iterator input = inputFile.begin(); input != inputFile.end(); ++input) {
75
76 DEBUG("Input: " << *input << endl);
77
78 TDirectory* dir = getDirectory(*input);
79
80 if (dir == NULL) {
81 FATAL("File: " << input->getFullFilename() << " not opened." << endl);
82 }
83
84 const TRegexp regexp(input->getObjectName());
85
86 TIter iter(dir->GetListOfKeys());
87
88 for (TKey* key; (key = (TKey*) iter.Next()) != NULL; ) {
89
90 const TString tag(key->GetName());
91
92 DEBUG("Key: " << tag << " match = " << tag.Contains(regexp) << endl);
93
94 // option match
95
96 if (tag.Contains(regexp) && isTObject(key)) {
97
98 TObject* p = key->ReadObj();
99
100 TH3* h3 = (dynamic_cast<TH3*>(p) != NULL ? dynamic_cast<TH3*>(p) : NULL);
101
102 for (map_type::const_iterator i = zmap.begin(); i != zmap.end(); ++i) {
103
104 const double value = getResult(i->first, p);
105 const JRange_t& range = i->second;
106
107 DEBUG("Global test " << i->first << ' ' << (range(value) ? "passed" : "failed") << endl);
108
109 ASSERT(range(value));
110 }
111
112
113 int number_of_events = 0;
114 int number_of_outliers = 0;
115
116 if (h3 != NULL) {
117
118 for (Int_t ix = 1; ix <= h3->GetXaxis()->GetNbins(); ++ix) {
119 for (Int_t iy = 1; iy <= h3->GetYaxis()->GetNbins(); ++iy) {
120 for (Int_t iz = 1; iz <= h3->GetZaxis()->GetNbins(); ++iz) {
121
122 const Double_t x = h3->GetXaxis()->GetBinCenter(ix);
123 const Double_t y = h3->GetYaxis()->GetBinCenter(iy);
124 const Double_t z = h3->GetZaxis()->GetBinCenter(iz);
125 const Double_t c = h3->GetBinContent(ix, iy, iz);
126
127 if (X(x) == !invertX &&
128 Y(y) == !invertY &&
129 Z(z) == !invertZ) {
130
131 ++number_of_events;
132
133 const bool ok = (C(c) == !invertC);
134
135 DEBUG("Test outlier " << h3->GetName() << " bin (" << ix << "," << iy << ',' << iz << ") (" << h3->GetXaxis()->GetBinLabel(ix) << "," << h3->GetYaxis()->GetBinLabel(iy) << "," << h3->GetZaxis()->GetBinLabel(iz) << ") " << c << ' ' << (ok ? "passed" : "failed") << endl);
136
137 if (!ok) {
138 ++number_of_outliers;
139 }
140 }
141 }
142 }
143 }
144
145 } else {
146
147 FATAL("Object at " << *input << " is not TH3" << endl);
148 }
149
150
151 cout << (number_of_outliers > numberOfOutliers ? RED : GREEN);
152 NOTICE("Number of outliers \"" << p->GetName() << "\" = " << number_of_outliers << "/" << number_of_events << endl);
153 cout << RESET;
154
155 if (number_of_outliers > numberOfOutliers) {
156 ++number_of_failures;
157 }
158 }
159 }
160 }
161
162 ASSERT(number_of_failures == 0);
163
164 return 0;
165}
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
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