- added centrality information and the vertex Z coordinate in the track THnSparse
authorkkanaki <kkanaki@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 28 Mar 2011 16:04:24 +0000 (16:04 +0000)
committerkkanaki <kkanaki@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 28 Mar 2011 16:04:24 +0000 (16:04 +0000)
- created options for adjusting the size of the THnSparse depending on the beam type
- removed the DCAr and DCAz of the HLT ESD (it is not the one we want to look at the way it is filled at the moment)
- added new plots for the event properties, V0 centrality and multiplicity vs. number of contributors
- added run info and date in the names of all canvases
- added option to create and fill only those canvases with quantities filled by the CB task

HLT/QA/tasks/AliAnalysisTaskHLTCentralBarrel.cxx
HLT/QA/tasks/AliAnalysisTaskHLTCentralBarrel.h
HLT/QA/tasks/macros/drawTHnSparse.C

index 556864e..b14ebe2 100644 (file)
@@ -47,7 +47,7 @@ ClassImp(AliAnalysisTaskHLTCentralBarrel)
 AliAnalysisTaskHLTCentralBarrel::AliAnalysisTaskHLTCentralBarrel()
 :AliAnalysisTaskSE()
   ,fUseHLTTrigger(kFALSE)
-  ,fUseCentrality(kFALSE)
+  ,fCentrality()
   ,fBeamType()
   ,fOutputList(0)
   ,fEventOFF(0)
@@ -69,7 +69,7 @@ AliAnalysisTaskHLTCentralBarrel::AliAnalysisTaskHLTCentralBarrel()
 AliAnalysisTaskHLTCentralBarrel::AliAnalysisTaskHLTCentralBarrel(const char *name)
 :AliAnalysisTaskSE(name)    
   ,fUseHLTTrigger(kFALSE)   
-  ,fUseCentrality(kFALSE)   
+  ,fCentrality()   
   ,fBeamType()
   ,fOutputList(0)
   ,fEventOFF(0)
