-/**************************************************************************
- * 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