2a5c6416332787c276971377406f6c5abd589532
[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 in lines 156-158 as arguments of the 
7  * function cutStsudies(...).
8  * 
9  * The input file contains information about the run number
10  * and date that will appear in the canvas title.
11  * 
12  * The cuts are turned into strings and incorporated in the
13  * name of the output file, which contains canvases with event
14  * and track properties for HLT and offline.
15  *  
16  * Since the run information is available, there will be a new
17  * folder created and the canvas ROOT files will be saved in there.
18  *
19  * The macro should be compiled before running:
20  *
21  * root[0] .L drawTHnSparse.C++
22  * root[1] drawTHnSparse("../HLT-OFFLINE-CentralBarrel-comparison.root")
23  *
24  * @ingroup alihlt_qa
25  * @author Kalliopi.Kanaki@ift.uib.no 
26  */
27
28 #if !defined(__CINT__) || defined(__MAKECINT__)
29 #include "TSystem.h"
30 #include "TROOT.h"
31 #include "TFile.h"
32 #include "TString.h"
33 #include "TList.h"
34 #include "THnSparse.h"
35 #include "TCanvas.h"
36 #include "TText.h"
37 #include "TPaveText.h"
38 #include "TPaveStats.h"
39 #include "TH1D.h"
40 #include "TH2D.h"
41 #include "TLegend.h"
42 #include "TStyle.h"
43 #include "TPad.h"
44
45 #include <iostream>
46 //#include <sstream>
47 #include <cstdlib>
48
49 //using std::stringstream;
50 using std::endl;
51 #endif
52
53
54 //---------- forward declerations ---------------//
55
56 TString cutStudies( TCanvas* can1, TCanvas* can2, TCanvas* can3, TString folder,
57 //void cutStudies( TCanvas* can1, TCanvas* can2, TCanvas* can3, TString folder,
58                     THnSparse* htrackHLT, THnSparse* htrackOFF, TText* hText,
59                     double minEta,   double maxEta,
60                     int minTrackMult,int maxTrackMult,
61                     double minPt,    double maxPt,
62                     double minDCAr,  double maxDCAr,
63                     double minDCAz,  double maxDCAz,
64                     int minTPCclus,  int maxTPCclus,
65                     int minITSclus,  int maxITSclus,
66                     int vertexStatus
67                   );
68 void printStats(TH1D *hlt, TH1D *off);
69 void defineYaxisMax(TH1D *hlt, TH1D *off);
70 void printLegend(TLegend *l, TH1D *hlt, TH1D *off);
71 void plotAid(TCanvas* can, THnSparse* hHLT, THnSparse* hOFF, TText* hText, TH1D *hlt, TH1D *off, TLegend *l, int size);    
72 void plot2D(TCanvas* can, THnSparse* h,
73             double minEta,    double maxEta,
74             double minPt,     double maxPt,
75             double minDCAr,   double maxDCAr,
76             double minDCAz,   double maxDCAz,
77             int minTPCclus,   int maxTPCclus,
78             int minITSclus,   int maxITSclus, 
79             int minTrackMult, int maxTrackMult
80            );
81 void plotEventQuantities(TCanvas* can, THnSparse* heventHLT, THnSparse* heventOFF, TText* hText);
82 TString fix1DTitle(const char* c);
83 TString fix2DTitle(const char* c1, const char* c2);
84 TString cutsToString( double minEta,    double maxEta,
85                       double minPt,     double maxPt,
86                       double minDCAr,   double maxDCAr,
87                       double minDCAz,   double maxDCAz,
88                       int minTPCclus,   int maxTPCclus,
89                       int minITSclus,   int maxITSclus, 
90                       int minTrackMult, int maxTrackMult,
91                       int VS
92                     );
93 TString itoa(int i);
94 void plotTrackQuantities( TCanvas* can, THnSparse* htrackHLT, THnSparse* htrackOFF, TText* hText,
95                           double minEta,    double maxEta,
96                           double minPt,     double maxPt,
97                           double minDCAr,   double maxDCAr,
98                           double minDCAz,   double maxDCAz,
99                           int minTPCclus,   int maxTPCclus,
100                           int minITSclus,   int maxITSclus, 
101                           int minTrackMult, int maxTrackMult,
102                           int VS
103                         );
104                         
105 vector<TString> outputNames;
106
107 //------------------------------------------------------------------//          
108                         
109 void drawTHnSparse(TString inputFile){
110  
111   gROOT->SetStyle("Plain");
112   gStyle->SetPalette(1);
113   gStyle->SetOptStat(10);
114   TH1::AddDirectory(kFALSE);
115
116   TFile *file = TFile::Open(inputFile);
117   if(!file){
118     printf("Error: No file %s in folder.\n", inputFile.Data());
119     return;
120   }
121
122   TList *list = static_cast<TList*>(file->Get("esd_thnsparse"));
123   if(!list){
124     printf("Error: No List contained in file %s.\n", inputFile.Data());
125     return;
126   }
127
128   THnSparseF *heventHLT = (THnSparseF*)list->FindObject("fEventHLT"); 
129   if(!heventHLT){
130       printf("Error: There is no HLT THnSparse object in file %s\n", inputFile.Data());
131   }
132   THnSparseF *heventOFF = (THnSparseF*)list->FindObject("fEventOFF");  
133   if(!heventOFF){
134       printf("Error: There is no OFF THnSparse object in file %s\n", inputFile.Data());
135   } 
136   THnSparseF *htrackHLT = (THnSparseF*)list->FindObject("fTrackHLT");
137   if(!htrackHLT){
138       printf("Error: No HLT THnSparse object found\n");
139       return;
140   } 
141   THnSparseF *htrackOFF = (THnSparseF*)list->FindObject("fTrackOFF");  
142   if(!htrackOFF){
143       printf("Error: No OFF THnSparse object found\n");
144       return;
145   }
146       
147   TText *hText = (TText*)list->FindObject("text");
148   if(!hText) printf("No hText\n");
149   
150   TString t = "event properties for ";
151   t+=hText->GetTitle();
152   
153   TString folder = hText->GetTitle();
154   folder.ReplaceAll(" ",""); 
155   folder.Remove(0,3);
156   folder.Remove(6,15);
157    
158   gSystem->Exec("mkdir "+folder);
159   
160   TCanvas *can0 = new TCanvas("can0",t,                            900,600); can0->Divide(3,2);  
161   TCanvas *can1 = new TCanvas("can1","track properties",          1100,900); can1->Divide(4,3);
162   TCanvas *can2 = new TCanvas("can2","2-D HLT track correlations",1200,800); can2->Divide(4,2);
163   TCanvas *can3 = new TCanvas("can3","2-D OFF track correlations",1200,800); can3->Divide(4,2);
164
165   plotEventQuantities(can0,heventHLT,heventOFF,hText);
166   can0->SaveAs(folder+"/event_properties.root");
167   can0->SaveAs(folder+"/event_properties.png");
168     
169   TString s = "";                                                       // eta   mult      pt     DCAr    DCAz    TPCclus ITSclus  vertexStatus
170   s = cutStudies(can1, can2, can3, folder, htrackHLT, htrackOFF, hText, -2, 2, 0, 20000, 0, 200, -80, 80, -80, 80,  0, 200, 0, 6, 2); outputNames.push_back(s); 
171   s = cutStudies(can1, can2, can3, folder, htrackHLT, htrackOFF, hText, -2, 2, 0, 20000, 0, 200, -80, 80, -80, 80,  0, 200, 2, 6, 2); outputNames.push_back(s); 
172   s = cutStudies(can1, can2, can3, folder, htrackHLT, htrackOFF, hText, -2, 2, 0, 20000, 0, 200, -80, 80, -80, 80,  0, 200, 4, 6, 2); outputNames.push_back(s); 
173  
174   TCanvas *ov = new TCanvas("ov","",1100,900);
175   ov->Divide(4,3);
176
177   TCanvas *ca[outputNames.size()]; 
178   TFile   *ff[outputNames.size()]; 
179   TPad    *pad[12]; 
180   TH1D    *g[outputNames.size()];
181   
182   for(int j=1; j<12; j++){ // not 13, last pad is empty (TODO)        
183     for(UInt_t i=0; i<outputNames.size(); i++){  
184            
185         ff[i] = TFile::Open(outputNames[i].Data());   
186         if(!ff[i] || ff[i]->IsZombie()){
187            printf("Non-existent, corrupted or zombie file %s\n", outputNames[i].Data());
188            return;
189         } 
190         ca[i]  = (TCanvas*)ff[i]->GetObjectUnchecked("can1");               
191         if(!ca[i]){
192            printf("Empty canvas in file %s.\n", outputNames[i].Data());
193            continue;
194         }       
195         pad[j] = (TPad*)ca[i]->GetListOfPrimitives()->FindObject(Form("can1_%d",j));            
196         if(!pad[j]){
197            printf("Empty pad in canvas %s.\n", ca[i]->GetName());
198            continue;         
199         }
200         g[i] =(TH1D*)pad[j]->FindObject(Form("fTrackHLT_proj_%d",j-1));
201         if(!g[i]){
202            printf("Empty histogram for i=%d, file %s.\n", i, outputNames[i].Data());
203            continue;
204         }
205         
206         ov->cd(j);      
207         if(i==0) g[i]->Draw();
208         else { 
209           g[i]->SetLineColor(i+1); 
210           defineYaxisMax(g[0], g[i]);
211           g[i]->Draw("sames");
212         }                                        
213     }
214   }  
215   file->Close();    
216 }
217
218 TString cutStudies( TCanvas* can1, TCanvas* can2, TCanvas* can3, TString folder,
219 //void cutStudies( TCanvas* can1, TCanvas* can2, TCanvas* can3, TString folder,
220                     THnSparse* htrackHLT, THnSparse* htrackOFF, TText* hText,
221                     double minEta,   double maxEta,
222                     int minTrackMult,int maxTrackMult,
223                     double minPt,    double maxPt,
224                     double minDCAr,  double maxDCAr,
225                     double minDCAz,  double maxDCAz,
226                     int minTPCclus,  int maxTPCclus,
227                     int minITSclus,  int maxITSclus,
228                     int vertexStatus
229                   )
230 {
231   plotTrackQuantities(can1, htrackHLT, htrackOFF, hText, 
232                       minEta, maxEta, minPt, maxPt, minDCAr, maxDCAr, minDCAz, maxDCAz, minTPCclus, maxTPCclus, minITSclus, maxITSclus, minTrackMult, maxTrackMult, vertexStatus);
233   
234   plot2D(can2, htrackHLT, minEta, maxEta, minPt, maxPt, minDCAr, maxDCAr, minDCAz, maxDCAz, minTPCclus, maxTPCclus, minITSclus, maxITSclus, minTrackMult, maxTrackMult);
235   
236   plot2D(can3, htrackOFF, minEta, maxEta, minPt, maxPt, minDCAr, maxDCAr, minDCAz, maxDCAz, minTPCclus, maxTPCclus, minITSclus, maxITSclus, minTrackMult, maxTrackMult);
237   
238   TString cuts = cutsToString(minEta, maxEta, minPt, maxPt, minDCAr, maxDCAr, minDCAz, maxDCAz, minTPCclus, maxTPCclus, 
239                               minITSclus, maxITSclus, minTrackMult, maxTrackMult, vertexStatus);
240
241   can1->SaveAs(folder+"/track_properties_"+cuts+".root");
242   can1->SaveAs(folder+"/track_properties_"+cuts+".png");  
243   can2->SaveAs(folder+"/HLT_2D_track_correlations_"+cuts+".root");
244   can2->SaveAs(folder+"/HLT_2D_track_correlations_"+cuts+".png");
245   can3->SaveAs(folder+"/OFF_2D_track_correlations_"+cuts+".root");
246   can3->SaveAs(folder+"/OFF_2D_track_correlations_"+cuts+".png");
247   
248   return folder+"/track_properties_"+cuts+".root";
249 }
250
251 void printStats(TH1D *hlt, TH1D *off){  
252   gPad->Update();
253   TPaveStats *st1 = (TPaveStats*)hlt->FindObject("stats");
254   st1->SetLineColor(0);
255
256   gPad->Update();
257   TPaveStats *st2 = (TPaveStats*)off->FindObject("stats");
258   st2->SetY2NDC(st1->GetY1NDC()-0.05);
259   st2->SetY1NDC(st2->GetY2NDC()-TMath::Abs(st1->GetY1NDC()-st1->GetY2NDC()));
260   st2->SetLineColor(0);
261   st2->SetTextColor(off->GetLineColor());
262   st2->SetFillStyle(0);
263   st2->Draw();
264 }
265
266 void defineYaxisMax(TH1D *hlt, TH1D *off){ 
267   if(hlt->GetMaximum() > off->GetMaximum()) off->SetMaximum(1.1*hlt->GetMaximum());
268   else hlt->SetMaximum(1.1*off->GetMaximum());
269 }
270
271 void printLegend(TLegend *l, TH1D *hlt, TH1D *off){  
272   l->SetFillColor(10); 
273   l->SetLineColor(10);
274   l->AddEntry(hlt, "HLT", "l");
275   l->AddEntry(off, "OFF", "l");
276   l->Draw("same");
277 }
278
279 //====================== for 1D distributions ===============================//
280
281 void plotAid(TCanvas* can, THnSparse* hHLT, THnSparse* hOFF, TText* hText, TH1D *hlt, TH1D *off, TLegend *l, int size,
282              double minEta,    double maxEta,
283              double minPt,     double maxPt,
284              double minDCAr,   double maxDCAr,
285              double minDCAz,   double maxDCAz,
286              int minTPCclus,   int maxTPCclus,
287              int minITSclus,   int maxITSclus, 
288              int minTrackMult, int maxTrackMult,
289              int VS
290            )
291 {     
292    hHLT->GetAxis(0)->SetRangeUser(minPt,maxPt);
293    hHLT->GetAxis(1)->SetRangeUser(minTPCclus,maxTPCclus);
294    hHLT->GetAxis(3)->SetRangeUser(minEta, maxEta);
295    hHLT->GetAxis(5)->SetRangeUser(minDCAr, maxDCAr);
296    hHLT->GetAxis(6)->SetRangeUser(minDCAz, maxDCAz);
297    hHLT->GetAxis(10)->SetRangeUser(minITSclus, maxITSclus);
298    hHLT->GetAxis(11)->SetRangeUser(minTrackMult, maxTrackMult);
299    if(VS!=2) hHLT->GetAxis(12)->SetRangeUser(VS,VS);
300    
301    hOFF->GetAxis(0)->SetRangeUser(minPt,maxPt);
302    hOFF->GetAxis(1)->SetRangeUser(minTPCclus,maxTPCclus);
303    hOFF->GetAxis(3)->SetRangeUser(minEta, maxEta);
304    hOFF->GetAxis(5)->SetRangeUser(minDCAr, maxDCAr);
305    hOFF->GetAxis(6)->SetRangeUser(minDCAz, maxDCAz);
306    hOFF->GetAxis(10)->SetRangeUser(minITSclus, maxITSclus);
307    hOFF->GetAxis(11)->SetRangeUser(minTrackMult, maxTrackMult);
308    if(VS!=2) hOFF->GetAxis(12)->SetRangeUser(VS,VS);
309        
310    for(int i=0; i<size; i++){
311   
312       hlt = hHLT->Projection(i); if(!hlt){ printf("plotAid: empty HLT histogram\n"); continue; }
313       off = hOFF->Projection(i); if(!off){ printf("plotAid: empty OFF histogram\n"); continue; }
314       
315       hlt->SetTitle(fix1DTitle(hHLT->Projection(i)->GetTitle())); 
316    
317       TString s = hlt->GetTitle();      
318       if(s.Contains("p_")){ 
319          s+=" (GeV/c)";
320          hlt->SetXTitle(s);     
321       }
322       else if(s.Contains("theta") || s.Contains("phi")){
323          s+=" (rad)"; 
324          hlt->SetXTitle(s);
325       }
326       else if(s.Contains("DCA")){
327          s+=" (cm)";
328          hlt->SetXTitle(s);
329       }
330         
331       defineYaxisMax(hlt, off);
332       off->SetLineColor(2);
333       //off->SetLineStyle(2);
334      
335       can->cd(i+1);
336       hlt->Draw();
337       off->Draw("sames");
338       printStats(hlt, off);
339       
340       if(i==0){
341          printLegend(l,hlt,off);
342          TPaveText *pave = new TPaveText(50,500,140,2100);
343          pave->SetFillColor(kWhite);
344          pave->SetLineColor(kWhite);
345          pave->SetShadowColor(kWhite);
346          //TText *t1 = 
347          pave->AddText(itoa(minEta)+" < #eta < "+itoa(maxEta));
348          pave->AddText(itoa(minPt)+" < p_{T} (GeV/c) < "+itoa(maxPt));
349          pave->AddText(itoa(minTrackMult)+" < track mult < "+itoa(maxTrackMult));
350          pave->AddText(itoa(minDCAr)+" < DCAr (cm) < "+itoa(maxDCAr));
351          pave->AddText(itoa(minDCAz)+" < DCAz (cm) < "+itoa(maxDCAz));
352          pave->AddText(itoa(minTPCclus)+" < TPC clusters/track < "+itoa(maxTPCclus));
353          pave->AddText(itoa(minITSclus)+" < ITS clusters/track < "+itoa(maxITSclus));  
354          if(VS!=2) pave->AddText("vertex status: "+itoa(VS));
355          
356          pave->Draw();
357          can->Update();
358       }      
359    } 
360 }
361
362 //====================== for 2D distributions ===============================//
363
364 void plot2D(TCanvas* can, THnSparse* h,
365             double minEta,    double maxEta,
366             double minPt,     double maxPt,
367             double minDCAr,   double maxDCAr,
368             double minDCAz,   double maxDCAz,
369             int minTPCclus,   int maxTPCclus,
370             int minITSclus,   int maxITSclus, 
371             int minTrackMult, int maxTrackMult
372            )
373 {
374   h->GetAxis(0)->SetRangeUser(minPt,maxPt);
375   h->GetAxis(1)->SetRangeUser(minTPCclus,maxTPCclus);
376   h->GetAxis(3)->SetRangeUser(minEta, maxEta);
377   h->GetAxis(5)->SetRangeUser(minDCAr, maxDCAr);
378   h->GetAxis(6)->SetRangeUser(minDCAz, maxDCAz);
379   h->GetAxis(10)->SetRangeUser(minITSclus, maxITSclus);
380   h->GetAxis(11)->SetRangeUser(minTrackMult, maxTrackMult);
381   
382   can->cd(1);    
383   TH2D *ht = h->Projection(1,0);
384   ht->SetTitle(fix2DTitle(h->Projection(1)->GetTitle(), h->Projection(0)->GetTitle()));
385
386   TString s = "";
387   s = fix1DTitle(h->Projection(0)->GetTitle())+" (GeV/c)";
388   ht->SetXTitle(s);
389   ht->Draw("colz");
390   
391   can->cd(2);
392   ht = h->Projection(1,3);
393   ht->SetTitle(fix2DTitle(h->Projection(1)->GetTitle(), h->Projection(3)->GetTitle()));
394   ht->Draw("colz");
395   
396   can->cd(3);
397   ht = h->Projection(1,5);
398   ht->SetTitle(fix2DTitle(h->Projection(1)->GetTitle(), h->Projection(5)->GetTitle()));
399   s = fix1DTitle(h->Projection(5)->GetTitle())+" (cm)";
400   ht->SetXTitle(s);
401   ht->Draw("colz");
402   
403   can->cd(4);
404   ht = h->Projection(1,6);
405   ht->SetTitle(fix2DTitle(h->Projection(1)->GetTitle(), h->Projection(6)->GetTitle()));
406   s = fix1DTitle(h->Projection(6)->GetTitle())+" (cm)";
407   ht->SetXTitle(s);
408   ht->Draw("colz");
409   
410   can->cd(5);
411   ht = h->Projection(6,0);
412   ht->SetTitle(fix2DTitle(h->Projection(6)->GetTitle(), h->Projection(0)->GetTitle()));
413   s = fix1DTitle(h->Projection(0)->GetTitle())+" (GeV/c)";
414   ht->SetXTitle(s);
415   s = fix1DTitle(h->Projection(6)->GetTitle())+" (cm)";
416   ht->SetYTitle(s);
417   ht->Draw("colz");
418   
419   can->cd(6);
420   ht = h->Projection(6,3);
421   ht->SetTitle(fix2DTitle(h->Projection(6)->GetTitle(), h->Projection(3)->GetTitle()));
422   s = fix1DTitle(h->Projection(6)->GetTitle())+" (cm)";
423   ht->SetYTitle(s);
424   ht->Draw("colz");
425   
426   can->cd(7);
427   ht = h->Projection(3,0);
428   ht->SetTitle(fix2DTitle(h->Projection(3)->GetTitle(), h->Projection(0)->GetTitle()));
429   s = fix1DTitle(h->Projection(0)->GetTitle())+" (GeV/c)";
430   ht->SetXTitle(s);
431   ht->Draw("colz");
432   
433   can->cd(8);
434   ht = h->Projection(3,4);
435   ht->SetTitle(fix2DTitle(h->Projection(3)->GetTitle(), h->Projection(4)->GetTitle()));
436   s = fix1DTitle(h->Projection(4)->GetTitle())+" (rad)";
437   ht->SetXTitle(s);
438   ht->Draw("colz"); 
439 }
440
441 void plotAid(TCanvas* can, THnSparse* hHLT, THnSparse* hOFF, TText* hText, TH1D *hlt, TH1D *off, TLegend *l, int size){
442  
443   for(int i=0; i<size; i++){         
444       hlt = hHLT->Projection(i);
445       off = hOFF->Projection(i); 
446       hlt->SetTitle(fix1DTitle(hHLT->Projection(i)->GetTitle()));      
447       TString s = hlt->GetTitle();      
448       if(s.Contains("primary")){ 
449          s+=" (cm)";
450          hlt->SetXTitle(s);     
451       }
452      
453       defineYaxisMax(hlt, off);
454       off->SetLineColor(2);
455      
456       can->cd(i+1);
457       hlt->Draw();
458       off->Draw("sames");
459       printStats(hlt, off);
460       
461       if(i==0) printLegend(l,hlt,off);
462    } 
463 }
464
465 void plotEventQuantities(TCanvas* can, THnSparse* heventHLT, THnSparse* heventOFF, TText* hText){
466
467   TH1D *hlt = NULL;
468   TH1D *off = NULL;
469  
470   TLegend *leg1 = new TLegend(0.6,0.6,0.8,0.8);
471  
472   plotAid(can, heventHLT, heventOFF, hText, hlt, off, leg1, 6);  
473   return;
474 }
475
476 void plotTrackQuantities( TCanvas* can, THnSparse* htrackHLT, THnSparse* htrackOFF, TText* hText,
477                           double minEta,    double maxEta,
478                           double minPt,     double maxPt,
479                           double minDCAr,   double maxDCAr,
480                           double minDCAz,   double maxDCAz,
481                           int minTPCclus,   int maxTPCclus,
482                           int minITSclus,   int maxITSclus, 
483                           int minTrackMult, int maxTrackMult,
484                           int VS
485                         )
486 {
487   TH1D *hlt = NULL;
488   TH1D *off = NULL;
489  
490   TLegend *leg1 = new TLegend(0.6,0.6,0.8,0.8);
491   plotAid(can, htrackHLT, htrackOFF, hText, hlt, off, leg1, 11, 
492           minEta, maxEta, minPt, maxPt, minDCAr, maxDCAr, minDCAz, maxDCAz, minTPCclus, maxTPCclus, minITSclus, maxITSclus, minTrackMult, maxTrackMult, VS);  
493   return;
494 }
495
496 TString fix1DTitle(const char* c){
497   TString tmp = c;
498   tmp.ReplaceAll("projection ","");
499   return tmp;   
500 }
501
502 TString fix2DTitle(const char* c1, const char* c2){
503   TString tmp = fix1DTitle(c1)+" vs."+fix1DTitle(c2);
504   return tmp;
505 }
506
507 TString cutsToString( double minEta,    double maxEta,
508                       double minPt,     double maxPt,
509                       double minDCAr,   double maxDCAr,
510                       double minDCAz,   double maxDCAz,
511                       int minTPCclus,   int maxTPCclus,
512                       int minITSclus,   int maxITSclus, 
513                       int minTrackMult, int maxTrackMult,
514                       int VS
515                     )
516 {
517   TString cuts = "";
518   cuts += "eta"+itoa(minEta)+"_"+itoa(maxEta)+"_";
519   cuts += "Pt"+itoa(minPt)+"_"+itoa(maxPt)+"_";
520   cuts += "TM"+itoa(minTrackMult)+"_"+itoa(maxTrackMult)+"_";
521   cuts += "DCAr"+itoa(minDCAr)+"_"+itoa(maxDCAr)+"_";
522   cuts += "DCAz"+itoa(minDCAz)+"_"+itoa(maxDCAz)+"_";
523   cuts += "TPCclus"+itoa(minTPCclus)+"_"+itoa(maxTPCclus)+"_";
524   cuts += "ITSclus"+itoa(minITSclus)+"_"+itoa(maxITSclus)+"_";
525   
526   if(VS==2) cuts.Chop(); 
527   else cuts += "VS"+itoa(VS); 
528   return cuts;
529 }
530
531 TString itoa(int i){
532   //stringstream si;
533   //si << i;
534   //return si.str();
535   TString x; x += i; return x;
536 }
537
538 TString itoa(double i){
539   //stringstream si;
540   //si << i;
541   //return si.str();
542   TString x; x += i; return x;
543 }