@@ -99,39 +99,50 @@ void AliAnalysisTaskHLTCentralBarrel::UserCreateOutputObjects(){
   fOutputList = new TList();
   fOutputList->SetOwner();
   fOutputList->SetName(GetName());
-    
-  static const int sizeEvent = 6;
-  int    binsEvent[sizeEvent] = {  50,  50, 250,   100,   100, 2 };
-  double minEvent [sizeEvent] = {  -1,  -1, -30,     0,     0, 0 };
-  double maxEvent [sizeEvent] = {   1,   1,  30, 10000, 10000, 2 };
   
-  fEventHLT = CreateEventTHnSparse("fEventHLT",sizeEvent,binsEvent,minEvent,maxEvent);
-  fEventOFF = CreateEventTHnSparse("fEventOFF",sizeEvent,binsEvent,minEvent,maxEvent);
+  if(fBeamType.Contains("Pb")){ // in case of a Pb+Pb run the V0 centrality is added to the THnSparse  
+     static const int sizeEvent = 7;
+     //                              0    1     2    3         4            5         6
+     //                              x    y     z    #contr   mult  vertexStatus  V0centrality
+     int    binsEvent[sizeEvent] = { 100, 100,  60,   200,    200,    2,           100 }; // binning
+     double minEvent [sizeEvent] = {  -1,  -1, -20,    0,      3,    0,              0 }; // min x
+     double maxEvent [sizeEvent] = {   1,   1,  20,  2000,   2000,    2,           100 }; // max x    
+     fEventHLT = CreateEventTHnSparse("fEventHLT",sizeEvent,binsEvent,minEvent,maxEvent);
+     fEventOFF = CreateEventTHnSparse("fEventOFF",sizeEvent,binsEvent,minEvent,maxEvent);
+  }
+  else {
+     static const int sizeEvent = 6;
+     //                              0     1    2    3         4            5
+     //                              x     y    z    #contr   mult    vertexStatus  
+     int    binsEvent[sizeEvent] = { 100,  100, 60,   200,     200,     2 }; // binning
+     double minEvent [sizeEvent] = {  -1,  -1, -20,     0,      3,      0 }; // min x
+     double maxEvent [sizeEvent] = {   1,   1,  20,  2000,    2000,      2 }; // max x  
+     fEventHLT = CreateEventTHnSparse("fEventHLT",sizeEvent,binsEvent,minEvent,maxEvent);
+     fEventOFF = CreateEventTHnSparse("fEventOFF",sizeEvent,binsEvent,minEvent,maxEvent);  
+  }
   
-  if(fBeamType.Contains("Pb")){
-     static const int sizeTrack = 15;
-     //                               pt  TPCcl theta eta phi   DCAr  DCAz charge DCArSG DCAzSG ITScl mult vertex status  vertexZ  centrality
-     Int_t    binsTrack[sizeTrack] = {1500, 200, 200, 200, 200,  800,  400,    3,  400,  400,   10,  2000,     2,            250,        100 };
-     Double_t minTrack [sizeTrack] = {   0,   0,  -1,  -3,  -1,  -40, -100, -1.5, -100, -100,    0,     0,     0,            -30,          0 };
-     Double_t maxTrack [sizeTrack] = { 150, 200,   4,  3,   7,   40,  100,  1.5,  100,  100,    10, 20000,     2,            -30,        100 };
-      
+  if(fBeamType.Contains("Pb")){ // in case of a Pb+Pb run the V0 centrality is added to the THnSparse
+     static const int sizeTrack = 13;
+     //                                 0    1     2    3   4      5    6     7       8      9    10              11          12            
+     //                               pt  TPCcl theta eta phi   DCAr  DCAz charge  ITScl mult vertex status  vertexZ   V0centrality
+     Int_t    binsTrack[sizeTrack] = { 200, 200, 200, 200, 200,  100,  100,    3,   10,  1000,     2,           60,     100 }; // binning
+     Double_t minTrack [sizeTrack] = {   0,   0,  -1,  -2,  -1,  -10,  -10, -1.5,    0,     3,     0,          -20,       0 }; // min x
+     Double_t maxTrack [sizeTrack] = {   5, 200,   4,  2,   7,   10,  -10,  1.5,   10, 10000,     2,            20,     100 }; // max x       
      fTrackHLT = CreateTrackTHnSparse("fTrackHLT",sizeTrack,binsTrack,minTrack,maxTrack);
      fTrackOFF = CreateTrackTHnSparse("fTrackOFF",sizeTrack,binsTrack,minTrack,maxTrack);
   }
   else {    
-     static const int sizeTrack = 14;
-     //                               pt  TPCcl theta eta phi   DCAr  DCAz charge DCArSG DCAzSG ITScl mult vertex status  vertexZ  
-     Int_t    binsTrack[sizeTrack] = {1500, 200, 200, 200, 200,  800,  400,    3,  400,  400,   10,  1000,     2,            250 };
-     Double_t minTrack [sizeTrack] = {   0,   0,  -1,  -3,  -1,  -40, -100, -1.5, -100, -100,    0,     0,     0,            -30 };
-     Double_t maxTrack [sizeTrack] = { 150, 200,   4,  3,   7,   40,  100,  1.5,  100,  100,    10, 10000,     2,            -30 };  
-     
+     static const int sizeTrack = 12;
+     //                                 0    1     2    3   4       5     6      7       8     9        10             11       
+     //                               pt  TPCcl theta eta  phi   DCAr  DCAz  charge   ITScl  mult  vertex status   vertexZ  
+     Int_t    binsTrack[sizeTrack] = {200, 200, 200,  200,  200,  100,  100,      3,    10,  1000,     2,          60 }; // binning
+     Double_t minTrack [sizeTrack] = {  0,   0,  -1,   -2,   -1,  -10,  -10,   -1.5,     0,     3,     0,         -20 }; // min x
+     Double_t maxTrack [sizeTrack] = {  5, 200,   4,    2,    7,   10,   10,    1.5,    10, 10000,     2,          20 }; // max x        
      fTrackHLT = CreateTrackTHnSparse("fTrackHLT",sizeTrack,binsTrack,minTrack,maxTrack);
      fTrackOFF = CreateTrackTHnSparse("fTrackOFF",sizeTrack,binsTrack,minTrack,maxTrack);     
   }
   
   fTextBox = new TText();  
-
   fOutputList->Add(fEventOFF);
   fOutputList->Add(fEventHLT);
   fOutputList->Add(fTrackOFF);
@@ -178,22 +189,23 @@ void AliAnalysisTaskHLTCentralBarrel::UserExec(Option_t *){
   Double_t bfield = esdOFF->GetMagneticField();
   Int_t nr_tracksOFF = 0;
   
-  if(esdOFF->GetEventSpecie()==16) return;
+  if(esdOFF->GetEventSpecie()==16) return; // skip calibration events
 
-  AliCentrality *cent = esdOFF->GetCentrality();
-    
-  for(Int_t i=0; i<esdOFF->GetNumberOfTracks(); i++){
-      AliESDtrack *esdTrackOFF = esdOFF->GetTrack(i);
-      if (!esdTrackOFF) continue;
-      if(!(esdTrackOFF->GetStatus()&AliESDtrack::kTPCin)) continue;
-      nr_tracksOFF++; 
+  if(fBeamType.Contains("Pb")){
+     fCentrality = esdOFF->GetCentrality(); 
+     // this information is only available from the offline ESD for 2011, the V0 info was not stored in the HLTesd (23.03.11,Kelly)
+     if(!fCentrality){
+        printf("Centrality pointer is empty\n");
+       return;
+     }
   }
-         
+               
   for(Int_t i=0; i<esdOFF->GetNumberOfTracks(); i++){
       
       AliESDtrack *esdTrackOFF = esdOFF->GetTrack(i);
       if (!esdTrackOFF) continue;
       if(!(esdTrackOFF->GetStatus()&AliESDtrack::kTPCin)) continue;
+      nr_tracksOFF++;
 
       //DCA calculations(from offline)
       Double_t x[3];
@@ -212,10 +224,9 @@ void AliAnalysisTaskHLTCentralBarrel::UserExec(Option_t *){
         dca[0]=-99;
         dca[1]=-99;
       }
-      //else ?????? why doesn't it work with pp????
       esdTrackOFF->GetImpactParametersTPC(dca,cov);
 
-      Float_t DCAr =-99, DCAz = -99.;  
+      //Float_t DCAr =-99, DCAz = -99.;  
 
       if(fBeamType.Contains("Pb")){       
          Double_t trackOFF[] = {
@@ -227,14 +238,14 @@ void AliAnalysisTaskHLTCentralBarrel::UserExec(Option_t *){
                                  ,dca[0]                         
                                  ,dca[1]                         
                                  ,esdTrackOFF->Charge() 
-                                 ,DCAr                           
-                                 ,DCAz                           
+                                 //,DCAr                         
+                                 //,DCAz                         
                                  ,esdTrackOFF->GetNcls(0)
                                  ,nr_tracksOFF
                                  ,vertOFF->GetStatus()
                                  ,vertOFF->GetZ()
-                                 ,cent->GetCentralityPercentile("V0M")
-                              };                                                     
+                                 ,fCentrality->GetCentralityPercentile("V0M")
+                              }; 
         if(fOptions.Contains("track-off")) fTrackOFF->Fill(trackOFF);
       } else {
         Double_t trackOFF[] = {
@@ -246,8 +257,8 @@ void AliAnalysisTaskHLTCentralBarrel::UserExec(Option_t *){
                                  ,dca[0]                         
                                  ,dca[1]                         
                                  ,esdTrackOFF->Charge() 
-                                 ,DCAr                           
-                                 ,DCAz                           
+                                 //,DCAr                         
+                                 //,DCAz                         
                                  ,esdTrackOFF->GetNcls(0)
                                  ,nr_tracksOFF
                                  ,vertOFF->GetStatus()
@@ -257,36 +268,35 @@ void AliAnalysisTaskHLTCentralBarrel::UserExec(Option_t *){
       }
   } // end of track loop
     
-  Double_t eventOFF[] = { vertOFF->GetX(), vertOFF->GetY(), vertOFF->GetZ(), vertOFF->GetNContributors(), nr_tracksOFF, vertOFF->GetStatus()};
-  if(fOptions.Contains("event-off")) fEventOFF->Fill(eventOFF);  
-    
-  
+  if(fBeamType.Contains("Pb")){
+     Double_t eventOFF[] = { vertOFF->GetX(), vertOFF->GetY(), vertOFF->GetZ(), vertOFF->GetNContributors(), nr_tracksOFF, vertOFF->GetStatus(),fCentrality->GetCentralityPercentile("V0M")};
+     if(fOptions.Contains("event-off")) fEventOFF->Fill(eventOFF);  
+  }
+  else {
+     Double_t eventOFF[] = { vertOFF->GetX(), vertOFF->GetY(), vertOFF->GetZ(), vertOFF->GetNContributors(), nr_tracksOFF, vertOFF->GetStatus()};
+     if(fOptions.Contains("event-off")) fEventOFF->Fill(eventOFF);
+  }
+  // Inspite of the different options to fill event or track properties, all the loops are being executed. 
+  // The options influence only whether the respective THnSparse is filled or not.
+  // Can definitely be improved to save processing time in unnecessary loops that won't fill anything at the end.   
   
   //======================================== HLT ==========================================//
 
   Int_t nr_tracksHLT = 0;  
-  if(esdHLT->GetEventSpecie()==16) return;
-  const AliESDVertex *vertHLT = esdHLT->GetPrimaryVertexTracks();
-  
-  for(Int_t i=0; i<esdHLT->GetNumberOfTracks(); i++){
-      AliESDtrack *esdTrackHLT = esdHLT->GetTrack(i);
-      if (!esdTrackHLT) continue;
-      if(!(esdTrackHLT->GetStatus()&AliESDtrack::kTPCin)) continue;
-      nr_tracksHLT++; 
-  }
+  if(esdHLT->GetEventSpecie()==16) return; // skip calibration events
   
-  Double_t eventHLT[] = { vertHLT->GetX(), vertHLT->GetY(), vertHLT->GetZ(), vertHLT->GetNContributors(), nr_tracksHLT, vertHLT->GetStatus()};
-  if(fOptions.Contains("event-hlt")) fEventHLT->Fill(eventHLT);  
-
+  const AliESDVertex *vertHLT = esdHLT->GetPrimaryVertexTracks();
+    
   for(Int_t i=0; i<esdHLT->GetNumberOfTracks(); i++){
       
       AliESDtrack *esdTrackHLT = esdHLT->GetTrack(i);
       if(!esdTrackHLT) continue;
       if(!(esdTrackHLT->GetStatus()&AliESDtrack::kTPCin)) continue;
+      nr_tracksHLT++; 
       
       //DCA calculations
-      Float_t DCAr=-99;
-      Float_t DCAz=-99;
+      //Float_t DCAr=-99; // for the DCA of the HLTesd
+      //Float_t DCAz=-99;
       Float_t dca[2];
       if(vertHLT->GetX()==0 && vertHLT->GetY()==0 && vertHLT->GetZ() ==0 ){
        dca[0]=-99;
@@ -296,7 +306,7 @@ void AliAnalysisTaskHLTCentralBarrel::UserExec(Option_t *){
        //Calculating DCA "old" fashion
        esdTrackHLT->GetDZ(esdHLT->GetPrimaryVertex()->GetXv(), esdHLT->GetPrimaryVertex()->GetYv(), esdHLT->GetPrimaryVertex()->GetZv(), bfield, dca);
        // plotting the DCA calculated by Sergey 
-       esdTrackHLT->GetImpactParametersTPC(DCAr,DCAz);
+       //esdTrackHLT->GetImpactParametersTPC(DCAr,DCAz);
       }
       
       if(fBeamType.Contains("Pb")){
@@ -309,13 +319,13 @@ void AliAnalysisTaskHLTCentralBarrel::UserExec(Option_t *){
                                ,dca[0]                       
                                ,dca[1]                       
                                ,esdTrackHLT->Charge()        
-                               ,DCAr                         
-                               ,DCAz                         
+                               //,DCAr                       
+                               //,DCAz                       
                                ,esdTrackHLT->GetNcls(0)
                                ,nr_tracksHLT
                                ,vertHLT->GetStatus()
                                ,vertHLT->GetZ()
-                               ,cent->GetCentralityPercentile("V0M")
+                               ,fCentrality->GetCentralityPercentile("V0M")
                               };
         if(fOptions.Contains("track-hlt")) fTrackHLT->Fill(trackHLT);   
       } else {
@@ -328,8 +338,8 @@ void AliAnalysisTaskHLTCentralBarrel::UserExec(Option_t *){
                                ,dca[0]                       
                                ,dca[1]                       
                                ,esdTrackHLT->Charge()        
-                               ,DCAr                         
-                               ,DCAz                         
+                               //,DCAr                       
+                               //,DCAz                       
                                ,esdTrackHLT->GetNcls(0)
                                ,nr_tracksHLT
                                ,vertHLT->GetStatus()
@@ -337,7 +347,17 @@ void AliAnalysisTaskHLTCentralBarrel::UserExec(Option_t *){
                               };
         if(fOptions.Contains("track-hlt")) fTrackHLT->Fill(trackHLT);
       }   
-  }  // end of track loop             
+  }  // end of track loop  
+  
+  if(fBeamType.Contains("Pb")){
+     Double_t eventHLT[] = { vertHLT->GetX(), vertHLT->GetY(), vertHLT->GetZ(), vertHLT->GetNContributors(), nr_tracksHLT, vertHLT->GetStatus(),fCentrality->GetCentralityPercentile("V0M")};
+     if(fOptions.Contains("event-hlt")) fEventHLT->Fill(eventHLT);  
+  }
+  else{
+     Double_t eventHLT[] = { vertHLT->GetX(), vertHLT->GetY(), vertHLT->GetZ(), vertHLT->GetNContributors(), nr_tracksHLT, vertHLT->GetStatus()};
+     if(fOptions.Contains("event-hlt")) fEventHLT->Fill(eventHLT);
+  }
+             
   // Post output data.
   PostData(1, fOutputList);
 }
@@ -356,6 +376,7 @@ THnSparseF* AliAnalysisTaskHLTCentralBarrel::CreateEventTHnSparse(const char* na
   thn->GetAxis(3)->SetTitle("number of contributors");
   thn->GetAxis(4)->SetTitle("track multiplicity");
   thn->GetAxis(5)->SetTitle("vertex status"); 
+  if(fBeamType.Contains("Pb")) thn->GetAxis(6)->SetTitle("V0 centrality");
   return thn;
 }
 
@@ -371,9 +392,9 @@ THnSparseF* AliAnalysisTaskHLTCentralBarrel::CreateTrackTHnSparse(const char* na
   thn->GetAxis(5)->SetTitle("DCAr");
   thn->GetAxis(6)->SetTitle("DCAz");
   thn->GetAxis(7)->SetTitle("polarity");
-  thn->GetAxis(8)->SetTitle("DCArSG");
-  thn->GetAxis(9)->SetTitle("DCAzSG");
-  thn->GetAxis(10)->SetTitle("ITS clusters/track");  
+  //thn->GetAxis(8)->SetTitle("DCArSG");
+  //thn->GetAxis(9)->SetTitle("DCAzSG");
+  thn->GetAxis(8)->SetTitle("ITS clusters/track");  
   return thn;
 }
 
index e96d8d1..1028d70 100644 (file)
@@ -18,6 +18,7 @@ class TList;
 class TText;
 class TString;
 class AliESDEvent;
+class AliCentrality;
 
 #include "THnSparse.h"
 #include "AliAnalysisTaskSE.h"
@@ -37,8 +38,6 @@ class AliAnalysisTaskHLTCentralBarrel : public AliAnalysisTaskSE {
 
     // function to select only HLT triggered events
     //void SetUseHLTTriggerDecision(Bool_t useHLT = kFALSE) { fUseHLTTrigger = useHLT;        }
-    // function to select centrality
-    void SetUseCentrality(Bool_t useCentrality = kFALSE)  { fUseCentrality = useCentrality; }    
     // function to set the beam type
     void SetBeamType(TString beamType) {  fBeamType = beamType; }    
     // function to create the THnSparse and name the axis
@@ -57,9 +56,9 @@ class AliAnalysisTaskHLTCentralBarrel : public AliAnalysisTaskSE {
     /** assignment operator */
     AliAnalysisTaskHLTCentralBarrel& operator=(const AliAnalysisTaskHLTCentralBarrel&); 
                 
-    Bool_t fUseHLTTrigger;  // Use HLT Trigger Decision
-    Bool_t fUseCentrality;  // Include centrality
-    TString fBeamType;      // beam type, p-p, Pb-Pb, No beam
+    Bool_t fUseHLTTrigger;       // Use HLT Trigger Decision
+    AliCentrality *fCentrality;  // Centrality holder
+    TString fBeamType;           // beam type: p-p, Pb-Pb, No beam
     
     TList *fOutputList;  // list of output THnSparse objects
     
@@ -69,9 +68,8 @@ class AliAnalysisTaskHLTCentralBarrel : public AliAnalysisTaskSE {
     THnSparse *fTrackOFF; //! offline track properties
     THnSparse *fTrackHLT; //! HLT track properties
     
-    TString fOptions; //!
-
-    TText *fTextBox; //! TText box
+    TString fOptions; //! options for filling event and/or track properties for hlt and/or offline
+    TText *fTextBox; //! TText box containing run number info and date
     
     ClassDef(AliAnalysisTaskHLTCentralBarrel, 0);
 };
index 7da3aa1..3a3f6a2 100644 (file)
@@ -3,7 +3,7 @@
  * Drawing macro for reading the THnSparse output of the 
  * HLT/QA/tasks/AliAnalysisTaskHLTCentralBarrel.cxx task.
  * 
- * The cuts are user defined in lines 167-168 as arguments of the 
+ * The cuts are user defined in lines 188-190 as arguments of the 
  * function cutStsudies(...).
  * 
  * The input file contains information about the run number
 #include "TLegend.h"
 #include "TStyle.h"
 #include "TPad.h"
-
 #include <iostream>
-//#include <sstream>
 #include <cstdlib>
-
-//using std::stringstream;
 using std::endl;
 #endif
 
-
 //---------- forward declerations ---------------//
 
 TString cutStudies( TCanvas* can1, TCanvas* can2, TCanvas* can3, TString folder,
@@ -62,21 +57,24 @@ TString cutStudies( TCanvas* can1, TCanvas* can2, TCanvas* can3, TString folder,
                    double minDCAz,  double maxDCAz,
                    int minTPCclus,  int maxTPCclus,
                    int minITSclus,  int maxITSclus,
-                   int vertexStatus
+                   int vs,          float vz,
+                   float minCent,   float maxCent
                   );
 void printStats(TH1D *hlt, TH1D *off);
 void defineYaxisMax(TH1D *hlt, TH1D *off);
 void printLegend(TLegend *l, TH1D *hlt, TH1D *off);
-void plotAid(TCanvas* can, THnSparse* hHLT, THnSparse* hOFF, TText* hText, TH1D *hlt, TH1D *off, TLegend *l, int size);           
-void plot2D(TCanvas* can, THnSparse* h,
-            double minEta,    double maxEta,
-            double minPt,     double maxPt,
-           double minDCAr,   double maxDCAr,
-           double minDCAz,   double maxDCAz,
-           int minTPCclus,   int maxTPCclus,
-           int minITSclus,   int maxITSclus, 
-           int minTrackMult, int maxTrackMult
-           );
+void plotAid(TCanvas* can, THnSparse* hHLT, THnSparse* hOFF, TText* hText, TH1D *hlt, TH1D *off, TLegend *l);     
+void plot2D( TCanvas* can,     THnSparse* h,
+             double minEta,    double maxEta,
+             double minPt,     double maxPt,
+            double minDCAr,   double maxDCAr,
+            double minDCAz,   double maxDCAz,
+            int minTPCclus,   int maxTPCclus,
+            int minITSclus,   int maxITSclus, 
+            int minTrackMult, int maxTrackMult, 
+            int vs,           float vz,
+            float minCent,    float maxCent
+            );
 void plotEventQuantities(TCanvas* can, THnSparse* heventHLT, THnSparse* heventOFF, TText* hText);
 TString fix1DTitle(const char* c);
 TString fix2DTitle(const char* c1, const char* c2);
@@ -87,9 +85,10 @@ TString cutsToString( double minEta, double maxEta,
                      int minTPCclus,   int maxTPCclus,
                      int minITSclus,   int maxITSclus, 
                      int minTrackMult, int maxTrackMult,
-                     int VS
+                     int vs,           float vz
+                     //float minCent,    float maxCent
                    );
-void plotTrackQuantities( TCanvas* can, THnSparse* htrackHLT, THnSparse* htrackOFF, TText* hText,
+void plotTrackQuantities( TCanvas* can,     THnSparse* htrackHLT, THnSparse* htrackOFF, TText* hText,
                          double minEta,    double maxEta,
                          double minPt,     double maxPt,
                          double minDCAr,   double maxDCAr,
@@ -97,18 +96,20 @@ void plotTrackQuantities( TCanvas* can, THnSparse* htrackHLT, THnSparse* htrackO
                          int minTPCclus,   int maxTPCclus,
                          int minITSclus,   int maxITSclus, 
                          int minTrackMult, int maxTrackMult,
-                         int VS
+                         int vs,           float vz,
+                         float minCent,    float maxCent
                         );
                        
 vector<TString> outputNames;
 
 //------------------------------------------------------------------//         
                        
-void drawTHnSparse(TString inputFile){
+void drawTHnSparse(TString inputFile="HLT-OFFLINE-CentralBarrel-comparison.root"){
  
   gROOT->SetStyle("Plain");
   gStyle->SetPalette(1);
   gStyle->SetOptStat(10);
+  gStyle->SetTitleX(gStyle->GetPadLeftMargin());
   TH1::AddDirectory(kFALSE);
 
   TFile *file = TFile::Open(inputFile);
@@ -116,20 +117,20 @@ void drawTHnSparse(TString inputFile){
     printf("Error: No file %s in folder.\n", inputFile.Data());
     return;
   }
-
   TList *list = static_cast<TList*>(file->Get("esd_thnsparse"));
   if(!list){
     printf("Error: No List contained in file %s.\n", inputFile.Data());
     return;
   }
-
   THnSparseF *heventHLT = (THnSparseF*)list->FindObject("fEventHLT"); 
   if(!heventHLT){
       printf("Error: There is no HLT THnSparse object in file %s\n", inputFile.Data());
+      return;
   }
   THnSparseF *heventOFF = (THnSparseF*)list->FindObject("fEventOFF");  
   if(!heventOFF){
       printf("Error: There is no OFF THnSparse object in file %s\n", inputFile.Data());
+      return;
   } 
   THnSparseF *htrackHLT = (THnSparseF*)list->FindObject("fTrackHLT");
   if(!htrackHLT){
@@ -145,8 +146,6 @@ void drawTHnSparse(TString inputFile){
   TText *hText = (TText*)list->FindObject("text");
   if(!hText) printf("No hText\n");
   
-  TString t = "event properties for ";
-  t+=hText->GetTitle();
   
   TString folder = hText->GetTitle();
   folder.ReplaceAll(" ",""); 
@@ -154,65 +153,90 @@ void drawTHnSparse(TString inputFile){
   folder.Remove(6,15);
    
   gSystem->Exec("mkdir "+folder);
+  TString canvasTitle ="";
   
-  TCanvas *can0 = new TCanvas("can0",t,                            900,600); can0->Divide(3,2);  
-  TCanvas *can1 = new TCanvas("can1","track properties",          1100,900); can1->Divide(4,3);
-  TCanvas *can2 = new TCanvas("can2","2-D HLT track correlations",1200,800); can2->Divide(4,2);
-  TCanvas *can3 = new TCanvas("can3","2-D OFF track correlations",1200,800); can3->Divide(4,2);
-
-  plotEventQuantities(can0,heventHLT,heventOFF,hText);
-  can0->SaveAs(folder+"/event_properties.root");
-  can0->SaveAs(folder+"/event_properties.png");
-    
-  TString s = "";                                                       // eta   mult      pt     DCAr    DCAz    TPCclus ITSclus  vertexStatus
-  s = cutStudies(can1, can2, can3, folder, htrackHLT, htrackOFF, hText, -2, 2, 0, 20000, 0, 200, -20, 20, -20, 20,  0, 200, 0, 6, 2); outputNames.push_back(s); 
-  //s = cutStudies(can1, can2, can3, folder, htrackHLT, htrackOFF, hText, -2, 2, 0, 20000, 0, 200, -20, 20, -20, 20,  0, 200, 1, 6, 2); outputNames.push_back(s); 
-  
-  TCanvas *ov = new TCanvas("ov","overlaid histograms of track properties",1100,900);
-  ov->Divide(4,3);
-
-  TCanvas *ca[outputNames.size()]; 
-  TFile   *ff[outputNames.size()]; 
-  TPad    *pad[12]; 
-  TH1D    *g[outputNames.size()];
+  if(heventHLT->GetEntries()>0 || heventOFF->GetEntries()>0){ 
+     // create and fill the canvas only if the respective THnSparse with event properties has been filled     
+     canvasTitle = "event properties for ";
+     canvasTitle+=hText->GetTitle();     
+     TCanvas *can0 = new TCanvas("can0",canvasTitle, 900,600); 
+     can0->Divide(4,2); 
+     plotEventQuantities(can0,heventHLT,heventOFF,hText);
+     can0->SaveAs(folder+"/event_properties.root");
+     can0->SaveAs(folder+"/event_properties.png");
+  }
   
-  for(int j=1; j<12; j++){ // not 13, last pad is empty (TODO)        
-    for(UInt_t i=0; i<outputNames.size(); i++){  
-           
-        ff[i] = TFile::Open(outputNames[i].Data());   
-        if(!ff[i] || ff[i]->IsZombie()){
-           printf("Non-existent, corrupted or zombie file %s\n", outputNames[i].Data());
-           return;
-        } 
-        ca[i]  = (TCanvas*)ff[i]->GetObjectUnchecked("can1");              
-       if(!ca[i]){
-          printf("Empty canvas in file %s.\n", outputNames[i].Data());
-          continue;
-       }       
-        pad[j] = (TPad*)ca[i]->GetListOfPrimitives()->FindObject(Form("can1_%d",j));           
-        if(!pad[j]){
-           printf("Empty pad in canvas %s.\n", ca[i]->GetName());
-           continue;        
-        }
-        g[i] =(TH1D*)pad[j]->FindObject(Form("fTrackHLT_proj_%d",j-1));
-       if(!g[i]){
-          printf("Empty histogram for i=%d, file %s.\n", i, outputNames[i].Data());
-          continue;
-       }
+  if(htrackHLT->GetEntries()>0 || htrackOFF->GetEntries()>0){
+     // create and fill the canvas only if the respective THnSparse with track properties has been filled
+     canvasTitle = "track properties for ";
+     canvasTitle+=hText->GetTitle();     
+     TCanvas *can1 = new TCanvas("can1",canvasTitle,1100,900);                  can1->Divide(3,3); // the first 9 variables filled in the THnSparse
+     
+     canvasTitle = "2-D HLT track distributions for ";
+     canvasTitle+=hText->GetTitle();     
+     TCanvas *can2 = new TCanvas("can2",canvasTitle,1200,800); can2->Divide(4,2);
+   
+     canvasTitle = "2-D OFF track distributions for ";
+     canvasTitle+=hText->GetTitle();     
+     TCanvas *can3 = new TCanvas("can3",canvasTitle,1200,800); can3->Divide(4,2);
+     
+     int counter=0; 
+     // counts how many times the function cutStudies() is called
+     // if more than once, then it creates and fills the canvas with the overlapping hlt distributions for the various sets of cuts
+     
+     TString s = "";                                                       // eta   mult    pt     DCAr     DCAz    TPCclus  ITSclus  vertexStatus   vertexZ    
+     s = cutStudies(can1, can2, can3, folder, htrackHLT, htrackOFF, hText, -1, 1, 0, 2000, 0,  5, -10, 10, -10, 10,  0, 200, 0, 6,       2,         10, 0, 100); outputNames.push_back(s); counter++;
+            
+     if(counter>=2){     
         
-        ov->cd(j);     
-        if(i==0) g[i]->Draw();
-        else { 
-         g[i]->SetLineColor(i+1); 
-         defineYaxisMax(g[0], g[i]);
-         g[i]->Draw("sames");
-       }
-       ff[i]->Close();                                  
-    }
-  }  
+       canvasTitle = "overlaid HLT track distributions for ";
+        canvasTitle+=hText->GetTitle();
+        TCanvas *ov = new TCanvas("ov",canvasTitle,1100,900);
+       ov->Divide(3,3);
+
+       TCanvas *ca; TFile *ff; TPad *pad; 
+       TH1D *g[outputNames.size()];
+       
+       for(int j=1; j<10; j++){// loop over the pads of the canvas "ov" with dimension 3x3     
+         for(UInt_t i=0; i<outputNames.size(); i++){   // loop over the files with different sets of cuts
+                
+             ff = TFile::Open(outputNames[i].Data());   
+             if(!ff || ff->IsZombie()){
+                printf("Non-existent, corrupted or zombie file %s\n", outputNames[i].Data());
+                return;
+             } 
+             ca  = (TCanvas*)ff->GetObjectUnchecked("can1");             
+             if(!ca){
+                printf("Empty canvas in file %s.\n", outputNames[i].Data());
+                continue;
+             }       
+             pad = (TPad*)ca->GetListOfPrimitives()->FindObject(Form("can1_%d",j));          
+             if(!pad){
+                printf("Empty pad in canvas %s.\n", ca->GetName());
+                continue;         
+             }
+             g[i] =(TH1D*)pad->FindObject(Form("fTrackHLT_proj_%d",j-1));
+             if(!g[i]){
+                printf("Empty histogram for i=%d, file %s.\n", i, outputNames[i].Data());
+                continue;
+             }
+             ov->cd(j);      
+             if(i==0) g[i]->Draw();
+             else { 
+               g[i]->SetLineColor(i+1); 
+               defineYaxisMax(g[0], g[i]);
+               g[i]->Draw("sames");
+             }
+             ff->Close();                                     
+         }
+       }  
+     }
+  } 
   file->Close();  
 }
 
+// ============== main function for filling the track properties, 1D and 2D ================ //
+
 TString cutStudies( TCanvas* can1, TCanvas* can2, TCanvas* can3, TString folder,
                     THnSparse* htrackHLT, THnSparse* htrackOFF, TText* hText,
                    double minEta,   double maxEta,
@@ -222,18 +246,20 @@ TString cutStudies( TCanvas* can1, TCanvas* can2, TCanvas* can3, TString folder,
                    double minDCAz,  double maxDCAz,
                    int minTPCclus,  int maxTPCclus,
                    int minITSclus,  int maxITSclus,
-                   int vertexStatus
-                  )
-{
+                   int vs,          float vz,
+                   float minCent,   float maxCent
+                  ){
   plotTrackQuantities(can1, htrackHLT, htrackOFF, hText, 
-                      minEta, maxEta, minPt, maxPt, minDCAr, maxDCAr, minDCAz, maxDCAz, minTPCclus, maxTPCclus, minITSclus, maxITSclus, minTrackMult, maxTrackMult, vertexStatus);
+                      minEta, maxEta, minPt, maxPt, minDCAr, maxDCAr, minDCAz, maxDCAz, minTPCclus, maxTPCclus, minITSclus, maxITSclus, minTrackMult, maxTrackMult, vs, vz,
+                     minCent, maxCent);
   
-  plot2D(can2, htrackHLT, minEta, maxEta, minPt, maxPt, minDCAr, maxDCAr, minDCAz, maxDCAz, minTPCclus, maxTPCclus, minITSclus, maxITSclus, minTrackMult, maxTrackMult);
-  
-  plot2D(can3, htrackOFF, minEta, maxEta, minPt, maxPt, minDCAr, maxDCAr, minDCAz, maxDCAz, minTPCclus, maxTPCclus, minITSclus, maxITSclus, minTrackMult, maxTrackMult);
+  plot2D(can2, htrackHLT, minEta, maxEta, minPt, maxPt, minDCAr, maxDCAr, minDCAz, maxDCAz, minTPCclus, maxTPCclus, minITSclus, maxITSclus, minTrackMult, maxTrackMult, vs, vz,
+         minCent, maxCent);  
+  plot2D(can3, htrackOFF, minEta, maxEta, minPt, maxPt, minDCAr, maxDCAr, minDCAz, maxDCAz, minTPCclus, maxTPCclus, minITSclus, maxITSclus, minTrackMult, maxTrackMult, vs, vz,
+         minCent, maxCent);
   
   TString cuts = cutsToString(minEta, maxEta, minPt, maxPt, minDCAr, maxDCAr, minDCAz, maxDCAz, minTPCclus, maxTPCclus, 
-                              minITSclus, maxITSclus, minTrackMult, maxTrackMult, vertexStatus);
+                              minITSclus, maxITSclus, minTrackMult, maxTrackMult, vs, vz);
 
   can1->SaveAs(folder+"/track_properties_"+cuts+".root");
   can1->SaveAs(folder+"/track_properties_"+cuts+".png");  
@@ -245,35 +271,7 @@ TString cutStudies( TCanvas* can1, TCanvas* can2, TCanvas* can3, TString folder,
   return folder+"/track_properties_"+cuts+".root";
 }
 
-void printStats(TH1D *hlt, TH1D *off){  
-  gPad->Update();
-  TPaveStats *st1 = (TPaveStats*)hlt->FindObject("stats");
-  st1->SetLineColor(0);
-
-  gPad->Update();
-  TPaveStats *st2 = (TPaveStats*)off->FindObject("stats");
-  st2->SetY2NDC(st1->GetY1NDC()-0.05);
-  st2->SetY1NDC(st2->GetY2NDC()-TMath::Abs(st1->GetY1NDC()-st1->GetY2NDC()));
-  st2->SetLineColor(0);
-  st2->SetTextColor(off->GetLineColor());
-  st2->SetFillStyle(0);
-  st2->Draw();
-}
-
-void defineYaxisMax(TH1D *hlt, TH1D *off){ 
-  if(hlt->GetMaximum() > off->GetMaximum()) off->SetMaximum(1.1*hlt->GetMaximum());
-  else hlt->SetMaximum(1.1*off->GetMaximum());
-}
-
-void printLegend(TLegend *l, TH1D *hlt, TH1D *off){  
-  l->SetFillColor(10); 
-  l->SetLineColor(10);
-  l->AddEntry(hlt, "HLT", "l");
-  l->AddEntry(off, "OFF", "l");
-  l->Draw("same");
-}
-
-//====================== for 1D distributions ===============================//
+//====================== for 1D track distributions ===============================//
 
 void plotAid(TCanvas* can, THnSparse* hHLT, THnSparse* hOFF, TText* /*hText*/, TH1D *hlt, TH1D *off, TLegend *l, int size,
              double minEta,    double maxEta,
@@ -283,7 +281,8 @@ void plotAid(TCanvas* can, THnSparse* hHLT, THnSparse* hOFF, TText* /*hText*/, T
             int minTPCclus,   int maxTPCclus,
             int minITSclus,   int maxITSclus, 
             int minTrackMult, int maxTrackMult,
-            int VS
+            int vs,           float vz,
+            float minCent,    float maxCent
            )
 {     
    hHLT->GetAxis(0)->SetRangeUser(minPt,maxPt);
@@ -291,23 +290,27 @@ void plotAid(TCanvas* can, THnSparse* hHLT, THnSparse* hOFF, TText* /*hText*/, T
    hHLT->GetAxis(3)->SetRangeUser(minEta, maxEta);
    hHLT->GetAxis(5)->SetRangeUser(minDCAr, maxDCAr);
    hHLT->GetAxis(6)->SetRangeUser(minDCAz, maxDCAz);
-   hHLT->GetAxis(10)->SetRangeUser(minITSclus, maxITSclus);
-   hHLT->GetAxis(11)->SetRangeUser(minTrackMult, maxTrackMult);
-   if(VS!=2) hHLT->GetAxis(12)->SetRangeUser(VS,VS);
+   hHLT->GetAxis(8)->SetRangeUser(minITSclus, maxITSclus);
+   hHLT->GetAxis(9)->SetRangeUser(minTrackMult, maxTrackMult);
+   if(vs!=2) hHLT->GetAxis(10)->SetRangeUser(vs,vs);
+   hHLT->GetAxis(11)->SetRangeUser(-TMath::Abs(vz), TMath::Abs(vz));
+   if(hHLT->GetNdimensions()==13) hHLT->GetAxis(12)->SetRangeUser(minCent, maxCent);
    
    hOFF->GetAxis(0)->SetRangeUser(minPt,maxPt);
    hOFF->GetAxis(1)->SetRangeUser(minTPCclus,maxTPCclus);
    hOFF->GetAxis(3)->SetRangeUser(minEta, maxEta);
    hOFF->GetAxis(5)->SetRangeUser(minDCAr, maxDCAr);
    hOFF->GetAxis(6)->SetRangeUser(minDCAz, maxDCAz);
-   hOFF->GetAxis(10)->SetRangeUser(minITSclus, maxITSclus);
-   hOFF->GetAxis(11)->SetRangeUser(minTrackMult, maxTrackMult);
-   if(VS!=2) hOFF->GetAxis(12)->SetRangeUser(VS,VS);
+   hOFF->GetAxis(8)->SetRangeUser(minITSclus, maxITSclus);
+   hOFF->GetAxis(9)->SetRangeUser(minTrackMult, maxTrackMult);
+   if(vs!=2) hOFF->GetAxis(10)->SetRangeUser(vs,vs);
+   hOFF->GetAxis(11)->SetRangeUser(-TMath::Abs(vz), TMath::Abs(vz));
+   if(hOFF->GetNdimensions()==13) hOFF->GetAxis(12)->SetRangeUser(minCent, maxCent);
        
    for(int i=0; i<size; i++){
   
-      hlt = hHLT->Projection(i); if(!hlt){ printf("plotAid: empty HLT histogram\n"); continue; }
-      off = hOFF->Projection(i); if(!off){ printf("plotAid: empty OFF histogram\n"); continue; }
+      hlt = hHLT->Projection(i); if(!hlt){ printf("plotAid for track properties: empty HLT histogram\n"); continue; }
+      off = hOFF->Projection(i); if(!off){ printf("plotAid for track properties: empty OFF histogram\n"); continue; }
       
       hlt->SetTitle(fix1DTitle(hHLT->Projection(i)->GetTitle())); 
    
@@ -346,23 +349,25 @@ void plotAid(TCanvas* can, THnSparse* hHLT, THnSparse* hOFF, TText* /*hText*/, T
         s=""; s+=minDCAz; s+=" < DCAz (cm) < "; s+=maxDCAz; pave->AddText(s);
         s=""; s+=minTPCclus; s+=" < TPC clusters/track < "; s+=maxTPCclus; pave->AddText(s);
         s=""; s+=minITSclus; s+=" < ITS clusters/track < "; s+=maxITSclus; pave->AddText(s);
-        if(VS!=2) { s=""; s+="vertex status "; s+=VS; pave->AddText(s); }
+        if(vs!=2) { s=""; s+="vertex status "; s+=vs; pave->AddText(s); }
         pave->Draw();
         can->Update();
       }      
    } 
 }
 
-//====================== for 2D distributions ===============================//
+//====================== for 2D track distributions ===============================//
 
-void plot2D(TCanvas* can, THnSparse* h,
+void plot2D(TCanvas* can,     THnSparse* h,
             double minEta,    double maxEta,
             double minPt,     double maxPt,
            double minDCAr,   double maxDCAr,
            double minDCAz,   double maxDCAz,
            int minTPCclus,   int maxTPCclus,
            int minITSclus,   int maxITSclus, 
-           int minTrackMult, int maxTrackMult
+           int minTrackMult, int maxTrackMult,
+           int vs,           float vz,
+           float minCent,    float maxCent
            )
 {
   h->GetAxis(0)->SetRangeUser(minPt,maxPt);
@@ -370,11 +375,14 @@ void plot2D(TCanvas* can, THnSparse* h,
   h->GetAxis(3)->SetRangeUser(minEta, maxEta);
   h->GetAxis(5)->SetRangeUser(minDCAr, maxDCAr);
   h->GetAxis(6)->SetRangeUser(minDCAz, maxDCAz);
-  h->GetAxis(10)->SetRangeUser(minITSclus, maxITSclus);
-  h->GetAxis(11)->SetRangeUser(minTrackMult, maxTrackMult);
+  h->GetAxis(8)->SetRangeUser(minITSclus, maxITSclus);
+  h->GetAxis(9)->SetRangeUser(minTrackMult, maxTrackMult);
+  if(vs!=2) h->GetAxis(10)->SetRangeUser(vs,vs);
+  h->GetAxis(11)->SetRangeUser(-TMath::Abs(vz), TMath::Abs(vz));
+  if(h->GetNdimensions()==13) h->GetAxis(12)->SetRangeUser(minCent, maxCent);
   
   can->cd(1);    
-  TH2D *ht = h->Projection(1,0);
+  TH2D *ht = h->Projection(1,0); // TPC clusters/track vs. pt
   ht->SetTitle(fix2DTitle(h->Projection(1)->GetTitle(), h->Projection(0)->GetTitle()));
 
   TString s = "";
@@ -383,77 +391,99 @@ void plot2D(TCanvas* can, THnSparse* h,
   ht->Draw("colz");
   
   can->cd(2);
-  ht = h->Projection(1,3);
+  ht = h->Projection(1,3); // TPC clusters/track vs. eta
   ht->SetTitle(fix2DTitle(h->Projection(1)->GetTitle(), h->Projection(3)->GetTitle()));
   ht->Draw("colz");
   
   can->cd(3);
-  ht = h->Projection(1,5);
+  ht = h->Projection(1,5); // TPC clusters/track vs. DCAr
   ht->SetTitle(fix2DTitle(h->Projection(1)->GetTitle(), h->Projection(5)->GetTitle()));
   s = fix1DTitle(h->Projection(5)->GetTitle())+" (cm)";
   ht->SetXTitle(s);
   ht->Draw("colz");
   
   can->cd(4);
-  ht = h->Projection(1,6);
+  ht = h->Projection(1,6); // TPC clusters/track vs. DCAz
   ht->SetTitle(fix2DTitle(h->Projection(1)->GetTitle(), h->Projection(6)->GetTitle()));
   s = fix1DTitle(h->Projection(6)->GetTitle())+" (cm)";
   ht->SetXTitle(s);
   ht->Draw("colz");
   
   can->cd(5);
-  ht = h->Projection(6,0);
-  ht->SetTitle(fix2DTitle(h->Projection(6)->GetTitle(), h->Projection(0)->GetTitle()));
+  ht = h->Projection(5,0); // DCAr vs. pt
+  ht->SetTitle(fix2DTitle(h->Projection(5)->GetTitle(), h->Projection(0)->GetTitle()));
   s = fix1DTitle(h->Projection(0)->GetTitle())+" (GeV/c)";
   ht->SetXTitle(s);
-  s = fix1DTitle(h->Projection(6)->GetTitle())+" (cm)";
+  s = fix1DTitle(h->Projection(5)->GetTitle())+" (cm)";
   ht->SetYTitle(s);
   ht->Draw("colz");
   
   can->cd(6);
-  ht = h->Projection(6,3);
+  ht = h->Projection(6,3); // DCAz vs. pt
   ht->SetTitle(fix2DTitle(h->Projection(6)->GetTitle(), h->Projection(3)->GetTitle()));
   s = fix1DTitle(h->Projection(6)->GetTitle())+" (cm)";
   ht->SetYTitle(s);
   ht->Draw("colz");
   
   can->cd(7);
-  ht = h->Projection(3,0);
+  ht = h->Projection(3,0); // eta vs. pt
   ht->SetTitle(fix2DTitle(h->Projection(3)->GetTitle(), h->Projection(0)->GetTitle()));
   s = fix1DTitle(h->Projection(0)->GetTitle())+" (GeV/c)";
   ht->SetXTitle(s);
   ht->Draw("colz");
   
   can->cd(8);
-  ht = h->Projection(3,4);
+  ht = h->Projection(3,4); // eta vs. phi
   ht->SetTitle(fix2DTitle(h->Projection(3)->GetTitle(), h->Projection(4)->GetTitle()));
   s = fix1DTitle(h->Projection(4)->GetTitle())+" (rad)";
   ht->SetXTitle(s);
   ht->Draw("colz"); 
 }
 
-void plotAid(TCanvas* can, THnSparse* hHLT, THnSparse* hOFF, TText* /*hText*/, TH1D *hlt, TH1D *off, TLegend *l, int size){
-  for(int i=0; i<size; i++){         
-      hlt = hHLT->Projection(i);
-      off = hOFF->Projection(i); 
-      hlt->SetTitle(fix1DTitle(hHLT->Projection(i)->GetTitle()));      
-      TString s = hlt->GetTitle();      
-      if(s.Contains("primary")){ 
-         s+=" (cm)";
-        hlt->SetXTitle(s);     
-      }
+// ================== for event properties ==================== //
+
+void plotAid(TCanvas* can, THnSparse* hHLT, THnSparse* hOFF, TText* /*hText*/, TH1D *hlt, TH1D *off, TLegend *l){
+      
+  int size=0;
+  if(hHLT->GetNdimensions()==6 || hOFF->GetNdimensions()==6) size = 6;
+  else size = 7; 
+  for(int i=0; i<size; i++){ 
+  
+     hHLT->GetAxis(5)->SetRangeUser(1,1); // select events with found primary vertex       
+     hOFF->GetAxis(5)->SetRangeUser(1,1);
      
-      defineYaxisMax(hlt, off);
-      off->SetLineColor(2);
+     hlt = hHLT->Projection(i); if(!hlt){ printf("plotAid for event properties: empty HLT histogram\n"); continue; }
+     off = hOFF->Projection(i); if(!off){ printf("plotAid for event properties: empty OFF histogram\n"); continue; }
+     hlt->SetTitle(fix1DTitle(hHLT->Projection(i)->GetTitle()));      
+     off->SetTitle(fix1DTitle(hOFF->Projection(i)->GetTitle()));      
+     TString s = hlt->GetTitle();      
+     if(s.Contains("primary")){ 
+       s+=" (cm)";
+        hlt->SetXTitle(s); 
+        off->SetXTitle(s);    
+     }
+    
+     defineYaxisMax(hlt, off);
+     off->SetLineColor(2);
+    
+     can->cd(i+1);
+     hlt->Draw();
+     off->Draw("sames");
+     printStats(hlt, off);
      
-      can->cd(i+1);
-      hlt->Draw();
-      off->Draw("sames");
-      printStats(hlt, off);
-      
-      if(i==0) printLegend(l,hlt,off);
-   } 
+     if(i==0) printLegend(l,hlt,off);
+  } 
+  can->cd(7);
+  TH2D *h = hHLT->Projection(3,4);
+  TString s1 = fix2DTitle(hHLT->Projection(3)->GetTitle(), hHLT->Projection(4)->GetTitle()); s1+=" (HLT)";
+  h->SetTitle(s1);
+  h->Draw("colz");
+  can->cd(8);
+  TH2D *o = hOFF->Projection(3,4);
+  TString s2 = fix2DTitle(hOFF->Projection(3)->GetTitle(), hOFF->Projection(4)->GetTitle()); s2+=" (OFF)";
+  o->SetTitle(s2);
+  o->Draw("colz");
 }
 
 void plotEventQuantities(TCanvas* can, THnSparse* heventHLT, THnSparse* heventOFF, TText* hText){
@@ -463,7 +493,7 @@ void plotEventQuantities(TCanvas* can, THnSparse* heventHLT, THnSparse* heventOF
  
   TLegend *leg1 = new TLegend(0.6,0.6,0.8,0.8);
  
-  plotAid(can, heventHLT, heventOFF, hText, hlt, off, leg1, 6);  
+  plotAid(can, heventHLT, heventOFF, hText, hlt, off, leg1);  
   return;
 }
 
@@ -475,15 +505,17 @@ void plotTrackQuantities( TCanvas* can, THnSparse* htrackHLT, THnSparse* htrackO
                          int minTPCclus,   int maxTPCclus,
                          int minITSclus,   int maxITSclus, 
                          int minTrackMult, int maxTrackMult,
-                         int VS
+                         int vs,           float vz,
+                         float minCent,    float maxCent
                         )
 {
   TH1D *hlt = NULL;
   TH1D *off = NULL;
  
   TLegend *leg1 = new TLegend(0.6,0.6,0.8,0.8);
-  plotAid(can, htrackHLT, htrackOFF, hText, hlt, off, leg1, 11, 
-          minEta, maxEta, minPt, maxPt, minDCAr, maxDCAr, minDCAz, maxDCAz, minTPCclus, maxTPCclus, minITSclus, maxITSclus, minTrackMult, maxTrackMult, VS);  
+    
+  plotAid(can, htrackHLT, htrackOFF, hText, hlt, off, leg1, 9, 
+          minEta, maxEta, minPt, maxPt, minDCAr, maxDCAr, minDCAz, maxDCAz, minTPCclus, maxTPCclus, minITSclus, maxITSclus, minTrackMult, maxTrackMult, vs, vz, minCent, maxCent);  
   return;
 }
 
@@ -505,18 +537,47 @@ TString cutsToString( double minEta,      double maxEta,
                      int minTPCclus,   int maxTPCclus,
                      int minITSclus,   int maxITSclus, 
                      int minTrackMult, int maxTrackMult,
-                     int VS
+                     int vs,           float vz
+//                   float minCent,    float maxCent
                    )
 {
   TString cuts = "";
-  char s[300]; sprintf(s, "eta%2g_%2g_Pt%2g_%2g_TM%d_%d_DCAr%2g_%2g_DCAz%2g_%2g_TPCclus%d_%d_ITSclus%d_%d", 
-                           minEta,maxEta,minPt,maxPt,minTrackMult,maxTrackMult,minDCAr,maxDCAr,minDCAz,maxDCAz,minTPCclus,maxTPCclus,minITSclus,maxITSclus);
+  char s[300]; sprintf(s, "eta%2g_%2g_Pt%2g_%2g_TM%d_%d_DCAr%2g_%2g_DCAz%2g_%2g_TPCclus%d_%d_ITSclus%d_%d_Zvertex%2g", 
+                           minEta,maxEta,minPt,maxPt,minTrackMult,maxTrackMult,minDCAr,maxDCAr,minDCAz,maxDCAz,minTPCclus,maxTPCclus,minITSclus,maxITSclus,vz);
   cuts = s; cuts.ReplaceAll(" ","");
  
-  if(VS!=2){
+  if(vs!=2){
     char v[10]; 
-    sprintf(v, "_VS%d",VS);
+    sprintf(v, "_VS%d",vs);
     cuts+=v;
   }
   return cuts;
 }
+
+void printStats(TH1D *hlt, TH1D *off){  
+  gPad->Update();
+  TPaveStats *st1 = (TPaveStats*)hlt->FindObject("stats");
+  st1->SetLineColor(0);
+
+  gPad->Update();
+  TPaveStats *st2 = (TPaveStats*)off->FindObject("stats");
+  st2->SetY2NDC(st1->GetY1NDC()-0.05);
+  st2->SetY1NDC(st2->GetY2NDC()-TMath::Abs(st1->GetY1NDC()-st1->GetY2NDC()));
+  st2->SetLineColor(0);
+  st2->SetTextColor(off->GetLineColor());
+  st2->SetFillStyle(0);
+  st2->Draw();
+}
+
+void defineYaxisMax(TH1D *hlt, TH1D *off){ 
+  if(hlt->GetMaximum() > off->GetMaximum()) off->SetMaximum(1.1*hlt->GetMaximum());
+  else hlt->SetMaximum(1.1*off->GetMaximum());
+}
+
+void printLegend(TLegend *l, TH1D *hlt, TH1D *off){  
+  l->SetFillColor(10); 
+  l->SetLineColor(10);
+  l->AddEntry(hlt, "HLT", "l");
+  l->AddEntry(off, "OFF", "l");
+  l->Draw("same");
+}