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 TH1::AddDirectory(kFALSE);
37 TFile *file = TFile::Open(inputFile);
39 printf("Error: No file %s in folder.\n", inputFile);
43 TList *list = static_cast<TList*>(file->Get("esd_thnsparse"));
45 printf("Error: No List contained in file %s.\n", inputFile);
49 THnSparseF *heventHLT = (THnSparse*)list->FindObject("fEventHLT");
51 printf("Error: There is no HLT THnSparse object in file %s\n", inputFile);
53 THnSparseF *heventOFF = (THnSparse*)list->FindObject("fEventOFF");
55 printf("Error: There is no OFF THnSparse object in file %s\n", inputFile);
57 THnSparseF *htrackHLT = (THnSparse*)list->FindObject("fTrackHLT");
59 printf("Error: No HLT THnSparse object found\n");
62 THnSparseF *htrackOFF = (THnSparse*)list->FindObject("fTrackOFF");
64 printf("Error: No OFF THnSparse object found\n");
69 TText *hText = list->FindObject("text");
70 if(!hText) printf("No hText\n");
72 TString t = "event properties for ";
75 TCanvas *can0 = new TCanvas("can0",t,900,600);
77 plotEventQuantities(can0,heventOFF,heventHLT,hText);
79 TCanvas *can1 = new TCanvas("can1","track properties",1100,900);
81 plotTrackQuantities(can1, htrackOFF, htrackHLT, hText,
82 minEta, maxEta, minPt, maxPt, minDCAr, maxDCAr, minDCAz, maxDCAz, minTPCclus, maxTPCclus, minITSclus, maxITSclus, minTrackMult, maxTrackMult, vertexStatus);
84 TCanvas *can2 = new TCanvas("can2","2-D HLT track correlations",1200,800);
86 plot2D(can2, htrackHLT, minEta, maxEta, minPt, maxPt, minDCAr, maxDCAr, minDCAz, maxDCAz, minTPCclus, maxTPCclus, minITSclus, maxITSclus, minTrackMult, maxTrackMult);
88 TCanvas *can3 = new TCanvas("can3","2-D OFF track correlations",1200,800);
90 plot2D(can3, htrackOFF, minEta, maxEta, minPt, maxPt, minDCAr, maxDCAr, minDCAz, maxDCAz, minTPCclus, maxTPCclus, minITSclus, maxITSclus, minTrackMult, maxTrackMult);
92 TString folder = hText->GetTitle();
93 folder.ReplaceAll(" ","");
97 gSystem->Exec("mkdir "+folder);
98 can0->SaveAs(folder+"/event_properties.root");
101 stringstream sMinEta, sMaxEta;
102 sMinEta << minEta; sMaxEta << maxEta;
104 stringstream sMinTM, sMaxTM;
105 sMinTM << minTrackMult; sMaxTM << maxTrackMult;
107 stringstream sMinPt, sMaxPt;
108 sMinPt << minPt; sMaxPt << maxPt;
110 stringstream sMinDCAr, sMaxDCAr;
111 sMinDCAr << minDCAr; sMaxDCAr << maxDCAr;
113 stringstream sMinDCAz, sMaxDCAz;
114 sMinDCAz << minDCAz; sMaxDCAz << maxDCAz;
116 stringstream sMinTPCclus, sMaxTPCclus;
117 sMinTPCclus << minTPCclus; sMaxTPCclus << maxTPCclus;
119 stringstream sMinITSclus, sMaxITSclus;
120 sMinITSclus << minITSclus; sMaxITSclus << maxITSclus;
122 stringstream sVS; sVS << vertexStatus;
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()+"_";
133 trackName.Chop(); trackName += ".root";
136 trackName += "VS"+sVS.str();
137 trackName += ".root";
139 can1->SaveAs(folder+"/"+trackName);
141 can2->SaveAs(folder+"/HLT_2D_track_correlations.root");
142 can3->SaveAs(folder+"/OFF_2D_track_correlations.root");
147 void printStats(TH1D *hlt, TH1D *off){
149 TPaveStats *st1 = (TPaveStats*)hlt->FindObject("stats");
150 st1->SetLineColor(0);
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);
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());
167 void printLegend(TLegend *l, TH1D *hlt, TH1D *off){
170 l->AddEntry(hlt, "HLT", "l");
171 l->AddEntry(off, "OFF", "l");
175 //====================== for 1D distributions ===============================//
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,
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);
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);
206 for(int i=0; i<size; i++){
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 off->SetLineStyle(2);
218 printStats(hlt, off);
220 printLegend(l,hlt,off);
223 //====================== for 2D distributions ===============================//
225 void 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
236 h->GetAxis(0)->SetRangeUser(minPt,maxPt);
237 h->GetAxis(1)->SetRangeUser(minTPCclus,maxTPCclus);
238 h->GetAxis(3)->SetRangeUser(minEta, maxEta);
239 h->GetAxis(5)->SetRangeUser(minDCAr, maxDCAr);
240 h->GetAxis(6)->SetRangeUser(minDCAz, maxDCAz);
241 h->GetAxis(10)->SetRangeUser(minITSclus, maxITSclus);
242 h->GetAxis(11)->SetRangeUser(minTrackMult, maxTrackMult);
245 h->Projection(1,0)->Draw("colz");
247 h->Projection(1,3)->Draw("colz");
249 h->Projection(1,5)->Draw("colz");
251 h->Projection(1,6)->Draw("colz");
254 h->Projection(6,0)->Draw("colz");
256 h->Projection(6,3)->Draw("colz");
258 h->Projection(3,0)->Draw("colz");
260 h->Projection(3,4)->Draw("colz");
264 void plotAid(TCanvas* can, THnSparse* hOFF, THnSparse* hHLT, TText* hText, TH1D *hlt, TH1D *off, TLegend *l, int size){
266 for(int i=0; i<size; i++){
267 hlt = hHLT->Projection(i);
268 off = hOFF->Projection(i);
269 hlt->SetTitle(hHLT->Projection(i)->GetTitle());
270 defineYaxisMax(hlt, off);
271 off->SetLineColor(2);
276 printStats(hlt, off);
278 printLegend(l,hlt,off);
281 void plotEventQuantities(TCanvas* can, THnSparse* heventOFF, THnSparse* heventHLT, TText* hText){
286 TLegend *leg1 = new TLegend(0.6,0.6,0.8,0.8);
288 plotAid(can, heventOFF, heventHLT, hText, hlt, off, leg1, 6);
292 void plotTrackQuantities( TCanvas* can, THnSparse* htrackOFF, THnSparse* htrackHLT, TText* hText,
293 double minEta, double maxEta,
294 double minPt, double maxPt,
295 double minDCAr, double maxDCAr,
296 double minDCAz, double maxDCAz,
297 int minTPCclus, int maxTPCclus,
298 int minITSclus, int maxITSclus,
299 int minTrackMult, int maxTrackMult,
306 TLegend *leg1 = new TLegend(0.6,0.6,0.8,0.8);
307 plotAid(can, htrackOFF, htrackHLT, hText, hlt, off, leg1, 11,
308 minEta, maxEta, minPt, maxPt, minDCAr, maxDCAr, minDCAz, maxDCAz, minTPCclus, maxTPCclus, minITSclus, maxITSclus, minTrackMult, maxTrackMult, VS);