Jpp test-rotations-old
the software that should make you happy
Loading...
Searching...
No Matches
JZebraMantis.cc
Go to the documentation of this file.
1#include <iostream>
2#include <fstream>
3
4#include "TString.h"
5#include "TRegexp.h"
6#include "TObjArray.h"
7#include "TObjString.h"
8#include "TFile.h"
9#include "TKey.h"
10
11#include "Jeep/JParser.hh"
12
13#include "JSupport/JMeta.hh"
14
15#include "JLang/JPredicate.hh"
16
19
21
22namespace {
23
24 /*
25 * Gets list of ROOT object identifiers in a ROOT TDirectory and stores it in a vector.
26 * Note: Subdirectories are searched recursively.
27 *
28 * \param dir The ROOT directory
29 */
31
32 using namespace std;
33 using namespace JPP;
34
35 vector<JRootObjectID> buffer1;
36
37 TIter iter(dir->GetListOfKeys());
38
39 for (TKey* key; (key = (TKey*) iter.Next()) != NULL; ) {
40
41 if (key->IsFolder()){
42
43 TDirectory *subdir = dir->GetDirectory(key->GetName());
44
45 vector<JRootObjectID> buffer2 = readDir(subdir);
46
47 buffer1.insert(buffer1.end(), buffer2.begin(), buffer2.end());
48
49 } else {
50
51 const string fullName = MAKE_STRING(dir->GetPath() <<
52 JRootObjectID::PATHNAME_SEPARATOR <<
53 key->GetName());
54
55 JRootObjectID objectID(fullName);
56
57 buffer1.push_back(objectID);
58 }
59 }
60
61 return buffer1;
62 }
63}
64
65
66/**
67 * \file
68 *
69 * Program to compare histograms in root files that have same directory structure,\n
70 * and where the histograms have the same names.
71 * The input histograms and the test to be applied for each histogram are specified\n
72 * in an ASCII formatted steering file which is passed by the command line.\n\n
73 *
74 * Each row of the steering file should have multiple columns.\n\n
75 *
76 * Column 1 is the name of the histogram to be compared (including the full path inside the root file)\n
77 * Column 2 is an integer value that indicates the test to be performed. See JTestDictionary()\n
78 * Columns 3..n are reserved for the different parameters of the test.\n\n
79 *
80 * \author rgruiz, bjung
81 */
82int main(int argc, char** argv) {
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
ROOT I/O of application specific meta data.
Utility class to parse command line options.
#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.
int main(int argc, char **argv)
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...
Auxiliary class to handle file name, ROOT directory and object name.
Utility class to parse command line options.
Definition JParser.hh:1698
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
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