Skip to content

Commit fdd851c

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

11 files changed

Lines changed: 670 additions & 291 deletions

File tree

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

Lines changed: 50 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,14 @@
1616
#ifndef TRACKINGITSU_INCLUDE_CACELL_H_
1717
#define TRACKINGITSU_INCLUDE_CACELL_H_
1818

19+
#include <cstdint>
20+
1921
#include "ITStracking/Constants.h"
22+
#include "ITStracking/MathUtils.h"
2023
#include "DataFormatsITS/TimeEstBC.h"
2124
#include "ReconstructionDataFormats/Track.h"
2225
#include "GPUCommonDef.h"
26+
#include "GPUCommonMath.h"
2327

2428
namespace o2::its
2529
{
@@ -28,7 +32,9 @@ template <int NClusters>
2832
class SeedBase : public o2::track::TrackParCovF
2933
{
3034
public:
31-
GPUhd() int getInnerLayer() const { return getUserField(); }
35+
GPUhd() uint16_t getHitLayerMask() const { return static_cast<uint16_t>(getUserField()); }
36+
GPUhd() void setHitLayerMask(uint16_t mask) { setUserField(mask); }
37+
GPUhd() int getInnerLayer() const { return math_utils::firstSetBit(getHitLayerMask()); }
3238
GPUhd() int getFirstTrackletIndex() const { return mTracklets[0]; };
3339
GPUhd() void setFirstTrackletIndex(int trkl) { mTracklets[0] = trkl; };
3440
GPUhd() int getSecondTrackletIndex() const { return mTracklets[1]; };
@@ -40,6 +46,14 @@ class SeedBase : public o2::track::TrackParCovF
4046
GPUhd() int* getLevelPtr() { return &mLevel; }
4147
GPUhd() auto& getTimeStamp() noexcept { return mTime; }
4248
GPUhd() const auto& getTimeStamp() const noexcept { return mTime; }
49+
GPUhdi() static int layerSlot(uint16_t mask, int layer)
50+
{
51+
if ((mask & (uint16_t(1) << layer)) == 0) {
52+
return constants::UnusedIndex;
53+
}
54+
const uint32_t lowerLayers = (uint32_t(1) << layer) - 1;
55+
return static_cast<int>(o2::gpu::GPUCommonMath::Popcount(static_cast<uint32_t>(mask) & lowerLayers));
56+
}
4357

4458
protected:
4559
GPUhdDefault() SeedBase() = default;
@@ -71,9 +85,13 @@ class CellSeed final : public SeedBase<constants::ClustersPerCell>
7185
public:
7286
GPUhdDefault() CellSeed() = default;
7387
GPUhd() CellSeed(int innerL, int cl0, int cl1, int cl2, int trkl0, int trkl1, const o2::track::TrackParCovF& tpc, float chi2, const TimeEstBC& time)
88+
: CellSeed(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)
89+
{
90+
}
91+
GPUhd() CellSeed(uint16_t hitLayerMask, int cl0, int cl1, int cl2, int trkl0, int trkl1, const o2::track::TrackParCovF& tpc, float chi2, const TimeEstBC& time)
7492
: Base(tpc, chi2, 1, time)
7593
{
76-
setUserField(innerL);
94+
setHitLayerMask(hitLayerMask);
7795
auto& clusters = this->clustersRaw();
7896
clusters[0] = cl0;
7997
clusters[1] = cl1;
@@ -92,12 +110,12 @@ class CellSeed final : public SeedBase<constants::ClustersPerCell>
92110
GPUhd() int getThirdClusterIndex() const { return this->clustersRaw()[2]; };
93111
GPUhd() auto& getClusters() { return this->clustersRaw(); }
94112
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).
113+
/// getCluster takes an ABSOLUTE layer index. Compact cluster slots are
114+
/// mapped to absolute layers by set-bit order in the hit-layer mask.
97115
GPUhd() int getCluster(int layer) const
98116
{
99-
const int rel = layer - getInnerLayer();
100-
return (rel >= 0 && rel < constants::ClustersPerCell) ? this->clustersRaw()[rel] : constants::UnusedIndex;
117+
const int slot = Base::layerSlot(getHitLayerMask(), layer);
118+
return (slot >= 0 && slot < constants::ClustersPerCell) ? this->clustersRaw()[slot] : constants::UnusedIndex;
101119
}
102120
};
103121

@@ -114,29 +132,45 @@ class TrackSeed final : public SeedBase<NLayers>
114132
GPUhd() TrackSeed(const CellSeed& cs)
115133
: Base(static_cast<const o2::track::TrackParCovF&>(cs), cs.getChi2(), cs.getLevel(), cs.getTimeStamp())
116134
{
117-
this->setUserField(cs.getInnerLayer());
135+
this->setHitLayerMask(cs.getHitLayerMask());
118136
this->setFirstTrackletIndex(cs.getFirstTrackletIndex());
119137
this->setSecondTrackletIndex(cs.getSecondTrackletIndex());
120-
const int innerL = cs.getInnerLayer();
121138
auto& clusters = this->clustersRaw();
122-
clusters[innerL + 0] = cs.getFirstClusterIndex();
123-
clusters[innerL + 1] = cs.getSecondClusterIndex();
124-
clusters[innerL + 2] = cs.getThirdClusterIndex();
139+
int slot = 0;
140+
const uint16_t hitMask = cs.getHitLayerMask();
141+
for (int layer = 0; layer < NLayers; ++layer) {
142+
if (hitMask & (uint16_t(1) << layer)) {
143+
clusters[layer] = cs.getClusters()[slot++];
144+
}
145+
}
125146
}
126147
GPUhdDefault() TrackSeed(const TrackSeed&) = default;
127148
GPUhdDefault() ~TrackSeed() = default;
128149
GPUhdDefault() TrackSeed(TrackSeed&&) = default;
129150
GPUhdDefault() TrackSeed& operator=(const TrackSeed&) = default;
130151
GPUhdDefault() TrackSeed& operator=(TrackSeed&&) = default;
131152

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]; }
153+
GPUhd() int getFirstClusterIndex() const { return getClusterBySlot(0); }
154+
GPUhd() int getSecondClusterIndex() const { return getClusterBySlot(1); }
155+
GPUhd() int getThirdClusterIndex() const { return getClusterBySlot(2); }
137156
GPUhd() auto& getClusters() { return this->clustersRaw(); }
138157
GPUhd() const auto& getClusters() const { return this->clustersRaw(); }
139158
GPUhd() int getCluster(int layer) const { return this->clustersRaw()[layer]; }
159+
160+
private:
161+
GPUhd() int getClusterBySlot(int requestedSlot) const
162+
{
163+
int slot = 0;
164+
const uint16_t hitMask = this->getHitLayerMask();
165+
for (int layer = 0; layer < NLayers; ++layer) {
166+
if (hitMask & (uint16_t(1) << layer)) {
167+
if (slot++ == requestedSlot) {
168+
return this->clustersRaw()[layer];
169+
}
170+
}
171+
}
172+
return constants::UnusedIndex;
173+
}
140174
};
141175

