- fix names and units of axes
[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   
70   TText *hText = list->FindObject("text");
71   if(!hText) printf("No hText\n");
72   
73   TString t = "event properties for ";
74   t+=hText->GetTitle();
75    
76   TCanvas *can0 = new TCanvas("can0",t,900,600); 
77   can0->Divide(3,2);
78   plotEventQuantities(can0,heventOFF,heventHLT,hText);
79    
80   TCanvas *can1 = new TCanvas("can1","track properties",1100,900); 
81   can1->Divide(4,3);
82   plotTrackQuantities(can1, htrackOFF, htrackHLT, hText, 
83                       minEta, maxEta, minPt, maxPt, minDCAr, maxDCAr, minDCAz, maxDCAz, minTPCclus, maxTPCclus, minITSclus, maxITSclus, minTrackMult, maxTrackMult, vertexStatus);
84   
85   TCanvas *can2 = new TCanvas("can2","2-D HLT track correlations",1200,800); 
86   can2->Divide(4,2);
87   plot2D(can2, htrackHLT, minEta, maxEta, minPt, maxPt, minDCAr, maxDCAr, minDCAz, maxDCAz, minTPCclus, maxTPCclus, minITSclus, maxITSclus, minTrackMult, maxTrackMult);
88   
89   TCanvas *can3 = new TCanvas("can3","2-D OFF track correlations",1200,800); 
90   can3->Divide(4,2);
91   plot2D(can3, htrackOFF, minEta, maxEta, minPt, maxPt, minDCAr, maxDCAr, minDCAz, maxDCAz, minTPCclus, maxTPCclus, minITSclus, maxITSclus, minTrackMult, maxTrackMult);
92   
93   TString folder = hText->GetTitle();
94   folder.ReplaceAll(" ",""); 
95   folder.Remove(0,3);
96   folder.Remove(6,15);
97    
98   gSystem->Exec("mkdir "+folder);
99   can0->SaveAs(folder+"/event_properties.root");
100   can0->SaveAs(folder+"/event_properties.png");
101   
102  
103   stringstream sMinEta, sMaxEta;
104   sMinEta << minEta; sMaxEta << maxEta;
105  
106   stringstream sMinTM, sMaxTM;
107   sMinTM << minTrackMult; sMaxTM << maxTrackMult;
108  
109   stringstream sMinPt, sMaxPt;
110   sMinPt << minPt; sMaxPt << maxPt;
111  
112   stringstream sMinDCAr, sMaxDCAr;
113   sMinDCAr << minDCAr; sMaxDCAr << maxDCAr;
114
115   stringstream sMinDCAz, sMaxDCAz;
116   sMinDCAz << minDCAz; sMaxDCAz << maxDCAz;
117
118   stringstream sMinTPCclus, sMaxTPCclus;
119   sMinTPCclus << minTPCclus; sMaxTPCclus << maxTPCclus;
120  
121   stringstream sMinITSclus, sMaxITSclus;
122   sMinITSclus << minITSclus; sMaxITSclus << maxITSclus;
123   
124   stringstream sVS; sVS << vertexStatus;
125   
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()+"_";
134   if(vertexStatus==2){
135      trackName.Chop(); trackName += ".root";
136   }
137   else { 
138      trackName += "VS"+sVS.str();   
139      trackName += ".root";
140   }
141   can1->SaveAs(folder+"/"+trackName);
142   trackName.ReplaceAll("root","png");
143   can1->SaveAs(folder+"/"+trackName);
144   
145   
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");
150
151   return;
152 }
153
154 void printStats(TH1D *hlt, TH1D *off){  
155   gPad->Update();
156   TPaveStats *st1 = (TPaveStats*)hlt->FindObject("stats");
157   st1->SetLineColor(0);
158
159   gPad->Update();
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);
166   st2->Draw();
167 }
168
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());
172 }
173
174 void printLegend(TLegend *l, TH1D *hlt, TH1D *off){  
175   l->SetFillColor(10); 
176   l->SetLineColor(10);
177   l->AddEntry(hlt, "HLT", "l");
178   l->AddEntry(off, "OFF", "l");
179   l->Draw("same");
180 }
181
182 //====================== for 1D distributions ===============================//
183
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,
192              int VS
193            )
194 {     
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);
203    
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);
212   
213    for(int i=0; i<size; i++){
214   
215       hlt = hHLT->Projection(i);
216       off = hOFF->Projection(i); 
217       
218       hlt->SetTitle(fix1DTitle(hHLT->Projection(i)->GetTitle())); 
219    
220       TString s = hlt->GetTitle();      
221       if(s.Contains("p_")){ 
222          s+=" (GeV/c)";
223          hlt->SetXTitle(s);     
224       }
225       else if(s.Contains("theta") || s.Contains("phi")){
226          s+=" (rad)"; 
227          hlt->SetXTitle(s);
228       }
229       else if(s.Contains("DCA")){
230          s+=" (cm)";
231          hlt->SetXTitle(s);
232       }
233         
234       defineYaxisMax(hlt, off);
235       //off->SetLineColor(2);
236       off->SetLineStyle(2);
237      
238       can->cd(i+1);
239       hlt->Draw();
240       off->Draw("sames");
241       printStats(hlt, off);
242    } 
243    printLegend(l,hlt,off);  
244 }
245
246 //====================== for 2D distributions ===============================//
247
248 void plot2D(TCanvas* can, THnSparse* h,
249             double minEta,    double maxEta,
250             double minPt,     double maxPt,
251             double minDCAr,   double maxDCAr,
252             double minDCAz,   double maxDCAz,
253             int minTPCclus,   int maxTPCclus,
254             int minITSclus,   int maxITSclus, 
255             int minTrackMult, int maxTrackMult
256            )
257 {
258   h->GetAxis(0)->SetRangeUser(minPt,maxPt);
259   h->GetAxis(1)->SetRangeUser(minTPCclus,maxTPCclus);
260   h->GetAxis(3)->SetRangeUser(minEta, maxEta);
261   h->GetAxis(5)->SetRangeUser(minDCAr, maxDCAr);
262   h->GetAxis(6)->SetRangeUser(minDCAz, maxDCAz);
263   h->GetAxis(10)->SetRangeUser(minITSclus, maxITSclus);
264   h->GetAxis(11)->SetRangeUser(minTrackMult, maxTrackMult);
265   
266   can->cd(1);    
267   TH2D *ht = h->Projection(1,0);
268   ht->SetTitle(fix2DTitle(h->Projection(1)->GetTitle(), h->Projection(0)->GetTitle()));
269
270   TString s = fix1DTitle(h->Projection(0)->GetTitle())+" (GeV/c)";
271   ht->SetXTitle(s);
272   ht->Draw("colz");
273   
274   can->cd(2);
275   ht = h->Projection(1,3);
276   ht->SetTitle(fix2DTitle(h->Projection(1)->GetTitle(), h->Projection(3)->GetTitle()));
277   ht->Draw("colz");
278   
279   can->cd(3);
280   ht = h->Projection(1,5);
281   ht->SetTitle(fix2DTitle(h->Projection(1)->GetTitle(), h->Projection(5)->GetTitle()));
282   TString s = fix1DTitle(h->Projection(5)->GetTitle())+" (cm)";
283   ht->SetXTitle(s);
284   ht->Draw("colz");
285   
286   can->cd(4);
287   ht = h->Projection(1,6);
288   ht->SetTitle(fix2DTitle(h->Projection(1)->GetTitle(), h->Projection(6)->GetTitle()));
289   TString s = fix1DTitle(h->Projection(6)->GetTitle())+" (cm)";
290   ht->SetXTitle(s);
291   ht->Draw("colz");
292   
293   can->cd(5);
294   ht = h->Projection(6,0);
295   ht->SetTitle(fix2DTitle(h->Projection(6)->GetTitle(), h->Projection(0)->GetTitle()));
296   TString s = fix1DTitle(h->Projection(0)->GetTitle())+" (GeV/c)";
297   ht->SetXTitle(s);
298   TString s = fix1DTitle(h->Projection(6)->GetTitle())+" (cm)";
299   ht->SetYTitle(s);
300   ht->Draw("colz");
301   
302   can->cd(6);
303   ht = h->Projection(6,3);
304   ht->SetTitle(fix2DTitle(h->Projection(6)->GetTitle(), h->Projection(3)->GetTitle()));
305   TString s = fix1DTitle(h->Projection(6)->GetTitle())+" (cm)";
306   ht->SetYTitle(s);
307   ht->Draw("colz");
308   
309   can->cd(7);
310   ht = h->Projection(3,0);
311   ht->SetTitle(fix2DTitle(h->Projection(3)->GetTitle(), h->Projection(0)->GetTitle()));
312   TString s = fix1DTitle(h->Projection(0)->GetTitle())+" (GeV/c)";
313   ht->SetXTitle(s);
314   ht->Draw("colz");
315   
316   can->cd(8);
317   ht = h->Projection(3,4);
318   ht->SetTitle(fix2DTitle(h->Projection(3)->GetTitle(), h->Projection(4)->GetTitle()));
319   TString s = fix1DTitle(h->Projection(4)->GetTitle())+" (rad)";
320   ht->SetXTitle(s);
321   ht->Draw("colz"); 
322 }
323
324 void plotAid(TCanvas* can, THnSparse* hOFF, THnSparse* hHLT, TText* hText, TH1D *hlt, TH1D *off, TLegend *l, int size){
325  
326   for(int i=0; i<size; i++){         
327       hlt = hHLT->Projection(i);
328       off = hOFF->Projection(i); 
329       hlt->SetTitle(fix1DTitle(hHLT->Projection(i)->GetTitle()));      
330       TString s = hlt->GetTitle();      
331       if(s.Contains("primary")){ 
332          s+=" (cm)";
333          hlt->SetXTitle(s);     
334       }
335      
336       defineYaxisMax(hlt, off);
337       off->SetLineColor(2);
338      
339       can->cd(i+1);
340       hlt->Draw();
341       off->Draw("sames");
342       printStats(hlt, off);
343    } 
344    printLegend(l,hlt,off);  
345 }
346
347 void plotEventQuantities(TCanvas* can, THnSparse* heventOFF, THnSparse* heventHLT, TText* hText){
348
349   TH1D *hlt = NULL;
350   TH1D *off = NULL;
351  
352   TLegend *leg1 = new TLegend(0.6,0.6,0.8,0.8);
353  
354   plotAid(can, heventOFF, heventHLT, hText, hlt, off, leg1, 6);  
355   return;
356 }
357
358 void plotTrackQuantities( TCanvas* can, THnSparse* htrackOFF, THnSparse* htrackHLT, TText* hText,
359                           double minEta,    double maxEta,
360                           double minPt,     double maxPt,
361                           double minDCAr,   double maxDCAr,
362                           double minDCAz,   double maxDCAz,
363                           int minTPCclus,   int maxTPCclus,
364                           int minITSclus,   int maxITSclus, 
365                           int minTrackMult, int maxTrackMult,
366                           int VS
367                         )
368 {
369   TH1D *hlt = NULL;
370   TH1D *off = NULL;
371  
372   TLegend *leg1 = new TLegend(0.6,0.6,0.8,0.8);
373   plotAid(can, htrackOFF, htrackHLT, hText, hlt, off, leg1, 11, 
374           minEta, maxEta, minPt, maxPt, minDCAr, maxDCAr, minDCAz, maxDCAz, minTPCclus, maxTPCclus, minITSclus, maxITSclus, minTrackMult, maxTrackMult, VS);  
375   return;
376 }
377
378 TString fix1DTitle(const char* c){
379   TString tmp = c;
380   tmp.ReplaceAll("projection ","");
381   return tmp;   
382 }
383
384 TString fix2DTitle(const char* c1, const char* c2){
385   TString tmp = fix1DTitle(c1)+" vs."+fix1DTitle(c2);
386   return tmp;
387 }