From 5a1a63ed1552511774140c57690b517d3fca798a Mon Sep 17 00:00:00 2001 From: Giulio Eulisse <10544+ktf@users.noreply.github.com> Date: Mon, 24 Aug 2026 10:44:50 +0200 Subject: [PATCH] Improve track selection * Avoid redundant IsRun2 check * Avoid doing IsSelected() twice * Use std::pow (float) rather than C pow (double) --- Common/Core/TrackSelection.h | 53 ++++++++++++++++--------- Common/Core/TrackSelectionDefaults.cxx | 4 +- Common/TableProducer/trackselection.cxx | 6 +-- 3 files changed, 40 insertions(+), 23 deletions(-) diff --git a/Common/Core/TrackSelection.h b/Common/Core/TrackSelection.h index b803b3a33ff..b618be91536 100644 --- a/Common/Core/TrackSelection.h +++ b/Common/Core/TrackSelection.h @@ -70,56 +70,66 @@ class TrackSelection static const std::string mCutNames[static_cast(TrackCuts::kNCuts)]; + // True for Run 2 track types. Hoisted out of the per-cut IsSelected() so that + // the trackType() column is dereferenced once per track instead of once per cut. + template + static bool IsRun2Track(T const& track) + { + const auto trackType = track.trackType(); + return trackType == o2::aod::track::Run2Track || trackType == o2::aod::track::Run2Tracklet; + } + // Temporary function to check if track passes selection criteria. To be replaced by framework filters. template bool IsSelected(T const& track) const { - if (!IsSelected(track, TrackCuts::kTrackType)) { + const bool isRun2 = IsRun2Track(track); + if (!IsSelected(track, TrackCuts::kTrackType, isRun2)) { return false; } - if (!IsSelected(track, TrackCuts::kPtRange)) { + if (!IsSelected(track, TrackCuts::kPtRange, isRun2)) { return false; } - if (!IsSelected(track, TrackCuts::kEtaRange)) { + if (!IsSelected(track, TrackCuts::kEtaRange, isRun2)) { return false; } - if (!IsSelected(track, TrackCuts::kTPCNCls)) { + if (!IsSelected(track, TrackCuts::kTPCNCls, isRun2)) { return false; } - if (!IsSelected(track, TrackCuts::kTPCCrossedRows)) { + if (!IsSelected(track, TrackCuts::kTPCCrossedRows, isRun2)) { return false; } - if (!IsSelected(track, TrackCuts::kTPCCrossedRowsOverNCls)) { + if (!IsSelected(track, TrackCuts::kTPCCrossedRowsOverNCls, isRun2)) { return false; } - if (!IsSelected(track, TrackCuts::kTPCChi2NDF)) { + if (!IsSelected(track, TrackCuts::kTPCChi2NDF, isRun2)) { return false; } - if (!IsSelected(track, TrackCuts::kTPCRefit)) { + if (!IsSelected(track, TrackCuts::kTPCRefit, isRun2)) { return false; } - if (!IsSelected(track, TrackCuts::kITSNCls)) { + if (!IsSelected(track, TrackCuts::kITSNCls, isRun2)) { return false; } - if (!IsSelected(track, TrackCuts::kITSChi2NDF)) { + if (!IsSelected(track, TrackCuts::kITSChi2NDF, isRun2)) { return false; } - if (!IsSelected(track, TrackCuts::kITSRefit)) { + if (!IsSelected(track, TrackCuts::kITSRefit, isRun2)) { return false; } - if (!IsSelected(track, TrackCuts::kITSHits)) { + if (!IsSelected(track, TrackCuts::kITSHits, isRun2)) { return false; } - if (!IsSelected(track, TrackCuts::kGoldenChi2)) { + if (!IsSelected(track, TrackCuts::kGoldenChi2, isRun2)) { return false; } - if (!IsSelected(track, TrackCuts::kDCAxy)) { + if (!IsSelected(track, TrackCuts::kDCAxy, isRun2)) { return false; } - if (!IsSelected(track, TrackCuts::kDCAz)) { + if (!IsSelected(track, TrackCuts::kDCAz, isRun2)) { return false; } - if (!IsSelected(track, TrackCuts::kTPCFracSharedCls)) { + if (!IsSelected(track, TrackCuts::kTPCFracSharedCls, isRun2)) { return false; } return true; @@ -131,8 +141,9 @@ class TrackSelection { uint16_t flag = 0; + const bool isRun2 = IsRun2Track(track); auto setFlag = [&](const TrackCuts& cut) { - if (IsSelected(track, cut)) { + if (IsSelected(track, cut, isRun2)) { flag |= 1UL << static_cast(cut); } }; @@ -161,8 +172,14 @@ class TrackSelection template bool IsSelected(T const& track, const TrackCuts& cut) const { - const bool isRun2 = track.trackType() == o2::aod::track::Run2Track || track.trackType() == o2::aod::track::Run2Tracklet; + return IsSelected(track, cut, IsRun2Track(track)); + } + // Overload taking the pre-computed Run 2 flag, so that callers evaluating several + // cuts on the same track do not re-read trackType() for each of them. + template + bool IsSelected(T const& track, const TrackCuts& cut, bool isRun2) const + { switch (cut) { case TrackCuts::kTrackType: return track.trackType() == mTrackType; diff --git a/Common/Core/TrackSelectionDefaults.cxx b/Common/Core/TrackSelectionDefaults.cxx index e8476db5e17..4bd69ac33cf 100644 --- a/Common/Core/TrackSelectionDefaults.cxx +++ b/Common/Core/TrackSelectionDefaults.cxx @@ -39,7 +39,7 @@ TrackSelection getGlobalTrackSelection() selectedTracks.SetMaxChi2PerClusterTPC(4.f); selectedTracks.SetRequireHitsInITSLayers(1, {0, 1}); // one hit in any SPD layer selectedTracks.SetMaxChi2PerClusterITS(36.f); - selectedTracks.SetMaxDcaXYPtDep([](float pt) { return 0.0105f + 0.0350f / pow(pt, 1.1f); }); + selectedTracks.SetMaxDcaXYPtDep([](float pt) { return 0.0105f + 0.0350f / std::pow(pt, 1.1f); }); selectedTracks.SetMaxDcaZ(2.f); return selectedTracks; } @@ -115,7 +115,7 @@ TrackSelection getGlobalTrackSelectionRun3HF() selectedTracks.SetMaxChi2PerClusterTPC(4.f); selectedTracks.SetRequireHitsInITSLayers(1, {0, 1}); // one hit in any SPD layer selectedTracks.SetMaxChi2PerClusterITS(36.f); - // selectedTracks.SetMaxDcaXYPtDep([](float pt) { return 0.0105f + 0.0350f / pow(pt, 1.1f); }); + // selectedTracks.SetMaxDcaXYPtDep([](float pt) { return 0.0105f + 0.0350f / std::pow(pt, 1.1f); }); selectedTracks.SetMaxDcaZ(2.f); selectedTracks.SetMaxDcaXY(0.25); diff --git a/Common/TableProducer/trackselection.cxx b/Common/TableProducer/trackselection.cxx index 2681c503ad5..e8619bd9ccb 100644 --- a/Common/TableProducer/trackselection.cxx +++ b/Common/TableProducer/trackselection.cxx @@ -157,10 +157,11 @@ struct TrackSelectionTask { } if (isRun3) { for (const auto& track : tracks) { + const o2::aod::track::TrackSelectionFlags::flagtype trackflagGlob = globalTracks.IsSelectedMask(track); if (produceTable == 1) { filterTable((uint8_t)0, - globalTracks.IsSelectedMask(track), + trackflagGlob, filtBit1.IsSelected(track), filtBit2.IsSelected(track), filtBit3.IsSelected(track), @@ -168,7 +169,6 @@ struct TrackSelectionTask { filtBit5.IsSelected(track)); } if (produceFBextendedTable == 1) { - o2::aod::track::TrackSelectionFlags::flagtype trackflagGlob = globalTracks.IsSelectedMask(track); o2::aod::track::TrackSelectionFlags::flagtype trackflagFB1 = filtBit1.IsSelectedMask(track); o2::aod::track::TrackSelectionFlags::flagtype trackflagFB2 = filtBit2.IsSelectedMask(track); // o2::aod::track::TrackSelectionFlags::flagtype trackflagFB3 = filtBit3.IsSelectedMask(track); // only temporarily commented, will be used @@ -201,7 +201,7 @@ struct TrackSelectionTask { o2::aod::track::TrackSelectionFlags::flagtype trackflagGlob = globalTracks.IsSelectedMask(track); if (produceTable == 1) { filterTable((uint8_t)globalTracksSDD.IsSelected(track), - globalTracks.IsSelectedMask(track), + trackflagGlob, filtBit1.IsSelected(track), filtBit2.IsSelected(track), filtBit3.IsSelected(track),