From ec18b06fd10d6f0559db5a0240695143dca6e144 Mon Sep 17 00:00:00 2001 From: Leonard Date: Sun, 15 Mar 2026 22:15:41 +0100 Subject: [PATCH 01/35] Add jetHadronsPID and update CMakeLists --- PWGJE/Tasks/CMakeLists.txt | 4 + PWGJE/Tasks/jetHadronsPID.cxx | 242 ++++++++++++++++++++++++++++++++++ 2 files changed, 246 insertions(+) create mode 100644 PWGJE/Tasks/jetHadronsPID.cxx diff --git a/PWGJE/Tasks/CMakeLists.txt b/PWGJE/Tasks/CMakeLists.txt index 55ec23b2c44..5cb4350b38a 100644 --- a/PWGJE/Tasks/CMakeLists.txt +++ b/PWGJE/Tasks/CMakeLists.txt @@ -403,4 +403,8 @@ if(FastJet_FOUND) SOURCES bjetCentMult.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore COMPONENT_NAME Analysis) + o2physics_add_dpl_workflow(pid-hadrons-in-jets + SOURCES jetHadronsPID.cxx + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2Physics::PWGJECore FastJet::FastJet FastJet::Contrib O2Physics::EventFilteringUtils + COMPONENT_NAME Analysis) endif() diff --git a/PWGJE/Tasks/jetHadronsPID.cxx b/PWGJE/Tasks/jetHadronsPID.cxx new file mode 100644 index 00000000000..48eec9da1fd --- /dev/null +++ b/PWGJE/Tasks/jetHadronsPID.cxx @@ -0,0 +1,242 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. + +#include "Framework/runDataProcessing.h" +#include "PWGJE/Core/JetBkgSubUtils.h" +#include "PWGJE/Core/JetUtilities.h" +#include "PWGJE/DataModel/Jet.h" + +#include "Common/Core/TrackSelection.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/PIDResponseITS.h" +#include "Common/DataModel/TrackSelectionTables.h" + +#include "Framework/AnalysisTask.h" +#include "Framework/HistogramRegistry.h" +#include "Framework/Logger.h" +#include "ReconstructionDataFormats/DCA.h" +#include "ReconstructionDataFormats/PID.h" +#include "ReconstructionDataFormats/Track.h" + +#include +#include +#include +#include + +#include +#include + +using namespace o2; +using namespace o2::framework; +using namespace o2::aod; +using namespace o2::constants::physics; +using namespace o2::constants::math; + +// Define convenient aliases for commonly used table joins +using SelectedCollisions = soa::Join; + +// CRITICAL FIX: Replaced Proton/Deuteron/Helium PID tables with Pion PID tables +using PionTracks = soa::Join; + +struct PIDHadronsInJets { + + // Histogram registry for data + HistogramRegistry registryData{"registryData", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; + + // Parameters for ppRef analysis + Configurable isppRefAnalysis{"isppRefAnalysis", false, "Is ppRef analysis"}; + Configurable cfgAreaFrac{"cfgAreaFrac", 0.6, "fraction of jet area"}; + Configurable cfgEtaJetMax{"cfgEtaJetMax", 0.5, "max jet eta"}; + Configurable cfgMinPtTrack{"cfgMinPtTrack", 0.1, "minimum pt of tracks for jet reconstruction"}; + + // Event selection criteria + Configurable rejectITSROFBorder{"rejectITSROFBorder", true, "Reject events near the ITS ROF border"}; + Configurable rejectTFBorder{"rejectTFBorder", true, "Reject events near the TF border"}; + Configurable requireVtxITSTPC{"requireVtxITSTPC", true, "Require at least one ITS-TPC matched track"}; + Configurable rejectSameBunchPileup{"rejectSameBunchPileup", true, "Reject events with same-bunch pileup collisions"}; + Configurable requireIsGoodZvtxFT0VsPV{"requireIsGoodZvtxFT0VsPV", true, "Require consistent FT0 vs PV z-vertex"}; + Configurable requireIsVertexTOFmatched{"requireIsVertexTOFmatched", false, "Require at least one vertex track matched to TOF"}; + + // Jet selection parameters + Configurable minJetPt{"minJetPt", 10.0, "Minimum pt of the jet after bkg subtraction"}; + Configurable maxJetPt{"maxJetPt", 1e+06, "Maximum pt of the jet after bkg subtraction"}; + Configurable rJet{"rJet", 0.4, "Jet resolution parameter R"}; + Configurable zVtx{"zVtx", 10.0, "Maximum zVertex"}; + Configurable applyAreaCut{"applyAreaCut", true, "apply area cut"}; + Configurable maxNormalizedJetArea{"maxNormalizedJetArea", 1.0, "area cut"}; + Configurable deltaEtaEdge{"deltaEtaEdge", 0.05, "eta gap from the edge"}; + + // Track quality parameters + Configurable requirePvContributor{"requirePvContributor", false, "require that the track is a PV contributor"}; + Configurable minItsNclusters{"minItsNclusters", 5, "minimum number of ITS clusters"}; + Configurable minTpcNcrossedRows{"minTpcNcrossedRows", 100, "minimum number of TPC crossed pad rows"}; + Configurable minChiSquareTpc{"minChiSquareTpc", 0.0, "minimum TPC chi^2/Ncls"}; + Configurable maxChiSquareTpc{"maxChiSquareTpc", 4.0, "maximum TPC chi^2/Ncls"}; + Configurable maxChiSquareIts{"maxChiSquareIts", 36.0, "maximum ITS chi^2/Ncls"}; + Configurable minPt{"minPt", 0.3, "minimum pt of the tracks"}; + Configurable minEta{"minEta", -0.8, "minimum eta"}; + Configurable maxEta{"maxEta", +0.8, "maximum eta"}; + Configurable maxDcaxy{"maxDcaxy", 0.05, "Maximum DCAxy"}; + Configurable maxDcaz{"maxDcaz", 0.05, "Maximum DCAz"}; + + Configurable setMCDefaultItsParams{"setMCDefaultItsParams", true, "set MC default parameters"}; + + // Utility object for jet background subtraction methods + JetBkgSubUtils backgroundSub; + + // Initialize ITS PID Response object + o2::aod::ITSResponse itsResponse; + + void init(InitContext const&) + { + if (setMCDefaultItsParams) { + itsResponse.setMCDefaultParameters(); + } + + // pid of pions + registryData.add("pion_jet_tpc", "TPC Pion PID in Jets", HistType::kTH2F, {{120, 0.0, 6.0, "#it{p}_{T} (GeV/#it{c})"}, {100, -3.0, 3.0, "n#sigma_{TPC}"}}); + registryData.add("pion_jet_tof", "TOF Pion PID in Jets", HistType::kTH2F, {{120, 0.0, 6.0, "#it{p}_{T} (GeV/#it{c})"}, {100, -3.0, 3.0, "n#sigma_{TOF}"}}); + registryData.add("pion_jet_its", "ITS Pion PID in Jets", HistType::kTH2F, {{120, 0.0, 6.0, "#it{p}_{T} (GeV/#it{c})"}, {100, -3.0, 3.0, "n#sigma_{ITS}"}}); + } + + // ITS hit helper + template + bool hasITSHit(const TrackIts& track, int layer) + { + int ibit = layer - 1; + return (track.itsClusterMap() & (1 << ibit)); + } + + // Single-track selection for jet reconstruction + template + bool passedTrackSelectionForJetReconstruction(const JetTrack& track) + { + static constexpr int MinTpcCr = 70; + static constexpr double MaxChi2Tpc = 4.0; + static constexpr double MaxChi2Its = 36.0; + static constexpr double DcaxyMaxTrackPar0 = 0.0105; + static constexpr double DcaxyMaxTrackPar1 = 0.035; + static constexpr double DcaxyMaxTrackPar2 = 1.1; + static constexpr double DcazMaxTrack = 2.0; + + if (!track.hasITS() || !track.hasTPC()) return false; + if ((!hasITSHit(track, 1)) && (!hasITSHit(track, 2)) && (!hasITSHit(track, 3))) return false; + if (track.tpcNClsCrossedRows() < MinTpcCr) return false; + if (track.tpcChi2NCl() > MaxChi2Tpc) return false; + if (track.itsChi2NCl() > MaxChi2Its) return false; + if (std::fabs(track.eta()) > maxEta) return false; + if (track.pt() < cfgMinPtTrack) return false; + if (std::fabs(track.dcaXY()) > (DcaxyMaxTrackPar0 + DcaxyMaxTrackPar1 / std::pow(track.pt(), DcaxyMaxTrackPar2))) return false; + if (std::fabs(track.dcaZ()) > DcazMaxTrack) return false; + return true; + } + + // Single-track selection for constituents + template + bool passedTrackSelection(const PionTrack& track) + { + if (requirePvContributor && !(track.isPVContributor())) return false; + if (!track.hasITS() || !track.hasTPC()) return false; + if ((!hasITSHit(track, 1)) && (!hasITSHit(track, 2)) && (!hasITSHit(track, 3))) return false; + if (track.itsNCls() < minItsNclusters) return false; + if (track.tpcNClsCrossedRows() < minTpcNcrossedRows) return false; + if (track.tpcChi2NCl() < minChiSquareTpc || track.tpcChi2NCl() > maxChiSquareTpc) return false; + if (track.itsChi2NCl() > maxChiSquareIts) return false; + if (track.eta() < minEta || track.eta() > maxEta) return false; + if (track.pt() < minPt) return false; + return true; + } + + // Process Data + void processData(SelectedCollisions::iterator const& collision, PionTracks const& tracks) + { + // Apply standard event selection + if (!collision.sel8() || std::fabs(collision.posZ()) > zVtx) return; + if (rejectITSROFBorder && !collision.selection_bit(o2::aod::evsel::kNoITSROFrameBorder)) return; + if (rejectTFBorder && !collision.selection_bit(o2::aod::evsel::kNoTimeFrameBorder)) return; + if (requireVtxITSTPC && !collision.selection_bit(o2::aod::evsel::kIsVertexITSTPC)) return; + if (rejectSameBunchPileup && !collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) return; + if (requireIsGoodZvtxFT0VsPV && !collision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) return; + if (requireIsVertexTOFmatched && !collision.selection_bit(o2::aod::evsel::kIsVertexTOFmatched)) return; + + // Build FastJet particles + int id(-1); + std::vector fjParticles; + for (auto const& track : tracks) { + id++; + if (!passedTrackSelectionForJetReconstruction(track)) continue; + + fastjet::PseudoJet fourMomentum(track.px(), track.py(), track.pz(), track.energy(MassPionCharged)); + fourMomentum.set_user_index(id); + fjParticles.emplace_back(fourMomentum); + } + + if (fjParticles.empty()) return; + + // Cluster particles + fastjet::JetDefinition jetDef(fastjet::antikt_algorithm, rJet); + fastjet::AreaDefinition areaDef(fastjet::active_area, fastjet::GhostedAreaSpec(1.0)); + fastjet::ClusterSequenceArea cs(fjParticles, jetDef, areaDef); + std::vector jets = fastjet::sorted_by_pt(cs.inclusive_jets()); + auto [rhoPerp, rhoMPerp] = jetutilities::estimateRhoPerpCone(fjParticles, jets[0], rJet); + + // Loop over reconstructed jets + for (const auto& jet : jets) { + + if (!isppRefAnalysis && ((std::fabs(jet.eta()) + rJet) > (maxEta - deltaEtaEdge))) continue; + if (isppRefAnalysis && std::fabs(jet.eta()) > cfgEtaJetMax) continue; + + auto jetForSub = jet; + fastjet::PseudoJet jetMinusBkg = backgroundSub.doRhoAreaSub(jetForSub, rhoPerp, rhoMPerp); + + if (isppRefAnalysis && (jet.pt() < minJetPt || jet.pt() > maxJetPt)) continue; + if (!isppRefAnalysis && (jetMinusBkg.pt() < minJetPt || jetMinusBkg.pt() > maxJetPt)) continue; + + double normalizedJetArea = jet.area() / (PI * rJet * rJet); + if (applyAreaCut && (!isppRefAnalysis) && normalizedJetArea > maxNormalizedJetArea) continue; + if (isppRefAnalysis && (jet.area() < cfgAreaFrac * PI * rJet * rJet)) continue; + + std::vector jetConstituents = jet.constituents(); + + // loop to fill historgrams + for (const auto& particle : jetConstituents) { + + auto const& track = tracks.iteratorAt(particle.user_index()); + + // Constituent Track Selection (includes DCA checks) + if (!passedTrackSelection(track)) continue; + if (std::fabs(track.dcaXY()) > maxDcaxy || std::fabs(track.dcaZ()) > maxDcaz) continue; + + double pt = track.pt(); + + // Check Pion PID (+/- 3 Sigma) + double nsigmaTPCPi = track.tpcNSigmaPi(); + double nSigmaITSPi = static_cast(itsResponse.nSigmaITS(track)); + + // Fill TPC + if (std::abs(nsigmaTPCPi) <= 3.0) { + registryData.fill(HIST("pion_jet_tpc"), pt, nsigmaTPCPi); + } + + // Fill TOF + if (track.hasTOF()) { + double nsigmaTOFPi = track.tofNSigmaPi(); + if (std::abs(nsigmaTOFPi) <= 3.0) { + registryData.fill(HIST("pion_jet_tof"), pt, nsigmaTOFPi); + } + } + + // Fill ITS + if (std::abs(nSigmaITSPi) <= 3.0) { + registryData.fill(HIST("pion_jet_its"), pt, nSigmaITSPi); + } + } + } + } +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{adaptAnalysisTask(cfgc)}; +} \ No newline at end of file From b7d49f8291bb4f26b9bd470e48c67f6f6bced738 Mon Sep 17 00:00:00 2001 From: Leonard Date: Mon, 16 Mar 2026 12:33:09 +0100 Subject: [PATCH 02/35] small changes to jetHadronsPID --- PWGJE/Tasks/jetHadronsPID.cxx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/PWGJE/Tasks/jetHadronsPID.cxx b/PWGJE/Tasks/jetHadronsPID.cxx index 48eec9da1fd..d46c97c4690 100644 --- a/PWGJE/Tasks/jetHadronsPID.cxx +++ b/PWGJE/Tasks/jetHadronsPID.cxx @@ -36,7 +36,7 @@ using namespace o2::constants::math; // Define convenient aliases for commonly used table joins using SelectedCollisions = soa::Join; -// CRITICAL FIX: Replaced Proton/Deuteron/Helium PID tables with Pion PID tables + using PionTracks = soa::Join; struct PIDHadronsInJets { @@ -149,7 +149,7 @@ struct PIDHadronsInJets { } // Process Data - void processData(SelectedCollisions::iterator const& collision, PionTracks const& tracks) + void process(SelectedCollisions::iterator const& collision, PionTracks const& tracks) { // Apply standard event selection if (!collision.sel8() || std::fabs(collision.posZ()) > zVtx) return; @@ -214,12 +214,12 @@ struct PIDHadronsInJets { double nsigmaTPCPi = track.tpcNSigmaPi(); double nSigmaITSPi = static_cast(itsResponse.nSigmaITS(track)); - // Fill TPC + // Fill TPC histograms if (std::abs(nsigmaTPCPi) <= 3.0) { registryData.fill(HIST("pion_jet_tpc"), pt, nsigmaTPCPi); } - // Fill TOF + // Fill TOF histograms if (track.hasTOF()) { double nsigmaTOFPi = track.tofNSigmaPi(); if (std::abs(nsigmaTOFPi) <= 3.0) { @@ -227,7 +227,7 @@ struct PIDHadronsInJets { } } - // Fill ITS + // Fill ITS histograms if (std::abs(nSigmaITSPi) <= 3.0) { registryData.fill(HIST("pion_jet_its"), pt, nSigmaITSPi); } From db4168ca8f2dcd6930c34540c57599a079fca3e7 Mon Sep 17 00:00:00 2001 From: Leonard Date: Fri, 20 Mar 2026 21:29:40 +0100 Subject: [PATCH 03/35] fixing pid in jetHadronsPID --- PWGJE/Tasks/jetHadronsPID.cxx | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/PWGJE/Tasks/jetHadronsPID.cxx b/PWGJE/Tasks/jetHadronsPID.cxx index d46c97c4690..ca5058fafa6 100644 --- a/PWGJE/Tasks/jetHadronsPID.cxx +++ b/PWGJE/Tasks/jetHadronsPID.cxx @@ -37,7 +37,7 @@ using namespace o2::constants::math; using SelectedCollisions = soa::Join; -using PionTracks = soa::Join; +using PionTracks = soa::Join; struct PIDHadronsInJets { @@ -210,24 +210,24 @@ struct PIDHadronsInJets { double pt = track.pt(); - // Check Pion PID (+/- 3 Sigma) - double nsigmaTPCPi = track.tpcNSigmaPi(); + // Check Pion PID (+/- 3 Sigma) + double nsigmaTPCPi = track.pidTPC().nSigmaPi(); double nSigmaITSPi = static_cast(itsResponse.nSigmaITS(track)); - // Fill TPC histograms + // Fill TPC if (std::abs(nsigmaTPCPi) <= 3.0) { registryData.fill(HIST("pion_jet_tpc"), pt, nsigmaTPCPi); } - // Fill TOF histograms + // Fill TOF if (track.hasTOF()) { - double nsigmaTOFPi = track.tofNSigmaPi(); + double nsigmaTOFPi = track.pidTOF().nSigmaPi(); if (std::abs(nsigmaTOFPi) <= 3.0) { registryData.fill(HIST("pion_jet_tof"), pt, nsigmaTOFPi); } } - // Fill ITS histograms + // Fill ITS if (std::abs(nSigmaITSPi) <= 3.0) { registryData.fill(HIST("pion_jet_its"), pt, nSigmaITSPi); } From 44648230740bae20617548090675f0d98ea9e2be Mon Sep 17 00:00:00 2001 From: Leonard Date: Fri, 20 Mar 2026 21:48:31 +0100 Subject: [PATCH 04/35] more changes to pid --- PWGJE/Tasks/jetHadronsPID.cxx | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/PWGJE/Tasks/jetHadronsPID.cxx b/PWGJE/Tasks/jetHadronsPID.cxx index ca5058fafa6..42106aa4f29 100644 --- a/PWGJE/Tasks/jetHadronsPID.cxx +++ b/PWGJE/Tasks/jetHadronsPID.cxx @@ -37,7 +37,7 @@ using namespace o2::constants::math; using SelectedCollisions = soa::Join; -using PionTracks = soa::Join; +using PionTracks = soa::Join; struct PIDHadronsInJets { @@ -209,11 +209,12 @@ struct PIDHadronsInJets { if (std::fabs(track.dcaXY()) > maxDcaxy || std::fabs(track.dcaZ()) > maxDcaz) continue; double pt = track.pt(); + // double nSigmaITSPi = static_cast(itsResponse.nSigmaITS(track)); - // Check Pion PID (+/- 3 Sigma) - double nsigmaTPCPi = track.pidTPC().nSigmaPi(); - double nSigmaITSPi = static_cast(itsResponse.nSigmaITS(track)); + // Check Pion PID (+/- 3 Sigma) + double nsigmaTPCPi = track.tpcNSigmaPi(); + // Fill TPC if (std::abs(nsigmaTPCPi) <= 3.0) { registryData.fill(HIST("pion_jet_tpc"), pt, nsigmaTPCPi); @@ -221,16 +222,16 @@ struct PIDHadronsInJets { // Fill TOF if (track.hasTOF()) { - double nsigmaTOFPi = track.pidTOF().nSigmaPi(); + double nsigmaTOFPi = track.tofNSigmaPi(); if (std::abs(nsigmaTOFPi) <= 3.0) { registryData.fill(HIST("pion_jet_tof"), pt, nsigmaTOFPi); } } - // Fill ITS - if (std::abs(nSigmaITSPi) <= 3.0) { - registryData.fill(HIST("pion_jet_its"), pt, nSigmaITSPi); - } + // // Fill ITS + // if (std::abs(nSigmaITSPi) <= 3.0) { + // registryData.fill(HIST("pion_jet_its"), pt, nSigmaITSPi); + // } } } } From 267a9fa2adb8e1f8641bf90cf3a6c022173a4ed9 Mon Sep 17 00:00:00 2001 From: hzalewski Date: Mon, 23 Mar 2026 10:52:47 +0100 Subject: [PATCH 05/35] add historams for hadrons in jet and ue --- PWGJE/Tasks/jetHadronsPID.cxx | 168 ++++++++++++++++++++++++++++------ 1 file changed, 139 insertions(+), 29 deletions(-) diff --git a/PWGJE/Tasks/jetHadronsPID.cxx b/PWGJE/Tasks/jetHadronsPID.cxx index 42106aa4f29..e4aea32affa 100644 --- a/PWGJE/Tasks/jetHadronsPID.cxx +++ b/PWGJE/Tasks/jetHadronsPID.cxx @@ -24,6 +24,9 @@ #include #include +#include +#include + #include #include @@ -37,7 +40,10 @@ using namespace o2::constants::math; using SelectedCollisions = soa::Join; -using PionTracks = soa::Join; +using HadronTracks = soa::Join; struct PIDHadronsInJets { @@ -75,6 +81,7 @@ struct PIDHadronsInJets { Configurable maxChiSquareTpc{"maxChiSquareTpc", 4.0, "maximum TPC chi^2/Ncls"}; Configurable maxChiSquareIts{"maxChiSquareIts", 36.0, "maximum ITS chi^2/Ncls"}; Configurable minPt{"minPt", 0.3, "minimum pt of the tracks"}; + Configurable maxPt{"maxPt", 4.0, "maximum pt of the tracks for PID analysis"}; // pt cut at 4.0 Configurable minEta{"minEta", -0.8, "minimum eta"}; Configurable maxEta{"maxEta", +0.8, "maximum eta"}; Configurable maxDcaxy{"maxDcaxy", 0.05, "Maximum DCAxy"}; @@ -94,10 +101,64 @@ struct PIDHadronsInJets { itsResponse.setMCDefaultParameters(); } - // pid of pions - registryData.add("pion_jet_tpc", "TPC Pion PID in Jets", HistType::kTH2F, {{120, 0.0, 6.0, "#it{p}_{T} (GeV/#it{c})"}, {100, -3.0, 3.0, "n#sigma_{TPC}"}}); - registryData.add("pion_jet_tof", "TOF Pion PID in Jets", HistType::kTH2F, {{120, 0.0, 6.0, "#it{p}_{T} (GeV/#it{c})"}, {100, -3.0, 3.0, "n#sigma_{TOF}"}}); - registryData.add("pion_jet_its", "ITS Pion PID in Jets", HistType::kTH2F, {{120, 0.0, 6.0, "#it{p}_{T} (GeV/#it{c})"}, {100, -3.0, 3.0, "n#sigma_{ITS}"}}); + // Pions, Kaons, Protons in Jet + registryData.add("pion_jet_tpc", "TPC Pion PID in Jets", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); + registryData.add("pion_jet_tof", "TOF Pion PID in Jets", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); + registryData.add("kaon_jet_tpc", "TPC Kaon PID in Jets", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); + registryData.add("kaon_jet_tof", "TOF Kaon PID in Jets", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); + registryData.add("proton_jet_tpc", "TPC Proton PID in Jets", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); + registryData.add("proton_jet_tof", "TOF Proton PID in Jets", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); + + // Pions, Kaons, Protons Underlying Event + registryData.add("pion_ue_tpc", "TPC Pion PID in UE", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); + registryData.add("pion_ue_tof", "TOF Pion PID in UE", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); + registryData.add("kaon_ue_tpc", "TPC Kaon PID in UE", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); + registryData.add("kaon_ue_tof", "TOF Kaon PID in UE", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); + registryData.add("proton_ue_tpc", "TPC Proton PID in UE", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); + registryData.add("proton_ue_tof", "TOF Proton PID in UE", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); + } + + // Compute two transverse directions orthogonal to vector p + void getPerpendicularDirections(const TVector3& p, TVector3& u1, TVector3& u2) + { + double px = p.X(), py = p.Y(), pz = p.Z(); + double px2 = px * px, py2 = py * py, pz2 = pz * pz; + double pz4 = pz2 * pz2; + + if (px == 0 && py == 0) { u1.SetXYZ(0, 0, 0); u2.SetXYZ(0, 0, 0); return; } + if (px == 0 && py != 0) { + double ux = std::sqrt(py2 - pz4 / py2); + double uy = -pz2 / py; + u1.SetXYZ(ux, uy, pz); u2.SetXYZ(-ux, uy, pz); return; + } + if (py == 0 && px != 0) { + double ux = -pz2 / px; + double uy = std::sqrt(px2 - pz4 / px2); + u1.SetXYZ(ux, uy, pz); u2.SetXYZ(ux, -uy, pz); return; + } + + double a = px2 + py2; + double b = 2.0 * px * pz2; + double c = pz4 - py2 * py2 - px2 * py2; + double delta = b * b - 4.0 * a * c; + + if (delta < 0 || a == 0) { u1.SetXYZ(0, 0, 0); u2.SetXYZ(0, 0, 0); return; } + double u1x = (-b + std::sqrt(delta)) / (2.0 * a); + u1.SetXYZ(u1x, (-pz2 - px * u1x) / py, pz); + double u2x = (-b - std::sqrt(delta)) / (2.0 * a); + u2.SetXYZ(u2x, (-pz2 - px * u2x) / py, pz); + } + + double getDeltaPhi(double a1, double a2) + { + double deltaPhi(0); + double phi1 = TVector2::Phi_0_2pi(a1); + double phi2 = TVector2::Phi_0_2pi(a2); + double diff = std::fabs(phi1 - phi2); + + if (diff <= PI) deltaPhi = diff; + if (diff > PI) deltaPhi = TwoPI - diff; + return deltaPhi; } // ITS hit helper @@ -144,12 +205,12 @@ struct PIDHadronsInJets { if (track.tpcChi2NCl() < minChiSquareTpc || track.tpcChi2NCl() > maxChiSquareTpc) return false; if (track.itsChi2NCl() > maxChiSquareIts) return false; if (track.eta() < minEta || track.eta() > maxEta) return false; - if (track.pt() < minPt) return false; + if (track.pt() < minPt || track.pt() > maxPt) return false; return true; } // Process Data - void process(SelectedCollisions::iterator const& collision, PionTracks const& tracks) + void process(SelectedCollisions::iterator const& collision, HadronTracks const& tracks) { // Apply standard event selection if (!collision.sel8() || std::fabs(collision.posZ()) > zVtx) return; @@ -174,14 +235,16 @@ struct PIDHadronsInJets { if (fjParticles.empty()) return; - // Cluster particles + fastjet::JetDefinition jetDef(fastjet::antikt_algorithm, rJet); fastjet::AreaDefinition areaDef(fastjet::active_area, fastjet::GhostedAreaSpec(1.0)); fastjet::ClusterSequenceArea cs(fjParticles, jetDef, areaDef); std::vector jets = fastjet::sorted_by_pt(cs.inclusive_jets()); + + if (jets.empty()) return; + auto [rhoPerp, rhoMPerp] = jetutilities::estimateRhoPerpCone(fjParticles, jets[0], rJet); - // Loop over reconstructed jets for (const auto& jet : jets) { if (!isppRefAnalysis && ((std::fabs(jet.eta()) + rJet) > (maxEta - deltaEtaEdge))) continue; @@ -197,41 +260,88 @@ struct PIDHadronsInJets { if (applyAreaCut && (!isppRefAnalysis) && normalizedJetArea > maxNormalizedJetArea) continue; if (isppRefAnalysis && (jet.area() < cfgAreaFrac * PI * rJet * rJet)) continue; - std::vector jetConstituents = jet.constituents(); - // loop to fill historgrams + double coneRadius = std::sqrt(jet.area() / PI); + TVector3 jetAxis(jet.px(), jet.py(), jet.pz()); + TVector3 ueAxis1(0, 0, 0), ueAxis2(0, 0, 0); + getPerpendicularDirections(jetAxis, ueAxis1, ueAxis2); + + if (ueAxis1.Mag() == 0 || ueAxis2.Mag() == 0) continue; + + std::vector jetConstituents = jet.constituents(); for (const auto& particle : jetConstituents) { auto const& track = tracks.iteratorAt(particle.user_index()); - // Constituent Track Selection (includes DCA checks) if (!passedTrackSelection(track)) continue; if (std::fabs(track.dcaXY()) > maxDcaxy || std::fabs(track.dcaZ()) > maxDcaz) continue; double pt = track.pt(); - // double nSigmaITSPi = static_cast(itsResponse.nSigmaITS(track)); + if (std::abs(track.tpcNSigmaPi()) <= 3.0) { + registryData.fill(HIST("pion_jet_tpc"), pt, track.tpcNSigmaPi()); + } + if (track.hasTOF() && std::abs(track.tofNSigmaPi()) <= 3.0) { + registryData.fill(HIST("pion_jet_tof"), pt, track.tofNSigmaPi()); + } - // Check Pion PID (+/- 3 Sigma) - double nsigmaTPCPi = track.tpcNSigmaPi(); - - // Fill TPC - if (std::abs(nsigmaTPCPi) <= 3.0) { - registryData.fill(HIST("pion_jet_tpc"), pt, nsigmaTPCPi); + if (std::abs(track.tpcNSigmaKa()) <= 3.0) { + registryData.fill(HIST("kaon_jet_tpc"), pt, track.tpcNSigmaKa()); + } + if (track.hasTOF() && std::abs(track.tofNSigmaKa()) <= 3.0) { + registryData.fill(HIST("kaon_jet_tof"), pt, track.tofNSigmaKa()); } + + if (std::abs(track.tpcNSigmaPr()) <= 3.0) { + registryData.fill(HIST("proton_jet_tpc"), pt, track.tpcNSigmaPr()); + } + if (track.hasTOF() && std::abs(track.tofNSigmaPr()) <= 3.0) { + registryData.fill(HIST("proton_jet_tof"), pt, track.tofNSigmaPr()); + } + } + + for (auto const& track : tracks) { + + if (!passedTrackSelection(track)) continue; + if (std::fabs(track.dcaXY()) > maxDcaxy || std::fabs(track.dcaZ()) > maxDcaz) continue; + + double deltaEtaUe1 = track.eta() - ueAxis1.Eta(); + double deltaPhiUe1 = getDeltaPhi(track.phi(), ueAxis1.Phi()); + double deltaRUe1 = std::sqrt(deltaEtaUe1 * deltaEtaUe1 + deltaPhiUe1 * deltaPhiUe1); - // Fill TOF - if (track.hasTOF()) { - double nsigmaTOFPi = track.tofNSigmaPi(); - if (std::abs(nsigmaTOFPi) <= 3.0) { - registryData.fill(HIST("pion_jet_tof"), pt, nsigmaTOFPi); - } + double deltaEtaUe2 = track.eta() - ueAxis2.Eta(); + double deltaPhiUe2 = getDeltaPhi(track.phi(), ueAxis2.Phi()); + double deltaRUe2 = std::sqrt(deltaEtaUe2 * deltaEtaUe2 + deltaPhiUe2 * deltaPhiUe2); + + double maxConeRadius = coneRadius; + if (applyAreaCut) { + maxConeRadius = std::sqrt(maxNormalizedJetArea) * rJet; } - // // Fill ITS - // if (std::abs(nSigmaITSPi) <= 3.0) { - // registryData.fill(HIST("pion_jet_its"), pt, nSigmaITSPi); - // } + if (deltaRUe1 > maxConeRadius && deltaRUe2 > maxConeRadius) continue; + + double pt = track.pt(); + + if (std::abs(track.tpcNSigmaPi()) <= 3.0) { + registryData.fill(HIST("pion_ue_tpc"), pt, track.tpcNSigmaPi()); + } + if (track.hasTOF() && std::abs(track.tofNSigmaPi()) <= 3.0) { + registryData.fill(HIST("pion_ue_tof"), pt, track.tofNSigmaPi()); + } + + if (std::abs(track.tpcNSigmaKa()) <= 3.0) { + registryData.fill(HIST("kaon_ue_tpc"), pt, track.tpcNSigmaKa()); + } + if (track.hasTOF() && std::abs(track.tofNSigmaKa()) <= 3.0) { + registryData.fill(HIST("kaon_ue_tof"), pt, track.tofNSigmaKa()); + } + + if (std::abs(track.tpcNSigmaPr()) <= 3.0) { + registryData.fill(HIST("proton_ue_tpc"), pt, track.tpcNSigmaPr()); + } + if (track.hasTOF() && std::abs(track.tofNSigmaPr()) <= 3.0) { + registryData.fill(HIST("proton_ue_tof"), pt, track.tofNSigmaPr()); + } } } } From afe2378ebd2f2cf58ae1b80e32f73bcee13e6124 Mon Sep 17 00:00:00 2001 From: Leonard Date: Sun, 19 Apr 2026 15:18:01 +0200 Subject: [PATCH 06/35] fixing code and adding mc process --- PWGJE/Tasks/jetHadronsPID.cxx | 388 +++++++++++++++++++++++++++++----- 1 file changed, 338 insertions(+), 50 deletions(-) diff --git a/PWGJE/Tasks/jetHadronsPID.cxx b/PWGJE/Tasks/jetHadronsPID.cxx index e4aea32affa..fd94ed6bef3 100644 --- a/PWGJE/Tasks/jetHadronsPID.cxx +++ b/PWGJE/Tasks/jetHadronsPID.cxx @@ -29,6 +29,7 @@ #include #include +#include using namespace o2; using namespace o2::framework; @@ -36,27 +37,29 @@ using namespace o2::aod; using namespace o2::constants::physics; using namespace o2::constants::math; -// Define convenient aliases for commonly used table joins using SelectedCollisions = soa::Join; - using HadronTracks = soa::Join; + +using HadronTracksMC = soa::Join; + struct PIDHadronsInJets { - // Histogram registry for data HistogramRegistry registryData{"registryData", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; - // Parameters for ppRef analysis Configurable isppRefAnalysis{"isppRefAnalysis", false, "Is ppRef analysis"}; Configurable cfgAreaFrac{"cfgAreaFrac", 0.6, "fraction of jet area"}; Configurable cfgEtaJetMax{"cfgEtaJetMax", 0.5, "max jet eta"}; Configurable cfgMinPtTrack{"cfgMinPtTrack", 0.1, "minimum pt of tracks for jet reconstruction"}; - // Event selection criteria Configurable rejectITSROFBorder{"rejectITSROFBorder", true, "Reject events near the ITS ROF border"}; Configurable rejectTFBorder{"rejectTFBorder", true, "Reject events near the TF border"}; Configurable requireVtxITSTPC{"requireVtxITSTPC", true, "Require at least one ITS-TPC matched track"}; @@ -64,7 +67,6 @@ struct PIDHadronsInJets { Configurable requireIsGoodZvtxFT0VsPV{"requireIsGoodZvtxFT0VsPV", true, "Require consistent FT0 vs PV z-vertex"}; Configurable requireIsVertexTOFmatched{"requireIsVertexTOFmatched", false, "Require at least one vertex track matched to TOF"}; - // Jet selection parameters Configurable minJetPt{"minJetPt", 10.0, "Minimum pt of the jet after bkg subtraction"}; Configurable maxJetPt{"maxJetPt", 1e+06, "Maximum pt of the jet after bkg subtraction"}; Configurable rJet{"rJet", 0.4, "Jet resolution parameter R"}; @@ -73,26 +75,22 @@ struct PIDHadronsInJets { Configurable maxNormalizedJetArea{"maxNormalizedJetArea", 1.0, "area cut"}; Configurable deltaEtaEdge{"deltaEtaEdge", 0.05, "eta gap from the edge"}; - // Track quality parameters Configurable requirePvContributor{"requirePvContributor", false, "require that the track is a PV contributor"}; Configurable minItsNclusters{"minItsNclusters", 5, "minimum number of ITS clusters"}; - Configurable minTpcNcrossedRows{"minTpcNcrossedRows", 100, "minimum number of TPC crossed pad rows"}; + Configurable minTpcNcrossedRows{"minTpcNcrossedRows", 70, "minimum number of TPC crossed pad rows"}; Configurable minChiSquareTpc{"minChiSquareTpc", 0.0, "minimum TPC chi^2/Ncls"}; Configurable maxChiSquareTpc{"maxChiSquareTpc", 4.0, "maximum TPC chi^2/Ncls"}; Configurable maxChiSquareIts{"maxChiSquareIts", 36.0, "maximum ITS chi^2/Ncls"}; Configurable minPt{"minPt", 0.3, "minimum pt of the tracks"}; - Configurable maxPt{"maxPt", 4.0, "maximum pt of the tracks for PID analysis"}; // pt cut at 4.0 + Configurable maxPt{"maxPt", 4.0, "maximum pt of the tracks for PID analysis"}; // more ? Configurable minEta{"minEta", -0.8, "minimum eta"}; Configurable maxEta{"maxEta", +0.8, "maximum eta"}; - Configurable maxDcaxy{"maxDcaxy", 0.05, "Maximum DCAxy"}; - Configurable maxDcaz{"maxDcaz", 0.05, "Maximum DCAz"}; + Configurable maxDcaxy{"maxDcaxy", 0.05, "Maximum DCAxy"}; // more ? + Configurable maxDcaz{"maxDcaz", 0.05, "Maximum DCAz"};// Configurable setMCDefaultItsParams{"setMCDefaultItsParams", true, "set MC default parameters"}; - // Utility object for jet background subtraction methods JetBkgSubUtils backgroundSub; - - // Initialize ITS PID Response object o2::aod::ITSResponse itsResponse; void init(InitContext const&) @@ -101,7 +99,32 @@ struct PIDHadronsInJets { itsResponse.setMCDefaultParameters(); } - // Pions, Kaons, Protons in Jet + registryData.add("pion_pure_tpc", "TPC Pion PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); + registryData.add("pion_pure_tof", "TOF Pion PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); + registryData.add("pion_pure_pt", "Pion pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})" }}); + registryData.add("pion_pure_eta", "Pion Eta", HistType::kTH1F, {{100, -1.0, 1.0, "#eta" }}); + registryData.add("pion_pure_dcaz", "Pion DCAz", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)" }}); + registryData.add("pion_pure_dcaxy", "Pion DCAxy", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)" }}); + + registryData.add("kaon_pure_tpc", "TPC Kaon PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); + registryData.add("kaon_pure_tof", "TOF Kaon PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); + registryData.add("kaon_pure_pt", "Kaon pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})" }}); + registryData.add("kaon_pure_eta", "Kaon Eta", HistType::kTH1F, {{100, -1.0, 1.0, "#eta" }}); + registryData.add("kaon_pure_dcaz", "Kaon DCAz", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)" }}); + registryData.add("kaon_pure_dcaxy", "Kaon DCAxy", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)" }}); + + registryData.add("proton_pure_tpc", "TPC Proton PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); + registryData.add("proton_pure_tof", "TOF Proton PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); + registryData.add("proton_pure_pt", "Proton pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})" }}); + registryData.add("proton_pure_eta", "Proton Eta", HistType::kTH1F, {{100, -1.0, 1.0, "#eta" }}); + registryData.add("proton_pure_dcaz", "Proton DCAz", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)" }}); + registryData.add("proton_pure_dcaxy", "Proton DCAxy", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)" }}); + + + registryData.add("z_vtx", "Z-Vertex Distribution", HistType::kTH1F, {{200, -20.0, 20.0, "Z-Vertex (cm)"}}); + registryData.add("tracks_in_jets", "Number of Tracks Inside Jets", HistType::kTH1F, {{100, 0, 100, "N_{tracks}"}}); + registryData.add("tracks_outside_jets", "Number of Tracks Outside Jets", HistType::kTH1F, {{500, 0, 500, "N_{tracks}"}}); + registryData.add("pion_jet_tpc", "TPC Pion PID in Jets", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); registryData.add("pion_jet_tof", "TOF Pion PID in Jets", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); registryData.add("kaon_jet_tpc", "TPC Kaon PID in Jets", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); @@ -109,16 +132,40 @@ struct PIDHadronsInJets { registryData.add("proton_jet_tpc", "TPC Proton PID in Jets", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); registryData.add("proton_jet_tof", "TOF Proton PID in Jets", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); - // Pions, Kaons, Protons Underlying Event registryData.add("pion_ue_tpc", "TPC Pion PID in UE", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); registryData.add("pion_ue_tof", "TOF Pion PID in UE", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); registryData.add("kaon_ue_tpc", "TPC Kaon PID in UE", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); registryData.add("kaon_ue_tof", "TOF Kaon PID in UE", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); registryData.add("proton_ue_tpc", "TPC Proton PID in UE", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); registryData.add("proton_ue_tof", "TOF Proton PID in UE", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); + + registryData.add("pion_jet_pt", "Pion pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})" }}); + registryData.add("pion_jet_eta", "Pion Eta", HistType::kTH1F, {{100, -1.0, 1.0, "#eta" }}); + registryData.add("pion_jet_dcaxy", "Pion DCAxy", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)" }}); + registryData.add("pion_jet_dcaz", "Pion DCAz", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)" }}); + + registryData.add("kaon_jet_pt", "Kaon pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})" }}); + registryData.add("kaon_jet_eta", "Kaon Eta", HistType::kTH1F, {{100, -1.0, 1.0, "#eta" }}); + registryData.add("kaon_jet_dcaxy", "Kaon DCAxy", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)" }}); + registryData.add("kaon_jet_dcaz", "Kaon DCAz", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)" }}); + + registryData.add("proton_jet_pt", "Proton pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})" }}); + registryData.add("proton_jet_eta", "Proton Eta", HistType::kTH1F, {{100, -1.0, 1.0, "#eta" }}); + registryData.add("proton_jet_dcaxy", "Proton DCAxy", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)" }}); + registryData.add("proton_jet_dcaz", "Proton DCAz", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)" }}); + + + registryData.add("mc_gen_pion_pt", "Generated Pion pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})" }}); + registryData.add("mc_rec_pion_pt", "Reconstructed Pion pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})" }}); + + registryData.add("mc_gen_kaon_pt", "Generated Kaon pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})" }}); + registryData.add("mc_rec_kaon_pt", "Reconstructed Kaon pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})" }}); + + registryData.add("mc_gen_proton_pt", "Generated Proton pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})" }}); + registryData.add("mc_rec_proton_pt", "Reconstructed Proton pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})" }}); + } - // Compute two transverse directions orthogonal to vector p void getPerpendicularDirections(const TVector3& p, TVector3& u1, TVector3& u2) { double px = p.X(), py = p.Y(), pz = p.Z(); @@ -161,7 +208,6 @@ struct PIDHadronsInJets { return deltaPhi; } - // ITS hit helper template bool hasITSHit(const TrackIts& track, int layer) { @@ -169,7 +215,6 @@ struct PIDHadronsInJets { return (track.itsClusterMap() & (1 << ibit)); } - // Single-track selection for jet reconstruction template bool passedTrackSelectionForJetReconstruction(const JetTrack& track) { @@ -193,7 +238,6 @@ struct PIDHadronsInJets { return true; } - // Single-track selection for constituents template bool passedTrackSelection(const PionTrack& track) { @@ -209,10 +253,9 @@ struct PIDHadronsInJets { return true; } - // Process Data - void process(SelectedCollisions::iterator const& collision, HadronTracks const& tracks) + + void processForJets(SelectedCollisions::iterator const& collision, HadronTracks const& tracks) { - // Apply standard event selection if (!collision.sel8() || std::fabs(collision.posZ()) > zVtx) return; if (rejectITSROFBorder && !collision.selection_bit(o2::aod::evsel::kNoITSROFrameBorder)) return; if (rejectTFBorder && !collision.selection_bit(o2::aod::evsel::kNoTimeFrameBorder)) return; @@ -221,7 +264,79 @@ struct PIDHadronsInJets { if (requireIsGoodZvtxFT0VsPV && !collision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) return; if (requireIsVertexTOFmatched && !collision.selection_bit(o2::aod::evsel::kIsVertexTOFmatched)) return; - // Build FastJet particles + + + //pure histograms + registryData.fill(HIST("z_vtx"), collision.posZ()); + + for (auto const& track : tracks) { + if (!passedTrackSelection(track)) continue; + if (std::fabs(track.dcaXY()) > maxDcaxy || std::fabs(track.dcaZ()) > maxDcaz) continue; + + double pt = track.pt(); + double eta = track.eta(); + double dcaxy = track.dcaXY(); + double dcaz = track.dcaZ(); + + + bool passTpcPi = (std::abs(track.tpcNSigmaPi()) <= 3.0); + bool passTpcKa = (std::abs(track.tpcNSigmaKa()) <= 3.0); + bool passTpcPr = (std::abs(track.tpcNSigmaPr()) <= 3.0); + + bool passTofPi = track.hasTOF() && (std::abs(track.tofNSigmaPi()) <= 3.0); + bool passTofKa = track.hasTOF() && (std::abs(track.tofNSigmaKa()) <= 3.0); + bool passTofPr = track.hasTOF() && (std::abs(track.tofNSigmaPr()) <= 3.0); + + const double ptThreshold = 0.8; + + if (passTpcPi) { + registryData.fill(HIST("pion_pure_tpc"), pt, track.tpcNSigmaPi()); + + if (passTofPi) { + registryData.fill(HIST("pion_pure_tof"), pt, track.tofNSigmaPi()); + } + + if (pt < ptThreshold || passTofPi) { + registryData.fill(HIST("pion_pure_pt"), pt); + registryData.fill(HIST("pion_pure_eta"), eta); + registryData.fill(HIST("pion_pure_dcaxy"), dcaxy); + registryData.fill(HIST("pion_pure_dcaz"), dcaz); + } + } + + if (passTpcKa) { + registryData.fill(HIST("kaon_pure_tpc"), pt, track.tpcNSigmaKa()); + + if (passTofKa) { + registryData.fill(HIST("kaon_pure_tof"), pt, track.tofNSigmaKa()); + } + + if (pt < ptThreshold || passTofKa) { + registryData.fill(HIST("kaon_pure_pt"), pt); + registryData.fill(HIST("kaon_pure_eta"), eta); + registryData.fill(HIST("kaon_pure_dcaxy"), dcaxy); + registryData.fill(HIST("kaon_pure_dcaz"), dcaz); + } + } + + if (passTpcPr) { + registryData.fill(HIST("proton_pure_tpc"), pt, track.tpcNSigmaPr()); + + if (passTofPr) { + registryData.fill(HIST("proton_pure_tof"), pt, track.tofNSigmaPr()); + } + + if (pt < ptThreshold || passTofPr) { + registryData.fill(HIST("proton_pure_pt"), pt); + registryData.fill(HIST("proton_pure_eta"), eta); + registryData.fill(HIST("proton_pure_dcaxy"), dcaxy); + registryData.fill(HIST("proton_pure_dcaz"), dcaz); + } + } + + } + + // creating jets int id(-1); std::vector fjParticles; for (auto const& track : tracks) { @@ -235,7 +350,6 @@ struct PIDHadronsInJets { if (fjParticles.empty()) return; - fastjet::JetDefinition jetDef(fastjet::antikt_algorithm, rJet); fastjet::AreaDefinition areaDef(fastjet::active_area, fastjet::GhostedAreaSpec(1.0)); fastjet::ClusterSequenceArea cs(fjParticles, jetDef, areaDef); @@ -245,6 +359,11 @@ struct PIDHadronsInJets { auto [rhoPerp, rhoMPerp] = jetutilities::estimateRhoPerpCone(fjParticles, jets[0], rJet); + + std::set tracksInJetsSet; + + // loop over jets and fill histograms + for (const auto& jet : jets) { if (!isppRefAnalysis && ((std::fabs(jet.eta()) + rJet) > (maxEta - deltaEtaEdge))) continue; @@ -260,7 +379,6 @@ struct PIDHadronsInJets { if (applyAreaCut && (!isppRefAnalysis) && normalizedJetArea > maxNormalizedJetArea) continue; if (isppRefAnalysis && (jet.area() < cfgAreaFrac * PI * rJet * rJet)) continue; - double coneRadius = std::sqrt(jet.area() / PI); TVector3 jetAxis(jet.px(), jet.py(), jet.pz()); TVector3 ueAxis1(0, 0, 0), ueAxis2(0, 0, 0); @@ -269,37 +387,83 @@ struct PIDHadronsInJets { if (ueAxis1.Mag() == 0 || ueAxis2.Mag() == 0) continue; std::vector jetConstituents = jet.constituents(); + + + //loop over particles in jets for (const auto& particle : jetConstituents) { - auto const& track = tracks.iteratorAt(particle.user_index()); + int trackIdx = particle.user_index(); + auto const& track = tracks.iteratorAt(trackIdx); + tracksInJetsSet.insert(trackIdx); + if (!passedTrackSelection(track)) continue; if (std::fabs(track.dcaXY()) > maxDcaxy || std::fabs(track.dcaZ()) > maxDcaz) continue; double pt = track.pt(); + double eta = track.eta(); + double dcaxy = track.dcaXY(); + double dcaz = track.dcaZ(); + + bool passTpcPi = (std::abs(track.tpcNSigmaPi()) <= 3.0); + bool passTpcKa = (std::abs(track.tpcNSigmaKa()) <= 3.0); + bool passTpcPr = (std::abs(track.tpcNSigmaPr()) <= 3.0); + + bool passTofPi = track.hasTOF() && (std::abs(track.tofNSigmaPi()) <= 3.0); + bool passTofKa = track.hasTOF() && (std::abs(track.tofNSigmaKa()) <= 3.0); + bool passTofPr = track.hasTOF() && (std::abs(track.tofNSigmaPr()) <= 3.0); - if (std::abs(track.tpcNSigmaPi()) <= 3.0) { + const double ptThreshold = 0.8; + + if (passTpcPi) { registryData.fill(HIST("pion_jet_tpc"), pt, track.tpcNSigmaPi()); - } - if (track.hasTOF() && std::abs(track.tofNSigmaPi()) <= 3.0) { - registryData.fill(HIST("pion_jet_tof"), pt, track.tofNSigmaPi()); + + if (passTofPi) { + registryData.fill(HIST("pion_jet_tof"), pt, track.tofNSigmaPi()); + } + + if (pt < ptThreshold || passTofPi) { + registryData.fill(HIST("pion_jet_pt"), pt); + registryData.fill(HIST("pion_jet_eta"), eta); + registryData.fill(HIST("pion_jet_dcaxy"), dcaxy); + registryData.fill(HIST("pion_jet_dcaz"), dcaz); + } } - if (std::abs(track.tpcNSigmaKa()) <= 3.0) { + if (passTpcKa) { registryData.fill(HIST("kaon_jet_tpc"), pt, track.tpcNSigmaKa()); - } - if (track.hasTOF() && std::abs(track.tofNSigmaKa()) <= 3.0) { - registryData.fill(HIST("kaon_jet_tof"), pt, track.tofNSigmaKa()); + + if (passTofKa) { + registryData.fill(HIST("kaon_jet_tof"), pt, track.tofNSigmaKa()); + } + + if (pt < ptThreshold || passTofKa) { + registryData.fill(HIST("kaon_jet_pt"), pt); + registryData.fill(HIST("kaon_jet_eta"), eta); + registryData.fill(HIST("kaon_jet_dcaxy"), dcaxy); + registryData.fill(HIST("kaon_jet_dcaz"), dcaz); + } } - if (std::abs(track.tpcNSigmaPr()) <= 3.0) { + if (passTpcPr) { registryData.fill(HIST("proton_jet_tpc"), pt, track.tpcNSigmaPr()); + + if (passTofPr) { + registryData.fill(HIST("proton_jet_tof"), pt, track.tofNSigmaPr()); + } + + if (pt < ptThreshold || passTofPr) { + registryData.fill(HIST("proton_jet_pt"), pt); + registryData.fill(HIST("proton_jet_eta"), eta); + registryData.fill(HIST("proton_jet_dcaxy"), dcaxy); + registryData.fill(HIST("proton_jet_dcaz"), dcaz); + } } - if (track.hasTOF() && std::abs(track.tofNSigmaPr()) <= 3.0) { - registryData.fill(HIST("proton_jet_tof"), pt, track.tofNSigmaPr()); - } + } + + //loop for UE for (auto const& track : tracks) { if (!passedTrackSelection(track)) continue; @@ -318,33 +482,157 @@ struct PIDHadronsInJets { maxConeRadius = std::sqrt(maxNormalizedJetArea) * rJet; } + // Only process tracks inside the UE cone if (deltaRUe1 > maxConeRadius && deltaRUe2 > maxConeRadius) continue; double pt = track.pt(); - if (std::abs(track.tpcNSigmaPi()) <= 3.0) { + + bool passTpcPi = (std::abs(track.tpcNSigmaPi()) <= 3.0); + bool passTpcKa = (std::abs(track.tpcNSigmaKa()) <= 3.0); + bool passTpcPr = (std::abs(track.tpcNSigmaPr()) <= 3.0); + + bool passTofPi = track.hasTOF() && (std::abs(track.tofNSigmaPi()) <= 3.0); + bool passTofKa = track.hasTOF() && (std::abs(track.tofNSigmaKa()) <= 3.0); + bool passTofPr = track.hasTOF() && (std::abs(track.tofNSigmaPr()) <= 3.0); + + const double ptThreshold = 0.8; + + if (passTpcPi) { registryData.fill(HIST("pion_ue_tpc"), pt, track.tpcNSigmaPi()); - } - if (track.hasTOF() && std::abs(track.tofNSigmaPi()) <= 3.0) { - registryData.fill(HIST("pion_ue_tof"), pt, track.tofNSigmaPi()); + if (passTofPi) { + registryData.fill(HIST("pion_ue_tof"), pt, track.tofNSigmaPi()); + } + /* + if (pt < ptThreshold || passTofPi) { + registryData.fill(HIST("pion_ue_pt"), pt); + registryData.fill(HIST("pion_ue_eta"), eta); + registryData.fill(HIST("pion_ue_dcaxy"), dcaxy); + registryData.fill(HIST("pion_ue_dcaz"), dcaz); + } + */ } - if (std::abs(track.tpcNSigmaKa()) <= 3.0) { + if (passTpcKa) { registryData.fill(HIST("kaon_ue_tpc"), pt, track.tpcNSigmaKa()); + + if (passTofKa) { + registryData.fill(HIST("kaon_ue_tof"), pt, track.tofNSigmaKa()); + } + + /* + if (pt < ptThreshold || passTofKa) { + registryData.fill(HIST("kaon_ue_pt"), pt); + registryData.fill(HIST("kaon_ue_eta"), eta); + registryData.fill(HIST("kaon_ue_dcaxy"), dcaxy); + registryData.fill(HIST("kaon_ue_dcaz"), dcaz); + } + */ } - if (track.hasTOF() && std::abs(track.tofNSigmaKa()) <= 3.0) { - registryData.fill(HIST("kaon_ue_tof"), pt, track.tofNSigmaKa()); - } - if (std::abs(track.tpcNSigmaPr()) <= 3.0) { + + if (passTpcPr) { registryData.fill(HIST("proton_ue_tpc"), pt, track.tpcNSigmaPr()); + + if (passTofPr) { + registryData.fill(HIST("proton_ue_tof"), pt, track.tofNSigmaPr()); + } + + /* + if (pt < ptThreshold || passTofPr) { + registryData.fill(HIST("proton_ue_pt"), pt); + registryData.fill(HIST("proton_ue_eta"), eta); + registryData.fill(HIST("proton_ue_dcaxy"), dcaxy); + registryData.fill(HIST("proton_ue_dcaz"), dcaz); + } + */ } - if (track.hasTOF() && std::abs(track.tofNSigmaPr()) <= 3.0) { - registryData.fill(HIST("proton_ue_tof"), pt, track.tofNSigmaPr()); + + } + } // end jet loop + + registryData.fill(HIST("tracks_in_jets"), tracksInJetsSet.size()); + + int nTracksOut = 0; + int trackIteratorIdx = 0; + for (auto const& track : tracks) { + if (passedTrackSelection(track) && tracksInJetsSet.find(trackIteratorIdx) == tracksInJetsSet.end()) { + nTracksOut++; } + trackIteratorIdx++; + } + registryData.fill(HIST("tracks_outside_jets"), nTracksOut); + } + + PROCESS_SWITCH(PIDHadronsInJets, processForJets, "Process jets", true); + + + + void processMC(SelectedCollisions::iterator const& collision, aod::McParticles const& mcParticles, HadronTracksMC const& tracks) + { + if (!collision.sel8() || std::fabs(collision.posZ()) > zVtx) return; + if (rejectITSROFBorder && !collision.selection_bit(o2::aod::evsel::kNoITSROFrameBorder)) return; + if (rejectTFBorder && !collision.selection_bit(o2::aod::evsel::kNoTimeFrameBorder)) return; + if (requireVtxITSTPC && !collision.selection_bit(o2::aod::evsel::kIsVertexITSTPC)) return; + if (rejectSameBunchPileup && !collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) return; + if (requireIsGoodZvtxFT0VsPV && !collision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) return; + if (requireIsVertexTOFmatched && !collision.selection_bit(o2::aod::evsel::kIsVertexTOFmatched)) return; + + for (auto const& mcpart : mcParticles) { + if (!mcpart.isPhysicalPrimary()) continue; + if (std::abs(mcpart.eta()) > 0.8) continue; + + int pdg = std::abs(mcpart.pdgCode()); + double pt = mcpart.pt(); + + if (pdg == 211) { + registryData.fill(HIST("mc_gen_pion_pt"), pt); + } else if (pdg == 321) { + registryData.fill(HIST("mc_gen_kaon_pt"), pt); + } else if (pdg == 2212) { + registryData.fill(HIST("mc_gen_proton_pt"), pt); + } + } + + const double ptThreshold = 0.8; + + for (auto const& track : tracks) { + if (!passedTrackSelection(track)) continue; + if (std::fabs(track.dcaXY()) > maxDcaxy || std::fabs(track.dcaZ()) > maxDcaz) continue; + + double pt = track.pt(); + + bool passTpcPi = (std::abs(track.tpcNSigmaPi()) <= 3.0); + bool passTofPi = track.hasTOF() && (std::abs(track.tofNSigmaPi()) <= 3.0); + + bool passTpcKa = (std::abs(track.tpcNSigmaKa()) <= 3.0); + bool passTofKa = track.hasTOF() && (std::abs(track.tofNSigmaKa()) <= 3.0); + + bool passTpcPr = (std::abs(track.tpcNSigmaPr()) <= 3.0); + bool passTofPr = track.hasTOF() && (std::abs(track.tofNSigmaPr()) <= 3.0); + + if (!track.has_mcParticle()) continue; + auto const& trueParticle = track.mcParticle(); + if (!trueParticle.isPhysicalPrimary()) continue; + + int pdg = std::abs(trueParticle.pdgCode()); + + if (passTpcPi && (pt < ptThreshold || passTofPi)) { + if (pdg == 211) registryData.fill(HIST("mc_rec_pion_pt"), pt); + } + + if (passTpcKa && (pt < ptThreshold || passTofKa)) { + if (pdg == 321) registryData.fill(HIST("mc_rec_kaon_pt"), pt); + } + + if (passTpcPr && (pt < ptThreshold || passTofPr)) { + if (pdg == 2212) registryData.fill(HIST("mc_rec_proton_pt"), pt); } } } + PROCESS_SWITCH(PIDHadronsInJets, processMC, "Run on Monte Carlo", false); + + }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From e68116277c46c2865361949a083bde6e6bcbe973 Mon Sep 17 00:00:00 2001 From: Aleksandra Mulewicz Date: Sat, 25 Apr 2026 18:36:57 +0200 Subject: [PATCH 07/35] Update MC and jet histograms --- PWGJE/Tasks/jetHadronsPID.cxx | 78 +++++++++++++++++++++++++---------- 1 file changed, 56 insertions(+), 22 deletions(-) diff --git a/PWGJE/Tasks/jetHadronsPID.cxx b/PWGJE/Tasks/jetHadronsPID.cxx index fd94ed6bef3..0d788485d7e 100644 --- a/PWGJE/Tasks/jetHadronsPID.cxx +++ b/PWGJE/Tasks/jetHadronsPID.cxx @@ -98,6 +98,16 @@ struct PIDHadronsInJets { if (setMCDefaultItsParams) { itsResponse.setMCDefaultParameters(); } + registryData.add("n_events", "Event counter", HistType::kTH1F, {{1, 0.5, 1.5, "N_{events}"}}); + registryData.add("n_events_raw", "All events", HistType::kTH1F, {{1, 0.5, 1.5, ""}}); + + registryData.add("jet_pt_raw", "Jet pT raw", HistType::kTH1F, {{200, 0.0, 200.0, "#it{p}_{T}^{raw} (GeV/#it{c})"}}); + registryData.add("jet_pt_subtracted", "Jet pT subtracted", HistType::kTH1F, {{200, 0.0, 200.0, "#it{p}_{T}^{sub} (GeV/#it{c})"}}); + registryData.add("jet_pt_raw_vs_sub", "Raw vs sub jet pT", HistType::kTH2F, {{200, 0, 200}, {200, 0, 200}}); + registryData.add("jet_eta", "Jet eta", HistType::kTH1F, {{100, -1.0, 1.0, "#eta_{jet}"}}); + registryData.add("jet_phi", "Jet phi", HistType::kTH1F, {{100, 0.0, TwoPI, "#phi_{jet}"}}); + registryData.add("jet_area", "Jet area", HistType::kTH1F, {{100, 0.0, 1.5, "Area"}}); + registryData.add("jet_n_constituents", "Jet multiplicity", HistType::kTH1I, {{100, 0, 100, "N_{constituents}"}}); registryData.add("pion_pure_tpc", "TPC Pion PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); registryData.add("pion_pure_tof", "TOF Pion PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); @@ -120,7 +130,6 @@ struct PIDHadronsInJets { registryData.add("proton_pure_dcaz", "Proton DCAz", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)" }}); registryData.add("proton_pure_dcaxy", "Proton DCAxy", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)" }}); - registryData.add("z_vtx", "Z-Vertex Distribution", HistType::kTH1F, {{200, -20.0, 20.0, "Z-Vertex (cm)"}}); registryData.add("tracks_in_jets", "Number of Tracks Inside Jets", HistType::kTH1F, {{100, 0, 100, "N_{tracks}"}}); registryData.add("tracks_outside_jets", "Number of Tracks Outside Jets", HistType::kTH1F, {{500, 0, 500, "N_{tracks}"}}); @@ -163,7 +172,17 @@ struct PIDHadronsInJets { registryData.add("mc_gen_proton_pt", "Generated Proton pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})" }}); registryData.add("mc_rec_proton_pt", "Reconstructed Proton pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})" }}); - + + registryData.add("rec_pion_all", "All identified pions", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T}"}}); + registryData.add("rec_kaon_all", "All identified kaons", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T}"}}); + registryData.add("rec_proton_all", "All identified protons", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T}"}}); + registryData.add("contamination_matrix_pion", "Pion Contamination Matrix;True absolute PDG;Rec #it{p}_{T} (GeV/#it{c})", HistType::kTH2F, {{3000, -0.5, 2999.5}, {120, 0.0, 4.0}}); + registryData.add("contamination_matrix_kaon", "Kaon Contamination Matrix;True absolute PDG;Rec #it{p}_{T} (GeV/#it{c})", HistType::kTH2F, {{3000, -0.5, 2999.5}, {120, 0.0, 4.0}}); + registryData.add("contamination_matrix_proton", "Proton Contamination Matrix;True absolute PDG;Rec #it{p}_{T} (GeV/#it{c})", HistType::kTH2F, {{3000, -0.5, 2999.5}, {120, 0.0, 4.0}}); + + registryData.add("mc_sec_pion_pt", "Reconstructed Pion Secondaries", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})" }}); + registryData.add("mc_sec_kaon_pt", "Reconstructed Kaon Secondaries", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})" }}); + registryData.add("mc_sec_proton_pt", "Reconstructed Proton Secondaries", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})" }}); } void getPerpendicularDirections(const TVector3& p, TVector3& u1, TVector3& u2) @@ -256,6 +275,8 @@ struct PIDHadronsInJets { void processForJets(SelectedCollisions::iterator const& collision, HadronTracks const& tracks) { + registryData.fill(HIST("n_events_raw"), 1); + if (!collision.sel8() || std::fabs(collision.posZ()) > zVtx) return; if (rejectITSROFBorder && !collision.selection_bit(o2::aod::evsel::kNoITSROFrameBorder)) return; if (rejectTFBorder && !collision.selection_bit(o2::aod::evsel::kNoTimeFrameBorder)) return; @@ -264,9 +285,8 @@ struct PIDHadronsInJets { if (requireIsGoodZvtxFT0VsPV && !collision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) return; if (requireIsVertexTOFmatched && !collision.selection_bit(o2::aod::evsel::kIsVertexTOFmatched)) return; - - //pure histograms + registryData.fill(HIST("n_events"), 1); registryData.fill(HIST("z_vtx"), collision.posZ()); for (auto const& track : tracks) { @@ -278,7 +298,6 @@ struct PIDHadronsInJets { double dcaxy = track.dcaXY(); double dcaz = track.dcaZ(); - bool passTpcPi = (std::abs(track.tpcNSigmaPi()) <= 3.0); bool passTpcKa = (std::abs(track.tpcNSigmaKa()) <= 3.0); bool passTpcPr = (std::abs(track.tpcNSigmaPr()) <= 3.0); @@ -336,7 +355,6 @@ struct PIDHadronsInJets { } - // creating jets int id(-1); std::vector fjParticles; for (auto const& track : tracks) { @@ -362,15 +380,20 @@ struct PIDHadronsInJets { std::set tracksInJetsSet; - // loop over jets and fill histograms - for (const auto& jet : jets) { + registryData.fill(HIST("jet_pt_raw"), jet.pt()); + registryData.fill(HIST("jet_eta"), jet.eta()); + registryData.fill(HIST("jet_phi"), jet.phi()); + registryData.fill(HIST("jet_area"), jet.area()); + registryData.fill(HIST("jet_n_constituents"), jet.constituents().size()); if (!isppRefAnalysis && ((std::fabs(jet.eta()) + rJet) > (maxEta - deltaEtaEdge))) continue; if (isppRefAnalysis && std::fabs(jet.eta()) > cfgEtaJetMax) continue; auto jetForSub = jet; fastjet::PseudoJet jetMinusBkg = backgroundSub.doRhoAreaSub(jetForSub, rhoPerp, rhoMPerp); + registryData.fill(HIST("jet_pt_subtracted"), jetMinusBkg.pt()); + registryData.fill(HIST("jet_pt_raw_vs_sub"), jet.pt(), jetMinusBkg.pt()); if (isppRefAnalysis && (jet.pt() < minJetPt || jet.pt() > maxJetPt)) continue; if (!isppRefAnalysis && (jetMinusBkg.pt() < minJetPt || jetMinusBkg.pt() > maxJetPt)) continue; @@ -388,8 +411,6 @@ struct PIDHadronsInJets { std::vector jetConstituents = jet.constituents(); - - //loop over particles in jets for (const auto& particle : jetConstituents) { int trackIdx = particle.user_index(); @@ -462,8 +483,6 @@ struct PIDHadronsInJets { } - - //loop for UE for (auto const& track : tracks) { if (!passedTrackSelection(track)) continue; @@ -482,12 +501,10 @@ struct PIDHadronsInJets { maxConeRadius = std::sqrt(maxNormalizedJetArea) * rJet; } - // Only process tracks inside the UE cone if (deltaRUe1 > maxConeRadius && deltaRUe2 > maxConeRadius) continue; double pt = track.pt(); - bool passTpcPi = (std::abs(track.tpcNSigmaPi()) <= 3.0); bool passTpcKa = (std::abs(track.tpcNSigmaKa()) <= 3.0); bool passTpcPr = (std::abs(track.tpcNSigmaPr()) <= 3.0); @@ -549,7 +566,7 @@ struct PIDHadronsInJets { } } - } // end jet loop + } registryData.fill(HIST("tracks_in_jets"), tracksInJetsSet.size()); @@ -566,8 +583,6 @@ struct PIDHadronsInJets { PROCESS_SWITCH(PIDHadronsInJets, processForJets, "Process jets", true); - - void processMC(SelectedCollisions::iterator const& collision, aod::McParticles const& mcParticles, HadronTracksMC const& tracks) { if (!collision.sel8() || std::fabs(collision.posZ()) > zVtx) return; @@ -613,20 +628,39 @@ struct PIDHadronsInJets { if (!track.has_mcParticle()) continue; auto const& trueParticle = track.mcParticle(); - if (!trueParticle.isPhysicalPrimary()) continue; - + int pdg = std::abs(trueParticle.pdgCode()); + bool isPrimary = trueParticle.isPhysicalPrimary(); if (passTpcPi && (pt < ptThreshold || passTofPi)) { - if (pdg == 211) registryData.fill(HIST("mc_rec_pion_pt"), pt); + registryData.fill(HIST("rec_pion_all"), pt); //reconstructed after cuts + registryData.fill(HIST("contamination_matrix_pion"), pdg, pt); + + if (isPrimary) { + if (pdg == 211) registryData.fill(HIST("mc_rec_pion_pt"), pt); // Efficiency + } else { + registryData.fill(HIST("mc_sec_pion_pt"), pt); + } } if (passTpcKa && (pt < ptThreshold || passTofKa)) { - if (pdg == 321) registryData.fill(HIST("mc_rec_kaon_pt"), pt); + registryData.fill(HIST("rec_kaon_all"), pt); + registryData.fill(HIST("contamination_matrix_kaon"), pdg, pt); + if (isPrimary) { + if (pdg == 321) registryData.fill(HIST("mc_rec_kaon_pt"), pt); + } else { + registryData.fill(HIST("mc_sec_kaon_pt"), pt); + } } if (passTpcPr && (pt < ptThreshold || passTofPr)) { - if (pdg == 2212) registryData.fill(HIST("mc_rec_proton_pt"), pt); + registryData.fill(HIST("rec_proton_all"), pt); + registryData.fill(HIST("contamination_matrix_proton"), pdg, pt); + if (isPrimary) { + if (pdg == 2212) registryData.fill(HIST("mc_rec_proton_pt"), pt); + } else { + registryData.fill(HIST("mc_sec_proton_pt"), pt); + } } } } From d989f30c7b2c67f84bcdedbb57c09b100de33e6d Mon Sep 17 00:00:00 2001 From: Leonard <107263905+MyFavoriteGitHub@users.noreply.github.com> Date: Mon, 27 Apr 2026 17:39:26 +0200 Subject: [PATCH 08/35] Rename DPL workflow from 'pid-hadrons-in-jets' to 'jet-hadrons-pid' --- PWGJE/Tasks/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGJE/Tasks/CMakeLists.txt b/PWGJE/Tasks/CMakeLists.txt index 5cb4350b38a..c822f837f8a 100644 --- a/PWGJE/Tasks/CMakeLists.txt +++ b/PWGJE/Tasks/CMakeLists.txt @@ -403,7 +403,7 @@ if(FastJet_FOUND) SOURCES bjetCentMult.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore COMPONENT_NAME Analysis) - o2physics_add_dpl_workflow(pid-hadrons-in-jets + o2physics_add_dpl_workflow(jet-hadrons-pid SOURCES jetHadronsPID.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2Physics::PWGJECore FastJet::FastJet FastJet::Contrib O2Physics::EventFilteringUtils COMPONENT_NAME Analysis) From 25b7de036a477ee465d48f500391f2043ea3fac0 Mon Sep 17 00:00:00 2001 From: Leonard Date: Tue, 28 Apr 2026 20:20:56 +0200 Subject: [PATCH 09/35] Fixing formating and adding description --- PWGJE/Tasks/jetHadronsPID.cxx | 407 +++++++++++++++++----------------- 1 file changed, 209 insertions(+), 198 deletions(-) diff --git a/PWGJE/Tasks/jetHadronsPID.cxx b/PWGJE/Tasks/jetHadronsPID.cxx index 0d788485d7e..d0e26ea03ed 100644 --- a/PWGJE/Tasks/jetHadronsPID.cxx +++ b/PWGJE/Tasks/jetHadronsPID.cxx @@ -1,6 +1,21 @@ -// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file jetHadronsPID.cxx +/// \brief Analysis of hadrons in jets +/// \author Aleksandra Mulewicz, WUT Warsaw, aleksandra.mulewicz@cern.ch +/// \author Leonard Lorenc, WUT Warsaw, leonard.lorenc@cern.ch +/// \author Hubert Zalewski, WUT Warsaw, hubert.zalewski@cern.ch +/// \author Małgorzata Janik malgorzata.janik@cern.ch +/// \author Daniela Ruggiano daniela.ruggiano@cern.ch #include "Framework/runDataProcessing.h" #include "PWGJE/Core/JetBkgSubUtils.h" @@ -29,7 +44,7 @@ #include #include -#include +#include using namespace o2; using namespace o2::framework; @@ -39,16 +54,15 @@ using namespace o2::constants::math; using SelectedCollisions = soa::Join; -using HadronTracks = soa::Join; - -using HadronTracksMC = soa::Join; struct PIDHadronsInJets { @@ -82,12 +96,12 @@ struct PIDHadronsInJets { Configurable maxChiSquareTpc{"maxChiSquareTpc", 4.0, "maximum TPC chi^2/Ncls"}; Configurable maxChiSquareIts{"maxChiSquareIts", 36.0, "maximum ITS chi^2/Ncls"}; Configurable minPt{"minPt", 0.3, "minimum pt of the tracks"}; - Configurable maxPt{"maxPt", 4.0, "maximum pt of the tracks for PID analysis"}; // more ? + Configurable maxPt{"maxPt", 4.0, "maximum pt of the tracks for PID analysis"}; Configurable minEta{"minEta", -0.8, "minimum eta"}; Configurable maxEta{"maxEta", +0.8, "maximum eta"}; - Configurable maxDcaxy{"maxDcaxy", 0.05, "Maximum DCAxy"}; // more ? - Configurable maxDcaz{"maxDcaz", 0.05, "Maximum DCAz"};// - + Configurable maxDcaxy{"maxDcaxy", 0.2, "Maximum DCAxy"}; + Configurable maxDcaz{"maxDcaz", 0.1, "Maximum DCAz"}; + Configurable setMCDefaultItsParams{"setMCDefaultItsParams", true, "set MC default parameters"}; JetBkgSubUtils backgroundSub; @@ -98,6 +112,7 @@ struct PIDHadronsInJets { if (setMCDefaultItsParams) { itsResponse.setMCDefaultParameters(); } + registryData.add("n_events", "Event counter", HistType::kTH1F, {{1, 0.5, 1.5, "N_{events}"}}); registryData.add("n_events_raw", "All events", HistType::kTH1F, {{1, 0.5, 1.5, ""}}); @@ -141,38 +156,49 @@ struct PIDHadronsInJets { registryData.add("proton_jet_tpc", "TPC Proton PID in Jets", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); registryData.add("proton_jet_tof", "TOF Proton PID in Jets", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); + registryData.add("pion_jet_pt", "Pion pT in Jets", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})" }}); + registryData.add("pion_jet_eta", "Pion Eta in Jets", HistType::kTH1F, {{100, -1.0, 1.0, "#eta" }}); + registryData.add("pion_jet_dcaxy", "Pion DCAxy in Jets", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)" }}); + registryData.add("pion_jet_dcaz", "Pion DCAz in Jets", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)" }}); + + registryData.add("kaon_jet_pt", "Kaon pT in Jets", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})" }}); + registryData.add("kaon_jet_eta", "Kaon Eta in Jets", HistType::kTH1F, {{100, -1.0, 1.0, "#eta" }}); + registryData.add("kaon_jet_dcaxy", "Kaon DCAxy in Jets", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)" }}); + registryData.add("kaon_jet_dcaz", "Kaon DCAz in Jets", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)" }}); + + registryData.add("proton_jet_pt", "Proton pT in Jets", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})" }}); + registryData.add("proton_jet_eta", "Proton Eta in Jets", HistType::kTH1F, {{100, -1.0, 1.0, "#eta" }}); + registryData.add("proton_jet_dcaxy", "Proton DCAxy in Jets", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)" }}); + registryData.add("proton_jet_dcaz", "Proton DCAz in Jets", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)" }}); + registryData.add("pion_ue_tpc", "TPC Pion PID in UE", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); registryData.add("pion_ue_tof", "TOF Pion PID in UE", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); + registryData.add("pion_ue_pt", "Pion pT in UE", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})" }}); + registryData.add("pion_ue_eta", "Pion Eta in UE", HistType::kTH1F, {{100, -1.0, 1.0, "#eta" }}); + registryData.add("pion_ue_dcaxy", "Pion DCAxy in UE", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)" }}); + registryData.add("pion_ue_dcaz", "Pion DCAz in UE", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)" }}); + registryData.add("kaon_ue_tpc", "TPC Kaon PID in UE", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); registryData.add("kaon_ue_tof", "TOF Kaon PID in UE", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); + registryData.add("kaon_ue_pt", "Kaon pT in UE", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})" }}); + registryData.add("kaon_ue_eta", "Kaon Eta in UE", HistType::kTH1F, {{100, -1.0, 1.0, "#eta" }}); + registryData.add("kaon_ue_dcaxy", "Kaon DCAxy in UE", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)" }}); + registryData.add("kaon_ue_dcaz", "Kaon DCAz in UE", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)" }}); + registryData.add("proton_ue_tpc", "TPC Proton PID in UE", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); registryData.add("proton_ue_tof", "TOF Proton PID in UE", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); - - registryData.add("pion_jet_pt", "Pion pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})" }}); - registryData.add("pion_jet_eta", "Pion Eta", HistType::kTH1F, {{100, -1.0, 1.0, "#eta" }}); - registryData.add("pion_jet_dcaxy", "Pion DCAxy", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)" }}); - registryData.add("pion_jet_dcaz", "Pion DCAz", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)" }}); - - registryData.add("kaon_jet_pt", "Kaon pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})" }}); - registryData.add("kaon_jet_eta", "Kaon Eta", HistType::kTH1F, {{100, -1.0, 1.0, "#eta" }}); - registryData.add("kaon_jet_dcaxy", "Kaon DCAxy", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)" }}); - registryData.add("kaon_jet_dcaz", "Kaon DCAz", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)" }}); - - registryData.add("proton_jet_pt", "Proton pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})" }}); - registryData.add("proton_jet_eta", "Proton Eta", HistType::kTH1F, {{100, -1.0, 1.0, "#eta" }}); - registryData.add("proton_jet_dcaxy", "Proton DCAxy", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)" }}); - registryData.add("proton_jet_dcaz", "Proton DCAz", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)" }}); - + registryData.add("proton_ue_pt", "Proton pT in UE", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})" }}); + registryData.add("proton_ue_eta", "Proton Eta in UE", HistType::kTH1F, {{100, -1.0, 1.0, "#eta" }}); + registryData.add("proton_ue_dcaxy", "Proton DCAxy in UE", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)" }}); + registryData.add("proton_ue_dcaz", "Proton DCAz in UE", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)" }}); registryData.add("mc_gen_pion_pt", "Generated Pion pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})" }}); registryData.add("mc_rec_pion_pt", "Reconstructed Pion pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})" }}); - registryData.add("mc_gen_kaon_pt", "Generated Kaon pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})" }}); registryData.add("mc_rec_kaon_pt", "Reconstructed Kaon pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})" }}); - registryData.add("mc_gen_proton_pt", "Generated Proton pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})" }}); registryData.add("mc_rec_proton_pt", "Reconstructed Proton pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})" }}); - + registryData.add("rec_pion_all", "All identified pions", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T}"}}); registryData.add("rec_kaon_all", "All identified kaons", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T}"}}); registryData.add("rec_proton_all", "All identified protons", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T}"}}); @@ -220,7 +246,7 @@ struct PIDHadronsInJets { double deltaPhi(0); double phi1 = TVector2::Phi_0_2pi(a1); double phi2 = TVector2::Phi_0_2pi(a2); - double diff = std::fabs(phi1 - phi2); + double diff = std::abs(phi1 - phi2); if (diff <= PI) deltaPhi = diff; if (diff > PI) deltaPhi = TwoPI - diff; @@ -250,10 +276,10 @@ struct PIDHadronsInJets { if (track.tpcNClsCrossedRows() < MinTpcCr) return false; if (track.tpcChi2NCl() > MaxChi2Tpc) return false; if (track.itsChi2NCl() > MaxChi2Its) return false; - if (std::fabs(track.eta()) > maxEta) return false; + if (std::abs(track.eta()) > maxEta) return false; if (track.pt() < cfgMinPtTrack) return false; - if (std::fabs(track.dcaXY()) > (DcaxyMaxTrackPar0 + DcaxyMaxTrackPar1 / std::pow(track.pt(), DcaxyMaxTrackPar2))) return false; - if (std::fabs(track.dcaZ()) > DcazMaxTrack) return false; + if (std::abs(track.dcaXY()) > (DcaxyMaxTrackPar0 + DcaxyMaxTrackPar1 / std::pow(track.pt(), DcaxyMaxTrackPar2))) return false; + if (std::abs(track.dcaZ()) > DcazMaxTrack) return false; return true; } @@ -276,8 +302,8 @@ struct PIDHadronsInJets { void processForJets(SelectedCollisions::iterator const& collision, HadronTracks const& tracks) { registryData.fill(HIST("n_events_raw"), 1); - - if (!collision.sel8() || std::fabs(collision.posZ()) > zVtx) return; + + if (!collision.sel8() || std::abs(collision.posZ()) > zVtx) return; if (rejectITSROFBorder && !collision.selection_bit(o2::aod::evsel::kNoITSROFrameBorder)) return; if (rejectTFBorder && !collision.selection_bit(o2::aod::evsel::kNoTimeFrameBorder)) return; if (requireVtxITSTPC && !collision.selection_bit(o2::aod::evsel::kIsVertexITSTPC)) return; @@ -285,74 +311,72 @@ struct PIDHadronsInJets { if (requireIsGoodZvtxFT0VsPV && !collision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) return; if (requireIsVertexTOFmatched && !collision.selection_bit(o2::aod::evsel::kIsVertexTOFmatched)) return; - //pure histograms registryData.fill(HIST("n_events"), 1); registryData.fill(HIST("z_vtx"), collision.posZ()); for (auto const& track : tracks) { - if (!passedTrackSelection(track)) continue; - if (std::fabs(track.dcaXY()) > maxDcaxy || std::fabs(track.dcaZ()) > maxDcaz) continue; + if (!passedTrackSelection(track)) continue; + if (std::abs(track.dcaXY()) > maxDcaxy || std::abs(track.dcaZ()) > maxDcaz) continue; - double pt = track.pt(); - double eta = track.eta(); - double dcaxy = track.dcaXY(); - double dcaz = track.dcaZ(); + double pt = track.pt(); + double eta = track.eta(); + double dcaxy = track.dcaXY(); + double dcaz = track.dcaZ(); - bool passTpcPi = (std::abs(track.tpcNSigmaPi()) <= 3.0); - bool passTpcKa = (std::abs(track.tpcNSigmaKa()) <= 3.0); - bool passTpcPr = (std::abs(track.tpcNSigmaPr()) <= 3.0); + bool passTpcPi = (std::abs(track.tpcNSigmaPi()) <= 3.0); + bool passTpcKa = (std::abs(track.tpcNSigmaKa()) <= 3.0); + bool passTpcPr = (std::abs(track.tpcNSigmaPr()) <= 3.0); - bool passTofPi = track.hasTOF() && (std::abs(track.tofNSigmaPi()) <= 3.0); - bool passTofKa = track.hasTOF() && (std::abs(track.tofNSigmaKa()) <= 3.0); - bool passTofPr = track.hasTOF() && (std::abs(track.tofNSigmaPr()) <= 3.0); + bool passTofPi = track.hasTOF() && (std::abs(track.tofNSigmaPi()) <= 3.0); + bool passTofKa = track.hasTOF() && (std::abs(track.tofNSigmaKa()) <= 3.0); + bool passTofPr = track.hasTOF() && (std::abs(track.tofNSigmaPr()) <= 3.0); - const double ptThreshold = 0.8; + const double ptThreshold = 0.8; - if (passTpcPi) { - registryData.fill(HIST("pion_pure_tpc"), pt, track.tpcNSigmaPi()); - - if (passTofPi) { - registryData.fill(HIST("pion_pure_tof"), pt, track.tofNSigmaPi()); - } - - if (pt < ptThreshold || passTofPi) { - registryData.fill(HIST("pion_pure_pt"), pt); - registryData.fill(HIST("pion_pure_eta"), eta); - registryData.fill(HIST("pion_pure_dcaxy"), dcaxy); - registryData.fill(HIST("pion_pure_dcaz"), dcaz); - } + if (passTpcPi) { + registryData.fill(HIST("pion_pure_tpc"), pt, track.tpcNSigmaPi()); + + if (passTofPi) { + registryData.fill(HIST("pion_pure_tof"), pt, track.tofNSigmaPi()); } - if (passTpcKa) { - registryData.fill(HIST("kaon_pure_tpc"), pt, track.tpcNSigmaKa()); - - if (passTofKa) { - registryData.fill(HIST("kaon_pure_tof"), pt, track.tofNSigmaKa()); - } - - if (pt < ptThreshold || passTofKa) { - registryData.fill(HIST("kaon_pure_pt"), pt); - registryData.fill(HIST("kaon_pure_eta"), eta); - registryData.fill(HIST("kaon_pure_dcaxy"), dcaxy); - registryData.fill(HIST("kaon_pure_dcaz"), dcaz); - } + if (pt < ptThreshold || passTofPi) { + registryData.fill(HIST("pion_pure_pt"), pt); + registryData.fill(HIST("pion_pure_eta"), eta); + registryData.fill(HIST("pion_pure_dcaxy"), dcaxy); + registryData.fill(HIST("pion_pure_dcaz"), dcaz); } + } - if (passTpcPr) { - registryData.fill(HIST("proton_pure_tpc"), pt, track.tpcNSigmaPr()); - - if (passTofPr) { - registryData.fill(HIST("proton_pure_tof"), pt, track.tofNSigmaPr()); - } - - if (pt < ptThreshold || passTofPr) { - registryData.fill(HIST("proton_pure_pt"), pt); - registryData.fill(HIST("proton_pure_eta"), eta); - registryData.fill(HIST("proton_pure_dcaxy"), dcaxy); - registryData.fill(HIST("proton_pure_dcaz"), dcaz); - } + if (passTpcKa) { + registryData.fill(HIST("kaon_pure_tpc"), pt, track.tpcNSigmaKa()); + + if (passTofKa) { + registryData.fill(HIST("kaon_pure_tof"), pt, track.tofNSigmaKa()); } + if (pt < ptThreshold || passTofKa) { + registryData.fill(HIST("kaon_pure_pt"), pt); + registryData.fill(HIST("kaon_pure_eta"), eta); + registryData.fill(HIST("kaon_pure_dcaxy"), dcaxy); + registryData.fill(HIST("kaon_pure_dcaz"), dcaz); + } + } + + if (passTpcPr) { + registryData.fill(HIST("proton_pure_tpc"), pt, track.tpcNSigmaPr()); + + if (passTofPr) { + registryData.fill(HIST("proton_pure_tof"), pt, track.tofNSigmaPr()); + } + + if (pt < ptThreshold || passTofPr) { + registryData.fill(HIST("proton_pure_pt"), pt); + registryData.fill(HIST("proton_pure_eta"), eta); + registryData.fill(HIST("proton_pure_dcaxy"), dcaxy); + registryData.fill(HIST("proton_pure_dcaz"), dcaz); + } + } } int id(-1); @@ -372,12 +396,11 @@ struct PIDHadronsInJets { fastjet::AreaDefinition areaDef(fastjet::active_area, fastjet::GhostedAreaSpec(1.0)); fastjet::ClusterSequenceArea cs(fjParticles, jetDef, areaDef); std::vector jets = fastjet::sorted_by_pt(cs.inclusive_jets()); - + if (jets.empty()) return; auto [rhoPerp, rhoMPerp] = jetutilities::estimateRhoPerpCone(fjParticles, jets[0], rJet); - std::set tracksInJetsSet; for (const auto& jet : jets) { @@ -387,14 +410,14 @@ struct PIDHadronsInJets { registryData.fill(HIST("jet_area"), jet.area()); registryData.fill(HIST("jet_n_constituents"), jet.constituents().size()); - if (!isppRefAnalysis && ((std::fabs(jet.eta()) + rJet) > (maxEta - deltaEtaEdge))) continue; - if (isppRefAnalysis && std::fabs(jet.eta()) > cfgEtaJetMax) continue; + if (!isppRefAnalysis && ((std::abs(jet.eta()) + rJet) > (maxEta - deltaEtaEdge))) continue; + if (isppRefAnalysis && std::abs(jet.eta()) > cfgEtaJetMax) continue; auto jetForSub = jet; fastjet::PseudoJet jetMinusBkg = backgroundSub.doRhoAreaSub(jetForSub, rhoPerp, rhoMPerp); registryData.fill(HIST("jet_pt_subtracted"), jetMinusBkg.pt()); registryData.fill(HIST("jet_pt_raw_vs_sub"), jet.pt(), jetMinusBkg.pt()); - + if (isppRefAnalysis && (jet.pt() < minJetPt || jet.pt() > maxJetPt)) continue; if (!isppRefAnalysis && (jetMinusBkg.pt() < minJetPt || jetMinusBkg.pt() > maxJetPt)) continue; @@ -406,7 +429,7 @@ struct PIDHadronsInJets { TVector3 jetAxis(jet.px(), jet.py(), jet.pz()); TVector3 ueAxis1(0, 0, 0), ueAxis2(0, 0, 0); getPerpendicularDirections(jetAxis, ueAxis1, ueAxis2); - + if (ueAxis1.Mag() == 0 || ueAxis2.Mag() == 0) continue; std::vector jetConstituents = jet.constituents(); @@ -415,11 +438,11 @@ struct PIDHadronsInJets { int trackIdx = particle.user_index(); auto const& track = tracks.iteratorAt(trackIdx); - + tracksInJetsSet.insert(trackIdx); if (!passedTrackSelection(track)) continue; - if (std::fabs(track.dcaXY()) > maxDcaxy || std::fabs(track.dcaZ()) > maxDcaz) continue; + if (std::abs(track.dcaXY()) > maxDcaxy || std::abs(track.dcaZ()) > maxDcaz) continue; double pt = track.pt(); double eta = track.eta(); @@ -434,64 +457,63 @@ struct PIDHadronsInJets { bool passTofKa = track.hasTOF() && (std::abs(track.tofNSigmaKa()) <= 3.0); bool passTofPr = track.hasTOF() && (std::abs(track.tofNSigmaPr()) <= 3.0); - const double ptThreshold = 0.8; + const double ptThreshold = 0.8; if (passTpcPi) { - registryData.fill(HIST("pion_jet_tpc"), pt, track.tpcNSigmaPi()); - - if (passTofPi) { - registryData.fill(HIST("pion_jet_tof"), pt, track.tofNSigmaPi()); - } - - if (pt < ptThreshold || passTofPi) { - registryData.fill(HIST("pion_jet_pt"), pt); - registryData.fill(HIST("pion_jet_eta"), eta); - registryData.fill(HIST("pion_jet_dcaxy"), dcaxy); - registryData.fill(HIST("pion_jet_dcaz"), dcaz); - } + registryData.fill(HIST("pion_jet_tpc"), pt, track.tpcNSigmaPi()); + + if (passTofPi) { + registryData.fill(HIST("pion_jet_tof"), pt, track.tofNSigmaPi()); + } + + if (pt < ptThreshold || passTofPi) { + registryData.fill(HIST("pion_jet_pt"), pt); + registryData.fill(HIST("pion_jet_eta"), eta); + registryData.fill(HIST("pion_jet_dcaxy"), dcaxy); + registryData.fill(HIST("pion_jet_dcaz"), dcaz); + } } if (passTpcKa) { - registryData.fill(HIST("kaon_jet_tpc"), pt, track.tpcNSigmaKa()); - - if (passTofKa) { - registryData.fill(HIST("kaon_jet_tof"), pt, track.tofNSigmaKa()); - } - - if (pt < ptThreshold || passTofKa) { - registryData.fill(HIST("kaon_jet_pt"), pt); - registryData.fill(HIST("kaon_jet_eta"), eta); - registryData.fill(HIST("kaon_jet_dcaxy"), dcaxy); - registryData.fill(HIST("kaon_jet_dcaz"), dcaz); - } + registryData.fill(HIST("kaon_jet_tpc"), pt, track.tpcNSigmaKa()); + + if (passTofKa) { + registryData.fill(HIST("kaon_jet_tof"), pt, track.tofNSigmaKa()); + } + + if (pt < ptThreshold || passTofKa) { + registryData.fill(HIST("kaon_jet_pt"), pt); + registryData.fill(HIST("kaon_jet_eta"), eta); + registryData.fill(HIST("kaon_jet_dcaxy"), dcaxy); + registryData.fill(HIST("kaon_jet_dcaz"), dcaz); + } } if (passTpcPr) { - registryData.fill(HIST("proton_jet_tpc"), pt, track.tpcNSigmaPr()); - - if (passTofPr) { - registryData.fill(HIST("proton_jet_tof"), pt, track.tofNSigmaPr()); - } - - if (pt < ptThreshold || passTofPr) { - registryData.fill(HIST("proton_jet_pt"), pt); - registryData.fill(HIST("proton_jet_eta"), eta); - registryData.fill(HIST("proton_jet_dcaxy"), dcaxy); - registryData.fill(HIST("proton_jet_dcaz"), dcaz); - } + registryData.fill(HIST("proton_jet_tpc"), pt, track.tpcNSigmaPr()); + + if (passTofPr) { + registryData.fill(HIST("proton_jet_tof"), pt, track.tofNSigmaPr()); + } + + if (pt < ptThreshold || passTofPr) { + registryData.fill(HIST("proton_jet_pt"), pt); + registryData.fill(HIST("proton_jet_eta"), eta); + registryData.fill(HIST("proton_jet_dcaxy"), dcaxy); + registryData.fill(HIST("proton_jet_dcaz"), dcaz); + } } - } for (auto const& track : tracks) { if (!passedTrackSelection(track)) continue; - if (std::fabs(track.dcaXY()) > maxDcaxy || std::fabs(track.dcaZ()) > maxDcaz) continue; + if (std::abs(track.dcaXY()) > maxDcaxy || std::abs(track.dcaZ()) > maxDcaz) continue; double deltaEtaUe1 = track.eta() - ueAxis1.Eta(); double deltaPhiUe1 = getDeltaPhi(track.phi(), ueAxis1.Phi()); double deltaRUe1 = std::sqrt(deltaEtaUe1 * deltaEtaUe1 + deltaPhiUe1 * deltaPhiUe1); - + double deltaEtaUe2 = track.eta() - ueAxis2.Eta(); double deltaPhiUe2 = getDeltaPhi(track.phi(), ueAxis2.Phi()); double deltaRUe2 = std::sqrt(deltaEtaUe2 * deltaEtaUe2 + deltaPhiUe2 * deltaPhiUe2); @@ -504,6 +526,9 @@ struct PIDHadronsInJets { if (deltaRUe1 > maxConeRadius && deltaRUe2 > maxConeRadius) continue; double pt = track.pt(); + double eta = track.eta(); + double dcaxy = track.dcaXY(); + double dcaz = track.dcaZ(); bool passTpcPi = (std::abs(track.tpcNSigmaPi()) <= 3.0); bool passTpcKa = (std::abs(track.tpcNSigmaKa()) <= 3.0); @@ -513,58 +538,46 @@ struct PIDHadronsInJets { bool passTofKa = track.hasTOF() && (std::abs(track.tofNSigmaKa()) <= 3.0); bool passTofPr = track.hasTOF() && (std::abs(track.tofNSigmaPr()) <= 3.0); - const double ptThreshold = 0.8; + const double ptThreshold = 0.8; if (passTpcPi) { - registryData.fill(HIST("pion_ue_tpc"), pt, track.tpcNSigmaPi()); - if (passTofPi) { - registryData.fill(HIST("pion_ue_tof"), pt, track.tofNSigmaPi()); - } - /* - if (pt < ptThreshold || passTofPi) { - registryData.fill(HIST("pion_ue_pt"), pt); - registryData.fill(HIST("pion_ue_eta"), eta); - registryData.fill(HIST("pion_ue_dcaxy"), dcaxy); - registryData.fill(HIST("pion_ue_dcaz"), dcaz); - } - */ + registryData.fill(HIST("pion_ue_tpc"), pt, track.tpcNSigmaPi()); + if (passTofPi) { + registryData.fill(HIST("pion_ue_tof"), pt, track.tofNSigmaPi()); + } + if (pt < ptThreshold || passTofPi) { + registryData.fill(HIST("pion_ue_pt"), pt); + registryData.fill(HIST("pion_ue_eta"), eta); + registryData.fill(HIST("pion_ue_dcaxy"), dcaxy); + registryData.fill(HIST("pion_ue_dcaz"), dcaz); + } } if (passTpcKa) { - registryData.fill(HIST("kaon_ue_tpc"), pt, track.tpcNSigmaKa()); - - if (passTofKa) { - registryData.fill(HIST("kaon_ue_tof"), pt, track.tofNSigmaKa()); - } - - /* - if (pt < ptThreshold || passTofKa) { - registryData.fill(HIST("kaon_ue_pt"), pt); - registryData.fill(HIST("kaon_ue_eta"), eta); - registryData.fill(HIST("kaon_ue_dcaxy"), dcaxy); - registryData.fill(HIST("kaon_ue_dcaz"), dcaz); - } - */ + registryData.fill(HIST("kaon_ue_tpc"), pt, track.tpcNSigmaKa()); + if (passTofKa) { + registryData.fill(HIST("kaon_ue_tof"), pt, track.tofNSigmaKa()); + } + if (pt < ptThreshold || passTofKa) { + registryData.fill(HIST("kaon_ue_pt"), pt); + registryData.fill(HIST("kaon_ue_eta"), eta); + registryData.fill(HIST("kaon_ue_dcaxy"), dcaxy); + registryData.fill(HIST("kaon_ue_dcaz"), dcaz); + } } - if (passTpcPr) { - registryData.fill(HIST("proton_ue_tpc"), pt, track.tpcNSigmaPr()); - - if (passTofPr) { - registryData.fill(HIST("proton_ue_tof"), pt, track.tofNSigmaPr()); - } - - /* - if (pt < ptThreshold || passTofPr) { - registryData.fill(HIST("proton_ue_pt"), pt); - registryData.fill(HIST("proton_ue_eta"), eta); - registryData.fill(HIST("proton_ue_dcaxy"), dcaxy); - registryData.fill(HIST("proton_ue_dcaz"), dcaz); - } - */ + registryData.fill(HIST("proton_ue_tpc"), pt, track.tpcNSigmaPr()); + if (passTofPr) { + registryData.fill(HIST("proton_ue_tof"), pt, track.tofNSigmaPr()); + } + if (pt < ptThreshold || passTofPr) { + registryData.fill(HIST("proton_ue_pt"), pt); + registryData.fill(HIST("proton_ue_eta"), eta); + registryData.fill(HIST("proton_ue_dcaxy"), dcaxy); + registryData.fill(HIST("proton_ue_dcaz"), dcaz); + } } - } } @@ -573,19 +586,19 @@ struct PIDHadronsInJets { int nTracksOut = 0; int trackIteratorIdx = 0; for (auto const& track : tracks) { - if (passedTrackSelection(track) && tracksInJetsSet.find(trackIteratorIdx) == tracksInJetsSet.end()) { - nTracksOut++; - } - trackIteratorIdx++; + if (passedTrackSelection(track) && tracksInJetsSet.find(trackIteratorIdx) == tracksInJetsSet.end()) { + nTracksOut++; + } + trackIteratorIdx++; } registryData.fill(HIST("tracks_outside_jets"), nTracksOut); } - PROCESS_SWITCH(PIDHadronsInJets, processForJets, "Process jets", true); + PROCESS_SWITCH(PIDHadronsInJets, processForJets, "Pid Analysis in and outside jets", true); void processMC(SelectedCollisions::iterator const& collision, aod::McParticles const& mcParticles, HadronTracksMC const& tracks) { - if (!collision.sel8() || std::fabs(collision.posZ()) > zVtx) return; + if (!collision.sel8() || std::abs(collision.posZ()) > zVtx) return; if (rejectITSROFBorder && !collision.selection_bit(o2::aod::evsel::kNoITSROFrameBorder)) return; if (rejectTFBorder && !collision.selection_bit(o2::aod::evsel::kNoTimeFrameBorder)) return; if (requireVtxITSTPC && !collision.selection_bit(o2::aod::evsel::kIsVertexITSTPC)) return; @@ -609,11 +622,11 @@ struct PIDHadronsInJets { } } - const double ptThreshold = 0.8; + const double ptThreshold = 0.8; for (auto const& track : tracks) { if (!passedTrackSelection(track)) continue; - if (std::fabs(track.dcaXY()) > maxDcaxy || std::fabs(track.dcaZ()) > maxDcaz) continue; + if (std::abs(track.dcaXY()) > maxDcaxy || std::abs(track.dcaZ()) > maxDcaz) continue; double pt = track.pt(); @@ -626,23 +639,22 @@ struct PIDHadronsInJets { bool passTpcPr = (std::abs(track.tpcNSigmaPr()) <= 3.0); bool passTofPr = track.hasTOF() && (std::abs(track.tofNSigmaPr()) <= 3.0); - if (!track.has_mcParticle()) continue; + if (!track.has_mcParticle()) continue; auto const& trueParticle = track.mcParticle(); - + int pdg = std::abs(trueParticle.pdgCode()); bool isPrimary = trueParticle.isPhysicalPrimary(); if (passTpcPi && (pt < ptThreshold || passTofPi)) { - registryData.fill(HIST("rec_pion_all"), pt); //reconstructed after cuts + registryData.fill(HIST("rec_pion_all"), pt); registryData.fill(HIST("contamination_matrix_pion"), pdg, pt); - if (isPrimary) { - if (pdg == 211) registryData.fill(HIST("mc_rec_pion_pt"), pt); // Efficiency + if (pdg == 211) registryData.fill(HIST("mc_rec_pion_pt"), pt); } else { registryData.fill(HIST("mc_sec_pion_pt"), pt); } } - + if (passTpcKa && (pt < ptThreshold || passTofKa)) { registryData.fill(HIST("rec_kaon_all"), pt); registryData.fill(HIST("contamination_matrix_kaon"), pdg, pt); @@ -666,7 +678,6 @@ struct PIDHadronsInJets { } PROCESS_SWITCH(PIDHadronsInJets, processMC, "Run on Monte Carlo", false); - }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From 8b4ef7ba220dee317ced639f903c8e1d4f42c028 Mon Sep 17 00:00:00 2001 From: Leonard Date: Tue, 28 Apr 2026 21:09:15 +0200 Subject: [PATCH 10/35] Changing formating in jetHadronsPid.cxx and in CMakeLists.txt --- PWGJE/Tasks/CMakeLists.txt | 2 +- .../{jetHadronsPID.cxx => jetHadronsPid.cxx} | 319 +++++++++++------- 2 files changed, 195 insertions(+), 126 deletions(-) rename PWGJE/Tasks/{jetHadronsPID.cxx => jetHadronsPid.cxx} (83%) diff --git a/PWGJE/Tasks/CMakeLists.txt b/PWGJE/Tasks/CMakeLists.txt index c822f837f8a..f20bd617e33 100644 --- a/PWGJE/Tasks/CMakeLists.txt +++ b/PWGJE/Tasks/CMakeLists.txt @@ -404,7 +404,7 @@ if(FastJet_FOUND) PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(jet-hadrons-pid - SOURCES jetHadronsPID.cxx + SOURCES jetHadronsPid.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2Physics::PWGJECore FastJet::FastJet FastJet::Contrib O2Physics::EventFilteringUtils COMPONENT_NAME Analysis) endif() diff --git a/PWGJE/Tasks/jetHadronsPID.cxx b/PWGJE/Tasks/jetHadronsPid.cxx similarity index 83% rename from PWGJE/Tasks/jetHadronsPID.cxx rename to PWGJE/Tasks/jetHadronsPid.cxx index d0e26ea03ed..0d5263e67ce 100644 --- a/PWGJE/Tasks/jetHadronsPID.cxx +++ b/PWGJE/Tasks/jetHadronsPid.cxx @@ -9,15 +9,14 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. -/// \file jetHadronsPID.cxx -/// \brief Analysis of hadrons in jets +/// \file jetHadronsPid.cxx +/// \brief Analysis of hadrons in jets /// \author Aleksandra Mulewicz, WUT Warsaw, aleksandra.mulewicz@cern.ch /// \author Leonard Lorenc, WUT Warsaw, leonard.lorenc@cern.ch /// \author Hubert Zalewski, WUT Warsaw, hubert.zalewski@cern.ch /// \author Małgorzata Janik malgorzata.janik@cern.ch /// \author Daniela Ruggiano daniela.ruggiano@cern.ch -#include "Framework/runDataProcessing.h" #include "PWGJE/Core/JetBkgSubUtils.h" #include "PWGJE/Core/JetUtilities.h" #include "PWGJE/DataModel/Jet.h" @@ -30,21 +29,22 @@ #include "Framework/AnalysisTask.h" #include "Framework/HistogramRegistry.h" #include "Framework/Logger.h" +#include "Framework/runDataProcessing.h" #include "ReconstructionDataFormats/DCA.h" #include "ReconstructionDataFormats/PID.h" #include "ReconstructionDataFormats/Track.h" +#include +#include + #include #include #include #include -#include -#include - #include -#include #include +#include using namespace o2; using namespace o2::framework; @@ -65,7 +65,7 @@ using HadronTracksMC = soa::Join; -struct PIDHadronsInJets { +struct jetHadronsPid { HistogramRegistry registryData{"registryData", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; @@ -112,7 +112,7 @@ struct PIDHadronsInJets { if (setMCDefaultItsParams) { itsResponse.setMCDefaultParameters(); } - + registryData.add("n_events", "Event counter", HistType::kTH1F, {{1, 0.5, 1.5, "N_{events}"}}); registryData.add("n_events_raw", "All events", HistType::kTH1F, {{1, 0.5, 1.5, ""}}); @@ -126,24 +126,24 @@ struct PIDHadronsInJets { registryData.add("pion_pure_tpc", "TPC Pion PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); registryData.add("pion_pure_tof", "TOF Pion PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); - registryData.add("pion_pure_pt", "Pion pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})" }}); - registryData.add("pion_pure_eta", "Pion Eta", HistType::kTH1F, {{100, -1.0, 1.0, "#eta" }}); - registryData.add("pion_pure_dcaz", "Pion DCAz", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)" }}); - registryData.add("pion_pure_dcaxy", "Pion DCAxy", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)" }}); + registryData.add("pion_pure_pt", "Pion pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("pion_pure_eta", "Pion Eta", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); + registryData.add("pion_pure_dcaz", "Pion DCAz", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); + registryData.add("pion_pure_dcaxy", "Pion DCAxy", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); registryData.add("kaon_pure_tpc", "TPC Kaon PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); registryData.add("kaon_pure_tof", "TOF Kaon PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); - registryData.add("kaon_pure_pt", "Kaon pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})" }}); - registryData.add("kaon_pure_eta", "Kaon Eta", HistType::kTH1F, {{100, -1.0, 1.0, "#eta" }}); - registryData.add("kaon_pure_dcaz", "Kaon DCAz", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)" }}); - registryData.add("kaon_pure_dcaxy", "Kaon DCAxy", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)" }}); + registryData.add("kaon_pure_pt", "Kaon pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("kaon_pure_eta", "Kaon Eta", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); + registryData.add("kaon_pure_dcaz", "Kaon DCAz", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); + registryData.add("kaon_pure_dcaxy", "Kaon DCAxy", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); registryData.add("proton_pure_tpc", "TPC Proton PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); registryData.add("proton_pure_tof", "TOF Proton PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); - registryData.add("proton_pure_pt", "Proton pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})" }}); - registryData.add("proton_pure_eta", "Proton Eta", HistType::kTH1F, {{100, -1.0, 1.0, "#eta" }}); - registryData.add("proton_pure_dcaz", "Proton DCAz", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)" }}); - registryData.add("proton_pure_dcaxy", "Proton DCAxy", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)" }}); + registryData.add("proton_pure_pt", "Proton pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("proton_pure_eta", "Proton Eta", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); + registryData.add("proton_pure_dcaz", "Proton DCAz", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); + registryData.add("proton_pure_dcaxy", "Proton DCAxy", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); registryData.add("z_vtx", "Z-Vertex Distribution", HistType::kTH1F, {{200, -20.0, 20.0, "Z-Vertex (cm)"}}); registryData.add("tracks_in_jets", "Number of Tracks Inside Jets", HistType::kTH1F, {{100, 0, 100, "N_{tracks}"}}); @@ -156,48 +156,48 @@ struct PIDHadronsInJets { registryData.add("proton_jet_tpc", "TPC Proton PID in Jets", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); registryData.add("proton_jet_tof", "TOF Proton PID in Jets", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); - registryData.add("pion_jet_pt", "Pion pT in Jets", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})" }}); - registryData.add("pion_jet_eta", "Pion Eta in Jets", HistType::kTH1F, {{100, -1.0, 1.0, "#eta" }}); - registryData.add("pion_jet_dcaxy", "Pion DCAxy in Jets", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)" }}); - registryData.add("pion_jet_dcaz", "Pion DCAz in Jets", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)" }}); + registryData.add("pion_jet_pt", "Pion pT in Jets", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("pion_jet_eta", "Pion Eta in Jets", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); + registryData.add("pion_jet_dcaxy", "Pion DCAxy in Jets", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); + registryData.add("pion_jet_dcaz", "Pion DCAz in Jets", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); - registryData.add("kaon_jet_pt", "Kaon pT in Jets", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})" }}); - registryData.add("kaon_jet_eta", "Kaon Eta in Jets", HistType::kTH1F, {{100, -1.0, 1.0, "#eta" }}); - registryData.add("kaon_jet_dcaxy", "Kaon DCAxy in Jets", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)" }}); - registryData.add("kaon_jet_dcaz", "Kaon DCAz in Jets", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)" }}); + registryData.add("kaon_jet_pt", "Kaon pT in Jets", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("kaon_jet_eta", "Kaon Eta in Jets", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); + registryData.add("kaon_jet_dcaxy", "Kaon DCAxy in Jets", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); + registryData.add("kaon_jet_dcaz", "Kaon DCAz in Jets", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); - registryData.add("proton_jet_pt", "Proton pT in Jets", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})" }}); - registryData.add("proton_jet_eta", "Proton Eta in Jets", HistType::kTH1F, {{100, -1.0, 1.0, "#eta" }}); - registryData.add("proton_jet_dcaxy", "Proton DCAxy in Jets", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)" }}); - registryData.add("proton_jet_dcaz", "Proton DCAz in Jets", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)" }}); + registryData.add("proton_jet_pt", "Proton pT in Jets", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("proton_jet_eta", "Proton Eta in Jets", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); + registryData.add("proton_jet_dcaxy", "Proton DCAxy in Jets", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); + registryData.add("proton_jet_dcaz", "Proton DCAz in Jets", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); registryData.add("pion_ue_tpc", "TPC Pion PID in UE", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); registryData.add("pion_ue_tof", "TOF Pion PID in UE", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); - registryData.add("pion_ue_pt", "Pion pT in UE", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})" }}); - registryData.add("pion_ue_eta", "Pion Eta in UE", HistType::kTH1F, {{100, -1.0, 1.0, "#eta" }}); - registryData.add("pion_ue_dcaxy", "Pion DCAxy in UE", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)" }}); - registryData.add("pion_ue_dcaz", "Pion DCAz in UE", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)" }}); + registryData.add("pion_ue_pt", "Pion pT in UE", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("pion_ue_eta", "Pion Eta in UE", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); + registryData.add("pion_ue_dcaxy", "Pion DCAxy in UE", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); + registryData.add("pion_ue_dcaz", "Pion DCAz in UE", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); registryData.add("kaon_ue_tpc", "TPC Kaon PID in UE", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); registryData.add("kaon_ue_tof", "TOF Kaon PID in UE", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); - registryData.add("kaon_ue_pt", "Kaon pT in UE", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})" }}); - registryData.add("kaon_ue_eta", "Kaon Eta in UE", HistType::kTH1F, {{100, -1.0, 1.0, "#eta" }}); - registryData.add("kaon_ue_dcaxy", "Kaon DCAxy in UE", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)" }}); - registryData.add("kaon_ue_dcaz", "Kaon DCAz in UE", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)" }}); + registryData.add("kaon_ue_pt", "Kaon pT in UE", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("kaon_ue_eta", "Kaon Eta in UE", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); + registryData.add("kaon_ue_dcaxy", "Kaon DCAxy in UE", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); + registryData.add("kaon_ue_dcaz", "Kaon DCAz in UE", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); registryData.add("proton_ue_tpc", "TPC Proton PID in UE", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); registryData.add("proton_ue_tof", "TOF Proton PID in UE", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); - registryData.add("proton_ue_pt", "Proton pT in UE", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})" }}); - registryData.add("proton_ue_eta", "Proton Eta in UE", HistType::kTH1F, {{100, -1.0, 1.0, "#eta" }}); - registryData.add("proton_ue_dcaxy", "Proton DCAxy in UE", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)" }}); - registryData.add("proton_ue_dcaz", "Proton DCAz in UE", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)" }}); - - registryData.add("mc_gen_pion_pt", "Generated Pion pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})" }}); - registryData.add("mc_rec_pion_pt", "Reconstructed Pion pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})" }}); - registryData.add("mc_gen_kaon_pt", "Generated Kaon pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})" }}); - registryData.add("mc_rec_kaon_pt", "Reconstructed Kaon pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})" }}); - registryData.add("mc_gen_proton_pt", "Generated Proton pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})" }}); - registryData.add("mc_rec_proton_pt", "Reconstructed Proton pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})" }}); + registryData.add("proton_ue_pt", "Proton pT in UE", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("proton_ue_eta", "Proton Eta in UE", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); + registryData.add("proton_ue_dcaxy", "Proton DCAxy in UE", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); + registryData.add("proton_ue_dcaz", "Proton DCAz in UE", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); + + registryData.add("mc_gen_pion_pt", "Generated Pion pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc_rec_pion_pt", "Reconstructed Pion pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc_gen_kaon_pt", "Generated Kaon pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc_rec_kaon_pt", "Reconstructed Kaon pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc_gen_proton_pt", "Generated Proton pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc_rec_proton_pt", "Reconstructed Proton pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); registryData.add("rec_pion_all", "All identified pions", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T}"}}); registryData.add("rec_kaon_all", "All identified kaons", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T}"}}); @@ -206,9 +206,9 @@ struct PIDHadronsInJets { registryData.add("contamination_matrix_kaon", "Kaon Contamination Matrix;True absolute PDG;Rec #it{p}_{T} (GeV/#it{c})", HistType::kTH2F, {{3000, -0.5, 2999.5}, {120, 0.0, 4.0}}); registryData.add("contamination_matrix_proton", "Proton Contamination Matrix;True absolute PDG;Rec #it{p}_{T} (GeV/#it{c})", HistType::kTH2F, {{3000, -0.5, 2999.5}, {120, 0.0, 4.0}}); - registryData.add("mc_sec_pion_pt", "Reconstructed Pion Secondaries", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})" }}); - registryData.add("mc_sec_kaon_pt", "Reconstructed Kaon Secondaries", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})" }}); - registryData.add("mc_sec_proton_pt", "Reconstructed Proton Secondaries", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})" }}); + registryData.add("mc_sec_pion_pt", "Reconstructed Pion Secondaries", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc_sec_kaon_pt", "Reconstructed Kaon Secondaries", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc_sec_proton_pt", "Reconstructed Proton Secondaries", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); } void getPerpendicularDirections(const TVector3& p, TVector3& u1, TVector3& u2) @@ -217,16 +217,24 @@ struct PIDHadronsInJets { double px2 = px * px, py2 = py * py, pz2 = pz * pz; double pz4 = pz2 * pz2; - if (px == 0 && py == 0) { u1.SetXYZ(0, 0, 0); u2.SetXYZ(0, 0, 0); return; } + if (px == 0 && py == 0) { + u1.SetXYZ(0, 0, 0); + u2.SetXYZ(0, 0, 0); + return; + } if (px == 0 && py != 0) { double ux = std::sqrt(py2 - pz4 / py2); double uy = -pz2 / py; - u1.SetXYZ(ux, uy, pz); u2.SetXYZ(-ux, uy, pz); return; + u1.SetXYZ(ux, uy, pz); + u2.SetXYZ(-ux, uy, pz); + return; } if (py == 0 && px != 0) { double ux = -pz2 / px; double uy = std::sqrt(px2 - pz4 / px2); - u1.SetXYZ(ux, uy, pz); u2.SetXYZ(ux, -uy, pz); return; + u1.SetXYZ(ux, uy, pz); + u2.SetXYZ(ux, -uy, pz); + return; } double a = px2 + py2; @@ -234,7 +242,11 @@ struct PIDHadronsInJets { double c = pz4 - py2 * py2 - px2 * py2; double delta = b * b - 4.0 * a * c; - if (delta < 0 || a == 0) { u1.SetXYZ(0, 0, 0); u2.SetXYZ(0, 0, 0); return; } + if (delta < 0 || a == 0) { + u1.SetXYZ(0, 0, 0); + u2.SetXYZ(0, 0, 0); + return; + } double u1x = (-b + std::sqrt(delta)) / (2.0 * a); u1.SetXYZ(u1x, (-pz2 - px * u1x) / py, pz); double u2x = (-b - std::sqrt(delta)) / (2.0 * a); @@ -248,8 +260,10 @@ struct PIDHadronsInJets { double phi2 = TVector2::Phi_0_2pi(a2); double diff = std::abs(phi1 - phi2); - if (diff <= PI) deltaPhi = diff; - if (diff > PI) deltaPhi = TwoPI - diff; + if (diff <= PI) + deltaPhi = diff; + if (diff > PI) + deltaPhi = TwoPI - diff; return deltaPhi; } @@ -271,52 +285,78 @@ struct PIDHadronsInJets { static constexpr double DcaxyMaxTrackPar2 = 1.1; static constexpr double DcazMaxTrack = 2.0; - if (!track.hasITS() || !track.hasTPC()) return false; - if ((!hasITSHit(track, 1)) && (!hasITSHit(track, 2)) && (!hasITSHit(track, 3))) return false; - if (track.tpcNClsCrossedRows() < MinTpcCr) return false; - if (track.tpcChi2NCl() > MaxChi2Tpc) return false; - if (track.itsChi2NCl() > MaxChi2Its) return false; - if (std::abs(track.eta()) > maxEta) return false; - if (track.pt() < cfgMinPtTrack) return false; - if (std::abs(track.dcaXY()) > (DcaxyMaxTrackPar0 + DcaxyMaxTrackPar1 / std::pow(track.pt(), DcaxyMaxTrackPar2))) return false; - if (std::abs(track.dcaZ()) > DcazMaxTrack) return false; + if (!track.hasITS() || !track.hasTPC()) + return false; + if ((!hasITSHit(track, 1)) && (!hasITSHit(track, 2)) && (!hasITSHit(track, 3))) + return false; + if (track.tpcNClsCrossedRows() < MinTpcCr) + return false; + if (track.tpcChi2NCl() > MaxChi2Tpc) + return false; + if (track.itsChi2NCl() > MaxChi2Its) + return false; + if (std::abs(track.eta()) > maxEta) + return false; + if (track.pt() < cfgMinPtTrack) + return false; + if (std::abs(track.dcaXY()) > (DcaxyMaxTrackPar0 + DcaxyMaxTrackPar1 / std::pow(track.pt(), DcaxyMaxTrackPar2))) + return false; + if (std::abs(track.dcaZ()) > DcazMaxTrack) + return false; return true; } template bool passedTrackSelection(const PionTrack& track) { - if (requirePvContributor && !(track.isPVContributor())) return false; - if (!track.hasITS() || !track.hasTPC()) return false; - if ((!hasITSHit(track, 1)) && (!hasITSHit(track, 2)) && (!hasITSHit(track, 3))) return false; - if (track.itsNCls() < minItsNclusters) return false; - if (track.tpcNClsCrossedRows() < minTpcNcrossedRows) return false; - if (track.tpcChi2NCl() < minChiSquareTpc || track.tpcChi2NCl() > maxChiSquareTpc) return false; - if (track.itsChi2NCl() > maxChiSquareIts) return false; - if (track.eta() < minEta || track.eta() > maxEta) return false; - if (track.pt() < minPt || track.pt() > maxPt) return false; + if (requirePvContributor && !(track.isPVContributor())) + return false; + if (!track.hasITS() || !track.hasTPC()) + return false; + if ((!hasITSHit(track, 1)) && (!hasITSHit(track, 2)) && (!hasITSHit(track, 3))) + return false; + if (track.itsNCls() < minItsNclusters) + return false; + if (track.tpcNClsCrossedRows() < minTpcNcrossedRows) + return false; + if (track.tpcChi2NCl() < minChiSquareTpc || track.tpcChi2NCl() > maxChiSquareTpc) + return false; + if (track.itsChi2NCl() > maxChiSquareIts) + return false; + if (track.eta() < minEta || track.eta() > maxEta) + return false; + if (track.pt() < minPt || track.pt() > maxPt) + return false; return true; } - void processForJets(SelectedCollisions::iterator const& collision, HadronTracks const& tracks) { registryData.fill(HIST("n_events_raw"), 1); - if (!collision.sel8() || std::abs(collision.posZ()) > zVtx) return; - if (rejectITSROFBorder && !collision.selection_bit(o2::aod::evsel::kNoITSROFrameBorder)) return; - if (rejectTFBorder && !collision.selection_bit(o2::aod::evsel::kNoTimeFrameBorder)) return; - if (requireVtxITSTPC && !collision.selection_bit(o2::aod::evsel::kIsVertexITSTPC)) return; - if (rejectSameBunchPileup && !collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) return; - if (requireIsGoodZvtxFT0VsPV && !collision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) return; - if (requireIsVertexTOFmatched && !collision.selection_bit(o2::aod::evsel::kIsVertexTOFmatched)) return; + if (!collision.sel8() || std::abs(collision.posZ()) > zVtx) + return; + if (rejectITSROFBorder && !collision.selection_bit(o2::aod::evsel::kNoITSROFrameBorder)) + return; + if (rejectTFBorder && !collision.selection_bit(o2::aod::evsel::kNoTimeFrameBorder)) + return; + if (requireVtxITSTPC && !collision.selection_bit(o2::aod::evsel::kIsVertexITSTPC)) + return; + if (rejectSameBunchPileup && !collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) + return; + if (requireIsGoodZvtxFT0VsPV && !collision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) + return; + if (requireIsVertexTOFmatched && !collision.selection_bit(o2::aod::evsel::kIsVertexTOFmatched)) + return; registryData.fill(HIST("n_events"), 1); registryData.fill(HIST("z_vtx"), collision.posZ()); for (auto const& track : tracks) { - if (!passedTrackSelection(track)) continue; - if (std::abs(track.dcaXY()) > maxDcaxy || std::abs(track.dcaZ()) > maxDcaz) continue; + if (!passedTrackSelection(track)) + continue; + if (std::abs(track.dcaXY()) > maxDcaxy || std::abs(track.dcaZ()) > maxDcaz) + continue; double pt = track.pt(); double eta = track.eta(); @@ -383,21 +423,24 @@ struct PIDHadronsInJets { std::vector fjParticles; for (auto const& track : tracks) { id++; - if (!passedTrackSelectionForJetReconstruction(track)) continue; + if (!passedTrackSelectionForJetReconstruction(track)) + continue; fastjet::PseudoJet fourMomentum(track.px(), track.py(), track.pz(), track.energy(MassPionCharged)); fourMomentum.set_user_index(id); fjParticles.emplace_back(fourMomentum); } - if (fjParticles.empty()) return; + if (fjParticles.empty()) + return; fastjet::JetDefinition jetDef(fastjet::antikt_algorithm, rJet); fastjet::AreaDefinition areaDef(fastjet::active_area, fastjet::GhostedAreaSpec(1.0)); fastjet::ClusterSequenceArea cs(fjParticles, jetDef, areaDef); std::vector jets = fastjet::sorted_by_pt(cs.inclusive_jets()); - if (jets.empty()) return; + if (jets.empty()) + return; auto [rhoPerp, rhoMPerp] = jetutilities::estimateRhoPerpCone(fjParticles, jets[0], rJet); @@ -410,27 +453,34 @@ struct PIDHadronsInJets { registryData.fill(HIST("jet_area"), jet.area()); registryData.fill(HIST("jet_n_constituents"), jet.constituents().size()); - if (!isppRefAnalysis && ((std::abs(jet.eta()) + rJet) > (maxEta - deltaEtaEdge))) continue; - if (isppRefAnalysis && std::abs(jet.eta()) > cfgEtaJetMax) continue; + if (!isppRefAnalysis && ((std::abs(jet.eta()) + rJet) > (maxEta - deltaEtaEdge))) + continue; + if (isppRefAnalysis && std::abs(jet.eta()) > cfgEtaJetMax) + continue; auto jetForSub = jet; fastjet::PseudoJet jetMinusBkg = backgroundSub.doRhoAreaSub(jetForSub, rhoPerp, rhoMPerp); registryData.fill(HIST("jet_pt_subtracted"), jetMinusBkg.pt()); registryData.fill(HIST("jet_pt_raw_vs_sub"), jet.pt(), jetMinusBkg.pt()); - if (isppRefAnalysis && (jet.pt() < minJetPt || jet.pt() > maxJetPt)) continue; - if (!isppRefAnalysis && (jetMinusBkg.pt() < minJetPt || jetMinusBkg.pt() > maxJetPt)) continue; + if (isppRefAnalysis && (jet.pt() < minJetPt || jet.pt() > maxJetPt)) + continue; + if (!isppRefAnalysis && (jetMinusBkg.pt() < minJetPt || jetMinusBkg.pt() > maxJetPt)) + continue; double normalizedJetArea = jet.area() / (PI * rJet * rJet); - if (applyAreaCut && (!isppRefAnalysis) && normalizedJetArea > maxNormalizedJetArea) continue; - if (isppRefAnalysis && (jet.area() < cfgAreaFrac * PI * rJet * rJet)) continue; + if (applyAreaCut && (!isppRefAnalysis) && normalizedJetArea > maxNormalizedJetArea) + continue; + if (isppRefAnalysis && (jet.area() < cfgAreaFrac * PI * rJet * rJet)) + continue; double coneRadius = std::sqrt(jet.area() / PI); TVector3 jetAxis(jet.px(), jet.py(), jet.pz()); TVector3 ueAxis1(0, 0, 0), ueAxis2(0, 0, 0); getPerpendicularDirections(jetAxis, ueAxis1, ueAxis2); - if (ueAxis1.Mag() == 0 || ueAxis2.Mag() == 0) continue; + if (ueAxis1.Mag() == 0 || ueAxis2.Mag() == 0) + continue; std::vector jetConstituents = jet.constituents(); @@ -441,8 +491,10 @@ struct PIDHadronsInJets { tracksInJetsSet.insert(trackIdx); - if (!passedTrackSelection(track)) continue; - if (std::abs(track.dcaXY()) > maxDcaxy || std::abs(track.dcaZ()) > maxDcaz) continue; + if (!passedTrackSelection(track)) + continue; + if (std::abs(track.dcaXY()) > maxDcaxy || std::abs(track.dcaZ()) > maxDcaz) + continue; double pt = track.pt(); double eta = track.eta(); @@ -507,8 +559,10 @@ struct PIDHadronsInJets { for (auto const& track : tracks) { - if (!passedTrackSelection(track)) continue; - if (std::abs(track.dcaXY()) > maxDcaxy || std::abs(track.dcaZ()) > maxDcaz) continue; + if (!passedTrackSelection(track)) + continue; + if (std::abs(track.dcaXY()) > maxDcaxy || std::abs(track.dcaZ()) > maxDcaz) + continue; double deltaEtaUe1 = track.eta() - ueAxis1.Eta(); double deltaPhiUe1 = getDeltaPhi(track.phi(), ueAxis1.Phi()); @@ -523,7 +577,8 @@ struct PIDHadronsInJets { maxConeRadius = std::sqrt(maxNormalizedJetArea) * rJet; } - if (deltaRUe1 > maxConeRadius && deltaRUe2 > maxConeRadius) continue; + if (deltaRUe1 > maxConeRadius && deltaRUe2 > maxConeRadius) + continue; double pt = track.pt(); double eta = track.eta(); @@ -594,21 +649,30 @@ struct PIDHadronsInJets { registryData.fill(HIST("tracks_outside_jets"), nTracksOut); } - PROCESS_SWITCH(PIDHadronsInJets, processForJets, "Pid Analysis in and outside jets", true); + PROCESS_SWITCH(jetHadronsPid, processForJets, "Pid Analysis in and outside jets", true); void processMC(SelectedCollisions::iterator const& collision, aod::McParticles const& mcParticles, HadronTracksMC const& tracks) { - if (!collision.sel8() || std::abs(collision.posZ()) > zVtx) return; - if (rejectITSROFBorder && !collision.selection_bit(o2::aod::evsel::kNoITSROFrameBorder)) return; - if (rejectTFBorder && !collision.selection_bit(o2::aod::evsel::kNoTimeFrameBorder)) return; - if (requireVtxITSTPC && !collision.selection_bit(o2::aod::evsel::kIsVertexITSTPC)) return; - if (rejectSameBunchPileup && !collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) return; - if (requireIsGoodZvtxFT0VsPV && !collision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) return; - if (requireIsVertexTOFmatched && !collision.selection_bit(o2::aod::evsel::kIsVertexTOFmatched)) return; + if (!collision.sel8() || std::abs(collision.posZ()) > zVtx) + return; + if (rejectITSROFBorder && !collision.selection_bit(o2::aod::evsel::kNoITSROFrameBorder)) + return; + if (rejectTFBorder && !collision.selection_bit(o2::aod::evsel::kNoTimeFrameBorder)) + return; + if (requireVtxITSTPC && !collision.selection_bit(o2::aod::evsel::kIsVertexITSTPC)) + return; + if (rejectSameBunchPileup && !collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) + return; + if (requireIsGoodZvtxFT0VsPV && !collision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) + return; + if (requireIsVertexTOFmatched && !collision.selection_bit(o2::aod::evsel::kIsVertexTOFmatched)) + return; for (auto const& mcpart : mcParticles) { - if (!mcpart.isPhysicalPrimary()) continue; - if (std::abs(mcpart.eta()) > 0.8) continue; + if (!mcpart.isPhysicalPrimary()) + continue; + if (std::abs(mcpart.eta()) > 0.8) + continue; int pdg = std::abs(mcpart.pdgCode()); double pt = mcpart.pt(); @@ -625,8 +689,10 @@ struct PIDHadronsInJets { const double ptThreshold = 0.8; for (auto const& track : tracks) { - if (!passedTrackSelection(track)) continue; - if (std::abs(track.dcaXY()) > maxDcaxy || std::abs(track.dcaZ()) > maxDcaz) continue; + if (!passedTrackSelection(track)) + continue; + if (std::abs(track.dcaXY()) > maxDcaxy || std::abs(track.dcaZ()) > maxDcaz) + continue; double pt = track.pt(); @@ -639,17 +705,19 @@ struct PIDHadronsInJets { bool passTpcPr = (std::abs(track.tpcNSigmaPr()) <= 3.0); bool passTofPr = track.hasTOF() && (std::abs(track.tofNSigmaPr()) <= 3.0); - if (!track.has_mcParticle()) continue; + if (!track.has_mcParticle()) + continue; auto const& trueParticle = track.mcParticle(); int pdg = std::abs(trueParticle.pdgCode()); bool isPrimary = trueParticle.isPhysicalPrimary(); if (passTpcPi && (pt < ptThreshold || passTofPi)) { - registryData.fill(HIST("rec_pion_all"), pt); + registryData.fill(HIST("rec_pion_all"), pt); registryData.fill(HIST("contamination_matrix_pion"), pdg, pt); if (isPrimary) { - if (pdg == 211) registryData.fill(HIST("mc_rec_pion_pt"), pt); + if (pdg == 211) + registryData.fill(HIST("mc_rec_pion_pt"), pt); } else { registryData.fill(HIST("mc_sec_pion_pt"), pt); } @@ -659,7 +727,8 @@ struct PIDHadronsInJets { registryData.fill(HIST("rec_kaon_all"), pt); registryData.fill(HIST("contamination_matrix_kaon"), pdg, pt); if (isPrimary) { - if (pdg == 321) registryData.fill(HIST("mc_rec_kaon_pt"), pt); + if (pdg == 321) + registryData.fill(HIST("mc_rec_kaon_pt"), pt); } else { registryData.fill(HIST("mc_sec_kaon_pt"), pt); } @@ -669,18 +738,18 @@ struct PIDHadronsInJets { registryData.fill(HIST("rec_proton_all"), pt); registryData.fill(HIST("contamination_matrix_proton"), pdg, pt); if (isPrimary) { - if (pdg == 2212) registryData.fill(HIST("mc_rec_proton_pt"), pt); + if (pdg == 2212) + registryData.fill(HIST("mc_rec_proton_pt"), pt); } else { registryData.fill(HIST("mc_sec_proton_pt"), pt); } } } } - PROCESS_SWITCH(PIDHadronsInJets, processMC, "Run on Monte Carlo", false); - + PROCESS_SWITCH(jetHadronsPid, processMC, "Run on Monte Carlo", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { - return WorkflowSpec{adaptAnalysisTask(cfgc)}; -} \ No newline at end of file + return WorkflowSpec{adaptAnalysisTask(cfgc)}; +} From 371c30d3384d013d124c1dd5f6031235d8086a8f Mon Sep 17 00:00:00 2001 From: Leonard Date: Wed, 29 Apr 2026 22:09:37 +0200 Subject: [PATCH 11/35] Changing code in jetHadronsPid.cxx according with comments on pull request --- PWGJE/Tasks/jetHadronsPid.cxx | 220 +++++++++++++++++----------------- 1 file changed, 110 insertions(+), 110 deletions(-) diff --git a/PWGJE/Tasks/jetHadronsPid.cxx b/PWGJE/Tasks/jetHadronsPid.cxx index 0d5263e67ce..80076646d9e 100644 --- a/PWGJE/Tasks/jetHadronsPid.cxx +++ b/PWGJE/Tasks/jetHadronsPid.cxx @@ -9,7 +9,7 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. -/// \file jetHadronsPid.cxx +/// \file jetHadronsPida.cxx /// \brief Analysis of hadrons in jets /// \author Aleksandra Mulewicz, WUT Warsaw, aleksandra.mulewicz@cern.ch /// \author Leonard Lorenc, WUT Warsaw, leonard.lorenc@cern.ch @@ -21,6 +21,7 @@ #include "PWGJE/Core/JetUtilities.h" #include "PWGJE/DataModel/Jet.h" +#include "Common/Core/RecoDecay.h" #include "Common/Core/TrackSelection.h" #include "Common/DataModel/EventSelection.h" #include "Common/DataModel/PIDResponseITS.h" @@ -70,7 +71,6 @@ struct jetHadronsPid { HistogramRegistry registryData{"registryData", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; Configurable isppRefAnalysis{"isppRefAnalysis", false, "Is ppRef analysis"}; - Configurable cfgAreaFrac{"cfgAreaFrac", 0.6, "fraction of jet area"}; Configurable cfgEtaJetMax{"cfgEtaJetMax", 0.5, "max jet eta"}; Configurable cfgMinPtTrack{"cfgMinPtTrack", 0.1, "minimum pt of tracks for jet reconstruction"}; @@ -86,7 +86,7 @@ struct jetHadronsPid { Configurable rJet{"rJet", 0.4, "Jet resolution parameter R"}; Configurable zVtx{"zVtx", 10.0, "Maximum zVertex"}; Configurable applyAreaCut{"applyAreaCut", true, "apply area cut"}; - Configurable maxNormalizedJetArea{"maxNormalizedJetArea", 1.0, "area cut"}; + Configurable minNormalizedJetArea{"minNormalizedJetArea", 0.6, "Minimum normalized area cut to reject fake jets"}; Configurable deltaEtaEdge{"deltaEtaEdge", 0.05, "eta gap from the edge"}; Configurable requirePvContributor{"requirePvContributor", false, "require that the track is a PV contributor"}; @@ -101,6 +101,7 @@ struct jetHadronsPid { Configurable maxEta{"maxEta", +0.8, "maximum eta"}; Configurable maxDcaxy{"maxDcaxy", 0.2, "Maximum DCAxy"}; Configurable maxDcaz{"maxDcaz", 0.1, "Maximum DCAz"}; + Configurable maxNSigmaPid{"maxNSigmaPid", 3.0, "Maximum nSigma for TPC and TOF PID"}; Configurable setMCDefaultItsParams{"setMCDefaultItsParams", true, "set MC default parameters"}; @@ -211,67 +212,64 @@ struct jetHadronsPid { registryData.add("mc_sec_proton_pt", "Reconstructed Proton Secondaries", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); } + // void getPerpendicularDirections(const TVector3& p, TVector3& u1, TVector3& u2) + // { + // double px = p.X(), py = p.Y(), pz = p.Z(); + // double px2 = px * px, py2 = py * py, pz2 = pz * pz; + // double pz4 = pz2 * pz2; + + // if (px == 0 && py == 0) { + // u1.SetXYZ(0, 0, 0); + // u2.SetXYZ(0, 0, 0); + // return; + // } + // if (px == 0 && py != 0) { + // double ux = std::sqrt(py2 - pz4 / py2); + // double uy = -pz2 / py; + // u1.SetXYZ(ux, uy, pz); + // u2.SetXYZ(-ux, uy, pz); + // return; + // } + // if (py == 0 && px != 0) { + // double ux = -pz2 / px; + // double uy = std::sqrt(px2 - pz4 / px2); + // u1.SetXYZ(ux, uy, pz); + // u2.SetXYZ(ux, -uy, pz); + // return; + // } + + // double a = px2 + py2; + // double b = 2.0 * px * pz2; + // double c = pz4 - py2 * py2 - px2 * py2; + // double delta = b * b - 4.0 * a * c; + + // if (delta < 0 || a == 0) { + // u1.SetXYZ(0, 0, 0); + // u2.SetXYZ(0, 0, 0); + // return; + // } + // double u1x = (-b + std::sqrt(delta)) / (2.0 * a); + // u1.SetXYZ(u1x, (-pz2 - px * u1x) / py, pz); + // double u2x = (-b - std::sqrt(delta)) / (2.0 * a); + // u2.SetXYZ(u2x, (-pz2 - px * u2x) / py, pz); + // } + void getPerpendicularDirections(const TVector3& p, TVector3& u1, TVector3& u2) { - double px = p.X(), py = p.Y(), pz = p.Z(); - double px2 = px * px, py2 = py * py, pz2 = pz * pz; - double pz4 = pz2 * pz2; - - if (px == 0 && py == 0) { - u1.SetXYZ(0, 0, 0); - u2.SetXYZ(0, 0, 0); - return; - } - if (px == 0 && py != 0) { - double ux = std::sqrt(py2 - pz4 / py2); - double uy = -pz2 / py; - u1.SetXYZ(ux, uy, pz); - u2.SetXYZ(-ux, uy, pz); - return; - } - if (py == 0 && px != 0) { - double ux = -pz2 / px; - double uy = std::sqrt(px2 - pz4 / px2); - u1.SetXYZ(ux, uy, pz); - u2.SetXYZ(ux, -uy, pz); - return; - } - - double a = px2 + py2; - double b = 2.0 * px * pz2; - double c = pz4 - py2 * py2 - px2 * py2; - double delta = b * b - 4.0 * a * c; - - if (delta < 0 || a == 0) { + if (p.Mag2() < 1e-9) { u1.SetXYZ(0, 0, 0); u2.SetXYZ(0, 0, 0); return; } - double u1x = (-b + std::sqrt(delta)) / (2.0 * a); - u1.SetXYZ(u1x, (-pz2 - px * u1x) / py, pz); - double u2x = (-b - std::sqrt(delta)) / (2.0 * a); - u2.SetXYZ(u2x, (-pz2 - px * u2x) / py, pz); - } - - double getDeltaPhi(double a1, double a2) - { - double deltaPhi(0); - double phi1 = TVector2::Phi_0_2pi(a1); - double phi2 = TVector2::Phi_0_2pi(a2); - double diff = std::abs(phi1 - phi2); - - if (diff <= PI) - deltaPhi = diff; - if (diff > PI) - deltaPhi = TwoPI - diff; - return deltaPhi; + u1 = p.Orthogonal(); + u2 = p.Cross(u1); } template - bool hasITSHit(const TrackIts& track, int layer) + bool hasITSLayerHit(const TrackIts& track, int layer) { int ibit = layer - 1; - return (track.itsClusterMap() & (1 << ibit)); + return (track.itsClusterMap() & (1 << ibit)) != 0; } template @@ -287,7 +285,7 @@ struct jetHadronsPid { if (!track.hasITS() || !track.hasTPC()) return false; - if ((!hasITSHit(track, 1)) && (!hasITSHit(track, 2)) && (!hasITSHit(track, 3))) + if ((!hasITSLayerHit(track, 1)) && (!hasITSLayerHit(track, 2)) && (!hasITSLayerHit(track, 3))) return false; if (track.tpcNClsCrossedRows() < MinTpcCr) return false; @@ -313,7 +311,7 @@ struct jetHadronsPid { return false; if (!track.hasITS() || !track.hasTPC()) return false; - if ((!hasITSHit(track, 1)) && (!hasITSHit(track, 2)) && (!hasITSHit(track, 3))) + if ((!hasITSLayerHit(track, 1)) && (!hasITSLayerHit(track, 2)) && (!hasITSLayerHit(track, 3))) return false; if (track.itsNCls() < minItsNclusters) return false; @@ -363,13 +361,13 @@ struct jetHadronsPid { double dcaxy = track.dcaXY(); double dcaz = track.dcaZ(); - bool passTpcPi = (std::abs(track.tpcNSigmaPi()) <= 3.0); - bool passTpcKa = (std::abs(track.tpcNSigmaKa()) <= 3.0); - bool passTpcPr = (std::abs(track.tpcNSigmaPr()) <= 3.0); + bool passTpcPi = (std::abs(track.tpcNSigmaPi()) <= maxNSigmaPid); + bool passTpcKa = (std::abs(track.tpcNSigmaKa()) <= maxNSigmaPid); + bool passTpcPr = (std::abs(track.tpcNSigmaPr()) <= maxNSigmaPid); - bool passTofPi = track.hasTOF() && (std::abs(track.tofNSigmaPi()) <= 3.0); - bool passTofKa = track.hasTOF() && (std::abs(track.tofNSigmaKa()) <= 3.0); - bool passTofPr = track.hasTOF() && (std::abs(track.tofNSigmaPr()) <= 3.0); + bool passTofPi = track.hasTOF() && (std::abs(track.tofNSigmaPi()) <= maxNSigmaPid); + bool passTofKa = track.hasTOF() && (std::abs(track.tofNSigmaKa()) <= maxNSigmaPid); + bool passTofPr = track.hasTOF() && (std::abs(track.tofNSigmaPr()) <= maxNSigmaPid); const double ptThreshold = 0.8; @@ -419,15 +417,15 @@ struct jetHadronsPid { } } - int id(-1); + // int id(-1); std::vector fjParticles; for (auto const& track : tracks) { - id++; + // id++; if (!passedTrackSelectionForJetReconstruction(track)) continue; fastjet::PseudoJet fourMomentum(track.px(), track.py(), track.pz(), track.energy(MassPionCharged)); - fourMomentum.set_user_index(id); + fourMomentum.set_user_index(track.index()); fjParticles.emplace_back(fourMomentum); } @@ -469,10 +467,9 @@ struct jetHadronsPid { continue; double normalizedJetArea = jet.area() / (PI * rJet * rJet); - if (applyAreaCut && (!isppRefAnalysis) && normalizedJetArea > maxNormalizedJetArea) - continue; - if (isppRefAnalysis && (jet.area() < cfgAreaFrac * PI * rJet * rJet)) + if (applyAreaCut && normalizedJetArea < minNormalizedJetArea) { continue; + } double coneRadius = std::sqrt(jet.area() / PI); TVector3 jetAxis(jet.px(), jet.py(), jet.pz()); @@ -501,13 +498,13 @@ struct jetHadronsPid { double dcaxy = track.dcaXY(); double dcaz = track.dcaZ(); - bool passTpcPi = (std::abs(track.tpcNSigmaPi()) <= 3.0); - bool passTpcKa = (std::abs(track.tpcNSigmaKa()) <= 3.0); - bool passTpcPr = (std::abs(track.tpcNSigmaPr()) <= 3.0); + bool passTpcPi = (std::abs(track.tpcNSigmaPi()) <= maxNSigmaPid); + bool passTpcKa = (std::abs(track.tpcNSigmaKa()) <= maxNSigmaPid); + bool passTpcPr = (std::abs(track.tpcNSigmaPr()) <= maxNSigmaPid); - bool passTofPi = track.hasTOF() && (std::abs(track.tofNSigmaPi()) <= 3.0); - bool passTofKa = track.hasTOF() && (std::abs(track.tofNSigmaKa()) <= 3.0); - bool passTofPr = track.hasTOF() && (std::abs(track.tofNSigmaPr()) <= 3.0); + bool passTofPi = track.hasTOF() && (std::abs(track.tofNSigmaPi()) <= maxNSigmaPid); + bool passTofKa = track.hasTOF() && (std::abs(track.tofNSigmaKa()) <= maxNSigmaPid); + bool passTofPr = track.hasTOF() && (std::abs(track.tofNSigmaPr()) <= maxNSigmaPid); const double ptThreshold = 0.8; @@ -565,17 +562,14 @@ struct jetHadronsPid { continue; double deltaEtaUe1 = track.eta() - ueAxis1.Eta(); - double deltaPhiUe1 = getDeltaPhi(track.phi(), ueAxis1.Phi()); + double deltaPhiUe1 = std::abs(RecoDecay::constrainAngle(track.phi() - ueAxis1.Phi())); double deltaRUe1 = std::sqrt(deltaEtaUe1 * deltaEtaUe1 + deltaPhiUe1 * deltaPhiUe1); double deltaEtaUe2 = track.eta() - ueAxis2.Eta(); - double deltaPhiUe2 = getDeltaPhi(track.phi(), ueAxis2.Phi()); + double deltaPhiUe2 = std::abs(RecoDecay::constrainAngle(track.phi() - ueAxis2.Phi())); double deltaRUe2 = std::sqrt(deltaEtaUe2 * deltaEtaUe2 + deltaPhiUe2 * deltaPhiUe2); - double maxConeRadius = coneRadius; - if (applyAreaCut) { - maxConeRadius = std::sqrt(maxNormalizedJetArea) * rJet; - } + double maxConeRadius = rJet; if (deltaRUe1 > maxConeRadius && deltaRUe2 > maxConeRadius) continue; @@ -585,13 +579,13 @@ struct jetHadronsPid { double dcaxy = track.dcaXY(); double dcaz = track.dcaZ(); - bool passTpcPi = (std::abs(track.tpcNSigmaPi()) <= 3.0); - bool passTpcKa = (std::abs(track.tpcNSigmaKa()) <= 3.0); - bool passTpcPr = (std::abs(track.tpcNSigmaPr()) <= 3.0); + bool passTpcPi = (std::abs(track.tpcNSigmaPi()) <= maxNSigmaPid); + bool passTpcKa = (std::abs(track.tpcNSigmaKa()) <= maxNSigmaPid); + bool passTpcPr = (std::abs(track.tpcNSigmaPr()) <= maxNSigmaPid); - bool passTofPi = track.hasTOF() && (std::abs(track.tofNSigmaPi()) <= 3.0); - bool passTofKa = track.hasTOF() && (std::abs(track.tofNSigmaKa()) <= 3.0); - bool passTofPr = track.hasTOF() && (std::abs(track.tofNSigmaPr()) <= 3.0); + bool passTofPi = track.hasTOF() && (std::abs(track.tofNSigmaPi()) <= maxNSigmaPid); + bool passTofKa = track.hasTOF() && (std::abs(track.tofNSigmaKa()) <= maxNSigmaPid); + bool passTofPr = track.hasTOF() && (std::abs(track.tofNSigmaPr()) <= maxNSigmaPid); const double ptThreshold = 0.8; @@ -651,7 +645,7 @@ struct jetHadronsPid { PROCESS_SWITCH(jetHadronsPid, processForJets, "Pid Analysis in and outside jets", true); - void processMC(SelectedCollisions::iterator const& collision, aod::McParticles const& mcParticles, HadronTracksMC const& tracks) + void processMC(SelectedCollisions::iterator const& collision, HadronTracksMC const& tracks) { if (!collision.sel8() || std::abs(collision.posZ()) > zVtx) return; @@ -668,24 +662,6 @@ struct jetHadronsPid { if (requireIsVertexTOFmatched && !collision.selection_bit(o2::aod::evsel::kIsVertexTOFmatched)) return; - for (auto const& mcpart : mcParticles) { - if (!mcpart.isPhysicalPrimary()) - continue; - if (std::abs(mcpart.eta()) > 0.8) - continue; - - int pdg = std::abs(mcpart.pdgCode()); - double pt = mcpart.pt(); - - if (pdg == 211) { - registryData.fill(HIST("mc_gen_pion_pt"), pt); - } else if (pdg == 321) { - registryData.fill(HIST("mc_gen_kaon_pt"), pt); - } else if (pdg == 2212) { - registryData.fill(HIST("mc_gen_proton_pt"), pt); - } - } - const double ptThreshold = 0.8; for (auto const& track : tracks) { @@ -696,14 +672,14 @@ struct jetHadronsPid { double pt = track.pt(); - bool passTpcPi = (std::abs(track.tpcNSigmaPi()) <= 3.0); - bool passTofPi = track.hasTOF() && (std::abs(track.tofNSigmaPi()) <= 3.0); + bool passTpcPi = (std::abs(track.tpcNSigmaPi()) <= maxNSigmaPid); + bool passTofPi = track.hasTOF() && (std::abs(track.tofNSigmaPi()) <= maxNSigmaPid); - bool passTpcKa = (std::abs(track.tpcNSigmaKa()) <= 3.0); - bool passTofKa = track.hasTOF() && (std::abs(track.tofNSigmaKa()) <= 3.0); + bool passTpcKa = (std::abs(track.tpcNSigmaKa()) <= maxNSigmaPid); + bool passTofKa = track.hasTOF() && (std::abs(track.tofNSigmaKa()) <= maxNSigmaPid); - bool passTpcPr = (std::abs(track.tpcNSigmaPr()) <= 3.0); - bool passTofPr = track.hasTOF() && (std::abs(track.tofNSigmaPr()) <= 3.0); + bool passTpcPr = (std::abs(track.tpcNSigmaPr()) <= maxNSigmaPid); + bool passTofPr = track.hasTOF() && (std::abs(track.tofNSigmaPr()) <= maxNSigmaPid); if (!track.has_mcParticle()) continue; @@ -747,6 +723,30 @@ struct jetHadronsPid { } } PROCESS_SWITCH(jetHadronsPid, processMC, "Run on Monte Carlo", false); + void processMCTruth(aod::McCollisions::iterator const& mcCollision, aod::McParticles const& mcParticles) + { + if (std::abs(mcCollision.posZ()) > zVtx) + return; + + for (auto const& mcpart : mcParticles) { + if (!mcpart.isPhysicalPrimary()) + continue; + if (std::abs(mcpart.eta()) > maxEta) + continue; + + int pdg = std::abs(mcpart.pdgCode()); + double pt = mcpart.pt(); + + if (pdg == 211) { + registryData.fill(HIST("mc_gen_pion_pt"), pt); + } else if (pdg == 321) { + registryData.fill(HIST("mc_gen_kaon_pt"), pt); + } else if (pdg == 2212) { + registryData.fill(HIST("mc_gen_proton_pt"), pt); + } + } + } + PROCESS_SWITCH(jetHadronsPid, processMCTruth, "Run on Monte Carlo (Pure Truth)", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From 14df25b8a0ce312fef5b004fcfcb955e6317bb3b Mon Sep 17 00:00:00 2001 From: Leonard Date: Sun, 10 May 2026 14:47:00 +0200 Subject: [PATCH 12/35] Implementing common jet finder in jetHadronsPid.cxx --- PWGJE/Tasks/jetHadronsPid.cxx | 344 ++++++++++++---------------------- 1 file changed, 115 insertions(+), 229 deletions(-) diff --git a/PWGJE/Tasks/jetHadronsPid.cxx b/PWGJE/Tasks/jetHadronsPid.cxx index 80076646d9e..09778bf88a1 100644 --- a/PWGJE/Tasks/jetHadronsPid.cxx +++ b/PWGJE/Tasks/jetHadronsPid.cxx @@ -1,25 +1,8 @@ -// Copyright 2019-2025 CERN and copyright holders of ALICE O2. -// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. -// All rights not expressly granted are reserved. -// -// This software is distributed under the terms of the GNU General Public -// License v3 (GPL Version 3), copied verbatim in the file "COPYING". -// -// In applying this license CERN does not waive the privileges and immunities -// granted to it by virtue of its status as an Intergovernmental Organization -// or submit itself to any jurisdiction. - -/// \file jetHadronsPida.cxx -/// \brief Analysis of hadrons in jets -/// \author Aleksandra Mulewicz, WUT Warsaw, aleksandra.mulewicz@cern.ch -/// \author Leonard Lorenc, WUT Warsaw, leonard.lorenc@cern.ch -/// \author Hubert Zalewski, WUT Warsaw, hubert.zalewski@cern.ch -/// \author Małgorzata Janik malgorzata.janik@cern.ch -/// \author Daniela Ruggiano daniela.ruggiano@cern.ch - -#include "PWGJE/Core/JetBkgSubUtils.h" +#include "PWGJE/Core/JetDerivedDataUtilities.h" #include "PWGJE/Core/JetUtilities.h" #include "PWGJE/DataModel/Jet.h" +#include "PWGJE/DataModel/JetReducedData.h" +#include "PWGJE/DataModel/JetSubtraction.h" #include "Common/Core/RecoDecay.h" #include "Common/Core/TrackSelection.h" @@ -29,22 +12,16 @@ #include "Framework/AnalysisTask.h" #include "Framework/HistogramRegistry.h" -#include "Framework/Logger.h" #include "Framework/runDataProcessing.h" #include "ReconstructionDataFormats/DCA.h" #include "ReconstructionDataFormats/PID.h" #include "ReconstructionDataFormats/Track.h" -#include #include -#include -#include -#include -#include - #include #include +#include #include using namespace o2; @@ -52,8 +29,11 @@ using namespace o2::framework; using namespace o2::aod; using namespace o2::constants::physics; using namespace o2::constants::math; +using namespace o2::framework::expressions; + +using StandardEvents = soa::Join; -using SelectedCollisions = soa::Join; +using JetEvents = soa::Join; using HadronTracks = soa::Join isppRefAnalysis{"isppRefAnalysis", false, "Is ppRef analysis"}; + Configurable eventSelections{"eventSelections", "sel8,vtxITSTPC,noITSROF,noTF,noPileup,goodZvtx", "choose event selection"}; + std::vector eventSelectionBits; + + Configurable isppRefAnalysis{"isppRefAnalysis", true, "Is ppRef analysis"}; Configurable cfgEtaJetMax{"cfgEtaJetMax", 0.5, "max jet eta"}; - Configurable cfgMinPtTrack{"cfgMinPtTrack", 0.1, "minimum pt of tracks for jet reconstruction"}; Configurable rejectITSROFBorder{"rejectITSROFBorder", true, "Reject events near the ITS ROF border"}; Configurable rejectTFBorder{"rejectTFBorder", true, "Reject events near the TF border"}; @@ -81,11 +63,11 @@ struct jetHadronsPid { Configurable requireIsGoodZvtxFT0VsPV{"requireIsGoodZvtxFT0VsPV", true, "Require consistent FT0 vs PV z-vertex"}; Configurable requireIsVertexTOFmatched{"requireIsVertexTOFmatched", false, "Require at least one vertex track matched to TOF"}; - Configurable minJetPt{"minJetPt", 10.0, "Minimum pt of the jet after bkg subtraction"}; + Configurable minJetPt{"minJetPt", 4.0, "Minimum pt of the jet after bkg subtraction"}; Configurable maxJetPt{"maxJetPt", 1e+06, "Maximum pt of the jet after bkg subtraction"}; Configurable rJet{"rJet", 0.4, "Jet resolution parameter R"}; Configurable zVtx{"zVtx", 10.0, "Maximum zVertex"}; - Configurable applyAreaCut{"applyAreaCut", true, "apply area cut"}; + Configurable applyAreaCut{"applyAreaCut", false, "apply area cut"}; Configurable minNormalizedJetArea{"minNormalizedJetArea", 0.6, "Minimum normalized area cut to reject fake jets"}; Configurable deltaEtaEdge{"deltaEtaEdge", 0.05, "eta gap from the edge"}; @@ -105,19 +87,22 @@ struct jetHadronsPid { Configurable setMCDefaultItsParams{"setMCDefaultItsParams", true, "set MC default parameters"}; - JetBkgSubUtils backgroundSub; o2::aod::ITSResponse itsResponse; + Preslice tracksPerCollision = aod::track::collisionId; + void init(InitContext const&) { if (setMCDefaultItsParams) { itsResponse.setMCDefaultParameters(); } + eventSelectionBits = jetderiveddatautilities::initialiseEventSelectionBits(static_cast(eventSelections)); + registryData.add("n_events", "Event counter", HistType::kTH1F, {{1, 0.5, 1.5, "N_{events}"}}); registryData.add("n_events_raw", "All events", HistType::kTH1F, {{1, 0.5, 1.5, ""}}); - registryData.add("jet_pt_raw", "Jet pT raw", HistType::kTH1F, {{200, 0.0, 200.0, "#it{p}_{T}^{raw} (GeV/#it{c})"}}); + registryData.add("jet_pt", "Jet pT ", HistType::kTH1F, {{100, 0.0, 20.0, "#it{p}_{T}^{raw} (GeV/#it{c})"}}); registryData.add("jet_pt_subtracted", "Jet pT subtracted", HistType::kTH1F, {{200, 0.0, 200.0, "#it{p}_{T}^{sub} (GeV/#it{c})"}}); registryData.add("jet_pt_raw_vs_sub", "Raw vs sub jet pT", HistType::kTH2F, {{200, 0, 200}, {200, 0, 200}}); registryData.add("jet_eta", "Jet eta", HistType::kTH1F, {{100, -1.0, 1.0, "#eta_{jet}"}}); @@ -147,8 +132,6 @@ struct jetHadronsPid { registryData.add("proton_pure_dcaxy", "Proton DCAxy", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); registryData.add("z_vtx", "Z-Vertex Distribution", HistType::kTH1F, {{200, -20.0, 20.0, "Z-Vertex (cm)"}}); - registryData.add("tracks_in_jets", "Number of Tracks Inside Jets", HistType::kTH1F, {{100, 0, 100, "N_{tracks}"}}); - registryData.add("tracks_outside_jets", "Number of Tracks Outside Jets", HistType::kTH1F, {{500, 0, 500, "N_{tracks}"}}); registryData.add("pion_jet_tpc", "TPC Pion PID in Jets", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); registryData.add("pion_jet_tof", "TOF Pion PID in Jets", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); @@ -174,85 +157,47 @@ struct jetHadronsPid { registryData.add("pion_ue_tpc", "TPC Pion PID in UE", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); registryData.add("pion_ue_tof", "TOF Pion PID in UE", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); + registryData.add("kaon_ue_tpc", "TPC Kaon PID in UE", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); + registryData.add("kaon_ue_tof", "TOF Kaon PID in UE", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); + registryData.add("proton_ue_tpc", "TPC Proton PID in UE", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); + registryData.add("proton_ue_tof", "TOF Proton PID in UE", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); + registryData.add("pion_ue_pt", "Pion pT in UE", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); registryData.add("pion_ue_eta", "Pion Eta in UE", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); registryData.add("pion_ue_dcaxy", "Pion DCAxy in UE", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); registryData.add("pion_ue_dcaz", "Pion DCAz in UE", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); - registryData.add("kaon_ue_tpc", "TPC Kaon PID in UE", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); - registryData.add("kaon_ue_tof", "TOF Kaon PID in UE", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); registryData.add("kaon_ue_pt", "Kaon pT in UE", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); registryData.add("kaon_ue_eta", "Kaon Eta in UE", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); registryData.add("kaon_ue_dcaxy", "Kaon DCAxy in UE", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); registryData.add("kaon_ue_dcaz", "Kaon DCAz in UE", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); - registryData.add("proton_ue_tpc", "TPC Proton PID in UE", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); - registryData.add("proton_ue_tof", "TOF Proton PID in UE", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); registryData.add("proton_ue_pt", "Proton pT in UE", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); registryData.add("proton_ue_eta", "Proton Eta in UE", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); registryData.add("proton_ue_dcaxy", "Proton DCAxy in UE", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); registryData.add("proton_ue_dcaz", "Proton DCAz in UE", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); - registryData.add("mc_gen_pion_pt", "Generated Pion pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); - registryData.add("mc_rec_pion_pt", "Reconstructed Pion pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); - registryData.add("mc_gen_kaon_pt", "Generated Kaon pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); - registryData.add("mc_rec_kaon_pt", "Reconstructed Kaon pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); - registryData.add("mc_gen_proton_pt", "Generated Proton pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); - registryData.add("mc_rec_proton_pt", "Reconstructed Proton pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); - - registryData.add("rec_pion_all", "All identified pions", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T}"}}); - registryData.add("rec_kaon_all", "All identified kaons", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T}"}}); - registryData.add("rec_proton_all", "All identified protons", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T}"}}); - registryData.add("contamination_matrix_pion", "Pion Contamination Matrix;True absolute PDG;Rec #it{p}_{T} (GeV/#it{c})", HistType::kTH2F, {{3000, -0.5, 2999.5}, {120, 0.0, 4.0}}); - registryData.add("contamination_matrix_kaon", "Kaon Contamination Matrix;True absolute PDG;Rec #it{p}_{T} (GeV/#it{c})", HistType::kTH2F, {{3000, -0.5, 2999.5}, {120, 0.0, 4.0}}); - registryData.add("contamination_matrix_proton", "Proton Contamination Matrix;True absolute PDG;Rec #it{p}_{T} (GeV/#it{c})", HistType::kTH2F, {{3000, -0.5, 2999.5}, {120, 0.0, 4.0}}); - - registryData.add("mc_sec_pion_pt", "Reconstructed Pion Secondaries", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); - registryData.add("mc_sec_kaon_pt", "Reconstructed Kaon Secondaries", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); - registryData.add("mc_sec_proton_pt", "Reconstructed Proton Secondaries", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); - } + registryData.add("tracks_n_in_ue", "Number of tracks in UE", HistType::kTH1I, {{100, 0, 100, "N_{tracks}"}}); + + registryData.add("rec_pion_all", "All Tracks PID'd as Pions", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc_rec_pion_pt", "True Primary Pions (Reconstructed)", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc_sec_pion_pt", "Secondary Pions (Reconstructed)", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("contamination_matrix_pion", "Pion PID Contamination", HistType::kTH2F, {{4000, -0.5, 3999.5, "Absolute PDG Code"}, {120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); - // void getPerpendicularDirections(const TVector3& p, TVector3& u1, TVector3& u2) - // { - // double px = p.X(), py = p.Y(), pz = p.Z(); - // double px2 = px * px, py2 = py * py, pz2 = pz * pz; - // double pz4 = pz2 * pz2; - - // if (px == 0 && py == 0) { - // u1.SetXYZ(0, 0, 0); - // u2.SetXYZ(0, 0, 0); - // return; - // } - // if (px == 0 && py != 0) { - // double ux = std::sqrt(py2 - pz4 / py2); - // double uy = -pz2 / py; - // u1.SetXYZ(ux, uy, pz); - // u2.SetXYZ(-ux, uy, pz); - // return; - // } - // if (py == 0 && px != 0) { - // double ux = -pz2 / px; - // double uy = std::sqrt(px2 - pz4 / px2); - // u1.SetXYZ(ux, uy, pz); - // u2.SetXYZ(ux, -uy, pz); - // return; - // } - - // double a = px2 + py2; - // double b = 2.0 * px * pz2; - // double c = pz4 - py2 * py2 - px2 * py2; - // double delta = b * b - 4.0 * a * c; - - // if (delta < 0 || a == 0) { - // u1.SetXYZ(0, 0, 0); - // u2.SetXYZ(0, 0, 0); - // return; - // } - // double u1x = (-b + std::sqrt(delta)) / (2.0 * a); - // u1.SetXYZ(u1x, (-pz2 - px * u1x) / py, pz); - // double u2x = (-b - std::sqrt(delta)) / (2.0 * a); - // u2.SetXYZ(u2x, (-pz2 - px * u2x) / py, pz); - // } + registryData.add("rec_kaon_all", "All Tracks PID'd as Kaons", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc_rec_kaon_pt", "True Primary Kaons (Reconstructed)", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc_sec_kaon_pt", "Secondary Kaons (Reconstructed)", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("contamination_matrix_kaon", "Kaon PID Contamination", HistType::kTH2F, {{4000, -0.5, 3999.5, "Absolute PDG Code"}, {120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + + registryData.add("rec_proton_all", "All Tracks PID'd as Protons", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc_rec_proton_pt", "True Primary Protons (Reconstructed)", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc_sec_proton_pt", "Secondary Protons (Reconstructed)", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("contamination_matrix_proton", "Proton PID Contamination", HistType::kTH2F, {{4000, -0.5, 3999.5, "Absolute PDG Code"}, {120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + + registryData.add("mc_gen_pion_pt", "Generated Primary Pions (Truth)", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc_gen_kaon_pt", "Generated Primary Kaons (Truth)", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc_gen_proton_pt", "Generated Primary Protons (Truth)", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + } void getPerpendicularDirections(const TVector3& p, TVector3& u1, TVector3& u2) { @@ -272,38 +217,6 @@ struct jetHadronsPid { return (track.itsClusterMap() & (1 << ibit)) != 0; } - template - bool passedTrackSelectionForJetReconstruction(const JetTrack& track) - { - static constexpr int MinTpcCr = 70; - static constexpr double MaxChi2Tpc = 4.0; - static constexpr double MaxChi2Its = 36.0; - static constexpr double DcaxyMaxTrackPar0 = 0.0105; - static constexpr double DcaxyMaxTrackPar1 = 0.035; - static constexpr double DcaxyMaxTrackPar2 = 1.1; - static constexpr double DcazMaxTrack = 2.0; - - if (!track.hasITS() || !track.hasTPC()) - return false; - if ((!hasITSLayerHit(track, 1)) && (!hasITSLayerHit(track, 2)) && (!hasITSLayerHit(track, 3))) - return false; - if (track.tpcNClsCrossedRows() < MinTpcCr) - return false; - if (track.tpcChi2NCl() > MaxChi2Tpc) - return false; - if (track.itsChi2NCl() > MaxChi2Its) - return false; - if (std::abs(track.eta()) > maxEta) - return false; - if (track.pt() < cfgMinPtTrack) - return false; - if (std::abs(track.dcaXY()) > (DcaxyMaxTrackPar0 + DcaxyMaxTrackPar1 / std::pow(track.pt(), DcaxyMaxTrackPar2))) - return false; - if (std::abs(track.dcaZ()) > DcazMaxTrack) - return false; - return true; - } - template bool passedTrackSelection(const PionTrack& track) { @@ -328,10 +241,8 @@ struct jetHadronsPid { return true; } - void processForJets(SelectedCollisions::iterator const& collision, HadronTracks const& tracks) + void processPureTracks(StandardEvents::iterator const& collision, HadronTracks const& globalTracks) { - registryData.fill(HIST("n_events_raw"), 1); - if (!collision.sel8() || std::abs(collision.posZ()) > zVtx) return; if (rejectITSROFBorder && !collision.selection_bit(o2::aod::evsel::kNoITSROFrameBorder)) @@ -347,10 +258,7 @@ struct jetHadronsPid { if (requireIsVertexTOFmatched && !collision.selection_bit(o2::aod::evsel::kIsVertexTOFmatched)) return; - registryData.fill(HIST("n_events"), 1); - registryData.fill(HIST("z_vtx"), collision.posZ()); - - for (auto const& track : tracks) { + for (auto const& track : globalTracks) { if (!passedTrackSelection(track)) continue; if (std::abs(track.dcaXY()) > maxDcaxy || std::abs(track.dcaZ()) > maxDcaz) @@ -373,11 +281,8 @@ struct jetHadronsPid { if (passTpcPi) { registryData.fill(HIST("pion_pure_tpc"), pt, track.tpcNSigmaPi()); - - if (passTofPi) { + if (passTofPi) registryData.fill(HIST("pion_pure_tof"), pt, track.tofNSigmaPi()); - } - if (pt < ptThreshold || passTofPi) { registryData.fill(HIST("pion_pure_pt"), pt); registryData.fill(HIST("pion_pure_eta"), eta); @@ -388,11 +293,8 @@ struct jetHadronsPid { if (passTpcKa) { registryData.fill(HIST("kaon_pure_tpc"), pt, track.tpcNSigmaKa()); - - if (passTofKa) { + if (passTofKa) registryData.fill(HIST("kaon_pure_tof"), pt, track.tofNSigmaKa()); - } - if (pt < ptThreshold || passTofKa) { registryData.fill(HIST("kaon_pure_pt"), pt); registryData.fill(HIST("kaon_pure_eta"), eta); @@ -403,11 +305,8 @@ struct jetHadronsPid { if (passTpcPr) { registryData.fill(HIST("proton_pure_tpc"), pt, track.tpcNSigmaPr()); - - if (passTofPr) { + if (passTofPr) registryData.fill(HIST("proton_pure_tof"), pt, track.tofNSigmaPr()); - } - if (pt < ptThreshold || passTofPr) { registryData.fill(HIST("proton_pure_pt"), pt); registryData.fill(HIST("proton_pure_eta"), eta); @@ -416,77 +315,73 @@ struct jetHadronsPid { } } } + } + PROCESS_SWITCH(jetHadronsPid, processPureTracks, "Pure Tracks Analysis", true); - // int id(-1); - std::vector fjParticles; - for (auto const& track : tracks) { - // id++; - if (!passedTrackSelectionForJetReconstruction(track)) - continue; + void processJets(JetEvents::iterator const& collision, + soa::Join const& jets, + soa::Join const&, + HadronTracks const& globalTracks) + { + registryData.fill(HIST("n_events_raw"), 1); - fastjet::PseudoJet fourMomentum(track.px(), track.py(), track.pz(), track.energy(MassPionCharged)); - fourMomentum.set_user_index(track.index()); - fjParticles.emplace_back(fourMomentum); + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { + return; } - if (fjParticles.empty()) + float zVertex = collision.posZ(); + if (std::abs(zVertex) > zVtx) return; - fastjet::JetDefinition jetDef(fastjet::antikt_algorithm, rJet); - fastjet::AreaDefinition areaDef(fastjet::active_area, fastjet::GhostedAreaSpec(1.0)); - fastjet::ClusterSequenceArea cs(fjParticles, jetDef, areaDef); - std::vector jets = fastjet::sorted_by_pt(cs.inclusive_jets()); + registryData.fill(HIST("n_events"), 1); + registryData.fill(HIST("z_vtx"), zVertex); - if (jets.empty()) - return; + double centralRho = collision.rho(); - auto [rhoPerp, rhoMPerp] = jetutilities::estimateRhoPerpCone(fjParticles, jets[0], rJet); + int baseCollId = collision.collisionId(); - std::set tracksInJetsSet; + auto collTracks = globalTracks.sliceBy(tracksPerCollision, baseCollId); - for (const auto& jet : jets) { - registryData.fill(HIST("jet_pt_raw"), jet.pt()); - registryData.fill(HIST("jet_eta"), jet.eta()); - registryData.fill(HIST("jet_phi"), jet.phi()); - registryData.fill(HIST("jet_area"), jet.area()); - registryData.fill(HIST("jet_n_constituents"), jet.constituents().size()); + for (auto& jet : jets) { if (!isppRefAnalysis && ((std::abs(jet.eta()) + rJet) > (maxEta - deltaEtaEdge))) continue; if (isppRefAnalysis && std::abs(jet.eta()) > cfgEtaJetMax) continue; - auto jetForSub = jet; - fastjet::PseudoJet jetMinusBkg = backgroundSub.doRhoAreaSub(jetForSub, rhoPerp, rhoMPerp); - registryData.fill(HIST("jet_pt_subtracted"), jetMinusBkg.pt()); - registryData.fill(HIST("jet_pt_raw_vs_sub"), jet.pt(), jetMinusBkg.pt()); + double ptSub = jet.pt() - (centralRho * jet.area()); + if (ptSub < 0) + ptSub = 0.0; + + registryData.fill(HIST("jet_pt_subtracted"), ptSub); + registryData.fill(HIST("jet_pt_raw_vs_sub"), jet.pt(), ptSub); if (isppRefAnalysis && (jet.pt() < minJetPt || jet.pt() > maxJetPt)) continue; - if (!isppRefAnalysis && (jetMinusBkg.pt() < minJetPt || jetMinusBkg.pt() > maxJetPt)) + if (!isppRefAnalysis && (ptSub < minJetPt || ptSub > maxJetPt)) continue; double normalizedJetArea = jet.area() / (PI * rJet * rJet); - if (applyAreaCut && normalizedJetArea < minNormalizedJetArea) { + if (applyAreaCut && normalizedJetArea < minNormalizedJetArea) continue; - } - double coneRadius = std::sqrt(jet.area() / PI); + registryData.fill(HIST("jet_eta"), jet.eta()); + registryData.fill(HIST("jet_phi"), jet.phi()); + registryData.fill(HIST("jet_area"), jet.area()); + registryData.fill(HIST("jet_pt"), jet.pt()); + TVector3 jetAxis(jet.px(), jet.py(), jet.pz()); TVector3 ueAxis1(0, 0, 0), ueAxis2(0, 0, 0); getPerpendicularDirections(jetAxis, ueAxis1, ueAxis2); - if (ueAxis1.Mag() == 0 || ueAxis2.Mag() == 0) - continue; - - std::vector jetConstituents = jet.constituents(); + int constituentCount = 0; + std::set tracksInJetsSet; - for (const auto& particle : jetConstituents) { + for (auto& jtrack : jet.tracks_as>()) { + constituentCount++; - int trackIdx = particle.user_index(); - auto const& track = tracks.iteratorAt(trackIdx); - - tracksInJetsSet.insert(trackIdx); + auto track = jtrack.track_as(); + tracksInJetsSet.insert(track.index()); if (!passedTrackSelection(track)) continue; @@ -510,11 +405,8 @@ struct jetHadronsPid { if (passTpcPi) { registryData.fill(HIST("pion_jet_tpc"), pt, track.tpcNSigmaPi()); - - if (passTofPi) { + if (passTofPi) registryData.fill(HIST("pion_jet_tof"), pt, track.tofNSigmaPi()); - } - if (pt < ptThreshold || passTofPi) { registryData.fill(HIST("pion_jet_pt"), pt); registryData.fill(HIST("pion_jet_eta"), eta); @@ -525,11 +417,8 @@ struct jetHadronsPid { if (passTpcKa) { registryData.fill(HIST("kaon_jet_tpc"), pt, track.tpcNSigmaKa()); - - if (passTofKa) { + if (passTofKa) registryData.fill(HIST("kaon_jet_tof"), pt, track.tofNSigmaKa()); - } - if (pt < ptThreshold || passTofKa) { registryData.fill(HIST("kaon_jet_pt"), pt); registryData.fill(HIST("kaon_jet_eta"), eta); @@ -540,11 +429,8 @@ struct jetHadronsPid { if (passTpcPr) { registryData.fill(HIST("proton_jet_tpc"), pt, track.tpcNSigmaPr()); - - if (passTofPr) { + if (passTofPr) registryData.fill(HIST("proton_jet_tof"), pt, track.tofNSigmaPr()); - } - if (pt < ptThreshold || passTofPr) { registryData.fill(HIST("proton_jet_pt"), pt); registryData.fill(HIST("proton_jet_eta"), eta); @@ -553,8 +439,19 @@ struct jetHadronsPid { } } } + registryData.fill(HIST("jet_n_constituents"), constituentCount); + + if (ueAxis1.Mag() == 0 || ueAxis2.Mag() == 0) + continue; - for (auto const& track : tracks) { + int nTracksOut = 0; + + for (auto const& track : collTracks) { + + if (tracksInJetsSet.find(track.index()) == tracksInJetsSet.end()) { + if (passedTrackSelection(track)) + nTracksOut++; + } if (!passedTrackSelection(track)) continue; @@ -569,9 +466,7 @@ struct jetHadronsPid { double deltaPhiUe2 = std::abs(RecoDecay::constrainAngle(track.phi() - ueAxis2.Phi())); double deltaRUe2 = std::sqrt(deltaEtaUe2 * deltaEtaUe2 + deltaPhiUe2 * deltaPhiUe2); - double maxConeRadius = rJet; - - if (deltaRUe1 > maxConeRadius && deltaRUe2 > maxConeRadius) + if (deltaRUe1 > rJet && deltaRUe2 > rJet) continue; double pt = track.pt(); @@ -591,9 +486,8 @@ struct jetHadronsPid { if (passTpcPi) { registryData.fill(HIST("pion_ue_tpc"), pt, track.tpcNSigmaPi()); - if (passTofPi) { + if (passTofPi) registryData.fill(HIST("pion_ue_tof"), pt, track.tofNSigmaPi()); - } if (pt < ptThreshold || passTofPi) { registryData.fill(HIST("pion_ue_pt"), pt); registryData.fill(HIST("pion_ue_eta"), eta); @@ -604,9 +498,8 @@ struct jetHadronsPid { if (passTpcKa) { registryData.fill(HIST("kaon_ue_tpc"), pt, track.tpcNSigmaKa()); - if (passTofKa) { + if (passTofKa) registryData.fill(HIST("kaon_ue_tof"), pt, track.tofNSigmaKa()); - } if (pt < ptThreshold || passTofKa) { registryData.fill(HIST("kaon_ue_pt"), pt); registryData.fill(HIST("kaon_ue_eta"), eta); @@ -617,9 +510,8 @@ struct jetHadronsPid { if (passTpcPr) { registryData.fill(HIST("proton_ue_tpc"), pt, track.tpcNSigmaPr()); - if (passTofPr) { + if (passTofPr) registryData.fill(HIST("proton_ue_tof"), pt, track.tofNSigmaPr()); - } if (pt < ptThreshold || passTofPr) { registryData.fill(HIST("proton_ue_pt"), pt); registryData.fill(HIST("proton_ue_eta"), eta); @@ -628,24 +520,12 @@ struct jetHadronsPid { } } } + registryData.fill(HIST("tracks_n_in_ue"), nTracksOut); } - - registryData.fill(HIST("tracks_in_jets"), tracksInJetsSet.size()); - - int nTracksOut = 0; - int trackIteratorIdx = 0; - for (auto const& track : tracks) { - if (passedTrackSelection(track) && tracksInJetsSet.find(trackIteratorIdx) == tracksInJetsSet.end()) { - nTracksOut++; - } - trackIteratorIdx++; - } - registryData.fill(HIST("tracks_outside_jets"), nTracksOut); } + PROCESS_SWITCH(jetHadronsPid, processJets, "Jets Analysis", true); - PROCESS_SWITCH(jetHadronsPid, processForJets, "Pid Analysis in and outside jets", true); - - void processMC(SelectedCollisions::iterator const& collision, HadronTracksMC const& tracks) + void processMC(StandardEvents::iterator const& collision, HadronTracksMC const& tracks, aod::McParticles const&) { if (!collision.sel8() || std::abs(collision.posZ()) > zVtx) return; @@ -665,6 +545,7 @@ struct jetHadronsPid { const double ptThreshold = 0.8; for (auto const& track : tracks) { + if (!passedTrackSelection(track)) continue; if (std::abs(track.dcaXY()) > maxDcaxy || std::abs(track.dcaZ()) > maxDcaz) @@ -723,15 +604,20 @@ struct jetHadronsPid { } } PROCESS_SWITCH(jetHadronsPid, processMC, "Run on Monte Carlo", false); + void processMCTruth(aod::McCollisions::iterator const& mcCollision, aod::McParticles const& mcParticles) { if (std::abs(mcCollision.posZ()) > zVtx) return; for (auto const& mcpart : mcParticles) { + if (!mcpart.isPhysicalPrimary()) continue; - if (std::abs(mcpart.eta()) > maxEta) + + if (mcpart.eta() < minEta || mcpart.eta() > maxEta) + continue; + if (mcpart.pt() < minPt || mcpart.pt() > maxPt) continue; int pdg = std::abs(mcpart.pdgCode()); From 9efadeb9f19177b00edd8a15a7ddcb8ba8e87a7d Mon Sep 17 00:00:00 2001 From: Leonard Date: Sun, 10 May 2026 14:54:47 +0200 Subject: [PATCH 13/35] Adding copyright notice and listing authors in jetHadronsPid.cxx --- PWGJE/Tasks/jetHadronsPid.cxx | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/PWGJE/Tasks/jetHadronsPid.cxx b/PWGJE/Tasks/jetHadronsPid.cxx index 09778bf88a1..61f1a3e564f 100644 --- a/PWGJE/Tasks/jetHadronsPid.cxx +++ b/PWGJE/Tasks/jetHadronsPid.cxx @@ -1,3 +1,22 @@ +// Copyright 2019-2026 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file jetHadronsPID.cxx +/// \brief Analysis of hadrons in jets +/// \author Leonard Lorenc, WUT Warsaw, leonard.lorenc@cern.ch +/// \author Aleksandra Mulewicz, WUT Warsaw, aleksandra.mulewicz@cern.ch +/// \author Hubert Zalewski, WUT Warsaw, hubert.zalewski@cern.ch +/// \author Janik Małgorzata malgorzata.janik@cern.ch +/// \author Daniela Ruggiano daniela.ruggiano@cern.ch + #include "PWGJE/Core/JetDerivedDataUtilities.h" #include "PWGJE/Core/JetUtilities.h" #include "PWGJE/DataModel/Jet.h" From 09c013db874719be1dc7c95f8f94b67eb6932600 Mon Sep 17 00:00:00 2001 From: Leonard Date: Sun, 10 May 2026 14:58:46 +0200 Subject: [PATCH 14/35] Clang-format for jetHadronsPid.cxx --- PWGJE/Tasks/jetHadronsPid.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGJE/Tasks/jetHadronsPid.cxx b/PWGJE/Tasks/jetHadronsPid.cxx index 61f1a3e564f..3f3917b6575 100644 --- a/PWGJE/Tasks/jetHadronsPid.cxx +++ b/PWGJE/Tasks/jetHadronsPid.cxx @@ -10,7 +10,7 @@ // or submit itself to any jurisdiction. /// \file jetHadronsPID.cxx -/// \brief Analysis of hadrons in jets +/// \brief Analysis of hadrons in jets /// \author Leonard Lorenc, WUT Warsaw, leonard.lorenc@cern.ch /// \author Aleksandra Mulewicz, WUT Warsaw, aleksandra.mulewicz@cern.ch /// \author Hubert Zalewski, WUT Warsaw, hubert.zalewski@cern.ch From 9132d32d0c196d51e6bfa0805e1d8b79eac9b856 Mon Sep 17 00:00:00 2001 From: Leonard Date: Mon, 18 May 2026 12:30:45 +0200 Subject: [PATCH 15/35] Changing constants and formating in jetHadronsPid.cxx --- PWGJE/Tasks/jetHadronsPid.cxx | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/PWGJE/Tasks/jetHadronsPid.cxx b/PWGJE/Tasks/jetHadronsPid.cxx index 3f3917b6575..43638f59896 100644 --- a/PWGJE/Tasks/jetHadronsPid.cxx +++ b/PWGJE/Tasks/jetHadronsPid.cxx @@ -36,6 +36,7 @@ #include "ReconstructionDataFormats/PID.h" #include "ReconstructionDataFormats/Track.h" +#include #include #include @@ -361,7 +362,7 @@ struct jetHadronsPid { auto collTracks = globalTracks.sliceBy(tracksPerCollision, baseCollId); - for (auto& jet : jets) { + for (auto const& jet : jets) { if (!isppRefAnalysis && ((std::abs(jet.eta()) + rJet) > (maxEta - deltaEtaEdge))) continue; @@ -396,7 +397,7 @@ struct jetHadronsPid { int constituentCount = 0; std::set tracksInJetsSet; - for (auto& jtrack : jet.tracks_as>()) { + for (auto const& jtrack : jet.tracks_as>()) { constituentCount++; auto track = jtrack.track_as(); @@ -592,7 +593,7 @@ struct jetHadronsPid { registryData.fill(HIST("rec_pion_all"), pt); registryData.fill(HIST("contamination_matrix_pion"), pdg, pt); if (isPrimary) { - if (pdg == 211) + if (pdg == PDG_t::kPiPlus) registryData.fill(HIST("mc_rec_pion_pt"), pt); } else { registryData.fill(HIST("mc_sec_pion_pt"), pt); @@ -603,7 +604,7 @@ struct jetHadronsPid { registryData.fill(HIST("rec_kaon_all"), pt); registryData.fill(HIST("contamination_matrix_kaon"), pdg, pt); if (isPrimary) { - if (pdg == 321) + if (pdg == PDG_t::kKPlus) registryData.fill(HIST("mc_rec_kaon_pt"), pt); } else { registryData.fill(HIST("mc_sec_kaon_pt"), pt); @@ -614,7 +615,7 @@ struct jetHadronsPid { registryData.fill(HIST("rec_proton_all"), pt); registryData.fill(HIST("contamination_matrix_proton"), pdg, pt); if (isPrimary) { - if (pdg == 2212) + if (pdg == PDG_t::kProton) registryData.fill(HIST("mc_rec_proton_pt"), pt); } else { registryData.fill(HIST("mc_sec_proton_pt"), pt); @@ -642,11 +643,11 @@ struct jetHadronsPid { int pdg = std::abs(mcpart.pdgCode()); double pt = mcpart.pt(); - if (pdg == 211) { + if (pdg == PDG_t::kPiPlus) { registryData.fill(HIST("mc_gen_pion_pt"), pt); - } else if (pdg == 321) { + } else if (pdg == PDG_t::kKPlus) { registryData.fill(HIST("mc_gen_kaon_pt"), pt); - } else if (pdg == 2212) { + } else if (pdg == PDG_t::kProton) { registryData.fill(HIST("mc_gen_proton_pt"), pt); } } From 464cad35b1c6b233544d90a80c95bb6674fb03d8 Mon Sep 17 00:00:00 2001 From: Leonard Date: Wed, 20 May 2026 22:41:11 +0200 Subject: [PATCH 16/35] Format changes and code logic fixes in jetHadronsPid.cxx --- PWGJE/Tasks/jetHadronsPid.cxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PWGJE/Tasks/jetHadronsPid.cxx b/PWGJE/Tasks/jetHadronsPid.cxx index 43638f59896..642803e1ed8 100644 --- a/PWGJE/Tasks/jetHadronsPid.cxx +++ b/PWGJE/Tasks/jetHadronsPid.cxx @@ -479,11 +479,11 @@ struct jetHadronsPid { continue; double deltaEtaUe1 = track.eta() - ueAxis1.Eta(); - double deltaPhiUe1 = std::abs(RecoDecay::constrainAngle(track.phi() - ueAxis1.Phi())); + double deltaPhiUe1 = RecoDecay::constrainAngle(track.phi() - ueAxis1.Phi(), -PI); double deltaRUe1 = std::sqrt(deltaEtaUe1 * deltaEtaUe1 + deltaPhiUe1 * deltaPhiUe1); double deltaEtaUe2 = track.eta() - ueAxis2.Eta(); - double deltaPhiUe2 = std::abs(RecoDecay::constrainAngle(track.phi() - ueAxis2.Phi())); + double deltaPhiUe2 = RecoDecay::constrainAngle(track.phi() - ueAxis2.Phi(), -PI); double deltaRUe2 = std::sqrt(deltaEtaUe2 * deltaEtaUe2 + deltaPhiUe2 * deltaPhiUe2); if (deltaRUe1 > rJet && deltaRUe2 > rJet) From 2154b123059be8c80c57623313f09f91db916baa Mon Sep 17 00:00:00 2001 From: Leonard Date: Wed, 20 May 2026 23:26:39 +0200 Subject: [PATCH 17/35] fixing formats in includes --- PWGJE/Tasks/jetHadronsPid.cxx | 1 + 1 file changed, 1 insertion(+) diff --git a/PWGJE/Tasks/jetHadronsPid.cxx b/PWGJE/Tasks/jetHadronsPid.cxx index 642803e1ed8..97280353594 100644 --- a/PWGJE/Tasks/jetHadronsPid.cxx +++ b/PWGJE/Tasks/jetHadronsPid.cxx @@ -32,6 +32,7 @@ #include "Framework/AnalysisTask.h" #include "Framework/HistogramRegistry.h" #include "Framework/runDataProcessing.h" + #include "ReconstructionDataFormats/DCA.h" #include "ReconstructionDataFormats/PID.h" #include "ReconstructionDataFormats/Track.h" From cbc2be69f88375e63dee66296d3c1750c1528b69 Mon Sep 17 00:00:00 2001 From: Leonard Date: Thu, 21 May 2026 19:30:32 +0200 Subject: [PATCH 18/35] Changing format of includes in jetHadronsPid.cxx --- PWGJE/Tasks/jetHadronsPid.cxx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/PWGJE/Tasks/jetHadronsPid.cxx b/PWGJE/Tasks/jetHadronsPid.cxx index 97280353594..f39b66a16d4 100644 --- a/PWGJE/Tasks/jetHadronsPid.cxx +++ b/PWGJE/Tasks/jetHadronsPid.cxx @@ -33,9 +33,9 @@ #include "Framework/HistogramRegistry.h" #include "Framework/runDataProcessing.h" -#include "ReconstructionDataFormats/DCA.h" -#include "ReconstructionDataFormats/PID.h" -#include "ReconstructionDataFormats/Track.h" +#include +#include +#include #include #include From 94f2316c36caec791043fa002aadb408e26642f1 Mon Sep 17 00:00:00 2001 From: Leonard Date: Thu, 21 May 2026 19:39:44 +0200 Subject: [PATCH 19/35] fixing clang-format in jetHadronsPid.cxx --- PWGJE/Tasks/jetHadronsPid.cxx | 1 - 1 file changed, 1 deletion(-) diff --git a/PWGJE/Tasks/jetHadronsPid.cxx b/PWGJE/Tasks/jetHadronsPid.cxx index f39b66a16d4..54c918d60a9 100644 --- a/PWGJE/Tasks/jetHadronsPid.cxx +++ b/PWGJE/Tasks/jetHadronsPid.cxx @@ -32,7 +32,6 @@ #include "Framework/AnalysisTask.h" #include "Framework/HistogramRegistry.h" #include "Framework/runDataProcessing.h" - #include #include #include From 8051cfb3055493a0b48297086c7dc9b08f0062a1 Mon Sep 17 00:00:00 2001 From: Leonard Lorenc <107263905+llorenc-11@users.noreply.github.com> Date: Mon, 25 May 2026 10:21:05 +0200 Subject: [PATCH 20/35] Fix file name in description and add threshold variable in jetHadronsPid.cxx --- PWGJE/Tasks/jetHadronsPid.cxx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/PWGJE/Tasks/jetHadronsPid.cxx b/PWGJE/Tasks/jetHadronsPid.cxx index 54c918d60a9..dcb132add94 100644 --- a/PWGJE/Tasks/jetHadronsPid.cxx +++ b/PWGJE/Tasks/jetHadronsPid.cxx @@ -9,7 +9,7 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. -/// \file jetHadronsPID.cxx +/// \file jetHadronsPid.cxx /// \brief Analysis of hadrons in jets /// \author Leonard Lorenc, WUT Warsaw, leonard.lorenc@cern.ch /// \author Aleksandra Mulewicz, WUT Warsaw, aleksandra.mulewicz@cern.ch @@ -221,7 +221,8 @@ struct jetHadronsPid { void getPerpendicularDirections(const TVector3& p, TVector3& u1, TVector3& u2) { - if (p.Mag2() < 1e-9) { + double const treshold = 1e-9; + if (p.Mag2() < treshold) { u1.SetXYZ(0, 0, 0); u2.SetXYZ(0, 0, 0); return; From 62d332fada894da6380cafc1e99966aaa97bb37e Mon Sep 17 00:00:00 2001 From: Leonard Lorenc <107263905+llorenc-11@users.noreply.github.com> Date: Thu, 28 May 2026 18:59:11 +0200 Subject: [PATCH 21/35] Fix include statements in jetHadronsPid.cxx --- PWGJE/Tasks/jetHadronsPid.cxx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/PWGJE/Tasks/jetHadronsPid.cxx b/PWGJE/Tasks/jetHadronsPid.cxx index dcb132add94..016c880313b 100644 --- a/PWGJE/Tasks/jetHadronsPid.cxx +++ b/PWGJE/Tasks/jetHadronsPid.cxx @@ -29,9 +29,9 @@ #include "Common/DataModel/PIDResponseITS.h" #include "Common/DataModel/TrackSelectionTables.h" -#include "Framework/AnalysisTask.h" -#include "Framework/HistogramRegistry.h" -#include "Framework/runDataProcessing.h" +#include +#include +#include #include #include #include From be3d6692cb9599757477df800053af60281c3337 Mon Sep 17 00:00:00 2001 From: Leonard Date: Thu, 4 Jun 2026 10:46:28 +0200 Subject: [PATCH 22/35] Fixing magnitude problems in UE and ITS template function in JetHadronsPid.cxx --- PWGJE/Tasks/jetHadronsPid.cxx | 34 ++++++++++++++-------------------- 1 file changed, 14 insertions(+), 20 deletions(-) diff --git a/PWGJE/Tasks/jetHadronsPid.cxx b/PWGJE/Tasks/jetHadronsPid.cxx index 016c880313b..e02d2fa135f 100644 --- a/PWGJE/Tasks/jetHadronsPid.cxx +++ b/PWGJE/Tasks/jetHadronsPid.cxx @@ -39,6 +39,8 @@ #include #include +#include + #include #include #include @@ -123,12 +125,12 @@ struct jetHadronsPid { registryData.add("n_events_raw", "All events", HistType::kTH1F, {{1, 0.5, 1.5, ""}}); registryData.add("jet_pt", "Jet pT ", HistType::kTH1F, {{100, 0.0, 20.0, "#it{p}_{T}^{raw} (GeV/#it{c})"}}); - registryData.add("jet_pt_subtracted", "Jet pT subtracted", HistType::kTH1F, {{200, 0.0, 200.0, "#it{p}_{T}^{sub} (GeV/#it{c})"}}); + registryData.add("jet_pt_subtracted", "Jet pT subtracted", HistType::kTH1F, {{200, 0.0, 10.0, "#it{p}_{T}^{sub} (GeV/#it{c})"}}); registryData.add("jet_pt_raw_vs_sub", "Raw vs sub jet pT", HistType::kTH2F, {{200, 0, 200}, {200, 0, 200}}); registryData.add("jet_eta", "Jet eta", HistType::kTH1F, {{100, -1.0, 1.0, "#eta_{jet}"}}); registryData.add("jet_phi", "Jet phi", HistType::kTH1F, {{100, 0.0, TwoPI, "#phi_{jet}"}}); registryData.add("jet_area", "Jet area", HistType::kTH1F, {{100, 0.0, 1.5, "Area"}}); - registryData.add("jet_n_constituents", "Jet multiplicity", HistType::kTH1I, {{100, 0, 100, "N_{constituents}"}}); + registryData.add("jet_n_constituents", "Jet multiplicity", HistType::kTH1I, {{100, 0, 30, "N_{constituents}"}}); registryData.add("pion_pure_tpc", "TPC Pion PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); registryData.add("pion_pure_tof", "TOF Pion PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); @@ -234,12 +236,11 @@ struct jetHadronsPid { template bool hasITSLayerHit(const TrackIts& track, int layer) { - int ibit = layer - 1; - return (track.itsClusterMap() & (1 << ibit)) != 0; + return TESTBIT(track.itsClusterMap(), layer - 1); } - template - bool passedTrackSelection(const PionTrack& track) + template + bool passedTrackSelection(const TrackType& track) { if (requirePvContributor && !(track.isPVContributor())) return false; @@ -259,6 +260,8 @@ struct jetHadronsPid { return false; if (track.pt() < minPt || track.pt() > maxPt) return false; + if (std::abs(track.dcaXY()) > maxDcaxy || std::abs(track.dcaZ()) > maxDcaz) + return false; return true; } @@ -282,8 +285,6 @@ struct jetHadronsPid { for (auto const& track : globalTracks) { if (!passedTrackSelection(track)) continue; - if (std::abs(track.dcaXY()) > maxDcaxy || std::abs(track.dcaZ()) > maxDcaz) - continue; double pt = track.pt(); double eta = track.eta(); @@ -359,9 +360,7 @@ struct jetHadronsPid { double centralRho = collision.rho(); - int baseCollId = collision.collisionId(); - - auto collTracks = globalTracks.sliceBy(tracksPerCollision, baseCollId); + auto collTracks = globalTracks.sliceBy(tracksPerCollision, collision.collisionId()); for (auto const& jet : jets) { @@ -391,10 +390,14 @@ struct jetHadronsPid { registryData.fill(HIST("jet_area"), jet.area()); registryData.fill(HIST("jet_pt"), jet.pt()); + const double MagnitudeThreshold = 1e-9; TVector3 jetAxis(jet.px(), jet.py(), jet.pz()); TVector3 ueAxis1(0, 0, 0), ueAxis2(0, 0, 0); getPerpendicularDirections(jetAxis, ueAxis1, ueAxis2); + if (ueAxis1.Mag() < MagnitudeThreshold || ueAxis2.Mag() < MagnitudeThreshold) + continue; + int constituentCount = 0; std::set tracksInJetsSet; @@ -406,8 +409,6 @@ struct jetHadronsPid { if (!passedTrackSelection(track)) continue; - if (std::abs(track.dcaXY()) > maxDcaxy || std::abs(track.dcaZ()) > maxDcaz) - continue; double pt = track.pt(); double eta = track.eta(); @@ -462,9 +463,6 @@ struct jetHadronsPid { } registryData.fill(HIST("jet_n_constituents"), constituentCount); - if (ueAxis1.Mag() == 0 || ueAxis2.Mag() == 0) - continue; - int nTracksOut = 0; for (auto const& track : collTracks) { @@ -476,8 +474,6 @@ struct jetHadronsPid { if (!passedTrackSelection(track)) continue; - if (std::abs(track.dcaXY()) > maxDcaxy || std::abs(track.dcaZ()) > maxDcaz) - continue; double deltaEtaUe1 = track.eta() - ueAxis1.Eta(); double deltaPhiUe1 = RecoDecay::constrainAngle(track.phi() - ueAxis1.Phi(), -PI); @@ -569,8 +565,6 @@ struct jetHadronsPid { if (!passedTrackSelection(track)) continue; - if (std::abs(track.dcaXY()) > maxDcaxy || std::abs(track.dcaZ()) > maxDcaz) - continue; double pt = track.pt(); From 25369d2a2e1bea3f55cb8c1e9cac9a6b7fd14761 Mon Sep 17 00:00:00 2001 From: Leonard Date: Thu, 4 Jun 2026 13:48:47 +0200 Subject: [PATCH 23/35] Changing megalinter.yml to the newest version and renaming file jetHadronsPid.cxx to JetHadronsPid.cxx --- .mega-linter.yml | 3 +++ .../Tasks/{jetHadronsPid.cxx => JetHadronsPid.cxx} | 14 +++++++------- 2 files changed, 10 insertions(+), 7 deletions(-) rename PWGJE/Tasks/{jetHadronsPid.cxx => JetHadronsPid.cxx} (98%) diff --git a/.mega-linter.yml b/.mega-linter.yml index b9a956bd20a..1326ca67d40 100644 --- a/.mega-linter.yml +++ b/.mega-linter.yml @@ -21,11 +21,13 @@ DISABLE_LINTERS: - REPOSITORY_DEVSKIM - REPOSITORY_GITLEAKS - REPOSITORY_KICS + - REPOSITORY_OSV_SCANNER - REPOSITORY_SECRETLINT - REPOSITORY_TRIVY - YAML_PRETTIER - YAML_V8R DISABLE_ERRORS_LINTERS: # If errors are found by these linters, they will be considered as non blocking. + - ACTION_ZIZMOR - PYTHON_BANDIT # The bandit check is overly broad and complains about subprocess usage. SHOW_ELAPSED_TIME: true FILEIO_REPORTER: false @@ -42,3 +44,4 @@ CPP_CLANG_FORMAT_FILE_EXTENSIONS: [".C", ".c", ".c++", ".cc", ".cl", ".cpp", ".c CPP_CPPCHECK_FILE_EXTENSIONS: [".C", ".c", ".c++", ".cc", ".cl", ".cpp", ".cu", ".cuh", ".cxx", ".cxx.in", ".h", ".h++", ".hh", ".h.in", ".hpp", ".hxx", ".inc", ".inl", ".macro"] CPP_CPPCHECK_ARGUMENTS: --language=c++ --std=c++20 --check-level=exhaustive --suppressions-list=cppcheck_config REPOSITORY_GITLEAKS_PR_COMMITS_SCAN: true +ACTION_ZIZMOR_UNSECURED_ENV_VARIABLES: [GITHUB_TOKEN] \ No newline at end of file diff --git a/PWGJE/Tasks/jetHadronsPid.cxx b/PWGJE/Tasks/JetHadronsPid.cxx similarity index 98% rename from PWGJE/Tasks/jetHadronsPid.cxx rename to PWGJE/Tasks/JetHadronsPid.cxx index e02d2fa135f..72245d8cd61 100644 --- a/PWGJE/Tasks/jetHadronsPid.cxx +++ b/PWGJE/Tasks/JetHadronsPid.cxx @@ -9,7 +9,7 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. -/// \file jetHadronsPid.cxx +/// \file JetHadronsPid.cxx /// \brief Analysis of hadrons in jets /// \author Leonard Lorenc, WUT Warsaw, leonard.lorenc@cern.ch /// \author Aleksandra Mulewicz, WUT Warsaw, aleksandra.mulewicz@cern.ch @@ -68,7 +68,7 @@ using HadronTracksMC = soa::Join; -struct jetHadronsPid { +struct JetHadronsPid { HistogramRegistry registryData{"registryData", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; @@ -338,7 +338,7 @@ struct jetHadronsPid { } } } - PROCESS_SWITCH(jetHadronsPid, processPureTracks, "Pure Tracks Analysis", true); + PROCESS_SWITCH(JetHadronsPid, processPureTracks, "Pure Tracks Analysis", true); void processJets(JetEvents::iterator const& collision, soa::Join const& jets, @@ -540,7 +540,7 @@ struct jetHadronsPid { registryData.fill(HIST("tracks_n_in_ue"), nTracksOut); } } - PROCESS_SWITCH(jetHadronsPid, processJets, "Jets Analysis", true); + PROCESS_SWITCH(JetHadronsPid, processJets, "Jets Analysis", true); void processMC(StandardEvents::iterator const& collision, HadronTracksMC const& tracks, aod::McParticles const&) { @@ -618,7 +618,7 @@ struct jetHadronsPid { } } } - PROCESS_SWITCH(jetHadronsPid, processMC, "Run on Monte Carlo", false); + PROCESS_SWITCH(JetHadronsPid, processMC, "Run on Monte Carlo", false); void processMCTruth(aod::McCollisions::iterator const& mcCollision, aod::McParticles const& mcParticles) { @@ -647,10 +647,10 @@ struct jetHadronsPid { } } } - PROCESS_SWITCH(jetHadronsPid, processMCTruth, "Run on Monte Carlo (Pure Truth)", false); + PROCESS_SWITCH(JetHadronsPid, processMCTruth, "Run on Monte Carlo (Pure Truth)", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { - return WorkflowSpec{adaptAnalysisTask(cfgc)}; + return WorkflowSpec{adaptAnalysisTask(cfgc)}; } From cfc20ba3c1537d8b709e66f0c3a2402d83a2e326 Mon Sep 17 00:00:00 2001 From: Leonard Date: Thu, 4 Jun 2026 14:02:48 +0200 Subject: [PATCH 24/35] Adding new line in .megalinter.yml and renaming workflow in CMakelists.txt --- .mega-linter.yml | 2 +- PWGJE/Tasks/CMakeLists.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.mega-linter.yml b/.mega-linter.yml index 1326ca67d40..befd6badf61 100644 --- a/.mega-linter.yml +++ b/.mega-linter.yml @@ -44,4 +44,4 @@ CPP_CLANG_FORMAT_FILE_EXTENSIONS: [".C", ".c", ".c++", ".cc", ".cl", ".cpp", ".c CPP_CPPCHECK_FILE_EXTENSIONS: [".C", ".c", ".c++", ".cc", ".cl", ".cpp", ".cu", ".cuh", ".cxx", ".cxx.in", ".h", ".h++", ".hh", ".h.in", ".hpp", ".hxx", ".inc", ".inl", ".macro"] CPP_CPPCHECK_ARGUMENTS: --language=c++ --std=c++20 --check-level=exhaustive --suppressions-list=cppcheck_config REPOSITORY_GITLEAKS_PR_COMMITS_SCAN: true -ACTION_ZIZMOR_UNSECURED_ENV_VARIABLES: [GITHUB_TOKEN] \ No newline at end of file +ACTION_ZIZMOR_UNSECURED_ENV_VARIABLES: [GITHUB_TOKEN] diff --git a/PWGJE/Tasks/CMakeLists.txt b/PWGJE/Tasks/CMakeLists.txt index f20bd617e33..48c54aa4681 100644 --- a/PWGJE/Tasks/CMakeLists.txt +++ b/PWGJE/Tasks/CMakeLists.txt @@ -404,7 +404,7 @@ if(FastJet_FOUND) PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(jet-hadrons-pid - SOURCES jetHadronsPid.cxx + SOURCES JetHadronsPid.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2Physics::PWGJECore FastJet::FastJet FastJet::Contrib O2Physics::EventFilteringUtils COMPONENT_NAME Analysis) endif() From fc0d83f1516b12a26eb4bb3348ea6b16e91950ce Mon Sep 17 00:00:00 2001 From: Leonard Date: Thu, 4 Jun 2026 14:42:33 +0200 Subject: [PATCH 25/35] Reverting commits affecting .megalinter.yml --- .mega-linter.yml | 3 --- PWGJE/Tasks/CMakeLists.txt | 2 +- .../Tasks/{JetHadronsPid.cxx => jetHadronsPid.cxx} | 14 +++++++------- 3 files changed, 8 insertions(+), 11 deletions(-) rename PWGJE/Tasks/{JetHadronsPid.cxx => jetHadronsPid.cxx} (98%) diff --git a/.mega-linter.yml b/.mega-linter.yml index befd6badf61..b9a956bd20a 100644 --- a/.mega-linter.yml +++ b/.mega-linter.yml @@ -21,13 +21,11 @@ DISABLE_LINTERS: - REPOSITORY_DEVSKIM - REPOSITORY_GITLEAKS - REPOSITORY_KICS - - REPOSITORY_OSV_SCANNER - REPOSITORY_SECRETLINT - REPOSITORY_TRIVY - YAML_PRETTIER - YAML_V8R DISABLE_ERRORS_LINTERS: # If errors are found by these linters, they will be considered as non blocking. - - ACTION_ZIZMOR - PYTHON_BANDIT # The bandit check is overly broad and complains about subprocess usage. SHOW_ELAPSED_TIME: true FILEIO_REPORTER: false @@ -44,4 +42,3 @@ CPP_CLANG_FORMAT_FILE_EXTENSIONS: [".C", ".c", ".c++", ".cc", ".cl", ".cpp", ".c CPP_CPPCHECK_FILE_EXTENSIONS: [".C", ".c", ".c++", ".cc", ".cl", ".cpp", ".cu", ".cuh", ".cxx", ".cxx.in", ".h", ".h++", ".hh", ".h.in", ".hpp", ".hxx", ".inc", ".inl", ".macro"] CPP_CPPCHECK_ARGUMENTS: --language=c++ --std=c++20 --check-level=exhaustive --suppressions-list=cppcheck_config REPOSITORY_GITLEAKS_PR_COMMITS_SCAN: true -ACTION_ZIZMOR_UNSECURED_ENV_VARIABLES: [GITHUB_TOKEN] diff --git a/PWGJE/Tasks/CMakeLists.txt b/PWGJE/Tasks/CMakeLists.txt index 48c54aa4681..f20bd617e33 100644 --- a/PWGJE/Tasks/CMakeLists.txt +++ b/PWGJE/Tasks/CMakeLists.txt @@ -404,7 +404,7 @@ if(FastJet_FOUND) PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(jet-hadrons-pid - SOURCES JetHadronsPid.cxx + SOURCES jetHadronsPid.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2Physics::PWGJECore FastJet::FastJet FastJet::Contrib O2Physics::EventFilteringUtils COMPONENT_NAME Analysis) endif() diff --git a/PWGJE/Tasks/JetHadronsPid.cxx b/PWGJE/Tasks/jetHadronsPid.cxx similarity index 98% rename from PWGJE/Tasks/JetHadronsPid.cxx rename to PWGJE/Tasks/jetHadronsPid.cxx index 72245d8cd61..e02d2fa135f 100644 --- a/PWGJE/Tasks/JetHadronsPid.cxx +++ b/PWGJE/Tasks/jetHadronsPid.cxx @@ -9,7 +9,7 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. -/// \file JetHadronsPid.cxx +/// \file jetHadronsPid.cxx /// \brief Analysis of hadrons in jets /// \author Leonard Lorenc, WUT Warsaw, leonard.lorenc@cern.ch /// \author Aleksandra Mulewicz, WUT Warsaw, aleksandra.mulewicz@cern.ch @@ -68,7 +68,7 @@ using HadronTracksMC = soa::Join; -struct JetHadronsPid { +struct jetHadronsPid { HistogramRegistry registryData{"registryData", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; @@ -338,7 +338,7 @@ struct JetHadronsPid { } } } - PROCESS_SWITCH(JetHadronsPid, processPureTracks, "Pure Tracks Analysis", true); + PROCESS_SWITCH(jetHadronsPid, processPureTracks, "Pure Tracks Analysis", true); void processJets(JetEvents::iterator const& collision, soa::Join const& jets, @@ -540,7 +540,7 @@ struct JetHadronsPid { registryData.fill(HIST("tracks_n_in_ue"), nTracksOut); } } - PROCESS_SWITCH(JetHadronsPid, processJets, "Jets Analysis", true); + PROCESS_SWITCH(jetHadronsPid, processJets, "Jets Analysis", true); void processMC(StandardEvents::iterator const& collision, HadronTracksMC const& tracks, aod::McParticles const&) { @@ -618,7 +618,7 @@ struct JetHadronsPid { } } } - PROCESS_SWITCH(JetHadronsPid, processMC, "Run on Monte Carlo", false); + PROCESS_SWITCH(jetHadronsPid, processMC, "Run on Monte Carlo", false); void processMCTruth(aod::McCollisions::iterator const& mcCollision, aod::McParticles const& mcParticles) { @@ -647,10 +647,10 @@ struct JetHadronsPid { } } } - PROCESS_SWITCH(JetHadronsPid, processMCTruth, "Run on Monte Carlo (Pure Truth)", false); + PROCESS_SWITCH(jetHadronsPid, processMCTruth, "Run on Monte Carlo (Pure Truth)", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { - return WorkflowSpec{adaptAnalysisTask(cfgc)}; + return WorkflowSpec{adaptAnalysisTask(cfgc)}; } From c68106f014cdf490aea8c13b84e0cc5c3a4dd32b Mon Sep 17 00:00:00 2001 From: Leonard Date: Thu, 4 Jun 2026 15:00:33 +0200 Subject: [PATCH 26/35] Changing file name to JetHadronsPid.cxx and and it's corresponding workflow --- PWGJE/Tasks/CMakeLists.txt | 2 +- .../Tasks/{jetHadronsPid.cxx => JetHadronsPid.cxx} | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) rename PWGJE/Tasks/{jetHadronsPid.cxx => JetHadronsPid.cxx} (98%) diff --git a/PWGJE/Tasks/CMakeLists.txt b/PWGJE/Tasks/CMakeLists.txt index 0a2bb54414d..ed4b910fa92 100644 --- a/PWGJE/Tasks/CMakeLists.txt +++ b/PWGJE/Tasks/CMakeLists.txt @@ -437,7 +437,7 @@ if(FastJet_FOUND) PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(jet-hadrons-pid - SOURCES jetHadronsPid.cxx + SOURCES JetHadronsPid.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2Physics::PWGJECore FastJet::FastJet FastJet::Contrib O2Physics::EventFilteringUtils COMPONENT_NAME Analysis) endif() diff --git a/PWGJE/Tasks/jetHadronsPid.cxx b/PWGJE/Tasks/JetHadronsPid.cxx similarity index 98% rename from PWGJE/Tasks/jetHadronsPid.cxx rename to PWGJE/Tasks/JetHadronsPid.cxx index e02d2fa135f..72245d8cd61 100644 --- a/PWGJE/Tasks/jetHadronsPid.cxx +++ b/PWGJE/Tasks/JetHadronsPid.cxx @@ -9,7 +9,7 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. -/// \file jetHadronsPid.cxx +/// \file JetHadronsPid.cxx /// \brief Analysis of hadrons in jets /// \author Leonard Lorenc, WUT Warsaw, leonard.lorenc@cern.ch /// \author Aleksandra Mulewicz, WUT Warsaw, aleksandra.mulewicz@cern.ch @@ -68,7 +68,7 @@ using HadronTracksMC = soa::Join; -struct jetHadronsPid { +struct JetHadronsPid { HistogramRegistry registryData{"registryData", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; @@ -338,7 +338,7 @@ struct jetHadronsPid { } } } - PROCESS_SWITCH(jetHadronsPid, processPureTracks, "Pure Tracks Analysis", true); + PROCESS_SWITCH(JetHadronsPid, processPureTracks, "Pure Tracks Analysis", true); void processJets(JetEvents::iterator const& collision, soa::Join const& jets, @@ -540,7 +540,7 @@ struct jetHadronsPid { registryData.fill(HIST("tracks_n_in_ue"), nTracksOut); } } - PROCESS_SWITCH(jetHadronsPid, processJets, "Jets Analysis", true); + PROCESS_SWITCH(JetHadronsPid, processJets, "Jets Analysis", true); void processMC(StandardEvents::iterator const& collision, HadronTracksMC const& tracks, aod::McParticles const&) { @@ -618,7 +618,7 @@ struct jetHadronsPid { } } } - PROCESS_SWITCH(jetHadronsPid, processMC, "Run on Monte Carlo", false); + PROCESS_SWITCH(JetHadronsPid, processMC, "Run on Monte Carlo", false); void processMCTruth(aod::McCollisions::iterator const& mcCollision, aod::McParticles const& mcParticles) { @@ -647,10 +647,10 @@ struct jetHadronsPid { } } } - PROCESS_SWITCH(jetHadronsPid, processMCTruth, "Run on Monte Carlo (Pure Truth)", false); + PROCESS_SWITCH(JetHadronsPid, processMCTruth, "Run on Monte Carlo (Pure Truth)", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { - return WorkflowSpec{adaptAnalysisTask(cfgc)}; + return WorkflowSpec{adaptAnalysisTask(cfgc)}; } From b9a3d5709396ca79fd764e5be9a7972b7fce648a Mon Sep 17 00:00:00 2001 From: Leonard Date: Thu, 4 Jun 2026 23:47:24 +0200 Subject: [PATCH 27/35] Changing file name to jetHadronsPid.cxx and satysfing o2linter checks --- PWGJE/Tasks/{JetHadronsPid.cxx => jetHadronsPid.cxx} | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) rename PWGJE/Tasks/{JetHadronsPid.cxx => jetHadronsPid.cxx} (99%) diff --git a/PWGJE/Tasks/JetHadronsPid.cxx b/PWGJE/Tasks/jetHadronsPid.cxx similarity index 99% rename from PWGJE/Tasks/JetHadronsPid.cxx rename to PWGJE/Tasks/jetHadronsPid.cxx index 72245d8cd61..d35a351434c 100644 --- a/PWGJE/Tasks/JetHadronsPid.cxx +++ b/PWGJE/Tasks/jetHadronsPid.cxx @@ -9,7 +9,7 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. -/// \file JetHadronsPid.cxx +/// \file jetHadronsPid.cxx /// \brief Analysis of hadrons in jets /// \author Leonard Lorenc, WUT Warsaw, leonard.lorenc@cern.ch /// \author Aleksandra Mulewicz, WUT Warsaw, aleksandra.mulewicz@cern.ch @@ -390,12 +390,12 @@ struct JetHadronsPid { registryData.fill(HIST("jet_area"), jet.area()); registryData.fill(HIST("jet_pt"), jet.pt()); - const double MagnitudeThreshold = 1e-9; + const double magnitudeThreshold = 1e-9; TVector3 jetAxis(jet.px(), jet.py(), jet.pz()); TVector3 ueAxis1(0, 0, 0), ueAxis2(0, 0, 0); getPerpendicularDirections(jetAxis, ueAxis1, ueAxis2); - if (ueAxis1.Mag() < MagnitudeThreshold || ueAxis2.Mag() < MagnitudeThreshold) + if (ueAxis1.Mag() < magnitudeThreshold || ueAxis2.Mag() < magnitudeThreshold) continue; int constituentCount = 0; From 766224217db961fcd2b935443f320a84d56af9f1 Mon Sep 17 00:00:00 2001 From: Leonard Lorenc <107263905+llorenc-11@users.noreply.github.com> Date: Sun, 7 Jun 2026 21:23:30 +0200 Subject: [PATCH 28/35] Change workflow source to jetHadronsPid --- PWGJE/Tasks/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGJE/Tasks/CMakeLists.txt b/PWGJE/Tasks/CMakeLists.txt index ed4b910fa92..0a2bb54414d 100644 --- a/PWGJE/Tasks/CMakeLists.txt +++ b/PWGJE/Tasks/CMakeLists.txt @@ -437,7 +437,7 @@ if(FastJet_FOUND) PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(jet-hadrons-pid - SOURCES JetHadronsPid.cxx + SOURCES jetHadronsPid.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2Physics::PWGJECore FastJet::FastJet FastJet::Contrib O2Physics::EventFilteringUtils COMPONENT_NAME Analysis) endif() From 36bf1c2fd6efac2d37428b7b7def496e59f906f4 Mon Sep 17 00:00:00 2001 From: Leonard Date: Thu, 9 Jul 2026 17:58:04 +0200 Subject: [PATCH 29/35] Fix include list and unsed namespaces in jetHadronsPid.cxx --- PWGJE/Tasks/jetHadronsPid.cxx | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/PWGJE/Tasks/jetHadronsPid.cxx b/PWGJE/Tasks/jetHadronsPid.cxx index d35a351434c..1549eb4de42 100644 --- a/PWGJE/Tasks/jetHadronsPid.cxx +++ b/PWGJE/Tasks/jetHadronsPid.cxx @@ -18,23 +18,29 @@ /// \author Daniela Ruggiano daniela.ruggiano@cern.ch #include "PWGJE/Core/JetDerivedDataUtilities.h" -#include "PWGJE/Core/JetUtilities.h" #include "PWGJE/DataModel/Jet.h" #include "PWGJE/DataModel/JetReducedData.h" #include "PWGJE/DataModel/JetSubtraction.h" +#include "Common/CCDB/EventSelectionParams.h" #include "Common/Core/RecoDecay.h" -#include "Common/Core/TrackSelection.h" +#include "Common/DataModel/Centrality.h" #include "Common/DataModel/EventSelection.h" #include "Common/DataModel/PIDResponseITS.h" +#include "Common/DataModel/PIDResponseTOF.h" +#include "Common/DataModel/PIDResponseTPC.h" #include "Common/DataModel/TrackSelectionTables.h" +#include +#include +#include #include +#include #include +#include +#include +#include #include -#include -#include -#include #include #include @@ -47,11 +53,8 @@ #include using namespace o2; -using namespace o2::framework; -using namespace o2::aod; -using namespace o2::constants::physics; using namespace o2::constants::math; -using namespace o2::framework::expressions; +using namespace o2::framework; using StandardEvents = soa::Join; @@ -653,4 +656,4 @@ struct JetHadronsPid { WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{adaptAnalysisTask(cfgc)}; -} +} \ No newline at end of file From 393e7806b225e2072078c2174fe83026b5c7ecfd Mon Sep 17 00:00:00 2001 From: Leonard Date: Thu, 9 Jul 2026 18:10:17 +0200 Subject: [PATCH 30/35] Improve PID methods and add histograms with respect to charge of track in jetHadronsPid.cxx --- PWGJE/Tasks/jetHadronsPid.cxx | 962 ++++++++++++++++++++++++---------- 1 file changed, 699 insertions(+), 263 deletions(-) diff --git a/PWGJE/Tasks/jetHadronsPid.cxx b/PWGJE/Tasks/jetHadronsPid.cxx index 1549eb4de42..d112b53167e 100644 --- a/PWGJE/Tasks/jetHadronsPid.cxx +++ b/PWGJE/Tasks/jetHadronsPid.cxx @@ -102,20 +102,31 @@ struct JetHadronsPid { Configurable minChiSquareTpc{"minChiSquareTpc", 0.0, "minimum TPC chi^2/Ncls"}; Configurable maxChiSquareTpc{"maxChiSquareTpc", 4.0, "maximum TPC chi^2/Ncls"}; Configurable maxChiSquareIts{"maxChiSquareIts", 36.0, "maximum ITS chi^2/Ncls"}; - Configurable minPt{"minPt", 0.3, "minimum pt of the tracks"}; + Configurable minPt{"minPt", 0.05, "minimum pt of the tracks"}; Configurable maxPt{"maxPt", 4.0, "maximum pt of the tracks for PID analysis"}; Configurable minEta{"minEta", -0.8, "minimum eta"}; Configurable maxEta{"maxEta", +0.8, "maximum eta"}; Configurable maxDcaxy{"maxDcaxy", 0.2, "Maximum DCAxy"}; Configurable maxDcaz{"maxDcaz", 0.1, "Maximum DCAz"}; - Configurable maxNSigmaPid{"maxNSigmaPid", 3.0, "Maximum nSigma for TPC and TOF PID"}; - Configurable setMCDefaultItsParams{"setMCDefaultItsParams", true, "set MC default parameters"}; o2::aod::ITSResponse itsResponse; Preslice tracksPerCollision = aod::track::collisionId; + struct : ConfigurableGroup { + Configurable idMethod{"idMethod", 0, "Variable for choosing pid method"}; + Configurable rejectionSigma{"rejectionSigma", 3.0, "Rejection sigma for tof and tpc pid"}; + Configurable ptThreshold{"ptThreshold", 0.8, "Threshold for pt for different pid methods"}; + Configurable nSigmaCut{"nSigmaCut", 2.0, "Acceptence cut for pid methods"}; + Configurable minPtPion{"minPtPion", 0.2, "Minimal Pion pt"}; + Configurable maxPtPion{"maxPtPion", 4.0, "Maximum Pion pt"}; + Configurable minPtKaon{"minPtKaon", 0.3, "Minimal Kaon pt"}; + Configurable maxPtKaon{"maxPtKaon", 3.0, "Maximum Kaon pt"}; + Configurable minPtProton{"minPtProton", 0.3, "Minimal Proton pt"}; + Configurable maxPtProton{"maxPtProton", 4.0, "Maximum Proton pt"}; + } cfg; + void init(InitContext const&) { if (setMCDefaultItsParams) { @@ -124,104 +135,267 @@ struct JetHadronsPid { eventSelectionBits = jetderiveddatautilities::initialiseEventSelectionBits(static_cast(eventSelections)); - registryData.add("n_events", "Event counter", HistType::kTH1F, {{1, 0.5, 1.5, "N_{events}"}}); - registryData.add("n_events_raw", "All events", HistType::kTH1F, {{1, 0.5, 1.5, ""}}); - - registryData.add("jet_pt", "Jet pT ", HistType::kTH1F, {{100, 0.0, 20.0, "#it{p}_{T}^{raw} (GeV/#it{c})"}}); - registryData.add("jet_pt_subtracted", "Jet pT subtracted", HistType::kTH1F, {{200, 0.0, 10.0, "#it{p}_{T}^{sub} (GeV/#it{c})"}}); - registryData.add("jet_pt_raw_vs_sub", "Raw vs sub jet pT", HistType::kTH2F, {{200, 0, 200}, {200, 0, 200}}); - registryData.add("jet_eta", "Jet eta", HistType::kTH1F, {{100, -1.0, 1.0, "#eta_{jet}"}}); - registryData.add("jet_phi", "Jet phi", HistType::kTH1F, {{100, 0.0, TwoPI, "#phi_{jet}"}}); - registryData.add("jet_area", "Jet area", HistType::kTH1F, {{100, 0.0, 1.5, "Area"}}); - registryData.add("jet_n_constituents", "Jet multiplicity", HistType::kTH1I, {{100, 0, 30, "N_{constituents}"}}); - - registryData.add("pion_pure_tpc", "TPC Pion PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); - registryData.add("pion_pure_tof", "TOF Pion PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); - registryData.add("pion_pure_pt", "Pion pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); - registryData.add("pion_pure_eta", "Pion Eta", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); - registryData.add("pion_pure_dcaz", "Pion DCAz", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); - registryData.add("pion_pure_dcaxy", "Pion DCAxy", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); - - registryData.add("kaon_pure_tpc", "TPC Kaon PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); - registryData.add("kaon_pure_tof", "TOF Kaon PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); - registryData.add("kaon_pure_pt", "Kaon pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); - registryData.add("kaon_pure_eta", "Kaon Eta", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); - registryData.add("kaon_pure_dcaz", "Kaon DCAz", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); - registryData.add("kaon_pure_dcaxy", "Kaon DCAxy", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); - - registryData.add("proton_pure_tpc", "TPC Proton PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); - registryData.add("proton_pure_tof", "TOF Proton PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); - registryData.add("proton_pure_pt", "Proton pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); - registryData.add("proton_pure_eta", "Proton Eta", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); - registryData.add("proton_pure_dcaz", "Proton DCAz", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); - registryData.add("proton_pure_dcaxy", "Proton DCAxy", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); - - registryData.add("z_vtx", "Z-Vertex Distribution", HistType::kTH1F, {{200, -20.0, 20.0, "Z-Vertex (cm)"}}); - - registryData.add("pion_jet_tpc", "TPC Pion PID in Jets", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); - registryData.add("pion_jet_tof", "TOF Pion PID in Jets", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); - registryData.add("kaon_jet_tpc", "TPC Kaon PID in Jets", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); - registryData.add("kaon_jet_tof", "TOF Kaon PID in Jets", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); - registryData.add("proton_jet_tpc", "TPC Proton PID in Jets", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); - registryData.add("proton_jet_tof", "TOF Proton PID in Jets", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); - - registryData.add("pion_jet_pt", "Pion pT in Jets", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); - registryData.add("pion_jet_eta", "Pion Eta in Jets", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); - registryData.add("pion_jet_dcaxy", "Pion DCAxy in Jets", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); - registryData.add("pion_jet_dcaz", "Pion DCAz in Jets", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); - - registryData.add("kaon_jet_pt", "Kaon pT in Jets", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); - registryData.add("kaon_jet_eta", "Kaon Eta in Jets", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); - registryData.add("kaon_jet_dcaxy", "Kaon DCAxy in Jets", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); - registryData.add("kaon_jet_dcaz", "Kaon DCAz in Jets", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); - - registryData.add("proton_jet_pt", "Proton pT in Jets", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); - registryData.add("proton_jet_eta", "Proton Eta in Jets", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); - registryData.add("proton_jet_dcaxy", "Proton DCAxy in Jets", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); - registryData.add("proton_jet_dcaz", "Proton DCAz in Jets", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); - - registryData.add("pion_ue_tpc", "TPC Pion PID in UE", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); - registryData.add("pion_ue_tof", "TOF Pion PID in UE", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); - registryData.add("kaon_ue_tpc", "TPC Kaon PID in UE", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); - registryData.add("kaon_ue_tof", "TOF Kaon PID in UE", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); - registryData.add("proton_ue_tpc", "TPC Proton PID in UE", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); - registryData.add("proton_ue_tof", "TOF Proton PID in UE", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); - - registryData.add("pion_ue_pt", "Pion pT in UE", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); - registryData.add("pion_ue_eta", "Pion Eta in UE", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); - registryData.add("pion_ue_dcaxy", "Pion DCAxy in UE", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); - registryData.add("pion_ue_dcaz", "Pion DCAz in UE", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); - - registryData.add("kaon_ue_pt", "Kaon pT in UE", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); - registryData.add("kaon_ue_eta", "Kaon Eta in UE", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); - registryData.add("kaon_ue_dcaxy", "Kaon DCAxy in UE", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); - registryData.add("kaon_ue_dcaz", "Kaon DCAz in UE", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); - - registryData.add("proton_ue_pt", "Proton pT in UE", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); - registryData.add("proton_ue_eta", "Proton Eta in UE", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); - registryData.add("proton_ue_dcaxy", "Proton DCAxy in UE", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); - registryData.add("proton_ue_dcaz", "Proton DCAz in UE", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); - - registryData.add("tracks_n_in_ue", "Number of tracks in UE", HistType::kTH1I, {{100, 0, 100, "N_{tracks}"}}); - - registryData.add("rec_pion_all", "All Tracks PID'd as Pions", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); - registryData.add("mc_rec_pion_pt", "True Primary Pions (Reconstructed)", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); - registryData.add("mc_sec_pion_pt", "Secondary Pions (Reconstructed)", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); - registryData.add("contamination_matrix_pion", "Pion PID Contamination", HistType::kTH2F, {{4000, -0.5, 3999.5, "Absolute PDG Code"}, {120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); - - registryData.add("rec_kaon_all", "All Tracks PID'd as Kaons", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); - registryData.add("mc_rec_kaon_pt", "True Primary Kaons (Reconstructed)", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); - registryData.add("mc_sec_kaon_pt", "Secondary Kaons (Reconstructed)", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); - registryData.add("contamination_matrix_kaon", "Kaon PID Contamination", HistType::kTH2F, {{4000, -0.5, 3999.5, "Absolute PDG Code"}, {120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); - - registryData.add("rec_proton_all", "All Tracks PID'd as Protons", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); - registryData.add("mc_rec_proton_pt", "True Primary Protons (Reconstructed)", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); - registryData.add("mc_sec_proton_pt", "Secondary Protons (Reconstructed)", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); - registryData.add("contamination_matrix_proton", "Proton PID Contamination", HistType::kTH2F, {{4000, -0.5, 3999.5, "Absolute PDG Code"}, {120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); - - registryData.add("mc_gen_pion_pt", "Generated Primary Pions (Truth)", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); - registryData.add("mc_gen_kaon_pt", "Generated Primary Kaons (Truth)", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); - registryData.add("mc_gen_proton_pt", "Generated Primary Protons (Truth)", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("data/n_events", "Event counter", HistType::kTH1F, {{1, 0.5, 1.5, "N_{events}"}}); + registryData.add("data/n_events_raw", "All events", HistType::kTH1F, {{1, 0.5, 1.5, ""}}); + + registryData.add("data/jets/jet_pt", "Jet pT ", HistType::kTH1F, {{100, 0.0, 20.0, "#it{p}_{T}^{raw} (GeV/#it{c})"}}); + registryData.add("data/jets/jet_pt_subtracted", "Jet pT subtracted", HistType::kTH1F, {{200, 0.0, 10.0, "#it{p}_{T}^{sub} (GeV/#it{c})"}}); + registryData.add("data/jets/jet_pt_raw_vs_sub", "Raw vs sub jet pT", HistType::kTH2F, {{200, 0, 200}, {200, 0, 200}}); + registryData.add("data/jets/jet_eta", "Jet eta", HistType::kTH1F, {{100, -1.0, 1.0, "#eta_{jet}"}}); + registryData.add("data/jets/jet_phi", "Jet phi", HistType::kTH1F, {{100, 0.0, TwoPI, "#phi_{jet}"}}); + registryData.add("data/jets/jet_area", "Jet area", HistType::kTH1F, {{100, 0.0, 1.5, "Area"}}); + registryData.add("data/jets/jet_n_constituents", "Jet multiplicity", HistType::kTH1I, {{100, 0, 30, "N_{constituents}"}}); + registryData.add("data/z_vtx", "Z-Vertex Distribution", HistType::kTH1F, {{200, -20.0, 20.0, "Z-Vertex (cm)"}}); + + registryData.add("data/pure/pions/pion_pure_tpc", "TPC Pion PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); + registryData.add("data/pure/pions/pion_pure_tof", "TOF Pion PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); + registryData.add("data/pure/pions/pion_pure_pt", "Pion pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("data/pure/pions/pion_pure_eta", "Pion Eta", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); + registryData.add("data/pure/pions/pion_pure_dcaxy", "Pion DCAxy", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); + registryData.add("data/pure/pions/pion_pure_dcaz", "Pion DCAz", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); + + registryData.add("data/pure/pions/pos/pion_pure_pos_tpc", "TPC #pi^{+} PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); + registryData.add("data/pure/pions/pos/pion_pure_pos_tof", "TOF #pi^{+} PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); + registryData.add("data/pure/pions/pos/pion_pure_pos_pt", "#pi^{+} pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("data/pure/pions/pos/pion_pure_pos_eta", "#pi^{+} Eta", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); + registryData.add("data/pure/pions/pos/pion_pure_pos_dcaxy", "#pi^{+} DCAxy", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); + registryData.add("data/pure/pions/pos/pion_pure_pos_dcaz", "#pi^{+} DCAz", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); + + registryData.add("data/pure/pions/neg/pion_pure_neg_tpc", "TPC #pi^{-} PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); + registryData.add("data/pure/pions/neg/pion_pure_neg_tof", "TOF #pi^{-} PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); + registryData.add("data/pure/pions/neg/pion_pure_neg_pt", "#pi^{-} pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("data/pure/pions/neg/pion_pure_neg_eta", "#pi^{-} Eta", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); + registryData.add("data/pure/pions/neg/pion_pure_neg_dcaxy", "#pi^{-} DCAxy", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); + registryData.add("data/pure/pions/neg/pion_pure_neg_dcaz", "#pi^{-} DCAz", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); + + registryData.add("data/pure/kaons/kaon_pure_tpc", "TPC Kaon PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); + registryData.add("data/pure/kaons/kaon_pure_tof", "TOF Kaon PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); + registryData.add("data/pure/kaons/kaon_pure_pt", "Kaon pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("data/pure/kaons/kaon_pure_eta", "Kaon Eta", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); + registryData.add("data/pure/kaons/kaon_pure_dcaz", "Kaon DCAz", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); + registryData.add("data/pure/kaons/kaon_pure_dcaxy", "Kaon DCAxy", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); + + registryData.add("data/pure/kaons/pos/kaon_pure_pos_tpc", "TPC K^{+} PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); + registryData.add("data/pure/kaons/pos/kaon_pure_pos_tof", "TOF K^{+} PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); + registryData.add("data/pure/kaons/pos/kaon_pure_pos_pt", "K^{+} pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("data/pure/kaons/pos/kaon_pure_pos_eta", "K^{+} Eta", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); + registryData.add("data/pure/kaons/pos/kaon_pure_pos_dcaxy", "K^{+} DCAxy", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); + registryData.add("data/pure/kaons/pos/kaon_pure_pos_dcaz", "K^{+} DCAz", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); + + registryData.add("data/pure/kaons/neg/kaon_pure_neg_tpc", "TPC K^{-} PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); + registryData.add("data/pure/kaons/neg/kaon_pure_neg_tof", "TOF K^{-} PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); + registryData.add("data/pure/kaons/neg/kaon_pure_neg_pt", "K^{-} pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("data/pure/kaons/neg/kaon_pure_neg_eta", "K^{-} Eta", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); + registryData.add("data/pure/kaons/neg/kaon_pure_neg_dcaxy", "K^{-} DCAxy", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); + registryData.add("data/pure/kaons/neg/kaon_pure_neg_dcaz", "K^{-} DCAz", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); + + registryData.add("data/pure/protons/proton_pure_tpc", "TPC Proton PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); + registryData.add("data/pure/protons/proton_pure_tof", "TOF Proton PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); + registryData.add("data/pure/protons/proton_pure_pt", "Proton pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("data/pure/protons/proton_pure_eta", "Proton Eta", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); + registryData.add("data/pure/protons/proton_pure_dcaz", "Proton DCAz", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); + registryData.add("data/pure/protons/proton_pure_dcaxy", "Proton DCAxy", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); + + registryData.add("data/pure/protons/pos/proton_pure_pos_tpc", "TPC p PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); + registryData.add("data/pure/protons/pos/proton_pure_pos_tof", "TOF p PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); + registryData.add("data/pure/protons/pos/proton_pure_pos_pt", "p pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("data/pure/protons/pos/proton_pure_pos_eta", "p Eta", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); + registryData.add("data/pure/protons/pos/proton_pure_pos_dcaxy", "p DCAxy", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); + registryData.add("data/pure/protons/pos/proton_pure_pos_dcaz", "p DCAz", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); + + registryData.add("data/pure/protons/neg/proton_pure_neg_tpc", "TPC #bar{p} PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); + registryData.add("data/pure/protons/neg/proton_pure_neg_tof", "TOF #bar{p} PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); + registryData.add("data/pure/protons/neg/proton_pure_neg_pt", "#bar{p} pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("data/pure/protons/neg/proton_pure_neg_eta", "#bar{p} Eta", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); + registryData.add("data/pure/protons/neg/proton_pure_neg_dcaxy", "#bar{p} DCAxy", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); + registryData.add("data/pure/protons/neg/proton_pure_neg_dcaz", "#bar{p} DCAz", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); + + registryData.add("data/jets/pions/pion_jet_tpc", "TPC Pion PID in Jets", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); + registryData.add("data/jets/pions/pion_jet_tof", "TOF Pion PID in Jets", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); + registryData.add("data/jets/pions/pion_jet_pt", "Pion pT in Jets", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("data/jets/pions/pion_jet_eta", "Pion Eta in Jets", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); + registryData.add("data/jets/pions/pion_jet_dcaxy", "Pion DCAxy in Jets", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); + registryData.add("data/jets/pions/pion_jet_dcaz", "Pion DCAz in Jets", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); + + registryData.add("data/jets/pions/pos/pion_jet_pos_tpc", "TPC #pi^{+} PID in Jets", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); + registryData.add("data/jets/pions/pos/pion_jet_pos_tof", "TOF #pi^{+} PID in Jets", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); + registryData.add("data/jets/pions/pos/pion_jet_pos_pt", "#pi^{+} pT in Jets", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("data/jets/pions/pos/pion_jet_pos_eta", "#pi^{+} Eta in Jets", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); + registryData.add("data/jets/pions/pos/pion_jet_pos_dcaxy", "#pi^{+} DCAxy in Jets", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); + registryData.add("data/jets/pions/pos/pion_jet_pos_dcaz", "#pi^{+} DCAz in Jets", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); + + registryData.add("data/jets/pions/neg/pion_jet_neg_tpc", "TPC #pi^{-} PID in Jets", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); + registryData.add("data/jets/pions/neg/pion_jet_neg_tof", "TOF #pi^{-} PID in Jets", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); + registryData.add("data/jets/pions/neg/pion_jet_neg_pt", "#pi^{-} pT in Jets", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("data/jets/pions/neg/pion_jet_neg_eta", "#pi^{-} Eta in Jets", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); + registryData.add("data/jets/pions/neg/pion_jet_neg_dcaxy", "#pi^{-} DCAxy in Jets", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); + registryData.add("data/jets/pions/neg/pion_jet_neg_dcaz", "#pi^{-} DCAz in Jets", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); + + registryData.add("data/jets/kaons/kaon_jet_tpc", "TPC Kaon PID in Jets", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); + registryData.add("data/jets/kaons/kaon_jet_tof", "TOF Kaon PID in Jets", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); + registryData.add("data/jets/kaons/kaon_jet_pt", "Kaon pT in Jets", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("data/jets/kaons/kaon_jet_eta", "Kaon Eta in Jets", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); + registryData.add("data/jets/kaons/kaon_jet_dcaxy", "Kaon DCAxy in Jets", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); + registryData.add("data/jets/kaons/kaon_jet_dcaz", "Kaon DCAz in Jets", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); + + registryData.add("data/jets/kaons/pos/kaon_jet_pos_tpc", "TPC K^{+} PID in Jets", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); + registryData.add("data/jets/kaons/pos/kaon_jet_pos_tof", "TOF K^{+} PID in Jets", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); + registryData.add("data/jets/kaons/pos/kaon_jet_pos_pt", "K^{+} pT in Jets", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("data/jets/kaons/pos/kaon_jet_pos_eta", "K^{+} Eta in Jets", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); + registryData.add("data/jets/kaons/pos/kaon_jet_pos_dcaxy", "K^{+} DCAxy in Jets", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); + registryData.add("data/jets/kaons/pos/kaon_jet_pos_dcaz", "K^{+} DCAz in Jets", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); + + registryData.add("data/jets/kaons/neg/kaon_jet_neg_tpc", "TPC K^{-} PID in Jets", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); + registryData.add("data/jets/kaons/neg/kaon_jet_neg_tof", "TOF K^{-} PID in Jets", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); + registryData.add("data/jets/kaons/neg/kaon_jet_neg_pt", "K^{-} pT in Jets", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("data/jets/kaons/neg/kaon_jet_neg_eta", "K^{-} Eta in Jets", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); + registryData.add("data/jets/kaons/neg/kaon_jet_neg_dcaxy", "K^{-} DCAxy in Jets", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); + registryData.add("data/jets/kaons/neg/kaon_jet_neg_dcaz", "K^{-} DCAz in Jets", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); + + registryData.add("data/jets/protons/proton_jet_tpc", "TPC Proton PID in Jets", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); + registryData.add("data/jets/protons/proton_jet_tof", "TOF Proton PID in Jets", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); + registryData.add("data/jets/protons/proton_jet_pt", "Proton pT in Jets", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("data/jets/protons/proton_jet_eta", "Proton Eta in Jets", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); + registryData.add("data/jets/protons/proton_jet_dcaxy", "Proton DCAxy in Jets", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); + registryData.add("data/jets/protons/proton_jet_dcaz", "Proton DCAz in Jets", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); + + registryData.add("data/jets/protons/pos/proton_jet_pos_tpc", "TPC p PID in Jets", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); + registryData.add("data/jets/protons/pos/proton_jet_pos_tof", "TOF p PID in Jets", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); + registryData.add("data/jets/protons/pos/proton_jet_pos_pt", "p pT in Jets", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("data/jets/protons/pos/proton_jet_pos_eta", "p Eta in Jets", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); + registryData.add("data/jets/protons/pos/proton_jet_pos_dcaxy", "p DCAxy in Jets", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); + registryData.add("data/jets/protons/pos/proton_jet_pos_dcaz", "p DCAz in Jets", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); + + registryData.add("data/jets/protons/neg/proton_jet_neg_tpc", "TPC #bar{p} PID in Jets", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); + registryData.add("data/jets/protons/neg/proton_jet_neg_tof", "TOF #bar{p} PID in Jets", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); + registryData.add("data/jets/protons/neg/proton_jet_neg_pt", "#bar{p} pT in Jets", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("data/jets/protons/neg/proton_jet_neg_eta", "#bar{p} Eta in Jets", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); + registryData.add("data/jets/protons/neg/proton_jet_neg_dcaxy", "#bar{p} DCAxy in Jets", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); + registryData.add("data/jets/protons/neg/proton_jet_neg_dcaz", "#bar{p} DCAz in Jets", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); + + registryData.add("data/ue/pions/pion_ue_tpc", "TPC Pion PID in UE", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); + registryData.add("data/ue/pions/pion_ue_tof", "TOF Pion PID in UE", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); + registryData.add("data/ue/pions/pion_ue_pt", "Pion pT in UE", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("data/ue/pions/pion_ue_eta", "Pion Eta in UE", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); + registryData.add("data/ue/pions/pion_ue_dcaxy", "Pion DCAxy in UE", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); + registryData.add("data/ue/pions/pion_ue_dcaz", "Pion DCAz in UE", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); + + registryData.add("data/ue/pions/pos/pion_ue_pos_tpc", "TPC #pi^{+} PID in UE", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); + registryData.add("data/ue/pions/pos/pion_ue_pos_tof", "TOF #pi^{+} PID in UE", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); + registryData.add("data/ue/pions/pos/pion_ue_pos_pt", "#pi^{+} pT in UE", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("data/ue/pions/pos/pion_ue_pos_eta", "#pi^{+} Eta in UE", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); + registryData.add("data/ue/pions/pos/pion_ue_pos_dcaxy", "#pi^{+} DCAxy in UE", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); + registryData.add("data/ue/pions/pos/pion_ue_pos_dcaz", "#pi^{+} DCAz in UE", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); + + registryData.add("data/ue/pions/neg/pion_ue_neg_tpc", "TPC #pi^{-} PID in UE", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); + registryData.add("data/ue/pions/neg/pion_ue_neg_tof", "TOF #pi^{-} PID in UE", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); + registryData.add("data/ue/pions/neg/pion_ue_neg_pt", "#pi^{-} pT in UE", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("data/ue/pions/neg/pion_ue_neg_eta", "#pi^{-} Eta in UE", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); + registryData.add("data/ue/pions/neg/pion_ue_neg_dcaxy", "#pi^{-} DCAxy in UE", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); + registryData.add("data/ue/pions/neg/pion_ue_neg_dcaz", "#pi^{-} DCAz in UE", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); + + registryData.add("data/ue/kaons/kaon_ue_tpc", "TPC Kaon PID in UE", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); + registryData.add("data/ue/kaons/kaon_ue_tof", "TOF Kaon PID in UE", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); + registryData.add("data/ue/kaons/kaon_ue_pt", "Kaon pT in UE", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("data/ue/kaons/kaon_ue_eta", "Kaon Eta in UE", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); + registryData.add("data/ue/kaons/kaon_ue_dcaxy", "Kaon DCAxy in UE", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); + registryData.add("data/ue/kaons/kaon_ue_dcaz", "Kaon DCAz in UE", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); + + registryData.add("data/ue/kaons/pos/kaon_ue_pos_tpc", "TPC K^{+} PID in UE", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); + registryData.add("data/ue/kaons/pos/kaon_ue_pos_tof", "TOF K^{+} PID in UE", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); + registryData.add("data/ue/kaons/pos/kaon_ue_pos_pt", "K^{+} pT in UE", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("data/ue/kaons/pos/kaon_ue_pos_eta", "K^{+} Eta in UE", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); + registryData.add("data/ue/kaons/pos/kaon_ue_pos_dcaxy", "K^{+} DCAxy in UE", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); + registryData.add("data/ue/kaons/pos/kaon_ue_pos_dcaz", "K^{+} DCAz in UE", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); + + registryData.add("data/ue/kaons/neg/kaon_ue_neg_tpc", "TPC K^{-} PID in UE", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); + registryData.add("data/ue/kaons/neg/kaon_ue_neg_tof", "TOF K^{-} PID in UE", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); + registryData.add("data/ue/kaons/neg/kaon_ue_neg_pt", "K^{-} pT in UE", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("data/ue/kaons/neg/kaon_ue_neg_eta", "K^{-} Eta in UE", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); + registryData.add("data/ue/kaons/neg/kaon_ue_neg_dcaxy", "K^{-} DCAxy in UE", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); + registryData.add("data/ue/kaons/neg/kaon_ue_neg_dcaz", "K^{-} DCAz in UE", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); + + registryData.add("data/ue/protons/proton_ue_tpc", "TPC Proton PID in UE", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); + registryData.add("data/ue/protons/proton_ue_tof", "TOF Proton PID in UE", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); + registryData.add("data/ue/protons/proton_ue_pt", "Proton pT in UE", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("data/ue/protons/proton_ue_eta", "Proton Eta in UE", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); + registryData.add("data/ue/protons/proton_ue_dcaxy", "Proton DCAxy in UE", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); + registryData.add("data/ue/protons/proton_ue_dcaz", "Proton DCAz in UE", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); + + registryData.add("data/ue/protons/pos/proton_ue_pos_tpc", "TPC p PID in UE", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); + registryData.add("data/ue/protons/pos/proton_ue_pos_tof", "TOF p PID in UE", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); + registryData.add("data/ue/protons/pos/proton_ue_pos_pt", "p pT in UE", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("data/ue/protons/pos/proton_ue_pos_eta", "p Eta in UE", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); + registryData.add("data/ue/protons/pos/proton_ue_pos_dcaxy", "p DCAxy in UE", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); + registryData.add("data/ue/protons/pos/proton_ue_pos_dcaz", "p DCAz in UE", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); + + registryData.add("data/ue/protons/neg/proton_ue_neg_tpc", "TPC #bar{p} PID in UE", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); + registryData.add("data/ue/protons/neg/proton_ue_neg_tof", "TOF #bar{p} PID in UE", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); + registryData.add("data/ue/protons/neg/proton_ue_neg_pt", "#bar{p} pT in UE", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("data/ue/protons/neg/proton_ue_neg_eta", "#bar{p} Eta in UE", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); + registryData.add("data/ue/protons/neg/proton_ue_neg_dcaxy", "#bar{p} DCAxy in UE", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); + registryData.add("data/ue/protons/neg/proton_ue_neg_dcaz", "#bar{p} DCAz in UE", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); + + registryData.add("data/ue/tracks_n_in_ue", "Number of tracks in UE", HistType::kTH1I, {{100, 0, 100, "N_{tracks}"}}); + + registryData.add("mc/n_events", "Event counter", HistType::kTH1F, {{1, 0.5, 1.5, "N_{events}"}}); + + registryData.add("mc/reconstruction/pions/rec_pion_all", "All Tracks PID'd as Pions", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc/reconstruction/pions/mc_rec_pion_pt", "True Primary Pions (Reconstructed)", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc/reconstruction/pions/mc_sec_pion_pt", "Secondary Pions (Reconstructed)", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc/reconstruction/pions/contamination_matrix_pion", "Pion PID Contamination", HistType::kTH2F, {{4000, -0.5, 3999.5, "Absolute PDG Code"}, {120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + + registryData.add("mc/reconstruction/pions/pos/mc_rec_pion_pos_pt", "Reconstructed Primary #pi^{+} pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc/reconstruction/pions/pos/contamination_matrix_pion_pos", "#pi^{+} PID Contamination", HistType::kTH2F, {{4000, -0.5, 3999.5, "Absolute PDG Code"}, {120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + + registryData.add("mc/reconstruction/pions/neg/mc_rec_pion_neg_pt", "Reconstructed Primary #pi^{-} pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc/reconstruction/pions/neg/contamination_matrix_pion_neg", "#pi^{-} PID Contamination", HistType::kTH2F, {{4000, -0.5, 3999.5, "Absolute PDG Code"}, {120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc/reconstruction/pions/pos/rec_pion_pos_all", "All Tracks PID'd as #pi^{+}", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc/reconstruction/pions/neg/rec_pion_neg_all", "All Tracks PID'd as #pi^{-}", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc/reconstruction/pions/pos/mc_sec_pion_pos_pt", "Secondary #pi^{+} (Reconstructed)", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc/reconstruction/pions/neg/mc_sec_pion_neg_pt", "Secondary #pi^{-} (Reconstructed)", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + + registryData.add("mc/reconstruction/kaons/rec_kaon_all", "All Tracks PID'd as Kaons", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc/reconstruction/kaons/mc_rec_kaon_pt", "True Primary Kaons (Reconstructed)", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc/reconstruction/kaons/mc_sec_kaon_pt", "Secondary Kaons (Reconstructed)", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc/reconstruction/kaons/contamination_matrix_kaon", "Kaon PID Contamination", HistType::kTH2F, {{4000, -0.5, 3999.5, "Absolute PDG Code"}, {120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + + registryData.add("mc/reconstruction/kaons/pos/mc_rec_kaon_pos_pt", "Reconstructed Primary K^{+} pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc/reconstruction/kaons/pos/contamination_matrix_kaon_pos", "K^{+} PID Contamination", HistType::kTH2F, {{4000, -0.5, 3999.5, "Absolute PDG Code"}, {120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + + registryData.add("mc/reconstruction/kaons/pos/rec_kaon_pos_all", "All Tracks PID'd as K^{+}", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc/reconstruction/kaons/neg/rec_kaon_neg_all", "All Tracks PID'd as K^{-}", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc/reconstruction/kaons/pos/mc_sec_kaon_pos_pt", "Secondary K^{+} (Reconstructed)", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc/reconstruction/kaons/neg/mc_sec_kaon_neg_pt", "Secondary K^{-} (Reconstructed)", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc/reconstruction/kaons/neg/mc_rec_kaon_neg_pt", "Reconstructed Primary K^{-} pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc/reconstruction/kaons/neg/contamination_matrix_kaon_neg", "K^{-} PID Contamination", HistType::kTH2F, {{4000, -0.5, 3999.5, "Absolute PDG Code"}, {120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + + registryData.add("mc/reconstruction/protons/rec_proton_all", "All Tracks PID'd as Protons", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc/reconstruction/protons/mc_rec_proton_pt", "True Primary Protons (Reconstructed)", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc/reconstruction/protons/mc_sec_proton_pt", "Secondary Protons (Reconstructed)", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc/reconstruction/protons/contamination_matrix_proton", "Proton PID Contamination", HistType::kTH2F, {{4000, -0.5, 3999.5, "Absolute PDG Code"}, {120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + + registryData.add("mc/reconstruction/protons/pos/mc_rec_proton_pos_pt", "Reconstructed Primary p pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc/reconstruction/protons/pos/contamination_matrix_proton_pos", "p PID Contamination", HistType::kTH2F, {{4000, -0.5, 3999.5, "Absolute PDG Code"}, {120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + + registryData.add("mc/reconstruction/protons/neg/mc_rec_proton_neg_pt", "Reconstructed Primary #bar{p} pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc/reconstruction/protons/neg/contamination_matrix_proton_neg", "#bar{p} PID Contamination", HistType::kTH2F, {{4000, -0.5, 3999.5, "Absolute PDG Code"}, {120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc/reconstruction/protons/pos/rec_proton_pos_all", "All Tracks PID'd as p", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc/reconstruction/protons/neg/rec_proton_neg_all", "All Tracks PID'd as #bar{p}", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc/reconstruction/protons/pos/mc_sec_proton_pos_pt", "Secondary p (Reconstructed)", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc/reconstruction/protons/neg/mc_sec_proton_neg_pt", "Secondary #bar{p} (Reconstructed)", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + + registryData.add("mc/truth/pions/mc_gen_pion_pt", "Generated Primary Pions (Truth)", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc/truth/pions/pos/mc_gen_pion_pos_pt", "Generated Primary #pi^{+} pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc/truth/pions/neg/mc_gen_pion_neg_pt", "Generated Primary #pi^{-} pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + + registryData.add("mc/truth/kaons/mc_gen_kaon_pt", "Generated Primary Kaons (Truth)", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc/truth/kaons/pos/mc_gen_kaon_pos_pt", "Generated Primary K^{+} pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc/truth/kaons/neg/mc_gen_kaon_neg_pt", "Generated Primary K^{-} pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + + registryData.add("mc/truth/protons/mc_gen_proton_pt", "Generated Primary Protons (Truth)", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc/truth/protons/pos/mc_gen_proton_pos_pt", "Generated Primary p pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc/truth/protons/neg/mc_gen_proton_neg_pt", "Generated Primary #bar{p} pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); } void getPerpendicularDirections(const TVector3& p, TVector3& u1, TVector3& u2) @@ -242,6 +416,76 @@ struct JetHadronsPid { return TESTBIT(track.itsClusterMap(), layer - 1); } + struct pidResult { + bool isPion, isKaon, isProton; + }; + + template + pidResult getPid(const TrackType& track) + { + + double const buffer = 999.0; + double pt = track.pt(); + + double dPi; + double dKa; + double dPr; + + if (pt < cfg.ptThreshold) { + dPi = std::abs(track.tpcNSigmaPi()); + dKa = std::abs(track.tpcNSigmaKa()); + dPr = std::abs(track.tpcNSigmaPr()); + } else { + if (track.hasTOF()) { + dPi = std::hypot(track.tofNSigmaPi(), track.tpcNSigmaPi()); + dKa = std::hypot(track.tofNSigmaKa(), track.tpcNSigmaKa()); + dPr = std::hypot(track.tofNSigmaPr(), track.tpcNSigmaPr()); + } else { + dPi = buffer; + dKa = buffer; + dPr = buffer; + } + } + + bool isPiMatch = (dPi <= cfg.nSigmaCut); + bool isKaMatch = (dKa <= cfg.nSigmaCut); + bool isPrMatch = (dPr <= cfg.nSigmaCut); + + pidResult res{false, false, false}; + + if (cfg.idMethod == 0) { + if (isPiMatch && dPi < dKa && dPi < dPr) + res.isPion = true; + else if (isKaMatch && dKa < dPi && dKa < dPr) + res.isKaon = true; + else if (isPrMatch && dPr < dPi && dPr < dKa) + res.isProton = true; + } else if (cfg.idMethod == 1) { + if (isPiMatch && !isKaMatch && !isPrMatch) + res.isPion = true; + else if (isKaMatch && !isPiMatch && !isPrMatch) + res.isKaon = true; + else if (isPrMatch && !isPiMatch && !isKaMatch) + res.isProton = true; + } else if (cfg.idMethod == 2) { + if (isPiMatch && dKa > cfg.rejectionSigma && dPr > cfg.rejectionSigma) + res.isPion = true; + else if (isKaMatch && dPi > cfg.rejectionSigma && dPr > cfg.rejectionSigma) + res.isKaon = true; + else if (isPrMatch && dPi > cfg.rejectionSigma && dKa > cfg.rejectionSigma) + res.isProton = true; + } + + if (res.isPion && (pt < cfg.minPtPion || pt > cfg.maxPtPion)) + res.isPion = false; + if (res.isKaon && (pt < cfg.minPtKaon || pt > cfg.maxPtKaon)) + res.isKaon = false; + if (res.isProton && (pt < cfg.minPtProton || pt > cfg.maxPtProton)) + res.isProton = false; + + return res; + } + template bool passedTrackSelection(const TrackType& track) { @@ -293,50 +537,91 @@ struct JetHadronsPid { double eta = track.eta(); double dcaxy = track.dcaXY(); double dcaz = track.dcaZ(); - - bool passTpcPi = (std::abs(track.tpcNSigmaPi()) <= maxNSigmaPid); - bool passTpcKa = (std::abs(track.tpcNSigmaKa()) <= maxNSigmaPid); - bool passTpcPr = (std::abs(track.tpcNSigmaPr()) <= maxNSigmaPid); - - bool passTofPi = track.hasTOF() && (std::abs(track.tofNSigmaPi()) <= maxNSigmaPid); - bool passTofKa = track.hasTOF() && (std::abs(track.tofNSigmaKa()) <= maxNSigmaPid); - bool passTofPr = track.hasTOF() && (std::abs(track.tofNSigmaPr()) <= maxNSigmaPid); - - const double ptThreshold = 0.8; - - if (passTpcPi) { - registryData.fill(HIST("pion_pure_tpc"), pt, track.tpcNSigmaPi()); - if (passTofPi) - registryData.fill(HIST("pion_pure_tof"), pt, track.tofNSigmaPi()); - if (pt < ptThreshold || passTofPi) { - registryData.fill(HIST("pion_pure_pt"), pt); - registryData.fill(HIST("pion_pure_eta"), eta); - registryData.fill(HIST("pion_pure_dcaxy"), dcaxy); - registryData.fill(HIST("pion_pure_dcaz"), dcaz); + int charge = track.sign(); + + pidResult pid = getPid(track); + + if (pid.isPion) { + registryData.fill(HIST("data/pure/pions/pion_pure_tpc"), pt, track.tpcNSigmaPi()); + if (track.hasTOF()) + registryData.fill(HIST("data/pure/pions/pion_pure_tof"), pt, track.tofNSigmaPi()); + registryData.fill(HIST("data/pure/pions/pion_pure_pt"), pt); + registryData.fill(HIST("data/pure/pions/pion_pure_eta"), eta); + registryData.fill(HIST("data/pure/pions/pion_pure_dcaxy"), dcaxy); + registryData.fill(HIST("data/pure/pions/pion_pure_dcaz"), dcaz); + + if (charge > 0) { + registryData.fill(HIST("data/pure/pions/pos/pion_pure_pos_tpc"), pt, track.tpcNSigmaPi()); + if (track.hasTOF()) + registryData.fill(HIST("data/pure/pions/pos/pion_pure_pos_tof"), pt, track.tofNSigmaPi()); + registryData.fill(HIST("data/pure/pions/pos/pion_pure_pos_pt"), pt); + registryData.fill(HIST("data/pure/pions/pos/pion_pure_pos_eta"), eta); + registryData.fill(HIST("data/pure/pions/pos/pion_pure_pos_dcaxy"), dcaxy); + registryData.fill(HIST("data/pure/pions/pos/pion_pure_pos_dcaz"), dcaz); + } else { + registryData.fill(HIST("data/pure/pions/neg/pion_pure_neg_tpc"), pt, track.tpcNSigmaPi()); + if (track.hasTOF()) + registryData.fill(HIST("data/pure/pions/neg/pion_pure_neg_tof"), pt, track.tofNSigmaPi()); + registryData.fill(HIST("data/pure/pions/neg/pion_pure_neg_pt"), pt); + registryData.fill(HIST("data/pure/pions/neg/pion_pure_neg_eta"), eta); + registryData.fill(HIST("data/pure/pions/neg/pion_pure_neg_dcaxy"), dcaxy); + registryData.fill(HIST("data/pure/pions/neg/pion_pure_neg_dcaz"), dcaz); } } - if (passTpcKa) { - registryData.fill(HIST("kaon_pure_tpc"), pt, track.tpcNSigmaKa()); - if (passTofKa) - registryData.fill(HIST("kaon_pure_tof"), pt, track.tofNSigmaKa()); - if (pt < ptThreshold || passTofKa) { - registryData.fill(HIST("kaon_pure_pt"), pt); - registryData.fill(HIST("kaon_pure_eta"), eta); - registryData.fill(HIST("kaon_pure_dcaxy"), dcaxy); - registryData.fill(HIST("kaon_pure_dcaz"), dcaz); + if (pid.isKaon) { + registryData.fill(HIST("data/pure/kaons/kaon_pure_tpc"), pt, track.tpcNSigmaKa()); + if (track.hasTOF()) + registryData.fill(HIST("data/pure/kaons/kaon_pure_tof"), pt, track.tofNSigmaKa()); + registryData.fill(HIST("data/pure/kaons/kaon_pure_pt"), pt); + registryData.fill(HIST("data/pure/kaons/kaon_pure_eta"), eta); + registryData.fill(HIST("data/pure/kaons/kaon_pure_dcaxy"), dcaxy); + registryData.fill(HIST("data/pure/kaons/kaon_pure_dcaz"), dcaz); + + if (charge > 0) { + registryData.fill(HIST("data/pure/kaons/pos/kaon_pure_pos_tpc"), pt, track.tpcNSigmaKa()); + if (track.hasTOF()) + registryData.fill(HIST("data/pure/kaons/pos/kaon_pure_pos_tof"), pt, track.tofNSigmaKa()); + registryData.fill(HIST("data/pure/kaons/pos/kaon_pure_pos_pt"), pt); + registryData.fill(HIST("data/pure/kaons/pos/kaon_pure_pos_eta"), eta); + registryData.fill(HIST("data/pure/kaons/pos/kaon_pure_pos_dcaxy"), dcaxy); + registryData.fill(HIST("data/pure/kaons/pos/kaon_pure_pos_dcaz"), dcaz); + } else { + registryData.fill(HIST("data/pure/kaons/neg/kaon_pure_neg_tpc"), pt, track.tpcNSigmaKa()); + if (track.hasTOF()) + registryData.fill(HIST("data/pure/kaons/neg/kaon_pure_neg_tof"), pt, track.tofNSigmaKa()); + registryData.fill(HIST("data/pure/kaons/neg/kaon_pure_neg_pt"), pt); + registryData.fill(HIST("data/pure/kaons/neg/kaon_pure_neg_eta"), eta); + registryData.fill(HIST("data/pure/kaons/neg/kaon_pure_neg_dcaxy"), dcaxy); + registryData.fill(HIST("data/pure/kaons/neg/kaon_pure_neg_dcaz"), dcaz); } } - if (passTpcPr) { - registryData.fill(HIST("proton_pure_tpc"), pt, track.tpcNSigmaPr()); - if (passTofPr) - registryData.fill(HIST("proton_pure_tof"), pt, track.tofNSigmaPr()); - if (pt < ptThreshold || passTofPr) { - registryData.fill(HIST("proton_pure_pt"), pt); - registryData.fill(HIST("proton_pure_eta"), eta); - registryData.fill(HIST("proton_pure_dcaxy"), dcaxy); - registryData.fill(HIST("proton_pure_dcaz"), dcaz); + if (pid.isProton) { + registryData.fill(HIST("data/pure/protons/proton_pure_tpc"), pt, track.tpcNSigmaPr()); + if (track.hasTOF()) + registryData.fill(HIST("data/pure/protons/proton_pure_tof"), pt, track.tofNSigmaPr()); + registryData.fill(HIST("data/pure/protons/proton_pure_pt"), pt); + registryData.fill(HIST("data/pure/protons/proton_pure_eta"), eta); + registryData.fill(HIST("data/pure/protons/proton_pure_dcaxy"), dcaxy); + registryData.fill(HIST("data/pure/protons/proton_pure_dcaz"), dcaz); + + if (charge > 0) { + registryData.fill(HIST("data/pure/protons/pos/proton_pure_pos_tpc"), pt, track.tpcNSigmaPr()); + if (track.hasTOF()) + registryData.fill(HIST("data/pure/protons/pos/proton_pure_pos_tof"), pt, track.tofNSigmaPr()); + registryData.fill(HIST("data/pure/protons/pos/proton_pure_pos_pt"), pt); + registryData.fill(HIST("data/pure/protons/pos/proton_pure_pos_eta"), eta); + registryData.fill(HIST("data/pure/protons/pos/proton_pure_pos_dcaxy"), dcaxy); + registryData.fill(HIST("data/pure/protons/pos/proton_pure_pos_dcaz"), dcaz); + } else { + registryData.fill(HIST("data/pure/protons/neg/proton_pure_neg_tpc"), pt, track.tpcNSigmaPr()); + if (track.hasTOF()) + registryData.fill(HIST("data/pure/protons/neg/proton_pure_neg_tof"), pt, track.tofNSigmaPr()); + registryData.fill(HIST("data/pure/protons/neg/proton_pure_neg_pt"), pt); + registryData.fill(HIST("data/pure/protons/neg/proton_pure_neg_eta"), eta); + registryData.fill(HIST("data/pure/protons/neg/proton_pure_neg_dcaxy"), dcaxy); + registryData.fill(HIST("data/pure/protons/neg/proton_pure_neg_dcaz"), dcaz); } } } @@ -348,7 +633,7 @@ struct JetHadronsPid { soa::Join const&, HadronTracks const& globalTracks) { - registryData.fill(HIST("n_events_raw"), 1); + registryData.fill(HIST("data/n_events_raw"), 1); if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { return; @@ -358,8 +643,8 @@ struct JetHadronsPid { if (std::abs(zVertex) > zVtx) return; - registryData.fill(HIST("n_events"), 1); - registryData.fill(HIST("z_vtx"), zVertex); + registryData.fill(HIST("data/n_events"), 1); + registryData.fill(HIST("data/z_vtx"), zVertex); double centralRho = collision.rho(); @@ -376,8 +661,8 @@ struct JetHadronsPid { if (ptSub < 0) ptSub = 0.0; - registryData.fill(HIST("jet_pt_subtracted"), ptSub); - registryData.fill(HIST("jet_pt_raw_vs_sub"), jet.pt(), ptSub); + registryData.fill(HIST("data/jets/jet_pt_subtracted"), ptSub); + registryData.fill(HIST("data/jets/jet_pt_raw_vs_sub"), jet.pt(), ptSub); if (isppRefAnalysis && (jet.pt() < minJetPt || jet.pt() > maxJetPt)) continue; @@ -388,10 +673,10 @@ struct JetHadronsPid { if (applyAreaCut && normalizedJetArea < minNormalizedJetArea) continue; - registryData.fill(HIST("jet_eta"), jet.eta()); - registryData.fill(HIST("jet_phi"), jet.phi()); - registryData.fill(HIST("jet_area"), jet.area()); - registryData.fill(HIST("jet_pt"), jet.pt()); + registryData.fill(HIST("data/jets/jet_eta"), jet.eta()); + registryData.fill(HIST("data/jets/jet_phi"), jet.phi()); + registryData.fill(HIST("data/jets/jet_area"), jet.area()); + registryData.fill(HIST("data/jets/jet_pt"), jet.pt()); const double magnitudeThreshold = 1e-9; TVector3 jetAxis(jet.px(), jet.py(), jet.pz()); @@ -417,54 +702,95 @@ struct JetHadronsPid { double eta = track.eta(); double dcaxy = track.dcaXY(); double dcaz = track.dcaZ(); - - bool passTpcPi = (std::abs(track.tpcNSigmaPi()) <= maxNSigmaPid); - bool passTpcKa = (std::abs(track.tpcNSigmaKa()) <= maxNSigmaPid); - bool passTpcPr = (std::abs(track.tpcNSigmaPr()) <= maxNSigmaPid); - - bool passTofPi = track.hasTOF() && (std::abs(track.tofNSigmaPi()) <= maxNSigmaPid); - bool passTofKa = track.hasTOF() && (std::abs(track.tofNSigmaKa()) <= maxNSigmaPid); - bool passTofPr = track.hasTOF() && (std::abs(track.tofNSigmaPr()) <= maxNSigmaPid); - - const double ptThreshold = 0.8; - - if (passTpcPi) { - registryData.fill(HIST("pion_jet_tpc"), pt, track.tpcNSigmaPi()); - if (passTofPi) - registryData.fill(HIST("pion_jet_tof"), pt, track.tofNSigmaPi()); - if (pt < ptThreshold || passTofPi) { - registryData.fill(HIST("pion_jet_pt"), pt); - registryData.fill(HIST("pion_jet_eta"), eta); - registryData.fill(HIST("pion_jet_dcaxy"), dcaxy); - registryData.fill(HIST("pion_jet_dcaz"), dcaz); + int charge = track.sign(); + + pidResult pid = getPid(track); + + if (pid.isPion) { + registryData.fill(HIST("data/jets/pions/pion_jet_tpc"), pt, track.tpcNSigmaPi()); + if (track.hasTOF()) + registryData.fill(HIST("data/jets/pions/pion_jet_tof"), pt, track.tofNSigmaPi()); + registryData.fill(HIST("data/jets/pions/pion_jet_pt"), pt); + registryData.fill(HIST("data/jets/pions/pion_jet_eta"), eta); + registryData.fill(HIST("data/jets/pions/pion_jet_dcaxy"), dcaxy); + registryData.fill(HIST("data/jets/pions/pion_jet_dcaz"), dcaz); + + if (charge > 0) { + registryData.fill(HIST("data/jets/pions/pos/pion_jet_pos_tpc"), pt, track.tpcNSigmaPi()); + if (track.hasTOF()) + registryData.fill(HIST("data/jets/pions/pos/pion_jet_pos_tof"), pt, track.tofNSigmaPi()); + registryData.fill(HIST("data/jets/pions/pos/pion_jet_pos_pt"), pt); + registryData.fill(HIST("data/jets/pions/pos/pion_jet_pos_eta"), eta); + registryData.fill(HIST("data/jets/pions/pos/pion_jet_pos_dcaxy"), dcaxy); + registryData.fill(HIST("data/jets/pions/pos/pion_jet_pos_dcaz"), dcaz); + } else { + registryData.fill(HIST("data/jets/pions/neg/pion_jet_neg_tpc"), pt, track.tpcNSigmaPi()); + if (track.hasTOF()) + registryData.fill(HIST("data/jets/pions/neg/pion_jet_neg_tof"), pt, track.tofNSigmaPi()); + registryData.fill(HIST("data/jets/pions/neg/pion_jet_neg_pt"), pt); + registryData.fill(HIST("data/jets/pions/neg/pion_jet_neg_eta"), eta); + registryData.fill(HIST("data/jets/pions/neg/pion_jet_neg_dcaxy"), dcaxy); + registryData.fill(HIST("data/jets/pions/neg/pion_jet_neg_dcaz"), dcaz); } } - if (passTpcKa) { - registryData.fill(HIST("kaon_jet_tpc"), pt, track.tpcNSigmaKa()); - if (passTofKa) - registryData.fill(HIST("kaon_jet_tof"), pt, track.tofNSigmaKa()); - if (pt < ptThreshold || passTofKa) { - registryData.fill(HIST("kaon_jet_pt"), pt); - registryData.fill(HIST("kaon_jet_eta"), eta); - registryData.fill(HIST("kaon_jet_dcaxy"), dcaxy); - registryData.fill(HIST("kaon_jet_dcaz"), dcaz); + if (pid.isKaon) { + registryData.fill(HIST("data/jets/kaons/kaon_jet_tpc"), pt, track.tpcNSigmaKa()); + if (track.hasTOF()) + registryData.fill(HIST("data/jets/kaons/kaon_jet_tof"), pt, track.tofNSigmaKa()); + registryData.fill(HIST("data/jets/kaons/kaon_jet_pt"), pt); + registryData.fill(HIST("data/jets/kaons/kaon_jet_eta"), eta); + registryData.fill(HIST("data/jets/kaons/kaon_jet_dcaxy"), dcaxy); + registryData.fill(HIST("data/jets/kaons/kaon_jet_dcaz"), dcaz); + + if (charge > 0) { + registryData.fill(HIST("data/jets/kaons/pos/kaon_jet_pos_tpc"), pt, track.tpcNSigmaKa()); + if (track.hasTOF()) + registryData.fill(HIST("data/jets/kaons/pos/kaon_jet_pos_tof"), pt, track.tofNSigmaKa()); + registryData.fill(HIST("data/jets/kaons/pos/kaon_jet_pos_pt"), pt); + registryData.fill(HIST("data/jets/kaons/pos/kaon_jet_pos_eta"), eta); + registryData.fill(HIST("data/jets/kaons/pos/kaon_jet_pos_dcaxy"), dcaxy); + registryData.fill(HIST("data/jets/kaons/pos/kaon_jet_pos_dcaz"), dcaz); + } else { + registryData.fill(HIST("data/jets/kaons/neg/kaon_jet_neg_tpc"), pt, track.tpcNSigmaKa()); + if (track.hasTOF()) + registryData.fill(HIST("data/jets/kaons/neg/kaon_jet_neg_tof"), pt, track.tofNSigmaKa()); + registryData.fill(HIST("data/jets/kaons/neg/kaon_jet_neg_pt"), pt); + registryData.fill(HIST("data/jets/kaons/neg/kaon_jet_neg_eta"), eta); + registryData.fill(HIST("data/jets/kaons/neg/kaon_jet_neg_dcaxy"), dcaxy); + registryData.fill(HIST("data/jets/kaons/neg/kaon_jet_neg_dcaz"), dcaz); } } - if (passTpcPr) { - registryData.fill(HIST("proton_jet_tpc"), pt, track.tpcNSigmaPr()); - if (passTofPr) - registryData.fill(HIST("proton_jet_tof"), pt, track.tofNSigmaPr()); - if (pt < ptThreshold || passTofPr) { - registryData.fill(HIST("proton_jet_pt"), pt); - registryData.fill(HIST("proton_jet_eta"), eta); - registryData.fill(HIST("proton_jet_dcaxy"), dcaxy); - registryData.fill(HIST("proton_jet_dcaz"), dcaz); + if (pid.isProton) { + registryData.fill(HIST("data/jets/protons/proton_jet_tpc"), pt, track.tpcNSigmaPr()); + if (track.hasTOF()) + registryData.fill(HIST("data/jets/protons/proton_jet_tof"), pt, track.tofNSigmaPr()); + registryData.fill(HIST("data/jets/protons/proton_jet_pt"), pt); + registryData.fill(HIST("data/jets/protons/proton_jet_eta"), eta); + registryData.fill(HIST("data/jets/protons/proton_jet_dcaxy"), dcaxy); + registryData.fill(HIST("data/jets/protons/proton_jet_dcaz"), dcaz); + + if (charge > 0) { + registryData.fill(HIST("data/jets/protons/pos/proton_jet_pos_tpc"), pt, track.tpcNSigmaPr()); + if (track.hasTOF()) + registryData.fill(HIST("data/jets/protons/pos/proton_jet_pos_tof"), pt, track.tofNSigmaPr()); + registryData.fill(HIST("data/jets/protons/pos/proton_jet_pos_pt"), pt); + registryData.fill(HIST("data/jets/protons/pos/proton_jet_pos_eta"), eta); + registryData.fill(HIST("data/jets/protons/pos/proton_jet_pos_dcaxy"), dcaxy); + registryData.fill(HIST("data/jets/protons/pos/proton_jet_pos_dcaz"), dcaz); + } else { + registryData.fill(HIST("data/jets/protons/neg/proton_jet_neg_tpc"), pt, track.tpcNSigmaPr()); + if (track.hasTOF()) + registryData.fill(HIST("data/jets/protons/neg/proton_jet_neg_tof"), pt, track.tofNSigmaPr()); + registryData.fill(HIST("data/jets/protons/neg/proton_jet_neg_pt"), pt); + registryData.fill(HIST("data/jets/protons/neg/proton_jet_neg_eta"), eta); + registryData.fill(HIST("data/jets/protons/neg/proton_jet_neg_dcaxy"), dcaxy); + registryData.fill(HIST("data/jets/protons/neg/proton_jet_neg_dcaz"), dcaz); } } } - registryData.fill(HIST("jet_n_constituents"), constituentCount); + registryData.fill(HIST("data/jets/jet_n_constituents"), constituentCount); int nTracksOut = 0; @@ -480,11 +806,11 @@ struct JetHadronsPid { double deltaEtaUe1 = track.eta() - ueAxis1.Eta(); double deltaPhiUe1 = RecoDecay::constrainAngle(track.phi() - ueAxis1.Phi(), -PI); - double deltaRUe1 = std::sqrt(deltaEtaUe1 * deltaEtaUe1 + deltaPhiUe1 * deltaPhiUe1); + double deltaRUe1 = std::hypot(deltaEtaUe1, deltaPhiUe1); double deltaEtaUe2 = track.eta() - ueAxis2.Eta(); double deltaPhiUe2 = RecoDecay::constrainAngle(track.phi() - ueAxis2.Phi(), -PI); - double deltaRUe2 = std::sqrt(deltaEtaUe2 * deltaEtaUe2 + deltaPhiUe2 * deltaPhiUe2); + double deltaRUe2 = std::hypot(deltaEtaUe2, deltaPhiUe2); if (deltaRUe1 > rJet && deltaRUe2 > rJet) continue; @@ -493,54 +819,98 @@ struct JetHadronsPid { double eta = track.eta(); double dcaxy = track.dcaXY(); double dcaz = track.dcaZ(); - - bool passTpcPi = (std::abs(track.tpcNSigmaPi()) <= maxNSigmaPid); - bool passTpcKa = (std::abs(track.tpcNSigmaKa()) <= maxNSigmaPid); - bool passTpcPr = (std::abs(track.tpcNSigmaPr()) <= maxNSigmaPid); - - bool passTofPi = track.hasTOF() && (std::abs(track.tofNSigmaPi()) <= maxNSigmaPid); - bool passTofKa = track.hasTOF() && (std::abs(track.tofNSigmaKa()) <= maxNSigmaPid); - bool passTofPr = track.hasTOF() && (std::abs(track.tofNSigmaPr()) <= maxNSigmaPid); - - const double ptThreshold = 0.8; - - if (passTpcPi) { - registryData.fill(HIST("pion_ue_tpc"), pt, track.tpcNSigmaPi()); - if (passTofPi) - registryData.fill(HIST("pion_ue_tof"), pt, track.tofNSigmaPi()); - if (pt < ptThreshold || passTofPi) { - registryData.fill(HIST("pion_ue_pt"), pt); - registryData.fill(HIST("pion_ue_eta"), eta); - registryData.fill(HIST("pion_ue_dcaxy"), dcaxy); - registryData.fill(HIST("pion_ue_dcaz"), dcaz); + int charge = track.sign(); + + pidResult pid = getPid(track); + + if (pid.isPion) { + registryData.fill(HIST("data/ue/pions/pion_ue_tpc"), pt, track.tpcNSigmaPi()); + if (track.hasTOF()) + registryData.fill(HIST("data/ue/pions/pion_ue_tof"), pt, track.tofNSigmaPi()); + + registryData.fill(HIST("data/ue/pions/pion_ue_pt"), pt); + registryData.fill(HIST("data/ue/pions/pion_ue_eta"), eta); + registryData.fill(HIST("data/ue/pions/pion_ue_dcaxy"), dcaxy); + registryData.fill(HIST("data/ue/pions/pion_ue_dcaz"), dcaz); + + if (charge > 0) { + registryData.fill(HIST("data/ue/pions/pos/pion_ue_pos_tpc"), pt, track.tpcNSigmaPi()); + if (track.hasTOF()) + registryData.fill(HIST("data/ue/pions/pos/pion_ue_pos_tof"), pt, track.tofNSigmaPi()); + registryData.fill(HIST("data/ue/pions/pos/pion_ue_pos_pt"), pt); + registryData.fill(HIST("data/ue/pions/pos/pion_ue_pos_eta"), eta); + registryData.fill(HIST("data/ue/pions/pos/pion_ue_pos_dcaxy"), dcaxy); + registryData.fill(HIST("data/ue/pions/pos/pion_ue_pos_dcaz"), dcaz); + } else { + registryData.fill(HIST("data/ue/pions/neg/pion_ue_neg_tpc"), pt, track.tpcNSigmaPi()); + if (track.hasTOF()) + registryData.fill(HIST("data/ue/pions/neg/pion_ue_neg_tof"), pt, track.tofNSigmaPi()); + registryData.fill(HIST("data/ue/pions/neg/pion_ue_neg_pt"), pt); + registryData.fill(HIST("data/ue/pions/neg/pion_ue_neg_eta"), eta); + registryData.fill(HIST("data/ue/pions/neg/pion_ue_neg_dcaxy"), dcaxy); + registryData.fill(HIST("data/ue/pions/neg/pion_ue_neg_dcaz"), dcaz); } } - if (passTpcKa) { - registryData.fill(HIST("kaon_ue_tpc"), pt, track.tpcNSigmaKa()); - if (passTofKa) - registryData.fill(HIST("kaon_ue_tof"), pt, track.tofNSigmaKa()); - if (pt < ptThreshold || passTofKa) { - registryData.fill(HIST("kaon_ue_pt"), pt); - registryData.fill(HIST("kaon_ue_eta"), eta); - registryData.fill(HIST("kaon_ue_dcaxy"), dcaxy); - registryData.fill(HIST("kaon_ue_dcaz"), dcaz); + if (pid.isKaon) { + registryData.fill(HIST("data/ue/kaons/kaon_ue_tpc"), pt, track.tpcNSigmaKa()); + if (track.hasTOF()) + registryData.fill(HIST("data/ue/kaons/kaon_ue_tof"), pt, track.tofNSigmaKa()); + + registryData.fill(HIST("data/ue/kaons/kaon_ue_pt"), pt); + registryData.fill(HIST("data/ue/kaons/kaon_ue_eta"), eta); + registryData.fill(HIST("data/ue/kaons/kaon_ue_dcaxy"), dcaxy); + registryData.fill(HIST("data/ue/kaons/kaon_ue_dcaz"), dcaz); + + if (charge > 0) { + registryData.fill(HIST("data/ue/kaons/pos/kaon_ue_pos_tpc"), pt, track.tpcNSigmaKa()); + if (track.hasTOF()) + registryData.fill(HIST("data/ue/kaons/pos/kaon_ue_pos_tof"), pt, track.tofNSigmaKa()); + registryData.fill(HIST("data/ue/kaons/pos/kaon_ue_pos_pt"), pt); + registryData.fill(HIST("data/ue/kaons/pos/kaon_ue_pos_eta"), eta); + registryData.fill(HIST("data/ue/kaons/pos/kaon_ue_pos_dcaxy"), dcaxy); + registryData.fill(HIST("data/ue/kaons/pos/kaon_ue_pos_dcaz"), dcaz); + } else { + registryData.fill(HIST("data/ue/kaons/neg/kaon_ue_neg_tpc"), pt, track.tpcNSigmaKa()); + if (track.hasTOF()) + registryData.fill(HIST("data/ue/kaons/neg/kaon_ue_neg_tof"), pt, track.tofNSigmaKa()); + registryData.fill(HIST("data/ue/kaons/neg/kaon_ue_neg_pt"), pt); + registryData.fill(HIST("data/ue/kaons/neg/kaon_ue_neg_eta"), eta); + registryData.fill(HIST("data/ue/kaons/neg/kaon_ue_neg_dcaxy"), dcaxy); + registryData.fill(HIST("data/ue/kaons/neg/kaon_ue_neg_dcaz"), dcaz); } } - if (passTpcPr) { - registryData.fill(HIST("proton_ue_tpc"), pt, track.tpcNSigmaPr()); - if (passTofPr) - registryData.fill(HIST("proton_ue_tof"), pt, track.tofNSigmaPr()); - if (pt < ptThreshold || passTofPr) { - registryData.fill(HIST("proton_ue_pt"), pt); - registryData.fill(HIST("proton_ue_eta"), eta); - registryData.fill(HIST("proton_ue_dcaxy"), dcaxy); - registryData.fill(HIST("proton_ue_dcaz"), dcaz); + if (pid.isProton) { + registryData.fill(HIST("data/ue/protons/proton_ue_tpc"), pt, track.tpcNSigmaPr()); + if (track.hasTOF()) + registryData.fill(HIST("data/ue/protons/proton_ue_tof"), pt, track.tofNSigmaPr()); + + registryData.fill(HIST("data/ue/protons/proton_ue_pt"), pt); + registryData.fill(HIST("data/ue/protons/proton_ue_eta"), eta); + registryData.fill(HIST("data/ue/protons/proton_ue_dcaxy"), dcaxy); + registryData.fill(HIST("data/ue/protons/proton_ue_dcaz"), dcaz); + + if (charge > 0) { + registryData.fill(HIST("data/ue/protons/pos/proton_ue_pos_tpc"), pt, track.tpcNSigmaPr()); + if (track.hasTOF()) + registryData.fill(HIST("data/ue/protons/pos/proton_ue_pos_tof"), pt, track.tofNSigmaPr()); + registryData.fill(HIST("data/ue/protons/pos/proton_ue_pos_pt"), pt); + registryData.fill(HIST("data/ue/protons/pos/proton_ue_pos_eta"), eta); + registryData.fill(HIST("data/ue/protons/pos/proton_ue_pos_dcaxy"), dcaxy); + registryData.fill(HIST("data/ue/protons/pos/proton_ue_pos_dcaz"), dcaz); + } else { + registryData.fill(HIST("data/ue/protons/neg/proton_ue_neg_tpc"), pt, track.tpcNSigmaPr()); + if (track.hasTOF()) + registryData.fill(HIST("data/ue/protons/neg/proton_ue_neg_tof"), pt, track.tofNSigmaPr()); + registryData.fill(HIST("data/ue/protons/neg/proton_ue_neg_pt"), pt); + registryData.fill(HIST("data/ue/protons/neg/proton_ue_neg_eta"), eta); + registryData.fill(HIST("data/ue/protons/neg/proton_ue_neg_dcaxy"), dcaxy); + registryData.fill(HIST("data/ue/protons/neg/proton_ue_neg_dcaz"), dcaz); } } } - registryData.fill(HIST("tracks_n_in_ue"), nTracksOut); + registryData.fill(HIST("data/ue/tracks_n_in_ue"), nTracksOut); } } PROCESS_SWITCH(JetHadronsPid, processJets, "Jets Analysis", true); @@ -562,7 +932,7 @@ struct JetHadronsPid { if (requireIsVertexTOFmatched && !collision.selection_bit(o2::aod::evsel::kIsVertexTOFmatched)) return; - const double ptThreshold = 0.8; + registryData.fill(HIST("mc/n_events"), 1); for (auto const& track : tracks) { @@ -571,52 +941,100 @@ struct JetHadronsPid { double pt = track.pt(); - bool passTpcPi = (std::abs(track.tpcNSigmaPi()) <= maxNSigmaPid); - bool passTofPi = track.hasTOF() && (std::abs(track.tofNSigmaPi()) <= maxNSigmaPid); - - bool passTpcKa = (std::abs(track.tpcNSigmaKa()) <= maxNSigmaPid); - bool passTofKa = track.hasTOF() && (std::abs(track.tofNSigmaKa()) <= maxNSigmaPid); - - bool passTpcPr = (std::abs(track.tpcNSigmaPr()) <= maxNSigmaPid); - bool passTofPr = track.hasTOF() && (std::abs(track.tofNSigmaPr()) <= maxNSigmaPid); - if (!track.has_mcParticle()) continue; auto const& trueParticle = track.mcParticle(); int pdg = std::abs(trueParticle.pdgCode()); bool isPrimary = trueParticle.isPhysicalPrimary(); + int charge = track.sign(); + + pidResult pid = getPid(track); + + if (pid.isPion) { + registryData.fill(HIST("mc/reconstruction/pions/rec_pion_all"), pt); + registryData.fill(HIST("mc/reconstruction/pions/contamination_matrix_pion"), pdg, pt); + + if (charge > 0) { + registryData.fill(HIST("mc/reconstruction/pions/pos/rec_pion_pos_all"), pt); + registryData.fill(HIST("mc/reconstruction/pions/pos/contamination_matrix_pion_pos"), pdg, pt); + } else { + registryData.fill(HIST("mc/reconstruction/pions/neg/rec_pion_neg_all"), pt); + registryData.fill(HIST("mc/reconstruction/pions/neg/contamination_matrix_pion_neg"), pdg, pt); + } - if (passTpcPi && (pt < ptThreshold || passTofPi)) { - registryData.fill(HIST("rec_pion_all"), pt); - registryData.fill(HIST("contamination_matrix_pion"), pdg, pt); if (isPrimary) { - if (pdg == PDG_t::kPiPlus) - registryData.fill(HIST("mc_rec_pion_pt"), pt); + if (pdg == PDG_t::kPiPlus) { + registryData.fill(HIST("mc/reconstruction/pions/mc_rec_pion_pt"), pt); + if (charge > 0) + registryData.fill(HIST("mc/reconstruction/pions/pos/mc_rec_pion_pos_pt"), pt); + else + registryData.fill(HIST("mc/reconstruction/pions/neg/mc_rec_pion_neg_pt"), pt); + } } else { - registryData.fill(HIST("mc_sec_pion_pt"), pt); + registryData.fill(HIST("mc/reconstruction/pions/mc_sec_pion_pt"), pt); + if (charge > 0) + registryData.fill(HIST("mc/reconstruction/pions/pos/mc_sec_pion_pos_pt"), pt); + else + registryData.fill(HIST("mc/reconstruction/pions/neg/mc_sec_pion_neg_pt"), pt); } } - if (passTpcKa && (pt < ptThreshold || passTofKa)) { - registryData.fill(HIST("rec_kaon_all"), pt); - registryData.fill(HIST("contamination_matrix_kaon"), pdg, pt); + if (pid.isKaon) { + registryData.fill(HIST("mc/reconstruction/kaons/rec_kaon_all"), pt); + registryData.fill(HIST("mc/reconstruction/kaons/contamination_matrix_kaon"), pdg, pt); + + if (charge > 0) { + registryData.fill(HIST("mc/reconstruction/kaons/pos/rec_kaon_pos_all"), pt); + registryData.fill(HIST("mc/reconstruction/kaons/pos/contamination_matrix_kaon_pos"), pdg, pt); + } else { + registryData.fill(HIST("mc/reconstruction/kaons/neg/rec_kaon_neg_all"), pt); + registryData.fill(HIST("mc/reconstruction/kaons/neg/contamination_matrix_kaon_neg"), pdg, pt); + } + if (isPrimary) { - if (pdg == PDG_t::kKPlus) - registryData.fill(HIST("mc_rec_kaon_pt"), pt); + if (pdg == PDG_t::kKPlus) { + registryData.fill(HIST("mc/reconstruction/kaons/mc_rec_kaon_pt"), pt); + if (charge > 0) + registryData.fill(HIST("mc/reconstruction/kaons/pos/mc_rec_kaon_pos_pt"), pt); + else + registryData.fill(HIST("mc/reconstruction/kaons/neg/mc_rec_kaon_neg_pt"), pt); + } } else { - registryData.fill(HIST("mc_sec_kaon_pt"), pt); + registryData.fill(HIST("mc/reconstruction/kaons/mc_sec_kaon_pt"), pt); + if (charge > 0) + registryData.fill(HIST("mc/reconstruction/kaons/pos/mc_sec_kaon_pos_pt"), pt); + else + registryData.fill(HIST("mc/reconstruction/kaons/neg/mc_sec_kaon_neg_pt"), pt); } } - if (passTpcPr && (pt < ptThreshold || passTofPr)) { - registryData.fill(HIST("rec_proton_all"), pt); - registryData.fill(HIST("contamination_matrix_proton"), pdg, pt); + if (pid.isProton) { + registryData.fill(HIST("mc/reconstruction/protons/rec_proton_all"), pt); + registryData.fill(HIST("mc/reconstruction/protons/contamination_matrix_proton"), pdg, pt); + + if (charge > 0) { + registryData.fill(HIST("mc/reconstruction/protons/pos/rec_proton_pos_all"), pt); + registryData.fill(HIST("mc/reconstruction/protons/pos/contamination_matrix_proton_pos"), pdg, pt); + } else { + registryData.fill(HIST("mc/reconstruction/protons/neg/rec_proton_neg_all"), pt); + registryData.fill(HIST("mc/reconstruction/protons/neg/contamination_matrix_proton_neg"), pdg, pt); + } + if (isPrimary) { - if (pdg == PDG_t::kProton) - registryData.fill(HIST("mc_rec_proton_pt"), pt); + if (pdg == PDG_t::kProton) { + registryData.fill(HIST("mc/reconstruction/protons/mc_rec_proton_pt"), pt); + if (charge > 0) + registryData.fill(HIST("mc/reconstruction/protons/pos/mc_rec_proton_pos_pt"), pt); + else + registryData.fill(HIST("mc/reconstruction/protons/neg/mc_rec_proton_neg_pt"), pt); + } } else { - registryData.fill(HIST("mc_sec_proton_pt"), pt); + registryData.fill(HIST("mc/reconstruction/protons/mc_sec_proton_pt"), pt); + if (charge > 0) + registryData.fill(HIST("mc/reconstruction/protons/pos/mc_sec_proton_pos_pt"), pt); + else + registryData.fill(HIST("mc/reconstruction/protons/neg/mc_sec_proton_neg_pt"), pt); } } } @@ -625,6 +1043,7 @@ struct JetHadronsPid { void processMCTruth(aod::McCollisions::iterator const& mcCollision, aod::McParticles const& mcParticles) { + if (std::abs(mcCollision.posZ()) > zVtx) return; @@ -635,18 +1054,35 @@ struct JetHadronsPid { if (mcpart.eta() < minEta || mcpart.eta() > maxEta) continue; - if (mcpart.pt() < minPt || mcpart.pt() > maxPt) - continue; - int pdg = std::abs(mcpart.pdgCode()); + int originalPdg = mcpart.pdgCode(); + int pdg = std::abs(originalPdg); double pt = mcpart.pt(); if (pdg == PDG_t::kPiPlus) { - registryData.fill(HIST("mc_gen_pion_pt"), pt); + if (pt >= cfg.minPtPion && pt <= cfg.maxPtPion) { + registryData.fill(HIST("mc/truth/pions/mc_gen_pion_pt"), pt); + if (originalPdg > 0) + registryData.fill(HIST("mc/truth/pions/pos/mc_gen_pion_pos_pt"), pt); + else + registryData.fill(HIST("mc/truth/pions/neg/mc_gen_pion_neg_pt"), pt); + } } else if (pdg == PDG_t::kKPlus) { - registryData.fill(HIST("mc_gen_kaon_pt"), pt); + if (pt >= cfg.minPtKaon && pt <= cfg.maxPtKaon) { + registryData.fill(HIST("mc/truth/kaons/mc_gen_kaon_pt"), pt); + if (originalPdg > 0) + registryData.fill(HIST("mc/truth/kaons/pos/mc_gen_kaon_pos_pt"), pt); + else + registryData.fill(HIST("mc/truth/kaons/neg/mc_gen_kaon_neg_pt"), pt); + } } else if (pdg == PDG_t::kProton) { - registryData.fill(HIST("mc_gen_proton_pt"), pt); + if (pt >= cfg.minPtProton && pt <= cfg.maxPtProton) { + registryData.fill(HIST("mc/truth/protons/mc_gen_proton_pt"), pt); + if (originalPdg > 0) + registryData.fill(HIST("mc/truth/protons/pos/mc_gen_proton_pos_pt"), pt); + else + registryData.fill(HIST("mc/truth/protons/neg/mc_gen_proton_neg_pt"), pt); + } } } } @@ -656,4 +1092,4 @@ struct JetHadronsPid { WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{adaptAnalysisTask(cfgc)}; -} \ No newline at end of file +} From e0a061a13a2f2525881b2e0b47996e7975b7b4ff Mon Sep 17 00:00:00 2001 From: Leonard Date: Fri, 10 Jul 2026 09:32:53 +0200 Subject: [PATCH 31/35] Comply with o2linter checks in jetHadronsPid.cxx --- PWGJE/Tasks/jetHadronsPid.cxx | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/PWGJE/Tasks/jetHadronsPid.cxx b/PWGJE/Tasks/jetHadronsPid.cxx index d112b53167e..4daad7ebe9a 100644 --- a/PWGJE/Tasks/jetHadronsPid.cxx +++ b/PWGJE/Tasks/jetHadronsPid.cxx @@ -115,7 +115,7 @@ struct JetHadronsPid { Preslice tracksPerCollision = aod::track::collisionId; struct : ConfigurableGroup { - Configurable idMethod{"idMethod", 0, "Variable for choosing pid method"}; + Configurable pidMethod{"pidMethod", 0, "Variable for choosing pid method"}; Configurable rejectionSigma{"rejectionSigma", 3.0, "Rejection sigma for tof and tpc pid"}; Configurable ptThreshold{"ptThreshold", 0.8, "Threshold for pt for different pid methods"}; Configurable nSigmaCut{"nSigmaCut", 2.0, "Acceptence cut for pid methods"}; @@ -416,14 +416,18 @@ struct JetHadronsPid { return TESTBIT(track.itsClusterMap(), layer - 1); } - struct pidResult { + struct PidResult { bool isPion, isKaon, isProton; }; template - pidResult getPid(const TrackType& track) + PidResult getPid(const TrackType& track) { + constexpr int ClosestMatch = 0; + constexpr int ExclusiveMatch = 1; + constexpr int RejectionBased = 2; + double const buffer = 999.0; double pt = track.pt(); @@ -451,23 +455,23 @@ struct JetHadronsPid { bool isKaMatch = (dKa <= cfg.nSigmaCut); bool isPrMatch = (dPr <= cfg.nSigmaCut); - pidResult res{false, false, false}; + PidResult res{false, false, false}; - if (cfg.idMethod == 0) { + if (cfg.pidMethod == ClosestMatch) { if (isPiMatch && dPi < dKa && dPi < dPr) res.isPion = true; else if (isKaMatch && dKa < dPi && dKa < dPr) res.isKaon = true; else if (isPrMatch && dPr < dPi && dPr < dKa) res.isProton = true; - } else if (cfg.idMethod == 1) { + } else if (cfg.pidMethod == ExclusiveMatch) { if (isPiMatch && !isKaMatch && !isPrMatch) res.isPion = true; else if (isKaMatch && !isPiMatch && !isPrMatch) res.isKaon = true; else if (isPrMatch && !isPiMatch && !isKaMatch) res.isProton = true; - } else if (cfg.idMethod == 2) { + } else if (cfg.pidMethod == RejectionBased) { if (isPiMatch && dKa > cfg.rejectionSigma && dPr > cfg.rejectionSigma) res.isPion = true; else if (isKaMatch && dPi > cfg.rejectionSigma && dPr > cfg.rejectionSigma) @@ -539,7 +543,7 @@ struct JetHadronsPid { double dcaz = track.dcaZ(); int charge = track.sign(); - pidResult pid = getPid(track); + PidResult pid = getPid(track); if (pid.isPion) { registryData.fill(HIST("data/pure/pions/pion_pure_tpc"), pt, track.tpcNSigmaPi()); @@ -704,7 +708,7 @@ struct JetHadronsPid { double dcaz = track.dcaZ(); int charge = track.sign(); - pidResult pid = getPid(track); + PidResult pid = getPid(track); if (pid.isPion) { registryData.fill(HIST("data/jets/pions/pion_jet_tpc"), pt, track.tpcNSigmaPi()); @@ -821,7 +825,7 @@ struct JetHadronsPid { double dcaz = track.dcaZ(); int charge = track.sign(); - pidResult pid = getPid(track); + PidResult pid = getPid(track); if (pid.isPion) { registryData.fill(HIST("data/ue/pions/pion_ue_tpc"), pt, track.tpcNSigmaPi()); @@ -949,7 +953,7 @@ struct JetHadronsPid { bool isPrimary = trueParticle.isPhysicalPrimary(); int charge = track.sign(); - pidResult pid = getPid(track); + PidResult pid = getPid(track); if (pid.isPion) { registryData.fill(HIST("mc/reconstruction/pions/rec_pion_all"), pt); From 1a67dbf8c0f77ce06cdf74d8d34d9d978636fe65 Mon Sep 17 00:00:00 2001 From: Leonard Date: Fri, 10 Jul 2026 16:16:09 +0200 Subject: [PATCH 32/35] Fix O2Physics code checks errors in jetHadronsPid.cxx --- PWGJE/Tasks/jetHadronsPid.cxx | 292 ++++++++++++++++++++++------------ 1 file changed, 188 insertions(+), 104 deletions(-) diff --git a/PWGJE/Tasks/jetHadronsPid.cxx b/PWGJE/Tasks/jetHadronsPid.cxx index 4daad7ebe9a..9dbeaf0d18f 100644 --- a/PWGJE/Tasks/jetHadronsPid.cxx +++ b/PWGJE/Tasks/jetHadronsPid.cxx @@ -431,9 +431,9 @@ struct JetHadronsPid { double const buffer = 999.0; double pt = track.pt(); - double dPi; - double dKa; - double dPr; + double dPi = 0; + double dKa = 0; + double dPr = 0; if (pt < cfg.ptThreshold) { dPi = std::abs(track.tpcNSigmaPi()); @@ -455,37 +455,43 @@ struct JetHadronsPid { bool isKaMatch = (dKa <= cfg.nSigmaCut); bool isPrMatch = (dPr <= cfg.nSigmaCut); - PidResult res{false, false, false}; + PidResult res{.isPion = false, .isKaon = false, .isProton = false}; if (cfg.pidMethod == ClosestMatch) { - if (isPiMatch && dPi < dKa && dPi < dPr) + if (isPiMatch && dPi < dKa && dPi < dPr) { res.isPion = true; - else if (isKaMatch && dKa < dPi && dKa < dPr) + } else if (isKaMatch && dKa < dPi && dKa < dPr) { res.isKaon = true; - else if (isPrMatch && dPr < dPi && dPr < dKa) + } else if (isPrMatch && dPr < dPi && dPr < dKa) { res.isProton = true; + } } else if (cfg.pidMethod == ExclusiveMatch) { - if (isPiMatch && !isKaMatch && !isPrMatch) + if (isPiMatch && !isKaMatch && !isPrMatch) { res.isPion = true; - else if (isKaMatch && !isPiMatch && !isPrMatch) + } else if (isKaMatch && !isPiMatch && !isPrMatch) { res.isKaon = true; - else if (isPrMatch && !isPiMatch && !isKaMatch) + } else if (isPrMatch && !isPiMatch && !isKaMatch) { res.isProton = true; + } } else if (cfg.pidMethod == RejectionBased) { - if (isPiMatch && dKa > cfg.rejectionSigma && dPr > cfg.rejectionSigma) + if (isPiMatch && dKa > cfg.rejectionSigma && dPr > cfg.rejectionSigma) { res.isPion = true; - else if (isKaMatch && dPi > cfg.rejectionSigma && dPr > cfg.rejectionSigma) + } else if (isKaMatch && dPi > cfg.rejectionSigma && dPr > cfg.rejectionSigma) { res.isKaon = true; - else if (isPrMatch && dPi > cfg.rejectionSigma && dKa > cfg.rejectionSigma) + } else if (isPrMatch && dPi > cfg.rejectionSigma && dKa > cfg.rejectionSigma) { res.isProton = true; + } } - if (res.isPion && (pt < cfg.minPtPion || pt > cfg.maxPtPion)) + if (res.isPion && (pt < cfg.minPtPion || pt > cfg.maxPtPion)) { res.isPion = false; - if (res.isKaon && (pt < cfg.minPtKaon || pt > cfg.maxPtKaon)) + } + if (res.isKaon && (pt < cfg.minPtKaon || pt > cfg.maxPtKaon)) { res.isKaon = false; - if (res.isProton && (pt < cfg.minPtProton || pt > cfg.maxPtProton)) + } + if (res.isProton && (pt < cfg.minPtProton || pt > cfg.maxPtProton)) { res.isProton = false; + } return res; } @@ -493,49 +499,67 @@ struct JetHadronsPid { template bool passedTrackSelection(const TrackType& track) { - if (requirePvContributor && !(track.isPVContributor())) + if (requirePvContributor && !(track.isPVContributor())) { return false; - if (!track.hasITS() || !track.hasTPC()) + } + if (!track.hasITS() || !track.hasTPC()) { return false; - if ((!hasITSLayerHit(track, 1)) && (!hasITSLayerHit(track, 2)) && (!hasITSLayerHit(track, 3))) + } + if ((!hasITSLayerHit(track, 1)) && (!hasITSLayerHit(track, 2)) && (!hasITSLayerHit(track, 3))) { return false; - if (track.itsNCls() < minItsNclusters) + } + if (track.itsNCls() < minItsNclusters) { return false; - if (track.tpcNClsCrossedRows() < minTpcNcrossedRows) + } + if (track.tpcNClsCrossedRows() < minTpcNcrossedRows) { return false; - if (track.tpcChi2NCl() < minChiSquareTpc || track.tpcChi2NCl() > maxChiSquareTpc) + } + if (track.tpcChi2NCl() < minChiSquareTpc || track.tpcChi2NCl() > maxChiSquareTpc) { return false; - if (track.itsChi2NCl() > maxChiSquareIts) + } + if (track.itsChi2NCl() > maxChiSquareIts) { return false; - if (track.eta() < minEta || track.eta() > maxEta) + } + if (track.eta() < minEta || track.eta() > maxEta) { return false; - if (track.pt() < minPt || track.pt() > maxPt) + } + if (track.pt() < minPt || track.pt() > maxPt) { return false; - if (std::abs(track.dcaXY()) > maxDcaxy || std::abs(track.dcaZ()) > maxDcaz) + } + if (std::abs(track.dcaXY()) > maxDcaxy || std::abs(track.dcaZ()) > maxDcaz) { return false; + } return true; } void processPureTracks(StandardEvents::iterator const& collision, HadronTracks const& globalTracks) { - if (!collision.sel8() || std::abs(collision.posZ()) > zVtx) + if (!collision.sel8() || std::abs(collision.posZ()) > zVtx) { return; - if (rejectITSROFBorder && !collision.selection_bit(o2::aod::evsel::kNoITSROFrameBorder)) + } + if (rejectITSROFBorder && !collision.selection_bit(o2::aod::evsel::kNoITSROFrameBorder)) { return; - if (rejectTFBorder && !collision.selection_bit(o2::aod::evsel::kNoTimeFrameBorder)) + } + if (rejectTFBorder && !collision.selection_bit(o2::aod::evsel::kNoTimeFrameBorder)) { return; - if (requireVtxITSTPC && !collision.selection_bit(o2::aod::evsel::kIsVertexITSTPC)) + } + if (requireVtxITSTPC && !collision.selection_bit(o2::aod::evsel::kIsVertexITSTPC)) { return; - if (rejectSameBunchPileup && !collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) + } + if (rejectSameBunchPileup && !collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) { return; - if (requireIsGoodZvtxFT0VsPV && !collision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) + } + if (requireIsGoodZvtxFT0VsPV && !collision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) { return; - if (requireIsVertexTOFmatched && !collision.selection_bit(o2::aod::evsel::kIsVertexTOFmatched)) + } + if (requireIsVertexTOFmatched && !collision.selection_bit(o2::aod::evsel::kIsVertexTOFmatched)) { return; + } for (auto const& track : globalTracks) { - if (!passedTrackSelection(track)) + if (!passedTrackSelection(track)) { continue; + } double pt = track.pt(); double eta = track.eta(); @@ -547,8 +571,9 @@ struct JetHadronsPid { if (pid.isPion) { registryData.fill(HIST("data/pure/pions/pion_pure_tpc"), pt, track.tpcNSigmaPi()); - if (track.hasTOF()) + if (track.hasTOF()) { registryData.fill(HIST("data/pure/pions/pion_pure_tof"), pt, track.tofNSigmaPi()); + } registryData.fill(HIST("data/pure/pions/pion_pure_pt"), pt); registryData.fill(HIST("data/pure/pions/pion_pure_eta"), eta); registryData.fill(HIST("data/pure/pions/pion_pure_dcaxy"), dcaxy); @@ -556,16 +581,18 @@ struct JetHadronsPid { if (charge > 0) { registryData.fill(HIST("data/pure/pions/pos/pion_pure_pos_tpc"), pt, track.tpcNSigmaPi()); - if (track.hasTOF()) + if (track.hasTOF()) { registryData.fill(HIST("data/pure/pions/pos/pion_pure_pos_tof"), pt, track.tofNSigmaPi()); + } registryData.fill(HIST("data/pure/pions/pos/pion_pure_pos_pt"), pt); registryData.fill(HIST("data/pure/pions/pos/pion_pure_pos_eta"), eta); registryData.fill(HIST("data/pure/pions/pos/pion_pure_pos_dcaxy"), dcaxy); registryData.fill(HIST("data/pure/pions/pos/pion_pure_pos_dcaz"), dcaz); } else { registryData.fill(HIST("data/pure/pions/neg/pion_pure_neg_tpc"), pt, track.tpcNSigmaPi()); - if (track.hasTOF()) + if (track.hasTOF()) { registryData.fill(HIST("data/pure/pions/neg/pion_pure_neg_tof"), pt, track.tofNSigmaPi()); + } registryData.fill(HIST("data/pure/pions/neg/pion_pure_neg_pt"), pt); registryData.fill(HIST("data/pure/pions/neg/pion_pure_neg_eta"), eta); registryData.fill(HIST("data/pure/pions/neg/pion_pure_neg_dcaxy"), dcaxy); @@ -575,8 +602,9 @@ struct JetHadronsPid { if (pid.isKaon) { registryData.fill(HIST("data/pure/kaons/kaon_pure_tpc"), pt, track.tpcNSigmaKa()); - if (track.hasTOF()) + if (track.hasTOF()) { registryData.fill(HIST("data/pure/kaons/kaon_pure_tof"), pt, track.tofNSigmaKa()); + } registryData.fill(HIST("data/pure/kaons/kaon_pure_pt"), pt); registryData.fill(HIST("data/pure/kaons/kaon_pure_eta"), eta); registryData.fill(HIST("data/pure/kaons/kaon_pure_dcaxy"), dcaxy); @@ -584,16 +612,18 @@ struct JetHadronsPid { if (charge > 0) { registryData.fill(HIST("data/pure/kaons/pos/kaon_pure_pos_tpc"), pt, track.tpcNSigmaKa()); - if (track.hasTOF()) + if (track.hasTOF()) { registryData.fill(HIST("data/pure/kaons/pos/kaon_pure_pos_tof"), pt, track.tofNSigmaKa()); + } registryData.fill(HIST("data/pure/kaons/pos/kaon_pure_pos_pt"), pt); registryData.fill(HIST("data/pure/kaons/pos/kaon_pure_pos_eta"), eta); registryData.fill(HIST("data/pure/kaons/pos/kaon_pure_pos_dcaxy"), dcaxy); registryData.fill(HIST("data/pure/kaons/pos/kaon_pure_pos_dcaz"), dcaz); } else { registryData.fill(HIST("data/pure/kaons/neg/kaon_pure_neg_tpc"), pt, track.tpcNSigmaKa()); - if (track.hasTOF()) + if (track.hasTOF()) { registryData.fill(HIST("data/pure/kaons/neg/kaon_pure_neg_tof"), pt, track.tofNSigmaKa()); + } registryData.fill(HIST("data/pure/kaons/neg/kaon_pure_neg_pt"), pt); registryData.fill(HIST("data/pure/kaons/neg/kaon_pure_neg_eta"), eta); registryData.fill(HIST("data/pure/kaons/neg/kaon_pure_neg_dcaxy"), dcaxy); @@ -603,8 +633,9 @@ struct JetHadronsPid { if (pid.isProton) { registryData.fill(HIST("data/pure/protons/proton_pure_tpc"), pt, track.tpcNSigmaPr()); - if (track.hasTOF()) + if (track.hasTOF()) { registryData.fill(HIST("data/pure/protons/proton_pure_tof"), pt, track.tofNSigmaPr()); + } registryData.fill(HIST("data/pure/protons/proton_pure_pt"), pt); registryData.fill(HIST("data/pure/protons/proton_pure_eta"), eta); registryData.fill(HIST("data/pure/protons/proton_pure_dcaxy"), dcaxy); @@ -612,16 +643,18 @@ struct JetHadronsPid { if (charge > 0) { registryData.fill(HIST("data/pure/protons/pos/proton_pure_pos_tpc"), pt, track.tpcNSigmaPr()); - if (track.hasTOF()) + if (track.hasTOF()) { registryData.fill(HIST("data/pure/protons/pos/proton_pure_pos_tof"), pt, track.tofNSigmaPr()); + } registryData.fill(HIST("data/pure/protons/pos/proton_pure_pos_pt"), pt); registryData.fill(HIST("data/pure/protons/pos/proton_pure_pos_eta"), eta); registryData.fill(HIST("data/pure/protons/pos/proton_pure_pos_dcaxy"), dcaxy); registryData.fill(HIST("data/pure/protons/pos/proton_pure_pos_dcaz"), dcaz); } else { registryData.fill(HIST("data/pure/protons/neg/proton_pure_neg_tpc"), pt, track.tpcNSigmaPr()); - if (track.hasTOF()) + if (track.hasTOF()) { registryData.fill(HIST("data/pure/protons/neg/proton_pure_neg_tof"), pt, track.tofNSigmaPr()); + } registryData.fill(HIST("data/pure/protons/neg/proton_pure_neg_pt"), pt); registryData.fill(HIST("data/pure/protons/neg/proton_pure_neg_eta"), eta); registryData.fill(HIST("data/pure/protons/neg/proton_pure_neg_dcaxy"), dcaxy); @@ -644,8 +677,9 @@ struct JetHadronsPid { } float zVertex = collision.posZ(); - if (std::abs(zVertex) > zVtx) + if (std::abs(zVertex) > zVtx) { return; + } registryData.fill(HIST("data/n_events"), 1); registryData.fill(HIST("data/z_vtx"), zVertex); @@ -656,26 +690,32 @@ struct JetHadronsPid { for (auto const& jet : jets) { - if (!isppRefAnalysis && ((std::abs(jet.eta()) + rJet) > (maxEta - deltaEtaEdge))) + if (!isppRefAnalysis && ((std::abs(jet.eta()) + rJet) > (maxEta - deltaEtaEdge))) { continue; - if (isppRefAnalysis && std::abs(jet.eta()) > cfgEtaJetMax) + } + if (isppRefAnalysis && std::abs(jet.eta()) > cfgEtaJetMax) { continue; + } double ptSub = jet.pt() - (centralRho * jet.area()); - if (ptSub < 0) + if (ptSub < 0) { ptSub = 0.0; + } registryData.fill(HIST("data/jets/jet_pt_subtracted"), ptSub); registryData.fill(HIST("data/jets/jet_pt_raw_vs_sub"), jet.pt(), ptSub); - if (isppRefAnalysis && (jet.pt() < minJetPt || jet.pt() > maxJetPt)) + if (isppRefAnalysis && (jet.pt() < minJetPt || jet.pt() > maxJetPt)) { continue; - if (!isppRefAnalysis && (ptSub < minJetPt || ptSub > maxJetPt)) + } + if (!isppRefAnalysis && (ptSub < minJetPt || ptSub > maxJetPt)) { continue; + } double normalizedJetArea = jet.area() / (PI * rJet * rJet); - if (applyAreaCut && normalizedJetArea < minNormalizedJetArea) + if (applyAreaCut && normalizedJetArea < minNormalizedJetArea) { continue; + } registryData.fill(HIST("data/jets/jet_eta"), jet.eta()); registryData.fill(HIST("data/jets/jet_phi"), jet.phi()); @@ -687,8 +727,9 @@ struct JetHadronsPid { TVector3 ueAxis1(0, 0, 0), ueAxis2(0, 0, 0); getPerpendicularDirections(jetAxis, ueAxis1, ueAxis2); - if (ueAxis1.Mag() < magnitudeThreshold || ueAxis2.Mag() < magnitudeThreshold) + if (ueAxis1.Mag() < magnitudeThreshold || ueAxis2.Mag() < magnitudeThreshold) { continue; + } int constituentCount = 0; std::set tracksInJetsSet; @@ -699,8 +740,9 @@ struct JetHadronsPid { auto track = jtrack.track_as(); tracksInJetsSet.insert(track.index()); - if (!passedTrackSelection(track)) + if (!passedTrackSelection(track)) { continue; + } double pt = track.pt(); double eta = track.eta(); @@ -712,8 +754,9 @@ struct JetHadronsPid { if (pid.isPion) { registryData.fill(HIST("data/jets/pions/pion_jet_tpc"), pt, track.tpcNSigmaPi()); - if (track.hasTOF()) + if (track.hasTOF()) { registryData.fill(HIST("data/jets/pions/pion_jet_tof"), pt, track.tofNSigmaPi()); + } registryData.fill(HIST("data/jets/pions/pion_jet_pt"), pt); registryData.fill(HIST("data/jets/pions/pion_jet_eta"), eta); registryData.fill(HIST("data/jets/pions/pion_jet_dcaxy"), dcaxy); @@ -721,16 +764,18 @@ struct JetHadronsPid { if (charge > 0) { registryData.fill(HIST("data/jets/pions/pos/pion_jet_pos_tpc"), pt, track.tpcNSigmaPi()); - if (track.hasTOF()) + if (track.hasTOF()) { registryData.fill(HIST("data/jets/pions/pos/pion_jet_pos_tof"), pt, track.tofNSigmaPi()); + } registryData.fill(HIST("data/jets/pions/pos/pion_jet_pos_pt"), pt); registryData.fill(HIST("data/jets/pions/pos/pion_jet_pos_eta"), eta); registryData.fill(HIST("data/jets/pions/pos/pion_jet_pos_dcaxy"), dcaxy); registryData.fill(HIST("data/jets/pions/pos/pion_jet_pos_dcaz"), dcaz); } else { registryData.fill(HIST("data/jets/pions/neg/pion_jet_neg_tpc"), pt, track.tpcNSigmaPi()); - if (track.hasTOF()) + if (track.hasTOF()) { registryData.fill(HIST("data/jets/pions/neg/pion_jet_neg_tof"), pt, track.tofNSigmaPi()); + } registryData.fill(HIST("data/jets/pions/neg/pion_jet_neg_pt"), pt); registryData.fill(HIST("data/jets/pions/neg/pion_jet_neg_eta"), eta); registryData.fill(HIST("data/jets/pions/neg/pion_jet_neg_dcaxy"), dcaxy); @@ -740,8 +785,9 @@ struct JetHadronsPid { if (pid.isKaon) { registryData.fill(HIST("data/jets/kaons/kaon_jet_tpc"), pt, track.tpcNSigmaKa()); - if (track.hasTOF()) + if (track.hasTOF()) { registryData.fill(HIST("data/jets/kaons/kaon_jet_tof"), pt, track.tofNSigmaKa()); + } registryData.fill(HIST("data/jets/kaons/kaon_jet_pt"), pt); registryData.fill(HIST("data/jets/kaons/kaon_jet_eta"), eta); registryData.fill(HIST("data/jets/kaons/kaon_jet_dcaxy"), dcaxy); @@ -749,16 +795,18 @@ struct JetHadronsPid { if (charge > 0) { registryData.fill(HIST("data/jets/kaons/pos/kaon_jet_pos_tpc"), pt, track.tpcNSigmaKa()); - if (track.hasTOF()) + if (track.hasTOF()) { registryData.fill(HIST("data/jets/kaons/pos/kaon_jet_pos_tof"), pt, track.tofNSigmaKa()); + } registryData.fill(HIST("data/jets/kaons/pos/kaon_jet_pos_pt"), pt); registryData.fill(HIST("data/jets/kaons/pos/kaon_jet_pos_eta"), eta); registryData.fill(HIST("data/jets/kaons/pos/kaon_jet_pos_dcaxy"), dcaxy); registryData.fill(HIST("data/jets/kaons/pos/kaon_jet_pos_dcaz"), dcaz); } else { registryData.fill(HIST("data/jets/kaons/neg/kaon_jet_neg_tpc"), pt, track.tpcNSigmaKa()); - if (track.hasTOF()) + if (track.hasTOF()) { registryData.fill(HIST("data/jets/kaons/neg/kaon_jet_neg_tof"), pt, track.tofNSigmaKa()); + } registryData.fill(HIST("data/jets/kaons/neg/kaon_jet_neg_pt"), pt); registryData.fill(HIST("data/jets/kaons/neg/kaon_jet_neg_eta"), eta); registryData.fill(HIST("data/jets/kaons/neg/kaon_jet_neg_dcaxy"), dcaxy); @@ -768,8 +816,9 @@ struct JetHadronsPid { if (pid.isProton) { registryData.fill(HIST("data/jets/protons/proton_jet_tpc"), pt, track.tpcNSigmaPr()); - if (track.hasTOF()) + if (track.hasTOF()) { registryData.fill(HIST("data/jets/protons/proton_jet_tof"), pt, track.tofNSigmaPr()); + } registryData.fill(HIST("data/jets/protons/proton_jet_pt"), pt); registryData.fill(HIST("data/jets/protons/proton_jet_eta"), eta); registryData.fill(HIST("data/jets/protons/proton_jet_dcaxy"), dcaxy); @@ -777,16 +826,18 @@ struct JetHadronsPid { if (charge > 0) { registryData.fill(HIST("data/jets/protons/pos/proton_jet_pos_tpc"), pt, track.tpcNSigmaPr()); - if (track.hasTOF()) + if (track.hasTOF()) { registryData.fill(HIST("data/jets/protons/pos/proton_jet_pos_tof"), pt, track.tofNSigmaPr()); + } registryData.fill(HIST("data/jets/protons/pos/proton_jet_pos_pt"), pt); registryData.fill(HIST("data/jets/protons/pos/proton_jet_pos_eta"), eta); registryData.fill(HIST("data/jets/protons/pos/proton_jet_pos_dcaxy"), dcaxy); registryData.fill(HIST("data/jets/protons/pos/proton_jet_pos_dcaz"), dcaz); } else { registryData.fill(HIST("data/jets/protons/neg/proton_jet_neg_tpc"), pt, track.tpcNSigmaPr()); - if (track.hasTOF()) + if (track.hasTOF()) { registryData.fill(HIST("data/jets/protons/neg/proton_jet_neg_tof"), pt, track.tofNSigmaPr()); + } registryData.fill(HIST("data/jets/protons/neg/proton_jet_neg_pt"), pt); registryData.fill(HIST("data/jets/protons/neg/proton_jet_neg_eta"), eta); registryData.fill(HIST("data/jets/protons/neg/proton_jet_neg_dcaxy"), dcaxy); @@ -800,13 +851,15 @@ struct JetHadronsPid { for (auto const& track : collTracks) { - if (tracksInJetsSet.find(track.index()) == tracksInJetsSet.end()) { - if (passedTrackSelection(track)) + if (!tracksInJetsSet.contains(track.index())) { + if (passedTrackSelection(track)) { nTracksOut++; + } } - if (!passedTrackSelection(track)) + if (!passedTrackSelection(track)) { continue; + } double deltaEtaUe1 = track.eta() - ueAxis1.Eta(); double deltaPhiUe1 = RecoDecay::constrainAngle(track.phi() - ueAxis1.Phi(), -PI); @@ -816,8 +869,9 @@ struct JetHadronsPid { double deltaPhiUe2 = RecoDecay::constrainAngle(track.phi() - ueAxis2.Phi(), -PI); double deltaRUe2 = std::hypot(deltaEtaUe2, deltaPhiUe2); - if (deltaRUe1 > rJet && deltaRUe2 > rJet) + if (deltaRUe1 > rJet && deltaRUe2 > rJet) { continue; + } double pt = track.pt(); double eta = track.eta(); @@ -829,8 +883,9 @@ struct JetHadronsPid { if (pid.isPion) { registryData.fill(HIST("data/ue/pions/pion_ue_tpc"), pt, track.tpcNSigmaPi()); - if (track.hasTOF()) + if (track.hasTOF()) { registryData.fill(HIST("data/ue/pions/pion_ue_tof"), pt, track.tofNSigmaPi()); + } registryData.fill(HIST("data/ue/pions/pion_ue_pt"), pt); registryData.fill(HIST("data/ue/pions/pion_ue_eta"), eta); @@ -839,16 +894,18 @@ struct JetHadronsPid { if (charge > 0) { registryData.fill(HIST("data/ue/pions/pos/pion_ue_pos_tpc"), pt, track.tpcNSigmaPi()); - if (track.hasTOF()) + if (track.hasTOF()) { registryData.fill(HIST("data/ue/pions/pos/pion_ue_pos_tof"), pt, track.tofNSigmaPi()); + } registryData.fill(HIST("data/ue/pions/pos/pion_ue_pos_pt"), pt); registryData.fill(HIST("data/ue/pions/pos/pion_ue_pos_eta"), eta); registryData.fill(HIST("data/ue/pions/pos/pion_ue_pos_dcaxy"), dcaxy); registryData.fill(HIST("data/ue/pions/pos/pion_ue_pos_dcaz"), dcaz); } else { registryData.fill(HIST("data/ue/pions/neg/pion_ue_neg_tpc"), pt, track.tpcNSigmaPi()); - if (track.hasTOF()) + if (track.hasTOF()) { registryData.fill(HIST("data/ue/pions/neg/pion_ue_neg_tof"), pt, track.tofNSigmaPi()); + } registryData.fill(HIST("data/ue/pions/neg/pion_ue_neg_pt"), pt); registryData.fill(HIST("data/ue/pions/neg/pion_ue_neg_eta"), eta); registryData.fill(HIST("data/ue/pions/neg/pion_ue_neg_dcaxy"), dcaxy); @@ -858,8 +915,9 @@ struct JetHadronsPid { if (pid.isKaon) { registryData.fill(HIST("data/ue/kaons/kaon_ue_tpc"), pt, track.tpcNSigmaKa()); - if (track.hasTOF()) + if (track.hasTOF()) { registryData.fill(HIST("data/ue/kaons/kaon_ue_tof"), pt, track.tofNSigmaKa()); + } registryData.fill(HIST("data/ue/kaons/kaon_ue_pt"), pt); registryData.fill(HIST("data/ue/kaons/kaon_ue_eta"), eta); @@ -868,16 +926,18 @@ struct JetHadronsPid { if (charge > 0) { registryData.fill(HIST("data/ue/kaons/pos/kaon_ue_pos_tpc"), pt, track.tpcNSigmaKa()); - if (track.hasTOF()) + if (track.hasTOF()) { registryData.fill(HIST("data/ue/kaons/pos/kaon_ue_pos_tof"), pt, track.tofNSigmaKa()); + } registryData.fill(HIST("data/ue/kaons/pos/kaon_ue_pos_pt"), pt); registryData.fill(HIST("data/ue/kaons/pos/kaon_ue_pos_eta"), eta); registryData.fill(HIST("data/ue/kaons/pos/kaon_ue_pos_dcaxy"), dcaxy); registryData.fill(HIST("data/ue/kaons/pos/kaon_ue_pos_dcaz"), dcaz); } else { registryData.fill(HIST("data/ue/kaons/neg/kaon_ue_neg_tpc"), pt, track.tpcNSigmaKa()); - if (track.hasTOF()) + if (track.hasTOF()) { registryData.fill(HIST("data/ue/kaons/neg/kaon_ue_neg_tof"), pt, track.tofNSigmaKa()); + } registryData.fill(HIST("data/ue/kaons/neg/kaon_ue_neg_pt"), pt); registryData.fill(HIST("data/ue/kaons/neg/kaon_ue_neg_eta"), eta); registryData.fill(HIST("data/ue/kaons/neg/kaon_ue_neg_dcaxy"), dcaxy); @@ -887,8 +947,9 @@ struct JetHadronsPid { if (pid.isProton) { registryData.fill(HIST("data/ue/protons/proton_ue_tpc"), pt, track.tpcNSigmaPr()); - if (track.hasTOF()) + if (track.hasTOF()) { registryData.fill(HIST("data/ue/protons/proton_ue_tof"), pt, track.tofNSigmaPr()); + } registryData.fill(HIST("data/ue/protons/proton_ue_pt"), pt); registryData.fill(HIST("data/ue/protons/proton_ue_eta"), eta); @@ -897,16 +958,18 @@ struct JetHadronsPid { if (charge > 0) { registryData.fill(HIST("data/ue/protons/pos/proton_ue_pos_tpc"), pt, track.tpcNSigmaPr()); - if (track.hasTOF()) + if (track.hasTOF()) { registryData.fill(HIST("data/ue/protons/pos/proton_ue_pos_tof"), pt, track.tofNSigmaPr()); + } registryData.fill(HIST("data/ue/protons/pos/proton_ue_pos_pt"), pt); registryData.fill(HIST("data/ue/protons/pos/proton_ue_pos_eta"), eta); registryData.fill(HIST("data/ue/protons/pos/proton_ue_pos_dcaxy"), dcaxy); registryData.fill(HIST("data/ue/protons/pos/proton_ue_pos_dcaz"), dcaz); } else { registryData.fill(HIST("data/ue/protons/neg/proton_ue_neg_tpc"), pt, track.tpcNSigmaPr()); - if (track.hasTOF()) + if (track.hasTOF()) { registryData.fill(HIST("data/ue/protons/neg/proton_ue_neg_tof"), pt, track.tofNSigmaPr()); + } registryData.fill(HIST("data/ue/protons/neg/proton_ue_neg_pt"), pt); registryData.fill(HIST("data/ue/protons/neg/proton_ue_neg_eta"), eta); registryData.fill(HIST("data/ue/protons/neg/proton_ue_neg_dcaxy"), dcaxy); @@ -921,32 +984,41 @@ struct JetHadronsPid { void processMC(StandardEvents::iterator const& collision, HadronTracksMC const& tracks, aod::McParticles const&) { - if (!collision.sel8() || std::abs(collision.posZ()) > zVtx) + if (!collision.sel8() || std::abs(collision.posZ()) > zVtx) { return; - if (rejectITSROFBorder && !collision.selection_bit(o2::aod::evsel::kNoITSROFrameBorder)) + } + if (rejectITSROFBorder && !collision.selection_bit(o2::aod::evsel::kNoITSROFrameBorder)) { return; - if (rejectTFBorder && !collision.selection_bit(o2::aod::evsel::kNoTimeFrameBorder)) + } + if (rejectTFBorder && !collision.selection_bit(o2::aod::evsel::kNoTimeFrameBorder)) { return; - if (requireVtxITSTPC && !collision.selection_bit(o2::aod::evsel::kIsVertexITSTPC)) + } + if (requireVtxITSTPC && !collision.selection_bit(o2::aod::evsel::kIsVertexITSTPC)) { return; - if (rejectSameBunchPileup && !collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) + } + if (rejectSameBunchPileup && !collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) { return; - if (requireIsGoodZvtxFT0VsPV && !collision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) + } + if (requireIsGoodZvtxFT0VsPV && !collision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) { return; - if (requireIsVertexTOFmatched && !collision.selection_bit(o2::aod::evsel::kIsVertexTOFmatched)) + } + if (requireIsVertexTOFmatched && !collision.selection_bit(o2::aod::evsel::kIsVertexTOFmatched)) { return; + } registryData.fill(HIST("mc/n_events"), 1); for (auto const& track : tracks) { - if (!passedTrackSelection(track)) + if (!passedTrackSelection(track)) { continue; + } double pt = track.pt(); - if (!track.has_mcParticle()) + if (!track.has_mcParticle()) { continue; + } auto const& trueParticle = track.mcParticle(); int pdg = std::abs(trueParticle.pdgCode()); @@ -970,17 +1042,19 @@ struct JetHadronsPid { if (isPrimary) { if (pdg == PDG_t::kPiPlus) { registryData.fill(HIST("mc/reconstruction/pions/mc_rec_pion_pt"), pt); - if (charge > 0) + if (charge > 0) { registryData.fill(HIST("mc/reconstruction/pions/pos/mc_rec_pion_pos_pt"), pt); - else + } else { registryData.fill(HIST("mc/reconstruction/pions/neg/mc_rec_pion_neg_pt"), pt); + } } } else { registryData.fill(HIST("mc/reconstruction/pions/mc_sec_pion_pt"), pt); - if (charge > 0) + if (charge > 0) { registryData.fill(HIST("mc/reconstruction/pions/pos/mc_sec_pion_pos_pt"), pt); - else + } else { registryData.fill(HIST("mc/reconstruction/pions/neg/mc_sec_pion_neg_pt"), pt); + } } } @@ -999,17 +1073,19 @@ struct JetHadronsPid { if (isPrimary) { if (pdg == PDG_t::kKPlus) { registryData.fill(HIST("mc/reconstruction/kaons/mc_rec_kaon_pt"), pt); - if (charge > 0) + if (charge > 0) { registryData.fill(HIST("mc/reconstruction/kaons/pos/mc_rec_kaon_pos_pt"), pt); - else + } else { registryData.fill(HIST("mc/reconstruction/kaons/neg/mc_rec_kaon_neg_pt"), pt); + } } } else { registryData.fill(HIST("mc/reconstruction/kaons/mc_sec_kaon_pt"), pt); - if (charge > 0) + if (charge > 0) { registryData.fill(HIST("mc/reconstruction/kaons/pos/mc_sec_kaon_pos_pt"), pt); - else + } else { registryData.fill(HIST("mc/reconstruction/kaons/neg/mc_sec_kaon_neg_pt"), pt); + } } } @@ -1028,17 +1104,19 @@ struct JetHadronsPid { if (isPrimary) { if (pdg == PDG_t::kProton) { registryData.fill(HIST("mc/reconstruction/protons/mc_rec_proton_pt"), pt); - if (charge > 0) + if (charge > 0) { registryData.fill(HIST("mc/reconstruction/protons/pos/mc_rec_proton_pos_pt"), pt); - else + } else { registryData.fill(HIST("mc/reconstruction/protons/neg/mc_rec_proton_neg_pt"), pt); + } } } else { registryData.fill(HIST("mc/reconstruction/protons/mc_sec_proton_pt"), pt); - if (charge > 0) + if (charge > 0) { registryData.fill(HIST("mc/reconstruction/protons/pos/mc_sec_proton_pos_pt"), pt); - else + } else { registryData.fill(HIST("mc/reconstruction/protons/neg/mc_sec_proton_neg_pt"), pt); + } } } } @@ -1048,16 +1126,19 @@ struct JetHadronsPid { void processMCTruth(aod::McCollisions::iterator const& mcCollision, aod::McParticles const& mcParticles) { - if (std::abs(mcCollision.posZ()) > zVtx) + if (std::abs(mcCollision.posZ()) > zVtx) { return; + } for (auto const& mcpart : mcParticles) { - if (!mcpart.isPhysicalPrimary()) + if (!mcpart.isPhysicalPrimary()) { continue; + } - if (mcpart.eta() < minEta || mcpart.eta() > maxEta) + if (mcpart.eta() < minEta || mcpart.eta() > maxEta) { continue; + } int originalPdg = mcpart.pdgCode(); int pdg = std::abs(originalPdg); @@ -1066,26 +1147,29 @@ struct JetHadronsPid { if (pdg == PDG_t::kPiPlus) { if (pt >= cfg.minPtPion && pt <= cfg.maxPtPion) { registryData.fill(HIST("mc/truth/pions/mc_gen_pion_pt"), pt); - if (originalPdg > 0) + if (originalPdg > 0) { registryData.fill(HIST("mc/truth/pions/pos/mc_gen_pion_pos_pt"), pt); - else + } else { registryData.fill(HIST("mc/truth/pions/neg/mc_gen_pion_neg_pt"), pt); + } } } else if (pdg == PDG_t::kKPlus) { if (pt >= cfg.minPtKaon && pt <= cfg.maxPtKaon) { registryData.fill(HIST("mc/truth/kaons/mc_gen_kaon_pt"), pt); - if (originalPdg > 0) + if (originalPdg > 0) { registryData.fill(HIST("mc/truth/kaons/pos/mc_gen_kaon_pos_pt"), pt); - else + } else { registryData.fill(HIST("mc/truth/kaons/neg/mc_gen_kaon_neg_pt"), pt); + } } } else if (pdg == PDG_t::kProton) { if (pt >= cfg.minPtProton && pt <= cfg.maxPtProton) { registryData.fill(HIST("mc/truth/protons/mc_gen_proton_pt"), pt); - if (originalPdg > 0) + if (originalPdg > 0) { registryData.fill(HIST("mc/truth/protons/pos/mc_gen_proton_pos_pt"), pt); - else + } else { registryData.fill(HIST("mc/truth/protons/neg/mc_gen_proton_neg_pt"), pt); + } } } } From 89e67dc0f541990fcdadf4dd64c19da66651130e Mon Sep 17 00:00:00 2001 From: Leonard Lorenc <107263905+llorenc-11@users.noreply.github.com> Date: Thu, 16 Jul 2026 10:50:22 +0200 Subject: [PATCH 33/35] Change definition of underlying event in jetHadronsPid.cxx Instead of using randomly chosen orthogonal axis and drawing cones, rotate cones by 90 degrees in phi both ways while keeping eta the same , creating two underlying event cones --- PWGJE/Tasks/jetHadronsPid.cxx | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/PWGJE/Tasks/jetHadronsPid.cxx b/PWGJE/Tasks/jetHadronsPid.cxx index 9dbeaf0d18f..19ad2a3f2d9 100644 --- a/PWGJE/Tasks/jetHadronsPid.cxx +++ b/PWGJE/Tasks/jetHadronsPid.cxx @@ -400,14 +400,20 @@ struct JetHadronsPid { void getPerpendicularDirections(const TVector3& p, TVector3& u1, TVector3& u2) { - double const treshold = 1e-9; - if (p.Mag2() < treshold) { + double const threshold = 1e-9; + + if (p.Pt() < threshold) { u1.SetXYZ(0, 0, 0); u2.SetXYZ(0, 0, 0); return; } - u1 = p.Orthogonal(); - u2 = p.Cross(u1); + + double pt = p.Pt(); + double eta = p.Eta(); + double phi = p.Phi(); + + u1.SetPtEtaPhi(pt, eta, phi + PIHalf); + u2.SetPtEtaPhi(pt, eta, phi - PIHalf); } template From f9a4bf968703441643a1757c39cc5e5798649c06 Mon Sep 17 00:00:00 2001 From: Leonard Lorenc <107263905+llorenc-11@users.noreply.github.com> Date: Thu, 16 Jul 2026 17:02:09 +0200 Subject: [PATCH 34/35] Change underlying event definition, add pt thresholds in Pid and new histograms in jetsHadronsPid.cxx (#9) Changing definition of underlying event from cones on randomly chosen orthogonal to jet axis to cones rotates by 90 degrees in the phi plane Adding separate pt threshold for TOF usage in Pid for different particles Adding histograms across pure and jet categories --------- Co-authored-by: Alexandra <105586261+mulewicz@users.noreply.github.com> --- PWGJE/Tasks/jetHadronsPid.cxx | 534 ++++++++++++++++++++++++++++------ 1 file changed, 448 insertions(+), 86 deletions(-) diff --git a/PWGJE/Tasks/jetHadronsPid.cxx b/PWGJE/Tasks/jetHadronsPid.cxx index 19ad2a3f2d9..2ea0d5546c1 100644 --- a/PWGJE/Tasks/jetHadronsPid.cxx +++ b/PWGJE/Tasks/jetHadronsPid.cxx @@ -42,13 +42,14 @@ #include #include +#include +#include #include #include #include #include -#include #include #include @@ -63,13 +64,14 @@ using JetEvents = soa::Join; + aod::pidTPCFullPr, aod::pidTOFFullPr, + aod::pidTOFbeta>; using HadronTracksMC = soa::Join; + aod::pidTOFbeta, aod::McTrackLabels>; struct JetHadronsPid { @@ -88,7 +90,7 @@ struct JetHadronsPid { Configurable requireIsGoodZvtxFT0VsPV{"requireIsGoodZvtxFT0VsPV", true, "Require consistent FT0 vs PV z-vertex"}; Configurable requireIsVertexTOFmatched{"requireIsVertexTOFmatched", false, "Require at least one vertex track matched to TOF"}; - Configurable minJetPt{"minJetPt", 4.0, "Minimum pt of the jet after bkg subtraction"}; + Configurable minJetPt{"minJetPt", 10, "Minimum pt of the jet after bkg subtraction"}; Configurable maxJetPt{"maxJetPt", 1e+06, "Maximum pt of the jet after bkg subtraction"}; Configurable rJet{"rJet", 0.4, "Jet resolution parameter R"}; Configurable zVtx{"zVtx", 10.0, "Maximum zVertex"}; @@ -115,15 +117,17 @@ struct JetHadronsPid { Preslice tracksPerCollision = aod::track::collisionId; struct : ConfigurableGroup { - Configurable pidMethod{"pidMethod", 0, "Variable for choosing pid method"}; + Configurable pidMethod{"pidMethod", 2, "Variable for choosing pid method"}; Configurable rejectionSigma{"rejectionSigma", 3.0, "Rejection sigma for tof and tpc pid"}; - Configurable ptThreshold{"ptThreshold", 0.8, "Threshold for pt for different pid methods"}; - Configurable nSigmaCut{"nSigmaCut", 2.0, "Acceptence cut for pid methods"}; + Configurable ptThresholdPion{"ptThresholdPion", 0.75, "Threshold for pt for different pid methods"}; + Configurable ptThresholdKaon{"ptThresholdKaon", 0.5, "Threshold for pt for different pid methods"}; + Configurable ptThresholdProton{"ptThresholdProton", 0.75, "Threshold for pt for different pid methods"}; + Configurable nSigmaCut{"nSigmaCut", 3.0, "Acceptence cut for pid methods"}; Configurable minPtPion{"minPtPion", 0.2, "Minimal Pion pt"}; Configurable maxPtPion{"maxPtPion", 4.0, "Maximum Pion pt"}; Configurable minPtKaon{"minPtKaon", 0.3, "Minimal Kaon pt"}; Configurable maxPtKaon{"maxPtKaon", 3.0, "Maximum Kaon pt"}; - Configurable minPtProton{"minPtProton", 0.3, "Minimal Proton pt"}; + Configurable minPtProton{"minPtProton", 0.5, "Minimal Proton pt"}; Configurable maxPtProton{"maxPtProton", 4.0, "Maximum Proton pt"}; } cfg; @@ -135,24 +139,81 @@ struct JetHadronsPid { eventSelectionBits = jetderiveddatautilities::initialiseEventSelectionBits(static_cast(eventSelections)); - registryData.add("data/n_events", "Event counter", HistType::kTH1F, {{1, 0.5, 1.5, "N_{events}"}}); - registryData.add("data/n_events_raw", "All events", HistType::kTH1F, {{1, 0.5, 1.5, ""}}); - - registryData.add("data/jets/jet_pt", "Jet pT ", HistType::kTH1F, {{100, 0.0, 20.0, "#it{p}_{T}^{raw} (GeV/#it{c})"}}); - registryData.add("data/jets/jet_pt_subtracted", "Jet pT subtracted", HistType::kTH1F, {{200, 0.0, 10.0, "#it{p}_{T}^{sub} (GeV/#it{c})"}}); - registryData.add("data/jets/jet_pt_raw_vs_sub", "Raw vs sub jet pT", HistType::kTH2F, {{200, 0, 200}, {200, 0, 200}}); - registryData.add("data/jets/jet_eta", "Jet eta", HistType::kTH1F, {{100, -1.0, 1.0, "#eta_{jet}"}}); - registryData.add("data/jets/jet_phi", "Jet phi", HistType::kTH1F, {{100, 0.0, TwoPI, "#phi_{jet}"}}); - registryData.add("data/jets/jet_area", "Jet area", HistType::kTH1F, {{100, 0.0, 1.5, "Area"}}); - registryData.add("data/jets/jet_n_constituents", "Jet multiplicity", HistType::kTH1I, {{100, 0, 30, "N_{constituents}"}}); - registryData.add("data/z_vtx", "Z-Vertex Distribution", HistType::kTH1F, {{200, -20.0, 20.0, "Z-Vertex (cm)"}}); - + ////////////////////////////////////////////// + // PURE + ////////////////////////////////////////////// + + AxisSpec axisMomentumTPCSignal{300, 0.05, 30.0, "#it{p} (GeV/#it{c})"}; + AxisSpec axisTPCSignal{400, 20.0, 2000.0, "TPC d#it{E}/d#it{x} signal (a.u.)"}; + + registryData.add("data/pure/tpc_signal_vs_p", + "TPC signal for inclusive selected tracks;" + "#it{p} (GeV/#it{c});" + "TPC d#it{E}/d#it{x} signal (a.u.)", + HistType::kTH2F, {axisMomentumTPCSignal, axisTPCSignal}); + registryData.add("data/jets/tpc_signal_vs_p", + "TPC signal for tracks in selected jets;" + "#it{p} (GeV/#it{c});" + "TPC d#it{E}/d#it{x} signal (a.u.)", + HistType::kTH2F, {axisMomentumTPCSignal, axisTPCSignal}); + registryData.add("data/pure/after_pid/pion_tpc_signal_vs_p", + "TPC signal after pion PID, inclusive tracks;" + "#it{p} (GeV/#it{c});TPC d#it{E}/d#it{x} signal (a.u.)", + HistType::kTH2F, {{300, 0.05, 30.0, "#it{p} (GeV/#it{c})"}, {400, 20.0, 2000.0, "TPC d#it{E}/d#it{x} signal (a.u.)"}}); + registryData.add("data/pure/after_pid/kaon_tpc_signal_vs_p", + "TPC signal after kaon PID, inclusive tracks;" + "#it{p} (GeV/#it{c});TPC d#it{E}/d#it{x} signal (a.u.)", + HistType::kTH2F, {{300, 0.05, 30.0, "#it{p} (GeV/#it{c})"}, {400, 20.0, 2000.0, "TPC d#it{E}/d#it{x} signal (a.u.)"}}); + registryData.add("data/pure/after_pid/proton_tpc_signal_vs_p", + "TPC signal after proton PID, inclusive tracks;" + "#it{p} (GeV/#it{c});TPC d#it{E}/d#it{x} signal (a.u.)", + HistType::kTH2F, {{300, 0.05, 30.0, "#it{p} (GeV/#it{c})"}, {400, 20.0, 2000.0, "TPC d#it{E}/d#it{x} signal (a.u.)"}}); + + registryData.add("data/jets/after_pid/pion_tpc_signal_vs_p", + "TPC signal after pion PID, tracks in jets;" + "#it{p} (GeV/#it{c});TPC d#it{E}/d#it{x} signal (a.u.)", + HistType::kTH2F, {{300, 0.05, 30.0, "#it{p} (GeV/#it{c})"}, {400, 20.0, 2000.0, "TPC d#it{E}/d#it{x} signal (a.u.)"}}); + registryData.add("data/jets/after_pid/kaon_tpc_signal_vs_p", + "TPC signal after kaon PID, tracks in jets;" + "#it{p} (GeV/#it{c});TPC d#it{E}/d#it{x} signal (a.u.)", + HistType::kTH2F, {{300, 0.05, 30.0, "#it{p} (GeV/#it{c})"}, {400, 20.0, 2000.0, "TPC d#it{E}/d#it{x} signal (a.u.)"}}); + registryData.add("data/jets/after_pid/proton_tpc_signal_vs_p", + "TPC signal after proton PID, tracks in jets;" + "#it{p} (GeV/#it{c});TPC d#it{E}/d#it{x} signal (a.u.)", + HistType::kTH2F, {{300, 0.05, 30.0, "#it{p} (GeV/#it{c})"}, {400, 20.0, 2000.0, "TPC d#it{E}/d#it{x} signal (a.u.)"}}); + + AxisSpec axisMomentumTOF{300, 0.05, 30.0, "#it{p} (GeV/#it{c})"}; + AxisSpec axisTOFBeta{240, 0.0, 1.2, "#beta_{TOF}"}; + + registryData.add("data/pure/tof_beta_vs_p", + "TOF #beta for inclusive selected tracks;" + "#it{p} (GeV/#it{c});#beta_{TOF}", + HistType::kTH2F, {axisMomentumTOF, axisTOFBeta}); + registryData.add("data/jets/tof_beta_vs_p", + "TOF #beta for tracks in selected jets;" + "#it{p} (GeV/#it{c});#beta_{TOF}", + HistType::kTH2F, {axisMomentumTOF, axisTOFBeta}); + registryData.add("data/pure/after_pid/pion_tof_beta_vs_p", + "TOF #beta after pion PID, inclusive tracks;" + "#it{p} (GeV/#it{c});#beta_{TOF}", + HistType::kTH2F, {axisMomentumTOF, axisTOFBeta}); + registryData.add("data/pure/after_pid/kaon_tof_beta_vs_p", + "TOF #beta after kaon PID, inclusive tracks;" + "#it{p} (GeV/#it{c});#beta_{TOF}", + HistType::kTH2F, {axisMomentumTOF, axisTOFBeta}); + registryData.add("data/pure/after_pid/proton_tof_beta_vs_p", + "TOF #beta after proton PID, inclusive tracks;" + "#it{p} (GeV/#it{c});#beta_{TOF}", + HistType::kTH2F, {axisMomentumTOF, axisTOFBeta}); + + // Pions registryData.add("data/pure/pions/pion_pure_tpc", "TPC Pion PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); registryData.add("data/pure/pions/pion_pure_tof", "TOF Pion PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); registryData.add("data/pure/pions/pion_pure_pt", "Pion pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); registryData.add("data/pure/pions/pion_pure_eta", "Pion Eta", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); registryData.add("data/pure/pions/pion_pure_dcaxy", "Pion DCAxy", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); registryData.add("data/pure/pions/pion_pure_dcaz", "Pion DCAz", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); + registryData.add("data/pure/pions/pion_pure_eta_phi", "Pure pions;#varphi;#eta", HistType::kTH2F, {{72, 0.0, TwoPI}, {80, -0.8, 0.8}}); registryData.add("data/pure/pions/pos/pion_pure_pos_tpc", "TPC #pi^{+} PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); registryData.add("data/pure/pions/pos/pion_pure_pos_tof", "TOF #pi^{+} PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); @@ -160,6 +221,8 @@ struct JetHadronsPid { registryData.add("data/pure/pions/pos/pion_pure_pos_eta", "#pi^{+} Eta", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); registryData.add("data/pure/pions/pos/pion_pure_pos_dcaxy", "#pi^{+} DCAxy", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); registryData.add("data/pure/pions/pos/pion_pure_pos_dcaz", "#pi^{+} DCAz", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); + registryData.add("data/pure/pions/pos/pion_pure_pos_phi_vs_pt", "pure pi^{+} ;#it{p}_{T} (GeV/#it{c});#varphi", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {72, 0.0, TwoPI, "#varphi"}}); + registryData.add("data/pure/pions/pos/pion_pure_pos_eta_phi", "Pure #pi^{+};#varphi;#eta", HistType::kTH2F, {{72, 0.0, TwoPI, "#varphi"}, {80, -0.8, 0.8, "#eta"}}); registryData.add("data/pure/pions/neg/pion_pure_neg_tpc", "TPC #pi^{-} PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); registryData.add("data/pure/pions/neg/pion_pure_neg_tof", "TOF #pi^{-} PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); @@ -167,13 +230,17 @@ struct JetHadronsPid { registryData.add("data/pure/pions/neg/pion_pure_neg_eta", "#pi^{-} Eta", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); registryData.add("data/pure/pions/neg/pion_pure_neg_dcaxy", "#pi^{-} DCAxy", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); registryData.add("data/pure/pions/neg/pion_pure_neg_dcaz", "#pi^{-} DCAz", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); + registryData.add("data/pure/pions/neg/pion_pure_neg_phi_vs_pt", "pure pi^{-};#it{p}_{T} (GeV/#it{c});#varphi", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {72, 0.0, TwoPI, "#varphi"}}); + registryData.add("data/pure/pions/neg/pion_pure_neg_eta_phi", "Pure #pi^{-};#varphi;#eta", HistType::kTH2F, {{72, 0.0, TwoPI, "#varphi"}, {80, -0.8, 0.8, "#eta"}}); + // Kaons registryData.add("data/pure/kaons/kaon_pure_tpc", "TPC Kaon PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); registryData.add("data/pure/kaons/kaon_pure_tof", "TOF Kaon PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); registryData.add("data/pure/kaons/kaon_pure_pt", "Kaon pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); registryData.add("data/pure/kaons/kaon_pure_eta", "Kaon Eta", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); registryData.add("data/pure/kaons/kaon_pure_dcaz", "Kaon DCAz", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); registryData.add("data/pure/kaons/kaon_pure_dcaxy", "Kaon DCAxy", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); + registryData.add("data/pure/kaons/kaon_pure_eta_phi", "Pure kaons;#varphi;#eta", HistType::kTH2F, {{72, 0.0, TwoPI}, {80, -0.8, 0.8}}); registryData.add("data/pure/kaons/pos/kaon_pure_pos_tpc", "TPC K^{+} PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); registryData.add("data/pure/kaons/pos/kaon_pure_pos_tof", "TOF K^{+} PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); @@ -181,6 +248,8 @@ struct JetHadronsPid { registryData.add("data/pure/kaons/pos/kaon_pure_pos_eta", "K^{+} Eta", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); registryData.add("data/pure/kaons/pos/kaon_pure_pos_dcaxy", "K^{+} DCAxy", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); registryData.add("data/pure/kaons/pos/kaon_pure_pos_dcaz", "K^{+} DCAz", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); + registryData.add("data/pure/kaons/pos/kaon_pure_pos_phi_vs_pt", "pure K^{+};#it{p}_{T} (GeV/#it{c});#varphi", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {72, 0.0, TwoPI, "#varphi"}}); + registryData.add("data/pure/kaons/pos/kaon_pure_pos_eta_phi", "Pure K^{+};#varphi;#eta", HistType::kTH2F, {{72, 0.0, TwoPI, "#varphi"}, {80, -0.8, 0.8, "#eta"}}); registryData.add("data/pure/kaons/neg/kaon_pure_neg_tpc", "TPC K^{-} PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); registryData.add("data/pure/kaons/neg/kaon_pure_neg_tof", "TOF K^{-} PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); @@ -188,13 +257,17 @@ struct JetHadronsPid { registryData.add("data/pure/kaons/neg/kaon_pure_neg_eta", "K^{-} Eta", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); registryData.add("data/pure/kaons/neg/kaon_pure_neg_dcaxy", "K^{-} DCAxy", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); registryData.add("data/pure/kaons/neg/kaon_pure_neg_dcaz", "K^{-} DCAz", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); + registryData.add("data/pure/kaons/neg/kaon_pure_neg_phi_vs_pt", "pureK^{-};#it{p}_{T} (GeV/#it{c});#varphi", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {72, 0.0, TwoPI, "#varphi"}}); + registryData.add("data/pure/kaons/neg/kaon_pure_neg_eta_phi", "Pure K^{-};#varphi;#eta", HistType::kTH2F, {{72, 0.0, TwoPI, "#varphi"}, {80, -0.8, 0.8, "#eta"}}); + // Protons registryData.add("data/pure/protons/proton_pure_tpc", "TPC Proton PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); registryData.add("data/pure/protons/proton_pure_tof", "TOF Proton PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); registryData.add("data/pure/protons/proton_pure_pt", "Proton pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); registryData.add("data/pure/protons/proton_pure_eta", "Proton Eta", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); registryData.add("data/pure/protons/proton_pure_dcaz", "Proton DCAz", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); registryData.add("data/pure/protons/proton_pure_dcaxy", "Proton DCAxy", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); + registryData.add("data/pure/protons/proton_pure_eta_phi", "Pure protons;#varphi;#eta", HistType::kTH2F, {{72, 0.0, TwoPI}, {80, -0.8, 0.8}}); registryData.add("data/pure/protons/pos/proton_pure_pos_tpc", "TPC p PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); registryData.add("data/pure/protons/pos/proton_pure_pos_tof", "TOF p PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); @@ -202,6 +275,8 @@ struct JetHadronsPid { registryData.add("data/pure/protons/pos/proton_pure_pos_eta", "p Eta", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); registryData.add("data/pure/protons/pos/proton_pure_pos_dcaxy", "p DCAxy", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); registryData.add("data/pure/protons/pos/proton_pure_pos_dcaz", "p DCAz", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); + registryData.add("data/pure/protons/pos/proton_pure_pos_phi_vs_pt", "pure p;#it{p}_{T} (GeV/#it{c});#varphi", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {72, 0.0, TwoPI, "#varphi"}}); + registryData.add("data/pure/protons/pos/proton_pure_pos_eta_phi", "Pure p;#varphi;#eta", HistType::kTH2F, {{72, 0.0, TwoPI, "#varphi"}, {80, -0.8, 0.8, "#eta"}}); registryData.add("data/pure/protons/neg/proton_pure_neg_tpc", "TPC #bar{p} PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); registryData.add("data/pure/protons/neg/proton_pure_neg_tof", "TOF #bar{p} PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); @@ -209,20 +284,120 @@ struct JetHadronsPid { registryData.add("data/pure/protons/neg/proton_pure_neg_eta", "#bar{p} Eta", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); registryData.add("data/pure/protons/neg/proton_pure_neg_dcaxy", "#bar{p} DCAxy", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); registryData.add("data/pure/protons/neg/proton_pure_neg_dcaz", "#bar{p} DCAz", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); + registryData.add("data/pure/protons/neg/proton_pure_neg_phi_vs_pt", "pure #bar{p};#it{p}_{T} (GeV/#it{c});#varphi", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {72, 0.0, TwoPI, "#varphi"}}); + registryData.add("data/pure/protons/neg/proton_pure_neg_eta_phi", "Pure #bar{p};#varphi;#eta", HistType::kTH2F, {{72, 0.0, TwoPI, "#varphi"}, {80, -0.8, 0.8, "#eta"}}); + + ////////////////////////////////////////////// + // COLLISIONS + ////////////////////////////////////////////// + + registryData.add("data/pure/collisions/z_vertex", "Collision vertex;z_{vtx} (cm);N_{collisions}", HistType::kTH1F, {{200, -20.0, 20.0, "z_{vtx} (cm)"}}); + registryData.add("data/pure/collisions/x_vertex", "Collision vertex;x_{vtx} (cm);N_{collisions}", HistType::kTH1F, {{200, -1.0, 1.0, "x_{vtx} (cm)"}}); + registryData.add("data/pure/collisions/y_vertex", "Collision vertex;y_{vtx} (cm);N_{collisions}", HistType::kTH1F, {{200, -1.0, 1.0, "y_{vtx} (cm)"}}); + registryData.add("data/pure/collisions/xy_vertex", "Collision vertex;x_{vtx} (cm);y_{vtx} (cm)", HistType::kTH2F, {{200, -1.0, 1.0, "x_{vtx} (cm)"}, {200, -1.0, 1.0, "y_{vtx} (cm)"}}); + + registryData.add("data/pure/collisions/n_contributors", "PV contributors;N_{contributors};N_{collisions}", HistType::kTH1I, {{201, -0.5, 200.5, "N_{contributors}"}}); - registryData.add("data/jets/pions/pion_jet_tpc", "TPC Pion PID in Jets", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); - registryData.add("data/jets/pions/pion_jet_tof", "TOF Pion PID in Jets", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); - registryData.add("data/jets/pions/pion_jet_pt", "Pion pT in Jets", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); - registryData.add("data/jets/pions/pion_jet_eta", "Pion Eta in Jets", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); - registryData.add("data/jets/pions/pion_jet_dcaxy", "Pion DCAxy in Jets", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); - registryData.add("data/jets/pions/pion_jet_dcaz", "Pion DCAz in Jets", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); + ////////////////////////////////////////////// + // JETS + ////////////////////////////////////////////// + registryData.add("data/jets/collision_multiplicity", "Number of Jets in Collison;Number of Jets;Number of Collisions", HistType::kTH1F, {{30, 0.0, 30.5}}); + registryData.add("data/jets/n_events", "Event counter", HistType::kTH1F, {{1, 0.5, 1.5, "N_{events}"}}); + registryData.add("data/jets/n_events_raw", "All events", HistType::kTH1F, {{1, 0.5, 1.5, ""}}); + + registryData.add("data/jets/jet_pt", "Jet pT ", HistType::kTH1F, {{100, 0.0, 20.0, "#it{p}_{T}^{raw} (GeV/#it{c})"}}); + registryData.add("data/jets/jet_pt_subtracted", "Jet pT subtracted", HistType::kTH1F, {{200, 0.0, 10.0, "#it{p}_{T}^{sub} (GeV/#it{c})"}}); + registryData.add("data/jets/jet_pt_raw_vs_sub", "Raw vs sub jet pT", HistType::kTH2F, {{200, 0, 200}, {200, 0, 200}}); + registryData.add("data/jets/jet_eta", "Jet eta", HistType::kTH1F, {{100, -1.0, 1.0, "#eta_{jet}"}}); + registryData.add("data/jets/jet_phi", "Jet phi", HistType::kTH1F, {{100, 0.0, TwoPI, "#phi_{jet}"}}); + registryData.add("data/jets/jet_area", "Jet area", HistType::kTH1F, {{100, 0.0, 1.5, "Area"}}); + registryData.add("data/jets/jet_n_constituents", "Jet multiplicity", HistType::kTH1I, {{100, 0, 30, "N_{constituents}"}}); + registryData.add("data/jets/z_vtx", "Z-Vertex Distribution", HistType::kTH1F, {{200, -20.0, 20.0, "Z-Vertex (cm)"}}); + registryData.add("data/jets/total_tracks_pure_vs_jets", "Selected tracks and tracks used in jets;Track category;N_{tracks}", HistType::kTH1F, {{2, 0.5, 2.5, "Track category"}}); + + auto hTrackTotals = registryData.get(HIST("data/jets/total_tracks_pure_vs_jets")); + hTrackTotals->GetXaxis()->SetBinLabel(1, "Pure tracks"); + hTrackTotals->GetXaxis()->SetBinLabel(2, "Tracks in jets"); + + registryData.add("data/jets/after_pid/pion_tof_beta_vs_p", + "TOF #beta after pion PID, tracks in jets;" + "#it{p} (GeV/#it{c});#beta_{TOF}", + HistType::kTH2F, {axisMomentumTOF, axisTOFBeta}); + registryData.add("data/jets/after_pid/kaon_tof_beta_vs_p", + "TOF #beta after kaon PID, tracks in jets;" + "#it{p} (GeV/#it{c});#beta_{TOF}", + HistType::kTH2F, {axisMomentumTOF, axisTOFBeta}); + registryData.add("data/jets/after_pid/proton_tof_beta_vs_p", + "TOF #beta after proton PID, tracks in jets;" + "#it{p} (GeV/#it{c});#beta_{TOF}", + HistType::kTH2F, {axisMomentumTOF, axisTOFBeta}); + + // Jet Cone + + AxisSpec axisDeltaEtaCone{80, -rJet, rJet, "#Delta#eta = #eta_{track} - #eta_{jet}"}; + AxisSpec axisDeltaPhiCone{80, -rJet, rJet, "#Delta#varphi = #varphi_{track} - #varphi_{jet}"}; + AxisSpec axisPtTrackCone{100, 0.0, 10.0, "#it{p}_{T}^{track} (GeV/#it{c})"}; + + registryData.add("data/jets/cone/all_tracks_2d", "All tracks in jet cone;#Delta#eta;#Delta#varphi", HistType::kTH2F, {axisDeltaEtaCone, axisDeltaPhiCone}); + registryData.add("data/jets/cone/pions/pion_pos_2d", "#pi^{+} in jet cone;#Delta#eta;#Delta#varphi", HistType::kTH2F, {axisDeltaEtaCone, axisDeltaPhiCone}); + registryData.add("data/jets/cone/pions/pion_neg_2d", "#pi^{-} in jet cone;#Delta#eta;#Delta#varphi", HistType::kTH2F, {axisDeltaEtaCone, axisDeltaPhiCone}); + registryData.add("data/jets/cone/kaons/kaon_pos_2d", "K^{+} in jet cone;#Delta#eta;#Delta#varphi", HistType::kTH2F, {axisDeltaEtaCone, axisDeltaPhiCone}); + registryData.add("data/jets/cone/kaons/kaon_neg_2d", "K^{-} in jet cone;#Delta#eta;#Delta#varphi", HistType::kTH2F, {axisDeltaEtaCone, axisDeltaPhiCone}); + registryData.add("data/jets/cone/protons/proton_2d", "p in jet cone;#Delta#eta;#Delta#varphi", HistType::kTH2F, {axisDeltaEtaCone, axisDeltaPhiCone}); + registryData.add("data/jets/cone/protons/antiproton_2d", "#bar{p} in jet cone;#Delta#eta;#Delta#varphi", HistType::kTH2F, {axisDeltaEtaCone, axisDeltaPhiCone}); + + registryData.add("data/jets/cone/all_tracks", "All tracks in jet cone;#Delta#eta;#Delta#varphi;#it{p}_{T}^{track} (GeV/#it{c})", HistType::kTH3F, {axisDeltaEtaCone, axisDeltaPhiCone, axisPtTrackCone}); + registryData.add("data/jets/cone/pions/pion_pos", "#pi^{+} in jet cone;#Delta#eta;#Delta#varphi;#it{p}_{T}^{track} (GeV/#it{c})", HistType::kTH3F, {axisDeltaEtaCone, axisDeltaPhiCone, axisPtTrackCone}); + registryData.add("data/jets/cone/pions/pion_neg", "#pi^{-} in jet cone;#Delta#eta;#Delta#varphi;#it{p}_{T}^{track} (GeV/#it{c})", HistType::kTH3F, {axisDeltaEtaCone, axisDeltaPhiCone, axisPtTrackCone}); + registryData.add("data/jets/cone/kaons/kaon_pos", "K^{+} in jet cone;#Delta#eta;#Delta#varphi;#it{p}_{T}^{track} (GeV/#it{c})", HistType::kTH3F, {axisDeltaEtaCone, axisDeltaPhiCone, axisPtTrackCone}); + registryData.add("data/jets/cone/kaons/kaon_neg", "K^{-} in jet cone;#Delta#eta;#Delta#varphi;#it{p}_{T}^{track} (GeV/#it{c})", HistType::kTH3F, {axisDeltaEtaCone, axisDeltaPhiCone, axisPtTrackCone}); + registryData.add("data/jets/cone/protons/proton", "p in jet cone;#Delta#eta;#Delta#varphi;#it{p}_{T}^{track} (GeV/#it{c})", HistType::kTH3F, {axisDeltaEtaCone, axisDeltaPhiCone, axisPtTrackCone}); + registryData.add("data/jets/cone/protons/antiproton", "#bar{p} in jet cone;#Delta#eta;#Delta#varphi;#it{p}_{T}^{track} (GeV/#it{c})", HistType::kTH3F, {axisDeltaEtaCone, axisDeltaPhiCone, axisPtTrackCone}); + + AxisSpec axisMultiplicity{31, -0.5, 30.5, "N per jet"}; + + registryData.add("data/jets/pions/pos/n_pions_per_jet", "#pi^{+} per jet;N_{#pi^{+}};N_{jets}", HistType::kTH1I, {axisMultiplicity}); + registryData.add("data/jets/kaons/pos/n_kaons_per_jet", "K^{+} per jet;N_{K^{+}};N_{jets}", HistType::kTH1I, {axisMultiplicity}); + registryData.add("data/jets/protons/pos/n_protons_per_jet", "p per jet;N_{p+#bar{p}};N_{jets}", HistType::kTH1I, {axisMultiplicity}); + + registryData.add("data/jets/pions/neg/n_pions_per_jet", "#pi^{-} per jet;N_{#pi^{-}};N_{jets}", HistType::kTH1I, {axisMultiplicity}); + registryData.add("data/jets/kaons/neg/n_kaons_per_jet", "K^{-} per jet;N_{K^{-}};N_{jets}", HistType::kTH1I, {axisMultiplicity}); + registryData.add("data/jets/protons/neg/n_protons_per_jet", "#bar{p} per jet;N_{p+#bar{p}};N_{jets}", HistType::kTH1I, {axisMultiplicity}); + registryData.add("data/jets/composition/particle_multiplicity_per_jet", "Particle composition per jet;Particle species;N per jet", HistType::kTH2I, {{3, 0.5, 3.5, "Particle species"}, {31, -0.5, 30.5, "N per jet"}}); + AxisSpec axisNPions{21, -0.5, 20.5, "N_{#pi} per jet"}; + AxisSpec axisNKaons{11, -0.5, 10.5, "N_{K} per jet"}; + AxisSpec axisNProtons{11, -0.5, 10.5, "N_{p} per jet"}; + + registryData.add("data/jets/composition/nKaons_vs_nProtons", "Particle multiplicity correlation;N_{K};N_{p};N_{jets}", HistType::kTH2F, {axisNKaons, axisNProtons}); + registryData.add("data/jets/composition/nPions_vs_nKaons", "Particle multiplicity correlation;N_{#pi};N_{K};N_{jets}", HistType::kTH2F, {axisNPions, axisNKaons}); + registryData.add("data/jets/composition/nPions_vs_nProtons", "Particle multiplicity correlation;N_{#pi};N_{p};N_{jets}", HistType::kTH2F, {axisNPions, axisNProtons}); + registryData.add("data/jets/composition/nPions_nKaons_nProtons", "Jet particle composition;N_{#pi};N_{K};N_{p}", HistType::kTH3F, {axisNPions, axisNKaons, axisNProtons}); + + registryData.add("data/jets/composition/nKaons_vs_nPions_1proton", "Kaons vs pions in jets with exactly 1 p/#bar{p};N_{K};N_{#pi};N_{jets}", HistType::kTH2I, {axisNKaons, axisNPions}); + registryData.add("data/jets/composition/nKaons_vs_nPions_2protons", "Kaons vs pions in jets with exactly 2 p/#bar{p};N_{K};N_{#pi};N_{jets}", HistType::kTH2I, {axisNKaons, axisNPions}); + registryData.add("data/jets/composition/nKaons_vs_nPions_3protons", "Kaons vs pions in jets with exactly 3 p/#bar{p};N_{K};N_{#pi};N_{jets}", HistType::kTH2I, {axisNKaons, axisNPions}); + registryData.add("data/jets/composition/nKaons_vs_nPions_4protons", "Kaons vs pions in jets with exactly 4 p/#bar{p};N_{K};N_{#pi};N_{jets}", HistType::kTH2I, {axisNKaons, axisNPions}); + + auto hComposition = registryData.get(HIST("data/jets/composition/particle_multiplicity_per_jet")); + hComposition->GetXaxis()->SetBinLabel(1, "#pi"); + hComposition->GetXaxis()->SetBinLabel(2, "K"); + hComposition->GetXaxis()->SetBinLabel(3, "p"); + hComposition->SetOption("COLZ"); + hComposition->SetStats(false); + + // Pions + registryData.add("data/jets/n_pions_vs_n_constituents", + "Pions vs selected constituents;" + "N_{constituents}^{selected};N_{#pi}", + HistType::kTH2I, {{31, -0.5, 30.5, "N_{constituents}^{selected}"}, {31, -0.5, 30.5, "N_{#pi^{+}+#pi^{-}}"}}); registryData.add("data/jets/pions/pos/pion_jet_pos_tpc", "TPC #pi^{+} PID in Jets", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); registryData.add("data/jets/pions/pos/pion_jet_pos_tof", "TOF #pi^{+} PID in Jets", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); registryData.add("data/jets/pions/pos/pion_jet_pos_pt", "#pi^{+} pT in Jets", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); registryData.add("data/jets/pions/pos/pion_jet_pos_eta", "#pi^{+} Eta in Jets", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); registryData.add("data/jets/pions/pos/pion_jet_pos_dcaxy", "#pi^{+} DCAxy in Jets", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); registryData.add("data/jets/pions/pos/pion_jet_pos_dcaz", "#pi^{+} DCAz in Jets", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); + registryData.add("data/jets/pions/pos/pion_jet_pos_phi_vs_pt", "#pi^{+} in jets;#it{p}_{T} (GeV/#it{c});#varphi", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {72, 0.0, TwoPI, "#varphi"}}); registryData.add("data/jets/pions/neg/pion_jet_neg_tpc", "TPC #pi^{-} PID in Jets", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); registryData.add("data/jets/pions/neg/pion_jet_neg_tof", "TOF #pi^{-} PID in Jets", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); @@ -230,20 +405,16 @@ struct JetHadronsPid { registryData.add("data/jets/pions/neg/pion_jet_neg_eta", "#pi^{-} Eta in Jets", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); registryData.add("data/jets/pions/neg/pion_jet_neg_dcaxy", "#pi^{-} DCAxy in Jets", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); registryData.add("data/jets/pions/neg/pion_jet_neg_dcaz", "#pi^{-} DCAz in Jets", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); + registryData.add("data/jets/pions/neg/pion_jet_neg_phi_vs_pt", "#pi^{-} in jets;#it{p}_{T} (GeV/#it{c});#varphi", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {72, 0.0, TwoPI, "#varphi"}}); - registryData.add("data/jets/kaons/kaon_jet_tpc", "TPC Kaon PID in Jets", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); - registryData.add("data/jets/kaons/kaon_jet_tof", "TOF Kaon PID in Jets", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); - registryData.add("data/jets/kaons/kaon_jet_pt", "Kaon pT in Jets", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); - registryData.add("data/jets/kaons/kaon_jet_eta", "Kaon Eta in Jets", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); - registryData.add("data/jets/kaons/kaon_jet_dcaxy", "Kaon DCAxy in Jets", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); - registryData.add("data/jets/kaons/kaon_jet_dcaz", "Kaon DCAz in Jets", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); - + // Kaons registryData.add("data/jets/kaons/pos/kaon_jet_pos_tpc", "TPC K^{+} PID in Jets", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); registryData.add("data/jets/kaons/pos/kaon_jet_pos_tof", "TOF K^{+} PID in Jets", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); registryData.add("data/jets/kaons/pos/kaon_jet_pos_pt", "K^{+} pT in Jets", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); registryData.add("data/jets/kaons/pos/kaon_jet_pos_eta", "K^{+} Eta in Jets", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); registryData.add("data/jets/kaons/pos/kaon_jet_pos_dcaxy", "K^{+} DCAxy in Jets", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); registryData.add("data/jets/kaons/pos/kaon_jet_pos_dcaz", "K^{+} DCAz in Jets", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); + registryData.add("data/jets/kaons/pos/kaon_jet_pos_phi_vs_pt", "K^{+} in jets;#it{p}_{T} (GeV/#it{c});#varphi", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {72, 0.0, TwoPI, "#varphi"}}); registryData.add("data/jets/kaons/neg/kaon_jet_neg_tpc", "TPC K^{-} PID in Jets", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); registryData.add("data/jets/kaons/neg/kaon_jet_neg_tof", "TOF K^{-} PID in Jets", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); @@ -251,20 +422,16 @@ struct JetHadronsPid { registryData.add("data/jets/kaons/neg/kaon_jet_neg_eta", "K^{-} Eta in Jets", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); registryData.add("data/jets/kaons/neg/kaon_jet_neg_dcaxy", "K^{-} DCAxy in Jets", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); registryData.add("data/jets/kaons/neg/kaon_jet_neg_dcaz", "K^{-} DCAz in Jets", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); + registryData.add("data/jets/kaons/neg/kaon_jet_neg_phi_vs_pt", "K^{-} in jets;#it{p}_{T} (GeV/#it{c});#varphi", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {72, 0.0, TwoPI, "#varphi"}}); - registryData.add("data/jets/protons/proton_jet_tpc", "TPC Proton PID in Jets", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); - registryData.add("data/jets/protons/proton_jet_tof", "TOF Proton PID in Jets", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); - registryData.add("data/jets/protons/proton_jet_pt", "Proton pT in Jets", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); - registryData.add("data/jets/protons/proton_jet_eta", "Proton Eta in Jets", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); - registryData.add("data/jets/protons/proton_jet_dcaxy", "Proton DCAxy in Jets", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); - registryData.add("data/jets/protons/proton_jet_dcaz", "Proton DCAz in Jets", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); - + // Protons registryData.add("data/jets/protons/pos/proton_jet_pos_tpc", "TPC p PID in Jets", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); registryData.add("data/jets/protons/pos/proton_jet_pos_tof", "TOF p PID in Jets", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); registryData.add("data/jets/protons/pos/proton_jet_pos_pt", "p pT in Jets", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); registryData.add("data/jets/protons/pos/proton_jet_pos_eta", "p Eta in Jets", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); registryData.add("data/jets/protons/pos/proton_jet_pos_dcaxy", "p DCAxy in Jets", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); registryData.add("data/jets/protons/pos/proton_jet_pos_dcaz", "p DCAz in Jets", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); + registryData.add("data/jets/protons/pos/proton_jet_pos_phi_vs_pt", "p in jets;#it{p}_{T} (GeV/#it{c});#varphi", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {72, 0.0, TwoPI, "#varphi"}}); registryData.add("data/jets/protons/neg/proton_jet_neg_tpc", "TPC #bar{p} PID in Jets", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); registryData.add("data/jets/protons/neg/proton_jet_neg_tof", "TOF #bar{p} PID in Jets", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); @@ -272,6 +439,11 @@ struct JetHadronsPid { registryData.add("data/jets/protons/neg/proton_jet_neg_eta", "#bar{p} Eta in Jets", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); registryData.add("data/jets/protons/neg/proton_jet_neg_dcaxy", "#bar{p} DCAxy in Jets", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); registryData.add("data/jets/protons/neg/proton_jet_neg_dcaz", "#bar{p} DCAz in Jets", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); + registryData.add("data/jets/protons/neg/proton_jet_neg_phi_vs_pt", "p in jets;#it{p}_{T} (GeV/#it{c});#varphi", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {72, 0.0, TwoPI, "#varphi"}}); + + ////////////////////////////////////////////// + // UE + ////////////////////////////////////////////// registryData.add("data/ue/pions/pion_ue_tpc", "TPC Pion PID in UE", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); registryData.add("data/ue/pions/pion_ue_tof", "TOF Pion PID in UE", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); @@ -335,9 +507,13 @@ struct JetHadronsPid { registryData.add("data/ue/protons/neg/proton_ue_neg_eta", "#bar{p} Eta in UE", HistType::kTH1F, {{100, -1.0, 1.0, "#eta"}}); registryData.add("data/ue/protons/neg/proton_ue_neg_dcaxy", "#bar{p} DCAxy in UE", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{xy} (cm)"}}); registryData.add("data/ue/protons/neg/proton_ue_neg_dcaz", "#bar{p} DCAz in UE", HistType::kTH1F, {{100, -0.1, 0.1, "DCA_{z} (cm)"}}); - registryData.add("data/ue/tracks_n_in_ue", "Number of tracks in UE", HistType::kTH1I, {{100, 0, 100, "N_{tracks}"}}); + ////////////////////////////////////////////// + // MC + // RECONSTRUCTION + ////////////////////////////////////////////// + registryData.add("mc/n_events", "Event counter", HistType::kTH1F, {{1, 0.5, 1.5, "N_{events}"}}); registryData.add("mc/reconstruction/pions/rec_pion_all", "All Tracks PID'd as Pions", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); @@ -385,6 +561,11 @@ struct JetHadronsPid { registryData.add("mc/reconstruction/protons/pos/mc_sec_proton_pos_pt", "Secondary p (Reconstructed)", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); registryData.add("mc/reconstruction/protons/neg/mc_sec_proton_neg_pt", "Secondary #bar{p} (Reconstructed)", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + ////////////////////////////////////////////// + // MC + // TRUTH + ////////////////////////////////////////////// + registryData.add("mc/truth/pions/mc_gen_pion_pt", "Generated Primary Pions (Truth)", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); registryData.add("mc/truth/pions/pos/mc_gen_pion_pos_pt", "Generated Primary #pi^{+} pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); registryData.add("mc/truth/pions/neg/mc_gen_pion_neg_pt", "Generated Primary #pi^{-} pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); @@ -441,18 +622,32 @@ struct JetHadronsPid { double dKa = 0; double dPr = 0; - if (pt < cfg.ptThreshold) { + if (pt < cfg.ptThresholdPion) { dPi = std::abs(track.tpcNSigmaPi()); - dKa = std::abs(track.tpcNSigmaKa()); - dPr = std::abs(track.tpcNSigmaPr()); } else { if (track.hasTOF()) { dPi = std::hypot(track.tofNSigmaPi(), track.tpcNSigmaPi()); - dKa = std::hypot(track.tofNSigmaKa(), track.tpcNSigmaKa()); - dPr = std::hypot(track.tofNSigmaPr(), track.tpcNSigmaPr()); } else { dPi = buffer; + } + } + + if (pt < cfg.ptThresholdKaon) { + dKa = std::abs(track.tpcNSigmaKa()); + } else { + if (track.hasTOF()) { + dKa = std::hypot(track.tofNSigmaKa(), track.tpcNSigmaKa()); + } else { dKa = buffer; + } + } + + if (pt < cfg.ptThresholdProton) { + dPr = std::abs(track.tpcNSigmaPr()); + } else { + if (track.hasTOF()) { + dPr = std::hypot(track.tofNSigmaPr(), track.tpcNSigmaPr()); + } else { dPr = buffer; } } @@ -562,22 +757,45 @@ struct JetHadronsPid { return; } + int nSelectedTracks = 0; + + registryData.fill(HIST("data/pure/collisions/z_vertex"), collision.posZ()); + registryData.fill(HIST("data/pure/collisions/x_vertex"), collision.posX()); + registryData.fill(HIST("data/pure/collisions/y_vertex"), collision.posY()); + registryData.fill(HIST("data/pure/collisions/xy_vertex"), collision.posX(), collision.posY()); + registryData.fill(HIST("data/pure/collisions/n_contributors"), collision.numContrib()); + for (auto const& track : globalTracks) { if (!passedTrackSelection(track)) { continue; } + ++nSelectedTracks; + + const double p = track.p(); + registryData.fill(HIST("data/pure/tpc_signal_vs_p"), p, track.tpcSignal()); + if (track.hasTOF()) { + registryData.fill(HIST("data/pure/tof_beta_vs_p"), p, track.beta()); + } + double pt = track.pt(); double eta = track.eta(); double dcaxy = track.dcaXY(); double dcaz = track.dcaZ(); int charge = track.sign(); + double phi = track.phi(); PidResult pid = getPid(track); if (pid.isPion) { + registryData.fill(HIST("data/pure/after_pid/pion_tpc_signal_vs_p"), p, track.tpcSignal()); registryData.fill(HIST("data/pure/pions/pion_pure_tpc"), pt, track.tpcNSigmaPi()); + registryData.fill(HIST("data/pure/pions/pion_pure_eta_phi"), phi, eta); if (track.hasTOF()) { + registryData.fill( + HIST("data/pure/after_pid/pion_tof_beta_vs_p"), + p, + track.beta()); registryData.fill(HIST("data/pure/pions/pion_pure_tof"), pt, track.tofNSigmaPi()); } registryData.fill(HIST("data/pure/pions/pion_pure_pt"), pt); @@ -587,6 +805,9 @@ struct JetHadronsPid { if (charge > 0) { registryData.fill(HIST("data/pure/pions/pos/pion_pure_pos_tpc"), pt, track.tpcNSigmaPi()); + registryData.fill(HIST("data/pure/pions/pos/pion_pure_pos_phi_vs_pt"), pt, phi); + registryData.fill(HIST("data/pure/pions/pos/pion_pure_pos_eta_phi"), phi, eta); + if (track.hasTOF()) { registryData.fill(HIST("data/pure/pions/pos/pion_pure_pos_tof"), pt, track.tofNSigmaPi()); } @@ -596,6 +817,9 @@ struct JetHadronsPid { registryData.fill(HIST("data/pure/pions/pos/pion_pure_pos_dcaz"), dcaz); } else { registryData.fill(HIST("data/pure/pions/neg/pion_pure_neg_tpc"), pt, track.tpcNSigmaPi()); + registryData.fill(HIST("data/pure/pions/neg/pion_pure_neg_phi_vs_pt"), pt, phi); + registryData.fill(HIST("data/pure/pions/neg/pion_pure_neg_eta_phi"), phi, eta); + if (track.hasTOF()) { registryData.fill(HIST("data/pure/pions/neg/pion_pure_neg_tof"), pt, track.tofNSigmaPi()); } @@ -607,8 +831,14 @@ struct JetHadronsPid { } if (pid.isKaon) { + registryData.fill(HIST("data/pure/after_pid/kaon_tpc_signal_vs_p"), track.p(), track.tpcSignal()); registryData.fill(HIST("data/pure/kaons/kaon_pure_tpc"), pt, track.tpcNSigmaKa()); + registryData.fill(HIST("data/pure/kaons/kaon_pure_eta_phi"), phi, eta); if (track.hasTOF()) { + registryData.fill( + HIST("data/pure/after_pid/kaon_tof_beta_vs_p"), + p, + track.beta()); registryData.fill(HIST("data/pure/kaons/kaon_pure_tof"), pt, track.tofNSigmaKa()); } registryData.fill(HIST("data/pure/kaons/kaon_pure_pt"), pt); @@ -618,6 +848,9 @@ struct JetHadronsPid { if (charge > 0) { registryData.fill(HIST("data/pure/kaons/pos/kaon_pure_pos_tpc"), pt, track.tpcNSigmaKa()); + registryData.fill(HIST("data/pure/kaons/pos/kaon_pure_pos_phi_vs_pt"), pt, phi); + registryData.fill(HIST("data/pure/kaons/pos/kaon_pure_pos_eta_phi"), phi, eta); + if (track.hasTOF()) { registryData.fill(HIST("data/pure/kaons/pos/kaon_pure_pos_tof"), pt, track.tofNSigmaKa()); } @@ -627,6 +860,9 @@ struct JetHadronsPid { registryData.fill(HIST("data/pure/kaons/pos/kaon_pure_pos_dcaz"), dcaz); } else { registryData.fill(HIST("data/pure/kaons/neg/kaon_pure_neg_tpc"), pt, track.tpcNSigmaKa()); + registryData.fill(HIST("data/pure/kaons/neg/kaon_pure_neg_phi_vs_pt"), pt, phi); + registryData.fill(HIST("data/pure/kaons/neg/kaon_pure_neg_eta_phi"), phi, eta); + if (track.hasTOF()) { registryData.fill(HIST("data/pure/kaons/neg/kaon_pure_neg_tof"), pt, track.tofNSigmaKa()); } @@ -638,8 +874,14 @@ struct JetHadronsPid { } if (pid.isProton) { + registryData.fill(HIST("data/pure/after_pid/proton_tpc_signal_vs_p"), track.p(), track.tpcSignal()); registryData.fill(HIST("data/pure/protons/proton_pure_tpc"), pt, track.tpcNSigmaPr()); + registryData.fill(HIST("data/pure/protons/proton_pure_eta_phi"), phi, eta); if (track.hasTOF()) { + registryData.fill( + HIST("data/pure/after_pid/proton_tof_beta_vs_p"), + p, + track.beta()); registryData.fill(HIST("data/pure/protons/proton_pure_tof"), pt, track.tofNSigmaPr()); } registryData.fill(HIST("data/pure/protons/proton_pure_pt"), pt); @@ -649,6 +891,9 @@ struct JetHadronsPid { if (charge > 0) { registryData.fill(HIST("data/pure/protons/pos/proton_pure_pos_tpc"), pt, track.tpcNSigmaPr()); + registryData.fill(HIST("data/pure/protons/pos/proton_pure_pos_phi_vs_pt"), pt, phi); + registryData.fill(HIST("data/pure/protons/pos/proton_pure_pos_eta_phi"), phi, eta); + if (track.hasTOF()) { registryData.fill(HIST("data/pure/protons/pos/proton_pure_pos_tof"), pt, track.tofNSigmaPr()); } @@ -658,6 +903,9 @@ struct JetHadronsPid { registryData.fill(HIST("data/pure/protons/pos/proton_pure_pos_dcaz"), dcaz); } else { registryData.fill(HIST("data/pure/protons/neg/proton_pure_neg_tpc"), pt, track.tpcNSigmaPr()); + registryData.fill(HIST("data/pure/protons/neg/proton_pure_neg_phi_vs_pt"), pt, phi); + registryData.fill(HIST("data/pure/protons/neg/proton_pure_neg_eta_phi"), phi, eta); + if (track.hasTOF()) { registryData.fill(HIST("data/pure/protons/neg/proton_pure_neg_tof"), pt, track.tofNSigmaPr()); } @@ -668,6 +916,7 @@ struct JetHadronsPid { } } } + registryData.fill(HIST("data/jets/total_tracks_pure_vs_jets"), 1.0, static_cast(nSelectedTracks)); } PROCESS_SWITCH(JetHadronsPid, processPureTracks, "Pure Tracks Analysis", true); @@ -676,7 +925,7 @@ struct JetHadronsPid { soa::Join const&, HadronTracks const& globalTracks) { - registryData.fill(HIST("data/n_events_raw"), 1); + registryData.fill(HIST("data/jets/n_events_raw"), 1); if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { return; @@ -687,12 +936,14 @@ struct JetHadronsPid { return; } - registryData.fill(HIST("data/n_events"), 1); - registryData.fill(HIST("data/z_vtx"), zVertex); + registryData.fill(HIST("data/jets/n_events"), 1); + registryData.fill(HIST("data/jets/z_vtx"), zVertex); double centralRho = collision.rho(); + int jetsInCollision = 0; auto collTracks = globalTracks.sliceBy(tracksPerCollision, collision.collisionId()); + int tracksInJetsCollision = 0; for (auto const& jet : jets) { @@ -703,17 +954,15 @@ struct JetHadronsPid { continue; } + if (isppRefAnalysis && (jet.pt() < minJetPt || jet.pt() > maxJetPt)) { + continue; + } + double ptSub = jet.pt() - (centralRho * jet.area()); if (ptSub < 0) { ptSub = 0.0; } - registryData.fill(HIST("data/jets/jet_pt_subtracted"), ptSub); - registryData.fill(HIST("data/jets/jet_pt_raw_vs_sub"), jet.pt(), ptSub); - - if (isppRefAnalysis && (jet.pt() < minJetPt || jet.pt() > maxJetPt)) { - continue; - } if (!isppRefAnalysis && (ptSub < minJetPt || ptSub > maxJetPt)) { continue; } @@ -723,6 +972,11 @@ struct JetHadronsPid { continue; } + jetsInCollision++; + + registryData.fill(HIST("data/jets/jet_pt_subtracted"), ptSub); + registryData.fill(HIST("data/jets/jet_pt_raw_vs_sub"), jet.pt(), ptSub); + registryData.fill(HIST("data/jets/jet_eta"), jet.eta()); registryData.fill(HIST("data/jets/jet_phi"), jet.phi()); registryData.fill(HIST("data/jets/jet_area"), jet.area()); @@ -737,39 +991,71 @@ struct JetHadronsPid { continue; } - int constituentCount = 0; - std::set tracksInJetsSet; + int selectedConstituentCount = 0; + + int nPionsInJet = 0; + int nKaonsInJet = 0; + int nProtonsInJet = 0; + + int nPionsInJetPos = 0; + int nKaonsInJetPos = 0; + int nProtonsInJetPos = 0; + + int nPionsInJetNeg = 0; + int nKaonsInJetNeg = 0; + int nProtonsInJetNeg = 0; for (auto const& jtrack : jet.tracks_as>()) { - constituentCount++; auto track = jtrack.track_as(); - tracksInJetsSet.insert(track.index()); if (!passedTrackSelection(track)) { continue; } + tracksInJetsCollision++; + + selectedConstituentCount++; + const double p = track.p(); + + registryData.fill(HIST("data/jets/tpc_signal_vs_p"), p, track.tpcSignal()); + + if (track.hasTOF()) { + registryData.fill(HIST("data/jets/tof_beta_vs_p"), p, track.beta()); + } double pt = track.pt(); double eta = track.eta(); double dcaxy = track.dcaXY(); double dcaz = track.dcaZ(); int charge = track.sign(); + double phi = track.phi(); + + double deltaEtaJet = track.eta() - jet.eta(); + double deltaPhiJet = RecoDecay::constrainAngle(track.phi() - jet.phi(), -PI); + + registryData.fill(HIST("data/jets/cone/all_tracks"), deltaEtaJet, deltaPhiJet, pt); + registryData.fill(HIST("data/jets/cone/all_tracks_2d"), deltaEtaJet, deltaPhiJet); PidResult pid = getPid(track); if (pid.isPion) { - registryData.fill(HIST("data/jets/pions/pion_jet_tpc"), pt, track.tpcNSigmaPi()); + registryData.fill(HIST("data/jets/after_pid/pion_tpc_signal_vs_p"), track.p(), track.tpcSignal()); + if (track.hasTOF()) { - registryData.fill(HIST("data/jets/pions/pion_jet_tof"), pt, track.tofNSigmaPi()); + registryData.fill( + HIST("data/jets/after_pid/pion_tof_beta_vs_p"), + p, + track.beta()); } - registryData.fill(HIST("data/jets/pions/pion_jet_pt"), pt); - registryData.fill(HIST("data/jets/pions/pion_jet_eta"), eta); - registryData.fill(HIST("data/jets/pions/pion_jet_dcaxy"), dcaxy); - registryData.fill(HIST("data/jets/pions/pion_jet_dcaz"), dcaz); if (charge > 0) { + nPionsInJetPos++; + registryData.fill(HIST("data/jets/pions/pos/pion_jet_pos_tpc"), pt, track.tpcNSigmaPi()); + registryData.fill(HIST("data/jets/pions/pos/pion_jet_pos_phi_vs_pt"), pt, phi); + registryData.fill(HIST("data/jets/cone/pions/pion_pos"), deltaEtaJet, deltaPhiJet, pt); + registryData.fill(HIST("data/jets/cone/pions/pion_pos_2d"), deltaEtaJet, deltaPhiJet); + if (track.hasTOF()) { registryData.fill(HIST("data/jets/pions/pos/pion_jet_pos_tof"), pt, track.tofNSigmaPi()); } @@ -778,7 +1064,12 @@ struct JetHadronsPid { registryData.fill(HIST("data/jets/pions/pos/pion_jet_pos_dcaxy"), dcaxy); registryData.fill(HIST("data/jets/pions/pos/pion_jet_pos_dcaz"), dcaz); } else { + nPionsInJetNeg++; + + registryData.fill(HIST("data/jets/pions/neg/pion_jet_neg_phi_vs_pt"), pt, phi); registryData.fill(HIST("data/jets/pions/neg/pion_jet_neg_tpc"), pt, track.tpcNSigmaPi()); + registryData.fill(HIST("data/jets/cone/pions/pion_neg"), deltaEtaJet, deltaPhiJet, pt); + registryData.fill(HIST("data/jets/cone/pions/pion_neg_2d"), deltaEtaJet, deltaPhiJet); if (track.hasTOF()) { registryData.fill(HIST("data/jets/pions/neg/pion_jet_neg_tof"), pt, track.tofNSigmaPi()); } @@ -790,17 +1081,22 @@ struct JetHadronsPid { } if (pid.isKaon) { - registryData.fill(HIST("data/jets/kaons/kaon_jet_tpc"), pt, track.tpcNSigmaKa()); + registryData.fill(HIST("data/jets/after_pid/kaon_tpc_signal_vs_p"), track.p(), track.tpcSignal()); + if (track.hasTOF()) { - registryData.fill(HIST("data/jets/kaons/kaon_jet_tof"), pt, track.tofNSigmaKa()); + registryData.fill( + HIST("data/jets/after_pid/kaon_tof_beta_vs_p"), + p, + track.beta()); } - registryData.fill(HIST("data/jets/kaons/kaon_jet_pt"), pt); - registryData.fill(HIST("data/jets/kaons/kaon_jet_eta"), eta); - registryData.fill(HIST("data/jets/kaons/kaon_jet_dcaxy"), dcaxy); - registryData.fill(HIST("data/jets/kaons/kaon_jet_dcaz"), dcaz); - if (charge > 0) { + nKaonsInJetPos++; + + registryData.fill(HIST("data/jets/kaons/pos/kaon_jet_pos_phi_vs_pt"), pt, phi); registryData.fill(HIST("data/jets/kaons/pos/kaon_jet_pos_tpc"), pt, track.tpcNSigmaKa()); + registryData.fill(HIST("data/jets/cone/kaons/kaon_pos"), deltaEtaJet, deltaPhiJet, pt); + registryData.fill(HIST("data/jets/cone/kaons/kaon_pos_2d"), deltaEtaJet, deltaPhiJet); + if (track.hasTOF()) { registryData.fill(HIST("data/jets/kaons/pos/kaon_jet_pos_tof"), pt, track.tofNSigmaKa()); } @@ -809,7 +1105,12 @@ struct JetHadronsPid { registryData.fill(HIST("data/jets/kaons/pos/kaon_jet_pos_dcaxy"), dcaxy); registryData.fill(HIST("data/jets/kaons/pos/kaon_jet_pos_dcaz"), dcaz); } else { + nKaonsInJetNeg++; + + registryData.fill(HIST("data/jets/kaons/neg/kaon_jet_neg_phi_vs_pt"), pt, phi); registryData.fill(HIST("data/jets/kaons/neg/kaon_jet_neg_tpc"), pt, track.tpcNSigmaKa()); + registryData.fill(HIST("data/jets/cone/kaons/kaon_neg"), deltaEtaJet, deltaPhiJet, pt); + registryData.fill(HIST("data/jets/cone/kaons/kaon_neg_2d"), deltaEtaJet, deltaPhiJet); if (track.hasTOF()) { registryData.fill(HIST("data/jets/kaons/neg/kaon_jet_neg_tof"), pt, track.tofNSigmaKa()); } @@ -821,17 +1122,21 @@ struct JetHadronsPid { } if (pid.isProton) { - registryData.fill(HIST("data/jets/protons/proton_jet_tpc"), pt, track.tpcNSigmaPr()); + registryData.fill(HIST("data/jets/after_pid/proton_tpc_signal_vs_p"), track.p(), track.tpcSignal()); + if (track.hasTOF()) { - registryData.fill(HIST("data/jets/protons/proton_jet_tof"), pt, track.tofNSigmaPr()); + registryData.fill( + HIST("data/jets/after_pid/proton_tof_beta_vs_p"), + p, + track.beta()); } - registryData.fill(HIST("data/jets/protons/proton_jet_pt"), pt); - registryData.fill(HIST("data/jets/protons/proton_jet_eta"), eta); - registryData.fill(HIST("data/jets/protons/proton_jet_dcaxy"), dcaxy); - registryData.fill(HIST("data/jets/protons/proton_jet_dcaz"), dcaz); - if (charge > 0) { + nProtonsInJetPos++; + + registryData.fill(HIST("data/jets/protons/pos/proton_jet_pos_phi_vs_pt"), pt, phi); registryData.fill(HIST("data/jets/protons/pos/proton_jet_pos_tpc"), pt, track.tpcNSigmaPr()); + registryData.fill(HIST("data/jets/cone/protons/proton"), deltaEtaJet, deltaPhiJet, pt); + registryData.fill(HIST("data/jets/cone/protons/proton_2d"), deltaEtaJet, deltaPhiJet); if (track.hasTOF()) { registryData.fill(HIST("data/jets/protons/pos/proton_jet_pos_tof"), pt, track.tofNSigmaPr()); } @@ -840,7 +1145,12 @@ struct JetHadronsPid { registryData.fill(HIST("data/jets/protons/pos/proton_jet_pos_dcaxy"), dcaxy); registryData.fill(HIST("data/jets/protons/pos/proton_jet_pos_dcaz"), dcaz); } else { + nProtonsInJetNeg++; + + registryData.fill(HIST("data/jets/protons/neg/proton_jet_neg_phi_vs_pt"), pt, phi); registryData.fill(HIST("data/jets/protons/neg/proton_jet_neg_tpc"), pt, track.tpcNSigmaPr()); + registryData.fill(HIST("data/jets/cone/protons/antiproton"), deltaEtaJet, deltaPhiJet, pt); + registryData.fill(HIST("data/jets/cone/protons/antiproton_2d"), deltaEtaJet, deltaPhiJet); if (track.hasTOF()) { registryData.fill(HIST("data/jets/protons/neg/proton_jet_neg_tof"), pt, track.tofNSigmaPr()); } @@ -851,18 +1161,67 @@ struct JetHadronsPid { } } } - registryData.fill(HIST("data/jets/jet_n_constituents"), constituentCount); + registryData.fill(HIST("data/jets/jet_n_constituents"), selectedConstituentCount); + + if (nPionsInJetPos > 0) { + registryData.fill(HIST("data/jets/pions/pos/n_pions_per_jet"), nPionsInJetPos); + } + if (nKaonsInJetPos > 0) { + registryData.fill(HIST("data/jets/kaons/pos/n_kaons_per_jet"), nKaonsInJetPos); + } + if (nProtonsInJetPos > 0) { + registryData.fill(HIST("data/jets/protons/pos/n_protons_per_jet"), nProtonsInJetPos); + } + + if (nPionsInJetNeg > 0) { + registryData.fill(HIST("data/jets/pions/neg/n_pions_per_jet"), nPionsInJetNeg); + } + if (nKaonsInJetNeg > 0) { + registryData.fill(HIST("data/jets/kaons/neg/n_kaons_per_jet"), nKaonsInJetNeg); + } + if (nProtonsInJetNeg > 0) { + registryData.fill(HIST("data/jets/protons/neg/n_protons_per_jet"), nProtonsInJetNeg); + } + + nPionsInJet = nPionsInJetPos + nPionsInJetNeg; + nProtonsInJet = nProtonsInJetNeg + nProtonsInJetPos; + nKaonsInJet = nKaonsInJetNeg + nKaonsInJetPos; + + registryData.fill(HIST("data/jets/n_pions_vs_n_constituents"), selectedConstituentCount, nPionsInJet); + registryData.fill(HIST("data/jets/composition/particle_multiplicity_per_jet"), 1.0, nPionsInJet); + registryData.fill(HIST("data/jets/composition/particle_multiplicity_per_jet"), 2.0, nKaonsInJet); + registryData.fill(HIST("data/jets/composition/particle_multiplicity_per_jet"), 3.0, nProtonsInJet); + + registryData.fill(HIST("data/jets/composition/nKaons_vs_nProtons"), nKaonsInJet, nProtonsInJet); + registryData.fill(HIST("data/jets/composition/nPions_vs_nKaons"), nPionsInJet, nKaonsInJet); + registryData.fill(HIST("data/jets/composition/nPions_vs_nProtons"), nPionsInJet, nProtonsInJet); + registryData.fill(HIST("data/jets/composition/nPions_nKaons_nProtons"), nPionsInJet, nKaonsInJet, nProtonsInJet); + + switch (nProtonsInJet) { + case 1: + registryData.fill(HIST("data/jets/composition/nKaons_vs_nPions_1proton"), nKaonsInJet, nPionsInJet); + break; + + case 2: + registryData.fill(HIST("data/jets/composition/nKaons_vs_nPions_2protons"), nKaonsInJet, nPionsInJet); + break; + + case 3: + registryData.fill(HIST("data/jets/composition/nKaons_vs_nPions_3protons"), nKaonsInJet, nPionsInJet); + break; + + case 4: + registryData.fill(HIST("data/jets/composition/nKaons_vs_nPions_4protons"), nKaonsInJet, nPionsInJet); + break; + + default: + break; + } int nTracksOut = 0; for (auto const& track : collTracks) { - if (!tracksInJetsSet.contains(track.index())) { - if (passedTrackSelection(track)) { - nTracksOut++; - } - } - if (!passedTrackSelection(track)) { continue; } @@ -886,6 +1245,7 @@ struct JetHadronsPid { int charge = track.sign(); PidResult pid = getPid(track); + nTracksOut++; if (pid.isPion) { registryData.fill(HIST("data/ue/pions/pion_ue_tpc"), pt, track.tpcNSigmaPi()); @@ -985,6 +1345,8 @@ struct JetHadronsPid { } registryData.fill(HIST("data/ue/tracks_n_in_ue"), nTracksOut); } + registryData.fill(HIST("data/jets/total_tracks_pure_vs_jets"), 2.0, static_cast(tracksInJetsCollision)); + registryData.fill(HIST("data/jets/collision_multiplicity"), jetsInCollision); } PROCESS_SWITCH(JetHadronsPid, processJets, "Jets Analysis", true); From 11645267303c9f8444da838aae0f803a91fdcc2f Mon Sep 17 00:00:00 2001 From: Leonard Lorenc <107263905+llorenc-11@users.noreply.github.com> Date: Thu, 16 Jul 2026 17:19:41 +0200 Subject: [PATCH 35/35] Add new MC histograms in jetHadronsPid.cxx --- PWGJE/Tasks/jetHadronsPid.cxx | 137 +++++++++++++++++++++++++++++----- 1 file changed, 118 insertions(+), 19 deletions(-) diff --git a/PWGJE/Tasks/jetHadronsPid.cxx b/PWGJE/Tasks/jetHadronsPid.cxx index 2ea0d5546c1..825b41c0897 100644 --- a/PWGJE/Tasks/jetHadronsPid.cxx +++ b/PWGJE/Tasks/jetHadronsPid.cxx @@ -519,13 +519,13 @@ struct JetHadronsPid { registryData.add("mc/reconstruction/pions/rec_pion_all", "All Tracks PID'd as Pions", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); registryData.add("mc/reconstruction/pions/mc_rec_pion_pt", "True Primary Pions (Reconstructed)", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); registryData.add("mc/reconstruction/pions/mc_sec_pion_pt", "Secondary Pions (Reconstructed)", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); - registryData.add("mc/reconstruction/pions/contamination_matrix_pion", "Pion PID Contamination", HistType::kTH2F, {{4000, -0.5, 3999.5, "Absolute PDG Code"}, {120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc/reconstruction/pions/contamination_matrix_pion", "Pion PID Contamination", HistType::kTH2F, {{8000, -4000.5, 3999.5, "PDG Code"}, {120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); registryData.add("mc/reconstruction/pions/pos/mc_rec_pion_pos_pt", "Reconstructed Primary #pi^{+} pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); - registryData.add("mc/reconstruction/pions/pos/contamination_matrix_pion_pos", "#pi^{+} PID Contamination", HistType::kTH2F, {{4000, -0.5, 3999.5, "Absolute PDG Code"}, {120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc/reconstruction/pions/pos/contamination_matrix_pion_pos", "#pi^{+} PID Contamination", HistType::kTH2F, {{8000, -4000.5, 3999.5, "PDG Code"}, {120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); registryData.add("mc/reconstruction/pions/neg/mc_rec_pion_neg_pt", "Reconstructed Primary #pi^{-} pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); - registryData.add("mc/reconstruction/pions/neg/contamination_matrix_pion_neg", "#pi^{-} PID Contamination", HistType::kTH2F, {{4000, -0.5, 3999.5, "Absolute PDG Code"}, {120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc/reconstruction/pions/neg/contamination_matrix_pion_neg", "#pi^{-} PID Contamination", HistType::kTH2F, {{8000, -4000.5, 3999.5, "PDG Code"}, {120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); registryData.add("mc/reconstruction/pions/pos/rec_pion_pos_all", "All Tracks PID'd as #pi^{+}", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); registryData.add("mc/reconstruction/pions/neg/rec_pion_neg_all", "All Tracks PID'd as #pi^{-}", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); registryData.add("mc/reconstruction/pions/pos/mc_sec_pion_pos_pt", "Secondary #pi^{+} (Reconstructed)", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); @@ -534,33 +534,47 @@ struct JetHadronsPid { registryData.add("mc/reconstruction/kaons/rec_kaon_all", "All Tracks PID'd as Kaons", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); registryData.add("mc/reconstruction/kaons/mc_rec_kaon_pt", "True Primary Kaons (Reconstructed)", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); registryData.add("mc/reconstruction/kaons/mc_sec_kaon_pt", "Secondary Kaons (Reconstructed)", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); - registryData.add("mc/reconstruction/kaons/contamination_matrix_kaon", "Kaon PID Contamination", HistType::kTH2F, {{4000, -0.5, 3999.5, "Absolute PDG Code"}, {120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc/reconstruction/kaons/contamination_matrix_kaon", "Kaon PID Contamination", HistType::kTH2F, {{8000, -4000.5, 3999.5, "PDG Code"}, {120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); registryData.add("mc/reconstruction/kaons/pos/mc_rec_kaon_pos_pt", "Reconstructed Primary K^{+} pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); - registryData.add("mc/reconstruction/kaons/pos/contamination_matrix_kaon_pos", "K^{+} PID Contamination", HistType::kTH2F, {{4000, -0.5, 3999.5, "Absolute PDG Code"}, {120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc/reconstruction/kaons/pos/contamination_matrix_kaon_pos", "K^{+} PID Contamination", HistType::kTH2F, {{8000, -4000.5, 3999.5, "PDG Code"}, {120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); registryData.add("mc/reconstruction/kaons/pos/rec_kaon_pos_all", "All Tracks PID'd as K^{+}", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); registryData.add("mc/reconstruction/kaons/neg/rec_kaon_neg_all", "All Tracks PID'd as K^{-}", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); registryData.add("mc/reconstruction/kaons/pos/mc_sec_kaon_pos_pt", "Secondary K^{+} (Reconstructed)", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); registryData.add("mc/reconstruction/kaons/neg/mc_sec_kaon_neg_pt", "Secondary K^{-} (Reconstructed)", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); registryData.add("mc/reconstruction/kaons/neg/mc_rec_kaon_neg_pt", "Reconstructed Primary K^{-} pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); - registryData.add("mc/reconstruction/kaons/neg/contamination_matrix_kaon_neg", "K^{-} PID Contamination", HistType::kTH2F, {{4000, -0.5, 3999.5, "Absolute PDG Code"}, {120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc/reconstruction/kaons/neg/contamination_matrix_kaon_neg", "K^{-} PID Contamination", HistType::kTH2F, {{8000, -4000.5, 3999.5, "PDG Code"}, {120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); registryData.add("mc/reconstruction/protons/rec_proton_all", "All Tracks PID'd as Protons", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); registryData.add("mc/reconstruction/protons/mc_rec_proton_pt", "True Primary Protons (Reconstructed)", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); registryData.add("mc/reconstruction/protons/mc_sec_proton_pt", "Secondary Protons (Reconstructed)", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); - registryData.add("mc/reconstruction/protons/contamination_matrix_proton", "Proton PID Contamination", HistType::kTH2F, {{4000, -0.5, 3999.5, "Absolute PDG Code"}, {120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc/reconstruction/protons/contamination_matrix_proton", "Proton PID Contamination", HistType::kTH2F, {{8000, -4000.5, 3999.5, "PDG Code"}, {120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); registryData.add("mc/reconstruction/protons/pos/mc_rec_proton_pos_pt", "Reconstructed Primary p pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); - registryData.add("mc/reconstruction/protons/pos/contamination_matrix_proton_pos", "p PID Contamination", HistType::kTH2F, {{4000, -0.5, 3999.5, "Absolute PDG Code"}, {120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc/reconstruction/protons/pos/contamination_matrix_proton_pos", "p PID Contamination", HistType::kTH2F, {{8000, -4000.5, 3999.5, "PDG Code"}, {120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); registryData.add("mc/reconstruction/protons/neg/mc_rec_proton_neg_pt", "Reconstructed Primary #bar{p} pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); - registryData.add("mc/reconstruction/protons/neg/contamination_matrix_proton_neg", "#bar{p} PID Contamination", HistType::kTH2F, {{4000, -0.5, 3999.5, "Absolute PDG Code"}, {120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc/reconstruction/protons/neg/contamination_matrix_proton_neg", "#bar{p} PID Contamination", HistType::kTH2F, {{8000, -4000.5, 3999.5, "PDG Code"}, {120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); registryData.add("mc/reconstruction/protons/pos/rec_proton_pos_all", "All Tracks PID'd as p", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); registryData.add("mc/reconstruction/protons/neg/rec_proton_neg_all", "All Tracks PID'd as #bar{p}", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); registryData.add("mc/reconstruction/protons/pos/mc_sec_proton_pos_pt", "Secondary p (Reconstructed)", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); registryData.add("mc/reconstruction/protons/neg/mc_sec_proton_neg_pt", "Secondary #bar{p} (Reconstructed)", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc/reconstruction/pions/pos/rec_pion_pos_tpc", "MC TPC #pi^{+} PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); + registryData.add("mc/reconstruction/pions/pos/rec_pion_pos_tof", "MC TOF #pi^{+} PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); + registryData.add("mc/reconstruction/pions/neg/rec_pion_neg_tpc", "MC TPC #pi^{-} PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); + registryData.add("mc/reconstruction/pions/neg/rec_pion_neg_tof", "MC TOF #pi^{-} PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); + + registryData.add("mc/reconstruction/kaons/pos/rec_kaon_pos_tpc", "MC TPC K^{+} PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); + registryData.add("mc/reconstruction/kaons/pos/rec_kaon_pos_tof", "MC TOF K^{+} PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); + registryData.add("mc/reconstruction/kaons/neg/rec_kaon_neg_tpc", "MC TPC K^{-} PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); + registryData.add("mc/reconstruction/kaons/neg/rec_kaon_neg_tof", "MC TOF K^{-} PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); + + registryData.add("mc/reconstruction/protons/pos/rec_proton_pos_tpc", "MC TPC p PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); + registryData.add("mc/reconstruction/protons/pos/rec_proton_pos_tof", "MC TOF p PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); + registryData.add("mc/reconstruction/protons/neg/rec_proton_neg_tpc", "MC TPC #bar{p} PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TPC}"}}); + registryData.add("mc/reconstruction/protons/neg/rec_proton_neg_tof", "MC TOF #bar{p} PID", HistType::kTH2F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}, {200, -3.0, 3.0, "n#sigma_{TOF}"}}); ////////////////////////////////////////////// // MC // TRUTH @@ -577,6 +591,21 @@ struct JetHadronsPid { registryData.add("mc/truth/protons/mc_gen_proton_pt", "Generated Primary Protons (Truth)", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); registryData.add("mc/truth/protons/pos/mc_gen_proton_pos_pt", "Generated Primary p pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); registryData.add("mc/truth/protons/neg/mc_gen_proton_neg_pt", "Generated Primary #bar{p} pT", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + + registryData.add("mc/reconstruction/hadrons/rec_hadron_all", "All Tracks (Reconstructed)", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc/reconstruction/hadrons/rec_hadron_tof_match", "All Tracks (Reconstructed) with TOF signal", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc/reconstruction/hadrons/mc_rec_hadron_pt", "True Primary Tracks (Reconstructed)", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc/reconstruction/hadrons/mc_sec_hadron_pt", "Secondary Tracks (Reconstructed)", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc/truth/hadrons/mc_gen_hadron_pt", "Generated Primary Tracks", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + + registryData.add("mc/reconstruction/pions/pos/rec_pion_pos_tof_matched", "MC TOF Matched #pi^{+}", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc/reconstruction/pions/neg/rec_pion_neg_tof_matched", "MC TOF Matched #pi^{-}", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + + registryData.add("mc/reconstruction/kaons/pos/rec_kaon_pos_tof_matched", "MC TOF Matched K^{+}", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc/reconstruction/kaons/neg/rec_kaon_neg_tof_matched", "MC TOF Matched K^{-}", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + + registryData.add("mc/reconstruction/protons/pos/rec_proton_pos_tof_matched", "MC TOF Matched p", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("mc/reconstruction/protons/neg/rec_proton_neg_tof_matched", "MC TOF Matched #bar{p}", HistType::kTH1F, {{120, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}}); } void getPerpendicularDirections(const TVector3& p, TVector3& u1, TVector3& u2) @@ -610,7 +639,6 @@ struct JetHadronsPid { template PidResult getPid(const TrackType& track) { - constexpr int ClosestMatch = 0; constexpr int ExclusiveMatch = 1; constexpr int RejectionBased = 2; @@ -1390,21 +1418,53 @@ struct JetHadronsPid { auto const& trueParticle = track.mcParticle(); int pdg = std::abs(trueParticle.pdgCode()); + int realpdg = trueParticle.pdgCode(); bool isPrimary = trueParticle.isPhysicalPrimary(); int charge = track.sign(); + registryData.fill(HIST("mc/reconstruction/hadrons/rec_hadron_all"), pt); + + if (track.hasTOF()) { + registryData.fill(HIST("mc/reconstruction/hadrons/rec_hadron_tof_match"), pt); + } + + if (isPrimary) { + registryData.fill(HIST("mc/reconstruction/hadrons/mc_rec_hadron_pt"), pt); + } else { + registryData.fill(HIST("mc/reconstruction/hadrons/mc_sec_hadron_pt"), pt); + } + PidResult pid = getPid(track); if (pid.isPion) { registryData.fill(HIST("mc/reconstruction/pions/rec_pion_all"), pt); - registryData.fill(HIST("mc/reconstruction/pions/contamination_matrix_pion"), pdg, pt); + registryData.fill(HIST("mc/reconstruction/pions/contamination_matrix_pion"), realpdg, pt); if (charge > 0) { + registryData.fill(HIST("mc/reconstruction/pions/pos/rec_pion_pos_all"), pt); - registryData.fill(HIST("mc/reconstruction/pions/pos/contamination_matrix_pion_pos"), pdg, pt); + + if (track.hasTOF()) { + registryData.fill(HIST("mc/reconstruction/pions/pos/rec_pion_pos_tof_matched"), pt); + } + registryData.fill(HIST("mc/reconstruction/pions/pos/contamination_matrix_pion_pos"), realpdg, pt); + + registryData.fill(HIST("mc/reconstruction/pions/pos/rec_pion_pos_tpc"), pt, track.tpcNSigmaPi()); + if (track.hasTOF()) { + registryData.fill(HIST("mc/reconstruction/pions/pos/rec_pion_pos_tof"), pt, track.tofNSigmaPi()); + } } else { registryData.fill(HIST("mc/reconstruction/pions/neg/rec_pion_neg_all"), pt); - registryData.fill(HIST("mc/reconstruction/pions/neg/contamination_matrix_pion_neg"), pdg, pt); + + if (track.hasTOF()) { + registryData.fill(HIST("mc/reconstruction/pions/neg/rec_pion_neg_tof_matched"), pt); + } + registryData.fill(HIST("mc/reconstruction/pions/neg/contamination_matrix_pion_neg"), realpdg, pt); + + registryData.fill(HIST("mc/reconstruction/pions/neg/rec_pion_neg_tpc"), pt, track.tpcNSigmaPi()); + if (track.hasTOF()) { + registryData.fill(HIST("mc/reconstruction/pions/neg/rec_pion_neg_tof"), pt, track.tofNSigmaPi()); + } } if (isPrimary) { @@ -1428,14 +1488,34 @@ struct JetHadronsPid { if (pid.isKaon) { registryData.fill(HIST("mc/reconstruction/kaons/rec_kaon_all"), pt); - registryData.fill(HIST("mc/reconstruction/kaons/contamination_matrix_kaon"), pdg, pt); + registryData.fill(HIST("mc/reconstruction/kaons/contamination_matrix_kaon"), realpdg, pt); if (charge > 0) { + registryData.fill(HIST("mc/reconstruction/kaons/pos/rec_kaon_pos_all"), pt); - registryData.fill(HIST("mc/reconstruction/kaons/pos/contamination_matrix_kaon_pos"), pdg, pt); + + if (track.hasTOF()) { + registryData.fill(HIST("mc/reconstruction/kaons/pos/rec_kaon_pos_tof_matched"), pt); + } + registryData.fill(HIST("mc/reconstruction/kaons/pos/contamination_matrix_kaon_pos"), realpdg, pt); + + registryData.fill(HIST("mc/reconstruction/kaons/pos/rec_kaon_pos_tpc"), pt, track.tpcNSigmaKa()); + if (track.hasTOF()) { + registryData.fill(HIST("mc/reconstruction/kaons/pos/rec_kaon_pos_tof"), pt, track.tofNSigmaKa()); + } } else { + registryData.fill(HIST("mc/reconstruction/kaons/neg/rec_kaon_neg_all"), pt); - registryData.fill(HIST("mc/reconstruction/kaons/neg/contamination_matrix_kaon_neg"), pdg, pt); + + if (track.hasTOF()) { + registryData.fill(HIST("mc/reconstruction/kaons/neg/rec_kaon_neg_tof_matched"), pt); + } + registryData.fill(HIST("mc/reconstruction/kaons/neg/contamination_matrix_kaon_neg"), realpdg, pt); + + registryData.fill(HIST("mc/reconstruction/kaons/neg/rec_kaon_neg_tpc"), pt, track.tpcNSigmaKa()); + if (track.hasTOF()) { + registryData.fill(HIST("mc/reconstruction/kaons/neg/rec_kaon_neg_tof"), pt, track.tofNSigmaKa()); + } } if (isPrimary) { @@ -1459,14 +1539,31 @@ struct JetHadronsPid { if (pid.isProton) { registryData.fill(HIST("mc/reconstruction/protons/rec_proton_all"), pt); - registryData.fill(HIST("mc/reconstruction/protons/contamination_matrix_proton"), pdg, pt); + registryData.fill(HIST("mc/reconstruction/protons/contamination_matrix_proton"), realpdg, pt); if (charge > 0) { registryData.fill(HIST("mc/reconstruction/protons/pos/rec_proton_pos_all"), pt); - registryData.fill(HIST("mc/reconstruction/protons/pos/contamination_matrix_proton_pos"), pdg, pt); + if (track.hasTOF()) { + registryData.fill(HIST("mc/reconstruction/protons/pos/rec_proton_pos_tof_matched"), pt); + } + registryData.fill(HIST("mc/reconstruction/protons/pos/contamination_matrix_proton_pos"), realpdg, pt); + + registryData.fill(HIST("mc/reconstruction/protons/pos/rec_proton_pos_tpc"), pt, track.tpcNSigmaPr()); + if (track.hasTOF()) { + registryData.fill(HIST("mc/reconstruction/protons/pos/rec_proton_pos_tof"), pt, track.tofNSigmaPr()); + } } else { + registryData.fill(HIST("mc/reconstruction/protons/neg/rec_proton_neg_all"), pt); - registryData.fill(HIST("mc/reconstruction/protons/neg/contamination_matrix_proton_neg"), pdg, pt); + if (track.hasTOF()) { + registryData.fill(HIST("mc/reconstruction/protons/neg/rec_proton_neg_tof_matched"), pt); + } + registryData.fill(HIST("mc/reconstruction/protons/neg/contamination_matrix_proton_neg"), realpdg, pt); + + registryData.fill(HIST("mc/reconstruction/protons/neg/rec_proton_neg_tpc"), pt, track.tpcNSigmaPr()); + if (track.hasTOF()) { + registryData.fill(HIST("mc/reconstruction/protons/neg/rec_proton_neg_tof"), pt, track.tofNSigmaPr()); + } } if (isPrimary) { @@ -1512,6 +1609,8 @@ struct JetHadronsPid { int pdg = std::abs(originalPdg); double pt = mcpart.pt(); + registryData.fill(HIST("mc/truth/hadrons/mc_gen_hadron_pt"), pt); + if (pdg == PDG_t::kPiPlus) { if (pt >= cfg.minPtPion && pt <= cfg.maxPtPion) { registryData.fill(HIST("mc/truth/pions/mc_gen_pion_pt"), pt);