]>
Commit | Line | Data |
---|---|---|
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 | ||
21 | void 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 | } | |
68 | ||
69 | ||
70 | TText *hText = list->FindObject("text"); | |
71 | if(!hText) printf("No hText\n"); | |
72 | ||
73 | TString t = "event properties for "; | |
74 | t+=hText->GetTitle(); | |
75 | ||
76 | TCanvas *can0 = new TCanvas("can0",t,900,600); | |
77 | can0->Divide(3,2); | |
78 | plotEventQuantities(can0,heventOFF,heventHLT,hText); | |
79 | ||
80 | TCanvas *can1 = new TCanvas("can1","track properties",1100,900); | |
81 | can1->Divide(4,3); | |
82 | plotTrackQuantities(can1, htrackOFF, htrackHLT, hText, | |
83 | minEta, maxEta, minPt, maxPt, minDCAr, maxDCAr, minDCAz, maxDCAz, minTPCclus, maxTPCclus, minITSclus, maxITSclus, minTrackMult, maxTrackMult, vertexStatus); | |
84 | ||
85 | TCanvas *can2 = new TCanvas("can2","2-D HLT track correlations",1200,800); | |
86 | can2->Divide(4,2); | |
87 | plot2D(can2, htrackHLT, minEta, maxEta, minPt, maxPt, minDCAr, maxDCAr, minDCAz, maxDCAz, minTPCclus, maxTPCclus, minITSclus, maxITSclus, minTrackMult, maxTrackMult); | |
88 | ||
89 | TCanvas *can3 = new TCanvas("can3","2-D OFF track correlations",1200,800); | |
90 | can3->Divide(4,2); | |
91 | plot2D(can3, htrackOFF, minEta, maxEta, minPt, maxPt, minDCAr, maxDCAr, minDCAz, maxDCAz, minTPCclus, maxTPCclus, minITSclus, maxITSclus, minTrackMult, maxTrackMult); | |
92 | ||
93 | TString folder = hText->GetTitle(); | |
94 | folder.ReplaceAll(" ",""); | |
95 | folder.Remove(0,3); | |
96 | folder.Remove(6,15); | |
97 | ||
98 | gSystem->Exec("mkdir "+folder); | |
15c6e37d | 99 | TString cuts = cutsToString(minEta, maxEta, minPt, maxPt, minDCAr, maxDCAr, minDCAz, maxDCAz, minTPCclus, maxTPCclus, minITSclus, maxITSclus, minTrackMult, maxTrackMult, vertexStatus); |
21fba467 | 100 | |
15c6e37d | 101 | can0->SaveAs(folder+"/event_properties_"+cuts+".root"); |
102 | can0->SaveAs(folder+"/event_properties_"+cuts+".png"); | |
103 | can1->SaveAs(folder+"/track_properties_"+cuts+".root"); | |
104 | can1->SaveAs(folder+"/track_properties_"+cuts+".png"); | |
105 | can2->SaveAs(folder+"/HLT_2D_track_correlations_"+cuts+".root"); | |
106 | can2->SaveAs(folder+"/HLT_2D_track_correlations_"+cuts+".png"); | |
107 | can3->SaveAs(folder+"/OFF_2D_track_correlations_"+cuts+".root"); | |
108 | can3->SaveAs(folder+"/OFF_2D_track_correlations_"+cuts+".png"); | |
21fba467 | 109 | |
21fba467 | 110 | return; |
111 | } | |
112 | ||
113 | void printStats(TH1D *hlt, TH1D *off){ | |
114 | gPad->Update(); | |
115 | TPaveStats *st1 = (TPaveStats*)hlt->FindObject("stats"); | |
116 | st1->SetLineColor(0); | |
117 | ||
118 | gPad->Update(); | |
119 | TPaveStats *st2 = (TPaveStats*)off->FindObject("stats"); | |
120 | st2->SetY2NDC(st1->GetY1NDC()-0.05); | |
121 | st2->SetY1NDC(st2->GetY2NDC()-TMath::Abs(st1->GetY1NDC()-st1->GetY2NDC())); | |
122 | st2->SetLineColor(0); | |
123 | st2->SetTextColor(off->GetLineColor()); | |
124 | st2->SetFillStyle(0); | |
125 | st2->Draw(); | |
126 | } | |
127 | ||
128 | void defineYaxisMax(TH1D *hlt, TH1D *off){ | |
129 | if(hlt->GetMaximum() > off->GetMaximum()) off->SetMaximum(1.1*hlt->GetMaximum()); | |
130 | else hlt->SetMaximum(1.1*off->GetMaximum()); | |
131 | } | |
132 | ||
133 | void printLegend(TLegend *l, TH1D *hlt, TH1D *off){ | |
134 | l->SetFillColor(10); | |
135 | l->SetLineColor(10); | |
136 | l->AddEntry(hlt, "HLT", "l"); | |
137 | l->AddEntry(off, "OFF", "l"); | |
138 | l->Draw("same"); | |
139 | } | |
140 | ||
141 | //====================== for 1D distributions ===============================// | |
142 | ||
143 | void plotAid(TCanvas* can, THnSparse* hOFF, THnSparse* hHLT, TText* hText, TH1D *hlt, TH1D *off, TLegend *l, int size, | |
144 | double minEta, double maxEta, | |
145 | double minPt, double maxPt, | |
146 | double minDCAr, double maxDCAr, | |
147 | double minDCAz, double maxDCAz, | |
148 | int minTPCclus, int maxTPCclus, | |
149 | int minITSclus, int maxITSclus, | |
150 | int minTrackMult, int maxTrackMult, | |
151 | int VS | |
152 | ) | |
153 | { | |
154 | hHLT->GetAxis(0)->SetRangeUser(minPt,maxPt); | |
155 | hHLT->GetAxis(1)->SetRangeUser(minTPCclus,maxTPCclus); | |
156 | hHLT->GetAxis(3)->SetRangeUser(minEta, maxEta); | |
157 | hHLT->GetAxis(5)->SetRangeUser(minDCAr, maxDCAr); | |
158 | hHLT->GetAxis(6)->SetRangeUser(minDCAz, maxDCAz); | |
159 | hHLT->GetAxis(10)->SetRangeUser(minITSclus, maxITSclus); | |
160 | hHLT->GetAxis(11)->SetRangeUser(minTrackMult, maxTrackMult); | |
161 | if(VS!=2) hHLT->GetAxis(12)->SetRangeUser(VS,VS); | |
162 | ||
163 | hOFF->GetAxis(0)->SetRangeUser(minPt,maxPt); | |
164 | hOFF->GetAxis(1)->SetRangeUser(minTPCclus,maxTPCclus); | |
165 | hOFF->GetAxis(3)->SetRangeUser(minEta, maxEta); | |
166 | hOFF->GetAxis(5)->SetRangeUser(minDCAr, maxDCAr); | |
167 | hOFF->GetAxis(6)->SetRangeUser(minDCAz, maxDCAz); | |
168 | hOFF->GetAxis(10)->SetRangeUser(minITSclus, maxITSclus); | |
169 | hOFF->GetAxis(11)->SetRangeUser(minTrackMult, maxTrackMult); | |
170 | if(VS!=2) hOFF->GetAxis(12)->SetRangeUser(VS,VS); | |
171 | ||
172 | for(int i=0; i<size; i++){ | |
173 | ||
174 | hlt = hHLT->Projection(i); | |
175 | off = hOFF->Projection(i); | |
56ce6b77 | 176 | |
177 | hlt->SetTitle(fix1DTitle(hHLT->Projection(i)->GetTitle())); | |
2de8763b | 178 | |
179 | TString s = hlt->GetTitle(); | |
180 | if(s.Contains("p_")){ | |
181 | s+=" (GeV/c)"; | |
182 | hlt->SetXTitle(s); | |
183 | } | |
184 | else if(s.Contains("theta") || s.Contains("phi")){ | |
185 | s+=" (rad)"; | |
186 | hlt->SetXTitle(s); | |
187 | } | |
188 | else if(s.Contains("DCA")){ | |
189 | s+=" (cm)"; | |
190 | hlt->SetXTitle(s); | |
191 | } | |
56ce6b77 | 192 | |
21fba467 | 193 | defineYaxisMax(hlt, off); |
e84c79f2 | 194 | //off->SetLineColor(2); |
195 | off->SetLineStyle(2); | |
21fba467 | 196 | |
197 | can->cd(i+1); | |
198 | hlt->Draw(); | |
199 | off->Draw("sames"); | |
200 | printStats(hlt, off); | |
15c6e37d | 201 | |
202 | if(i==0){ | |
203 | printLegend(l,hlt,off); | |
204 | } | |
21fba467 | 205 | } |
21fba467 | 206 | } |
207 | ||
208 | //====================== for 2D distributions ===============================// | |
209 | ||
210 | void plot2D(TCanvas* can, THnSparse* h, | |
211 | double minEta, double maxEta, | |
212 | double minPt, double maxPt, | |
213 | double minDCAr, double maxDCAr, | |
214 | double minDCAz, double maxDCAz, | |
215 | int minTPCclus, int maxTPCclus, | |
216 | int minITSclus, int maxITSclus, | |
217 | int minTrackMult, int maxTrackMult | |
218 | ) | |
219 | { | |
21fba467 | 220 | h->GetAxis(0)->SetRangeUser(minPt,maxPt); |
221 | h->GetAxis(1)->SetRangeUser(minTPCclus,maxTPCclus); | |
222 | h->GetAxis(3)->SetRangeUser(minEta, maxEta); | |
223 | h->GetAxis(5)->SetRangeUser(minDCAr, maxDCAr); | |
224 | h->GetAxis(6)->SetRangeUser(minDCAz, maxDCAz); | |
225 | h->GetAxis(10)->SetRangeUser(minITSclus, maxITSclus); | |
226 | h->GetAxis(11)->SetRangeUser(minTrackMult, maxTrackMult); | |
227 | ||
56ce6b77 | 228 | can->cd(1); |
229 | TH2D *ht = h->Projection(1,0); | |
230 | ht->SetTitle(fix2DTitle(h->Projection(1)->GetTitle(), h->Projection(0)->GetTitle())); | |
2de8763b | 231 | |
232 | TString s = fix1DTitle(h->Projection(0)->GetTitle())+" (GeV/c)"; | |
233 | ht->SetXTitle(s); | |
56ce6b77 | 234 | ht->Draw("colz"); |
235 | ||
21fba467 | 236 | can->cd(2); |
56ce6b77 | 237 | ht = h->Projection(1,3); |
238 | ht->SetTitle(fix2DTitle(h->Projection(1)->GetTitle(), h->Projection(3)->GetTitle())); | |
239 | ht->Draw("colz"); | |
240 | ||
21fba467 | 241 | can->cd(3); |
56ce6b77 | 242 | ht = h->Projection(1,5); |
243 | ht->SetTitle(fix2DTitle(h->Projection(1)->GetTitle(), h->Projection(5)->GetTitle())); | |
2de8763b | 244 | TString s = fix1DTitle(h->Projection(5)->GetTitle())+" (cm)"; |
245 | ht->SetXTitle(s); | |
56ce6b77 | 246 | ht->Draw("colz"); |
247 | ||
21fba467 | 248 | can->cd(4); |
56ce6b77 | 249 | ht = h->Projection(1,6); |
250 | ht->SetTitle(fix2DTitle(h->Projection(1)->GetTitle(), h->Projection(6)->GetTitle())); | |
2de8763b | 251 | TString s = fix1DTitle(h->Projection(6)->GetTitle())+" (cm)"; |
252 | ht->SetXTitle(s); | |
56ce6b77 | 253 | ht->Draw("colz"); |
21fba467 | 254 | |
255 | can->cd(5); | |
56ce6b77 | 256 | ht = h->Projection(6,0); |
257 | ht->SetTitle(fix2DTitle(h->Projection(6)->GetTitle(), h->Projection(0)->GetTitle())); | |
2de8763b | 258 | TString s = fix1DTitle(h->Projection(0)->GetTitle())+" (GeV/c)"; |
259 | ht->SetXTitle(s); | |
260 | TString s = fix1DTitle(h->Projection(6)->GetTitle())+" (cm)"; | |
261 | ht->SetYTitle(s); | |
56ce6b77 | 262 | ht->Draw("colz"); |
263 | ||
21fba467 | 264 | can->cd(6); |
56ce6b77 | 265 | ht = h->Projection(6,3); |
266 | ht->SetTitle(fix2DTitle(h->Projection(6)->GetTitle(), h->Projection(3)->GetTitle())); | |
2de8763b | 267 | TString s = fix1DTitle(h->Projection(6)->GetTitle())+" (cm)"; |
268 | ht->SetYTitle(s); | |
56ce6b77 | 269 | ht->Draw("colz"); |
270 | ||
21fba467 | 271 | can->cd(7); |
56ce6b77 | 272 | ht = h->Projection(3,0); |
273 | ht->SetTitle(fix2DTitle(h->Projection(3)->GetTitle(), h->Projection(0)->GetTitle())); | |
2de8763b | 274 | TString s = fix1DTitle(h->Projection(0)->GetTitle())+" (GeV/c)"; |
275 | ht->SetXTitle(s); | |
56ce6b77 | 276 | ht->Draw("colz"); |
277 | ||
21fba467 | 278 | can->cd(8); |
56ce6b77 | 279 | ht = h->Projection(3,4); |
280 | ht->SetTitle(fix2DTitle(h->Projection(3)->GetTitle(), h->Projection(4)->GetTitle())); | |
2de8763b | 281 | TString s = fix1DTitle(h->Projection(4)->GetTitle())+" (rad)"; |
282 | ht->SetXTitle(s); | |
56ce6b77 | 283 | ht->Draw("colz"); |
21fba467 | 284 | } |
285 | ||
286 | void plotAid(TCanvas* can, THnSparse* hOFF, THnSparse* hHLT, TText* hText, TH1D *hlt, TH1D *off, TLegend *l, int size){ | |
287 | ||
288 | for(int i=0; i<size; i++){ | |
289 | hlt = hHLT->Projection(i); | |
290 | off = hOFF->Projection(i); | |
2de8763b | 291 | hlt->SetTitle(fix1DTitle(hHLT->Projection(i)->GetTitle())); |
292 | TString s = hlt->GetTitle(); | |
293 | if(s.Contains("primary")){ | |
294 | s+=" (cm)"; | |
295 | hlt->SetXTitle(s); | |
296 | } | |
297 | ||
21fba467 | 298 | defineYaxisMax(hlt, off); |
299 | off->SetLineColor(2); | |
300 | ||
301 | can->cd(i+1); | |
302 | hlt->Draw(); | |
303 | off->Draw("sames"); | |
304 | printStats(hlt, off); | |
15c6e37d | 305 | |
306 | if(i==0) printLegend(l,hlt,off); | |
21fba467 | 307 | } |
21fba467 | 308 | } |
309 | ||
310 | void plotEventQuantities(TCanvas* can, THnSparse* heventOFF, THnSparse* heventHLT, TText* hText){ | |
311 | ||
312 | TH1D *hlt = NULL; | |
313 | TH1D *off = NULL; | |
314 | ||
315 | TLegend *leg1 = new TLegend(0.6,0.6,0.8,0.8); | |
316 | ||
317 | plotAid(can, heventOFF, heventHLT, hText, hlt, off, leg1, 6); | |
318 | return; | |
319 | } | |
320 | ||
321 | void plotTrackQuantities( TCanvas* can, THnSparse* htrackOFF, THnSparse* htrackHLT, TText* hText, | |
322 | double minEta, double maxEta, | |
323 | double minPt, double maxPt, | |
324 | double minDCAr, double maxDCAr, | |
325 | double minDCAz, double maxDCAz, | |
326 | int minTPCclus, int maxTPCclus, | |
327 | int minITSclus, int maxITSclus, | |
328 | int minTrackMult, int maxTrackMult, | |
329 | int VS | |
330 | ) | |
331 | { | |
332 | TH1D *hlt = NULL; | |
333 | TH1D *off = NULL; | |
334 | ||
335 | TLegend *leg1 = new TLegend(0.6,0.6,0.8,0.8); | |
336 | plotAid(can, htrackOFF, htrackHLT, hText, hlt, off, leg1, 11, | |
337 | minEta, maxEta, minPt, maxPt, minDCAr, maxDCAr, minDCAz, maxDCAz, minTPCclus, maxTPCclus, minITSclus, maxITSclus, minTrackMult, maxTrackMult, VS); | |
56ce6b77 | 338 | return; |
339 | } | |
340 | ||
341 | TString fix1DTitle(const char* c){ | |
342 | TString tmp = c; | |
343 | tmp.ReplaceAll("projection ",""); | |
344 | return tmp; | |
345 | } | |
346 | ||
347 | TString fix2DTitle(const char* c1, const char* c2){ | |
348 | TString tmp = fix1DTitle(c1)+" vs."+fix1DTitle(c2); | |
349 | return tmp; | |
21fba467 | 350 | } |
15c6e37d | 351 | |
352 | TString cutsToString( double minEta, double maxEta, | |
353 | double minPt, double maxPt, | |
354 | double minDCAr, double maxDCAr, | |
355 | double minDCAz, double maxDCAz, | |
356 | int minTPCclus, int maxTPCclus, | |
357 | int minITSclus, int maxITSclus, | |
358 | int minTrackMult, int maxTrackMult, | |
359 | int VS | |
360 | ) | |
361 | { | |
362 | stringstream sMinEta, sMaxEta; | |
363 | sMinEta << minEta; sMaxEta << maxEta; | |
364 | ||
365 | stringstream sMinTM, sMaxTM; | |
366 | sMinTM << minTrackMult; sMaxTM << maxTrackMult; | |
367 | ||
368 | stringstream sMinPt, sMaxPt; | |
369 | sMinPt << minPt; sMaxPt << maxPt; | |
370 | ||
371 | stringstream sMinDCAr, sMaxDCAr; | |
372 | sMinDCAr << minDCAr; sMaxDCAr << maxDCAr; | |
373 | ||
374 | stringstream sMinDCAz, sMaxDCAz; | |
375 | sMinDCAz << minDCAz; sMaxDCAz << maxDCAz; | |
376 | ||
377 | stringstream sMinTPCclus, sMaxTPCclus; | |
378 | sMinTPCclus << minTPCclus; sMaxTPCclus << maxTPCclus; | |
379 | ||
380 | stringstream sMinITSclus, sMaxITSclus; | |
381 | sMinITSclus << minITSclus; sMaxITSclus << maxITSclus; | |
382 | ||
383 | stringstream sVS; sVS << VS; | |
384 | ||
385 | TString cuts = ""; | |
386 | cuts += "eta"+sMinEta.str()+"_"+sMaxEta.str()+"_"; | |
387 | cuts += "Pt"+sMinPt.str()+"_"+sMaxPt.str()+"_"; | |
388 | cuts += "TM"+sMinTM.str()+"_"+sMaxTM.str()+"_"; | |
389 | cuts += "DCAr"+sMinDCAr.str()+"_"+sMaxDCAr.str()+"_"; | |
390 | cuts += "DCAz"+sMinDCAz.str()+"_"+sMaxDCAz.str()+"_"; | |
391 | cuts += "TPCclus"+sMinTPCclus.str()+"_"+sMaxTPCclus.str()+"_"; | |
392 | cuts += "ITSclus"+sMinITSclus.str()+"_"+sMaxITSclus.str()+"_"; | |
393 | ||
394 | if(VS==2) cuts.Chop(); | |
395 | else cuts += "VS"+sVS.str(); | |
396 | return cuts; | |
397 | } |