45{
48
50
53 bool reuse;
55 TString formula;
56 bool reverse;
58
59 try {
60
61 JParser<> zap(
"Auxiliary program to histogram bin-by-bin deviations of a set of 1D histograms.");
62
63 zap[
'f'] =
make_field(inputFile,
"<input file>:<object name>");
64 zap[
'o'] =
make_field(
outputFile,
"ROOT file with histogram (possibly I/O, option -r)") =
"variance.root";
65 zap[
'r'] =
make_field(reuse,
"reuse histogram from existing output file");
67 zap[
'F'] =
make_field(formula,
"ROOT TFormula (may contain method names of object)") =
"0";
68 zap[
'R'] =
make_field(reverse,
"reverse sign");
70
71 zap(argc, argv);
72 }
73 catch(const exception &error) {
74 FATAL(error.what() << endl);
75 }
76
77
79
80 for (vector<JRootObjectID>::const_iterator input = inputFile.begin(); input != inputFile.end(); ++input) {
81
82 TH1* h1 =
dynamic_cast<TH1*
>(
getObject(*input));
83
84 if (h1 != NULL) {
85 listOfHistograms.push_back(h1);
86 }
87 }
88
89 if (listOfHistograms.empty()) {
90 FATAL(
"No histograms." << endl);
91 }
92
93 if (formula == "") {
94 FATAL(
"Empty formula." << endl);
95 }
96
97 TH1* h0 = NULL;
98
99 if (reuse) {
101 }
102
103 if (h0 == NULL) {
104 h0 = new TH1D("h0", NULL,
106 }
107
108
109 TH1* h1 = listOfHistograms[0];
110
111 if (listOfHistograms.size() == 1) {
112
113 const double y1 =
getResult(formula, h1);
114
115 DEBUG(h1->GetName() <<
' ' << formula <<
' ' << y1 << endl);
116
117 for (Int_t i = 1; i <= h1->GetNbinsX(); ++i) {
118
119 const Double_t yp = h1->GetBinContent(i);
120
121 h0->Fill(reverse ? y1 - yp : yp - y1);
122 }
123
124 } else {
125
126 if (formula == first_t) {
127
128 for (Int_t i = 1; i <= h1->GetNbinsX(); ++i) {
129
130 const double y1 = h1->GetBinContent(i);
131
132 for (vector<TH1*>::const_iterator p = listOfHistograms.begin(); ++p != listOfHistograms.end(); ) {
133
134 const Double_t yp = (*p)->GetBinContent(i);
135
136 h0->Fill(reverse ? y1 - yp : yp - y1);
137 }
138 }
139
140 } else {
141
143
144 for (Int_t i = 1; i <= h1->GetNbinsX(); ++i) {
145
146 for (vector<TH1*>::const_iterator p = listOfHistograms.begin(); p != listOfHistograms.end(); ++p) {
147
148 const Double_t yp = (*p)->GetBinContent(i);
149
150 h0->Fill(reverse ? y1 - yp : yp - y1);
151 }
152 }
153 }
154 }
155
156
158
159 h0->Write();
160
161 out.Write();
162 out.Close();
163}
#define DEBUG(A)
Message macros.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Auxiliary class to handle file name, ROOT directory and object name.
Utility class to parse command line options.
Double_t getResult(const TString &text, TObject *object=NULL)
Get result of given textual formula.
TObject * getObject(const JRootObjectID &id)
Get first TObject with given identifier.
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).