25 #include <TDatabasePDG.h> 26 #include <Riostream.h> 30 #include "AliAODTrack.h" 31 #include "AliESDtrack.h" 44 fCutOnResonances(kTRUE),
50 fBayesThreshold(0.05),
54 fUseRefPhiMass(kFALSE),
55 fUsed0MeasMinusExpCut(kFALSE),
56 fMaxd0MeasMinusExp(0x0),
66 TString varNames[20]={
"inv. mass [GeV]",
78 "inv. mass (Mphi-MKK) [GeV]",
79 "inv. mass (MKo*-MKpi) [GeV]",
80 "Abs(CosineKpiPhiRFrame)^3",
87 Bool_t isUpperCut[20]={kTRUE,
108 Bool_t forOpt[20]={kFALSE,
130 Float_t limits[2]={0,999999999.};
180 if(&source ==
this)
return *
this;
217 printf(
"Wrong number of pt bins: it has to be %d\n",
fnPtBins);
232 printf(
"Wrong number of pt bins: it has to be %d\n",
fnPtBins);
251 AliAODTrack *track[3];
252 for(
Int_t iDaught=0; iDaught<3; iDaught++) {
253 track[iDaught] = (AliAODTrack*)aodTracks.At(iDaught);
254 if(!track[iDaught])
return retVal;
255 px += track[iDaught]->Px();
256 py += track[iDaught]->Py();
259 Double_t ptD=TMath::Sqrt(px*px+py*py);
269 Double_t mPhiPDG = TDatabasePDG::Instance()->GetParticle(333)->Mass();
270 Double_t mK0starPDG = TDatabasePDG::Instance()->GetParticle(313)->Mass();
272 Bool_t okDsKKpi = (retVal==1 || retVal==3) ? kTRUE : kFALSE;
273 Bool_t okDspiKK = (retVal==2 || retVal==3) ? kTRUE : kFALSE;
282 if(mass01phi2<minmassphi2 || mass01phi2>maxmassphi2) okDsKKpi=kFALSE;
291 if(mass12K0s<minmassK0s2 || mass12K0s>maxmassK0s2) okDsKKpi=kFALSE;
301 if(mass01phi2<minmassphi2 || mass01phi2>maxmassphi2) okDsKKpi=kFALSE;
310 if(mass12K0s<minmassK0s2 || mass12K0s>maxmassK0s2) okDsKKpi=kFALSE;
314 if(okDsKKpi && okDspiKK) retVal=3;
315 else if(okDsKKpi && !okDspiKK) retVal=1;
316 else if(!okDsKKpi && okDspiKK) retVal=2;
328 printf(
"AliRDHFCutsDstoKKpi::GetCutsVarsForOpt: wrong number of variables\n");
336 AliAODVertex *origownvtx=0x0;
349 if(TMath::Abs(pdgdaughters[0])==321){
358 for(
Int_t iprong=0;iprong<3;iprong++){
359 if(TMath::Abs(pdgdaughters[iprong])==321 &&
360 dd->PtProng(iprong)<minPtDau) minPtDau=dd->PtProng(iprong);
366 for(
Int_t iprong=0;iprong<3;iprong++){
367 if(TMath::Abs(pdgdaughters[iprong])==211) {
368 vars[iter]=dd->PtProng(iprong);
375 for(
Int_t iprong=0;iprong<3;iprong++){
376 if(TMath::Abs(pdgdaughters[iprong])==321 &&
377 dd->Getd0Prong(iprong)<minImpParDau) minImpParDau=dd->Getd0Prong(iprong);
379 vars[iter]=minImpParDau;
383 for(
Int_t iprong=0;iprong<3;iprong++){
384 if(TMath::Abs(pdgdaughters[iprong])==211) {
385 vars[iter]=dd->Getd0Prong(iprong);
392 vars[iter]=minDistPair;
405 for(
Int_t i=0;i<3;i++){
406 if(dd->PtProng(i)>
ptmax)ptmax=dd->PtProng(i);
416 vars[iter]=dd->Getd0Prong(0)*dd->Getd0Prong(0)+dd->Getd0Prong(1)*dd->Getd0Prong(1)+dd->Getd0Prong(2)*dd->Getd0Prong(2);
421 for(
Int_t i=0;i<3;i++){
422 if(d->GetDCA(i)>maxDCA) maxDCA=d->GetDCA(i);
428 Double_t mPDGPhi = TDatabasePDG::Instance()->GetParticle(333)->Mass();
429 if(TMath::Abs(pdgdaughters[0])==321){
431 Double_t phimass01=d->InvMass2Prongs(0,1,321,321);
432 vars[iter]=TMath::Abs(phimass01-mPDGPhi);
435 Double_t phimass12=d->InvMass2Prongs(1,2,321,321);
436 vars[iter]=TMath::Abs(phimass12-mPDGPhi);
442 Double_t mPDGK0star = TDatabasePDG::Instance()->GetParticle(313)->Mass();
443 if(TMath::Abs(pdgdaughters[0])==321){
445 Double_t mass12kpi=d->InvMass2Prongs(1,2,321,211);
446 vars[iter]=TMath::Abs(mass12kpi-mPDGK0star);
449 Double_t mass01pik=d->InvMass2Prongs(0,1,211,321);
450 vars[iter]=TMath::Abs(mass01pik-mPDGK0star);
456 if(TMath::Abs(pdgdaughters[0])==321){
464 if(TMath::Abs(pdgdaughters[0])==321){
508 AliDebug(2,Form(
"pt of Ds = %f (> 5), cutting at |y| < 0.8",pt));
509 if (TMath::Abs(y) > 0.8)
return kFALSE;
513 Double_t maxFiducialY = -0.2/15*pt*pt+1.9/15*pt+0.5;
514 Double_t minFiducialY = 0.2/15*pt*pt-1.9/15*pt-0.5;
515 AliDebug(2,Form(
"pt of Ds = %f (< 5), cutting according to the fiducial zone [%f, %f]\n",pt,minFiducialY,maxFiducialY));
516 if (y < minFiducialY || y > maxFiducialY)
return kFALSE;
528 for(
Int_t iDaught=0; iDaught<3; iDaught++) {
529 aodtracks.AddAt(rd->GetDaughter(iDaught),iDaught);
543 AliAODTrack *track[3];
544 for(
Int_t iDaught=0; iDaught<3; iDaught++){
545 track[iDaught]=(AliAODTrack*)aodtracks.At(iDaught);
548 if(!
fUsePID || !track[0] || !track[1] || !track[2])
return retCode;
550 Int_t sign = track[0]->Charge();
552 AliWarning(
"AliAODPidHF not created!");
556 AliWarning(
"Wrong call to Bayesian PID");
561 copid->SetDetectorMask(AliPIDResponse::kDetTPC | AliPIDResponse::kDetTOF);
563 Double_t bayesProb[AliPID::kSPECIES];
568 for(
Int_t iDaught=0; iDaught<3; iDaught++){
573 UInt_t usedDet=copid->ComputeProbabilities(track[iDaught],pidres,bayesProb);
576 Double_t maxProb=TMath::MaxElement(AliPID::kSPECIES,bayesProb);
597 }
else if(iDaught==1){
600 }
else if(iDaught==2){
605 if(isProton>0 && isKaon<0 && isPion<0)
return 0;
606 if(sign!=track[iDaught]->Charge()){
607 if(isKaon<0)
return 0;
609 if(isKaon>0 && isPion<0) nKaons++;
610 if(isKaon<0) nNotKaons++;
612 if(isKaon<0) okKKpi=kFALSE;
613 if(isPion<0) okpiKK=kFALSE;
614 }
else if(iDaught==2){
615 if(isKaon<0) okpiKK=kFALSE;
616 if(isPion<0) okKKpi=kFALSE;
622 if(nKaons>2)
return 0;
623 if(nNotKaons>1)
return 0;
625 if(!okKKpi) retCode-=1;
626 if(!okpiKK) retCode-=2;
640 for(
Int_t iDaught=0; iDaught<3; iDaught++) {
641 aodtracks.AddAt(rd->GetDaughter(iDaught),iDaught);
658 AliAODTrack *track[3];
659 for(
Int_t iDaught=0; iDaught<3; iDaught++){
660 track[iDaught]=(AliAODTrack*)aodtracks.At(iDaught);
663 if(!
fUsePID || !track[0] || !track[1] || !track[2])
return retCode;
665 Int_t sign = track[0]->Charge();
667 AliWarning(
"AliAODPidHF not created!");
684 for(
Int_t iDaught=0; iDaught<3; iDaught++){
690 if(isProton>0 && isKaon<0 && isPion<0){
695 if(sign!=track[iDaught]->Charge()){
711 if(isKaon>0 && isPion<0) nKaons++;
712 if(isKaon<0) nNotKaons++;
714 if(isKaon<0) okKKpi=kFALSE;
715 if(isPion<0) okpiKK=kFALSE;
717 if(isKaon<=0) okKKpi=kFALSE;
718 if(isPion<=0) okpiKK=kFALSE;
726 if(isKaon<0) okpiKK=kFALSE;
727 if(isPion<0) okKKpi=kFALSE;
729 if(isKaon<=0) okpiKK=kFALSE;
730 if(isPion<=0) okKKpi=kFALSE;
742 if(nKaons>2)
return 0;
743 if(nNotKaons>1)
return 0;
745 if(!okKKpi) retCode-=1;
746 if(!okpiKK) retCode-=2;
758 cout<<
"Cut matrix not inizialized. Exit..."<<endl;
765 cout<<
"AliAODRecoDecayHF3Prong null"<<endl;
791 AliAODVertex *origownvtx=0x0;
802 Int_t okMassPhiKKpi=0;
803 Int_t okMassPhipiKK=0;
804 Int_t okMassK0starKKpi=0;
805 Int_t okMassK0starpiKK=0;
808 Int_t okDsK0starKKpi=0;
809 Int_t okDsK0starpiKK=0;
818 Double_t mDsPDG = TDatabasePDG::Instance()->GetParticle(431)->Mass();
823 if(!okDsKKpi && !okDspiKK){
832 Double_t mPhiPDG = TDatabasePDG::Instance()->GetParticle(333)->Mass();
833 Double_t mK0starPDG = TDatabasePDG::Instance()->GetParticle(313)->Mass();
837 Double_t mass01phi=d->InvMass2Prongs(0,1,321,321);
840 Double_t mass12K0s=d->InvMass2Prongs(1,2,321,211);
843 if(!okMassPhiKKpi && !okMassK0starKKpi) okDsKKpi=0;
844 if(okMassPhiKKpi) okDsPhiKKpi=1;
845 if(okMassK0starKKpi) okDsK0starKKpi=1;
849 Double_t mass01K0s=d->InvMass2Prongs(0,1,211,321);
852 Double_t mass12phi=d->InvMass2Prongs(1,2,321,321);
854 if(!okMassPhipiKK && !okMassK0starpiKK) okDspiKK=0;
855 if(okMassPhipiKK) okDsPhipiKK=1;
856 if(okMassK0starpiKK) okDsK0starpiKK=1;
858 if(!okDsKKpi && !okDspiKK){
865 for(
Int_t i=0;i<3;i++){
898 if(!okDsKKpi && !okDspiKK){
924 Double_t sum2=d->Getd0Prong(0)*d->Getd0Prong(0)+d->Getd0Prong(1)*d->Getd0Prong(1)+d->Getd0Prong(2)*d->Getd0Prong(2);
965 Double_t kincutPiKPhiKKpi=TMath::Abs(cosPiKPhiRFKKpi*cosPiKPhiRFKKpi*cosPiKPhiRFKKpi);
970 Double_t kincutPiKPhipiKK=TMath::Abs(cosPiKPhiRFpiKK*cosPiKPhiRFpiKK*cosPiKPhiRFpiKK);
973 if(!okDsKKpi && !okDspiKK){
988 if(!okDsKKpi && !okDspiKK){
996 for(
Int_t ipr=0; ipr<3; ipr++) {
1000 if(errdiffIP>0) normdd0=diffIP/errdiffIP;
1001 if(ipr==0) dd0max=normdd0;
1002 else if(TMath::Abs(normdd0)>TMath::Abs(dd0max)) dd0max=normdd0;
1029 Int_t returnvaluePID=3;
1036 if(returnvaluePID==0)
return 0;
1038 Bool_t okPidDsKKpi=returnvaluePID&1;
1039 Bool_t okPidDspiKK=returnvaluePID&2;
1049 if((okPidDsKKpi && okDsKKpi)||(okPidDspiKK && okDspiKK)){
1050 Int_t returnvalue=0;
1051 if(okDsKKpi) returnvalue+=1;
1052 if(okDspiKK) returnvalue+=2;
1053 if(okDsPhiKKpi) returnvalue+=4;
1054 if(okDsPhipiKK) returnvalue+=8;
1055 if(okDsK0starKKpi) returnvalue+=16;
1056 if(okDsK0starpiKK) returnvalue+=32;
1086 sigmaTPCPionHyp=TMath::Abs(sigmaTPCPionHyp);
1087 sigmaTPCKaonHyp=TMath::Abs(sigmaTPCKaonHyp);
1088 sigmaTPCProtonHyp=TMath::Abs(sigmaTPCProtonHyp);
1089 sigmaTOFPionHyp=TMath::Abs(sigmaTOFPionHyp);
1090 sigmaTOFKaonHyp=TMath::Abs(sigmaTOFKaonHyp);
1091 sigmaTOFProtonHyp=TMath::Abs(sigmaTOFProtonHyp);
1093 if (oksigmaTPCPionHyp && sigmaTPCPionHyp>0.){
1104 if (oksigmaTPCKaonHyp && sigmaTPCKaonHyp>0.){
1115 if (oksigmaTPCProtonHyp && sigmaTPCProtonHyp>0.){
1126 if (oksigmaTOFPionHyp && sigmaTOFPionHyp>0.){
1137 if (oksigmaTOFKaonHyp && sigmaTOFKaonHyp>0.){
1148 if (oksigmaTOFProtonHyp && sigmaTOFProtonHyp>0.){
1173 SetName(
"DstoKKpiCutsStandard");
1174 SetTitle(
"Standard Cuts for D+s analysis");
1182 AliESDtrackCuts* esdTrackCuts=
new AliESDtrackCuts();
1183 esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
1185 esdTrackCuts->SetRequireTPCRefit(kTRUE);
1186 esdTrackCuts->SetRequireITSRefit(kTRUE);
1188 esdTrackCuts->SetMinNClustersTPC(70);
1189 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
1190 AliESDtrackCuts::kAny);
1192 esdTrackCuts->SetMinDCAToVertexXY(0.);
1193 esdTrackCuts->SetPtRange(0.3,1.e10);
1196 delete esdTrackCuts;
1208 const Int_t nvars=20;
1211 anacutsval=
new Float_t*[nvars];
1216 anacutsval[0][ipt]=0.35;
1217 anacutsval[1][ipt]=0.3;
1218 anacutsval[2][ipt]=0.3;
1219 anacutsval[3][ipt]=0.;
1220 anacutsval[4][ipt]=0.;
1221 anacutsval[5][ipt]=0.005;
1222 anacutsval[8][ipt]=0.;
1223 anacutsval[10][ipt]=0.;
1224 anacutsval[11][ipt]=1000.0;
1225 anacutsval[13][ipt]=0.1;
1226 anacutsval[16][ipt]=0.;
1227 anacutsval[17][ipt]=0.;
1228 anacutsval[18][ipt]=0.;
1229 anacutsval[19][ipt]=-1.;
1236 anacutsval[6][0]=0.020;
1237 anacutsval[6][1]=0.030;
1238 anacutsval[6][2]=0.030;
1239 anacutsval[6][3]=0.060;
1243 anacutsval[7][0]=0.035;
1244 anacutsval[7][1]=0.035;
1245 anacutsval[7][2]=0.040;
1246 anacutsval[7][3]=0.040;
1250 anacutsval[9][0]=0.94;
1251 anacutsval[9][1]=0.94;
1252 anacutsval[9][2]=0.94;
1253 anacutsval[9][3]=0.94;
1257 anacutsval[12][0]=0.0080;
1258 anacutsval[12][1]=0.0050;
1259 anacutsval[12][2]=0.0045;
1260 anacutsval[12][3]=0.0090;
1264 anacutsval[14][0]=0.10;
1265 anacutsval[14][1]=0.05;
1266 anacutsval[14][2]=0.0;
1267 anacutsval[14][3]=0.05;
1271 anacutsval[15][0]=0.95;
1272 anacutsval[15][1]=0.95;
1273 anacutsval[15][2]=1.;
1274 anacutsval[15][3]=0.95;
1282 SetCuts(nvars,nptbins,anacutsval);
1287 for(
Int_t iic=0;iic<nvars;iic++){
delete [] anacutsval[iic];}
1288 delete [] anacutsval;
1296 Double_t mass1 = TDatabasePDG::Instance()->GetParticle(pdg1)->Mass();
1297 Double_t mass2 = TDatabasePDG::Instance()->GetParticle(pdg2)->Mass();
1306 Double_t E12 = TMath::Sqrt(mass1*mass1+px1*px1+py1*py1+pz1*pz1)+TMath::Sqrt(mass2*mass2+px2*px2+py2*py2+pz2*pz2);
1308 return E12*E12-((px1+px2)*(px1+px2)+(py1+py2)*(py1+py2)+(pz1+pz2)*(pz1+pz2));
1317 printf(
"Cuts on d0meas-d0exp:\n");
1323 printf(
"No cut on d0meas-d0exp:\n");
1326 printf(
"Cuts on d0:\n");
1328 printf(
"%f ",
fMaxd0[ib]);
1332 printf(
"No cut on d0\n");
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
void Getd0MeasMinusExpProng(Int_t ip, Double_t magf, Double_t &d0diff, Double_t &errd0diff) 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 fPhiMassRef
weight for piKK for kBayesianWeights
Double_t GetDist12toPrim() const
Int_t GetnSigmaTPC(AliAODTrack *track, Int_t species, Double_t &sigma) const
void Setd0Cut(Int_t nPtBins, Float_t *cutval)
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 ImpParXY() const
Double_t fWeightKKpi
Threshold for Bayesian PID probability.
Bool_t fUsed0MeasMinusExpCut
swicth to the usage of Reference Phi mass (instead of PDG value)
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
Double_t ComputeInvMass2(AliAODTrack *track1, AliAODTrack *track2, Int_t pdg1, Int_t pdg2)
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)
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
Bool_t AreDaughtersSelected(AliAODRecoDecayHF *rd, const AliAODEvent *aod=0x0) const
Double_t fWeightpiKK
weight for KKpi for kBayesianWeights
virtual Int_t PreSelect(TObjArray aodTracks)
Bool_t fUseRefPhiMass
Reference Phi mass to be used for the cut on delta phi mass (instead of PDG value) ...
Double_t fDistToMaxProb
Maximum P of track to apply strong Pid on pi.
Double_t fBayesThreshold
Difference between max probability.
Float_t * fMaxd0MeasMinusExp
switch for cut on d0meas-d0exp
void SetUsePID(Bool_t flag=kTRUE)
virtual void PrintAll() const
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)
Float_t * fMaxd0
switch for cut on d0
virtual void PrintAll() const
void SetMatch(Int_t match)
void AddTrackCuts(const AliESDtrackCuts *cuts)
void SetPLimit(Double_t *plim, Int_t npLim)
Double_t CosPointingAngle() const
Int_t fnPtBins
cuts on the candidate
void SetCompat(Bool_t comp)
AliAODPidHF * fPidHF
enable AOD049 centrality cleanup
void Setd0MeasMinusExpCut(Int_t nPtBins, Float_t *cutval)
virtual ~AliRDHFCutsDstoKKpi()
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