Skip to content

Commit 234fc20

Browse files
committed
ITS: hole-tracking
Signed-off-by: Felix Schlepper <felix.schlepper@cern.ch>
1 parent 6de72e3 commit 234fc20

9 files changed

Lines changed: 617 additions & 259 deletions

File tree

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

Lines changed: 63 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
#ifndef TRACKINGITSU_INCLUDE_CACELL_H_
1717
#define TRACKINGITSU_INCLUDE_CACELL_H_
1818

19+
#include <cstdint>
20+
1921
#include "ITStracking/Constants.h"
2022
#include "DataFormatsITS/TimeEstBC.h"
2123
#include "ReconstructionDataFormats/Track.h"
@@ -28,7 +30,9 @@ template <int NClusters>
2830
class SeedBase : public o2::track::TrackParCovF
2931
{
3032
public:
31-
GPUhd() int getInnerLayer() const { return getUserField(); }
33+
GPUhd() uint16_t getHitLayerMask() const { return static_cast<uint16_t>(getUserField()); }
34+
GPUhd() void setHitLayerMask(uint16_t mask) { setUserField(mask); }
35+
GPUhd() int getInnerLayer() const { return firstSetBit(getHitLayerMask()); }
3236
GPUhd() int getFirstTrackletIndex() const { return mTracklets[0]; };
3337
GPUhd() void setFirstTrackletIndex(int trkl) { mTracklets[0] = trkl; };
3438
GPUhd() int getSecondTrackletIndex() const { return mTracklets[1]; };
@@ -40,6 +44,26 @@ class SeedBase : public o2::track::TrackParCovF
4044
GPUhd() int* getLevelPtr() { return &mLevel; }
4145
GPUhd() auto& getTimeStamp() noexcept { return mTime; }
4246
GPUhd() const auto& getTimeStamp() const noexcept { return mTime; }
47+
GPUhd() static int firstSetBit(uint16_t mask)
48+
{
49+
for (int layer = 0; layer < 16; ++layer) {
50+
if (mask & (uint16_t(1) << layer)) {
51+
return layer;
52+
}
53+
}
54+
return constants::UnusedIndex;
55+
}
56+
GPUhd() static int layerSlot(uint16_t mask, int layer)
57+
{
58+
if ((mask & (uint16_t(1) << layer)) == 0) {
59+
return constants::UnusedIndex;
60+
}
61+
int slot = 0;
62+
for (int iLayer = 0; iLayer < layer; ++iLayer) {
63+
slot += (mask >> iLayer) & uint16_t(1);
64+
}
65+
return slot;
66+
}
4367

4468
protected:
4569
GPUhdDefault() SeedBase() = default;
@@ -69,11 +93,18 @@ class CellSeed final : public SeedBase<constants::ClustersPerCell>
6993
using Base = SeedBase<constants::ClustersPerCell>;
7094

7195
public:
96+
struct HitLayerMaskTag {
97+
};
98+
7299
GPUhdDefault() CellSeed() = default;
73100
GPUhd() CellSeed(int innerL, int cl0, int cl1, int cl2, int trkl0, int trkl1, const o2::track::TrackParCovF& tpc, float chi2, const TimeEstBC& time)
101+
: CellSeed(HitLayerMaskTag{}, static_cast<uint16_t>((uint16_t(1) << innerL) | (uint16_t(1) << (innerL + 1)) | (uint16_t(1) << (innerL + 2))), cl0, cl1, cl2, trkl0, trkl1, tpc, chi2, time)
102+
{
103+
}
104+
GPUhd() CellSeed(HitLayerMaskTag, uint16_t hitLayerMask, int cl0, int cl1, int cl2, int trkl0, int trkl1, const o2::track::TrackParCovF& tpc, float chi2, const TimeEstBC& time)
74105
: Base(tpc, chi2, 1, time)
75106
{
76-
setUserField(innerL);
107+
setHitLayerMask(hitLayerMask);
77108
auto& clusters = this->clustersRaw();
78109
clusters[0] = cl0;
79110
clusters[1] = cl1;
@@ -92,12 +123,12 @@ class CellSeed final : public SeedBase<constants::ClustersPerCell>
92123
GPUhd() int getThirdClusterIndex() const { return this->clustersRaw()[2]; };
93124
GPUhd() auto& getClusters() { return this->clustersRaw(); }
94125
GPUhd() const auto& getClusters() const { return this->clustersRaw(); }
95-
/// getCluster takes an ABSOLUTE layer index and returns UnusedIndex if the
96-
/// layer is outside the 3 stored slots (innerL, innerL+1, innerL+2).
126+
/// getCluster takes an ABSOLUTE layer index. Compact cluster slots are
127+
/// mapped to absolute layers by set-bit order in the hit-layer mask.
97128
GPUhd() int getCluster(int layer) const
98129
{
99-
const int rel = layer - getInnerLayer();
100-
return (rel >= 0 && rel < constants::ClustersPerCell) ? this->clustersRaw()[rel] : constants::UnusedIndex;
130+
const int slot = Base::layerSlot(getHitLayerMask(), layer);
131+
return (slot >= 0 && slot < constants::ClustersPerCell) ? this->clustersRaw()[slot] : constants::UnusedIndex;
101132
}
102133
};
103134

@@ -114,29 +145,45 @@ class TrackSeed final : public SeedBase<NLayers>
114145
GPUhd() TrackSeed(const CellSeed& cs)
115146
: Base(static_cast<const o2::track::TrackParCovF&>(cs), cs.getChi2(), cs.getLevel(), cs.getTimeStamp())
116147
{
117-
this->setUserField(cs.getInnerLayer());
148+
this->setHitLayerMask(cs.getHitLayerMask());
118149
this->setFirstTrackletIndex(cs.getFirstTrackletIndex());
119150
this->setSecondTrackletIndex(cs.getSecondTrackletIndex());
120-
const int innerL = cs.getInnerLayer();
121151
auto& clusters = this->clustersRaw();
122-
clusters[innerL + 0] = cs.getFirstClusterIndex();
123-
clusters[innerL + 1] = cs.getSecondClusterIndex();
124-
clusters[innerL + 2] = cs.getThirdClusterIndex();
152+
int slot = 0;
153+
const uint16_t hitMask = cs.getHitLayerMask();
154+
for (int layer = 0; layer < NLayers; ++layer) {
155+
if (hitMask & (uint16_t(1) << layer)) {
156+
clusters[layer] = cs.getClusters()[slot++];
157+
}
158+
}
125159
}
126160
GPUhdDefault() TrackSeed(const TrackSeed&) = default;
127161
GPUhdDefault() ~TrackSeed() = default;
128162
GPUhdDefault() TrackSeed(TrackSeed&&) = default;
129163
GPUhdDefault() TrackSeed& operator=(const TrackSeed&) = default;
130164
GPUhdDefault() TrackSeed& operator=(TrackSeed&&) = default;
131165

132-
/// Three-cluster view of the original cell — note: innerL (UserField) is not
133-
/// updated when processNeighbours extends the cluster list leftward.
134-
GPUhd() int getFirstClusterIndex() const { return this->clustersRaw()[this->getUserField()]; }
135-
GPUhd() int getSecondClusterIndex() const { return this->clustersRaw()[this->getUserField() + 1]; }
136-
GPUhd() int getThirdClusterIndex() const { return this->clustersRaw()[this->getUserField() + 2]; }
166+
GPUhd() int getFirstClusterIndex() const { return getClusterBySlot(0); }
167+
GPUhd() int getSecondClusterIndex() const { return getClusterBySlot(1); }
168+
GPUhd() int getThirdClusterIndex() const { return getClusterBySlot(2); }
137169
GPUhd() auto& getClusters() { return this->clustersRaw(); }
138170
GPUhd() const auto& getClusters() const { return this->clustersRaw(); }
139171
GPUhd() int getCluster(int layer) const { return this->clustersRaw()[layer]; }
172+
173+
private:
174+
GPUhd() int getClusterBySlot(int requestedSlot) const
175+
{
176+
int slot = 0;
177+
const uint16_t hitMask = this->getHitLayerMask();
178+
for (int layer = 0; layer < NLayers; ++layer) {
179+
if (hitMask & (uint16_t(1) << layer)) {
180+
if (slot++ == requestedSlot) {
181+
return this->clustersRaw()[layer];
182+
}
183+
}
184+
}
185+
return constants::UnusedIndex;
186+
}
140187
};
141188

