27 #include <TClonesArray.h> 28 #include <TParticle.h> 31 #include "AliESDEvent.h" 32 #include "AliAODEvent.h" 33 #include "AliMCEvent.h" 35 #include "AliHeader.h" 36 #include "AliInputEventHandler.h" 37 #include "AliGenDPMjetEventHeader.h" 41 #include "AliV0vertexer.h" 43 #include "AliESDtrack.h" 44 #include "AliAODTrack.h" 45 #include "AliMCParticle.h" 46 #include "AliAODMCParticle.h" 48 #include "AliPIDResponse.h" 49 #include "AliAnalysisUtils.h" 51 #include "AliCentrality.h" 52 #include "AliMultSelection.h" 71 fIsSkipFastOnly(kFALSE),
72 fIsRefitV0sESD(kFALSE),
84 fCutMinDauDCAtoPV(0.),
85 fCutMinDauXrowsTPC(0.),
86 fCutMinDauXrowsOverFindableClusTPC(0.),
87 fCutMaxKshortSigmaTPC(0.),
88 fCutMinKshortCosPA(0.),
89 fCutMaxKshortCtau(0.),
90 fCutMaxKshortArmFrac(0.),
91 fCutMinKshortDeltaM(0.),
92 fCutMaxLambdaSigmaTPC(0.),
93 fCutMinLambdaCosPA(0.),
94 fCutMaxLambdaCtau(0.),
95 fCutMaxLambdaArmFrac(0.),
96 fCutMinLambdaDeletaM(0.),
108 for (
auto &d : fPrimaryVtx) d = -999.;
114 fTriggerMask(AliVEvent::kAny),
116 fUseAnaUtils(kFALSE),
122 fIsSkipFastOnly(kFALSE),
123 fIsRefitV0sESD(kFALSE),
132 fCutMinV0Radius(0.5),
133 fCutMaxV0Radius(200.),
135 fCutMinDauDCAtoPV(0.06),
136 fCutMinDauXrowsTPC(70.),
137 fCutMinDauXrowsOverFindableClusTPC(0.8),
138 fCutMaxKshortSigmaTPC(5.),
139 fCutMinKshortCosPA(0.97),
140 fCutMaxKshortCtau(20.),
141 fCutMaxKshortArmFrac(-1.),
142 fCutMinKshortDeltaM(0.005),
143 fCutMaxLambdaSigmaTPC(5.),
144 fCutMinLambdaCosPA(0.995),
145 fCutMaxLambdaCtau(30.),
146 fCutMaxLambdaArmFrac(-1.),
147 fCutMinLambdaDeletaM(0.01),
160 DefineOutput(1, TList::Class());
230 if (!(InputEvent()->FindListObject(
"PicoV0s"))) InputEvent()->AddObject(
fPicoV0sClArr);
277 auto hKshortPtInvM(static_cast<TH2D*>(
fListUserOutputs->FindObject(
"hKshortPtInvM")));
278 auto hLambdaPtInvM(static_cast<TH2D*>(
fListUserOutputs->FindObject(
"hLambdaPtInvM")));
279 auto hAntiLaPtInvM(static_cast<TH2D*>(
fListUserOutputs->FindObject(
"hAntiLaPtInvM")));
282 for (
auto iV0=0; iV0<nV0s; iV0++) {
304 delete pV0MC; pV0MC =
nullptr;
319 if (pV0RD->GetOnFlyStatus())
return nullptr;
325 Double_t dV0Vtx[3]; pV0RD->GetXYZ(dV0Vtx);
326 const auto dV0Radius(TMath::Sqrt(dV0Vtx[0]*dV0Vtx[0] + dV0Vtx[1]*dV0Vtx[1]));
329 const auto dDausDCA(pV0RD->DcaV0Daughters());
if (dDausDCA>
fCutMaxDausDCA)
return nullptr;
330 const auto dPosDCAtoPV(pV0RD->DcaPosToPrimVertex());
if (dPosDCAtoPV<
fCutMinDauDCAtoPV)
return nullptr;
331 const auto dNegDCAtoPV(pV0RD->DcaNegToPrimVertex());
if (dNegDCAtoPV<
fCutMinDauDCAtoPV)
return nullptr;
334 auto pDauPosRD(static_cast<AliAODTrack*>(pV0RD->GetDaughter(0)));
if (!pDauPosRD)
return nullptr;
335 auto pDauNegRD(static_cast<AliAODTrack*>(pV0RD->GetDaughter(1)));
if (!pDauNegRD)
return nullptr;
337 if (!(pDauPosRD->GetStatus() & AliESDtrack::kTPCrefit))
return nullptr;
338 if (!(pDauNegRD->GetStatus() & AliESDtrack::kTPCrefit))
return nullptr;
340 if ((pDauPosRD->GetProdVertex()->GetType())==((
Char_t)AliAODVertex::kKink))
return nullptr;
341 if ((pDauNegRD->GetProdVertex()->GetType())==((
Char_t)AliAODVertex::kKink))
return nullptr;
343 const auto dPosXrowsTPC = pDauPosRD->GetTPCClusterInfo(2,1);
344 const auto dNegXrowsTPC = pDauNegRD->GetTPCClusterInfo(2,1);
345 const auto dDauXrowsTPC(dPosXrowsTPC<dNegXrowsTPC ? dPosXrowsTPC : dNegXrowsTPC);
348 const auto wPosTPCNClsF(pDauPosRD->GetTPCNclsF());
if (wPosTPCNClsF<=0)
return nullptr;
349 const auto wNegTPCNClsF(pDauNegRD->GetTPCNclsF());
if (wNegTPCNClsF<=0)
return nullptr;
350 const auto dPosXrowsOverFindableClusTPC( ((
Double_t)dPosXrowsTPC) / ((
Double_t)wPosTPCNClsF) );
351 const auto dNegXrowsOverFindableClusTPC( ((
Double_t)dNegXrowsTPC) / ((
Double_t)wNegTPCNClsF) );
353 const auto dDauXrowsOverFindableClusTPC(dPosXrowsOverFindableClusTPC<dNegXrowsOverFindableClusTPC ?
354 dPosXrowsOverFindableClusTPC :
355 dNegXrowsOverFindableClusTPC);
359 const auto nPosCharge(pDauPosRD->Charge());
360 const auto nNegCharge(pDauNegRD->Charge());
361 if ((nPosCharge==0) || (nNegCharge==0) || (nPosCharge==nNegCharge))
return nullptr;
363 Double_t dPosPxPyPz[3] = { 0., 0., 0. };
364 Double_t dNegPxPyPz[3] = { 0., 0., 0. };
365 if ((nPosCharge<0) && (nNegCharge>0)) {
366 pDauPosRD = (AliAODTrack*)pV0RD->GetDaughter(1);
367 pDauNegRD = (AliAODTrack*)pV0RD->GetDaughter(0);
369 dPosPxPyPz[0] = pV0RD->MomNegX(); dPosPxPyPz[1] = pV0RD->MomNegY(); dPosPxPyPz[2] = pV0RD->MomNegZ();
370 dNegPxPyPz[0] = pV0RD->MomPosX(); dNegPxPyPz[1] = pV0RD->MomPosY(); dNegPxPyPz[2] = pV0RD->MomPosZ();
372 dPosPxPyPz[0] = pV0RD->MomPosX(); dPosPxPyPz[1] = pV0RD->MomPosY(); dPosPxPyPz[2] = pV0RD->MomPosZ();
373 dNegPxPyPz[0] = pV0RD->MomNegX(); dNegPxPyPz[1] = pV0RD->MomNegY(); dNegPxPyPz[2] = pV0RD->MomNegZ();
376 const TVector3 v3Pos(dPosPxPyPz);
377 const TVector3 v3Neg(dNegPxPyPz);
383 const auto inp(TMath::Abs(pDauPosRD->GetLabel()));
if (inp<0)
return nullptr;
384 auto pDauPosMC(static_cast<AliAODMCParticle*>(MCEvent()->GetTrack(inp)));
if (!pDauPosMC)
return nullptr;
385 const auto imp(pDauPosMC->GetMother());
if (imp<0)
return nullptr;
387 const auto inn(TMath::Abs(pDauNegRD->GetLabel()));
if (inn<0)
return nullptr;
388 auto pDauNegMC(static_cast<AliAODMCParticle*>(MCEvent()->GetTrack(inn)));
if (!pDauNegMC)
return nullptr;
389 const auto imn(pDauNegMC->GetMother());
if (imn<0)
return nullptr;
391 if (imp != imn)
return nullptr;
392 const auto pV0MC(static_cast<AliAODMCParticle*>(MCEvent()->GetTrack(imp)));
if (!pV0MC)
return nullptr;
395 const auto idvMC(pV0MC->GetPdgCode());
396 const auto idp(pDauPosMC->GetPdgCode());
397 const auto idn(pDauNegMC->GetPdgCode());
398 auto bIsKshort((idp==211) && (idn==-211) && (idvMC== 310));
399 auto bIsLambda((idp==2212) && (idn==-211) && (idvMC== 3122));
400 auto bIsAntiLa((idp==211) && (idn==-2212) && (idvMC==-3122));
401 if (!(bIsKshort || bIsLambda || bIsAntiLa))
return nullptr;
415 if (bIsLambda || bIsAntiLa) {
416 const auto imv(pV0MC->GetMother());
419 const auto pMother(static_cast<AliAODMCParticle*>(MCEvent()->GetTrack(imv)));
422 idmMC = pMother->GetPdgCode();
423 if ((bIsLambda && ((idmMC== 3312) || (idmMC== 3322))) ||
424 (bIsAntiLa && ((idmMC==-3312) || (idmMC==-3322)))) {
425 dMotherPt = pMother->Pt();
426 dMotherEta = pMother->Eta();
427 dMotherRap = pMother->Y();
439 const auto dV0CosPA(pV0RD->CosPointingAngle(
fPrimaryVtx));
450 if (!(bIsKshort || bIsLambda || bIsAntiLa))
return nullptr;
453 auto dV0DistToPV(0.);
455 const auto dV0DistToPVoverP(TMath::Sqrt(dV0DistToPV) / (pV0RD->P()+1e-10));
466 if (!(bIsKshort || bIsLambda || bIsAntiLa))
return nullptr;
469 const auto dV0ArmFrac(pV0RD->PtArmV0() / (TMath::Abs(pV0RD->AlphaV0())+1e-12));
480 if (!(bIsKshort || bIsLambda || bIsAntiLa))
return nullptr;
488 const auto dKshortInvM((vPosPion + vNegPion).M());
489 if ((dKshortInvM<(0.430006 - 0.0110029*dV0Pt)) ||
490 (dKshortInvM>(0.563707 + 0.0114979*dV0Pt)))
return nullptr;
506 const auto dLambdaInvM((vPosProton+vNegPion).M());
507 if ((dLambdaInvM<(1.09501 - 0.00523272*dV0Pt - 0.075269*TMath::Exp(-3.46339*dV0Pt))) ||
508 (dLambdaInvM>(1.13688 + 0.00527838*dV0Pt + 0.084222*TMath::Exp(-3.80595*dV0Pt))))
return nullptr;
522 const auto dAntiLaInvM((vNegProton+vPosPion).M());
523 if ((dAntiLaInvM<(1.09501 - 0.00523272*dV0Pt - 0.075269*TMath::Exp(-3.46339*dV0Pt))) ||
524 (dAntiLaInvM>(1.13688 + 0.00527838*dV0Pt + 0.084222*TMath::Exp(-3.80595*dV0Pt))))
return nullptr;
535 auto bPosInJC(kFALSE);
536 auto bNegInJC(kFALSE);
545 dDauXrowsOverFindableClusTPC,
546 v3Pos.Px(), v3Pos.Py(), v3Pos.Pz(),
547 v3Neg.Px(), v3Neg.Py(), v3Neg.Pz(),
549 idvMC, wsvMC, pV0MC->Px(), pV0MC->Py(), pV0MC->Pz(), pV0MC->E(),
550 idmMC, wsmMC, dMotherPt, dMotherEta, dMotherRap));
560 auto pStack(MCEvent()->Stack());
if (!pStack)
return nullptr;
563 if (pV0RD->GetOnFlyStatus())
return nullptr;
569 Double_t dV0Vtx[3]; pV0RD->GetXYZ(dV0Vtx[0], dV0Vtx[1], dV0Vtx[2]);
570 const auto dV0Radius(TMath::Sqrt(dV0Vtx[0]*dV0Vtx[0] + dV0Vtx[1]*dV0Vtx[1]));
573 const auto dDausDCA(pV0RD->GetDcaV0Daughters());
if (dDausDCA>
fCutMaxDausDCA)
return nullptr;
576 const auto nPosIndex(TMath::Abs(pV0RD->GetPindex()));
if (nPosIndex<0)
return nullptr;
577 const auto nNegIndex(TMath::Abs(pV0RD->GetNindex()));
if (nNegIndex<0)
return nullptr;
579 auto pDauPosRD(
fEventESD->GetTrack(nPosIndex));
if (!pDauPosRD)
return nullptr;
580 auto pDauNegRD(
fEventESD->GetTrack(nNegIndex));
if (!pDauNegRD)
return nullptr;
582 const auto dMegField(
fEventESD->GetMagneticField());
590 if (!(pDauPosRD->GetStatus() & AliESDtrack::kTPCrefit))
return nullptr;
591 if (!(pDauNegRD->GetStatus() & AliESDtrack::kTPCrefit))
return nullptr;
592 if ((pDauPosRD->GetKinkIndex(0)>0) || (pDauNegRD->GetKinkIndex(0)>0))
return nullptr;
594 const auto dPosXrowsTPC(pDauPosRD->GetTPCClusterInfo(2,1));
595 const auto dNegXrowsTPC(pDauNegRD->GetTPCClusterInfo(2,1));
596 const auto dDauXrowsTPC((dPosXrowsTPC<dNegXrowsTPC) ? dPosXrowsTPC : dNegXrowsTPC);
599 const auto wPosTPCNClsF(pDauPosRD->GetTPCNclsF());
if (wPosTPCNClsF<=0)
return nullptr;
600 const auto wNegTPCNClsF(pDauNegRD->GetTPCNclsF());
if (wNegTPCNClsF<=0)
return nullptr;
601 const auto dPosXrowsOverFindableClusTPC( ((
Double_t)dPosXrowsTPC) / ((
Double_t)wPosTPCNClsF) );
602 const auto dNegXrowsOverFindableClusTPC( ((
Double_t)dNegXrowsTPC) / ((
Double_t)wNegTPCNClsF) );
604 const auto dDauXrowsOverFindableClusTPC((dPosXrowsOverFindableClusTPC<dNegXrowsOverFindableClusTPC) ?
605 dPosXrowsOverFindableClusTPC :
606 dNegXrowsOverFindableClusTPC);
610 const auto nPosCharge(pDauPosRD->Charge());
611 const auto nNegCharge(pDauNegRD->Charge());
612 if ((nPosCharge==0) || (nNegCharge==0) || (nPosCharge==nNegCharge))
return nullptr;
614 Double_t dPosPxPyPz[3] = { 0., 0., 0. };
615 Double_t dNegPxPyPz[3] = { 0., 0., 0. };
616 if ((nPosCharge<0) && (nNegCharge>0)) {
617 pDauPosRD =
fEventESD->GetTrack(nNegIndex);
618 pDauNegRD =
fEventESD->GetTrack(nPosIndex);
620 pV0RD->GetNPxPyPz(dPosPxPyPz[0], dPosPxPyPz[1], dPosPxPyPz[2]);
621 pV0RD->GetPPxPyPz(dNegPxPyPz[0], dNegPxPyPz[1], dNegPxPyPz[2]);
623 pV0RD->GetPPxPyPz(dPosPxPyPz[0], dPosPxPyPz[1], dPosPxPyPz[2]);
624 pV0RD->GetNPxPyPz(dNegPxPyPz[0], dNegPxPyPz[1], dNegPxPyPz[2]);
627 const TVector3 v3Pos(dPosPxPyPz);
628 const TVector3 v3Neg(dNegPxPyPz);
634 AliMCParticle *pDauTmpMC(
nullptr);
635 const auto inp(TMath::Abs(pDauPosRD->GetLabel()));
if (inp<0)
return nullptr;
636 pDauTmpMC =
static_cast<AliMCParticle*
>(MCEvent()->GetTrack(inp));
if (!pDauTmpMC)
return nullptr;
637 const auto pDauPosMC(pDauTmpMC->Particle());
if (!pDauPosMC)
return nullptr;
638 const auto imp(pDauPosMC->GetFirstMother());
if (imp<0)
return nullptr;
640 const auto inn(TMath::Abs(pDauNegRD->GetLabel()));
if (inn<0)
return nullptr;
641 pDauTmpMC =
static_cast<AliMCParticle*
>(MCEvent()->GetTrack(inn));
if (!pDauTmpMC)
return nullptr;
642 const auto pDauNegMC(pDauTmpMC->Particle());
if (!pDauNegMC)
return nullptr;
643 const auto imn(pDauNegMC->GetFirstMother());
if (imn<0)
return nullptr;
645 if (imp != imn)
return nullptr;
646 pDauTmpMC =
static_cast<AliMCParticle*
>(MCEvent()->GetTrack(imp));
if (!pDauTmpMC)
return nullptr;
647 const auto pV0MC(pDauTmpMC->Particle());
if (!pV0MC)
return nullptr;
650 const auto idvMC(pV0MC->GetPdgCode());
651 const auto idp(pDauPosMC->GetPdgCode());
652 const auto idn(pDauNegMC->GetPdgCode());
653 auto bIsKshort((idp==211) && (idn==-211) && (idvMC== 310));
654 auto bIsLambda((idp==2212) && (idn==-211) && (idvMC== 3122));
655 auto bIsAntiLa((idp==211) && (idn==-2212) && (idvMC==-3122));
656 if (!(bIsKshort || bIsLambda || bIsAntiLa))
return nullptr;
670 if (bIsLambda || bIsAntiLa) {
671 const auto imv(pV0MC->GetFirstMother());
674 pDauTmpMC =
static_cast<AliMCParticle*
>(MCEvent()->GetTrack(imv));
677 auto pMother(pDauTmpMC->Particle());
680 idmMC = pMother->GetPdgCode();
681 if ((bIsLambda && ((idmMC== 3312) || (idmMC== 3322))) ||
682 (bIsAntiLa && ((idmMC==-3312) || (idmMC==-3322)))) {
683 dMotherPt = pMother->Pt();
684 dMotherEta = pMother->Eta();
685 dMotherRap = pMother->Y();
709 if (!(bIsKshort || bIsLambda || bIsAntiLa))
return nullptr;
714 const auto dV0DistToPVoverP(TMath::Sqrt(dV0DistToPV) / (pV0RD->P()+1e-10));
725 if (!(bIsKshort || bIsLambda || bIsAntiLa))
return nullptr;
728 const auto dV0ArmFrac(pV0RD->PtArmV0() / (TMath::Abs(pV0RD->AlphaV0())+1e-12));
739 if (!(bIsKshort || bIsLambda || bIsAntiLa))
return nullptr;
747 const auto dKshortInvM((vPosPion+vNegPion).M());
748 if ((dKshortInvM<(0.430006 - 0.0110029*dV0Pt)) ||
749 (dKshortInvM>(0.563707 + 0.0114979*dV0Pt)))
return nullptr;
765 const auto dLambdaInvM((vPosProton+vNegPion).M());
766 if ((dLambdaInvM<(1.09501 - 0.00523272*dV0Pt - 0.075269*TMath::Exp(-3.46339*dV0Pt))) ||
767 (dLambdaInvM>(1.13688 + 0.00527838*dV0Pt + 0.084222*TMath::Exp(-3.80595*dV0Pt))))
return nullptr;
781 const auto dAntiLaInvM((vNegProton+vPosPion).M());
782 if ((dAntiLaInvM<(1.09501 - 0.00523272*dV0Pt - 0.075269*TMath::Exp(-3.46339*dV0Pt))) ||
783 (dAntiLaInvM>(1.13688 + 0.00527838*dV0Pt + 0.084222*TMath::Exp(-3.80595*dV0Pt))))
return nullptr;
794 auto bPosInJC(kFALSE);
795 auto bNegInJC(kFALSE);
804 dDauXrowsOverFindableClusTPC,
805 v3Pos.Px(), v3Pos.Py(), v3Pos.Pz(),
806 v3Neg.Px(), v3Neg.Py(), v3Neg.Pz(),
808 idvMC, wsvMC, pV0MC->Px(), pV0MC->Py(), pV0MC->Pz(), pV0MC->Energy(),
809 idmMC, wsmMC, dMotherPt, dMotherEta, dMotherRap));
820 if (!InputEvent())
return kTRUE;
821 if (!fInputHandler)
return kTRUE;
828 fRespoPID = fInputHandler->GetPIDResponse();
833 if (MCEvent()->GetNumberOfTracks()<=0)
return kTRUE;
838 const auto pHeader(MCEvent()->Header());
if (!pHeader)
return kTRUE;
841 const auto pDPMjetH(dynamic_cast<AliGenDPMjetEventHeader*>(pHeader->GenEventHeader()));
844 auto nd0(0), nd1(0), nd2(0);
845 pDPMjetH->GetNDiffractive(nd1, nd2, nd0);
846 if ((nd1+nd2) != (pDPMjetH->ProjectileParticipants() + pDPMjetH->TargetParticipants()))
return kTRUE;
857 auto pCentSel(InputEvent()->GetCentrality());
859 if (pCentSel->GetQuality()!=0)
return kFALSE;
860 dMult = pCentSel->GetCentralityPercentile(
fMultEst.Data());
862 auto pMultSel(static_cast<AliMultSelection*>(InputEvent()->FindListObject(
"MultSelection")));
864 dMult = pMultSel->GetMultiplicityPercentile(
fMultEst.Data());
873 const UInt_t wMask(fInputHandler->IsEventSelected());
875 if (
fIsSkipFastOnly)
if ((wMask & AliVEvent::kFastOnly) == AliVEvent::kFastOnly)
return kFALSE;
880 const auto pVertex(InputEvent()->GetPrimaryVertex());
881 if (!pVertex)
return kFALSE;
885 auto pUtils(
new AliAnalysisUtils());
886 if (!pUtils->IsVertexSelected2013pA(InputEvent()))
return kFALSE;
888 if (pUtils->IsPileUpEvent(InputEvent()))
return kFALSE;
892 if (pUtils->IsFirstEventInChunk(InputEvent()))
return kFALSE;
909 AliV0vertexer aV0vtxer;
910 aV0vtxer.SetDefaultCuts(dCuts);
953 const auto h(static_cast<TH1D*>(
fListUserOutputs->FindObject(
"hEventCheck")));
971 const auto b(TH1::AddDirectoryStatus());
972 TH1::AddDirectory(kFALSE);
987 while ((h = static_cast<TH1*>(nl()))) h->Sumw2();
989 TH1::AddDirectory(b);
void FillLambdaPtInvM(TH2D *const h, Double_t const *dCuts=nullptr) const
void FillKshortPtInvM(TH2D *const h, Double_t const *dCuts=nullptr) const
Float_t fCutMaxLambdaSigmaTPC
Double_t fCutMinKshortDeltaM
virtual ~AliAnalysisTaskSEPicoV0MakerMC()
void SetV0Cuts(Double_t d[14])
Double_t fCutMinKshortCosPA
AliAnalysisTaskSEPicoV0MakerMC()
Double_t fCutMinLambdaDeletaM
AliPIDResponse * fRespoPID
void FillAntiLaPtInvM(TH2D *const h, Double_t const *dCuts=nullptr) const
Double_t fCutMinDauXrowsOverFindableClusTPC
Double_t fCutMaxKshortArmFrac
Float_t fCutMinDauXrowsTPC
Double_t fCutMaxLambdaArmFrac
Float_t fCutMaxKshortSigmaTPC
AliPicoV0MC * SelectV0Candidate(AliAODv0 const *pV0)
virtual void Terminate(Option_t *opt)
Double_t fCutMaxKshortCtau
TClonesArray * fPicoV0sClArr
Double_t fCutMinLambdaCosPA
Double_t fCutMaxLambdaCtau
Double_t fCutMinDauDCAtoPV
virtual void UserCreateOutputObjects()
virtual void UserExec(Option_t *opt)