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.};
137 fUseStrongPid(source.fUseStrongPid),
138 fMaxPtStrongPid(source.fMaxPtStrongPid),
139 fMaxPStrongPidK(source.fMaxPStrongPidK),
140 fMaxPStrongPidpi(source.fMaxPStrongPidpi),
141 fUseImpParProdCorrCut(source.fUseImpParProdCorrCut),
142 fUsed0MeasMinusExpCut(source.fUsed0MeasMinusExpCut),
143 fMaxd0MeasMinusExp(0x0),
144 fUsed0Cut(source.fUsed0Cut),
146 fScaleNormDLxyBypOverPt(source.fScaleNormDLxyBypOverPt)
160 if(&source ==
this)
return *
this;
184 printf(
"Wrong number of pt bins: it has to be %d\n",
fnPtBins);
199 printf(
"Wrong number of pt bins: it has to be %d\n",
fnPtBins);
216 printf(
"AliRDHFCutsDplustoKpipi::GetCutsVarsForOpt: wrong number of variables\n");
224 AliAODVertex *origownvtx=0x0;
241 for(
Int_t iprong=0;iprong<3;iprong++){
242 if(TMath::Abs(pdgdaughters[iprong])==321) {
243 vars[iter]=dd->PtProng(iprong);
250 for(
Int_t iprong=0;iprong<3;iprong++){
251 if(TMath::Abs(pdgdaughters[iprong])==211) {
252 if(dd->PtProng(iprong)<minPtDau){
253 minPtDau=dd->PtProng(iprong);
261 for(
Int_t iprong=0;iprong<3;iprong++){
262 if(TMath::Abs(pdgdaughters[iprong])==321) {
263 vars[iter]=dd->Getd0Prong(iprong);
269 Float_t minImpParDau=1000000.0;
270 for(
Int_t iprong=0;iprong<3;iprong++){
271 if(TMath::Abs(pdgdaughters[iprong])==211) {
272 if(dd->Getd0Prong(iprong)<minImpParDau){
273 minImpParDau=dd->Getd0Prong(iprong);
277 vars[iter]=minImpParDau;
283 if(dist12<dist23)vars[iter]=dist12;
284 else vars[iter]=dist23;
297 for(
Int_t i=0;i<3;i++){
298 if(dd->PtProng(i)>
ptmax)ptmax=dd->PtProng(i);
308 vars[iter]=dd->Getd0Prong(0)*dd->Getd0Prong(0)+dd->Getd0Prong(1)*dd->Getd0Prong(1)+dd->Getd0Prong(2)*dd->Getd0Prong(2);
313 for(
Int_t iprong=0;iprong<3;iprong++){
314 if(dd->GetDCA(iprong)<maxDCA){
315 maxDCA=dd->GetDCA(iprong);
348 AliDebug(2,Form(
"pt of D+ = %f (> 5), cutting at |y| < 0.8",pt));
349 if (TMath::Abs(y) > 0.8)
return kFALSE;
353 Double_t maxFiducialY = -0.2/15*pt*pt+1.9/15*pt+0.5;
354 Double_t minFiducialY = 0.2/15*pt*pt-1.9/15*pt-0.5;
355 AliDebug(2,Form(
"pt of D+ = %f (< 5), cutting according to the fiducial zone [%f, %f]\n",pt,minFiducialY,maxFiducialY));
356 if (y < minFiducialY || y > maxFiducialY)
return kFALSE;
368 Int_t sign=rd->GetCharge();
369 for(
Int_t daught=0;daught<3;daught++){
370 AliAODTrack *track=(AliAODTrack*)rd->GetDaughter(daught);
372 if(sign==track->Charge()){
374 if(isPion==0)mask+=1;
375 else if(isPion>0)mask+=3;
380 if(isKaon==0)mask+=1;
381 else if(isKaon>0)mask+=3;
398 Int_t sign= rd->GetCharge();
399 for(
Int_t daught=0;daught<3;daught++){
400 AliAODTrack *track=(AliAODTrack*)rd->GetDaughter(daught);
405 if(isProton>0 && isKaon<0 && isPion<0)
return 0;
406 if(isKaon>0 && isPion<0) nkaons++;
407 if(isKaon<0) nNotKaons++;
408 if(sign==track->Charge()){
409 if(isPion<0)
return 0;
413 if(isKaon<0)
return 0;
418 if(nkaons>1)
return 0;
419 if(nNotKaons==3)
return 0;
436 cout<<
"Cut matrix not inizialized. Exit..."<<endl;
444 cout<<
"AliAODRecoDecayHF3Prong null"<<endl;
451 Int_t returnvaluePID=3;
452 Int_t returnvalueCuts=3;
465 AliAODVertex *origownvtx=0x0;
488 Double_t mDplusPDG = TDatabasePDG::Instance()->GetParticle(411)->Mass();
495 Double_t sum2=d->Getd0Prong(0)*d->Getd0Prong(0)+d->Getd0Prong(1)*d->Getd0Prong(1)+d->Getd0Prong(2)*d->Getd0Prong(2);
499 if(d->Getd0Prong(0)*d->Getd0Prong(1)<0. && d->Getd0Prong(2)*d->Getd0Prong(1)<0.) {
CleanOwnPrimaryVtx(d,aod,origownvtx);
return 0;}
531 for(
Int_t ipr=0; ipr<3; ipr++) {
535 if(errdiffIP>0) normdd0=diffIP/errdiffIP;
536 if(ipr==0) dd0max=normdd0;
537 else if(TMath::Abs(normdd0)>TMath::Abs(dd0max)) dd0max=normdd0;
562 if(returnvaluePID==0)
return 0;
587 SetName(
"DplustoKpipiCutsStandard");
588 SetTitle(
"Standard Cuts for D+ analysis");
596 AliESDtrackCuts* esdTrackCuts=
new AliESDtrackCuts();
597 esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
599 esdTrackCuts->SetRequireTPCRefit(kTRUE);
600 esdTrackCuts->SetRequireITSRefit(kTRUE);
602 esdTrackCuts->SetMinNClustersTPC(70);
603 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
604 AliESDtrackCuts::kAny);
606 esdTrackCuts->SetMinDCAToVertexXY(0.);
607 esdTrackCuts->SetPtRange(0.3,1.e10);
613 const Int_t nvars=14;
634 anacutsval=
new Float_t*[nvars];
640 anacutsval[0][ipt]=0.2;
641 anacutsval[3][ipt]=0.;
642 anacutsval[4][ipt]=0.;
643 anacutsval[5][ipt]=0.01;
644 anacutsval[11][ipt]=10000000000.;
647 anacutsval[1][0]=0.3;
648 anacutsval[1][1]=0.4;
649 anacutsval[1][2]=0.4;
650 anacutsval[2][0]=0.3;
651 anacutsval[2][1]=0.3;
652 anacutsval[2][2]=0.4;
654 anacutsval[1][ipt]=0.4;
655 anacutsval[2][ipt]=0.4;
658 anacutsval[6][0]=0.022100;
659 anacutsval[6][1]=0.022100;
660 anacutsval[6][2]=0.034;
661 anacutsval[6][3]=0.020667;
662 anacutsval[6][4]=0.020667;
663 anacutsval[6][5]=0.023333;
666 anacutsval[7][0]=0.08;
667 anacutsval[7][1]=0.08;
668 anacutsval[7][2]=0.09;
669 anacutsval[7][3]=0.095;
670 anacutsval[7][4]=0.095;
672 anacutsval[8][0]=0.5;
673 anacutsval[8][1]=0.5;
674 anacutsval[8][2]=1.0;
675 anacutsval[8][3]=0.5;
676 anacutsval[8][4]=0.5;
679 anacutsval[9][0]=0.97;
680 anacutsval[9][1]=0.936;
681 anacutsval[9][2]=0.95;
682 anacutsval[9][3]=0.95;
683 anacutsval[9][4]= 0.95;
684 anacutsval[9][5]=0.92;
685 anacutsval[9][6]=0.92;
686 anacutsval[9][7]=0.92;
687 anacutsval[9][8]=0.92;
688 anacutsval[9][9]=0.90;
690 anacutsval[9][ipt]=0.90;
694 anacutsval[10][0]=0.0055;
695 anacutsval[10][1]=0.0055;
696 anacutsval[10][2]= 0.0028;
697 anacutsval[10][3]=0.000883;
698 anacutsval[10][4]=0.000883;
702 anacutsval[6][ipt]=0.02333;
703 anacutsval[7][ipt]=0.115;
704 anacutsval[8][ipt]=0.5;
705 anacutsval[10][ipt]=0.000883;
711 anacutsval[13][0]=0.98;
712 anacutsval[13][1]=0.98;
714 anacutsval[12][ipt]=0.;
715 anacutsval[13][ipt]=0.;
722 SetCuts(nvars,nptbins,anacutsval);
729 for(
Int_t iic=0;iic<nvars;iic++){
delete [] anacutsval[iic];}
730 delete [] anacutsval;
745 SetName(
"DplustoKpipiCutsStandard");
746 SetTitle(
"Standard Cuts for D+ analysis in PbPb2010 run");
755 AliESDtrackCuts* esdTrackCuts=
new AliESDtrackCuts();
756 esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
758 esdTrackCuts->SetRequireTPCRefit(kTRUE);
759 esdTrackCuts->SetRequireITSRefit(kTRUE);
761 esdTrackCuts->SetMinNClustersTPC(70);
762 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
763 AliESDtrackCuts::kAny);
765 esdTrackCuts->SetMinDCAToVertexXY(0.);
766 esdTrackCuts->SetPtRange(0.8,1.e10);
785 const Int_t nvars=14;
788 anacutsval=
new Float_t*[nvars];
794 anacutsval[0][ipt]=0.2;
795 anacutsval[1][ipt]=0.8;
796 anacutsval[2][ipt]=0.8;
797 anacutsval[3][ipt]=0.;
798 anacutsval[4][ipt]=0.;
799 anacutsval[5][ipt]=0.01;
800 anacutsval[11][ipt]=10000000000.;
801 anacutsval[12][ipt]=0.;
802 anacutsval[13][ipt]=0.;
804 anacutsval[1][5]=0.9;
806 anacutsval[6][0]=0.022100;
807 anacutsval[6][1]=0.022100;
808 anacutsval[6][2]=0.034;
809 anacutsval[6][3]=0.020667;
810 anacutsval[6][4]=0.020667;
811 anacutsval[6][5]=0.023333;
813 anacutsval[7][0]=0.08;
814 anacutsval[7][1]=0.08;
815 anacutsval[7][2]=0.17;
816 anacutsval[7][3]=0.14;
817 anacutsval[7][4]=0.14;
818 anacutsval[7][5]=0.19;
820 anacutsval[8][0]=0.8;
821 anacutsval[8][1]=0.8;
822 anacutsval[8][2]=1.1;
823 anacutsval[8][3]=0.5;
824 anacutsval[8][4]=0.5;
825 anacutsval[8][5]=0.5;
827 anacutsval[9][0]=0.995;
828 anacutsval[9][1]=0.995;
829 anacutsval[9][2]=0.997;
830 anacutsval[9][3]=0.998;
831 anacutsval[9][4]=0.998;
832 anacutsval[9][5]=0.995;
834 anacutsval[10][0]=0.0055;
835 anacutsval[10][1]=0.0055;
836 anacutsval[10][2]= 0.0028;
837 anacutsval[10][3]=0.000883;
838 anacutsval[10][4]=0.000883;
839 anacutsval[10][5]=0.000883;
841 anacutsval[12][5]=12.;
842 anacutsval[13][5]=0.998571;
843 anacutsval[12][6]=10.;
844 anacutsval[13][6]=0.997143;
847 anacutsval[6][ipt]=0.02333;
848 anacutsval[7][ipt]=0.19;
849 anacutsval[8][ipt]=2.0;
850 anacutsval[9][ipt]=0.997;
851 anacutsval[10][ipt]=0.000883;
853 anacutsval[7][6]=0.14;
854 anacutsval[9][6]=0.995;
857 SetCuts(nvars,nptbins,anacutsval);
867 for(
Int_t iic=0;iic<nvars;iic++){
delete [] anacutsval[iic];}
868 delete [] anacutsval;
917 sigmaTPCPionHyp=TMath::Abs(sigmaTPCPionHyp);
918 sigmaTPCKaonHyp=TMath::Abs(sigmaTPCKaonHyp);
919 sigmaTPCProtonHyp=TMath::Abs(sigmaTPCProtonHyp);
920 sigmaTOFPionHyp=TMath::Abs(sigmaTOFPionHyp);
921 sigmaTOFKaonHyp=TMath::Abs(sigmaTOFKaonHyp);
922 sigmaTOFProtonHyp=TMath::Abs(sigmaTOFProtonHyp);
924 if (oksigmaTPCPionHyp && sigmaTPCPionHyp>0.){
935 if (oksigmaTPCKaonHyp && sigmaTPCKaonHyp>0.){
946 if (oksigmaTPCProtonHyp && sigmaTPCProtonHyp>0.){
957 if (oksigmaTOFPionHyp && sigmaTOFPionHyp>0.){
968 if (oksigmaTOFKaonHyp && sigmaTOFKaonHyp>0.){
979 if (oksigmaTOFProtonHyp && sigmaTOFProtonHyp>0.){
1002 printf(
"Cuts on d0meas-d0exp:\n");
1008 printf(
"No cut on d0meas-d0exp:\n");
1011 printf(
"Cuts on d0:\n");
1013 printf(
"%f ",
fMaxd0[ib]);
1017 printf(
"No cut on d0\n");
1020 printf(
"NormDLxy scaled by p/pt\n");
1022 printf(
"NormDLxy NOT scaled by p/pt\n");
1025 printf(
"d0K*d0pi1 vs. d0K*d0pi2 cut enabled\n");
1027 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 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 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)
ClassImp(AliAnalysisTaskCRC) AliAnalysisTaskCRC
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