@@ -161,16 +161,25 @@ struct qaEventTrack {
161161 return true ;
162162 }
163163
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);
164+ // General functions to fill data and MC histograms
165+ template <bool IS_MC , typename T>
166+ void fillRecoHistogramsAllTracks (const T& tracks);
167+ template <bool IS_MC , typename C, typename T, typename T_UNF >
168+ void fillRecoHistogramsGroupedTracks (const C& collision, const T& tracks, const T_UNF & tracksUnfiltered);
167169
168170 // Process function for data
169171 using CollisionTableData = soa::Join<aod::Collisions, aod::EvSels>;
170172 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)
173+ void processData (CollisionTableData const & collisions , soa::Filtered<TrackTableData> const & tracks, aod::FullTracks const & tracksUnfiltered)
172174 {
173- fillRecoHistograms<false >(collision, tracks, tracksUnfiltered);
175+ // / work with all tracks
176+ fillRecoHistogramsAllTracks<false >(tracks);
177+ // / work with collision grouping
178+ for (auto const & collision : collisions) {
179+ const auto & tracksColl = tracks.sliceBy (aod::track::collisionId, collision.globalIndex ());
180+ const auto & tracksUnfilteredColl = tracksUnfiltered.sliceBy (aod::track::collisionId, collision.globalIndex ());
181+ fillRecoHistogramsGroupedTracks<false >(collision, tracksColl, tracksUnfilteredColl);
182+ }
174183 }
175184 PROCESS_SWITCH (qaEventTrack, processData, " process data" , false );
176185
@@ -246,10 +255,17 @@ struct qaEventTrack {
246255 // Process function for MC
247256 using CollisionTableMC = soa::Join<CollisionTableData, aod::McCollisionLabels>;
248257 using TrackTableMC = soa::Join<TrackTableData, aod::McTrackLabels>;
249- void processMC (CollisionTableMC::iterator const & collision , soa::Filtered<TrackTableMC> const & tracks, aod::FullTracks const & tracksUnfiltered,
258+ void processMC (CollisionTableMC const & collisions , soa::Filtered<TrackTableMC> const & tracks, aod::FullTracks const & tracksUnfiltered,
250259 aod::McParticles const & mcParticles, aod::McCollisions const & mcCollisions)
251260 {
252- fillRecoHistograms<true >(collision, tracks, tracksUnfiltered);
261+ // / work with all tracks
262+ fillRecoHistogramsAllTracks<true >(tracks);
263+ // / work with collision grouping
264+ for (auto const & collision : collisions) {
265+ const auto & tracksColl = tracks.sliceBy (aod::track::collisionId, collision.globalIndex ());
266+ const auto & tracksUnfilteredColl = tracksUnfiltered.sliceBy (aod::track::collisionId, collision.globalIndex ());
267+ fillRecoHistogramsGroupedTracks<true >(collision, tracksColl, tracksUnfilteredColl);
268+ }
253269 }
254270 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
255271
@@ -473,6 +489,17 @@ void qaEventTrack::init(InitContext const&)
473489 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 }}});
474490 histos.add (" Tracks/Kine/relativeResoPtMean" , " mean relative #it{p}_{T} resolution;#LT#sigma{#it{p}}/#it{p}_{T}#GT;#it{p}_{T}" , kTProfile , {{axisPt}});
475491
492+ // count tracks matched to a collision
493+ auto h1 = histos.add <TH1 >(" Tracks/KineUnmatchTracks/trackCollMatch" , " Track - collision matching" , kTH1F , {{4 , 0.5 , 4.5 , " " }});
494+ h1->GetXaxis ()->SetBinLabel (h1->FindBin (1 ), " all tracks" );
495+ h1->GetXaxis ()->SetBinLabel (h1->FindBin (2 ), " tracks matched to coll." );
496+ h1->GetXaxis ()->SetBinLabel (h1->FindBin (3 ), " tracks unmatched" );
497+ h1->GetXaxis ()->SetBinLabel (h1->FindBin (4 ), " (MC) fake tracks" );
498+ // kine histograms for tracks not matched to collisions
499+ histos.add (" Tracks/KineUnmatchTracks/pt" , " #it{p}_{T}" , kTH1D , {axisPt});
500+ histos.add (" Tracks/KineUnmatchTracks/eta" , " #eta" , kTH1D , {axisEta});
501+ histos.add (" Tracks/KineUnmatchTracks/phi" , " #varphi" , kTH1D , {axisPhi});
502+
476503 // track histograms
477504 auto hselAxis = histos.add <TH1 >(" Tracks/selection" , " trackSelection" , kTH1F , {{40 , 0.5 , 40.5 }})->GetXaxis ();
478505 hselAxis->SetBinLabel (1 , " Tracks read" );
@@ -621,8 +648,33 @@ void qaEventTrack::init(InitContext const&)
621648 * Fill reco level histograms.
622649 */
623650// **************************************************************************************************
624- template <bool IS_MC , typename C, typename T>
625- void qaEventTrack::fillRecoHistograms (const C& collision, const T& tracks, const aod::FullTracks& tracksUnfiltered)
651+ template <bool IS_MC , typename T>
652+ void qaEventTrack::fillRecoHistogramsAllTracks (const T& tracks)
653+ {
654+ for (const auto & track : tracks) {
655+ // / all tracks
656+ histos.fill (HIST (" Tracks/KineUnmatchTracks/trackCollMatch" ), 1 .f );
657+ if (track.has_collision ()) {
658+ // / tracks assigned to a collision
659+ histos.fill (HIST (" Tracks/KineUnmatchTracks/trackCollMatch" ), 2 .f );
660+ } else {
661+ // / tracks not assigned to any collision
662+ histos.fill (HIST (" Tracks/KineUnmatchTracks/trackCollMatch" ), 3 .f );
663+ if constexpr (IS_MC ) {
664+ if (!track.has_mcParticle ()) {
665+ // / fake track
666+ histos.fill (HIST (" Tracks/KineUnmatchTracks/trackCollMatch" ), 4 .f );
667+ }
668+ }
669+ histos.fill (HIST (" Tracks/KineUnmatchTracks/pt" ), track.pt ());
670+ histos.fill (HIST (" Tracks/KineUnmatchTracks/eta" ), track.eta ());
671+ histos.fill (HIST (" Tracks/KineUnmatchTracks/phi" ), track.phi ());
672+ }
673+ }
674+ }
675+ // /////////////////////////////////////////////////////////////
676+ template <bool IS_MC , typename C, typename T, typename T_UNF >
677+ void qaEventTrack::fillRecoHistogramsGroupedTracks (const C& collision, const T& tracks, const T_UNF & tracksUnfiltered)
626678{
627679 // fill reco collision related histograms
628680 if (!isSelectedCollision<true >(collision)) {
0 commit comments