]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWG4/PartCorrBase/AliAnaPartCorrBaseClass.cxx
add method to get centrality of the event for a given centrality class, use it in...
[u/mrichter/AliRoot.git] / PWG4 / PartCorrBase / AliAnaPartCorrBaseClass.cxx
index 46c6f45c501484e73d6bac79cc720875695322b2..640a6a7fc23ee53b96d18c0581ea81c08738147d 100755 (executable)
@@ -18,6 +18,7 @@
 // Base class for analysis algorithms
 //-- Author: Gustavo Conesa (LNF-INFN) 
 //_________________________________________________________________________
+// --Yaxian Mao: Add the possibality for event selection analysis based on vertex and multiplicity bins (10/10/2010)
   
 
 // --- ROOT system ---
 //---- AliRoot system ----
 #include "AliAnaPartCorrBaseClass.h"
 #include "AliCaloTrackReader.h"
+#include "AliCalorimeterUtils.h"
 #include "AliCaloPID.h"
 #include "AliFiducialCut.h"
 #include "AliIsolationCut.h"
 #include "AliMCAnalysisUtils.h"
 #include "AliNeutralMesonSelection.h"
-#include "AliAODCaloCells.h" 
+#include "AliVCaloCells.h" 
 #include "AliAODEvent.h"
 #include "AliAODHandler.h"
 #include "AliAnalysisManager.h"
+#include "AliAODPWG4Particle.h"
 
 ClassImp(AliAnaPartCorrBaseClass)
   
@@ -44,140 +47,57 @@ ClassImp(AliAnaPartCorrBaseClass)
   AliAnaPartCorrBaseClass::AliAnaPartCorrBaseClass() : 
     TObject(), fDataMC(0), fDebug(0), fCheckFidCut(0),
     fCheckCaloPID(0), fRecalculateCaloPID(0), fMinPt(0), fMaxPt(0),
+    fMultiBin(0),fNZvertBin(0),fNrpBin(0),fZvtxCut(0.), fMaxMulti(0),fMinMulti(0),
+    fUseSelectEvent(kFALSE), fMakePlots(kFALSE),
     fReader(0x0), fInputAODBranch(0x0), fInputAODName(""),
     fOutputAODBranch(0x0), fNewAOD(kFALSE),
     fOutputAODName(""), fOutputAODClassName(""),
     fAODObjArrayName(""), fAddToHistogramsName(""),
-    fAODCaloCells(0x0),//fAODCaloClusters(0x0),  
+    fCentralityClass("V0M"),fCentralityOpt(10),
     fCaloPID(0x0), fFidCut(0x0), fIC(0x0),fMCUtils(0x0), fNMS(0x0),
+    fCaloUtils(0x0),
     fHistoPtBins(0),   fHistoPtMax(0.),   fHistoPtMin(0.),
     fHistoPhiBins(0),  fHistoPhiMax(0.),  fHistoPhiMin(0.),
     fHistoEtaBins(0),  fHistoEtaMax(0.),  fHistoEtaMin(0.),
     fHistoMassBins(0), fHistoMassMax(0.), fHistoMassMin(0.),
-       fHistoAsymBins(0), fHistoAsymMax(0.), fHistoAsymMin(0.)
+    fHistoAsymBins(0), fHistoAsymMax(0.), fHistoAsymMin(0.),
+    fHistoV0SBins(0),  fHistoV0SMax(0),   fHistoV0SMin(0),
+    fHistoV0MBins(0),  fHistoV0MMax(0),   fHistoV0MMin(0),
+    fHistoTrMBins(0),  fHistoTrMMax(0),   fHistoTrMMin(0)
 {
   //Default Ctor
-  
-  fReader  = new AliCaloTrackReader();
-  fCaloPID = new AliCaloPID();
-  fFidCut  = new AliFiducialCut();
-  fIC      = new AliIsolationCut();
-  fMCUtils = new AliMCAnalysisUtils();
-  
+    
   //Initialize parameters
   InitParameters();
 }
 
