From 93294a3397fe25f43a39c1a5c86971616e0388c8 Mon Sep 17 00:00:00 2001 From: Ida Torkjellsdatter Storehaug Date: Fri, 21 Nov 2025 10:48:44 +0100 Subject: [PATCH 1/2] =?UTF-8?q?mctruth=20of=20tri=C3=A5let=20vertex?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PWGDQ/Core/HistogramsLibrary.cxx | 30 ++++++++++++ PWGDQ/Core/VarManager.cxx | 39 +++++++++++++++- PWGDQ/Core/VarManager.h | 63 ++++++++++++++++++++++++++ PWGDQ/Tasks/dqEfficiency_withAssoc.cxx | 46 +++++++++++++++++-- 4 files changed, 171 insertions(+), 7 deletions(-) diff --git a/PWGDQ/Core/HistogramsLibrary.cxx b/PWGDQ/Core/HistogramsLibrary.cxx index 4cc9f07a0bf..7f8a21a9154 100644 --- a/PWGDQ/Core/HistogramsLibrary.cxx +++ b/PWGDQ/Core/HistogramsLibrary.cxx @@ -2048,6 +2048,36 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h hm->AddHistogram(histClass, "hMass_defaultDileptonMass_Chi2OverNDFGeo", "", false, 1000, 3.0, 5.0, VarManager::kQuadDefaultDileptonMass, 150, -5, 10., VarManager::kKFChi2OverNDFGeo); } } + if (subGroupStr.Contains("mctruth")) { + hm->AddHistogram(histClass, "PtMC", "MC pT", false, 200, 0.0, 20.0, VarManager::kMCPt); + hm->AddHistogram(histClass, "EtaMC", "MC #eta", false, 50, -5.0, 5.0, VarManager::kMCEta); + hm->AddHistogram(histClass, "PhiMC", "MC #phi", false, 50, -6.3, 6.3, VarManager::kMCPhi); + hm->AddHistogram(histClass, "YMC", "MC y", false, 50, -5.0, 5.0, VarManager::kMCY); + hm->AddHistogram(histClass, "PtMC_YMC", "MC pT vs MC y", false, 120, 0.0, 30.0, VarManager::kMCPt, 1000, -5.0, 5.0, VarManager::kMCY); + hm->AddHistogram(histClass, "EtaMC_PtMC", "", false, 40, -2.0, 2.0, VarManager::kMCEta, 200, 0.0, 20.0, VarManager::kMCPt); + hm->AddHistogram(histClass, "VzMC", "MC vz", false, 100, -15.0, 15.0, VarManager::kMCVz); + hm->AddHistogram(histClass, "VzMC_VtxZMC", "MC vz vs MC vtxZ", false, 50, -15.0, 15.0, VarManager::kMCVz, 50, -15.0, 15.0, VarManager::kMCVtxZ); + hm->AddHistogram(histClass, "LzMC", "", false, 1000, 0.0, 2.0, VarManager::kMCVertexingLz); + hm->AddHistogram(histClass, "LxyMC", "", false, 1000, 0.0, 2.0, VarManager::kMCVertexingLxy); + hm->AddHistogram(histClass, "LxyzMC", "", false, 1000, 0.0, 2.0, VarManager::kMCVertexingLxyz); + hm->AddHistogram(histClass, "LxyMCExpected", "", false, 1000, 0.0, 2.0, VarManager::kMCLxyExpected); + hm->AddHistogram(histClass, "LxyzMCExpected", "", false, 1000, 0.0, 2.0, VarManager::kMCLxyzExpected); + hm->AddHistogram(histClass, "LxyMC_LxyMCExpected", "", false, 500, 0.0, 2.0, VarManager::kMCVertexingLxy, 500, 0.0, 2.0, VarManager::kMCLxyExpected); + hm->AddHistogram(histClass, "LxyzMC_LxyzMCExpected", "", false, 500, 0.0, 2.0, VarManager::kMCVertexingLxyz, 500, 0.0, 2.0, VarManager::kMCLxyzExpected); + hm->AddHistogram(histClass, "TauzMC", "", false, 4000, -0.01, 0.01, VarManager::kMCVertexingTauz); + hm->AddHistogram(histClass, "TauxyMC", "", false, 4000, -0.01, 0.01, VarManager::kMCVertexingTauxy); + hm->AddHistogram(histClass, "TauzMC_PtMC", "", false, 500, -0.01, 0.01, VarManager::kMCVertexingTauz, 200, 0.0, 20.0, VarManager::kMCPt); + hm->AddHistogram(histClass, "TauxyMC_PtMC", "", false, 500, -0.01, 0.01, VarManager::kMCVertexingTauxy, 200, 0.0, 20.0, VarManager::kMCPt); + hm->AddHistogram(histClass, "TauzProjectedMC", "", false, 4000, -0.5, 0.5, VarManager::kMCVertexingTauzProjected); + hm->AddHistogram(histClass, "TauxyProjectedMC", "", false, 4000, -0.5, 0.5, VarManager::kMCVertexingTauxyProjected); + hm->AddHistogram(histClass, "TauzProjectedMC_PtMC", "", false, 500, -0.5, 0.5, VarManager::kMCVertexingTauzProjected, 200, 0.0, 20.0, VarManager::kMCPt); + hm->AddHistogram(histClass, "TauxyProjectedMC_PtMC", "", false, 500, -0.5, 0.5, VarManager::kMCVertexingTauxyProjected, 200, 0.0, 20.0, VarManager::kMCPt); + hm->AddHistogram(histClass, "LzMC_Lz", "", false, 500, 0.0, 2.0, VarManager::kMCVertexingLz, 500, 0.0, 2.0, VarManager::kVertexingLz); + hm->AddHistogram(histClass, "LxyMC_Lxy", "", false, 500, 0.0, 2.0, VarManager::kMCVertexingLxy, 500, 0.0, 2.0, VarManager::kVertexingLxy); + hm->AddHistogram(histClass, "TauzMC_Tauz", "", false, 500, -0.01, 0.01, VarManager::kMCVertexingTauz, 500, -0.01, 0.01, VarManager::kVertexingTauz); + hm->AddHistogram(histClass, "TauxyMC_Tauxy", "", false, 500, -0.01, 0.01, VarManager::kMCVertexingTauxy, 500, -0.01, 0.01, VarManager::kVertexingTauxy); + hm->AddHistogram(histClass, "CosPointingAngleMC", "", false, 100, 0.0, 1.0, VarManager::kMCCosPointingAngle); + } if (!groupStr.CompareTo("dilepton-photon-mass")) { hm->AddHistogram(histClass, "Mass_Dilepton", "", false, 500, 0.0, 5.0, VarManager::kPairMassDau); hm->AddHistogram(histClass, "Mass_Photon", "", false, 500, 0.0, 0.1, VarManager::kMassDau); diff --git a/PWGDQ/Core/VarManager.cxx b/PWGDQ/Core/VarManager.cxx index 04445304d56..3f0cddb5b13 100644 --- a/PWGDQ/Core/VarManager.cxx +++ b/PWGDQ/Core/VarManager.cxx @@ -806,10 +806,20 @@ void VarManager::SetDefaultVarNames() fgVariableUnits[kPairType] = ""; fgVariableNames[kVertexingLxy] = "Pair Lxy"; fgVariableUnits[kVertexingLxy] = "cm"; + fgVariableNames[kMCVertexingLxy] = "MC Lxy"; + fgVariableUnits[kMCVertexingLxy] = "cm"; fgVariableNames[kVertexingLz] = "Pair Lz"; fgVariableUnits[kVertexingLz] = "cm"; + fgVariableNames[kMCVertexingLz] = "MC Lz"; + fgVariableUnits[kMCVertexingLz] = "cm"; fgVariableNames[kVertexingLxyz] = "Pair Lxyz"; fgVariableUnits[kVertexingLxyz] = "cm"; + fgVariableNames[kMCVertexingLxyz] = "MC Lxyz"; + fgVariableUnits[kMCVertexingLxyz] = "cm"; + fgVariableNames[kMCLxyExpected] = "MC Expected Lxy"; + fgVariableUnits[kMCLxyExpected] = "cm"; + fgVariableNames[kMCLxyzExpected] = "MC Expected Lxyz"; + fgVariableUnits[kMCLxyzExpected] = "cm"; fgVariableNames[kVertexingLxyErr] = "Pair Lxy err."; fgVariableUnits[kVertexingLxyErr] = "cm"; fgVariableNames[kVertexingLzErr] = "Pair Lz err."; @@ -820,6 +830,10 @@ void VarManager::SetDefaultVarNames() fgVariableUnits[kVertexingTauz] = "ns"; fgVariableNames[kVertexingTauxy] = "Pair pseudo-proper Tauxy"; fgVariableUnits[kVertexingTauxy] = "ns"; + fgVariableNames[kMCVertexingTauz] = "MC pseudo-proper Tauz"; + fgVariableUnits[kMCVertexingTauz] = "ns"; + fgVariableNames[kMCVertexingTauxy] = "MC pseudo-proper Tauxy"; + fgVariableUnits[kMCVertexingTauxy] = "ns"; fgVariableNames[kVertexingTauzErr] = "Pair pseudo-proper Tauz err."; fgVariableUnits[kVertexingTauzErr] = "ns"; fgVariableNames[kVertexingLxyProjected] = "Pair Lxy"; @@ -836,8 +850,22 @@ void VarManager::SetDefaultVarNames() fgVariableUnits[kVertexingTauxyProjectedPoleJPsiMass] = "ns"; fgVariableNames[kVertexingTauxyzProjected] = "Pair pseudo-proper Tauxyz"; fgVariableUnits[kVertexingTauxyzProjected] = "ns"; + fgVariableNames[kMCVertexingLxyProjected] = "MC Lxy_{proj}"; + fgVariableUnits[kMCVertexingLxyProjected] = "cm"; + fgVariableNames[kMCVertexingLzProjected] = "MC Lz_{proj}"; + fgVariableUnits[kMCVertexingLzProjected] = "cm"; + fgVariableNames[kMCVertexingLxyzProjected] = "MC Lxyz_{proj}"; + fgVariableUnits[kMCVertexingLxyzProjected] = "cm"; + fgVariableNames[kMCVertexingTauzProjected] = "MC Tauz_{proj}"; + fgVariableUnits[kMCVertexingTauzProjected] = "ns"; + fgVariableNames[kMCVertexingTauxyProjected] = "MC Tauxy_{proj}"; + fgVariableUnits[kMCVertexingTauxyProjected] = "ns"; + fgVariableNames[kMCVertexingTauxyzProjected] = "MC Tauxyz_{proj}"; + fgVariableUnits[kMCVertexingTauxyzProjected] = "ns"; fgVariableNames[kCosPointingAngle] = "cos(#theta_{pointing})"; fgVariableUnits[kCosPointingAngle] = ""; + fgVariableNames[kMCCosPointingAngle] = "MC cos(#theta_{pointing})"; + fgVariableUnits[kMCCosPointingAngle] = ""; fgVariableNames[kVertexingPz] = "Pz Pair"; fgVariableUnits[kVertexingPz] = "GeV/c"; fgVariableNames[kVertexingSV] = "Secondary Vertexing z"; @@ -854,8 +882,6 @@ void VarManager::SetDefaultVarNames() fgVariableUnits[kVertexingLzOverErr] = ""; fgVariableNames[kVertexingLxyzOverErr] = "Pair Lxyz/DLxyz"; fgVariableUnits[kVertexingLxyzOverErr] = ""; - fgVariableNames[kCosPointingAngle] = "Cos #theta_{pointing}"; - fgVariableUnits[kCosPointingAngle] = ""; fgVariableNames[kKFTrack0DCAxyz] = "Daughter0 DCAxyz"; fgVariableUnits[kKFTrack0DCAxyz] = "cm"; fgVariableNames[kKFTrack1DCAxyz] = "Daughter1 DCAxyz"; @@ -1756,13 +1782,17 @@ void VarManager::SetDefaultVarNames() fgVarNamesMap["kPairType"] = kPairType; fgVarNamesMap["kVertexingLxy"] = kVertexingLxy; fgVarNamesMap["kVertexingLxyErr"] = kVertexingLxyErr; + fgVarNamesMap["kMCVertexingLxy"] = kMCVertexingLxy; fgVarNamesMap["kVertexingPseudoCTau"] = kVertexingPseudoCTau; fgVarNamesMap["kVertexingLxyz"] = kVertexingLxyz; fgVarNamesMap["kVertexingLxyzErr"] = kVertexingLxyzErr; + fgVarNamesMap["kMCVertexingLxyz"] = kMCVertexingLxyz; fgVarNamesMap["kVertexingLz"] = kVertexingLz; fgVarNamesMap["kVertexingLzErr"] = kVertexingLzErr; + fgVarNamesMap["kMCVertexingLz"] = kMCVertexingLz; fgVarNamesMap["kVertexingTauxy"] = kVertexingTauxy; fgVarNamesMap["kVertexingTauxyErr"] = kVertexingTauxyErr; + fgVarNamesMap["kMCVertexingTauxy"] = kMCVertexingTauxy; fgVarNamesMap["kVertexingLzProjected"] = kVertexingLzProjected; fgVarNamesMap["kVertexingLxyProjected"] = kVertexingLxyProjected; fgVarNamesMap["kVertexingLxyzProjected"] = kVertexingLxyzProjected; @@ -1771,8 +1801,12 @@ void VarManager::SetDefaultVarNames() fgVarNamesMap["kVertexingTauxyProjectedPoleJPsiMass"] = kVertexingTauxyProjectedPoleJPsiMass; fgVarNamesMap["kVertexingTauxyProjectedNs"] = kVertexingTauxyProjectedNs; fgVarNamesMap["kVertexingTauxyzProjected"] = kVertexingTauxyzProjected; + fgVarNamesMap["kMCVertexingTauzProjected"] = kVertexingTauzProjected; + fgVarNamesMap["kMCVertexingTauxyProjected"] = kVertexingTauxyProjected; + fgVarNamesMap["kMCVertexingTauxyzProjected"] = kVertexingTauxyzProjected; fgVarNamesMap["kVertexingTauz"] = kVertexingTauz; fgVarNamesMap["kVertexingTauzErr"] = kVertexingTauzErr; + fgVarNamesMap["kMCVertexingTauz"] = kMCVertexingTauz; fgVarNamesMap["kVertexingPz"] = kVertexingPz; fgVarNamesMap["kVertexingSV"] = kVertexingSV; fgVarNamesMap["kVertexingProcCode"] = kVertexingProcCode; @@ -1804,6 +1838,7 @@ void VarManager::SetDefaultVarNames() fgVarNamesMap["kQuadDCAsigXYZ"] = kQuadDCAsigXYZ; fgVarNamesMap["kSignQuadDCAsigXY"] = kSignQuadDCAsigXY; fgVarNamesMap["kCosPointingAngle"] = kCosPointingAngle; + fgVarNamesMap["kMCCosPointingAngle"] = kMCCosPointingAngle; fgVarNamesMap["kImpParXYJpsi"] = kImpParXYJpsi; fgVarNamesMap["kImpParXYK"] = kImpParXYK; fgVarNamesMap["kDCATrackProd"] = kDCATrackProd; diff --git a/PWGDQ/Core/VarManager.h b/PWGDQ/Core/VarManager.h index f887b75852d..b26ac744e89 100644 --- a/PWGDQ/Core/VarManager.h +++ b/PWGDQ/Core/VarManager.h @@ -686,19 +686,34 @@ class VarManager : public TObject kVertexingPseudoCTau, kVertexingLxyz, kVertexingLxyzErr, + kMCVertexingLxy, + kMCVertexingLxyz, + kMCLxyExpected, + kMCLxyzExpected, kVertexingLz, kVertexingLzErr, + kMCVertexingLz, kVertexingTauxy, kVertexingTauxyErr, + kMCVertexingTauxy, kVertexingLzProjected, kVertexingLxyProjected, kVertexingLxyzProjected, + kMCVertexingLzProjected, + kMCVertexingLxyProjected, + kMCVertexingLxyzProjected, kVertexingTauzProjected, kVertexingTauxyProjected, kVertexingTauxyProjectedPoleJPsiMass, kVertexingTauxyProjectedNs, kVertexingTauxyzProjected, + kMCVertexingTauzProjected, + kMCVertexingTauxyProjected, + kMCVertexingTauxyProjectedNs, + kMCVertexingTauxyzProjected, + kMCCosPointingAngle, kVertexingTauz, + kMCVertexingTauz, kVertexingTauzErr, kVertexingPz, kVertexingSV, @@ -1148,6 +1163,8 @@ class VarManager : public TObject static void FillPhoton(T const& photon, float* values = nullptr); template static void FillTrackCollision(T const& track, C const& collision, float* values = nullptr); + template + static void FillTrackCollisionMC(T1 const& track, T2 const& MotherTrack, C const& collision, float* values = nullptr); template static void FillTrackCollisionMatCorr(T const& track, C const& collision, M const& materialCorr, P const& propagator, float* values = nullptr); template @@ -2804,6 +2821,52 @@ void VarManager::FillTrackMC(const U& mcStack, T const& track, float* values) FillTrackDerived(values); } +template +void VarManager::FillTrackCollisionMC(T1 const& track, T2 const& MotherTrack, C const& collision, float* values) + { + + if (!values) { + values = fgValues; + } + + float m = 0.0; + float pdgLifetime = 0.0; + if (std::abs(MotherTrack.pdgCode()) == 521) { + m = o2::constants::physics::MassBPlus; + pdgLifetime = 1.638e-12; // s + } + if (std::abs(MotherTrack.pdgCode()) == 511) { + m = o2::constants::physics::MassB0; + pdgLifetime = 1.517e-12; // s + } + + // displaced vertex is compued with decay product (track) and momentum of mother particle (MotherTrack) + values[kMCVertexingLxy] = (collision.mcPosX() - track.vx()) * (collision.mcPosX() - track.vx()) + + (collision.mcPosY() - track.vy()) * (collision.mcPosY() - track.vy()); + values[kMCVertexingLz] = (collision.mcPosZ() - track.vz()) * (collision.mcPosZ() - track.vz()); + values[kMCVertexingLxyz] = values[kMCVertexingLxy] + values[kMCVertexingLz]; + values[kMCVertexingLxy] = std::sqrt(values[kMCVertexingLxy]); + values[kMCVertexingLz] = std::sqrt(values[kMCVertexingLz]); + values[kMCVertexingLxyz] = std::sqrt(values[kMCVertexingLxyz]); + values[kMCVertexingTauz] = (collision.mcPosZ() - track.vz()) * m / (TMath::Abs(MotherTrack.pz()) * o2::constants::physics::LightSpeedCm2NS); + values[kMCVertexingTauxy] = values[kMCVertexingLxy] * m / (MotherTrack.pt() * o2::constants::physics::LightSpeedCm2NS); + + values[kMCCosPointingAngle] = ((collision.mcPosX() - track.vx()) * MotherTrack.px() + + (collision.mcPosY() - track.vy()) * MotherTrack.py() + + (collision.mcPosZ() - track.vz()) * MotherTrack.pz()) / + (MotherTrack.p() * values[VarManager::kMCVertexingLxyz]); + + values[kMCLxyExpected] = (MotherTrack.pt() / m) * (pdgLifetime * o2::constants::physics::LightSpeedCm2S); + values[kMCLxyzExpected] = (MotherTrack.p() / m) * (pdgLifetime * o2::constants::physics::LightSpeedCm2S); + + values[kMCVertexingLzProjected] = ((track.vz() - collision.mcPosZ()) * MotherTrack.pz()) / TMath::Abs(MotherTrack.pz()); + values[kMCVertexingLxyProjected] = (((track.vx() - collision.mcPosX()) * MotherTrack.px()) + ((track.vy() - collision.mcPosY()) * MotherTrack.py())) / TMath::Abs(MotherTrack.pt()); + values[kMCVertexingLxyzProjected] = (((track.vx() - collision.mcPosX()) * MotherTrack.px()) + ((track.vy() - collision.mcPosY()) * MotherTrack.py()) + ((track.vz() - collision.mcPosZ()) * MotherTrack.pz())) / MotherTrack.p(); + values[kMCVertexingTauxyProjected] = values[kMCVertexingLxyProjected] * m / (MotherTrack.pt()); + values[kMCVertexingTauzProjected] = values[kMCVertexingLzProjected] * m / TMath::Abs(MotherTrack.pz()); + values[kMCVertexingTauxyzProjected] = values[kMCVertexingLxyzProjected] * m / (MotherTrack.p()); + } + template void VarManager::FillEnergyCorrelatorsMC(T const& track, T1 const& t1, float* values) { diff --git a/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx b/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx index 470d32513bd..c9380542ba4 100644 --- a/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx +++ b/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx @@ -89,11 +89,22 @@ DECLARE_SOA_COLUMN(EtaBcandidate, etaBcandidate, float); DECLARE_SOA_COLUMN(PhiBcandidate, phiBcandidate, float); DECLARE_SOA_COLUMN(RapBcandidate, rapBcandidate, float); DECLARE_SOA_COLUMN(LxyBcandidate, lxyBcandidate, float); +DECLARE_SOA_COLUMN(LxyBcandidateErr, lxyBcandidateErr, float); DECLARE_SOA_COLUMN(LxyzBcandidate, lxyzBcandidate, float); +DECLARE_SOA_COLUMN(LxyzBcandidateErr, lxyzBcandidateErr, float); DECLARE_SOA_COLUMN(LzBcandidate, lzBcandidate, float); +DECLARE_SOA_COLUMN(LzBcandidateErr, lzBcandidateErr, float); DECLARE_SOA_COLUMN(TauxyBcandidate, tauxyBcandidate, float); +DECLARE_SOA_COLUMN(TauxyBcandidateErr, tauxyBcandidateErr, float); DECLARE_SOA_COLUMN(TauzBcandidate, tauzBcandidate, float); +DECLARE_SOA_COLUMN(TauzBcandidateErr, tauzBcandidateErr, float); +DECLARE_SOA_COLUMN(MCLxyBcandidate, MClxyBcandidate, float); +DECLARE_SOA_COLUMN(MCLxyzBcandidate, MClxyzBcandidate, float); +DECLARE_SOA_COLUMN(MCLzBcandidate, MClzBcandidate, float); +DECLARE_SOA_COLUMN(MCTauxyBcandidate, MCtauxyBcandidate, float); +DECLARE_SOA_COLUMN(MCTauzBcandidate, MCtauzBcandidate, float); DECLARE_SOA_COLUMN(CosPBcandidate, cosPBcandidate, float); +DECLARE_SOA_COLUMN(MCCosPBcandidate, MCcosPBcandidate, float); DECLARE_SOA_COLUMN(Chi2Bcandidate, chi2Bcandidate, float); DECLARE_SOA_COLUMN(GlobalIndexassoc, globalIndexassoc, uint64_t); DECLARE_SOA_COLUMN(GlobalIndexleg1, globalIndexleg1, uint64_t); @@ -173,8 +184,10 @@ DECLARE_SOA_TABLE(Prefilter, "AOD", "DQPREFILTER", dqanalysisflags::IsBarrelSele DECLARE_SOA_TABLE(BmesonCandidates, "AOD", "DQBMESONS", dqanalysisflags::RunNumber, dqanalysisflags::EventIdx, dqanalysisflags::EventTimestamp, dqanalysisflags::massBcandidate, dqanalysisflags::MassDileptonCandidate, dqanalysisflags::deltaMassBcandidate, dqanalysisflags::pTBcandidate, dqanalysisflags::EtaBcandidate, dqanalysisflags::PhiBcandidate, dqanalysisflags::RapBcandidate, - dqanalysisflags::LxyBcandidate, dqanalysisflags::LxyzBcandidate, dqanalysisflags::LzBcandidate, - dqanalysisflags::TauxyBcandidate, dqanalysisflags::TauzBcandidate, dqanalysisflags::CosPBcandidate, dqanalysisflags::Chi2Bcandidate, + dqanalysisflags::LxyBcandidate, dqanalysisflags::LxyBcandidateErr, dqanalysisflags::LxyzBcandidate, dqanalysisflags::LxyzBcandidateErr, dqanalysisflags::LzBcandidate, dqanalysisflags::LzBcandidateErr, + dqanalysisflags::TauxyBcandidate, dqanalysisflags::TauxyBcandidateErr, dqanalysisflags::TauzBcandidate, dqanalysisflags::TauzBcandidateErr, dqanalysisflags::CosPBcandidate, dqanalysisflags::Chi2Bcandidate, + dqanalysisflags::MCLxyBcandidate, dqanalysisflags::MCLxyzBcandidate, dqanalysisflags::MCLzBcandidate, + dqanalysisflags::MCTauxyBcandidate, dqanalysisflags::MCTauzBcandidate, dqanalysisflags::MCCosPBcandidate, dqanalysisflags::GlobalIndexassoc, dqanalysisflags::GlobalIndexleg1, dqanalysisflags::GlobalIndexleg2, dqanalysisflags::PINassoc, dqanalysisflags::Etaassoc, dqanalysisflags::Ptpair, dqanalysisflags::Etapair, dqanalysisflags::PINleg1, dqanalysisflags::Etaleg1, dqanalysisflags::PINleg2, dqanalysisflags::Etaleg2, @@ -3954,7 +3967,7 @@ struct AnalysisDileptonTrack { // Template function to run pair - hadron combinations template - void runDileptonHadron(TEvent const& event, TTrackAssocs const& assocs, TTracks const& tracks, TDileptons const& dileptons, ReducedMCEvents const& /*mcEvents*/, ReducedMCTracks const& /*mcTracks*/) + void runDileptonHadron(TEvent const& event, TTrackAssocs const& assocs, TTracks const& tracks, TDileptons const& dileptons, ReducedMCEvents const& /*mcEvents*/, ReducedMCTracks const& mcTracks) { VarManager::ResetValues(0, VarManager::kNVars, fValuesHadron); VarManager::ResetValues(0, VarManager::kNVars, fValuesDilepton); @@ -4018,6 +4031,8 @@ struct AnalysisDileptonTrack { // loop over track associations for (auto& assoc : assocs) { + VarManager::ResetValues(0, VarManager::kNVars, fValuesHadron); + VarManager::ResetValues(0, VarManager::kNVars, fValuesDilepton); uint32_t trackSelection = 0; if constexpr (TCandidateType == VarManager::kBtoJpsiEEK) { @@ -4044,12 +4059,33 @@ struct AnalysisDileptonTrack { mcDecision |= (static_cast(1) << isig); } } + + // fill MC truth values for the B hadron + auto currentMCParticle = trackMC; + if (mcDecision > 0) { + while (true) { + if (currentMCParticle.has_mothers()) { + currentMCParticle = currentMCParticle.template mothers_first_as(); + if (std::abs(currentMCParticle.pdgCode()) > 500 && std::abs(currentMCParticle.pdgCode()) < 549) { // nb! hardcoded pdgcodes + VarManager::FillTrackMC(mcTracks, currentMCParticle, fValuesHadron); + break; + } + } else { + break; + } + } + // fill mc truth vertexing (for the associated track as this will have a displaced vertex, while the B hadron is produced in the PV) + VarManager::FillTrackCollisionMC(trackMC, currentMCParticle, event.reducedMCevent(), fValuesHadron); + } + // table to be written out for ML analysis BmesonsTable(event.runNumber(), event.globalIndex(), event.timestamp(), fValuesHadron[VarManager::kPairMass], dilepton.mass(), fValuesHadron[VarManager::kDeltaMass], fValuesHadron[VarManager::kPairPt], fValuesHadron[VarManager::kPairEta], fValuesHadron[VarManager::kPairPhi], fValuesHadron[VarManager::kPairRap], - fValuesHadron[VarManager::kVertexingLxy], fValuesHadron[VarManager::kVertexingLxyz], fValuesHadron[VarManager::kVertexingLz], - fValuesHadron[VarManager::kVertexingTauxy], fValuesHadron[VarManager::kVertexingTauz], fValuesHadron[VarManager::kCosPointingAngle], + fValuesHadron[VarManager::kVertexingLxy], fValuesHadron[VarManager::kVertexingLxyErr], fValuesHadron[VarManager::kVertexingLxyz], fValuesHadron[VarManager::kVertexingLxyzErr], fValuesHadron[VarManager::kVertexingLz], fValuesHadron[VarManager::kVertexingLzErr], + fValuesHadron[VarManager::kVertexingTauxy], fValuesHadron[VarManager::kVertexingTauxyErr], fValuesHadron[VarManager::kVertexingTauz], fValuesHadron[VarManager::kVertexingTauzErr], fValuesHadron[VarManager::kCosPointingAngle], fValuesHadron[VarManager::kVertexingChi2PCA], + fValuesHadron[VarManager::kMCVertexingLxy], fValuesHadron[VarManager::kMCVertexingLxyz], fValuesHadron[VarManager::kMCVertexingLz], + fValuesHadron[VarManager::kMCVertexingTauxy], fValuesHadron[VarManager::kMCVertexingTauz], fValuesHadron[VarManager::kMCCosPointingAngle], track.globalIndex(), lepton1.globalIndex(), lepton2.globalIndex(), track.tpcInnerParam(), track.eta(), dilepton.pt(), dilepton.eta(), lepton1.tpcInnerParam(), lepton1.eta(), lepton2.tpcInnerParam(), lepton2.eta(), track.tpcNSigmaKa(), track.tpcNSigmaPi(), track.tpcNSigmaPr(), track.tofNSigmaKa(), From 8a246e943f9107b8a08e8adf1735f7b114be1c67 Mon Sep 17 00:00:00 2001 From: ALICE Action Bot Date: Fri, 21 Nov 2025 09:50:30 +0000 Subject: [PATCH 2/2] Please consider the following formatting changes --- PWGDQ/Core/HistogramsLibrary.cxx | 58 ++++++++++---------- PWGDQ/Core/VarManager.h | 76 +++++++++++++------------- PWGDQ/Tasks/dqEfficiency_withAssoc.cxx | 6 +- 3 files changed, 70 insertions(+), 70 deletions(-) diff --git a/PWGDQ/Core/HistogramsLibrary.cxx b/PWGDQ/Core/HistogramsLibrary.cxx index 7f8a21a9154..a98df4d9984 100644 --- a/PWGDQ/Core/HistogramsLibrary.cxx +++ b/PWGDQ/Core/HistogramsLibrary.cxx @@ -2049,35 +2049,35 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h } } if (subGroupStr.Contains("mctruth")) { - hm->AddHistogram(histClass, "PtMC", "MC pT", false, 200, 0.0, 20.0, VarManager::kMCPt); - hm->AddHistogram(histClass, "EtaMC", "MC #eta", false, 50, -5.0, 5.0, VarManager::kMCEta); - hm->AddHistogram(histClass, "PhiMC", "MC #phi", false, 50, -6.3, 6.3, VarManager::kMCPhi); - hm->AddHistogram(histClass, "YMC", "MC y", false, 50, -5.0, 5.0, VarManager::kMCY); - hm->AddHistogram(histClass, "PtMC_YMC", "MC pT vs MC y", false, 120, 0.0, 30.0, VarManager::kMCPt, 1000, -5.0, 5.0, VarManager::kMCY); - hm->AddHistogram(histClass, "EtaMC_PtMC", "", false, 40, -2.0, 2.0, VarManager::kMCEta, 200, 0.0, 20.0, VarManager::kMCPt); - hm->AddHistogram(histClass, "VzMC", "MC vz", false, 100, -15.0, 15.0, VarManager::kMCVz); - hm->AddHistogram(histClass, "VzMC_VtxZMC", "MC vz vs MC vtxZ", false, 50, -15.0, 15.0, VarManager::kMCVz, 50, -15.0, 15.0, VarManager::kMCVtxZ); - hm->AddHistogram(histClass, "LzMC", "", false, 1000, 0.0, 2.0, VarManager::kMCVertexingLz); - hm->AddHistogram(histClass, "LxyMC", "", false, 1000, 0.0, 2.0, VarManager::kMCVertexingLxy); - hm->AddHistogram(histClass, "LxyzMC", "", false, 1000, 0.0, 2.0, VarManager::kMCVertexingLxyz); - hm->AddHistogram(histClass, "LxyMCExpected", "", false, 1000, 0.0, 2.0, VarManager::kMCLxyExpected); - hm->AddHistogram(histClass, "LxyzMCExpected", "", false, 1000, 0.0, 2.0, VarManager::kMCLxyzExpected); - hm->AddHistogram(histClass, "LxyMC_LxyMCExpected", "", false, 500, 0.0, 2.0, VarManager::kMCVertexingLxy, 500, 0.0, 2.0, VarManager::kMCLxyExpected); - hm->AddHistogram(histClass, "LxyzMC_LxyzMCExpected", "", false, 500, 0.0, 2.0, VarManager::kMCVertexingLxyz, 500, 0.0, 2.0, VarManager::kMCLxyzExpected); - hm->AddHistogram(histClass, "TauzMC", "", false, 4000, -0.01, 0.01, VarManager::kMCVertexingTauz); - hm->AddHistogram(histClass, "TauxyMC", "", false, 4000, -0.01, 0.01, VarManager::kMCVertexingTauxy); - hm->AddHistogram(histClass, "TauzMC_PtMC", "", false, 500, -0.01, 0.01, VarManager::kMCVertexingTauz, 200, 0.0, 20.0, VarManager::kMCPt); - hm->AddHistogram(histClass, "TauxyMC_PtMC", "", false, 500, -0.01, 0.01, VarManager::kMCVertexingTauxy, 200, 0.0, 20.0, VarManager::kMCPt); - hm->AddHistogram(histClass, "TauzProjectedMC", "", false, 4000, -0.5, 0.5, VarManager::kMCVertexingTauzProjected); - hm->AddHistogram(histClass, "TauxyProjectedMC", "", false, 4000, -0.5, 0.5, VarManager::kMCVertexingTauxyProjected); - hm->AddHistogram(histClass, "TauzProjectedMC_PtMC", "", false, 500, -0.5, 0.5, VarManager::kMCVertexingTauzProjected, 200, 0.0, 20.0, VarManager::kMCPt); - hm->AddHistogram(histClass, "TauxyProjectedMC_PtMC", "", false, 500, -0.5, 0.5, VarManager::kMCVertexingTauxyProjected, 200, 0.0, 20.0, VarManager::kMCPt); - hm->AddHistogram(histClass, "LzMC_Lz", "", false, 500, 0.0, 2.0, VarManager::kMCVertexingLz, 500, 0.0, 2.0, VarManager::kVertexingLz); - hm->AddHistogram(histClass, "LxyMC_Lxy", "", false, 500, 0.0, 2.0, VarManager::kMCVertexingLxy, 500, 0.0, 2.0, VarManager::kVertexingLxy); - hm->AddHistogram(histClass, "TauzMC_Tauz", "", false, 500, -0.01, 0.01, VarManager::kMCVertexingTauz, 500, -0.01, 0.01, VarManager::kVertexingTauz); - hm->AddHistogram(histClass, "TauxyMC_Tauxy", "", false, 500, -0.01, 0.01, VarManager::kMCVertexingTauxy, 500, -0.01, 0.01, VarManager::kVertexingTauxy); - hm->AddHistogram(histClass, "CosPointingAngleMC", "", false, 100, 0.0, 1.0, VarManager::kMCCosPointingAngle); - } + hm->AddHistogram(histClass, "PtMC", "MC pT", false, 200, 0.0, 20.0, VarManager::kMCPt); + hm->AddHistogram(histClass, "EtaMC", "MC #eta", false, 50, -5.0, 5.0, VarManager::kMCEta); + hm->AddHistogram(histClass, "PhiMC", "MC #phi", false, 50, -6.3, 6.3, VarManager::kMCPhi); + hm->AddHistogram(histClass, "YMC", "MC y", false, 50, -5.0, 5.0, VarManager::kMCY); + hm->AddHistogram(histClass, "PtMC_YMC", "MC pT vs MC y", false, 120, 0.0, 30.0, VarManager::kMCPt, 1000, -5.0, 5.0, VarManager::kMCY); + hm->AddHistogram(histClass, "EtaMC_PtMC", "", false, 40, -2.0, 2.0, VarManager::kMCEta, 200, 0.0, 20.0, VarManager::kMCPt); + hm->AddHistogram(histClass, "VzMC", "MC vz", false, 100, -15.0, 15.0, VarManager::kMCVz); + hm->AddHistogram(histClass, "VzMC_VtxZMC", "MC vz vs MC vtxZ", false, 50, -15.0, 15.0, VarManager::kMCVz, 50, -15.0, 15.0, VarManager::kMCVtxZ); + hm->AddHistogram(histClass, "LzMC", "", false, 1000, 0.0, 2.0, VarManager::kMCVertexingLz); + hm->AddHistogram(histClass, "LxyMC", "", false, 1000, 0.0, 2.0, VarManager::kMCVertexingLxy); + hm->AddHistogram(histClass, "LxyzMC", "", false, 1000, 0.0, 2.0, VarManager::kMCVertexingLxyz); + hm->AddHistogram(histClass, "LxyMCExpected", "", false, 1000, 0.0, 2.0, VarManager::kMCLxyExpected); + hm->AddHistogram(histClass, "LxyzMCExpected", "", false, 1000, 0.0, 2.0, VarManager::kMCLxyzExpected); + hm->AddHistogram(histClass, "LxyMC_LxyMCExpected", "", false, 500, 0.0, 2.0, VarManager::kMCVertexingLxy, 500, 0.0, 2.0, VarManager::kMCLxyExpected); + hm->AddHistogram(histClass, "LxyzMC_LxyzMCExpected", "", false, 500, 0.0, 2.0, VarManager::kMCVertexingLxyz, 500, 0.0, 2.0, VarManager::kMCLxyzExpected); + hm->AddHistogram(histClass, "TauzMC", "", false, 4000, -0.01, 0.01, VarManager::kMCVertexingTauz); + hm->AddHistogram(histClass, "TauxyMC", "", false, 4000, -0.01, 0.01, VarManager::kMCVertexingTauxy); + hm->AddHistogram(histClass, "TauzMC_PtMC", "", false, 500, -0.01, 0.01, VarManager::kMCVertexingTauz, 200, 0.0, 20.0, VarManager::kMCPt); + hm->AddHistogram(histClass, "TauxyMC_PtMC", "", false, 500, -0.01, 0.01, VarManager::kMCVertexingTauxy, 200, 0.0, 20.0, VarManager::kMCPt); + hm->AddHistogram(histClass, "TauzProjectedMC", "", false, 4000, -0.5, 0.5, VarManager::kMCVertexingTauzProjected); + hm->AddHistogram(histClass, "TauxyProjectedMC", "", false, 4000, -0.5, 0.5, VarManager::kMCVertexingTauxyProjected); + hm->AddHistogram(histClass, "TauzProjectedMC_PtMC", "", false, 500, -0.5, 0.5, VarManager::kMCVertexingTauzProjected, 200, 0.0, 20.0, VarManager::kMCPt); + hm->AddHistogram(histClass, "TauxyProjectedMC_PtMC", "", false, 500, -0.5, 0.5, VarManager::kMCVertexingTauxyProjected, 200, 0.0, 20.0, VarManager::kMCPt); + hm->AddHistogram(histClass, "LzMC_Lz", "", false, 500, 0.0, 2.0, VarManager::kMCVertexingLz, 500, 0.0, 2.0, VarManager::kVertexingLz); + hm->AddHistogram(histClass, "LxyMC_Lxy", "", false, 500, 0.0, 2.0, VarManager::kMCVertexingLxy, 500, 0.0, 2.0, VarManager::kVertexingLxy); + hm->AddHistogram(histClass, "TauzMC_Tauz", "", false, 500, -0.01, 0.01, VarManager::kMCVertexingTauz, 500, -0.01, 0.01, VarManager::kVertexingTauz); + hm->AddHistogram(histClass, "TauxyMC_Tauxy", "", false, 500, -0.01, 0.01, VarManager::kMCVertexingTauxy, 500, -0.01, 0.01, VarManager::kVertexingTauxy); + hm->AddHistogram(histClass, "CosPointingAngleMC", "", false, 100, 0.0, 1.0, VarManager::kMCCosPointingAngle); + } if (!groupStr.CompareTo("dilepton-photon-mass")) { hm->AddHistogram(histClass, "Mass_Dilepton", "", false, 500, 0.0, 5.0, VarManager::kPairMassDau); hm->AddHistogram(histClass, "Mass_Photon", "", false, 500, 0.0, 0.1, VarManager::kMassDau); diff --git a/PWGDQ/Core/VarManager.h b/PWGDQ/Core/VarManager.h index b26ac744e89..4a7310c9b2d 100644 --- a/PWGDQ/Core/VarManager.h +++ b/PWGDQ/Core/VarManager.h @@ -1163,7 +1163,7 @@ class VarManager : public TObject static void FillPhoton(T const& photon, float* values = nullptr); template static void FillTrackCollision(T const& track, C const& collision, float* values = nullptr); - template + template static void FillTrackCollisionMC(T1 const& track, T2 const& MotherTrack, C const& collision, float* values = nullptr); template static void FillTrackCollisionMatCorr(T const& track, C const& collision, M const& materialCorr, P const& propagator, float* values = nullptr); @@ -2823,49 +2823,49 @@ void VarManager::FillTrackMC(const U& mcStack, T const& track, float* values) template void VarManager::FillTrackCollisionMC(T1 const& track, T2 const& MotherTrack, C const& collision, float* values) - { +{ + + if (!values) { + values = fgValues; + } - if (!values) { - values = fgValues; - } - - float m = 0.0; - float pdgLifetime = 0.0; - if (std::abs(MotherTrack.pdgCode()) == 521) { - m = o2::constants::physics::MassBPlus; - pdgLifetime = 1.638e-12; // s - } - if (std::abs(MotherTrack.pdgCode()) == 511) { - m = o2::constants::physics::MassB0; - pdgLifetime = 1.517e-12; // s - } - - // displaced vertex is compued with decay product (track) and momentum of mother particle (MotherTrack) - values[kMCVertexingLxy] = (collision.mcPosX() - track.vx()) * (collision.mcPosX() - track.vx()) + - (collision.mcPosY() - track.vy()) * (collision.mcPosY() - track.vy()); - values[kMCVertexingLz] = (collision.mcPosZ() - track.vz()) * (collision.mcPosZ() - track.vz()); - values[kMCVertexingLxyz] = values[kMCVertexingLxy] + values[kMCVertexingLz]; - values[kMCVertexingLxy] = std::sqrt(values[kMCVertexingLxy]); - values[kMCVertexingLz] = std::sqrt(values[kMCVertexingLz]); - values[kMCVertexingLxyz] = std::sqrt(values[kMCVertexingLxyz]); - values[kMCVertexingTauz] = (collision.mcPosZ() - track.vz()) * m / (TMath::Abs(MotherTrack.pz()) * o2::constants::physics::LightSpeedCm2NS); - values[kMCVertexingTauxy] = values[kMCVertexingLxy] * m / (MotherTrack.pt() * o2::constants::physics::LightSpeedCm2NS); - - values[kMCCosPointingAngle] = ((collision.mcPosX() - track.vx()) * MotherTrack.px() + + float m = 0.0; + float pdgLifetime = 0.0; + if (std::abs(MotherTrack.pdgCode()) == 521) { + m = o2::constants::physics::MassBPlus; + pdgLifetime = 1.638e-12; // s + } + if (std::abs(MotherTrack.pdgCode()) == 511) { + m = o2::constants::physics::MassB0; + pdgLifetime = 1.517e-12; // s + } + + // displaced vertex is compued with decay product (track) and momentum of mother particle (MotherTrack) + values[kMCVertexingLxy] = (collision.mcPosX() - track.vx()) * (collision.mcPosX() - track.vx()) + + (collision.mcPosY() - track.vy()) * (collision.mcPosY() - track.vy()); + values[kMCVertexingLz] = (collision.mcPosZ() - track.vz()) * (collision.mcPosZ() - track.vz()); + values[kMCVertexingLxyz] = values[kMCVertexingLxy] + values[kMCVertexingLz]; + values[kMCVertexingLxy] = std::sqrt(values[kMCVertexingLxy]); + values[kMCVertexingLz] = std::sqrt(values[kMCVertexingLz]); + values[kMCVertexingLxyz] = std::sqrt(values[kMCVertexingLxyz]); + values[kMCVertexingTauz] = (collision.mcPosZ() - track.vz()) * m / (TMath::Abs(MotherTrack.pz()) * o2::constants::physics::LightSpeedCm2NS); + values[kMCVertexingTauxy] = values[kMCVertexingLxy] * m / (MotherTrack.pt() * o2::constants::physics::LightSpeedCm2NS); + + values[kMCCosPointingAngle] = ((collision.mcPosX() - track.vx()) * MotherTrack.px() + (collision.mcPosY() - track.vy()) * MotherTrack.py() + (collision.mcPosZ() - track.vz()) * MotherTrack.pz()) / (MotherTrack.p() * values[VarManager::kMCVertexingLxyz]); - values[kMCLxyExpected] = (MotherTrack.pt() / m) * (pdgLifetime * o2::constants::physics::LightSpeedCm2S); - values[kMCLxyzExpected] = (MotherTrack.p() / m) * (pdgLifetime * o2::constants::physics::LightSpeedCm2S); + values[kMCLxyExpected] = (MotherTrack.pt() / m) * (pdgLifetime * o2::constants::physics::LightSpeedCm2S); + values[kMCLxyzExpected] = (MotherTrack.p() / m) * (pdgLifetime * o2::constants::physics::LightSpeedCm2S); - values[kMCVertexingLzProjected] = ((track.vz() - collision.mcPosZ()) * MotherTrack.pz()) / TMath::Abs(MotherTrack.pz()); - values[kMCVertexingLxyProjected] = (((track.vx() - collision.mcPosX()) * MotherTrack.px()) + ((track.vy() - collision.mcPosY()) * MotherTrack.py())) / TMath::Abs(MotherTrack.pt()); - values[kMCVertexingLxyzProjected] = (((track.vx() - collision.mcPosX()) * MotherTrack.px()) + ((track.vy() - collision.mcPosY()) * MotherTrack.py()) + ((track.vz() - collision.mcPosZ()) * MotherTrack.pz())) / MotherTrack.p(); - values[kMCVertexingTauxyProjected] = values[kMCVertexingLxyProjected] * m / (MotherTrack.pt()); - values[kMCVertexingTauzProjected] = values[kMCVertexingLzProjected] * m / TMath::Abs(MotherTrack.pz()); - values[kMCVertexingTauxyzProjected] = values[kMCVertexingLxyzProjected] * m / (MotherTrack.p()); - } + values[kMCVertexingLzProjected] = ((track.vz() - collision.mcPosZ()) * MotherTrack.pz()) / TMath::Abs(MotherTrack.pz()); + values[kMCVertexingLxyProjected] = (((track.vx() - collision.mcPosX()) * MotherTrack.px()) + ((track.vy() - collision.mcPosY()) * MotherTrack.py())) / TMath::Abs(MotherTrack.pt()); + values[kMCVertexingLxyzProjected] = (((track.vx() - collision.mcPosX()) * MotherTrack.px()) + ((track.vy() - collision.mcPosY()) * MotherTrack.py()) + ((track.vz() - collision.mcPosZ()) * MotherTrack.pz())) / MotherTrack.p(); + values[kMCVertexingTauxyProjected] = values[kMCVertexingLxyProjected] * m / (MotherTrack.pt()); + values[kMCVertexingTauzProjected] = values[kMCVertexingLzProjected] * m / TMath::Abs(MotherTrack.pz()); + values[kMCVertexingTauxyzProjected] = values[kMCVertexingLxyzProjected] * m / (MotherTrack.p()); +} template void VarManager::FillEnergyCorrelatorsMC(T const& track, T1 const& t1, float* values) diff --git a/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx b/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx index c9380542ba4..e9ebc1444d4 100644 --- a/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx +++ b/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx @@ -4059,14 +4059,14 @@ struct AnalysisDileptonTrack { mcDecision |= (static_cast(1) << isig); } } - - // fill MC truth values for the B hadron + + // fill MC truth values for the B hadron auto currentMCParticle = trackMC; if (mcDecision > 0) { while (true) { if (currentMCParticle.has_mothers()) { currentMCParticle = currentMCParticle.template mothers_first_as(); - if (std::abs(currentMCParticle.pdgCode()) > 500 && std::abs(currentMCParticle.pdgCode()) < 549) { // nb! hardcoded pdgcodes + if (std::abs(currentMCParticle.pdgCode()) > 500 && std::abs(currentMCParticle.pdgCode()) < 549) { // nb! hardcoded pdgcodes VarManager::FillTrackMC(mcTracks, currentMCParticle, fValuesHadron); break; }