@@ -97,15 +97,8 @@ struct threebodyKFTask {
9797
9898 // helper function to check if a mother track is a true H3L/Anti-H3L
9999 template <typename MCTrack3B>
100- int checkH3LTruth (MCTrack3B const & trackPr , MCTrack3B const & trackPi , MCTrack3B const & trackDe , bool & isMuonReco)
100+ int checkH3LTruth (MCTrack3B const & mcParticlePr , MCTrack3B const & mcParticlePi , MCTrack3B const & mcParticleDe , bool & isMuonReco)
101101 {
102- if (!trackPi.has_mcParticle () || !trackPr.has_mcParticle () || !trackDe.has_mcParticle ()) {
103- return -1 ;
104- }
105- auto mcParticlePr = trackPr.template mcParticle_as <aod::McParticles>();
106- auto mcParticlePi = trackPi.template mcParticle_as <aod::McParticles>();
107- auto mcParticleDe = trackDe.template mcParticle_as <aod::McParticles>();
108-
109102 if (abs (mcParticlePr.pdgCode ()) != 2212 || abs (mcParticleDe.pdgCode ()) != 1000010020 ) {
110103 return -1 ;
111104 }
@@ -126,17 +119,18 @@ struct threebodyKFTask {
126119 return -1 ;
127120 }
128121 // check if the pion track is a muon coming from a pi -> mu + vu decay, if yes, take the mother pi
129- if (std::abs (mcParticlePi.pdgCode ()) == 13 ) {
130- for (const auto & motherPi : mcParticlePi.template mothers_as <aod::McParticles>()) {
122+ auto mcParticlePiTmp = mcParticlePi;
123+ if (std::abs (mcParticlePiTmp.pdgCode ()) == 13 ) {
124+ for (const auto & motherPi : mcParticlePiTmp.template mothers_as <aod::McParticles>()) {
131125 if (std::abs (motherPi.pdgCode ()) == 211 ) {
132- mcParticlePi = motherPi;
126+ mcParticlePiTmp = motherPi;
133127 isMuonReco = true ;
134128 break ;
135129 }
136130 }
137131 }
138132 // now loop over the pion mother
139- for (const auto & motherPi : mcParticlePi .template mothers_as <aod::McParticles>()) {
133+ for (const auto & motherPi : mcParticlePiTmp .template mothers_as <aod::McParticles>()) {
140134 if (motherPi.globalIndex () == prDeMomID) {
141135 return motherPi.globalIndex ();
142136 }
@@ -215,6 +209,29 @@ struct threebodyKFTask {
215209 // fill QA histograms for all reco candidates
216210 fillQAPlots (vtx3bodydata);
217211
212+ auto track0 = vtx3bodydata.track0_as <MCLabeledTracksIU>();
213+ auto track1 = vtx3bodydata.track1_as <MCLabeledTracksIU>();
214+ auto track2 = vtx3bodydata.track2_as <MCLabeledTracksIU>();
215+
216+ if (!track0.has_mcParticle () || !track1.has_mcParticle () || !track2.has_mcParticle ()) {
217+ continue ;
218+ }
219+
220+ auto mcTrack0 = track0.mcParticle_as <aod::McParticles>();
221+ auto mcTrack1 = track1.mcParticle_as <aod::McParticles>();
222+ auto mcTrack2 = track2.mcParticle_as <aod::McParticles>();
223+
224+ float genPosPt = mcTrack0.pt ();
225+ float genPosP = mcTrack0.p ();
226+ int daughter0PDGcode = mcTrack0.pdgCode ();
227+ float genNegPt = mcTrack1.pt ();
228+ float genNegP = mcTrack1.p ();
229+ int daughter1PDGcode = mcTrack1.pdgCode ();
230+ float genBachPt = mcTrack2.pt ();
231+ float genBachP = mcTrack2.p ();
232+ int daughter2PDGcode = mcTrack2.pdgCode ();
233+ bool isBachPrimary = mcTrack2.isPhysicalPrimary ();
234+
218235 double MClifetime = -1 .;
219236 bool isTrueH3L = false ;
220237 bool isTrueAntiH3L = false ;
@@ -224,48 +241,22 @@ struct threebodyKFTask {
224241 float genP = -1 .;
225242 float genPt = -1 .;
226243 std::array<float , 3 > genDecVtx{-1 .f };
227- int vtx3bodyPDGcode = -1 ;
228- int daughter0PDGcode = -1 ;
229- int daughter1PDGcode = -1 ;
230- int daughter2PDGcode = -1 ;
231- double MCmassPrPi = -1 .;
232- float genPosP = -1 .;
233- float genPosPt = -1 .;
234- float genNegP = -1 .;
235- float genNegPt = -1 .;
236- float genBachP = -1 .;
237- float genBachPt = -1 .;
238-
239- auto track0 = vtx3bodydata.track0_as <MCLabeledTracksIU>();
240- auto track1 = vtx3bodydata.track1_as <MCLabeledTracksIU>();
241- auto track2 = vtx3bodydata.track2_as <MCLabeledTracksIU>();
242- auto & trackPr = vtx3bodydata.track2sign () > 0 ? track0 : track1;
243- auto & trackPi = vtx3bodydata.track2sign () > 0 ? track1 : track0;
244- auto & trackDe = track2;
245-
246244 bool isMuonReco = false ;
247- int motherID = checkH3LTruth (trackPr, trackPi, trackDe, isMuonReco);
245+ auto & mcTrackPr = vtx3bodydata.sign () > 0 ? mcTrack0 : mcTrack1;
246+ auto & mcTrackPi = vtx3bodydata.sign () > 0 ? mcTrack1 : mcTrack0;
247+ auto & mcTrackDe = mcTrack2;
248+ int motherID = checkH3LTruth (mcTrackPr, mcTrackPi, mcTrackDe, isMuonReco);
248249 if (motherID > 0 ) {
249- int chargeFactor = vtx3bodydata.track2sign () > 0 ? 1 : -1 ;
250250 auto mcTrackHyp = particlesMC.rawIteratorAt (motherID);
251- auto mcTrackPr = trackPr.mcParticle_as <aod::McParticles>();
252- auto mcTrackPi = trackPi.mcParticle_as <aod::McParticles>();
253- auto mcTrackDe = trackDe.mcParticle_as <aod::McParticles>();
254- genPosPt = chargeFactor > 0 ? mcTrackPr.pt () : mcTrackPi.pt ();
255- genPosP = chargeFactor > 0 ? mcTrackPr.p () : mcTrackPi.p ();
256- genNegPt = chargeFactor < 0 ? mcTrackPr.pt () : mcTrackPi.pt ();
257- genNegP = chargeFactor < 0 ? mcTrackPr.p () : mcTrackPi.p ();
258- genBachPt = mcTrackDe.pt ();
259- genBachP = mcTrackDe.p ();
260-
261251 genPhi = mcTrackHyp.phi ();
262252 genEta = mcTrackHyp.eta ();
263253 genPt = mcTrackHyp.pt ();
254+ int chargeFactor = mcTrackHyp.pdgCode () > 0 ? 1 : -1 ;
264255 isTrueH3L = chargeFactor > 0 ;
265256 isTrueAntiH3L = chargeFactor < 0 ;
266257 MClifetime = RecoDecay::sqrtSumOfSquares (mcTrackPr.vx () - mcTrackHyp.vx (), mcTrackPr.vy () - mcTrackHyp.vy (), mcTrackPr.vz () - mcTrackHyp.vz ()) * o2::constants::physics::MassHyperTriton / mcTrackHyp.p ();
267258 double MCMass = RecoDecay::m (array{array{mcTrackPr.px (), mcTrackPr.py (), mcTrackPr.pz ()}, array{mcTrackPi.px (), mcTrackPi.py (), mcTrackPi.pz ()}, array{mcTrackDe.px (), mcTrackDe.py (), mcTrackDe.pz ()}}, array{o2::constants::physics::MassProton, o2::constants::physics::MassPionCharged, o2::constants::physics::MassDeuteron});
268- MCmassPrPi = RecoDecay::m (array{array{mcTrackPr.px (), mcTrackPr.py (), mcTrackPr.pz ()}, array{mcTrackPi.px (), mcTrackPi.py (), mcTrackPi.pz ()}}, array{o2::constants::physics::MassProton, o2::constants::physics::MassPionCharged});
259+ float MCmassPrPi = RecoDecay::m (array{array{mcTrackPr.px (), mcTrackPr.py (), mcTrackPr.pz ()}, array{mcTrackPi.px (), mcTrackPi.py (), mcTrackPi.pz ()}}, array{o2::constants::physics::MassProton, o2::constants::physics::MassPionCharged});
269260 registry.fill (HIST (" hLabelCounter" ), 2.5 );
270261 registry.fill (HIST (" hTrueHypertritonMCPt" ), mcTrackHyp.pt () * chargeFactor);
271262 registry.fill (HIST (" hTrueHypertritonMCCTau" ), MClifetime);
@@ -322,7 +313,7 @@ struct threebodyKFTask {
322313 genRap,
323314 genPosP, genPosPt, genNegP, genNegPt, genBachP, genBachPt,
324315 isTrueH3L, isTrueAntiH3L,
325- vtx3bodyPDGcode, daughter0PDGcode, daughter1PDGcode, daughter2PDGcode,
316+ daughter0PDGcode, daughter1PDGcode, daughter2PDGcode, isBachPrimary ,
326317 true , // is reconstructed
327318 true ); // reco event passed event selection
328319 } // end vtx3bodydatas loop
@@ -480,7 +471,8 @@ struct threebodyKFTask {
480471 mcparticle.y (),
481472 genPPos, genPtPos, genPNeg, genPtNeg, genPBach, genPtBach,
482473 isTrueGenH3L, isTrueGenAntiH3L,
483- mcparticle.pdgCode (), posDauPdgCode, negDauPdgCode, bachDauPdgCode,
474+ posDauPdgCode, negDauPdgCode, bachDauPdgCode,
475+ false , // isBachPrimary
484476 false , // is reconstructed
485477 survEvSel);
486478 } // end mcparticles loop
0 commit comments