@@ -763,7 +763,9 @@ template <int nLayers>
763763void 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