]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
Updated Ds PID information (Gian Michele)
authorprino <prino@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 3 Feb 2012 16:10:16 +0000 (16:10 +0000)
committerprino <prino@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 3 Feb 2012 16:10:16 +0000 (16:10 +0000)
PWGHF/vertexingHF/AliRDHFCutsDstoKKpi.cxx
PWGHF/vertexingHF/AliRDHFCutsDstoKKpi.h

index 7bcc072eb58c003310e9b2383b9bb33410f9964d..b53b8792bc5a98d3df1214fccbbb29b945984199 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.                  *
- **************************************************************************/
-
-/* $Id$ */
-
-/////////////////////////////////////////////////////////////
-//
-// Class for cuts on AOD reconstructed Ds->KKpi
-//
-// Author: A.Dainese, andrea.dainese@pd.infn.it
-/////////////////////////////////////////////////////////////
-
-#include <TDatabasePDG.h>
-#include <Riostream.h>
-
-#include "AliRDHFCutsDstoKKpi.h"
-#include "AliAODRecoDecayHF3Prong.h"
-#include "AliAODTrack.h"
-#include "AliESDtrack.h"
-
-ClassImp(AliRDHFCutsDstoKKpi)
-
-//--------------------------------------------------------------------------
-AliRDHFCutsDstoKKpi::AliRDHFCutsDstoKKpi(const char* name) : 
-AliRDHFCuts(name),
-fPidOption(0)
-{
-  //
-  // Default Constructor
-  //
-  Int_t nvars=16;
-  SetNVars(nvars);
-  TString varNames[16]={"inv. mass [GeV]",   
-                       "pTK [GeV/c]",
-                       "pTPi [GeV/c]",
-                       "d0K [cm]",
-                       "d0Pi [cm]",
-                       "dist12 [cm]",
-                       "sigmavert [cm]",
-                       "decLen [cm]",
-                       "ptMax [GeV/c]",
-                       "cosThetaPoint",
-                       "Sum d0^2 (cm^2)",
-                       "dca [cm]",
-                       "inv. mass (Mphi-MKK) [GeV]",
-                       "inv. mass (MKo*-MKpi) [GeV]",
-                       "Abs(CosineKpiPhiRFrame)^3",
-                       "CosPiDsLabFrame"};
-                       
-  Bool_t isUpperCut[16]={kTRUE,
-                        kFALSE,
-                        kFALSE,
-                        kFALSE,
-                        kFALSE,
-                        kFALSE,
-                        kTRUE,
-                        kFALSE,
-                        kFALSE,
-                        kFALSE,
-                        kFALSE,
-                        kTRUE,
-                        kTRUE,
-                        kTRUE,
-                        kFALSE,
-                        kTRUE};
-  SetVarNames(16,varNames,isUpperCut);
-  Bool_t forOpt[16]={kFALSE,
-                   kFALSE,
-                   kFALSE,
-                   kFALSE,
-                   kFALSE,
-                   kFALSE,
-                   kTRUE,
-                   kTRUE,
-                   kTRUE,
-                   kTRUE,
-                   kTRUE,
-                   kFALSE,
-                   kTRUE,
-                   kTRUE,
-                   kFALSE,
-                   kFALSE};
-  SetVarsForOpt(7,forOpt);
-  Float_t limits[2]={0,999999999.};
-  SetPtBins(2,limits);
-  if(fPidHF)delete fPidHF;
-  fPidHF=new AliAODPidHF();
-  Double_t plim[2]={0.6,0.8};
-  Double_t nsigma[5]={2.,1.,2.,3.,0.};
-  
-  fPidHF->SetPLimit(plim);
-  fPidHF->SetAsym(kTRUE);
-  fPidHF->SetSigma(nsigma);
-  fPidHF->SetMatch(1);
-  fPidHF->SetTPC(1);
-  fPidHF->SetTOF(1);
-  fPidHF->SetITS(0);
-  fPidHF->SetTRD(0);
-  fPidHF->SetCompat(kTRUE);
-
-}
-//--------------------------------------------------------------------------
-AliRDHFCutsDstoKKpi::AliRDHFCutsDstoKKpi(const AliRDHFCutsDstoKKpi &source) :
-  AliRDHFCuts(source),
-  fPidOption(source.fPidOption)
-{
-  //
-  // Copy constructor
-  //
-
-}
-//--------------------------------------------------------------------------
-AliRDHFCutsDstoKKpi &AliRDHFCutsDstoKKpi::operator=(const AliRDHFCutsDstoKKpi &source)
-{
-  //
-  // assignment operator
-  //
-  if(&source == this) return *this;
-
-  AliRDHFCuts::operator=(source);
-
-  fPidOption=source.fPidOption;
-
-  return *this;
-}
-
-
-//---------------------------------------------------------------------------
-void AliRDHFCutsDstoKKpi::GetCutVarsForOpt(AliAODRecoDecayHF *d,Float_t *vars,Int_t nvars,Int_t *pdgdaughters,AliAODEvent *aod) {
-  // 
-  // Fills in vars the values of the variables 
-  //
-
-  if(nvars!=fnVarsForOpt) {
-    printf("AliRDHFCutsDstoKKpi::GetCutsVarsForOpt: wrong number of variables\n");
-    return;
-  }
-
-  AliAODRecoDecayHF3Prong *dd = (AliAODRecoDecayHF3Prong*)d;
-  
-  //recalculate vertex w/o daughters
-  Bool_t cleanvtx=kFALSE;
-  AliAODVertex *origownvtx=0x0;
-  if(fRemoveDaughtersFromPrimary) {
-    if(dd->GetOwnPrimaryVtx()) origownvtx=new AliAODVertex(*dd->GetOwnPrimaryVtx());
-    cleanvtx=kTRUE;
-    if(!RecalcOwnPrimaryVtx(dd,aod)) {
-      CleanOwnPrimaryVtx(dd,aod,origownvtx);
-      cleanvtx=kFALSE;
-    }
-  }
-
-  Int_t iter=-1;
-  if(fVarsForOpt[0]){
-    iter++;
-    if(TMath::Abs(pdgdaughters[0])==321){
-      vars[iter]=dd->InvMassDsKKpi();
-    }else{
-      vars[iter]=dd->InvMassDspiKK();
-    }
-  }
-  if(fVarsForOpt[1]){
-    iter++;
-    Float_t minPtDau=99999.;
-    for(Int_t iprong=0;iprong<3;iprong++){
-      if(TMath::Abs(pdgdaughters[iprong])==321 && 
-        dd->PtProng(iprong)<minPtDau) minPtDau=dd->PtProng(iprong);
-    }
-    vars[iter]=minPtDau;
-  }
-  if(fVarsForOpt[2]){
-    iter++;
-    for(Int_t iprong=0;iprong<3;iprong++){
-      if(TMath::Abs(pdgdaughters[iprong])==211) {
-       vars[iter]=dd->PtProng(iprong);
-      }
-    }
-  }
-  if(fVarsForOpt[3]){
-    iter++;
-    Float_t minImpParDau=99999.;
-    for(Int_t iprong=0;iprong<3;iprong++){
-      if(TMath::Abs(pdgdaughters[iprong])==321 &&
-        dd->Getd0Prong(iprong)<minImpParDau) minImpParDau=dd->Getd0Prong(iprong);
-    }
-    vars[iter]=minImpParDau;
-  }
-  if(fVarsForOpt[4]){
-    iter++;
-    for(Int_t iprong=0;iprong<3;iprong++){
-      if(TMath::Abs(pdgdaughters[iprong])==211) {
-       vars[iter]=dd->Getd0Prong(iprong);
-      }
-    }
-  }
-  if(fVarsForOpt[5]){
-    iter++;
-    Float_t minDistPair=TMath::Min(dd->GetDist12toPrim(),dd->GetDist23toPrim());
-    vars[iter]=minDistPair;
-  }
-  if(fVarsForOpt[6]){
-    iter++;
-    vars[iter]=dd->GetSigmaVert(aod);
-  }
-  if(fVarsForOpt[7]){
-    iter++;
-    vars[iter] = dd->DecayLength();
-  }
-  if(fVarsForOpt[8]){
-    iter++;
-    Float_t ptmax=0;
-    for(Int_t i=0;i<3;i++){
-      if(dd->PtProng(i)>ptmax)ptmax=dd->PtProng(i);
-    }
-    vars[iter]=ptmax;
-  }
-  if(fVarsForOpt[9]){
-    iter++;
-    vars[iter]=dd->CosPointingAngle();
-  }
-  if(fVarsForOpt[10]){
-    iter++;
-    vars[iter]=dd->Getd0Prong(0)*dd->Getd0Prong(0)+dd->Getd0Prong(1)*dd->Getd0Prong(1)+dd->Getd0Prong(2)*dd->Getd0Prong(2);
-  }
-  if(fVarsForOpt[11]){
-    iter++;
-    Float_t maxDCA=0.;
-    for(Int_t i=0;i<3;i++){ 
-      if(d->GetDCA(i)>maxDCA) maxDCA=d->GetDCA(i);
-    }
-    vars[iter]=maxDCA;
-  }
-  if(fVarsForOpt[12]){
-    iter++;
-    Double_t mPDGPhi = TDatabasePDG::Instance()->GetParticle(333)->Mass();
-    if(TMath::Abs(pdgdaughters[0])==321){
-      
-      Double_t phimass01=d->InvMass2Prongs(0,1,321,321);
-       vars[iter]=TMath::Abs(phimass01-mPDGPhi);
-       // vars[iter]=dd->InvMass2Prongs(0,1,321,321);
-    }else{
-      Double_t phimass12=d->InvMass2Prongs(1,2,321,321);
-       vars[iter]=TMath::Abs(phimass12-mPDGPhi);
-       // vars[iter]=dd->InvMass2Prongs(1,2,321,321);      
-    }
-  }
-  if(fVarsForOpt[13]){
-    iter++;
-    Double_t mPDGK0star = TDatabasePDG::Instance()->GetParticle(313)->Mass();
-    if(TMath::Abs(pdgdaughters[0])==321){
-      
-      Double_t mass12kpi=d->InvMass2Prongs(1,2,321,211);
-      vars[iter]=TMath::Abs(mass12kpi-mPDGK0star);
-      //             vars[iter]=dd->InvMass2Prongs(1,2,321,211);
-    }else{
-      Double_t mass01pik=d->InvMass2Prongs(0,1,211,321);
-      vars[iter]=TMath::Abs(mass01pik-mPDGK0star);
-      //       vars[iter]=dd->InvMass2Prongs(0,1,211,321);      
-    }
-  }
-  if(fVarsForOpt[14]){
-    iter++;
-    if(TMath::Abs(pdgdaughters[0])==321){
-      vars[iter]=dd->CosPiKPhiRFrameKKpi();
-    }else{
-      vars[iter]=dd->CosPiKPhiRFramepiKK();
-    }
-  }
-  if(fVarsForOpt[15]){
-    iter++;
-    if(TMath::Abs(pdgdaughters[0])==321){
-      vars[iter]=dd->CosPiDsLabFrameKKpi();
-    }else{
-      vars[iter]=dd->CosPiDsLabFramepiKK();
-    }
-  }
-
-  if(cleanvtx)CleanOwnPrimaryVtx(dd,aod,origownvtx); 
-  return;
-}
-//---------------------------------------------------------------------------
-Bool_t AliRDHFCutsDstoKKpi::IsInFiducialAcceptance(Double_t pt, Double_t y) const
-{
-  //
-  // Checking if Ds is in fiducial acceptance region 
-  //
-
-  if(pt > 5.) {
-    // applying cut for pt > 5 GeV
-    AliDebug(2,Form("pt of Ds = %f (> 5), cutting at |y| < 0.8",pt)); 
-    if (TMath::Abs(y) > 0.8) return kFALSE;
-    
-  } else {
-    // appliying smooth cut for pt < 5 GeV
-    Double_t maxFiducialY = -0.2/15*pt*pt+1.9/15*pt+0.5; 
-    Double_t minFiducialY = 0.2/15*pt*pt-1.9/15*pt-0.5;                
-    AliDebug(2,Form("pt of Ds = %f (< 5), cutting  according to the fiducial zone [%f, %f]\n",pt,minFiducialY,maxFiducialY)); 
-    if (y < minFiducialY || y > maxFiducialY) return kFALSE;    
-  }
-
-  return kTRUE;
-}
-
-//---------------------------------------------------------------------------
-Int_t AliRDHFCutsDstoKKpi::IsSelectedPID(AliAODRecoDecayHF *rd) {
-  // PID selection
-  // return values: 0->NOT OK, 1->OK as KKpi, 2->OK as piKK, 3->OK as both 
-  Int_t retCode=3;
-  Bool_t okKKpi=kTRUE;
-  Bool_t okpiKK=kTRUE;
-  if(!fUsePID || !rd) return retCode;
-  if(!fPidHF){
-    AliWarning("AliAODPidHF not created!");
-    return retCode;
-  }
-
-  Double_t origCompatTOF=fPidHF->GetPCompatTOF();
-  Double_t origThreshTPC=fPidHF->GetPtThresholdTPC();
-  if(fPidOption==kStrong){
-    fPidHF->SetPCompatTOF(999999.);
-    fPidHF->SetPtThresholdTPC(999999.);
-  }
-
-
-  Int_t nKaons=0;
-  Int_t nNotKaons=0;
-  Int_t sign= rd->GetCharge(); 
-  for(Int_t iDaught=0; iDaught<3; iDaught++){
-    AliAODTrack *track=(AliAODTrack*)rd->GetDaughter(iDaught);
-    
-    Int_t isPion=fPidHF->MakeRawPid(track,AliPID::kPion);
-    Int_t isKaon=fPidHF->MakeRawPid(track,AliPID::kKaon);
-    Int_t isProton=fPidHF->MakeRawPid(track,AliPID::kProton);
-    
-    if(isProton>0 &&  isKaon<0  && isPion<0){
-      fPidHF->SetPCompatTOF(origCompatTOF);
-      fPidHF->SetPtThresholdTPC(origThreshTPC);
-      return 0;
-    }
-    if(sign!=track->Charge()){// must be kaon
-      if(isKaon<0){
-       fPidHF->SetPCompatTOF(origCompatTOF);
-       fPidHF->SetPtThresholdTPC(origThreshTPC);
-       return 0;
-      }
-      if(fPidOption==kStrong && isKaon<=0){
-       fPidHF->SetPCompatTOF(origCompatTOF);
-       fPidHF->SetPtThresholdTPC(origThreshTPC);
-       return 0;
-      }
-    }
-    if(isKaon>0 && isPion<0) nKaons++;
-    if(isKaon<0) nNotKaons++;
-    if(iDaught==0){
-      if(isKaon<0) okKKpi=kFALSE;
-      if(isPion<0) okpiKK=kFALSE;      
-      if(fPidOption==kStrong){
-       if(isKaon<=0) okKKpi=kFALSE;
-       if(isPion<=0) okpiKK=kFALSE;
-      }
-    }
-    else if(iDaught==2){
-      if(isKaon<0) okpiKK=kFALSE;
-      if(isPion<0) okKKpi=kFALSE;
-       if(fPidOption==kStrong){
-       if(isKaon<=0) okpiKK=kFALSE;
-       if(isPion<=0) okKKpi=kFALSE;
-      }
-    }
-  }
-
-  fPidHF->SetPCompatTOF(origCompatTOF);
-  fPidHF->SetPtThresholdTPC(origThreshTPC);
-  
-  if(nKaons>2)return 0;
-  if(nNotKaons>1) return 0;
-  
-  if(!okKKpi) retCode-=1;
-  if(!okpiKK) retCode-=2;
-
-  return retCode;
-}
-
-//---------------------------------------------------------------------------
-Int_t AliRDHFCutsDstoKKpi::IsSelected(TObject* obj,Int_t selectionLevel, AliAODEvent* aod) {
-  //
-  // Apply selection
-  //
-
-  if(!fCutsRD){
-    cout<<"Cut matrix not inizialized. Exit..."<<endl;
-    return 0;
-  }
-  //PrintAll();
-  AliAODRecoDecayHF3Prong* d=(AliAODRecoDecayHF3Prong*)obj;
-
-  if(!d){
-    cout<<"AliAODRecoDecayHF3Prong null"<<endl;
-    return 0;
-  }
-  
-  if(fKeepSignalMC) if(IsSignalMC(d,aod,431)) return 3;
-  Double_t ptD=d->Pt();
-  if(ptD<fMinPtCand) return 0;
-  if(ptD>fMaxPtCand) return 0;
-
-  if(d->HasBadDaughters()) return 0;
-  
-
-  // selection on daughter tracks 
-  if(selectionLevel==AliRDHFCuts::kAll || 
-     selectionLevel==AliRDHFCuts::kTracks) {
-    if(!AreDaughtersSelected(d)) return 0;
-  }
-
-
-
-  // selection on candidate
-  if(selectionLevel==AliRDHFCuts::kAll || 
-     selectionLevel==AliRDHFCuts::kCandidate) {
-    //recalculate vertex w/o daughters
-    AliAODVertex *origownvtx=0x0;
-    if(fRemoveDaughtersFromPrimary) {
-      if(d->GetOwnPrimaryVtx()) origownvtx=new AliAODVertex(*d->GetOwnPrimaryVtx());
-      if(!RecalcOwnPrimaryVtx(d,aod)) {
-       CleanOwnPrimaryVtx(d,aod,origownvtx);
-       return 0;
-      }
-    }
-
-    Int_t okDsKKpi=1;
-    Int_t okDspiKK=1;
-    Int_t okMassPhiKKpi=0;
-    Int_t okMassPhipiKK=0;
-    Int_t okMassK0starKKpi=0;
-    Int_t okMassK0starpiKK=0;
-    Int_t okDsPhiKKpi=0;
-    Int_t okDsPhipiKK=0;
-    Int_t okDsK0starKKpi=0;
-    Int_t okDsK0starpiKK=0;
-
-    Double_t pt=d->Pt();
-    Int_t ptbin=PtBin(pt);
-    if (ptbin==-1) {
-      CleanOwnPrimaryVtx(d,aod,origownvtx);
-      return 0;
-    }
-    Double_t mDsPDG = TDatabasePDG::Instance()->GetParticle(431)->Mass();
-    Double_t mDsKKpi=d->InvMassDsKKpi();
-    Double_t mDspiKK=d->InvMassDspiKK();
-    if(TMath::Abs(mDsKKpi-mDsPDG)>fCutsRD[GetGlobalIndex(0,ptbin)]) okDsKKpi = 0;
-    if(TMath::Abs(mDspiKK-mDsPDG)>fCutsRD[GetGlobalIndex(0,ptbin)]) okDspiKK = 0;
-    if(!okDsKKpi && !okDspiKK){
-      CleanOwnPrimaryVtx(d,aod,origownvtx);
-      return 0;
-    }
-
-
-
-    // cuts on resonant decays (via Phi or K0*)
-    Double_t mPhiPDG = TDatabasePDG::Instance()->GetParticle(333)->Mass();
-    Double_t mK0starPDG = TDatabasePDG::Instance()->GetParticle(313)->Mass();
-    if(okDsKKpi){
-      Double_t mass01phi=d->InvMass2Prongs(0,1,321,321);
-      Double_t mass12K0s=d->InvMass2Prongs(1,2,321,211);
-      if(TMath::Abs(mass01phi-mPhiPDG)<fCutsRD[GetGlobalIndex(12,ptbin)]) okMassPhiKKpi=1;
-      if(TMath::Abs(mass12K0s-mK0starPDG)<fCutsRD[GetGlobalIndex(13,ptbin)]) okMassK0starKKpi = 1;
-      if(!okMassPhiKKpi && !okMassK0starKKpi) okDsKKpi=0;
-      if(okMassPhiKKpi) okDsPhiKKpi=1;
-      if(okMassK0starKKpi) okDsK0starKKpi=1;
-    }
-    if(okDspiKK){
-      Double_t mass01K0s=d->InvMass2Prongs(0,1,211,321);
-      Double_t mass12phi=d->InvMass2Prongs(1,2,321,321);
-      if(TMath::Abs(mass01K0s-mK0starPDG)<fCutsRD[GetGlobalIndex(13,ptbin)]) okMassK0starpiKK = 1;
-      if(TMath::Abs(mass12phi-mPhiPDG)<fCutsRD[GetGlobalIndex(12,ptbin)]) okMassPhipiKK=1;
-      if(!okMassPhipiKK && !okMassK0starpiKK) okDspiKK=0;
-      if(okMassPhipiKK) okDsPhipiKK=1;
-      if(okMassK0starpiKK) okDsK0starpiKK=1;
-    }
-    if(!okDsKKpi && !okDspiKK){
-      CleanOwnPrimaryVtx(d,aod,origownvtx);
-      return 0;
-    }
-
-    // Cuts on track pairs
-    for(Int_t i=0;i<3;i++){
-      if(d->GetDCA(i)>fCutsRD[GetGlobalIndex(11,ptbin)]){
-       CleanOwnPrimaryVtx(d,aod,origownvtx);
-       return 0;
-      }
-    }
-    if(d->GetDist12toPrim()<fCutsRD[GetGlobalIndex(5,ptbin)] || 
-       d->GetDist23toPrim()<fCutsRD[GetGlobalIndex(5,ptbin)]){
-      CleanOwnPrimaryVtx(d,aod,origownvtx);
-      return 0;
-    }
-
-
-
-    //single track
-    if(TMath::Abs(d->Pt2Prong(1)) < fCutsRD[GetGlobalIndex(1,ptbin)]*fCutsRD[GetGlobalIndex(1,ptbin)] || 
-       TMath::Abs(d->Getd0Prong(1))<fCutsRD[GetGlobalIndex(3,ptbin)]){
-      CleanOwnPrimaryVtx(d,aod,origownvtx);
-      return 0;
-    }
-
-    if(okDsKKpi){
-      if(TMath::Abs(d->Pt2Prong(0)) < fCutsRD[GetGlobalIndex(1,ptbin)]*fCutsRD[GetGlobalIndex(1,ptbin)] || 
-        TMath::Abs(d->Getd0Prong(0))<fCutsRD[GetGlobalIndex(3,ptbin)]) okDsKKpi=0;
-      if(TMath::Abs(d->Pt2Prong(2)) < fCutsRD[GetGlobalIndex(2,ptbin)]*fCutsRD[GetGlobalIndex(2,ptbin)] || 
-        TMath::Abs(d->Getd0Prong(2))<fCutsRD[GetGlobalIndex(4,ptbin)]) okDsKKpi=0;
-    }
-    if(okDspiKK){
-      if(TMath::Abs(d->Pt2Prong(0)) < fCutsRD[GetGlobalIndex(2,ptbin)]*fCutsRD[GetGlobalIndex(2,ptbin)] || 
-        TMath::Abs(d->Getd0Prong(0))<fCutsRD[GetGlobalIndex(4,ptbin)]) okDspiKK=0;
-      if(TMath::Abs(d->Pt2Prong(2)) < fCutsRD[GetGlobalIndex(1,ptbin)]*fCutsRD[GetGlobalIndex(1,ptbin)] || 
-        TMath::Abs(d->Getd0Prong(2))<fCutsRD[GetGlobalIndex(3,ptbin)]) okDspiKK=0;
-    }
-    if(!okDsKKpi && !okDspiKK){
-      CleanOwnPrimaryVtx(d,aod,origownvtx);
-      return 0;
-    }
-
-    // Cuts on candidate triplet
-
-
-    if(d->CosPointingAngle()< fCutsRD[GetGlobalIndex(9,ptbin)]){
-      CleanOwnPrimaryVtx(d,aod,origownvtx); 
-      return 0;
-    }
-     
-    if(d->Pt2Prong(0)<fCutsRD[GetGlobalIndex(8,ptbin)]*fCutsRD[GetGlobalIndex(8,ptbin)] && 
-       d->Pt2Prong(1)<fCutsRD[GetGlobalIndex(8,ptbin)]*fCutsRD[GetGlobalIndex(8,ptbin)] && 
-       d->Pt2Prong(2)<fCutsRD[GetGlobalIndex(8,ptbin)]*fCutsRD[GetGlobalIndex(8,ptbin)]) {
-      CleanOwnPrimaryVtx(d,aod,origownvtx); 
-      return 0;
-    }
-
-    if(d->DecayLength2()<fCutsRD[GetGlobalIndex(7,ptbin)]*fCutsRD[GetGlobalIndex(7,ptbin)]){
-      CleanOwnPrimaryVtx(d,aod,origownvtx);
-      return 0;
-    }
-
-
-    Double_t sum2=d->Getd0Prong(0)*d->Getd0Prong(0)+d->Getd0Prong(1)*d->Getd0Prong(1)+d->Getd0Prong(2)*d->Getd0Prong(2);
-    if(sum2<fCutsRD[GetGlobalIndex(10,ptbin)]){
-      CleanOwnPrimaryVtx(d,aod,origownvtx);
-      return 0;
-    }
-
-   
-    //sec vert
-    Double_t sigmavert=d->GetSigmaVert(aod);
-    if(sigmavert>fCutsRD[GetGlobalIndex(6,ptbin)]){
-      CleanOwnPrimaryVtx(d,aod,origownvtx);
-      return 0;
-    }
-
-    if(okDsKKpi){
-      Double_t cosPiKPhiRFKKpi=d->CosPiKPhiRFrameKKpi();
-      Double_t kincutPiKPhiKKpi=TMath::Abs(cosPiKPhiRFKKpi*cosPiKPhiRFKKpi*cosPiKPhiRFKKpi);
-      if(kincutPiKPhiKKpi<fCutsRD[GetGlobalIndex(14,ptbin)]) okDsKKpi=0;
-    }
-    if(okDspiKK){
-      Double_t cosPiKPhiRFpiKK=d->CosPiKPhiRFramepiKK();
-      Double_t kincutPiKPhipiKK=TMath::Abs(cosPiKPhiRFpiKK*cosPiKPhiRFpiKK*cosPiKPhiRFpiKK);
-      if(kincutPiKPhipiKK<fCutsRD[GetGlobalIndex(14,ptbin)]) okDspiKK=0;
-    }
-    if(!okDsKKpi && !okDspiKK){
-      CleanOwnPrimaryVtx(d,aod,origownvtx);
-      return 0;
-    }
-    
-    
-    
-    if(okDsKKpi){
-      Double_t cosPiDsLabFrameKKpi=d->CosPiDsLabFrameKKpi();
-      if(cosPiDsLabFrameKKpi>fCutsRD[GetGlobalIndex(15,ptbin)]) okDsKKpi=0;
-    }
-    if(okDspiKK){
-      Double_t cosPiDsLabFramepiKK=d->CosPiDsLabFramepiKK();
-      if(cosPiDsLabFramepiKK>fCutsRD[GetGlobalIndex(15,ptbin)]) okDspiKK=0;
-    }
-    if(!okDsKKpi && !okDspiKK){
-      CleanOwnPrimaryVtx(d,aod,origownvtx);
-      return 0;
-    }
-    
-     // unset recalculated primary vertex when not needed any more
-    CleanOwnPrimaryVtx(d,aod,origownvtx);
-      
-    
-
-    if(!okDsKKpi){
-      okDsPhiKKpi=0;
-      okDsK0starKKpi=0;
-    }
-    if(!okDspiKK){
-      okDsPhipiKK=0;
-      okDsK0starpiKK=0;
-    }
-
-    // PID selection
-    Int_t returnvaluePID=3;  
-    if(selectionLevel==AliRDHFCuts::kAll || 
-       selectionLevel==AliRDHFCuts::kCandidate ||     
-       selectionLevel==AliRDHFCuts::kPID) {
-      returnvaluePID = IsSelectedPID(d);
-      fIsSelectedPID=returnvaluePID;
-    }
-    if(returnvaluePID==0)return 0;
-
-    Bool_t okPidDsKKpi=returnvaluePID&1;
-    Bool_t okPidDspiKK=returnvaluePID&2;
-    if(!okPidDsKKpi){
-      okDsPhiKKpi=0;
-      okDsK0starKKpi=0;
-    }
-    if(!okPidDspiKK){
-      okDsPhipiKK=0;
-      okDsK0starpiKK=0;
-    }
-
-    if((okPidDsKKpi && okDsKKpi)||(okPidDspiKK && okDspiKK)){
-      Int_t returnvalue=0;
-      if(okDsKKpi) returnvalue+=1;
-      if(okDspiKK) returnvalue+=2;
-      if(okDsPhiKKpi) returnvalue+=4;
-      if(okDsPhipiKK) returnvalue+=8;
-      if(okDsK0starKKpi) returnvalue+=16;
-      if(okDsK0starpiKK) returnvalue+=32;
-      return returnvalue;
-    }else{
-      return 0;
-    }
-  }
-  return 15;
-
-}
-
-//--------------------------------------------------------------------------
-
-UInt_t AliRDHFCutsDstoKKpi::GetPIDTrackTPCTOFBitMap(AliAODTrack *track) const{
-
-  UInt_t bitmap=0;
-
-  Double_t sigmaTPCPionHyp=-999.;
-  Double_t sigmaTPCKaonHyp=-999.;
-  Double_t sigmaTPCProtonHyp=-999.;
-  Double_t sigmaTOFPionHyp=-999.;
-  Double_t sigmaTOFKaonHyp=-999.;
-  Double_t sigmaTOFProtonHyp=-999.;
-  
-  Int_t oksigmaTPCPionHyp=fPidHF->GetnSigmaTPC(track,2,sigmaTPCPionHyp);
-  Int_t oksigmaTPCKaonHyp=fPidHF->GetnSigmaTPC(track,3,sigmaTPCKaonHyp);
-  Int_t oksigmaTPCProtonHyp=fPidHF->GetnSigmaTPC(track,4,sigmaTPCProtonHyp);
-  Int_t oksigmaTOFPionHyp=fPidHF->GetnSigmaTOF(track,2,sigmaTOFPionHyp);
-  Int_t oksigmaTOFKaonHyp=fPidHF->GetnSigmaTOF(track,3,sigmaTOFKaonHyp);
-  Int_t oksigmaTOFProtonHyp=fPidHF->GetnSigmaTOF(track,4,sigmaTOFProtonHyp);
-  
-  if (oksigmaTPCPionHyp && sigmaTPCPionHyp>0.){
-    if (sigmaTPCPionHyp<2.) bitmap+=1<<kTPCPionLess2;
-    else { if (sigmaTPCPionHyp<3.) bitmap+=1<<kTPCPionMore2Less3; else bitmap+=1<<kTPCPionMore3;}
-  }
-   if (oksigmaTPCKaonHyp && sigmaTPCKaonHyp>0.){
-    if (sigmaTPCKaonHyp<2.) bitmap+=1<<kTPCKaonLess2;
-    else { if (sigmaTPCKaonHyp<3.) bitmap+=1<<kTPCKaonMore2Less3; else bitmap+=1<<kTPCKaonMore3;}
-  }
-   if (oksigmaTPCProtonHyp && sigmaTPCProtonHyp>0.){
-    if (sigmaTPCProtonHyp<2.) bitmap+=1<<kTPCProtonLess2;
-    else { if (sigmaTPCProtonHyp<3.) bitmap+=1<<kTPCProtonMore2Less3; else bitmap+=1<<kTPCProtonMore3;}
-  }
-  
-  if (oksigmaTOFPionHyp && sigmaTOFPionHyp>0.){
-    if (sigmaTOFPionHyp<2.) bitmap+=1<<kTOFPionLess2;
-    else { if (sigmaTOFPionHyp<3.) bitmap+=1<<kTOFPionMore2Less3; else bitmap+=1<<kTOFPionMore3;}
-  }
-   if (oksigmaTOFKaonHyp && sigmaTOFKaonHyp>0.){
-    if (sigmaTOFKaonHyp<2.) bitmap+=1<<kTOFKaonLess2;
-    else { if (sigmaTOFKaonHyp<3.) bitmap+=1<<kTOFKaonMore2Less3; else bitmap+=1<<kTOFKaonMore3;}
-  }
-   if (oksigmaTOFProtonHyp && sigmaTOFProtonHyp>0.){
-    if (sigmaTOFProtonHyp<2.) bitmap+=1<<kTOFProtonLess2;
-    else { if (sigmaTOFProtonHyp<3.) bitmap+=1<<kTOFProtonMore2Less3; else bitmap+=1<<kTOFProtonMore3;}
-  }
-  
-  
-  return bitmap;
-
-}
-
+/**************************************************************************\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
+/* $Id$ */\r
+\r
+/////////////////////////////////////////////////////////////\r
+//\r
+// Class for cuts on AOD reconstructed Ds->KKpi\r
+//\r
+// Author: A.Dainese, andrea.dainese@pd.infn.it\r
+/////////////////////////////////////////////////////////////\r
+\r
+#include <TDatabasePDG.h>\r
+#include <Riostream.h>\r
+\r
+#include "AliRDHFCutsDstoKKpi.h"\r
+#include "AliAODRecoDecayHF3Prong.h"\r
+#include "AliAODTrack.h"\r
+#include "AliESDtrack.h"\r
+\r
+ClassImp(AliRDHFCutsDstoKKpi)\r
+\r
+//--------------------------------------------------------------------------\r
+AliRDHFCutsDstoKKpi::AliRDHFCutsDstoKKpi(const char* name) : \r
+AliRDHFCuts(name),\r
+fPidOption(0)\r
+{\r
+  //\r
+  // Default Constructor\r
+  //\r
+  Int_t nvars=16;\r
+  SetNVars(nvars);\r
+  TString varNames[16]={"inv. mass [GeV]",   \r
+                       "pTK [GeV/c]",\r
+                       "pTPi [GeV/c]",\r
+                       "d0K [cm]",\r
+                       "d0Pi [cm]",\r
+                       "dist12 [cm]",\r
+                       "sigmavert [cm]",\r
+                       "decLen [cm]",\r
+                       "ptMax [GeV/c]",\r
+                       "cosThetaPoint",\r
+                       "Sum d0^2 (cm^2)",\r
+                       "dca [cm]",\r
+                       "inv. mass (Mphi-MKK) [GeV]",\r
+                       "inv. mass (MKo*-MKpi) [GeV]",\r
+                       "Abs(CosineKpiPhiRFrame)^3",\r
+                       "CosPiDsLabFrame"};\r
+                       \r
+  Bool_t isUpperCut[16]={kTRUE,\r
+                        kFALSE,\r
+                        kFALSE,\r
+                        kFALSE,\r
+                        kFALSE,\r
+                        kFALSE,\r
+                        kTRUE,\r
+                        kFALSE,\r
+                        kFALSE,\r
+                        kFALSE,\r
+                        kFALSE,\r
+                        kTRUE,\r
+                        kTRUE,\r
+                        kTRUE,\r
+                        kFALSE,\r
+                        kTRUE};\r
+  SetVarNames(16,varNames,isUpperCut);\r
+  Bool_t forOpt[16]={kFALSE,\r
+                   kFALSE,\r
+                   kFALSE,\r
+                   kFALSE,\r
+                   kFALSE,\r
+                   kFALSE,\r
+                   kTRUE,\r
+                   kTRUE,\r
+                   kTRUE,\r
+                   kTRUE,\r
+                   kTRUE,\r
+                   kFALSE,\r
+                   kTRUE,\r
+                   kTRUE,\r
+                   kFALSE,\r
+                   kFALSE};\r
+  SetVarsForOpt(7,forOpt);\r
+  Float_t limits[2]={0,999999999.};\r
+  SetPtBins(2,limits);\r
+  if(fPidHF)delete fPidHF;\r
+  fPidHF=new AliAODPidHF();\r
+  Double_t plim[2]={0.6,0.8};\r
+  Double_t nsigma[5]={2.,1.,2.,3.,0.};\r
+  \r
+  fPidHF->SetPLimit(plim);\r
+  fPidHF->SetAsym(kTRUE);\r
+  fPidHF->SetSigma(nsigma);\r
+  fPidHF->SetMatch(1);\r
+  fPidHF->SetTPC(1);\r
+  fPidHF->SetTOF(1);\r
+  fPidHF->SetITS(0);\r
+  fPidHF->SetTRD(0);\r
+  fPidHF->SetCompat(kTRUE);\r
+\r
+}\r
+//--------------------------------------------------------------------------\r
+AliRDHFCutsDstoKKpi::AliRDHFCutsDstoKKpi(const AliRDHFCutsDstoKKpi &source) :\r
+  AliRDHFCuts(source),\r
+  fPidOption(source.fPidOption)\r
+{\r
+  //\r
+  // Copy constructor\r
+  //\r
+\r
+}\r
+//--------------------------------------------------------------------------\r
+AliRDHFCutsDstoKKpi &AliRDHFCutsDstoKKpi::operator=(const AliRDHFCutsDstoKKpi &source)\r
+{\r
+  //\r
+  // assignment operator\r
+  //\r
+  if(&source == this) return *this;\r
+\r
+  AliRDHFCuts::operator=(source);\r
+\r
+  fPidOption=source.fPidOption;\r
+\r
+  return *this;\r
+}\r
+\r
+\r
+//---------------------------------------------------------------------------\r
+void AliRDHFCutsDstoKKpi::GetCutVarsForOpt(AliAODRecoDecayHF *d,Float_t *vars,Int_t nvars,Int_t *pdgdaughters,AliAODEvent *aod) {\r
+  // \r
+  // Fills in vars the values of the variables \r
+  //\r
+\r
+  if(nvars!=fnVarsForOpt) {\r
+    printf("AliRDHFCutsDstoKKpi::GetCutsVarsForOpt: wrong number of variables\n");\r
+    return;\r
+  }\r
+\r
+  AliAODRecoDecayHF3Prong *dd = (AliAODRecoDecayHF3Prong*)d;\r
+  \r
+  //recalculate vertex w/o daughters\r
+  Bool_t cleanvtx=kFALSE;\r
+  AliAODVertex *origownvtx=0x0;\r
+  if(fRemoveDaughtersFromPrimary) {\r
+    if(dd->GetOwnPrimaryVtx()) origownvtx=new AliAODVertex(*dd->GetOwnPrimaryVtx());\r
+    cleanvtx=kTRUE;\r
+    if(!RecalcOwnPrimaryVtx(dd,aod)) {\r
+      CleanOwnPrimaryVtx(dd,aod,origownvtx);\r
+      cleanvtx=kFALSE;\r
+    }\r
+  }\r
+\r
+  Int_t iter=-1;\r
+  if(fVarsForOpt[0]){\r
+    iter++;\r
+    if(TMath::Abs(pdgdaughters[0])==321){\r
+      vars[iter]=dd->InvMassDsKKpi();\r
+    }else{\r
+      vars[iter]=dd->InvMassDspiKK();\r
+    }\r
+  }\r
+  if(fVarsForOpt[1]){\r
+    iter++;\r
+    Float_t minPtDau=99999.;\r
+    for(Int_t iprong=0;iprong<3;iprong++){\r
+      if(TMath::Abs(pdgdaughters[iprong])==321 && \r
+        dd->PtProng(iprong)<minPtDau) minPtDau=dd->PtProng(iprong);\r
+    }\r
+    vars[iter]=minPtDau;\r
+  }\r
+  if(fVarsForOpt[2]){\r
+    iter++;\r
+    for(Int_t iprong=0;iprong<3;iprong++){\r
+      if(TMath::Abs(pdgdaughters[iprong])==211) {\r
+       vars[iter]=dd->PtProng(iprong);\r
+      }\r
+    }\r
+  }\r
+  if(fVarsForOpt[3]){\r
+    iter++;\r
+    Float_t minImpParDau=99999.;\r
+    for(Int_t iprong=0;iprong<3;iprong++){\r
+      if(TMath::Abs(pdgdaughters[iprong])==321 &&\r
+        dd->Getd0Prong(iprong)<minImpParDau) minImpParDau=dd->Getd0Prong(iprong);\r
+    }\r
+    vars[iter]=minImpParDau;\r
+  }\r
+  if(fVarsForOpt[4]){\r
+    iter++;\r
+    for(Int_t iprong=0;iprong<3;iprong++){\r
+      if(TMath::Abs(pdgdaughters[iprong])==211) {\r
+       vars[iter]=dd->Getd0Prong(iprong);\r
+      }\r
+    }\r
+  }\r
+  if(fVarsForOpt[5]){\r
+    iter++;\r
+    Float_t minDistPair=TMath::Min(dd->GetDist12toPrim(),dd->GetDist23toPrim());\r
+    vars[iter]=minDistPair;\r
+  }\r
+  if(fVarsForOpt[6]){\r
+    iter++;\r
+    vars[iter]=dd->GetSigmaVert(aod);\r
+  }\r
+  if(fVarsForOpt[7]){\r
+    iter++;\r
+    vars[iter] = dd->DecayLength();\r
+  }\r
+  if(fVarsForOpt[8]){\r
+    iter++;\r
+    Float_t ptmax=0;\r
+    for(Int_t i=0;i<3;i++){\r
+      if(dd->PtProng(i)>ptmax)ptmax=dd->PtProng(i);\r
+    }\r
+    vars[iter]=ptmax;\r
+  }\r
+  if(fVarsForOpt[9]){\r
+    iter++;\r
+    vars[iter]=dd->CosPointingAngle();\r
+  }\r
+  if(fVarsForOpt[10]){\r
+    iter++;\r
+    vars[iter]=dd->Getd0Prong(0)*dd->Getd0Prong(0)+dd->Getd0Prong(1)*dd->Getd0Prong(1)+dd->Getd0Prong(2)*dd->Getd0Prong(2);\r
+  }\r
+  if(fVarsForOpt[11]){\r
+    iter++;\r
+    Float_t maxDCA=0.;\r
+    for(Int_t i=0;i<3;i++){ \r
+      if(d->GetDCA(i)>maxDCA) maxDCA=d->GetDCA(i);\r
+    }\r
+    vars[iter]=maxDCA;\r
+  }\r
+  if(fVarsForOpt[12]){\r
+    iter++;\r
+    Double_t mPDGPhi = TDatabasePDG::Instance()->GetParticle(333)->Mass();\r
+    if(TMath::Abs(pdgdaughters[0])==321){\r
+      \r
+      Double_t phimass01=d->InvMass2Prongs(0,1,321,321);\r
+       vars[iter]=TMath::Abs(phimass01-mPDGPhi);\r
+       // vars[iter]=dd->InvMass2Prongs(0,1,321,321);\r
+    }else{\r
+      Double_t phimass12=d->InvMass2Prongs(1,2,321,321);\r
+       vars[iter]=TMath::Abs(phimass12-mPDGPhi);\r
+       // vars[iter]=dd->InvMass2Prongs(1,2,321,321);      \r
+    }\r
+  }\r
+  if(fVarsForOpt[13]){\r
+    iter++;\r
+    Double_t mPDGK0star = TDatabasePDG::Instance()->GetParticle(313)->Mass();\r
+    if(TMath::Abs(pdgdaughters[0])==321){\r
+      \r
+      Double_t mass12kpi=d->InvMass2Prongs(1,2,321,211);\r
+      vars[iter]=TMath::Abs(mass12kpi-mPDGK0star);\r
+      //             vars[iter]=dd->InvMass2Prongs(1,2,321,211);\r
+    }else{\r
+      Double_t mass01pik=d->InvMass2Prongs(0,1,211,321);\r
+      vars[iter]=TMath::Abs(mass01pik-mPDGK0star);\r
+      //       vars[iter]=dd->InvMass2Prongs(0,1,211,321);      \r
+    }\r
+  }\r
+  if(fVarsForOpt[14]){\r
+    iter++;\r
+    if(TMath::Abs(pdgdaughters[0])==321){\r
+      vars[iter]=dd->CosPiKPhiRFrameKKpi();\r
+    }else{\r
+      vars[iter]=dd->CosPiKPhiRFramepiKK();\r
+    }\r
+  }\r
+  if(fVarsForOpt[15]){\r
+    iter++;\r
+    if(TMath::Abs(pdgdaughters[0])==321){\r
+      vars[iter]=dd->CosPiDsLabFrameKKpi();\r
+    }else{\r
+      vars[iter]=dd->CosPiDsLabFramepiKK();\r
+    }\r
+  }\r
+\r
+  if(cleanvtx)CleanOwnPrimaryVtx(dd,aod,origownvtx); \r
+  return;\r
+}\r
+//---------------------------------------------------------------------------\r
+Bool_t AliRDHFCutsDstoKKpi::IsInFiducialAcceptance(Double_t pt, Double_t y) const\r
+{\r
+  //\r
+  // Checking if Ds is in fiducial acceptance region \r
+  //\r
+\r
+  if(pt > 5.) {\r
+    // applying cut for pt > 5 GeV\r
+    AliDebug(2,Form("pt of Ds = %f (> 5), cutting at |y| < 0.8",pt)); \r
+    if (TMath::Abs(y) > 0.8) return kFALSE;\r
+    \r
+  } else {\r
+    // appliying smooth cut for pt < 5 GeV\r
+    Double_t maxFiducialY = -0.2/15*pt*pt+1.9/15*pt+0.5; \r
+    Double_t minFiducialY = 0.2/15*pt*pt-1.9/15*pt-0.5;                \r
+    AliDebug(2,Form("pt of Ds = %f (< 5), cutting  according to the fiducial zone [%f, %f]\n",pt,minFiducialY,maxFiducialY)); \r
+    if (y < minFiducialY || y > maxFiducialY) return kFALSE;    \r
+  }\r
+\r
+  return kTRUE;\r
+}\r
+\r
+//---------------------------------------------------------------------------\r
+Int_t AliRDHFCutsDstoKKpi::IsSelectedPID(AliAODRecoDecayHF *rd) {\r
+  // PID selection\r
+  // return values: 0->NOT OK, 1->OK as KKpi, 2->OK as piKK, 3->OK as both \r
+  Int_t retCode=3;\r
+  Bool_t okKKpi=kTRUE;\r
+  Bool_t okpiKK=kTRUE;\r
+  if(!fUsePID || !rd) return retCode;\r
+  if(!fPidHF){\r
+    AliWarning("AliAODPidHF not created!");\r
+    return retCode;\r
+  }\r
+\r
+  Double_t origCompatTOF=fPidHF->GetPCompatTOF();\r
+  Double_t origThreshTPC=fPidHF->GetPtThresholdTPC();\r
+  if(fPidOption==kStrong){\r
+    fPidHF->SetPCompatTOF(999999.);\r
+    fPidHF->SetPtThresholdTPC(999999.);\r
+  }\r
+\r
+\r
+  Int_t nKaons=0;\r
+  Int_t nNotKaons=0;\r
+  Int_t sign= rd->GetCharge(); \r
+  for(Int_t iDaught=0; iDaught<3; iDaught++){\r
+    AliAODTrack *track=(AliAODTrack*)rd->GetDaughter(iDaught);\r
+    \r
+    Int_t isPion=fPidHF->MakeRawPid(track,AliPID::kPion);\r
+    Int_t isKaon=fPidHF->MakeRawPid(track,AliPID::kKaon);\r
+    Int_t isProton=fPidHF->MakeRawPid(track,AliPID::kProton);\r
+    \r
+    if(isProton>0 &&  isKaon<0  && isPion<0){\r
+      fPidHF->SetPCompatTOF(origCompatTOF);\r
+      fPidHF->SetPtThresholdTPC(origThreshTPC);\r
+      return 0;\r
+    }\r
+    if(sign!=track->Charge()){// must be kaon\r
+      if(isKaon<0){\r
+       fPidHF->SetPCompatTOF(origCompatTOF);\r
+       fPidHF->SetPtThresholdTPC(origThreshTPC);\r
+       return 0;\r
+      }\r
+      if(fPidOption==kStrong && isKaon<=0){\r
+       fPidHF->SetPCompatTOF(origCompatTOF);\r
+       fPidHF->SetPtThresholdTPC(origThreshTPC);\r
+       return 0;\r
+      }\r
+    }\r
+    if(isKaon>0 && isPion<0) nKaons++;\r
+    if(isKaon<0) nNotKaons++;\r
+    if(iDaught==0){\r
+      if(isKaon<0) okKKpi=kFALSE;\r
+      if(isPion<0) okpiKK=kFALSE;      \r
+      if(fPidOption==kStrong){\r
+       if(isKaon<=0) okKKpi=kFALSE;\r
+       if(isPion<=0) okpiKK=kFALSE;\r
+      }\r
+    }\r
+    else if(iDaught==2){\r
+      if(isKaon<0) okpiKK=kFALSE;\r
+      if(isPion<0) okKKpi=kFALSE;\r
+       if(fPidOption==kStrong){\r
+       if(isKaon<=0) okpiKK=kFALSE;\r
+       if(isPion<=0) okKKpi=kFALSE;\r
+      }\r
+    }\r
+  }\r
+\r
+  fPidHF->SetPCompatTOF(origCompatTOF);\r
+  fPidHF->SetPtThresholdTPC(origThreshTPC);\r
+  \r
+  if(nKaons>2)return 0;\r
+  if(nNotKaons>1) return 0;\r
+  \r
+  if(!okKKpi) retCode-=1;\r
+  if(!okpiKK) retCode-=2;\r
+\r
+  return retCode;\r
+}\r
+\r
+//---------------------------------------------------------------------------\r
+Int_t AliRDHFCutsDstoKKpi::IsSelected(TObject* obj,Int_t selectionLevel, AliAODEvent* aod) {\r
+  //\r
+  // Apply selection\r
+  //\r
+\r
+  if(!fCutsRD){\r
+    cout<<"Cut matrix not inizialized. Exit..."<<endl;\r
+    return 0;\r
+  }\r
+  //PrintAll();\r
+  AliAODRecoDecayHF3Prong* d=(AliAODRecoDecayHF3Prong*)obj;\r
+\r
+  if(!d){\r
+    cout<<"AliAODRecoDecayHF3Prong null"<<endl;\r
+    return 0;\r
+  }\r
+  \r
+  if(fKeepSignalMC) if(IsSignalMC(d,aod,431)) return 3;\r
\r
+  Double_t ptD=d->Pt();\r
+  if(ptD<fMinPtCand) return 0;\r
+  if(ptD>fMaxPtCand) return 0;\r
+\r
+  if(d->HasBadDaughters()) return 0;\r
+  \r
+\r
+  // selection on daughter tracks \r
+  if(selectionLevel==AliRDHFCuts::kAll || \r
+     selectionLevel==AliRDHFCuts::kTracks) {\r
+    if(!AreDaughtersSelected(d)) return 0;\r
+  }\r
+\r
+\r
+\r
\r
+  // selection on candidate\r
+  if(selectionLevel==AliRDHFCuts::kAll || \r
+     selectionLevel==AliRDHFCuts::kCandidate) {\r
+    //recalculate vertex w/o daughters\r
+    AliAODVertex *origownvtx=0x0;\r
+    if(fRemoveDaughtersFromPrimary) {\r
+      if(d->GetOwnPrimaryVtx()) origownvtx=new AliAODVertex(*d->GetOwnPrimaryVtx());\r
+      if(!RecalcOwnPrimaryVtx(d,aod)) {\r
+       CleanOwnPrimaryVtx(d,aod,origownvtx);\r
+       return 0;\r
+      }\r
+    }\r
+\r
+    Int_t okDsKKpi=1;\r
+    Int_t okDspiKK=1;\r
+    Int_t okMassPhiKKpi=0;\r
+    Int_t okMassPhipiKK=0;\r
+    Int_t okMassK0starKKpi=0;\r
+    Int_t okMassK0starpiKK=0;\r
+    Int_t okDsPhiKKpi=0;\r
+    Int_t okDsPhipiKK=0;\r
+    Int_t okDsK0starKKpi=0;\r
+    Int_t okDsK0starpiKK=0;\r
+\r
+    Double_t pt=d->Pt();\r
+    Int_t ptbin=PtBin(pt);\r
+    if (ptbin==-1) {\r
+      CleanOwnPrimaryVtx(d,aod,origownvtx);\r
+      return 0;\r
+    }\r
\r
+    Double_t mDsPDG = TDatabasePDG::Instance()->GetParticle(431)->Mass();\r
+    Double_t mDsKKpi=d->InvMassDsKKpi();\r
+    Double_t mDspiKK=d->InvMassDspiKK();\r
+    if(TMath::Abs(mDsKKpi-mDsPDG)>fCutsRD[GetGlobalIndex(0,ptbin)]) okDsKKpi = 0;\r
+    if(TMath::Abs(mDspiKK-mDsPDG)>fCutsRD[GetGlobalIndex(0,ptbin)]) okDspiKK = 0;\r
+    if(!okDsKKpi && !okDspiKK){\r
+      CleanOwnPrimaryVtx(d,aod,origownvtx);\r
+      return 0;\r
+    }\r
+\r
+\r
+\r
+    // cuts on resonant decays (via Phi or K0*)\r
+    Double_t mPhiPDG = TDatabasePDG::Instance()->GetParticle(333)->Mass();\r
+    Double_t mK0starPDG = TDatabasePDG::Instance()->GetParticle(313)->Mass();\r
+    if(okDsKKpi){\r
+      Double_t mass01phi=d->InvMass2Prongs(0,1,321,321);\r
+      Double_t mass12K0s=d->InvMass2Prongs(1,2,321,211);\r
+      if(TMath::Abs(mass01phi-mPhiPDG)<fCutsRD[GetGlobalIndex(12,ptbin)]) okMassPhiKKpi=1;\r
+      if(TMath::Abs(mass12K0s-mK0starPDG)<fCutsRD[GetGlobalIndex(13,ptbin)]) okMassK0starKKpi = 1;\r
+      if(!okMassPhiKKpi && !okMassK0starKKpi) okDsKKpi=0;\r
+      if(okMassPhiKKpi) okDsPhiKKpi=1;\r
+      if(okMassK0starKKpi) okDsK0starKKpi=1;\r
+    }\r
+    if(okDspiKK){\r
+      Double_t mass01K0s=d->InvMass2Prongs(0,1,211,321);\r
+      Double_t mass12phi=d->InvMass2Prongs(1,2,321,321);\r
+      if(TMath::Abs(mass01K0s-mK0starPDG)<fCutsRD[GetGlobalIndex(13,ptbin)]) okMassK0starpiKK = 1;\r
+      if(TMath::Abs(mass12phi-mPhiPDG)<fCutsRD[GetGlobalIndex(12,ptbin)]) okMassPhipiKK=1;\r
+      if(!okMassPhipiKK && !okMassK0starpiKK) okDspiKK=0;\r
+      if(okMassPhipiKK) okDsPhipiKK=1;\r
+      if(okMassK0starpiKK) okDsK0starpiKK=1;\r
+    }\r
+    if(!okDsKKpi && !okDspiKK){\r
+      CleanOwnPrimaryVtx(d,aod,origownvtx);\r
+      return 0;\r
+    }\r
+\r
+    // Cuts on track pairs\r
+    for(Int_t i=0;i<3;i++){\r
+      if(d->GetDCA(i)>fCutsRD[GetGlobalIndex(11,ptbin)]){\r
+       CleanOwnPrimaryVtx(d,aod,origownvtx);\r
+       return 0;\r
+      }\r
+    }\r
+    if(d->GetDist12toPrim()<fCutsRD[GetGlobalIndex(5,ptbin)] || \r
+       d->GetDist23toPrim()<fCutsRD[GetGlobalIndex(5,ptbin)]){\r
+      CleanOwnPrimaryVtx(d,aod,origownvtx);\r
+      return 0;\r
+    }\r
+\r
+\r
+\r
+    //single track\r
+    if(TMath::Abs(d->Pt2Prong(1)) < fCutsRD[GetGlobalIndex(1,ptbin)]*fCutsRD[GetGlobalIndex(1,ptbin)] || \r
+       TMath::Abs(d->Getd0Prong(1))<fCutsRD[GetGlobalIndex(3,ptbin)]){\r
+      CleanOwnPrimaryVtx(d,aod,origownvtx);\r
+      return 0;\r
+    }\r
+\r
+    if(okDsKKpi){\r
+      if(TMath::Abs(d->Pt2Prong(0)) < fCutsRD[GetGlobalIndex(1,ptbin)]*fCutsRD[GetGlobalIndex(1,ptbin)] || \r
+        TMath::Abs(d->Getd0Prong(0))<fCutsRD[GetGlobalIndex(3,ptbin)]) okDsKKpi=0;\r
+      if(TMath::Abs(d->Pt2Prong(2)) < fCutsRD[GetGlobalIndex(2,ptbin)]*fCutsRD[GetGlobalIndex(2,ptbin)] || \r
+        TMath::Abs(d->Getd0Prong(2))<fCutsRD[GetGlobalIndex(4,ptbin)]) okDsKKpi=0;\r
+    }\r
+    if(okDspiKK){\r
+      if(TMath::Abs(d->Pt2Prong(0)) < fCutsRD[GetGlobalIndex(2,ptbin)]*fCutsRD[GetGlobalIndex(2,ptbin)] || \r
+        TMath::Abs(d->Getd0Prong(0))<fCutsRD[GetGlobalIndex(4,ptbin)]) okDspiKK=0;\r
+      if(TMath::Abs(d->Pt2Prong(2)) < fCutsRD[GetGlobalIndex(1,ptbin)]*fCutsRD[GetGlobalIndex(1,ptbin)] || \r
+        TMath::Abs(d->Getd0Prong(2))<fCutsRD[GetGlobalIndex(3,ptbin)]) okDspiKK=0;\r
+    }\r
+    if(!okDsKKpi && !okDspiKK){\r
+      CleanOwnPrimaryVtx(d,aod,origownvtx);\r
+      return 0;\r
+    }\r
+\r
+    // Cuts on candidate triplet\r
+\r
+\r
+    if(d->CosPointingAngle()< fCutsRD[GetGlobalIndex(9,ptbin)]){\r
+      CleanOwnPrimaryVtx(d,aod,origownvtx); \r
+      return 0;\r
+    }\r
+     \r
+    if(d->Pt2Prong(0)<fCutsRD[GetGlobalIndex(8,ptbin)]*fCutsRD[GetGlobalIndex(8,ptbin)] && \r
+       d->Pt2Prong(1)<fCutsRD[GetGlobalIndex(8,ptbin)]*fCutsRD[GetGlobalIndex(8,ptbin)] && \r
+       d->Pt2Prong(2)<fCutsRD[GetGlobalIndex(8,ptbin)]*fCutsRD[GetGlobalIndex(8,ptbin)]) {\r
+      CleanOwnPrimaryVtx(d,aod,origownvtx); \r
+      return 0;\r
+    }\r
+\r
+    if(d->DecayLength2()<fCutsRD[GetGlobalIndex(7,ptbin)]*fCutsRD[GetGlobalIndex(7,ptbin)]){\r
+      CleanOwnPrimaryVtx(d,aod,origownvtx);\r
+      return 0;\r
+    }\r
+\r
+\r
+    Double_t sum2=d->Getd0Prong(0)*d->Getd0Prong(0)+d->Getd0Prong(1)*d->Getd0Prong(1)+d->Getd0Prong(2)*d->Getd0Prong(2);\r
+    if(sum2<fCutsRD[GetGlobalIndex(10,ptbin)]){\r
+      CleanOwnPrimaryVtx(d,aod,origownvtx);\r
+      return 0;\r
+    }\r
+\r
+   \r
+    //sec vert\r
+    Double_t sigmavert=d->GetSigmaVert(aod);\r
+    if(sigmavert>fCutsRD[GetGlobalIndex(6,ptbin)]){\r
+      CleanOwnPrimaryVtx(d,aod,origownvtx);\r
+      return 0;\r
+    }\r
+\r
+    if(okDsKKpi){\r
+      Double_t cosPiKPhiRFKKpi=d->CosPiKPhiRFrameKKpi();\r
+      Double_t kincutPiKPhiKKpi=TMath::Abs(cosPiKPhiRFKKpi*cosPiKPhiRFKKpi*cosPiKPhiRFKKpi);\r
+      if(kincutPiKPhiKKpi<fCutsRD[GetGlobalIndex(14,ptbin)]) okDsKKpi=0;\r
+    }\r
+    if(okDspiKK){\r
+      Double_t cosPiKPhiRFpiKK=d->CosPiKPhiRFramepiKK();\r
+      Double_t kincutPiKPhipiKK=TMath::Abs(cosPiKPhiRFpiKK*cosPiKPhiRFpiKK*cosPiKPhiRFpiKK);\r
+      if(kincutPiKPhipiKK<fCutsRD[GetGlobalIndex(14,ptbin)]) okDspiKK=0;\r
+    }\r
+    if(!okDsKKpi && !okDspiKK){\r
+      CleanOwnPrimaryVtx(d,aod,origownvtx);\r
+      return 0;\r
+    }\r
+    \r
+    \r
+    \r
+    if(okDsKKpi){\r
+      Double_t cosPiDsLabFrameKKpi=d->CosPiDsLabFrameKKpi();\r
+      if(cosPiDsLabFrameKKpi>fCutsRD[GetGlobalIndex(15,ptbin)]) okDsKKpi=0;\r
+    }\r
+    if(okDspiKK){\r
+      Double_t cosPiDsLabFramepiKK=d->CosPiDsLabFramepiKK();\r
+      if(cosPiDsLabFramepiKK>fCutsRD[GetGlobalIndex(15,ptbin)]) okDspiKK=0;\r
+    }\r
+    if(!okDsKKpi && !okDspiKK){\r
+      CleanOwnPrimaryVtx(d,aod,origownvtx);\r
+      return 0;\r
+    }\r
+    \r
+     // unset recalculated primary vertex when not needed any more\r
+    CleanOwnPrimaryVtx(d,aod,origownvtx);\r
+      \r
+    \r
+\r
+    if(!okDsKKpi){\r
+      okDsPhiKKpi=0;\r
+      okDsK0starKKpi=0;\r
+    }\r
+    if(!okDspiKK){\r
+      okDsPhipiKK=0;\r
+      okDsK0starpiKK=0;\r
+    }\r
+\r
+    // PID selection\r
+    Int_t returnvaluePID=3;  \r
+    if(selectionLevel==AliRDHFCuts::kAll || \r
+       selectionLevel==AliRDHFCuts::kCandidate ||     \r
+       selectionLevel==AliRDHFCuts::kPID) {\r
+      returnvaluePID = IsSelectedPID(d);\r
+      fIsSelectedPID=returnvaluePID;\r
+    }\r
+    if(returnvaluePID==0)return 0;\r
+\r
+    Bool_t okPidDsKKpi=returnvaluePID&1;\r
+    Bool_t okPidDspiKK=returnvaluePID&2;\r
+    if(!okPidDsKKpi){\r
+      okDsPhiKKpi=0;\r
+      okDsK0starKKpi=0;\r
+    }\r
+    if(!okPidDspiKK){\r
+      okDsPhipiKK=0;\r
+      okDsK0starpiKK=0;\r
+    }\r
+\r
+    if((okPidDsKKpi && okDsKKpi)||(okPidDspiKK && okDspiKK)){\r
+      Int_t returnvalue=0;\r
+      if(okDsKKpi) returnvalue+=1;\r
+      if(okDspiKK) returnvalue+=2;\r
+      if(okDsPhiKKpi) returnvalue+=4;\r
+      if(okDsPhipiKK) returnvalue+=8;\r
+      if(okDsK0starKKpi) returnvalue+=16;\r
+      if(okDsK0starpiKK) returnvalue+=32;\r
+      return returnvalue;\r
+    }else{\r
+      return 0;\r
+    }\r
+  }\r
+  return 15;\r
+\r
+}\r
+\r
+//--------------------------------------------------------------------------\r
+\r
+UInt_t AliRDHFCutsDstoKKpi::GetPIDTrackTPCTOFBitMap(AliAODTrack *track) const{\r
+\r
+  UInt_t bitmap=0;\r
+\r
+  Double_t sigmaTPCPionHyp=-999.;\r
+  Double_t sigmaTPCKaonHyp=-999.;\r
+  Double_t sigmaTPCProtonHyp=-999.;\r
+  Double_t sigmaTOFPionHyp=-999.;\r
+  Double_t sigmaTOFKaonHyp=-999.;\r
+  Double_t sigmaTOFProtonHyp=-999.;\r
+  \r
+  Int_t oksigmaTPCPionHyp=fPidHF->GetnSigmaTPC(track,2,sigmaTPCPionHyp);\r
+  Int_t oksigmaTPCKaonHyp=fPidHF->GetnSigmaTPC(track,3,sigmaTPCKaonHyp);\r
+  Int_t oksigmaTPCProtonHyp=fPidHF->GetnSigmaTPC(track,4,sigmaTPCProtonHyp);\r
+  Int_t oksigmaTOFPionHyp=fPidHF->GetnSigmaTOF(track,2,sigmaTOFPionHyp);\r
+  Int_t oksigmaTOFKaonHyp=fPidHF->GetnSigmaTOF(track,3,sigmaTOFKaonHyp);\r
+  Int_t oksigmaTOFProtonHyp=fPidHF->GetnSigmaTOF(track,4,sigmaTOFProtonHyp);\r
+  \r
+  if (oksigmaTPCPionHyp && sigmaTPCPionHyp>0.){\r
+    if (sigmaTPCPionHyp<1.) bitmap+=1<<kTPCPionLess1;\r
+    else{\r
+      if (sigmaTPCPionHyp<2.) bitmap+=1<<kTPCPionMore1Less2;\r
+      else { \r
+        if (sigmaTPCPionHyp<3.) bitmap+=1<<kTPCPionMore2Less3; \r
+        else bitmap+=1<<kTPCPionMore3;\r
+      }\r
+    }\r
+  }\r
+  \r
+  if (oksigmaTPCKaonHyp && sigmaTPCKaonHyp>0.){\r
+    if (sigmaTPCKaonHyp<1.) bitmap+=1<<kTPCKaonLess1;\r
+    else{\r
+      if (sigmaTPCKaonHyp<2.) bitmap+=1<<kTPCKaonMore1Less2;\r
+      else { \r
+        if (sigmaTPCKaonHyp<3.) bitmap+=1<<kTPCKaonMore2Less3; \r
+        else bitmap+=1<<kTPCKaonMore3;\r
+      }\r
+    }\r
+  }\r
+  \r
+  if (oksigmaTPCProtonHyp && sigmaTPCProtonHyp>0.){\r
+    if (sigmaTPCProtonHyp<1.) bitmap+=1<<kTPCProtonLess1;\r
+    else{\r
+      if (sigmaTPCProtonHyp<2.) bitmap+=1<<kTPCProtonMore1Less2;\r
+      else { \r
+        if (sigmaTPCProtonHyp<3.) bitmap+=1<<kTPCProtonMore2Less3; \r
+        else bitmap+=1<<kTPCProtonMore3;\r
+      }\r
+    }\r
+  }\r
+  \r
+  if (oksigmaTOFPionHyp && sigmaTOFPionHyp>0.){\r
+    if (sigmaTOFPionHyp<1.) bitmap+=1<<kTOFPionLess1;\r
+    else{\r
+      if (sigmaTOFPionHyp<2.) bitmap+=1<<kTOFPionMore1Less2;\r
+      else { \r
+        if (sigmaTOFPionHyp<3.) bitmap+=1<<kTOFPionMore2Less3; \r
+        else bitmap+=1<<kTOFPionMore3;\r
+      }\r
+    }\r
+  }\r
+  \r
+  if (oksigmaTOFKaonHyp && sigmaTOFKaonHyp>0.){\r
+    if (sigmaTOFKaonHyp<1.) bitmap+=1<<kTOFKaonLess1;\r
+    else{\r
+      if (sigmaTOFKaonHyp<2.) bitmap+=1<<kTOFKaonMore1Less2;\r
+      else { \r
+        if (sigmaTOFKaonHyp<3.) bitmap+=1<<kTOFKaonMore2Less3; \r
+        else bitmap+=1<<kTOFKaonMore3;\r
+      }\r
+    }\r
+  }\r
+  \r
+  if (oksigmaTOFProtonHyp && sigmaTOFProtonHyp>0.){\r
+    if (sigmaTOFProtonHyp<1.) bitmap+=1<<kTOFProtonLess1;\r
+    else{\r
+      if (sigmaTOFProtonHyp<2.) bitmap+=1<<kTOFProtonMore1Less2;\r
+      else { \r
+        if (sigmaTOFProtonHyp<3.) bitmap+=1<<kTOFProtonMore2Less3; \r
+        else bitmap+=1<<kTOFProtonMore3;\r
+      }\r
+    }\r
+  }\r
+  \r
+  \r
+  \r
+  return bitmap;\r
+\r
+}\r
+\r
index 921633b1bab62eb40feb3b4ebedf5f625e29115e..245ce7aaff34c238e2f0b69714f54033264bec2c 100644 (file)
@@ -1,68 +1,69 @@
-#ifndef ALIRDHFCUTSDSTOKKPI_H
-#define ALIRDHFCUTSDSTOKKPI_H
-/* Copyright(c) 1998-2010, ALICE Experiment at CERN, All rights reserved. *
- * See cxx source for full Copyright notice                               */
-
-/* $Id$ */ 
-
-//***********************************************************
-// Class AliRDHFCutsDstoKKpi
-// class for cuts on AOD reconstructed Ds->KKpi
-// Author: A.Dainese, andrea.dainese@pd.infn.it
-//***********************************************************
-
-#include "AliRDHFCuts.h"
-
-class AliRDHFCutsDstoKKpi : public AliRDHFCuts 
-{
- public:
-
-  AliRDHFCutsDstoKKpi(const char* name="CutsDstoKKpi");
-  
-  virtual ~AliRDHFCutsDstoKKpi(){}
-
-  AliRDHFCutsDstoKKpi(const AliRDHFCutsDstoKKpi& source);
-  AliRDHFCutsDstoKKpi& operator=(const AliRDHFCutsDstoKKpi& source); 
-  using AliRDHFCuts::GetCutVarsForOpt;
-  virtual void GetCutVarsForOpt(AliAODRecoDecayHF *d,Float_t *vars,Int_t nvars,Int_t *pdgdaughters){
-    return GetCutVarsForOpt(d,vars,nvars,pdgdaughters,0x0);
-  }
-  virtual void GetCutVarsForOpt(AliAODRecoDecayHF *d,Float_t *vars,Int_t nvars,Int_t *pdgdaughters,AliAODEvent *aod);
-
-  using AliRDHFCuts::IsSelected;
-  virtual Int_t IsSelected(TObject* obj,Int_t selectionLevel){
-    return IsSelected(obj,selectionLevel,0x0);
-  }
-  virtual Int_t IsSelected(TObject* obj,Int_t selectionLevel,AliAODEvent* aod);
-
-
-  virtual Int_t IsSelectedPID(AliAODRecoDecayHF *rd);
-   
-  virtual Bool_t IsInFiducialAcceptance(Double_t pt,Double_t y) const;
-  Float_t GetMassCut(Int_t iPtBin=0) const { return (GetCuts() ? fCutsRD[GetGlobalIndex(0,iPtBin)] : 1.e6);}
-  Float_t GetDCACut(Int_t iPtBin=0) const { return (GetCuts() ? fCutsRD[GetGlobalIndex(11,iPtBin)] : 1.e6);}
-  UInt_t GetPIDTrackTPCTOFBitMap(AliAODTrack *track) const;
-
-  
-  enum TrackPIDBit{kTPCPionLess2,kTPCPionMore2Less3,kTPCPionMore3,
-                   kTPCKaonLess2,kTPCKaonMore2Less3,kTPCKaonMore3,
-                   kTPCProtonLess2,kTPCProtonMore2Less3,kTPCProtonMore3,
-                   kTOFPionLess2,kTOFPionMore2Less3,kTOFPionMore3,
-                   kTOFKaonLess2,kTOFKaonMore2Less3,kTOFKaonMore3,
-                   kTOFProtonLess2,kTOFProtonMore2Less3,kTOFProtonMore3};
-                   
-  enum EDsPid {kConservative, kStrong};
-  void SetPidOption(Int_t opt){
-    fPidOption=opt;
-  }
-  Int_t GetPidOption() const {return fPidOption;}
-  
- protected:
-  Int_t fPidOption;         //pid option
-
-
-  ClassDef(AliRDHFCutsDstoKKpi,2);  // class for cuts on AOD reconstructed Ds->KKpi
-};
-
-#endif
+#ifndef ALIRDHFCUTSDSTOKKPI_H\r
+#define ALIRDHFCUTSDSTOKKPI_H\r
+/* Copyright(c) 1998-2010, ALICE Experiment at CERN, All rights reserved. *\r
+ * See cxx source for full Copyright notice                               */\r
+\r
+/* $Id$ */ \r
+\r
+//***********************************************************\r
+// Class AliRDHFCutsDstoKKpi\r
+// class for cuts on AOD reconstructed Ds->KKpi\r
+// Author: A.Dainese, andrea.dainese@pd.infn.it\r
+//***********************************************************\r
+\r
+#include "AliRDHFCuts.h"\r
+\r
+class AliRDHFCutsDstoKKpi : public AliRDHFCuts \r
+{\r
+ public:\r
+\r
+  AliRDHFCutsDstoKKpi(const char* name="CutsDstoKKpi");\r
+  \r
+  virtual ~AliRDHFCutsDstoKKpi(){}\r
+\r
+  AliRDHFCutsDstoKKpi(const AliRDHFCutsDstoKKpi& source);\r
+  AliRDHFCutsDstoKKpi& operator=(const AliRDHFCutsDstoKKpi& source); \r
\r
+  using AliRDHFCuts::GetCutVarsForOpt;\r
+  virtual void GetCutVarsForOpt(AliAODRecoDecayHF *d,Float_t *vars,Int_t nvars,Int_t *pdgdaughters){\r
+    return GetCutVarsForOpt(d,vars,nvars,pdgdaughters,0x0);\r
+  }\r
+  virtual void GetCutVarsForOpt(AliAODRecoDecayHF *d,Float_t *vars,Int_t nvars,Int_t *pdgdaughters,AliAODEvent *aod);\r
+\r
+  using AliRDHFCuts::IsSelected;\r
+  virtual Int_t IsSelected(TObject* obj,Int_t selectionLevel){\r
+    return IsSelected(obj,selectionLevel,0x0);\r
+  }\r
+  virtual Int_t IsSelected(TObject* obj,Int_t selectionLevel,AliAODEvent* aod);\r
+\r
+\r
+  virtual Int_t IsSelectedPID(AliAODRecoDecayHF *rd);\r
+   \r
+  virtual Bool_t IsInFiducialAcceptance(Double_t pt,Double_t y) const;\r
+  Float_t GetMassCut(Int_t iPtBin=0) const { return (GetCuts() ? fCutsRD[GetGlobalIndex(0,iPtBin)] : 1.e6);}\r
+  Float_t GetDCACut(Int_t iPtBin=0) const { return (GetCuts() ? fCutsRD[GetGlobalIndex(11,iPtBin)] : 1.e6);}\r
+  UInt_t GetPIDTrackTPCTOFBitMap(AliAODTrack *track) const;\r
+\r
+  \r
+  enum TrackPIDBit{kTPCPionLess1,kTPCPionMore1Less2,kTPCPionMore2Less3,kTPCPionMore3,\r
+                   kTPCKaonLess1,kTPCKaonMore1Less2,kTPCKaonMore2Less3,kTPCKaonMore3,\r
+                   kTPCProtonLess1,kTPCProtonMore1Less2,kTPCProtonMore2Less3,kTPCProtonMore3,\r
+                   kTOFPionLess1,kTOFPionMore1Less2,kTOFPionMore2Less3,kTOFPionMore3,\r
+                   kTOFKaonLess1,kTOFKaonMore1Less2,kTOFKaonMore2Less3,kTOFKaonMore3,\r
+                   kTOFProtonLess1,kTOFProtonMore1Less2,kTOFProtonMore2Less3,kTOFProtonMore3};\r
+                \r
+                 \r
+  enum EDsPid {kConservative, kStrong};\r
+  void SetPidOption(Int_t opt){\r
+    fPidOption=opt;\r
+  }\r
+  Int_t GetPidOption() const {return fPidOption;}\r
+  \r
+ protected:\r
+  Int_t fPidOption;         //pid option\r
+\r
+\r
+  ClassDef(AliRDHFCutsDstoKKpi,2);  // class for cuts on AOD reconstructed Ds->KKpi\r
+};\r
+\r
+#endif\r