Method called for every key.
Only dummy implementation. Needs to be implemented in derived classes.
104{
106
108
109 if (TString(
key.GetName()).Contains(
"/")) {
110 cout <<
"IGNORE: " <<
key.GetName() <<
" contains '/'" << endl;
111 return;
112 }
113
114 std::unique_ptr<TObject>
obj(
key.ReadObj());
115
116
121 TString keyPath(dirName+
"/"+
key.GetName());
122
125 return;
126 }
127
128 TObject* refObj =
m_refFile->Get(keyPath);
129 if (!refObj) {
130 cout << "Cannot find " << keyPath << " in reference file" << endl;
132 return;
133 }
134
135 if (
obj->Class()!=refObj->Class()) {
136 cout <<
key.GetName() <<
" is of different type in file and reference file." << endl;
137 return;
138 }
139
140 if (
obj->IsA()->InheritsFrom(
"TH1")) {
141 TH1&
h = *
static_cast<TH1*
>(
obj.get());
142 TH1&
href = *
static_cast<TH1*
>(refObj);
143
144
148 }
149
154 }
155 else {
157
158
160
163 m_can->cd(1)->SetPad(0,1,1,0.90);
164 m_can->cd(2)->SetPad(0,0.90,1,0);
165 TVirtualPad* pad =
m_can->cd(2);
166
168 m_can->SetName(
h.GetName());
169 m_can->SetTitle(
h.GetTitle());
170
171 pad->cd(1);
174 if (
h.Integral())
h.Scale(1/
h.Integral());
175 }
176
177 Double_t
ymax = 1.05*
max(
h.GetMaximum(),
href.GetMaximum());
179 h.SetLineColor(kBlue);
182 TPaveStats* st1 = (TPaveStats*)gPad->GetPrimitive("stats");
183 if (st1) {
184 st1->SetName("stats1");
185 st1->SetLineColor(kBlue);
186 }
187
188 href.SetLineColor(kRed);
191 TPaveStats* st2 = (TPaveStats*)gPad->GetPrimitive("stats");
192 if (st1 && st2) {
193
194 Double_t
x1 = st1->GetX1NDC()-0.01;
195 st2->SetName("stats2");
196 Double_t
w = st2->GetX2NDC()-st2->GetX1NDC();
197 st2->SetX1NDC(x1-w);
198 st2->SetX2NDC(x1);
199 st2->SetLineColor(kRed);
201 }
202
203 TH1* hdiff = 0;
205 hdiff = (TH1*)
h.Clone();
206
207 if (hdiff->GetDimension()==1 &&
208 hdiff->GetNbinsX()==
href.GetNbinsX()) {
209
210 pad->cd(2);
211 hdiff->SetName(TString(
href.GetName())+
" (diff)");
212 hdiff->SetTitle(TString(
href.GetTitle())+
" (diff)");
213 hdiff->SetLineColor(kBlack);
214 hdiff->Add(&href,-1);
215 hdiff->Draw();
216 TPaveStats*
st = (TPaveStats*)gPad->GetPrimitive(
"stats1");
217 if (st)
st->SetLineColor(kBlack);
218 }
219 if(hdiff->GetDimension()==2 &&
220 hdiff->GetNbinsX()==
href.GetNbinsX() &&
221 hdiff->GetNbinsY()==
href.GetNbinsY()) {
222 pad->cd(2);
223 hdiff->SetName(TString(
href.GetName())+
" (diff)");
224 hdiff->SetTitle(TString(
href.GetTitle())+
" (diff)");
225 hdiff->SetLineColor(kBlack);
226 hdiff->Add(&href,-1);
227 if(hdiff->GetXaxis()->GetLabels()!=0 && hdiff->GetNbinsX()>100) {
228 TH1 * hdiffred = (TH1*)hdiff->Clone();
229 hdiffred->GetXaxis()->GetLabels()->Delete();
230 hdiffred->Reset();
231 hdiffred->SetName(TString(
href.GetName())+
" (diff reduced)");
232 hdiffred->SetTitle(TString(
href.GetTitle())+
" (diff reduced)");
233 int targetbin=1;
234 for(
int x=1;
x<=hdiff->GetNbinsX(); ++
x) {
235 bool isEmpty(true);
236 for(
int y=1;
y<=hdiff->GetNbinsY();++
y) {
237 if(hdiff->GetBinContent(
x,
y)!=0) { isEmpty=
false;
break; }
238 }
239 if(!isEmpty) {
240 for(
int y=1;
y<=hdiff->GetNbinsY();++
y) {
241 if(hdiff->GetBinContent(
x,
y)!=0)
242 hdiffred->SetBinContent(targetbin,
y,hdiff->GetBinContent(
x,
y));
243 }
244 hdiffred->GetXaxis()->SetBinLabel(targetbin,hdiff->GetXaxis()->GetBinLabel(
x));
245 targetbin++;
246 }
247 }
248 hdiffred->LabelsDeflate();
249 hdiffred->Draw("text");
250 } else {
251 hdiff->Draw("text");
252 }
253 TPaveStats*
st = (TPaveStats*)gPad->GetPrimitive(
"stats1");
254 if (st)
st->SetLineColor(kBlack);
255 }
256 }
257
258
261 text.SetTextSize(0.03);
262 text.SetTextAlign(22);
263 TString
page(
"page ");
265 text.DrawTextNDC(0.5,0.03,page);
266
270 text.DrawTextNDC(0.5,0.99,title);
271
272 const int maxchars = 120;
274 text.SetTextColor(kBlue);
276 text.DrawTextNDC(0.5,0.93,
s.substr(
max(0,
int(
s.size()-maxchars))).c_str());
277 }
279 text.SetTextColor(kRed);
281 text.DrawTextNDC(0.5,0.96,
s.substr(
max(0,
int(
s.size()-maxchars))).c_str());
282 }
283
285
286
290 }
291
292 if (hdiff) delete hdiff;
293 }
294 }
295 else if (
obj->IsA()->InheritsFrom(
"TEfficiency")) {
296 auto h =
static_cast<TEfficiency*
>(
obj.get());
297 auto href =
static_cast<TEfficiency*
>(refObj);
301
302
304 else m_noMatch.push_back(keyPath.Data());
305 }
306}
void createDirectory(TFile *f, const char *dirpath)
Bool_t compareHist(const TH1 &h, const TH1 &href)
void sortAndDeflate(TH1 &h)
bool match(std::string s1, std::string s2)
match the individual directories of two strings