Skip to content

Commit 61247c8

Browse files
mpucciofchinu
authored andcommitted
feat: allow sharing of first cluster in ITS tracking
1 parent 28eb74a commit 61247c8

File tree

3 files changed

+42
-4
lines changed

3 files changed

+42
-4
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/TrackerTraits.cxx

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -763,7 +763,9 @@ template <int nLayers>
763763
void TrackerTraits<nLayers>::findRoads(const int iteration)
764764
{
765765
CA_DEBUGGER(std::cout << "Finding roads, iteration " << iteration << std::endl);
766-
766+
std::vector<std::vector<int>> firstClusters, sharedFirstClusters;
767+
firstClusters.resize(mTrkParams[iteration].NLayers);
768+
sharedFirstClusters.resize(mTrkParams[iteration].NLayers);
767769
for (int startLevel{mTrkParams[iteration].CellsPerRoad()}; startLevel >= mTrkParams[iteration].CellMinimumLevel(); --startLevel) {
768770
CA_DEBUGGER(std::cout << "\t > Processing level " << startLevel << std::endl);
769771
auto seedFilter = [&](const auto& seed) {
@@ -880,15 +882,22 @@ void TrackerTraits<nLayers>::findRoads(const int iteration)
880882
for (auto& track : tracks) {
881883
int nShared = 0;
882884
bool isFirstShared{false};
885+
int firstLayer{-1}, firstCluster{-1};
883886
for (int iLayer{0}; iLayer < mTrkParams[0].NLayers; ++iLayer) {
884887
if (track.getClusterIndex(iLayer) == constants::UnusedIndex) {
885888
continue;
886889
}
887-
nShared += int(mTimeFrame->isClusterUsed(iLayer, track.getClusterIndex(iLayer)));
888-
isFirstShared |= !iLayer && mTimeFrame->isClusterUsed(iLayer, track.getClusterIndex(iLayer));
890+
bool isShared = mTimeFrame->isClusterUsed(iLayer, track.getClusterIndex(iLayer));
891+
nShared += int(isShared);
892+
if (firstLayer < 0) {
893+
firstCluster = track.getClusterIndex(iLayer);
894+
isFirstShared = isShared && mTrkParams[0].AllowSharingFirstCluster && std::find(firstClusters[iLayer].begin(), firstClusters[iLayer].end(), firstCluster) != firstClusters[iLayer].end();
895+
firstLayer = iLayer;
896+
}
889897
}
890898

891-
if (nShared > mTrkParams[0].ClusterSharing) {
899+
/// do not account for the first cluster in the shared clusters number if it is allowed
900+
if (nShared - int(isFirstShared && mTrkParams[0].AllowSharingFirstCluster) > mTrkParams[0].ClusterSharing) {
892901
continue;
893902
}
894903

@@ -917,6 +926,33 @@ void TrackerTraits<nLayers>::findRoads(const int iteration)
917926
track.setNextROFbit();
918927
}
919928
mTimeFrame->getTracks(o2::gpu::CAMath::Min(rofs[0], rofs[1])).emplace_back(track);
929+
930+
firstClusters[firstLayer].push_back(firstCluster);
931+
if (isFirstShared) {
932+
sharedFirstClusters[firstLayer].push_back(firstCluster);
933+
}
934+
}
935+
}
936+
937+
/// Now we have to set the shared cluster flag
938+
for (int iLayer{0}; iLayer < mTrkParams[0].NLayers; ++iLayer) {
939+
std::sort(sharedFirstClusters[iLayer].begin(), sharedFirstClusters[iLayer].end());
940+
}
941+
942+
for (int iROF{0}; iROF < mTimeFrame->getNrof(); ++iROF) {
943+
for (auto& track : mTimeFrame->getTracks(iROF)) {
944+
int firstLayer{mTrkParams[0].NLayers}, firstCluster{constants::its::UnusedIndex};
945+
for (int iLayer{0}; iLayer < mTrkParams[0].NLayers; ++iLayer) {
946+
if (track.getClusterIndex(iLayer) == constants::its::UnusedIndex) {
947+
continue;
948+
}
949+
firstLayer = iLayer;
950+
firstCluster = track.getClusterIndex(iLayer);
951+
break;
952+
}
953+
if (std::binary_search(sharedFirstClusters[firstLayer].begin(), sharedFirstClusters[firstLayer].end(), firstCluster)) {
954+
track.setSharedClusters();
955+
}
920956
}
921957
}
922958
}

0 commit comments

Comments
 (0)