Jpp  master_rocky-43-ge265d140c
the software that should make you happy
Functions
JZebraMantis.cc File Reference

Program to compare histograms in root files that have same directory structure,
and where the histograms have the same names. More...

#include <iostream>
#include <fstream>
#include "TString.h"
#include "TRegexp.h"
#include "TObjArray.h"
#include "TObjString.h"
#include "TFile.h"
#include "TKey.h"
#include "Jeep/JParser.hh"
#include "JSupport/JMeta.hh"
#include "JLang/JPredicate.hh"
#include "JCompareHistograms/JTest_t.hh"
#include "JCompareHistograms/JTestDictionary.hh"
#include "JGizmo/JRootObjectID.hh"

Go to the source code of this file.

Functions

int main (int argc, char **argv)
 

Detailed Description

Program to compare histograms in root files that have same directory structure,
and where the histograms have the same names.

The input histograms and the test to be applied for each histogram are specified
in an ASCII formatted steering file which is passed by the command line.

Each row of the steering file should have multiple columns.

Column 1 is the name of the histogram to be compared (including the full path inside the root file)
Column 2 is an integer value that indicates the test to be performed. See JTestDictionary()
Columns 3..n are reserved for the different parameters of the test.

Author
rgruiz, bjung

Definition in file JZebraMantis.cc.

Function Documentation

◆ main()

int main ( int  argc,
char **  argv 
)

Definition at line 82 of file JZebraMantis.cc.

