Jpp test-rotations-old
the software that should make you happy
Loading...
Searching...
No Matches
JTestTuna.cc
Go to the documentation of this file.
1#include <string>
2#include <iostream>
3#include <fstream>
4#include <iomanip>
5#include <map>
6
7#include "TROOT.h"
8#include "TFile.h"
9#include "TObject.h"
10#include "TKey.h"
11#include "TString.h"
12#include "TRegexp.h"
13#include "TGraph.h"
14#include "TF1.h"
15
18#include "JTools/JRange.hh"
19#include "JLang/JLangToolkit.hh"
20#include "JLang/JColorFacet.hh"
21#include "JLang/JVectorize.hh"
22
23#include "Jeep/JParser.hh"
24#include "Jeep/JMessage.hh"
25#include "Jeep/JPrint.hh"
26#include "Jeep/JColor.hh"
27
28namespace {
29
30 using JTOOLS::JRange;
31
32 /**
33 * Auxilliary data structure with test criteria.
34 */
35 struct JParameters_t {
36
37 static const char SKIPLINE = '#'; //!< skip line character
38
39 /**
40 * Default contrustor.
41 */
42 JParameters_t() :
43 number_of_entries (0),
44 number_of_outliers(0),
45 range(JRange<double>::DEFAULT_RANGE())
46 {}
47
48
49 /**
50 * Read parameters from input stream.
51 *
52 * \param input input stream
53 * \param object parameters
54 * \return input stream
55 */
56 friend inline std::istream& operator>>(std::istream& in, JParameters_t& object)
57 {
58 return in >> object.number_of_entries >> object.number_of_outliers >> object.range;
59 }
60
61
62 /**
63 * Write parameters to output stream.
64 *
65 * \param output output stream
66 * \param object parameters
67 * \return output stream
68 */
69 friend inline std::ostream& operator<<(std::ostream& out, const JParameters_t& object)
70 {
71 using namespace std;
72 using namespace JPP;
73
74 return out << setw(5) << object.number_of_entries << ' '
75 << setw(3) << object.number_of_outliers << ' '
76 << FIXED(15,3) << object.range.getLowerLimit() << ' '
77 << FIXED(15,3) << object.range.getUpperLimit();
78 }
79
80 int number_of_entries;
81 int number_of_outliers;
82 JRange<double> range;
83 };
84}
85
86
87/**
88 * \file
89 *
90 * Auxiliary program to apply test criteria to file.
91 * The option <tt>-f</tt> corresponds to <tt><file name>:<object name></tt>.
92 */
93int main(int argc, char **argv)
94{
95 using namespace std;
96 using namespace JPP;
97
98 JRootObjectID inputFile;
99 string parametersFile;
100 string outputFile;
101 string facet;
102 int debug;
103
104 try {
105
106 JParser<> zap("Auxiliary program to apply test criteria to file.");
107
108 zap['f'] = make_field(inputFile, "<input file>:<object name>");
109 zap['P'] = make_field(parametersFile, "ASCII formatted input file with test criteria");
110 zap['o'] = make_field(outputFile, "Optional output file with copy of failing input") = "";
111 zap['F'] = make_field(facet, "Color facet") = get_keys(color_facets);
112 zap['d'] = make_field(debug) = 1;
113
114 zap(argc, argv);
115 }
116 catch(const exception &error) {
117 FATAL(error.what() << endl);
118 }
119
120
121 map<string, int> counts;
122
123 typedef map<string, JParameters_t> map_type;
124
125 map_type zmap;
126
127 ifstream in(parametersFile.c_str());
128
129 if (in) {
130
131 string key;
132 JParameters_t parameters;
133
134 for (string buffer; getline(in, buffer); ) {
135
136 if (!buffer.empty() && buffer[0] != JParameters_t::SKIPLINE) {
137
138 istringstream is(buffer);
139
140 if (is >> key >> parameters) {
141 zmap [key] = parameters;
142 counts[key] = 0;
143 }
144 }
145 }
146
147 in.close();
148
149 } else {
150 FATAL("Error opening file: " << parametersFile << endl);
151 }
152
153 if (debug >= debug_t) {
154 for (map_type::const_iterator i = zmap.begin(); i != zmap.end(); ++i) {
155 cout << setw(48) << left << i->first << ' ' << i->second << endl;
156 }
157 }
158
159
160 TDirectory* dir = getDirectory(inputFile);
161
162 if (dir == NULL) {
163 FATAL("File: " << inputFile.getFullFilename() << " not opened." << endl);
164 }
165
166
167 TFile* out = (outputFile != "" ? new TFile(outputFile.c_str(), "recreate") : NULL);
168
169 cout.imbue(locale(cout.getloc(), color_facets[facet]->clone()));
170
171 int number_of_tests = 0;
172 int number_of_failures = 0;
173
174 const TRegexp regexp(inputFile.getObjectName());
175
176 TIter iter(dir->GetListOfKeys());
177
178 for (TKey* key; (key = (TKey*) iter.Next()) != NULL; ) {
179
180 const TString tag(key->GetName());
181
182 DEBUG("Key: " << tag << " match = " << tag.Contains(regexp) << endl);
183
184 // option match
185
186 if (tag.Contains(regexp) && isTObject(key) && strcmp(key->GetClassName(),TGraph::Class_Name()) == 0) {
187
188 TGraph* g1 = dynamic_cast<TGraph*>(key->ReadObj());
189
190 DEBUG(key->GetName() << ' ' << (g1 != NULL) << endl);
191
192 if (g1 != NULL) {
193
194 map_type::const_iterator p = zmap.find(g1->GetName());
195
196 if (p != zmap.end()) {
197
198 counts[p->first] += 1;
199
200 const JParameters_t& parameters = p->second;
201
202 const int number_of_entries = g1->GetN();
203
204 int number_of_outliers = 0;
205
206 for (int i = 0; i != g1->GetN(); ++i) {
207 if (!parameters.range(g1->GetY()[i])) {
208 ++number_of_outliers;
209 }
210 }
211
212 const bool status = (number_of_entries >= parameters.number_of_entries &&
213 number_of_outliers <= parameters.number_of_outliers);
214
215 cout << (status ? GREEN : RED) << "Test " << g1->GetName() << ' '
216 << (status ? "passed" : "failed") << ' '
217 << (number_of_entries >= parameters.number_of_entries ? "" : "too few entries") << ' '
218 << (number_of_outliers <= parameters.number_of_outliers ? "" : "too many outliers") << '.'
219 << RESET << endl;
220
221 if (out != NULL && !status) {
222
223 const JRange<double> range(g1->GetX(), g1->GetX() + g1->GetN());
224
225 g1->GetListOfFunctions()->Add(new TF1(MAKE_CSTRING(g1->GetName() << ":upper"), MAKE_CSTRING(parameters.range.getUpperLimit()), range.getLowerLimit(), range.getUpperLimit()));
226 g1->GetListOfFunctions()->Add(new TF1(MAKE_CSTRING(g1->GetName() << ":lower"), MAKE_CSTRING(parameters.range.getLowerLimit()), range.getLowerLimit(), range.getUpperLimit()));
227 out->WriteTObject(g1);
228 }
229
230 number_of_tests += 1;
231 number_of_failures += (status ? 0 : 1);
232 }
233 }
234 }
235 }
236
237 for (map<string, int>::const_iterator i = counts.begin(); i != counts.end(); ++i) {
238 if (i->second == 0) {
239
240 cout << RED << "Test " << i->first << " missing data." << RESET << endl;
241
242 number_of_tests += 1;
243 number_of_failures += 1;
244 }
245 }
246
247 cout << (number_of_tests > 0 && number_of_failures == 0 ? GREEN : RED) << "Number of tests/failures " << number_of_tests << "/" << number_of_failures << RESET << endl;
248
249 if (out != NULL) {
250
251 out->Write();
252 out->Close();
253
254 delete out;
255 }
256}
I/O coloring auxiliaries.
string outputFile
std::istream & operator>>(std::istream &in, JAANET::JHead &header)
Read header from input.
Definition JHead.hh:1832
General purpose messaging.
#define DEBUG(A)
Message macros.
Definition JMessage.hh:62
#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
I/O formatting auxiliaries.
#define MAKE_CSTRING(A)
Make C-string.
Definition JPrint.hh:72
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)
Definition JTestTuna.cc:93
Auxiliary methods to convert data members or return values of member methods of a set of objects to a...
Auxiliary class to handle file name, ROOT directory and object name.
TString getObjectName() const
Get object name.
TString getFullFilename() const
Get full file name, including path.
Utility class to parse command line options.
Definition JParser.hh:1698
Range of values.
Definition JRange.hh:42
T getLowerLimit() const
Get lower limit.
Definition JRange.hh:202
T getUpperLimit() const
Get upper limit.
Definition JRange.hh:213
std::ostream & operator<<(std::ostream &stream, const CLBCommonHeader &header)
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
Auxiliary data structure for floating point format specification.
Definition JManip.hh:448