From da033ff13a4c16b238c450929fc1d34fc54b9df5 Mon Sep 17 00:00:00 2001 From: HANSEO PARK Date: Wed, 14 Oct 2026 20:56:23 +0900 Subject: [PATCH 1/4] [PWGJE] Add matched proton and pair efficiencies --- PWGJE/Tasks/baryonPairInJets.cxx | 164 +++++++++++++++++++++++++------ 1 file changed, 134 insertions(+), 30 deletions(-) diff --git a/PWGJE/Tasks/baryonPairInJets.cxx b/PWGJE/Tasks/baryonPairInJets.cxx index 80539c2bbfb..63615d5529c 100644 --- a/PWGJE/Tasks/baryonPairInJets.cxx +++ b/PWGJE/Tasks/baryonPairInJets.cxx @@ -17,6 +17,7 @@ #include "PWGJE/DataModel/Jet.h" #include "PWGJE/DataModel/JetReducedData.h" +#include "Common/CCDB/EventSelectionParams.h" #include "Common/CCDB/RCTSelectionFlags.h" #include "Common/Core/RecoDecay.h" #include "Common/DataModel/EventSelection.h" @@ -28,14 +29,15 @@ #include #include #include -#include #include #include +#include #include #include #include #include #include +#include #include #include @@ -44,10 +46,12 @@ #include #include +#include #include #include #include #include +#include #include using namespace o2; @@ -66,7 +70,7 @@ using BaryonTracks = soa::Join; using BaryonTracksMC = soa::Join; using JetTracksWithOriginal = soa::Join; -using JetTracksMCDWithOriginal = soa::Join; +using JetTracksWithOriginalAndMC = soa::Join; using ChargedJetsWithConstituents = soa::Join; using ChargedMCDJetsWithConstituents = soa::Join; using ChargedMCPJetsWithConstituents = soa::Join; @@ -102,6 +106,12 @@ struct BaryonPairInJets { Kaon = 1 }; + enum class EfficiencyStage : uint8_t { + Generated = 0, + TrackSelected = 1, + PidSelected = 2 + }; + // Species-independent selected-particle representation. Keep the full // kinematics needed by pair and future jet-fragmentation observables. struct SelectedParticle { @@ -197,6 +207,7 @@ struct BaryonPairInJets { ConfigurableAxis deltaEta{"deltaEta", {80, -0.8f, 0.8f}, "#Delta#eta"}; ConfigurableAxis deltaPhi{"deltaPhi", {80, -0.8f, 0.8f}, "#Delta#varphi"}; ConfigurableAxis deltaR{"deltaR", {40, 0.f, 0.8f}, "#Delta#it{R}"}; + ConfigurableAxis particleJetDistance{"particleJetDistance", {40, 0.f, 0.4f}, "#Delta#it{R}(p, particle-level jet)"}; ConfigurableAxis inclusiveDeltaEta{"inclusiveDeltaEta", {64, -1.6f, 1.6f}, "#Delta#eta"}; ConfigurableAxis inclusiveDeltaPhi{"inclusiveDeltaPhi", {72, -o2::constants::math::PIHalf, 3.f * o2::constants::math::PIHalf}, "#Delta#varphi"}; } axes; @@ -211,7 +222,8 @@ struct BaryonPairInJets { SliceCache inclusiveMixingCache; using MixingBinning = ColumnBinningPolicy; using MCPMixingBinning = ColumnBinningPolicy; - using InclusiveCollisions = soa::Join; + using InclusiveSameEventCollisions = soa::Join; + using InclusiveMixedEventCollisions = soa::Join; using InclusiveMixingBinning = ColumnBinningPolicy; void init(InitContext const&) @@ -235,6 +247,7 @@ struct BaryonPairInJets { AxisSpec axisDeltaEta{axes.deltaEta}; AxisSpec axisDeltaPhi{axes.deltaPhi}; AxisSpec axisDeltaR{axes.deltaR}; + AxisSpec axisParticleJetDistance{axes.particleJetDistance}; AxisSpec axisInclusiveDeltaEta{axes.inclusiveDeltaEta}; AxisSpec axisInclusiveDeltaPhi{axes.inclusiveDeltaPhi}; AxisSpec axisOrigin{3, 0.5, 3.5, "origin"}; @@ -315,6 +328,14 @@ struct BaryonPairInJets { registry.add("mc/pid/selectedCandidateOriginVsPt", "Selected proton-candidate origin;#it{p}_{T}^{rec} (GeV/#it{c});origin", HistType::kTH2F, {axisBaryonPt, axisOrigin}); registry.add("mc/pid/selectedCandidateTruePdgVsPt", "Selected proton-candidate contamination;#it{p}_{T}^{rec} (GeV/#it{c});true PDG code", HistType::kTH2F, {axisBaryonPt, {801, -4005.f, 4005.f}}); registry.add("mc/pid/ptResponsePrimaryProton", "Primary-proton momentum response;#it{p}_{T}^{part} (GeV/#it{c});#it{p}_{T}^{rec} (GeV/#it{c})", HistType::kTH2F, {axisBaryonPt, axisBaryonPt}); + AxisSpec const axisCharge{2, -1.5f, 1.5f, "charge"}; + registry.add("mc/efficiency/generatedPrimaryProton", "Generated primary protons in matched particle-level jets;charge;#it{p}_{T}^{truth} (GeV/#it{c});#it{p}_{T,jet}^{det} (GeV/#it{c});#Delta#it{R}(p,jet_{part})", HistType::kTHnSparseF, {axisCharge, axisBaryonPt, axisJetPt, axisParticleJetDistance}); + registry.add("mc/efficiency/trackSelectedPrimaryProton", "Track-selected primary protons in matched jets;charge;#it{p}_{T}^{truth} (GeV/#it{c});#it{p}_{T,jet}^{det} (GeV/#it{c});#Delta#it{R}(p,jet_{part})", HistType::kTHnSparseF, {axisCharge, axisBaryonPt, axisJetPt, axisParticleJetDistance}); + registry.add("mc/efficiency/tofMatchedPrimaryProton", "TOF-matched primary protons in matched jets;charge;#it{p}_{T}^{truth} (GeV/#it{c});#it{p}_{T,jet}^{det} (GeV/#it{c});#Delta#it{R}(p,jet_{part})", HistType::kTHnSparseF, {axisCharge, axisBaryonPt, axisJetPt, axisParticleJetDistance}); + registry.add("mc/efficiency/pidSelectedPrimaryProton", "PID-selected primary protons in matched jets;charge;#it{p}_{T}^{truth} (GeV/#it{c});#it{p}_{T,jet}^{det} (GeV/#it{c});#Delta#it{R}(p,jet_{part})", HistType::kTHnSparseF, {axisCharge, axisBaryonPt, axisJetPt, axisParticleJetDistance}); + registry.add("mc/efficiency/generatedPair", "Generated primary-proton pairs in matched jets;pair type;#it{p}_{T,jet}^{det} (GeV/#it{c});#Delta#varphi^{truth};#Delta#it{R}^{truth}", HistType::kTHnSparseF, {axisPairType, axisJetPt, axisDeltaPhi, axisDeltaR}); + registry.add("mc/efficiency/trackSelectedPair", "Track-selected primary-proton pairs in matched jets;pair type;#it{p}_{T,jet}^{det} (GeV/#it{c});#Delta#varphi^{truth};#Delta#it{R}^{truth}", HistType::kTHnSparseF, {axisPairType, axisJetPt, axisDeltaPhi, axisDeltaR}); + registry.add("mc/efficiency/pidSelectedPair", "PID-selected primary-proton pairs in matched jets;pair type;#it{p}_{T,jet}^{det} (GeV/#it{c});#Delta#varphi^{truth};#Delta#it{R}^{truth}", HistType::kTHnSparseF, {axisPairType, axisJetPt, axisDeltaPhi, axisDeltaR}); addPairHistograms("mc/particle/sameEvent", axisPairType, axisJetPt, axisDeltaEta, axisDeltaPhi, axisDeltaR); addPairHistograms("mc/particle/mixedEvent", axisPairType, axisJetPt, axisDeltaEta, axisDeltaPhi, axisDeltaR); registry.add("mc/particle/normalizationSameEvent", "Particle-level same-event normalization;counter;weighted entries", HistType::kTH1F, {axisCounter}); @@ -552,12 +573,12 @@ struct BaryonPairInJets { return passesControlPid(track.pt(), track.hasTOF(), track.tpcNSigmaKa(), track.tofNSigmaKa(), pidCuts.kaonTpcNSigmaMax.value, pidCuts.kaonTofNSigmaMax.value, pidCuts.kaonCombinedNSigmaMax.value); } - template + template SelectedParticles collectSelectedParticles(JetType const& jet, bool fillQa, float weight = 1.f, bool collectControls = true) { SelectedParticles selected; for (auto const& jetTrack : jet.template tracks_as()) { - auto track = jetTrack.template track_as(); + auto track = jetTrack.template track_as(); if (!isSelectedTrack(track)) { continue; } @@ -875,7 +896,7 @@ struct BaryonPairInJets { template void fillPair(PairType pairType, ChargePairType chargePairType, float jetPt, float deltaEta, float deltaPhi, float deltaR, float weight) { - float const pairTypeValue = static_cast(pairType); + auto const pairTypeValue = static_cast(pairType); auto fillSymmetrized = [&](auto const& sameSignName, auto const& oppositeSignName, auto const& sparseName) { if (pairType == PairType::SameSign) { registry.fill(sameSignName, deltaEta, deltaPhi, 0.5f * weight); @@ -938,7 +959,7 @@ struct BaryonPairInJets { void fillSameEventPair(PairType pairType, ChargePairType chargePairType, float jetPt, float deltaEta, float deltaPhi, float deltaR, float weight) { - float const pairTypeValue = static_cast(pairType); + auto const pairTypeValue = static_cast(pairType); if (pairType == PairType::SameSign) { registry.fill(HIST("sameEvent/sameSignDeltaEtaDeltaPhi"), deltaEta, deltaPhi, 0.5f * weight); registry.fill(HIST("sameEvent/sameSignDeltaEtaDeltaPhi"), -deltaEta, -deltaPhi, 0.5f * weight); @@ -1020,6 +1041,29 @@ struct BaryonPairInJets { } } + template + void fillEfficiencyPairs(std::vector const& particles, float detectorJetPt, float weight) + { + for (size_t first = 0; first < particles.size(); ++first) { + for (size_t second = first + 1; second < particles.size(); ++second) { + auto const pairType = static_cast(getPairType(particles[first], particles[second])); + float const deltaEta = particles[first].eta - particles[second].eta; + float const deltaPhi = RecoDecay::constrainAngle(particles[first].phi - particles[second].phi, -o2::constants::math::PI); + float const deltaR = std::hypot(deltaEta, deltaPhi); + if constexpr (Stage == EfficiencyStage::Generated) { + registry.fill(HIST("mc/efficiency/generatedPair"), pairType, detectorJetPt, deltaPhi, deltaR, 0.5f * weight); + registry.fill(HIST("mc/efficiency/generatedPair"), pairType, detectorJetPt, -deltaPhi, deltaR, 0.5f * weight); + } else if constexpr (Stage == EfficiencyStage::TrackSelected) { + registry.fill(HIST("mc/efficiency/trackSelectedPair"), pairType, detectorJetPt, deltaPhi, deltaR, 0.5f * weight); + registry.fill(HIST("mc/efficiency/trackSelectedPair"), pairType, detectorJetPt, -deltaPhi, deltaR, 0.5f * weight); + } else { + registry.fill(HIST("mc/efficiency/pidSelectedPair"), pairType, detectorJetPt, deltaPhi, deltaR, 0.5f * weight); + registry.fill(HIST("mc/efficiency/pidSelectedPair"), pairType, detectorJetPt, -deltaPhi, deltaR, 0.5f * weight); + } + } + } + } + template void fillControlMCPidQa(TrackType const& track, ParticleType const& particle, float weight) { @@ -1099,7 +1143,7 @@ struct BaryonPairInJets { } } - template + template void fillReconstructedSameEvent(CollisionType const& collision, JetsType const& jets, float weight = 1.f) { if (!isSelectedCollision(collision, true)) { @@ -1135,7 +1179,7 @@ struct BaryonPairInJets { registry.fill(HIST("jet/nConstituentsVsPt"), jet.pt(), static_cast(jet.tracksIds().size()), weight); } - auto selectedParticles = collectSelectedParticles(jet, output.fillQa.value, weight); + auto selectedParticles = collectSelectedParticles(jet, output.fillQa.value, weight); auto const& baryons = selectedParticles.baryons; if (output.fillQa.value) { int numberOfProtons = 0; @@ -1187,11 +1231,11 @@ struct BaryonPairInJets { JetTracksWithOriginal const&, BaryonTracks const&) { - fillReconstructedSameEvent(collision, jets); + fillReconstructedSameEvent(collision, jets); } PROCESS_SWITCH(BaryonPairInJets, processSameEvent, "Same-event identified baryon pairs in charged jets", true); - template + template void fillMixedJetPair(JetType1 const& jet1, JetType2 const& jet2, float weight) { float const jetPtDifference = std::abs(jet1.pt() - jet2.pt()); @@ -1208,8 +1252,8 @@ struct BaryonPairInJets { } constexpr bool CollectControls = Reference == MixedReference::Nominal; - auto selectedParticles1 = collectSelectedParticles(jet1, false, 1.f, CollectControls); - auto selectedParticles2 = collectSelectedParticles(jet2, false, 1.f, CollectControls); + auto selectedParticles1 = collectSelectedParticles(jet1, false, 1.f, CollectControls); + auto selectedParticles2 = collectSelectedParticles(jet2, false, 1.f, CollectControls); auto const& baryons1 = selectedParticles1.baryons; auto const& baryons2 = selectedParticles2.baryons; float const mixedJetPt = 0.5f * (jet1.pt() + jet2.pt()); @@ -1280,10 +1324,10 @@ struct BaryonPairInJets { if (!isSelectedJet(jet2)) { continue; } - fillMixedJetPair(jet1, jet2, weight); + fillMixedJetPair(jet1, jet2, weight); if (output.fillReferenceVariations.value) { - fillMixedJetPair(jet1, jet2, weight); - fillMixedJetPair(jet1, jet2, weight); + fillMixedJetPair(jet1, jet2, weight); + fillMixedJetPair(jet1, jet2, weight); } } } @@ -1294,12 +1338,12 @@ struct BaryonPairInJets { void processMCD(aod::JetCollisionsMCD::iterator const& collision, aod::JetMcCollisions const&, ChargedMCDJetsWithConstituents const& jets, - JetTracksMCDWithOriginal const&, + JetTracksWithOriginal const&, BaryonTracksMC const&, aod::McParticles const&) { float const weight = collision.mcCollision().weight(); - fillReconstructedSameEvent(collision, jets, weight); + fillReconstructedSameEvent(collision, jets, weight); if (!isSelectedCollision(collision, false)) { return; } @@ -1314,7 +1358,7 @@ struct BaryonPairInJets { void processMixedEventMCD(aod::JetCollisionsMCD const& collisions, aod::JetMcCollisions const&, ChargedMCDJetsWithConstituents const& jets, - JetTracksMCDWithOriginal const&, + JetTracksWithOriginal const&, BaryonTracksMC const&, aod::McParticles const&) { @@ -1348,10 +1392,10 @@ struct BaryonPairInJets { if (!isSelectedJet(jet2)) { continue; } - fillMixedJetPair(jet1, jet2, weight); + fillMixedJetPair(jet1, jet2, weight); if (output.fillReferenceVariations.value) { - fillMixedJetPair(jet1, jet2, weight); - fillMixedJetPair(jet1, jet2, weight); + fillMixedJetPair(jet1, jet2, weight); + fillMixedJetPair(jet1, jet2, weight); } } } @@ -1466,10 +1510,11 @@ struct BaryonPairInJets { aod::JetMcCollisions const&, MatchedChargedMCDJets const& detectorJets, MatchedChargedMCPJets const&, - JetTracksMCDWithOriginal const&, + JetTracksWithOriginalAndMC const&, + BaryonTracks const&, aod::JetParticles const&) { - if (!isSelectedCollision(collision, false)) { + if (!isSelectedCollision(collision, false) || !collision.has_mcCollision()) { return; } float const weight = collision.mcCollision().weight(); @@ -1480,7 +1525,7 @@ struct BaryonPairInJets { registry.fill(HIST("mc/jet/allDetectorPt"), detectorJet.pt(), weight); bool hasAcceptedMatch = false; for (auto const& particleJet : detectorJet.template matchedJetGeo_as()) { - if (!isSelectedJetGeometry(particleJet)) { + if (!isSelectedJetGeometry(particleJet) || particleJet.mcCollisionId() != collision.mcCollisionId()) { continue; } hasAcceptedMatch = true; @@ -1493,6 +1538,61 @@ struct BaryonPairInJets { float const deltaEta = detectorJet.eta() - particleJet.eta(); float const deltaPhi = RecoDecay::constrainAngle(detectorJet.phi() - particleJet.phi(), -o2::constants::math::PI); registry.fill(HIST("mc/jet/matchingDeltaR"), std::hypot(deltaEta, deltaPhi), weight); + + std::unordered_set generatedParticleIds; + std::vector generatedProtons; + for (auto const& particle : particleJet.template tracks_as()) { + if (!particle.isPhysicalPrimary() || std::abs(particle.pdgCode()) != PDG_t::kProton) { + continue; + } + if (particle.pt() < trackCuts.protonPtMin.value || particle.pt() >= trackCuts.protonPtMax.value || std::abs(particle.eta()) > trackCuts.protonEtaMax.value) { + continue; + } + float const particleDeltaPhi = RecoDecay::constrainAngle(particle.phi() - particleJet.phi(), -o2::constants::math::PI); + float const particleJetDistance = std::hypot(particle.eta() - particleJet.eta(), particleDeltaPhi); + int8_t const sign = particle.pdgCode() > 0 ? 1 : -1; + generatedParticleIds.insert(static_cast(particle.globalIndex())); + generatedProtons.push_back({particle.pt(), particle.eta(), particle.phi(), sign}); + registry.fill(HIST("mc/efficiency/generatedPrimaryProton"), static_cast(sign), particle.pt(), detectorJet.pt(), particleJetDistance, weight); + } + fillEfficiencyPairs(generatedProtons, detectorJet.pt(), weight); + + std::unordered_set trackSelectedParticleIds; + std::unordered_set tofMatchedParticleIds; + std::unordered_set pidSelectedParticleIds; + std::vector trackSelectedProtons; + std::vector pidSelectedProtons; + for (auto const& jetTrack : detectorJet.template tracks_as()) { + if (!jetTrack.has_mcParticle()) { + continue; + } + auto particle = jetTrack.template mcParticle_as(); + auto const particleId = static_cast(particle.globalIndex()); + if (!generatedParticleIds.contains(particleId)) { + continue; + } + auto track = jetTrack.template track_as(); + if (!isSelectedTrack(track)) { + continue; + } + float const particleDeltaPhi = RecoDecay::constrainAngle(particle.phi() - particleJet.phi(), -o2::constants::math::PI); + float const particleJetDistance = std::hypot(particle.eta() - particleJet.eta(), particleDeltaPhi); + int8_t const sign = particle.pdgCode() > 0 ? 1 : -1; + SelectedParticle const selectedParticle{particle.pt(), particle.eta(), particle.phi(), sign}; + if (trackSelectedParticleIds.insert(particleId).second) { + trackSelectedProtons.push_back(selectedParticle); + registry.fill(HIST("mc/efficiency/trackSelectedPrimaryProton"), static_cast(sign), particle.pt(), detectorJet.pt(), particleJetDistance, weight); + } + if (track.hasTOF() && tofMatchedParticleIds.insert(particleId).second) { + registry.fill(HIST("mc/efficiency/tofMatchedPrimaryProton"), static_cast(sign), particle.pt(), detectorJet.pt(), particleJetDistance, weight); + } + if (isSelectedProton(track) && pidSelectedParticleIds.insert(particleId).second) { + pidSelectedProtons.push_back(selectedParticle); + registry.fill(HIST("mc/efficiency/pidSelectedPrimaryProton"), static_cast(sign), particle.pt(), detectorJet.pt(), particleJetDistance, weight); + } + } + fillEfficiencyPairs(trackSelectedProtons, detectorJet.pt(), weight); + fillEfficiencyPairs(pidSelectedProtons, detectorJet.pt(), weight); break; } if (!hasAcceptedMatch) { @@ -1500,14 +1600,13 @@ struct BaryonPairInJets { } } } - PROCESS_SWITCH(BaryonPairInJets, processMatched, "Matched detector-particle charged-jet response", false); + PROCESS_SWITCH(BaryonPairInJets, processMatched, "Matched charged-jet response and proton efficiency", false); - void processInclusiveSameEvent(InclusiveCollisions::iterator const& collision, BaryonTracks const& tracks) + void processInclusiveSameEvent(InclusiveSameEventCollisions::iterator const& collision, BaryonTracks const& tracks) { if (!isSelectedInclusiveCollision(collision)) { return; } - registry.fill(HIST("inclusive/event/multiplicity"), collision.multFT0C()); registry.fill(HIST("inclusive/normalization/sameEvent"), 1.f); auto baryons = collectInclusiveBaryons(tracks); registry.fill(HIST("inclusive/normalization/sameEvent"), 2.f, static_cast(baryons.size())); @@ -1520,11 +1619,16 @@ struct BaryonPairInJets { } PROCESS_SWITCH(BaryonPairInJets, processInclusiveSameEvent, "Inclusive same-event identified baryon pairs", true); - void processInclusiveMixedEvent(InclusiveCollisions const& collisions, BaryonTracks const& tracks) + void processInclusiveMixedEvent(InclusiveMixedEventCollisions const& collisions, BaryonTracks const& tracks) { + for (auto const& collision : collisions) { + if (isSelectedInclusiveCollision(collision)) { + registry.fill(HIST("inclusive/event/multiplicity"), collision.multFT0C()); + } + } InclusiveMixingBinning mixingBinning{{mixing.vertexZBins, mixing.multiplicityBins}}; auto tracksTuple = std::make_tuple(tracks); - SameKindPair mixedCollisionPairs{ + SameKindPair mixedCollisionPairs{ mixingBinning, mixing.numberOfMixedEvents.value, -1, collisions, tracksTuple, &inclusiveMixingCache}; for (auto iterator = mixedCollisionPairs.begin(); iterator != mixedCollisionPairs.end(); ++iterator) { From b60182f9df8b002a22c7639d3a9f3ffad887f1cc Mon Sep 17 00:00:00 2001 From: HANSEO PARK Date: Wed, 14 Oct 2026 22:28:22 +0900 Subject: [PATCH 2/4] [PWGJE] Retrigger CI From a82c783112f0bf229eedeae6f3efa2c63548a8be Mon Sep 17 00:00:00 2001 From: HANSEO PARK Date: Thu, 15 Oct 2026 14:52:35 +0900 Subject: [PATCH 3/4] [PWGJE] Fix code-check warnings --- PWGJE/Tasks/baryonPairInJets.cxx | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/PWGJE/Tasks/baryonPairInJets.cxx b/PWGJE/Tasks/baryonPairInJets.cxx index 63615d5529c..ca47fe594f6 100644 --- a/PWGJE/Tasks/baryonPairInJets.cxx +++ b/PWGJE/Tasks/baryonPairInJets.cxx @@ -17,7 +17,6 @@ #include "PWGJE/DataModel/Jet.h" #include "PWGJE/DataModel/JetReducedData.h" -#include "Common/CCDB/EventSelectionParams.h" #include "Common/CCDB/RCTSelectionFlags.h" #include "Common/Core/RecoDecay.h" #include "Common/DataModel/EventSelection.h" @@ -1551,7 +1550,7 @@ struct BaryonPairInJets { float const particleDeltaPhi = RecoDecay::constrainAngle(particle.phi() - particleJet.phi(), -o2::constants::math::PI); float const particleJetDistance = std::hypot(particle.eta() - particleJet.eta(), particleDeltaPhi); int8_t const sign = particle.pdgCode() > 0 ? 1 : -1; - generatedParticleIds.insert(static_cast(particle.globalIndex())); + generatedParticleIds.insert(particle.globalIndex()); generatedProtons.push_back({particle.pt(), particle.eta(), particle.phi(), sign}); registry.fill(HIST("mc/efficiency/generatedPrimaryProton"), static_cast(sign), particle.pt(), detectorJet.pt(), particleJetDistance, weight); } @@ -1567,7 +1566,7 @@ struct BaryonPairInJets { continue; } auto particle = jetTrack.template mcParticle_as(); - auto const particleId = static_cast(particle.globalIndex()); + auto const particleId = particle.globalIndex(); if (!generatedParticleIds.contains(particleId)) { continue; } @@ -1578,7 +1577,11 @@ struct BaryonPairInJets { float const particleDeltaPhi = RecoDecay::constrainAngle(particle.phi() - particleJet.phi(), -o2::constants::math::PI); float const particleJetDistance = std::hypot(particle.eta() - particleJet.eta(), particleDeltaPhi); int8_t const sign = particle.pdgCode() > 0 ? 1 : -1; - SelectedParticle const selectedParticle{particle.pt(), particle.eta(), particle.phi(), sign}; + SelectedParticle const selectedParticle{ + .pt = particle.pt(), + .eta = particle.eta(), + .phi = particle.phi(), + .sign = sign}; if (trackSelectedParticleIds.insert(particleId).second) { trackSelectedProtons.push_back(selectedParticle); registry.fill(HIST("mc/efficiency/trackSelectedPrimaryProton"), static_cast(sign), particle.pt(), detectorJet.pt(), particleJetDistance, weight); From 66d6b0e29df3282b8df3d9884b5b299bdc75523f Mon Sep 17 00:00:00 2001 From: HANSEO PARK Date: Fri, 16 Oct 2026 15:12:07 +0900 Subject: [PATCH 4/4] [PWGJE] Retrigger staging CI