4fb8f8a9e5a640eb32f54ca9249264417f3d8379
[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       defineYaxisMax(hlt, off);
221       //off->SetLineColor(2);
222       off->SetLineStyle(2);
223      
224       can->cd(i+1);
225       hlt->Draw();
226       off->Draw("sames");
227       printStats(hlt, off);
228    } 
229    printLegend(l,hlt,off);  
230 }
231
232 //====================== for 2D distributions ===============================//
233
234 void plot2D(TCanvas* can, THnSparse* h,
235             double minEta,    double maxEta,
236             double minPt,     double maxPt,
237             double minDCAr,   double maxDCAr,
238             double minDCAz,   double maxDCAz,
239             int minTPCclus,   int maxTPCclus,
240             int minITSclus,   int maxITSclus, 
241             int minTrackMult, int maxTrackMult
242            )
243 {
244   h->GetAxis(0)->SetRangeUser(minPt,maxPt);
245   h->GetAxis(1)->SetRangeUser(minTPCclus,maxTPCclus);
246   h->GetAxis(3)->SetRangeUser(minEta, maxEta);
247   h->GetAxis(5)->SetRangeUser(minDCAr, maxDCAr);
248   h->GetAxis(6)->SetRangeUser(minDCAz, maxDCAz);
249   h->GetAxis(10)->SetRangeUser(minITSclus, maxITSclus);
250   h->GetAxis(11)->SetRangeUser(minTrackMult, maxTrackMult);
251   
252   can->cd(1);    
253   TH2D *ht = h->Projection(1,0);
254   ht->SetTitle(fix2DTitle(h->Projection(1)->GetTitle(), h->Projection(0)->GetTitle()));
255   ht->Draw("colz");
256   
257   can->cd(2);
258   ht = h->Projection(1,3);
259   ht->SetTitle(fix2DTitle(h->Projection(1)->GetTitle(), h->Projection(3)->GetTitle()));
260   ht->Draw("colz");
261   
262   can->cd(3);
263   ht = h->Projection(1,5);
264   ht->SetTitle(fix2DTitle(h->Projection(1)->GetTitle(), h->Projection(5)->GetTitle()));
265   ht->Draw("colz");
266   
267   can->cd(4);
268   ht = h->Projection(1,6);
269   ht->SetTitle(fix2DTitle(h->Projection(1)->GetTitle(), h->Projection(6)->GetTitle()));
270   ht->Draw("colz");
271   
272   can->cd(5);
273   ht = h->Projection(6,0);
274   ht->SetTitle(fix2DTitle(h->Projection(6)->GetTitle(), h->Projection(0)->GetTitle()));
275   ht->Draw("colz");
276   
277   can->cd(6);
278   ht = h->Projection(6,3);
279   ht->SetTitle(fix2DTitle(h->Projection(6)->GetTitle(), h->Projection(3)->GetTitle()));
280   ht->Draw("colz");
281   
282   can->cd(7);
283   ht = h->Projection(3,0);
284   ht->SetTitle(fix2DTitle(h->Projection(3)->GetTitle(), h->Projection(0)->GetTitle()));
285   ht->Draw("colz");
286   
287   can->cd(8);
288   ht = h->Projection(3,4);
289   ht->SetTitle(fix2DTitle(h->Projection(3)->GetTitle(), h->Projection(4)->GetTitle()));
290   ht->Draw("colz"); 
291 }
292
293 void plotAid(TCanvas* can, THnSparse* hOFF, THnSparse* hHLT, TText* hText, TH1D *hlt, TH1D *off, TLegend *l, int size){
294  
295   for(int i=0; i<size; i++){         
296       hlt = hHLT->Projection(i);
297       off = hOFF->Projection(i); 
298       hlt->SetTitle(fix1DTitle(hHLT->Projection(i)->GetTitle()));
299       defineYaxisMax(hlt, off);
300       off->SetLineColor(2);
301      
302       can->cd(i+1);
303       hlt->Draw();
304       off->Draw("sames");
305       printStats(hlt, off);
306    } 
307    printLegend(l,hlt,off);  
308 }
309
310 void plotEventQuantities(TCanvas* can, THnSparse* heventOFF, THnSparse* heventHLT, TText* hText){
311
312   TH1D *hlt = NULL;
313   TH1D *off = NULL;
314  
315   TLegend *leg1 = new TLegend(0.6,0.6,0.8,0.8);
316  
317   plotAid(can, heventOFF, heventHLT, hText, hlt, off, leg1, 6);  
318   return;
319 }
320
321 void plotTrackQuantities( TCanvas* can, THnSparse* htrackOFF, THnSparse* htrackHLT, TText* hText,
322                           double minEta,    double maxEta,
323                           double minPt,     double maxPt,
324                           double minDCAr,   double maxDCAr,
325                           double minDCAz,   double maxDCAz,
326                           int minTPCclus,   int maxTPCclus,
327                           int minITSclus,   int maxITSclus, 
328                           int minTrackMult, int maxTrackMult,
329                           int VS
330                         )
331 {
332   TH1D *hlt = NULL;
333   TH1D *off = NULL;
334  
335   TLegend *leg1 = new TLegend(0.6,0.6,0.8,0.8);
336   plotAid(can, htrackOFF, htrackHLT, hText, hlt, off, leg1, 11, 
337           minEta, maxEta, minPt, maxPt, minDCAr, maxDCAr, minDCAz, maxDCAz, minTPCclus, maxTPCclus, minITSclus, maxITSclus, minTrackMult, maxTrackMult, VS);  
338   return;
339 }
340
341 TString fix1DTitle(const char* c){
342   TString tmp = c;
343   tmp.ReplaceAll("projection ","");
344   return tmp;   
345 }
346
347 TString fix2DTitle(const char* c1, const char* c2){
348   TString tmp = fix1DTitle(c1)+" vs."+fix1DTitle(c2);
349   return tmp;
350 }