@@ -101,28 +101,32 @@ DECLARE_SOA_COLUMN(Pt, pt, float); //!
101101DECLARE_SOA_COLUMN (M, m, float ); // ! Invariant mass of D-meson candidates (GeV/c)
102102DECLARE_SOA_COLUMN (Centrality, centrality, float ); // ! Centrality of collision
103103DECLARE_SOA_COLUMN (ImpactParameter, impactParameter, float ); // ! Impact parameter of D-meson candidate
104+ DECLARE_SOA_COLUMN (ImpactParameterMc, impactParameterMc, float ); // ! Generated impact parameter of D-meson candidate
104105DECLARE_SOA_COLUMN (DecayLength, decayLength, float ); // ! Decay length of D-meson candidate
105106DECLARE_SOA_COLUMN (DecayLengthXY, decayLengthXY, float ); // ! Transverse decay length of D-meson candidate
106107DECLARE_SOA_COLUMN (DecayLengthNormalised, decayLengthNormalised, float ); // ! Normalised decay length of D-meson candidate
107108DECLARE_SOA_COLUMN (DecayLengthXYNormalised, decayLengthXYNormalised, float ); // ! Normalised transverse decay length of D-meson candidate
108109DECLARE_SOA_COLUMN (FlagMc, flagMc, int ); // ! MC flag (according to DataType enum)
109110} // namespace hf_cand_ds_mini
110111
111- DECLARE_SOA_TABLE (HfCandDsMinis, " AOD" , " HFCANDDSMINI " , // ! Table with few Ds properties
112+ DECLARE_SOA_TABLE (HfCandDsMinis, " AOD" , " HFDSMINI " , // ! Table with few Ds properties
112113 hf_cand_ds_mini::M,
113114 hf_cand_ds_mini::Pt,
114115 hf_cand_ds_mini::Centrality);
115116
116- DECLARE_SOA_TABLE (HfCandDsDlMinis, " AOD" , " HFCANDDSDLMINI " , // ! Table with decay length Ds properties
117+ DECLARE_SOA_TABLE (HfCandDsDlMinis, " AOD" , " HFDSDLMINI " , // ! Table with decay length Ds properties
117118 hf_cand_ds_mini::DecayLength,
118119 hf_cand_ds_mini::DecayLengthXY,
119120 hf_cand_ds_mini::DecayLengthNormalised,
120121 hf_cand_ds_mini::DecayLengthXYNormalised);
121122
122- DECLARE_SOA_TABLE (HfCandDsD0Minis, " AOD" , " HFCANDDSD0MINI " , // ! Table with impact parameter (d0)
123+ DECLARE_SOA_TABLE (HfCandDsD0Minis, " AOD" , " HFDSD0MINI " , // ! Table with impact parameter (d0)
123124 hf_cand_ds_mini::ImpactParameter);
124125
125- DECLARE_SOA_TABLE (HfCandDsMcMinis, " AOD" , " HFCANDDSMCMINI" , // ! Table with MC decay type check
126+ DECLARE_SOA_TABLE (HfCandDsD0McMinis, " AOD" , " HFDSD0MCMINI" , // ! Table with generated impact parameter (d0)
127+ hf_cand_ds_mini::ImpactParameterMc);
128+
129+ DECLARE_SOA_TABLE (HfCandDsMcMinis, " AOD" , " HFDSMCMINI" , // ! Table with MC decay type check
126130 hf_cand_ds_mini::FlagMc);
127131} // namespace o2::aod
128132
@@ -141,6 +145,7 @@ struct HfTaskDs {
141145 Produces<aod::HfCandDsDlMinis> hfCandDsDlMinis;
142146 Produces<aod::HfCandDsD0Minis> hfCandDsD0Minis;
143147 Produces<aod::HfCandDsMcMinis> hfCandDsMcMinis;
148+ Produces<aod::HfCandDsD0McMinis> hfCandDsD0McMinis;
144149
145150 Configurable<int > decayChannel{" decayChannel" , 1 , " Switch between resonant decay channels: 1 for Ds/Dplus->PhiPi->KKpi, 2 for Ds/Dplus->K0*K->KKPi" };
146151 Configurable<bool > fillDplusMc{" fillDplusMc" , true , " Switch to fill Dplus MC information" };
@@ -584,8 +589,8 @@ struct HfTaskDs {
584589 }
585590 }
586591
587- template <bool IsMc, typename Coll, typename Cand>
588- void fillMiniTrees (const Cand& candidate, DataType dataType, FinalState finalState)
592+ template <typename Coll, typename Cand>
593+ void fillMiniTrees (const Cand& candidate, FinalState finalState)
589594 {
590595 auto mass = finalState == FinalState::KKPi ? HfHelper::invMassDsToKKPi (candidate) : HfHelper::invMassDsToPiKK (candidate);
591596 auto pt = candidate.pt ();
@@ -597,8 +602,32 @@ struct HfTaskDs {
597602 if (miniTrees.extendWithImpactParameter ) {
598603 hfCandDsD0Minis (candidate.impactParameterXY ());
599604 }
600- if constexpr (IsMc) {
601- hfCandDsMcMinis (dataType);
605+ }
606+
607+ template <typename Coll, typename Cand>
608+ void fillMiniTreesMc (const Cand& candidate, DataType dataType, FinalState finalState, const CandDsMcGen& mcParticles, int indexMother)
609+ {
610+ auto mass = finalState == FinalState::KKPi ? HfHelper::invMassDsToKKPi (candidate) : HfHelper::invMassDsToPiKK (candidate);
611+ auto pt = candidate.pt ();
612+
613+ hfCandDsMinis (mass, pt, evaluateCentralityCand<Coll>(candidate));
614+ if (miniTrees.extendWithDecayLength ) {
615+ hfCandDsDlMinis (candidate.decayLength (), candidate.decayLengthXY (), candidate.decayLengthNormalised (), candidate.decayLengthXYNormalised ());
616+ }
617+ if (miniTrees.extendWithImpactParameter ) {
618+ hfCandDsD0Minis (candidate.impactParameterXY ());
619+ }
620+ hfCandDsMcMinis (dataType);
621+
622+ if (miniTrees.extendWithImpactParameter ) {
623+ // indexMother is != -1 here
624+ auto particleMc = mcParticles.rawIteratorAt (indexMother);
625+ auto prong0 = mcParticles.rawIteratorAt (particleMc.daughtersIds ()[0 ]);
626+
627+ std::array pv{particleMc.mcCollision ().posX (), particleMc.mcCollision ().posY (), particleMc.mcCollision ().posZ ()};
628+ std::array sv{prong0.vx (), prong0.vy (), prong0.vz ()};
629+ auto genD0 = RecoDecay::impParXY (pv, sv, std::array{particleMc.px (), particleMc.py (), particleMc.pz ()});
630+ hfCandDsD0McMinis (genD0);
602631 }
603632 }
604633
@@ -663,7 +692,7 @@ struct HfTaskDs {
663692 fillHisto (candidate, dataType);
664693 fillHistoKKPi<true , Coll>(candidate, dataType);
665694 if (miniTrees.produceMiniTrees ) {
666- fillMiniTrees< true , Coll>(candidate, dataType, FinalState::KKPi);
695+ fillMiniTreesMc< Coll>(candidate, dataType, FinalState::KKPi, mcParticles, indexMother );
667696 }
668697 if (TESTBIT (candidate.isSelDsToKKPi (), aod::SelectionStep::RecoSkims)) {
669698 std::get<TH2Ptr>(histosPtr[dataType][" hPtVsYRecoSkim" ])->Fill (pt, yCand);
@@ -683,7 +712,7 @@ struct HfTaskDs {
683712 fillHisto (candidate, dataType);
684713 fillHistoPiKK<true , Coll>(candidate, dataType);
685714 if (miniTrees.produceMiniTrees ) {
686- fillMiniTrees< true , Coll>(candidate, dataType, FinalState::PiKK);
715+ fillMiniTreesMc< Coll>(candidate, dataType, FinalState::PiKK, mcParticles, indexMother );
687716 }
688717
689718 if (TESTBIT (candidate.isSelDsToPiKK (), aod::SelectionStep::RecoSkims)) {
@@ -709,7 +738,7 @@ struct HfTaskDs {
709738 fillHisto (candidate, DataType::Data);
710739 fillHistoKKPi<false , Coll>(candidate, DataType::Data);
711740 if (miniTrees.produceMiniTrees ) {
712- fillMiniTrees<true , Coll>(candidate, DataType::Data , FinalState::KKPi);
741+ fillMiniTrees<Coll>(candidate, FinalState::KKPi);
713742 }
714743 }
715744 if (candidate.isSelDsToPiKK () >= selectionFlagDs) { // PiKK
@@ -719,7 +748,7 @@ struct HfTaskDs {
719748 fillHisto (candidate, DataType::Data);
720749 fillHistoPiKK<false , Coll>(candidate, DataType::Data);
721750 if (miniTrees.produceMiniTrees ) {
722- fillMiniTrees<true , Coll>(candidate, DataType::Data , FinalState::PiKK);
751+ fillMiniTrees<Coll>(candidate, FinalState::PiKK);
723752 }
724753 }
725754 }
0 commit comments