diff --git a/PWGHF/HFC/TableProducer/derivedDataCreatorCorrelationsReduced.cxx b/PWGHF/HFC/TableProducer/derivedDataCreatorCorrelationsReduced.cxx index 3efa36a6d9f..73157c06d08 100644 --- a/PWGHF/HFC/TableProducer/derivedDataCreatorCorrelationsReduced.cxx +++ b/PWGHF/HFC/TableProducer/derivedDataCreatorCorrelationsReduced.cxx @@ -17,7 +17,6 @@ #include "PWGHF/Core/CentralityEstimation.h" #include "PWGHF/Core/DecayChannels.h" -#include "PWGHF/Core/HfHelper.h" #include "PWGHF/DataModel/AliasTables.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" @@ -33,7 +32,6 @@ #include #include -#include #include #include #include @@ -157,7 +155,8 @@ struct HfDerivedDataCreatorCorrelationsReduced { void init(InitContext&) { - hfEvSel.addHistograms(registry); // collision monitoring + hfEvSel.init(registry); + ccdb->setURL(ccdbUrl); ccdb->setCaching(true); ccdb->setLocalObjectValidityChecking(); @@ -176,7 +175,7 @@ struct HfDerivedDataCreatorCorrelationsReduced { return; } - hfcFlowHelper.init(ccdb, registry, classesMl, yCandMax.value); + hfcFlowHelper.init(classesMl, yCandMax.value); const AxisSpec axisTpcSignal = {binsTpcSignal, "TPC Signal"}; const AxisSpec axisCent = {binsCent, "Centrality"}; @@ -209,32 +208,6 @@ struct HfDerivedDataCreatorCorrelationsReduced { } }; // end init - /// Check event selections for collision and fill the collision table - /// \param collision is the collision - template - bool checkCollision(Coll const& collision, float& cent, float& mult) - { - o2::hf_evsel::HfCollisionRejectionMask collRejMask{}; - if (centEstimator == CentralityEstimator::FT0A) { - collRejMask = hfEvSel.getHfCollisionRejectionMask(collision, cent, ccdb, registry); - mult = collision.multFT0A(); - } else if (centEstimator == CentralityEstimator::FT0C) { - collRejMask = hfEvSel.getHfCollisionRejectionMask(collision, cent, ccdb, registry); - mult = collision.multFT0C(); - } else if (centEstimator == CentralityEstimator::FT0M) { - collRejMask = hfEvSel.getHfCollisionRejectionMask(collision, cent, ccdb, registry); - mult = collision.multFT0M(); - } else if (centEstimator == CentralityEstimator::FV0A) { - collRejMask = hfEvSel.getHfCollisionRejectionMask(collision, cent, ccdb, registry); - mult = collision.multFV0A(); - } else { - LOG(fatal) << "Centrality estimator not recognized for collision selection"; - std::abort(); - } - hfEvSel.fillHistograms(collision, collRejMask, cent); - return collRejMask == 0; - } - /// Checks if the trigger cand-associated track pair can be accepted for SE correlation /// \param assTrk is the associated track /// \param cand is the trigger candidate @@ -404,7 +377,8 @@ struct HfDerivedDataCreatorCorrelationsReduced { return; } float cent{-1.}, mult{-1.}; - if (!checkCollision(coll, cent, mult)) { + auto centDetector = static_cast(centEstimator.value); + if (!hfcFlowHelper.selectRecoCollision(hfEvSel, ccdb, registry, coll, centDetector, cent, mult)) { return; } rowCollisions(mult, coll.numContrib(), cent, coll.posZ()); @@ -421,7 +395,8 @@ struct HfDerivedDataCreatorCorrelationsReduced { return; } float cent{-1.}, mult{-1.}; - if (!checkCollision(coll, cent, mult)) { + auto centDetector = static_cast(centEstimator.value); + if (!hfcFlowHelper.selectRecoCollision(hfEvSel, ccdb, registry, coll, centDetector, cent, mult)) { return; } rowCollisions(mult, coll.numContrib(), cent, coll.posZ()); @@ -441,7 +416,8 @@ struct HfDerivedDataCreatorCorrelationsReduced { return; } float cent{-1.}, mult{-1.}; - if (!checkCollision(coll, cent, mult)) { + auto centDetector = static_cast(centEstimator.value); + if (!hfcFlowHelper.selectRecoCollision(hfEvSel, ccdb, registry, coll, centDetector, cent, mult)) { return; } rowCollisions(mult, coll.numContrib(), cent, coll.posZ()); @@ -461,7 +437,8 @@ struct HfDerivedDataCreatorCorrelationsReduced { return; } float cent{-1.}, mult{-1.}; - if (!checkCollision(coll, cent, mult)) { + auto centDetector = static_cast(centEstimator.value); + if (!hfcFlowHelper.selectRecoCollision(hfEvSel, ccdb, registry, coll, centDetector, cent, mult)) { return; } rowCollisions(mult, coll.numContrib(), cent, coll.posZ()); @@ -482,7 +459,8 @@ struct HfDerivedDataCreatorCorrelationsReduced { return; } float cent{-1.}, mult{-1.}; - if (!checkCollision(coll, cent, mult)) { + auto centDetector = static_cast(centEstimator.value); + if (!hfcFlowHelper.selectRecoCollision(hfEvSel, ccdb, registry, coll, centDetector, cent, mult)) { return; } rowCollisions(mult, coll.numContrib(), cent, coll.posZ()); @@ -502,7 +480,8 @@ struct HfDerivedDataCreatorCorrelationsReduced { return; } float cent{-1.}, mult{-1.}; - if (!checkCollision(coll, cent, mult)) { + auto centDetector = static_cast(centEstimator.value); + if (!hfcFlowHelper.selectRecoCollision(hfEvSel, ccdb, registry, coll, centDetector, cent, mult)) { return; } rowCollisions(mult, coll.numContrib(), cent, coll.posZ()); @@ -523,7 +502,8 @@ struct HfDerivedDataCreatorCorrelationsReduced { return; } float cent{-1.}, mult{-1.}; - if (!checkCollision(coll, cent, mult)) { + auto centDetector = static_cast(centEstimator.value); + if (!hfcFlowHelper.selectRecoCollision(hfEvSel, ccdb, registry, coll, centDetector, cent, mult)) { return; } rowCollisions(mult, coll.numContrib(), cent, coll.posZ()); @@ -543,7 +523,8 @@ struct HfDerivedDataCreatorCorrelationsReduced { return; } float cent{-1.}, mult{-1.}; - if (!checkCollision(coll, cent, mult)) { + auto centDetector = static_cast(centEstimator.value); + if (!hfcFlowHelper.selectRecoCollision(hfEvSel, ccdb, registry, coll, centDetector, cent, mult)) { return; } rowCollisions(mult, coll.numContrib(), cent, coll.posZ()); @@ -564,7 +545,8 @@ struct HfDerivedDataCreatorCorrelationsReduced { return; } float cent{-1.}, mult{-1.}; - if (!checkCollision(coll, cent, mult)) { + auto centDetector = static_cast(centEstimator.value); + if (!hfcFlowHelper.selectRecoCollision(hfEvSel, ccdb, registry, coll, centDetector, cent, mult)) { return; } rowCollisions(mult, coll.numContrib(), cent, coll.posZ()); @@ -582,7 +564,8 @@ struct HfDerivedDataCreatorCorrelationsReduced { return; } float cent{-1.}, mult{-1.}; - if (!checkCollision(coll, cent, mult)) { + auto centDetector = static_cast(centEstimator.value); + if (!hfcFlowHelper.selectRecoCollision(hfEvSel, ccdb, registry, coll, centDetector, cent, mult)) { return; } rowCollisions(mult, coll.numContrib(), cent, coll.posZ()); @@ -602,7 +585,8 @@ struct HfDerivedDataCreatorCorrelationsReduced { return; } float cent{-1.}, mult{-1.}; - if (!checkCollision(coll, cent, mult)) { + auto centDetector = static_cast(centEstimator.value); + if (!hfcFlowHelper.selectRecoCollision(hfEvSel, ccdb, registry, coll, centDetector, cent, mult)) { return; } rowCollisions(mult, coll.numContrib(), cent, coll.posZ()); @@ -622,7 +606,8 @@ struct HfDerivedDataCreatorCorrelationsReduced { return; } float cent{-1.}, mult{-1.}; - if (!checkCollision(coll, cent, mult)) { + auto centDetector = static_cast(centEstimator.value); + if (!hfcFlowHelper.selectRecoCollision(hfEvSel, ccdb, registry, coll, centDetector, cent, mult)) { return; } rowCollisions(mult, coll.numContrib(), cent, coll.posZ()); @@ -643,7 +628,8 @@ struct HfDerivedDataCreatorCorrelationsReduced { return; } float cent{-1.}, mult{-1.}; - if (!checkCollision(coll, cent, mult)) { + auto centDetector = static_cast(centEstimator.value); + if (!hfcFlowHelper.selectRecoCollision(hfEvSel, ccdb, registry, coll, centDetector, cent, mult)) { return; } rowCollisions(mult, coll.numContrib(), cent, coll.posZ()); @@ -663,7 +649,8 @@ struct HfDerivedDataCreatorCorrelationsReduced { return; } float cent{-1.}, mult{-1.}; - if (!checkCollision(coll, cent, mult)) { + auto centDetector = static_cast(centEstimator.value); + if (!hfcFlowHelper.selectRecoCollision(hfEvSel, ccdb, registry, coll, centDetector, cent, mult)) { return; } rowCollisions(mult, coll.numContrib(), cent, coll.posZ()); @@ -684,7 +671,8 @@ struct HfDerivedDataCreatorCorrelationsReduced { return; } float cent{-1.}, mult{-1.}; - if (!checkCollision(coll, cent, mult)) { + auto centDetector = static_cast(centEstimator.value); + if (!hfcFlowHelper.selectRecoCollision(hfEvSel, ccdb, registry, coll, centDetector, cent, mult)) { return; } rowCollisions(mult, coll.numContrib(), cent, coll.posZ()); @@ -704,7 +692,8 @@ struct HfDerivedDataCreatorCorrelationsReduced { return; } float cent{-1.}, mult{-1.}; - if (!checkCollision(coll, cent, mult)) { + auto centDetector = static_cast(centEstimator.value); + if (!hfcFlowHelper.selectRecoCollision(hfEvSel, ccdb, registry, coll, centDetector, cent, mult)) { return; } rowCollisions(mult, coll.numContrib(), cent, coll.posZ()); @@ -720,7 +709,8 @@ struct HfDerivedDataCreatorCorrelationsReduced { TracksData const& tracks) { float cent{-1.}, mult{-1.}; - if (!checkCollision(coll, cent, mult)) { + auto centDetector = static_cast(centEstimator.value); + if (!hfcFlowHelper.selectRecoCollision(hfEvSel, ccdb, registry, coll, centDetector, cent, mult)) { return; } rowCollisions(mult, coll.numContrib(), cent, coll.posZ()); @@ -733,7 +723,8 @@ struct HfDerivedDataCreatorCorrelationsReduced { TracksData const& tracks) { float cent{-1.}, mult{-1.}; - if (!checkCollision(coll, cent, mult)) { + auto centDetector = static_cast(centEstimator.value); + if (!hfcFlowHelper.selectRecoCollision(hfEvSel, ccdb, registry, coll, centDetector, cent, mult)) { return; } rowCollisions(mult, coll.numContrib(), cent, coll.posZ()); @@ -747,7 +738,8 @@ struct HfDerivedDataCreatorCorrelationsReduced { TracksMc const& tracks) { float cent{-1.}, mult{-1.}; - if (!checkCollision(coll, cent, mult)) { + auto centDetector = static_cast(centEstimator.value); + if (!hfcFlowHelper.selectRecoCollision(hfEvSel, ccdb, registry, coll, centDetector, cent, mult)) { return; } rowCollisions(mult, coll.numContrib(), cent, coll.posZ()); @@ -760,7 +752,8 @@ struct HfDerivedDataCreatorCorrelationsReduced { TracksMc const& tracks) { float cent{-1.}, mult{-1.}; - if (!checkCollision(coll, cent, mult)) { + auto centDetector = static_cast(centEstimator.value); + if (!hfcFlowHelper.selectRecoCollision(hfEvSel, ccdb, registry, coll, centDetector, cent, mult)) { return; } rowCollisions(mult, coll.numContrib(), cent, coll.posZ()); @@ -769,7 +762,7 @@ struct HfDerivedDataCreatorCorrelationsReduced { PROCESS_SWITCH(HfDerivedDataCreatorCorrelationsReduced, processMcHadronHadronME, "Process Mixed Event for hadron candidates", false); }; -WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +WorkflowSpec defineDataProcessing(ConfigContext const& context) { - return WorkflowSpec{adaptAnalysisTask(cfgc)}; + return WorkflowSpec{adaptAnalysisTask(context)}; } diff --git a/PWGHF/HFC/Tasks/taskCorrelationsEfficiencies.cxx b/PWGHF/HFC/Tasks/taskCorrelationsEfficiencies.cxx index 8407dcbde82..365920f243b 100644 --- a/PWGHF/HFC/Tasks/taskCorrelationsEfficiencies.cxx +++ b/PWGHF/HFC/Tasks/taskCorrelationsEfficiencies.cxx @@ -14,13 +14,14 @@ /// \author Marcello Di Costanzo , Politecnico and INFN Torino #include "PWGHF/Core/CentralityEstimation.h" -#include "PWGHF/Core/HfHelper.h" +#include "PWGHF/Core/DecayChannels.h" #include "PWGHF/DataModel/AliasTables.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" #include "PWGHF/HFC/DataModel/DerivedDataCorrelationTables.h" #include "PWGHF/HFC/Utils/utilsFlow.h" #include "PWGHF/Utils/utilsEvSelHf.h" +#include "PWGLF/DataModel/mcCentrality.h" #include "Common/Core/RecoDecay.h" #include "Common/DataModel/Centrality.h" @@ -29,20 +30,22 @@ #include "Common/DataModel/TrackSelectionTables.h" #include -#include -#include #include #include #include #include #include +#include #include #include #include #include +#include #include #include +#include +#include #include #include @@ -127,13 +130,17 @@ struct HfTaskCorrelationsEfficiencies { Configurable downSampleCharm{"downSampleCharm", 1., "Fraction of pairs to keep"}; Configurable ptMaxDownSampleCharm{"ptMaxDownSampleCharm", 10., "Maximum pt for the application of the downsampling factor"}; + HfEventSelection hfEvSel; // event selection and monitoring + HfEventSelectionMc hfEvSelMc; HfcFlowHelper hfcFlowHelper; // flow utilities o2::framework::Service ccdb{}; SliceCache cache; std::unique_ptr funcDcaXYPtCutPrimTrk{nullptr}; - using RecoCollisions = soa::Join; + using BCsInfo = soa::Join; + using McCollisionsWMult = soa::Join; + using RecoCollisions = soa::Join; using McCandsDs = soa::Filtered>; using McCandsDplus = soa::Filtered>; using McCandsD0 = soa::Filtered>; @@ -152,6 +159,7 @@ struct HfTaskCorrelationsEfficiencies { Preslice candsLcPerColl = aod::hf_cand::collisionId; Preslice trackIndicesPerColl = aod::track::collisionId; + PresliceUnsorted mcPartsPerMcCollision = aod::mcparticle::mcCollisionId; PresliceUnsorted colPerMcCollision = aod::mccollisionlabel::mcCollisionId; ConfigurableAxis binsPtCharm{"binsPtCharm", {VARIABLE_WIDTH, 0., 2., 4., 6., 8., 24.}, ""}; @@ -165,9 +173,18 @@ struct HfTaskCorrelationsEfficiencies { HistogramRegistry registry{"registry", {}}; - void init(InitContext&) + void init(InitContext& initContext) { + hfEvSel.init(registry); + const auto& workflows = initContext.services().get(); + for (const DeviceSpec& device : workflows.devices) { + if (device.name == "hf-task-correlations-efficiencies") { + // init HF event selection helper + hfEvSelMc.init(device, registry); + break; + } + } ccdb->setURL(ccdbUrl); ccdb->setCaching(true); ccdb->setLocalObjectValidityChecking(); @@ -186,7 +203,7 @@ struct HfTaskCorrelationsEfficiencies { return; } - hfcFlowHelper.init(ccdb, registry, classesMl, yCandMax.value); + hfcFlowHelper.init(classesMl, yCandMax.value); // Setup pt-dependent DCAxy cut function if (usePtDiffDcaXYCut) { @@ -304,7 +321,8 @@ struct HfTaskCorrelationsEfficiencies { continue; } float cent{-1.}, mult{-1.}; - if (!hfcFlowHelper.checkCollision(coll, cent, mult)) { + CentralityEstimator centDetector = CentralityEstimator::None; + if (!hfcFlowHelper.selectRecoCollision(hfEvSel, ccdb, registry, coll, centDetector, cent, mult)) { continue; } fillCharmEfficiencies(candsInColl, coll.numContrib()); @@ -357,20 +375,27 @@ struct HfTaskCorrelationsEfficiencies { void processEffAssTracks(RecoCollisions const& recoCollisions, McTracks const& recoTracks, aod::McParticles const& genParticles, - aod::McCollisions const&) + McCollisionsWMult const& genCollisions, + BCsInfo const&) { for (const auto& coll : recoCollisions) { float cent{-1.}, mult{-1.}; - if (!hfcFlowHelper.checkCollision(coll, cent, mult)) { + CentralityEstimator centDetector = CentralityEstimator::None; + if (!hfcFlowHelper.selectRecoCollision(hfEvSel, ccdb, registry, coll, centDetector, cent, mult)) { continue; } if (!coll.has_mcCollision()) { continue; } - auto mcCollision = coll.template mcCollision_as(); + auto mcCollision = coll.template mcCollision_as(); auto tracksInColl = recoTracks.sliceBy(trackIndicesPerColl, coll.globalIndex()); for (const auto& assTrk : tracksInColl) { + + if (!assTrk.isGlobalTrackWoDCA() || assTrk.tpcNClsCrossedRows() < tpcNClsCrossedRowsMin) { + continue; + } + if (!assTrk.has_mcParticle()) { continue; } @@ -410,29 +435,39 @@ struct HfTaskCorrelationsEfficiencies { } // Fill histograms for generated associated tracks - for (const auto& genTrk : genParticles) { - int matchedSpecie = getAssocTrkSpecie(genTrk); - if (matchedSpecie < 0) { - continue; - } - if (!genTrk.has_mcCollision()) { - continue; - } + for (const auto& mcColl : genCollisions) { - // Pt and eta selection - if (genTrk.pt() < ptTrkMin || genTrk.pt() > ptTrkMax || std::fabs(genTrk.eta()) > etaTrkMax) { + float cent{-1.}, mult{-1.}; + const auto recoColls = recoCollisions.sliceBy(colPerMcCollision, mcColl.globalIndex()); + CentralityEstimator centDetector = CentralityEstimator::None; + if (!hfcFlowHelper.selectGenCollision(hfEvSelMc, mcColl, recoColls, centDetector, cent, mult)) { continue; } - int genTrkOrigin = genTrk.isPhysicalPrimary() ? 0 : 1; // 0 for primary, 1 for secondary - auto genCollision = genTrk.template mcCollision_as(); - registry.fill(HIST("hAssTrackGen"), genTrk.pt(), genTrk.eta(), genTrk.phi(), genCollision.posZ(), matchedSpecie, genTrkOrigin); + const auto groupedMcParticles = genParticles.sliceBy(mcPartsPerMcCollision, mcColl.globalIndex()); + for (const auto& genTrk : groupedMcParticles) { + int matchedSpecie = getAssocTrkSpecie(genTrk); + if (matchedSpecie < 0) { + continue; + } + if (!genTrk.has_mcCollision()) { + // Should never happen because we group on the generated collisions + continue; + } + + // Pt and eta selection + if (genTrk.pt() < ptTrkMin || genTrk.pt() > ptTrkMax || std::fabs(genTrk.eta()) > etaTrkMax) { + continue; + } + int genTrkOrigin = genTrk.isPhysicalPrimary() ? 0 : 1; // 0 for primary, 1 for secondary + registry.fill(HIST("hAssTrackGen"), genTrk.pt(), genTrk.eta(), genTrk.phi(), mcColl.posZ(), matchedSpecie, genTrkOrigin); + } } } PROCESS_SWITCH(HfTaskCorrelationsEfficiencies, processEffAssTracks, "Process efficiencies for associated tracks", true); }; -WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +WorkflowSpec defineDataProcessing(ConfigContext const& context) { - return WorkflowSpec{adaptAnalysisTask(cfgc)}; + return WorkflowSpec{adaptAnalysisTask(context)}; } diff --git a/PWGHF/HFC/Utils/utilsFlow.h b/PWGHF/HFC/Utils/utilsFlow.h index 52b4885bfe4..8d345728769 100644 --- a/PWGHF/HFC/Utils/utilsFlow.h +++ b/PWGHF/HFC/Utils/utilsFlow.h @@ -17,31 +17,20 @@ #define PWGHF_HFC_UTILS_UTILSFLOW_H_ #include "PWGHF/Core/CentralityEstimation.h" -#include "PWGHF/Core/DecayChannels.h" #include "PWGHF/Core/HfHelper.h" #include "PWGHF/Utils/utilsEvSelHf.h" -#include "Common/Core/RecoDecay.h" - #include -#include -#include #include #include #include -#include -#include #include -#include -#include #include #include -#include - #include -#include -#include +#include +#include #include #include @@ -79,18 +68,12 @@ class HfcFlowHelper /// \param histRegistry is the histogram registry /// \param mlClasses are the machine learning classes /// \param maxRapidity is the maximum rapidity - void init(o2::framework::Service& ccdbService, - o2::framework::HistogramRegistry& histRegistry, - std::vector mlClasses, + void init(std::vector mlClasses, float maxRapidity) { - - LOG(info) << "Initializing HFC flow helper!"; - this->hfEvSel.addHistograms(histRegistry); - this->ccdb = &ccdbService; - this->registry = &histRegistry; this->classMl = std::move(mlClasses); this->yCandMax = maxRapidity; + LOG(info) << "HFC flow helper initialized"; } /// Get charm hadron candidate mass @@ -168,6 +151,7 @@ class HfcFlowHelper /// Cut on rapidity of the candidate /// \param candidate is the charm hadron candidate + /// \return true if the candidate passes the rapidity cut, false otherwise template bool cutCandRapidity(const TCand& candidate) { @@ -186,40 +170,103 @@ class HfcFlowHelper return std::fabs(y) < yCandMax; } - /// Check event selections for collision and fill the collision table + /// Runtime dispatch to the compile-time checkCollision /// \param collision is the collision - template - bool checkCollision(Coll const& collision, float& cent, float& mult) + /// \param centEst is the centrality estimator + /// \param cent is the centrality value + /// \param mult is the multiplicity value + template + bool selectGenCollision(o2::hf_evsel::HfEventSelectionMc& hfEvSelMc, + GenColl const& genColl, + RecoCollSlice const& recoCollsSlice, + o2::hf_centrality::CentralityEstimator centEst, + float& cent, + float& mult) { + int nSplitColl = recoCollsSlice.size(); o2::hf_evsel::HfCollisionRejectionMask collRejMask{}; - if constexpr (CentEst == o2::hf_centrality::CentralityEstimator::FT0A) { - collRejMask = hfEvSel.getHfCollisionRejectionMask(collision, cent, *ccdb, *registry); - mult = collision.multFT0A(); - } else if constexpr (CentEst == o2::hf_centrality::CentralityEstimator::FT0C) { - collRejMask = hfEvSel.getHfCollisionRejectionMask(collision, cent, *ccdb, *registry); - mult = collision.multFT0C(); - } else if constexpr (CentEst == o2::hf_centrality::CentralityEstimator::FT0M) { - collRejMask = hfEvSel.getHfCollisionRejectionMask(collision, cent, *ccdb, *registry); - mult = collision.multFT0M(); - } else if constexpr (CentEst == o2::hf_centrality::CentralityEstimator::FV0A) { - collRejMask = hfEvSel.getHfCollisionRejectionMask(collision, cent, *ccdb, *registry); - mult = collision.multFV0A(); - } else if constexpr (CentEst == o2::hf_centrality::CentralityEstimator::None) { - collRejMask = hfEvSel.getHfCollisionRejectionMask(collision, cent, *ccdb, *registry); - mult = -1.f; - } else { - LOG(fatal) << "Centrality estimator not recognized for collision selection"; - std::abort(); + switch (centEst) { + case o2::hf_centrality::CentralityEstimator::FT0A: + collRejMask = hfEvSelMc.getHfMcCollisionRejectionMask(genColl, recoCollsSlice, cent); + mult = o2::hf_centrality::getCentralityGenColl(recoCollsSlice, o2::hf_centrality::CentralityEstimator::FT0A); + hfEvSelMc.fillHistograms(genColl, collRejMask, nSplitColl); + break; + case o2::hf_centrality::CentralityEstimator::FT0C: + collRejMask = hfEvSelMc.getHfMcCollisionRejectionMask(genColl, recoCollsSlice, cent); + mult = o2::hf_centrality::getCentralityGenColl(recoCollsSlice, o2::hf_centrality::CentralityEstimator::FT0C); + hfEvSelMc.fillHistograms(genColl, collRejMask, nSplitColl); + break; + case o2::hf_centrality::CentralityEstimator::FT0M: + collRejMask = hfEvSelMc.getHfMcCollisionRejectionMask(genColl, recoCollsSlice, cent); + mult = o2::hf_centrality::getCentralityGenColl(recoCollsSlice, o2::hf_centrality::CentralityEstimator::FT0M); + hfEvSelMc.fillHistograms(genColl, collRejMask, nSplitColl); + break; + case o2::hf_centrality::CentralityEstimator::FV0A: + collRejMask = hfEvSelMc.getHfMcCollisionRejectionMask(genColl, recoCollsSlice, cent); + mult = o2::hf_centrality::getCentralityGenColl(recoCollsSlice, o2::hf_centrality::CentralityEstimator::FV0A); + hfEvSelMc.fillHistograms(genColl, collRejMask, nSplitColl); + break; + case o2::hf_centrality::CentralityEstimator::None: + collRejMask = hfEvSelMc.getHfMcCollisionRejectionMask(genColl, recoCollsSlice, cent); + mult = -1.f; + hfEvSelMc.fillHistograms(genColl, collRejMask, nSplitColl); + break; + default: + LOG(fatal) << "Centrality estimator not recognized for collision selection"; + std::abort(); } + + return (collRejMask == 0); + } + + /// Apply event selection on reconstructed collisions + /// \param collision is the collision + /// \param centEst is the centrality estimator + /// \param cent is the centrality value + /// \param mult is the multiplicity value + template + bool selectRecoCollision(o2::hf_evsel::HfEventSelection& hfEvSel, + o2::framework::Service& ccdb, + o2::framework::HistogramRegistry& registry, + Coll const& collision, + o2::hf_centrality::CentralityEstimator centEst, + float& cent, + float& mult) + { + o2::hf_evsel::HfCollisionRejectionMask collRejMask{}; + switch (centEst) { + case o2::hf_centrality::CentralityEstimator::FT0A: + collRejMask = hfEvSel.getHfCollisionRejectionMask(collision, cent, ccdb, registry); + mult = collision.multFT0A(); + break; + case o2::hf_centrality::CentralityEstimator::FT0C: + collRejMask = hfEvSel.getHfCollisionRejectionMask(collision, cent, ccdb, registry); + mult = collision.multFT0C(); + break; + case o2::hf_centrality::CentralityEstimator::FT0M: + collRejMask = hfEvSel.getHfCollisionRejectionMask(collision, cent, ccdb, registry); + mult = collision.multFT0M(); + break; + case o2::hf_centrality::CentralityEstimator::FV0A: + collRejMask = hfEvSel.getHfCollisionRejectionMask(collision, cent, ccdb, registry); + mult = collision.multFV0A(); + break; + case o2::hf_centrality::CentralityEstimator::None: + collRejMask = hfEvSel.getHfCollisionRejectionMask(collision, cent, ccdb, registry); + mult = -1.f; + break; + default: + LOG(fatal) << "Centrality estimator not recognized for collision selection"; + std::abort(); + } + hfEvSel.fillHistograms(collision, collRejMask, cent); - return collRejMask == 0; + + return (collRejMask == 0); } private: - o2::hf_evsel::HfEventSelection hfEvSel; - o2::framework::Service* ccdb{nullptr}; - o2::framework::HistogramRegistry* registry{nullptr}; - std::vector classMl{}; + std::vector classMl; float yCandMax{-999.f}; };