Jpp 20.0.0-27-g39925593c-D
the software that should make you happy
Loading...
Searching...
No Matches
Functions
JTestTuna.cc File Reference

Auxiliary program to apply test criteria to file. More...

#include <string>
#include <iostream>
#include <fstream>
#include <iomanip>
#include <map>
#include "TROOT.h"
#include "TFile.h"
#include "TObject.h"
#include "TKey.h"
#include "TString.h"
#include "TRegexp.h"
#include "TGraph.h"
#include "TF1.h"
#include "JGizmo/JRootObjectID.hh"
#include "JGizmo/JGizmoToolkit.hh"
#include "JTools/JRange.hh"
#include "JLang/JLangToolkit.hh"
#include "JLang/JColorFacet.hh"
#include "JLang/JVectorize.hh"
#include "Jeep/JParser.hh"
#include "Jeep/JMessage.hh"
#include "Jeep/JPrint.hh"
#include "Jeep/JColor.hh"

Go to the source code of this file.

Functions

int main (int argc, char **argv)
 

Detailed Description

Auxiliary program to apply test criteria to file.

The option -f corresponds to <file name>:<object name>.

Definition in file JTestTuna.cc.

Function Documentation

◆ main()

int main ( int argc,
char ** argv )

Definition at line 93 of file JTestTuna.cc.

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
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;
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}
string outputFile
#define DEBUG(A)
Message macros.
Definition JMessage.hh:62
#define FATAL(A)
Definition JMessage.hh:67
int debug
debug level
Definition JSirene.cc:72
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition JParser.hh:2142
#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 handle file name, ROOT directory and object name.
TString getObjectName() const
Get object name.
TString getFullFilename() const
Get full file name, including path.
Template definition of a multi-dimensional oscillation probability interpolation table.
Utility class to parse command line options.
Definition JParser.hh:1698
T getLowerLimit() const
Get lower limit.
Definition JRange.hh:202
T getUpperLimit() const
Get upper limit.
Definition JRange.hh:213
TDirectory * getDirectory(const JRootObjectID &id)
Get TDirectory pointer.
bool isTObject(const TKey *key)
Check if given key corresponds to a TObject.
std::istream & getline(std::istream &in, JString &object)
Read string from input stream until end of line.
Definition JString.hh:478
const array_type< JKey_t > & get_keys(const std::map< JKey_t, JValue_t, JComparator_t, JAllocator_t > &data)
Method to create array of keys of map.
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
virtual clone_type clone() const override
Get clone of this object.
Definition JClonable.hh:69