diff --git a/PWGHF/TableProducer/treeCreatorToXiPiQa.cxx b/PWGHF/TableProducer/treeCreatorToXiPiQa.cxx index 2e219e14355..000c7d09b6e 100644 --- a/PWGHF/TableProducer/treeCreatorToXiPiQa.cxx +++ b/PWGHF/TableProducer/treeCreatorToXiPiQa.cxx @@ -17,6 +17,7 @@ /// \author Krista Smith , Pusan National University #include "PWGHF/Core/CentralityEstimation.h" +#include "PWGHF/Core/DecayChannelsLegacy.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" @@ -38,6 +39,7 @@ using namespace o2; using namespace o2::framework; +using namespace o2::framework::expressions; // SV Reco method enum { @@ -124,6 +126,8 @@ DECLARE_SOA_COLUMN(EtaPiFromCasc, etaPiFromCasc, float); DECLARE_SOA_COLUMN(EtaPiFromCharmBaryon, etaPiFromCharmBaryon, float); DECLARE_SOA_COLUMN(EtaCharmBaryon, etaCharmBaryon, float); DECLARE_SOA_COLUMN(EtaCascade, etaCascade, float); +DECLARE_SOA_COLUMN(PhiCharmBaryon, phiCharmBaryon, float); +DECLARE_SOA_COLUMN(YCharmBaryon, yCharmBaryon, float); DECLARE_SOA_COLUMN(EtaV0, etaV0, float); DECLARE_SOA_COLUMN(DcaXYToPvV0Dau0, dcaXYToPvV0Dau0, float); DECLARE_SOA_COLUMN(DcaXYToPvV0Dau1, dcaXYToPvV0Dau1, float); @@ -212,6 +216,8 @@ DECLARE_SOA_COLUMN(CascChi2OverNdf, cascChi2OverNdf, float); DECLARE_SOA_COLUMN(XicChi2OverNdf, xicChi2OverNdf, float); DECLARE_SOA_COLUMN(MassV0Chi2OverNdf, massV0Chi2OverNdf, float); DECLARE_SOA_COLUMN(MassCascChi2OverNdf, massCascChi2OverNdf, float); +// MC +DECLARE_SOA_COLUMN(ParticlePdg, particlePdg, int); } // namespace full DECLARE_SOA_TABLE(HfToXiPiEvs, "AOD", "HFTOXIPIEV", @@ -303,6 +309,15 @@ DECLARE_SOA_TABLE(HfKfXicFulls, "AOD", "HFKFXICFULL", full::ResultSelections, full::FlagMcMatchRec, full::DebugMcRec, full::OriginRec, full::CollisionMatched); +DECLARE_SOA_TABLE(HfCandToXiPiGen, "AOD", "HFCANDTOXIPIGEN", + full::InvMassCharmBaryon, + full::PtCharmBaryon, + full::EtaCharmBaryon, + full::PhiCharmBaryon, + full::YCharmBaryon, + full::FlagMcMatchRec, + full::OriginRec, + full::ParticlePdg) } // namespace o2::aod /// Writes the full information in an output TTree @@ -311,15 +326,21 @@ struct HfTreeCreatorToXiPiQa { Produces rowCandidateFull; Produces rowCandidateLite; Produces rowKfCandidate; + Produces rowCandidateParticles; Produces rowEv; Configurable zPvCut{"zPvCut", 10., "Cut on absolute value of primary vertex z coordinate"}; + Configurable genSelection{"genSelection", o2::aod::hf_cand_xic0_omegac0::DecayType::XiczeroToXiPi, "Decay channel to be used to match particle information"}; + Configurable fillGenTable{"fillGenTable", true, "Fill generated MC information if requested"}; using MyTrackTable = soa::Join; using MyEventTable = soa::Join; using MyEventTableWithFT0C = soa::Join; using MyEventTableWithFT0M = soa::Join; using MyEventTableWithNTracksPV = soa::Join; + using MatchedGenXiPi = soa::Filtered>; + + Filter filterGenXiPi = nabs(aod::hf_cand_mc_flag::flagMcMatchGen) == static_cast(BIT(genSelection)); void init(InitContext const&) { @@ -611,6 +632,19 @@ struct HfTreeCreatorToXiPiQa { } } + template + void fillParticle(const T& particle, double massCharmBaryon) + { + rowCandidateParticles(RecoDecay::m(particle.pVector(), particle.e()), + particle.pt(), + particle.eta(), + particle.phi(), + RecoDecay::y(particle.pVector(), massCharmBaryon), + particle.flagMcMatchGen(), + particle.originMcGen(), + particle.pdgCode()); + } + //////////////////////////////////// // // // Process functions // @@ -783,8 +817,10 @@ struct HfTreeCreatorToXiPiQa { //*~~~~~~~MC with DCAFitter~~~~~~~~*// //*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*// - void processMcFullXic0(MyEventTable const& collisions, MyTrackTable const&, - soa::Join const& candidates) + void processMcFullXic0(MyEventTable const& collisions, + MyTrackTable const&, + soa::Join const& candidates, + MatchedGenXiPi const& mcParticles) { // Filling event properties rowEv.reserve(collisions.size()); @@ -797,10 +833,20 @@ struct HfTreeCreatorToXiPiQa { for (const auto& candidate : candidates) { fillCandidate(candidate, candidate.flagMcMatchRec(), candidate.debugMcRec(), candidate.originMcRec(), candidate.collisionMatched()); } + + // Filling particle properties if requested + if (fillGenTable) { + rowCandidateParticles.reserve(mcParticles.size()); + for (const auto& particle : mcParticles) { + fillParticle(particle, o2::constants::physics::MassXiC0); + } + } } - void processMcFullOmegac0(MyEventTable const& collisions, MyTrackTable const&, - soa::Join const& candidates) + void processMcFullOmegac0(MyEventTable const& collisions, + MyTrackTable const&, + soa::Join const& candidates, + MatchedGenXiPi const& mcParticles) { // Filling event properties rowEv.reserve(collisions.size()); @@ -813,10 +859,20 @@ struct HfTreeCreatorToXiPiQa { for (const auto& candidate : candidates) { fillCandidate(candidate, candidate.flagMcMatchRec(), candidate.debugMcRec(), candidate.originMcRec(), candidate.collisionMatched()); } + + // Filling particle properties if requested + if (fillGenTable) { + rowCandidateParticles.reserve(mcParticles.size()); + for (const auto& particle : mcParticles) { + fillParticle(particle, o2::constants::physics::MassOmegaC0); + } + } } - void processMcLiteXic0(MyEventTable const& collisions, MyTrackTable const&, - soa::Join const& candidates) + void processMcLiteXic0(MyEventTable const& collisions, + MyTrackTable const&, + soa::Join const& candidates, + MatchedGenXiPi const& mcParticles) { // Filling event properties rowEv.reserve(collisions.size()); @@ -829,10 +885,20 @@ struct HfTreeCreatorToXiPiQa { for (const auto& candidate : candidates) { fillCandidate(candidate, candidate.flagMcMatchRec(), -7, candidate.originMcRec(), candidate.collisionMatched()); } + + // Filling particle properties if requested + if (fillGenTable) { + rowCandidateParticles.reserve(mcParticles.size()); + for (const auto& particle : mcParticles) { + fillParticle(particle, o2::constants::physics::MassXiC0); + } + } } - void processMcLiteXic0WithFT0C(MyEventTableWithFT0C const& collisions, MyTrackTable const&, - soa::Join const& candidates) + void processMcLiteXic0WithFT0C(MyEventTableWithFT0C const& collisions, + MyTrackTable const&, + soa::Join const& candidates, + MatchedGenXiPi const& mcParticles) { // Filling event properties rowEv.reserve(collisions.size()); @@ -845,10 +911,20 @@ struct HfTreeCreatorToXiPiQa { for (const auto& candidate : candidates) { fillCandidate(candidate, candidate.flagMcMatchRec(), -7, candidate.originMcRec(), candidate.collisionMatched()); } + + // Filling particle properties if requested + if (fillGenTable) { + rowCandidateParticles.reserve(mcParticles.size()); + for (const auto& particle : mcParticles) { + fillParticle(particle, o2::constants::physics::MassXiC0); + } + } } - void processMcLiteXic0WithFT0M(MyEventTableWithFT0M const& collisions, MyTrackTable const&, - soa::Join const& candidates) + void processMcLiteXic0WithFT0M(MyEventTableWithFT0M const& collisions, + MyTrackTable const&, + soa::Join const& candidates, + MatchedGenXiPi const& mcParticles) { // Filling event properties rowEv.reserve(collisions.size()); @@ -861,10 +937,20 @@ struct HfTreeCreatorToXiPiQa { for (const auto& candidate : candidates) { fillCandidate(candidate, candidate.flagMcMatchRec(), -7, candidate.originMcRec(), candidate.collisionMatched()); } + + // Filling particle properties if requested + if (fillGenTable) { + rowCandidateParticles.reserve(mcParticles.size()); + for (const auto& particle : mcParticles) { + fillParticle(particle, o2::constants::physics::MassXiC0); + } + } } - void processMcLiteXic0WithNTracksPV(MyEventTableWithNTracksPV const& collisions, MyTrackTable const&, - soa::Join const& candidates) + void processMcLiteXic0WithNTracksPV(MyEventTableWithNTracksPV const& collisions, + MyTrackTable const&, + soa::Join const& candidates, + MatchedGenXiPi const& mcParticles) { // Filling event properties rowEv.reserve(collisions.size()); @@ -877,10 +963,20 @@ struct HfTreeCreatorToXiPiQa { for (const auto& candidate : candidates) { fillCandidate(candidate, candidate.flagMcMatchRec(), -7, candidate.originMcRec(), candidate.collisionMatched()); } + + // Filling particle properties if requested + if (fillGenTable) { + rowCandidateParticles.reserve(mcParticles.size()); + for (const auto& particle : mcParticles) { + fillParticle(particle, o2::constants::physics::MassXiC0); + } + } } - void processMcLiteOmegac0(MyEventTable const& collisions, MyTrackTable const&, - soa::Join const& candidates) + void processMcLiteOmegac0(MyEventTable const& collisions, + MyTrackTable const&, + soa::Join const& candidates, + MatchedGenXiPi const& mcParticles) { // Filling event properties rowEv.reserve(collisions.size()); @@ -893,6 +989,14 @@ struct HfTreeCreatorToXiPiQa { for (const auto& candidate : candidates) { fillCandidate(candidate, candidate.flagMcMatchRec(), -7, candidate.originMcRec(), candidate.collisionMatched()); } + + // Filling particle properties if requested + if (fillGenTable) { + rowCandidateParticles.reserve(mcParticles.size()); + for (const auto& particle : mcParticles) { + fillParticle(particle, o2::constants::physics::MassOmegaC0); + } + } } PROCESS_SWITCH(HfTreeCreatorToXiPiQa, processMcFullXic0, "Process MC with full information for xic0 w/o centrality", false); @@ -906,8 +1010,10 @@ struct HfTreeCreatorToXiPiQa { //*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*// //*~~~~~~~MC with KFParticle~~~~~~~~*// //*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*// - void processKfMcXic0(MyEventTable const& collisions, MyTrackTable const&, - soa::Join const& candidates) + void processKfMcXic0(MyEventTable const& collisions, + MyTrackTable const&, + soa::Join const& candidates, + MatchedGenXiPi const& mcParticles) { // Filling event properties rowEv.reserve(collisions.size()); @@ -920,10 +1026,20 @@ struct HfTreeCreatorToXiPiQa { for (const auto& candidate : candidates) { fillCandidate(candidate, candidate.flagMcMatchRec(), candidate.debugMcRec(), candidate.originMcRec(), candidate.collisionMatched()); } + + // Filling particle properties if requested + if (fillGenTable) { + rowCandidateParticles.reserve(mcParticles.size()); + for (const auto& particle : mcParticles) { + fillParticle(particle, o2::constants::physics::MassXiC0); + } + } } - void processKfMcXic0WithFT0C(MyEventTableWithFT0C const& collisions, MyTrackTable const&, - soa::Join const& candidates) + void processKfMcXic0WithFT0C(MyEventTableWithFT0C const& collisions, + MyTrackTable const&, + soa::Join const& candidates, + MatchedGenXiPi const& mcParticles) { // Filling event properties rowEv.reserve(collisions.size()); @@ -936,10 +1052,20 @@ struct HfTreeCreatorToXiPiQa { for (const auto& candidate : candidates) { fillCandidate(candidate, candidate.flagMcMatchRec(), candidate.debugMcRec(), candidate.originMcRec(), candidate.collisionMatched()); } + + // Filling particle properties if requested + if (fillGenTable) { + rowCandidateParticles.reserve(mcParticles.size()); + for (const auto& particle : mcParticles) { + fillParticle(particle, o2::constants::physics::MassXiC0); + } + } } - void processKfMcXic0WithFT0M(MyEventTableWithFT0M const& collisions, MyTrackTable const&, - soa::Join const& candidates) + void processKfMcXic0WithFT0M(MyEventTableWithFT0M const& collisions, + MyTrackTable const&, + soa::Join const& candidates, + MatchedGenXiPi const& mcParticles) { // Filling event properties rowEv.reserve(collisions.size()); @@ -952,10 +1078,20 @@ struct HfTreeCreatorToXiPiQa { for (const auto& candidate : candidates) { fillCandidate(candidate, candidate.flagMcMatchRec(), candidate.debugMcRec(), candidate.originMcRec(), candidate.collisionMatched()); } + + // Filling particle properties if requested + if (fillGenTable) { + rowCandidateParticles.reserve(mcParticles.size()); + for (const auto& particle : mcParticles) { + fillParticle(particle, o2::constants::physics::MassXiC0); + } + } } - void processKfMcXic0WithNTracksPV(MyEventTableWithNTracksPV const& collisions, MyTrackTable const&, - soa::Join const& candidates) + void processKfMcXic0WithNTracksPV(MyEventTableWithNTracksPV const& collisions, + MyTrackTable const&, + soa::Join const& candidates, + MatchedGenXiPi const& mcParticles) { // Filling event properties rowEv.reserve(collisions.size()); @@ -968,6 +1104,14 @@ struct HfTreeCreatorToXiPiQa { for (const auto& candidate : candidates) { fillCandidate(candidate, candidate.flagMcMatchRec(), candidate.debugMcRec(), candidate.originMcRec(), candidate.collisionMatched()); } + + // Filling particle properties if requested + if (fillGenTable) { + rowCandidateParticles.reserve(mcParticles.size()); + for (const auto& particle : mcParticles) { + fillParticle(particle, o2::constants::physics::MassXiC0); + } + } } PROCESS_SWITCH(HfTreeCreatorToXiPiQa, processKfMcXic0, "Process MC with information for xic0", false);