26 #include <TDatabasePDG.h>
27 #include <TClonesArray.h>
28 #include "AliAODMCParticle.h"
29 #include "AliAODRecoDecay.h"
30 #include "AliAODVertex.h"
49 Double_t *px, Double_t *py, Double_t *pz,
50 Double_t *d0, Double_t *d0err, Double_t dca) :
60 Double_t *d0, Double_t *d0err, Double_t dca) :
82 if(&source ==
this)
return *
this;
111 Double_t esum = e[0]+e[1]+e[2];
112 Double_t minv = TMath::Sqrt(esum*esum-P()*P());
118 Int_t *pdgDg,Int_t *pdgDg2prong,
119 TClonesArray *mcArray, Bool_t isV0)
const
127 Int_t ndg=GetNDaughters();
129 AliError(
"No daughters available");
134 ( (pdgDg[1]==2212 && pdgDg[0]==310) ||
135 (pdgDg[1]==211 && pdgDg[0]==3122) ) ) {
136 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]));
140 Int_t lab2Prong = -1;
144 lab2Prong = the2Prong->MatchToMC(pdgabs2prong,mcArray,2,pdgDg2prong);
146 AliAODv0 *theV0 =
dynamic_cast<AliAODv0*
>(
Getv0());
147 lab2Prong = theV0->MatchToMC(pdgabs2prong,mcArray,2,pdgDg2prong);
150 if(lab2Prong<0)
return -1;
152 Int_t dgLabels[10]={0,0,0,0,0,0,0,0,0,0};
156 for(Int_t i=0; i<ndg; i++) {
157 AliVTrack *trk =
dynamic_cast<AliVTrack*
>(GetDaughter(i));
159 Int_t lab = trk->GetLabel();
162 }
else if(lab<-1)
continue;
166 AliVTrack *trk =
dynamic_cast<AliVTrack*
>(
GetBachelor());
168 dgLabels[0] = trk->GetLabel();
169 dgLabels[1] = lab2Prong;
172 Int_t finalLabel = AliAODRecoDecay::MatchToMC(pdgabs,mcArray,dgLabels,2,2,pdgDg);
177 if ( isV0 && (dgLabels[0]!=-1 && dgLabels[1]!=-1) ) {
178 AliAODv0 *theV0 =
dynamic_cast<AliAODv0*
>(
Getv0());
179 Bool_t onTheFly = theV0->GetOnFlyStatus();
180 if (pdgDg[0]==2212 && pdgDg[1]==310) {
181 AliAODMCParticle*k0s =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(lab2Prong));
183 Int_t labK0 = k0s->GetMother();
184 AliAODMCParticle*k0bar =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(labK0));
186 AliDebug(1,Form(
" (onTheFly=%1d) LabelV0=%d (%d) -> LabelK0S=%d (%d -> %d %d)",onTheFly,labK0,k0bar->GetPdgCode(),lab2Prong,pdgabs2prong,pdgDg2prong[0],pdgDg2prong[1]));
187 AliDebug(1,Form(
" LabelLc=%d (%d) -> LabelBachelor=%d (%d) LabelV0=%d (%d)",
189 dgLabels[0],pdgDg[0],dgLabels[1],pdgDg[1]));
192 }
else if (pdgDg[0]==211 && pdgDg[1]==3122) {
193 AliDebug(1,Form(
" (onTheFly=%1d) LabelV0=%d (%d -> %d %d)",onTheFly,lab2Prong,pdgabs2prong,pdgDg2prong[0],pdgDg2prong[1]));
194 AliDebug(1,Form(
" LabelLc=%d (%d) -> LabelBachelor=%d (%d) LabelV0=%d (%d)",
196 dgLabels[0],pdgDg[0],dgLabels[1],pdgDg[1]));
207 const Double_t *cutsD0,
233 Int_t okD0=0,okD0bar=0;
235 if((Charge()==+1 && !okD0) || (Charge()==-1 && !okD0bar))
return kFALSE;
238 if( (PtProng(0)<cutsDstar[2]) || (PtProng(0)>cutsDstar[3]) )
return kFALSE;
240 Double_t mDstar = TDatabasePDG::Instance()->GetParticle(413)->Mass();
242 if(TMath::Abs(mDstar-invmDstar)>cutsDstar[0])
return kFALSE;
244 Double_t mD0 = TDatabasePDG::Instance()->GetParticle(421)->Mass();
245 if(TMath::Abs((mDstar-mD0)-
DeltaInvMass())>cutsDstar[1])
return kFALSE;
248 if(theta>cutsDstar[4])
return kFALSE;
254 Bool_t okLck0sp, Bool_t okLcLpi, Bool_t okLcLbarpi)
const
271 Double_t mLck0sp,mLcLpi;
272 okLck0sp=1; okLcLpi=1; okLcLbarpi=1;
274 Double_t mLcPDG = TDatabasePDG::Instance()->GetParticle(4122)->Mass();
275 Double_t mk0sPDG = TDatabasePDG::Instance()->GetParticle(310)->Mass();
276 Double_t mLPDG = TDatabasePDG::Instance()->GetParticle(3122)->Mass();
279 double mk0s =
Getv0()->MassK0Short();
283 double mlambda =
Getv0()->MassLambda();
284 double malambda =
Getv0()->MassAntiLambda();
289 if(TMath::Abs(mLck0sp-mLcPDG)>cutsLctoV0[0]) okLck0sp = 0;
291 if(TMath::Abs(mLcLpi-mLcPDG)>cutsLctoV0[1]) okLcLpi = 0;
292 okLcLbarpi = okLcLpi;
295 if( TMath::Abs(mk0s-mk0sPDG)>cutsLctoV0[2]) okLck0sp = 0;
298 if( !(
GetBachelor()->Charge()==+1 && TMath::Abs(mlambda-mLPDG)<=cutsLctoV0[3]) ) okLcLpi = 0;
299 if( !(
GetBachelor()->Charge()==-1 && TMath::Abs(malambda-mLPDG)<=cutsLctoV0[3]) ) okLcLbarpi = 0;
301 if(!okLck0sp && !okLcLpi && !okLcLbarpi)
return 0;
304 if(TMath::Abs(
GetBachelor()->Pt()) < cutsLctoV0[4])
return 0;
309 if( TMath::Abs(GetDCA(0))>cutsLctoV0[7]
315 if(TMath::Abs(
Getv0()->DcaV0Daughters()) > cutsLctoV0[8])
return 0;
319 AliDebug(4,Form(
" V0 cosine of pointing angle doesn't pass the cut"));
324 if (TMath::Abs(Getd0Prong(0)) > cutsLctoV0[10]) {
325 AliDebug(4,Form(
" bachelor transverse impact parameter doesn't pass the cut"));
330 if (TMath::Abs(Getd0Prong(1)) > cutsLctoV0[11]) {
331 AliDebug(4,Form(
" V0 transverse impact parameter doesn't pass the cut"));
336 if (TMath::Abs(
Getv0()->MassK0Short()-mk0sPDG) < cutsLctoV0[12]) {
337 AliDebug(4,Form(
" veto on K0S invariant mass doesn't pass the cut"));
342 if (TMath::Abs(
Getv0()->MassLambda()-mLPDG) < cutsLctoV0[13] ||
343 TMath::Abs(
Getv0()->MassAntiLambda()-mLPDG) < cutsLctoV0[13] ) {
344 AliDebug(4,Form(
" veto on K0S invariant mass doesn't pass the cut"));
349 if (
Getv0()->InvMass2Prongs(0,1,11,11) < cutsLctoV0[14]) {
350 AliDebug(4,Form(
" veto on gamma invariant mass doesn't pass the cut"));
355 if (
Getv0()->Pt() < cutsLctoV0[15]) {
356 AliDebug(4,Form(
" V0 track Pt=%2.2e > %2.2e",
Getv0()->Pt(),cutsLctoV0[15]));
371 TVector3 p3Trk2(PxProng(0),PyProng(0),PzProng(0));
373 TVector3 perp = p3Trk0.Cross(p3Trk1);
374 Double_t theta = p3Trk2.Angle(perp);
375 if(theta>(TMath::Pi()-theta)) theta = TMath::Pi() - theta;
376 theta = TMath::Pi()/2. - theta;
387 TVector3 p3Trk2(PxProng(0),PyProng(0),PzProng(0));
389 Double_t alpha = p3Trk0.Angle(p3Trk2);
390 Double_t beta = p3Trk1.Angle(p3Trk2);
395 Double_t phi01 = TMath::ACos(cosphi01);
396 Double_t phi02 = TMath::ACos(cosphi02);
397 Double_t phi00 = p3Trk0.Angle(p3Trk1);
399 if((phi01>phi00) || (phi02>phi00))
return kFALSE;
410 AliAODv0 *v0 = (AliAODv0*)
Getv0();
415 Double_t posVtx[3] = {0.,0.,0.};
416 vtxPrimary->GetXYZ(posVtx);
417 return v0->DecayLengthV0(posVtx);
426 AliAODv0 *v0 = (AliAODv0*)
Getv0();
431 Double_t posVtx[3] = {0.,0.,0.};
432 vtxPrimary->GetXYZ(posVtx);
433 return v0->DecayLengthXY(posVtx);
443 AliAODv0 *v0 = (AliAODv0*)
Getv0();
449 Double_t posVtx[3] = {0.,0.,0.};
450 vtxPrimary->GetXYZ(posVtx);
451 return v0->CosPointingAngle(posVtx);
461 AliAODv0 *v0 = (AliAODv0*)
Getv0();
467 Double_t posVtx[3] = {0.,0.,0.};
468 vtxPrimary->GetXYZ(posVtx);
469 return v0->CosPointingAngleXY(posVtx);
479 AliAODv0 *v0 = (AliAODv0*)
Getv0();
496 AliAODv0 *v0 = (AliAODv0*)
Getv0();
ClassImp(AliAnalysisTaskTriggerRates) AliAnalysisTaskTriggerRates
Double_t DeltaInvMass() const
Bool_t TrigonometricalCut() 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
AliAODVertex * GetPrimaryVtx() const
Double_t InvMassDstarKpipi() const
Double_t DecayLengthV0() const
AliAODRecoDecayHF2Prong * Get2Prong() const
AliAODRecoCascadeHF & operator=(const AliAODRecoCascadeHF &source)