]> git.uio.no Git - u/mrichter/AliRoot.git/blob - HLT/QA/tasks/macros/drawTHnSparse.C
- macro to overlay plots produced by HLT/QA/tasks/macros/drawTHnSparse.C
[u/mrichter/AliRoot.git] / HLT / QA / tasks / macros / drawTHnSparse.C
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=0,   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       off->SetLineStyle(2);
214      
215       can->cd(i+1);
216       hlt->Draw();
217       off->Draw("sames");
218       printStats(hlt, off);
219    } 
220    printLegend(l,hlt,off);  
221 }
222
223 //====================== for 2D distributions ===============================//
224
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
233            )
234 {
235
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);
243   
244   can->cd(1);
245   h->Projection(1,0)->Draw("colz");           
246   can->cd(2);
247   h->Projection(1,3)->Draw("colz");        
248   can->cd(3);
249   h->Projection(1,5)->Draw("colz"); 
250   can->cd(4);
251   h->Projection(1,6)->Draw("colz"); 
252   
253   can->cd(5);
254   h->Projection(6,0)->Draw("colz");           
255   can->cd(6);
256   h->Projection(6,3)->Draw("colz");        
257   can->cd(7);
258   h->Projection(3,0)->Draw("colz"); 
259   can->cd(8);
260   h->Projection(3,4)->Draw("colz"); 
261  
262 }
263
264 void plotAid(TCanvas* can, THnSparse* hOFF, THnSparse* hHLT, TText* hText, TH1D *hlt, TH1D *off, TLegend *l, int size){
265  
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);
272      
273       can->cd(i+1);
274       hlt->Draw();
275       off->Draw("sames");
276       printStats(hlt, off);
277    } 
278    printLegend(l,hlt,off);  
279 }
280
281 void plotEventQuantities(TCanvas* can, THnSparse* heventOFF, THnSparse* heventHLT, TText* hText){
282
283   TH1D *hlt = NULL;
284   TH1D *off = NULL;
285  
286   TLegend *leg1 = new TLegend(0.6,0.6,0.8,0.8);
287  
288   plotAid(can, heventOFF, heventHLT, hText, hlt, off, leg1, 6);  
289   return;
290 }
291
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,
300                           int VS
301                         )
302 {
303   TH1D *hlt = NULL;
304   TH1D *off = NULL;
305  
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);  
309 return;
310 }