Skip to content

Commit 3e8d5b5

Browse files
joonsukbaeclaude
andcommitted
[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. - jetMatchingMC/JetMatchingUtilities: Replace single maxMatchingDistance with per-R configurables (jetRadiiForMatchingDistance + maxMatchingDistancePerJetR) for R-dependent geometric matching. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 66e2ecf commit 3e8d5b5

File tree

4 files changed

+94
-96
lines changed

4 files changed

+94
-96
lines changed

PWGJE/Core/JetMatchingUtilities.h

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,7 @@ std::tuple<std::vector<int>, std::vector<int>> MatchJetsGeometrically(
293293
}
294294

295295
template <typename T, typename U>
296-
void MatchGeo(T const& jetsBasePerCollision, U const& jetsTagPerCollision, std::vector<std::vector<int>>& baseToTagMatchingGeo, std::vector<std::vector<int>>& tagToBaseMatchingGeo, float maxMatchingDistance)
296+
void MatchGeo(T const& jetsBasePerCollision, U const& jetsTagPerCollision, std::vector<std::vector<int>>& baseToTagMatchingGeo, std::vector<std::vector<int>>& tagToBaseMatchingGeo, float maxMatchingDistance, std::vector<double> const& jetRadiiForMatchingDistance = {}, std::vector<double> const& maxMatchingDistancePerJetR = {})
297297
{
298298
std::vector<double> jetsR;
299299
for (const auto& jetBase : jetsBasePerCollision) {
@@ -332,7 +332,14 @@ void MatchGeo(T const& jetsBasePerCollision, U const& jetsTagPerCollision, std::
332332
jetsTagEta.emplace_back(jetTag.eta());
333333
jetsTagGlobalIndex.emplace_back(jetTag.globalIndex());
334334
}
335-
std::tie(baseToTagMatchingGeoIndex, tagToBaseMatchingGeoIndex) = MatchJetsGeometrically(jetsBasePhi, jetsBaseEta, jetsTagPhi, jetsTagEta, maxMatchingDistance); // change max distnace to a function call
335+
float effectiveMatchingDistance = maxMatchingDistance;
336+
for (std::size_t i = 0; i < jetRadiiForMatchingDistance.size() && i < maxMatchingDistancePerJetR.size(); i++) {
337+
if (std::round(jetRadiiForMatchingDistance[i] * 100.0) == std::round(jetR)) {
338+
effectiveMatchingDistance = maxMatchingDistancePerJetR[i];
339+
break;
340+
}
341+
}
342+
std::tie(baseToTagMatchingGeoIndex, tagToBaseMatchingGeoIndex) = MatchJetsGeometrically(jetsBasePhi, jetsBaseEta, jetsTagPhi, jetsTagEta, effectiveMatchingDistance);
336343
int jetBaseIndex = 0;
337344
int jetTagIndex = 0;
338345
for (const auto& jetBase : jetsBasePerCollision) {
@@ -564,11 +571,11 @@ void MatchPt(T const& jetsBasePerCollision, U const& jetsTagPerCollision, std::v
564571

565572
// function that calls all the Match functions
566573
template <bool jetsBaseIsMc, bool jetsTagIsMc, typename T, typename U, typename V, typename M, typename N, typename O, typename P, typename R>
567-
void doAllMatching(T const& jetsBasePerCollision, U const& jetsTagPerCollision, std::vector<std::vector<int>>& baseToTagMatchingGeo, std::vector<std::vector<int>>& baseToTagMatchingPt, std::vector<std::vector<int>>& baseToTagMatchingHF, std::vector<std::vector<int>>& tagToBaseMatchingGeo, std::vector<std::vector<int>>& tagToBaseMatchingPt, std::vector<std::vector<int>>& 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)
574+
void doAllMatching(T const& jetsBasePerCollision, U const& jetsTagPerCollision, std::vector<std::vector<int>>& baseToTagMatchingGeo, std::vector<std::vector<int>>& baseToTagMatchingPt, std::vector<std::vector<int>>& baseToTagMatchingHF, std::vector<std::vector<int>>& tagToBaseMatchingGeo, std::vector<std::vector<int>>& tagToBaseMatchingPt, std::vector<std::vector<int>>& 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<double> const& jetRadiiForMatchingDistance = {}, std::vector<double> const& maxMatchingDistancePerJetR = {})
568575
{
569576
// geometric matching
570577
if (doMatchingGeo) {
571-
MatchGeo(jetsBasePerCollision, jetsTagPerCollision, baseToTagMatchingGeo, tagToBaseMatchingGeo, maxMatchingDistance);
578+
MatchGeo(jetsBasePerCollision, jetsTagPerCollision, baseToTagMatchingGeo, tagToBaseMatchingGeo, maxMatchingDistance, jetRadiiForMatchingDistance, maxMatchingDistancePerJetR);
572579
}
573580
// pt matching
574581
if (doMatchingPt) {

PWGJE/TableProducer/Matching/jetMatchingMC.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@ struct JetMatchingMc {
3737
o2::framework::Configurable<bool> doMatchingGeo{"doMatchingGeo", true, "Enable geometric matching"};
3838
o2::framework::Configurable<bool> doMatchingPt{"doMatchingPt", true, "Enable pt matching"};
3939
o2::framework::Configurable<bool> doMatchingHf{"doMatchingHf", false, "Enable HF matching"};
40-
o2::framework::Configurable<float> maxMatchingDistance{"maxMatchingDistance", 0.24f, "Max matching distance"};
40+
o2::framework::Configurable<std::vector<double>> jetRadiiForMatchingDistance{"jetRadiiForMatchingDistance", {0.4}, "Jet R values for per-R matching distance, e.g. {0.2, 0.4, 0.6}"};
41+
o2::framework::Configurable<std::vector<double>> maxMatchingDistancePerJetR{"maxMatchingDistancePerJetR", {0.24}, "Max matching distance for each R in jetRadiiForMatchingDistance, e.g. {0.12, 0.24, 0.36}"};
4142
o2::framework::Configurable<float> minPtFraction{"minPtFraction", 0.5f, "Minimum pt fraction for pt matching"};
4243

4344
o2::framework::Produces<JetsBasetoTagMatchingTable> jetsBasetoTagMatchingTable;
@@ -54,6 +55,9 @@ struct JetMatchingMc {
5455

5556
void init(o2::framework::InitContext const&)
5657
{
58+
if (jetRadiiForMatchingDistance->size() != maxMatchingDistancePerJetR->size()) {
59+
LOGP(fatal, "jetRadiiForMatchingDistance and maxMatchingDistancePerJetR must have the same number of entries");
60+
}
5761
}
5862

5963
void processJets(o2::aod::JetMcCollisions const& mcCollisions, o2::aod::JetCollisionsMCD const& collisions,
@@ -84,7 +88,7 @@ struct JetMatchingMc {
8488
const auto jetsBasePerColl = jetsBase.sliceBy(baseJetsPerCollision, jetsBaseIsMc ? mcCollision.globalIndex() : collision.globalIndex());
8589
const auto jetsTagPerColl = jetsTag.sliceBy(tagJetsPerCollision, jetsTagIsMc ? mcCollision.globalIndex() : collision.globalIndex());
8690

87-
jetmatchingutilities::doAllMatching<jetsBaseIsMc, jetsTagIsMc>(jetsBasePerColl, jetsTagPerColl, jetsBasetoTagMatchingGeo, jetsBasetoTagMatchingPt, jetsBasetoTagMatchingHF, jetsTagtoBaseMatchingGeo, jetsTagtoBaseMatchingPt, jetsTagtoBaseMatchingHF, candidatesBase, tracks, clusters, candidatesTag, particles, particles, doMatchingGeo, doMatchingHf, doMatchingPt, maxMatchingDistance, minPtFraction);
91+
jetmatchingutilities::doAllMatching<jetsBaseIsMc, jetsTagIsMc>(jetsBasePerColl, jetsTagPerColl, jetsBasetoTagMatchingGeo, jetsBasetoTagMatchingPt, jetsBasetoTagMatchingHF, jetsTagtoBaseMatchingGeo, jetsTagtoBaseMatchingPt, jetsTagtoBaseMatchingHF, candidatesBase, tracks, clusters, candidatesTag, particles, particles, doMatchingGeo, doMatchingHf, doMatchingPt, 0.24f, minPtFraction, jetRadiiForMatchingDistance, maxMatchingDistancePerJetR);
8892
}
8993
}
9094
for (auto i = 0; i < jetsBase.size(); ++i) {

PWGJE/Tasks/jetSpectraCharged.cxx

Lines changed: 29 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -463,9 +463,8 @@ struct JetSpectraCharged {
463463
}
464464

465465
template <typename TJets>
466-
void fillJetHistograms(TJets const& jet, float centrality, float weight = 1.0)
466+
void fillJetHistograms(TJets const& jet, float centrality, float weight = 1.0, float pTHat = 999.0)
467467
{
468-
float pTHat = 10. / (std::pow(weight, 1.0 / pTHatExponent));
469468
if (jet.pt() > pTHatMaxMCD * pTHat || pTHat < pTHatAbsoluteMin) {
470469
return;
471470
}
@@ -487,9 +486,8 @@ struct JetSpectraCharged {
487486
}
488487

489488
template <typename TJets>
490-
void fillJetAreaSubHistograms(TJets const& jet, float centrality, float rho, float weight = 1.0)
489+
void fillJetAreaSubHistograms(TJets const& jet, float centrality, float rho, float weight = 1.0, float pTHat = 999.0)
491490
{
492-
float pTHat = 10. / (std::pow(weight, 1.0 / pTHatExponent));
493491
if (jet.pt() > pTHatMaxMCD * pTHat || pTHat < pTHatAbsoluteMin) {
494492
return;
495493
}
@@ -516,9 +514,8 @@ struct JetSpectraCharged {
516514
}
517515

518516
template <typename TJets>
519-
void fillMCPHistograms(TJets const& jet, float weight = 1.0)
517+
void fillMCPHistograms(TJets const& jet, float weight = 1.0, float pTHat = 999.0)
520518
{
521-
float pTHat = 10. / (std::pow(weight, 1.0 / pTHatExponent));
522519
if (jet.pt() > pTHatMaxMCP * pTHat || pTHat < pTHatAbsoluteMin) {
523520
return;
524521
}
@@ -538,9 +535,8 @@ struct JetSpectraCharged {
538535
}
539536

540537
template <typename TJets>
541-
void fillMCPAreaSubHistograms(TJets const& jet, float rho = 0.0, float weight = 1.0)
538+
void fillMCPAreaSubHistograms(TJets const& jet, float rho = 0.0, float weight = 1.0, float pTHat = 999.0)
542539
{
543-
float pTHat = 10. / (std::pow(weight, 1.0 / pTHatExponent));
544540
if (jet.pt() > pTHatMaxMCP * pTHat || pTHat < pTHatAbsoluteMin) {
545541
return;
546542
}
@@ -559,9 +555,8 @@ struct JetSpectraCharged {
559555
}
560556

561557
template <typename TJets>
562-
void fillEventWiseConstituentSubtractedHistograms(TJets const& jet, float centrality, float weight = 1.0)
558+
void fillEventWiseConstituentSubtractedHistograms(TJets const& jet, float centrality, float weight = 1.0, float pTHat = 999.0)
563559
{
564-
float pTHat = 10. / (std::pow(weight, 1.0 / pTHatExponent));
565560
if (jet.pt() > pTHatMaxMCD * pTHat || pTHat < pTHatAbsoluteMin) {
566561
return;
567562
}
@@ -572,9 +567,8 @@ struct JetSpectraCharged {
572567
}
573568

574569
template <typename TBase, typename TTag>
575-
void fillMatchedHistograms(TBase const& jetMCD, float weight = 1.0)
570+
void fillMatchedHistograms(TBase const& jetMCD, float weight = 1.0, float pTHat = 999.0)
576571
{
577-
float pTHat = 10. / (std::pow(weight, 1.0 / pTHatExponent));
578572
if (jetMCD.pt() > pTHatMaxMCD * pTHat || pTHat < pTHatAbsoluteMin) {
579573
return;
580574
}
@@ -665,15 +659,14 @@ struct JetSpectraCharged {
665659
}
666660

667661
template <typename TBase, typename TTag>
668-
void fillGeoMatchedAreaSubHistograms(TBase const& jetMCD, float rho, float mcrho = 0.0, float weight = 1.0)
662+
void fillGeoMatchedAreaSubHistograms(TBase const& jetMCD, float rho, float mcrho = 0.0, float weight = 1.0, float pTHat = 999.0)
669663
{
670-
float pTHat = 10. / (std::pow(weight, 1.0 / pTHatExponent));
671664
if (jetMCD.pt() > pTHatMaxMCD * pTHat) {
672665
return;
673666
}
674667
if (jetMCD.has_matchedJetGeo()) {
675668
for (const auto& jetMCP : jetMCD.template matchedJetGeo_as<std::decay_t<TTag>>()) {
676-
if (jetMCP.pt() > pTHatMaxMCD * pTHat) {
669+
if (jetMCP.pt() > pTHatMaxMCP * pTHat) {
677670
continue;
678671
}
679672
if (jetMCD.r() == round(selectedJetsRadius * 100.0f)) {
@@ -848,17 +841,18 @@ struct JetSpectraCharged {
848841
}
849842
PROCESS_SWITCH(JetSpectraCharged, processSpectraAreaSubMCD, "jet spectra with rho-area subtraction for MCD", false);
850843

851-
void processSpectraMCDWeighted(soa::Filtered<aod::JetCollisions>::iterator const& collision,
844+
void processSpectraMCDWeighted(soa::Filtered<aod::JetCollisionsMCD>::iterator const& collision,
852845
soa::Join<aod::ChargedMCDetectorLevelJets, aod::ChargedMCDetectorLevelJetConstituents> const& jets,
853-
aod::JetTracks const&)
846+
aod::JetTracks const&,
847+
aod::JetMcCollisions const&)
854848
{
855849
bool fillHistograms = false;
856850
bool isWeighted = true;
857851
float eventWeight = collision.weight();
858852
if (!applyCollisionCuts(collision, fillHistograms, isWeighted, eventWeight)) {
859853
return;
860854
}
861-
855+
float pTHat = collision.has_mcCollision() && collision.mcCollision().ptHard() < 999.0f ? collision.mcCollision().ptHard() : 10. / (std::pow(eventWeight, 1.0 / pTHatExponent));
862856
float centrality = -1.0;
863857
checkCentFT0M ? centrality = collision.centFT0M() : centrality = collision.centFT0C();
864858

@@ -869,22 +863,23 @@ struct JetSpectraCharged {
869863
if (!isAcceptedJet<aod::JetTracks>(jet)) {
870864
continue;
871865
}
872-
fillJetHistograms(jet, centrality, eventWeight);
866+
fillJetHistograms(jet, centrality, eventWeight, pTHat);
873867
}
874868
}
875869
PROCESS_SWITCH(JetSpectraCharged, processSpectraMCDWeighted, "jet finder QA mcd with weighted events", false);
876870

877-
void processSpectraAreaSubMCDWeighted(soa::Filtered<soa::Join<aod::JetCollisions, aod::BkgChargedRhos>>::iterator const& collision,
871+
void processSpectraAreaSubMCDWeighted(soa::Filtered<soa::Join<aod::JetCollisionsMCD, aod::BkgChargedRhos>>::iterator const& collision,
878872
soa::Join<aod::ChargedMCDetectorLevelJets, aod::ChargedMCDetectorLevelJetConstituents> const& jets,
879-
aod::JetTracks const&)
873+
aod::JetTracks const&,
874+
aod::JetMcCollisions const&)
880875
{
881876
bool fillHistograms = false;
882877
bool isWeighted = true;
883878
float eventWeight = collision.weight();
884879
if (!applyCollisionCuts(collision, fillHistograms, isWeighted, eventWeight)) {
885880
return;
886881
}
887-
882+
float pTHat = collision.has_mcCollision() && collision.mcCollision().ptHard() < 999.0f ? collision.mcCollision().ptHard() : 10. / (std::pow(eventWeight, 1.0 / pTHatExponent));
888883
float centrality = -1.0;
889884
checkCentFT0M ? centrality = collision.centFT0M() : centrality = collision.centFT0C();
890885

@@ -895,7 +890,7 @@ struct JetSpectraCharged {
895890
if (!isAcceptedJet<aod::JetTracks>(jet)) {
896891
continue;
897892
}
898-
fillJetAreaSubHistograms(jet, centrality, collision.rho(), eventWeight);
893+
fillJetAreaSubHistograms(jet, centrality, collision.rho(), eventWeight, pTHat);
899894
}
900895
}
901896
PROCESS_SWITCH(JetSpectraCharged, processSpectraAreaSubMCDWeighted, "jet spectra with rho-area subtraction for MCD", false);
@@ -1127,22 +1122,21 @@ struct JetSpectraCharged {
11271122
if (!applyMCCollisionCuts(mccollision, collisions, fillHistograms, isWeighted, eventWeight)) {
11281123
return;
11291124
}
1130-
1125+
float pTHat = mccollision.ptHard() < 999.0f ? mccollision.ptHard() : 10. / (std::pow(eventWeight, 1.0 / pTHatExponent));
11311126
for (auto const& jet : jets) {
11321127
if (!jetfindingutilities::isInEtaAcceptance(jet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) {
11331128
continue;
11341129
}
11351130
if (!isAcceptedJet<aod::JetParticles>(jet, mcLevelIsParticleLevel)) {
11361131
continue;
11371132
}
1138-
double pTHat = 10. / (std::pow(eventWeight, 1.0 / pTHatExponent));
11391133
int Nmax = 21;
11401134
for (int N = 1; N < Nmax; N++) {
11411135
if (jet.pt() < N * 0.25 * pTHat && jet.r() == round(selectedJetsRadius * 100.0f)) {
11421136
registry.fill(HIST("h2_jet_ptcut_part"), jet.pt(), N * 0.25, eventWeight);
11431137
}
11441138
}
1145-
fillMCPHistograms(jet, eventWeight);
1139+
fillMCPHistograms(jet, eventWeight, pTHat);
11461140
}
11471141
}
11481142
PROCESS_SWITCH(JetSpectraCharged, processSpectraMCPWeighted, "jet spectra for MC particle level weighted", false);
@@ -1160,6 +1154,7 @@ struct JetSpectraCharged {
11601154
if (!applyMCCollisionCuts(mccollision, collisions, fillHistograms, isWeighted, eventWeight)) {
11611155
return;
11621156
}
1157+
float pTHat = mccollision.ptHard() < 999.0f ? mccollision.ptHard() : 10. / (std::pow(eventWeight, 1.0 / pTHatExponent));
11631158
registry.fill(HIST("h_mccollisions_rho"), mccollision.rho(), eventWeight);
11641159

11651160
for (auto const& jet : jets) {
@@ -1169,7 +1164,7 @@ struct JetSpectraCharged {
11691164
if (!isAcceptedJet<aod::JetParticles>(jet, mcLevelIsParticleLevel)) {
11701165
continue;
11711166
}
1172-
fillMCPAreaSubHistograms(jet, mccollision.rho(), eventWeight);
1167+
fillMCPAreaSubHistograms(jet, mccollision.rho(), eventWeight, pTHat);
11731168
}
11741169
}
11751170
PROCESS_SWITCH(JetSpectraCharged, processSpectraAreaSubMCPWeighted, "jet spectra with area-based subtraction for MC particle level", false);
@@ -1238,23 +1233,24 @@ struct JetSpectraCharged {
12381233
}
12391234
PROCESS_SWITCH(JetSpectraCharged, processJetsMatched, "matched mcp and mcd jets", false);
12401235

1241-
void processJetsMatchedWeighted(soa::Filtered<aod::JetCollisions>::iterator const& collision,
1236+
void processJetsMatchedWeighted(soa::Filtered<aod::JetCollisionsMCD>::iterator const& collision,
12421237
ChargedMCDMatchedJets const& mcdjets,
12431238
ChargedMCPMatchedJets const&,
1244-
aod::JetTracks const&, aod::JetParticles const&)
1239+
aod::JetTracks const&, aod::JetParticles const&,
1240+
aod::JetMcCollisions const&)
12451241
{
12461242
bool fillHistograms = false;
12471243
bool isWeighted = true;
12481244
float eventWeight = collision.weight();
12491245
if (!applyCollisionCuts(collision, fillHistograms, isWeighted, eventWeight)) {
12501246
return;
12511247
}
1252-
1248+
float pTHat = collision.has_mcCollision() && collision.mcCollision().ptHard() < 999.0f ? collision.mcCollision().ptHard() : 10. / (std::pow(eventWeight, 1.0 / pTHatExponent));
12531249
for (const auto& mcdjet : mcdjets) {
12541250
if (!isAcceptedJet<aod::JetTracks>(mcdjet)) {
12551251
continue;
12561252
}
1257-
fillMatchedHistograms<ChargedMCDMatchedJets::iterator, ChargedMCPMatchedJets>(mcdjet, eventWeight);
1253+
fillMatchedHistograms<ChargedMCDMatchedJets::iterator, ChargedMCPMatchedJets>(mcdjet, eventWeight, pTHat);
12581254
}
12591255
}
12601256
PROCESS_SWITCH(JetSpectraCharged, processJetsMatchedWeighted, "matched mcp and mcd jets with weighted events", false);
@@ -1292,14 +1288,15 @@ struct JetSpectraCharged {
12921288
if (!applyCollisionCuts(collision, fillHistograms, isWeighted, eventWeight)) {
12931289
return;
12941290
}
1291+
float pTHat = collision.has_mcCollision() && collision.mcCollision().ptHard() < 999.0f ? collision.mcCollision().ptHard() : 10. / (std::pow(eventWeight, 1.0 / pTHatExponent));
12951292

12961293
double mcrho = collision.has_mcCollision() ? collision.mcCollision_as<JetBkgRhoMcCollisions>().rho() : -1;
12971294

12981295
for (const auto& mcdjet : mcdjets) {
12991296
if (!isAcceptedJet<aod::JetTracks>(mcdjet)) {
13001297
continue;
13011298
}
1302-
fillGeoMatchedAreaSubHistograms<ChargedMCDMatchedJets::iterator, ChargedMCPMatchedJets>(mcdjet, collision.rho(), mcrho, eventWeight);
1299+
fillGeoMatchedAreaSubHistograms<ChargedMCDMatchedJets::iterator, ChargedMCPMatchedJets>(mcdjet, collision.rho(), mcrho, eventWeight, pTHat);
13031300
}
13041301
}
13051302
PROCESS_SWITCH(JetSpectraCharged, processJetsMatchedAreaSubWeighted, "matched mcp and mcd jets after area-based pt subtraction with weighted events", false);

0 commit comments

Comments
 (0)