From 7371257f32f098d68e5acded6b3bf47bd24b4253 Mon Sep 17 00:00:00 2001 From: Maximiliano Puccio Date: Tue, 22 Apr 2025 14:38:13 +0200 Subject: [PATCH 1/3] feat: allow sharing of first cluster in ITS tracking --- .../include/ITStracking/Configuration.h | 1 + .../include/ITStracking/TrackingConfigParam.h | 1 + .../ITSMFT/ITS/tracking/src/TrackerTraits.cxx | 43 +++++++++++++++++-- 3 files changed, 42 insertions(+), 3 deletions(-) diff --git a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Configuration.h b/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Configuration.h index 2bfa0639ad5a2..d7c4e27add739 100644 --- a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Configuration.h +++ b/Detectors/ITSMFT/ITS/tracking/include/ITStracking/Configuration.h @@ -51,6 +51,7 @@ struct TrackingParameters { float Diamond[3] = {0.f, 0.f, 0.f}; /// General parameters + bool AllowSharingFirstCluster = false; int ClusterSharing = 0; int MinTrackLength = 7; float NSigmaCut = 5; diff --git a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/TrackingConfigParam.h b/Detectors/ITSMFT/ITS/tracking/include/ITStracking/TrackingConfigParam.h index d368eb1d1f56a..6c4ecc5ab424d 100644 --- a/Detectors/ITSMFT/ITS/tracking/include/ITStracking/TrackingConfigParam.h +++ b/Detectors/ITSMFT/ITS/tracking/include/ITStracking/TrackingConfigParam.h @@ -104,6 +104,7 @@ struct TrackerParamConfig : public o2::conf::ConfigurableParamHelper::max(); bool dropTFUponFailure = false; bool fataliseUponFailure = true; // granular management of the fatalisation in async mode + bool allowSharingFirstCluster = false; // allow first cluster sharing among tracks O2ParamDef(TrackerParamConfig, "ITSCATrackerParam"); }; diff --git a/Detectors/ITSMFT/ITS/tracking/src/TrackerTraits.cxx b/Detectors/ITSMFT/ITS/tracking/src/TrackerTraits.cxx index 46a64adf5fa2f..65207f20120c9 100644 --- a/Detectors/ITSMFT/ITS/tracking/src/TrackerTraits.cxx +++ b/Detectors/ITSMFT/ITS/tracking/src/TrackerTraits.cxx @@ -718,6 +718,9 @@ void TrackerTraits::processNeighbours(int iLayer, int iLevel, const bou template void TrackerTraits::findRoads(const int iteration) { + std::vector> firstClusters, sharedFirstClusters; + firstClusters.resize(mTrkParams[iteration].NLayers); + sharedFirstClusters.resize(mTrkParams[iteration].NLayers); for (int startLevel{mTrkParams[iteration].CellsPerRoad()}; startLevel >= mTrkParams[iteration].CellMinimumLevel(); --startLevel) { auto seedFilter = [&](const auto& seed) { @@ -827,15 +830,22 @@ void TrackerTraits::findRoads(const int iteration) for (auto& track : tracks) { int nShared = 0; bool isFirstShared{false}; + int firstLayer{-1}, firstCluster{-1}; for (int iLayer{0}; iLayer < mTrkParams[0].NLayers; ++iLayer) { if (track.getClusterIndex(iLayer) == constants::UnusedIndex) { continue; } - nShared += int(mTimeFrame->isClusterUsed(iLayer, track.getClusterIndex(iLayer))); - isFirstShared |= !iLayer && mTimeFrame->isClusterUsed(iLayer, track.getClusterIndex(iLayer)); + bool isShared = mTimeFrame->isClusterUsed(iLayer, track.getClusterIndex(iLayer)); + nShared += int(isShared); + if (firstLayer < 0) { + firstCluster = track.getClusterIndex(iLayer); + isFirstShared = isShared && mTrkParams[0].AllowSharingFirstCluster && std::find(firstClusters[iLayer].begin(), firstClusters[iLayer].end(), firstCluster) != firstClusters[iLayer].end(); + firstLayer = iLayer; + } } - if (nShared > mTrkParams[0].ClusterSharing) { + /// do not account for the first cluster in the shared clusters number if it is allowed + if (nShared - int(isFirstShared && mTrkParams[0].AllowSharingFirstCluster) > mTrkParams[0].ClusterSharing) { continue; } @@ -864,6 +874,33 @@ void TrackerTraits::findRoads(const int iteration) track.setNextROFbit(); } mTimeFrame->getTracks(o2::gpu::CAMath::Min(rofs[0], rofs[1])).emplace_back(track); + + firstClusters[firstLayer].push_back(firstCluster); + if (isFirstShared) { + sharedFirstClusters[firstLayer].push_back(firstCluster); + } + } + } + + /// Now we have to set the shared cluster flag + for (int iLayer{0}; iLayer < mTrkParams[0].NLayers; ++iLayer) { + std::sort(sharedFirstClusters[iLayer].begin(), sharedFirstClusters[iLayer].end()); + } + + for (int iROF{0}; iROF < mTimeFrame->getNrof(); ++iROF) { + for (auto& track : mTimeFrame->getTracks(iROF)) { + int firstLayer{mTrkParams[0].NLayers}, firstCluster{constants::its::UnusedIndex}; + for (int iLayer{0}; iLayer < mTrkParams[0].NLayers; ++iLayer) { + if (track.getClusterIndex(iLayer) == constants::its::UnusedIndex) { + continue; + } + firstLayer = iLayer; + firstCluster = track.getClusterIndex(iLayer); + break; + } + if (std::binary_search(sharedFirstClusters[firstLayer].begin(), sharedFirstClusters[firstLayer].end(), firstCluster)) { + track.setSharedClusters(); + } } } } From f99167a8ee01fb09beec58e2b10c7c64c0aca9fe Mon Sep 17 00:00:00 2001 From: fchinu Date: Mon, 22 Sep 2025 09:54:01 +0200 Subject: [PATCH 2/3] Implement modifications from #14432 --- Detectors/ITSMFT/ITS/tracking/src/Configuration.cxx | 1 + Detectors/ITSMFT/ITS/tracking/src/TrackerTraits.cxx | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Detectors/ITSMFT/ITS/tracking/src/Configuration.cxx b/Detectors/ITSMFT/ITS/tracking/src/Configuration.cxx index 6af66b18a2878..df736b3c7efdb 100644 --- a/Detectors/ITSMFT/ITS/tracking/src/Configuration.cxx +++ b/Detectors/ITSMFT/ITS/tracking/src/Configuration.cxx @@ -194,6 +194,7 @@ std::vector TrackingMode::getTrackingParameters(TrackingMode p.DropTFUponFailure = tc.dropTFUponFailure; p.SaveTimeBenchmarks = tc.saveTimeBenchmarks; p.FataliseUponFailure = tc.fataliseUponFailure; + p.AllowSharingFirstCluster = tc.allowSharingFirstCluster; 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 65207f20120c9..81d5f5056016b 100644 --- a/Detectors/ITSMFT/ITS/tracking/src/TrackerTraits.cxx +++ b/Detectors/ITSMFT/ITS/tracking/src/TrackerTraits.cxx @@ -889,9 +889,9 @@ void TrackerTraits::findRoads(const int iteration) for (int iROF{0}; iROF < mTimeFrame->getNrof(); ++iROF) { for (auto& track : mTimeFrame->getTracks(iROF)) { - int firstLayer{mTrkParams[0].NLayers}, firstCluster{constants::its::UnusedIndex}; + int firstLayer{mTrkParams[0].NLayers}, firstCluster{constants::UnusedIndex}; for (int iLayer{0}; iLayer < mTrkParams[0].NLayers; ++iLayer) { - if (track.getClusterIndex(iLayer) == constants::its::UnusedIndex) { + if (track.getClusterIndex(iLayer) == constants::UnusedIndex) { continue; } firstLayer = iLayer; From 4745b3241bd66d97eb2c7a55135ae83eddd27296 Mon Sep 17 00:00:00 2001 From: fchinu Date: Tue, 23 Sep 2025 14:53:40 +0200 Subject: [PATCH 3/3] Move to bounded_vector --- Detectors/ITSMFT/ITS/tracking/src/TrackerTraits.cxx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Detectors/ITSMFT/ITS/tracking/src/TrackerTraits.cxx b/Detectors/ITSMFT/ITS/tracking/src/TrackerTraits.cxx index 81d5f5056016b..3a58ad1c000b7 100644 --- a/Detectors/ITSMFT/ITS/tracking/src/TrackerTraits.cxx +++ b/Detectors/ITSMFT/ITS/tracking/src/TrackerTraits.cxx @@ -718,7 +718,8 @@ void TrackerTraits::processNeighbours(int iLayer, int iLevel, const bou template void TrackerTraits::findRoads(const int iteration) { - std::vector> firstClusters, sharedFirstClusters; + bounded_vector> firstClusters(mTrkParams[iteration].NLayers, bounded_vector(mMemoryPool.get()), mMemoryPool.get()); + bounded_vector> sharedFirstClusters(mTrkParams[iteration].NLayers, bounded_vector(mMemoryPool.get()), mMemoryPool.get()); firstClusters.resize(mTrkParams[iteration].NLayers); sharedFirstClusters.resize(mTrkParams[iteration].NLayers); for (int startLevel{mTrkParams[iteration].CellsPerRoad()}; startLevel >= mTrkParams[iteration].CellMinimumLevel(); --startLevel) {