Jpp test-rotations-old
the software that should make you happy
Loading...
Searching...
No Matches
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
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(),
205 make_predicate(&JTestResult::passed, true));
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:72
#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
void print(const TH1 &h1, std::ostream &out)
Print histogram parameters.
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...
Utility class to parse command line options.
Definition JParser.hh:1698
const JPolynome f1(1.0, 2.0, 3.0)
Function.
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).
bool putObject(TDirectory &dir, const TObject &object)
Write object to ROOT directory.
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