From 6b37335208f3762144e823ae4680d76329a9ca00 Mon Sep 17 00:00:00 2001 From: Victor Date: Sat, 30 Aug 2025 21:20:57 +0200 Subject: [PATCH] [PWGCF] DptDpt - Proper handling of new event selection at Gen level --- PWGCF/TableProducer/dptDptFilter.cxx | 34 +++++++++++++-------- PWGCF/TableProducer/dptDptFilter.h | 44 ++++++++++++++++------------ 2 files changed, 47 insertions(+), 31 deletions(-) diff --git a/PWGCF/TableProducer/dptDptFilter.cxx b/PWGCF/TableProducer/dptDptFilter.cxx index 0aab214d083..a07876a8edb 100644 --- a/PWGCF/TableProducer/dptDptFilter.cxx +++ b/PWGCF/TableProducer/dptDptFilter.cxx @@ -539,6 +539,7 @@ struct DptDptFilter { Produces gencollisionsinfo; Multiplicity multiplicity; + Preslice perCollision = aod::track::collisionId; void init(InitContext const&) { @@ -737,29 +738,33 @@ struct DptDptFilter { template bool processGenerated(CollisionObject const& mccollision, ParticlesList const& mcparticles, float centormult); - template + template void processGeneratorLevel(aod::McCollision const& mccollision, CollisionsGroup const& collisions, aod::McParticles const& mcparticles, AllCollisions const& allcollisions, + AllTracks const& alltracks, float defaultcent); void processWithCentGeneratorLevel(aod::McCollision const& mccollision, soa::SmallGroups> const& collisions, aod::McParticles const& mcparticles, - aod::CollisionsEvSelCent const& allcollisions); + aod::CollisionsEvSelCent const& allcollisions, + DptDptFullTracksDetLevel const& alltracks); PROCESS_SWITCH(DptDptFilter, processWithCentGeneratorLevel, "Process generated with centrality", false); void processWithRun2CentGeneratorLevel(aod::McCollision const& mccollision, soa::SmallGroups> const& collisions, aod::McParticles const& mcparticles, - aod::CollisionsEvSelRun2Cent const& allcollisions); + aod::CollisionsEvSelRun2Cent const& allcollisions, + DptDptFullTracksDetLevel const& alltracks); PROCESS_SWITCH(DptDptFilter, processWithRun2CentGeneratorLevel, "Process generated with centrality", false); void processWithoutCentGeneratorLevel(aod::McCollision const& mccollision, soa::SmallGroups> const& collisions, aod::McParticles const& mcparticles, - aod::CollisionsEvSel const& allcollisions); + aod::CollisionsEvSel const& allcollisions, + DptDptFullTracksDetLevel const& alltracks); PROCESS_SWITCH(DptDptFilter, processWithoutCentGeneratorLevel, "Process generated without centrality", false); void processOnTheFlyGeneratorLevel(aod::McCollision const& mccollision, @@ -908,11 +913,12 @@ bool DptDptFilter::processGenerated(CollisionObject const& mccollision, Particle return static_cast(acceptedevent); } -template +template void DptDptFilter::processGeneratorLevel(aod::McCollision const& mccollision, CollisionsGroup const& collisions, aod::McParticles const& mcparticles, AllCollisions const& allcollisions, + AllTracks const& alltracks, float defaultcent) { using namespace dptdptfilter; @@ -928,6 +934,8 @@ void DptDptFilter::processGeneratorLevel(aod::McCollision const& mccollision, if (tmpcollision.has_mcCollision()) { if (tmpcollision.mcCollisionId() == mccollision.globalIndex()) { typename AllCollisions::iterator const& collision = allcollisions.iteratorAt(tmpcollision.globalIndex()); + auto collisionTracks = alltracks.sliceBy(perCollision, collision.globalIndex()); + storeMultiplicitiesAndCentralities(collision, collisionTracks); if (isEventSelected(collision, defaultcent)) { if (processGenerated(mccollision, mcparticles, defaultcent)) { fhTrueVertexZAA->Fill((mccollision.posZ())); @@ -946,25 +954,28 @@ void DptDptFilter::processGeneratorLevel(aod::McCollision const& mccollision, void DptDptFilter::processWithCentGeneratorLevel(aod::McCollision const& mccollision, soa::SmallGroups> const& collisions, aod::McParticles const& mcparticles, - aod::CollisionsEvSelCent const& allcollisions) + aod::CollisionsEvSelCent const& allcollisions, + DptDptFullTracksDetLevel const& alltracks) { - processGeneratorLevel(mccollision, collisions, mcparticles, allcollisions, 50.0); + processGeneratorLevel(mccollision, collisions, mcparticles, allcollisions, alltracks, 50.0); } void DptDptFilter::processWithRun2CentGeneratorLevel(aod::McCollision const& mccollision, soa::SmallGroups> const& collisions, aod::McParticles const& mcparticles, - aod::CollisionsEvSelRun2Cent const& allcollisions) + aod::CollisionsEvSelRun2Cent const& allcollisions, + DptDptFullTracksDetLevel const& alltracks) { - processGeneratorLevel(mccollision, collisions, mcparticles, allcollisions, 50.0); + processGeneratorLevel(mccollision, collisions, mcparticles, allcollisions, alltracks, 50.0); } void DptDptFilter::processWithoutCentGeneratorLevel(aod::McCollision const& mccollision, soa::SmallGroups> const& collisions, aod::McParticles const& mcparticles, - aod::CollisionsEvSel const& allcollisions) + aod::CollisionsEvSel const& allcollisions, + DptDptFullTracksDetLevel const& alltracks) { - processGeneratorLevel(mccollision, collisions, mcparticles, allcollisions, 50.0); + processGeneratorLevel(mccollision, collisions, mcparticles, allcollisions, alltracks, 50.0); } void DptDptFilter::processOnTheFlyGeneratorLevel(aod::McCollision const& mccollision, @@ -1016,7 +1027,6 @@ T computeRMS(std::vector& vec) } struct DptDptFilterTracks { - Produces scannedtracks; Produces tracksinfo; Produces scannedgentracks; diff --git a/PWGCF/TableProducer/dptDptFilter.h b/PWGCF/TableProducer/dptDptFilter.h index d79924724f2..e883e6bfdfe 100644 --- a/PWGCF/TableProducer/dptDptFilter.h +++ b/PWGCF/TableProducer/dptDptFilter.h @@ -1287,17 +1287,21 @@ inline bool centralitySelection(aod::McCollision const&, float /// @brief evalues the exclusion formula for the current multiplicity / centrality parameters /// @return true if the collision is not excluded according to the formula false otherwise /// WARNING: it has always to be called after filling the multiplicity / centrality observables +/// NOTE: for MC generator level does nothing, as expected +template inline bool isCollisionNotExcluded() { bool notExcluded = true; - if (useCentralityMultiplicityCorrelationsExclusion) { - [&]() { - /* set the formula parameter values */ - for (size_t iPar = 0; iPar < observableIndexForCentralityMultiplicityParameter.size(); ++iPar) { - multiplicityCentralityCorrelationsExclusion->SetParameter(iPar, collisionMultiplicityCentralityObservables[observableIndexForCentralityMultiplicityParameter[iPar]]); - } - }(); - notExcluded = multiplicityCentralityCorrelationsExclusion->Eval() != 0; + if constexpr (!framework::has_type_v) { + if (useCentralityMultiplicityCorrelationsExclusion) { + [&]() { + /* set the formula parameter values */ + for (size_t iPar = 0; iPar < observableIndexForCentralityMultiplicityParameter.size(); ++iPar) { + multiplicityCentralityCorrelationsExclusion->SetParameter(iPar, collisionMultiplicityCentralityObservables[observableIndexForCentralityMultiplicityParameter[iPar]]); + } + }(); + notExcluded = multiplicityCentralityCorrelationsExclusion->Eval() != 0; + } } collisionFlags.set(CollSelMULTCORRELATIONS, notExcluded); return notExcluded; @@ -1405,20 +1409,22 @@ inline bool isEventSelected(CollisionObject const& collision, float& centormult) bool trigsel = triggerSelection(collision); - bool rctsel = false; + /* run condition table information */ + bool rctsel = true; if (useRctInformation) { - if constexpr (framework::has_type_v) { - if (rctChecker.checkTable(collision)) { - rctsel = true; - collisionFlags.set(CollSelRCTBIT); - } + if constexpr (framework::has_type_v) { + /* RCT condition not considered for generator level */ } else { - LOGF(fatal, "RCT check required but the dataset does not have RCT information associated. Please, fix it"); + if constexpr (framework::has_type_v) { + if (!rctChecker.checkTable(collision)) { + rctsel = false; + } + } else { + LOGF(fatal, "RCT check required but the dataset does not have RCT information associated. Please, fix it"); + } } - } else { - collisionFlags.set(CollSelRCTBIT); - rctsel = true; } + collisionFlags.set(CollSelRCTBIT, rctsel); bool occupancysel = occupancySelection(collision); @@ -1439,7 +1445,7 @@ inline bool isEventSelected(CollisionObject const& collision, float& centormult) bool centmultsel = centralitySelection(collision, centormult); - bool centmultexclusion = isCollisionNotExcluded(); + bool centmultexclusion = isCollisionNotExcluded(); bool accepted = trigsel && rctsel && occupancysel && zvtxsel && centmultsel && centmultexclusion;