From f48a522efc8cf2dcb4fc3d93ed5ef940676909cf Mon Sep 17 00:00:00 2001 From: Changhwan Choi Date: Fri, 22 May 2026 16:18:33 +0900 Subject: [PATCH 1/8] GNN b-jet MCP jet spectrum and response matrix revised, track DCA study updated --- PWGJE/Tasks/bjetTaggingGnn.cxx | 97 +++++++++++++++++++++------------- 1 file changed, 61 insertions(+), 36 deletions(-) diff --git a/PWGJE/Tasks/bjetTaggingGnn.cxx b/PWGJE/Tasks/bjetTaggingGnn.cxx index e72fba2ccef..0c098e19e4a 100644 --- a/PWGJE/Tasks/bjetTaggingGnn.cxx +++ b/PWGJE/Tasks/bjetTaggingGnn.cxx @@ -282,6 +282,7 @@ struct BjetTaggingGnn { registry.add("h_trackphi", "", {HistType::kTH1F, {{100, 0.0, 2.0 * M_PI, "#it{#phi}"}}}, callSumw2); registry.add("h_dcaXY", "", {HistType::kTH1F, {{200, 0., 4., "|DCA_{#it{xy}}| (cm)"}}}, callSumw2); registry.add("h_dcaZ", "", {HistType::kTH1F, {{200, 0., 4., "|DCA_{#it{z}}| (cm)"}}}, callSumw2); + registry.add("h3_dca_pt", "", {HistType::kTH3F, {{1000, 0., 100., "#it{p}_{T} (GeV/#it{c})"}, {200, 0., 4., "|DCA_{#it{z}}| (cm)"}, {200, 0., 4., "|DCA_{#it{xy}}| (cm)"}}}, callSumw2); } if (doprocessMCDTracks) { @@ -308,6 +309,15 @@ struct BjetTaggingGnn { registry.add("h_dcaZ_coll_mismatched", "", {HistType::kTH1F, {{200, 0., 4., "|DCA_{#it{z}}| (cm)"}}}, callSumw2); registry.add("h_dcaZ_npp", "", {HistType::kTH1F, {{200, 0., 4., "|DCA_{#it{z}}| (cm)"}}}, callSumw2); registry.add("h_dcaZ_npp_mismatched", "", {HistType::kTH1F, {{200, 0., 4., "|DCA_{#it{z}}| (cm)"}}}, callSumw2); + registry.add("h3_dca_pt_coll_fake", "", {HistType::kTH3F, {{1000, 0., 100., "#it{p}_{T} (GeV/#it{c})"}, {200, 0., 4., "|DCA_{#it{z}}| (cm)"}, {200, 0., 4., "|DCA_{#it{xy}}| (cm)"}}}, callSumw2); + registry.add("h3_dca_pt_fake", "", {HistType::kTH3F, {{1000, 0., 100., "#it{p}_{T} (GeV/#it{c})"}, {200, 0., 4., "|DCA_{#it{z}}| (cm)"}, {200, 0., 4., "|DCA_{#it{xy}}| (cm)"}}}, callSumw2); + registry.add("h3_dca_pt_coll_matched", "", {HistType::kTH3F, {{1000, 0., 100., "#it{p}_{T} (GeV/#it{c})"}, {200, 0., 4., "|DCA_{#it{z}}| (cm)"}, {200, 0., 4., "|DCA_{#it{xy}}| (cm)"}}}, callSumw2); + registry.add("h3_dca_pt_coll_matched_b", "", {HistType::kTH3F, {{1000, 0., 100., "#it{p}_{T} (GeV/#it{c})"}, {200, 0., 4., "|DCA_{#it{z}}| (cm)"}, {200, 0., 4., "|DCA_{#it{xy}}| (cm)"}}}, callSumw2); + registry.add("h3_dca_pt_coll_matched_c", "", {HistType::kTH3F, {{1000, 0., 100., "#it{p}_{T} (GeV/#it{c})"}, {200, 0., 4., "|DCA_{#it{z}}| (cm)"}, {200, 0., 4., "|DCA_{#it{xy}}| (cm)"}}}, callSumw2); + registry.add("h3_dca_pt_coll_matched_lf", "", {HistType::kTH3F, {{1000, 0., 100., "#it{p}_{T} (GeV/#it{c})"}, {200, 0., 4., "|DCA_{#it{z}}| (cm)"}, {200, 0., 4., "|DCA_{#it{xy}}| (cm)"}}}, callSumw2); + registry.add("h3_dca_pt_coll_mismatched", "", {HistType::kTH3F, {{1000, 0., 100., "#it{p}_{T} (GeV/#it{c})"}, {200, 0., 4., "|DCA_{#it{z}}| (cm)"}, {200, 0., 4., "|DCA_{#it{xy}}| (cm)"}}}, callSumw2); + registry.add("h3_dca_pt_npp", "", {HistType::kTH3F, {{1000, 0., 100., "#it{p}_{T} (GeV/#it{c})"}, {200, 0., 4., "|DCA_{#it{z}}| (cm)"}, {200, 0., 4., "|DCA_{#it{xy}}| (cm)"}}}, callSumw2); + registry.add("h3_dca_pt_npp_mismatched", "", {HistType::kTH3F, {{1000, 0., 100., "#it{p}_{T} (GeV/#it{c})"}, {200, 0., 4., "|DCA_{#it{z}}| (cm)"}, {200, 0., 4., "|DCA_{#it{xy}}| (cm)"}}}, callSumw2); } if (doprocessDataJetsSel || doprocessMCDJetsSel) { @@ -466,9 +476,7 @@ struct BjetTaggingGnn { using AnalysisCollisionsMCD = soa::Join; using FilteredCollisionsMCD = soa::Filtered; - Filter mccollisionFilter = nabs(aod::jmccollision::posZ) < vertexZCut; using AnalysisCollisionsMCP = soa::Join; - using FilteredCollisionsMCP = soa::Filtered; using MCPJets = soa::Join; using FilteredMCPJets = soa::Filtered; @@ -841,12 +849,15 @@ struct BjetTaggingGnn { if (track.pt() >= trackPtMin) { registry.fill(HIST("h_dcaXY"), std::fabs(track.dcaXY())); registry.fill(HIST("h_dcaZ"), std::fabs(track.dcaZ())); + registry.fill(HIST("h3_dca_pt"), track.pt(), std::fabs(track.dcaZ()), std::fabs(track.dcaXY())); } } } PROCESS_SWITCH(BjetTaggingGnn, processDataTracks, "track information in Data", false); - void processMCDJets(FilteredCollisionsMCD::iterator const& collision, FilteredMCDJets const& MCDjets, FilteredTracksMCD const& allTracks, FilteredMCPJets const& /*MCPjets*/, aod::JetParticles const& /*mcParticles*/, FilteredCollisionsMCP const& /*mcCollisions*/) + Preslice mcpjetsPerMCPCollision = aod::jet::mcCollisionId; + + void processMCDJets(FilteredCollisionsMCD::iterator const& collision, FilteredMCDJets const& MCDjets, FilteredTracksMCD const& allTracks, FilteredMCPJets const& MCPjets, aod::JetParticles const& /*mcParticles*/, AnalysisCollisionsMCP const& /*mcCollisions*/) { if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { return; @@ -855,7 +866,8 @@ struct BjetTaggingGnn { if (collision.isOutlier()) { return; } - if (collision.has_mcCollision() && collision.template mcCollision_as().isOutlier()) { + bool matchedMcColl = collision.has_mcCollision(); + if (matchedMcColl && collision.template mcCollision_as().isOutlier()) { return; } // Uses only collisionId % trainingDatasetRaioParam != 0 for evaluation dataset @@ -864,7 +876,6 @@ struct BjetTaggingGnn { } float weightEvt = useEventWeight ? collision.weight() : 1.f; - bool matchedMcColl = collision.has_mcCollision() && std::fabs(collision.template mcCollision_as().posZ()) < vertexZCut; registry.fill(HIST("h_event_counter"), 0.0, weightEvt); @@ -881,6 +892,10 @@ struct BjetTaggingGnn { continue; } for (const auto& mcpjet : analysisJet.template matchedJetGeo_as()) { + // matchedJetGeo_as is not Filtered. + if (mcpjet.pt() < jetPtMin || mcpjet.pt() >= jetPtMax || mcpjet.eta() >= jetEtaMax - mcpjet.r() / 100.f || mcpjet.eta() <= jetEtaMin + mcpjet.r() / 100.f) { + continue; + } registry.fill(HIST("h2_Response_DetjetpT_PartjetpT"), analysisJet.pt(), mcpjet.pt(), weightEvt); registry.fill(HIST("h_jetpT_matched"), analysisJet.pt(), weightEvt); registry.fill(HIST("h_jetpT_particle_matched"), mcpjet.pt(), weightEvt); @@ -895,16 +910,36 @@ struct BjetTaggingGnn { } } } + + if (!matchedMcColl) { + return; + } + + // Fill histograms for jets matched to the analysis event selection + auto mcpjetspermcpcollision = MCPjets.sliceBy(mcpjetsPerMCPCollision, collision.mcCollisionId()); + for (const auto& mcpjet : mcpjetspermcpcollision) { + registry.fill(HIST("h_jetpT_particle"), mcpjet.pt(), weightEvt); + + int8_t jetFlavor = mcpjet.origin(); + + if (jetFlavor == JetTaggingSpecies::beauty) { + registry.fill(HIST("h_jetpT_particle_b"), mcpjet.pt(), weightEvt); + } else if (jetFlavor == JetTaggingSpecies::charm) { + registry.fill(HIST("h_jetpT_particle_c"), mcpjet.pt(), weightEvt); + } else { + registry.fill(HIST("h_jetpT_particle_lf"), mcpjet.pt(), weightEvt); + } + } } PROCESS_SWITCH(BjetTaggingGnn, processMCDJets, "jet information in MC", false); - void processMCDJetsSel(AnalysisCollisionsMCD::iterator const& collision, FilteredMCDJets const& MCDjets, FilteredTracksMCD const& /*allTracks*/, FilteredMCPJets const& /*MCPjets*/, FilteredCollisionsMCP const& /*mcCollisions*/) + void processMCDJetsSel(AnalysisCollisionsMCD::iterator const& collision, FilteredMCDJets const& MCDjets, FilteredTracksMCD const& /*allTracks*/, FilteredMCPJets const& /*MCPjets*/, AnalysisCollisionsMCP const& /*mcCollisions*/) { // Reject outlier MC collisions if (collision.isOutlier()) { return; } - if (collision.has_mcCollision() && collision.template mcCollision_as().isOutlier()) { + if (collision.has_mcCollision() && collision.template mcCollision_as().isOutlier()) { return; } @@ -941,7 +976,6 @@ struct BjetTaggingGnn { PROCESS_SWITCH(BjetTaggingGnn, processMCDJetsSel, "jet information in MC (event selection)", false); PresliceUnsorted collisionsPerMCPCollision = aod::jmccollisionlb::mcCollisionId; - Preslice mcpjetsPerMCPCollision = aod::jet::mcCollisionId; void processMCPJets(AnalysisCollisionsMCP const& mcCollisions, FilteredMCPJets const& mcpjets, AnalysisCollisionsMCD const& collisions, aod::JetParticles const& mcParticles) { @@ -950,8 +984,13 @@ struct BjetTaggingGnn { if (mcCollision.isOutlier()) { continue; } - float weightEvt = useEventWeight ? mcCollision.weight() : 1.f; auto matchedCollisions = collisions.sliceBy(collisionsPerMCPCollision, mcCollision.mcCollisionId()); + if (matchedCollisions.size() >= 1) { + if (matchedCollisions.begin().isOutlier()) { + continue; + } + } + float weightEvt = useEventWeight ? mcCollision.weight() : 1.f; EvtSelFlag evtselCode = EvtSelFlag::INEL; registry.fill(HIST("hMcCollCounter"), static_cast(EvtSel::INEL), weightEvt); // INEL @@ -1014,17 +1053,6 @@ struct BjetTaggingGnn { auto mcpjetspermcpcollision = mcpjets.sliceBy(mcpjetsPerMCPCollision, mcCollision.mcCollisionId()); for (const auto& mcpjet : mcpjetspermcpcollision) { - bool jetIncluded = false; - for (const auto& jetR : jetRadiiValues) { - if (mcpjet.r() == static_cast(jetR * 100)) { - jetIncluded = true; - break; - } - } - - if (!jetIncluded) { - continue; - } int8_t jetFlavor = mcpjet.origin(); @@ -1064,19 +1092,6 @@ struct BjetTaggingGnn { registry.fill(HIST("h_jetpT_particle_c_sel8_zvtx"), mcpjet.pt(), hasAll(evtselCode, EvtSelFlag::Sel8Zvtx) ? weightEvt : 0.0); registry.fill(HIST("h_jetpT_particle_c_inelgt0"), mcpjet.pt(), hasAll(evtselCode, EvtSelFlag::INELgt0) ? weightEvt : 0.0); } - - // Fill histograms for jets matched to the analysis event selection - if (isMatchedToAnalysisSelection) { - registry.fill(HIST("h_jetpT_particle"), mcpjet.pt(), weightEvt); - - if (jetFlavor == JetTaggingSpecies::beauty) { - registry.fill(HIST("h_jetpT_particle_b"), mcpjet.pt(), weightEvt); - } else if (jetFlavor == JetTaggingSpecies::charm) { - registry.fill(HIST("h_jetpT_particle_c"), mcpjet.pt(), weightEvt); - } else { - registry.fill(HIST("h_jetpT_particle_lf"), mcpjet.pt(), weightEvt); - } - } } } } @@ -1084,7 +1099,7 @@ struct BjetTaggingGnn { Preslice mcparticlesPerMCPCollision = aod::jmcparticle::mcCollisionId; - void processMCDTracks(FilteredCollisionsMCD::iterator const& collision, AnalysisTracksMCD const& tracks, FilteredCollisionsMCP const& /*mcCollisions*/, aod::JetParticles const& allParticles) + void processMCDTracks(FilteredCollisionsMCD::iterator const& collision, AnalysisTracksMCD const& tracks, AnalysisCollisionsMCP const& /*mcCollisions*/, aod::JetParticles const& allParticles) { if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { return; @@ -1093,7 +1108,8 @@ struct BjetTaggingGnn { if (collision.isOutlier()) { return; } - if (collision.has_mcCollision() && collision.template mcCollision_as().isOutlier()) { + bool matchedMcColl = collision.has_mcCollision(); + if (matchedMcColl && collision.template mcCollision_as().isOutlier()) { return; } // Uses only collisionId % trainingDatasetRaioParam != 0 for evaluation dataset @@ -1102,7 +1118,6 @@ struct BjetTaggingGnn { } float weightEvt = useEventWeight ? collision.weight() : 1.f; - bool matchedMcColl = collision.has_mcCollision() && std::fabs(collision.template mcCollision_as().posZ()) < vertexZCut; for (const auto& track : tracks) { if (!jetderiveddatautilities::selectTrack(track, trackSelectionBits) || track.eta() <= trackEtaMin || track.eta() >= trackEtaMax) { @@ -1114,12 +1129,14 @@ struct BjetTaggingGnn { if (track.pt() >= trackPtMin) { registry.fill(HIST("h_dcaXY"), std::fabs(track.dcaXY()), weightEvt); registry.fill(HIST("h_dcaZ"), std::fabs(track.dcaZ()), weightEvt); + registry.fill(HIST("h3_dca_pt"), track.pt(), std::fabs(track.dcaZ()), std::fabs(track.dcaXY()), weightEvt); } if (!matchedMcColl) { if (track.pt() >= trackPtMin) { registry.fill(HIST("h_dcaXY_coll_fake"), std::fabs(track.dcaXY()), weightEvt); registry.fill(HIST("h_dcaZ_coll_fake"), std::fabs(track.dcaZ()), weightEvt); + registry.fill(HIST("h3_dca_pt_coll_fake"), track.pt(), std::fabs(track.dcaZ()), std::fabs(track.dcaXY()), weightEvt); } continue; } @@ -1127,6 +1144,7 @@ struct BjetTaggingGnn { if (track.pt() >= trackPtMin) { registry.fill(HIST("h_dcaXY_fake"), std::fabs(track.dcaXY()), weightEvt); registry.fill(HIST("h_dcaZ_fake"), std::fabs(track.dcaZ()), weightEvt); + registry.fill(HIST("h3_dca_pt_fake"), track.pt(), std::fabs(track.dcaZ()), std::fabs(track.dcaXY()), weightEvt); } continue; } @@ -1142,28 +1160,35 @@ struct BjetTaggingGnn { if (particle.mcCollisionId() == collision.mcCollisionId()) { registry.fill(HIST("h_dcaXY_coll_matched"), std::fabs(track.dcaXY()), weightEvt); // Matched to particle from the same MC collision registry.fill(HIST("h_dcaZ_coll_matched"), std::fabs(track.dcaZ()), weightEvt); + registry.fill(HIST("h3_dca_pt_coll_matched"), track.pt(), std::fabs(track.dcaZ()), std::fabs(track.dcaXY()), weightEvt); int origin = RecoDecay::getParticleOrigin(allParticles, particle, false); if (origin == RecoDecay::OriginType::NonPrompt) { registry.fill(HIST("h_dcaXY_coll_matched_b"), std::fabs(track.dcaXY()), weightEvt); registry.fill(HIST("h_dcaZ_coll_matched_b"), std::fabs(track.dcaZ()), weightEvt); + registry.fill(HIST("h3_dca_pt_coll_matched_b"), track.pt(), std::fabs(track.dcaZ()), std::fabs(track.dcaXY()), weightEvt); } else if (origin == RecoDecay::OriginType::Prompt) { registry.fill(HIST("h_dcaXY_coll_matched_c"), std::fabs(track.dcaXY()), weightEvt); registry.fill(HIST("h_dcaZ_coll_matched_c"), std::fabs(track.dcaZ()), weightEvt); + registry.fill(HIST("h3_dca_pt_coll_matched_c"), track.pt(), std::fabs(track.dcaZ()), std::fabs(track.dcaXY()), weightEvt); } else { registry.fill(HIST("h_dcaXY_coll_matched_lf"), std::fabs(track.dcaXY()), weightEvt); registry.fill(HIST("h_dcaZ_coll_matched_lf"), std::fabs(track.dcaZ()), weightEvt); + registry.fill(HIST("h3_dca_pt_coll_matched_lf"), track.pt(), std::fabs(track.dcaZ()), std::fabs(track.dcaXY()), weightEvt); } } else { registry.fill(HIST("h_dcaXY_coll_mismatched"), std::fabs(track.dcaXY()), weightEvt); // Matched to particle from a different MC collision registry.fill(HIST("h_dcaZ_coll_mismatched"), std::fabs(track.dcaZ()), weightEvt); + registry.fill(HIST("h3_dca_pt_coll_mismatched"), track.pt(), std::fabs(track.dcaZ()), std::fabs(track.dcaXY()), weightEvt); } } else { if (particle.mcCollisionId() == collision.mcCollisionId()) { registry.fill(HIST("h_dcaXY_npp"), std::fabs(track.dcaXY()), weightEvt); registry.fill(HIST("h_dcaZ_npp"), std::fabs(track.dcaZ()), weightEvt); + registry.fill(HIST("h3_dca_pt_npp"), track.pt(), std::fabs(track.dcaZ()), std::fabs(track.dcaXY()), weightEvt); } else { registry.fill(HIST("h_dcaXY_npp_mismatched"), std::fabs(track.dcaXY()), weightEvt); registry.fill(HIST("h_dcaZ_npp_mismatched"), std::fabs(track.dcaZ()), weightEvt); + registry.fill(HIST("h3_dca_pt_npp_mismatched"), track.pt(), std::fabs(track.dcaZ()), std::fabs(track.dcaXY()), weightEvt); } } } From 4624d53f734663a0b70dfd3b4497552d7da444ef Mon Sep 17 00:00:00 2001 From: Changhwan Choi Date: Fri, 22 May 2026 16:29:22 +0900 Subject: [PATCH 2/8] Added o2-linter disable= --- PWGJE/Tasks/bjetTaggingGnn.cxx | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/PWGJE/Tasks/bjetTaggingGnn.cxx b/PWGJE/Tasks/bjetTaggingGnn.cxx index 0c098e19e4a..48044f3ec38 100644 --- a/PWGJE/Tasks/bjetTaggingGnn.cxx +++ b/PWGJE/Tasks/bjetTaggingGnn.cxx @@ -53,7 +53,7 @@ using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; -namespace BjetTaggingGnnEvtSel +namespace bjet_tagging_gnn_evtsel { enum class EvtSelFlag : uint8_t { kNone = 0, @@ -116,8 +116,8 @@ enum class EvtSel { INELgt0, INELgt0rec }; -}; // namespace BjetTaggingGnnEvtSel -using namespace BjetTaggingGnnEvtSel; +}; // namespace bjet_tagging_gnn_evtsel +using namespace bjet_tagging_gnn_evtsel; struct BjetTaggingGnn { @@ -518,14 +518,14 @@ struct BjetTaggingGnn { template bool isAcceptedJet(AnalysisJet const& jet) { - if (jetAreaFractionMin > -98.0) { + if (jetAreaFractionMin > -98.0) { // o2-linter: disable=magic-number if (jet.area() < jetAreaFractionMin * M_PI * (jet.r() / 100.0) * (jet.r() / 100.0)) { return false; } } bool checkConstituentPt = true; - bool checkConstituentMinPt = (leadingConstituentPtMin > -98.0); - bool checkConstituentMaxPt = (leadingConstituentPtMax < 9998.0); + bool checkConstituentMinPt = (leadingConstituentPtMin > -98.0); // o2-linter: disable=magic-number + bool checkConstituentMaxPt = (leadingConstituentPtMax < 9998.0); // o2-linter: disable=magic-number if (!checkConstituentMinPt && !checkConstituentMaxPt) { checkConstituentPt = false; } @@ -700,7 +700,7 @@ struct BjetTaggingGnn { continue; auto p = pdg->GetParticle(mcparticle.pdgCode()); if (p != nullptr) { - if (std::abs(p->Charge()) >= 3) { + if (std::abs(p->Charge()) >= 3) { // o2-linter: disable=magic-number if (std::abs(mcparticle.eta()) < 1) return true; } From 5f4eef6e182c50fa63f26b9bf70b8273f572d4fe Mon Sep 17 00:00:00 2001 From: Changhwan Choi Date: Fri, 22 May 2026 16:36:01 +0900 Subject: [PATCH 3/8] Added o2-linter disable= --- PWGJE/Tasks/bjetTaggingGnn.cxx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/PWGJE/Tasks/bjetTaggingGnn.cxx b/PWGJE/Tasks/bjetTaggingGnn.cxx index 48044f3ec38..59e57e94b39 100644 --- a/PWGJE/Tasks/bjetTaggingGnn.cxx +++ b/PWGJE/Tasks/bjetTaggingGnn.cxx @@ -518,14 +518,14 @@ struct BjetTaggingGnn { template bool isAcceptedJet(AnalysisJet const& jet) { - if (jetAreaFractionMin > -98.0) { // o2-linter: disable=magic-number + if (jetAreaFractionMin > -98.0) { // o2-linter: disable=magic-number (arbitrary large negative number) if (jet.area() < jetAreaFractionMin * M_PI * (jet.r() / 100.0) * (jet.r() / 100.0)) { return false; } } bool checkConstituentPt = true; - bool checkConstituentMinPt = (leadingConstituentPtMin > -98.0); // o2-linter: disable=magic-number - bool checkConstituentMaxPt = (leadingConstituentPtMax < 9998.0); // o2-linter: disable=magic-number + bool checkConstituentMinPt = (leadingConstituentPtMin > -98.0); // o2-linter: disable=magic-number (arbitrary large negative number) + bool checkConstituentMaxPt = (leadingConstituentPtMax < 9998.0); // o2-linter: disable=magic-number (arbitrary large number) if (!checkConstituentMinPt && !checkConstituentMaxPt) { checkConstituentPt = false; } @@ -700,7 +700,7 @@ struct BjetTaggingGnn { continue; auto p = pdg->GetParticle(mcparticle.pdgCode()); if (p != nullptr) { - if (std::abs(p->Charge()) >= 3) { // o2-linter: disable=magic-number + if (std::abs(p->Charge()) >= 3) { // o2-linter: disable=magic-number (constant number of particles) if (std::abs(mcparticle.eta()) < 1) return true; } From d49948d405b45cc1036675f32e78c0346264d656 Mon Sep 17 00:00:00 2001 From: Changhwan Choi Date: Fri, 22 May 2026 16:52:36 +0900 Subject: [PATCH 4/8] Removed unused variable --- PWGJE/Tasks/bjetTaggingGnn.cxx | 3 --- 1 file changed, 3 deletions(-) diff --git a/PWGJE/Tasks/bjetTaggingGnn.cxx b/PWGJE/Tasks/bjetTaggingGnn.cxx index 59e57e94b39..79c866ba866 100644 --- a/PWGJE/Tasks/bjetTaggingGnn.cxx +++ b/PWGJE/Tasks/bjetTaggingGnn.cxx @@ -1009,8 +1009,6 @@ struct BjetTaggingGnn { } } - bool isMatchedToAnalysisSelection = false; - if (matchedCollisions.size() >= 1) { zvtxMatched = std::fabs(matchedCollisions.begin().posZ()) < vertexZCut; evtselCode |= EvtSelFlag::kColl; @@ -1046,7 +1044,6 @@ struct BjetTaggingGnn { } } if (jetderiveddatautilities::selectCollision(matchedCollisions.begin(), eventSelectionBits) && zvtxMatched) { - isMatchedToAnalysisSelection = true; registry.fill(HIST("h_event_counter_mcp"), 0.0, weightEvt); } } From eefe73ed910507725eeb0f8d009462072595ca8c Mon Sep 17 00:00:00 2001 From: Changhwan Choi Date: Fri, 22 May 2026 19:40:52 +0900 Subject: [PATCH 5/8] Added histograms for pTHat and jetpT analysis --- PWGJE/Tasks/bjetTaggingGnn.cxx | 49 +++++++++++++++++++++++++--------- 1 file changed, 37 insertions(+), 12 deletions(-) diff --git a/PWGJE/Tasks/bjetTaggingGnn.cxx b/PWGJE/Tasks/bjetTaggingGnn.cxx index 79c866ba866..b6e02eef15d 100644 --- a/PWGJE/Tasks/bjetTaggingGnn.cxx +++ b/PWGJE/Tasks/bjetTaggingGnn.cxx @@ -202,7 +202,7 @@ struct BjetTaggingGnn { registry.add("h_event_counter_mcp", ";analysis collision matched MC collision counter", {HistType::kTH1F, {{1, 0.0, 1.0}}}, callSumw2); registry.add("h_vertexZ", "Vertex Z;#it{Z} (cm)", {HistType::kTH1F, {{100, -20.0, 20.0}}}, callSumw2); registry.add("hCollCounter", ";collision counter", {HistType::kTH1F, {{12, 1.0, 13.0}}}, callSumw2); - auto hCollCounter = registry.get(HIST("hCollCounter")); + auto& hCollCounter = registry.get(HIST("hCollCounter")); hCollCounter->GetXaxis()->SetBinLabel(1, "_1"); hCollCounter->GetXaxis()->SetBinLabel(2, "_2"); hCollCounter->GetXaxis()->SetBinLabel(3, "Coll"); @@ -216,7 +216,7 @@ struct BjetTaggingGnn { hCollCounter->GetXaxis()->SetBinLabel(11, "_11"); hCollCounter->GetXaxis()->SetBinLabel(12, "INELgt0+Zvtx(rec)"); // sel8 registry.add("hMcCollCounter", ";MC collision counter", {HistType::kTH1F, {{12, 1.0, 13.0}}}, callSumw2); - auto hMcCollCounter = registry.get(HIST("hMcCollCounter")); + auto& hMcCollCounter = registry.get(HIST("hMcCollCounter")); hMcCollCounter->GetXaxis()->SetBinLabel(1, "McColl(INEL)"); hMcCollCounter->GetXaxis()->SetBinLabel(2, "McColl+Zvtx"); hMcCollCounter->GetXaxis()->SetBinLabel(3, "McColl(-> Coll)"); @@ -362,6 +362,9 @@ struct BjetTaggingGnn { registry.add("h_jetpT_particle_matched", "", {HistType::kTH1F, {axisJetpT}}, callSumw2); registry.add("h_jetpT_b_matched", "b-jet", {HistType::kTH1F, {axisJetpT}}, callSumw2); registry.add("h_jetpT_particle_b_matched", "b-jet", {HistType::kTH1F, {axisJetpT}}, callSumw2); + // pTHat study + registry.add("h3_pthat_jetpT", "", {HistType::kTH3F, {{300, 0., 300., "#hat{#it{p}}_{T} (GeV/#it{c})"}, axisJetpT, axisJetpT}}, callSumw2); + registry.add("h3_pthat_jetpT_b", "b-jet", {HistType::kTH3F, {{300, 0., 300., "#hat{#it{p}}_{T} (GeV/#it{c})"}, axisJetpT, axisJetpT}}, callSumw2); } if (doprocessMCDJetsSel) { @@ -695,10 +698,10 @@ struct BjetTaggingGnn { template bool isTrueINEL0(MCColl const& /*mccoll*/, MCPart const& mcparts) { - for (auto const& mcparticle : mcparts) { + for (const auto& mcparticle : mcparts) { if (!mcparticle.isPhysicalPrimary()) continue; - auto p = pdg->GetParticle(mcparticle.pdgCode()); + const auto p = pdg->GetParticle(mcparticle.pdgCode()); if (p != nullptr) { if (std::abs(p->Charge()) >= 3) { // o2-linter: disable=magic-number (constant number of particles) if (std::abs(mcparticle.eta()) < 1) @@ -787,7 +790,7 @@ struct BjetTaggingGnn { void processDataJetsTrig(FilteredCollisionsTriggered::iterator const& collision, FilteredDataJets const& alljets, FilteredTracks const& allTracks, aod::JBCs const& /*bcInfo*/) { // Get BC info associated with the collision before applying any event selections - auto bc = collision.bc_as(); + const auto& bc = collision.bc_as(); // Initialize CCDB objects using the BC info initCCDB(bc); // If SoftwareTriggerSelection (i.e. skimming) is enabled, skip this event unless it passes Zorro selection @@ -881,6 +884,9 @@ struct BjetTaggingGnn { registry.fill(HIST("h_vertexZ"), collision.posZ(), weightEvt); + // Store matched particle jet indices to avoid double-counting in mcpjets loop + std::unordered_set matchedMcpJetIndices; + for (const auto& analysisJet : MCDjets) { if (!isAcceptedJet(analysisJet)) { continue; @@ -891,24 +897,35 @@ struct BjetTaggingGnn { if (!matchedMcColl) { continue; } + bool matchedJet = false; for (const auto& mcpjet : analysisJet.template matchedJetGeo_as()) { // matchedJetGeo_as is not Filtered. if (mcpjet.pt() < jetPtMin || mcpjet.pt() >= jetPtMax || mcpjet.eta() >= jetEtaMax - mcpjet.r() / 100.f || mcpjet.eta() <= jetEtaMin + mcpjet.r() / 100.f) { continue; } + matchedJet = true; + matchedMcpJetIndices.insert(mcpjet.globalIndex()); registry.fill(HIST("h2_Response_DetjetpT_PartjetpT"), analysisJet.pt(), mcpjet.pt(), weightEvt); registry.fill(HIST("h_jetpT_matched"), analysisJet.pt(), weightEvt); registry.fill(HIST("h_jetpT_particle_matched"), mcpjet.pt(), weightEvt); + registry.fill(HIST("h3_pthat_jetpT"), collision.template mcCollision_as().ptHard(), analysisJet.pt(), mcpjet.pt(), weightEvt); // Matched jets if (jetFlavor == JetTaggingSpecies::beauty) { registry.fill(HIST("h2_Response_DetjetpT_PartjetpT_b"), analysisJet.pt(), mcpjet.pt(), weightEvt); registry.fill(HIST("h_jetpT_b_matched"), analysisJet.pt(), weightEvt); registry.fill(HIST("h_jetpT_particle_b_matched"), mcpjet.pt(), weightEvt); + registry.fill(HIST("h3_pthat_jetpT_b"), collision.template mcCollision_as().ptHard(), analysisJet.pt(), mcpjet.pt(), weightEvt); // Matched b-jets } else if (jetFlavor == JetTaggingSpecies::charm) { registry.fill(HIST("h2_Response_DetjetpT_PartjetpT_c"), analysisJet.pt(), mcpjet.pt(), weightEvt); } else { registry.fill(HIST("h2_Response_DetjetpT_PartjetpT_lf"), analysisJet.pt(), mcpjet.pt(), weightEvt); } } + if (!matchedJet) { + registry.fill(HIST("h3_pthat_jetpT"), collision.template mcCollision_as().ptHard(), analysisJet.pt(), -1.f, weightEvt); // Fake jets, overflow-pTpart jets + if (jetFlavor == JetTaggingSpecies::beauty) { + registry.fill(HIST("h3_pthat_jetpT_b"), collision.template mcCollision_as().ptHard(), analysisJet.pt(), -1.f, weightEvt); // Overflow-pTpart b-jets + } + } } if (!matchedMcColl) { @@ -916,9 +933,17 @@ struct BjetTaggingGnn { } // Fill histograms for jets matched to the analysis event selection - auto mcpjetspermcpcollision = MCPjets.sliceBy(mcpjetsPerMCPCollision, collision.mcCollisionId()); + const auto& mcpjetspermcpcollision = MCPjets.sliceBy(mcpjetsPerMCPCollision, collision.mcCollisionId()); for (const auto& mcpjet : mcpjetspermcpcollision) { registry.fill(HIST("h_jetpT_particle"), mcpjet.pt(), weightEvt); + + // Fill h3_pthat_jetpT only for unmatched particle jets (reco pT = -1) + if (matchedMcpJetIndices.find(mcpjet.globalIndex()) == matchedMcpJetIndices.end()) { + registry.fill(HIST("h3_pthat_jetpT"), collision.template mcCollision_as().ptHard(), -1.f, mcpjet.pt(), weightEvt); // Missing jets, overflow-pTreco jets + if (mcpjet.origin() == JetTaggingSpecies::beauty) { + registry.fill(HIST("h3_pthat_jetpT_b"), collision.template mcCollision_as().ptHard(), -1.f, mcpjet.pt(), weightEvt); // Missing b-jets, overflow-pTpart b-jets + } + } int8_t jetFlavor = mcpjet.origin(); @@ -984,7 +1009,7 @@ struct BjetTaggingGnn { if (mcCollision.isOutlier()) { continue; } - auto matchedCollisions = collisions.sliceBy(collisionsPerMCPCollision, mcCollision.mcCollisionId()); + const auto& matchedCollisions = collisions.sliceBy(collisionsPerMCPCollision, mcCollision.mcCollisionId()); if (matchedCollisions.size() >= 1) { if (matchedCollisions.begin().isOutlier()) { continue; @@ -1048,7 +1073,7 @@ struct BjetTaggingGnn { } } - auto mcpjetspermcpcollision = mcpjets.sliceBy(mcpjetsPerMCPCollision, mcCollision.mcCollisionId()); + const auto& mcpjetspermcpcollision = mcpjets.sliceBy(mcpjetsPerMCPCollision, mcCollision.mcCollisionId()); for (const auto& mcpjet : mcpjetspermcpcollision) { int8_t jetFlavor = mcpjet.origin(); @@ -1145,7 +1170,7 @@ struct BjetTaggingGnn { } continue; } - auto particle = track.template mcParticle_as(); + const auto& particle = track.template mcParticle_as(); if (particle.eta() > trackEtaMin && particle.eta() < trackEtaMax) { if (particle.isPhysicalPrimary()) { registry.fill(HIST("h2_trackpT_partpT"), track.pt(), particle.pt(), weightEvt); @@ -1196,10 +1221,10 @@ struct BjetTaggingGnn { return; } - auto const particles = allParticles.sliceBy(mcparticlesPerMCPCollision, collision.mcCollisionId()); + const auto& particles = allParticles.sliceBy(mcparticlesPerMCPCollision, collision.mcCollisionId()); for (const auto& particle : particles) { - auto pdgParticle = pdg->GetParticle(particle.pdgCode()); + const auto pdgParticle = pdg->GetParticle(particle.pdgCode()); if (!pdgParticle || pdgParticle->Charge() == 0.0) { continue; } @@ -1229,7 +1254,7 @@ struct BjetTaggingGnn { } } } - auto collisionsInBC = collisions.sliceBy(perFoundBC, bc.globalIndex()); + const auto& collisionsInBC = collisions.sliceBy(perFoundBC, bc.globalIndex()); for (const auto& collision : collisionsInBC) { registry.fill(HIST("hBCCounter"), 4.5); // CollinBC if (collision.sel8()) { From c31b3f8f3c48c319ede95c885d91b4c4bfd67508 Mon Sep 17 00:00:00 2001 From: ALICE Action Bot Date: Fri, 22 May 2026 10:42:18 +0000 Subject: [PATCH 6/8] Please consider the following formatting changes --- PWGJE/Tasks/bjetTaggingGnn.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGJE/Tasks/bjetTaggingGnn.cxx b/PWGJE/Tasks/bjetTaggingGnn.cxx index b6e02eef15d..47b68c830a0 100644 --- a/PWGJE/Tasks/bjetTaggingGnn.cxx +++ b/PWGJE/Tasks/bjetTaggingGnn.cxx @@ -936,7 +936,7 @@ struct BjetTaggingGnn { const auto& mcpjetspermcpcollision = MCPjets.sliceBy(mcpjetsPerMCPCollision, collision.mcCollisionId()); for (const auto& mcpjet : mcpjetspermcpcollision) { registry.fill(HIST("h_jetpT_particle"), mcpjet.pt(), weightEvt); - + // Fill h3_pthat_jetpT only for unmatched particle jets (reco pT = -1) if (matchedMcpJetIndices.find(mcpjet.globalIndex()) == matchedMcpJetIndices.end()) { registry.fill(HIST("h3_pthat_jetpT"), collision.template mcCollision_as().ptHard(), -1.f, mcpjet.pt(), weightEvt); // Missing jets, overflow-pTreco jets From aff68861590e48f29f265f2bcbd71e7b20da745d Mon Sep 17 00:00:00 2001 From: Changhwan Choi Date: Fri, 22 May 2026 20:09:58 +0900 Subject: [PATCH 7/8] o2linter issues resolved --- PWGJE/Tasks/bjetTaggingGnn.cxx | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/PWGJE/Tasks/bjetTaggingGnn.cxx b/PWGJE/Tasks/bjetTaggingGnn.cxx index 47b68c830a0..e71be7367fc 100644 --- a/PWGJE/Tasks/bjetTaggingGnn.cxx +++ b/PWGJE/Tasks/bjetTaggingGnn.cxx @@ -45,6 +45,7 @@ #include #include #include +#include #include #include @@ -202,7 +203,7 @@ struct BjetTaggingGnn { registry.add("h_event_counter_mcp", ";analysis collision matched MC collision counter", {HistType::kTH1F, {{1, 0.0, 1.0}}}, callSumw2); registry.add("h_vertexZ", "Vertex Z;#it{Z} (cm)", {HistType::kTH1F, {{100, -20.0, 20.0}}}, callSumw2); registry.add("hCollCounter", ";collision counter", {HistType::kTH1F, {{12, 1.0, 13.0}}}, callSumw2); - auto& hCollCounter = registry.get(HIST("hCollCounter")); + auto hCollCounter = registry.get(HIST("hCollCounter")); hCollCounter->GetXaxis()->SetBinLabel(1, "_1"); hCollCounter->GetXaxis()->SetBinLabel(2, "_2"); hCollCounter->GetXaxis()->SetBinLabel(3, "Coll"); @@ -216,7 +217,7 @@ struct BjetTaggingGnn { hCollCounter->GetXaxis()->SetBinLabel(11, "_11"); hCollCounter->GetXaxis()->SetBinLabel(12, "INELgt0+Zvtx(rec)"); // sel8 registry.add("hMcCollCounter", ";MC collision counter", {HistType::kTH1F, {{12, 1.0, 13.0}}}, callSumw2); - auto& hMcCollCounter = registry.get(HIST("hMcCollCounter")); + auto hMcCollCounter = registry.get(HIST("hMcCollCounter")); hMcCollCounter->GetXaxis()->SetBinLabel(1, "McColl(INEL)"); hMcCollCounter->GetXaxis()->SetBinLabel(2, "McColl+Zvtx"); hMcCollCounter->GetXaxis()->SetBinLabel(3, "McColl(-> Coll)"); @@ -518,17 +519,20 @@ struct BjetTaggingGnn { return nTracks; } + const float largeNegativeNumber = -98.0f; + const float largePositiveNumber = 9999.0f; + template bool isAcceptedJet(AnalysisJet const& jet) { - if (jetAreaFractionMin > -98.0) { // o2-linter: disable=magic-number (arbitrary large negative number) + if (jetAreaFractionMin > largeNegativeNumber) { if (jet.area() < jetAreaFractionMin * M_PI * (jet.r() / 100.0) * (jet.r() / 100.0)) { return false; } } bool checkConstituentPt = true; - bool checkConstituentMinPt = (leadingConstituentPtMin > -98.0); // o2-linter: disable=magic-number (arbitrary large negative number) - bool checkConstituentMaxPt = (leadingConstituentPtMax < 9998.0); // o2-linter: disable=magic-number (arbitrary large number) + bool checkConstituentMinPt = (leadingConstituentPtMin > largeNegativeNumber); + bool checkConstituentMaxPt = (leadingConstituentPtMax < largePositiveNumber); if (!checkConstituentMinPt && !checkConstituentMaxPt) { checkConstituentPt = false; } @@ -695,6 +699,7 @@ struct BjetTaggingGnn { } // Check if the collision is INEL>0 + const int nPartInel0 = 3; template bool isTrueINEL0(MCColl const& /*mccoll*/, MCPart const& mcparts) { @@ -703,7 +708,7 @@ struct BjetTaggingGnn { continue; const auto p = pdg->GetParticle(mcparticle.pdgCode()); if (p != nullptr) { - if (std::abs(p->Charge()) >= 3) { // o2-linter: disable=magic-number (constant number of particles) + if (std::abs(p->Charge()) >= nPartInel0) { if (std::abs(mcparticle.eta()) < 1) return true; } @@ -936,7 +941,7 @@ struct BjetTaggingGnn { const auto& mcpjetspermcpcollision = MCPjets.sliceBy(mcpjetsPerMCPCollision, collision.mcCollisionId()); for (const auto& mcpjet : mcpjetspermcpcollision) { registry.fill(HIST("h_jetpT_particle"), mcpjet.pt(), weightEvt); - + // Fill h3_pthat_jetpT only for unmatched particle jets (reco pT = -1) if (matchedMcpJetIndices.find(mcpjet.globalIndex()) == matchedMcpJetIndices.end()) { registry.fill(HIST("h3_pthat_jetpT"), collision.template mcCollision_as().ptHard(), -1.f, mcpjet.pt(), weightEvt); // Missing jets, overflow-pTreco jets From fccd702d2ab0034a33bbc0a47bc43c1774a2e640 Mon Sep 17 00:00:00 2001 From: ALICE Action Bot Date: Fri, 22 May 2026 11:11:00 +0000 Subject: [PATCH 8/8] Please consider the following formatting changes --- PWGJE/Tasks/bjetTaggingGnn.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGJE/Tasks/bjetTaggingGnn.cxx b/PWGJE/Tasks/bjetTaggingGnn.cxx index e71be7367fc..314e99a77fa 100644 --- a/PWGJE/Tasks/bjetTaggingGnn.cxx +++ b/PWGJE/Tasks/bjetTaggingGnn.cxx @@ -941,7 +941,7 @@ struct BjetTaggingGnn { const auto& mcpjetspermcpcollision = MCPjets.sliceBy(mcpjetsPerMCPCollision, collision.mcCollisionId()); for (const auto& mcpjet : mcpjetspermcpcollision) { registry.fill(HIST("h_jetpT_particle"), mcpjet.pt(), weightEvt); - + // Fill h3_pthat_jetpT only for unmatched particle jets (reco pT = -1) if (matchedMcpJetIndices.find(mcpjet.globalIndex()) == matchedMcpJetIndices.end()) { registry.fill(HIST("h3_pthat_jetpT"), collision.template mcCollision_as().ptHard(), -1.f, mcpjet.pt(), weightEvt); // Missing jets, overflow-pTreco jets