82  {
83 
84  using namespace JPP;
85  using namespace std;
86 
87  string steeringFile;
88 
89  string file1;
90  string file2;
91 
92  string output;
93  string ascii;
94 
95  vector<string> keys;
96 
97  bool onlyFailures;
98 
99  int debug;
100 
101  const array_type<string>& listOfKeys = get_keys(JTestSummary().getProperties());
102 
103  try {
104 
105  const string& keysExplainer = MAKE_STRING("Terminal output:" << endl << listOfKeys);
106 
107  JParser<> zap("\nProgram to compare histograms in root files that have the same directory structure. See the link below this usage for further details.\n");
108 
109  zap['s'] = make_field(steeringFile , "ASCII steering file with list of histograms and tests");
110  zap['a'] = make_field(file1 , "input file 1");
111  zap['b'] = make_field(file2 , "input file 2");
112  zap['o'] = make_field(output , "output file root") = "zebramantis.root";
113  zap['t'] = make_field(ascii , "output file txt" ) = "zebramantis.txt";
114  zap['k'] = make_field(keys , keysExplainer ) = JPARSER::initialised();
115  zap['w'] = make_field(onlyFailures , "write only failed tests" );
116  zap['d'] = make_field(debug) = 2;
117 
118  zap(argc,argv);
119  }
120  catch(const exception &error) {
121  ERROR(error.what() << endl);
122  }
123 
124  if (keys.empty()) {
125  keys = listOfKeys;
126  }
127 
128  TFile* f1 = TFile::Open(file1.c_str());
129  TFile* f2 = TFile::Open(file2.c_str());
130 
131  TFile out(output.c_str(),"recreate");
132 
133  ofstream results;
134  results.open (ascii);
135  results << "# " << listOfKeys << endl;
136 
137  const vector<JRootObjectID> objectIDs = readDir(f1);
138 
139  std::ifstream infile(steeringFile);
140 
141  JTestDictionary d;
142 
143  size_t npassed = 0;
144  size_t nfailed = 0;
145 
146  for (string line; getline(infile, line); ) {
147 
148  istringstream iss(line);
149 
150  TString name;
151  int testID;
152 
153  if (!(iss >> name >> testID)) {
154  continue;
155  }
156 
157  DEBUG("Input: " << name << ' ' << testID << endl);
158 
159  const TRegexp regexp(name);
160 
161  for (vector<JRootObjectID>::const_iterator objectID = objectIDs.cbegin() ; objectID != objectIDs.cend() ; ++objectID) {
162 
163  const TString& dirName = objectID->getDirectory();
164  const TString& fullName = objectID->getFullObjectName();
165 
166  DEBUG("Key: " << fullName << " match = " << fullName.Contains(regexp) << endl);
167 
168  if ((fullName.Index(regexp) != -1)) {
169 
170  TObject* obj1 = (TObject*)f1->Get(fullName);
171  TObject* obj2 = (TObject*)f2->Get(fullName);
172 
173  if (!obj1 || !obj2) {
174  DEBUG("Could not retrieve " << fullName << endl);
175  continue;
176  }
177 
178  d[testID]->read(iss);
179  d[testID]->test(obj1,obj2);
180 
181  if (dirName.Length() > 0 && !out.GetDirectory(dirName)) {
182 
183  if (dirName[0] == JRootObjectID::PATHNAME_SEPARATOR) { // Remove leading forward slash
184  out.mkdir(TString(dirName(1, dirName.Length() - 1)));
185  } else {
186  out.mkdir(dirName);
187  }
188  }
189 
190  out.cd(dirName);
191 
192  for (vector<JTestResult>::iterator r = d[testID]->begin() ; r != d[testID]->end() ; ++r) {
193 
194  if (onlyFailures && r->passed) {
195  continue;
196  }
197 
198  print(cout, *r, keys.cbegin(), keys.cend(), ' ', false);
199  print(results, *r, listOfKeys.cbegin(), listOfKeys.cend(), ' ', true);
200 
201  r->obj->Write();
202  }
203 
204  const size_t Npass = count_if(d[testID]->cbegin(), d[testID]->cend(),
206 
207  npassed += Npass;
208  nfailed += (d[testID]->size() - Npass);
209 
210  d[testID]->clear();
211  }
212  }
213  }
214 
215  infile.close();
216 
217  results << WHITE << "# PASSED: " << npassed << " " << " FAILED: " << nfailed << " FAILURE FRACTION: " << float (nfailed)/(nfailed+npassed) << endl;
218 
219  putObject(&out, JMeta(argc, argv));
220  JMeta::copy(file1.c_str(), out);
221  JMeta::copy(file2.c_str(), out);
222 
223  results.close();
224  out .Close();
225 
226  return 0;
227 }
#define DEBUG(A)
Message macros.
Definition: JMessage.hh:62
#define ERROR(A)
Definition: JMessage.hh:66
int debug
debug level
Definition: JSirene.cc:69
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition: JParser.hh:2142
void readDir(TDirectory *dir, std::vector< TString > &v)
#define MAKE_STRING(A)
Make string.
Definition: JPrint.hh:63
Dictionary to map different tests to unique integer indices.
Class dedicated to standardize the title of the graphical objects produced by the JTest_t() derived c...
Definition: JTestSummary.hh:34
static const char PATHNAME_SEPARATOR
path name separator
Utility class to parse command line options.
Definition: JParser.hh:1698
const JPolynome f1(1.0, 2.0, 3.0)
Function.
std::ostream & print(std::ostream &out, const JTestSummary &summary, const char delimiter=' ', const bool useColors=true)
Print test summary.
JProperties & getProperties(T &object, const JEquationParameters &parameters=JEquationParameters(), const int debug=1)
Get properties of a given object.
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
std::istream & getline(std::istream &in, JString &object)
Read string from input stream until end of line.
Definition: JString.hh:478
@ WHITE
white
Definition: JColorFacet.hh:33
JPredicate< JResult_t T::*, JComparison::eq > make_predicate(JResult_t T::*member, const JResult_t value)
Helper method to create predicate for data member.
Definition: JPredicate.hh:128
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
bool putObject(TDirectory &dir, const TObject &object)
Write object to ROOT directory.
data_type r[M+1]
Definition: JPolint.hh:868
Definition: JSTDTypes.hh:14
Auxiliary data structure for return type of make methods.
Definition: JVectorize.hh:28
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
Definition: JParser.hh:68
Auxiliary class for ROOT I/O of application specific meta data.
Definition: JMeta.hh:72
static void copy(const char *const file_name, TFile &out)
Copy meta data.
Definition: JMeta.hh:421
Definition: JRoot.hh:19