From eaa71b75923fa6ae968632e3e16fa7a9d38b0bb8 Mon Sep 17 00:00:00 2001 From: Mattia Faggin Date: Fri, 15 Jul 2022 15:19:57 +0200 Subject: [PATCH 1/3] DPG: add qa of tracks not matched to collisions. --- DPG/Tasks/qaEventTrack.cxx | 70 +++++++++++++++++++++++++++++++++----- 1 file changed, 61 insertions(+), 9 deletions(-) diff --git a/DPG/Tasks/qaEventTrack.cxx b/DPG/Tasks/qaEventTrack.cxx index f5f5d60cd7b..5ce0af180bb 100644 --- a/DPG/Tasks/qaEventTrack.cxx +++ b/DPG/Tasks/qaEventTrack.cxx @@ -161,16 +161,25 @@ struct qaEventTrack { return true; } - // General function to fill data and MC histograms - template - void fillRecoHistograms(const C& collision, const T& tracks, aod::FullTracks const& tracksUnfiltered); + // General functions to fill data and MC histograms + template + void fillRecoHistogramsAllTracks(const T& tracks); + template + void fillRecoHistogramsGroupedTracks(const C& collision, const T& tracks, const T_UNF& tracksUnfiltered); // Process function for data using CollisionTableData = soa::Join; using TrackTableData = soa::Join; - void processData(CollisionTableData::iterator const& collision, soa::Filtered const& tracks, aod::FullTracks const& tracksUnfiltered) + void processData(CollisionTableData const& collisions, soa::Filtered const& tracks, aod::FullTracks const& tracksUnfiltered) { - fillRecoHistograms(collision, tracks, tracksUnfiltered); + /// work with all tracks + fillRecoHistogramsAllTracks(tracks); + /// work with collision grouping + for (auto const& collision : collisions) { + const auto& tracksColl = tracks.sliceBy(aod::track::collisionId, collision.globalIndex()); + const auto& tracksUnfilteredColl = tracksUnfiltered.sliceBy(aod::track::collisionId, collision.globalIndex()); + fillRecoHistogramsGroupedTracks(collision, tracksColl, tracksUnfilteredColl); + } } PROCESS_SWITCH(qaEventTrack, processData, "process data", false); @@ -246,10 +255,17 @@ struct qaEventTrack { // Process function for MC using CollisionTableMC = soa::Join; using TrackTableMC = soa::Join; - void processMC(CollisionTableMC::iterator const& collision, soa::Filtered const& tracks, aod::FullTracks const& tracksUnfiltered, + void processMC(CollisionTableMC const& collisions, soa::Filtered const& tracks, aod::FullTracks const& tracksUnfiltered, aod::McParticles const& mcParticles, aod::McCollisions const& mcCollisions) { - fillRecoHistograms(collision, tracks, tracksUnfiltered); + /// work with all tracks + fillRecoHistogramsAllTracks(tracks); + /// work with collision grouping + for (auto const& collision : collisions) { + const auto& tracksColl = tracks.sliceBy(aod::track::collisionId, collision.globalIndex()); + const auto& tracksUnfilteredColl = tracksUnfiltered.sliceBy(aod::track::collisionId, collision.globalIndex()); + fillRecoHistogramsGroupedTracks(collision, tracksColl, tracksUnfilteredColl); + } } PROCESS_SWITCH(qaEventTrack, processMC, "process mc", true); // FIXME: would like to disable this by default and swich on via --processMC but currently this crashes -> ask experts @@ -473,6 +489,17 @@ void qaEventTrack::init(InitContext const&) histos.add("Tracks/Kine/relativeResoPt", "relative #it{p}_{T} resolution;#sigma{#it{p}}/#it{p}_{T};#it{p}_{T}", kTH2D, {{axisPt, {100, 0., 0.3}}}); histos.add("Tracks/Kine/relativeResoPtMean", "mean relative #it{p}_{T} resolution;#LT#sigma{#it{p}}/#it{p}_{T}#GT;#it{p}_{T}", kTProfile, {{axisPt}}); + // count tracks matched to a collision + auto h1 = histos.add("Tracks/KineUnmatchTracks/trackCollMatch", "Track - collision matching", kTH1F, {{4, 0.5, 4.5, ""}}); + h1->GetXaxis()->SetBinLabel(h1->FindBin(1), "all tracks"); + h1->GetXaxis()->SetBinLabel(h1->FindBin(2), "tracks matched to coll."); + h1->GetXaxis()->SetBinLabel(h1->FindBin(3), "tracks unmatched"); + h1->GetXaxis()->SetBinLabel(h1->FindBin(4), "(MC) fake tracks"); + // kine histograms for tracks not matched to collisions + histos.add("Tracks/KineUnmatchTracks/pt", "#it{p}_{T}", kTH1D, {axisPt}); + histos.add("Tracks/KineUnmatchTracks/eta", "#eta", kTH1D, {axisEta}); + histos.add("Tracks/KineUnmatchTracks/phi", "#varphi", kTH1D, {axisPhi}); + // track histograms auto hselAxis = histos.add("Tracks/selection", "trackSelection", kTH1F, {{40, 0.5, 40.5}})->GetXaxis(); hselAxis->SetBinLabel(1, "Tracks read"); @@ -621,8 +648,33 @@ void qaEventTrack::init(InitContext const&) * Fill reco level histograms. */ //************************************************************************************************** -template -void qaEventTrack::fillRecoHistograms(const C& collision, const T& tracks, const aod::FullTracks& tracksUnfiltered) +template +void qaEventTrack::fillRecoHistogramsAllTracks(const T& tracks) +{ + for (const auto& track : tracks) { + /// all tracks + histos.fill(HIST("Tracks/KineUnmatchTracks/trackCollMatch"), 1.f); + if (track.has_collision()) { + /// tracks assigned to a collision + histos.fill(HIST("Tracks/KineUnmatchTracks/trackCollMatch"), 2.f); + } else { + /// tracks not assigned to any collision + histos.fill(HIST("Tracks/KineUnmatchTracks/trackCollMatch"), 3.f); + if constexpr (IS_MC) { + if (!track.has_mcParticle()) { + /// fake track + histos.fill(HIST("Tracks/KineUnmatchTracks/trackCollMatch"), 4.f); + } + } + histos.fill(HIST("Tracks/KineUnmatchTracks/pt"), track.pt()); + histos.fill(HIST("Tracks/KineUnmatchTracks/eta"), track.eta()); + histos.fill(HIST("Tracks/KineUnmatchTracks/phi"), track.phi()); + } + } +} +/////////////////////////////////////////////////////////////// +template +void qaEventTrack::fillRecoHistogramsGroupedTracks(const C& collision, const T& tracks, const T_UNF& tracksUnfiltered) { // fill reco collision related histograms if (!isSelectedCollision(collision)) { From 8e27b9aef52409518211206458746b54f67e74b7 Mon Sep 17 00:00:00 2001 From: Mattia Faggin Date: Fri, 15 Jul 2022 16:57:56 +0200 Subject: [PATCH 2/3] Fix comment. --- DPG/Tasks/qaEventTrack.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DPG/Tasks/qaEventTrack.cxx b/DPG/Tasks/qaEventTrack.cxx index 5ce0af180bb..d8c9b495c1d 100644 --- a/DPG/Tasks/qaEventTrack.cxx +++ b/DPG/Tasks/qaEventTrack.cxx @@ -658,7 +658,7 @@ void qaEventTrack::fillRecoHistogramsAllTracks(const T& tracks) /// tracks assigned to a collision histos.fill(HIST("Tracks/KineUnmatchTracks/trackCollMatch"), 2.f); } else { - /// tracks not assigned to any collision + /// tracks not assigned to any reconsructed collision histos.fill(HIST("Tracks/KineUnmatchTracks/trackCollMatch"), 3.f); if constexpr (IS_MC) { if (!track.has_mcParticle()) { From ee66289639092e4dbac51926b62e5a87906ef32c Mon Sep 17 00:00:00 2001 From: Mattia Faggin Date: Fri, 15 Jul 2022 17:49:57 +0200 Subject: [PATCH 3/3] Fix syntax for sliceBy. --- DPG/Tasks/qaEventTrack.cxx | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/DPG/Tasks/qaEventTrack.cxx b/DPG/Tasks/qaEventTrack.cxx index d8c9b495c1d..1948ed55d38 100644 --- a/DPG/Tasks/qaEventTrack.cxx +++ b/DPG/Tasks/qaEventTrack.cxx @@ -103,6 +103,7 @@ struct qaEventTrack { HistogramRegistry histos; Preslice perMcCollision = aod::mcparticle::mcCollisionId; + Preslice perRecoCollision = aod::track::collisionId; void init(InitContext const&); @@ -176,8 +177,8 @@ struct qaEventTrack { fillRecoHistogramsAllTracks(tracks); /// work with collision grouping for (auto const& collision : collisions) { - const auto& tracksColl = tracks.sliceBy(aod::track::collisionId, collision.globalIndex()); - const auto& tracksUnfilteredColl = tracksUnfiltered.sliceBy(aod::track::collisionId, collision.globalIndex()); + const auto& tracksColl = tracks.sliceBy(perRecoCollision, collision.globalIndex()); + const auto& tracksUnfilteredColl = tracksUnfiltered.sliceBy(perRecoCollision, collision.globalIndex()); fillRecoHistogramsGroupedTracks(collision, tracksColl, tracksUnfilteredColl); } } @@ -262,8 +263,8 @@ struct qaEventTrack { fillRecoHistogramsAllTracks(tracks); /// work with collision grouping for (auto const& collision : collisions) { - const auto& tracksColl = tracks.sliceBy(aod::track::collisionId, collision.globalIndex()); - const auto& tracksUnfilteredColl = tracksUnfiltered.sliceBy(aod::track::collisionId, collision.globalIndex()); + const auto& tracksColl = tracks.sliceBy(perRecoCollision, collision.globalIndex()); + const auto& tracksUnfilteredColl = tracksUnfiltered.sliceBy(perRecoCollision, collision.globalIndex()); fillRecoHistogramsGroupedTracks(collision, tracksColl, tracksUnfilteredColl); } }