3 * Drawing macro for reading the THnSparse output of the
4 * HLT/QA/tasks/AliAnalysisTaskHLTCentralBarrel.cxx task.
6 * The cuts are user defined in lines 167-168 as arguments of the
7 * function cutStsudies(...).
9 * The input file contains information about the run number
10 * and date that will appear in the canvas title.
12 * The cuts are turned into strings and incorporated in the
13 * name of the output file, which contains canvases with event
14 * and track properties for HLT and offline.
16 * Since the run information is available, there will be a new
17 * folder created and the canvas ROOT files will be saved in there.
19 * The macro should be compiled before running:
21 * root[0] .L drawTHnSparse.C++
22 * root[1] drawTHnSparse("HLT-OFFLINE-CentralBarrel-comparison.root")
25 * @author Kalliopi.Kanaki@ift.uib.no
28 #if !defined(__CINT__) || defined(__MAKECINT__)
34 #include "THnSparse.h"
37 #include "TPaveText.h"
38 #include "TPaveStats.h"
49 //using std::stringstream;
54 //---------- forward declerations ---------------//
56 TString cutStudies( TCanvas* can1, TCanvas* can2, TCanvas* can3, TString folder,
57 THnSparse* htrackHLT, THnSparse* htrackOFF, TText* hText,
58 double minEta, double maxEta,
59 int minTrackMult,int maxTrackMult,
60 double minPt, double maxPt,
61 double minDCAr, double maxDCAr,
62 double minDCAz, double maxDCAz,
63 int minTPCclus, int maxTPCclus,
64 int minITSclus, int maxITSclus,
67 void printStats(TH1D *hlt, TH1D *off);
68 void defineYaxisMax(TH1D *hlt, TH1D *off);
69 void printLegend(TLegend *l, TH1D *hlt, TH1D *off);
70 void plotAid(TCanvas* can, THnSparse* hHLT, THnSparse* hOFF, TText* hText, TH1D *hlt, TH1D *off, TLegend *l, int size);
71 void plot2D(TCanvas* can, THnSparse* h,
72 double minEta, double maxEta,
73 double minPt, double maxPt,
74 double minDCAr, double maxDCAr,
75 double minDCAz, double maxDCAz,
76 int minTPCclus, int maxTPCclus,
77 int minITSclus, int maxITSclus,
78 int minTrackMult, int maxTrackMult
80 void plotEventQuantities(TCanvas* can, THnSparse* heventHLT, THnSparse* heventOFF, TText* hText);
81 TString fix1DTitle(const char* c);
82 TString fix2DTitle(const char* c1, const char* c2);
83 TString cutsToString( double minEta, double maxEta,
84 double minPt, double maxPt,
85 double minDCAr, double maxDCAr,
86 double minDCAz, double maxDCAz,
87 int minTPCclus, int maxTPCclus,
88 int minITSclus, int maxITSclus,
89 int minTrackMult, int maxTrackMult,
92 void plotTrackQuantities( TCanvas* can, THnSparse* htrackHLT, THnSparse* htrackOFF, TText* hText,
93 double minEta, double maxEta,
94 double minPt, double maxPt,
95 double minDCAr, double maxDCAr,
96 double minDCAz, double maxDCAz,
97 int minTPCclus, int maxTPCclus,
98 int minITSclus, int maxITSclus,
99 int minTrackMult, int maxTrackMult,
103 vector<TString> outputNames;
105 //------------------------------------------------------------------//
107 void drawTHnSparse(TString inputFile){
109 gROOT->SetStyle("Plain");
110 gStyle->SetPalette(1);
111 gStyle->SetOptStat(10);
112 TH1::AddDirectory(kFALSE);
114 TFile *file = TFile::Open(inputFile);
116 printf("Error: No file %s in folder.\n", inputFile.Data());
120 TList *list = static_cast<TList*>(file->Get("esd_thnsparse"));
122 printf("Error: No List contained in file %s.\n", inputFile.Data());
126 THnSparseF *heventHLT = (THnSparseF*)list->FindObject("fEventHLT");
128 printf("Error: There is no HLT THnSparse object in file %s\n", inputFile.Data());
130 THnSparseF *heventOFF = (THnSparseF*)list->FindObject("fEventOFF");
132 printf("Error: There is no OFF THnSparse object in file %s\n", inputFile.Data());
134 THnSparseF *htrackHLT = (THnSparseF*)list->FindObject("fTrackHLT");
136 printf("Error: No HLT THnSparse object found\n");
139 THnSparseF *htrackOFF = (THnSparseF*)list->FindObject("fTrackOFF");
141 printf("Error: No OFF THnSparse object found\n");
145 TText *hText = (TText*)list->FindObject("text");
146 if(!hText) printf("No hText\n");
148 TString t = "event properties for ";
149 t+=hText->GetTitle();
151 TString folder = hText->GetTitle();
152 folder.ReplaceAll(" ","");
156 gSystem->Exec("mkdir "+folder);
158 TCanvas *can0 = new TCanvas("can0",t, 900,600); can0->Divide(3,2);
159 TCanvas *can1 = new TCanvas("can1","track properties", 1100,900); can1->Divide(4,3);
160 TCanvas *can2 = new TCanvas("can2","2-D HLT track correlations",1200,800); can2->Divide(4,2);
161 TCanvas *can3 = new TCanvas("can3","2-D OFF track correlations",1200,800); can3->Divide(4,2);
163 plotEventQuantities(can0,heventHLT,heventOFF,hText);
164 can0->SaveAs(folder+"/event_properties.root");
165 can0->SaveAs(folder+"/event_properties.png");
167 TString s = ""; // eta mult pt DCAr DCAz TPCclus ITSclus vertexStatus
168 s = cutStudies(can1, can2, can3, folder, htrackHLT, htrackOFF, hText, -2, 2, 0, 20000, 0, 200, -20, 20, -20, 20, 0, 200, 0, 6, 2); outputNames.push_back(s);
169 //s = cutStudies(can1, can2, can3, folder, htrackHLT, htrackOFF, hText, -2, 2, 0, 20000, 0, 200, -20, 20, -20, 20, 0, 200, 1, 6, 2); outputNames.push_back(s);
171 TCanvas *ov = new TCanvas("ov","overlaid histograms of track properties",1100,900);
174 TCanvas *ca[outputNames.size()];
175 TFile *ff[outputNames.size()];
177 TH1D *g[outputNames.size()];
179 for(int j=1; j<12; j++){ // not 13, last pad is empty (TODO)
180 for(UInt_t i=0; i<outputNames.size(); i++){
182 ff[i] = TFile::Open(outputNames[i].Data());
183 if(!ff[i] || ff[i]->IsZombie()){
184 printf("Non-existent, corrupted or zombie file %s\n", outputNames[i].Data());
187 ca[i] = (TCanvas*)ff[i]->GetObjectUnchecked("can1");
189 printf("Empty canvas in file %s.\n", outputNames[i].Data());
192 pad[j] = (TPad*)ca[i]->GetListOfPrimitives()->FindObject(Form("can1_%d",j));
194 printf("Empty pad in canvas %s.\n", ca[i]->GetName());
197 g[i] =(TH1D*)pad[j]->FindObject(Form("fTrackHLT_proj_%d",j-1));
199 printf("Empty histogram for i=%d, file %s.\n", i, outputNames[i].Data());
204 if(i==0) g[i]->Draw();
206 g[i]->SetLineColor(i+1);
207 defineYaxisMax(g[0], g[i]);
216 TString cutStudies( TCanvas* can1, TCanvas* can2, TCanvas* can3, TString folder,
217 THnSparse* htrackHLT, THnSparse* htrackOFF, TText* hText,
218 double minEta, double maxEta,
219 int minTrackMult,int maxTrackMult,
220 double minPt, double maxPt,
221 double minDCAr, double maxDCAr,
222 double minDCAz, double maxDCAz,
223 int minTPCclus, int maxTPCclus,
224 int minITSclus, int maxITSclus,
228 plotTrackQuantities(can1, htrackHLT, htrackOFF, hText,
229 minEta, maxEta, minPt, maxPt, minDCAr, maxDCAr, minDCAz, maxDCAz, minTPCclus, maxTPCclus, minITSclus, maxITSclus, minTrackMult, maxTrackMult, vertexStatus);
231 plot2D(can2, htrackHLT, minEta, maxEta, minPt, maxPt, minDCAr, maxDCAr, minDCAz, maxDCAz, minTPCclus, maxTPCclus, minITSclus, maxITSclus, minTrackMult, maxTrackMult);
233 plot2D(can3, htrackOFF, minEta, maxEta, minPt, maxPt, minDCAr, maxDCAr, minDCAz, maxDCAz, minTPCclus, maxTPCclus, minITSclus, maxITSclus, minTrackMult, maxTrackMult);
235 TString cuts = cutsToString(minEta, maxEta, minPt, maxPt, minDCAr, maxDCAr, minDCAz, maxDCAz, minTPCclus, maxTPCclus,
236 minITSclus, maxITSclus, minTrackMult, maxTrackMult, vertexStatus);
238 can1->SaveAs(folder+"/track_properties_"+cuts+".root");
239 can1->SaveAs(folder+"/track_properties_"+cuts+".png");
240 can2->SaveAs(folder+"/HLT_2D_track_correlations_"+cuts+".root");
241 can2->SaveAs(folder+"/HLT_2D_track_correlations_"+cuts+".png");
242 can3->SaveAs(folder+"/OFF_2D_track_correlations_"+cuts+".root");
243 can3->SaveAs(folder+"/OFF_2D_track_correlations_"+cuts+".png");
245 return folder+"/track_properties_"+cuts+".root";
248 void printStats(TH1D *hlt, TH1D *off){
250 TPaveStats *st1 = (TPaveStats*)hlt->FindObject("stats");
251 st1->SetLineColor(0);
254 TPaveStats *st2 = (TPaveStats*)off->FindObject("stats");
255 st2->SetY2NDC(st1->GetY1NDC()-0.05);
256 st2->SetY1NDC(st2->GetY2NDC()-TMath::Abs(st1->GetY1NDC()-st1->GetY2NDC()));
257 st2->SetLineColor(0);
258 st2->SetTextColor(off->GetLineColor());
259 st2->SetFillStyle(0);
263 void defineYaxisMax(TH1D *hlt, TH1D *off){
264 if(hlt->GetMaximum() > off->GetMaximum()) off->SetMaximum(1.1*hlt->GetMaximum());
265 else hlt->SetMaximum(1.1*off->GetMaximum());
268 void printLegend(TLegend *l, TH1D *hlt, TH1D *off){
271 l->AddEntry(hlt, "HLT", "l");
272 l->AddEntry(off, "OFF", "l");
276 //====================== for 1D distributions ===============================//
278 void plotAid(TCanvas* can, THnSparse* hHLT, THnSparse* hOFF, TText* /*hText*/, TH1D *hlt, TH1D *off, TLegend *l, int size,
279 double minEta, double maxEta,
280 double minPt, double maxPt,
281 double minDCAr, double maxDCAr,
282 double minDCAz, double maxDCAz,
283 int minTPCclus, int maxTPCclus,
284 int minITSclus, int maxITSclus,
285 int minTrackMult, int maxTrackMult,
289 hHLT->GetAxis(0)->SetRangeUser(minPt,maxPt);
290 hHLT->GetAxis(1)->SetRangeUser(minTPCclus,maxTPCclus);
291 hHLT->GetAxis(3)->SetRangeUser(minEta, maxEta);
292 hHLT->GetAxis(5)->SetRangeUser(minDCAr, maxDCAr);
293 hHLT->GetAxis(6)->SetRangeUser(minDCAz, maxDCAz);
294 hHLT->GetAxis(10)->SetRangeUser(minITSclus, maxITSclus);
295 hHLT->GetAxis(11)->SetRangeUser(minTrackMult, maxTrackMult);
296 if(VS!=2) hHLT->GetAxis(12)->SetRangeUser(VS,VS);
298 hOFF->GetAxis(0)->SetRangeUser(minPt,maxPt);
299 hOFF->GetAxis(1)->SetRangeUser(minTPCclus,maxTPCclus);
300 hOFF->GetAxis(3)->SetRangeUser(minEta, maxEta);
301 hOFF->GetAxis(5)->SetRangeUser(minDCAr, maxDCAr);
302 hOFF->GetAxis(6)->SetRangeUser(minDCAz, maxDCAz);
303 hOFF->GetAxis(10)->SetRangeUser(minITSclus, maxITSclus);
304 hOFF->GetAxis(11)->SetRangeUser(minTrackMult, maxTrackMult);
305 if(VS!=2) hOFF->GetAxis(12)->SetRangeUser(VS,VS);
307 for(int i=0; i<size; i++){
309 hlt = hHLT->Projection(i); if(!hlt){ printf("plotAid: empty HLT histogram\n"); continue; }
310 off = hOFF->Projection(i); if(!off){ printf("plotAid: empty OFF histogram\n"); continue; }
312 hlt->SetTitle(fix1DTitle(hHLT->Projection(i)->GetTitle()));
314 TString s = hlt->GetTitle();
315 if(s.Contains("p_")){
319 else if(s.Contains("theta") || s.Contains("phi")){
323 else if(s.Contains("DCA")){
328 defineYaxisMax(hlt, off);
329 off->SetLineColor(2);
334 printStats(hlt, off);
337 printLegend(l,hlt,off);
338 TPaveText *pave = new TPaveText(25,5600,140,36400);
339 pave->SetFillColor(kWhite);
340 pave->SetLineColor(kWhite);
341 pave->SetShadowColor(kWhite);
342 s=""; s+=minEta; s+=" < eta < "; s+=maxEta; pave->AddText(s);
343 s=""; s+=minPt; s+=" < pt (GeV/c) < "; s+=maxPt; pave->AddText(s);
344 s=""; s+=minTrackMult; s+=" < track mult < "; s+=maxTrackMult; pave->AddText(s);
345 s=""; s+=minDCAr; s+=" < DCAr (cm) < "; s+=maxDCAr; pave->AddText(s);
346 s=""; s+=minDCAz; s+=" < DCAz (cm) < "; s+=maxDCAz; pave->AddText(s);
347 s=""; s+=minTPCclus; s+=" < TPC clusters/track < "; s+=maxTPCclus; pave->AddText(s);
348 s=""; s+=minITSclus; s+=" < ITS clusters/track < "; s+=maxITSclus; pave->AddText(s);
349 if(VS!=2) { s=""; s+="vertex status "; s+=VS; pave->AddText(s); }
356 //====================== for 2D distributions ===============================//
358 void plot2D(TCanvas* can, THnSparse* h,
359 double minEta, double maxEta,
360 double minPt, double maxPt,
361 double minDCAr, double maxDCAr,
362 double minDCAz, double maxDCAz,
363 int minTPCclus, int maxTPCclus,
364 int minITSclus, int maxITSclus,
365 int minTrackMult, int maxTrackMult
368 h->GetAxis(0)->SetRangeUser(minPt,maxPt);
369 h->GetAxis(1)->SetRangeUser(minTPCclus,maxTPCclus);
370 h->GetAxis(3)->SetRangeUser(minEta, maxEta);
371 h->GetAxis(5)->SetRangeUser(minDCAr, maxDCAr);
372 h->GetAxis(6)->SetRangeUser(minDCAz, maxDCAz);
373 h->GetAxis(10)->SetRangeUser(minITSclus, maxITSclus);
374 h->GetAxis(11)->SetRangeUser(minTrackMult, maxTrackMult);
377 TH2D *ht = h->Projection(1,0);
378 ht->SetTitle(fix2DTitle(h->Projection(1)->GetTitle(), h->Projection(0)->GetTitle()));
381 s = fix1DTitle(h->Projection(0)->GetTitle())+" (GeV/c)";
386 ht = h->Projection(1,3);
387 ht->SetTitle(fix2DTitle(h->Projection(1)->GetTitle(), h->Projection(3)->GetTitle()));
391 ht = h->Projection(1,5);
392 ht->SetTitle(fix2DTitle(h->Projection(1)->GetTitle(), h->Projection(5)->GetTitle()));
393 s = fix1DTitle(h->Projection(5)->GetTitle())+" (cm)";
398 ht = h->Projection(1,6);
399 ht->SetTitle(fix2DTitle(h->Projection(1)->GetTitle(), h->Projection(6)->GetTitle()));
400 s = fix1DTitle(h->Projection(6)->GetTitle())+" (cm)";
405 ht = h->Projection(6,0);
406 ht->SetTitle(fix2DTitle(h->Projection(6)->GetTitle(), h->Projection(0)->GetTitle()));
407 s = fix1DTitle(h->Projection(0)->GetTitle())+" (GeV/c)";
409 s = fix1DTitle(h->Projection(6)->GetTitle())+" (cm)";
414 ht = h->Projection(6,3);
415 ht->SetTitle(fix2DTitle(h->Projection(6)->GetTitle(), h->Projection(3)->GetTitle()));
416 s = fix1DTitle(h->Projection(6)->GetTitle())+" (cm)";
421 ht = h->Projection(3,0);
422 ht->SetTitle(fix2DTitle(h->Projection(3)->GetTitle(), h->Projection(0)->GetTitle()));
423 s = fix1DTitle(h->Projection(0)->GetTitle())+" (GeV/c)";
428 ht = h->Projection(3,4);
429 ht->SetTitle(fix2DTitle(h->Projection(3)->GetTitle(), h->Projection(4)->GetTitle()));
430 s = fix1DTitle(h->Projection(4)->GetTitle())+" (rad)";
435 void plotAid(TCanvas* can, THnSparse* hHLT, THnSparse* hOFF, TText* /*hText*/, TH1D *hlt, TH1D *off, TLegend *l, int size){
437 for(int i=0; i<size; i++){
438 hlt = hHLT->Projection(i);
439 off = hOFF->Projection(i);
440 hlt->SetTitle(fix1DTitle(hHLT->Projection(i)->GetTitle()));
441 TString s = hlt->GetTitle();
442 if(s.Contains("primary")){
447 defineYaxisMax(hlt, off);
448 off->SetLineColor(2);
453 printStats(hlt, off);
455 if(i==0) printLegend(l,hlt,off);
459 void plotEventQuantities(TCanvas* can, THnSparse* heventHLT, THnSparse* heventOFF, TText* hText){
464 TLegend *leg1 = new TLegend(0.6,0.6,0.8,0.8);
466 plotAid(can, heventHLT, heventOFF, hText, hlt, off, leg1, 6);
470 void plotTrackQuantities( TCanvas* can, THnSparse* htrackHLT, THnSparse* htrackOFF, TText* hText,
471 double minEta, double maxEta,
472 double minPt, double maxPt,
473 double minDCAr, double maxDCAr,
474 double minDCAz, double maxDCAz,
475 int minTPCclus, int maxTPCclus,
476 int minITSclus, int maxITSclus,
477 int minTrackMult, int maxTrackMult,
484 TLegend *leg1 = new TLegend(0.6,0.6,0.8,0.8);
485 plotAid(can, htrackHLT, htrackOFF, hText, hlt, off, leg1, 11,
486 minEta, maxEta, minPt, maxPt, minDCAr, maxDCAr, minDCAz, maxDCAz, minTPCclus, maxTPCclus, minITSclus, maxITSclus, minTrackMult, maxTrackMult, VS);
490 TString fix1DTitle(const char* c){
492 tmp.ReplaceAll("projection ","");
496 TString fix2DTitle(const char* c1, const char* c2){
497 TString tmp = fix1DTitle(c1)+" vs."+fix1DTitle(c2);
501 TString cutsToString( double minEta, double maxEta,
502 double minPt, double maxPt,
503 double minDCAr, double maxDCAr,
504 double minDCAz, double maxDCAz,
505 int minTPCclus, int maxTPCclus,
506 int minITSclus, int maxITSclus,
507 int minTrackMult, int maxTrackMult,
512 char s[300]; sprintf(s, "eta%2g_%2g_Pt%2g_%2g_TM%d_%d_DCAr%2g_%2g_DCAz%2g_%2g_TPCclus%d_%d_ITSclus%d_%d",
513 minEta,maxEta,minPt,maxPt,minTrackMult,maxTrackMult,minDCAr,maxDCAr,minDCAz,maxDCAz,minTPCclus,maxTPCclus,minITSclus,maxITSclus);
514 cuts = s; cuts.ReplaceAll(" ","");
518 sprintf(v, "_VS%d",VS);