-//___________________________________________________________
-AliAnaPartCorrBaseClass::AliAnaPartCorrBaseClass(const AliAnaPartCorrBaseClass & abc) :   
-  TObject(), fDataMC(abc.fDataMC), fDebug(abc.fDebug),
-  fCheckFidCut(abc.fCheckFidCut),  fCheckCaloPID(abc. fCheckCaloPID),
-  fRecalculateCaloPID(abc.fRecalculateCaloPID),
-  fMinPt(abc.fMinPt), fMaxPt(abc.fMaxPt), fReader(abc.fReader),  
-  fInputAODBranch(new TClonesArray(*abc.fInputAODBranch)), fInputAODName(abc.fInputAODName),
-  fOutputAODBranch(new TClonesArray(*abc.fOutputAODBranch)),fNewAOD(abc.fNewAOD), 
-  fOutputAODName(abc.fOutputAODName), fOutputAODClassName(abc.fOutputAODClassName),
-  fAODObjArrayName(abc.fAODObjArrayName),
-  fAddToHistogramsName(abc.fAddToHistogramsName),
-  //fAODCaloClusters(new TClonesArray(*abc.fAODCaloClusters)),
-  fAODCaloCells(new AliAODCaloCells(*abc.fAODCaloCells)),
-  fCaloPID(abc.fCaloPID), fFidCut(abc.fFidCut), fIC(abc.fIC),fMCUtils(abc.fMCUtils), fNMS(abc.fNMS),
-  fHistoPtBins(abc.fHistoPtBins),     fHistoPtMax(abc.fHistoPtMax),     fHistoPtMin(abc.fHistoPtMin),
-  fHistoPhiBins(abc.fHistoPhiBins),   fHistoPhiMax(abc.fHistoPhiMax),   fHistoPhiMin(abc.fHistoPhiMin),
-  fHistoEtaBins(abc.fHistoEtaBins),   fHistoEtaMax(abc.fHistoEtaMax),   fHistoEtaMin(abc.fHistoEtaMin),
-  fHistoMassBins(abc.fHistoMassBins), fHistoMassMax(abc.fHistoMassMax), fHistoMassMin(abc.fHistoMassMin),
-  fHistoAsymBins(abc.fHistoAsymBins), fHistoAsymMax(abc.fHistoAsymMax), fHistoAsymMin(abc.fHistoAsymMin)
-{
-  // cpy ctor
-  
-}
-
-//_________________________________________________________________________
-AliAnaPartCorrBaseClass & AliAnaPartCorrBaseClass::operator = (const AliAnaPartCorrBaseClass & abc)
-{
-  // assignment operator
-  
-  if(this == &abc) return *this;
-  ((TObject *)this)->operator=(abc);
-  
-  fDataMC             = abc.fDataMC;
-  fDebug              = abc.fDebug ;
-  fRecalculateCaloPID = abc.fRecalculateCaloPID ;
-  fCheckCaloPID       = abc.fCheckCaloPID ;
-  fCheckFidCut        = abc.fCheckFidCut ; 
-       
-  fReader             = abc.fReader ;
-  //fAODCaloClusters   = new TClonesArray(*abc.fAODCaloClusters) ;
-  fAODCaloCells      = new AliAODCaloCells(*abc.fAODCaloCells) ;
-  
-  fMinPt   = abc.fMinPt;
-  fMaxPt   = abc.fMaxPt;
-  fCaloPID = abc.fCaloPID;  
-  fFidCut  = abc.fFidCut;
-  fIC      = abc.fIC;
-  fMCUtils = abc.fMCUtils;
-  fNMS     = abc.fNMS;
-  
-  fInputAODBranch      = new TClonesArray(*abc.fInputAODBranch) ;
-  fInputAODName        = abc.fInputAODName;
-  fOutputAODBranch     = new TClonesArray(*abc.fOutputAODBranch) ;
-  fNewAOD              = abc.fNewAOD ; 
-  fOutputAODName       = abc.fOutputAODName; 
-  fOutputAODClassName  = abc.fOutputAODClassName;
-  fAddToHistogramsName = abc.fAddToHistogramsName;
-  fAODObjArrayName     = abc.fAODObjArrayName;
-
-  fHistoPtBins  = abc.fHistoPtBins;  fHistoPtMax  = abc.fHistoPtMax;  fHistoPtMin  = abc.fHistoPtMin;
-  fHistoPhiBins = abc.fHistoPhiBins; fHistoPhiMax = abc.fHistoPhiMax; fHistoPhiMin = abc.fHistoPhiMin;
-  fHistoEtaBins = abc.fHistoEtaBins; fHistoEtaMax = abc.fHistoEtaMax; fHistoEtaMin = abc.fHistoEtaMin;
-  
-  return *this;
-  
-}
-
 //____________________________________________________________________________
 AliAnaPartCorrBaseClass::~AliAnaPartCorrBaseClass() 
 {
   // Remove all pointers except analysis output pointers.
-       
-  if(fOutputAODBranch){
-    fOutputAODBranch->Clear() ; 
-    delete fOutputAODBranch ;
-  }
-  
-  if(fInputAODBranch){
-    fInputAODBranch->Clear() ; 
-    delete fInputAODBranch ;
-  }
+//printf("---Delete analysis %s\n", fAODObjArrayName.Data());
+  // Not sure if it should be me who deletes the delta AOD branches.
+//  if(fOutputAODBranch){
+//    fOutputAODBranch->Clear() ; 
+//    delete fOutputAODBranch ;
+//  }
+//  
+//  if(fInputAODBranch){
+//    fInputAODBranch->Clear() ; 
+//    delete fInputAODBranch ;
+//  }
   
-//     if(fAODCaloClusters){
-//             fAODCaloClusters->Clear() ; 
-//             delete fAODCaloClusters ;
-//     }
+  //if(fCaloUtils)    delete fCaloUtils ; //Already deleted in maker
+  //if(fReader)       delete fReader ;    //Already deleted in maker
        
-  if(fAODCaloCells){
-    fAODCaloCells->Clear() ; 
-    delete fAODCaloCells ;
-  }
-  
-  if(fReader)  delete fReader ;
-  if(fCaloPID) delete fCaloPID ;
-  if(fFidCut)  delete fFidCut ;
-  if(fIC)      delete fIC ;
-  if(fMCUtils) delete fMCUtils ;
-  if(fNMS)     delete fNMS ;
-  
-}
-
-////____________________________________________________________________________
-//void AliAnaPartCorrBaseClass::AddAODCaloCluster(AliAODCaloCluster calo) {
-//  //Put AOD calo cluster in the CaloClusters array
-//
-//  Int_t i = fAODCaloClusters->GetEntriesFast();
-//  new((*fAODCaloClusters)[i])  AliAODCaloCluster(calo);
-//
-//}
+  if(fCaloPID)   delete fCaloPID ;
+  if(fFidCut)    delete fFidCut ;
+  if(fIC)        delete fIC ;
+  if(fMCUtils)   delete fMCUtils ;
+  if(fNMS)       delete fNMS ;
 
