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" 63 const Int_t nvars = 16;
65 TString varNames[nvars] = {
"Inv. Mass Ds -> K0s+K [GeV/c2]",
66 "Inv. Mass K0s [GeV/c2]",
67 "K0s reco: min pT V0-daughters [GeV/c]",
68 "K0s reco: max DCA V0 (prong-to-prong) [sigma]",
69 "K0s reco: min d0(xy) V0-daughters [cm]",
70 "K0s reco: min cosPointing (3D) V0",
71 "K0s reco: min fiducial radius (xy) [cm]",
72 "min pT bachelor track [GeV/c]",
73 "min pT V0 track [GeV/c]",
74 "max d0(xy) bachelor wrt PV [cm]",
75 "max d0(xy) V0 wrt PV [cm]",
76 "max cosThetaStar Ds daughters",
77 "min cosPointing (3D) cascade daughters",
78 "min |cosPointing| (xy) cascade daughters",
79 "min decay length (xy) cascade [cm]",
84 Bool_t isUpperCut[nvars] = { kTRUE,
104 Float_t limits[2] = {0, 999999999.};
115 fPidHF -> SetPLimit(plim, 2);
118 fPidHF -> SetSigma(nsigma);
119 fPidHF -> SetCompat(kTRUE);
156 if (
this != &source) {
194 AliDebug(2,
"wrong number of variables");
199 Double_t mDsPDG = TDatabasePDG::Instance()->GetParticle(431)->Mass();
200 Double_t mk0sPDG = TDatabasePDG::Instance()->GetParticle(310)->Mass();
205 AliDebug(2,
"AliAODRecoCascadeHF null");
210 AliAODTrack *bachelorTrack = (AliAODTrack*) d->
GetBachelor();
211 AliAODv0 *v0 = (AliAODv0*) d->
Getv0();
212 if (!v0 || !bachelorTrack) {
213 AliDebug(2,
"Missing V0 or missing bachelor for the current cascade");
219 if (!v0positiveTrack || !v0negativeTrack) {
220 AliDebug(2,
"No V0 daughters' objects");
227 AliAODVertex *origownvtx = 0x0;
242 if (TMath::Abs(pdgdaughters[0]==431)) vars[iter] = TMath::Abs(d->
InvMassDstoK0sK()-mDsPDG);
252 vars[iter] = TMath::Abs(v0->MassK0Short()-mk0sPDG);
258 vars[iter] = v0positiveTrack->Pt();
264 vars[iter] = TMath::Abs(v0->GetDCA());
270 vars[iter] = TMath::Abs(v0->DcaPosToPrimVertex());
292 vars[iter] = bachelorTrack->Pt();
298 vars[iter] = v0->Pt();
304 vars[iter] = TMath::Abs(d->Getd0Prong(0));
310 vars[iter] = TMath::Abs(d->Getd0Prong(1));
316 vars[iter] = TMath::Abs(d->CosThetaStar(0, 431, 321, 310));
356 AliFatal(
"Cut matrice not inizialized. Exit...");
363 AliDebug(2,
"AliAODRecoCascadeHF null");
371 if (!d->GetSecondaryVtx()) {
372 AliDebug(2,
"No secondary vertex for cascade");
376 if (d->GetNDaughters() != 2) {
377 AliDebug(2, Form(
"No 2 daughters for current cascade (nDaughters=%d)", d->GetNDaughters()));
385 AliAODv0 *v0 = (AliAODv0*) d->
Getv0();
386 AliAODTrack *bachelorTrack = (AliAODTrack*) d->
GetBachelor();
389 if (!v0 || !bachelorTrack) {
390 AliDebug(2,
"Missing V0 or missing bachelor for the current cascade");
396 AliDebug(2,
"Wrong V0 status (offline or on-the-fly)");
400 if (bachelorTrack->GetID()<0) {
401 AliDebug(2, Form(
"Bachelor has negative ID %d", bachelorTrack->GetID()));
405 if (!v0->GetSecondaryVtx()) {
406 AliDebug(2,
"No secondary vertex for V0 by cascade");
410 if (v0->GetNDaughters()!=2) {
411 AliDebug(2, Form(
"More than 2 daughters for V0 of current cascade (onTheFly=%d, nDaughters=%d)", v0->GetOnFlyStatus(), v0->GetNDaughters()));
420 if (!v0positiveTrack || !v0negativeTrack) {
421 AliDebug(2,
"No V0 daughters' objects");
425 if (v0positiveTrack->GetID()<0 || v0negativeTrack->GetID()<0) {
426 AliDebug(2, Form(
"At least one of V0 daughters has negative ID %d %d", v0positiveTrack->GetID(), v0negativeTrack->GetID()));
431 AliDebug(2,
"Check on the bachelor FilterBit: no BIT(4). Candidate rejected.");
452 Double_t mDsPDG = TDatabasePDG::Instance()->GetParticle(431)->Mass();
453 Double_t mk0sPDG = TDatabasePDG::Instance()->GetParticle(310)->Mass();
466 AliAODVertex *origownvtx = 0x0;
491 AliDebug(4,
"cascade not compatible with Ds invariant mass");
502 AliDebug(4, Form(
" V0 mass is %2.2e and does not correspond to K0S cut", mk0s));
510 AliDebug(4, Form(
" v0 positive track Pt=%2.2e < %2.2e", v0positiveTrack->Pt(),
fCutsRD[
GetGlobalIndex(2,ptbin)]));
515 AliDebug(4, Form(
" v0 positive track Pt=%2.2e < %2.2e", v0negativeTrack->Pt(),
fCutsRD[
GetGlobalIndex(2,ptbin)]));
523 AliDebug(4,
" V0-daugters DCA doesn't pass the cut");
531 AliDebug(4,
" V0-daugters impact parameter (xy) don't pass the cut");
536 AliDebug(4,
" V0-daugters impact parameter (xy) don't pass the cut");
544 AliDebug(4,
" V0 cosine of pointing angle (3D) doesn't pass the cut");
552 AliDebug(4,
" V0 fiducial transverse radius min doesn't pass the cut");
564 AliDebug(4, Form(
" bachelor track Pt=%2.2e < %2.2e", bachelorTrack->Pt(),
fCutsRD[
GetGlobalIndex(7,ptbin)]));
580 AliDebug(4,
" bachelor transverse impact parameter doesn't pass the cut");
588 AliDebug(4,
" V0 transverse impact parameter doesn't pass the cut");
596 AliDebug(4,
" Ds daughter cosThetaStar doesn't pass the cut");
604 AliDebug(4,
" Cascade cosPointingAngle (3D) doesn't pass the cut");
611 AliDebug(4,
" Cascade cosPointingAngle (xy) doesn't pass the cut");
619 AliDebug(4,
" Ds normalised decay length (XY) doesn't pass the cut");
635 Int_t returnvalueTopo = 1;
636 Int_t returnvaluePID = 1;
644 Int_t returnvalueTot = returnvalueTopo & returnvaluePID;
646 return returnvalueTot;
662 AliDebug(2,
"PID selection inactive. Candidate accepted.");
667 AliDebug(2,
"PID not configured. Candidate accepted.");
673 AliDebug(2,
"AliAODRecoCascadeHF null");
677 AliAODTrack *bachelorTrack = (AliAODTrack*) d->
GetBachelor();
678 if (!bachelorTrack) {
679 AliDebug(2,
"Missing bachelor for the current cascade");
688 fPidHF -> SetPCompatTOF(999999.);
689 fPidHF -> SetPtThresholdTPC(999999.);
693 Int_t isKaon =
fPidHF -> MakeRawPid(bachelorTrack, AliPID::kKaon);
696 fPidHF -> SetPCompatTOF(origCompatTOF);
697 fPidHF -> SetPtThresholdTPC(origThreshTPC);
702 fPidHF -> SetPCompatTOF(origCompatTOF);
703 fPidHF -> SetPtThresholdTPC(origThreshTPC);
708 fPidHF -> SetPCompatTOF(origCompatTOF);
709 fPidHF -> SetPtThresholdTPC(origThreshTPC);
731 AliDebug(2,Form(
"pt of cascade = %f (> 5), cutting at |y| < 0.8", pt));
732 if (TMath::Abs(y) > 0.8)
return kFALSE;
735 Double_t maxFiducialY = -0.2/15*pt*pt + 1.9/15*pt + 0.5;
736 Double_t minFiducialY = 0.2/15*pt*pt - 1.9/15*pt - 0.5;
737 AliDebug(2,Form(
"pt of cascade = %f (< 5), cutting according to the fiducial zone [%f, %f]\n", pt, minFiducialY, maxFiducialY));
738 if (y < minFiducialY || y > maxFiducialY)
return kFALSE;
756 AliDebug(2,
"AliAODRecoCascadeHF null");
761 AliFatal(
"Cut object is not defined for bachelor. Candidate accepted.");
768 AliAODTrack *bachelorTrack = (AliAODTrack*) d->
GetBachelor();
769 if (!bachelorTrack)
return kFALSE;
773 if(!bachelorTrack->HasPointOnITSLayer(0))
return kFALSE;
778 AliError(Form(
"Not compatible setting: fKinkReject=%1d - fTrackCuts->GetAcceptKinkDaughters()=%1d",
fKinkReject,
fTrackCuts->GetAcceptKinkDaughters()));
785 Double_t cov[6]; vAOD->GetCovarianceMatrix(cov);
786 const AliESDVertex vESD(pos,cov,100.,100);
791 AliFatal(
"Cut object is not defined for V0daughters. Candidate accepted.");
799 AliAODv0 *v0 = (AliAODv0*) d->
Getv0();
800 if (!v0)
return kFALSE;
804 if (!v0positiveTrack || !v0negativeTrack)
return kFALSE;
808 if ( (v0positiveTrack->Eta()<=etaMin || v0positiveTrack->Eta()>=etaMax) ||
809 (v0negativeTrack->Eta()<=etaMin || v0negativeTrack->Eta()>=etaMax) )
return kFALSE;
811 if ( (v0positiveTrack->Pt()<=ptMin || v0positiveTrack->Pt()>=
ptMax) ||
812 (v0negativeTrack->Pt()<=ptMin || v0negativeTrack->Pt()>=
ptMax) )
return kFALSE;
817 if ( ((v0positiveTrack->GetTPCClusterInfo(2,1)) <
fV0daughtersCuts->GetMinNClusterTPC()) ||
818 ((v0negativeTrack->GetTPCClusterInfo(2,1)) <
fV0daughtersCuts->GetMinNClusterTPC()) )
return kFALSE;
823 if (v0->GetOnFlyStatus()==kFALSE) {
825 if( !(v0positiveTrack->GetStatus() & AliESDtrack::kTPCrefit))
return kFALSE;
826 if( !(v0negativeTrack->GetStatus() & AliESDtrack::kTPCrefit))
return kFALSE;
833 AliAODVertex *maybeKinkPos = (AliAODVertex*)v0positiveTrack->GetProdVertex();
834 AliAODVertex *maybeKinkNeg = (AliAODVertex*)v0negativeTrack->GetProdVertex();
835 if (maybeKinkPos->GetType()==AliAODVertex::kKink ||
836 maybeKinkNeg->GetType()==AliAODVertex::kKink)
return kFALSE;
876 if (sVarNames[nvars-1].Contains(
"V0 type")) {
879 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
Float_t fMaxPtStrongPid
PID option.
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.
Double_t fMaxPtCand
minimum pt of the candidate
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
Int_t fPidOption
cuts for v0 daughters (AOD converted to ESD on the fly!)
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
Double_t fMinPtCand
outcome of PID selection
Bool_t IsDaughterSelected(AliAODTrack *track, const AliESDVertex *primary, AliESDtrackCuts *cuts, const AliAODEvent *aod=0x0) const