]>
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, | |
28 | int minITSclus=1, int maxITSclus=6, | |
29 | int vertexStatus=2 | |
30 | ) | |
31 | { | |
32 | gROOT->SetStyle("Plain"); | |
33 | gStyle->SetPalette(1); | |
34 | gStyle->SetOptStat(10); | |
35 | TH1::AddDirectory(kFALSE); | |
36 | ||
37 | TFile *file = TFile::Open(inputFile); | |
38 | if(!file){ | |
39 | printf("Error: No file %s in folder.\n", inputFile); | |
40 | return; | |
41 | } | |
42 | ||
43 | TList *list = static_cast<TList*>(file->Get("esd_thnsparse")); | |
44 | if(!list){ | |
45 | printf("Error: No List contained in file %s.\n", inputFile); | |
46 | return; | |
47 | } | |
48 | ||
49 | THnSparseF *heventHLT = (THnSparse*)list->FindObject("fEventHLT"); | |
50 | if(!heventHLT){ | |
51 | printf("Error: There is no HLT THnSparse object in file %s\n", inputFile); | |
52 | } | |
53 | THnSparseF *heventOFF = (THnSparse*)list->FindObject("fEventOFF"); | |
54 | if(!heventOFF){ | |
55 | printf("Error: There is no OFF THnSparse object in file %s\n", inputFile); | |
56 | } | |
57 | THnSparseF *htrackHLT = (THnSparse*)list->FindObject("fTrackHLT"); | |
58 | if(!htrackHLT){ | |
59 | printf("Error: No HLT THnSparse object found\n"); | |
60 | return; | |
61 | } | |
62 | THnSparseF *htrackOFF = (THnSparse*)list->FindObject("fTrackOFF"); | |
63 | if(!htrackOFF){ | |
64 | printf("Error: No OFF THnSparse object found\n"); | |
65 | return; | |
66 | } | |
67 | ||
68 | ||
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); | |
98 | can0->SaveAs(folder+"/event_properties.root"); | |
99 | ||
100 | ||
101 | stringstream sMinEta, sMaxEta; | |
102 | sMinEta << minEta; sMaxEta << maxEta; | |
103 | ||
104 | stringstream sMinTM, sMaxTM; | |
105 | sMinTM << minTrackMult; sMaxTM << maxTrackMult; | |
106 | ||
107 | stringstream sMinPt, sMaxPt; | |
108 | sMinPt << minPt; sMaxPt << maxPt; | |
109 | ||
110 | stringstream sMinDCAr, sMaxDCAr; | |
111 | sMinDCAr << minDCAr; sMaxDCAr << maxDCAr; | |
112 | ||
113 | stringstream sMinDCAz, sMaxDCAz; | |
114 | sMinDCAz << minDCAz; sMaxDCAz << maxDCAz; | |
115 | ||
116 | stringstream sMinTPCclus, sMaxTPCclus; | |
117 | sMinTPCclus << minTPCclus; sMaxTPCclus << maxTPCclus; | |
118 | ||
119 | stringstream sMinITSclus, sMaxITSclus; | |
120 | sMinITSclus << minITSclus; sMaxITSclus << maxITSclus; | |
121 | ||
122 | stringstream sVS; sVS << vertexStatus; | |
123 | ||
124 | TString trackName = "track_properties_"; | |
125 | trackName += "eta"+sMinEta.str()+"_"+sMaxEta.str()+"_"; | |
126 | trackName += "Pt"+sMinPt.str()+"_"+sMaxPt.str()+"_"; | |
127 | trackName += "TM"+sMinTM.str()+"_"+sMaxTM.str()+"_"; | |
128 | trackName += "DCAr"+sMinDCAr.str()+"_"+sMaxDCAr.str()+"_"; | |
129 | trackName += "DCAz"+sMinDCAz.str()+"_"+sMaxDCAz.str()+"_"; | |
130 | trackName += "TPCclus"+sMinTPCclus.str()+"_"+sMaxTPCclus.str()+"_"; | |
131 | trackName += "ITSclus"+sMinITSclus.str()+"_"+sMaxITSclus.str()+"_"; | |
132 | if(vertexStatus==2){ | |
133 | trackName.Chop(); trackName += ".root"; | |
134 | } | |
135 | else { | |
136 | trackName += "VS"+sVS.str(); | |
137 | trackName += ".root"; | |
138 | } | |
139 | can1->SaveAs(folder+"/"+trackName); | |
140 | ||
141 | can2->SaveAs(folder+"/HLT_2D_track_correlations.root"); | |
142 | can3->SaveAs(folder+"/OFF_2D_track_correlations.root"); | |
143 | ||
144 | return; | |
145 | } | |
146 | ||
147 | void printStats(TH1D *hlt, TH1D *off){ | |
148 | gPad->Update(); | |
149 | TPaveStats *st1 = (TPaveStats*)hlt->FindObject("stats"); | |
150 | st1->SetLineColor(0); | |
151 | ||
152 | gPad->Update(); | |
153 | TPaveStats *st2 = (TPaveStats*)off->FindObject("stats"); | |
154 | st2->SetY2NDC(st1->GetY1NDC()-0.05); | |
155 | st2->SetY1NDC(st2->GetY2NDC()-TMath::Abs(st1->GetY1NDC()-st1->GetY2NDC())); | |
156 | st2->SetLineColor(0); | |
157 | st2->SetTextColor(off->GetLineColor()); | |
158 | st2->SetFillStyle(0); | |
159 | st2->Draw(); | |
160 | } | |
161 | ||
162 | void defineYaxisMax(TH1D *hlt, TH1D *off){ | |
163 | if(hlt->GetMaximum() > off->GetMaximum()) off->SetMaximum(1.1*hlt->GetMaximum()); | |
164 | else hlt->SetMaximum(1.1*off->GetMaximum()); | |
165 | } | |
166 | ||
167 | void printLegend(TLegend *l, TH1D *hlt, TH1D *off){ | |
168 | l->SetFillColor(10); | |
169 | l->SetLineColor(10); | |
170 | l->AddEntry(hlt, "HLT", "l"); | |
171 | l->AddEntry(off, "OFF", "l"); | |
172 | l->Draw("same"); | |
173 | } | |
174 | ||
175 | //====================== for 1D distributions ===============================// | |
176 | ||
177 | void plotAid(TCanvas* can, THnSparse* hOFF, THnSparse* hHLT, TText* hText, TH1D *hlt, TH1D *off, TLegend *l, int size, | |
178 | double minEta, double maxEta, | |
179 | double minPt, double maxPt, | |
180 | double minDCAr, double maxDCAr, | |
181 | double minDCAz, double maxDCAz, | |
182 | int minTPCclus, int maxTPCclus, | |
183 | int minITSclus, int maxITSclus, | |
184 | int minTrackMult, int maxTrackMult, | |
185 | int VS | |
186 | ) | |
187 | { | |
188 | hHLT->GetAxis(0)->SetRangeUser(minPt,maxPt); | |
189 | hHLT->GetAxis(1)->SetRangeUser(minTPCclus,maxTPCclus); | |
190 | hHLT->GetAxis(3)->SetRangeUser(minEta, maxEta); | |
191 | hHLT->GetAxis(5)->SetRangeUser(minDCAr, maxDCAr); | |
192 | hHLT->GetAxis(6)->SetRangeUser(minDCAz, maxDCAz); | |
193 | hHLT->GetAxis(10)->SetRangeUser(minITSclus, maxITSclus); | |
194 | hHLT->GetAxis(11)->SetRangeUser(minTrackMult, maxTrackMult); | |
195 | if(VS!=2) hHLT->GetAxis(12)->SetRangeUser(VS,VS); | |
196 | ||
197 | hOFF->GetAxis(0)->SetRangeUser(minPt,maxPt); | |
198 | hOFF->GetAxis(1)->SetRangeUser(minTPCclus,maxTPCclus); | |
199 | hOFF->GetAxis(3)->SetRangeUser(minEta, maxEta); | |
200 | hOFF->GetAxis(5)->SetRangeUser(minDCAr, maxDCAr); | |
201 | hOFF->GetAxis(6)->SetRangeUser(minDCAz, maxDCAz); | |
202 | hOFF->GetAxis(10)->SetRangeUser(minITSclus, maxITSclus); | |
203 | hOFF->GetAxis(11)->SetRangeUser(minTrackMult, maxTrackMult); | |
204 | if(VS!=2) hOFF->GetAxis(12)->SetRangeUser(VS,VS); | |
205 | ||
206 | for(int i=0; i<size; i++){ | |
207 | ||
208 | hlt = hHLT->Projection(i); | |
209 | off = hOFF->Projection(i); | |
210 | hlt->SetTitle(hHLT->Projection(i)->GetTitle()); | |
211 | defineYaxisMax(hlt, off); | |
212 | off->SetLineColor(2); | |
213 | ||
214 | can->cd(i+1); | |
215 | hlt->Draw(); | |
216 | off->Draw("sames"); | |
217 | printStats(hlt, off); | |
218 | } | |
219 | printLegend(l,hlt,off); | |
220 | } | |
221 | ||
222 | //====================== for 2D distributions ===============================// | |
223 | ||
224 | void plot2D(TCanvas* can, THnSparse* h, | |
225 | double minEta, double maxEta, | |
226 | double minPt, double maxPt, | |
227 | double minDCAr, double maxDCAr, | |
228 | double minDCAz, double maxDCAz, | |
229 | int minTPCclus, int maxTPCclus, | |
230 | int minITSclus, int maxITSclus, | |
231 | int minTrackMult, int maxTrackMult | |
232 | ) | |
233 | { | |
234 | ||
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 | ||
243 | can->cd(1); | |
244 | h->Projection(1,0)->Draw("colz"); | |
245 | can->cd(2); | |
246 | h->Projection(1,3)->Draw("colz"); | |
247 | can->cd(3); | |
248 | h->Projection(1,5)->Draw("colz"); | |
249 | can->cd(4); | |
250 | h->Projection(1,6)->Draw("colz"); | |
251 | ||
252 | can->cd(5); | |
253 | h->Projection(6,0)->Draw("colz"); | |
254 | can->cd(6); | |
255 | h->Projection(6,3)->Draw("colz"); | |
256 | can->cd(7); | |
257 | h->Projection(3,0)->Draw("colz"); | |
258 | can->cd(8); | |
259 | h->Projection(3,4)->Draw("colz"); | |
260 | ||
261 | } | |
262 | ||
263 | void plotAid(TCanvas* can, THnSparse* hOFF, THnSparse* hHLT, TText* hText, TH1D *hlt, TH1D *off, TLegend *l, int size){ | |
264 | ||
265 | for(int i=0; i<size; i++){ | |
266 | hlt = hHLT->Projection(i); | |
267 | off = hOFF->Projection(i); | |
268 | hlt->SetTitle(hHLT->Projection(i)->GetTitle()); | |
269 | defineYaxisMax(hlt, off); | |
270 | off->SetLineColor(2); | |
271 | ||
272 | can->cd(i+1); | |
273 | hlt->Draw(); | |
274 | off->Draw("sames"); | |
275 | printStats(hlt, off); | |
276 | } | |
277 | printLegend(l,hlt,off); | |
278 | } | |
279 | ||
280 | void plotEventQuantities(TCanvas* can, THnSparse* heventOFF, THnSparse* heventHLT, TText* hText){ | |
281 | ||
282 | TH1D *hlt = NULL; | |
283 | TH1D *off = NULL; | |
284 | ||
285 | TLegend *leg1 = new TLegend(0.6,0.6,0.8,0.8); | |
286 | ||
287 | plotAid(can, heventOFF, heventHLT, hText, hlt, off, leg1, 6); | |
288 | return; | |
289 | } | |
290 | ||
291 | void plotTrackQuantities( TCanvas* can, THnSparse* htrackOFF, THnSparse* htrackHLT, TText* hText, | |
292 | double minEta, double maxEta, | |
293 | double minPt, double maxPt, | |
294 | double minDCAr, double maxDCAr, | |
295 | double minDCAz, double maxDCAz, | |
296 | int minTPCclus, int maxTPCclus, | |
297 | int minITSclus, int maxITSclus, | |
298 | int minTrackMult, int maxTrackMult, | |
299 | int VS | |
300 | ) | |
301 | { | |
302 | TH1D *hlt = NULL; | |
303 | TH1D *off = NULL; | |
304 | ||
305 | TLegend *leg1 = new TLegend(0.6,0.6,0.8,0.8); | |
306 | plotAid(can, htrackOFF, htrackHLT, hText, hlt, off, leg1, 11, | |
307 | minEta, maxEta, minPt, maxPt, minDCAr, maxDCAr, minDCAz, maxDCAz, minTPCclus, maxTPCclus, minITSclus, maxITSclus, minTrackMult, maxTrackMult, VS); | |
308 | return; | |
309 | } |