142189
} // namespace o2::its

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ struct TrackingParameters {
6868
bool AllowSharingFirstCluster = false;
6969
int ClusterSharing = 0;
7070
int MinTrackLength = 7;
71+
int MaxHoles = 0;
72+
uint16_t HoleLayerMask = 0;
7173
float NSigmaCut = 5;
7274
float PVres = 1.e-2f;
7375
/// Trackleting cuts

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
#include "ITStracking/ExternalAllocator.h"
3333
#include "ITStracking/BoundedAllocator.h"
3434
#include "ITStracking/ROFLookupTables.h"
35+
#include "ITStracking/TrackingTopology.h"
3536
#include "SimulationDataFormat/MCCompLabel.h"
3637
#include "SimulationDataFormat/MCTruthContainer.h"
3738

@@ -66,6 +67,7 @@ struct TimeFrame {
6667
using ROFOverlapTableN = ROFOverlapTable<NLayers>;
6768
using ROFVertexLookupTableN = ROFVertexLookupTable<NLayers>;
6869
using ROFMaskTableN = ROFMaskTable<NLayers>;
70+
using TrackingTopologyN = TrackingTopology<NLayers>;
6971
using TrackSeedN = TrackSeed<NLayers>;
7072
friend class gpu::TimeFrameGPU<NLayers>;
7173

@@ -135,6 +137,8 @@ struct TimeFrame {
135137
const auto& getIndexTableUtils() const { return mIndexTableUtils; }
136138
const auto& getROFOverlapTable() const { return mROFOverlapTable; }
137139
const auto& getROFOverlapTableView() const { return mROFOverlapTableView; }
140+
const auto& getTrackingTopology() const { return mTrackingTopology; }
141+
const auto& getTrackingTopologyView() const { return mTrackingTopologyView; }
138142
void setROFOverlapTable(ROFOverlapTableN table)
139143
{
140144
mROFOverlapTable = std::move(table);
@@ -193,6 +197,7 @@ struct TimeFrame {
193197

194198
auto& getCellsLookupTable() { return mCellsLookupTable; }
195199
auto& getCellsNeighbours() { return mCellsNeighbours; }
200+
auto& getCellsNeighboursTopology() { return mCellsNeighboursTopology; }
196201
auto& getCellsNeighboursLUT() { return mCellsNeighboursLUT; }
197202
auto& getTracks() { return mTracks; }
198203
auto& getTracksLabel() { return mTracksLabel; }
@@ -273,6 +278,7 @@ struct TimeFrame {
273278
bounded_vector<TrackITSExt> mTracks;
274279
bounded_vector<MCCompLabel> mTracksLabel;
275280
std::vector<bounded_vector<int>> mCellsNeighbours;
281+
std::vector<bounded_vector<int>> mCellsNeighboursTopology;
276282
std::vector<bounded_vector<int>> mCellsLookupTable;
277283

278284
const o2::base::PropagatorImpl<float>* mPropagatorDevice = nullptr; // Needed only for GPU
@@ -319,6 +325,8 @@ struct TimeFrame {
319325
IndexTableUtilsN mIndexTableUtils;
320326
ROFOverlapTableN mROFOverlapTable;
321327
ROFOverlapTableN::View mROFOverlapTableView;
328+
TrackingTopologyN mTrackingTopology;
329+
TrackingTopologyN::View mTrackingTopologyView;
322330
ROFVertexLookupTableN mROFVertexLookupTable;
323331
ROFVertexLookupTableN::View mROFVertexLookupTableView;
324332
ROFMaskTableN mMultiplicityCutMask;

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ class TrackerTraits
5353
virtual void findRoads(const int iteration);
5454

5555
template <typename InputSeed>
56-
void processNeighbours(int iteration, int iLayer, int iLevel, const bounded_vector<InputSeed>& currentCellSeed, const bounded_vector<int>& currentCellId, bounded_vector<TrackSeedN>& updatedCellSeed, bounded_vector<int>& updatedCellId);
56+
void processNeighbours(int iteration, int defaultCellTopologyId, int iLevel, const bounded_vector<InputSeed>& currentCellSeed, const bounded_vector<int>& currentCellId, const bounded_vector<int>& currentCellTopologyId, bounded_vector<TrackSeedN>& updatedCellSeed, bounded_vector<int>& updatedCellId, bounded_vector<int>& updatedCellTopologyId);
5757

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);

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,8 @@ struct TrackerParamConfig : public o2::conf::ConfigurableParamHelper<TrackerPara
7171
int addTimeError[7] = {0}; // configure the width of the window in BC to be considered for the tracking.
7272
int minTrackLgtIter[constants::MaxIter] = {}; // minimum track length at each iteration, used only if >0, otherwise use code defaults
7373
uint8_t startLayerMask[constants::MaxIter] = {}; // mask of start layer for this iteration (if >0)
74+
int maxHolesIter[constants::MaxIter] = {}; // maximum number of missing internal layers allowed in the CA topology for each iteration
75+
uint16_t holeLayerMaskIter[constants::MaxIter] = {}; // layers that may be skipped by the CA topology for each iteration
7476
float minPtIterLgt[constants::MaxIter * (MaxTrackLength - MinTrackLength + 1)] = {}; // min.pT for given track length at this iteration, used only if >0, otherwise use code defaults
7577
float sysErrY2[7] = {0}; // systematic error^2 in Y per layer
7678
float sysErrZ2[7] = {0}; // systematic error^2 in Z per layer

0 commit comments

Comments
 (0)