3 * Drawing macro for reading the THnSparse output of the
4 * HLT/QA/tasks/AliAnalysisTaskHLTCentralBarrel.cxx task.
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.
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.
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.
18 * @author Kalliopi.Kanaki@ift.uib.no
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=0, int maxITSclus=6,
32 gROOT->SetStyle("Plain");
33 gStyle->SetPalette(1);
34 gStyle->SetOptStat(10);
35 //gROOT->ForceStyle();
36 TH1::AddDirectory(kFALSE);
38 TFile *file = TFile::Open(inputFile);
40 printf("Error: No file %s in folder.\n", inputFile);
44 TList *list = static_cast<TList*>(file->Get("esd_thnsparse"));
46 printf("Error: No List contained in file %s.\n", inputFile);
50 THnSparseF *heventHLT = (THnSparse*)list->FindObject("fEventHLT");
52 printf("Error: There is no HLT THnSparse object in file %s\n", inputFile);
54 THnSparseF *heventOFF = (THnSparse*)list->FindObject("fEventOFF");
56 printf("Error: There is no OFF THnSparse object in file %s\n", inputFile);
58 THnSparseF *htrackHLT = (THnSparse*)list->FindObject("fTrackHLT");
60 printf("Error: No HLT THnSparse object found\n");
63 THnSparseF *htrackOFF = (THnSparse*)list->FindObject("fTrackOFF");
65 printf("Error: No OFF THnSparse object found\n");
70 TText *hText = list->FindObject("text");
71 if(!hText) printf("No hText\n");
73 TString t = "event properties for ";
76 TCanvas *can0 = new TCanvas("can0",t,900,600);
78 plotEventQuantities(can0,heventOFF,heventHLT,hText);
80 TCanvas *can1 = new TCanvas("can1","track properties",1100,900);
82 plotTrackQuantities(can1, htrackOFF, htrackHLT, hText,
83 minEta, maxEta, minPt, maxPt, minDCAr, maxDCAr, minDCAz, maxDCAz, minTPCclus, maxTPCclus, minITSclus, maxITSclus, minTrackMult, maxTrackMult, vertexStatus);
85 TCanvas *can2 = new TCanvas("can2","2-D HLT track correlations",1200,800);
87 plot2D(can2, htrackHLT, minEta, maxEta, minPt, maxPt, minDCAr, maxDCAr, minDCAz, maxDCAz, minTPCclus, maxTPCclus, minITSclus, maxITSclus, minTrackMult, maxTrackMult);
89 TCanvas *can3 = new TCanvas("can3","2-D OFF track correlations",1200,800);
91 plot2D(can3, htrackOFF, minEta, maxEta, minPt, maxPt, minDCAr, maxDCAr, minDCAz, maxDCAz, minTPCclus, maxTPCclus, minITSclus, maxITSclus, minTrackMult, maxTrackMult);
93 TString folder = hText->GetTitle();
94 folder.ReplaceAll(" ","");
98 gSystem->Exec("mkdir "+folder);
99 can0->SaveAs(folder+"/event_properties.root");
100 can0->SaveAs(folder+"/event_properties.png");
103 stringstream sMinEta, sMaxEta;
104 sMinEta << minEta; sMaxEta << maxEta;
106 stringstream sMinTM, sMaxTM;
107 sMinTM << minTrackMult; sMaxTM << maxTrackMult;
109 stringstream sMinPt, sMaxPt;
110 sMinPt << minPt; sMaxPt << maxPt;
112 stringstream sMinDCAr, sMaxDCAr;
113 sMinDCAr << minDCAr; sMaxDCAr << maxDCAr;
115 stringstream sMinDCAz, sMaxDCAz;
116 sMinDCAz << minDCAz; sMaxDCAz << maxDCAz;
118 stringstream sMinTPCclus, sMaxTPCclus;
119 sMinTPCclus << minTPCclus; sMaxTPCclus << maxTPCclus;
121 stringstream sMinITSclus, sMaxITSclus;
122 sMinITSclus << minITSclus; sMaxITSclus << maxITSclus;
124 stringstream sVS; sVS << vertexStatus;
126 TString trackName = "track_properties_";
127 trackName += "eta"+sMinEta.str()+"_"+sMaxEta.str()+"_";
128 trackName += "Pt"+sMinPt.str()+"_"+sMaxPt.str()+"_";
129 trackName += "TM"+sMinTM.str()+"_"+sMaxTM.str()+"_";
130 trackName += "DCAr"+sMinDCAr.str()+"_"+sMaxDCAr.str()+"_";
131 trackName += "DCAz"+sMinDCAz.str()+"_"+sMaxDCAz.str()+"_";
132 trackName += "TPCclus"+sMinTPCclus.str()+"_"+sMaxTPCclus.str()+"_";
133 trackName += "ITSclus"+sMinITSclus.str()+"_"+sMaxITSclus.str()+"_";
135 trackName.Chop(); trackName += ".root";
138 trackName += "VS"+sVS.str();
139 trackName += ".root";
141 can1->SaveAs(folder+"/"+trackName);
142 trackName.ReplaceAll("root","png");
143 can1->SaveAs(folder+"/"+trackName);
146 can2->SaveAs(folder+"/HLT_2D_track_correlations.root");
147 can3->SaveAs(folder+"/OFF_2D_track_correlations.root");
148 can2->SaveAs(folder+"/HLT_2D_track_correlations.png");
149 can3->SaveAs(folder+"/OFF_2D_track_correlations.png");
154 void printStats(TH1D *hlt, TH1D *off){
156 TPaveStats *st1 = (TPaveStats*)hlt->FindObject("stats");
157 st1->SetLineColor(0);
160 TPaveStats *st2 = (TPaveStats*)off->FindObject("stats");
161 st2->SetY2NDC(st1->GetY1NDC()-0.05);
162 st2->SetY1NDC(st2->GetY2NDC()-TMath::Abs(st1->GetY1NDC()-st1->GetY2NDC()));
163 st2->SetLineColor(0);
164 st2->SetTextColor(off->GetLineColor());
165 st2->SetFillStyle(0);
169 void defineYaxisMax(TH1D *hlt, TH1D *off){
170 if(hlt->GetMaximum() > off->GetMaximum()) off->SetMaximum(1.1*hlt->GetMaximum());
171 else hlt->SetMaximum(1.1*off->GetMaximum());
174 void printLegend(TLegend *l, TH1D *hlt, TH1D *off){
177 l->AddEntry(hlt, "HLT", "l");
178 l->AddEntry(off, "OFF", "l");
182 //====================== for 1D distributions ===============================//
184 void plotAid(TCanvas* can, THnSparse* hOFF, THnSparse* hHLT, TText* hText, TH1D *hlt, TH1D *off, TLegend *l, int size,
185 double minEta, double maxEta,
186 double minPt, double maxPt,
187 double minDCAr, double maxDCAr,
188 double minDCAz, double maxDCAz,
189 int minTPCclus, int maxTPCclus,
190 int minITSclus, int maxITSclus,
191 int minTrackMult, int maxTrackMult,
195 hHLT->GetAxis(0)->SetRangeUser(minPt,maxPt);
196 hHLT->GetAxis(1)->SetRangeUser(minTPCclus,maxTPCclus);
197 hHLT->GetAxis(3)->SetRangeUser(minEta, maxEta);
198 hHLT->GetAxis(5)->SetRangeUser(minDCAr, maxDCAr);
199 hHLT->GetAxis(6)->SetRangeUser(minDCAz, maxDCAz);
200 hHLT->GetAxis(10)->SetRangeUser(minITSclus, maxITSclus);
201 hHLT->GetAxis(11)->SetRangeUser(minTrackMult, maxTrackMult);
202 if(VS!=2) hHLT->GetAxis(12)->SetRangeUser(VS,VS);
204 hOFF->GetAxis(0)->SetRangeUser(minPt,maxPt);
205 hOFF->GetAxis(1)->SetRangeUser(minTPCclus,maxTPCclus);
206 hOFF->GetAxis(3)->SetRangeUser(minEta, maxEta);
207 hOFF->GetAxis(5)->SetRangeUser(minDCAr, maxDCAr);
208 hOFF->GetAxis(6)->SetRangeUser(minDCAz, maxDCAz);
209 hOFF->GetAxis(10)->SetRangeUser(minITSclus, maxITSclus);
210 hOFF->GetAxis(11)->SetRangeUser(minTrackMult, maxTrackMult);
211 if(VS!=2) hOFF->GetAxis(12)->SetRangeUser(VS,VS);
213 for(int i=0; i<size; i++){
215 hlt = hHLT->Projection(i);
216 off = hOFF->Projection(i);
218 hlt->SetTitle(fix1DTitle(hHLT->Projection(i)->GetTitle()));
220 TString s = hlt->GetTitle();
221 if(s.Contains("p_")){
225 else if(s.Contains("theta") || s.Contains("phi")){
229 else if(s.Contains("DCA")){
234 defineYaxisMax(hlt, off);
235 //off->SetLineColor(2);
236 off->SetLineStyle(2);
241 printStats(hlt, off);
243 printLegend(l,hlt,off);
246 //====================== for 2D distributions ===============================//
248 void plot2D(TCanvas* can, THnSparse* h,
249 double minEta, double maxEta,
250 double minPt, double maxPt,
251 double minDCAr, double maxDCAr,
252 double minDCAz, double maxDCAz,
253 int minTPCclus, int maxTPCclus,
254 int minITSclus, int maxITSclus,
255 int minTrackMult, int maxTrackMult
258 h->GetAxis(0)->SetRangeUser(minPt,maxPt);
259 h->GetAxis(1)->SetRangeUser(minTPCclus,maxTPCclus);
260 h->GetAxis(3)->SetRangeUser(minEta, maxEta);
261 h->GetAxis(5)->SetRangeUser(minDCAr, maxDCAr);
262 h->GetAxis(6)->SetRangeUser(minDCAz, maxDCAz);
263 h->GetAxis(10)->SetRangeUser(minITSclus, maxITSclus);
264 h->GetAxis(11)->SetRangeUser(minTrackMult, maxTrackMult);
267 TH2D *ht = h->Projection(1,0);
268 ht->SetTitle(fix2DTitle(h->Projection(1)->GetTitle(), h->Projection(0)->GetTitle()));
270 TString s = fix1DTitle(h->Projection(0)->GetTitle())+" (GeV/c)";
275 ht = h->Projection(1,3);
276 ht->SetTitle(fix2DTitle(h->Projection(1)->GetTitle(), h->Projection(3)->GetTitle()));
280 ht = h->Projection(1,5);
281 ht->SetTitle(fix2DTitle(h->Projection(1)->GetTitle(), h->Projection(5)->GetTitle()));
282 TString s = fix1DTitle(h->Projection(5)->GetTitle())+" (cm)";
287 ht = h->Projection(1,6);
288 ht->SetTitle(fix2DTitle(h->Projection(1)->GetTitle(), h->Projection(6)->GetTitle()));
289 TString s = fix1DTitle(h->Projection(6)->GetTitle())+" (cm)";
294 ht = h->Projection(6,0);
295 ht->SetTitle(fix2DTitle(h->Projection(6)->GetTitle(), h->Projection(0)->GetTitle()));
296 TString s = fix1DTitle(h->Projection(0)->GetTitle())+" (GeV/c)";
298 TString s = fix1DTitle(h->Projection(6)->GetTitle())+" (cm)";
303 ht = h->Projection(6,3);
304 ht->SetTitle(fix2DTitle(h->Projection(6)->GetTitle(), h->Projection(3)->GetTitle()));
305 TString s = fix1DTitle(h->Projection(6)->GetTitle())+" (cm)";
310 ht = h->Projection(3,0);
311 ht->SetTitle(fix2DTitle(h->Projection(3)->GetTitle(), h->Projection(0)->GetTitle()));
312 TString s = fix1DTitle(h->Projection(0)->GetTitle())+" (GeV/c)";
317 ht = h->Projection(3,4);
318 ht->SetTitle(fix2DTitle(h->Projection(3)->GetTitle(), h->Projection(4)->GetTitle()));
319 TString s = fix1DTitle(h->Projection(4)->GetTitle())+" (rad)";
324 void plotAid(TCanvas* can, THnSparse* hOFF, THnSparse* hHLT, TText* hText, TH1D *hlt, TH1D *off, TLegend *l, int size){
326 for(int i=0; i<size; i++){
327 hlt = hHLT->Projection(i);
328 off = hOFF->Projection(i);
329 hlt->SetTitle(fix1DTitle(hHLT->Projection(i)->GetTitle()));
330 TString s = hlt->GetTitle();
331 if(s.Contains("primary")){
336 defineYaxisMax(hlt, off);
337 off->SetLineColor(2);
342 printStats(hlt, off);
344 printLegend(l,hlt,off);
347 void plotEventQuantities(TCanvas* can, THnSparse* heventOFF, THnSparse* heventHLT, TText* hText){
352 TLegend *leg1 = new TLegend(0.6,0.6,0.8,0.8);
354 plotAid(can, heventOFF, heventHLT, hText, hlt, off, leg1, 6);
358 void plotTrackQuantities( TCanvas* can, THnSparse* htrackOFF, THnSparse* htrackHLT, TText* hText,
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,
372 TLegend *leg1 = new TLegend(0.6,0.6,0.8,0.8);
373 plotAid(can, htrackOFF, htrackHLT, hText, hlt, off, leg1, 11,
374 minEta, maxEta, minPt, maxPt, minDCAr, maxDCAr, minDCAz, maxDCAz, minTPCclus, maxTPCclus, minITSclus, maxITSclus, minTrackMult, maxTrackMult, VS);
378 TString fix1DTitle(const char* c){
380 tmp.ReplaceAll("projection ","");
384 TString fix2DTitle(const char* c1, const char* c2){
385 TString tmp = fix1DTitle(c1)+" vs."+fix1DTitle(c2);