Skip to content

Commit 318837b

Browse files
committed
ITS: add selections on tracks sharing clusters
1 parent 2487a80 commit 318837b

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
@@ -98,6 +98,11 @@ struct TrackingParameters {
9898
bool PrintMemory = false; // print allocator usage in epilog report
9999
size_t MaxMemory = std::numeric_limits<size_t>::max();
100100
bool DropTFUponFailure = false;
101+
102+
// Selections on tracks sharing clusters
103+
float SharedClusterMaxDeltaPhi = 0.05f; // For tracks sharing clusters, maximum allowed delta phi at the cluster position
104+
float SharedClusterMaxDeltaEta = 0.03f; // For tracks sharing clusters, maximum allowed delta eta at the cluster position
105+
bool SharedClusterOppositeSign = false; // For tracks sharing clusters, require opposite sign of the tracklets
101106
};
102107

103108
struct VertexingParameters {

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

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

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

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

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

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

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,9 @@ std::vector<TrackingParameters> TrackingMode::getTrackingParameters(TrackingMode
204204
p.SaveTimeBenchmarks = tc.saveTimeBenchmarks;
205205
p.FataliseUponFailure = tc.fataliseUponFailure;
206206
p.AllowSharingFirstCluster = tc.allowSharingFirstCluster;
207+
p.SharedClusterMaxDeltaPhi = tc.sharedClusterMaxDeltaPhi;
208+
p.SharedClusterMaxDeltaEta = tc.sharedClusterMaxDeltaEta;
209+
p.SharedClusterOppositeSign = tc.sharedClusterOppositeSign;
207210
const auto iter = &p - trackParams.data();
208211
if (iter < constants::MaxIter) {
209212
p.MaxHoles = tc.maxHolesIter[iter];

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

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

879-
for (auto& track : mTimeFrame->getTracks()) {
880-
int firstLayer{mTrkParams[iteration].NLayers}, firstCluster{constants::UnusedIndex};
881-
for (int iLayer{0}; iLayer < mTrkParams[iteration].NLayers; ++iLayer) {
882-
if (track.getClusterIndex(iLayer) == constants::UnusedIndex) {
883-
continue;
884-
}
885-
firstLayer = iLayer;
886-
firstCluster = track.getClusterIndex(iLayer);
887-
break;
888-
}
879+
auto& tracks = mTimeFrame->getTracks();
880+
std::sort(tracks.begin(), tracks.end(), [](const auto& t1, const auto& t2) {
881+
return t1.getFirstLayerClusterIndex() < t2.getFirstLayerClusterIndex();
882+
});
883+
884+
for (int i{0}; i < static_cast<int>(tracks.size()); ++i) {
885+
auto& track = tracks[i];
886+
int firstLayer{track.getFirstClusterLayer()}, firstCluster{track.getFirstLayerClusterIndex()};
889887
if (std::binary_search(sharedFirstClusters[firstLayer].begin(), sharedFirstClusters[firstLayer].end(), firstCluster)) {
890-
track.setSharedClusters();
888+
int j = i + 1;
889+
while (j < static_cast<int>(tracks.size()) && tracks[j].getFirstLayerClusterIndex() == firstCluster) {
890+
auto& track2 = tracks[j];
891+
if (areTracksSelected(iteration, track, track2)) {
892+
for (int iLayer{track.getFirstClusterLayer()}; iLayer < track.getFirstClusterLayer() + track.getNClusters(); ++iLayer) {
893+
}
894+
for (int iLayer{track2.getFirstClusterLayer()}; iLayer < track2.getFirstClusterLayer() + track2.getNClusters(); ++iLayer) {
895+
}
896+
track.setSharedClusters();
897+
track2.setSharedClusters();
898+
}
899+
++j;
900+
}
891901
}
892902
}
893903
}
894904
}
895905

906+
template <int NLayers>
907+
bool TrackerTraits<NLayers>::areTracksSelected(int iteration, const TrackITSExt& t1, const TrackITSExt& t2)
908+
{
909+
const auto t1FirstLayer{t1.getFirstClusterLayer()}, t2FirstLayer{t2.getFirstClusterLayer()};
910+
if (mTimeFrame->getClusterROF(t1FirstLayer, t1.getClusterIndex(t1FirstLayer)) != mTimeFrame->getClusterROF(t2FirstLayer, t2.getClusterIndex(t2FirstLayer))) {
911+
return false;
912+
}
913+
if (o2::math_utils::detail::deltaPhiSmall(t1.getPhi(), t2.getPhi()) > mTrkParams[iteration].SharedClusterMaxDeltaPhi) {
914+
return false;
915+
}
916+
if (std::abs(t1.getEta() - t2.getEta()) > mTrkParams[iteration].SharedClusterMaxDeltaEta) {
917+
return false;
918+
}
919+
if (mTrkParams[iteration].SharedClusterOppositeSign && t1.getSign() == t2.getSign()) {
920+
return false;
921+
}
922+
return true;
923+
}
924+
896925
template <int NLayers>
897926
void TrackerTraits<NLayers>::setBz(float bz)
898927
{

0 commit comments

Comments
 (0)