Jpp  18.0.0-rc.2
the software that should make you happy
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
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 
16 #include "JGizmo/JRootObjectID.hh"
17 #include "JGizmo/JGizmoToolkit.hh"
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 
28 namespace {
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  */
93 int 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 }
Utility class to parse command line options.
Definition: JParser.hh:1514
debug
Definition: JMessage.hh:29
int main(int argc, char *argv[])
Definition: Main.cc:15
*fatal Wrong number of arguments esac JCookie sh typeset Z DETECTOR typeset Z SOURCE_RUN typeset Z TARGET_RUN set_variable PARAMETERS_FILE $WORKDIR parameters
Definition: diff-Tuna.sh:38
#define MAKE_CSTRING(A)
Make C-string.
Definition: JPrint.hh:136
Auxiliary data structure for floating point format specification.
Definition: JManip.hh:446
string outputFile
is
Definition: JDAQCHSM.chsm:167
static const JColorFacetMap_t color_facets
Color facets.
Definition: JColorFacet.hh:332
I/O formatting auxiliaries.
I/O coloring auxiliaries.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition: JParser.hh:1989
std::istream & getline(std::istream &in, JString &object)
Read string from input stream until end of line.
Definition: JString.hh:478
Auxiliary methods to convert data members or return values of member methods of a set of objects to a...
Range of values.
Definition: JRange.hh:38
General purpose messaging.
#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 $
std::istream & operator>>(std::istream &in, JAANET::JHead &header)
Read header from input.
Definition: JHead.hh:1814
Auxiliary class to define a range between two values.
Utility class to parse command line options.
bool isTObject(const TKey *key)
Check if given key corresponds to a TObject.
TDirectory * getDirectory(const JRootObjectID &id)
Get TDirectory pointer.
std::ostream & operator<<(std::ostream &stream, const CLBCommonHeader &header)
then fatal Wrong number of arguments fi set_variable DETECTOR $argv[1] set_variable INPUT_FILE $argv[2] eval JPrintDetector a $DETECTOR O IDENTIFIER eval JPrintDetector a $DETECTOR O SUMMARY JAcoustics sh $DETECTOR_ID source JAcousticsToolkit sh CHECK_EXIT_CODE typeset A EMITTERS get_tripods $WORKDIR tripod txt EMITTERS get_transmitters $WORKDIR transmitter txt EMITTERS for EMITTER in
Definition: JCanberra.sh:46
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.
Definition: JVectorize.hh:139
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