25 #include <TDatabasePDG.h>
26 #include <Riostream.h>
30 #include "AliAODTrack.h"
31 #include "AliESDtrack.h"
44 fCutOnResonances(kTRUE),
50 fBayesThreshold(0.05),
59 TString varNames[20]={
"inv. mass [GeV]",
71 "inv. mass (Mphi-MKK) [GeV]",
72 "inv. mass (MKo*-MKpi) [GeV]",
73 "Abs(CosineKpiPhiRFrame)^3",
80 Bool_t isUpperCut[20]={kTRUE,
101 Bool_t forOpt[20]={kFALSE,
123 Float_t limits[2]={0,999999999.};
127 Double_t plim[2]={0.6,0.8};
128 Double_t
nsigma[5]={2.,1.,2.,3.,0.};
144 fCutOnResonances(source.fCutOnResonances),
145 fPidOption(source.fPidOption),
146 fMaxPtStrongPid(source.fMaxPtStrongPid),
147 fMaxPStrongPidK(source.fMaxPStrongPidK),
148 fMaxPStrongPidpi(source.fMaxPStrongPidpi),
149 fDistToMaxProb(source.fDistToMaxProb),
150 fBayesThreshold(source.fBayesThreshold),
151 fWeightKKpi(source.fWeightKKpi),
152 fWeightpiKK(source.fWeightpiKK)
165 if(&source ==
this)
return *
this;
190 printf(
"AliRDHFCutsDstoKKpi::GetCutsVarsForOpt: wrong number of variables\n");
197 Bool_t cleanvtx=kFALSE;
198 AliAODVertex *origownvtx=0x0;
211 if(TMath::Abs(pdgdaughters[0])==321){
219 Float_t minPtDau=99999.;
220 for(Int_t iprong=0;iprong<3;iprong++){
221 if(TMath::Abs(pdgdaughters[iprong])==321 &&
222 dd->PtProng(iprong)<minPtDau) minPtDau=dd->PtProng(iprong);
228 for(Int_t iprong=0;iprong<3;iprong++){
229 if(TMath::Abs(pdgdaughters[iprong])==211) {
230 vars[iter]=dd->PtProng(iprong);
236 Float_t minImpParDau=99999.;
237 for(Int_t iprong=0;iprong<3;iprong++){
238 if(TMath::Abs(pdgdaughters[iprong])==321 &&
239 dd->Getd0Prong(iprong)<minImpParDau) minImpParDau=dd->Getd0Prong(iprong);
241 vars[iter]=minImpParDau;
245 for(Int_t iprong=0;iprong<3;iprong++){
246 if(TMath::Abs(pdgdaughters[iprong])==211) {
247 vars[iter]=dd->Getd0Prong(iprong);
254 vars[iter]=minDistPair;
267 for(Int_t i=0;i<3;i++){
268 if(dd->PtProng(i)>
ptmax)ptmax=dd->PtProng(i);
278 vars[iter]=dd->Getd0Prong(0)*dd->Getd0Prong(0)+dd->Getd0Prong(1)*dd->Getd0Prong(1)+dd->Getd0Prong(2)*dd->Getd0Prong(2);
283 for(Int_t i=0;i<3;i++){
284 if(d->GetDCA(i)>maxDCA) maxDCA=d->GetDCA(i);
290 Double_t mPDGPhi = TDatabasePDG::Instance()->GetParticle(333)->Mass();
291 if(TMath::Abs(pdgdaughters[0])==321){
293 Double_t phimass01=d->InvMass2Prongs(0,1,321,321);
294 vars[iter]=TMath::Abs(phimass01-mPDGPhi);
297 Double_t phimass12=d->InvMass2Prongs(1,2,321,321);
298 vars[iter]=TMath::Abs(phimass12-mPDGPhi);
304 Double_t mPDGK0star = TDatabasePDG::Instance()->GetParticle(313)->Mass();
305 if(TMath::Abs(pdgdaughters[0])==321){
307 Double_t mass12kpi=d->InvMass2Prongs(1,2,321,211);
308 vars[iter]=TMath::Abs(mass12kpi-mPDGK0star);
311 Double_t mass01pik=d->InvMass2Prongs(0,1,211,321);
312 vars[iter]=TMath::Abs(mass01pik-mPDGK0star);
318 if(TMath::Abs(pdgdaughters[0])==321){
326 if(TMath::Abs(pdgdaughters[0])==321){
370 AliDebug(2,Form(
"pt of Ds = %f (> 5), cutting at |y| < 0.8",pt));
371 if (TMath::Abs(y) > 0.8)
return kFALSE;
375 Double_t maxFiducialY = -0.2/15*pt*pt+1.9/15*pt+0.5;
376 Double_t minFiducialY = 0.2/15*pt*pt-1.9/15*pt-0.5;
377 AliDebug(2,Form(
"pt of Ds = %f (< 5), cutting according to the fiducial zone [%f, %f]\n",pt,minFiducialY,maxFiducialY));
378 if (y < minFiducialY || y > maxFiducialY)
return kFALSE;
389 if(!
fUsePID || !rd)
return retCode;
391 AliWarning(
"AliAODPidHF not created!");
395 AliWarning(
"Wrong call to Bayesian PID");
400 copid->SetDetectorMask(AliPIDResponse::kDetTPC | AliPIDResponse::kDetTOF);
402 Double_t bayesProb[AliPID::kSPECIES];
405 Int_t sign= rd->GetCharge();
408 for(Int_t iDaught=0; iDaught<3; iDaught++){
409 AliAODTrack *track=(AliAODTrack*)rd->GetDaughter(iDaught);
414 UInt_t usedDet=copid->ComputeProbabilities(track,pidres,bayesProb);
417 Double_t maxProb=TMath::MaxElement(AliPID::kSPECIES,bayesProb);
418 if(TMath::Abs(maxProb-bayesProb[AliPID::kPion])<
fDistToMaxProb) isPion=1;
420 if(TMath::Abs(maxProb-bayesProb[AliPID::kKaon])<
fDistToMaxProb) isKaon=1;
422 if(TMath::Abs(maxProb-bayesProb[AliPID::kProton])<
fDistToMaxProb) isProton=1;
438 }
else if(iDaught==1){
441 }
else if(iDaught==2){
446 if(isProton>0 && isKaon<0 && isPion<0)
return 0;
447 if(sign!=track->Charge()){
448 if(isKaon<0)
return 0;
450 if(isKaon>0 && isPion<0) nKaons++;
451 if(isKaon<0) nNotKaons++;
453 if(isKaon<0) okKKpi=kFALSE;
454 if(isPion<0) okpiKK=kFALSE;
455 }
else if(iDaught==2){
456 if(isKaon<0) okpiKK=kFALSE;
457 if(isPion<0) okKKpi=kFALSE;
463 if(nKaons>2)
return 0;
464 if(nNotKaons>1)
return 0;
466 if(!okKKpi) retCode-=1;
467 if(!okpiKK) retCode-=2;
479 if(!
fUsePID || !rd)
return retCode;
481 AliWarning(
"AliAODPidHF not created!");
498 Int_t sign= rd->GetCharge();
499 for(Int_t iDaught=0; iDaught<3; iDaught++){
500 AliAODTrack *track=(AliAODTrack*)rd->GetDaughter(iDaught);
506 if(isProton>0 && isKaon<0 && isPion<0){
511 if(sign!=track->Charge()){
527 if(isKaon>0 && isPion<0) nKaons++;
528 if(isKaon<0) nNotKaons++;
530 if(isKaon<0) okKKpi=kFALSE;
531 if(isPion<0) okpiKK=kFALSE;
533 if(isKaon<=0) okKKpi=kFALSE;
534 if(isPion<=0) okpiKK=kFALSE;
542 if(isKaon<0) okpiKK=kFALSE;
543 if(isPion<0) okKKpi=kFALSE;
545 if(isKaon<=0) okpiKK=kFALSE;
546 if(isPion<=0) okKKpi=kFALSE;
558 if(nKaons>2)
return 0;
559 if(nNotKaons>1)
return 0;
561 if(!okKKpi) retCode-=1;
562 if(!okpiKK) retCode-=2;
574 cout<<
"Cut matrix not inizialized. Exit..."<<endl;
581 cout<<
"AliAODRecoDecayHF3Prong null"<<endl;
587 Double_t ptD=d->Pt();
607 AliAODVertex *origownvtx=0x0;
618 Int_t okMassPhiKKpi=0;
619 Int_t okMassPhipiKK=0;
620 Int_t okMassK0starKKpi=0;
621 Int_t okMassK0starpiKK=0;
624 Int_t okDsK0starKKpi=0;
625 Int_t okDsK0starpiKK=0;
628 Int_t ptbin=
PtBin(pt);
634 Double_t mDsPDG = TDatabasePDG::Instance()->GetParticle(431)->Mass();
639 if(!okDsKKpi && !okDspiKK){
648 Double_t mPhiPDG = TDatabasePDG::Instance()->GetParticle(333)->Mass();
649 Double_t mK0starPDG = TDatabasePDG::Instance()->GetParticle(313)->Mass();
651 Double_t mass01phi=d->InvMass2Prongs(0,1,321,321);
652 Double_t mass12K0s=d->InvMass2Prongs(1,2,321,211);
655 if(!okMassPhiKKpi && !okMassK0starKKpi) okDsKKpi=0;
656 if(okMassPhiKKpi) okDsPhiKKpi=1;
657 if(okMassK0starKKpi) okDsK0starKKpi=1;
660 Double_t mass01K0s=d->InvMass2Prongs(0,1,211,321);
661 Double_t mass12phi=d->InvMass2Prongs(1,2,321,321);
664 if(!okMassPhipiKK && !okMassK0starpiKK) okDspiKK=0;
665 if(okMassPhipiKK) okDsPhipiKK=1;
666 if(okMassK0starpiKK) okDsK0starpiKK=1;
668 if(!okDsKKpi && !okDspiKK){
675 for(Int_t i=0;i<3;i++){
708 if(!okDsKKpi && !okDspiKK){
734 Double_t sum2=d->Getd0Prong(0)*d->Getd0Prong(0)+d->Getd0Prong(1)*d->Getd0Prong(1)+d->Getd0Prong(2)*d->Getd0Prong(2);
775 Double_t kincutPiKPhiKKpi=TMath::Abs(cosPiKPhiRFKKpi*cosPiKPhiRFKKpi*cosPiKPhiRFKKpi);
780 Double_t kincutPiKPhipiKK=TMath::Abs(cosPiKPhiRFpiKK*cosPiKPhiRFpiKK*cosPiKPhiRFpiKK);
783 if(!okDsKKpi && !okDspiKK){
798 if(!okDsKKpi && !okDspiKK){
818 Int_t returnvaluePID=3;
825 if(returnvaluePID==0)
return 0;
827 Bool_t okPidDsKKpi=returnvaluePID&1;
828 Bool_t okPidDspiKK=returnvaluePID&2;
838 if((okPidDsKKpi && okDsKKpi)||(okPidDspiKK && okDspiKK)){
840 if(okDsKKpi) returnvalue+=1;
841 if(okDspiKK) returnvalue+=2;
842 if(okDsPhiKKpi) returnvalue+=4;
843 if(okDsPhipiKK) returnvalue+=8;
844 if(okDsK0starKKpi) returnvalue+=16;
845 if(okDsK0starpiKK) returnvalue+=32;
861 Double_t sigmaTPCPionHyp=-999.;
862 Double_t sigmaTPCKaonHyp=-999.;
863 Double_t sigmaTPCProtonHyp=-999.;
864 Double_t sigmaTOFPionHyp=-999.;
865 Double_t sigmaTOFKaonHyp=-999.;
866 Double_t sigmaTOFProtonHyp=-999.;
875 sigmaTPCPionHyp=TMath::Abs(sigmaTPCPionHyp);
876 sigmaTPCKaonHyp=TMath::Abs(sigmaTPCKaonHyp);
877 sigmaTPCProtonHyp=TMath::Abs(sigmaTPCProtonHyp);
878 sigmaTOFPionHyp=TMath::Abs(sigmaTOFPionHyp);
879 sigmaTOFKaonHyp=TMath::Abs(sigmaTOFKaonHyp);
880 sigmaTOFProtonHyp=TMath::Abs(sigmaTOFProtonHyp);
882 if (oksigmaTPCPionHyp && sigmaTPCPionHyp>0.){
893 if (oksigmaTPCKaonHyp && sigmaTPCKaonHyp>0.){
904 if (oksigmaTPCProtonHyp && sigmaTPCProtonHyp>0.){
915 if (oksigmaTOFPionHyp && sigmaTOFPionHyp>0.){
926 if (oksigmaTOFKaonHyp && sigmaTOFKaonHyp>0.){
937 if (oksigmaTOFProtonHyp && sigmaTOFProtonHyp>0.){
962 SetName(
"DstoKKpiCutsStandard");
963 SetTitle(
"Standard Cuts for D+s analysis");
971 AliESDtrackCuts* esdTrackCuts=
new AliESDtrackCuts();
972 esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
974 esdTrackCuts->SetRequireTPCRefit(kTRUE);
975 esdTrackCuts->SetRequireITSRefit(kTRUE);
977 esdTrackCuts->SetMinNClustersTPC(70);
978 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
979 AliESDtrackCuts::kAny);
981 esdTrackCuts->SetMinDCAToVertexXY(0.);
982 esdTrackCuts->SetPtRange(0.3,1.e10);
990 Float_t ptbins[nptbins+1];
997 const Int_t nvars=20;
999 Float_t** anacutsval;
1000 anacutsval=
new Float_t*[nvars];
1002 for(Int_t ic=0;ic<nvars;ic++){anacutsval[ic]=
new Float_t[
nptbins];}
1003 for(Int_t ipt=0;ipt<
nptbins;ipt++){
1005 anacutsval[0][ipt]=0.35;
1006 anacutsval[1][ipt]=0.3;
1007 anacutsval[2][ipt]=0.3;
1008 anacutsval[3][ipt]=0.;
1009 anacutsval[4][ipt]=0.;
1010 anacutsval[5][ipt]=0.005;
1011 anacutsval[8][ipt]=0.;
1012 anacutsval[10][ipt]=0.;
1013 anacutsval[11][ipt]=1000.0;
1014 anacutsval[13][ipt]=0.1;
1015 anacutsval[16][ipt]=0.;
1016 anacutsval[17][ipt]=0.;
1017 anacutsval[18][ipt]=0.;
1018 anacutsval[19][ipt]=-1.;
1025 anacutsval[6][0]=0.020;
1026 anacutsval[6][1]=0.030;
1027 anacutsval[6][2]=0.030;
1028 anacutsval[6][3]=0.060;
1032 anacutsval[7][0]=0.035;
1033 anacutsval[7][1]=0.035;
1034 anacutsval[7][2]=0.040;
1035 anacutsval[7][3]=0.040;
1039 anacutsval[9][0]=0.94;
1040 anacutsval[9][1]=0.94;
1041 anacutsval[9][2]=0.94;
1042 anacutsval[9][3]=0.94;
1046 anacutsval[12][0]=0.0080;
1047 anacutsval[12][1]=0.0050;
1048 anacutsval[12][2]=0.0045;
1049 anacutsval[12][3]=0.0090;
1053 anacutsval[14][0]=0.10;
1054 anacutsval[14][1]=0.05;
1055 anacutsval[14][2]=0.0;
1056 anacutsval[14][3]=0.05;
1060 anacutsval[15][0]=0.95;
1061 anacutsval[15][1]=0.95;
1062 anacutsval[15][2]=1.;
1063 anacutsval[15][3]=0.95;
1071 SetCuts(nvars,nptbins,anacutsval);
1076 for(Int_t iic=0;iic<nvars;iic++){
delete [] anacutsval[iic];}
1077 delete [] anacutsval;
Double_t NormalizedDecayLengthXY() const
Double_t NormalizedDecayLength() const
void SetAsym(Bool_t asym)
AliRDHFCutsDstoKKpi(const char *name="CutsDstoKKpi")
Double_t InvMassDsKKpi() const
Bool_t IsSignalMC(AliAODRecoDecay *d, AliAODEvent *aod, Int_t pdg) const
Double_t GetPCompatTOF() const
Int_t GetnSigmaTOF(AliAODTrack *track, Int_t species, Double_t &sigma) const
void SetPidOption(Int_t opt)
Double_t InvMassDspiKK() const
Bool_t fRemoveDaughtersFromPrimary
Double_t GetDist12toPrim() const
Int_t GetnSigmaTPC(AliAODTrack *track, Int_t species, Double_t &sigma) const
virtual void GetCutVarsForOpt(AliAODRecoDecayHF *d, Float_t *vars, Int_t nvars, Int_t *pdgdaughters)
Double_t CosPiDsLabFrameKKpi() const
virtual Int_t IsSelectedPIDBayes(AliAODRecoDecayHF *rd)
Double_t fWeightKKpi
Threshold for Bayesian PID probability.
void SetPCompatTOF(Double_t pTOF)
void SetNVars(Int_t nVars)
Double_t CosPointingAngleXY() const
Double_t fMaxRapidityCand
minimum pt of the candidate
Float_t fMaxPtStrongPid
pid option
AliRDHFCuts & operator=(const AliRDHFCuts &source)
virtual Bool_t IsInFiducialAcceptance(Double_t pt, Double_t y) const
virtual Int_t IsSelectedPID(AliAODRecoDecayHF *rd)
Double_t GetPtThresholdTPC()
UInt_t GetPIDTrackTPCTOFBitMap(AliAODTrack *track) const
Int_t fPidOption
switch for the cuts on phi and K0* inv. mass
Bool_t HasBadDaughters() const
void SetMinVtxContr(Int_t contr=1)
Bool_t fUseTrackSelectionWithFilterBits
flag to reject kink daughters
void SetCuts(Int_t nVars, Int_t nPtBins, Float_t **cutsRD)
AliPIDCombined * GetPidCombined() const
void SetMaxPtStrongPid(Float_t spid)
void SetPtThresholdTPC(Double_t ptThresholdTPC)
Double_t fMaxPtCand
minimum pt of the candidate
Double_t CosPiKPhiRFrameKKpi() const
AliAODVertex * GetOwnPrimaryVtx() const
Bool_t fKeepSignalMC
max rapidity of candidate (if !=-999 overrides IsInFiducialAcceptance)
virtual Int_t IsSelected(TObject *obj, Int_t selectionLevel)
Double_t GetSigmaVert(const AliAODEvent *aod=0x0)
Bool_t AreDaughtersSelected(AliAODRecoDecayHF *rd) const
virtual void SetStandardCutsPP2010()
AliRDHFCutsDstoKKpi & operator=(const AliRDHFCutsDstoKKpi &source)
Int_t fIsSelectedPID
outcome of cuts selection
Int_t MakeRawPid(AliAODTrack *track, Int_t specie)
AliPIDResponse * GetPidResponse() const
void SetSigma(Double_t *sigma)
Float_t * fCutsRD
fnVars*fnPtBins
Double_t DecayLength2() const
kinematics & topology
Double_t GetDist23toPrim() const
Float_t fMaxPStrongPidK
Maximum pt of candidate to apply strong Pid p dependent.
Double_t CosPiDsLabFramepiKK() const
void SetVarsForOpt(Int_t nVars, Bool_t *forOpt)
Double_t DecayLengthXY() const
void SetVarNames(Int_t nVars, TString *varNames, Bool_t *isUpperCut)
Bool_t * fVarsForOpt
number of cut vars to be optimized for candidates
Double_t fWeightpiKK
weight for KKpi for kBayesianWeights
Double_t fDistToMaxProb
Maximum P of track to apply strong Pid on pi.
Double_t fBayesThreshold
Difference between max probability.
void SetUsePID(Bool_t flag=kTRUE)
virtual void PrintAll() const
ClassImp(AliAnalysisTaskCRC) AliAnalysisTaskCRC
void CleanOwnPrimaryVtx(AliAODRecoDecayHF *d, AliAODEvent *aod, AliAODVertex *origownvtx) const
void SetRemoveDaughtersFromPrim(Bool_t removeDaughtersPrim)
Float_t fMaxPStrongPidpi
Maximum P of track to apply strong Pid on K.
void SetOldPid(Bool_t oldPid)
void SetPtBins(Int_t nPtBinLimits, Float_t *ptBinLimits)
void SetMatch(Int_t match)
void AddTrackCuts(const AliESDtrackCuts *cuts)
void SetPLimit(Double_t *plim, Int_t npLim)
Double_t CosPointingAngle() const
void SetCompat(Bool_t comp)
AliAODPidHF * fPidHF
enable AOD049 centrality cleanup
Bool_t RecalcOwnPrimaryVtx(AliAODRecoDecayHF *d, AliAODEvent *aod) const
Int_t PtBin(Double_t pt) const
void SetOptPileup(Int_t opt=0)
Int_t GetGlobalIndex(Int_t iVar, Int_t iPtBin) const
Double_t DecayLength() const
Double_t CosPiKPhiRFramepiKK() const
Double_t fMinPtCand
outcome of PID selection