Skip to content

Commit 76f1424

Browse files
committed
ITS: add selections on tracks sharing clusters
1 parent 75f2eef commit 76f1424

6 files changed

Lines changed: 61 additions & 11 deletions

File tree

DataFormats/Detectors/ITSMFT/ITS/include/DataFormatsITS/TrackITS.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,12 @@ class TrackITSExt : public TrackITS
194194

195195
GPUhdi() const int& getClusterIndex(int lr) const { return mIndex[lr]; }
196196

197+
GPUh() const int& getFirstLayerClusterIndex() const
198+
{
199+
int firstLayer = getFirstClusterLayer();
200+
return getClusterIndex(firstLayer);
201+
}
202+
197203
GPUhdi() void setExternalClusterIndex(int layer, int idx, bool newCluster = false)
198204
{
199205
if (newCluster) {

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,11 @@ struct TrackingParameters {
7979
bool PrintMemory = false; // print allocator usage in epilog report
8080
size_t MaxMemory = std::numeric_limits<size_t>::max();
8181
bool DropTFUponFailure = false;
82+
83+
// Selections on tracks sharing clusters
84+
float SharedClusterMaxDeltaPhi = 0.05f; // For tracks sharing clusters, maximum allowed delta phi at the cluster position
85+
float SharedClusterMaxDeltaEta = 0.03f; // For tracks sharing clusters, maximum allowed delta eta at the cluster position
86+
bool SharedClusterOppositeSign = false; // For tracks sharing clusters, require opposite sign of the tracklets
8287
};
8388

8489
struct VertexingParameters {

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ class TrackerTraits
5959
void acceptTracks(int iteration, bounded_vector<TrackITSExt>& tracks, bounded_vector<bounded_vector<int>>& firstClusters, bounded_vector<bounded_vector<int>>& sharedFirstClusters);
6060
void markTracks(int iteration, bounded_vector<bounded_vector<int>>& sharedFirstClusters);
6161

62+
bool areTracksSelected(int iteration, const TrackITSExt& t1, const TrackITSExt& t2);
63+
6264
void updateTrackingParameters(const std::vector<TrackingParameters>& trkPars)
6365
{
6466
mTrkParams = trkPars;

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,11 @@ struct TrackerParamConfig : public o2::conf::ConfigurableParamHelper<TrackerPara
102102
bool fataliseUponFailure = true; // granular management of the fatalisation in async mode
103103
bool allowSharingFirstCluster = false; // allow first cluster sharing among tracks
104104

105+
// Selections on tracks sharing clusters
106+
float sharedClusterMaxDeltaPhi = 0.05f; // Maximum allowed delta phi at the cluster position
107+
float sharedClusterMaxDeltaEta = 0.03f; // Maximum allowed delta eta at the cluster position
108+
bool sharedClusterOppositeSign = false; // Require opposite sign of the tracklets
109+
105110
O2ParamDef(TrackerParamConfig, "ITSCATrackerParam");
106111
};
107112

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,9 @@ std::vector<TrackingParameters> TrackingMode::getTrackingParameters(TrackingMode
196196
p.SaveTimeBenchmarks = tc.saveTimeBenchmarks;
197197
p.FataliseUponFailure = tc.fataliseUponFailure;
198198
p.AllowSharingFirstCluster = tc.allowSharingFirstCluster;
199+
p.SharedClusterMaxDeltaPhi = tc.sharedClusterMaxDeltaPhi;
200+
p.SharedClusterMaxDeltaEta = tc.sharedClusterMaxDeltaEta;
201+
p.SharedClusterOppositeSign = tc.sharedClusterOppositeSign;
199202

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

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

Lines changed: 40 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -856,23 +856,52 @@ void TrackerTraits<NLayers>::markTracks(int iteration, bounded_vector<bounded_ve
856856
std::sort(sharedFirstClusters[iLayer].begin(), sharedFirstClusters[iLayer].end());
857857
}
858858

859-
for (auto& track : mTimeFrame->getTracks()) {
860-
int firstLayer{mTrkParams[iteration].NLayers}, firstCluster{constants::UnusedIndex};
861-
for (int iLayer{0}; iLayer < mTrkParams[iteration].NLayers; ++iLayer) {
862-
if (track.getClusterIndex(iLayer) == constants::UnusedIndex) {
863-
continue;
864-
}
865-
firstLayer = iLayer;
866-
firstCluster = track.getClusterIndex(iLayer);
867-
break;
868-
}
859+
auto& tracks = mTimeFrame->getTracks();
860+
std::sort(tracks.begin(), tracks.end(), [](const auto& t1, const auto& t2) {
861+
return t1.getFirstLayerClusterIndex() < t2.getFirstLayerClusterIndex();
862+
});
863+
864+
for (int i{0}; i < static_cast<int>(tracks.size()); ++i) {
865+
auto& track = tracks[i];
866+
int firstLayer{track.getFirstClusterLayer()}, firstCluster{track.getFirstLayerClusterIndex()};
869867
if (std::binary_search(sharedFirstClusters[firstLayer].begin(), sharedFirstClusters[firstLayer].end(), firstCluster)) {
870-
track.setSharedClusters();
868+
int j = i + 1;
869+
while (j < static_cast<int>(tracks.size()) && tracks[j].getFirstLayerClusterIndex() == firstCluster) {
870+
auto& track2 = tracks[j];
871+
if (areTracksSelected(iteration, track, track2)) {
872+
for (int iLayer{track.getFirstClusterLayer()}; iLayer < track.getFirstClusterLayer() + track.getNClusters(); ++iLayer) {
873+
}
874+
for (int iLayer{track2.getFirstClusterLayer()}; iLayer < track2.getFirstClusterLayer() + track2.getNClusters(); ++iLayer) {
875+
}
876+
track.setSharedClusters();
877+
track2.setSharedClusters();
878+
}
879+
++j;
880+
}
871881
}
872882
}
873883
}
874884
}
875885

886+
template <int NLayers>
887+
bool TrackerTraits<NLayers>::areTracksSelected(int iteration, const TrackITSExt& t1, const TrackITSExt& t2)
888+
{
889+
const auto t1FirstLayer{t1.getFirstClusterLayer()}, t2FirstLayer{t2.getFirstClusterLayer()};
890+
if (mTimeFrame->getClusterROF(t1FirstLayer, t1.getClusterIndex(t1FirstLayer)) != mTimeFrame->getClusterROF(t2FirstLayer, t2.getClusterIndex(t2FirstLayer))) {
891+
return false;
892+
}
893+
if (o2::math_utils::detail::deltaPhiSmall(t1.getPhi(), t2.getPhi()) > mTrkParams[iteration].SharedClusterMaxDeltaPhi) {
894+
return false;
895+
}
896+
if (std::abs(t1.getEta() - t2.getEta()) > mTrkParams[iteration].SharedClusterMaxDeltaEta) {
897+
return false;
898+
}
899+
if (mTrkParams[iteration].SharedClusterOppositeSign && t1.getSign() == t2.getSign()) {
900+
return false;
901+
}
902+
return true;
903+
}
904+
876905
template <int NLayers>
877906
void TrackerTraits<NLayers>::setBz(float bz)
878907
{

0 commit comments

Comments
 (0)