f625b71bb4b1e6904741c18097e4a13e97bad814
[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   //gROOT->ForceStyle();
36   TH1::AddDirectory(kFALSE);
37
38   TFile *file = TFile::Open(inputFile);
39   if(!file){
40     printf("Error: No file %s in folder.\n", inputFile);
41     return;
42   }
43
44   TList *list = static_cast<TList*>(file->Get("esd_thnsparse"));
45   if(!list){
46     printf("Error: No List contained in file %s.\n", inputFile);
47     return;
48   }
49
50   THnSparseF *heventHLT = (THnSparse*)list->FindObject("fEventHLT"); 
51   if(!heventHLT){
52       printf("Error: There is no HLT THnSparse object in file %s\n", inputFile);
53   }
54   THnSparseF *heventOFF = (THnSparse*)list->FindObject("fEventOFF");  
55   if(!heventOFF){
56       printf("Error: There is no OFF THnSparse object in file %s\n", inputFile);
57   } 
58   THnSparseF *htrackHLT = (THnSparse*)list->FindObject("fTrackHLT");
59   if(!htrackHLT){
60       printf("Error: No HLT THnSparse object found\n");
61       return;
62   } 
63   THnSparseF *htrackOFF = (THnSparse*)list->FindObject("fTrackOFF");  
64   if(!htrackOFF){
65       printf("Error: No OFF THnSparse object found\n");
66       return;
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   TString cuts = cutsToString(minEta, maxEta, minPt, maxPt, minDCAr, maxDCAr, minDCAz, maxDCAz, minTPCclus, maxTPCclus, minITSclus, maxITSclus, minTrackMult, maxTrackMult, vertexStatus);
99
100   can0->SaveAs(folder+"/event_properties_"+cuts+".root");
101   can0->SaveAs(folder+"/event_properties_"+cuts+".png");
102   can1->SaveAs(folder+"/track_properties_"+cuts+".root");
103   can1->SaveAs(folder+"/track_properties_"+cuts+".png");  
104   can2->SaveAs(folder+"/HLT_2D_track_correlations_"+cuts+".root");
105   can2->SaveAs(folder+"/HLT_2D_track_correlations_"+cuts+".png");
106   can3->SaveAs(folder+"/OFF_2D_track_correlations_"+cuts+".root");
107   can3->SaveAs(folder+"/OFF_2D_track_correlations_"+cuts+".png");
108   
109   return;
110 }
111
112 void printStats(TH1D *hlt, TH1D *off){  
113   gPad->Update();
114   TPaveStats *st1 = (TPaveStats*)hlt->FindObject("stats");
115   st1->SetLineColor(0);
116
117   gPad->Update();
118   TPaveStats *st2 = (TPaveStats*)off->FindObject("stats");
119   st2->SetY2NDC(st1->GetY1NDC()-0.05);
120   st2->SetY1NDC(st2->GetY2NDC()-TMath::Abs(st1->GetY1NDC()-st1->GetY2NDC()));
121   st2->SetLineColor(0);
122   st2->SetTextColor(off->GetLineColor());
123   st2->SetFillStyle(0);
124   st2->Draw();
125 }
126
127 void defineYaxisMax(TH1D *hlt, TH1D *off){ 
128   if(hlt->GetMaximum() > off->GetMaximum()) off->SetMaximum(1.1*hlt->GetMaximum());
129   else hlt->SetMaximum(1.1*off->GetMaximum());
130 }
131
132 void printLegend(TLegend *l, TH1D *hlt, TH1D *off){  
133   l->SetFillColor(10); 
134   l->SetLineColor(10);
135   l->AddEntry(hlt, "HLT", "l");
136   l->AddEntry(off, "OFF", "l");
137   l->Draw("same");
138 }
139
140 //====================== for 1D distributions ===============================//
141
142 void plotAid(TCanvas* can, THnSparse* hOFF, THnSparse* hHLT, TText* hText, TH1D *hlt, TH1D *off, TLegend *l, int size,
143              double minEta,    double maxEta,
144              double minPt,     double maxPt,
145              double minDCAr,   double maxDCAr,
146              double minDCAz,   double maxDCAz,
147              int minTPCclus,   int maxTPCclus,
148              int minITSclus,   int maxITSclus, 
149              int minTrackMult, int maxTrackMult,
150              int VS
151            )
152 {     
153    hHLT->GetAxis(0)->SetRangeUser(minPt,maxPt);
154    hHLT->GetAxis(1)->SetRangeUser(minTPCclus,maxTPCclus);
155    hHLT->GetAxis(3)->SetRangeUser(minEta, maxEta);
156    hHLT->GetAxis(5)->SetRangeUser(minDCAr, maxDCAr);
157    hHLT->GetAxis(6)->SetRangeUser(minDCAz, maxDCAz);
158    hHLT->GetAxis(10)->SetRangeUser(minITSclus, maxITSclus);
159    hHLT->GetAxis(11)->SetRangeUser(minTrackMult, maxTrackMult);
160    if(VS!=2) hHLT->GetAxis(12)->SetRangeUser(VS,VS);
161    
162    hOFF->GetAxis(0)->SetRangeUser(minPt,maxPt);
163    hOFF->GetAxis(1)->SetRangeUser(minTPCclus,maxTPCclus);
164    hOFF->GetAxis(3)->SetRangeUser(minEta, maxEta);
165    hOFF->GetAxis(5)->SetRangeUser(minDCAr, maxDCAr);
166    hOFF->GetAxis(6)->SetRangeUser(minDCAz, maxDCAz);
167    hOFF->GetAxis(10)->SetRangeUser(minITSclus, maxITSclus);
168    hOFF->GetAxis(11)->SetRangeUser(minTrackMult, maxTrackMult);
169    if(VS!=2) hOFF->GetAxis(12)->SetRangeUser(VS,VS);
170   
171    for(int i=0; i<size; i++){
172   
173       hlt = hHLT->Projection(i);
174       off = hOFF->Projection(i); 
175       
176       hlt->SetTitle(fix1DTitle(hHLT->Projection(i)->GetTitle())); 
177    
178       TString s = hlt->GetTitle();      
179       if(s.Contains("p_")){ 
180          s+=" (GeV/c)";
181          hlt->SetXTitle(s);     
182       }
183       else if(s.Contains("theta") || s.Contains("phi")){
184          s+=" (rad)"; 
185          hlt->SetXTitle(s);
186       }
187       else if(s.Contains("DCA")){
188          s+=" (cm)";
189          hlt->SetXTitle(s);
190       }
191         
192       defineYaxisMax(hlt, off);
193       //off->SetLineColor(2);
194       off->SetLineStyle(2);
195      
196       can->cd(i+1);
197       hlt->Draw();
198       off->Draw("sames");
199       printStats(hlt, off);
200       
201       if(i==0){
202          printLegend(l,hlt,off);
203          TPaveText *pave = new TPaveText(50,500,140,2100);
204          pave->SetFillColor(kWhite);
205          pave->SetLineColor(kWhite);
206          pave->SetShadowColor(kWhite);
207          //TText *t1 = 
208          pave->AddText(itoa(minEta)+" < #eta < "+itoa(maxEta));
209          pave->AddText(itoa(minPt)+" < p_{T} (GeV/c) < "+itoa(maxPt));
210          pave->AddText(itoa(minTrackMult)+" < track mult < "+itoa(maxTrackMult));
211          pave->AddText(itoa(minDCAr)+" < DCAr (cm) < "+itoa(maxDCAr));
212          pave->AddText(itoa(minDCAz)+" < DCAz (cm) < "+itoa(maxDCAz));
213          pave->AddText(itoa(minTPCclus)+" < TPC clusters/track < "+itoa(maxTPCclus));
214          pave->AddText(itoa(minITSclus)+" < ITS clusters/track < "+itoa(maxITSclus));  
215          if(VS!=2) pave->AddText("vertex status: "+itoa(VS));
216          
217          pave->Draw();
218          can->Update();
219       }
220    } 
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   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   TH2D *ht = h->Projection(1,0);
245   ht->SetTitle(fix2DTitle(h->Projection(1)->GetTitle(), h->Projection(0)->GetTitle()));
246
247   TString s = fix1DTitle(h->Projection(0)->GetTitle())+" (GeV/c)";
248   ht->SetXTitle(s);
249   ht->Draw("colz");
250   
251   can->cd(2);
252   ht = h->Projection(1,3);
253   ht->SetTitle(fix2DTitle(h->Projection(1)->GetTitle(), h->Projection(3)->GetTitle()));
254   ht->Draw("colz");
255   
256   can->cd(3);
257   ht = h->Projection(1,5);
258   ht->SetTitle(fix2DTitle(h->Projection(1)->GetTitle(), h->Projection(5)->GetTitle()));
259   TString s = fix1DTitle(h->Projection(5)->GetTitle())+" (cm)";
260   ht->SetXTitle(s);
261   ht->Draw("colz");
262   
263   can->cd(4);
264   ht = h->Projection(1,6);
265   ht->SetTitle(fix2DTitle(h->Projection(1)->GetTitle(), h->Projection(6)->GetTitle()));
266   TString s = fix1DTitle(h->Projection(6)->GetTitle())+" (cm)";
267   ht->SetXTitle(s);
268   ht->Draw("colz");
269   
270   can->cd(5);
271   ht = h->Projection(6,0);
272   ht->SetTitle(fix2DTitle(h->Projection(6)->GetTitle(), h->Projection(0)->GetTitle()));
273   TString s = fix1DTitle(h->Projection(0)->GetTitle())+" (GeV/c)";
274   ht->SetXTitle(s);
275   TString s = fix1DTitle(h->Projection(6)->GetTitle())+" (cm)";
276   ht->SetYTitle(s);
277   ht->Draw("colz");
278   
279   can->cd(6);
280   ht = h->Projection(6,3);
281   ht->SetTitle(fix2DTitle(h->Projection(6)->GetTitle(), h->Projection(3)->GetTitle()));
282   TString s = fix1DTitle(h->Projection(6)->GetTitle())+" (cm)";
283   ht->SetYTitle(s);
284   ht->Draw("colz");
285   
286   can->cd(7);
287   ht = h->Projection(3,0);
288   ht->SetTitle(fix2DTitle(h->Projection(3)->GetTitle(), h->Projection(0)->GetTitle()));
289   TString s = fix1DTitle(h->Projection(0)->GetTitle())+" (GeV/c)";
290   ht->SetXTitle(s);
291   ht->Draw("colz");
292   
293   can->cd(8);
294   ht = h->Projection(3,4);
295   ht->SetTitle(fix2DTitle(h->Projection(3)->GetTitle(), h->Projection(4)->GetTitle()));
296   TString s = fix1DTitle(h->Projection(4)->GetTitle())+" (rad)";
297   ht->SetXTitle(s);
298   ht->Draw("colz"); 
299 }
300
301 void plotAid(TCanvas* can, THnSparse* hOFF, THnSparse* hHLT, TText* hText, TH1D *hlt, TH1D *off, TLegend *l, int size){
302  
303   for(int i=0; i<size; i++){         
304       hlt = hHLT->Projection(i);
305       off = hOFF->Projection(i); 
306       hlt->SetTitle(fix1DTitle(hHLT->Projection(i)->GetTitle()));      
307       TString s = hlt->GetTitle();      
308       if(s.Contains("primary")){ 
309          s+=" (cm)";
310          hlt->SetXTitle(s);     
311       }
312      
313       defineYaxisMax(hlt, off);
314       off->SetLineColor(2);
315      
316       can->cd(i+1);
317       hlt->Draw();
318       off->Draw("sames");
319       printStats(hlt, off);
320       
321       if(i==0) printLegend(l,hlt,off);
322    } 
323 }
324
325 void plotEventQuantities(TCanvas* can, THnSparse* heventOFF, THnSparse* heventHLT, TText* hText){
326
327   TH1D *hlt = NULL;
328   TH1D *off = NULL;
329  
330   TLegend *leg1 = new TLegend(0.6,0.6,0.8,0.8);
331  
332   plotAid(can, heventOFF, heventHLT, hText, hlt, off, leg1, 6);  
333   return;
334 }
335
336 void plotTrackQuantities( TCanvas* can, THnSparse* htrackOFF, THnSparse* htrackHLT, TText* hText,
337                           double minEta,    double maxEta,
338                           double minPt,     double maxPt,
339                           double minDCAr,   double maxDCAr,
340                           double minDCAz,   double maxDCAz,
341                           int minTPCclus,   int maxTPCclus,
342                           int minITSclus,   int maxITSclus, 
343                           int minTrackMult, int maxTrackMult,
344                           int VS
345                         )
346 {
347   TH1D *hlt = NULL;
348   TH1D *off = NULL;
349  
350   TLegend *leg1 = new TLegend(0.6,0.6,0.8,0.8);
351   plotAid(can, htrackOFF, htrackHLT, hText, hlt, off, leg1, 11, 
352           minEta, maxEta, minPt, maxPt, minDCAr, maxDCAr, minDCAz, maxDCAz, minTPCclus, maxTPCclus, minITSclus, maxITSclus, minTrackMult, maxTrackMult, VS);  
353   return;
354 }
355
356 TString fix1DTitle(const char* c){
357   TString tmp = c;
358   tmp.ReplaceAll("projection ","");
359   return tmp;   
360 }
361
362 TString fix2DTitle(const char* c1, const char* c2){
363   TString tmp = fix1DTitle(c1)+" vs."+fix1DTitle(c2);
364   return tmp;
365 }
366
367 TString cutsToString( double minEta,    double maxEta,
368                       double minPt,     double maxPt,
369                       double minDCAr,   double maxDCAr,
370                       double minDCAz,   double maxDCAz,
371                       int minTPCclus,   int maxTPCclus,
372                       int minITSclus,   int maxITSclus, 
373                       int minTrackMult, int maxTrackMult,
374                       int VS
375                     )
376 {
377   TString cuts = "";
378   cuts += "eta"+itoa(minEta)+"_"+itoa(maxEta)+"_";
379   cuts += "Pt"+itoa(minPt)+"_"+itoa(maxPt)+"_";
380   cuts += "TM"+itoa(minTrackMult)+"_"+itoa(maxTrackMult)+"_";
381   cuts += "DCAr"+itoa(minDCAr)+"_"+itoa(maxDCAr)+"_";
382   cuts += "DCAz"+itoa(minDCAz)+"_"+itoa(maxDCAz)+"_";
383   cuts += "TPCclus"+itoa(minTPCclus)+"_"+itoa(maxTPCclus)+"_";
384   cuts += "ITSclus"+itoa(minITSclus)+"_"+itoa(maxITSclus)+"_";
385   
386   if(VS==2) cuts.Chop(); 
387   else cuts += "VS"+itoa(VS); 
388   return cuts;
389 }
390
391 TString itoa(int i){
392   stringstream si;
393   si << i;
394   return si.str();
395 }
396
397 TString itoa(double i){
398   stringstream si;
399   si << i;
400   return si.str();
401 }