142176
} // 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/MathUtils.h

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

19+
#include <cstdint>
20+
1921
#include "CommonConstants/MathConstants.h"
2022
#include "ITStracking/Constants.h"
2123
#include "MathUtils/Utils.h"
@@ -115,6 +117,16 @@ GPUhdi() constexpr float SqDiff(float x, float y)
115117
return Sq(x - y);
116118
}
117119

120+
GPUhdi() int firstSetBit(uint32_t mask)
121+
{
122+
return mask ? static_cast<int>(o2::gpu::GPUCommonMath::Ctz(mask)) : constants::UnusedIndex;
123+
}
124+
125+
GPUhdi() int lastSetBit(uint32_t mask)
126+
{
127+
return mask ? 31 - static_cast<int>(o2::gpu::GPUCommonMath::Clz(mask)) : constants::UnusedIndex;
128+
}
129+
118130
GPUhdi() float MSangle(float mass, float p, float xX0)
119131
{
120132
float beta = p / o2::gpu::CAMath::Hypot(mass, p);

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

Lines changed: 18 additions & 7 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

@@ -112,10 +114,8 @@ struct TimeFrame {
112114
auto& getMaxRs() { return mMaxR; }
113115
float getMinR(int layer) const { return mMinR[layer]; }
114116
float getMaxR(int layer) const { return mMaxR[layer]; }
115-
float getMSangle(int layer) const { return mMSangles[layer]; }
116-
auto& getMSangles() { return mMSangles; }
117-
float getPhiCut(int layer) const { return mPhiCuts[layer]; }
118-
auto& getPhiCuts() { return mPhiCuts; }
117+
float getTransitionPhiCut(int transitionId) const { return mTransitionPhiCuts[transitionId]; }
118+
float getTransitionMSAngle(int transitionId) const { return mTransitionMSAngles[transitionId]; }
119119
float getPositionResolution(int layer) const { return mPositionResolution[layer]; }
120120
auto& getPositionResolutions() { return mPositionResolution; }
121121

@@ -135,6 +135,8 @@ struct TimeFrame {
135135
const auto& getIndexTableUtils() const { return mIndexTableUtils; }
136136
const auto& getROFOverlapTable() const { return mROFOverlapTable; }
137137
const auto& getROFOverlapTableView() const { return mROFOverlapTableView; }
138+
const auto& getTrackingTopologies() const { return mTrackingTopologies; }
139+
const auto& getTrackingTopologyView() const { return mTrackingTopologyView; }
138140
void setROFOverlapTable(ROFOverlapTableN table)
139141
{
140142
mROFOverlapTable = std::move(table);
@@ -177,7 +179,10 @@ struct TimeFrame {
177179
auto& getCellsLabel(int layer) { return mCellLabels[layer]; }
178180

179181
bool hasMCinformation() const { return mClusterLabels[0] != nullptr; }
180-
void initialise(const TrackingParameters& trkParam, const int maxLayers = NLayers);
182+
void initVertexingTopology(const TrackingParameters& trkParam);
183+
void initDefaultTrackingTopology(const TrackingParameters& trkParam, const int maxLayers = NLayers);
184+
void initTrackingTopologies(gsl::span<const TrackingParameters> trkParams, const int maxLayers = NLayers);
185+
void initialise(const TrackingParameters& trkParam, const int maxLayers = NLayers, const int iteration = constants::UnusedIndex);
181186

182187
bool isClusterUsed(int layer, int clusterId) const { return mUsedClusters[layer][clusterId]; }
183188
void markUsedCluster(int layer, int clusterId) { mUsedClusters[layer][clusterId] = true; }
@@ -193,6 +198,7 @@ struct TimeFrame {
193198

194199
auto& getCellsLookupTable() { return mCellsLookupTable; }
195200
auto& getCellsNeighbours() { return mCellsNeighbours; }
201+
auto& getCellsNeighboursTopology() { return mCellsNeighboursTopology; }
196202
auto& getCellsNeighboursLUT() { return mCellsNeighboursLUT; }
197203
auto& getTracks() { return mTracks; }
198204
auto& getTracksLabel() { return mTracksLabel; }
@@ -273,6 +279,7 @@ struct TimeFrame {
273279
bounded_vector<TrackITSExt> mTracks;
274280
bounded_vector<MCCompLabel> mTracksLabel;
275281
std::vector<bounded_vector<int>> mCellsNeighbours;
282+
std::vector<bounded_vector<int>> mCellsNeighboursTopology;
276283
std::vector<bounded_vector<int>> mCellsLookupTable;
277284

278285
const o2::base::PropagatorImpl<float>* mPropagatorDevice = nullptr; // Needed only for GPU
@@ -292,8 +299,8 @@ struct TimeFrame {
292299
bool isBeamPositionOverridden = false;
293300
std::array<float, NLayers> mMinR;
294301
std::array<float, NLayers> mMaxR;
295-
bounded_vector<float> mMSangles;
296-
bounded_vector<float> mPhiCuts;
302+
bounded_vector<float> mTransitionPhiCuts;
303+
bounded_vector<float> mTransitionMSAngles;
297304
bounded_vector<float> mPositionResolution;
298305
std::array<bounded_vector<uint8_t>, NLayers> mClusterSize;
299306

@@ -319,6 +326,10 @@ struct TimeFrame {
319326
IndexTableUtilsN mIndexTableUtils;
320327
ROFOverlapTableN mROFOverlapTable;
321328
ROFOverlapTableN::View mROFOverlapTableView;
329+
TrackingTopologyN mVertexingTopology;
330+
TrackingTopologyN mDefaultTrackingTopology;
331+
std::vector<TrackingTopologyN> mTrackingTopologies;
332+
TrackingTopologyN::View mTrackingTopologyView;
322333
ROFVertexLookupTableN mROFVertexLookupTable;
323334
ROFVertexLookupTableN::View mROFVertexLookupTableView;
324335
ROFMaskTableN mMultiplicityCutMask;

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,15 +45,15 @@ class TrackerTraits
4545

4646
virtual ~TrackerTraits() = default;
4747
virtual void adoptTimeFrame(TimeFrame<NLayers>* tf) { mTimeFrame = tf; }
48-
virtual void initialiseTimeFrame(const int iteration) { mTimeFrame->initialise(mTrkParams[iteration], mTrkParams[iteration].NLayers); }
48+
virtual void initialiseTimeFrame(const int iteration) { mTimeFrame->initialise(mTrkParams[iteration], mTrkParams[iteration].NLayers, iteration); }
4949

5050
virtual void computeLayerTracklets(const int iteration, int iVertex);
5151
virtual void computeLayerCells(const int iteration);
5252
virtual void findCellsNeighbours(const int iteration);
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)