]> git.uio.no Git - u/mrichter/AliRoot.git/blame - HLT/QA/tasks/macros/drawTHnSparse.C
- modifications to make the cuts automatically appear on the canvas
[u/mrichter/AliRoot.git] / HLT / QA / tasks / macros / drawTHnSparse.C
CommitLineData
21fba467 1// $Id$
2/*
3 * Drawing macro for reading the THnSparse output of the
4 * HLT/QA/tasks/AliAnalysisTaskHLTCentralBarrel.cxx task.
5 *
6 * The cuts are user defined as arguments of the function.
7 * The input file contains information about the run number
8 * and date that will appear in the canvas title.
9 *
10 * The cuts are turned into strings and incorporated in the
11 * name of the output file, which contains canvases with event
12 * and track properties for HLT and offline.
13 *
14 * Since the run information is available, there will be a new
15 * folder created and the canvas ROOT files will be saved in there.
16 *
17 * @ingroup alihlt_qa
18 * @author Kalliopi.Kanaki@ift.uib.no
19 */
20
21void drawTHnSparse( TString inputFile,
22 double minEta=-2, double maxEta=2,
23 int minTrackMult=0, int maxTrackMult=20000,
24 double minPt=0, double maxPt=200,
25 double minDCAr=-80, double maxDCAr=80,
26 double minDCAz=-80, double maxDCAz=80,
27 int minTPCclus=0, int maxTPCclus=200,
cb9ecd10 28 int minITSclus=0, int maxITSclus=6,
21fba467 29 int vertexStatus=2
30 )
31{
32 gROOT->SetStyle("Plain");
33 gStyle->SetPalette(1);
34 gStyle->SetOptStat(10);
56ce6b77 35 //gROOT->ForceStyle();
21fba467 36 TH1::AddDirectory(kFALSE);
37
38 TFile *file = TFile::Open(inputFile);
39 if(!file){
40 printf("Error: No file %s in folder.\n", inputFile);
41 return;
42 }
43
44 TList *list = static_cast<TList*>(file->Get("esd_thnsparse"));
45 if(!list){
46 printf("Error: No List contained in file %s.\n", inputFile);
47 return;
48 }
49
50 THnSparseF *heventHLT = (THnSparse*)list->FindObject("fEventHLT");
51 if(!heventHLT){
52 printf("Error: There is no HLT THnSparse object in file %s\n", inputFile);
53 }
54 THnSparseF *heventOFF = (THnSparse*)list->FindObject("fEventOFF");
55 if(!heventOFF){
56 printf("Error: There is no OFF THnSparse object in file %s\n", inputFile);
57 }
58 THnSparseF *htrackHLT = (THnSparse*)list->FindObject("fTrackHLT");
59 if(!htrackHLT){
60 printf("Error: No HLT THnSparse object found\n");
61 return;
62 }
63 THnSparseF *htrackOFF = (THnSparse*)list->FindObject("fTrackOFF");
64 if(!htrackOFF){
65 printf("Error: No OFF THnSparse object found\n");
66 return;
67 }
e5f150ee 68
21fba467 69 TText *hText = list->FindObject("text");
70 if(!hText) printf("No hText\n");
71
72 TString t = "event properties for ";
73 t+=hText->GetTitle();
74
75 TCanvas *can0 = new TCanvas("can0",t,900,600);
76 can0->Divide(3,2);
77 plotEventQuantities(can0,heventOFF,heventHLT,hText);
78
79 TCanvas *can1 = new TCanvas("can1","track properties",1100,900);
80 can1->Divide(4,3);
81 plotTrackQuantities(can1, htrackOFF, htrackHLT, hText,
82 minEta, maxEta, minPt, maxPt, minDCAr, maxDCAr, minDCAz, maxDCAz, minTPCclus, maxTPCclus, minITSclus, maxITSclus, minTrackMult, maxTrackMult, vertexStatus);
83
84 TCanvas *can2 = new TCanvas("can2","2-D HLT track correlations",1200,800);
85 can2->Divide(4,2);
86 plot2D(can2, htrackHLT, minEta, maxEta, minPt, maxPt, minDCAr, maxDCAr, minDCAz, maxDCAz, minTPCclus, maxTPCclus, minITSclus, maxITSclus, minTrackMult, maxTrackMult);
87
88 TCanvas *can3 = new TCanvas("can3","2-D OFF track correlations",1200,800);
89 can3->Divide(4,2);
90 plot2D(can3, htrackOFF, minEta, maxEta, minPt, maxPt, minDCAr, maxDCAr, minDCAz, maxDCAz, minTPCclus, maxTPCclus, minITSclus, maxITSclus, minTrackMult, maxTrackMult);
91
92 TString folder = hText->GetTitle();
93 folder.ReplaceAll(" ","");
94 folder.Remove(0,3);
95 folder.Remove(6,15);
96
97 gSystem->Exec("mkdir "+folder);
15c6e37d 98 TString cuts = cutsToString(minEta, maxEta, minPt, maxPt, minDCAr, maxDCAr, minDCAz, maxDCAz, minTPCclus, maxTPCclus, minITSclus, maxITSclus, minTrackMult, maxTrackMult, vertexStatus);
21fba467 99
15c6e37d 100 can0->SaveAs(folder+"/event_properties_"+cuts+".root");
101 can0->SaveAs(folder+"/event_properties_"+cuts+".png");
102 can1->SaveAs(folder+"/track_properties_"+cuts+".root");
103 can1->SaveAs(folder+"/track_properties_"+cuts+".png");
104 can2->SaveAs(folder+"/HLT_2D_track_correlations_"+cuts+".root");
105 can2->SaveAs(folder+"/HLT_2D_track_correlations_"+cuts+".png");
106 can3->SaveAs(folder+"/OFF_2D_track_correlations_"+cuts+".root");
107 can3->SaveAs(folder+"/OFF_2D_track_correlations_"+cuts+".png");
21fba467 108
21fba467 109 return;
110}
111
112void printStats(TH1D *hlt, TH1D *off){
113 gPad->Update();
114 TPaveStats *st1 = (TPaveStats*)hlt->FindObject("stats");
115 st1->SetLineColor(0);
116
117 gPad->Update();
118 TPaveStats *st2 = (TPaveStats*)off->FindObject("stats");
119 st2->SetY2NDC(st1->GetY1NDC()-0.05);
120 st2->SetY1NDC(st2->GetY2NDC()-TMath::Abs(st1->GetY1NDC()-st1->GetY2NDC()));
121 st2->SetLineColor(0);
122 st2->SetTextColor(off->GetLineColor());
123 st2->SetFillStyle(0);
124 st2->Draw();
125}
126
127void defineYaxisMax(TH1D *hlt, TH1D *off){
128 if(hlt->GetMaximum() > off->GetMaximum()) off->SetMaximum(1.1*hlt->GetMaximum());
129 else hlt->SetMaximum(1.1*off->GetMaximum());
130}
131
132void printLegend(TLegend *l, TH1D *hlt, TH1D *off){
133 l->SetFillColor(10);
134 l->SetLineColor(10);
135 l->AddEntry(hlt, "HLT", "l");
136 l->AddEntry(off, "OFF", "l");
137 l->Draw("same");
138}
139
140//====================== for 1D distributions ===============================//
141
142void plotAid(TCanvas* can, THnSparse* hOFF, THnSparse* hHLT, TText* hText, TH1D *hlt, TH1D *off, TLegend *l, int size,
143 double minEta, double maxEta,
144 double minPt, double maxPt,
145 double minDCAr, double maxDCAr,
146 double minDCAz, double maxDCAz,
147 int minTPCclus, int maxTPCclus,
148 int minITSclus, int maxITSclus,
149 int minTrackMult, int maxTrackMult,
150 int VS
151 )
152{
153 hHLT->GetAxis(0)->SetRangeUser(minPt,maxPt);
154 hHLT->GetAxis(1)->SetRangeUser(minTPCclus,maxTPCclus);
155 hHLT->GetAxis(3)->SetRangeUser(minEta, maxEta);
156 hHLT->GetAxis(5)->SetRangeUser(minDCAr, maxDCAr);
157 hHLT->GetAxis(6)->SetRangeUser(minDCAz, maxDCAz);
158 hHLT->GetAxis(10)->SetRangeUser(minITSclus, maxITSclus);
159 hHLT->GetAxis(11)->SetRangeUser(minTrackMult, maxTrackMult);
160 if(VS!=2) hHLT->GetAxis(12)->SetRangeUser(VS,VS);
161
162 hOFF->GetAxis(0)->SetRangeUser(minPt,maxPt);
163 hOFF->GetAxis(1)->SetRangeUser(minTPCclus,maxTPCclus);
164 hOFF->GetAxis(3)->SetRangeUser(minEta, maxEta);
165 hOFF->GetAxis(5)->SetRangeUser(minDCAr, maxDCAr);
166 hOFF->GetAxis(6)->SetRangeUser(minDCAz, maxDCAz);
167 hOFF->GetAxis(10)->SetRangeUser(minITSclus, maxITSclus);
168 hOFF->GetAxis(11)->SetRangeUser(minTrackMult, maxTrackMult);
169 if(VS!=2) hOFF->GetAxis(12)->SetRangeUser(VS,VS);
170
171 for(int i=0; i<size; i++){
172
173 hlt = hHLT->Projection(i);
174 off = hOFF->Projection(i);
56ce6b77 175
176 hlt->SetTitle(fix1DTitle(hHLT->Projection(i)->GetTitle()));
2de8763b 177
178 TString s = hlt->GetTitle();
179 if(s.Contains("p_")){
180 s+=" (GeV/c)";
181 hlt->SetXTitle(s);
182 }
183 else if(s.Contains("theta") || s.Contains("phi")){
184 s+=" (rad)";
185 hlt->SetXTitle(s);
186 }
187 else if(s.Contains("DCA")){
188 s+=" (cm)";
189 hlt->SetXTitle(s);
190 }
56ce6b77 191
21fba467 192 defineYaxisMax(hlt, off);
e84c79f2 193 //off->SetLineColor(2);
194 off->SetLineStyle(2);
21fba467 195
196 can->cd(i+1);
197 hlt->Draw();
198 off->Draw("sames");
199 printStats(hlt, off);
15c6e37d 200
201 if(i==0){
202 printLegend(l,hlt,off);
e5f150ee 203 TPaveText *pave = new TPaveText(50,500,140,2100);
204 pave->SetFillColor(kWhite);
205 pave->SetLineColor(kWhite);
206 pave->SetShadowColor(kWhite);
207 //TText *t1 =
208 pave->AddText(itoa(minEta)+" < #eta < "+itoa(maxEta));
209 pave->AddText(itoa(minPt)+" < p_{T} (GeV/c) < "+itoa(maxPt));
210 pave->AddText(itoa(minTrackMult)+" < track mult < "+itoa(maxTrackMult));
211 pave->AddText(itoa(minDCAr)+" < DCAr (cm) < "+itoa(maxDCAr));
212 pave->AddText(itoa(minDCAz)+" < DCAz (cm) < "+itoa(maxDCAz));
213 pave->AddText(itoa(minTPCclus)+" < TPC clusters/track < "+itoa(maxTPCclus));
214 pave->AddText(itoa(minITSclus)+" < ITS clusters/track < "+itoa(maxITSclus));
215 if(VS!=2) pave->AddText("vertex status: "+itoa(VS));
216
217 pave->Draw();
218 can->Update();
15c6e37d 219 }
21fba467 220 }
21fba467 221}
222
223//====================== for 2D distributions ===============================//
224
225void plot2D(TCanvas* can, THnSparse* h,
226 double minEta, double maxEta,
227 double minPt, double maxPt,
228 double minDCAr, double maxDCAr,
229 double minDCAz, double maxDCAz,
230 int minTPCclus, int maxTPCclus,
231 int minITSclus, int maxITSclus,
232 int minTrackMult, int maxTrackMult
233 )
234{
21fba467 235 h->GetAxis(0)->SetRangeUser(minPt,maxPt);
236 h->GetAxis(1)->SetRangeUser(minTPCclus,maxTPCclus);
237 h->GetAxis(3)->SetRangeUser(minEta, maxEta);
238 h->GetAxis(5)->SetRangeUser(minDCAr, maxDCAr);
239 h->GetAxis(6)->SetRangeUser(minDCAz, maxDCAz);
240 h->GetAxis(10)->SetRangeUser(minITSclus, maxITSclus);
241 h->GetAxis(11)->SetRangeUser(minTrackMult, maxTrackMult);
242
56ce6b77 243 can->cd(1);
244 TH2D *ht = h->Projection(1,0);
245 ht->SetTitle(fix2DTitle(h->Projection(1)->GetTitle(), h->Projection(0)->GetTitle()));
2de8763b 246
247 TString s = fix1DTitle(h->Projection(0)->GetTitle())+" (GeV/c)";
248 ht->SetXTitle(s);
56ce6b77 249 ht->Draw("colz");
250
21fba467 251 can->cd(2);
56ce6b77 252 ht = h->Projection(1,3);
253 ht->SetTitle(fix2DTitle(h->Projection(1)->GetTitle(), h->Projection(3)->GetTitle()));
254 ht->Draw("colz");
255
21fba467 256 can->cd(3);
56ce6b77 257 ht = h->Projection(1,5);
258 ht->SetTitle(fix2DTitle(h->Projection(1)->GetTitle(), h->Projection(5)->GetTitle()));
2de8763b 259 TString s = fix1DTitle(h->Projection(5)->GetTitle())+" (cm)";
260 ht->SetXTitle(s);
56ce6b77 261 ht->Draw("colz");
262
21fba467 263 can->cd(4);
56ce6b77 264 ht = h->Projection(1,6);
265 ht->SetTitle(fix2DTitle(h->Projection(1)->GetTitle(), h->Projection(6)->GetTitle()));
2de8763b 266 TString s = fix1DTitle(h->Projection(6)->GetTitle())+" (cm)";
267 ht->SetXTitle(s);
56ce6b77 268 ht->Draw("colz");
21fba467 269
270 can->cd(5);
56ce6b77 271 ht = h->Projection(6,0);
272 ht->SetTitle(fix2DTitle(h->Projection(6)->GetTitle(), h->Projection(0)->GetTitle()));
2de8763b 273 TString s = fix1DTitle(h->Projection(0)->GetTitle())+" (GeV/c)";
274 ht->SetXTitle(s);
275 TString s = fix1DTitle(h->Projection(6)->GetTitle())+" (cm)";
276 ht->SetYTitle(s);
56ce6b77 277 ht->Draw("colz");
278
21fba467 279 can->cd(6);
56ce6b77 280 ht = h->Projection(6,3);
281 ht->SetTitle(fix2DTitle(h->Projection(6)->GetTitle(), h->Projection(3)->GetTitle()));
2de8763b 282 TString s = fix1DTitle(h->Projection(6)->GetTitle())+" (cm)";
283 ht->SetYTitle(s);
56ce6b77 284 ht->Draw("colz");
285
21fba467 286 can->cd(7);
56ce6b77 287 ht = h->Projection(3,0);
288 ht->SetTitle(fix2DTitle(h->Projection(3)->GetTitle(), h->Projection(0)->GetTitle()));
2de8763b 289 TString s = fix1DTitle(h->Projection(0)->GetTitle())+" (GeV/c)";
290 ht->SetXTitle(s);
56ce6b77 291 ht->Draw("colz");
292
21fba467 293 can->cd(8);
56ce6b77 294 ht = h->Projection(3,4);
295 ht->SetTitle(fix2DTitle(h->Projection(3)->GetTitle(), h->Projection(4)->GetTitle()));
2de8763b 296 TString s = fix1DTitle(h->Projection(4)->GetTitle())+" (rad)";
297 ht->SetXTitle(s);
56ce6b77 298 ht->Draw("colz");
21fba467 299}
300
301void plotAid(TCanvas* can, THnSparse* hOFF, THnSparse* hHLT, TText* hText, TH1D *hlt, TH1D *off, TLegend *l, int size){
302
303 for(int i=0; i<size; i++){
304 hlt = hHLT->Projection(i);
305 off = hOFF->Projection(i);
2de8763b 306 hlt->SetTitle(fix1DTitle(hHLT->Projection(i)->GetTitle()));
307 TString s = hlt->GetTitle();
308 if(s.Contains("primary")){
309 s+=" (cm)";
310 hlt->SetXTitle(s);
311 }
312
21fba467 313 defineYaxisMax(hlt, off);
314 off->SetLineColor(2);
315
316 can->cd(i+1);
317 hlt->Draw();
318 off->Draw("sames");
319 printStats(hlt, off);
15c6e37d 320
321 if(i==0) printLegend(l,hlt,off);
21fba467 322 }
21fba467 323}
324
325void plotEventQuantities(TCanvas* can, THnSparse* heventOFF, THnSparse* heventHLT, TText* hText){
326
327 TH1D *hlt = NULL;
328 TH1D *off = NULL;
329
330 TLegend *leg1 = new TLegend(0.6,0.6,0.8,0.8);
331
332 plotAid(can, heventOFF, heventHLT, hText, hlt, off, leg1, 6);
333 return;
334}
335
336void plotTrackQuantities( TCanvas* can, THnSparse* htrackOFF, THnSparse* htrackHLT, TText* hText,
337 double minEta, double maxEta,
338 double minPt, double maxPt,
339 double minDCAr, double maxDCAr,
340 double minDCAz, double maxDCAz,
341 int minTPCclus, int maxTPCclus,
342 int minITSclus, int maxITSclus,
343 int minTrackMult, int maxTrackMult,
344 int VS
345 )
346{
347 TH1D *hlt = NULL;
348 TH1D *off = NULL;
349
350 TLegend *leg1 = new TLegend(0.6,0.6,0.8,0.8);
351 plotAid(can, htrackOFF, htrackHLT, hText, hlt, off, leg1, 11,
352 minEta, maxEta, minPt, maxPt, minDCAr, maxDCAr, minDCAz, maxDCAz, minTPCclus, maxTPCclus, minITSclus, maxITSclus, minTrackMult, maxTrackMult, VS);
56ce6b77 353 return;
354}
355
356TString fix1DTitle(const char* c){
357 TString tmp = c;
358 tmp.ReplaceAll("projection ","");
359 return tmp;
360}
361
362TString fix2DTitle(const char* c1, const char* c2){
363 TString tmp = fix1DTitle(c1)+" vs."+fix1DTitle(c2);
364 return tmp;
21fba467 365}
15c6e37d 366
367TString cutsToString( double minEta, double maxEta,
368 double minPt, double maxPt,
369 double minDCAr, double maxDCAr,
370 double minDCAz, double maxDCAz,
371 int minTPCclus, int maxTPCclus,
372 int minITSclus, int maxITSclus,
373 int minTrackMult, int maxTrackMult,
374 int VS
375 )
376{
15c6e37d 377 TString cuts = "";
e5f150ee 378 cuts += "eta"+itoa(minEta)+"_"+itoa(maxEta)+"_";
379 cuts += "Pt"+itoa(minPt)+"_"+itoa(maxPt)+"_";
380 cuts += "TM"+itoa(minTrackMult)+"_"+itoa(maxTrackMult)+"_";
381 cuts += "DCAr"+itoa(minDCAr)+"_"+itoa(maxDCAr)+"_";
382 cuts += "DCAz"+itoa(minDCAz)+"_"+itoa(maxDCAz)+"_";
383 cuts += "TPCclus"+itoa(minTPCclus)+"_"+itoa(maxTPCclus)+"_";
384 cuts += "ITSclus"+itoa(minITSclus)+"_"+itoa(maxITSclus)+"_";
15c6e37d 385
386 if(VS==2) cuts.Chop();
e5f150ee 387 else cuts += "VS"+itoa(VS);
15c6e37d 388 return cuts;
389}
e5f150ee 390
391TString itoa(int i){
392 stringstream si;
393 si << i;
394 return si.str();
395}
396
397TString itoa(double i){
398 stringstream si;
399 si << i;
400 return si.str();
401}