Skip to content

Commit bf44a8f

Browse files
fchinumpuccio
andauthored
ITS: allow sharing of innermost cluster among tracks (#14684)
* feat: allow sharing of first cluster in ITS tracking * Implement modifications from #14432 * Move to bounded_vector --------- Co-authored-by: Maximiliano Puccio <maximiliano.puccio@cern.ch>
1 parent 6c5bbfb commit bf44a8f

File tree

4 files changed

+44
-3
lines changed

4 files changed

+44
-3
lines changed

Detectors/ITSMFT/ITS/tracking/include/ITStracking/Configuration.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ struct TrackingParameters {
5151
float Diamond[3] = {0.f, 0.f, 0.f};
5252

5353
/// General parameters
54+
bool AllowSharingFirstCluster = false;
5455
int ClusterSharing = 0;
5556
int MinTrackLength = 7;
5657
float NSigmaCut = 5;

Detectors/ITSMFT/ITS/tracking/include/ITStracking/TrackingConfigParam.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ struct TrackerParamConfig : public o2::conf::ConfigurableParamHelper<TrackerPara
104104
size_t maxMemory = std::numeric_limits<size_t>::max();
105105
bool dropTFUponFailure = false;
106106
bool fataliseUponFailure = true; // granular management of the fatalisation in async mode
107+
bool allowSharingFirstCluster = false; // allow first cluster sharing among tracks
107108

108109
O2ParamDef(TrackerParamConfig, "ITSCATrackerParam");
109110
};

Detectors/ITSMFT/ITS/tracking/src/Configuration.cxx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,7 @@ std::vector<TrackingParameters> TrackingMode::getTrackingParameters(TrackingMode
194194
p.DropTFUponFailure = tc.dropTFUponFailure;
195195
p.SaveTimeBenchmarks = tc.saveTimeBenchmarks;
196196
p.FataliseUponFailure = tc.fataliseUponFailure;
197+
p.AllowSharingFirstCluster = tc.allowSharingFirstCluster;
197198

198199
if (tc.useMatCorrTGeo) {
199200
p.CorrType = o2::base::PropagatorImpl<float>::MatCorrType::USEMatCorrTGeo;

Detectors/ITSMFT/ITS/tracking/src/TrackerTraits.cxx

Lines changed: 41 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -718,6 +718,10 @@ void TrackerTraits<nLayers>::processNeighbours(int iLayer, int iLevel, const bou
718718
template <int nLayers>
719719
void TrackerTraits<nLayers>::findRoads(const int iteration)
720720
{
721+
bounded_vector<bounded_vector<int>> firstClusters(mTrkParams[iteration].NLayers, bounded_vector<int>(mMemoryPool.get()), mMemoryPool.get());
722+
bounded_vector<bounded_vector<int>> sharedFirstClusters(mTrkParams[iteration].NLayers, bounded_vector<int>(mMemoryPool.get()), mMemoryPool.get());
723+
firstClusters.resize(mTrkParams[iteration].NLayers);
724+
sharedFirstClusters.resize(mTrkParams[iteration].NLayers);
721725
for (int startLevel{mTrkParams[iteration].CellsPerRoad()}; startLevel >= mTrkParams[iteration].CellMinimumLevel(); --startLevel) {
722726

723727
auto seedFilter = [&](const auto& seed) {
@@ -827,15 +831,22 @@ void TrackerTraits<nLayers>::findRoads(const int iteration)
827831
for (auto& track : tracks) {
828832
int nShared = 0;
829833
bool isFirstShared{false};
834+
int firstLayer{-1}, firstCluster{-1};
830835
for (int iLayer{0}; iLayer < mTrkParams[0].NLayers; ++iLayer) {
831836
if (track.getClusterIndex(iLayer) == constants::UnusedIndex) {
832837
continue;
833838
}
834-
nShared += int(mTimeFrame->isClusterUsed(iLayer, track.getClusterIndex(iLayer)));
835-
isFirstShared |= !iLayer && mTimeFrame->isClusterUsed(iLayer, track.getClusterIndex(iLayer));
839+
bool isShared = mTimeFrame->isClusterUsed(iLayer, track.getClusterIndex(iLayer));
840+
nShared += int(isShared);
841+
if (firstLayer < 0) {
842+
firstCluster = track.getClusterIndex(iLayer);
843+
isFirstShared = isShared && mTrkParams[0].AllowSharingFirstCluster && std::find(firstClusters[iLayer].begin(), firstClusters[iLayer].end(), firstCluster) != firstClusters[iLayer].end();
844+
firstLayer = iLayer;
845+
}
836846
}
837847

838-
if (nShared > mTrkParams[0].ClusterSharing) {
848+
/// do not account for the first cluster in the shared clusters number if it is allowed
849+
if (nShared - int(isFirstShared && mTrkParams[0].AllowSharingFirstCluster) > mTrkParams[0].ClusterSharing) {
839850
continue;
840851
}
841852

@@ -864,6 +875,33 @@ void TrackerTraits<nLayers>::findRoads(const int iteration)
864875
track.setNextROFbit();
865876
}
866877
mTimeFrame->getTracks(o2::gpu::CAMath::Min(rofs[0], rofs[1])).emplace_back(track);
878+
879+
firstClusters[firstLayer].push_back(firstCluster);
880+
if (isFirstShared) {
881+
sharedFirstClusters[firstLayer].push_back(firstCluster);
882+
}
883+
}
884+
}
885+
886+
/// Now we have to set the shared cluster flag
887+
for (int iLayer{0}; iLayer < mTrkParams[0].NLayers; ++iLayer) {
888+
std::sort(sharedFirstClusters[iLayer].begin(), sharedFirstClusters[iLayer].end());
889+
}
890+
891+
for (int iROF{0}; iROF < mTimeFrame->getNrof(); ++iROF) {
892+
for (auto& track : mTimeFrame->getTracks(iROF)) {
893+
int firstLayer{mTrkParams[0].NLayers}, firstCluster{constants::UnusedIndex};
894+
for (int iLayer{0}; iLayer < mTrkParams[0].NLayers; ++iLayer) {
895+
if (track.getClusterIndex(iLayer) == constants::UnusedIndex) {
896+
continue;
897+
}
898+
firstLayer = iLayer;
899+
firstCluster = track.getClusterIndex(iLayer);
900+
break;
901+
}
902+
if (std::binary_search(sharedFirstClusters[firstLayer].begin(), sharedFirstClusters[firstLayer].end(), firstCluster)) {
903+
track.setSharedClusters();
904+
}
867905
}
868906
}
869907
}

0 commit comments

Comments
 (0)