26 #include <TDatabasePDG.h>
27 #include <TClonesArray.h>
28 #include "AliAODMCParticle.h"
29 #include "AliAODRecoDecay.h"
30 #include "AliAODVertex.h"
83 if(&source ==
this)
return *
this;
113 Double_t minv = TMath::Sqrt(esum*esum-
P()*
P());
120 TClonesArray *mcArray,
Bool_t isV0)
const
128 Int_t ndg=GetNDaughters();
130 AliError(
"No daughters available");
135 ( (pdgDg[1]==2212 && pdgDg[0]==310) ||
136 (pdgDg[1]==211 && pdgDg[0]==3122) ||
137 (pdgDg[1]==211 && pdgDg[0]==310) ||
138 (pdgDg[1]==321 && pdgDg[0]==310) ) ) {
139 AliWarning(Form(
"Please, pay attention: first element in AliAODRecoCascadeHF object must be the bachelor and second one V0. Skipping! (pdgDg[0] = %d, (pdgDg[1] = %d)", pdgDg[0], pdgDg[1]));
143 Int_t lab2Prong = -1;
147 lab2Prong = the2Prong->MatchToMC(pdgabs2prong,mcArray,2,pdgDg2prong);
149 AliAODv0 *theV0 =
dynamic_cast<AliAODv0*
>(
Getv0());
150 lab2Prong = theV0->MatchToMC(pdgabs2prong,mcArray,2,pdgDg2prong);
153 if(lab2Prong<0)
return -1;
155 Int_t dgLabels[10]={0,0,0,0,0,0,0,0,0,0};
159 for(
Int_t i=0; i<ndg; i++) {
160 AliVTrack *trk =
dynamic_cast<AliVTrack*
>(GetDaughter(i));
162 Int_t lab = trk->GetLabel();
165 }
else if(lab<-1)
continue;
169 AliVTrack *trk =
dynamic_cast<AliVTrack*
>(
GetBachelor());
171 dgLabels[0] = trk->GetLabel();
172 dgLabels[1] = lab2Prong;
175 Int_t finalLabel = AliAODRecoDecay::MatchToMC(pdgabs,mcArray,dgLabels,2,2,pdgDg);
180 if ( isV0 && (dgLabels[0]!=-1 && dgLabels[1]!=-1) ) {
181 AliAODv0 *theV0 =
dynamic_cast<AliAODv0*
>(
Getv0());
182 Bool_t onTheFly = theV0->GetOnFlyStatus();
183 if (pdgDg[1]==310 && (pdgDg[0]==2212 || pdgDg[0]==211 || pdgDg[0]==321)) {
184 AliAODMCParticle*k0s =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(lab2Prong));
186 Int_t labK0 = k0s->GetMother();
187 AliAODMCParticle*k0bar =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(labK0));
189 AliDebug(1, Form(
" (onTheFly=%1d) LabelV0=%d (%d) -> LabelK0S=%d (%d -> %d %d)",
190 onTheFly, labK0, k0bar->GetPdgCode(), lab2Prong, pdgabs2prong, pdgDg2prong[0], pdgDg2prong[1]));
191 AliDebug(1, Form(
" LabelCandidate=%d (%d) -> LabelBachelor=%d (%d) LabelV0=%d (%d)",
192 finalLabel, pdgabs, dgLabels[0], pdgDg[0], dgLabels[1], pdgDg[1]));
195 }
else if (pdgDg[0]==211 && pdgDg[1]==3122) {
196 AliDebug(1,Form(
" (onTheFly=%1d) LabelV0=%d (%d -> %d %d)",onTheFly,lab2Prong,pdgabs2prong,pdgDg2prong[0],pdgDg2prong[1]));
197 AliDebug(1,Form(
" LabelLc=%d (%d) -> LabelBachelor=%d (%d) LabelV0=%d (%d)",
199 dgLabels[0],pdgDg[0],dgLabels[1],pdgDg[1]));
236 Int_t okD0=0,okD0bar=0;
238 if((Charge()==+1 && !okD0) || (Charge()==-1 && !okD0bar))
return kFALSE;
241 if( (PtProng(0)<cutsDstar[2]) || (PtProng(0)>cutsDstar[3]) )
return kFALSE;
243 Double_t mDstar = TDatabasePDG::Instance()->GetParticle(413)->Mass();
245 if(TMath::Abs(mDstar-invmDstar)>cutsDstar[0])
return kFALSE;
247 Double_t mD0 = TDatabasePDG::Instance()->GetParticle(421)->Mass();
248 if(TMath::Abs((mDstar-mD0)-
DeltaInvMass())>cutsDstar[1])
return kFALSE;
251 if(theta>cutsDstar[4])
return kFALSE;
275 okLck0sp=1; okLcLpi=1; okLcLbarpi=1;
277 Double_t mLcPDG = TDatabasePDG::Instance()->GetParticle(4122)->Mass();
278 Double_t mk0sPDG = TDatabasePDG::Instance()->GetParticle(310)->Mass();
279 Double_t mLPDG = TDatabasePDG::Instance()->GetParticle(3122)->Mass();
282 double mk0s =
Getv0()->MassK0Short();
286 double mlambda =
Getv0()->MassLambda();
287 double malambda =
Getv0()->MassAntiLambda();
292 if(TMath::Abs(mLck0sp-mLcPDG)>cutsLctoV0[0]) okLck0sp = 0;
294 if(TMath::Abs(mLcLpi-mLcPDG)>cutsLctoV0[1]) okLcLpi = 0;
295 okLcLbarpi = okLcLpi;
298 if( TMath::Abs(mk0s-mk0sPDG)>cutsLctoV0[2]) okLck0sp = 0;
301 if( !(
GetBachelor()->Charge()==+1 && TMath::Abs(mlambda-mLPDG)<=cutsLctoV0[3]) ) okLcLpi = 0;
302 if( !(
GetBachelor()->Charge()==-1 && TMath::Abs(malambda-mLPDG)<=cutsLctoV0[3]) ) okLcLbarpi = 0;
304 if(!okLck0sp && !okLcLpi && !okLcLbarpi)
return 0;
307 if(TMath::Abs(
GetBachelor()->Pt()) < cutsLctoV0[4])
return 0;
312 if( TMath::Abs(GetDCA(0))>cutsLctoV0[7]
318 if(TMath::Abs(
Getv0()->DcaV0Daughters()) > cutsLctoV0[8])
return 0;
322 AliDebug(4,Form(
" V0 cosine of pointing angle doesn't pass the cut"));
327 if (TMath::Abs(Getd0Prong(0)) > cutsLctoV0[10]) {
328 AliDebug(4,Form(
" bachelor transverse impact parameter doesn't pass the cut"));
333 if (TMath::Abs(Getd0Prong(1)) > cutsLctoV0[11]) {
334 AliDebug(4,Form(
" V0 transverse impact parameter doesn't pass the cut"));
339 if (TMath::Abs(
Getv0()->MassK0Short()-mk0sPDG) < cutsLctoV0[12]) {
340 AliDebug(4,Form(
" veto on K0S invariant mass doesn't pass the cut"));
346 TMath::Abs(
Getv0()->MassAntiLambda()-mLPDG) < cutsLctoV0[13] ) {
347 AliDebug(4,Form(
" veto on K0S invariant mass doesn't pass the cut"));
352 if (
Getv0()->InvMass2Prongs(0,1,11,11) < cutsLctoV0[14]) {
353 AliDebug(4,Form(
" veto on gamma invariant mass doesn't pass the cut"));
358 if (
Getv0()->Pt() < cutsLctoV0[15]) {
359 AliDebug(4,Form(
" V0 track Pt=%2.2e > %2.2e",
Getv0()->Pt(),cutsLctoV0[15]));
374 TVector3 p3Trk2(PxProng(0),PyProng(0),PzProng(0));
376 TVector3 perp = p3Trk0.Cross(p3Trk1);
377 Double_t theta = p3Trk2.Angle(perp);
378 if(theta>(TMath::Pi()-theta)) theta = TMath::Pi() - theta;
379 theta = TMath::Pi()/2. - theta;
390 TVector3 p3Trk2(PxProng(0),PyProng(0),PzProng(0));
392 Double_t alpha = p3Trk0.Angle(p3Trk2);
393 Double_t beta = p3Trk1.Angle(p3Trk2);
398 Double_t phi01 = TMath::ACos(cosphi01);
399 Double_t phi02 = TMath::ACos(cosphi02);
400 Double_t phi00 = p3Trk0.Angle(p3Trk1);
402 if((phi01>phi00) || (phi02>phi00))
return kFALSE;
413 AliAODv0 *v0 = (AliAODv0*)
Getv0();
419 vtxPrimary->GetXYZ(posVtx);
420 return v0->DecayLengthV0(posVtx);
429 AliAODv0 *v0 = (AliAODv0*)
Getv0();
435 vtxPrimary->GetXYZ(posVtx);
436 return v0->DecayLengthXY(posVtx);
446 AliAODv0 *v0 = (AliAODv0*)
Getv0();
453 vtxPrimary->GetXYZ(posVtx);
454 return v0->CosPointingAngle(posVtx);
464 AliAODv0 *v0 = (AliAODv0*)
Getv0();
471 vtxPrimary->GetXYZ(posVtx);
472 return v0->CosPointingAngleXY(posVtx);
482 AliAODv0 *v0 = (AliAODv0*)
Getv0();
499 AliAODv0 *v0 = (AliAODv0*)
Getv0();
521 if (!okCascLc && !okCascDplus && !okCascDs) {
Double_t DeltaInvMass() const
Bool_t TrigonometricalCut() const
Bool_t HasSelectionBit(Int_t i) const
Double_t NormalizedV0DecayLength() const
virtual ~AliAODRecoCascadeHF()
Int_t MatchToMC(Int_t pdgabs, Int_t pdgabs2prong, Int_t *pdgDg, Int_t *pdgDg2prong, TClonesArray *mcArray, Bool_t isV0=kFALSE) const
AliAODTrack * Getv0NegativeTrack() const
Double_t InvMassLctoLambdaPi() const
Double_t CosV0PointingAngleXY() const
Double_t NormalizedV0DecayLengthXY() const
Double_t DecayLengthXYV0() const
Bool_t SelectDstar(const Double_t *cutsDstar, const Double_t *cutsD0, Bool_t testD0=kTRUE) const
Double_t AngleD0dkpPisoft() const
Double_t InvMassLctoK0sP() const
AliAODTrack * Getv0PositiveTrack() const
AliAODTrack * GetBachelor() const
Bool_t SelectD0(const Double_t *cuts, Int_t &okD0, Int_t &okD0bar) const
Double_t CosV0PointingAngle() const
AliAODRecoDecayHF2Prong & operator=(const AliAODRecoDecayHF2Prong &source)
Bool_t SelectLctoV0(const Double_t *cutsLctoV0, Bool_t okLck0sp, Bool_t okLcLpi, Bool_t okLcLbarpi) const
Bool_t CheckCascadeFlags(AliRDHFCuts::ESele selFlag=AliRDHFCuts::kLctoV0Cuts)
AliAODVertex * GetPrimaryVtx() const
Double_t InvMassDstarKpipi() const
Double_t DecayLengthV0() const
AliAODRecoDecayHF2Prong * Get2Prong() const
AliAODRecoCascadeHF & operator=(const AliAODRecoCascadeHF &source)