26 #include <Riostream.h>
27 #include <TDatabasePDG.h>
30 #include "AliAnalysisManager.h"
31 #include "AliInputEventHandler.h"
35 #include "AliAODTrack.h"
37 #include "AliAODVertex.h"
38 #include "AliESDtrack.h"
40 #include "AliESDVertex.h"
61 const Int_t nvars = 16;
63 TString varNames[nvars] = {
"Inv. Mass Ds -> K0s+K [GeV/c2]",
64 "Inv. Mass K0s [GeV/c2]",
65 "K0s reco: min pT V0-daughters [GeV/c]",
66 "K0s reco: max DCA V0 (prong-to-prong) [sigma]",
67 "K0s reco: min d0(xy) V0-daughters [cm]",
68 "K0s reco: min cosPointing (3D) V0",
69 "K0s reco: min fiducial radius (xy) [cm]",
70 "min pT bachelor track [GeV/c]",
71 "min pT V0 track [GeV/c]",
72 "max d0(xy) bachelor wrt PV [cm]",
73 "max d0(xy) V0 wrt PV [cm]",
74 "max cosThetaStar Ds daughters",
75 "min cosPointing (3D) cascade daughters",
76 "min |cosPointing| (xy) cascade daughters",
77 "min decay length (xy) cascade [cm]",
82 Bool_t isUpperCut[nvars] = { kTRUE,
102 Float_t limits[2] = {0, 999999999.};
113 fPidHF -> SetAsym(kFALSE);
114 fPidHF -> SetSigma(nsigma);
115 fPidHF -> SetCompat(kTRUE);
128 , fExcludedCut(source.fExcludedCut)
129 , fV0Type(source.fV0Type)
130 , fV0daughtersCuts(0)
150 if (
this != &source) {
188 AliDebug(2,
"wrong number of variables");
193 Double_t mDsPDG = TDatabasePDG::Instance()->GetParticle(431)->Mass();
194 Double_t mk0sPDG = TDatabasePDG::Instance()->GetParticle(310)->Mass();
199 AliDebug(2,
"AliAODRecoCascadeHF null");
204 AliAODTrack *bachelorTrack = (AliAODTrack*) d->
GetBachelor();
205 AliAODv0 *v0 = (AliAODv0*) d->
Getv0();
206 if (!v0 || !bachelorTrack) {
207 AliDebug(2,
"Missing V0 or missing bachelor for the current cascade");
213 if (!v0positiveTrack || !v0negativeTrack) {
214 AliDebug(2,
"No V0 daughters' objects");
221 AliAODVertex *origownvtx = 0x0;
236 if (TMath::Abs(pdgdaughters[0]==431)) vars[iter] = TMath::Abs(d->
InvMassDstoK0sK()-mDsPDG);
246 vars[iter] = TMath::Abs(v0->MassK0Short()-mk0sPDG);
252 vars[iter] = v0positiveTrack->Pt();
258 vars[iter] = TMath::Abs(v0->GetDCA());
264 vars[iter] = TMath::Abs(v0->DcaPosToPrimVertex());
286 vars[iter] = bachelorTrack->Pt();
292 vars[iter] = v0->Pt();
298 vars[iter] = TMath::Abs(d->Getd0Prong(0));
304 vars[iter] = TMath::Abs(d->Getd0Prong(1));
310 vars[iter] = TMath::Abs(d->CosThetaStar(0, 431, 321, 310));
350 AliFatal(
"Cut matrice not inizialized. Exit...");
357 AliDebug(2,
"AliAODRecoCascadeHF null");
361 if (!d->GetSecondaryVtx()) {
362 AliDebug(2,
"No secondary vertex for cascade");
366 if (d->GetNDaughters() != 2) {
367 AliDebug(2, Form(
"No 2 daughters for current cascade (nDaughters=%d)", d->GetNDaughters()));
375 AliAODv0 *v0 = (AliAODv0*) d->
Getv0();
376 AliAODTrack *bachelorTrack = (AliAODTrack*) d->
GetBachelor();
379 if (!v0 || !bachelorTrack) {
380 AliDebug(2,
"Missing V0 or missing bachelor for the current cascade");
386 AliDebug(2,
"Wrong V0 status (offline or on-the-fly)");
390 if (bachelorTrack->GetID()<0) {
391 AliDebug(2, Form(
"Bachelor has negative ID %d", bachelorTrack->GetID()));
395 if (!v0->GetSecondaryVtx()) {
396 AliDebug(2,
"No secondary vertex for V0 by cascade");
400 if (v0->GetNDaughters()!=2) {
401 AliDebug(2, Form(
"More than 2 daughters for V0 of current cascade (onTheFly=%d, nDaughters=%d)", v0->GetOnFlyStatus(), v0->GetNDaughters()));
410 if (!v0positiveTrack || !v0negativeTrack) {
411 AliDebug(2,
"No V0 daughters' objects");
415 if (v0positiveTrack->GetID()<0 || v0negativeTrack->GetID()<0) {
416 AliDebug(2, Form(
"At least one of V0 daughters has negative ID %d %d", v0positiveTrack->GetID(), v0negativeTrack->GetID()));
421 AliDebug(2,
"Check on the bachelor FilterBit: no BIT(4). Candidate rejected.");
442 Double_t mDsPDG = TDatabasePDG::Instance()->GetParticle(431)->Mass();
443 Double_t mk0sPDG = TDatabasePDG::Instance()->GetParticle(310)->Mass();
457 AliAODVertex *origownvtx = 0x0;
482 AliDebug(4,
"cascade not compatible with Ds invariant mass");
493 AliDebug(4, Form(
" V0 mass is %2.2e and does not correspond to K0S cut", mk0s));
501 AliDebug(4, Form(
" v0 positive track Pt=%2.2e < %2.2e", v0positiveTrack->Pt(),
fCutsRD[
GetGlobalIndex(2,ptbin)]));
506 AliDebug(4, Form(
" v0 positive track Pt=%2.2e < %2.2e", v0negativeTrack->Pt(),
fCutsRD[
GetGlobalIndex(2,ptbin)]));
514 AliDebug(4,
" V0-daugters DCA doesn't pass the cut");
522 AliDebug(4,
" V0-daugters impact parameter (xy) don't pass the cut");
527 AliDebug(4,
" V0-daugters impact parameter (xy) don't pass the cut");
535 AliDebug(4,
" V0 cosine of pointing angle (3D) doesn't pass the cut");
543 AliDebug(4,
" V0 fiducial transverse radius min doesn't pass the cut");
555 AliDebug(4, Form(
" bachelor track Pt=%2.2e < %2.2e", bachelorTrack->Pt(),
fCutsRD[
GetGlobalIndex(7,ptbin)]));
571 AliDebug(4,
" bachelor transverse impact parameter doesn't pass the cut");
579 AliDebug(4,
" V0 transverse impact parameter doesn't pass the cut");
587 AliDebug(4,
" Ds daughter cosThetaStar doesn't pass the cut");
595 AliDebug(4,
" Cascade cosPointingAngle (3D) doesn't pass the cut");
602 AliDebug(4,
" Cascade cosPointingAngle (xy) doesn't pass the cut");
610 AliDebug(4,
" Ds normalised decay length (XY) doesn't pass the cut");
626 Int_t returnvalueTopo = 1;
627 Int_t returnvaluePID = 1;
635 Int_t returnvalueTot = returnvalueTopo & returnvaluePID;
637 return returnvalueTot;
653 AliDebug(2,
"PID selection inactive. Candidate accepted.");
659 AliDebug(2,
"AliAODRecoCascadeHF null");
663 AliAODTrack *bachelorTrack = (AliAODTrack*) d->
GetBachelor();
664 if (!bachelorTrack) {
665 AliDebug(2,
"Missing bachelor for the current cascade");
671 Int_t isKaon =
fPidHF -> MakeRawPid(bachelorTrack, AliPID::kKaon);
673 if (isKaon>=0)
return 1;
694 AliDebug(2,Form(
"pt of cascade = %f (> 5), cutting at |y| < 0.8", pt));
695 if (TMath::Abs(y) > 0.8)
return kFALSE;
698 Double_t maxFiducialY = -0.2/15*pt*pt + 1.9/15*pt + 0.5;
699 Double_t minFiducialY = 0.2/15*pt*pt - 1.9/15*pt - 0.5;
700 AliDebug(2,Form(
"pt of cascade = %f (< 5), cutting according to the fiducial zone [%f, %f]\n", pt, minFiducialY, maxFiducialY));
701 if (y < minFiducialY || y > maxFiducialY)
return kFALSE;
719 AliDebug(2,
"AliAODRecoCascadeHF null");
724 AliFatal(
"Cut object is not defined for bachelor. Candidate accepted.");
731 AliAODTrack *bachelorTrack = (AliAODTrack*) d->
GetBachelor();
732 if (!bachelorTrack)
return kFALSE;
736 if(!bachelorTrack->HasPointOnITSLayer(0))
return kFALSE;
741 AliError(Form(
"Not compatible setting: fKinkReject=%1d - fTrackCuts->GetAcceptKinkDaughters()=%1d",
fKinkReject,
fTrackCuts->GetAcceptKinkDaughters()));
748 Double_t cov[6]; vAOD->GetCovarianceMatrix(cov);
749 const AliESDVertex vESD(pos,cov,100.,100);
754 AliFatal(
"Cut object is not defined for V0daughters. Candidate accepted.");
762 AliAODv0 *v0 = (AliAODv0*) d->
Getv0();
763 if (!v0)
return kFALSE;
767 if (!v0positiveTrack || !v0negativeTrack)
return kFALSE;
771 if ( (v0positiveTrack->Eta()<=etaMin || v0positiveTrack->Eta()>=etaMax) ||
772 (v0negativeTrack->Eta()<=etaMin || v0negativeTrack->Eta()>=etaMax) )
return kFALSE;
774 if ( (v0positiveTrack->Pt()<=ptMin || v0positiveTrack->Pt()>=
ptMax) ||
775 (v0negativeTrack->Pt()<=ptMin || v0negativeTrack->Pt()>=
ptMax) )
return kFALSE;
780 if ( ((v0positiveTrack->GetTPCClusterInfo(2,1)) <
fV0daughtersCuts->GetMinNClusterTPC()) ||
781 ((v0negativeTrack->GetTPCClusterInfo(2,1)) <
fV0daughtersCuts->GetMinNClusterTPC()) )
return kFALSE;
786 if (v0->GetOnFlyStatus()==kFALSE) {
788 if( !(v0positiveTrack->GetStatus() & AliESDtrack::kTPCrefit))
return kFALSE;
789 if( !(v0negativeTrack->GetStatus() & AliESDtrack::kTPCrefit))
return kFALSE;
796 AliAODVertex *maybeKinkPos = (AliAODVertex*)v0positiveTrack->GetProdVertex();
797 AliAODVertex *maybeKinkNeg = (AliAODVertex*)v0negativeTrack->GetProdVertex();
798 if (maybeKinkPos->GetType()==AliAODVertex::kKink ||
799 maybeKinkNeg->GetType()==AliAODVertex::kKink)
return kFALSE;
839 if (sVarNames[nvars-1].Contains(
"V0 type")) {
842 AliInfo(
"AliRDHFCutsDstoK0sK Last variable is not the V0 type!!!");
Double_t fMaxPtCandTrackSPDFirst
flag to select the track kFirst criteria for pt < ptlimit
virtual Bool_t IsInFiducialAcceptance(Double_t pt, Double_t y) const
Double_t InvMassDstoK0sK() 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
void AddTrackCutsV0daughters(AliESDtrackCuts *v0daug)
AliAODTrack * Getv0NegativeTrack() const
Bool_t AreDtoK0sDaughtersSelected(AliAODRecoDecayHF *rd) const
const Float_t * GetCuts() const
void SetNVars(Int_t nVars)
Double_t CosPointingAngleXY() const
virtual Int_t IsSelectedPID(AliAODRecoDecayHF *obj)
Double_t fMaxRapidityCand
minimum pt of the candidate
TString * GetVarNames() const
AliRDHFCuts & operator=(const AliRDHFCuts &source)
Double_t DecayLengthXYV0() const
Bool_t HasBadDaughters() const
AliAODTrack * Getv0PositiveTrack() const
AliRDHFCutsDstoK0sK(const char *name="CutsDstoK0sK")
Bool_t fUseTrackSelectionWithFilterBits
flag to reject kink daughters
Class for cuts on AOD reconstructed Ds->K0S+K.
virtual ~AliRDHFCutsDstoK0sK()
AliESDtrackCuts * fTrackCuts
quality cuts on the daughter tracks
AliAODTrack * GetBachelor() const
AliAODVertex * GetOwnPrimaryVtx() const
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
virtual Int_t IsSelected(TObject *obj, Int_t selectionLevel)
AliRDHFCutsDstoK0sK & operator=(const AliRDHFCutsDstoK0sK &source)
AliESDtrackCuts * fV0daughtersCuts
V0 type – should be defined as in AliRDHFCuts.h.
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...
AliAODVertex * GetPrimaryVtx() const
Float_t fV0Type
cut to be excluded (-1=none)
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
virtual void GetCutVarsForOpt(AliAODRecoDecayHF *obj, Float_t *vars, Int_t nvars, Int_t *pdgdaughters)
Int_t GetGlobalIndex(Int_t iVar, Int_t iPtBin) const
Bool_t IsDaughterSelected(AliAODTrack *track, const AliESDVertex *primary, AliESDtrackCuts *cuts, const AliAODEvent *aod=0x0) const