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