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 defineYaxisMax(hlt, off);
221 //off->SetLineColor(2);
222 off->SetLineStyle(2);
227 printStats(hlt, off);
229 printLegend(l,hlt,off);
232 //====================== for 2D distributions ===============================//
234 void plot2D(TCanvas* can, THnSparse* h,
235 double minEta, double maxEta,
236 double minPt, double maxPt,
237 double minDCAr, double maxDCAr,
238 double minDCAz, double maxDCAz,
239 int minTPCclus, int maxTPCclus,
240 int minITSclus, int maxITSclus,
241 int minTrackMult, int maxTrackMult
244 h->GetAxis(0)->SetRangeUser(minPt,maxPt);
245 h->GetAxis(1)->SetRangeUser(minTPCclus,maxTPCclus);
246 h->GetAxis(3)->SetRangeUser(minEta, maxEta);
247 h->GetAxis(5)->SetRangeUser(minDCAr, maxDCAr);
248 h->GetAxis(6)->SetRangeUser(minDCAz, maxDCAz);
249 h->GetAxis(10)->SetRangeUser(minITSclus, maxITSclus);
250 h->GetAxis(11)->SetRangeUser(minTrackMult, maxTrackMult);
253 TH2D *ht = h->Projection(1,0);
254 ht->SetTitle(fix2DTitle(h->Projection(1)->GetTitle(), h->Projection(0)->GetTitle()));
258 ht = h->Projection(1,3);
259 ht->SetTitle(fix2DTitle(h->Projection(1)->GetTitle(), h->Projection(3)->GetTitle()));
263 ht = h->Projection(1,5);
264 ht->SetTitle(fix2DTitle(h->Projection(1)->GetTitle(), h->Projection(5)->GetTitle()));
268 ht = h->Projection(1,6);
269 ht->SetTitle(fix2DTitle(h->Projection(1)->GetTitle(), h->Projection(6)->GetTitle()));
273 ht = h->Projection(6,0);
274 ht->SetTitle(fix2DTitle(h->Projection(6)->GetTitle(), h->Projection(0)->GetTitle()));
278 ht = h->Projection(6,3);
279 ht->SetTitle(fix2DTitle(h->Projection(6)->GetTitle(), h->Projection(3)->GetTitle()));
283 ht = h->Projection(3,0);
284 ht->SetTitle(fix2DTitle(h->Projection(3)->GetTitle(), h->Projection(0)->GetTitle()));
288 ht = h->Projection(3,4);
289 ht->SetTitle(fix2DTitle(h->Projection(3)->GetTitle(), h->Projection(4)->GetTitle()));
293 void plotAid(TCanvas* can, THnSparse* hOFF, THnSparse* hHLT, TText* hText, TH1D *hlt, TH1D *off, TLegend *l, int size){
295 for(int i=0; i<size; i++){
296 hlt = hHLT->Projection(i);
297 off = hOFF->Projection(i);
298 hlt->SetTitle(fix1DTitle(hHLT->Projection(i)->GetTitle()));
299 defineYaxisMax(hlt, off);
300 off->SetLineColor(2);
305 printStats(hlt, off);
307 printLegend(l,hlt,off);
310 void plotEventQuantities(TCanvas* can, THnSparse* heventOFF, THnSparse* heventHLT, TText* hText){
315 TLegend *leg1 = new TLegend(0.6,0.6,0.8,0.8);
317 plotAid(can, heventOFF, heventHLT, hText, hlt, off, leg1, 6);
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,
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);
341 TString fix1DTitle(const char* c){
343 tmp.ReplaceAll("projection ","");
347 TString fix2DTitle(const char* c1, const char* c2){
348 TString tmp = fix1DTitle(c1)+" vs."+fix1DTitle(c2);