From 76f142495478fa38271b0b5e82aa3f880b2f428d Mon Sep 17 00:00:00 2001 From: fchinu Date: Sun, 17 May 2026 21:15:55 +0200 Subject: [PATCH] ITS: add selections on tracks sharing clusters --- .../ITS/include/DataFormatsITS/TrackITS.h | 6 +++ .../include/ITStracking/Configuration.h | 5 ++ .../include/ITStracking/TrackerTraits.h | 2 + .../include/ITStracking/TrackingConfigParam.h | 5 ++ .../ITSMFT/ITS/tracking/src/Configuration.cxx | 3 ++ .../ITSMFT/ITS/tracking/src/TrackerTraits.cxx | 51 +++++++++++++++---- 6 files changed, 61 insertions(+), 11 deletions(-) diff --git a/DataFormats/Detectors/ITSMFT/ITS/include/DataFormatsITS/TrackITS.h b/DataFormats/Detectors/ITSMFT/ITS/include/DataFormatsITS/TrackITS.h index 5d13ad753b8bc..fc1b8ce90e8e6 100644 --- a/DataFormats/Detectors/ITSMFT/ITS/include/DataFormatsITS/TrackITS.h +++ b/DataFormats/Detectors/ITSMFT/ITS/include/DataFormatsITS/TrackITS.h @@ -194,6 +194,12 @@ class TrackITSExt : public TrackITS GPUhdi() const int& getClusterIndex(int lr) const { return mIndex[lr]; } + GPUh() const int& getFirstLayerClusterIndex() const + { + int firstLayer = getFirstClusterLayer(); + return getClusterIndex(firstLayer); + } + GPUhdi() void setExternalClusterIndex(int layer, int idx, bool newCluster = false) { if (newCluster) { diff --git a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Configuration.h b/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Configuration.h index dbce5e0dc08a7..7e339dc57c089 100644 --- a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Configuration.h +++ b/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Configuration.h @@ -79,6 +79,11 @@ struct TrackingParameters { bool PrintMemory = false; // print allocator usage in epilog report size_t MaxMemory = std::numeric_limits::max(); bool DropTFUponFailure = false; + + // Selections on tracks sharing clusters + float SharedClusterMaxDeltaPhi = 0.05f; // For tracks sharing clusters, maximum allowed delta phi at the cluster position + float SharedClusterMaxDeltaEta = 0.03f; // For tracks sharing clusters, maximum allowed delta eta at the cluster position + bool SharedClusterOppositeSign = false; // For tracks sharing clusters, require opposite sign of the tracklets }; struct VertexingParameters { diff --git a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/TrackerTraits.h b/Detectors/ITSMFT/ITS/tracking/include/ITStracking/TrackerTraits.h index 1c3c642429686..2946c69dd7657 100644 --- a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/TrackerTraits.h +++ b/Detectors/ITSMFT/ITS/tracking/include/ITStracking/TrackerTraits.h @@ -59,6 +59,8 @@ class TrackerTraits void acceptTracks(int iteration, bounded_vector& tracks, bounded_vector>& firstClusters, bounded_vector>& sharedFirstClusters); void markTracks(int iteration, bounded_vector>& sharedFirstClusters); + bool areTracksSelected(int iteration, const TrackITSExt& t1, const TrackITSExt& t2); + void updateTrackingParameters(const std::vector& trkPars) { mTrkParams = trkPars; diff --git a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/TrackingConfigParam.h b/Detectors/ITSMFT/ITS/tracking/include/ITStracking/TrackingConfigParam.h index acb55eb1cf993..daadaaa80efcb 100644 --- a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/TrackingConfigParam.h +++ b/Detectors/ITSMFT/ITS/tracking/include/ITStracking/TrackingConfigParam.h @@ -102,6 +102,11 @@ struct TrackerParamConfig : public o2::conf::ConfigurableParamHelper TrackingMode::getTrackingParameters(TrackingMode p.SaveTimeBenchmarks = tc.saveTimeBenchmarks; p.FataliseUponFailure = tc.fataliseUponFailure; p.AllowSharingFirstCluster = tc.allowSharingFirstCluster; + p.SharedClusterMaxDeltaPhi = tc.sharedClusterMaxDeltaPhi; + p.SharedClusterMaxDeltaEta = tc.sharedClusterMaxDeltaEta; + p.SharedClusterOppositeSign = tc.sharedClusterOppositeSign; if (tc.useMatCorrTGeo) { p.CorrType = o2::base::PropagatorImpl::MatCorrType::USEMatCorrTGeo; diff --git a/Detectors/ITSMFT/ITS/tracking/src/TrackerTraits.cxx b/Detectors/ITSMFT/ITS/tracking/src/TrackerTraits.cxx index 69ccd8228ad88..7ad44159e1a8d 100644 --- a/Detectors/ITSMFT/ITS/tracking/src/TrackerTraits.cxx +++ b/Detectors/ITSMFT/ITS/tracking/src/TrackerTraits.cxx @@ -856,23 +856,52 @@ void TrackerTraits::markTracks(int iteration, bounded_vectorgetTracks()) { - int firstLayer{mTrkParams[iteration].NLayers}, firstCluster{constants::UnusedIndex}; - for (int iLayer{0}; iLayer < mTrkParams[iteration].NLayers; ++iLayer) { - if (track.getClusterIndex(iLayer) == constants::UnusedIndex) { - continue; - } - firstLayer = iLayer; - firstCluster = track.getClusterIndex(iLayer); - break; - } + auto& tracks = mTimeFrame->getTracks(); + std::sort(tracks.begin(), tracks.end(), [](const auto& t1, const auto& t2) { + return t1.getFirstLayerClusterIndex() < t2.getFirstLayerClusterIndex(); + }); + + for (int i{0}; i < static_cast(tracks.size()); ++i) { + auto& track = tracks[i]; + int firstLayer{track.getFirstClusterLayer()}, firstCluster{track.getFirstLayerClusterIndex()}; if (std::binary_search(sharedFirstClusters[firstLayer].begin(), sharedFirstClusters[firstLayer].end(), firstCluster)) { - track.setSharedClusters(); + int j = i + 1; + while (j < static_cast(tracks.size()) && tracks[j].getFirstLayerClusterIndex() == firstCluster) { + auto& track2 = tracks[j]; + if (areTracksSelected(iteration, track, track2)) { + for (int iLayer{track.getFirstClusterLayer()}; iLayer < track.getFirstClusterLayer() + track.getNClusters(); ++iLayer) { + } + for (int iLayer{track2.getFirstClusterLayer()}; iLayer < track2.getFirstClusterLayer() + track2.getNClusters(); ++iLayer) { + } + track.setSharedClusters(); + track2.setSharedClusters(); + } + ++j; + } } } } } +template +bool TrackerTraits::areTracksSelected(int iteration, const TrackITSExt& t1, const TrackITSExt& t2) +{ + const auto t1FirstLayer{t1.getFirstClusterLayer()}, t2FirstLayer{t2.getFirstClusterLayer()}; + if (mTimeFrame->getClusterROF(t1FirstLayer, t1.getClusterIndex(t1FirstLayer)) != mTimeFrame->getClusterROF(t2FirstLayer, t2.getClusterIndex(t2FirstLayer))) { + return false; + } + if (o2::math_utils::detail::deltaPhiSmall(t1.getPhi(), t2.getPhi()) > mTrkParams[iteration].SharedClusterMaxDeltaPhi) { + return false; + } + if (std::abs(t1.getEta() - t2.getEta()) > mTrkParams[iteration].SharedClusterMaxDeltaEta) { + return false; + } + if (mTrkParams[iteration].SharedClusterOppositeSign && t1.getSign() == t2.getSign()) { + return false; + } + return true; +} + template void TrackerTraits::setBz(float bz) {