diff --git a/ALICE3/Tasks/alice3TrackingPerformance.cxx b/ALICE3/Tasks/alice3TrackingPerformance.cxx index fe903bf6176..d0b88e00d48 100644 --- a/ALICE3/Tasks/alice3TrackingPerformance.cxx +++ b/ALICE3/Tasks/alice3TrackingPerformance.cxx @@ -13,7 +13,7 @@ /// /// \brief This task produces the tracking performance /// -/// \author Nicolò Jacazio, Universita del Piemonte Orientale (IT) +/// \author Nicolò Jacazio, Università del Piemonte Orientale (IT) /// \since May 27, 2025 /// @@ -46,7 +46,9 @@ std::map> particlePtDistribution; std::map> particleEtaDistribution; std::map> ptDistribution; std::map> ptResolutionVsPt; +std::map> ptResolutionVsEta; std::map> invPtResolutionVsPt; +std::map> invPtResolutionVsEta; std::map> dcaXyResolutionVsPt; std::map> dcaZResolutionVsPt; @@ -57,26 +59,30 @@ struct Alice3TrackingPerformance { void init(o2::framework::InitContext&) { - const AxisSpec axisPt{100, 0, 10, "p_{T} (GeV/c)"}; + const AxisSpec axisPt{500, 0, 100, "#it{p}_{T} (GeV/#it{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 axisPtDelta{100, -1, 1, "(#it{p}_{T}^{reco} - #it{p}_{T}^{gen}) / #it{p}_{T}^{gen}"}; + const AxisSpec axisInvPtDelta{100, -1, 1, "1./#it{p}_{T}^{gen} - 1./#it{p}_{T}^{reco} (GeV/#it{c})^{-1}"}; 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 (const int& pdg : pdgCodes.value) { - std::string tag = Form("_%d", pdg); + std::string prefix = Form("%i", pdg); if (pdg < 0) { - tag = Form("_m%d", -pdg); + prefix = Form("m%i", -pdg); } - particlePtDistribution[pdg] = histos.add("particlePtDistribution" + tag, "", kTH1D, {axisPt}); - particleEtaDistribution[pdg] = histos.add("particleEtaDistribution" + tag, "", kTH1D, {axisEta}); + const std::string tag = "_" + prefix; + prefix += "/"; + particlePtDistribution[pdg] = histos.add(prefix + "particlePtDistribution" + tag, "", kTH1D, {axisPt}); + particleEtaDistribution[pdg] = histos.add(prefix + "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}); + ptDistribution[pdg] = histos.add(prefix + "ptDistribution" + tag, "", kTH1D, {axisPt}); + ptResolutionVsPt[pdg] = histos.add(prefix + "ptResolutionVsPt" + tag, "", kTH2D, {axisPt, axisPtDelta}); + ptResolutionVsEta[pdg] = histos.add(prefix + "ptResolutionVsEta" + tag, "", kTProfile2D, {axisPt, axisEta}); + invPtResolutionVsPt[pdg] = histos.add(prefix + "invPtResolutionVsPt" + tag, "", kTH2D, {axisPt, axisInvPtDelta}); + invPtResolutionVsEta[pdg] = histos.add(prefix + "invPtResolutionVsEta" + tag, "", kTProfile2D, {axisPt, axisEta}); + dcaXyResolutionVsPt[pdg] = histos.add(prefix + "dcaXyResolutionVsPt" + tag, "", kTH2D, {axisPt, axisDcaXy}); + dcaZResolutionVsPt[pdg] = histos.add(prefix + "dcaZResolutionVsPt" + tag, "", kTH2D, {axisPt, axisDcaZ}); } } @@ -110,26 +116,32 @@ struct Alice3TrackingPerformance { 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()); + const float ptResolution = (track.pt() - mcParticle.pt()) / mcParticle.pt(); + const float invptResolution = 1.f / track.pt() - 1.f / mcParticle.pt(); + + auto fillResolutionHistograms = [&](const int p) { + ptDistribution[p]->Fill(track.pt()); + ptResolutionVsPt[p]->Fill(mcParticle.pt(), ptResolution); + ptResolutionVsEta[p]->Fill(mcParticle.pt(), mcParticle.eta(), ptResolution); + invPtResolutionVsPt[p]->Fill(mcParticle.pt(), invptResolution); + invPtResolutionVsEta[p]->Fill(mcParticle.pt(), mcParticle.eta(), invptResolution); + dcaXyResolutionVsPt[p]->Fill(mcParticle.pt(), track.dcaXY()); + dcaZResolutionVsPt[p]->Fill(mcParticle.pt(), track.dcaZ()); + }; + + fillResolutionHistograms(0); + 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()); - dcaZResolutionVsPt[mcParticle.pdgCode()]->Fill(mcParticle.pt(), track.dcaZ()); + fillResolutionHistograms(mcParticle.pdgCode()); } } };