From c5d260c65524cc85c4c724e6c825b37dbf30c433 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Thu, 27 Nov 2025 13:52:42 +0100 Subject: [PATCH 1/2] Enhance tracking performance with new histograms Updated pdgCodes to include 0 for all particles and added new histograms for particle distributions. --- ALICE3/Tasks/alice3TrackingPerformance.cxx | 50 +++++++++++++++++++--- 1 file changed, 43 insertions(+), 7 deletions(-) diff --git a/ALICE3/Tasks/alice3TrackingPerformance.cxx b/ALICE3/Tasks/alice3TrackingPerformance.cxx index bfb9418bb2c..0b503ef9e13 100644 --- a/ALICE3/Tasks/alice3TrackingPerformance.cxx +++ b/ALICE3/Tasks/alice3TrackingPerformance.cxx @@ -25,37 +25,53 @@ #include "Framework/runDataProcessing.h" #include +#include +#include #include using namespace o2; using namespace o2::framework; +std::shared_ptr particlePdgCodes; +std::map> particlePtDistribution; +std::map> particleEtaDistribution; +std::map> ptDistribution; std::map> ptResolutionVsPt; std::map> invPtResolutionVsPt; std::map> dcaXyResolutionVsPt; std::map> dcaZResolutionVsPt; struct alice3TrackingPerformance { - Configurable> pdgCodes{"pdgCodes", {211}, "List of PDG codes to consider for efficiency calculation"}; + Configurable> pdgCodes{"pdgCodes", {0, 211}, "List of PDG codes to consider for efficiency calculation. (0 means all)"}; HistogramRegistry histos{"Histos", {}, OutputObjHandlingPolicy::AnalysisObject}; Configurable> etaRange{"etaRange", {-5.f, 5.f}, "Eta range for efficiency calculation"}; void init(o2::framework::InitContext&) { const AxisSpec axisPt{100, 0, 10, "p_{T} (GeV/c)"}; + const AxisSpec axisEta{100, etaRange.value.first, etaRange.value.second, "#eta"}; const AxisSpec axisPtDelta{100, -1, 1, "p_{T}^{gen} - p_{T}^{reco} (GeV/c)"}; const AxisSpec axisInvPtDelta{100, -1, 1, "1./p_{T}^{gen} - 1./p_{T}^{reco} (GeV/c)^{-1}"}; const AxisSpec axisDcaXy{100, -1, 1, "DCA_{xy} (cm)"}; const AxisSpec axisDcaZ{100, -1, 1, "DCA_{z} (cm)"}; - for (auto pdg : pdgCodes.value) { - ptResolutionVsPt[pdg] = histos.add(Form("ptResolutionVsPt_%d", pdg), "", kTH2D, {axisPt, axisPtDelta}); - invPtResolutionVsPt[pdg] = histos.add(Form("invPtResolutionVsPt_%d", pdg), "", kTH2D, {axisPt, axisInvPtDelta}); - dcaXyResolutionVsPt[pdg] = histos.add(Form("dcaXyResolutionVsPt_%d", pdg), "", kTH2D, {axisPt, axisDcaXy}); - dcaZResolutionVsPt[pdg] = histos.add(Form("dcaZResolutionVsPt_%d", pdg), "", kTH2D, {axisPt, axisDcaZ}); + particlePdgCodes = histos.add("particlePdgCodes", "", kTH1D, {AxisSpec{100, -0.5, 99.5, "PDG Code"}}); + for (int pdg : pdgCodes.value) { + std::string tag = Form("_%d", pdg); + if (pdg < 0) { + tag = Form("_m%d", -pdg); + } + particlePtDistribution[pdg] = histos.add("particlePtDistribution" + tag, "", kTH1D, {axisPt}); + particleEtaDistribution[pdg] = histos.add("particleEtaDistribution" + tag, "", kTH1D, {axisEta}); + + ptDistribution[pdg] = histos.add("ptDistribution" + tag, "", kTH1D, {axisPt}); + ptResolutionVsPt[pdg] = histos.add("ptResolutionVsPt" + tag, "", kTH2D, {axisPt, axisPtDelta}); + invPtResolutionVsPt[pdg] = histos.add("invPtResolutionVsPt" + tag, "", kTH2D, {axisPt, axisInvPtDelta}); + dcaXyResolutionVsPt[pdg] = histos.add("dcaXyResolutionVsPt" + tag, "", kTH2D, {axisPt, axisDcaXy}); + dcaZResolutionVsPt[pdg] = histos.add("dcaZResolutionVsPt" + tag, "", kTH2D, {axisPt, axisDcaZ}); } } void process(soa::Join const& tracks, - aod::McParticles const&) + aod::McParticles const& mcParticles) { auto isParticleSelected = [&](const o2::aod::McParticle& p) { if (!p.isPhysicalPrimary()) { @@ -69,17 +85,37 @@ struct alice3TrackingPerformance { } return true; }; + + for (const auto& mcParticle : mcParticles) { + if (!isParticleSelected(mcParticle)) { + continue; + } + particlePdgCodes->Fill(Form("%d", mcParticle.pdgCode()), 1); + particlePtDistribution[0]->Fill(mcParticle.pt()); + particleEtaDistribution[0]->Fill(mcParticle.eta()); + if (particlePtDistribution.find(mcParticle.pdgCode()) == particlePtDistribution.end()) { + continue; + } + particlePtDistribution[mcParticle.pdgCode()]->Fill(mcParticle.pt()); + particleEtaDistribution[mcParticle.pdgCode()]->Fill(mcParticle.eta()); + } for (const auto& track : tracks) { + ptDistribution[0]->Fill(track.pt()); if (!track.has_mcParticle()) { continue; } const auto& mcParticle = track.mcParticle(); + ptResolutionVsPt[0]->Fill(mcParticle.pt(), mcParticle.pt() - track.pt()); + invPtResolutionVsPt[0]->Fill(mcParticle.pt(), 1.f / mcParticle.pt() - 1.f / track.pt()); + dcaXyResolutionVsPt[0]->Fill(mcParticle.pt(), track.dcaXY()); + dcaZResolutionVsPt[0]->Fill(mcParticle.pt(), track.dcaZ()); if (!isParticleSelected(mcParticle)) { continue; } if (ptResolutionVsPt.find(mcParticle.pdgCode()) == ptResolutionVsPt.end()) { continue; } + ptDistribution[mcParticle.pdgCode()]->Fill(mcParticle.pt()); ptResolutionVsPt[mcParticle.pdgCode()]->Fill(mcParticle.pt(), mcParticle.pt() - track.pt()); invPtResolutionVsPt[mcParticle.pdgCode()]->Fill(mcParticle.pt(), 1.f / mcParticle.pt() - 1.f / track.pt()); dcaXyResolutionVsPt[mcParticle.pdgCode()]->Fill(mcParticle.pt(), track.dcaXY()); From 7f1c0d25128de47844f79ca83b0bc952d09a1443 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Thu, 27 Nov 2025 13:57:36 +0100 Subject: [PATCH 2/2] Update alice3TrackingPerformance.cxx --- ALICE3/Tasks/alice3TrackingPerformance.cxx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/ALICE3/Tasks/alice3TrackingPerformance.cxx b/ALICE3/Tasks/alice3TrackingPerformance.cxx index 0b503ef9e13..a5958bab772 100644 --- a/ALICE3/Tasks/alice3TrackingPerformance.cxx +++ b/ALICE3/Tasks/alice3TrackingPerformance.cxx @@ -40,7 +40,7 @@ std::map> invPtResolutionVsPt; std::map> dcaXyResolutionVsPt; std::map> dcaZResolutionVsPt; -struct alice3TrackingPerformance { +struct Alice3TrackingPerformance { Configurable> pdgCodes{"pdgCodes", {0, 211}, "List of PDG codes to consider for efficiency calculation. (0 means all)"}; HistogramRegistry histos{"Histos", {}, OutputObjHandlingPolicy::AnalysisObject}; Configurable> etaRange{"etaRange", {-5.f, 5.f}, "Eta range for efficiency calculation"}; @@ -54,7 +54,7 @@ struct alice3TrackingPerformance { const AxisSpec axisDcaXy{100, -1, 1, "DCA_{xy} (cm)"}; const AxisSpec axisDcaZ{100, -1, 1, "DCA_{z} (cm)"}; particlePdgCodes = histos.add("particlePdgCodes", "", kTH1D, {AxisSpec{100, -0.5, 99.5, "PDG Code"}}); - for (int pdg : pdgCodes.value) { + for (const int& pdg : pdgCodes.value) { std::string tag = Form("_%d", pdg); if (pdg < 0) { tag = Form("_m%d", -pdg); @@ -87,10 +87,10 @@ struct alice3TrackingPerformance { }; for (const auto& mcParticle : mcParticles) { + particlePdgCodes->Fill(Form("%d", mcParticle.pdgCode()), 1); if (!isParticleSelected(mcParticle)) { - continue; + continue; } - particlePdgCodes->Fill(Form("%d", mcParticle.pdgCode()), 1); particlePtDistribution[0]->Fill(mcParticle.pt()); particleEtaDistribution[0]->Fill(mcParticle.eta()); if (particlePtDistribution.find(mcParticle.pdgCode()) == particlePtDistribution.end()) { @@ -126,5 +126,5 @@ struct alice3TrackingPerformance { WorkflowSpec defineDataProcessing(ConfigContext const& ctx) { - return WorkflowSpec{adaptAnalysisTask(ctx)}; + return WorkflowSpec{adaptAnalysisTask(ctx)}; }