@@ -103,6 +103,7 @@ struct qaEventTrack {
103103 HistogramRegistry histos;
104104
105105 Preslice<aod::McParticles> perMcCollision = aod::mcparticle::mcCollisionId;
106+ Preslice<aod::Tracks> perRecoCollision = aod::track::collisionId;
106107
107108 void init (InitContext const &);
108109
@@ -161,16 +162,25 @@ struct qaEventTrack {
161162 return true ;
162163 }
163164
164- // General function to fill data and MC histograms
165- template <bool IS_MC , typename C, typename T>
166- void fillRecoHistograms (const C& collision, const T& tracks, aod::FullTracks const & tracksUnfiltered);
165+ // General functions to fill data and MC histograms
166+ template <bool IS_MC , typename T>
167+ void fillRecoHistogramsAllTracks (const T& tracks);
168+ template <bool IS_MC , typename C, typename T, typename T_UNF >
169+ void fillRecoHistogramsGroupedTracks (const C& collision, const T& tracks, const T_UNF & tracksUnfiltered);
167170
168171 // Process function for data
169172 using CollisionTableData = soa::Join<aod::Collisions, aod::EvSels>;
170173 using TrackTableData = soa::Join<aod::FullTracks, aod::TracksCov, aod::TracksDCA, aod::TrackSelection>;
171- void processData (CollisionTableData::iterator const & collision , soa::Filtered<TrackTableData> const & tracks, aod::FullTracks const & tracksUnfiltered)
174+ void processData (CollisionTableData const & collisions , soa::Filtered<TrackTableData> const & tracks, aod::FullTracks const & tracksUnfiltered)
172175 {
173- fillRecoHistograms<false >(collision, tracks, tracksUnfiltered);
176+ // / work with all tracks
177+ fillRecoHistogramsAllTracks<false >(tracks);
178+ // / work with collision grouping
179+ for (auto const & collision : collisions) {
180+ const auto & tracksColl = tracks.sliceBy (perRecoCollision, collision.globalIndex ());
181+ const auto & tracksUnfilteredColl = tracksUnfiltered.sliceBy (perRecoCollision, collision.globalIndex ());
182+ fillRecoHistogramsGroupedTracks<false >(collision, tracksColl, tracksUnfilteredColl);
183+ }
174184 }
175185 PROCESS_SWITCH (qaEventTrack, processData, " process data" , false );
176186
@@ -246,10 +256,17 @@ struct qaEventTrack {
246256 // Process function for MC
247257 using CollisionTableMC = soa::Join<CollisionTableData, aod::McCollisionLabels>;
248258 using TrackTableMC = soa::Join<TrackTableData, aod::McTrackLabels>;
249- void processMC (CollisionTableMC::iterator const & collision , soa::Filtered<TrackTableMC> const & tracks, aod::FullTracks const & tracksUnfiltered,
259+ void processMC (CollisionTableMC const & collisions , soa::Filtered<TrackTableMC> const & tracks, aod::FullTracks const & tracksUnfiltered,
250260 aod::McParticles const & mcParticles, aod::McCollisions const & mcCollisions)
251261 {
252- fillRecoHistograms<true >(collision, tracks, tracksUnfiltered);
262+ // / work with all tracks
263+ fillRecoHistogramsAllTracks<true >(tracks);
264+ // / work with collision grouping
265+ for (auto const & collision : collisions) {
266+ const auto & tracksColl = tracks.sliceBy (perRecoCollision, collision.globalIndex ());
267+ const auto & tracksUnfilteredColl = tracksUnfiltered.sliceBy (perRecoCollision, collision.globalIndex ());
268+ fillRecoHistogramsGroupedTracks<true >(collision, tracksColl, tracksUnfilteredColl);
269+ }
253270 }
254271 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
255272
@@ -473,6 +490,17 @@ void qaEventTrack::init(InitContext const&)
473490 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 }}});
474491 histos.add (" Tracks/Kine/relativeResoPtMean" , " mean relative #it{p}_{T} resolution;#LT#sigma{#it{p}}/#it{p}_{T}#GT;#it{p}_{T}" , kTProfile , {{axisPt}});
475492
493+ // count tracks matched to a collision
494+ auto h1 = histos.add <TH1 >(" Tracks/KineUnmatchTracks/trackCollMatch" , " Track - collision matching" , kTH1F , {{4 , 0.5 , 4.5 , " " }});
495+ h1->GetXaxis ()->SetBinLabel (h1->FindBin (1 ), " all tracks" );
496+ h1->GetXaxis ()->SetBinLabel (h1->FindBin (2 ), " tracks matched to coll." );
497+ h1->GetXaxis ()->SetBinLabel (h1->FindBin (3 ), " tracks unmatched" );
498+ h1->GetXaxis ()->SetBinLabel (h1->FindBin (4 ), " (MC) fake tracks" );
499+ // kine histograms for tracks not matched to collisions
500+ histos.add (" Tracks/KineUnmatchTracks/pt" , " #it{p}_{T}" , kTH1D , {axisPt});
501+ histos.add (" Tracks/KineUnmatchTracks/eta" , " #eta" , kTH1D , {axisEta});
502+ histos.add (" Tracks/KineUnmatchTracks/phi" , " #varphi" , kTH1D , {axisPhi});
503+
476504 // track histograms
477505 auto hselAxis = histos.add <TH1 >(" Tracks/selection" , " trackSelection" , kTH1F , {{40 , 0.5 , 40.5 }})->GetXaxis ();
478506 hselAxis->SetBinLabel (1 , " Tracks read" );
@@ -621,8 +649,33 @@ void qaEventTrack::init(InitContext const&)
621649 * Fill reco level histograms.
622650 */
623651// **************************************************************************************************
624- template <bool IS_MC , typename C, typename T>
625- void qaEventTrack::fillRecoHistograms (const C& collision, const T& tracks, const aod::FullTracks& tracksUnfiltered)
652+ template <bool IS_MC , typename T>
653+ void qaEventTrack::fillRecoHistogramsAllTracks (const T& tracks)
654+ {
655+ for (const auto & track : tracks) {
656+ // / all tracks
657+ histos.fill (HIST (" Tracks/KineUnmatchTracks/trackCollMatch" ), 1 .f );
658+ if (track.has_collision ()) {
659+ // / tracks assigned to a collision
660+ histos.fill (HIST (" Tracks/KineUnmatchTracks/trackCollMatch" ), 2 .f );
661+ } else {
662+ // / tracks not assigned to any reconsructed collision
663+ histos.fill (HIST (" Tracks/KineUnmatchTracks/trackCollMatch" ), 3 .f );
664+ if constexpr (IS_MC ) {
665+ if (!track.has_mcParticle ()) {
666+ // / fake track
667+ histos.fill (HIST (" Tracks/KineUnmatchTracks/trackCollMatch" ), 4 .f );
668+ }
669+ }
670+ histos.fill (HIST (" Tracks/KineUnmatchTracks/pt" ), track.pt ());
671+ histos.fill (HIST (" Tracks/KineUnmatchTracks/eta" ), track.eta ());
672+ histos.fill (HIST (" Tracks/KineUnmatchTracks/phi" ), track.phi ());
673+ }
674+ }
675+ }
676+ // /////////////////////////////////////////////////////////////
677+ template <bool IS_MC , typename C, typename T, typename T_UNF >
678+ void qaEventTrack::fillRecoHistogramsGroupedTracks (const C& collision, const T& tracks, const T_UNF & tracksUnfiltered)
626679{
627680 // fill reco collision related histograms
628681 if (!isSelectedCollision<true >(collision)) {
0 commit comments