From e9786f12ea776753bc766fca135ab513ed223979 Mon Sep 17 00:00:00 2001 From: Fabrizio Grosa Date: Wed, 20 Jul 2022 10:41:09 +0200 Subject: [PATCH 1/5] PWGHF: Add more checks on collision association probability --- PWGHF/Tasks/HFMCValidation.cxx | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/PWGHF/Tasks/HFMCValidation.cxx b/PWGHF/Tasks/HFMCValidation.cxx index 2bbc105a45d..5d6fc31cb7d 100644 --- a/PWGHF/Tasks/HFMCValidation.cxx +++ b/PWGHF/Tasks/HFMCValidation.cxx @@ -242,13 +242,15 @@ struct ValidationRecLevel { std::array, nCharmHadrons> histDeltaPt, histDeltaPx, histDeltaPy, histDeltaPz, histDeltaSecondaryVertexX, histDeltaSecondaryVertexY, histDeltaSecondaryVertexZ, histDeltaDecayLength; std::array, 3>, 2>, nCharmHadrons> histPtDau, histEtaDau, histImpactParameterDau; std::array, 2>, nCharmHadrons> histPtReco; - std::array, 2> histOriginTracks; + std::array, 4> histOriginTracks; HistogramRegistry registry{"registry", {}}; void init(o2::framework::InitContext&) { - histOriginTracks[0] = registry.add("histOriginNonAssociatedTracks", ";origin;#it{p}_{T}^{reco} (GeV/#it{c})", HistType::kTH2F, {{4, -1.5, 2.5}, {50, 0., 10.}}); - histOriginTracks[1] = registry.add("histOriginAssociatedTracks", ";origin;#it{p}_{T}^{reco} (GeV/#it{c})", HistType::kTH2F, {{4, -1.5, 2.5}, {50, 0., 10.}}); + histOriginTracks[0] = registry.add("histOriginNonAssociatedTracks", ";origin;#it{p}_{T}^{reco} (GeV/#it{c})", HistType::kTH2F, {{4, -1.5, 2.5}, {50, 0., 10.}}); // tracks not associated to any collision + histOriginTracks[1] = registry.add("histOriginAssociatedTracks", ";origin;#it{p}_{T}^{reco} (GeV/#it{c})", HistType::kTH2F, {{4, -1.5, 2.5}, {50, 0., 10.}}); // tracks associasted to a collision + histOriginTracks[2] = registry.add("histOriginGoodAssociatedTracks", ";origin;#it{p}_{T}^{reco} (GeV/#it{c})", HistType::kTH2F, {{4, -1.5, 2.5}, {50, 0., 10.}}); // tracks associated to the correct collision (considering the MC collision index) + histOriginTracks[3] = registry.add("histOriginWrongAssociatedTracks", ";origin;#it{p}_{T}^{reco} (GeV/#it{c})", HistType::kTH2F, {{4, -1.5, 2.5}, {50, 0., 10.}}); // tracks associated to the wrong collision (considering the MC collision index) for (std::size_t iHist{0}; iHist < histOriginTracks.size(); ++iHist) { histOriginTracks[iHist]->GetXaxis()->SetBinLabel(1, "no MC particle"); histOriginTracks[iHist]->GetXaxis()->SetBinLabel(2, "no quark"); @@ -285,8 +287,11 @@ struct ValidationRecLevel { uint index = uint(track.collisionId() >= 0); if (track.has_mcParticle()) { auto particle = track.mcParticle(); // get corresponding MC particle to check origin + uint index2 = uint(std::abs(track.collisionId() - particle.collisionId()) > 0) + 1; auto origin = RecoDecay::getCharmHadronOrigin(particlesMC, particle, true); histOriginTracks[index]->Fill(origin, track.pt()); + histOriginTracks[index + index2]->Fill(origin, track.pt()); + histOriginTracks[index + index2]->Fill(origin, track.pt()); } else { histOriginTracks[index]->Fill(-1., track.pt()); } From 6d38250a11cf32d0f3e6f0a42b5e0f327a70021f Mon Sep 17 00:00:00 2001 From: Fabrizio Grosa Date: Wed, 20 Jul 2022 10:55:35 +0200 Subject: [PATCH 2/5] Fix MC collision ID --- PWGHF/Tasks/HFMCValidation.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGHF/Tasks/HFMCValidation.cxx b/PWGHF/Tasks/HFMCValidation.cxx index 5d6fc31cb7d..f56290fdfa5 100644 --- a/PWGHF/Tasks/HFMCValidation.cxx +++ b/PWGHF/Tasks/HFMCValidation.cxx @@ -287,7 +287,7 @@ struct ValidationRecLevel { uint index = uint(track.collisionId() >= 0); if (track.has_mcParticle()) { auto particle = track.mcParticle(); // get corresponding MC particle to check origin - uint index2 = uint(std::abs(track.collisionId() - particle.collisionId()) > 0) + 1; + uint index2 = uint(std::abs(track.collisionId() - particle.mcCollisionId()) > 0) + 1; auto origin = RecoDecay::getCharmHadronOrigin(particlesMC, particle, true); histOriginTracks[index]->Fill(origin, track.pt()); histOriginTracks[index + index2]->Fill(origin, track.pt()); From 3b0d1ed36b242b5a3e8b8cf0ca66c19719062576 Mon Sep 17 00:00:00 2001 From: Fabrizio Grosa Date: Wed, 20 Jul 2022 18:23:40 +0200 Subject: [PATCH 3/5] PWGHF: Add more checks on collision association --- PWGHF/Tasks/HFMCValidation.cxx | 44 ++++++++++++++++++++++++++++++++-- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/PWGHF/Tasks/HFMCValidation.cxx b/PWGHF/Tasks/HFMCValidation.cxx index f56290fdfa5..498acb98978 100644 --- a/PWGHF/Tasks/HFMCValidation.cxx +++ b/PWGHF/Tasks/HFMCValidation.cxx @@ -52,6 +52,14 @@ static const std::array originNames = {"Prompt", "NonPrompt"}; /// - Momentum Conservation for these particles struct ValidationGenLevel { + + Configurable xVertexMin{"xVertexMin", -100., "min. x of generated primary vertex [cm]"}; + Configurable xVertexMax{"xVertexMax", 100., "max. x of generated primary vertex [cm]"}; + Configurable yVertexMin{"yVertexMin", -100., "min. y of generated primary vertex [cm]"}; + Configurable yVertexMax{"yVertexMax", 100., "max. y of generated primary vertex [cm]"}; + Configurable zVertexMin{"zVertexMin", -10., "min. z of generated primary vertex [cm]"}; + Configurable zVertexMax{"zVertexMax", 10., "max. z of generated primary vertex [cm]"}; + std::shared_ptr hPromptCharmHadronsPtDistr, hPromptCharmHadronsYDistr, hNonPromptCharmHadronsPtDistr, hNonPromptCharmHadronsYDistr, hPromptCharmHadronsDecLenDistr, hNonPromptCharmHadronsDecLenDistr, hQuarkPerEvent; HistogramRegistry registry{ @@ -101,6 +109,26 @@ struct ValidationGenLevel { } } + /// Primary-vertex selection + /// \param collision mccollision table row + template + bool selectVertex(const Col& collision) + { + // x position + if (collision.posX() < xVertexMin || collision.posX() > xVertexMax) { + return false; + } + // y position + if (collision.posY() < yVertexMin || collision.posY() > yVertexMax) { + return false; + } + // z position + if (collision.posZ() < zVertexMin || collision.posZ() > zVertexMax) { + return false; + } + return true; + } + void process(aod::McCollision const& mccollision, aod::McParticles const& particlesMC) { int cPerCollision = 0; @@ -115,6 +143,9 @@ struct ValidationGenLevel { std::vector listDaughters{}; for (auto& particle : particlesMC) { + if (!selectVertex(mccollision)) + continue; + int particlePdgCode = particle.pdgCode(); if (!particle.has_mothers()) { continue; @@ -280,14 +311,23 @@ struct ValidationRecLevel { using HfCandProng2WithMCRec = soa::Join; using HfCandProng3WithMCRec = soa::Join; - void process(HfCandProng2WithMCRec const& cand2Prongs, HfCandProng3WithMCRec const& cand3Prongs, aod::BigTracksMC const& tracks, aod::McParticles const& particlesMC) + void process(HfCandProng2WithMCRec const& cand2Prongs, HfCandProng3WithMCRec const& cand3Prongs, aod::BigTracksMC const& tracks, aod::McParticles const& particlesMC, aod::McCollisions const& mcCollisions, soa::Join const& collisions) { // loop over tracks for (auto& track : tracks) { uint index = uint(track.collisionId() >= 0); if (track.has_mcParticle()) { auto particle = track.mcParticle(); // get corresponding MC particle to check origin - uint index2 = uint(std::abs(track.collisionId() - particle.mcCollisionId()) > 0) + 1; + uint index2 = 0; + if (index) { + auto collision = collisions.rawIteratorAt(track.collisionId()); + auto mcCollision = mcCollisions.rawIteratorAt(particle.mcCollisionId()); + if (std::abs(collision.mcCollisionId() - particle.mcCollisionId()) == 0 && std::abs(collision.posZ() - mcCollision.posZ()) < 0.02) { // 200 microns compatibility of Z vertex position also required + index2 = 1; + } else { + index2 = 2; + } + } auto origin = RecoDecay::getCharmHadronOrigin(particlesMC, particle, true); histOriginTracks[index]->Fill(origin, track.pt()); histOriginTracks[index + index2]->Fill(origin, track.pt()); From 2ac6449db57681b002ea434feff5b76fd598445c Mon Sep 17 00:00:00 2001 From: Fabrizio Date: Wed, 20 Jul 2022 19:12:36 +0200 Subject: [PATCH 4/5] Update PWGHF/Tasks/HFMCValidation.cxx MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Vít Kučera --- PWGHF/Tasks/HFMCValidation.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGHF/Tasks/HFMCValidation.cxx b/PWGHF/Tasks/HFMCValidation.cxx index 498acb98978..e568b718294 100644 --- a/PWGHF/Tasks/HFMCValidation.cxx +++ b/PWGHF/Tasks/HFMCValidation.cxx @@ -322,7 +322,7 @@ struct ValidationRecLevel { if (index) { auto collision = collisions.rawIteratorAt(track.collisionId()); auto mcCollision = mcCollisions.rawIteratorAt(particle.mcCollisionId()); - if (std::abs(collision.mcCollisionId() - particle.mcCollisionId()) == 0 && std::abs(collision.posZ() - mcCollision.posZ()) < 0.02) { // 200 microns compatibility of Z vertex position also required + if (collision.mcCollisionId() == particle.mcCollisionId() && std::abs(collision.posZ() - mcCollision.posZ()) < 0.02) { // 200 microns compatibility of Z vertex position also required index2 = 1; } else { index2 = 2; From 789e861fe3b8bc527c7667376ff377870fc6f3e6 Mon Sep 17 00:00:00 2001 From: Fabrizio Grosa Date: Wed, 20 Jul 2022 19:24:52 +0200 Subject: [PATCH 5/5] Simplify getting the MC collision --- PWGHF/Tasks/HFMCValidation.cxx | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/PWGHF/Tasks/HFMCValidation.cxx b/PWGHF/Tasks/HFMCValidation.cxx index e568b718294..c78f8846172 100644 --- a/PWGHF/Tasks/HFMCValidation.cxx +++ b/PWGHF/Tasks/HFMCValidation.cxx @@ -310,28 +310,26 @@ struct ValidationRecLevel { using HfCandProng2WithMCRec = soa::Join; using HfCandProng3WithMCRec = soa::Join; + using CollisionsWithMCLabels = soa::Join; - void process(HfCandProng2WithMCRec const& cand2Prongs, HfCandProng3WithMCRec const& cand3Prongs, aod::BigTracksMC const& tracks, aod::McParticles const& particlesMC, aod::McCollisions const& mcCollisions, soa::Join const& collisions) + void process(HfCandProng2WithMCRec const& cand2Prongs, HfCandProng3WithMCRec const& cand3Prongs, aod::BigTracksMC const& tracks, aod::McParticles const& particlesMC, aod::McCollisions const& mcCollisions, CollisionsWithMCLabels const& collisions) { // loop over tracks for (auto& track : tracks) { uint index = uint(track.collisionId() >= 0); if (track.has_mcParticle()) { auto particle = track.mcParticle(); // get corresponding MC particle to check origin - uint index2 = 0; + auto origin = RecoDecay::getCharmHadronOrigin(particlesMC, particle, true); + histOriginTracks[index]->Fill(origin, track.pt()); if (index) { auto collision = collisions.rawIteratorAt(track.collisionId()); - auto mcCollision = mcCollisions.rawIteratorAt(particle.mcCollisionId()); - if (collision.mcCollisionId() == particle.mcCollisionId() && std::abs(collision.posZ() - mcCollision.posZ()) < 0.02) { // 200 microns compatibility of Z vertex position also required + auto mcCollision = particle.mcCollision(); + uint index2 = 2; + if (collision.mcCollisionId() - particle.mcCollisionId() == 0 && std::abs(collision.posZ() - mcCollision.posZ()) < 0.02) { // 200 microns compatibility of Z vertex position also required index2 = 1; - } else { - index2 = 2; } + histOriginTracks[index + index2]->Fill(origin, track.pt()); } - auto origin = RecoDecay::getCharmHadronOrigin(particlesMC, particle, true); - histOriginTracks[index]->Fill(origin, track.pt()); - histOriginTracks[index + index2]->Fill(origin, track.pt()); - histOriginTracks[index + index2]->Fill(origin, track.pt()); } else { histOriginTracks[index]->Fill(-1., track.pt()); }