diff --git a/PWGHF/DataModel/DerivedTables.h b/PWGHF/DataModel/DerivedTables.h index 009dd02c14d..13d3a670fe7 100644 --- a/PWGHF/DataModel/DerivedTables.h +++ b/PWGHF/DataModel/DerivedTables.h @@ -162,6 +162,7 @@ DECLARE_SOA_INDEX_COLUMN(McParticle, mcParticle); //! MC parti DECLARE_SOA_COLUMN(FlagMcMatchGen, flagMcMatchGen, int8_t); //! flag for generator level matching DECLARE_SOA_COLUMN(OriginMcGen, originMcGen, int8_t); //! particle origin, generator level DECLARE_SOA_COLUMN(FlagMcDecayChanGen, flagMcDecayChanGen, int8_t); //! resonant decay channel flag, generator level +DECLARE_SOA_COLUMN(IdxMotherPart, idxMotherPart, int32_t); //! index of the mother particle } // namespace hf_mc_particle // Declares the base table with candidates (Bases). @@ -492,6 +493,7 @@ DECLARE_SOA_COLUMN(MlScoreBkgCharm, mlScoreBkgCharm, float); // DECLARE_SOA_COLUMN(MlScorePromptCharm, mlScorePromptCharm, float); //! ML score for prompt class DECLARE_SOA_COLUMN(MlScoreNonPromptCharm, mlScoreNonPromptCharm, float); //! ML score for non-prompt class DECLARE_SOA_COLUMN(MlScoresCharm, mlScoresCharm, std::vector); //! vector of ML scores +DECLARE_SOA_COLUMN(FlagMcMatchGenCharm, flagMcMatchGenCharm, int8_t); //! flag for generator level matching } // namespace hf_cand_mc_charm // ---------------- @@ -935,6 +937,11 @@ DECLARE_SOA_TABLE_STAGED(HfDstarMcs, "HFDSTMC", //! Table with MC candidate info hf_cand::NTracksDecayed, o2::soa::Marker); +DECLARE_SOA_TABLE_STAGED(HfDstarGenMcs, "HFDSTGENMC", //! Table with MC candidate info for generated D*+ + hf_cand_mc_charm::FlagMcMatchGenCharm, + hf_mc_particle::IdxMotherPart, + o2::soa::Marker); + // ---------------- // Ξc± → (Ξ∓ → (Λ → p π∓) π∓) π± π± // ---------------- diff --git a/PWGHF/TableProducer/derivedDataCreatorDstarToD0Pi.cxx b/PWGHF/TableProducer/derivedDataCreatorDstarToD0Pi.cxx index f1b14a5769f..311cd2f241e 100644 --- a/PWGHF/TableProducer/derivedDataCreatorDstarToD0Pi.cxx +++ b/PWGHF/TableProducer/derivedDataCreatorDstarToD0Pi.cxx @@ -70,6 +70,7 @@ struct HfDerivedDataCreatorDstarToD0Pi { Produces rowCandidateMl; Produces rowCandidateId; Produces rowCandidateMc; + Produces rowCandidateGenMc; // Switches for filling tables HfConfigurableDerivedData confDerData; @@ -79,6 +80,7 @@ struct HfDerivedDataCreatorDstarToD0Pi { Configurable fillCandidateMl{"fillCandidateMl", true, "Fill candidate selection ML scores"}; Configurable fillCandidateId{"fillCandidateId", true, "Fill original indices from the candidate table"}; Configurable fillCandidateMc{"fillCandidateMc", true, "Fill candidate MC info"}; + Configurable fillCandidateGenMc{"fillCandidateGenMc", true, "Fill candidate generator level MC info"}; // Parameters for production of training samples Configurable downSampleBkgFactor{"downSampleBkgFactor", 1., "Fraction of background candidates to keep for ML trainings"}; Configurable ptMaxForDownSample{"ptMaxForDownSample", 10., "Maximum pt for the application of the downsampling factor"}; @@ -204,6 +206,40 @@ struct HfDerivedDataCreatorDstarToD0Pi { } } + template + void processGenMc(CollisionType const& mcCollisions, + o2::framework::Preslice const& mcParticlesPerMcCollision, + ParticleType const& mcParticles, + MatchMap const& matchMap) + { + // Fill MC collision properties + for (const auto& mcCollision : mcCollisions) { + auto thisMcCollId = mcCollision.globalIndex(); + auto particlesThisMcColl = mcParticles.sliceBy(mcParticlesPerMcCollision, thisMcCollId); + auto sizeTablePart = particlesThisMcColl.size(); + LOGF(debug, "MC collision %d has %d MC particles", thisMcCollId, sizeTablePart); + // Skip MC collisions without HF particles (and without HF candidates in matched reconstructed collisions if saving indices of reconstructed collisions matched to MC collisions) + bool isEmpty = (matchMap.find(thisMcCollId) == matchMap.end()) || matchMap.find(thisMcCollId)->second.empty(); + if (sizeTablePart == 0 && isEmpty) { + LOGF(debug, "Skipping MC collision %d", thisMcCollId); + continue; + } + reserveTable(rowCandidateGenMc, fillCandidateGenMc, sizeTablePart); + if (fillCandidateGenMc) { + for (const auto& particle : particlesThisMcColl) { + auto origin = particle.originMcGen(); + int idxMotherPart = 0; + if (origin == RecoDecay::OriginType::NonPrompt) { + idxMotherPart = particle.idxBhadMotherPart(); + } + rowCandidateGenMc( + particle.flagMcMatchGenD0(), + idxMotherPart); + } + } + } + } + template void processCandidates(CollType const& collisions, Partition& candidates, @@ -322,6 +358,7 @@ struct HfDerivedDataCreatorDstarToD0Pi { rowsCommon.preProcessMcCollisions(mcCollisions, mcParticlesPerMcCollision, mcParticles); processCandidates(collisions, candidatesMcSig, tracks, bcs); rowsCommon.processMcParticles(mcCollisions, mcParticlesPerMcCollision, mcParticles, Mass); + processGenMc(mcCollisions, mcParticlesPerMcCollision, mcParticles, rowsCommon.matchedCollisions); } PROCESS_SWITCH(HfDerivedDataCreatorDstarToD0Pi, processMcSig, "Process MC only for signals", false); @@ -335,6 +372,7 @@ struct HfDerivedDataCreatorDstarToD0Pi { rowsCommon.preProcessMcCollisions(mcCollisions, mcParticlesPerMcCollision, mcParticles); processCandidates(collisions, candidatesMcBkg, tracks, bcs); rowsCommon.processMcParticles(mcCollisions, mcParticlesPerMcCollision, mcParticles, Mass); + processGenMc(mcCollisions, mcParticlesPerMcCollision, mcParticles, rowsCommon.matchedCollisions); } PROCESS_SWITCH(HfDerivedDataCreatorDstarToD0Pi, processMcBkg, "Process MC only for background", false); @@ -348,6 +386,7 @@ struct HfDerivedDataCreatorDstarToD0Pi { rowsCommon.preProcessMcCollisions(mcCollisions, mcParticlesPerMcCollision, mcParticles); processCandidates(collisions, candidatesMcAll, tracks, bcs); rowsCommon.processMcParticles(mcCollisions, mcParticlesPerMcCollision, mcParticles, Mass); + processGenMc(mcCollisions, mcParticlesPerMcCollision, mcParticles, rowsCommon.matchedCollisions); } PROCESS_SWITCH(HfDerivedDataCreatorDstarToD0Pi, processMcAll, "Process MC", false); @@ -372,6 +411,7 @@ struct HfDerivedDataCreatorDstarToD0Pi { rowsCommon.preProcessMcCollisions(mcCollisions, mcParticlesPerMcCollision, mcParticles); processCandidates(collisions, candidatesMcMlSig, tracks, bcs); rowsCommon.processMcParticles(mcCollisions, mcParticlesPerMcCollision, mcParticles, Mass); + processGenMc(mcCollisions, mcParticlesPerMcCollision, mcParticles, rowsCommon.matchedCollisions); } PROCESS_SWITCH(HfDerivedDataCreatorDstarToD0Pi, processMcMlSig, "Process MC with ML only for signals", false); @@ -385,6 +425,7 @@ struct HfDerivedDataCreatorDstarToD0Pi { rowsCommon.preProcessMcCollisions(mcCollisions, mcParticlesPerMcCollision, mcParticles); processCandidates(collisions, candidatesMcMlBkg, tracks, bcs); rowsCommon.processMcParticles(mcCollisions, mcParticlesPerMcCollision, mcParticles, Mass); + processGenMc(mcCollisions, mcParticlesPerMcCollision, mcParticles, rowsCommon.matchedCollisions); } PROCESS_SWITCH(HfDerivedDataCreatorDstarToD0Pi, processMcMlBkg, "Process MC with ML only for background", false); @@ -398,6 +439,7 @@ struct HfDerivedDataCreatorDstarToD0Pi { rowsCommon.preProcessMcCollisions(mcCollisions, mcParticlesPerMcCollision, mcParticles); processCandidates(collisions, candidatesMcMlAll, tracks, bcs); rowsCommon.processMcParticles(mcCollisions, mcParticlesPerMcCollision, mcParticles, Mass); + processGenMc(mcCollisions, mcParticlesPerMcCollision, mcParticles, rowsCommon.matchedCollisions); } PROCESS_SWITCH(HfDerivedDataCreatorDstarToD0Pi, processMcMlAll, "Process MC with ML", false); @@ -405,6 +447,7 @@ struct HfDerivedDataCreatorDstarToD0Pi { MatchedGenCandidatesMc const& mcParticles) { rowsCommon.processMcParticles(mcCollisions, mcParticlesPerMcCollision, mcParticles, Mass); + processGenMc(mcCollisions, mcParticlesPerMcCollision, mcParticles, rowsCommon.matchedCollisions); } PROCESS_SWITCH(HfDerivedDataCreatorDstarToD0Pi, processMcGenOnly, "Process MC gen. only", false); }; diff --git a/PWGJE/DataModel/Jet.h b/PWGJE/DataModel/Jet.h index 52939d0b16c..6fe8f4a8f51 100644 --- a/PWGJE/DataModel/Jet.h +++ b/PWGJE/DataModel/Jet.h @@ -237,7 +237,7 @@ using CandidatesDstarMCD = o2::soa::Join; -using CandidatesDstarMCP = o2::soa::Join; +using CandidatesDstarMCP = o2::soa::Join; using CollisionsLc = o2::soa::Join; using CandidatesLcData = o2::soa::Join; diff --git a/PWGJE/TableProducer/derivedDataWriter.cxx b/PWGJE/TableProducer/derivedDataWriter.cxx index 4c382f9abdd..2d401a9b789 100644 --- a/PWGJE/TableProducer/derivedDataWriter.cxx +++ b/PWGJE/TableProducer/derivedDataWriter.cxx @@ -137,6 +137,7 @@ struct JetDerivedDataWriter { Produces storedDstarMcCollisionsMatchingTable; Produces storedDstarParticlesTable; Produces storedDstarParticleIdsTable; + Produces storedDstarGenMcsTable; } productsDstar; struct : ProducesGroup { @@ -653,6 +654,7 @@ struct JetDerivedDataWriter { for (const auto& DstarParticle : dstarParticlesPerMcCollision) { jethfutilities::fillHFCandidateMcTable(DstarParticle, products.productsDstar.storedDstarMcCollisionsTable.lastIndex(), products.productsDstar.storedDstarParticlesTable); products.productsDstar.storedDstarParticleIdsTable(mcCollisionMapping[mcCollision.globalIndex()], particleMapping[DstarParticle.mcParticleId()]); + products.productsDstar.storedDstarGenMcsTable(DstarParticle.flagMcMatchGenCharm(), DstarParticle.idxMotherPart()); } } } diff --git a/PWGJE/Tasks/jetSubstructureHFOutput.cxx b/PWGJE/Tasks/jetSubstructureHFOutput.cxx index d1460d53fc9..4640191a9ad 100644 --- a/PWGJE/Tasks/jetSubstructureHFOutput.cxx +++ b/PWGJE/Tasks/jetSubstructureHFOutput.cxx @@ -74,6 +74,8 @@ struct JetSubstructureHFOutputTask { Produces hfParticlesTable; } products; + Produces storedDstarGenMcsTable; + struct : ConfigurableGroup { Configurable jetPtMinData{"jetPtMinData", 0.0, "minimum jet pT cut for data jets"}; Configurable jetPtMinDataSub{"jetPtMinDataSub", 0.0, "minimum jet pT cut for eventwise constituent subtracted data jets"}; @@ -370,6 +372,9 @@ struct JetSubstructureHFOutputTask { } jetcandidateutilities::fillCandidateMcTable(candidate, candidateCollisionIndex, products.hfParticlesTable); candidateMap.insert(std::make_pair(candidate.globalIndex(), products.hfParticlesTable.lastIndex())); + if constexpr (jethfutilities::isDstarMcCandidate()) { + storedDstarGenMcsTable(candidate.flagMcMatchGenCharm(), candidate.idxMotherPart()); + } } else { auto hfCollisionIndex = candidateCollisionMapping.find(jetcandidateutilities::getCandidateCollisionId(candidate)); if (hfCollisionIndex != candidateCollisionMapping.end()) {