From 35b52a70ff21533ddaca6372f7ab84b3841a4701 Mon Sep 17 00:00:00 2001 From: Joonsuk Date: Thu, 5 Mar 2026 23:14:47 +0100 Subject: [PATCH 1/2] [PWGJE] Fix pTHat handling, remove HepMCXSections dependency, add R-dependent matching - trackEfficiency: Remove HepMCXSections and JMcCollisionPIs table subscriptions from all MC processes; use ptHard() from JMcCollisions with weight-based fallback. Add applyRCTSelections configurable. - jetSpectraCharged: Pass pTHat as parameter to fill functions instead of computing internally; fix pTHatMaxMCD->pTHatMaxMCP bug in fillGeoMatchedAreaSubHistograms; change MCD weighted process subscriptions to JetCollisionsMCD for mcCollision() access. - All jet matching tasks: Replace single maxMatchingDistance with per-R configurables (jetRadiiForMatchingDistance + maxMatchingDistancePerJetR) for R-dependent geometric matching distance. Applied to jetMatchingMC, jetMatchingMCSub, jetMatchingSub, jetMatchingDuplicates, jetSubstructureMatching, and jetSubstructureMatchingSub. Co-Authored-By: Claude Opus 4.6 --- PWGJE/Core/JetMatchingUtilities.h | 15 ++- .../Duplicates/jetMatchingDuplicates.h | 7 +- .../Substructure/jetSubstructureMatching.h | 7 +- .../Substructure/jetSubstructureMatchingSub.h | 7 +- PWGJE/TableProducer/Matching/jetMatchingMC.h | 7 +- .../TableProducer/Matching/jetMatchingMCSub.h | 7 +- PWGJE/TableProducer/Matching/jetMatchingSub.h | 7 +- PWGJE/Tasks/jetSpectraCharged.cxx | 61 +++++----- PWGJE/Tasks/trackEfficiency.cxx | 106 ++++++++---------- 9 files changed, 124 insertions(+), 100 deletions(-) diff --git a/PWGJE/Core/JetMatchingUtilities.h b/PWGJE/Core/JetMatchingUtilities.h index 8fb24f29b50..70235df252e 100644 --- a/PWGJE/Core/JetMatchingUtilities.h +++ b/PWGJE/Core/JetMatchingUtilities.h @@ -293,7 +293,7 @@ std::tuple, std::vector> MatchJetsGeometrically( } template -void MatchGeo(T const& jetsBasePerCollision, U const& jetsTagPerCollision, std::vector>& baseToTagMatchingGeo, std::vector>& tagToBaseMatchingGeo, float maxMatchingDistance) +void MatchGeo(T const& jetsBasePerCollision, U const& jetsTagPerCollision, std::vector>& baseToTagMatchingGeo, std::vector>& tagToBaseMatchingGeo, float maxMatchingDistance, std::vector const& jetRadiiForMatchingDistance = {}, std::vector const& maxMatchingDistancePerJetR = {}) { std::vector jetsR; for (const auto& jetBase : jetsBasePerCollision) { @@ -332,7 +332,14 @@ void MatchGeo(T const& jetsBasePerCollision, U const& jetsTagPerCollision, std:: jetsTagEta.emplace_back(jetTag.eta()); jetsTagGlobalIndex.emplace_back(jetTag.globalIndex()); } - std::tie(baseToTagMatchingGeoIndex, tagToBaseMatchingGeoIndex) = MatchJetsGeometrically(jetsBasePhi, jetsBaseEta, jetsTagPhi, jetsTagEta, maxMatchingDistance); // change max distnace to a function call + float effectiveMatchingDistance = maxMatchingDistance; + for (std::size_t i = 0; i < jetRadiiForMatchingDistance.size() && i < maxMatchingDistancePerJetR.size(); i++) { + if (std::round(jetRadiiForMatchingDistance[i] * 100.0) == std::round(jetR)) { + effectiveMatchingDistance = maxMatchingDistancePerJetR[i]; + break; + } + } + std::tie(baseToTagMatchingGeoIndex, tagToBaseMatchingGeoIndex) = MatchJetsGeometrically(jetsBasePhi, jetsBaseEta, jetsTagPhi, jetsTagEta, effectiveMatchingDistance); int jetBaseIndex = 0; int jetTagIndex = 0; for (const auto& jetBase : jetsBasePerCollision) { @@ -564,11 +571,11 @@ void MatchPt(T const& jetsBasePerCollision, U const& jetsTagPerCollision, std::v // function that calls all the Match functions template -void doAllMatching(T const& jetsBasePerCollision, U const& jetsTagPerCollision, std::vector>& baseToTagMatchingGeo, std::vector>& baseToTagMatchingPt, std::vector>& baseToTagMatchingHF, std::vector>& tagToBaseMatchingGeo, std::vector>& tagToBaseMatchingPt, std::vector>& tagToBaseMatchingHF, V const& candidatesBase, M const& tracksBase, N const& clustersBase, O const& candidatesTag, P const& tracksTag, R const& clustersTag, bool doMatchingGeo, bool doMatchingHf, bool doMatchingPt, float maxMatchingDistance, float minPtFraction) +void doAllMatching(T const& jetsBasePerCollision, U const& jetsTagPerCollision, std::vector>& baseToTagMatchingGeo, std::vector>& baseToTagMatchingPt, std::vector>& baseToTagMatchingHF, std::vector>& tagToBaseMatchingGeo, std::vector>& tagToBaseMatchingPt, std::vector>& tagToBaseMatchingHF, V const& candidatesBase, M const& tracksBase, N const& clustersBase, O const& candidatesTag, P const& tracksTag, R const& clustersTag, bool doMatchingGeo, bool doMatchingHf, bool doMatchingPt, float maxMatchingDistance, float minPtFraction, std::vector const& jetRadiiForMatchingDistance = {}, std::vector const& maxMatchingDistancePerJetR = {}) { // geometric matching if (doMatchingGeo) { - MatchGeo(jetsBasePerCollision, jetsTagPerCollision, baseToTagMatchingGeo, tagToBaseMatchingGeo, maxMatchingDistance); + MatchGeo(jetsBasePerCollision, jetsTagPerCollision, baseToTagMatchingGeo, tagToBaseMatchingGeo, maxMatchingDistance, jetRadiiForMatchingDistance, maxMatchingDistancePerJetR); } // pt matching if (doMatchingPt) { diff --git a/PWGJE/TableProducer/Matching/Duplicates/jetMatchingDuplicates.h b/PWGJE/TableProducer/Matching/Duplicates/jetMatchingDuplicates.h index 504219671fd..226f3dce803 100644 --- a/PWGJE/TableProducer/Matching/Duplicates/jetMatchingDuplicates.h +++ b/PWGJE/TableProducer/Matching/Duplicates/jetMatchingDuplicates.h @@ -35,6 +35,8 @@ struct JetMatchingDuplicates { o2::framework::Configurable doMatchingPt{"doMatchingPt", true, "Enable pt matching"}; o2::framework::Configurable doMatchingHf{"doMatchingHf", false, "Enable HF matching"}; o2::framework::Configurable maxMatchingDistance{"maxMatchingDistance", 0.24f, "Max matching distance"}; + o2::framework::Configurable> jetRadiiForMatchingDistance{"jetRadiiForMatchingDistance", {}, "Jet R values for per-R matching distance override, e.g. {0.2, 0.4, 0.6}"}; + o2::framework::Configurable> maxMatchingDistancePerJetR{"maxMatchingDistancePerJetR", {}, "Max matching distance for each R in jetRadiiForMatchingDistance, e.g. {0.12, 0.24, 0.36}"}; o2::framework::Configurable minPtFraction{"minPtFraction", 0.5f, "Minimum pt fraction for pt matching"}; o2::framework::Produces jetsBasetoTagMatchingTable; @@ -49,6 +51,9 @@ struct JetMatchingDuplicates { void init(o2::framework::InitContext const&) { + if (jetRadiiForMatchingDistance->size() != maxMatchingDistancePerJetR->size()) { + LOGP(fatal, "jetRadiiForMatchingDistance and maxMatchingDistancePerJetR must have the same number of entries"); + } } void processJets(o2::aod::JetCollisions const& collisions, @@ -72,7 +77,7 @@ struct JetMatchingDuplicates { const auto jetsBasePerColl = jetsBase.sliceBy(baseJetsPerCollision, collision.globalIndex()); const auto jetsTagPerColl = jetsTag.sliceBy(tagJetsPerCollision, collision.globalIndex()); // initialise template parameters as false since even if they are Mc we are not matching between detector and particle level - jetmatchingutilities::doAllMatching(jetsBasePerColl, jetsTagPerColl, jetsBasetoTagMatchingGeo, jetsBasetoTagMatchingPt, jetsBasetoTagMatchingHF, jetsTagtoBaseMatchingGeo, jetsTagtoBaseMatchingPt, jetsTagtoBaseMatchingHF, candidates, tracks, tracks, candidates, tracks, tracks, doMatchingGeo, doMatchingHf, doMatchingPt, maxMatchingDistance, minPtFraction); + jetmatchingutilities::doAllMatching(jetsBasePerColl, jetsTagPerColl, jetsBasetoTagMatchingGeo, jetsBasetoTagMatchingPt, jetsBasetoTagMatchingHF, jetsTagtoBaseMatchingGeo, jetsTagtoBaseMatchingPt, jetsTagtoBaseMatchingHF, candidates, tracks, tracks, candidates, tracks, tracks, doMatchingGeo, doMatchingHf, doMatchingPt, maxMatchingDistance, minPtFraction, jetRadiiForMatchingDistance, maxMatchingDistancePerJetR); } for (auto i = 0; i < jetsBase.size(); ++i) { diff --git a/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatching.h b/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatching.h index a971c1a7e8e..048b9f6dbed 100644 --- a/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatching.h +++ b/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatching.h @@ -42,6 +42,8 @@ struct JetSubstructureMatching { o2::framework::Configurable doMatchingPt{"doMatchingPt", true, "Enable pt matching"}; o2::framework::Configurable doMatchingHf{"doMatchingHf", false, "Enable HF matching"}; o2::framework::Configurable maxMatchingDistance{"maxMatchingDistance", 0.24f, "Max matching distance"}; + o2::framework::Configurable> jetRadiiForMatchingDistance{"jetRadiiForMatchingDistance", {}, "Jet R values for per-R matching distance override, e.g. {0.2, 0.4, 0.6}"}; + o2::framework::Configurable> maxMatchingDistancePerJetR{"maxMatchingDistancePerJetR", {}, "Max matching distance for each R in jetRadiiForMatchingDistance, e.g. {0.12, 0.24, 0.36}"}; o2::framework::Configurable minPtFraction{"minPtFraction", 0.5f, "Minimum pt fraction for pt matching"}; o2::framework::Configurable requireGeoMatchedJets{"requireGeoMatchedJets", false, "require jets are geo matched as well"}; o2::framework::Configurable requirePtMatchedJets{"requirePtMatchedJets", false, "require jets are pT matched as well"}; @@ -52,6 +54,9 @@ struct JetSubstructureMatching { void init(o2::framework::InitContext const&) { + if (jetRadiiForMatchingDistance->size() != maxMatchingDistancePerJetR->size()) { + LOGP(fatal, "jetRadiiForMatchingDistance and maxMatchingDistancePerJetR must have the same number of entries"); + } } o2::framework::PresliceOptional BaseSplittingsPerBaseJetInclusive = o2::aod::chargedmcdetectorlevelsplitting::jetId; @@ -218,7 +223,7 @@ struct JetSubstructureMatching { jetBaseSplittingsMap[jetBaseSplitting.globalIndex()] = baseSplittingIndex; baseSplittingIndex++; } - jetmatchingutilities::doAllMatching(jetBaseSplittings, jetTagSplittings, jetsBasetoTagSplittingsMatchingGeo, jetsBasetoTagSplittingsMatchingPt, jetsBasetoTagSplittingsMatchingHF, jetsTagtoBaseSplittingsMatchingGeo, jetsTagtoBaseSplittingsMatchingPt, jetsTagtoBaseSplittingsMatchingHF, candidatesBase, tracksBase, clustersBase, candidatesTag, tracksTag, tracksTag, doMatchingGeo, doMatchingHf, doMatchingPt, maxMatchingDistance, minPtFraction); + jetmatchingutilities::doAllMatching(jetBaseSplittings, jetTagSplittings, jetsBasetoTagSplittingsMatchingGeo, jetsBasetoTagSplittingsMatchingPt, jetsBasetoTagSplittingsMatchingHF, jetsTagtoBaseSplittingsMatchingGeo, jetsTagtoBaseSplittingsMatchingPt, jetsTagtoBaseSplittingsMatchingHF, candidatesBase, tracksBase, clustersBase, candidatesTag, tracksTag, tracksTag, doMatchingGeo, doMatchingHf, doMatchingPt, maxMatchingDistance, minPtFraction, jetRadiiForMatchingDistance, maxMatchingDistancePerJetR); // auto const& jetBasePairs = jetsBasePairs.sliceBy(BasePairsPerBaseJet, jetBase.globalIndex()); auto const& jetBasePairs = slicedPerJetForMatching(jetsBasePairs, jetBase, BasePairsPerBaseJetInclusive, BasePairsPerBaseJetD0, BasePairsPerBaseJetDplus, BasePairsPerBaseJetDs, BasePairsPerBaseJetDstar, BasePairsPerBaseJetLc, BasePairsPerBaseJetB0, BasePairsPerBaseJetBplus, BasePairsPerBaseJetXicToXiPiPi, BasePairsPerBaseJetDielectron); int basePairIndex = 0; diff --git a/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingSub.h b/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingSub.h index bcce8a6103f..8d25697d220 100644 --- a/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingSub.h +++ b/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingSub.h @@ -43,6 +43,8 @@ struct JetSubstructureMatchingSub { o2::framework::Configurable doMatchingPt{"doMatchingPt", true, "Enable pt matching"}; o2::framework::Configurable doMatchingHf{"doMatchingHf", false, "Enable HF matching"}; o2::framework::Configurable maxMatchingDistance{"maxMatchingDistance", 0.24f, "Max matching distance"}; + o2::framework::Configurable> jetRadiiForMatchingDistance{"jetRadiiForMatchingDistance", {}, "Jet R values for per-R matching distance override, e.g. {0.2, 0.4, 0.6}"}; + o2::framework::Configurable> maxMatchingDistancePerJetR{"maxMatchingDistancePerJetR", {}, "Max matching distance for each R in jetRadiiForMatchingDistance, e.g. {0.12, 0.24, 0.36}"}; o2::framework::Configurable minPtFraction{"minPtFraction", 0.5f, "Minimum pt fraction for pt matching"}; o2::framework::Configurable requireGeoMatchedJets{"requireGeoMatchedJets", false, "require jets are geo matched as well"}; o2::framework::Configurable requirePtMatchedJets{"requirePtMatchedJets", false, "require jets are pT matched as well"}; @@ -53,6 +55,9 @@ struct JetSubstructureMatchingSub { void init(o2::framework::InitContext const&) { + if (jetRadiiForMatchingDistance->size() != maxMatchingDistancePerJetR->size()) { + LOGP(fatal, "jetRadiiForMatchingDistance and maxMatchingDistancePerJetR must have the same number of entries"); + } } o2::framework::PresliceOptional BaseSplittingsPerBaseJetInclusive = o2::aod::chargedsplitting::jetId; @@ -219,7 +224,7 @@ struct JetSubstructureMatchingSub { jetBaseSplittingsMap[jetBaseSplitting.globalIndex()] = baseSplittingIndex; baseSplittingIndex++; } - jetmatchingutilities::doAllMatching(jetBaseSplittings, jetTagSplittings, jetsBasetoTagSplittingsMatchingGeo, jetsBasetoTagSplittingsMatchingPt, jetsBasetoTagSplittingsMatchingHF, jetsTagtoBaseSplittingsMatchingGeo, jetsTagtoBaseSplittingsMatchingPt, jetsTagtoBaseSplittingsMatchingHF, candidates, tracksBase, clustersBase, candidates, tracksTag, tracksTag, doMatchingGeo, doMatchingHf, doMatchingPt, maxMatchingDistance, minPtFraction); + jetmatchingutilities::doAllMatching(jetBaseSplittings, jetTagSplittings, jetsBasetoTagSplittingsMatchingGeo, jetsBasetoTagSplittingsMatchingPt, jetsBasetoTagSplittingsMatchingHF, jetsTagtoBaseSplittingsMatchingGeo, jetsTagtoBaseSplittingsMatchingPt, jetsTagtoBaseSplittingsMatchingHF, candidates, tracksBase, clustersBase, candidates, tracksTag, tracksTag, doMatchingGeo, doMatchingHf, doMatchingPt, maxMatchingDistance, minPtFraction, jetRadiiForMatchingDistance, maxMatchingDistancePerJetR); // auto const& jetBasePairs = jetsBasePairs.sliceBy(BasePairsPerBaseJet, jetBase.globalIndex()); auto const& jetBasePairs = slicedPerJetForMatching(jetsBasePairs, jetBase, BasePairsPerBaseJetInclusive, BasePairsPerBaseJetD0, BasePairsPerBaseJetDplus, BasePairsPerBaseJetDs, BasePairsPerBaseJetDstar, BasePairsPerBaseJetLc, BasePairsPerBaseJetB0, BasePairsPerBaseJetBplus, BasePairsPerBaseJetXicToXiPiPi, BasePairsPerBaseJetDielectron); int basePairIndex = 0; diff --git a/PWGJE/TableProducer/Matching/jetMatchingMC.h b/PWGJE/TableProducer/Matching/jetMatchingMC.h index 10257b94ba7..380bde57092 100644 --- a/PWGJE/TableProducer/Matching/jetMatchingMC.h +++ b/PWGJE/TableProducer/Matching/jetMatchingMC.h @@ -38,6 +38,8 @@ struct JetMatchingMc { o2::framework::Configurable doMatchingPt{"doMatchingPt", true, "Enable pt matching"}; o2::framework::Configurable doMatchingHf{"doMatchingHf", false, "Enable HF matching"}; o2::framework::Configurable maxMatchingDistance{"maxMatchingDistance", 0.24f, "Max matching distance"}; + o2::framework::Configurable> jetRadiiForMatchingDistance{"jetRadiiForMatchingDistance", {}, "Jet R values for per-R matching distance override, e.g. {0.2, 0.4, 0.6}"}; + o2::framework::Configurable> maxMatchingDistancePerJetR{"maxMatchingDistancePerJetR", {}, "Max matching distance for each R in jetRadiiForMatchingDistance, e.g. {0.12, 0.24, 0.36}"}; o2::framework::Configurable minPtFraction{"minPtFraction", 0.5f, "Minimum pt fraction for pt matching"}; o2::framework::Produces jetsBasetoTagMatchingTable; @@ -54,6 +56,9 @@ struct JetMatchingMc { void init(o2::framework::InitContext const&) { + if (jetRadiiForMatchingDistance->size() != maxMatchingDistancePerJetR->size()) { + LOGP(fatal, "jetRadiiForMatchingDistance and maxMatchingDistancePerJetR must have the same number of entries"); + } } void processJets(o2::aod::JetMcCollisions const& mcCollisions, o2::aod::JetCollisionsMCD const& collisions, @@ -84,7 +89,7 @@ struct JetMatchingMc { const auto jetsBasePerColl = jetsBase.sliceBy(baseJetsPerCollision, jetsBaseIsMc ? mcCollision.globalIndex() : collision.globalIndex()); const auto jetsTagPerColl = jetsTag.sliceBy(tagJetsPerCollision, jetsTagIsMc ? mcCollision.globalIndex() : collision.globalIndex()); - jetmatchingutilities::doAllMatching(jetsBasePerColl, jetsTagPerColl, jetsBasetoTagMatchingGeo, jetsBasetoTagMatchingPt, jetsBasetoTagMatchingHF, jetsTagtoBaseMatchingGeo, jetsTagtoBaseMatchingPt, jetsTagtoBaseMatchingHF, candidatesBase, tracks, clusters, candidatesTag, particles, particles, doMatchingGeo, doMatchingHf, doMatchingPt, maxMatchingDistance, minPtFraction); + jetmatchingutilities::doAllMatching(jetsBasePerColl, jetsTagPerColl, jetsBasetoTagMatchingGeo, jetsBasetoTagMatchingPt, jetsBasetoTagMatchingHF, jetsTagtoBaseMatchingGeo, jetsTagtoBaseMatchingPt, jetsTagtoBaseMatchingHF, candidatesBase, tracks, clusters, candidatesTag, particles, particles, doMatchingGeo, doMatchingHf, doMatchingPt, maxMatchingDistance, minPtFraction, jetRadiiForMatchingDistance, maxMatchingDistancePerJetR); } } for (auto i = 0; i < jetsBase.size(); ++i) { diff --git a/PWGJE/TableProducer/Matching/jetMatchingMCSub.h b/PWGJE/TableProducer/Matching/jetMatchingMCSub.h index 51a0b3d8424..3ccff25302e 100644 --- a/PWGJE/TableProducer/Matching/jetMatchingMCSub.h +++ b/PWGJE/TableProducer/Matching/jetMatchingMCSub.h @@ -34,6 +34,8 @@ struct JetMatchingMcSub { o2::framework::Configurable doMatchingPt{"doMatchingPt", true, "Enable pt matching"}; o2::framework::Configurable doMatchingHf{"doMatchingHf", false, "Enable HF matching"}; o2::framework::Configurable maxMatchingDistance{"maxMatchingDistance", 0.24f, "Max matching distance"}; + o2::framework::Configurable> jetRadiiForMatchingDistance{"jetRadiiForMatchingDistance", {}, "Jet R values for per-R matching distance override, e.g. {0.2, 0.4, 0.6}"}; + o2::framework::Configurable> maxMatchingDistancePerJetR{"maxMatchingDistancePerJetR", {}, "Max matching distance for each R in jetRadiiForMatchingDistance, e.g. {0.12, 0.24, 0.36}"}; o2::framework::Configurable minPtFraction{"minPtFraction", 0.5f, "Minimum pt fraction for pt matching"}; o2::framework::Produces jetsBasetoTagMatchingTable; @@ -48,6 +50,9 @@ struct JetMatchingMcSub { void init(o2::framework::InitContext const&) { + if (jetRadiiForMatchingDistance->size() != maxMatchingDistancePerJetR->size()) { + LOGP(fatal, "jetRadiiForMatchingDistance and maxMatchingDistancePerJetR must have the same number of entries"); + } } void processJets(o2::aod::JetCollisions const& collisions, @@ -73,7 +78,7 @@ struct JetMatchingMcSub { const auto jetsBasePerColl = jetsBase.sliceBy(baseJetsPerCollision, collision.globalIndex()); const auto jetsTagPerColl = jetsTag.sliceBy(tagJetsPerCollision, collision.globalIndex()); - jetmatchingutilities::doAllMatching(jetsBasePerColl, jetsTagPerColl, jetsBasetoTagMatchingGeo, jetsBasetoTagMatchingPt, jetsBasetoTagMatchingHF, jetsTagtoBaseMatchingGeo, jetsTagtoBaseMatchingPt, jetsTagtoBaseMatchingHF, candidates, tracks, tracks, candidates, tracksSub, tracksSub, doMatchingGeo, doMatchingHf, doMatchingPt, maxMatchingDistance, minPtFraction); + jetmatchingutilities::doAllMatching(jetsBasePerColl, jetsTagPerColl, jetsBasetoTagMatchingGeo, jetsBasetoTagMatchingPt, jetsBasetoTagMatchingHF, jetsTagtoBaseMatchingGeo, jetsTagtoBaseMatchingPt, jetsTagtoBaseMatchingHF, candidates, tracks, tracks, candidates, tracksSub, tracksSub, doMatchingGeo, doMatchingHf, doMatchingPt, maxMatchingDistance, minPtFraction, jetRadiiForMatchingDistance, maxMatchingDistancePerJetR); } for (auto i = 0; i < jetsBase.size(); ++i) { diff --git a/PWGJE/TableProducer/Matching/jetMatchingSub.h b/PWGJE/TableProducer/Matching/jetMatchingSub.h index 0aa035794c3..942b8ebf8ce 100644 --- a/PWGJE/TableProducer/Matching/jetMatchingSub.h +++ b/PWGJE/TableProducer/Matching/jetMatchingSub.h @@ -35,6 +35,8 @@ struct JetMatchingSub { o2::framework::Configurable doMatchingPt{"doMatchingPt", true, "Enable pt matching"}; o2::framework::Configurable doMatchingHf{"doMatchingHf", false, "Enable HF matching"}; o2::framework::Configurable maxMatchingDistance{"maxMatchingDistance", 0.24f, "Max matching distance"}; + o2::framework::Configurable> jetRadiiForMatchingDistance{"jetRadiiForMatchingDistance", {}, "Jet R values for per-R matching distance override, e.g. {0.2, 0.4, 0.6}"}; + o2::framework::Configurable> maxMatchingDistancePerJetR{"maxMatchingDistancePerJetR", {}, "Max matching distance for each R in jetRadiiForMatchingDistance, e.g. {0.12, 0.24, 0.36}"}; o2::framework::Configurable minPtFraction{"minPtFraction", 0.5f, "Minimum pt fraction for pt matching"}; o2::framework::Produces jetsBasetoTagMatchingTable; @@ -49,6 +51,9 @@ struct JetMatchingSub { void init(o2::framework::InitContext const&) { + if (jetRadiiForMatchingDistance->size() != maxMatchingDistancePerJetR->size()) { + LOGP(fatal, "jetRadiiForMatchingDistance and maxMatchingDistancePerJetR must have the same number of entries"); + } } void processJets(o2::aod::JetCollisions const& collisions, @@ -72,7 +77,7 @@ struct JetMatchingSub { const auto jetsBasePerColl = jetsBase.sliceBy(baseJetsPerCollision, collision.globalIndex()); const auto jetsTagPerColl = jetsTag.sliceBy(tagJetsPerCollision, collision.globalIndex()); - jetmatchingutilities::doAllMatching(jetsBasePerColl, jetsTagPerColl, jetsBasetoTagMatchingGeo, jetsBasetoTagMatchingPt, jetsBasetoTagMatchingHF, jetsTagtoBaseMatchingGeo, jetsTagtoBaseMatchingPt, jetsTagtoBaseMatchingHF, candidates, tracks, tracks, candidates, tracksSub, tracksSub, doMatchingGeo, doMatchingHf, doMatchingPt, maxMatchingDistance, minPtFraction); + jetmatchingutilities::doAllMatching(jetsBasePerColl, jetsTagPerColl, jetsBasetoTagMatchingGeo, jetsBasetoTagMatchingPt, jetsBasetoTagMatchingHF, jetsTagtoBaseMatchingGeo, jetsTagtoBaseMatchingPt, jetsTagtoBaseMatchingHF, candidates, tracks, tracks, candidates, tracksSub, tracksSub, doMatchingGeo, doMatchingHf, doMatchingPt, maxMatchingDistance, minPtFraction, jetRadiiForMatchingDistance, maxMatchingDistancePerJetR); } for (auto i = 0; i < jetsBase.size(); ++i) { diff --git a/PWGJE/Tasks/jetSpectraCharged.cxx b/PWGJE/Tasks/jetSpectraCharged.cxx index 3812e1a08ff..09e02d67d4e 100644 --- a/PWGJE/Tasks/jetSpectraCharged.cxx +++ b/PWGJE/Tasks/jetSpectraCharged.cxx @@ -463,9 +463,8 @@ struct JetSpectraCharged { } template - void fillJetHistograms(TJets const& jet, float centrality, float weight = 1.0) + void fillJetHistograms(TJets const& jet, float centrality, float weight = 1.0, float pTHat = 999.0) { - float pTHat = 10. / (std::pow(weight, 1.0 / pTHatExponent)); if (jet.pt() > pTHatMaxMCD * pTHat || pTHat < pTHatAbsoluteMin) { return; } @@ -487,9 +486,8 @@ struct JetSpectraCharged { } template - void fillJetAreaSubHistograms(TJets const& jet, float centrality, float rho, float weight = 1.0) + void fillJetAreaSubHistograms(TJets const& jet, float centrality, float rho, float weight = 1.0, float pTHat = 999.0) { - float pTHat = 10. / (std::pow(weight, 1.0 / pTHatExponent)); if (jet.pt() > pTHatMaxMCD * pTHat || pTHat < pTHatAbsoluteMin) { return; } @@ -516,9 +514,8 @@ struct JetSpectraCharged { } template - void fillMCPHistograms(TJets const& jet, float weight = 1.0) + void fillMCPHistograms(TJets const& jet, float weight = 1.0, float pTHat = 999.0) { - float pTHat = 10. / (std::pow(weight, 1.0 / pTHatExponent)); if (jet.pt() > pTHatMaxMCP * pTHat || pTHat < pTHatAbsoluteMin) { return; } @@ -538,9 +535,8 @@ struct JetSpectraCharged { } template - void fillMCPAreaSubHistograms(TJets const& jet, float rho = 0.0, float weight = 1.0) + void fillMCPAreaSubHistograms(TJets const& jet, float rho = 0.0, float weight = 1.0, float pTHat = 999.0) { - float pTHat = 10. / (std::pow(weight, 1.0 / pTHatExponent)); if (jet.pt() > pTHatMaxMCP * pTHat || pTHat < pTHatAbsoluteMin) { return; } @@ -559,9 +555,8 @@ struct JetSpectraCharged { } template - void fillEventWiseConstituentSubtractedHistograms(TJets const& jet, float centrality, float weight = 1.0) + void fillEventWiseConstituentSubtractedHistograms(TJets const& jet, float centrality, float weight = 1.0, float pTHat = 999.0) { - float pTHat = 10. / (std::pow(weight, 1.0 / pTHatExponent)); if (jet.pt() > pTHatMaxMCD * pTHat || pTHat < pTHatAbsoluteMin) { return; } @@ -572,9 +567,8 @@ struct JetSpectraCharged { } template - void fillMatchedHistograms(TBase const& jetMCD, float weight = 1.0) + void fillMatchedHistograms(TBase const& jetMCD, float weight = 1.0, float pTHat = 999.0) { - float pTHat = 10. / (std::pow(weight, 1.0 / pTHatExponent)); if (jetMCD.pt() > pTHatMaxMCD * pTHat || pTHat < pTHatAbsoluteMin) { return; } @@ -665,15 +659,14 @@ struct JetSpectraCharged { } template - void fillGeoMatchedAreaSubHistograms(TBase const& jetMCD, float rho, float mcrho = 0.0, float weight = 1.0) + void fillGeoMatchedAreaSubHistograms(TBase const& jetMCD, float rho, float mcrho = 0.0, float weight = 1.0, float pTHat = 999.0) { - float pTHat = 10. / (std::pow(weight, 1.0 / pTHatExponent)); if (jetMCD.pt() > pTHatMaxMCD * pTHat) { return; } if (jetMCD.has_matchedJetGeo()) { for (const auto& jetMCP : jetMCD.template matchedJetGeo_as>()) { - if (jetMCP.pt() > pTHatMaxMCD * pTHat) { + if (jetMCP.pt() > pTHatMaxMCP * pTHat) { continue; } if (jetMCD.r() == round(selectedJetsRadius * 100.0f)) { @@ -848,9 +841,10 @@ struct JetSpectraCharged { } PROCESS_SWITCH(JetSpectraCharged, processSpectraAreaSubMCD, "jet spectra with rho-area subtraction for MCD", false); - void processSpectraMCDWeighted(soa::Filtered::iterator const& collision, + void processSpectraMCDWeighted(soa::Filtered::iterator const& collision, soa::Join const& jets, - aod::JetTracks const&) + aod::JetTracks const&, + aod::JetMcCollisions const&) { bool fillHistograms = false; bool isWeighted = true; @@ -858,7 +852,7 @@ struct JetSpectraCharged { if (!applyCollisionCuts(collision, fillHistograms, isWeighted, eventWeight)) { return; } - + float pTHat = collision.has_mcCollision() && collision.mcCollision().ptHard() < 999.0f ? collision.mcCollision().ptHard() : 10. / (std::pow(eventWeight, 1.0 / pTHatExponent)); float centrality = -1.0; checkCentFT0M ? centrality = collision.centFT0M() : centrality = collision.centFT0C(); @@ -869,14 +863,15 @@ struct JetSpectraCharged { if (!isAcceptedJet(jet)) { continue; } - fillJetHistograms(jet, centrality, eventWeight); + fillJetHistograms(jet, centrality, eventWeight, pTHat); } } PROCESS_SWITCH(JetSpectraCharged, processSpectraMCDWeighted, "jet finder QA mcd with weighted events", false); - void processSpectraAreaSubMCDWeighted(soa::Filtered>::iterator const& collision, + void processSpectraAreaSubMCDWeighted(soa::Filtered>::iterator const& collision, soa::Join const& jets, - aod::JetTracks const&) + aod::JetTracks const&, + aod::JetMcCollisions const&) { bool fillHistograms = false; bool isWeighted = true; @@ -884,7 +879,7 @@ struct JetSpectraCharged { if (!applyCollisionCuts(collision, fillHistograms, isWeighted, eventWeight)) { return; } - + float pTHat = collision.has_mcCollision() && collision.mcCollision().ptHard() < 999.0f ? collision.mcCollision().ptHard() : 10. / (std::pow(eventWeight, 1.0 / pTHatExponent)); float centrality = -1.0; checkCentFT0M ? centrality = collision.centFT0M() : centrality = collision.centFT0C(); @@ -895,7 +890,7 @@ struct JetSpectraCharged { if (!isAcceptedJet(jet)) { continue; } - fillJetAreaSubHistograms(jet, centrality, collision.rho(), eventWeight); + fillJetAreaSubHistograms(jet, centrality, collision.rho(), eventWeight, pTHat); } } PROCESS_SWITCH(JetSpectraCharged, processSpectraAreaSubMCDWeighted, "jet spectra with rho-area subtraction for MCD", false); @@ -1127,7 +1122,7 @@ struct JetSpectraCharged { if (!applyMCCollisionCuts(mccollision, collisions, fillHistograms, isWeighted, eventWeight)) { return; } - + float pTHat = mccollision.ptHard() < 999.0f ? mccollision.ptHard() : 10. / (std::pow(eventWeight, 1.0 / pTHatExponent)); for (auto const& jet : jets) { if (!jetfindingutilities::isInEtaAcceptance(jet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { continue; @@ -1135,14 +1130,13 @@ struct JetSpectraCharged { if (!isAcceptedJet(jet, mcLevelIsParticleLevel)) { continue; } - double pTHat = 10. / (std::pow(eventWeight, 1.0 / pTHatExponent)); int Nmax = 21; for (int N = 1; N < Nmax; N++) { if (jet.pt() < N * 0.25 * pTHat && jet.r() == round(selectedJetsRadius * 100.0f)) { registry.fill(HIST("h2_jet_ptcut_part"), jet.pt(), N * 0.25, eventWeight); } } - fillMCPHistograms(jet, eventWeight); + fillMCPHistograms(jet, eventWeight, pTHat); } } PROCESS_SWITCH(JetSpectraCharged, processSpectraMCPWeighted, "jet spectra for MC particle level weighted", false); @@ -1160,6 +1154,7 @@ struct JetSpectraCharged { if (!applyMCCollisionCuts(mccollision, collisions, fillHistograms, isWeighted, eventWeight)) { return; } + float pTHat = mccollision.ptHard() < 999.0f ? mccollision.ptHard() : 10. / (std::pow(eventWeight, 1.0 / pTHatExponent)); registry.fill(HIST("h_mccollisions_rho"), mccollision.rho(), eventWeight); for (auto const& jet : jets) { @@ -1169,7 +1164,7 @@ struct JetSpectraCharged { if (!isAcceptedJet(jet, mcLevelIsParticleLevel)) { continue; } - fillMCPAreaSubHistograms(jet, mccollision.rho(), eventWeight); + fillMCPAreaSubHistograms(jet, mccollision.rho(), eventWeight, pTHat); } } PROCESS_SWITCH(JetSpectraCharged, processSpectraAreaSubMCPWeighted, "jet spectra with area-based subtraction for MC particle level", false); @@ -1238,10 +1233,11 @@ struct JetSpectraCharged { } PROCESS_SWITCH(JetSpectraCharged, processJetsMatched, "matched mcp and mcd jets", false); - void processJetsMatchedWeighted(soa::Filtered::iterator const& collision, + void processJetsMatchedWeighted(soa::Filtered::iterator const& collision, ChargedMCDMatchedJets const& mcdjets, ChargedMCPMatchedJets const&, - aod::JetTracks const&, aod::JetParticles const&) + aod::JetTracks const&, aod::JetParticles const&, + aod::JetMcCollisions const&) { bool fillHistograms = false; bool isWeighted = true; @@ -1249,12 +1245,12 @@ struct JetSpectraCharged { if (!applyCollisionCuts(collision, fillHistograms, isWeighted, eventWeight)) { return; } - + float pTHat = collision.has_mcCollision() && collision.mcCollision().ptHard() < 999.0f ? collision.mcCollision().ptHard() : 10. / (std::pow(eventWeight, 1.0 / pTHatExponent)); for (const auto& mcdjet : mcdjets) { if (!isAcceptedJet(mcdjet)) { continue; } - fillMatchedHistograms(mcdjet, eventWeight); + fillMatchedHistograms(mcdjet, eventWeight, pTHat); } } PROCESS_SWITCH(JetSpectraCharged, processJetsMatchedWeighted, "matched mcp and mcd jets with weighted events", false); @@ -1292,6 +1288,7 @@ struct JetSpectraCharged { if (!applyCollisionCuts(collision, fillHistograms, isWeighted, eventWeight)) { return; } + float pTHat = collision.has_mcCollision() && collision.mcCollision().ptHard() < 999.0f ? collision.mcCollision().ptHard() : 10. / (std::pow(eventWeight, 1.0 / pTHatExponent)); double mcrho = collision.has_mcCollision() ? collision.mcCollision_as().rho() : -1; @@ -1299,7 +1296,7 @@ struct JetSpectraCharged { if (!isAcceptedJet(mcdjet)) { continue; } - fillGeoMatchedAreaSubHistograms(mcdjet, collision.rho(), mcrho, eventWeight); + fillGeoMatchedAreaSubHistograms(mcdjet, collision.rho(), mcrho, eventWeight, pTHat); } } PROCESS_SWITCH(JetSpectraCharged, processJetsMatchedAreaSubWeighted, "matched mcp and mcd jets after area-based pt subtraction with weighted events", false); diff --git a/PWGJE/Tasks/trackEfficiency.cxx b/PWGJE/Tasks/trackEfficiency.cxx index 9b908a8c951..d6886619555 100644 --- a/PWGJE/Tasks/trackEfficiency.cxx +++ b/PWGJE/Tasks/trackEfficiency.cxx @@ -52,6 +52,7 @@ struct TrackEfficiency { Configurable eventSelections{"eventSelections", "sel8", "choose event selection"}; Configurable trackSelections{"trackSelections", "globalTracks", "set track selections; other option: uniformTracks"}; Configurable skipMBGapEvents{"skipMBGapEvents", false, "flag to choose to reject min. bias gap events"}; + Configurable applyRCTSelections{"applyRCTSelections", true, "decide to apply RCT selections"}; // Tracking efficiency process function configurables: Configurable checkPrimaryPart{"checkPrimaryPart", true, "0: doesn't check mcparticle.isPhysicalPrimary() - 1: checks particle.isPhysicalPrimary()"}; @@ -85,7 +86,6 @@ struct TrackEfficiency { Configurable pTHatExponent{"pTHatExponent", 4.0, "exponent of the event weight for the calculation of pTHat"}; Configurable pTHatMaxFractionMCD{"pTHatMaxFractionMCD", 999.0, "maximum fraction of hard scattering for reconstructed track acceptance in MC"}; - Configurable getPtHatFromHepMCXSection{"getPtHatFromHepMCXSection", true, "test configurable, configurable should be removed once well tested"}; Configurable useTrueTrackWeight{"useTrueTrackWeight", true, "test configurable, should be set to 1 then config removed once well tested"}; // systematics variation - Run 2 guidelines: https://twiki.cern.ch/twiki/bin/view/ALICE/AliDPGtoolsTrackSystematicUncertainty @@ -398,8 +398,7 @@ struct TrackEfficiency { Filter particleCuts = (aod::jmcparticle::pt >= trackQAPtMin && aod::jmcparticle::pt < trackQAPtMax && aod::jmcparticle::eta > trackQAEtaMin && aod::jmcparticle::eta < trackQAEtaMax); Filter eventCuts = (nabs(aod::jcollision::posZ) < vertexZCut); - void processEFficiencyPurity(soa::Join::iterator const& mcCollision, - soa::Join const&, + void processEFficiencyPurity(aod::JetMcCollisions::iterator const& mcCollision, soa::SmallGroups const& collisions, // smallgroups gives only the collisions associated to the current mccollision, thanks to the mccollisionlabel pre-integrated in jetcollisionsmcd soa::Join const& jetTracks, soa::Join const&, @@ -432,7 +431,7 @@ struct TrackEfficiency { bool centralityCheck = false; bool occupancyCheck = false; if (acceptSplitCollisions == SplitOkCheckFirstAssocCollOnly || acceptSplitCollisions == NonSplitOnly) { // check only that the first reconstructed collision passes the check (for the NonSplitOnly case, there's only one associated collision) - if (jetderiveddatautilities::selectCollision(collisions.begin(), eventSelectionBits, skipMBGapEvents)) { // Skipping MC events that have their first associated collision not reconstructed + if (jetderiveddatautilities::selectCollision(collisions.begin(), eventSelectionBits, skipMBGapEvents, applyRCTSelections)) { // Skipping MC events that have their first associated collision not reconstructed hasSel8Coll = true; } if (!checkOccupancy || ((trackOccupancyInTimeRangeMin < collisions.begin().trackOccupancyInTimeRange()) && (collisions.begin().trackOccupancyInTimeRange() < trackOccupancyInTimeRangeMax))) { // check occupancy only in GP Pb-Pb MC @@ -444,7 +443,7 @@ struct TrackEfficiency { } } else if (acceptSplitCollisions == SplitOkCheckAnyAssocColl) { // check that at least one of the reconstructed collisions passes the checks for (auto const& collision : collisions) { - if (jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents)) { // Skipping MC events that have not a single selected reconstructed collision ; effect unclear if mcColl is split + if (jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents, applyRCTSelections)) { // Skipping MC events that have not a single selected reconstructed collision ; effect unclear if mcColl is split hasSel8Coll = true; } if (!checkOccupancy || ((trackOccupancyInTimeRangeMin < collision.trackOccupancyInTimeRange()) && (collision.trackOccupancyInTimeRange() < trackOccupancyInTimeRangeMax))) { // check occupancy only in GP Pb-Pb MC @@ -470,7 +469,7 @@ struct TrackEfficiency { } registry.fill(HIST("hMcCollCutsCounts"), 5.5); // at least one of the reconstructed collisions associated with this mcCollision is selected with regard to centrality - float pTHat = getPtHatFromHepMCXSection ? mcCollision.mcCollision_as>().ptHard() : 10. / (std::pow(mcCollision.weight(), 1.0 / pTHatExponent)); + float pTHat = mcCollision.ptHard() < 999.0f ? mcCollision.ptHard() : 10. / (std::pow(mcCollision.weight(), 1.0 / pTHatExponent)); if (pTHat < ptHatMin || pTHat > ptHatMax) { // only allows mcCollisions with weight in between min and max return; } @@ -516,7 +515,7 @@ struct TrackEfficiency { return; } - if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents) || !(std::abs(collision.posZ()) < vertexZCut)) { + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents, applyRCTSelections) || !(std::abs(collision.posZ()) < vertexZCut)) { continue; } @@ -586,8 +585,7 @@ struct TrackEfficiency { } PROCESS_SWITCH(TrackEfficiency, processEFficiencyPurity, "Histograms for efficiency and purity quantities", true); - void processEFficiencyPurityWeighted(soa::Join::iterator const& mcCollision, - soa::Join const&, + void processEFficiencyPurityWeighted(aod::JetMcCollisions::iterator const& mcCollision, soa::SmallGroups const& collisions, // smallgroups gives only the collisions associated to the current mccollision, thanks to the mccollisionlabel pre-integrated in jetcollisionsmcd soa::Join const& jetTracks, soa::Join const&, @@ -619,7 +617,7 @@ struct TrackEfficiency { bool hasSel8Coll = false; bool centralityCheck = false; if (acceptSplitCollisions == SplitOkCheckFirstAssocCollOnly || acceptSplitCollisions == NonSplitOnly) { // check only that the first reconstructed collision passes the check (for the NonSplitOnly case, there's only one associated collision) - if (jetderiveddatautilities::selectCollision(collisions.begin(), eventSelectionBits, skipMBGapEvents)) { // Skipping MC events that have their first associated collision not reconstructed + if (jetderiveddatautilities::selectCollision(collisions.begin(), eventSelectionBits, skipMBGapEvents, applyRCTSelections)) { // Skipping MC events that have their first associated collision not reconstructed hasSel8Coll = true; } centrality = checkCentFT0M ? collisions.begin().centFT0M() : collisions.begin().centFT0C(); @@ -628,7 +626,7 @@ struct TrackEfficiency { } } else if (acceptSplitCollisions == SplitOkCheckAnyAssocColl) { // check that at least one of the reconstructed collisions passes the checks for (auto const& collision : collisions) { - if (jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents)) { // Skipping MC events that have not a single selected reconstructed collision ; effect unclear if mcColl is split + if (jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents, applyRCTSelections)) { // Skipping MC events that have not a single selected reconstructed collision ; effect unclear if mcColl is split hasSel8Coll = true; } centrality = checkCentFT0M ? collision.centFT0M() : collision.centFT0C(); @@ -691,7 +689,7 @@ struct TrackEfficiency { return; } - if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents) || !(std::abs(collision.posZ()) < vertexZCut)) { + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents, applyRCTSelections) || !(std::abs(collision.posZ()) < vertexZCut)) { continue; } @@ -718,7 +716,7 @@ struct TrackEfficiency { registry.fill(HIST("hTrackCutsCounts"), 3.5, mcCollision.weight()); auto mcParticle = track.mcParticle_as(); - auto trueTrackMcCollision = mcParticle.mcCollision_as>(); + auto trueTrackMcCollision = mcParticle.mcCollision_as(); float trueTrackCollEventWeight = useTrueTrackWeight ? trueTrackMcCollision.weight() : mcCollEventWeight; auto jMcParticleFromTrack = track.mcParticle_as(); @@ -774,7 +772,7 @@ struct TrackEfficiency { soa::Filtered> const& jetTracks, soa::Join const&) { - if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents)) { + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents, applyRCTSelections)) { return; } float centrality = checkCentFT0M ? collision.centFT0M() : collision.centFT0C(); @@ -790,15 +788,14 @@ struct TrackEfficiency { PROCESS_SWITCH(TrackEfficiency, processTracksFromData, "QA for charged tracks in data", false); void processTracksFromMc(soa::Filtered>::iterator const& collision, - soa::Join const&, - soa::Join const&, + aod::JetMcCollisions const&, soa::Filtered> const& jetTracks, soa::Join const&) { if (!collision.has_mcCollision()) { // the collision is fake and has no associated mc coll; skip as .mccollision() cannot be called return; } - if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents)) { + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents, applyRCTSelections)) { return; } float centrality = checkCentFT0M ? collision.centFT0M() : collision.centFT0C(); @@ -809,7 +806,7 @@ struct TrackEfficiency { return; } - float pTHat = getPtHatFromHepMCXSection ? collision.mcCollision_as>().mcCollision_as>().ptHard() : 10. / (std::pow(collision.mcCollision().weight(), 1.0 / pTHatExponent)); + float pTHat = collision.mcCollision().ptHard() < 999.0f ? collision.mcCollision().ptHard() : 10. / (std::pow(collision.mcCollision().weight(), 1.0 / pTHatExponent)); if (pTHat < ptHatMin || pTHat > ptHatMax) { // only allows mcCollisions with weight in between min and max return; } @@ -819,16 +816,15 @@ struct TrackEfficiency { PROCESS_SWITCH(TrackEfficiency, processTracksFromMc, "QA for charged tracks in MC without weights", false); void processTracksFromMcWeighted(soa::Filtered>::iterator const& collision, - soa::Join const&, - soa::Join const&, + aod::JetMcCollisions const&, soa::Filtered> const& jetTracks, soa::Join const&) { if (!collision.has_mcCollision()) { // the collision is fake and has no associated mc coll; skip as .mccollision() cannot be called return; } - float eventWeight = collision.mcCollision_as>().weight(); - if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents)) { + float eventWeight = collision.mcCollision().weight(); + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents, applyRCTSelections)) { return; } float centrality = checkCentFT0M ? collision.centFT0M() : collision.centFT0C(); @@ -839,7 +835,7 @@ struct TrackEfficiency { return; } - float pTHat = getPtHatFromHepMCXSection ? collision.mcCollision_as>().mcCollision_as>().ptHard() : 10. / (std::pow(eventWeight, 1.0 / pTHatExponent)); + float pTHat = collision.mcCollision().ptHard() < 999.0f ? collision.mcCollision().ptHard() : 10. / (std::pow(eventWeight, 1.0 / pTHatExponent)); if (pTHat < ptHatMin || pTHat > ptHatMax) { // only allows mcCollisions with weight in between min and max return; } @@ -848,8 +844,7 @@ struct TrackEfficiency { } PROCESS_SWITCH(TrackEfficiency, processTracksFromMcWeighted, "QA for charged tracks in weighted MC", false); - void processParticles(soa::Join::iterator const& mcCollision, - soa::Join const&, + void processParticles(aod::JetMcCollisions::iterator const& mcCollision, soa::SmallGroups const& collisions, soa::Filtered const& mcparticles, soa::Filtered const& tracks) @@ -865,7 +860,7 @@ struct TrackEfficiency { return; } - float pTHat = getPtHatFromHepMCXSection ? mcCollision.mcCollision_as>().ptHard() : 10. / (std::pow(mcCollision.weight(), 1.0 / pTHatExponent)); + float pTHat = mcCollision.ptHard() < 999.0f ? mcCollision.ptHard() : 10. / (std::pow(mcCollision.weight(), 1.0 / pTHatExponent)); if (pTHat < ptHatMin || pTHat > ptHatMax) { // only allows mcCollisions with weight in between min and max return; } @@ -874,7 +869,7 @@ struct TrackEfficiency { bool hasSel8Coll = false; bool centralityCheck = false; if (acceptSplitCollisions == SplitOkCheckFirstAssocCollOnly || acceptSplitCollisions == NonSplitOnly) { // check only that the first reconstructed collision passes the check (for the NonSplitOnly case, there's only one associated collision) - if (jetderiveddatautilities::selectCollision(collisions.begin(), eventSelectionBits, skipMBGapEvents)) { // Skipping MC events that have their first associated collision not reconstructed + if (jetderiveddatautilities::selectCollision(collisions.begin(), eventSelectionBits, skipMBGapEvents, applyRCTSelections)) { // Skipping MC events that have their first associated collision not reconstructed hasSel8Coll = true; } centrality = checkCentFT0M ? collisions.begin().centFT0M() : collisions.begin().centFT0C(); @@ -883,7 +878,7 @@ struct TrackEfficiency { } } else if (acceptSplitCollisions == SplitOkCheckAnyAssocColl) { // check that at least one of the reconstructed collisions passes the checks for (auto const& collision : collisions) { - if (jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents)) { // Skipping MC events that have not a single selected reconstructed collision ; effect unclear if mcColl is split + if (jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents, applyRCTSelections)) { // Skipping MC events that have not a single selected reconstructed collision ; effect unclear if mcColl is split hasSel8Coll = true; } centrality = checkCentFT0M ? collision.centFT0M() : collision.centFT0C(); @@ -907,8 +902,7 @@ struct TrackEfficiency { } PROCESS_SWITCH(TrackEfficiency, processParticles, "QA for charged particles", false); - void processParticlesWeighted(soa::Join::iterator const& mcCollision, - soa::Join const&, + void processParticlesWeighted(aod::JetMcCollisions::iterator const& mcCollision, soa::SmallGroups const& collisions, soa::Filtered const& mcparticles, soa::Filtered const& tracks) @@ -929,7 +923,7 @@ struct TrackEfficiency { return; } - float pTHat = getPtHatFromHepMCXSection ? mcCollision.mcCollision_as>().ptHard() : 10. / (std::pow(eventWeight, 1.0 / pTHatExponent)); + float pTHat = mcCollision.ptHard() < 999.0f ? mcCollision.ptHard() : 10. / (std::pow(eventWeight, 1.0 / pTHatExponent)); if (pTHat < ptHatMin || pTHat > ptHatMax) { // only allows mcCollisions with weight in between min and max return; } @@ -938,7 +932,7 @@ struct TrackEfficiency { bool hasSel8Coll = false; bool centralityCheck = false; if (acceptSplitCollisions == SplitOkCheckFirstAssocCollOnly || acceptSplitCollisions == NonSplitOnly) { // check only that the first reconstructed collision passes the check (for the NonSplitOnly case, there's only one associated collision) - if (jetderiveddatautilities::selectCollision(collisions.begin(), eventSelectionBits, skipMBGapEvents)) { // Skipping MC events that have their first associated collision not reconstructed + if (jetderiveddatautilities::selectCollision(collisions.begin(), eventSelectionBits, skipMBGapEvents, applyRCTSelections)) { // Skipping MC events that have their first associated collision not reconstructed hasSel8Coll = true; } centrality = checkCentFT0M ? collisions.begin().centFT0M() : collisions.begin().centFT0C(); @@ -947,7 +941,7 @@ struct TrackEfficiency { } } else if (acceptSplitCollisions == SplitOkCheckAnyAssocColl) { // check that at least one of the reconstructed collisions passes the checks for (auto const& collision : collisions) { - if (jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents)) { // Skipping MC events that have not a single selected reconstructed collision ; effect unclear if mcColl is split + if (jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents, applyRCTSelections)) { // Skipping MC events that have not a single selected reconstructed collision ; effect unclear if mcColl is split hasSel8Coll = true; } centrality = checkCentFT0M ? collision.centFT0M() : collision.centFT0C(); @@ -978,7 +972,7 @@ struct TrackEfficiency { registry.fill(HIST("h_collisions"), 0.5); registry.fill(HIST("h2_centrality_collisions"), centrality, 0.5); - if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents)) { + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents, applyRCTSelections)) { return; } registry.fill(HIST("h_collisions"), 1.5); @@ -997,8 +991,7 @@ struct TrackEfficiency { PROCESS_SWITCH(TrackEfficiency, processCollisionsFromData, "QA for reconstructed collisions in data", false); void processCollisionsFromMc(soa::Filtered>::iterator const& collision, - soa::Join const&, - soa::Join const&) + aod::JetMcCollisions const&) { float centrality = checkCentFT0M ? collision.centFT0M() : collision.centFT0C(); @@ -1008,7 +1001,7 @@ struct TrackEfficiency { } registry.fill(HIST("h_collisions"), 0.5); registry.fill(HIST("h2_centrality_collisions"), centrality, 0.5); - if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents)) { + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents, applyRCTSelections)) { return; } registry.fill(HIST("h_collisions"), 1.5); @@ -1024,7 +1017,7 @@ struct TrackEfficiency { registry.fill(HIST("h_collisions"), 3.5); registry.fill(HIST("h2_centrality_collisions"), centrality, 3.5); - float pTHat = getPtHatFromHepMCXSection ? collision.mcCollision_as>().mcCollision_as>().ptHard() : 10. / (std::pow(collision.mcCollision().weight(), 1.0 / pTHatExponent)); + float pTHat = collision.mcCollision().ptHard() < 999.0f ? collision.mcCollision().ptHard() : 10. / (std::pow(collision.mcCollision().weight(), 1.0 / pTHatExponent)); if (pTHat < ptHatMin || pTHat > ptHatMax) { // only allows mcCollisions with weight in between min and max return; } @@ -1034,8 +1027,7 @@ struct TrackEfficiency { PROCESS_SWITCH(TrackEfficiency, processCollisionsFromMc, "QA for reconstructed collisions in MC without weights", false); void processCollisionsFromMcWeighted(soa::Filtered>::iterator const& collision, - soa::Join const&, - soa::Join const&) + aod::JetMcCollisions const&) { float centrality = checkCentFT0M ? collision.centFT0M() : collision.centFT0C(); @@ -1043,10 +1035,10 @@ struct TrackEfficiency { registry.fill(HIST("h_fakecollisions"), 0.5); return; } - float eventWeight = collision.mcCollision_as>().weight(); + float eventWeight = collision.mcCollision().weight(); registry.fill(HIST("h_collisions"), 0.5); registry.fill(HIST("h_collisions_weighted"), 0.5, eventWeight); - if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents)) { + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents, applyRCTSelections)) { return; } registry.fill(HIST("h_collisions"), 1.5); @@ -1062,7 +1054,7 @@ struct TrackEfficiency { registry.fill(HIST("h_collisions"), 3.5); registry.fill(HIST("h_collisions_weighted"), 3.5, eventWeight); - float pTHat = getPtHatFromHepMCXSection ? collision.mcCollision_as>().mcCollision_as>().ptHard() : 10. / (std::pow(eventWeight, 1.0 / pTHatExponent)); + float pTHat = collision.mcCollision().ptHard() < 999.0f ? collision.mcCollision().ptHard() : 10. / (std::pow(eventWeight, 1.0 / pTHatExponent)); if (pTHat < ptHatMin || pTHat > ptHatMax) { // only allows mcCollisions with weight in between min and max return; } @@ -1071,22 +1063,21 @@ struct TrackEfficiency { } PROCESS_SWITCH(TrackEfficiency, processCollisionsFromMcWeighted, "QA for reconstructed collisions in weighted MC", false); - void processMcCollisions(soa::Join::iterator const& mcCollision, - soa::Join const&, + void processMcCollisions(aod::JetMcCollisions::iterator const& mcCollision, soa::SmallGroups const& collisions) { // float centrality = checkCentFT0M ? mcCollision.centFT0M() : mcCollision.centFT0C(); mcCollision.centFT0C() isn't filled at the moment; can be added back when it is float eventWeight = mcCollision.weight(); - float pTHat = getPtHatFromHepMCXSection ? mcCollision.mcCollision_as>().ptHard() : 10. / (std::pow(eventWeight, 1.0 / pTHatExponent)); - registry.fill(HIST("h2_mccollision_pthardfromweight_pthardfromhepmcxsection"), 10. / (std::pow(eventWeight, 1.0 / pTHatExponent)), mcCollision.mcCollision_as>().ptHard()); + float pTHat = mcCollision.ptHard() < 999.0f ? mcCollision.ptHard() : 10. / (std::pow(eventWeight, 1.0 / pTHatExponent)); + registry.fill(HIST("h2_mccollision_pthardfromweight_pthardfromhepmcxsection"), 10. / (std::pow(eventWeight, 1.0 / pTHatExponent)), mcCollision.ptHard()); float centrality = -1; bool hasSel8Coll = false; bool centralityCheck = false; if (collisions.size() > 1) { // remove and move the if block below under if (collisions.size() < 1) { when mccoll.centFt0C has been fixed if (acceptSplitCollisions == SplitOkCheckFirstAssocCollOnly || acceptSplitCollisions == NonSplitOnly) { // check only that the first reconstructed collision passes the check (for the NonSplitOnly case, there's only one associated collision) - if (jetderiveddatautilities::selectCollision(collisions.begin(), eventSelectionBits, skipMBGapEvents)) { // Skipping MC events that have their first associated collision not reconstructed + if (jetderiveddatautilities::selectCollision(collisions.begin(), eventSelectionBits, skipMBGapEvents, applyRCTSelections)) { // Skipping MC events that have their first associated collision not reconstructed hasSel8Coll = true; } centrality = checkCentFT0M ? collisions.begin().centFT0M() : collisions.begin().centFT0C(); @@ -1095,7 +1086,7 @@ struct TrackEfficiency { } } else if (acceptSplitCollisions == SplitOkCheckAnyAssocColl) { // check that at least one of the reconstructed collisions passes the checks for (auto const& collision : collisions) { - if (jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents)) { // Skipping MC events that have not a single selected reconstructed collision ; effect unclear if mcColl is split + if (jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents, applyRCTSelections)) { // Skipping MC events that have not a single selected reconstructed collision ; effect unclear if mcColl is split hasSel8Coll = true; } centrality = checkCentFT0M ? collision.centFT0M() : collision.centFT0C(); @@ -1140,8 +1131,7 @@ struct TrackEfficiency { } PROCESS_SWITCH(TrackEfficiency, processMcCollisions, "QA for McCollisions in MC without weights", false); - void processMcCollisionsWeighted(soa::Join::iterator const& mcCollision, - soa::Join const&, + void processMcCollisionsWeighted(aod::JetMcCollisions::iterator const& mcCollision, soa::SmallGroups const& collisions) { if (skipMBGapEvents && mcCollision.getSubGeneratorId() == jetderiveddatautilities::JCollisionSubGeneratorId::mbGap) { @@ -1151,16 +1141,16 @@ struct TrackEfficiency { // float centrality = checkCentFT0M ? mcCollision.centFT0M() : mcCollision.centFT0C(); mcCollision.centFT0C() isn't filled at the moment; can be added back when it is float eventWeight = mcCollision.weight(); - float pTHat = getPtHatFromHepMCXSection ? mcCollision.mcCollision_as>().ptHard() : 10. / (std::pow(eventWeight, 1.0 / pTHatExponent)); - registry.fill(HIST("h2_mccollision_pthardfromweight_pthardfromhepmcxsection"), 10. / (std::pow(eventWeight, 1.0 / pTHatExponent)), mcCollision.mcCollision_as>().ptHard()); - registry.fill(HIST("h2_mccollision_pthardfromweight_pthardfromhepmcxsection_weighted"), 10. / (std::pow(eventWeight, 1.0 / pTHatExponent)), mcCollision.mcCollision_as>().ptHard(), eventWeight); + float pTHat = mcCollision.ptHard() < 999.0f ? mcCollision.ptHard() : 10. / (std::pow(eventWeight, 1.0 / pTHatExponent)); + registry.fill(HIST("h2_mccollision_pthardfromweight_pthardfromhepmcxsection"), 10. / (std::pow(eventWeight, 1.0 / pTHatExponent)), mcCollision.ptHard()); + registry.fill(HIST("h2_mccollision_pthardfromweight_pthardfromhepmcxsection_weighted"), 10. / (std::pow(eventWeight, 1.0 / pTHatExponent)), mcCollision.ptHard(), eventWeight); float centrality = -1; bool hasSel8Coll = false; bool centralityCheck = false; if (collisions.size() > 1) { // remove and move the if block below under if (collisions.size() < 1) { when mccoll.centFt0C has been fixed if (acceptSplitCollisions == SplitOkCheckFirstAssocCollOnly || acceptSplitCollisions == NonSplitOnly) { // check only that the first reconstructed collision passes the check (for the NonSplitOnly case, there's only one associated collision) - if (jetderiveddatautilities::selectCollision(collisions.begin(), eventSelectionBits, skipMBGapEvents)) { // Skipping MC events that have their first associated collision not reconstructed + if (jetderiveddatautilities::selectCollision(collisions.begin(), eventSelectionBits, skipMBGapEvents, applyRCTSelections)) { // Skipping MC events that have their first associated collision not reconstructed hasSel8Coll = true; } centrality = checkCentFT0M ? collisions.begin().centFT0M() : collisions.begin().centFT0C(); @@ -1169,7 +1159,7 @@ struct TrackEfficiency { } } else if (acceptSplitCollisions == SplitOkCheckAnyAssocColl) { // check that at least one of the reconstructed collisions passes the checks for (auto const& collision : collisions) { - if (jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents)) { // Skipping MC events that have not a single selected reconstructed collision ; effect unclear if mcColl is split + if (jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents, applyRCTSelections)) { // Skipping MC events that have not a single selected reconstructed collision ; effect unclear if mcColl is split hasSel8Coll = true; } centrality = checkCentFT0M ? collision.centFT0M() : collision.centFT0C(); @@ -1221,7 +1211,7 @@ struct TrackEfficiency { void processTrackSelectionHistograms(soa::Filtered::iterator const& collision, soa::Join const& jetTracks, soa::Join const&) { - if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents)) { + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents, applyRCTSelections)) { return; } float centrality = checkCentFT0M ? collision.centFT0M() : collision.centFT0C(); @@ -1275,7 +1265,7 @@ struct TrackEfficiency { registry.fill(HIST("h2_occupancy_ntracksall_presel"), occupancy, nTracksAll); registry.fill(HIST("h2_occupancy_ntrackssel_presel"), occupancy, nTracksAllAcceptanceAndSelected); registry.fill(HIST("h2_occupancy_ntracksselptetacuts_presel"), occupancy, nTracksInAcceptanceAndSelected); - if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents)) { + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents, applyRCTSelections)) { return; } registry.fill(HIST("h2_occupancy_ntracksall_postsel"), occupancy, nTracksAll); From 7706910d0fc8becddab304fa333354a6ceab3d1e Mon Sep 17 00:00:00 2001 From: Joonsuk Date: Sat, 7 Mar 2026 00:19:27 +0100 Subject: [PATCH 2/2] Address review: fail-early matching distance, remove maxMatchingDistance - Remove maxMatchingDistance from all headers and JetMatchingUtilities.h - Non-empty defaults: {0.3, 0.4, 0.5} -> {0.18, 0.24, 0.30} - init() fatal on empty/mismatched vectors - Runtime fatal if jet R not in configured list - Per-R lookup once per R, not per jet - No default empty vectors in function signatures Co-Authored-By: Claude Opus 4.6 --- PWGJE/Core/JetMatchingUtilities.h | 23 +++++++++++-------- .../Duplicates/jetMatchingDuplicates.h | 10 ++++---- .../Substructure/jetSubstructureMatching.h | 10 ++++---- .../Substructure/jetSubstructureMatchingSub.h | 10 ++++---- PWGJE/TableProducer/Matching/jetMatchingMC.h | 10 ++++---- .../TableProducer/Matching/jetMatchingMCSub.h | 10 ++++---- PWGJE/TableProducer/Matching/jetMatchingSub.h | 10 ++++---- 7 files changed, 49 insertions(+), 34 deletions(-) diff --git a/PWGJE/Core/JetMatchingUtilities.h b/PWGJE/Core/JetMatchingUtilities.h index 70235df252e..38c5bc29774 100644 --- a/PWGJE/Core/JetMatchingUtilities.h +++ b/PWGJE/Core/JetMatchingUtilities.h @@ -293,7 +293,7 @@ std::tuple, std::vector> MatchJetsGeometrically( } template -void MatchGeo(T const& jetsBasePerCollision, U const& jetsTagPerCollision, std::vector>& baseToTagMatchingGeo, std::vector>& tagToBaseMatchingGeo, float maxMatchingDistance, std::vector const& jetRadiiForMatchingDistance = {}, std::vector const& maxMatchingDistancePerJetR = {}) +void MatchGeo(T const& jetsBasePerCollision, U const& jetsTagPerCollision, std::vector>& baseToTagMatchingGeo, std::vector>& tagToBaseMatchingGeo, std::vector const& jetRadiiForMatchingDistance, std::vector const& maxMatchingDistancePerJetR) { std::vector jetsR; for (const auto& jetBase : jetsBasePerCollision) { @@ -307,6 +307,16 @@ void MatchGeo(T const& jetsBasePerCollision, U const& jetsTagPerCollision, std:: } } for (auto jetR : jetsR) { + float effectiveMatchingDistance = -1.0f; + for (std::size_t i = 0; i < jetRadiiForMatchingDistance.size(); i++) { + if (std::round(jetRadiiForMatchingDistance[i] * 100.0) == std::round(jetR)) { + effectiveMatchingDistance = maxMatchingDistancePerJetR[i]; + break; + } + } + if (effectiveMatchingDistance < 0.0f) { + LOGP(fatal, "No matching distance configured for jet R={:.2f}. Add it to jetRadiiForMatchingDistance and maxMatchingDistancePerJetR.", jetR / 100.0); + } std::vector jetsBasePhi; std::vector jetsBaseEta; std::vector jetsBaseGlobalIndex; @@ -332,13 +342,6 @@ void MatchGeo(T const& jetsBasePerCollision, U const& jetsTagPerCollision, std:: jetsTagEta.emplace_back(jetTag.eta()); jetsTagGlobalIndex.emplace_back(jetTag.globalIndex()); } - float effectiveMatchingDistance = maxMatchingDistance; - for (std::size_t i = 0; i < jetRadiiForMatchingDistance.size() && i < maxMatchingDistancePerJetR.size(); i++) { - if (std::round(jetRadiiForMatchingDistance[i] * 100.0) == std::round(jetR)) { - effectiveMatchingDistance = maxMatchingDistancePerJetR[i]; - break; - } - } std::tie(baseToTagMatchingGeoIndex, tagToBaseMatchingGeoIndex) = MatchJetsGeometrically(jetsBasePhi, jetsBaseEta, jetsTagPhi, jetsTagEta, effectiveMatchingDistance); int jetBaseIndex = 0; int jetTagIndex = 0; @@ -571,11 +574,11 @@ void MatchPt(T const& jetsBasePerCollision, U const& jetsTagPerCollision, std::v // function that calls all the Match functions template -void doAllMatching(T const& jetsBasePerCollision, U const& jetsTagPerCollision, std::vector>& baseToTagMatchingGeo, std::vector>& baseToTagMatchingPt, std::vector>& baseToTagMatchingHF, std::vector>& tagToBaseMatchingGeo, std::vector>& tagToBaseMatchingPt, std::vector>& tagToBaseMatchingHF, V const& candidatesBase, M const& tracksBase, N const& clustersBase, O const& candidatesTag, P const& tracksTag, R const& clustersTag, bool doMatchingGeo, bool doMatchingHf, bool doMatchingPt, float maxMatchingDistance, float minPtFraction, std::vector const& jetRadiiForMatchingDistance = {}, std::vector const& maxMatchingDistancePerJetR = {}) +void doAllMatching(T const& jetsBasePerCollision, U const& jetsTagPerCollision, std::vector>& baseToTagMatchingGeo, std::vector>& baseToTagMatchingPt, std::vector>& baseToTagMatchingHF, std::vector>& tagToBaseMatchingGeo, std::vector>& tagToBaseMatchingPt, std::vector>& tagToBaseMatchingHF, V const& candidatesBase, M const& tracksBase, N const& clustersBase, O const& candidatesTag, P const& tracksTag, R const& clustersTag, bool doMatchingGeo, bool doMatchingHf, bool doMatchingPt, float minPtFraction, std::vector const& jetRadiiForMatchingDistance, std::vector const& maxMatchingDistancePerJetR) { // geometric matching if (doMatchingGeo) { - MatchGeo(jetsBasePerCollision, jetsTagPerCollision, baseToTagMatchingGeo, tagToBaseMatchingGeo, maxMatchingDistance, jetRadiiForMatchingDistance, maxMatchingDistancePerJetR); + MatchGeo(jetsBasePerCollision, jetsTagPerCollision, baseToTagMatchingGeo, tagToBaseMatchingGeo, jetRadiiForMatchingDistance, maxMatchingDistancePerJetR); } // pt matching if (doMatchingPt) { diff --git a/PWGJE/TableProducer/Matching/Duplicates/jetMatchingDuplicates.h b/PWGJE/TableProducer/Matching/Duplicates/jetMatchingDuplicates.h index 226f3dce803..3fd34a67176 100644 --- a/PWGJE/TableProducer/Matching/Duplicates/jetMatchingDuplicates.h +++ b/PWGJE/TableProducer/Matching/Duplicates/jetMatchingDuplicates.h @@ -34,9 +34,8 @@ struct JetMatchingDuplicates { o2::framework::Configurable doMatchingGeo{"doMatchingGeo", true, "Enable geometric matching"}; o2::framework::Configurable doMatchingPt{"doMatchingPt", true, "Enable pt matching"}; o2::framework::Configurable doMatchingHf{"doMatchingHf", false, "Enable HF matching"}; - o2::framework::Configurable maxMatchingDistance{"maxMatchingDistance", 0.24f, "Max matching distance"}; - o2::framework::Configurable> jetRadiiForMatchingDistance{"jetRadiiForMatchingDistance", {}, "Jet R values for per-R matching distance override, e.g. {0.2, 0.4, 0.6}"}; - o2::framework::Configurable> maxMatchingDistancePerJetR{"maxMatchingDistancePerJetR", {}, "Max matching distance for each R in jetRadiiForMatchingDistance, e.g. {0.12, 0.24, 0.36}"}; + o2::framework::Configurable> jetRadiiForMatchingDistance{"jetRadiiForMatchingDistance", {0.3, 0.4, 0.5}, "Jet R values for per-R matching distance, e.g. {0.2, 0.4, 0.6}"}; + o2::framework::Configurable> maxMatchingDistancePerJetR{"maxMatchingDistancePerJetR", {0.18, 0.24, 0.30}, "Max matching distance for each R in jetRadiiForMatchingDistance, e.g. {0.12, 0.24, 0.36}"}; o2::framework::Configurable minPtFraction{"minPtFraction", 0.5f, "Minimum pt fraction for pt matching"}; o2::framework::Produces jetsBasetoTagMatchingTable; @@ -51,6 +50,9 @@ struct JetMatchingDuplicates { void init(o2::framework::InitContext const&) { + if (jetRadiiForMatchingDistance->empty() || maxMatchingDistancePerJetR->empty()) { + LOGP(fatal, "jetRadiiForMatchingDistance and maxMatchingDistancePerJetR must not be empty"); + } if (jetRadiiForMatchingDistance->size() != maxMatchingDistancePerJetR->size()) { LOGP(fatal, "jetRadiiForMatchingDistance and maxMatchingDistancePerJetR must have the same number of entries"); } @@ -77,7 +79,7 @@ struct JetMatchingDuplicates { const auto jetsBasePerColl = jetsBase.sliceBy(baseJetsPerCollision, collision.globalIndex()); const auto jetsTagPerColl = jetsTag.sliceBy(tagJetsPerCollision, collision.globalIndex()); // initialise template parameters as false since even if they are Mc we are not matching between detector and particle level - jetmatchingutilities::doAllMatching(jetsBasePerColl, jetsTagPerColl, jetsBasetoTagMatchingGeo, jetsBasetoTagMatchingPt, jetsBasetoTagMatchingHF, jetsTagtoBaseMatchingGeo, jetsTagtoBaseMatchingPt, jetsTagtoBaseMatchingHF, candidates, tracks, tracks, candidates, tracks, tracks, doMatchingGeo, doMatchingHf, doMatchingPt, maxMatchingDistance, minPtFraction, jetRadiiForMatchingDistance, maxMatchingDistancePerJetR); + jetmatchingutilities::doAllMatching(jetsBasePerColl, jetsTagPerColl, jetsBasetoTagMatchingGeo, jetsBasetoTagMatchingPt, jetsBasetoTagMatchingHF, jetsTagtoBaseMatchingGeo, jetsTagtoBaseMatchingPt, jetsTagtoBaseMatchingHF, candidates, tracks, tracks, candidates, tracks, tracks, doMatchingGeo, doMatchingHf, doMatchingPt, minPtFraction, jetRadiiForMatchingDistance, maxMatchingDistancePerJetR); } for (auto i = 0; i < jetsBase.size(); ++i) { diff --git a/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatching.h b/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatching.h index 048b9f6dbed..14d2386ed75 100644 --- a/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatching.h +++ b/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatching.h @@ -41,9 +41,8 @@ struct JetSubstructureMatching { o2::framework::Configurable doMatchingGeo{"doMatchingGeo", true, "Enable geometric matching"}; o2::framework::Configurable doMatchingPt{"doMatchingPt", true, "Enable pt matching"}; o2::framework::Configurable doMatchingHf{"doMatchingHf", false, "Enable HF matching"}; - o2::framework::Configurable maxMatchingDistance{"maxMatchingDistance", 0.24f, "Max matching distance"}; - o2::framework::Configurable> jetRadiiForMatchingDistance{"jetRadiiForMatchingDistance", {}, "Jet R values for per-R matching distance override, e.g. {0.2, 0.4, 0.6}"}; - o2::framework::Configurable> maxMatchingDistancePerJetR{"maxMatchingDistancePerJetR", {}, "Max matching distance for each R in jetRadiiForMatchingDistance, e.g. {0.12, 0.24, 0.36}"}; + o2::framework::Configurable> jetRadiiForMatchingDistance{"jetRadiiForMatchingDistance", {0.3, 0.4, 0.5}, "Jet R values for per-R matching distance, e.g. {0.2, 0.4, 0.6}"}; + o2::framework::Configurable> maxMatchingDistancePerJetR{"maxMatchingDistancePerJetR", {0.18, 0.24, 0.30}, "Max matching distance for each R in jetRadiiForMatchingDistance, e.g. {0.12, 0.24, 0.36}"}; o2::framework::Configurable minPtFraction{"minPtFraction", 0.5f, "Minimum pt fraction for pt matching"}; o2::framework::Configurable requireGeoMatchedJets{"requireGeoMatchedJets", false, "require jets are geo matched as well"}; o2::framework::Configurable requirePtMatchedJets{"requirePtMatchedJets", false, "require jets are pT matched as well"}; @@ -54,6 +53,9 @@ struct JetSubstructureMatching { void init(o2::framework::InitContext const&) { + if (jetRadiiForMatchingDistance->empty() || maxMatchingDistancePerJetR->empty()) { + LOGP(fatal, "jetRadiiForMatchingDistance and maxMatchingDistancePerJetR must not be empty"); + } if (jetRadiiForMatchingDistance->size() != maxMatchingDistancePerJetR->size()) { LOGP(fatal, "jetRadiiForMatchingDistance and maxMatchingDistancePerJetR must have the same number of entries"); } @@ -223,7 +225,7 @@ struct JetSubstructureMatching { jetBaseSplittingsMap[jetBaseSplitting.globalIndex()] = baseSplittingIndex; baseSplittingIndex++; } - jetmatchingutilities::doAllMatching(jetBaseSplittings, jetTagSplittings, jetsBasetoTagSplittingsMatchingGeo, jetsBasetoTagSplittingsMatchingPt, jetsBasetoTagSplittingsMatchingHF, jetsTagtoBaseSplittingsMatchingGeo, jetsTagtoBaseSplittingsMatchingPt, jetsTagtoBaseSplittingsMatchingHF, candidatesBase, tracksBase, clustersBase, candidatesTag, tracksTag, tracksTag, doMatchingGeo, doMatchingHf, doMatchingPt, maxMatchingDistance, minPtFraction, jetRadiiForMatchingDistance, maxMatchingDistancePerJetR); + jetmatchingutilities::doAllMatching(jetBaseSplittings, jetTagSplittings, jetsBasetoTagSplittingsMatchingGeo, jetsBasetoTagSplittingsMatchingPt, jetsBasetoTagSplittingsMatchingHF, jetsTagtoBaseSplittingsMatchingGeo, jetsTagtoBaseSplittingsMatchingPt, jetsTagtoBaseSplittingsMatchingHF, candidatesBase, tracksBase, clustersBase, candidatesTag, tracksTag, tracksTag, doMatchingGeo, doMatchingHf, doMatchingPt, minPtFraction, jetRadiiForMatchingDistance, maxMatchingDistancePerJetR); // auto const& jetBasePairs = jetsBasePairs.sliceBy(BasePairsPerBaseJet, jetBase.globalIndex()); auto const& jetBasePairs = slicedPerJetForMatching(jetsBasePairs, jetBase, BasePairsPerBaseJetInclusive, BasePairsPerBaseJetD0, BasePairsPerBaseJetDplus, BasePairsPerBaseJetDs, BasePairsPerBaseJetDstar, BasePairsPerBaseJetLc, BasePairsPerBaseJetB0, BasePairsPerBaseJetBplus, BasePairsPerBaseJetXicToXiPiPi, BasePairsPerBaseJetDielectron); int basePairIndex = 0; diff --git a/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingSub.h b/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingSub.h index 8d25697d220..63fe43df8c9 100644 --- a/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingSub.h +++ b/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingSub.h @@ -42,9 +42,8 @@ struct JetSubstructureMatchingSub { o2::framework::Configurable doMatchingGeo{"doMatchingGeo", true, "Enable geometric matching"}; o2::framework::Configurable doMatchingPt{"doMatchingPt", true, "Enable pt matching"}; o2::framework::Configurable doMatchingHf{"doMatchingHf", false, "Enable HF matching"}; - o2::framework::Configurable maxMatchingDistance{"maxMatchingDistance", 0.24f, "Max matching distance"}; - o2::framework::Configurable> jetRadiiForMatchingDistance{"jetRadiiForMatchingDistance", {}, "Jet R values for per-R matching distance override, e.g. {0.2, 0.4, 0.6}"}; - o2::framework::Configurable> maxMatchingDistancePerJetR{"maxMatchingDistancePerJetR", {}, "Max matching distance for each R in jetRadiiForMatchingDistance, e.g. {0.12, 0.24, 0.36}"}; + o2::framework::Configurable> jetRadiiForMatchingDistance{"jetRadiiForMatchingDistance", {0.3, 0.4, 0.5}, "Jet R values for per-R matching distance, e.g. {0.2, 0.4, 0.6}"}; + o2::framework::Configurable> maxMatchingDistancePerJetR{"maxMatchingDistancePerJetR", {0.18, 0.24, 0.30}, "Max matching distance for each R in jetRadiiForMatchingDistance, e.g. {0.12, 0.24, 0.36}"}; o2::framework::Configurable minPtFraction{"minPtFraction", 0.5f, "Minimum pt fraction for pt matching"}; o2::framework::Configurable requireGeoMatchedJets{"requireGeoMatchedJets", false, "require jets are geo matched as well"}; o2::framework::Configurable requirePtMatchedJets{"requirePtMatchedJets", false, "require jets are pT matched as well"}; @@ -55,6 +54,9 @@ struct JetSubstructureMatchingSub { void init(o2::framework::InitContext const&) { + if (jetRadiiForMatchingDistance->empty() || maxMatchingDistancePerJetR->empty()) { + LOGP(fatal, "jetRadiiForMatchingDistance and maxMatchingDistancePerJetR must not be empty"); + } if (jetRadiiForMatchingDistance->size() != maxMatchingDistancePerJetR->size()) { LOGP(fatal, "jetRadiiForMatchingDistance and maxMatchingDistancePerJetR must have the same number of entries"); } @@ -224,7 +226,7 @@ struct JetSubstructureMatchingSub { jetBaseSplittingsMap[jetBaseSplitting.globalIndex()] = baseSplittingIndex; baseSplittingIndex++; } - jetmatchingutilities::doAllMatching(jetBaseSplittings, jetTagSplittings, jetsBasetoTagSplittingsMatchingGeo, jetsBasetoTagSplittingsMatchingPt, jetsBasetoTagSplittingsMatchingHF, jetsTagtoBaseSplittingsMatchingGeo, jetsTagtoBaseSplittingsMatchingPt, jetsTagtoBaseSplittingsMatchingHF, candidates, tracksBase, clustersBase, candidates, tracksTag, tracksTag, doMatchingGeo, doMatchingHf, doMatchingPt, maxMatchingDistance, minPtFraction, jetRadiiForMatchingDistance, maxMatchingDistancePerJetR); + jetmatchingutilities::doAllMatching(jetBaseSplittings, jetTagSplittings, jetsBasetoTagSplittingsMatchingGeo, jetsBasetoTagSplittingsMatchingPt, jetsBasetoTagSplittingsMatchingHF, jetsTagtoBaseSplittingsMatchingGeo, jetsTagtoBaseSplittingsMatchingPt, jetsTagtoBaseSplittingsMatchingHF, candidates, tracksBase, clustersBase, candidates, tracksTag, tracksTag, doMatchingGeo, doMatchingHf, doMatchingPt, minPtFraction, jetRadiiForMatchingDistance, maxMatchingDistancePerJetR); // auto const& jetBasePairs = jetsBasePairs.sliceBy(BasePairsPerBaseJet, jetBase.globalIndex()); auto const& jetBasePairs = slicedPerJetForMatching(jetsBasePairs, jetBase, BasePairsPerBaseJetInclusive, BasePairsPerBaseJetD0, BasePairsPerBaseJetDplus, BasePairsPerBaseJetDs, BasePairsPerBaseJetDstar, BasePairsPerBaseJetLc, BasePairsPerBaseJetB0, BasePairsPerBaseJetBplus, BasePairsPerBaseJetXicToXiPiPi, BasePairsPerBaseJetDielectron); int basePairIndex = 0; diff --git a/PWGJE/TableProducer/Matching/jetMatchingMC.h b/PWGJE/TableProducer/Matching/jetMatchingMC.h index 380bde57092..10f5ac48f24 100644 --- a/PWGJE/TableProducer/Matching/jetMatchingMC.h +++ b/PWGJE/TableProducer/Matching/jetMatchingMC.h @@ -37,9 +37,8 @@ struct JetMatchingMc { o2::framework::Configurable doMatchingGeo{"doMatchingGeo", true, "Enable geometric matching"}; o2::framework::Configurable doMatchingPt{"doMatchingPt", true, "Enable pt matching"}; o2::framework::Configurable doMatchingHf{"doMatchingHf", false, "Enable HF matching"}; - o2::framework::Configurable maxMatchingDistance{"maxMatchingDistance", 0.24f, "Max matching distance"}; - o2::framework::Configurable> jetRadiiForMatchingDistance{"jetRadiiForMatchingDistance", {}, "Jet R values for per-R matching distance override, e.g. {0.2, 0.4, 0.6}"}; - o2::framework::Configurable> maxMatchingDistancePerJetR{"maxMatchingDistancePerJetR", {}, "Max matching distance for each R in jetRadiiForMatchingDistance, e.g. {0.12, 0.24, 0.36}"}; + o2::framework::Configurable> jetRadiiForMatchingDistance{"jetRadiiForMatchingDistance", {0.3, 0.4, 0.5}, "Jet R values for per-R matching distance, e.g. {0.2, 0.4, 0.6}"}; + o2::framework::Configurable> maxMatchingDistancePerJetR{"maxMatchingDistancePerJetR", {0.18, 0.24, 0.30}, "Max matching distance for each R in jetRadiiForMatchingDistance, e.g. {0.12, 0.24, 0.36}"}; o2::framework::Configurable minPtFraction{"minPtFraction", 0.5f, "Minimum pt fraction for pt matching"}; o2::framework::Produces jetsBasetoTagMatchingTable; @@ -56,6 +55,9 @@ struct JetMatchingMc { void init(o2::framework::InitContext const&) { + if (jetRadiiForMatchingDistance->empty() || maxMatchingDistancePerJetR->empty()) { + LOGP(fatal, "jetRadiiForMatchingDistance and maxMatchingDistancePerJetR must not be empty"); + } if (jetRadiiForMatchingDistance->size() != maxMatchingDistancePerJetR->size()) { LOGP(fatal, "jetRadiiForMatchingDistance and maxMatchingDistancePerJetR must have the same number of entries"); } @@ -89,7 +91,7 @@ struct JetMatchingMc { const auto jetsBasePerColl = jetsBase.sliceBy(baseJetsPerCollision, jetsBaseIsMc ? mcCollision.globalIndex() : collision.globalIndex()); const auto jetsTagPerColl = jetsTag.sliceBy(tagJetsPerCollision, jetsTagIsMc ? mcCollision.globalIndex() : collision.globalIndex()); - jetmatchingutilities::doAllMatching(jetsBasePerColl, jetsTagPerColl, jetsBasetoTagMatchingGeo, jetsBasetoTagMatchingPt, jetsBasetoTagMatchingHF, jetsTagtoBaseMatchingGeo, jetsTagtoBaseMatchingPt, jetsTagtoBaseMatchingHF, candidatesBase, tracks, clusters, candidatesTag, particles, particles, doMatchingGeo, doMatchingHf, doMatchingPt, maxMatchingDistance, minPtFraction, jetRadiiForMatchingDistance, maxMatchingDistancePerJetR); + jetmatchingutilities::doAllMatching(jetsBasePerColl, jetsTagPerColl, jetsBasetoTagMatchingGeo, jetsBasetoTagMatchingPt, jetsBasetoTagMatchingHF, jetsTagtoBaseMatchingGeo, jetsTagtoBaseMatchingPt, jetsTagtoBaseMatchingHF, candidatesBase, tracks, clusters, candidatesTag, particles, particles, doMatchingGeo, doMatchingHf, doMatchingPt, minPtFraction, jetRadiiForMatchingDistance, maxMatchingDistancePerJetR); } } for (auto i = 0; i < jetsBase.size(); ++i) { diff --git a/PWGJE/TableProducer/Matching/jetMatchingMCSub.h b/PWGJE/TableProducer/Matching/jetMatchingMCSub.h index 3ccff25302e..3688f2a3376 100644 --- a/PWGJE/TableProducer/Matching/jetMatchingMCSub.h +++ b/PWGJE/TableProducer/Matching/jetMatchingMCSub.h @@ -33,9 +33,8 @@ struct JetMatchingMcSub { o2::framework::Configurable doMatchingGeo{"doMatchingGeo", true, "Enable geometric matching"}; o2::framework::Configurable doMatchingPt{"doMatchingPt", true, "Enable pt matching"}; o2::framework::Configurable doMatchingHf{"doMatchingHf", false, "Enable HF matching"}; - o2::framework::Configurable maxMatchingDistance{"maxMatchingDistance", 0.24f, "Max matching distance"}; - o2::framework::Configurable> jetRadiiForMatchingDistance{"jetRadiiForMatchingDistance", {}, "Jet R values for per-R matching distance override, e.g. {0.2, 0.4, 0.6}"}; - o2::framework::Configurable> maxMatchingDistancePerJetR{"maxMatchingDistancePerJetR", {}, "Max matching distance for each R in jetRadiiForMatchingDistance, e.g. {0.12, 0.24, 0.36}"}; + o2::framework::Configurable> jetRadiiForMatchingDistance{"jetRadiiForMatchingDistance", {0.3, 0.4, 0.5}, "Jet R values for per-R matching distance, e.g. {0.2, 0.4, 0.6}"}; + o2::framework::Configurable> maxMatchingDistancePerJetR{"maxMatchingDistancePerJetR", {0.18, 0.24, 0.30}, "Max matching distance for each R in jetRadiiForMatchingDistance, e.g. {0.12, 0.24, 0.36}"}; o2::framework::Configurable minPtFraction{"minPtFraction", 0.5f, "Minimum pt fraction for pt matching"}; o2::framework::Produces jetsBasetoTagMatchingTable; @@ -50,6 +49,9 @@ struct JetMatchingMcSub { void init(o2::framework::InitContext const&) { + if (jetRadiiForMatchingDistance->empty() || maxMatchingDistancePerJetR->empty()) { + LOGP(fatal, "jetRadiiForMatchingDistance and maxMatchingDistancePerJetR must not be empty"); + } if (jetRadiiForMatchingDistance->size() != maxMatchingDistancePerJetR->size()) { LOGP(fatal, "jetRadiiForMatchingDistance and maxMatchingDistancePerJetR must have the same number of entries"); } @@ -78,7 +80,7 @@ struct JetMatchingMcSub { const auto jetsBasePerColl = jetsBase.sliceBy(baseJetsPerCollision, collision.globalIndex()); const auto jetsTagPerColl = jetsTag.sliceBy(tagJetsPerCollision, collision.globalIndex()); - jetmatchingutilities::doAllMatching(jetsBasePerColl, jetsTagPerColl, jetsBasetoTagMatchingGeo, jetsBasetoTagMatchingPt, jetsBasetoTagMatchingHF, jetsTagtoBaseMatchingGeo, jetsTagtoBaseMatchingPt, jetsTagtoBaseMatchingHF, candidates, tracks, tracks, candidates, tracksSub, tracksSub, doMatchingGeo, doMatchingHf, doMatchingPt, maxMatchingDistance, minPtFraction, jetRadiiForMatchingDistance, maxMatchingDistancePerJetR); + jetmatchingutilities::doAllMatching(jetsBasePerColl, jetsTagPerColl, jetsBasetoTagMatchingGeo, jetsBasetoTagMatchingPt, jetsBasetoTagMatchingHF, jetsTagtoBaseMatchingGeo, jetsTagtoBaseMatchingPt, jetsTagtoBaseMatchingHF, candidates, tracks, tracks, candidates, tracksSub, tracksSub, doMatchingGeo, doMatchingHf, doMatchingPt, minPtFraction, jetRadiiForMatchingDistance, maxMatchingDistancePerJetR); } for (auto i = 0; i < jetsBase.size(); ++i) { diff --git a/PWGJE/TableProducer/Matching/jetMatchingSub.h b/PWGJE/TableProducer/Matching/jetMatchingSub.h index 942b8ebf8ce..ad6f5574537 100644 --- a/PWGJE/TableProducer/Matching/jetMatchingSub.h +++ b/PWGJE/TableProducer/Matching/jetMatchingSub.h @@ -34,9 +34,8 @@ struct JetMatchingSub { o2::framework::Configurable doMatchingGeo{"doMatchingGeo", true, "Enable geometric matching"}; o2::framework::Configurable doMatchingPt{"doMatchingPt", true, "Enable pt matching"}; o2::framework::Configurable doMatchingHf{"doMatchingHf", false, "Enable HF matching"}; - o2::framework::Configurable maxMatchingDistance{"maxMatchingDistance", 0.24f, "Max matching distance"}; - o2::framework::Configurable> jetRadiiForMatchingDistance{"jetRadiiForMatchingDistance", {}, "Jet R values for per-R matching distance override, e.g. {0.2, 0.4, 0.6}"}; - o2::framework::Configurable> maxMatchingDistancePerJetR{"maxMatchingDistancePerJetR", {}, "Max matching distance for each R in jetRadiiForMatchingDistance, e.g. {0.12, 0.24, 0.36}"}; + o2::framework::Configurable> jetRadiiForMatchingDistance{"jetRadiiForMatchingDistance", {0.3, 0.4, 0.5}, "Jet R values for per-R matching distance, e.g. {0.2, 0.4, 0.6}"}; + o2::framework::Configurable> maxMatchingDistancePerJetR{"maxMatchingDistancePerJetR", {0.18, 0.24, 0.30}, "Max matching distance for each R in jetRadiiForMatchingDistance, e.g. {0.12, 0.24, 0.36}"}; o2::framework::Configurable minPtFraction{"minPtFraction", 0.5f, "Minimum pt fraction for pt matching"}; o2::framework::Produces jetsBasetoTagMatchingTable; @@ -51,6 +50,9 @@ struct JetMatchingSub { void init(o2::framework::InitContext const&) { + if (jetRadiiForMatchingDistance->empty() || maxMatchingDistancePerJetR->empty()) { + LOGP(fatal, "jetRadiiForMatchingDistance and maxMatchingDistancePerJetR must not be empty"); + } if (jetRadiiForMatchingDistance->size() != maxMatchingDistancePerJetR->size()) { LOGP(fatal, "jetRadiiForMatchingDistance and maxMatchingDistancePerJetR must have the same number of entries"); } @@ -77,7 +79,7 @@ struct JetMatchingSub { const auto jetsBasePerColl = jetsBase.sliceBy(baseJetsPerCollision, collision.globalIndex()); const auto jetsTagPerColl = jetsTag.sliceBy(tagJetsPerCollision, collision.globalIndex()); - jetmatchingutilities::doAllMatching(jetsBasePerColl, jetsTagPerColl, jetsBasetoTagMatchingGeo, jetsBasetoTagMatchingPt, jetsBasetoTagMatchingHF, jetsTagtoBaseMatchingGeo, jetsTagtoBaseMatchingPt, jetsTagtoBaseMatchingHF, candidates, tracks, tracks, candidates, tracksSub, tracksSub, doMatchingGeo, doMatchingHf, doMatchingPt, maxMatchingDistance, minPtFraction, jetRadiiForMatchingDistance, maxMatchingDistancePerJetR); + jetmatchingutilities::doAllMatching(jetsBasePerColl, jetsTagPerColl, jetsBasetoTagMatchingGeo, jetsBasetoTagMatchingPt, jetsBasetoTagMatchingHF, jetsTagtoBaseMatchingGeo, jetsTagtoBaseMatchingPt, jetsTagtoBaseMatchingHF, candidates, tracks, tracks, candidates, tracksSub, tracksSub, doMatchingGeo, doMatchingHf, doMatchingPt, minPtFraction, jetRadiiForMatchingDistance, maxMatchingDistancePerJetR); } for (auto i = 0; i < jetsBase.size(); ++i) {