@@ -70,6 +70,7 @@ struct HfDerivedDataCreatorDstarToD0Pi {
7070 Produces<o2::aod::HfDstarMls> rowCandidateMl;
7171 Produces<o2::aod::HfDstarIds> rowCandidateId;
7272 Produces<o2::aod::HfDstarMcs> rowCandidateMc;
73+ Produces<o2::aod::HfDstarGenMcs> rowCandidateGenMc;
7374
7475 // Switches for filling tables
7576 HfConfigurableDerivedData confDerData;
@@ -79,6 +80,7 @@ struct HfDerivedDataCreatorDstarToD0Pi {
7980 Configurable<bool > fillCandidateMl{" fillCandidateMl" , true , " Fill candidate selection ML scores" };
8081 Configurable<bool > fillCandidateId{" fillCandidateId" , true , " Fill original indices from the candidate table" };
8182 Configurable<bool > fillCandidateMc{" fillCandidateMc" , true , " Fill candidate MC info" };
83+ Configurable<bool > fillCandidateGenMc{" fillCandidateGenMc" , true , " Fill candidate generator level MC info" };
8284 // Parameters for production of training samples
8385 Configurable<float > downSampleBkgFactor{" downSampleBkgFactor" , 1 ., " Fraction of background candidates to keep for ML trainings" };
8486 Configurable<float > ptMaxForDownSample{" ptMaxForDownSample" , 10 ., " Maximum pt for the application of the downsampling factor" };
@@ -204,6 +206,42 @@ struct HfDerivedDataCreatorDstarToD0Pi {
204206 }
205207 }
206208
209+ template <typename CollisionType, typename ParticleType, typename MatchMap>
210+ void processGenMc (CollisionType const & mcCollisions,
211+ o2::framework::Preslice<ParticleType> const & mcParticlesPerMcCollision,
212+ ParticleType const & mcParticles,
213+ MatchMap const & matchMap)
214+ {
215+ // Fill MC collision properties
216+ for (const auto & mcCollision : mcCollisions) {
217+ auto thisMcCollId = mcCollision.globalIndex ();
218+ auto particlesThisMcColl = mcParticles.sliceBy (mcParticlesPerMcCollision, thisMcCollId);
219+ auto sizeTablePart = particlesThisMcColl.size ();
220+ LOGF (debug, " MC collision %d has %d MC particles" , thisMcCollId, sizeTablePart);
221+ // Skip MC collisions without HF particles (and without HF candidates in matched reconstructed collisions if saving indices of reconstructed collisions matched to MC collisions)
222+ bool isEmpty = (matchMap.find (thisMcCollId) == matchMap.end ()) || matchMap.find (thisMcCollId)->second .empty ();
223+ if (sizeTablePart == 0 && isEmpty) {
224+ LOGF (debug, " Skipping MC collision %d" , thisMcCollId);
225+ continue ;
226+ }
227+ reserveTable (rowCandidateGenMc, fillCandidateGenMc, sizeTablePart);
228+ if (fillCandidateGenMc) {
229+ for (const auto & particle : particlesThisMcColl) {
230+ auto origin = particle.originMcGen ();
231+ int pdgMother = 0 ;
232+ if (origin == RecoDecay::OriginType::NonPrompt) {
233+ auto bHadMother = mcParticles.rawIteratorAt (particle.idxBhadMotherPart () - particlesThisMcColl.offset ());
234+ pdgMother = std::abs (bHadMother.pdgCode ());
235+ }
236+ rowCandidateGenMc (
237+ particle.flagMcMatchGenD0 (),
238+ pdgMother);
239+ }
240+ }
241+
242+ }
243+ }
244+
207245 template <bool isMl, bool isMc, bool onlyBkg, bool onlySig, typename CollType, typename CandType>
208246 void processCandidates (CollType const & collisions,
209247 Partition<CandType>& candidates,
@@ -322,6 +360,7 @@ struct HfDerivedDataCreatorDstarToD0Pi {
322360 rowsCommon.preProcessMcCollisions (mcCollisions, mcParticlesPerMcCollision, mcParticles);
323361 processCandidates<false , true , false , true >(collisions, candidatesMcSig, tracks, bcs);
324362 rowsCommon.processMcParticles (mcCollisions, mcParticlesPerMcCollision, mcParticles, Mass);
363+ processGenMc (mcCollisions, mcParticlesPerMcCollision, mcParticles, rowsCommon.matchedCollisions );
325364 }
326365 PROCESS_SWITCH (HfDerivedDataCreatorDstarToD0Pi, processMcSig, " Process MC only for signals" , false );
327366
@@ -335,6 +374,7 @@ struct HfDerivedDataCreatorDstarToD0Pi {
335374 rowsCommon.preProcessMcCollisions (mcCollisions, mcParticlesPerMcCollision, mcParticles);
336375 processCandidates<false , true , true , false >(collisions, candidatesMcBkg, tracks, bcs);
337376 rowsCommon.processMcParticles (mcCollisions, mcParticlesPerMcCollision, mcParticles, Mass);
377+ processGenMc (mcCollisions, mcParticlesPerMcCollision, mcParticles, rowsCommon.matchedCollisions );
338378 }
339379 PROCESS_SWITCH (HfDerivedDataCreatorDstarToD0Pi, processMcBkg, " Process MC only for background" , false );
340380
@@ -348,6 +388,7 @@ struct HfDerivedDataCreatorDstarToD0Pi {
348388 rowsCommon.preProcessMcCollisions (mcCollisions, mcParticlesPerMcCollision, mcParticles);
349389 processCandidates<false , true , false , false >(collisions, candidatesMcAll, tracks, bcs);
350390 rowsCommon.processMcParticles (mcCollisions, mcParticlesPerMcCollision, mcParticles, Mass);
391+ processGenMc (mcCollisions, mcParticlesPerMcCollision, mcParticles, rowsCommon.matchedCollisions );
351392 }
352393 PROCESS_SWITCH (HfDerivedDataCreatorDstarToD0Pi, processMcAll, " Process MC" , false );
353394
@@ -372,6 +413,7 @@ struct HfDerivedDataCreatorDstarToD0Pi {
372413 rowsCommon.preProcessMcCollisions (mcCollisions, mcParticlesPerMcCollision, mcParticles);
373414 processCandidates<true , true , false , true >(collisions, candidatesMcMlSig, tracks, bcs);
374415 rowsCommon.processMcParticles (mcCollisions, mcParticlesPerMcCollision, mcParticles, Mass);
416+ processGenMc (mcCollisions, mcParticlesPerMcCollision, mcParticles, rowsCommon.matchedCollisions );
375417 }
376418 PROCESS_SWITCH (HfDerivedDataCreatorDstarToD0Pi, processMcMlSig, " Process MC with ML only for signals" , false );
377419
@@ -385,6 +427,7 @@ struct HfDerivedDataCreatorDstarToD0Pi {
385427 rowsCommon.preProcessMcCollisions (mcCollisions, mcParticlesPerMcCollision, mcParticles);
386428 processCandidates<true , true , true , false >(collisions, candidatesMcMlBkg, tracks, bcs);
387429 rowsCommon.processMcParticles (mcCollisions, mcParticlesPerMcCollision, mcParticles, Mass);
430+ processGenMc (mcCollisions, mcParticlesPerMcCollision, mcParticles, rowsCommon.matchedCollisions );
388431 }
389432 PROCESS_SWITCH (HfDerivedDataCreatorDstarToD0Pi, processMcMlBkg, " Process MC with ML only for background" , false );
390433
@@ -398,13 +441,15 @@ struct HfDerivedDataCreatorDstarToD0Pi {
398441 rowsCommon.preProcessMcCollisions (mcCollisions, mcParticlesPerMcCollision, mcParticles);
399442 processCandidates<true , true , false , false >(collisions, candidatesMcMlAll, tracks, bcs);
400443 rowsCommon.processMcParticles (mcCollisions, mcParticlesPerMcCollision, mcParticles, Mass);
444+ processGenMc (mcCollisions, mcParticlesPerMcCollision, mcParticles, rowsCommon.matchedCollisions );
401445 }
402446 PROCESS_SWITCH (HfDerivedDataCreatorDstarToD0Pi, processMcMlAll, " Process MC with ML" , false );
403447
404448 void processMcGenOnly (TypeMcCollisions const & mcCollisions,
405449 MatchedGenCandidatesMc const & mcParticles)
406450 {
407451 rowsCommon.processMcParticles (mcCollisions, mcParticlesPerMcCollision, mcParticles, Mass);
452+ processGenMc (mcCollisions, mcParticlesPerMcCollision, mcParticles, rowsCommon.matchedCollisions );
408453 }
409454 PROCESS_SWITCH (HfDerivedDataCreatorDstarToD0Pi, processMcGenOnly, " Process MC gen. only" , false );
410455};
0 commit comments