1 /**************************************************************************
2 * Copyright(c) 1998-2010, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
18 /////////////////////////////////////////////////////////////
20 // Class for cuts on AOD reconstructed Ds->KKpi
22 // Author: A.Dainese, andrea.dainese@pd.infn.it
23 /////////////////////////////////////////////////////////////
25 #include <TDatabasePDG.h>
26 #include <Riostream.h>
28 #include "AliRDHFCutsDstoKKpi.h"
29 #include "AliAODRecoDecayHF3Prong.h"
30 #include "AliAODTrack.h"
31 #include "AliESDtrack.h"
36 ClassImp(AliRDHFCutsDstoKKpi)
38 //--------------------------------------------------------------------------
39 AliRDHFCutsDstoKKpi::AliRDHFCutsDstoKKpi(const char* name) :
41 fCutOnResonances(kTRUE),
47 fBayesThreshold(0.05),
52 // Default Constructor
56 TString varNames[20]={"inv. mass [GeV]",
68 "inv. mass (Mphi-MKK) [GeV]",
69 "inv. mass (MKo*-MKpi) [GeV]",
70 "Abs(CosineKpiPhiRFrame)^3",
77 Bool_t isUpperCut[20]={kTRUE,
97 SetVarNames(20,varNames,isUpperCut);
98 Bool_t forOpt[20]={kFALSE,
119 SetVarsForOpt(11,forOpt);
120 Float_t limits[2]={0,999999999.};
122 if(fPidHF)delete fPidHF;
123 fPidHF=new AliAODPidHF();
124 Double_t plim[2]={0.6,0.8};
125 Double_t nsigma[5]={2.,1.,2.,3.,0.};
127 fPidHF->SetPLimit(plim);
128 fPidHF->SetAsym(kTRUE);
129 fPidHF->SetSigma(nsigma);
135 fPidHF->SetCompat(kTRUE);
138 //--------------------------------------------------------------------------
139 AliRDHFCutsDstoKKpi::AliRDHFCutsDstoKKpi(const AliRDHFCutsDstoKKpi &source) :
141 fCutOnResonances(source.fCutOnResonances),
142 fPidOption(source.fPidOption),
143 fMaxPtStrongPid(source.fMaxPtStrongPid),
144 fMaxPStrongPidK(source.fMaxPStrongPidK),
145 fMaxPStrongPidpi(source.fMaxPStrongPidpi),
146 fDistToMaxProb(source.fDistToMaxProb),
147 fBayesThreshold(source.fBayesThreshold),
148 fWeightKKpi(source.fWeightKKpi),
149 fWeightpiKK(source.fWeightpiKK)
156 //--------------------------------------------------------------------------
157 AliRDHFCutsDstoKKpi &AliRDHFCutsDstoKKpi::operator=(const AliRDHFCutsDstoKKpi &source)
160 // assignment operator
162 if(&source == this) return *this;
164 AliRDHFCuts::operator=(source);
166 fCutOnResonances=source.fCutOnResonances;
167 fPidOption=source.fPidOption;
168 fMaxPtStrongPid=source.fMaxPtStrongPid;
169 fMaxPStrongPidK=source.fMaxPStrongPidK;
170 fMaxPStrongPidpi=source.fMaxPStrongPidpi;
171 fDistToMaxProb=source.fDistToMaxProb;
172 fBayesThreshold=source.fBayesThreshold;
173 fWeightKKpi=source.fWeightKKpi;
174 fWeightpiKK=source.fWeightpiKK;
180 //---------------------------------------------------------------------------
181 void AliRDHFCutsDstoKKpi::GetCutVarsForOpt(AliAODRecoDecayHF *d,Float_t *vars,Int_t nvars,Int_t *pdgdaughters,AliAODEvent *aod) {
183 // Fills in vars the values of the variables
186 if(nvars!=fnVarsForOpt) {
187 printf("AliRDHFCutsDstoKKpi::GetCutsVarsForOpt: wrong number of variables\n");
191 AliAODRecoDecayHF3Prong *dd = (AliAODRecoDecayHF3Prong*)d;
193 //recalculate vertex w/o daughters
194 Bool_t cleanvtx=kFALSE;
195 AliAODVertex *origownvtx=0x0;
196 if(fRemoveDaughtersFromPrimary) {
197 if(dd->GetOwnPrimaryVtx()) origownvtx=new AliAODVertex(*dd->GetOwnPrimaryVtx());
199 if(!RecalcOwnPrimaryVtx(dd,aod)) {
200 CleanOwnPrimaryVtx(dd,aod,origownvtx);
208 if(TMath::Abs(pdgdaughters[0])==321){
209 vars[iter]=dd->InvMassDsKKpi();
211 vars[iter]=dd->InvMassDspiKK();
216 Float_t minPtDau=99999.;
217 for(Int_t iprong=0;iprong<3;iprong++){
218 if(TMath::Abs(pdgdaughters[iprong])==321 &&
219 dd->PtProng(iprong)<minPtDau) minPtDau=dd->PtProng(iprong);
225 for(Int_t iprong=0;iprong<3;iprong++){
226 if(TMath::Abs(pdgdaughters[iprong])==211) {
227 vars[iter]=dd->PtProng(iprong);
233 Float_t minImpParDau=99999.;
234 for(Int_t iprong=0;iprong<3;iprong++){
235 if(TMath::Abs(pdgdaughters[iprong])==321 &&
236 dd->Getd0Prong(iprong)<minImpParDau) minImpParDau=dd->Getd0Prong(iprong);
238 vars[iter]=minImpParDau;
242 for(Int_t iprong=0;iprong<3;iprong++){
243 if(TMath::Abs(pdgdaughters[iprong])==211) {
244 vars[iter]=dd->Getd0Prong(iprong);
250 Float_t minDistPair=TMath::Min(dd->GetDist12toPrim(),dd->GetDist23toPrim());
251 vars[iter]=minDistPair;
255 vars[iter]=dd->GetSigmaVert(aod);
259 vars[iter] = dd->DecayLength();
264 for(Int_t i=0;i<3;i++){
265 if(dd->PtProng(i)>ptmax)ptmax=dd->PtProng(i);
271 vars[iter]=dd->CosPointingAngle();
275 vars[iter]=dd->Getd0Prong(0)*dd->Getd0Prong(0)+dd->Getd0Prong(1)*dd->Getd0Prong(1)+dd->Getd0Prong(2)*dd->Getd0Prong(2);
280 for(Int_t i=0;i<3;i++){
281 if(d->GetDCA(i)>maxDCA) maxDCA=d->GetDCA(i);
287 Double_t mPDGPhi = TDatabasePDG::Instance()->GetParticle(333)->Mass();
288 if(TMath::Abs(pdgdaughters[0])==321){
290 Double_t phimass01=d->InvMass2Prongs(0,1,321,321);
291 vars[iter]=TMath::Abs(phimass01-mPDGPhi);
292 // vars[iter]=dd->InvMass2Prongs(0,1,321,321);
294 Double_t phimass12=d->InvMass2Prongs(1,2,321,321);
295 vars[iter]=TMath::Abs(phimass12-mPDGPhi);
296 // vars[iter]=dd->InvMass2Prongs(1,2,321,321);
301 Double_t mPDGK0star = TDatabasePDG::Instance()->GetParticle(313)->Mass();
302 if(TMath::Abs(pdgdaughters[0])==321){
304 Double_t mass12kpi=d->InvMass2Prongs(1,2,321,211);
305 vars[iter]=TMath::Abs(mass12kpi-mPDGK0star);
306 // vars[iter]=dd->InvMass2Prongs(1,2,321,211);
308 Double_t mass01pik=d->InvMass2Prongs(0,1,211,321);
309 vars[iter]=TMath::Abs(mass01pik-mPDGK0star);
310 // vars[iter]=dd->InvMass2Prongs(0,1,211,321);
315 if(TMath::Abs(pdgdaughters[0])==321){
316 vars[iter]=dd->CosPiKPhiRFrameKKpi();
318 vars[iter]=dd->CosPiKPhiRFramepiKK();
323 if(TMath::Abs(pdgdaughters[0])==321){
324 vars[iter]=dd->CosPiDsLabFrameKKpi();
326 vars[iter]=dd->CosPiDsLabFramepiKK();
332 vars[iter]=dd->DecayLengthXY();
337 vars[iter]=dd->NormalizedDecayLength();
342 vars[iter]=dd->NormalizedDecayLengthXY();
347 vars[iter]=dd->CosPointingAngleXY();
350 if(cleanvtx)CleanOwnPrimaryVtx(dd,aod,origownvtx);
353 //---------------------------------------------------------------------------
354 Bool_t AliRDHFCutsDstoKKpi::IsInFiducialAcceptance(Double_t pt, Double_t y) const
357 // Checking if Ds is in fiducial acceptance region
360 if(fMaxRapidityCand>-998.){
361 if(TMath::Abs(y) > fMaxRapidityCand) return kFALSE;
366 // applying cut for pt > 5 GeV
367 AliDebug(2,Form("pt of Ds = %f (> 5), cutting at |y| < 0.8",pt));
368 if (TMath::Abs(y) > 0.8) return kFALSE;
371 // appliying smooth cut for pt < 5 GeV
372 Double_t maxFiducialY = -0.2/15*pt*pt+1.9/15*pt+0.5;
373 Double_t minFiducialY = 0.2/15*pt*pt-1.9/15*pt-0.5;
374 AliDebug(2,Form("pt of Ds = %f (< 5), cutting according to the fiducial zone [%f, %f]\n",pt,minFiducialY,maxFiducialY));
375 if (y < minFiducialY || y > maxFiducialY) return kFALSE;
381 //---------------------------------------------------------------------------
382 Int_t AliRDHFCutsDstoKKpi::IsSelectedPIDBayes(AliAODRecoDecayHF *rd) {
386 if(!fUsePID || !rd) return retCode;
388 AliWarning("AliAODPidHF not created!");
391 if(fPidOption!=kBayesianMaxProb && fPidOption!=kBayesianThreshold && fPidOption!=kBayesianWeights){
392 AliWarning("Wrong call to Bayesian PID");
396 AliPIDCombined* copid=fPidHF->GetPidCombined();
397 copid->SetDetectorMask(AliPIDResponse::kDetTPC | AliPIDResponse::kDetTOF);
398 AliPIDResponse* pidres=fPidHF->GetPidResponse();
399 Double_t bayesProb[AliPID::kSPECIES];
402 Int_t sign= rd->GetCharge();
405 for(Int_t iDaught=0; iDaught<3; iDaught++){
406 AliAODTrack *track=(AliAODTrack*)rd->GetDaughter(iDaught);
411 UInt_t usedDet=copid->ComputeProbabilities(track,pidres,bayesProb);
413 if(fPidOption==kBayesianMaxProb){
414 Double_t maxProb=TMath::MaxElement(AliPID::kSPECIES,bayesProb);
415 if(TMath::Abs(maxProb-bayesProb[AliPID::kPion])<fDistToMaxProb) isPion=1;
417 if(TMath::Abs(maxProb-bayesProb[AliPID::kKaon])<fDistToMaxProb) isKaon=1;
419 if(TMath::Abs(maxProb-bayesProb[AliPID::kProton])<fDistToMaxProb) isProton=1;
422 if(fPidOption==kBayesianThreshold){
423 if(bayesProb[AliPID::kPion]>fBayesThreshold) isPion=1;
425 if(bayesProb[AliPID::kKaon]>fBayesThreshold) isKaon=1;
427 if(bayesProb[AliPID::kProton]>fBayesThreshold) isProton=1;
431 if(fPidOption==kBayesianWeights){ // store the probabilities in the case kBayesianWeights
433 fWeightKKpi*=bayesProb[AliPID::kKaon];
434 fWeightpiKK*=bayesProb[AliPID::kPion];
435 }else if(iDaught==1){
436 fWeightKKpi*=bayesProb[AliPID::kKaon];
437 fWeightpiKK*=bayesProb[AliPID::kKaon];
438 }else if(iDaught==2){
439 fWeightKKpi*=bayesProb[AliPID::kPion];
440 fWeightpiKK*=bayesProb[AliPID::kKaon];
442 }else{ // selection for the other cases
443 if(isProton>0 && isKaon<0 && isPion<0) return 0;
444 if(sign!=track->Charge()){// must be kaon
445 if(isKaon<0) return 0;
447 if(isKaon>0 && isPion<0) nKaons++;
448 if(isKaon<0) nNotKaons++;
450 if(isKaon<0) okKKpi=kFALSE;
451 if(isPion<0) okpiKK=kFALSE;
452 }else if(iDaught==2){
453 if(isKaon<0) okpiKK=kFALSE;
454 if(isPion<0) okKKpi=kFALSE;
458 if(fPidOption==kBayesianWeights) return retCode;
460 if(nKaons>2)return 0;
461 if(nNotKaons>1) return 0;
463 if(!okKKpi) retCode-=1;
464 if(!okpiKK) retCode-=2;
469 //---------------------------------------------------------------------------
470 Int_t AliRDHFCutsDstoKKpi::IsSelectedPID(AliAODRecoDecayHF *rd) {
472 // return values: 0->NOT OK, 1->OK as KKpi, 2->OK as piKK, 3->OK as both
476 if(!fUsePID || !rd) return retCode;
478 AliWarning("AliAODPidHF not created!");
481 if(fPidOption==kBayesianMaxProb || fPidOption==kBayesianThreshold || fPidOption==kBayesianWeights){
482 // call method for Bayesian probability
483 return IsSelectedPIDBayes(rd);
486 Double_t origCompatTOF=fPidHF->GetPCompatTOF();
487 Double_t origThreshTPC=fPidHF->GetPtThresholdTPC();
488 if(fPidOption==kStrong){
489 fPidHF->SetPCompatTOF(999999.);
490 fPidHF->SetPtThresholdTPC(999999.);
495 Int_t sign= rd->GetCharge();
496 for(Int_t iDaught=0; iDaught<3; iDaught++){
497 AliAODTrack *track=(AliAODTrack*)rd->GetDaughter(iDaught);
499 Int_t isPion=fPidHF->MakeRawPid(track,AliPID::kPion);
500 Int_t isKaon=fPidHF->MakeRawPid(track,AliPID::kKaon);
501 Int_t isProton=fPidHF->MakeRawPid(track,AliPID::kProton);
503 if(isProton>0 && isKaon<0 && isPion<0){
504 fPidHF->SetPCompatTOF(origCompatTOF);
505 fPidHF->SetPtThresholdTPC(origThreshTPC);
508 if(sign!=track->Charge()){// must be kaon
510 fPidHF->SetPCompatTOF(origCompatTOF);
511 fPidHF->SetPtThresholdTPC(origThreshTPC);
514 if(fPidOption==kStrong && rd->Pt()<fMaxPtStrongPid && isKaon<=0){
515 fPidHF->SetPCompatTOF(origCompatTOF);
516 fPidHF->SetPtThresholdTPC(origThreshTPC);
519 if(fPidOption==kStrongPDep && rd->Pt()<fMaxPtStrongPid){
520 if(isKaon<=0 && track->P()<fMaxPStrongPidK) return 0;
524 if(isKaon>0 && isPion<0) nKaons++;
525 if(isKaon<0) nNotKaons++;
527 if(isKaon<0) okKKpi=kFALSE;
528 if(isPion<0) okpiKK=kFALSE;
529 if(fPidOption==kStrong && rd->Pt()<fMaxPtStrongPid){
530 if(isKaon<=0) okKKpi=kFALSE;
531 if(isPion<=0) okpiKK=kFALSE;
533 if(fPidOption==kStrongPDep && rd->Pt()<fMaxPtStrongPid){
534 if(isKaon<=0 && track->P()<fMaxPStrongPidK) okKKpi=kFALSE;
535 if(isPion<=0 && track->P()<fMaxPStrongPidpi) okpiKK=kFALSE;
539 if(isKaon<0) okpiKK=kFALSE;
540 if(isPion<0) okKKpi=kFALSE;
541 if(fPidOption==kStrong && rd->Pt()<fMaxPtStrongPid){
542 if(isKaon<=0) okpiKK=kFALSE;
543 if(isPion<=0) okKKpi=kFALSE;
545 if(fPidOption==kStrongPDep && rd->Pt()<fMaxPtStrongPid){
546 if(isKaon<=0 && track->P()<fMaxPStrongPidK) okpiKK=kFALSE;
547 if(isPion<=0 && track->P()<fMaxPStrongPidpi) okKKpi=kFALSE;
552 fPidHF->SetPCompatTOF(origCompatTOF);
553 fPidHF->SetPtThresholdTPC(origThreshTPC);
555 if(nKaons>2)return 0;
556 if(nNotKaons>1) return 0;
558 if(!okKKpi) retCode-=1;
559 if(!okpiKK) retCode-=2;
564 //---------------------------------------------------------------------------
565 Int_t AliRDHFCutsDstoKKpi::IsSelected(TObject* obj,Int_t selectionLevel, AliAODEvent* aod) {
571 cout<<"Cut matrix not inizialized. Exit..."<<endl;
575 AliAODRecoDecayHF3Prong* d=(AliAODRecoDecayHF3Prong*)obj;
578 cout<<"AliAODRecoDecayHF3Prong null"<<endl;
582 if(fKeepSignalMC) if(IsSignalMC(d,aod,431)) return 3;
584 Double_t ptD=d->Pt();
585 if(ptD<fMinPtCand) return 0;
586 if(ptD>fMaxPtCand) return 0;
588 if(fUseTrackSelectionWithFilterBits && d->HasBadDaughters()) return 0;
591 // selection on daughter tracks
592 if(selectionLevel==AliRDHFCuts::kAll ||
593 selectionLevel==AliRDHFCuts::kTracks) {
594 if(!AreDaughtersSelected(d)) return 0;
600 // selection on candidate
601 if(selectionLevel==AliRDHFCuts::kAll ||
602 selectionLevel==AliRDHFCuts::kCandidate) {
603 //recalculate vertex w/o daughters
604 AliAODVertex *origownvtx=0x0;
605 if(fRemoveDaughtersFromPrimary) {
606 if(d->GetOwnPrimaryVtx()) origownvtx=new AliAODVertex(*d->GetOwnPrimaryVtx());
607 if(!RecalcOwnPrimaryVtx(d,aod)) {
608 CleanOwnPrimaryVtx(d,aod,origownvtx);
615 Int_t okMassPhiKKpi=0;
616 Int_t okMassPhipiKK=0;
617 Int_t okMassK0starKKpi=0;
618 Int_t okMassK0starpiKK=0;
621 Int_t okDsK0starKKpi=0;
622 Int_t okDsK0starpiKK=0;
625 Int_t ptbin=PtBin(pt);
627 CleanOwnPrimaryVtx(d,aod,origownvtx);
631 Double_t mDsPDG = TDatabasePDG::Instance()->GetParticle(431)->Mass();
632 Double_t mDsKKpi=d->InvMassDsKKpi();
633 Double_t mDspiKK=d->InvMassDspiKK();
634 if(TMath::Abs(mDsKKpi-mDsPDG)>fCutsRD[GetGlobalIndex(0,ptbin)]) okDsKKpi = 0;
635 if(TMath::Abs(mDspiKK-mDsPDG)>fCutsRD[GetGlobalIndex(0,ptbin)]) okDspiKK = 0;
636 if(!okDsKKpi && !okDspiKK){
637 CleanOwnPrimaryVtx(d,aod,origownvtx);
643 // cuts on resonant decays (via Phi or K0*)
644 if(fCutOnResonances){
645 Double_t mPhiPDG = TDatabasePDG::Instance()->GetParticle(333)->Mass();
646 Double_t mK0starPDG = TDatabasePDG::Instance()->GetParticle(313)->Mass();
648 Double_t mass01phi=d->InvMass2Prongs(0,1,321,321);
649 Double_t mass12K0s=d->InvMass2Prongs(1,2,321,211);
650 if(TMath::Abs(mass01phi-mPhiPDG)<fCutsRD[GetGlobalIndex(12,ptbin)]) okMassPhiKKpi=1;
651 if(TMath::Abs(mass12K0s-mK0starPDG)<fCutsRD[GetGlobalIndex(13,ptbin)]) okMassK0starKKpi = 1;
652 if(!okMassPhiKKpi && !okMassK0starKKpi) okDsKKpi=0;
653 if(okMassPhiKKpi) okDsPhiKKpi=1;
654 if(okMassK0starKKpi) okDsK0starKKpi=1;
657 Double_t mass01K0s=d->InvMass2Prongs(0,1,211,321);
658 Double_t mass12phi=d->InvMass2Prongs(1,2,321,321);
659 if(TMath::Abs(mass01K0s-mK0starPDG)<fCutsRD[GetGlobalIndex(13,ptbin)]) okMassK0starpiKK = 1;
660 if(TMath::Abs(mass12phi-mPhiPDG)<fCutsRD[GetGlobalIndex(12,ptbin)]) okMassPhipiKK=1;
661 if(!okMassPhipiKK && !okMassK0starpiKK) okDspiKK=0;
662 if(okMassPhipiKK) okDsPhipiKK=1;
663 if(okMassK0starpiKK) okDsK0starpiKK=1;
665 if(!okDsKKpi && !okDspiKK){
666 CleanOwnPrimaryVtx(d,aod,origownvtx);
671 // Cuts on track pairs
672 for(Int_t i=0;i<3;i++){
673 if(d->GetDCA(i)>fCutsRD[GetGlobalIndex(11,ptbin)]){
674 CleanOwnPrimaryVtx(d,aod,origownvtx);
678 if(d->GetDist12toPrim()<fCutsRD[GetGlobalIndex(5,ptbin)] ||
679 d->GetDist23toPrim()<fCutsRD[GetGlobalIndex(5,ptbin)]){
680 CleanOwnPrimaryVtx(d,aod,origownvtx);
687 if(TMath::Abs(d->Pt2Prong(1)) < fCutsRD[GetGlobalIndex(1,ptbin)]*fCutsRD[GetGlobalIndex(1,ptbin)] ||
688 TMath::Abs(d->Getd0Prong(1))<fCutsRD[GetGlobalIndex(3,ptbin)]){
689 CleanOwnPrimaryVtx(d,aod,origownvtx);
694 if(TMath::Abs(d->Pt2Prong(0)) < fCutsRD[GetGlobalIndex(1,ptbin)]*fCutsRD[GetGlobalIndex(1,ptbin)] ||
695 TMath::Abs(d->Getd0Prong(0))<fCutsRD[GetGlobalIndex(3,ptbin)]) okDsKKpi=0;
696 if(TMath::Abs(d->Pt2Prong(2)) < fCutsRD[GetGlobalIndex(2,ptbin)]*fCutsRD[GetGlobalIndex(2,ptbin)] ||
697 TMath::Abs(d->Getd0Prong(2))<fCutsRD[GetGlobalIndex(4,ptbin)]) okDsKKpi=0;
700 if(TMath::Abs(d->Pt2Prong(0)) < fCutsRD[GetGlobalIndex(2,ptbin)]*fCutsRD[GetGlobalIndex(2,ptbin)] ||
701 TMath::Abs(d->Getd0Prong(0))<fCutsRD[GetGlobalIndex(4,ptbin)]) okDspiKK=0;
702 if(TMath::Abs(d->Pt2Prong(2)) < fCutsRD[GetGlobalIndex(1,ptbin)]*fCutsRD[GetGlobalIndex(1,ptbin)] ||
703 TMath::Abs(d->Getd0Prong(2))<fCutsRD[GetGlobalIndex(3,ptbin)]) okDspiKK=0;
705 if(!okDsKKpi && !okDspiKK){
706 CleanOwnPrimaryVtx(d,aod,origownvtx);
710 // Cuts on candidate triplet
713 if(d->CosPointingAngle()< fCutsRD[GetGlobalIndex(9,ptbin)]){
714 CleanOwnPrimaryVtx(d,aod,origownvtx);
718 if(d->Pt2Prong(0)<fCutsRD[GetGlobalIndex(8,ptbin)]*fCutsRD[GetGlobalIndex(8,ptbin)] &&
719 d->Pt2Prong(1)<fCutsRD[GetGlobalIndex(8,ptbin)]*fCutsRD[GetGlobalIndex(8,ptbin)] &&
720 d->Pt2Prong(2)<fCutsRD[GetGlobalIndex(8,ptbin)]*fCutsRD[GetGlobalIndex(8,ptbin)]) {
721 CleanOwnPrimaryVtx(d,aod,origownvtx);
725 if(d->DecayLength2()<fCutsRD[GetGlobalIndex(7,ptbin)]*fCutsRD[GetGlobalIndex(7,ptbin)]){
726 CleanOwnPrimaryVtx(d,aod,origownvtx);
731 Double_t sum2=d->Getd0Prong(0)*d->Getd0Prong(0)+d->Getd0Prong(1)*d->Getd0Prong(1)+d->Getd0Prong(2)*d->Getd0Prong(2);
732 if(sum2<fCutsRD[GetGlobalIndex(10,ptbin)]){
733 CleanOwnPrimaryVtx(d,aod,origownvtx);
739 Double_t sigmavert=d->GetSigmaVert(aod);
740 if(sigmavert>fCutsRD[GetGlobalIndex(6,ptbin)]){
741 CleanOwnPrimaryVtx(d,aod,origownvtx);
746 if(d->DecayLengthXY()<fCutsRD[GetGlobalIndex(16,ptbin)]){
747 CleanOwnPrimaryVtx(d,aod,origownvtx);
752 if(d->NormalizedDecayLength()<fCutsRD[GetGlobalIndex(17,ptbin)]){
753 CleanOwnPrimaryVtx(d,aod,origownvtx);
757 //norm decay length XY
758 if(d->NormalizedDecayLengthXY()<fCutsRD[GetGlobalIndex(18,ptbin)]){
759 CleanOwnPrimaryVtx(d,aod,origownvtx);
764 if(d->CosPointingAngleXY()<fCutsRD[GetGlobalIndex(19,ptbin)]){
765 CleanOwnPrimaryVtx(d,aod,origownvtx);
771 Double_t cosPiKPhiRFKKpi=d->CosPiKPhiRFrameKKpi();
772 Double_t kincutPiKPhiKKpi=TMath::Abs(cosPiKPhiRFKKpi*cosPiKPhiRFKKpi*cosPiKPhiRFKKpi);
773 if(kincutPiKPhiKKpi<fCutsRD[GetGlobalIndex(14,ptbin)]) okDsKKpi=0;
776 Double_t cosPiKPhiRFpiKK=d->CosPiKPhiRFramepiKK();
777 Double_t kincutPiKPhipiKK=TMath::Abs(cosPiKPhiRFpiKK*cosPiKPhiRFpiKK*cosPiKPhiRFpiKK);
778 if(kincutPiKPhipiKK<fCutsRD[GetGlobalIndex(14,ptbin)]) okDspiKK=0;
780 if(!okDsKKpi && !okDspiKK){
781 CleanOwnPrimaryVtx(d,aod,origownvtx);
788 Double_t cosPiDsLabFrameKKpi=d->CosPiDsLabFrameKKpi();
789 if(cosPiDsLabFrameKKpi>fCutsRD[GetGlobalIndex(15,ptbin)]) okDsKKpi=0;
792 Double_t cosPiDsLabFramepiKK=d->CosPiDsLabFramepiKK();
793 if(cosPiDsLabFramepiKK>fCutsRD[GetGlobalIndex(15,ptbin)]) okDspiKK=0;
795 if(!okDsKKpi && !okDspiKK){
796 CleanOwnPrimaryVtx(d,aod,origownvtx);
800 // unset recalculated primary vertex when not needed any more
801 CleanOwnPrimaryVtx(d,aod,origownvtx);
815 Int_t returnvaluePID=3;
816 if(selectionLevel==AliRDHFCuts::kAll ||
817 selectionLevel==AliRDHFCuts::kCandidate ||
818 selectionLevel==AliRDHFCuts::kPID) {
819 returnvaluePID = IsSelectedPID(d);
820 fIsSelectedPID=returnvaluePID;
822 if(returnvaluePID==0)return 0;
824 Bool_t okPidDsKKpi=returnvaluePID&1;
825 Bool_t okPidDspiKK=returnvaluePID&2;
835 if((okPidDsKKpi && okDsKKpi)||(okPidDspiKK && okDspiKK)){
837 if(okDsKKpi) returnvalue+=1;
838 if(okDspiKK) returnvalue+=2;
839 if(okDsPhiKKpi) returnvalue+=4;
840 if(okDsPhipiKK) returnvalue+=8;
841 if(okDsK0starKKpi) returnvalue+=16;
842 if(okDsK0starpiKK) returnvalue+=32;
852 //--------------------------------------------------------------------------
854 UInt_t AliRDHFCutsDstoKKpi::GetPIDTrackTPCTOFBitMap(AliAODTrack *track) const{
858 Double_t sigmaTPCPionHyp=-999.;
859 Double_t sigmaTPCKaonHyp=-999.;
860 Double_t sigmaTPCProtonHyp=-999.;
861 Double_t sigmaTOFPionHyp=-999.;
862 Double_t sigmaTOFKaonHyp=-999.;
863 Double_t sigmaTOFProtonHyp=-999.;
865 Int_t oksigmaTPCPionHyp=fPidHF->GetnSigmaTPC(track,2,sigmaTPCPionHyp);
866 Int_t oksigmaTPCKaonHyp=fPidHF->GetnSigmaTPC(track,3,sigmaTPCKaonHyp);
867 Int_t oksigmaTPCProtonHyp=fPidHF->GetnSigmaTPC(track,4,sigmaTPCProtonHyp);
868 Int_t oksigmaTOFPionHyp=fPidHF->GetnSigmaTOF(track,2,sigmaTOFPionHyp);
869 Int_t oksigmaTOFKaonHyp=fPidHF->GetnSigmaTOF(track,3,sigmaTOFKaonHyp);
870 Int_t oksigmaTOFProtonHyp=fPidHF->GetnSigmaTOF(track,4,sigmaTOFProtonHyp);
872 sigmaTPCPionHyp=TMath::Abs(sigmaTPCPionHyp);
873 sigmaTPCKaonHyp=TMath::Abs(sigmaTPCKaonHyp);
874 sigmaTPCProtonHyp=TMath::Abs(sigmaTPCProtonHyp);
875 sigmaTOFPionHyp=TMath::Abs(sigmaTOFPionHyp);
876 sigmaTOFKaonHyp=TMath::Abs(sigmaTOFKaonHyp);
877 sigmaTOFProtonHyp=TMath::Abs(sigmaTOFProtonHyp);
879 if (oksigmaTPCPionHyp && sigmaTPCPionHyp>0.){
880 if (sigmaTPCPionHyp<1.) bitmap+=1<<kTPCPionLess1;
882 if (sigmaTPCPionHyp<2.) bitmap+=1<<kTPCPionMore1Less2;
884 if (sigmaTPCPionHyp<3.) bitmap+=1<<kTPCPionMore2Less3;
885 else bitmap+=1<<kTPCPionMore3;
890 if (oksigmaTPCKaonHyp && sigmaTPCKaonHyp>0.){
891 if (sigmaTPCKaonHyp<1.) bitmap+=1<<kTPCKaonLess1;
893 if (sigmaTPCKaonHyp<2.) bitmap+=1<<kTPCKaonMore1Less2;
895 if (sigmaTPCKaonHyp<3.) bitmap+=1<<kTPCKaonMore2Less3;
896 else bitmap+=1<<kTPCKaonMore3;
901 if (oksigmaTPCProtonHyp && sigmaTPCProtonHyp>0.){
902 if (sigmaTPCProtonHyp<1.) bitmap+=1<<kTPCProtonLess1;
904 if (sigmaTPCProtonHyp<2.) bitmap+=1<<kTPCProtonMore1Less2;
906 if (sigmaTPCProtonHyp<3.) bitmap+=1<<kTPCProtonMore2Less3;
907 else bitmap+=1<<kTPCProtonMore3;
912 if (oksigmaTOFPionHyp && sigmaTOFPionHyp>0.){
913 if (sigmaTOFPionHyp<1.) bitmap+=1<<kTOFPionLess1;
915 if (sigmaTOFPionHyp<2.) bitmap+=1<<kTOFPionMore1Less2;
917 if (sigmaTOFPionHyp<3.) bitmap+=1<<kTOFPionMore2Less3;
918 else bitmap+=1<<kTOFPionMore3;
923 if (oksigmaTOFKaonHyp && sigmaTOFKaonHyp>0.){
924 if (sigmaTOFKaonHyp<1.) bitmap+=1<<kTOFKaonLess1;
926 if (sigmaTOFKaonHyp<2.) bitmap+=1<<kTOFKaonMore1Less2;
928 if (sigmaTOFKaonHyp<3.) bitmap+=1<<kTOFKaonMore2Less3;
929 else bitmap+=1<<kTOFKaonMore3;
934 if (oksigmaTOFProtonHyp && sigmaTOFProtonHyp>0.){
935 if (sigmaTOFProtonHyp<1.) bitmap+=1<<kTOFProtonLess1;
937 if (sigmaTOFProtonHyp<2.) bitmap+=1<<kTOFProtonMore1Less2;
939 if (sigmaTOFProtonHyp<3.) bitmap+=1<<kTOFProtonMore2Less3;
940 else bitmap+=1<<kTOFProtonMore3;
952 //---------------------------------------------------------------------------
954 void AliRDHFCutsDstoKKpi::SetStandardCutsPP2010() {
956 //STANDARD CUTS USED FOR 2010 pp analysis
959 SetName("DstoKKpiCutsStandard");
960 SetTitle("Standard Cuts for D+s analysis");
963 SetOptPileup(AliRDHFCuts::kRejectPileupEvent);
968 AliESDtrackCuts* esdTrackCuts=new AliESDtrackCuts();
969 esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
971 esdTrackCuts->SetRequireTPCRefit(kTRUE);
972 esdTrackCuts->SetRequireITSRefit(kTRUE);
973 //esdTrackCuts->SetMinNClustersITS(4); // default is 5
974 esdTrackCuts->SetMinNClustersTPC(70);
975 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
976 AliESDtrackCuts::kAny);
977 // default is kBoth, otherwise kAny
978 esdTrackCuts->SetMinDCAToVertexXY(0.);
979 esdTrackCuts->SetPtRange(0.3,1.e10);
981 AddTrackCuts(esdTrackCuts);
986 const Int_t nptbins=4;
987 Float_t ptbins[nptbins+1];
994 const Int_t nvars=20;
996 Float_t** anacutsval;
997 anacutsval=new Float_t*[nvars];
999 for(Int_t ic=0;ic<nvars;ic++){anacutsval[ic]=new Float_t[nptbins];}
1000 for(Int_t ipt=0;ipt<nptbins;ipt++){
1002 anacutsval[0][ipt]=0.35;
1003 anacutsval[1][ipt]=0.3;
1004 anacutsval[2][ipt]=0.3;
1005 anacutsval[3][ipt]=0.;
1006 anacutsval[4][ipt]=0.;
1007 anacutsval[5][ipt]=0.005;
1008 anacutsval[8][ipt]=0.;
1009 anacutsval[10][ipt]=0.;
1010 anacutsval[11][ipt]=1000.0;
1011 anacutsval[13][ipt]=0.1;
1012 anacutsval[16][ipt]=0.;
1013 anacutsval[17][ipt]=0.;
1014 anacutsval[18][ipt]=0.;
1015 anacutsval[19][ipt]=-1.;
1022 anacutsval[6][0]=0.020;
1023 anacutsval[6][1]=0.030;
1024 anacutsval[6][2]=0.030;
1025 anacutsval[6][3]=0.060;
1029 anacutsval[7][0]=0.035;
1030 anacutsval[7][1]=0.035;
1031 anacutsval[7][2]=0.040;
1032 anacutsval[7][3]=0.040;
1036 anacutsval[9][0]=0.94;
1037 anacutsval[9][1]=0.94;
1038 anacutsval[9][2]=0.94;
1039 anacutsval[9][3]=0.94;
1043 anacutsval[12][0]=0.0080;
1044 anacutsval[12][1]=0.0050;
1045 anacutsval[12][2]=0.0045;
1046 anacutsval[12][3]=0.0090;
1050 anacutsval[14][0]=0.10;
1051 anacutsval[14][1]=0.05;
1052 anacutsval[14][2]=0.0;
1053 anacutsval[14][3]=0.05;
1057 anacutsval[15][0]=0.95;
1058 anacutsval[15][1]=0.95;
1059 anacutsval[15][2]=1.;
1060 anacutsval[15][3]=0.95;
1062 fPidHF->SetOldPid(kTRUE);
1065 SetMaxPtStrongPid(9999.);
1066 SetGlobalIndex(nvars,nptbins);
1067 SetPtBins(nptbins+1,ptbins);
1068 SetCuts(nvars,nptbins,anacutsval);
1069 SetRemoveDaughtersFromPrim(kTRUE);
1073 for(Int_t iic=0;iic<nvars;iic++){delete [] anacutsval[iic];}
1074 delete [] anacutsval;