26 #include <Riostream.h>
27 #include <TDatabasePDG.h>
30 #include "AliAnalysisManager.h"
33 #include "AliAODTrack.h"
35 #include "AliAODVertex.h"
36 #include "AliESDtrack.h"
38 #include "AliESDVertex.h"
39 #include "AliInputEventHandler.h"
62 const Int_t nvars = 16;
64 TString varNames[nvars] = {
"Inv. Mass D+ -> K0s+pi [GeV/c2]",
65 "Inv. Mass K0s [GeV/c2]",
66 "K0s reco: min pT V0-daughters [GeV/c]",
67 "K0s reco: max DCA V0 (prong-to-prong) [sigma]",
68 "K0s reco: min d0(xy) V0-daughters [cm]",
69 "K0s reco: min cosPointing (3D) V0",
70 "K0s reco: min fiducial radius (xy) [cm]",
71 "min pT bachelor track [GeV/c]",
72 "min pT V0 track [GeV/c]",
73 "max d0(xy) bachelor wrt PV [cm]",
74 "max d0(xy) V0 wrt PV [cm]",
75 "max cosThetaStar D+ daughters",
76 "min cosPointing (3D) cascade daughters",
77 "min |cosPointing| (xy) cascade daughters",
78 "min decay length (xy) cascade [cm]",
83 Bool_t isUpperCut[nvars] = { kTRUE,
103 Float_t limits[2] = {0, 999999999.};
114 fPidHF -> SetAsym(kFALSE);
115 fPidHF -> SetSigma(nsigma);
116 fPidHF -> SetCompat(kTRUE);
129 , fExcludedCut(source.fExcludedCut)
130 , fV0Type(source.fV0Type)
131 , fV0daughtersCuts(0)
151 if (
this != &source) {
189 AliDebug(2,
"wrong number of variables");
194 Double_t mDplusPDG = TDatabasePDG::Instance()->GetParticle(411)->Mass();
195 Double_t mk0sPDG = TDatabasePDG::Instance()->GetParticle(310)->Mass();
200 AliDebug(2,
"AliAODRecoCascadeHF null");
205 AliAODTrack *bachelorTrack = (AliAODTrack*) d->
GetBachelor();
206 AliAODv0 *v0 = (AliAODv0*) d->
Getv0();
207 if (!v0 || !bachelorTrack) {
208 AliDebug(2,
"Missing V0 or missing bachelor for the current cascade");
214 if (!v0positiveTrack || !v0negativeTrack) {
215 AliDebug(2,
"No V0 daughters' objects");
222 AliAODVertex *origownvtx = 0x0;
237 if (TMath::Abs(pdgdaughters[0]==411)) vars[iter] = TMath::Abs(d->
InvMassDplustoK0spi()-mDplusPDG);
247 vars[iter] = TMath::Abs(v0->MassK0Short()-mk0sPDG);
253 vars[iter] = v0positiveTrack->Pt();
259 vars[iter] = TMath::Abs(v0->GetDCA());
265 vars[iter] = TMath::Abs(v0->DcaPosToPrimVertex());
287 vars[iter] = bachelorTrack->Pt();
293 vars[iter] = v0->Pt();
299 vars[iter] = TMath::Abs(d->Getd0Prong(0));
305 vars[iter] = TMath::Abs(d->Getd0Prong(1));
311 vars[iter] = TMath::Abs(d->CosThetaStar(0, 411, 211, 310));
351 AliFatal(
"Cut matrice not inizialized. Exit...");
358 AliDebug(2,
"AliAODRecoCascadeHF null");
362 if (!d->GetSecondaryVtx()) {
363 AliDebug(2,
"No secondary vertex for cascade");
367 if (d->GetNDaughters() != 2) {
368 AliDebug(2, Form(
"No 2 daughters for current cascade (nDaughters=%d)", d->GetNDaughters()));
376 AliAODv0 *v0 = (AliAODv0*) d->
Getv0();
377 AliAODTrack *bachelorTrack = (AliAODTrack*) d->
GetBachelor();
380 if (!v0 || !bachelorTrack) {
381 AliDebug(2,
"Missing V0 or missing bachelor for the current cascade");
387 AliDebug(2,
"Wrong V0 status (offline or on-the-fly)");
391 if (bachelorTrack->GetID()<0) {
392 AliDebug(2, Form(
"Bachelor has negative ID %d", bachelorTrack->GetID()));
396 if (!v0->GetSecondaryVtx()) {
397 AliDebug(2,
"No secondary vertex for V0 by cascade");
401 if (v0->GetNDaughters()!=2) {
402 AliDebug(2, Form(
"More than 2 daughters for V0 of current cascade (onTheFly=%d, nDaughters=%d)", v0->GetOnFlyStatus(), v0->GetNDaughters()));
411 if (!v0positiveTrack || !v0negativeTrack) {
412 AliDebug(2,
"No V0 daughters' objects");
416 if (v0positiveTrack->GetID()<0 || v0negativeTrack->GetID()<0) {
417 AliDebug(2, Form(
"At least one of V0 daughters has negative ID %d %d", v0positiveTrack->GetID(), v0negativeTrack->GetID()));
422 AliDebug(2,
"Check on the bachelor FilterBit: no BIT(4). Candidate rejected.");
443 Double_t mDplusPDG = TDatabasePDG::Instance()->GetParticle(411)->Mass();
444 Double_t mk0sPDG = TDatabasePDG::Instance()->GetParticle(310)->Mass();
458 AliAODVertex *origownvtx = 0x0;
483 AliDebug(4,
"cascade not compatible with D+ invariant mass");
494 AliDebug(4, Form(
" V0 mass is %2.2e and does not correspond to K0S cut", mk0s));
502 AliDebug(4, Form(
" v0 positive track Pt=%2.2e < %2.2e", v0positiveTrack->Pt(),
fCutsRD[
GetGlobalIndex(2,ptbin)]));
507 AliDebug(4, Form(
" v0 positive track Pt=%2.2e < %2.2e", v0negativeTrack->Pt(),
fCutsRD[
GetGlobalIndex(2,ptbin)]));
515 AliDebug(4,
" V0-daugters DCA doesn't pass the cut");
523 AliDebug(4,
" V0-daugters impact parameter (xy) don't pass the cut");
528 AliDebug(4,
" V0-daugters impact parameter (xy) don't pass the cut");
536 AliDebug(4,
" V0 cosine of pointing angle (3D) doesn't pass the cut");
544 AliDebug(4,
" V0 fiducial transverse radius min doesn't pass the cut");
556 AliDebug(4, Form(
" bachelor track Pt=%2.2e < %2.2e", bachelorTrack->Pt(),
fCutsRD[
GetGlobalIndex(7,ptbin)]));
572 AliDebug(4,
" bachelor transverse impact parameter doesn't pass the cut");
580 AliDebug(4,
" V0 transverse impact parameter doesn't pass the cut");
588 AliDebug(4,
" D+ daughter cosThetaStar doesn't pass the cut");
596 AliDebug(4,
" Cascade cosPointingAngle (3D) doesn't pass the cut");
603 AliDebug(4,
" Cascade cosPointingAngle (xy) doesn't pass the cut");
611 AliDebug(4,
" D+ normalised decay length (XY) doesn't pass the cut");
627 Int_t returnvalueTopo = 1;
628 Int_t returnvaluePID = 1;
636 Int_t returnvalueTot = returnvalueTopo & returnvaluePID;
638 return returnvalueTot;
654 AliDebug(2,
"PID selection inactive. Candidate accepted.");
660 AliDebug(2,
"AliAODRecoCascadeHF null");
664 AliAODTrack *bachelorTrack = (AliAODTrack*) d->
GetBachelor();
665 if (!bachelorTrack) {
666 AliDebug(2,
"Missing bachelor for the current cascade");
672 Int_t isPion =
fPidHF -> MakeRawPid(bachelorTrack, AliPID::kPion);
674 if (isPion>=0)
return 1;
695 AliDebug(2,Form(
"pt of cascade = %f (> 5), cutting at |y| < 0.8", pt));
696 if (TMath::Abs(y) > 0.8)
return kFALSE;
699 Double_t maxFiducialY = -0.2/15*pt*pt + 1.9/15*pt + 0.5;
700 Double_t minFiducialY = 0.2/15*pt*pt - 1.9/15*pt - 0.5;
701 AliDebug(2,Form(
"pt of cascade = %f (< 5), cutting according to the fiducial zone [%f, %f]\n", pt, minFiducialY, maxFiducialY));
702 if (y < minFiducialY || y > maxFiducialY)
return kFALSE;
720 AliDebug(2,
"AliAODRecoCascadeHF null");
725 AliFatal(
"Cut object is not defined for bachelor. Candidate accepted.");
732 AliAODTrack *bachelorTrack = (AliAODTrack*) d->
GetBachelor();
733 if (!bachelorTrack)
return kFALSE;
737 if(!bachelorTrack->HasPointOnITSLayer(0))
return kFALSE;
742 AliError(Form(
"Not compatible setting: fKinkReject=%1d - fTrackCuts->GetAcceptKinkDaughters()=%1d",
fKinkReject,
fTrackCuts->GetAcceptKinkDaughters()));
749 Double_t cov[6]; vAOD->GetCovarianceMatrix(cov);
750 const AliESDVertex vESD(pos,cov,100.,100);
755 AliFatal(
"Cut object is not defined for V0daughters. Candidate accepted.");
763 AliAODv0 *v0 = (AliAODv0*) d->
Getv0();
764 if (!v0)
return kFALSE;
768 if (!v0positiveTrack || !v0negativeTrack)
return kFALSE;
772 if ( (v0positiveTrack->Eta()<=etaMin || v0positiveTrack->Eta()>=etaMax) ||
773 (v0negativeTrack->Eta()<=etaMin || v0negativeTrack->Eta()>=etaMax) )
return kFALSE;
775 if ( (v0positiveTrack->Pt()<=ptMin || v0positiveTrack->Pt()>=
ptMax) ||
776 (v0negativeTrack->Pt()<=ptMin || v0negativeTrack->Pt()>=
ptMax) )
return kFALSE;
781 if ( ((v0positiveTrack->GetTPCClusterInfo(2,1)) <
fV0daughtersCuts->GetMinNClusterTPC()) ||
782 ((v0negativeTrack->GetTPCClusterInfo(2,1)) <
fV0daughtersCuts->GetMinNClusterTPC()) )
return kFALSE;
787 if (v0->GetOnFlyStatus()==kFALSE) {
789 if( !(v0positiveTrack->GetStatus() & AliESDtrack::kTPCrefit))
return kFALSE;
790 if( !(v0negativeTrack->GetStatus() & AliESDtrack::kTPCrefit))
return kFALSE;
797 AliAODVertex *maybeKinkPos = (AliAODVertex*)v0positiveTrack->GetProdVertex();
798 AliAODVertex *maybeKinkNeg = (AliAODVertex*)v0negativeTrack->GetProdVertex();
799 if (maybeKinkPos->GetType()==AliAODVertex::kKink ||
800 maybeKinkNeg->GetType()==AliAODVertex::kKink)
return kFALSE;
840 if (sVarNames[nvars-1].Contains(
"V0 type")) {
843 AliInfo(
"AliRDHFCutsDplustoK0spi Last variable is not the V0 type!!!");
Double_t fMaxPtCandTrackSPDFirst
flag to select the track kFirst criteria for pt < ptlimit
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
AliAODTrack * Getv0NegativeTrack() const
const Float_t * GetCuts() const
AliRDHFCutsDplustoK0spi(const char *name="CutsDplustoK0spi")
void SetNVars(Int_t nVars)
Double_t CosPointingAngleXY() const
Double_t fMaxRapidityCand
minimum pt of the candidate
TString * GetVarNames() const
AliRDHFCuts & operator=(const AliRDHFCuts &source)
Double_t DecayLengthXYV0() const
Float_t fV0Type
cut to be excluded (-1=none)
Bool_t HasBadDaughters() const
virtual Int_t IsSelected(TObject *obj, Int_t selectionLevel)
AliAODTrack * Getv0PositiveTrack() const
virtual Bool_t IsInFiducialAcceptance(Double_t pt, Double_t y) const
Bool_t fUseTrackSelectionWithFilterBits
flag to reject kink daughters
AliRDHFCutsDplustoK0spi & operator=(const AliRDHFCutsDplustoK0spi &source)
AliESDtrackCuts * fTrackCuts
quality cuts on the daughter tracks
AliAODTrack * GetBachelor() const
AliAODVertex * GetOwnPrimaryVtx() const
Class for cuts on AOD reconstructed D+->K0S+pi.
Float_t * fCutsRD
fnVars*fnPtBins
Double_t CosV0PointingAngle() const
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
void CleanOwnPrimaryVtx(AliAODRecoDecayHF *d, AliAODEvent *aod, AliAODVertex *origownvtx) const
Bool_t fIsCandTrackSPDFirst
IsSelected returns always kTRUE for MC signal.
void SetPtBins(Int_t nPtBinLimits, Float_t *ptBinLimits)
Bool_t fKinkReject
cut on zSPD vertex to remove outliers in centrality vs. tracklets (0=no cut, 1= cut at 12 cm...
virtual ~AliRDHFCutsDplustoK0spi()
AliESDtrackCuts * fV0daughtersCuts
V0 type – should be defined as in AliRDHFCuts.h.
void AddTrackCutsV0daughters(AliESDtrackCuts *v0daug)
AliAODVertex * GetPrimaryVtx() const
Double_t CosPointingAngle() const
AliAODPidHF * fPidHF
enable AOD049 centrality cleanup
Bool_t RecalcOwnPrimaryVtx(AliAODRecoDecayHF *d, AliAODEvent *aod) const
Int_t PtBin(Double_t pt) const
Int_t GetGlobalIndex(Int_t iVar, Int_t iPtBin) const
Double_t InvMassDplustoK0spi() const
Bool_t AreDtoK0sDaughtersSelected(AliAODRecoDecayHF *rd) const
virtual void GetCutVarsForOpt(AliAODRecoDecayHF *obj, Float_t *vars, Int_t nvars, Int_t *pdgdaughters)
Bool_t IsDaughterSelected(AliAODTrack *track, const AliESDVertex *primary, AliESDtrackCuts *cuts, const AliAODEvent *aod=0x0) const
virtual Int_t IsSelectedPID(AliAODRecoDecayHF *obj)