27 #include <TDatabasePDG.h> 28 #include <TClonesArray.h> 29 #include "AliAODMCParticle.h" 30 #include "AliAODRecoDecay.h" 31 #include "AliAODVertex.h" 55 AliAODRecoDecayHF3Prong(vtx2, px, py, pz, d0, d0err, dca,sigvert,dist12,dist23,charge)
77 if(&source ==
this)
return *
this;
100 AliAODcascade *casc = (AliAODcascade*)
GetCascade();
103 return casc->DcaXiDaughters();
114 AliAODcascade *casc = (AliAODcascade*)
GetCascade();
117 return casc->DcaV0Daughters();
128 AliAODcascade *casc = (AliAODcascade*)
GetCascade();
134 vtxPrimary->GetXYZ(posVtx);
135 return casc->DecayLengthXi(posVtx[0],posVtx[1],posVtx[2]);
146 AliAODcascade *casc = (AliAODcascade*)
GetCascade();
149 return casc->DecayLengthV0();
159 AliAODcascade *casc = (AliAODcascade*)
GetCascade();
165 vtxPrimary->GetXYZ(posVtx);
166 return casc->CosPointingAngleXi(posVtx[0],posVtx[1],posVtx[2]);
175 AliAODcascade *casc = (AliAODcascade*)
GetCascade();
178 return casc->CosPointingAngle(casc->GetDecayVertexXi());
188 AliAODcascade *casc = (AliAODcascade*)
GetCascade();
191 return casc->DcaV0ToPrimVertex();
201 AliAODcascade *casc = (AliAODcascade*)
GetCascade();
204 return casc->DcaPosToPrimVertex();
214 AliAODcascade *casc = (AliAODcascade*)
GetCascade();
217 return casc->DcaNegToPrimVertex();
227 AliAODcascade *casc = (AliAODcascade*)
GetCascade();
230 return casc->DcaBachToPrimVertex();
240 AliAODcascade *casc = (AliAODcascade*)
GetCascade();
243 return casc->MassXi();
253 AliAODcascade *casc = (AliAODcascade*)
GetCascade();
256 return casc->MassLambda();
266 AliAODcascade *casc = (AliAODcascade*)
GetCascade();
269 return casc->MassAntiLambda();
280 AliAODVertex *vtxSecondary = GetSecondaryVtx();
282 Double_t dx = vtxSecondary->GetX()-vtxPrimary->GetX();
283 Double_t dy = vtxSecondary->GetY()-vtxPrimary->GetY();
291 return (px*dx+py*dy)/pt/dl;
303 AliAODVertex *vtxSecondary = GetSecondaryVtx();
305 Double_t dx = vtxSecondary->GetX()-vtxPrimary->GetX();
306 Double_t dy = vtxSecondary->GetY()-vtxPrimary->GetY();
309 Double_t px = PxProng(0)+PxProng(2);
310 Double_t py = PyProng(0)+PyProng(2);
314 return (px*dx+py*dy)/pt/dl;
321 ,TClonesArray *mcArray)
const 329 Int_t ndg=GetNDaughters();
331 AliError(
"No daughters available");
335 if ( pdgabs!=4232 || pdgDg[0]!=211 || pdgDg[1]!=3312 || pdgDg[2]!=211 )
337 AliWarning(Form(
"Please, pay attention: Only pi Xi pi decay is supported now"));
341 AliAODcascade *theCascade =
dynamic_cast<AliAODcascade*
>(
GetCascade());
342 if(!theCascade)
return -1;
343 AliAODTrack *trk1 =
dynamic_cast<AliAODTrack*
>(
GetBachelor1());
344 if (!trk1)
return -1;
345 AliAODTrack *trk2 =
dynamic_cast<AliAODTrack*
>(
GetBachelor2());
346 if (!trk2)
return -1;
349 if(labcasc<0)
return -1;
350 Int_t labtrk1 = trk1->GetLabel();
351 if(labtrk1<0)
return -1;
352 Int_t labtrk2 = trk2->GetLabel();
353 if(labtrk2<0)
return -1;
355 Int_t dgLabels[10]={0,0,0,0,0,0,0,0,0,0};
357 dgLabels[0] = labtrk1;
358 dgLabels[1] = labcasc;
359 dgLabels[2] = labtrk2;
370 AliAODTrack *cptrack = (AliAODTrack*) theCascade->GetDaughter(0);
371 if(!cptrack)
return -1;
372 Int_t label_p = cptrack->GetLabel();
373 if(label_p<0)
return -1;
374 AliAODTrack *cntrack = (AliAODTrack*) theCascade->GetDaughter(1);
375 if(!cntrack)
return -1;
376 Int_t label_n = cntrack->GetLabel();
377 if(label_n<0)
return -1;
378 Int_t labv0 = theCascade->MatchToMC(pdgDgcasc[1],mcArray,2,pdgDgv0);
379 if(labv0<0)
return -1;
380 AliAODMCParticle *mcpartv0= (AliAODMCParticle*) mcArray->At(labv0);
382 AliAODTrack *cbtrack = (AliAODTrack*) theCascade->GetDecayVertexXi()->GetDaughter(0);
383 if(!cbtrack)
return -1;
385 Int_t label_b = cbtrack->GetLabel();
386 if(label_b<0)
return -1;
388 AliAODMCParticle *mcpartb= (AliAODMCParticle*) mcArray->At(label_b);
389 Int_t pdgb = TMath::Abs(mcpartb->GetPdgCode());
390 if(pdgb!=pdgDgcasc[0])
return -1;
392 AliAODMCParticle *mcmotherv0=mcpartv0;
393 Bool_t isFromXiv0 = kFALSE;
394 Int_t labxiv0 = mcmotherv0->GetMother();
395 if(labxiv0<0)
return -1;
396 mcmotherv0 = (AliAODMCParticle*) mcArray->At(labxiv0);
398 Int_t pdg = TMath::Abs(mcmotherv0 ->GetPdgCode());
403 if(!isFromXiv0)
return -1;
405 AliAODMCParticle *mcmotherb=mcpartb;
406 Bool_t isFromXib = kFALSE;
407 Int_t labxib = mcmotherb->GetMother();
408 if(labxib<0)
return -1;
409 mcmotherb = (AliAODMCParticle*) mcArray->At(labxib);
411 Int_t pdg = TMath::Abs(mcmotherb ->GetPdgCode());
416 if(!isFromXib)
return -1;
418 if(labxiv0!=labxib)
return -1;
434 Int_t labMom[10]={0,0,0,0,0,0,0,0,0,0};
435 Int_t i,j,lab,labMother,pdgMother,pdgPart;
436 AliAODMCParticle *part=0;
437 AliAODMCParticle *mother=0;
438 Bool_t pdgUsed[10]={kFALSE,kFALSE,kFALSE,kFALSE,kFALSE,kFALSE,kFALSE,kFALSE,kFALSE,kFALSE};
441 for(i=0; i<ndg; i++) {
443 lab = TMath::Abs(dgLabels[i]);
445 printf(
"daughter with negative label %d\n",lab);
448 part = (AliAODMCParticle*)mcArray->At(lab);
450 printf(
"no MC particle\n");
456 pdgPart=TMath::Abs(part->GetPdgCode());
457 for(j=0; j<ndg; j++) {
458 if(!pdgUsed[j] && pdgPart==pdgDg[j]) {
466 while(mother->GetMother()>=0) {
467 labMother=mother->GetMother();
468 mother = (AliAODMCParticle*)mcArray->At(labMother);
470 printf(
"no MC mother particle\n");
473 pdgMother = TMath::Abs(mother->GetPdgCode());
474 if(pdgMother==pdgabs) {
477 }
else if(pdgMother>pdgabs || pdgMother<10) {
481 if(labMom[i]==-1)
return -1;
487 for(i=0; i<ndg; i++) {
488 if(labMom[i]==-1)
return -1;
489 if(labMom[i]!=labMother)
return -1;
494 for(i=0; i<ndg; i++) {
495 if(pdgUsed[i]==kFALSE)
return -1;
Double_t CascCosPointingAngleV0() const
AliAODTrack * GetBachelor2() const
Int_t MatchToMCCascade(AliAODcascade *casc, Int_t pdgabscasc, Int_t *pdgDgcasc, Int_t *pdgDgv0, TClonesArray *mcArray) const
Double_t CascCosPointingAngle() const
Double_t CascMassXi() const
Double_t CascDcaXiDaughters() const
AliAODcascade * GetCascade() const
AliAODRecoCascadeHF3Prong & operator=(const AliAODRecoCascadeHF3Prong &source)
Double_t CascDcaV0Daughters() const
Double_t BachelorsCosPointingAngle() const
Int_t MatchToMCXicPlus(Int_t pdgabs, TClonesArray *mcArray, Int_t dgLabels[10], Int_t ndg, Int_t ndgCk, const Int_t *pdgDg) const
Double_t CascDcaV0ToPrimVertex() const
Double_t CascMassLambda() const
AliAODTrack * GetBachelor1() const
Double_t CascDcaBachToPrimVertex() const
Double_t CascDcaPosToPrimVertex() const
virtual ~AliAODRecoCascadeHF3Prong()
Double_t CascMassAntiLambda() const
Int_t MatchToMC(Int_t pdgabs, Int_t pdgabscasc, Int_t *pdgDg, Int_t *pdgDgcasc, Int_t *pdgDgv0, TClonesArray *mcArray) const
Double_t XicCosPointingAngle() const
Double_t CascDecayLength() const
Double_t CascDcaNegToPrimVertex() const
AliAODRecoCascadeHF3Prong()
AliAODRecoDecayHF3Prong & operator=(const AliAODRecoDecayHF3Prong &source)
AliAODVertex * GetPrimaryVtx() const
Double_t CascDecayLengthV0() const