20 #include <TLegendEntry.h> 23 #include <TApplication.h> 25 #include <TPaletteAxis.h> 51 SuppressGuard3(
Int_t lvl=2000)
53 save = gErrorIgnoreLevel;
54 gErrorIgnoreLevel = lvl;
61 gErrorIgnoreLevel = save;
83 fCanvas =
new TCanvas(
"c",
"summary.pdf", 800, 1000);
84 fTop =
new TPad(
"top",
"",0,.9,1,1);
85 fBody =
new TPad(
"body",
"",0,.2,1,.9);
86 fBottom =
new TPad(
"bottom",
"",0,0, 1,.2);
87 fTop->SetFillColor(kGray);
88 fBody->SetFillColor(0);
89 fBottom->SetFillColor(0);
98 gSystem->Exec(
"rm -rf compare");
99 gSystem->Exec(
"mkdir -p compare");
101 fCanvas->SaveAs(Form(
"compare/%s[", fCanvas->GetTitle()),
"PDF");
103 fOutput = TFile::Open(
"compare/result.root",
"RECREATE");
113 TLatex* ltx =
new TLatex(.5,.5,title);
115 ltx->SetTextSize(.6);
116 ltx->SetTextAlign(22);
124 fCanvas->SaveAs(Form(
"compare/%s", fCanvas->GetTitle()),
125 Form(
"PDF title=%s", title));
126 if (shortTitle && shortTitle[0] !=
'\0')
127 fCanvas->SaveAs(Form(
"compare/%s.png", shortTitle));
128 fCanvas->WaitPrimitive();
133 fCanvas->SaveAs(Form(
"compare/%s]", fCanvas->GetTitle()),
"PDF");
140 static Color_t
colors[] = { kRed+2,
152 return colors[(cnt/2+(cnt%2)*6) % 12];
159 TLatex* l1 =
new TLatex(.1,.95,
"Files");
161 l1->SetTextAlign(13);
162 l1->SetTextSize(0.06);
166 TLatex* l2 =
new TLatex(.15,.90,
"");
168 l2->SetTextAlign(13);
169 l2->SetTextSize(0.05);
171 TLatex* l3 =
new TLatex(.18,.90,
"");
173 l3->SetTextAlign(13);
174 l3->SetTextSize(0.04);
179 while ((file = static_cast<TFile*>(next()))) {
180 TString tit = file->GetTitle();
182 if (file == files->First()) nam.Append(
" *");
183 l2->DrawLatex(l2->GetX(), y, nam);
184 if (!nam.Contains(tit)) {
185 y -= 1.1*l3->GetTextSize();
186 l3->DrawLatex(l3->GetX(), y, tit);
188 y -= 1.1*l2->GetTextSize();
190 y -= 1.1*l2->GetTextSize();
191 TLatex* l4 =
new TLatex(.1, y,
"* Other files compared to this file");
193 l4->SetTextAlign(13);
194 l4->SetTextSize(0.05);
198 PrintCanvas(
"Comparison of details",
"");
200 fLegend->Write(
"legend");
201 files->Write(
"files", TObject::kSingleKey);
207 TH1* h0 =
static_cast<TH1*
>(stack->GetHists()->First());
208 THStack* ratios =
new THStack(
"ratios", Form(
"to %s", h0->GetName()));
209 TIter nextH (stack->GetHists());
213 while ((hr = static_cast<TH1*>(nextH()))) {
214 if (hr == h0)
continue;
215 hr =
static_cast<TH1*
>(hr->Clone());
219 for (
Int_t i = 1; i <= hr->GetNbinsX(); i++) {
222 if (c < 1e-6 || e < 1e-9)
continue;
223 min = TMath::Min(min, c-1.1*e);
224 max = TMath::Max(max, c+1.1*e);
227 ratios->SetMinimum(TMath::Max(0.5,min));
228 ratios->SetMaximum(TMath::Min(1.5,max));
239 hname.Form(
"%s/%s%dd/%s%s",binName.Data(),sub, dimen,
240 (f2D &&
TString(sub).EqualTo(
"results") ?
"full/" :
""),
243 TH1* h =
static_cast<TH1*
>(dir->Get(hname));
245 Warning(
"Addhisto",
"No histogram %s in %s", hname.Data(),dir->GetName());
249 Double_t min = TMath::Min(stack->GetMinimum(
"nostack"), h->GetMinimum());
250 Double_t max = TMath::Max(stack->GetMaximum(
"nostack"), h->GetMaximum());
251 stack->SetMaximum(max);
252 stack->SetMinimum(min);
255 h->SetName(dn.IsNull() || dn ==
"." ? fn : dn);
256 h->SetLineColor(col);
257 h->SetMarkerColor(col);
269 while ((dir = static_cast<TDirectory*>(nextD()))) {
272 Color_t col = IndexColor(cnt);
274 while ((stack = static_cast<THStack*>(nextS())))
275 if (!AddHisto(dir, dimens[cnt], binName, sub, stack, col)) ok =
false;
288 if (!stack || !stack->GetHists()) {
289 Warning(
"DrawStack",
"No stack passed");
292 if (
TString(stack->GetName()).EqualTo(
"scaleProj")) log =
false;
294 TDirectory*
dir = out->mkdir(stack->GetName());
296 stack->Write(
"full");
298 TVirtualPad* p = mother->cd(sub);
300 p->SetTopMargin(0.01);
301 p->SetRightMargin(0.01);
302 p->SetLeftMargin(0.15);
303 p->SetBottomMargin(0.15);
306 TVirtualPad* q = p->cd(1);
307 q->SetRightMargin(f2D ? 0.1 : 0.01);
313 TString tit(stack->GetTitle());
315 stack->Draw(f2D ?
"nostack colz" :
"nostack");
316 if (stack->GetHistogram()) {
317 TH1* h = stack->GetHistogram();
318 h->GetXaxis()->SetTitleSize(tbase/p->GetHNDC());
319 h->GetXaxis()->SetLabelSize(tbase/p->GetHNDC());
320 h->GetXaxis()->SetTitleOffset(0.4);
321 h->GetXaxis()->SetNdivisions(207);
322 h->GetYaxis()->SetTitleSize(tbase/p->GetHNDC());
323 h->GetYaxis()->SetLabelSize(tbase/p->GetHNDC());
324 h->GetYaxis()->SetNdivisions(207);
325 h->GetYaxis()->SetTitleOffset(0.4);
326 h->GetYaxis()->CenterTitle(
true);
330 h =
static_cast<TH1*
>(stack->GetHists()->Last());
331 TPaletteAxis* pal =
static_cast<TPaletteAxis*
>(h->GetListOfFunctions()
332 ->FindObject(
"palette"));
334 pal->GetAxis()->SetTitleSize(tbase/p->GetHNDC());
335 pal->GetAxis()->SetLabelSize(tbase/p->GetHNDC());
336 pal->GetAxis()->SetNdivisions(207);
337 pal->GetAxis()->SetTitleOffset(0.4);
344 q->SetRightMargin(f2D ? 0.1 : 0.01);
350 THStack* ratios = RatioStack(stack);
352 Warning(
"DrawStack",
"Failed to make ratio");
357 ratios->Write(
"ratios");
358 tit = ratios->GetTitle();
359 ratios->SetTitle(
"");
360 ratios->Draw(f2D ?
"nostack colz" :
"nostack");
361 if (ratios->GetHistogram()) {
362 TH1* h = ratios->GetHistogram();
363 h->GetXaxis()->SetTitleSize(tbase/p->GetHNDC());
364 h->GetXaxis()->SetLabelSize(tbase/p->GetHNDC());
365 h->GetXaxis()->SetTitleOffset(0.4);
366 h->GetXaxis()->SetNdivisions(207);
367 h->GetYaxis()->SetTitleSize(tbase/p->GetHNDC());
368 h->GetYaxis()->SetLabelSize(tbase/p->GetHNDC());
369 h->GetYaxis()->SetTitleOffset(0.4);
370 h->GetYaxis()->SetNdivisions(207);
371 h->GetYaxis()->CenterTitle(
true);
372 h->SetYTitle(
"Ratio");
375 h =
static_cast<TH1*
>(ratios->GetHists()->Last());
376 TPaletteAxis* pal =
static_cast<TPaletteAxis*
>(h->GetListOfFunctions()
377 ->FindObject(
"palette"));
379 pal->GetAxis()->SetTitleSize(tbase/p->GetHNDC());
380 pal->GetAxis()->SetLabelSize(tbase/p->GetHNDC());
381 pal->GetAxis()->SetNdivisions(207);
382 pal->GetAxis()->SetTitleOffset(0.4);
397 while ((stack = static_cast<THStack*>(nextS()))) {
413 const char** pname = names;
414 const char** ptit = titles;
420 THStack*
stack =
new THStack(n, t);
423 if (stacks->GetEntries() <= 0)
return;
426 fBody->SetTopMargin(0.01);
427 fBody->SetRightMargin(0.01);
429 Int_t nRow = (stacks->GetEntries()+1)/2;
430 fBody->Divide(nCol, nRow, 0, 0);
433 if (FillStacks(files, dimens, binName, sub, stacks) <= 0)
return;
434 DrawStacks(fBody, stacks,out, log);
439 PrintCanvas(title,Form(
"%s_%s", sub, binName.Data()));
448 const char* names[] = {
"realDeltaM",
"realDeltaI",
449 "simDeltaM" ,
"simDeltaI" ,
450 "simDeltaC" ,
"simDeltaP" ,
451 "simDeltaS" ,
"scaleProj",
453 const char* titles[] = {
"#Delta_{M}",
"#Delta_{I}",
454 "#Delta_{M'}",
"#Delta_{I'}",
455 "#Delta_{C'}",
"#Delta_{P'}",
456 "#Delta_{S'}",
"#LTk#it{k}#GT",
458 TDirectory*
dir = out->mkdir(
"delta");
461 Form(
"#Delta #minus %s", centTitle.Data()),
462 names, titles, dir,
true);
470 const char* names[] = {
"result",
"simG",
"realS",
"simS",
471 "realM",
"simM",
"realC",
"simC", 0 };
472 const char* titles[] = {
"dN/d#eta",
"G'",
"S",
"S'",
473 "M",
"M'",
"C",
"C'", 0 };
474 TDirectory*
dir = out->mkdir(
"parts");
476 Form(
"Parts #minus %s", centTitle.Data()),
487 TDirectory*
dir = out->mkdir(binName);
488 ProcessCentDelta (files, dimens, binName, centTitle, dir);
489 ProcessCentResult(files, dimens, binName, centTitle, dir);
492 void Run(
const char* f1,
const char* f2,
493 const char* f3=0,
const char* f4=0,
494 const char* f5=0,
const char* f6=0,
495 const char* f7=0,
const char* f8=0)
497 const char* filenames[] = { f1, f2, f3, f4,
504 Int_t argc = gApplication->Argc();
505 char** argv = gApplication->Argv();
506 char** args =
new char*[argc];
508 for (
Int_t i = 1; i < argc; i++) {
510 if (tmp.EndsWith(
".C") ||
511 tmp.EndsWith(
".C+") ||
512 tmp.BeginsWith(
"-"))
continue;
513 args[j] = StrDup(argv[i]);
514 Printf(
"Argument %s", args[j]);
519 this->Run(const_cast<const char**>(args));
521 void Run(
const char** filenames)
524 fLegend =
new TLegend(.05, .05, .95, .95);
525 fLegend->SetFillStyle(0);
526 fLegend->SetBorderSize(0);
532 const char** fptr = filenames;
536 if (!fn.EndsWith(
".root")) {
545 tit.ReplaceAll(
".root",
"");
546 if (!dn.IsNull() && !dn.EqualTo(
".")) tit = dn;
551 TFile*
file = TFile::Open(fn,
"READ");
560 Color_t
color = IndexColor(cnt-1);
561 TLegendEntry* e = fLegend->AddEntry(
"dummy", tit,
"f");
562 e->SetFillColor(color);
563 e->SetLineColor(color);
564 e->SetFillStyle(1001);
568 if (fn.EndsWith(
"etaipz.root") || dn.EndsWith(
"etaipz")) dim = 3;
569 else if (fn.EndsWith(
"eta.root") || dn.EndsWith(
"eta")) dim = 2;
570 else if (fn.EndsWith(
"const.root") || dn.EndsWith(
"const")) dim = 1;
578 Warning(
"",
"No files opened");
582 TFile* f0 =
static_cast<TFile*
>(files->At(0));
583 TH1* cent =
static_cast<TH1*
>(f0->Get(
"realCent"));
586 MakeTitlePage(files);
588 for (
Int_t i = 1; i <= cent->GetNbinsX(); i++) {
589 Double_t c1 = cent->GetXaxis()->GetBinLowEdge(i);
590 Double_t c2 = cent->GetXaxis()->GetBinUpEdge(i);
592 cn.Form(
"cent%06.2f_%06.2f", c1, c2); cn.ReplaceAll(
".",
"d");
593 ct.Form(
"%5.1f-%5.1f%%", c1, c2);
594 Printf(
"Processing centrality bin %6.2f-%6.2f%%", c1, c2);
595 ProcessCentBin(files, dimens, cn, ct, fOutput);
Int_t color[]
print message on plot with ok/not ok
Int_t FillStacks(TList *files, const TArrayI &dimens, const TString &binName, const char *sub, TList *stacks)
void ProcessCentResult(TList *files, const TArrayI &dimens, const TString &binName, const TString ¢Title, TDirectory *out)
void ProcessCentDelta(TList *files, const TArrayI &dimens, const TString &binName, const TString ¢Title, TDirectory *out)
TH1 * AddHisto(TDirectory *dir, Int_t dimen, const TString &binName, const char *sub, THStack *stack, Color_t col)
void Run(const char **filenames)
void DrawStack(TVirtualPad *p, THStack *s, Double_t min, Double_t max)
void MakeTitlePage(const TList *files)
void ProcessCentBin(TList *files, const TArrayI &dimens, const TString &binName, const TString ¢Title, TDirectory *out)
Color_t IndexColor(Int_t cnt)
void ProcessOne(const char *meth, Int_t style, TList *stacks, TList *ratios, TList *mins, TList *maxs, TList *avgs, TAxis *¢Axis)
THStack * RatioStack(THStack *stack)
TCanvas * MakeCanvas(const char *name, const char *title, const char *img=0)
void PrintCanvas(const char *title, const char *shortTitle=0)
void ClearCanvas(TCanvas *c)
void DrawStacks(TVirtualPad *mother, TList *stacks, TDirectory *out, Bool_t log)
void ProcessOne(TList *files, const TArrayI &dimens, const TString &binName, const char *sub, const TString &title, const char **names, const char **titles, TDirectory *out, Bool_t log=false)
TFile * file
TList with histograms for a given trigger.
void DrawStack(TVirtualPad *mother, Int_t sub, THStack *stack, TDirectory *out, Bool_t log, Double_t tbase=0.05)
void Run(const char *f1, const char *f2, const char *f3=0, const char *f4=0, const char *f5=0, const char *f6=0, const char *f7=0, const char *f8=0)