]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
Update for centrality selection (Gian Michele)
authordainese <dainese@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 26 Jan 2011 01:41:11 +0000 (01:41 +0000)
committerdainese <dainese@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 26 Jan 2011 01:41:11 +0000 (01:41 +0000)
PWG3/vertexingHF/AliRDHFCuts.cxx
PWG3/vertexingHF/AliRDHFCuts.h

index 80bc67b7f9e28e51fb6b8149b90f3f71f33c3db9..cff0ce759f3d03715792f125c66d96afabd4813b 100644 (file)
-/**************************************************************************
- * Copyright(c) 1998-2010, ALICE Experiment at CERN, All rights reserved. *
- *                                                                        *
- * Author: The ALICE Off-line Project.                                    *
- * Contributors are mentioned in the code where appropriate.              *
- *                                                                        *
- * Permission to use, copy, modify and distribute this software and its   *
- * documentation strictly for non-commercial purposes is hereby granted   *
- * without fee, provided that the above copyright notice appears in all   *
- * copies and that both the copyright notice and this permission notice   *
- * appear in the supporting documentation. The authors make no claims     *
- * about the suitability of this software for any purpose. It is          *
- * provided "as is" without express or implied warranty.                  *
- **************************************************************************/
-
-/////////////////////////////////////////////////////////////
-//
-// Base class for cuts on AOD reconstructed heavy-flavour decay
-//
-// Author: A.Dainese, andrea.dainese@pd.infn.it
-/////////////////////////////////////////////////////////////
-#include <Riostream.h>
-
-#include "AliVEvent.h"
-#include "AliESDEvent.h"
-#include "AliAODEvent.h"
-#include "AliVVertex.h"
-#include "AliESDVertex.h"
-#include "AliLog.h"
-#include "AliAODVertex.h"
-#include "AliESDtrack.h"
-#include "AliAODTrack.h"
-#include "AliESDtrackCuts.h"
-#include "AliAODRecoDecayHF.h"
-#include "AliRDHFCuts.h"
-
-ClassImp(AliRDHFCuts)
-
-//--------------------------------------------------------------------------
-AliRDHFCuts::AliRDHFCuts(const Char_t* name, const Char_t* title) : 
-AliAnalysisCuts(name,title),
-fMinVtxType(3),
-fMinVtxContr(1),
-fMaxVtxRedChi2(1e6),
-fMaxVtxZ(1e6),
-fMinSPDMultiplicity(0),
-fTriggerMask(0),
-fTrackCuts(0),
-fnPtBins(1),
-fnPtBinLimits(1),
-fPtBinLimits(0),
-fnVars(1),
-fVarNames(0),
-fnVarsForOpt(0),
-fVarsForOpt(0),
-fGlobalIndex(1),
-fCutsRD(0),
-fIsUpperCut(0),
-fUsePID(kFALSE),
-fPidHF(0),
-fWhyRejection(0),
-fRemoveDaughtersFromPrimary(kFALSE),
-fOptPileup(0),
-fMinContrPileup(3),
-fMinDzPileup(0.6),
-fUseCentrality(0),
-fMinCentrality(0.),
-fMaxCentrality(100.)
-
-{
-  //
-  // Default Constructor
-  //
-}
-//--------------------------------------------------------------------------
-AliRDHFCuts::AliRDHFCuts(const AliRDHFCuts &source) :
-  AliAnalysisCuts(source),
-  fMinVtxType(source.fMinVtxType),
-  fMinVtxContr(source.fMinVtxContr),
-  fMaxVtxRedChi2(source.fMaxVtxRedChi2),
-  fMaxVtxZ(source.fMaxVtxZ),
-  fMinSPDMultiplicity(source.fMinSPDMultiplicity),
-  fTriggerMask(source.fTriggerMask),
-  fTrackCuts(0),
-  fnPtBins(source.fnPtBins),
-  fnPtBinLimits(source.fnPtBinLimits),
-  fPtBinLimits(0),
-  fnVars(source.fnVars),
-  fVarNames(0),
-  fnVarsForOpt(source.fnVarsForOpt),
-  fVarsForOpt(0),
-  fGlobalIndex(source.fGlobalIndex),
-  fCutsRD(0),
-  fIsUpperCut(0),
-  fUsePID(source.fUsePID),
-  fPidHF(0),
-  fWhyRejection(source.fWhyRejection),
-  fRemoveDaughtersFromPrimary(source.fRemoveDaughtersFromPrimary),
-  fOptPileup(source.fOptPileup),
-  fMinContrPileup(source.fMinContrPileup),
-  fMinDzPileup(source.fMinDzPileup),
-  fUseCentrality(source.fUseCentrality),
-  fMinCentrality(source.fMinCentrality),
-  fMaxCentrality(source.fMaxCentrality)
-
-
-{
-  //
-  // Copy constructor
-  //
-  cout<<"Copy constructor"<<endl;
-  if(source.GetTrackCuts()) AddTrackCuts(source.GetTrackCuts());
-  if(source.fPtBinLimits) SetPtBins(source.fnPtBinLimits,source.fPtBinLimits);
-  if(source.fVarNames) SetVarNames(source.fnVars,source.fVarNames,source.fIsUpperCut);
-  if(source.fCutsRD) SetCuts(source.fGlobalIndex,source.fCutsRD);
-  if(source.fVarsForOpt) SetVarsForOpt(source.fnVarsForOpt,source.fVarsForOpt);
-  if(source.fPidHF) SetPidHF(source.fPidHF);
-  PrintAll();
-
-}
-//--------------------------------------------------------------------------
-AliRDHFCuts &AliRDHFCuts::operator=(const AliRDHFCuts &source)
-{
-  //
-  // assignment operator
-  //
-  if(&source == this) return *this;
-
-  AliAnalysisCuts::operator=(source);
-
-  fMinVtxType=source.fMinVtxType;
-  fMinVtxContr=source.fMinVtxContr;
-  fMaxVtxRedChi2=source.fMaxVtxRedChi2;
-  fMaxVtxZ=source.fMaxVtxZ;
-  fMinSPDMultiplicity=source.fMinSPDMultiplicity;
-  fTriggerMask=source.fTriggerMask;
-  fnPtBins=source.fnPtBins;
-  fnVars=source.fnVars;
-  fGlobalIndex=source.fGlobalIndex;
-  fnVarsForOpt=source.fnVarsForOpt;
-  fUsePID=source.fUsePID;
-  SetPidHF(source.GetPidHF());
-  fWhyRejection=source.fWhyRejection;
-  fRemoveDaughtersFromPrimary=source.fRemoveDaughtersFromPrimary;
-  fOptPileup=source.fOptPileup;
-  fMinContrPileup=source.fMinContrPileup;
-  fMinDzPileup=source.fMinDzPileup;
-  fUseCentrality=source.fUseCentrality;
-  fMinCentrality=source.fMinCentrality;
-  fMaxCentrality=source.fMaxCentrality;
-
-  if(source.GetTrackCuts()) AddTrackCuts(source.GetTrackCuts());
-  if(source.fPtBinLimits) SetPtBins(source.fnPtBinLimits,source.fPtBinLimits);
-  if(source.fVarNames) SetVarNames(source.fnVars,source.fVarNames,source.fIsUpperCut);
-  if(source.fCutsRD) SetCuts(source.fGlobalIndex,source.fCutsRD);
-  if(source.fVarsForOpt) SetVarsForOpt(source.fnVarsForOpt,source.fVarsForOpt);
-  PrintAll();
-
-  return *this;
-}
-//--------------------------------------------------------------------------
-AliRDHFCuts::~AliRDHFCuts() {
-  //  
-  // Default Destructor
-  //
-  if(fPtBinLimits) {delete [] fPtBinLimits; fPtBinLimits=0;}
-  if(fVarNames) {delete [] fVarNames; fVarNames=0;}
-  if(fVarsForOpt) {delete [] fVarsForOpt; fVarsForOpt=0;}
-  if(fCutsRD) {
-    delete [] fCutsRD;
-    fCutsRD=0;
-  }
-  if(fIsUpperCut) {delete [] fIsUpperCut; fIsUpperCut=0;}
-  if(fPidHF){ 
-    delete fPidHF;
-    fPidHF=0;
-  }
-}
-//---------------------------------------------------------------------------
-Bool_t AliRDHFCuts::IsEventSelected(AliVEvent *event) {
-  //
-  // Event selection
-  // 
-  //if(fTriggerMask && event->GetTriggerMask()!=fTriggerMask) return kFALSE;
-
-  fWhyRejection=0;
-
-  // multiplicity cuts no implemented yet
-   
-  const AliVVertex *vertex = event->GetPrimaryVertex();
-
-  if(!vertex) return kFALSE;
-
-  TString title=vertex->GetTitle();
-  if(title.Contains("Z") && fMinVtxType>1) return kFALSE; 
-  if(title.Contains("3D") && fMinVtxType>2) return kFALSE; 
-
-  if(vertex->GetNContributors()<fMinVtxContr) return kFALSE; 
-
-  if(TMath::Abs(vertex->GetZ())>fMaxVtxZ) return kFALSE;
-
-  // switch to settings for 1-pad cls in TPC
-  if(fPidHF) {
-    if(event->GetRunNumber()>121693 && event->GetRunNumber()<136851) 
-      fPidHF->SetOnePad(kTRUE);
-    if(event->GetRunNumber()>=136851 && event->GetRunNumber()<=139517) 
-      fPidHF->SetPbPb(kTRUE);
-  }
-
-  if(fOptPileup==kRejectPileupEvent){
-    Int_t cutc=(Int_t)fMinContrPileup;
-    Double_t cutz=(Double_t)fMinDzPileup;
-    if(event->IsPileupFromSPD(cutc,cutz,3.,2.,10.)) {
-      fWhyRejection=1;
-      return kFALSE;
-    }
-  }
-
-  //centrality selection
-  if (!(fUseCentrality==kCentOff)){  
-
-    AliAODHeader *header=((AliAODEvent*)event)->GetHeader();
-    AliCentrality *centrality=header->GetCentralityP();
-    if(centrality){
-      Float_t cent=-999.;
-      if (fUseCentrality==kCentV0M) cent=(Float_t)(centrality->GetCentralityPercentile("V0M"));
-      else {
-        if (fUseCentrality==kCentTRK) cent=(Float_t)(centrality->GetCentralityPercentile("TRK"));
-        else{
-         if (fUseCentrality==kCentTKL) cent=(Float_t)(centrality->GetCentralityPercentile("TKL"));
-          else{
-           if (fUseCentrality==kCentCL1) cent=(Float_t)(centrality->GetCentralityPercentile("CL1"));
-            else {
-             fWhyRejection=3;
-             return kFALSE;
-           }
-         }
-        }
-      }
-           
-           
-      if (cent<fMinCentrality || cent>fMaxCentrality){
-       fWhyRejection=2; 
-       return kFALSE; 
-      }
-    }
-  }
-
-
-  return kTRUE;
-}
-//---------------------------------------------------------------------------
-Bool_t AliRDHFCuts::AreDaughtersSelected(AliAODRecoDecayHF *d) const {
-  //
-  // Daughter tracks selection
-  // 
-  if(!fTrackCuts) return kTRUE;
-
-  Int_t ndaughters = d->GetNDaughters();
-  AliAODVertex *vAOD = d->GetPrimaryVtx();
-  Double_t pos[3],cov[6];
-  vAOD->GetXYZ(pos);
-  vAOD->GetCovarianceMatrix(cov);
-  const AliESDVertex vESD(pos,cov,100.,100);
-
-  Bool_t retval=kTRUE;
-
-  for(Int_t idg=0; idg<ndaughters; idg++) {
-    AliAODTrack *dgTrack = (AliAODTrack*)d->GetDaughter(idg);
-    if(!dgTrack) retval = kFALSE;
-    //printf("charge %d\n",dgTrack->Charge());
-    if(dgTrack->Charge()==0) continue; // it's not a track, but a V0
-
-    if(!IsDaughterSelected(dgTrack,&vESD,fTrackCuts)) retval = kFALSE;
-  }
-
-  return retval;
-}
-//---------------------------------------------------------------------------
-Bool_t AliRDHFCuts::IsDaughterSelected(AliAODTrack *track,const AliESDVertex *primary,AliESDtrackCuts *cuts) const {
-  //
-  // Convert to ESDtrack, relate to vertex and check cuts
-  //
-  if(!cuts) return kTRUE;
-
-  Bool_t retval=kTRUE;
-
-  // convert to ESD track here
-  AliESDtrack esdTrack(track);
-  // needed to calculate the impact parameters
-  esdTrack.RelateToVertex(primary,0.,3.); 
-  if(!cuts->IsSelected(&esdTrack)) retval = kFALSE;
-  if(fOptPileup==kRejectTracksFromPileupVertex){
-    // to be implemented
-    // we need either to have here the AOD Event, 
-    // or to have the pileup vertex object
-  }
-  return retval; 
-}
-//---------------------------------------------------------------------------
-void AliRDHFCuts::SetPtBins(Int_t nPtBinLimits,Float_t *ptBinLimits) {
-  // Set the pt bins
-
-  if(fPtBinLimits) {
-    delete [] fPtBinLimits;
-    fPtBinLimits = NULL;
-    printf("Changing the pt bins\n");
-  }
-
-  if(nPtBinLimits != fnPtBins+1){
-    cout<<"Warning: ptBinLimits dimention "<<nPtBinLimits<<" != nPtBins+1 ("<<fnPtBins+1<<")\nSetting nPtBins to "<<nPtBinLimits-1<<endl;
-    SetNPtBins(nPtBinLimits-1);
-  }
-
-  fnPtBinLimits = nPtBinLimits;
-  SetGlobalIndex();
-  //cout<<"Changing also Global Index -> "<<fGlobalIndex<<endl;
-  fPtBinLimits = new Float_t[fnPtBinLimits];
-  for(Int_t ib=0; ib<nPtBinLimits; ib++) fPtBinLimits[ib]=ptBinLimits[ib];
-
-  return;
-}
-//---------------------------------------------------------------------------
-void AliRDHFCuts::SetVarNames(Int_t nVars,TString *varNames,Bool_t *isUpperCut){
-  // Set the variable names
-
-  if(fVarNames) {
-    delete [] fVarNames;
-    fVarNames = NULL;
-    //printf("Changing the variable names\n");
-  }
-  if(nVars!=fnVars){
-    printf("Wrong number of variables: it has to be %d\n",fnVars);
-    return;
-  }
-  //fnVars=nVars;
-  fVarNames = new TString[nVars];
-  fIsUpperCut = new Bool_t[nVars];
-  for(Int_t iv=0; iv<nVars; iv++) {
-    fVarNames[iv] = varNames[iv];
-    fIsUpperCut[iv] = isUpperCut[iv];
-  }
-
-  return;
-}
-//---------------------------------------------------------------------------
-void AliRDHFCuts::SetVarsForOpt(Int_t nVars,Bool_t *forOpt) {
-  // Set the variables to be used for cuts optimization
-
-  if(fVarsForOpt) {
-    delete [] fVarsForOpt;
-    fVarsForOpt = NULL;
-    //printf("Changing the variables for cut optimization\n");
-  }
-  
-  if(nVars==0){//!=fnVars) {
-    printf("%d not accepted as number of variables: it has to be %d\n",nVars,fnVars);
-    return;
-  } 
-  
-  fnVarsForOpt = 0;
-  fVarsForOpt = new Bool_t[fnVars];
-  for(Int_t iv=0; iv<fnVars; iv++) {
-    fVarsForOpt[iv]=forOpt[iv];
-    if(fVarsForOpt[iv]) fnVarsForOpt++;
-  }
-
-  return;
-}
-
-//---------------------------------------------------------------------------
-
-void AliRDHFCuts::SetUseCentrality(Int_t flag) {
-  //
-  // enable centrality selection  
-  //
-  fUseCentrality=flag;
-  if(fUseCentrality>=kCentInvalid) AliWarning("Centrality estimator not valid");
-  return;
-}
-
-
-//---------------------------------------------------------------------------
-void AliRDHFCuts::SetCuts(Int_t nVars,Int_t nPtBins,Float_t **cutsRD) {
-  //
-  // store the cuts
-  //
-  if(nVars!=fnVars) {
-    printf("Wrong number of variables: it has to be %d\n",fnVars);
-    return;
-  } 
-  if(nPtBins!=fnPtBins) {
-    printf("Wrong number of pt bins: it has to be %d\n",fnPtBins);
-    return;
-  } 
-
-  if(!fCutsRD)  fCutsRD = new Float_t[fGlobalIndex];
-  
-
-  for(Int_t iv=0; iv<fnVars; iv++) {
-
-    for(Int_t ib=0; ib<fnPtBins; ib++) {
-
-      //check
-      if(GetGlobalIndex(iv,ib)>=fGlobalIndex) {
-       cout<<"Overflow, exit..."<<endl;
-       return;
-      }
-
-      fCutsRD[GetGlobalIndex(iv,ib)] = cutsRD[iv][ib];
-
-    }
-  }
-  return;
-}
-//---------------------------------------------------------------------------
-void AliRDHFCuts::SetCuts(Int_t glIndex,Float_t* cutsRDGlob){
-  //
-  // store the cuts
-  //
-  if(glIndex != fGlobalIndex){
-    cout<<"Wrong array size: it has to be "<<fGlobalIndex<<endl;
-    return;
-  }
-  if(!fCutsRD)  fCutsRD = new Float_t[fGlobalIndex];
-
-  for(Int_t iGl=0;iGl<fGlobalIndex;iGl++){
-    fCutsRD[iGl] = cutsRDGlob[iGl];
-  }
-  return;
-}
-//---------------------------------------------------------------------------
-void AliRDHFCuts::PrintAll() const {
-  //
-  // print all cuts values
-  // 
-
-  printf("Minimum vtx type %d\n",fMinVtxType);
-  printf("Minimum vtx contr %d\n",fMinVtxContr);
-  printf("Max vtx red chi2 %f\n",fMaxVtxRedChi2);
-  printf("Min SPD mult %d\n",fMinSPDMultiplicity);
-  printf("Use PID %d\n",(Int_t)fUsePID);
-  printf("Remove daughters from vtx %d\n",(Int_t)fRemoveDaughtersFromPrimary);
-
-  if(fVarNames){
-    cout<<"Array of variables"<<endl;
-    for(Int_t iv=0;iv<fnVars;iv++){
-      cout<<fVarNames[iv]<<"\t";
-    }
-    cout<<endl;
-  }
-  if(fVarsForOpt){
-    cout<<"Array of optimization"<<endl;
-    for(Int_t iv=0;iv<fnVars;iv++){
-      cout<<fVarsForOpt[iv]<<"\t";
-    }
-    cout<<endl;
-  }
-  if(fIsUpperCut){
-    cout<<"Array of upper/lower cut"<<endl;
-   for(Int_t iv=0;iv<fnVars;iv++){
-     cout<<fIsUpperCut[iv]<<"\t";
-   }
-   cout<<endl;
-  }
-  if(fPtBinLimits){
-    cout<<"Array of ptbin limits"<<endl;
-    for(Int_t ib=0;ib<fnPtBinLimits;ib++){
-      cout<<fPtBinLimits[ib]<<"\t";
-    }
-    cout<<endl;
-  }
-  if(fCutsRD){
-    cout<<"Matrix of cuts"<<endl;
-   for(Int_t iv=0;iv<fnVars;iv++){
-     for(Int_t ib=0;ib<fnPtBins;ib++){
-       cout<<"fCutsRD["<<iv<<"]["<<ib<<"] = "<<fCutsRD[GetGlobalIndex(iv,ib)]<<"\t";
-     }
-     cout<<endl;
-   }
-   cout<<endl;
-  }
-  return;
-}
-//---------------------------------------------------------------------------
-void AliRDHFCuts::GetCuts(Float_t**& cutsRD) const{
-  //
-  // get the cuts
-  //
-
-  //cout<<"Give back a "<<fnVars<<"x"<<fnPtBins<<" matrix."<<endl;
-
-
-  Int_t iv,ib;
-  if(!cutsRD) {
-    //cout<<"Initialization..."<<endl;
-    cutsRD=new Float_t*[fnVars];
-    for(iv=0; iv<fnVars; iv++) {
-      cutsRD[iv] = new Float_t[fnPtBins];
-    }
-  }
-  
-  for(Int_t iGlobal=0; iGlobal<fGlobalIndex; iGlobal++) {
-    GetVarPtIndex(iGlobal,iv,ib);
-    cutsRD[iv][ib] = fCutsRD[iGlobal];
-  }
-
-  return;
-}
-
-//---------------------------------------------------------------------------
-Int_t AliRDHFCuts::GetGlobalIndex(Int_t iVar,Int_t iPtBin) const{
-  //
-  // give the global index from variable and pt bin
-  //
-  return iPtBin*fnVars+iVar;
-}
-
-//---------------------------------------------------------------------------
-void AliRDHFCuts::GetVarPtIndex(Int_t iGlob, Int_t& iVar, Int_t& iPtBin) const {
-  //
-  //give the index of the variable and of the pt bin from the global index
-  //
-  iPtBin=(Int_t)iGlob/fnVars;
-  iVar=iGlob%fnVars;
-
-  return;
-}
-
-//---------------------------------------------------------------------------
-Int_t AliRDHFCuts::PtBin(Double_t pt) const {
-  //
-  //give the pt bin where the pt lies.
-  //
-  Int_t ptbin=-1;
-  for (Int_t i=0;i<fnPtBins;i++){
-    if(pt<fPtBinLimits[i+1]) {
-      ptbin=i;
-      break;
-    }
-  }
-  return ptbin;
-}
-//-------------------------------------------------------------------
-Float_t AliRDHFCuts::GetCutValue(Int_t iVar,Int_t iPtBin) const {
-  // 
-  // Give the value of cut set for the variable iVar and the pt bin iPtBin
-  //
-  if(!fCutsRD){
-    cout<<"Cuts not iniziaisez yet"<<endl;
-    return 0;
-  }
-  return fCutsRD[GetGlobalIndex(iVar,iPtBin)];
-}
-//-------------------------------------------------------------------
-Float_t AliRDHFCuts::GetCentrality(AliAODEvent* aodEvent) {
-  //
-  // centrality percentile
-  //
-  AliAODHeader *header=aodEvent->GetHeader();
-  AliCentrality *centrality=header->GetCentralityP();
-  Float_t cent=-999.;
-  if(centrality){ 
-     if (fUseCentrality==kCentV0M) cent=(Float_t)(centrality->GetCentralityPercentile("V0M"));
-     else {
-       if (fUseCentrality==kCentTRK) cent=(Float_t)(centrality->GetCentralityPercentile("TRK"));
-       else{
-        if (fUseCentrality==kCentTKL) cent=(Float_t)(centrality->GetCentralityPercentile("TKL"));
-         else{
-          if (fUseCentrality==kCentCL1) cent=(Float_t)(centrality->GetCentralityPercentile("CL1"));
-           else {
-            AliWarning("Centrality estimator not valid");
-            return kFALSE;
-          }
-        }
-       }
-     } 
-   }
-  return cent;
-}
-//-------------------------------------------------------------------
-Bool_t AliRDHFCuts::CompareCuts(const AliRDHFCuts *obj) const {
-  //
-  // Compare two cuts objects
-  //
-
-  Bool_t areEqual=kTRUE;
-
-  if(fMinVtxType!=obj->fMinVtxType) { printf("Minimum vtx type %d  %d\n",fMinVtxType,obj->fMinVtxType); areEqual=kFALSE;}
-
-  if(fMinVtxContr!=obj->fMinVtxContr) { printf("Minimum vtx contr %d  %d\n",fMinVtxContr,obj->fMinVtxContr); areEqual=kFALSE;}
-
-  if(TMath::Abs(fMaxVtxRedChi2-obj->fMaxVtxRedChi2)>1.e-10) {   printf("Max vtx red chi2 %f  %f\n",fMaxVtxRedChi2,obj->fMaxVtxRedChi2);areEqual=kFALSE;}
-
-  if(fMinSPDMultiplicity!=obj->fMinSPDMultiplicity) {  printf("Min SPD mult %d\n  %d",fMinSPDMultiplicity,obj->fMinSPDMultiplicity);areEqual=kFALSE;}
-
-  if(fUsePID!=obj->fUsePID) { printf("Use PID %d  %d\n",(Int_t)fUsePID,(Int_t)obj->fUsePID); areEqual=kFALSE;}
-
-  if(fRemoveDaughtersFromPrimary!=obj->fRemoveDaughtersFromPrimary) {printf("Remove daughters from vtx %d  %d\n",(Int_t)fRemoveDaughtersFromPrimary,(Int_t)obj->fRemoveDaughtersFromPrimary); areEqual=kFALSE;}
-  if(fTrackCuts){
-    if(fTrackCuts->GetMinNClusterTPC()!=obj->fTrackCuts->GetMinNClusterTPC()) {printf("MinNClsTPC %d  %d\n",fTrackCuts->GetMinNClusterTPC(),obj->fTrackCuts->GetMinNClusterTPC()); areEqual=kFALSE;}
-
-    if(fTrackCuts->GetMinNClustersITS()!=obj->fTrackCuts->GetMinNClustersITS()) {printf("MinNClsITS %d  %d\n",fTrackCuts->GetMinNClustersITS(),obj->fTrackCuts->GetMinNClustersITS()); areEqual=kFALSE;}
-
-    if(TMath::Abs(fTrackCuts->GetMaxChi2PerClusterTPC()-obj->fTrackCuts->GetMaxChi2PerClusterTPC())>1.e-10) {printf("MaxChi2ClsTPC %f  %f\n",fTrackCuts->GetMaxChi2PerClusterTPC(),obj->fTrackCuts->GetMaxChi2PerClusterTPC()); areEqual=kFALSE;}
-
-    if(fTrackCuts->GetClusterRequirementITS(AliESDtrackCuts::kSPD)!=obj->fTrackCuts->GetClusterRequirementITS(AliESDtrackCuts::kSPD)) {printf("ClusterReq SPD %d  %d\n",fTrackCuts->GetClusterRequirementITS(AliESDtrackCuts::kSPD),obj->fTrackCuts->GetClusterRequirementITS(AliESDtrackCuts::kSPD)); areEqual=kFALSE;}
-  }
-
-  if(fCutsRD) {
-   for(Int_t iv=0;iv<fnVars;iv++) {
-     for(Int_t ib=0;ib<fnPtBins;ib++) {
-       if(TMath::Abs(fCutsRD[GetGlobalIndex(iv,ib)]-obj->fCutsRD[GetGlobalIndex(iv,ib)])>1.e-10) {
-        cout<<"fCutsRD["<<iv<<"]["<<ib<<"] = "<<fCutsRD[GetGlobalIndex(iv,ib)]<<"   "<<obj->fCutsRD[GetGlobalIndex(iv,ib)]<<"\n";
-        areEqual=kFALSE;
-       }
-     }
-   }
-  }
-
-  return areEqual;
-}
-//---------------------------------------------------------------------------
-void AliRDHFCuts::MakeTable() const {
-  //
-  // print cuts values in table format
-  // 
-
-       TString ptString = "pT range";
-       if(fVarNames && fPtBinLimits && fCutsRD){
-               TString firstLine(Form("*       %-15s",ptString.Data()));
-               for (Int_t ivar=0; ivar<fnVars; ivar++){
-                       firstLine+=Form("*    %-15s  ",fVarNames[ivar].Data());
-                       if (ivar == fnVars){
-                               firstLine+="*\n";
-                       }
-               }
-               Printf("%s",firstLine.Data());
-               
-               for (Int_t ipt=0; ipt<fnPtBins; ipt++){
-                       TString line;
-                       if (ipt==fnPtBins-1){
-                               line=Form("*  %5.1f < pt < inf    ",fPtBinLimits[ipt]);
-                       }
-                       else{
-                               line=Form("*  %5.1f < pt < %4.1f   ",fPtBinLimits[ipt],fPtBinLimits[ipt+1]);
-                       }
-                       for (Int_t ivar=0; ivar<fnVars; ivar++){
-                               line+=Form("*     %-15f ",fCutsRD[GetGlobalIndex(ivar,ipt)]);
-                       }
-                       Printf("%s",line.Data());
-               }
-
-       }
-
-
-  return;
-}
+/**************************************************************************\r
+ * Copyright(c) 1998-2010, ALICE Experiment at CERN, All rights reserved. *\r
+ *                                                                        *\r
+ * Author: The ALICE Off-line Project.                                    *\r
+ * Contributors are mentioned in the code where appropriate.              *\r
+ *                                                                        *\r
+ * Permission to use, copy, modify and distribute this software and its   *\r
+ * documentation strictly for non-commercial purposes is hereby granted   *\r
+ * without fee, provided that the above copyright notice appears in all   *\r
+ * copies and that both the copyright notice and this permission notice   *\r
+ * appear in the supporting documentation. The authors make no claims     *\r
+ * about the suitability of this software for any purpose. It is          *\r
+ * provided "as is" without express or implied warranty.                  *\r
+ **************************************************************************/\r
+\r
+/////////////////////////////////////////////////////////////\r
+//\r
+// Base class for cuts on AOD reconstructed heavy-flavour decay\r
+//\r
+// Author: A.Dainese, andrea.dainese@pd.infn.it\r
+/////////////////////////////////////////////////////////////\r
+#include <Riostream.h>\r
+\r
+#include "AliVEvent.h"\r
+#include "AliESDEvent.h"\r
+#include "AliAODEvent.h"\r
+#include "AliVVertex.h"\r
+#include "AliESDVertex.h"\r
+#include "AliLog.h"\r
+#include "AliAODVertex.h"\r
+#include "AliESDtrack.h"\r
+#include "AliAODTrack.h"\r
+#include "AliESDtrackCuts.h"\r
+#include "AliAODRecoDecayHF.h"\r
+#include "AliRDHFCuts.h"\r
+\r
+ClassImp(AliRDHFCuts)\r
+\r
+//--------------------------------------------------------------------------\r
+AliRDHFCuts::AliRDHFCuts(const Char_t* name, const Char_t* title) : \r
+AliAnalysisCuts(name,title),\r
+fMinVtxType(3),\r
+fMinVtxContr(1),\r
+fMaxVtxRedChi2(1e6),\r
+fMaxVtxZ(1e6),\r
+fMinSPDMultiplicity(0),\r
+fTriggerMask(0),\r
+fTrackCuts(0),\r
+fnPtBins(1),\r
+fnPtBinLimits(1),\r
+fPtBinLimits(0),\r
+fnVars(1),\r
+fVarNames(0),\r
+fnVarsForOpt(0),\r
+fVarsForOpt(0),\r
+fGlobalIndex(1),\r
+fCutsRD(0),\r
+fIsUpperCut(0),\r
+fUsePID(kFALSE),\r
+fPidHF(0),\r
+fWhyRejection(0),\r
+fRemoveDaughtersFromPrimary(kFALSE),\r
+fOptPileup(0),\r
+fMinContrPileup(3),\r
+fMinDzPileup(0.6),\r
+fUseCentrality(0),\r
+fMinCentrality(0.),\r
+fMaxCentrality(100.)\r
+\r
+{\r
+  //\r
+  // Default Constructor\r
+  //\r
+}\r
+//--------------------------------------------------------------------------\r
+AliRDHFCuts::AliRDHFCuts(const AliRDHFCuts &source) :\r
+  AliAnalysisCuts(source),\r
+  fMinVtxType(source.fMinVtxType),\r
+  fMinVtxContr(source.fMinVtxContr),\r
+  fMaxVtxRedChi2(source.fMaxVtxRedChi2),\r
+  fMaxVtxZ(source.fMaxVtxZ),\r
+  fMinSPDMultiplicity(source.fMinSPDMultiplicity),\r
+  fTriggerMask(source.fTriggerMask),\r
+  fTrackCuts(0),\r
+  fnPtBins(source.fnPtBins),\r
+  fnPtBinLimits(source.fnPtBinLimits),\r
+  fPtBinLimits(0),\r
+  fnVars(source.fnVars),\r
+  fVarNames(0),\r
+  fnVarsForOpt(source.fnVarsForOpt),\r
+  fVarsForOpt(0),\r
+  fGlobalIndex(source.fGlobalIndex),\r
+  fCutsRD(0),\r
+  fIsUpperCut(0),\r
+  fUsePID(source.fUsePID),\r
+  fPidHF(0),\r
+  fWhyRejection(source.fWhyRejection),\r
+  fRemoveDaughtersFromPrimary(source.fRemoveDaughtersFromPrimary),\r
+  fOptPileup(source.fOptPileup),\r
+  fMinContrPileup(source.fMinContrPileup),\r
+  fMinDzPileup(source.fMinDzPileup),\r
+  fUseCentrality(source.fUseCentrality),\r
+  fMinCentrality(source.fMinCentrality),\r
+  fMaxCentrality(source.fMaxCentrality)\r
+\r
+\r
+{\r
+  //\r
+  // Copy constructor\r
+  //\r
+  cout<<"Copy constructor"<<endl;\r
+  if(source.GetTrackCuts()) AddTrackCuts(source.GetTrackCuts());\r
+  if(source.fPtBinLimits) SetPtBins(source.fnPtBinLimits,source.fPtBinLimits);\r
+  if(source.fVarNames) SetVarNames(source.fnVars,source.fVarNames,source.fIsUpperCut);\r
+  if(source.fCutsRD) SetCuts(source.fGlobalIndex,source.fCutsRD);\r
+  if(source.fVarsForOpt) SetVarsForOpt(source.fnVarsForOpt,source.fVarsForOpt);\r
+  if(source.fPidHF) SetPidHF(source.fPidHF);\r
+  PrintAll();\r
+\r
+}\r
+//--------------------------------------------------------------------------\r
+AliRDHFCuts &AliRDHFCuts::operator=(const AliRDHFCuts &source)\r
+{\r
+  //\r
+  // assignment operator\r
+  //\r
+  if(&source == this) return *this;\r
+\r
+  AliAnalysisCuts::operator=(source);\r
+\r
+  fMinVtxType=source.fMinVtxType;\r
+  fMinVtxContr=source.fMinVtxContr;\r
+  fMaxVtxRedChi2=source.fMaxVtxRedChi2;\r
+  fMaxVtxZ=source.fMaxVtxZ;\r
+  fMinSPDMultiplicity=source.fMinSPDMultiplicity;\r
+  fTriggerMask=source.fTriggerMask;\r
+  fnPtBins=source.fnPtBins;\r
+  fnVars=source.fnVars;\r
+  fGlobalIndex=source.fGlobalIndex;\r
+  fnVarsForOpt=source.fnVarsForOpt;\r
+  fUsePID=source.fUsePID;\r
+  SetPidHF(source.GetPidHF());\r
+  fWhyRejection=source.fWhyRejection;\r
+  fRemoveDaughtersFromPrimary=source.fRemoveDaughtersFromPrimary;\r
+  fOptPileup=source.fOptPileup;\r
+  fMinContrPileup=source.fMinContrPileup;\r
+  fMinDzPileup=source.fMinDzPileup;\r
+  fUseCentrality=source.fUseCentrality;\r
+  fMinCentrality=source.fMinCentrality;\r
+  fMaxCentrality=source.fMaxCentrality;\r
+\r
+  if(source.GetTrackCuts()) AddTrackCuts(source.GetTrackCuts());\r
+  if(source.fPtBinLimits) SetPtBins(source.fnPtBinLimits,source.fPtBinLimits);\r
+  if(source.fVarNames) SetVarNames(source.fnVars,source.fVarNames,source.fIsUpperCut);\r
+  if(source.fCutsRD) SetCuts(source.fGlobalIndex,source.fCutsRD);\r
+  if(source.fVarsForOpt) SetVarsForOpt(source.fnVarsForOpt,source.fVarsForOpt);\r
+  PrintAll();\r
+\r
+  return *this;\r
+}\r
+//--------------------------------------------------------------------------\r
+AliRDHFCuts::~AliRDHFCuts() {\r
+  //  \r
+  // Default Destructor\r
+  //\r
+  if(fPtBinLimits) {delete [] fPtBinLimits; fPtBinLimits=0;}\r
+  if(fVarNames) {delete [] fVarNames; fVarNames=0;}\r
+  if(fVarsForOpt) {delete [] fVarsForOpt; fVarsForOpt=0;}\r
+  if(fCutsRD) {\r
+    delete [] fCutsRD;\r
+    fCutsRD=0;\r
+  }\r
+  if(fIsUpperCut) {delete [] fIsUpperCut; fIsUpperCut=0;}\r
+  if(fPidHF){ \r
+    delete fPidHF;\r
+    fPidHF=0;\r
+  }\r
+}\r
+//---------------------------------------------------------------------------\r
+Bool_t AliRDHFCuts::IsEventSelected(AliVEvent *event) {\r
+  //\r
+  // Event selection\r
+  // \r
+  //if(fTriggerMask && event->GetTriggerMask()!=fTriggerMask) return kFALSE;\r
+\r
+  fWhyRejection=0;\r
+\r
+  // multiplicity cuts no implemented yet\r
+   \r
+  const AliVVertex *vertex = event->GetPrimaryVertex();\r
+\r
+  if(!vertex) return kFALSE;\r
+\r
+  TString title=vertex->GetTitle();\r
+  if(title.Contains("Z") && fMinVtxType>1) return kFALSE; \r
+  if(title.Contains("3D") && fMinVtxType>2) return kFALSE; \r
+\r
+  if(vertex->GetNContributors()<fMinVtxContr) return kFALSE; \r
+\r
+  if(TMath::Abs(vertex->GetZ())>fMaxVtxZ) return kFALSE;\r
+\r
+  // switch to settings for 1-pad cls in TPC\r
+  if(fPidHF) {\r
+    if(event->GetRunNumber()>121693 && event->GetRunNumber()<136851) \r
+      fPidHF->SetOnePad(kTRUE);\r
+    if(event->GetRunNumber()>=136851 && event->GetRunNumber()<=139517) \r
+      fPidHF->SetPbPb(kTRUE);\r
+  }\r
+\r
+  if(fOptPileup==kRejectPileupEvent){\r
+    Int_t cutc=(Int_t)fMinContrPileup;\r
+    Double_t cutz=(Double_t)fMinDzPileup;\r
+    if(event->IsPileupFromSPD(cutc,cutz,3.,2.,10.)) {\r
+      fWhyRejection=1;\r
+      return kFALSE;\r
+    }\r
+  }\r
+\r
+  //centrality selection\r
+  if (!(fUseCentrality==kCentOff)){ \r
+    if(fUseCentrality<kCentOff||fUseCentrality>=kCentInvalid){\r
+      AliWarning("Centrality estimator not valid");\r
+      fWhyRejection=3;\r
+      return kFALSE;\r
+    }else{\r
+      Float_t centvalue=GetCentrality((AliAODEvent*)event);\r
+      if (centvalue<0.){\r
+       if (fWhyRejection==3) return kFALSE;\r
+       else return kTRUE;\r
+      }\r
+      else{\r
+       \r
+       if (centvalue<fMinCentrality || centvalue>fMaxCentrality){\r
+         fWhyRejection=2; \r
+         return kFALSE; \r
+       }\r
+      }\r
+    }\r
+  }\r
+\r
+\r
+  return kTRUE;\r
+}\r
+//---------------------------------------------------------------------------\r
+Bool_t AliRDHFCuts::AreDaughtersSelected(AliAODRecoDecayHF *d) const {\r
+  //\r
+  // Daughter tracks selection\r
+  // \r
+  if(!fTrackCuts) return kTRUE;\r
+\r
+  Int_t ndaughters = d->GetNDaughters();\r
+  AliAODVertex *vAOD = d->GetPrimaryVtx();\r
+  Double_t pos[3],cov[6];\r
+  vAOD->GetXYZ(pos);\r
+  vAOD->GetCovarianceMatrix(cov);\r
+  const AliESDVertex vESD(pos,cov,100.,100);\r
+\r
+  Bool_t retval=kTRUE;\r
+\r
+  for(Int_t idg=0; idg<ndaughters; idg++) {\r
+    AliAODTrack *dgTrack = (AliAODTrack*)d->GetDaughter(idg);\r
+    if(!dgTrack) retval = kFALSE;\r
+    //printf("charge %d\n",dgTrack->Charge());\r
+    if(dgTrack->Charge()==0) continue; // it's not a track, but a V0\r
+\r
+    if(!IsDaughterSelected(dgTrack,&vESD,fTrackCuts)) retval = kFALSE;\r
+  }\r
+\r
+  return retval;\r
+}\r
+//---------------------------------------------------------------------------\r
+Bool_t AliRDHFCuts::IsDaughterSelected(AliAODTrack *track,const AliESDVertex *primary,AliESDtrackCuts *cuts) const {\r
+  //\r
+  // Convert to ESDtrack, relate to vertex and check cuts\r
+  //\r
+  if(!cuts) return kTRUE;\r
+\r
+  Bool_t retval=kTRUE;\r
+\r
+  // convert to ESD track here\r
+  AliESDtrack esdTrack(track);\r
+  // needed to calculate the impact parameters\r
+  esdTrack.RelateToVertex(primary,0.,3.); \r
+  if(!cuts->IsSelected(&esdTrack)) retval = kFALSE;\r
\r
+  if(fOptPileup==kRejectTracksFromPileupVertex){\r
+    // to be implemented\r
+    // we need either to have here the AOD Event, \r
+    // or to have the pileup vertex object\r
+  }\r
+  return retval; \r
+}\r
+//---------------------------------------------------------------------------\r
+void AliRDHFCuts::SetPtBins(Int_t nPtBinLimits,Float_t *ptBinLimits) {\r
+  // Set the pt bins\r
+\r
+  if(fPtBinLimits) {\r
+    delete [] fPtBinLimits;\r
+    fPtBinLimits = NULL;\r
+    printf("Changing the pt bins\n");\r
+  }\r
+\r
+  if(nPtBinLimits != fnPtBins+1){\r
+    cout<<"Warning: ptBinLimits dimention "<<nPtBinLimits<<" != nPtBins+1 ("<<fnPtBins+1<<")\nSetting nPtBins to "<<nPtBinLimits-1<<endl;\r
+    SetNPtBins(nPtBinLimits-1);\r
+  }\r
+\r
+  fnPtBinLimits = nPtBinLimits;\r
+  SetGlobalIndex();\r
+  //cout<<"Changing also Global Index -> "<<fGlobalIndex<<endl;\r
+  fPtBinLimits = new Float_t[fnPtBinLimits];\r
+  for(Int_t ib=0; ib<nPtBinLimits; ib++) fPtBinLimits[ib]=ptBinLimits[ib];\r
+\r
+  return;\r
+}\r
+//---------------------------------------------------------------------------\r
+void AliRDHFCuts::SetVarNames(Int_t nVars,TString *varNames,Bool_t *isUpperCut){\r
+  // Set the variable names\r
+\r
+  if(fVarNames) {\r
+    delete [] fVarNames;\r
+    fVarNames = NULL;\r
+    //printf("Changing the variable names\n");\r
+  }\r
+  if(nVars!=fnVars){\r
+    printf("Wrong number of variables: it has to be %d\n",fnVars);\r
+    return;\r
+  }\r
+  //fnVars=nVars;\r
+  fVarNames = new TString[nVars];\r
+  fIsUpperCut = new Bool_t[nVars];\r
+  for(Int_t iv=0; iv<nVars; iv++) {\r
+    fVarNames[iv] = varNames[iv];\r
+    fIsUpperCut[iv] = isUpperCut[iv];\r
+  }\r
+\r
+  return;\r
+}\r
+//---------------------------------------------------------------------------\r
+void AliRDHFCuts::SetVarsForOpt(Int_t nVars,Bool_t *forOpt) {\r
+  // Set the variables to be used for cuts optimization\r
+\r
+  if(fVarsForOpt) {\r
+    delete [] fVarsForOpt;\r
+    fVarsForOpt = NULL;\r
+    //printf("Changing the variables for cut optimization\n");\r
+  }\r
+  \r
+  if(nVars==0){//!=fnVars) {\r
+    printf("%d not accepted as number of variables: it has to be %d\n",nVars,fnVars);\r
+    return;\r
+  } \r
+  \r
+  fnVarsForOpt = 0;\r
+  fVarsForOpt = new Bool_t[fnVars];\r
+  for(Int_t iv=0; iv<fnVars; iv++) {\r
+    fVarsForOpt[iv]=forOpt[iv];\r
+    if(fVarsForOpt[iv]) fnVarsForOpt++;\r
+  }\r
+\r
+  return;\r
+}\r
+\r
+//---------------------------------------------------------------------------\r
+void AliRDHFCuts::SetUseCentrality(Int_t flag) {\r
+  //\r
+  // set centrality estimator\r
+  //\r
+  fUseCentrality=flag;\r
+  if (fUseCentrality<kCentOff||fUseCentrality>=kCentInvalid) AliWarning("Centrality estimator not valid");\r
\r
+  return;\r
+}\r
+\r
+\r
+//---------------------------------------------------------------------------\r
+void AliRDHFCuts::SetCuts(Int_t nVars,Int_t nPtBins,Float_t **cutsRD) {\r
+  //\r
+  // store the cuts\r
+  //\r
+  if(nVars!=fnVars) {\r
+    printf("Wrong number of variables: it has to be %d\n",fnVars);\r
+    return;\r
+  } \r
+  if(nPtBins!=fnPtBins) {\r
+    printf("Wrong number of pt bins: it has to be %d\n",fnPtBins);\r
+    return;\r
+  } \r
+\r
+  if(!fCutsRD)  fCutsRD = new Float_t[fGlobalIndex];\r
+  \r
+\r
+  for(Int_t iv=0; iv<fnVars; iv++) {\r
+\r
+    for(Int_t ib=0; ib<fnPtBins; ib++) {\r
+\r
+      //check\r
+      if(GetGlobalIndex(iv,ib)>=fGlobalIndex) {\r
+       cout<<"Overflow, exit..."<<endl;\r
+       return;\r
+      }\r
+\r
+      fCutsRD[GetGlobalIndex(iv,ib)] = cutsRD[iv][ib];\r
+\r
+    }\r
+  }\r
+  return;\r
+}\r
+//---------------------------------------------------------------------------\r
+void AliRDHFCuts::SetCuts(Int_t glIndex,Float_t* cutsRDGlob){\r
+  //\r
+  // store the cuts\r
+  //\r
+  if(glIndex != fGlobalIndex){\r
+    cout<<"Wrong array size: it has to be "<<fGlobalIndex<<endl;\r
+    return;\r
+  }\r
+  if(!fCutsRD)  fCutsRD = new Float_t[fGlobalIndex];\r
+\r
+  for(Int_t iGl=0;iGl<fGlobalIndex;iGl++){\r
+    fCutsRD[iGl] = cutsRDGlob[iGl];\r
+  }\r
+  return;\r
+}\r
+//---------------------------------------------------------------------------\r
+void AliRDHFCuts::PrintAll() const {\r
+  //\r
+  // print all cuts values\r
+  // \r
+\r
+  printf("Minimum vtx type %d\n",fMinVtxType);\r
+  printf("Minimum vtx contr %d\n",fMinVtxContr);\r
+  printf("Max vtx red chi2 %f\n",fMaxVtxRedChi2);\r
+  printf("Min SPD mult %d\n",fMinSPDMultiplicity);\r
+  printf("Use PID %d\n",(Int_t)fUsePID);\r
+  printf("Remove daughters from vtx %d\n",(Int_t)fRemoveDaughtersFromPrimary);\r
+\r
+  if(fVarNames){\r
+    cout<<"Array of variables"<<endl;\r
+    for(Int_t iv=0;iv<fnVars;iv++){\r
+      cout<<fVarNames[iv]<<"\t";\r
+    }\r
+    cout<<endl;\r
+  }\r
+  if(fVarsForOpt){\r
+    cout<<"Array of optimization"<<endl;\r
+    for(Int_t iv=0;iv<fnVars;iv++){\r
+      cout<<fVarsForOpt[iv]<<"\t";\r
+    }\r
+    cout<<endl;\r
+  }\r
+  if(fIsUpperCut){\r
+    cout<<"Array of upper/lower cut"<<endl;\r
+   for(Int_t iv=0;iv<fnVars;iv++){\r
+     cout<<fIsUpperCut[iv]<<"\t";\r
+   }\r
+   cout<<endl;\r
+  }\r
+  if(fPtBinLimits){\r
+    cout<<"Array of ptbin limits"<<endl;\r
+    for(Int_t ib=0;ib<fnPtBinLimits;ib++){\r
+      cout<<fPtBinLimits[ib]<<"\t";\r
+    }\r
+    cout<<endl;\r
+  }\r
+  if(fCutsRD){\r
+    cout<<"Matrix of cuts"<<endl;\r
+   for(Int_t iv=0;iv<fnVars;iv++){\r
+     for(Int_t ib=0;ib<fnPtBins;ib++){\r
+       cout<<"fCutsRD["<<iv<<"]["<<ib<<"] = "<<fCutsRD[GetGlobalIndex(iv,ib)]<<"\t";\r
+     }\r
+     cout<<endl;\r
+   }\r
+   cout<<endl;\r
+  }\r
+  return;\r
+}\r
+//---------------------------------------------------------------------------\r
+void AliRDHFCuts::GetCuts(Float_t**& cutsRD) const{\r
+  //\r
+  // get the cuts\r
+  //\r
+\r
+  //cout<<"Give back a "<<fnVars<<"x"<<fnPtBins<<" matrix."<<endl;\r
+\r
+\r
+  Int_t iv,ib;\r
+  if(!cutsRD) {\r
+    //cout<<"Initialization..."<<endl;\r
+    cutsRD=new Float_t*[fnVars];\r
+    for(iv=0; iv<fnVars; iv++) {\r
+      cutsRD[iv] = new Float_t[fnPtBins];\r
+    }\r
+  }\r
+  \r
+  for(Int_t iGlobal=0; iGlobal<fGlobalIndex; iGlobal++) {\r
+    GetVarPtIndex(iGlobal,iv,ib);\r
+    cutsRD[iv][ib] = fCutsRD[iGlobal];\r
+  }\r
+\r
+  return;\r
+}\r
+\r
+//---------------------------------------------------------------------------\r
+Int_t AliRDHFCuts::GetGlobalIndex(Int_t iVar,Int_t iPtBin) const{\r
+  //\r
+  // give the global index from variable and pt bin\r
+  //\r
+  return iPtBin*fnVars+iVar;\r
+}\r
+\r
+//---------------------------------------------------------------------------\r
+void AliRDHFCuts::GetVarPtIndex(Int_t iGlob, Int_t& iVar, Int_t& iPtBin) const {\r
+  //\r
+  //give the index of the variable and of the pt bin from the global index\r
+  //\r
+  iPtBin=(Int_t)iGlob/fnVars;\r
+  iVar=iGlob%fnVars;\r
+\r
+  return;\r
+}\r
+\r
+//---------------------------------------------------------------------------\r
+Int_t AliRDHFCuts::PtBin(Double_t pt) const {\r
+  //\r
+  //give the pt bin where the pt lies.\r
+  //\r
+  Int_t ptbin=-1;\r
+  for (Int_t i=0;i<fnPtBins;i++){\r
+    if(pt<fPtBinLimits[i+1]) {\r
+      ptbin=i;\r
+      break;\r
+    }\r
+  }\r
+  return ptbin;\r
+}\r
+//-------------------------------------------------------------------\r
+Float_t AliRDHFCuts::GetCutValue(Int_t iVar,Int_t iPtBin) const {\r
+  // \r
+  // Give the value of cut set for the variable iVar and the pt bin iPtBin\r
+  //\r
+  if(!fCutsRD){\r
+    cout<<"Cuts not iniziaisez yet"<<endl;\r
+    return 0;\r
+  }\r
+  return fCutsRD[GetGlobalIndex(iVar,iPtBin)];\r
+}\r
+//-------------------------------------------------------------------\r
+Float_t AliRDHFCuts::GetCentrality(AliAODEvent* aodEvent) const {\r
+  //\r
+  // Get centrality percentile\r
+  //\r
+  AliAODHeader *header=aodEvent->GetHeader();\r
+  AliCentrality *centrality=header->GetCentralityP();\r
+  Float_t cent=-999.;\r
+  if(!centrality) return cent;\r
+  else{\r
+    if (fUseCentrality==kCentV0M) cent=(Float_t)(centrality->GetCentralityPercentile("V0M"));\r
+    else {\r
+      if (fUseCentrality==kCentTRK) cent=(Float_t)(centrality->GetCentralityPercentile("TRK"));\r
+      else{\r
+       if (fUseCentrality==kCentTKL) cent=(Float_t)(centrality->GetCentralityPercentile("TKL"));\r
+       else{\r
+         if (fUseCentrality==kCentCL1) cent=(Float_t)(centrality->GetCentralityPercentile("CL1"));\r
+         else {\r
+           AliWarning("Centrality estimator not valid");\r
+         }\r
+       }\r
+      }\r
+    } \r
+  }\r
+  return cent;\r
+}\r
+//-------------------------------------------------------------------\r
+Bool_t AliRDHFCuts::CompareCuts(const AliRDHFCuts *obj) const {\r
+  //\r
+  // Compare two cuts objects\r
+  //\r
+\r
+  Bool_t areEqual=kTRUE;\r
+\r
+  if(fMinVtxType!=obj->fMinVtxType) { printf("Minimum vtx type %d  %d\n",fMinVtxType,obj->fMinVtxType); areEqual=kFALSE;}\r
+\r
+  if(fMinVtxContr!=obj->fMinVtxContr) { printf("Minimum vtx contr %d  %d\n",fMinVtxContr,obj->fMinVtxContr); areEqual=kFALSE;}\r
+\r
+  if(TMath::Abs(fMaxVtxRedChi2-obj->fMaxVtxRedChi2)>1.e-10) {   printf("Max vtx red chi2 %f  %f\n",fMaxVtxRedChi2,obj->fMaxVtxRedChi2);areEqual=kFALSE;}\r
+\r
+  if(fMinSPDMultiplicity!=obj->fMinSPDMultiplicity) {  printf("Min SPD mult %d\n  %d",fMinSPDMultiplicity,obj->fMinSPDMultiplicity);areEqual=kFALSE;}\r
+\r
+  if(fUsePID!=obj->fUsePID) { printf("Use PID %d  %d\n",(Int_t)fUsePID,(Int_t)obj->fUsePID); areEqual=kFALSE;}\r
+\r
+  if(fRemoveDaughtersFromPrimary!=obj->fRemoveDaughtersFromPrimary) {printf("Remove daughters from vtx %d  %d\n",(Int_t)fRemoveDaughtersFromPrimary,(Int_t)obj->fRemoveDaughtersFromPrimary); areEqual=kFALSE;}\r
+  if(fTrackCuts){\r
+    if(fTrackCuts->GetMinNClusterTPC()!=obj->fTrackCuts->GetMinNClusterTPC()) {printf("MinNClsTPC %d  %d\n",fTrackCuts->GetMinNClusterTPC(),obj->fTrackCuts->GetMinNClusterTPC()); areEqual=kFALSE;}\r
+\r
+    if(fTrackCuts->GetMinNClustersITS()!=obj->fTrackCuts->GetMinNClustersITS()) {printf("MinNClsITS %d  %d\n",fTrackCuts->GetMinNClustersITS(),obj->fTrackCuts->GetMinNClustersITS()); areEqual=kFALSE;}\r
+\r
+    if(TMath::Abs(fTrackCuts->GetMaxChi2PerClusterTPC()-obj->fTrackCuts->GetMaxChi2PerClusterTPC())>1.e-10) {printf("MaxChi2ClsTPC %f  %f\n",fTrackCuts->GetMaxChi2PerClusterTPC(),obj->fTrackCuts->GetMaxChi2PerClusterTPC()); areEqual=kFALSE;}\r
+\r
+    if(fTrackCuts->GetClusterRequirementITS(AliESDtrackCuts::kSPD)!=obj->fTrackCuts->GetClusterRequirementITS(AliESDtrackCuts::kSPD)) {printf("ClusterReq SPD %d  %d\n",fTrackCuts->GetClusterRequirementITS(AliESDtrackCuts::kSPD),obj->fTrackCuts->GetClusterRequirementITS(AliESDtrackCuts::kSPD)); areEqual=kFALSE;}\r
+  }\r
+\r
+  if(fCutsRD) {\r
+   for(Int_t iv=0;iv<fnVars;iv++) {\r
+     for(Int_t ib=0;ib<fnPtBins;ib++) {\r
+       if(TMath::Abs(fCutsRD[GetGlobalIndex(iv,ib)]-obj->fCutsRD[GetGlobalIndex(iv,ib)])>1.e-10) {\r
+        cout<<"fCutsRD["<<iv<<"]["<<ib<<"] = "<<fCutsRD[GetGlobalIndex(iv,ib)]<<"   "<<obj->fCutsRD[GetGlobalIndex(iv,ib)]<<"\n";\r
+        areEqual=kFALSE;\r
+       }\r
+     }\r
+   }\r
+  }\r
+\r
+  return areEqual;\r
+}\r
+//---------------------------------------------------------------------------\r
+void AliRDHFCuts::MakeTable() const {\r
+  //\r
+  // print cuts values in table format\r
+  // \r
+\r
+       TString ptString = "pT range";\r
+       if(fVarNames && fPtBinLimits && fCutsRD){\r
+               TString firstLine(Form("*       %-15s",ptString.Data()));\r
+               for (Int_t ivar=0; ivar<fnVars; ivar++){\r
+                       firstLine+=Form("*    %-15s  ",fVarNames[ivar].Data());\r
+                       if (ivar == fnVars){\r
+                               firstLine+="*\n";\r
+                       }\r
+               }\r
+               Printf("%s",firstLine.Data());\r
+               \r
+               for (Int_t ipt=0; ipt<fnPtBins; ipt++){\r
+                       TString line;\r
+                       if (ipt==fnPtBins-1){\r
+                               line=Form("*  %5.1f < pt < inf    ",fPtBinLimits[ipt]);\r
+                       }\r
+                       else{\r
+                               line=Form("*  %5.1f < pt < %4.1f   ",fPtBinLimits[ipt],fPtBinLimits[ipt+1]);\r
+                       }\r
+                       for (Int_t ivar=0; ivar<fnVars; ivar++){\r
+                               line+=Form("*     %-15f ",fCutsRD[GetGlobalIndex(ivar,ipt)]);\r
+                       }\r
+                       Printf("%s",line.Data());\r
+               }\r
+\r
+       }\r
+\r
+\r
+  return;\r
+}\r
index 8e791f97375abf685f294691cb944dde0f48f3da..997cd4230a18eb559abfb6610d0322edb0894555 100644 (file)
-#ifndef ALIRDHFCUTS_H
-#define ALIRDHFCUTS_H
-/* Copyright(c) 1998-2010, ALICE Experiment at CERN, All rights reserved. *
- * See cxx source for full Copyright notice                               */
-
-//***********************************************************
-// Class AliRDHFCuts
-// base class for cuts on AOD reconstructed heavy-flavour decays
-// Author: A.Dainese, andrea.dainese@pd.infn.it
-//***********************************************************
-
-#include "AliAnalysisCuts.h"
-#include "AliESDtrackCuts.h"
-#include "AliAODPidHF.h"
-#include "AliAODEvent.h"
-#include "AliVEvent.h"
-
-class AliAODTrack;
-class AliAODRecoDecayHF;
-class AliESDVertex;
-
-class AliRDHFCuts : public AliAnalysisCuts 
-{
- public:
-
-  AliRDHFCuts(const Char_t* name="RDHFCuts", const Char_t* title="");
-  
-  virtual ~AliRDHFCuts();
-  
-  AliRDHFCuts(const AliRDHFCuts& source);
-  AliRDHFCuts& operator=(const AliRDHFCuts& source); 
-
-  virtual void SetStandardCutsPP2010() {return;}  
-  virtual void SetStandardCutsPbPb2010() {return;}  
-
-
-  void SetMinCentrality(Float_t minCentrality=0.) {fMinCentrality=minCentrality;} 
-  void SetMaxCentrality(Float_t maxCentrality=100.) {fMinCentrality=maxCentrality;} 
-  void SetMinVtxType(Int_t type=3) {fMinVtxType=type;}  
-  void SetMinVtxContr(Int_t contr=1) {fMinVtxContr=contr;}  
-  void SetMaxVtxRdChi2(Float_t chi2=1e6) {fMaxVtxRedChi2=chi2;}  
-  void SetMaxVtxZ(Float_t z=1e6) {fMaxVtxZ=z;}  
-  void SetMinSPDMultiplicity(Int_t mult=0) {fMinSPDMultiplicity=mult;}  
-  void SetTriggerMask(ULong64_t mask=0) {fTriggerMask=mask;} 
-  void SetVarsForOpt(Int_t nVars,Bool_t *forOpt);
-  void SetGlobalIndex(){fGlobalIndex=fnVars*fnPtBins;}
-  void SetGlobalIndex(Int_t nVars,Int_t nptBins){fnVars=nVars; fnPtBins=nptBins; SetGlobalIndex();}
-  void SetVarNames(Int_t nVars,TString *varNames,Bool_t *isUpperCut);  
-  void SetPtBins(Int_t nPtBinLimits,Float_t *ptBinLimits);
-  void SetCuts(Int_t nVars,Int_t nPtBins,Float_t** cutsRD);
-  void SetCuts(Int_t glIndex, Float_t* cutsRDGlob);
-  void AddTrackCuts(const AliESDtrackCuts *cuts) 
-         {fTrackCuts=new AliESDtrackCuts(*cuts); return;}
-  void SetUsePID(Bool_t flag=kTRUE) {fUsePID=flag; return;}
-  void SetUseCentrality(Int_t flag=1);    // see enum below
-  void SetPidHF(AliAODPidHF* pidObj) {
-    if(fPidHF) delete fPidHF;
-    fPidHF=new AliAODPidHF(*pidObj);
-  }
-  void SetRemoveDaughtersFromPrim(Bool_t removeDaughtersPrim) {fRemoveDaughtersFromPrimary=removeDaughtersPrim;}
-  void SetOptPileup(Int_t opt=0){
-    // see enum below
-    fOptPileup=opt;
-  }
-  void ConfigurePileupCuts(Int_t minContrib=3, Float_t minDz=0.6){
-    fMinContrPileup=minContrib;
-    fMinDzPileup=minDz;
-  }
-
-
-  AliAODPidHF* GetPidHF() const {return fPidHF;}
-  Float_t *GetPtBinLimits() const {return fPtBinLimits;}
-  Int_t   GetNPtBins() const {return fnPtBins;}
-  Int_t   GetNVars() const {return fnVars;} 
-  TString *GetVarNames() const {return fVarNames;} 
-  Bool_t  *GetVarsForOpt() const {return fVarsForOpt;} 
-  Int_t   GetNVarsForOpt() const {return fnVarsForOpt;}
-  const Float_t *GetCuts() const {return fCutsRD;} 
-  void    GetCuts(Float_t**& cutsRD) const;
-  Float_t GetCutValue(Int_t iVar,Int_t iPtBin) const;
-  Float_t GetCentrality(AliAODEvent* aodEvent);
-  Bool_t  *GetIsUpperCut() const {return fIsUpperCut;}
-  AliESDtrackCuts *GetTrackCuts() const {return fTrackCuts;}
-  virtual void GetCutVarsForOpt(AliAODRecoDecayHF *d,Float_t *vars,Int_t nvars,Int_t *pdgdaughters) = 0;
-  Int_t   GetGlobalIndex(Int_t iVar,Int_t iPtBin) const;
-  void    GetVarPtIndex(Int_t iGlob, Int_t& iVar, Int_t& iPtBin) const;
-  Bool_t  GetIsUsePID() const {return fUsePID;}
-  Bool_t  GetIsPrimaryWithoutDaughters() const {return fRemoveDaughtersFromPrimary;}
-  Bool_t GetOptPileUp() const {return fOptPileup;}
-  Int_t GetUseCentrality() const {return fUseCentrality;}
-  Float_t GetMinCentrality() const {return fMinCentrality;}
-  Float_t GetMaxCentrality() const {return fMaxCentrality;}
-  Bool_t IsSelected(TObject *obj) {return IsSelected(obj,AliRDHFCuts::kAll);}
-  Bool_t IsSelected(TList *list) {if(!list) return kTRUE; return kFALSE;}
-  Bool_t IsEventSelected(AliVEvent *event);
-  Bool_t AreDaughtersSelected(AliAODRecoDecayHF *rd) const;
-  Bool_t IsDaughterSelected(AliAODTrack *track,const AliESDVertex *primary,AliESDtrackCuts *cuts) const;
-  virtual Int_t IsSelectedPID(AliAODRecoDecayHF * /*rd*/) {return 1;}
-
-  virtual Int_t IsSelected(TObject* obj,Int_t selectionLevel) = 0;
-  virtual Int_t IsSelected(TObject* obj,Int_t selectionLevel,AliAODEvent* /*aod*/)
-                {return IsSelected(obj,selectionLevel);}
-  Int_t PtBin(Double_t pt) const;
-  void PrintAll()const;
-
-  virtual Bool_t IsInFiducialAcceptance(Double_t /*pt*/,Double_t /*y*/) const {return kTRUE;}
-
-  void SetWhyRejection(Int_t why) {fWhyRejection=why; return;}
-  Int_t GetWhyRejection() const {return fWhyRejection;}
-
-  Bool_t CompareCuts(const AliRDHFCuts *obj) const;
-  void MakeTable()const;
-
-  enum{kAll,kTracks,kPID,kCandidate};
-  enum{kNoPileupSelection,kRejectPileupEvent,kRejectTracksFromPileupVertex};
-  enum{kCentOff,kCentV0M,kCentTRK,kCentTKL,kCentCL1,kCentInvalid};
-
- protected:
-
-  void SetNPtBins(Int_t nptBins){fnPtBins=nptBins;}
-  void SetNVars(Int_t nVars){fnVars=nVars;}
-
-  // cuts on the event
-  Int_t fMinVtxType; // 0: not cut; 1: SPDZ; 2: SPD3D; 3: Tracks
-  Int_t fMinVtxContr;   // minimum vertex contributors
-  Float_t fMaxVtxRedChi2; // maximum chi2/ndf
-  Float_t fMaxVtxZ; // maximum |z| of primary vertex
-  Int_t fMinSPDMultiplicity; // SPD multiplicity
-  ULong64_t fTriggerMask; // trigger mask
-  // quality cuts on the daughter tracks
-  AliESDtrackCuts *fTrackCuts; // tracks for daughter tracks (AOD converted to ESD on the flight!)
-  // cuts on the candidate
-  Int_t fnPtBins;  // number of pt bins for cuts
-  Int_t fnPtBinLimits; // "number of limits", that is fnPtBins+1
-  Float_t* fPtBinLimits; //[fnPtBinLimits]  pt bins
-  Int_t fnVars;    // number of cut vars for candidates
-  TString *fVarNames; //[fnVars] names of the variables
-  Int_t fnVarsForOpt;    // number of cut vars to be optimized for candidates
-  Bool_t *fVarsForOpt; //[fnVars] kTRUE for vars to be used in optimization
-  Int_t fGlobalIndex; // fnVars*fnPtBins
-  Float_t *fCutsRD; //[fGlobalIndex] the cuts values
-  Bool_t  *fIsUpperCut; //[fnVars] use > or < to select
-  Bool_t fUsePID; // enable PID usage (off by default)
-  AliAODPidHF *fPidHF; // PID for heavy flavours manager
-  Int_t fWhyRejection; // used to code the step at which candidate was rejected
-  Bool_t fRemoveDaughtersFromPrimary; // flag to switch on the removal of duaghters from the primary vertex computation
-  Int_t  fOptPileup;      // option for pielup selection
-  Int_t  fMinContrPileup; // min. n. of tracklets in pileup vertex
-  Float_t fMinDzPileup;   // min deltaz between main and pileup vertices
-  Int_t   fUseCentrality; // off =0 (default)
-                          // 1 = V0 
-                          // 2 = Tracks
-                          // 3 = Tracklets
-                          // 4 = SPD clusters outer 
-  Float_t fMinCentrality; // minimum centrality for selected events
-  Float_t fMaxCentrality; // maximum centrality for selected events
-
-  ClassDef(AliRDHFCuts,8);  // base class for cuts on AOD reconstructed heavy-flavour decays
-};
-
-#endif
+#ifndef ALIRDHFCUTS_H\r
+#define ALIRDHFCUTS_H\r
+/* Copyright(c) 1998-2010, ALICE Experiment at CERN, All rights reserved. *\r
+ * See cxx source for full Copyright notice                               */\r
+\r
+//***********************************************************\r
+// Class AliRDHFCuts\r
+// base class for cuts on AOD reconstructed heavy-flavour decays\r
+// Author: A.Dainese, andrea.dainese@pd.infn.it\r
+//***********************************************************\r
+\r
+#include "AliAnalysisCuts.h"\r
+#include "AliESDtrackCuts.h"\r
+#include "AliAODPidHF.h"\r
+#include "AliAODEvent.h"\r
+#include "AliVEvent.h"\r
+\r
+class AliAODTrack;\r
+class AliAODRecoDecayHF;\r
+class AliESDVertex;\r
+\r
+class AliRDHFCuts : public AliAnalysisCuts \r
+{\r
+ public:\r
+\r
+  AliRDHFCuts(const Char_t* name="RDHFCuts", const Char_t* title="");\r
+  \r
+  virtual ~AliRDHFCuts();\r
+  \r
+  AliRDHFCuts(const AliRDHFCuts& source);\r
+  AliRDHFCuts& operator=(const AliRDHFCuts& source); \r
+\r
+  virtual void SetStandardCutsPP2010() {return;}  \r
+  virtual void SetStandardCutsPbPb2010() {return;}  \r
+\r
+\r
+  void SetMinCentrality(Float_t minCentrality=0.) {fMinCentrality=minCentrality;} \r
+  void SetMaxCentrality(Float_t maxCentrality=100.) {fMinCentrality=maxCentrality;} \r
+  void SetMinVtxType(Int_t type=3) {fMinVtxType=type;}  \r
+  void SetMinVtxContr(Int_t contr=1) {fMinVtxContr=contr;}  \r
+  void SetMaxVtxRdChi2(Float_t chi2=1e6) {fMaxVtxRedChi2=chi2;}  \r
+  void SetMaxVtxZ(Float_t z=1e6) {fMaxVtxZ=z;}  \r
+  void SetMinSPDMultiplicity(Int_t mult=0) {fMinSPDMultiplicity=mult;}  \r
+  void SetTriggerMask(ULong64_t mask=0) {fTriggerMask=mask;} \r
+  void SetVarsForOpt(Int_t nVars,Bool_t *forOpt);\r
+  void SetGlobalIndex(){fGlobalIndex=fnVars*fnPtBins;}\r
+  void SetGlobalIndex(Int_t nVars,Int_t nptBins){fnVars=nVars; fnPtBins=nptBins; SetGlobalIndex();}\r
+  void SetVarNames(Int_t nVars,TString *varNames,Bool_t *isUpperCut);  \r
+  void SetPtBins(Int_t nPtBinLimits,Float_t *ptBinLimits);\r
+  void SetCuts(Int_t nVars,Int_t nPtBins,Float_t** cutsRD);\r
+  void SetCuts(Int_t glIndex, Float_t* cutsRDGlob);\r
+  void AddTrackCuts(const AliESDtrackCuts *cuts) \r
+         {fTrackCuts=new AliESDtrackCuts(*cuts); return;}\r
+  void SetUsePID(Bool_t flag=kTRUE) {fUsePID=flag; return;}\r
+  void SetUseCentrality(Int_t flag=1);    // see enum below\r
+  void SetPidHF(AliAODPidHF* pidObj) {\r
+    if(fPidHF) delete fPidHF;\r
+    fPidHF=new AliAODPidHF(*pidObj);\r
+  }\r
+  void SetRemoveDaughtersFromPrim(Bool_t removeDaughtersPrim) {fRemoveDaughtersFromPrimary=removeDaughtersPrim;}\r
+  void SetOptPileup(Int_t opt=0){\r
+    // see enum below\r
+    fOptPileup=opt;\r
+  }\r
+  void ConfigurePileupCuts(Int_t minContrib=3, Float_t minDz=0.6){\r
+    fMinContrPileup=minContrib;\r
+    fMinDzPileup=minDz;\r
+  }\r
+\r
+\r
+  AliAODPidHF* GetPidHF() const {return fPidHF;}\r
+  Float_t *GetPtBinLimits() const {return fPtBinLimits;}\r
+  Int_t   GetNPtBins() const {return fnPtBins;}\r
+  Int_t   GetNVars() const {return fnVars;} \r
+  TString *GetVarNames() const {return fVarNames;} \r
+  Bool_t  *GetVarsForOpt() const {return fVarsForOpt;} \r
+  Int_t   GetNVarsForOpt() const {return fnVarsForOpt;}\r
+  const Float_t *GetCuts() const {return fCutsRD;} \r
+  void    GetCuts(Float_t**& cutsRD) const;\r
+  Float_t GetCutValue(Int_t iVar,Int_t iPtBin) const;\r
+  Float_t GetCentrality(AliAODEvent* aodEvent) const;\r
+  Bool_t  *GetIsUpperCut() const {return fIsUpperCut;}\r
+  AliESDtrackCuts *GetTrackCuts() const {return fTrackCuts;}\r
+  virtual void GetCutVarsForOpt(AliAODRecoDecayHF *d,Float_t *vars,Int_t nvars,Int_t *pdgdaughters) = 0;\r
+  Int_t   GetGlobalIndex(Int_t iVar,Int_t iPtBin) const;\r
+  void    GetVarPtIndex(Int_t iGlob, Int_t& iVar, Int_t& iPtBin) const;\r
+  Bool_t  GetIsUsePID() const {return fUsePID;}\r
+  Bool_t  GetIsPrimaryWithoutDaughters() const {return fRemoveDaughtersFromPrimary;}\r
+  Bool_t GetOptPileUp() const {return fOptPileup;}\r
+  Int_t GetUseCentrality() const {return fUseCentrality;}\r
+  Float_t GetMinCentrality() const {return fMinCentrality;}\r
+  Float_t GetMaxCentrality() const {return fMaxCentrality;}\r
+  Bool_t IsSelected(TObject *obj) {return IsSelected(obj,AliRDHFCuts::kAll);}\r
+  Bool_t IsSelected(TList *list) {if(!list) return kTRUE; return kFALSE;}\r
+  Bool_t IsEventSelected(AliVEvent *event);\r
+  Bool_t AreDaughtersSelected(AliAODRecoDecayHF *rd) const;\r
+  Bool_t IsDaughterSelected(AliAODTrack *track,const AliESDVertex *primary,AliESDtrackCuts *cuts) const;\r
+  virtual Int_t IsSelectedPID(AliAODRecoDecayHF * /*rd*/) {return 1;}\r
+\r
+  virtual Int_t IsSelected(TObject* obj,Int_t selectionLevel) = 0;\r
+  virtual Int_t IsSelected(TObject* obj,Int_t selectionLevel,AliAODEvent* /*aod*/)\r
+                {return IsSelected(obj,selectionLevel);}\r
+  Int_t PtBin(Double_t pt) const;\r
+  void PrintAll()const;\r
+\r
+  virtual Bool_t IsInFiducialAcceptance(Double_t /*pt*/,Double_t /*y*/) const {return kTRUE;}\r
+\r
+  void SetWhyRejection(Int_t why) {fWhyRejection=why; return;}\r
+  Int_t GetWhyRejection() const {return fWhyRejection;}\r
+\r
+  Bool_t CompareCuts(const AliRDHFCuts *obj) const;\r
+  void MakeTable()const;\r
+\r
+  enum{kAll,kTracks,kPID,kCandidate};\r
+  enum{kNoPileupSelection,kRejectPileupEvent,kRejectTracksFromPileupVertex};\r
+  enum{kCentOff,kCentV0M,kCentTRK,kCentTKL,kCentCL1,kCentInvalid};\r
+\r
+ protected:\r
+\r
+  void SetNPtBins(Int_t nptBins){fnPtBins=nptBins;}\r
+  void SetNVars(Int_t nVars){fnVars=nVars;}\r
+\r
+  // cuts on the event\r
+  Int_t fMinVtxType; // 0: not cut; 1: SPDZ; 2: SPD3D; 3: Tracks\r
+  Int_t fMinVtxContr;   // minimum vertex contributors\r
+  Float_t fMaxVtxRedChi2; // maximum chi2/ndf\r
+  Float_t fMaxVtxZ; // maximum |z| of primary vertex\r
+  Int_t fMinSPDMultiplicity; // SPD multiplicity\r
+  ULong64_t fTriggerMask; // trigger mask\r
+  // quality cuts on the daughter tracks\r
+  AliESDtrackCuts *fTrackCuts; // tracks for daughter tracks (AOD converted to ESD on the flight!)\r
+  // cuts on the candidate\r
+  Int_t fnPtBins;  // number of pt bins for cuts\r
+  Int_t fnPtBinLimits; // "number of limits", that is fnPtBins+1\r
+  Float_t* fPtBinLimits; //[fnPtBinLimits]  pt bins\r
+  Int_t fnVars;    // number of cut vars for candidates\r
+  TString *fVarNames; //[fnVars] names of the variables\r
+  Int_t fnVarsForOpt;    // number of cut vars to be optimized for candidates\r
+  Bool_t *fVarsForOpt; //[fnVars] kTRUE for vars to be used in optimization\r
+  Int_t fGlobalIndex; // fnVars*fnPtBins\r
+  Float_t *fCutsRD; //[fGlobalIndex] the cuts values\r
+  Bool_t  *fIsUpperCut; //[fnVars] use > or < to select\r
+  Bool_t fUsePID; // enable PID usage (off by default)\r
+  AliAODPidHF *fPidHF; // PID for heavy flavours manager\r
+  Int_t fWhyRejection; // used to code the step at which candidate was rejected\r
+  Bool_t fRemoveDaughtersFromPrimary; // flag to switch on the removal of duaghters from the primary vertex computation\r
+  Int_t  fOptPileup;      // option for pielup selection\r
+  Int_t  fMinContrPileup; // min. n. of tracklets in pileup vertex\r
+  Float_t fMinDzPileup;   // min deltaz between main and pileup vertices\r
+  Int_t   fUseCentrality; // off =0 (default)\r
+                          // 1 = V0 \r
+                          // 2 = Tracks\r
+                          // 3 = Tracklets\r
+                          // 4 = SPD clusters outer \r
+  Float_t fMinCentrality; // minimum centrality for selected events\r
+  Float_t fMaxCentrality; // maximum centrality for selected events\r
+\r
+  ClassDef(AliRDHFCuts,8);  // base class for cuts on AOD reconstructed heavy-flavour decays\r
+};\r
+\r
+#endif\r
+\r