26 #include <TDatabasePDG.h> 27 #include <Riostream.h> 32 #include "AliAODTrack.h" 33 #include "AliESDtrack.h" 51 fUseImpParProdCorrCut(kFALSE),
52 fUsed0MeasMinusExpCut(kFALSE),
53 fMaxd0MeasMinusExp(0x0),
56 fScaleNormDLxyBypOverPt(kTRUE)
63 TString varNames[14]={
"inv. mass [GeV]",
66 "d0K [cm] lower limit!",
67 "d0Pi [cm] lower limit!",
71 "pM=Max{pT1,pT2,pT3} (GeV/c)",
77 Bool_t isUpperCut[14]={kTRUE,
107 Float_t limits[2]={0,999999999.};
160 if(&source ==
this)
return *
this;
192 printf(
"Wrong number of pt bins: it has to be %d\n",
fnPtBins);
207 printf(
"Wrong number of pt bins: it has to be %d\n",
fnPtBins);
226 AliAODTrack *track[3];
227 for(
Int_t iDaught=0; iDaught<3; iDaught++) {
228 track[iDaught] = (AliAODTrack*)aodTracks.At(iDaught);
229 if(!track[iDaught])
return retVal;
230 px += track[iDaught]->Px();
231 py += track[iDaught]->Py();
234 Double_t ptD=TMath::Sqrt(px*px+py*py);
253 printf(
"AliRDHFCutsDplustoKpipi::GetCutsVarsForOpt: wrong number of variables\n");
261 AliAODVertex *origownvtx=0x0;
278 for(
Int_t iprong=0;iprong<3;iprong++){
279 if(TMath::Abs(pdgdaughters[iprong])==321) {
280 vars[iter]=dd->PtProng(iprong);
287 for(
Int_t iprong=0;iprong<3;iprong++){
288 if(TMath::Abs(pdgdaughters[iprong])==211) {
289 if(dd->PtProng(iprong)<minPtDau){
290 minPtDau=dd->PtProng(iprong);
298 for(
Int_t iprong=0;iprong<3;iprong++){
299 if(TMath::Abs(pdgdaughters[iprong])==321) {
300 vars[iter]=dd->Getd0Prong(iprong);
306 Float_t minImpParDau=1000000.0;
307 for(
Int_t iprong=0;iprong<3;iprong++){
308 if(TMath::Abs(pdgdaughters[iprong])==211) {
309 if(dd->Getd0Prong(iprong)<minImpParDau){
310 minImpParDau=dd->Getd0Prong(iprong);
314 vars[iter]=minImpParDau;
320 if(dist12<dist23)vars[iter]=dist12;
321 else vars[iter]=dist23;
334 for(
Int_t i=0;i<3;i++){
335 if(dd->PtProng(i)>
ptmax)ptmax=dd->PtProng(i);
345 vars[iter]=dd->Getd0Prong(0)*dd->Getd0Prong(0)+dd->Getd0Prong(1)*dd->Getd0Prong(1)+dd->Getd0Prong(2)*dd->Getd0Prong(2);
350 for(
Int_t iprong=0;iprong<3;iprong++){
351 if(dd->GetDCA(iprong)<maxDCA){
352 maxDCA=dd->GetDCA(iprong);
385 AliDebug(2,Form(
"pt of D+ = %f (> 5), cutting at |y| < 0.8",pt));
386 if (TMath::Abs(y) > 0.8)
return kFALSE;
390 Double_t maxFiducialY = -0.2/15*pt*pt+1.9/15*pt+0.5;
391 Double_t minFiducialY = 0.2/15*pt*pt-1.9/15*pt-0.5;
392 AliDebug(2,Form(
"pt of D+ = %f (< 5), cutting according to the fiducial zone [%f, %f]\n",pt,minFiducialY,maxFiducialY));
393 if (y < minFiducialY || y > maxFiducialY)
return kFALSE;
405 Int_t sign=rd->GetCharge();
406 for(
Int_t daught=0;daught<3;daught++){
407 AliAODTrack *track=(AliAODTrack*)rd->GetDaughter(daught);
409 if(sign==track->Charge()){
411 if(isPion==0)mask+=1;
412 else if(isPion>0)mask+=3;
417 if(isKaon==0)mask+=1;
418 else if(isKaon>0)mask+=3;
436 for(
Int_t daught=0; daught<3; daught++) {
437 aodtracks.AddAt(rd->GetDaughter(daught),daught);
450 AliAODTrack *track[3];
451 for(
Int_t daught=0; daught<3; daught++){
452 track[daught]=(AliAODTrack*)aodtracks.At(daught);
455 if(!
fUsePID || !track[0] || !track[1] || !track[2])
return 3;
457 Int_t sign = track[0]->Charge();
462 for(
Int_t daught=0;daught<3;daught++){
467 if(isProton>0 && isKaon<0 && isPion<0)
return 0;
468 if(isKaon>0 && isPion<0) nkaons++;
469 if(isKaon<0) nNotKaons++;
470 if(sign==track[daught]->Charge()){
471 if(isPion<0)
return 0;
475 if(isKaon<0)
return 0;
480 if(nkaons>1)
return 0;
481 if(nNotKaons==3)
return 0;
497 cout<<
"Cut matrix not inizialized. Exit..."<<endl;
505 cout<<
"AliAODRecoDecayHF3Prong null"<<endl;
512 Int_t returnvaluePID=3;
513 Int_t returnvalueCuts=3;
526 AliAODVertex *origownvtx=0x0;
549 Double_t mDplusPDG = TDatabasePDG::Instance()->GetParticle(411)->Mass();
556 Double_t sum2=d->Getd0Prong(0)*d->Getd0Prong(0)+d->Getd0Prong(1)*d->Getd0Prong(1)+d->Getd0Prong(2)*d->Getd0Prong(2);
560 if(d->Getd0Prong(0)*d->Getd0Prong(1)<0. && d->Getd0Prong(2)*d->Getd0Prong(1)<0.) {
CleanOwnPrimaryVtx(d,aod,origownvtx);
return 0;}
592 for(
Int_t ipr=0; ipr<3; ipr++) {
596 if(errdiffIP>0) normdd0=diffIP/errdiffIP;
597 if(ipr==0) dd0max=normdd0;
598 else if(TMath::Abs(normdd0)>TMath::Abs(dd0max)) dd0max=normdd0;
623 if(returnvaluePID==0)
return 0;
648 SetName(
"DplustoKpipiCutsStandard");
649 SetTitle(
"Standard Cuts for D+ analysis");
657 AliESDtrackCuts* esdTrackCuts=
new AliESDtrackCuts();
658 esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
660 esdTrackCuts->SetRequireTPCRefit(kTRUE);
661 esdTrackCuts->SetRequireITSRefit(kTRUE);
663 esdTrackCuts->SetMinNClustersTPC(70);
664 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
665 AliESDtrackCuts::kAny);
667 esdTrackCuts->SetMinDCAToVertexXY(0.);
668 esdTrackCuts->SetPtRange(0.3,1.e10);
674 const Int_t nvars=14;
695 anacutsval=
new Float_t*[nvars];
701 anacutsval[0][ipt]=0.2;
702 anacutsval[3][ipt]=0.;
703 anacutsval[4][ipt]=0.;
704 anacutsval[5][ipt]=0.01;
705 anacutsval[11][ipt]=10000000000.;
708 anacutsval[1][0]=0.3;
709 anacutsval[1][1]=0.4;
710 anacutsval[1][2]=0.4;
711 anacutsval[2][0]=0.3;
712 anacutsval[2][1]=0.3;
713 anacutsval[2][2]=0.4;
715 anacutsval[1][ipt]=0.4;
716 anacutsval[2][ipt]=0.4;
719 anacutsval[6][0]=0.022100;
720 anacutsval[6][1]=0.022100;
721 anacutsval[6][2]=0.034;
722 anacutsval[6][3]=0.020667;
723 anacutsval[6][4]=0.020667;
724 anacutsval[6][5]=0.023333;
727 anacutsval[7][0]=0.08;
728 anacutsval[7][1]=0.08;
729 anacutsval[7][2]=0.09;
730 anacutsval[7][3]=0.095;
731 anacutsval[7][4]=0.095;
733 anacutsval[8][0]=0.5;
734 anacutsval[8][1]=0.5;
735 anacutsval[8][2]=1.0;
736 anacutsval[8][3]=0.5;
737 anacutsval[8][4]=0.5;
740 anacutsval[9][0]=0.97;
741 anacutsval[9][1]=0.936;
742 anacutsval[9][2]=0.95;
743 anacutsval[9][3]=0.95;
744 anacutsval[9][4]= 0.95;
745 anacutsval[9][5]=0.92;
746 anacutsval[9][6]=0.92;
747 anacutsval[9][7]=0.92;
748 anacutsval[9][8]=0.92;
749 anacutsval[9][9]=0.90;
751 anacutsval[9][ipt]=0.90;
755 anacutsval[10][0]=0.0055;
756 anacutsval[10][1]=0.0055;
757 anacutsval[10][2]= 0.0028;
758 anacutsval[10][3]=0.000883;
759 anacutsval[10][4]=0.000883;
763 anacutsval[6][ipt]=0.02333;
764 anacutsval[7][ipt]=0.115;
765 anacutsval[8][ipt]=0.5;
766 anacutsval[10][ipt]=0.000883;
772 anacutsval[13][0]=0.98;
773 anacutsval[13][1]=0.98;
775 anacutsval[12][ipt]=0.;
776 anacutsval[13][ipt]=0.;
783 SetCuts(nvars,nptbins,anacutsval);
790 for(
Int_t iic=0;iic<nvars;iic++){
delete [] anacutsval[iic];}
791 delete [] anacutsval;
806 SetName(
"DplustoKpipiCutsStandard");
807 SetTitle(
"Standard Cuts for D+ analysis in PbPb2010 run");
816 AliESDtrackCuts* esdTrackCuts=
new AliESDtrackCuts();
817 esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
819 esdTrackCuts->SetRequireTPCRefit(kTRUE);
820 esdTrackCuts->SetRequireITSRefit(kTRUE);
822 esdTrackCuts->SetMinNClustersTPC(70);
823 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
824 AliESDtrackCuts::kAny);
826 esdTrackCuts->SetMinDCAToVertexXY(0.);
827 esdTrackCuts->SetPtRange(0.8,1.e10);
846 const Int_t nvars=14;
849 anacutsval=
new Float_t*[nvars];
855 anacutsval[0][ipt]=0.2;
856 anacutsval[1][ipt]=0.8;
857 anacutsval[2][ipt]=0.8;
858 anacutsval[3][ipt]=0.;
859 anacutsval[4][ipt]=0.;
860 anacutsval[5][ipt]=0.01;
861 anacutsval[11][ipt]=10000000000.;
862 anacutsval[12][ipt]=0.;
863 anacutsval[13][ipt]=0.;
865 anacutsval[1][5]=0.9;
867 anacutsval[6][0]=0.022100;
868 anacutsval[6][1]=0.022100;
869 anacutsval[6][2]=0.034;
870 anacutsval[6][3]=0.020667;
871 anacutsval[6][4]=0.020667;
872 anacutsval[6][5]=0.023333;
874 anacutsval[7][0]=0.08;
875 anacutsval[7][1]=0.08;
876 anacutsval[7][2]=0.17;
877 anacutsval[7][3]=0.14;
878 anacutsval[7][4]=0.14;
879 anacutsval[7][5]=0.19;
881 anacutsval[8][0]=0.8;
882 anacutsval[8][1]=0.8;
883 anacutsval[8][2]=1.1;
884 anacutsval[8][3]=0.5;
885 anacutsval[8][4]=0.5;
886 anacutsval[8][5]=0.5;
888 anacutsval[9][0]=0.995;
889 anacutsval[9][1]=0.995;
890 anacutsval[9][2]=0.997;
891 anacutsval[9][3]=0.998;
892 anacutsval[9][4]=0.998;
893 anacutsval[9][5]=0.995;
895 anacutsval[10][0]=0.0055;
896 anacutsval[10][1]=0.0055;
897 anacutsval[10][2]= 0.0028;
898 anacutsval[10][3]=0.000883;
899 anacutsval[10][4]=0.000883;
900 anacutsval[10][5]=0.000883;
902 anacutsval[12][5]=12.;
903 anacutsval[13][5]=0.998571;
904 anacutsval[12][6]=10.;
905 anacutsval[13][6]=0.997143;
908 anacutsval[6][ipt]=0.02333;
909 anacutsval[7][ipt]=0.19;
910 anacutsval[8][ipt]=2.0;
911 anacutsval[9][ipt]=0.997;
912 anacutsval[10][ipt]=0.000883;
914 anacutsval[7][6]=0.14;
915 anacutsval[9][6]=0.995;
918 SetCuts(nvars,nptbins,anacutsval);
928 for(
Int_t iic=0;iic<nvars;iic++){
delete [] anacutsval[iic];}
929 delete [] anacutsval;
978 sigmaTPCPionHyp=TMath::Abs(sigmaTPCPionHyp);
979 sigmaTPCKaonHyp=TMath::Abs(sigmaTPCKaonHyp);
980 sigmaTPCProtonHyp=TMath::Abs(sigmaTPCProtonHyp);
981 sigmaTOFPionHyp=TMath::Abs(sigmaTOFPionHyp);
982 sigmaTOFKaonHyp=TMath::Abs(sigmaTOFKaonHyp);
983 sigmaTOFProtonHyp=TMath::Abs(sigmaTOFProtonHyp);
985 if (oksigmaTPCPionHyp && sigmaTPCPionHyp>0.){
996 if (oksigmaTPCKaonHyp && sigmaTPCKaonHyp>0.){
1007 if (oksigmaTPCProtonHyp && sigmaTPCProtonHyp>0.){
1018 if (oksigmaTOFPionHyp && sigmaTOFPionHyp>0.){
1029 if (oksigmaTOFKaonHyp && sigmaTOFKaonHyp>0.){
1040 if (oksigmaTOFProtonHyp && sigmaTOFProtonHyp>0.){
1063 printf(
"Cuts on d0meas-d0exp:\n");
1069 printf(
"No cut on d0meas-d0exp:\n");
1072 printf(
"Cuts on d0:\n");
1074 printf(
"%f ",
fMaxd0[ib]);
1078 printf(
"No cut on d0\n");
1081 printf(
"NormDLxy scaled by p/pt\n");
1083 printf(
"NormDLxy NOT scaled by p/pt\n");
1086 printf(
"d0K*d0pi1 vs. d0K*d0pi2 cut enabled\n");
1088 printf(
"d0K*d0pi1 vs. d0K*d0pi2 cut disabled\n");
Double_t NormalizedDecayLengthXY() const
Bool_t fScaleNormDLxyBypOverPt
Int_t fIsSelectedCuts
fix the daughter track references
Bool_t fUsed0MeasMinusExpCut
switch for d0K*d0pi1 vs. d0K*d0pi2 cut
virtual void SetStandardCutsPbPb2010()
void SetAsym(Bool_t asym)
Bool_t IsSignalMC(AliAODRecoDecay *d, AliAODEvent *aod, Int_t pdg) const
void Setd0MeasMinusExpCut(Int_t nPtBins, Float_t *cutval)
void Getd0MeasMinusExpProng(Int_t ip, Double_t magf, Double_t &d0diff, Double_t &errd0diff) const
AliRDHFCutsDplustoKpipi & operator=(const AliRDHFCutsDplustoKpipi &source)
Int_t GetnSigmaTOF(AliAODTrack *track, Int_t species, Double_t &sigma) const
Bool_t fUseMCVertex
flag to switch on the removal of duaghters from the primary vertex computation
Bool_t SetMCPrimaryVtx(AliAODRecoDecayHF *d, AliAODEvent *aod) const
Bool_t fRemoveDaughtersFromPrimary
virtual void PrintAll() const
Double_t GetDist12toPrim() const
Int_t GetnSigmaTPC(AliAODTrack *track, Int_t species, Double_t &sigma) const
void SetUseCentrality(Int_t flag=1)
Int_t GetPIDBitMask(AliAODRecoDecayHF *rd)
Double_t ImpParXY() const
Float_t fMaxPStrongPidpi
Maximum P of track to apply strong Pid on K.
void Setd0Cut(Int_t nPtBins, Float_t *cutval)
void SetNVars(Int_t nVars)
UInt_t GetPIDTrackTPCTOFBitMap(AliAODTrack *track) const
Double_t CosPointingAngleXY() const
Double_t fMaxRapidityCand
minimum pt of the candidate
void EnableSemiCentralTrigger()
virtual Bool_t IsInFiducialAcceptance(Double_t pt, Double_t y) const
AliRDHFCuts & operator=(const AliRDHFCuts &source)
AliRDHFCutsDplustoKpipi(const char *name="CutsDplustoKpipi")
Float_t * fMaxd0
switch for cut on d0
Bool_t HasBadDaughters() const
Float_t * fMaxd0MeasMinusExp
switch for cut on d0meas-d0exp
Class for cuts on AOD reconstructed D+->Kpipi.
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)
void ResetMaskAndEnableMBTrigger()
void SetMinCentrality(Float_t minCentrality=0.)
virtual Int_t IsSelected(TObject *obj, Int_t selectionLevel)
Bool_t fUseImpParProdCorrCut
Maximum P of track to apply strong Pid on pi.
virtual ~AliRDHFCutsDplustoKpipi()
virtual void GetCutVarsForOpt(AliAODRecoDecayHF *d, Float_t *vars, Int_t nvars, Int_t *pdgdaughters)
Double_t fMaxPtCand
minimum pt of the candidate
Float_t fMaxPStrongPidK
Maximum pt of candidate to apply strong Pid.
AliAODVertex * GetOwnPrimaryVtx() const
Bool_t fKeepSignalMC
max rapidity of candidate (if !=-999 overrides IsInFiducialAcceptance)
Double_t GetSigmaVert(const AliAODEvent *aod=0x0)
virtual Int_t PreSelect(TObjArray aodTracks)
virtual void SetStandardCutsPbPb2011()
Int_t fIsSelectedPID
outcome of cuts selection
Double_t InvMassDplus() const
Int_t MakeRawPid(AliAODTrack *track, Int_t specie)
void SetSigma(Double_t *sigma)
Float_t * fCutsRD
fnVars*fnPtBins
Double_t DecayLength2() const
kinematics & topology
Double_t GetDist23toPrim() const
void SetMaxCentrality(Float_t maxCentrality=100.)
void SetVarsForOpt(Int_t nVars, Bool_t *forOpt)
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
void EnableCentralTrigger()
void SetUsePID(Bool_t flag=kTRUE)
virtual void PrintAll() const
virtual Int_t IsSelectedPID(AliAODRecoDecayHF *rd)
void CleanOwnPrimaryVtx(AliAODRecoDecayHF *d, AliAODEvent *aod, AliAODVertex *origownvtx) const
void SetRemoveDaughtersFromPrim(Bool_t removeDaughtersPrim)
void SetOldPid(Bool_t oldPid)
virtual void SetStandardCutsPP2010()
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
Int_t fnPtBins
cuts on the candidate
void SetCompat(Bool_t comp)
void SetTriggerClass(TString trclass0, TString trclass1="")
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
Float_t fMaxPtStrongPid
use strong pid 0 no,1 only for K,2 pi 3 both
Double_t fMinPtCand
outcome of PID selection