+  //   printf("--- analysis deleted \n");
+}
 
 //____________________________________________________________________________
 void AliAnaPartCorrBaseClass::AddAODParticle(AliAODPWG4Particle pc) {
@@ -204,83 +124,147 @@ void AliAnaPartCorrBaseClass::AddAODParticle(AliAODPWG4Particle pc) {
 
 }      
 
-
-//___________________________________________________
-//void AliAnaPartCorrBaseClass::ConnectAODCaloClusters() {
-//  //Recover the list of AODCaloClusters
-//
-//  fAODCaloClusters = fReader->GetOutputEvent()->GetCaloClusters();
-//
-//}
-//
-//___________________________________________________
-void AliAnaPartCorrBaseClass::ConnectAODPHOSCells() {
-  //Recover the list of PHOS AODCaloCells 
-
-  fAODCaloCells = fReader->GetOutputEvent()->GetPHOSCells();
-
-}
-
-//___________________________________________________
-void AliAnaPartCorrBaseClass::ConnectAODEMCALCells() {
-  //Recover the list of EMCAL AODCaloCells 
-
-  fAODCaloCells = fReader->GetOutputEvent()->GetEMCALCells();
-
-}
-
-//___________________________________________________
+//___________________________________________________________________________
 TClonesArray * AliAnaPartCorrBaseClass::GetAODBranch(TString aodName) const {
        //Recover ouput and input AOD pointers for each event in the maker
        
        //Delta AODs
-       AliAODHandler* aodHandler = (AliAODHandler*) 
-       ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler()); 
-       if (aodHandler->GetExtensions()) { 
-               AliAODExtension *ext = (AliAODExtension*)aodHandler->GetExtensions()->FindObject(GetReader()->GetDeltaAODFileName()); 
-               if(ext){
-                       AliAODEvent *aodEvent = ext->GetAOD(); 
-                       TClonesArray * aodbranch =  (TClonesArray*) aodEvent->FindListObject(aodName);
-                       if(aodbranch) return aodbranch;
-                        else return  (TClonesArray *) fReader->GetOutputEvent()->FindListObject(aodName);
-               }
-               else{//If no Delta AODs, kept in standard branch, to revise. 
-                       return (TClonesArray *) fReader->GetOutputEvent()->FindListObject(aodName);
-               }
-       }
-       else{ //If no Delta AODs, kept in standard branch, to revise. 
-               return (TClonesArray *) fReader->GetOutputEvent()->FindListObject(aodName);
-       }
+       if(fDebug > 3) printf("AliAnaPartCorrBaseClass::GetAODBranch() - Get Input Branch with name: <%s>; \n",aodName.Data());
+       
+  //Get the AOD handler, if output AOD is created use it, if not get the branches from the input which should be deltaAODs
+  AliAODHandler* aodHandler = 0x0;
+  Bool_t outAOD = kFALSE;
+  if((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler()) outAOD = kTRUE;
+  if(outAOD) aodHandler = (AliAODHandler*) ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler()); 
+  else              aodHandler = (AliAODHandler*) ((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler());
+  
+  if(!GetReader()->WriteDeltaAODToFile())
+  {
+    return  (TClonesArray *) (fReader->GetAODBranchList())->FindObject(aodName);
+  }
+  else if (aodHandler->GetExtensions())
+  { 
+    AliAODExtension *ext = (AliAODExtension*)aodHandler->GetExtensions()->FindObject(GetReader()->GetDeltaAODFileName()); 
+    if(ext){
+      AliAODEvent *aodEvent = ext->GetAOD(); 
+      TClonesArray * aodbranch =  (TClonesArray*) aodEvent->FindListObject(aodName);
+      if(aodbranch) return aodbranch;
+      else {
+        if(outAOD) return  (TClonesArray *) fReader->GetOutputEvent()->FindListObject(aodName);
+        else       return  (TClonesArray *) fReader->GetInputEvent() ->FindListObject(aodName);
+      }
+    }
+    else{//If no Delta AODs, kept in standard branch, to revise. 
+      if(outAOD) return (TClonesArray *) fReader->GetOutputEvent()->FindListObject(aodName);
+      else       return (TClonesArray *) fReader->GetInputEvent() ->FindListObject(aodName);
+    }
+  }
+  else{ //If no Delta AODs, kept in standard branch, to revise. 
+    if(outAOD) return (TClonesArray *) fReader->GetOutputEvent()->FindListObject(aodName);
+    else       return  (TClonesArray *) fReader->GetInputEvent() ->FindListObject(aodName);
+  }
+  
 }
 
 
+
 //___________________________________________________
 void AliAnaPartCorrBaseClass::ConnectInputOutputAODBranches() {
   //Recover ouput and input AOD pointers for each event in the maker
        
   //Delta AODs
-  AliAODHandler* aodHandler = (AliAODHandler*) 
-       ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler()); 
-  if (aodHandler->GetExtensions()) { 
+  if(fDebug > 3) printf("AliAnaPartCorrBaseClass::ConnectInputOutputAODBranches() - Connect Input with name: <%s>; Connect output with name <%s>\n",fInputAODName.Data(),fOutputAODName.Data());
+  
+       //Get the AOD handler, if output AOD is created use it, if not get the branches from the input which should be deltaAODs
+       AliAODHandler* aodHandler = 0x0;
+       Bool_t outAOD = kFALSE;
+       if((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler()) outAOD = kTRUE;
+       if(outAOD) aodHandler = (AliAODHandler*) ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler()); 
+       else         aodHandler = (AliAODHandler*) ((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler());
+       
+  if(!GetReader()->WriteDeltaAODToFile())
+  {
+    fOutputAODBranch =  (TClonesArray *) (fReader->GetAODBranchList())->FindObject(fOutputAODName);
+    fInputAODBranch  =  (TClonesArray *) (fReader->GetAODBranchList())->FindObject(fInputAODName);     
+  }
+  else if (aodHandler->GetExtensions()) { 
+    
          AliAODExtension *ext = (AliAODExtension*)aodHandler->GetExtensions()->FindObject(GetReader()->GetDeltaAODFileName()); 
          if(ext){
-         AliAODEvent *aodEvent = ext->GetAOD(); 
-         fOutputAODBranch = (TClonesArray*) aodEvent->FindListObject(fOutputAODName);
-         fInputAODBranch = (TClonesArray*) aodEvent->FindListObject(fInputAODName);      
-         if(!fOutputAODBranch) fOutputAODBranch =  (TClonesArray *) fReader->GetOutputEvent()->FindListObject(fOutputAODName);
-         if(!fInputAODBranch)  fInputAODBranch  =  (TClonesArray *) fReader->GetOutputEvent()->FindListObject(fInputAODName);
+      AliAODEvent *aodEvent = ext->GetAOD(); 
+      if(fNewAOD)fOutputAODBranch = (TClonesArray*) aodEvent->FindListObject(fOutputAODName);
+      fInputAODBranch = (TClonesArray*) aodEvent->FindListObject(fInputAODName);         
+      if(!fOutputAODBranch && fNewAOD) fOutputAODBranch =  (TClonesArray *) fReader->GetOutputEvent()->FindListObject(fOutputAODName);
+      if(!fInputAODBranch)  fInputAODBranch  =  (TClonesArray *) fReader->GetOutputEvent()->FindListObject(fInputAODName);
          }
          else{//If no Delta AODs, kept in standard branch, to revise. 
+                 if(fNewAOD && fReader->GetOutputEvent()) {
+                         fOutputAODBranch =  (TClonesArray *) fReader->GetOutputEvent()->FindListObject(fOutputAODName);
+                         fInputAODBranch  =  (TClonesArray *) fReader->GetOutputEvent()->FindListObject(fInputAODName);        
+                 }
+                 else {
+                         fInputAODBranch  =  (TClonesArray *) fReader->GetInputEvent()->FindListObject(fInputAODName); 
+                         if(!fInputAODBranch && fReader->GetOutputEvent() ) 
+                                 fInputAODBranch  =  (TClonesArray *) fReader->GetOutputEvent()->FindListObject(fInputAODName);//Try the output event.
+                 }
+         }
+  }
+  else{ //If no Delta AODs, kept in standard branch
+         if(fNewAOD && fReader->GetOutputEvent()) {
                  fOutputAODBranch =  (TClonesArray *) fReader->GetOutputEvent()->FindListObject(fOutputAODName);
-                 fInputAODBranch  =  (TClonesArray *) fReader->GetOutputEvent()->FindListObject(fInputAODName);                
+                 fInputAODBranch  =  (TClonesArray *) fReader->GetOutputEvent()->FindListObject(fInputAODName);        
+         }
+         else{ 
+                 fInputAODBranch  =  (TClonesArray *) fReader->GetInputEvent()->FindListObject(fInputAODName);
+                 if(!fInputAODBranch && fReader->GetOutputEvent())  
+                         fInputAODBranch  =  (TClonesArray *) fReader->GetOutputEvent()->FindListObject(fInputAODName);//Try the output event.
          }
   }
-  else{ //If no Delta AODs, kept in standard branch, to revise. 
-       fOutputAODBranch =  (TClonesArray *) fReader->GetOutputEvent()->FindListObject(fOutputAODName);
-       fInputAODBranch  =  (TClonesArray *) fReader->GetOutputEvent()->FindListObject(fInputAODName);          
+       
+  if(GetDebug() > 1){
+    if(fNewAOD && !fOutputAODBranch) 
+      printf(" AliAnaPartCorrBaseClass::ConnectInputOutputAODBranches() - Output Branch <%s>, not found!\n",fOutputAODName.Data());
+    if(!fNewAOD && !fInputAODBranch) 
+      printf(" AliAnaPartCorrBaseClass::ConnectInputOutputAODBranches() - Input Branch  <%s>, not found!\n",fInputAODName.Data());
   }
 }
-
+//
+////__________________________________________________________________________
+//Bool_t AliAnaPartCorrBaseClass::IsTrackMatched(AliVCluster* cluster) const {
+//  //Check if there is any track attached to this cluster
+//  
+//  Int_t nMatches = cluster->GetNTracksMatched();
+////  printf("N matches %d, first match %d\n",nMatches,cluster->GetTrackMatchedIndex());
+////  if     (cluster->GetTrackMatched(0))        printf("\t matched track id %d\n",((AliVTrack*)cluster->GetTrackMatched(0))->GetID()) ;
+////  else if(cluster->GetTrackMatchedIndex()>=0) printf("\t matched track id %d\n",((AliVTrack*) GetReader()->GetInputEvent()->GetTrack(cluster->GetTrackMatchedIndex()))->GetID()) ;
+//
+//  if(fReader->GetDataType()==AliCaloTrackReader::kESD)
+//  {
+//    
+//    if (nMatches > 0) {
+//      if (nMatches == 1 ) {
+//        Int_t iESDtrack = cluster->GetTrackMatchedIndex();
+//        //printf("Track Matched index %d\n",iESDtrack);
+//        if(iESDtrack==-1) return kFALSE ;// Default value of array, there is no match
+//        else              return kTRUE;
+//      }//Just one, check
+//      else return kTRUE ;//More than one, there is a match.
+//    }// > 0
+//    else return kFALSE; //It does not happen, but in case
+//      
+//  }//ESDs
+//  else
+//  {
+//    //AODs
+//    if(nMatches > 0) return kTRUE; //There is at least one match.
+//    else             return kFALSE;
+//    
+//  }//AODs or MC (copy into AOD)
+//  
+//  return kFALSE;
+//  
+//}
+//
 //__________________________________________________
 TObjArray *  AliAnaPartCorrBaseClass::GetAODCTS() const {
   //Get list of referenced tracks from reader
@@ -326,32 +310,33 @@ TString  AliAnaPartCorrBaseClass::GetBaseParametersList()  {
   //Put data member values in string to keep in output container
 
   TString parList ; //this will be list of parameters used for this analysis.
-  char onePar[255] ;
-  sprintf(onePar,"--- AliAnaPartCorrBaseClass ---\n") ;
+  const Int_t buffersize = 255;
+  char onePar[buffersize] ;
+  snprintf(onePar,buffersize,"--- AliAnaPartCorrBaseClass ---\n") ;
   parList+=onePar ;    
-  sprintf(onePar,"Minimal P_t: %2.2f ; Max\n", fMinPt) ;
+  snprintf(onePar,buffersize,"Minimal P_t: %2.2f ; Max\n", fMinPt) ;
   parList+=onePar ;
-  sprintf(onePar,"Minimal P_t: %2.2f ; Max\n", fMaxPt) ;
+  snprintf(onePar,buffersize,"Minimal P_t: %2.2f ; Max\n", fMaxPt) ;
   parList+=onePar ;
-  sprintf(onePar,"fDataMC =%d (Check MC information, on/off) \n",fDataMC) ;
+  snprintf(onePar,buffersize,"fDataMC =%d (Check MC information, on/off) \n",fDataMC) ;
   parList+=onePar ;
-  sprintf(onePar,"fCheckFidCut=%d (Check Fiducial cut selection on/off) \n",fCheckFidCut) ;
+  snprintf(onePar,buffersize,"fCheckFidCut=%d (Check Fiducial cut selection on/off) \n",fCheckFidCut) ;
   parList+=onePar ;
-  sprintf(onePar,"fCheckCaloPID =%d (Use Bayesian PID in calorimetes, on/off) \n",fCheckCaloPID) ;
+  snprintf(onePar,buffersize,"fCheckCaloPID =%d (Use Bayesian PID in calorimetes, on/off) \n",fCheckCaloPID) ;
   parList+=onePar ;
-  sprintf(onePar,"fRecalculateCaloPID  =%d (Calculate PID from shower/tof/tracking parameters, on/off) \n",fRecalculateCaloPID) ;
+  snprintf(onePar,buffersize,"fRecalculateCaloPID  =%d (Calculate PID from shower/tof/tracking parameters, on/off) \n",fRecalculateCaloPID) ;
   parList+=onePar ;
-  sprintf(onePar,"fInputAODName  =%s Input AOD name \n",fInputAODName.Data()) ;
+  snprintf(onePar,buffersize,"fInputAODName  =%s Input AOD name \n",fInputAODName.Data()) ;
   parList+=onePar ;    
   if(fNewAOD){
-     sprintf(onePar,"fOutputAODName  =%s Output AOD name \n",fOutputAODName.Data()) ;
+     snprintf(onePar,buffersize,"fOutputAODName  =%s Output AOD name \n",fOutputAODName.Data()) ;
+     parList+=onePar ; 
+     snprintf(onePar,buffersize,"fOutputAODClassName  =%s Output AOD class name \n",fOutputAODClassName.Data()) ;
      parList+=onePar ; 
-        sprintf(onePar,"fOutputAODClassName  =%s Output AOD class name \n",fOutputAODClassName.Data()) ;
-        parList+=onePar ;      
   }
-  sprintf(onePar,"fAODObjArrayName  =%s Reference arrays in AOD name \n",fAODObjArrayName.Data()) ;
+  snprintf(onePar,buffersize,"fAODObjArrayName  =%s Reference arrays in AOD name \n",fAODObjArrayName.Data()) ;
   parList+=onePar ;    
-  sprintf(onePar,"fAddToHistogramsName  =%s String added to beginning of histograms name \n",fAddToHistogramsName.Data()) ;
+  snprintf(onePar,buffersize,"fAddToHistogramsName  =%s String added to beginning of histograms name \n",fAddToHistogramsName.Data()) ;
   parList+=onePar ;    
        
   return parList; 
@@ -372,28 +357,29 @@ TString  AliAnaPartCorrBaseClass::GetBaseParametersList()  {
  }
 
 //__________________________________________________
-TNamed *  AliAnaPartCorrBaseClass::GetPHOSCells() const {
-  //Get list of PHOS calo cells (ESD or AOD) from reader
-  
-  return fReader->GetPHOSCells(); 
-  
+Int_t AliAnaPartCorrBaseClass::GetEventNumber() const {
+       //Get current event number
+       
+       return fReader->GetEventNumber() ; 
 }
 
-
 //__________________________________________________
-TNamed *  AliAnaPartCorrBaseClass::GetEMCALCells() const {
-  //Get list of emcal calo cells (ESD or AOD) from reader
+Int_t AliAnaPartCorrBaseClass::GetEventCentrality() const {
+  //Return current event centrality
+  
+  if(GetCentrality()){
+    if(fCentralityOpt==100)     return (Int_t) GetCentrality()->GetCentralityPercentile(fCentralityClass);
+    else if(fCentralityOpt==10) return GetCentrality()->GetCentralityClass10(fCentralityClass); 
+    else if(fCentralityOpt==5)  return GetCentrality()->GetCentralityClass5(fCentralityClass);
+    else {
+      printf("AliAnaPartCorrBaseClass::Unknown centrality option %d, use 5, 10 or 100\n",fCentralityOpt);
+      return 0;
+    } 
+  }
+  else return 0;
   
-  return fReader->GetEMCALCells(); 
-
 }
 
-//__________________________________________________
-Int_t AliAnaPartCorrBaseClass::GetEventNumber() const {
-       //Get current event number
-       
-       return fReader->GetEventNumber() ; 
-}
        
 //__________________________________________________
 AliStack *  AliAnaPartCorrBaseClass::GetMCStack() const {
@@ -427,19 +413,25 @@ void AliAnaPartCorrBaseClass::InitParameters()
   fCheckCaloPID = kTRUE ;
   fCheckFidCut = kFALSE ;
   fRecalculateCaloPID = kFALSE ;
-  fMinPt = 0.2 ; //Min pt in particle analysis
+  fMinPt = 0. ; //Min pt in particle analysis
   fMaxPt = 300. ; //Max pt in particle analysis
-
-  fCaloPID = new AliCaloPID ;  
-  fFidCut = new AliFiducialCut;
-  fIC = new AliIsolationCut;
-  fNMS = new AliNeutralMesonSelection;
-  fNewAOD = kFALSE ;
-  fOutputAODName = "PartCorr";
-  fOutputAODClassName = "AliAODPWG4Particle";
-  fInputAODName = "PartCorr";
+  fMultiBin = 1;
+  fNZvertBin = 1;
+  fNrpBin    = 1;
+  fZvtxCut   = 10;
+  fMaxMulti   = 1000;
+  fMinMulti   = 0;
+  fUseSelectEvent = kFALSE ;
+  
+  //fReader    = new AliCaloTrackReader(); //Initialized in maker
+  //fCaloUtils = new AliCalorimeterUtils();//Initialized in maker
+       
+  fNewAOD              = kFALSE ;
+  fOutputAODName       = "PartCorr";
+  fOutputAODClassName  = "AliAODPWG4Particle";
+  fInputAODName        = "PartCorr";
   fAddToHistogramsName = "";
-  fAODObjArrayName="Ref";
+  fAODObjArrayName     = "Ref";
          
   //Histogram settings
   fHistoPtBins    = 240 ;
@@ -461,7 +453,19 @@ void AliAnaPartCorrBaseClass::InitParameters()
   fHistoAsymBins  = 10 ;
   fHistoAsymMax   = 1. ;
   fHistoAsymMin   = 0. ;
+  
+  fHistoV0SBins   = 100 ;
+  fHistoV0SMax    = 10000  ;
+  fHistoV0SMin    = 0  ;
+  
+  fHistoV0MBins  = 100;
+  fHistoV0MMax   = 10000 ;
+  fHistoV0MMin   = 0 ;
        
+  fHistoTrMBins  = 100 ;
+  fHistoTrMMax   = 2000 ;
+  fHistoTrMMin   = 0 ;
+       
 }
 
 //__________________________________________________________________
@@ -482,15 +486,23 @@ void AliAnaPartCorrBaseClass::Print(const Option_t * opt) const
   printf("Recalculate PID     =     %d\n",     fRecalculateCaloPID) ;
   printf("Check Fiducial cut  =     %d\n",     fCheckFidCut) ;
   printf("Check MC labels     =     %d\n",     fDataMC);
+  printf("Make plots?         =     %d \n",    fMakePlots);    
   printf("Debug Level         =     %d\n",     fDebug);
   printf("Histograms: %3.1f < pT  < %3.1f,  Nbin = %d\n", fHistoPtMin,  fHistoPtMax,  fHistoPtBins);
   printf("Histograms: %3.1f < phi < %3.1f, Nbin = %d\n", fHistoPhiMin, fHistoPhiMax, fHistoPhiBins);
   printf("Histograms: %3.1f < eta < %3.1f, Nbin = %d\n", fHistoEtaMin, fHistoEtaMax, fHistoEtaBins);
   printf("Histograms: %3.1f < mass < %3.1f, Nbin = %d\n", fHistoMassMin, fHistoMassMax, fHistoMassBins);
   printf("Histograms: %3.1f < asymmetry < %3.1f, Nbin = %d\n", fHistoAsymMin, fHistoAsymMax, fHistoAsymBins);
+  printf("Histograms: %d < V0 Signal < %d, Nbin = %d\n", fHistoV0SMin, fHistoV0SMax, fHistoV0SBins);
+  printf("Histograms: %d < V0 Mult < %d, Nbin = %d\n", fHistoV0MMin, fHistoV0MMax, fHistoV0MBins);
+  printf("Histograms: %d < Track Mult < %d, Nbin = %d\n", fHistoTrMMin, fHistoTrMMax, fHistoTrMBins);
+
   printf("Name of reference array      : %s\n", fAODObjArrayName.Data());      
   printf("String added histograms name : %s\n",fAddToHistogramsName.Data());
        
   printf("    \n") ;
   
 } 
+
+
+