Skip to content

Commit c916cd3

Browse files
committed
ITS: integrate track extension in road finding
1 parent e5b3ec4 commit c916cd3

8 files changed

Lines changed: 119 additions & 482 deletions

File tree

Detectors/ITSMFT/ITS/tracking/GPU/ITStrackingGPU/TrackerTraitsGPU.h

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ class TrackerTraitsGPU final : public TrackerTraits<NLayers>
3535
void computeLayerCells(const int iteration) final;
3636
void findCellsNeighbours(const int iteration) final;
3737
void findRoads(const int iteration) final;
38-
void extendTracks(const int iteration) final;
3938

4039
void setBz(float) final;
4140

@@ -48,11 +47,6 @@ class TrackerTraitsGPU final : public TrackerTraits<NLayers>
4847
int getTFNumberOfCells() const override;
4948

5049
private:
51-
bool hasTrackFollower(const int iteration) const;
52-
53-
void buildTrackExtensionCandidates(const int iteration, typename TrackerTraits<NLayers>::TrackExtensionCandidates& candidatesPerTrack) final;
54-
bool materializeTrackExtensionCandidate(TrackITSExt& track, const typename TrackerTraits<NLayers>::TrackExtensionCandidateN& candidate, const int iteration) final;
55-
5650
IndexTableUtilsN* mDeviceIndexTableUtils;
5751
gpu::TimeFrameGPU<NLayers>* mTimeFrameGPU;
5852
};

Detectors/ITSMFT/ITS/tracking/GPU/cuda/TrackerTraitsGPU.cxx

Lines changed: 2 additions & 119 deletions
Original file line numberDiff line numberDiff line change
@@ -394,126 +394,9 @@ void TrackerTraitsGPU<NLayers>::findRoads(const int iteration)
394394
mTimeFrameGPU->loadUsedClustersDevice();
395395
}
396396
this->markTracks(iteration, sharedFirstClusters);
397-
if (!hasTrackFollower(iteration)) {
398-
// wipe the artefact memory
399-
mTimeFrameGPU->popMemoryStack(iteration);
400-
}
401-
};
402-
403-
template <int NLayers>
404-
void TrackerTraitsGPU<NLayers>::extendTracks(const int iteration)
405-
{
406-
TrackerTraits<NLayers>::extendTracks(iteration);
407-
mTimeFrameGPU->loadUsedClustersDevice();
408-
// wipe the artefact memory kept alive for the track follower
397+
// wipe the artefact memory
409398
mTimeFrameGPU->popMemoryStack(iteration);
410-
}
411-
412-
template <int NLayers>
413-
bool TrackerTraitsGPU<NLayers>::hasTrackFollower(const int iteration) const
414-
{
415-
return this->mTrkParams[iteration].PassFlags[IterationStep::TrackFollowerTop] ||
416-
this->mTrkParams[iteration].PassFlags[IterationStep::TrackFollowerBot];
417-
}
418-
419-
template <int NLayers>
420-
void TrackerTraitsGPU<NLayers>::buildTrackExtensionCandidates(const int iteration, typename TrackerTraits<NLayers>::TrackExtensionCandidates& candidatesPerTrack)
421-
{
422-
const auto nTracks = this->mTimeFrame->getTracks().size();
423-
const int beamWidth = std::max(1, this->mTrkParams[iteration].TrackFollowerBeamWidth);
424-
mTimeFrameGPU->syncStreams();
425-
mTimeFrameGPU->loadTrackExtensionStartTracksDevice();
426-
mTimeFrameGPU->createTrackExtensionCandidatesDevice(nTracks);
427-
mTimeFrameGPU->createTrackExtensionScratchDevice(kTrackExtensionLaunchThreads, beamWidth);
428-
std::array<float, NLayers> layerRadii{};
429-
std::array<float, NLayers> layerxX0{};
430-
for (int iLayer{0}; iLayer < this->mTrkParams[iteration].NLayers; ++iLayer) {
431-
layerRadii[iLayer] = this->mTrkParams[iteration].LayerRadii[iLayer];
432-
layerxX0[iLayer] = this->mTrkParams[iteration].LayerxX0[iLayer];
433-
}
434-
computeTrackExtensionCandidatesHandler<NLayers>(mTimeFrameGPU->getDeviceTrackExtensionStartTracks(),
435-
mTimeFrameGPU->getDeviceIndexTableUtils(),
436-
mTimeFrameGPU->getDeviceROFMaskTableView(),
437-
mTimeFrameGPU->getDeviceROFOverlapTableView(),
438-
mTimeFrameGPU->getDeviceArrayClusters(),
439-
(const uint8_t**)mTimeFrameGPU->getDeviceArrayUsedClusters(),
440-
mTimeFrameGPU->getDeviceArrayClustersIndexTables(),
441-
mTimeFrameGPU->getDeviceROFrameClusters(),
442-
mTimeFrameGPU->getDeviceArrayTrackingFrameInfo(),
443-
mTimeFrameGPU->getDeviceTrackExtensionCandidates(),
444-
mTimeFrameGPU->getDeviceTrackExtensionCandidateOffsets(),
445-
mTimeFrameGPU->getDeviceActiveTrackExtensionHypotheses(),
446-
mTimeFrameGPU->getDeviceNextTrackExtensionHypotheses(),
447-
layerRadii,
448-
layerxX0,
449-
static_cast<int>(nTracks),
450-
this->mTrkParams[iteration].NLayers,
451-
this->mTrkParams[iteration].PhiBins,
452-
beamWidth,
453-
this->mTrkParams[iteration].PassFlags[IterationStep::TrackFollowerTop],
454-
this->mTrkParams[iteration].PassFlags[IterationStep::TrackFollowerBot],
455-
this->mBz,
456-
this->mTrkParams[iteration].MaxChi2ClusterAttachment,
457-
this->mTrkParams[iteration].MaxChi2NDF,
458-
this->mTrkParams[iteration].TrackFollowerNSigmaCutPhi,
459-
this->mTrkParams[iteration].TrackFollowerNSigmaCutZ,
460-
mTimeFrameGPU->getDevicePropagator(),
461-
this->mTrkParams[iteration].CorrType,
462-
mTimeFrameGPU->getStream(0));
463-
mTimeFrameGPU->createTrackExtensionResultsDevice(nTracks);
464-
computeTrackExtensionResultsHandler<NLayers>(mTimeFrameGPU->getDeviceTrackExtensionStartTracks(),
465-
mTimeFrameGPU->getDeviceTrackExtensionCandidates(),
466-
mTimeFrameGPU->getDeviceTrackExtensionCandidateOffsets(),
467-
mTimeFrameGPU->getDeviceTrackExtensionResults(),
468-
mTimeFrameGPU->getDeviceArrayTrackingFrameInfo(),
469-
layerxX0,
470-
static_cast<int>(nTracks),
471-
this->mTrkParams[iteration].NLayers,
472-
this->mBz,
473-
this->mTrkParams[iteration].MaxChi2ClusterAttachment,
474-
this->mTrkParams[iteration].MaxChi2NDF,
475-
mTimeFrameGPU->getDevicePropagator(),
476-
this->mTrkParams[iteration].CorrType,
477-
this->mTrkParams[iteration].ShiftRefToCluster,
478-
mTimeFrameGPU->getStream(0));
479-
mTimeFrameGPU->downloadTrackExtensionResultsDevice();
480-
481-
const auto& results = mTimeFrameGPU->getTrackExtensionResults();
482-
for (int iResult{0}; iResult < static_cast<int>(results.size()); ++iResult) {
483-
const auto& result = results[iResult];
484-
if (!result.isValid()) {
485-
continue;
486-
}
487-
auto candidate = result.candidate;
488-
candidate.resultIndex = iResult;
489-
if (candidatesPerTrack.add(candidate.trackIndex, candidate) < 0) {
490-
continue;
491-
}
492-
}
493-
}
494-
495-
template <int NLayers>
496-
bool TrackerTraitsGPU<NLayers>::materializeTrackExtensionCandidate(TrackITSExt& track, const typename TrackerTraits<NLayers>::TrackExtensionCandidateN& candidate, const int iteration)
497-
{
498-
const auto& results = mTimeFrameGPU->getTrackExtensionResults();
499-
if (candidate.resultIndex < 0 || candidate.resultIndex >= static_cast<int>(results.size())) {
500-
return TrackerTraits<NLayers>::materializeTrackExtensionCandidate(track, candidate, iteration);
501-
}
502-
const auto& result = results[candidate.resultIndex];
503-
if (!result.isValid() || result.candidate.trackIndex != candidate.trackIndex) {
504-
return false;
505-
}
506-
track = result.track;
507-
this->updateExtendedTrackTimeStamp(track, iteration);
508-
uint32_t diff{0};
509-
for (int iLayer{0}; iLayer < this->mTrkParams[iteration].NLayers; ++iLayer) {
510-
if (candidate.addedClusters[iLayer] != constants::UnusedIndex) {
511-
diff |= (0x1u << iLayer);
512-
}
513-
}
514-
applyExtendedClustersPattern<NLayers>(track, diff);
515-
return true;
516-
}
399+
};
517400

518401
template <int NLayers>
519402
int TrackerTraitsGPU<NLayers>::getTFNumberOfClusters() const

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,6 @@ struct TimeFrame {
279279
std::vector<bounded_vector<Tracklet>> mTracklets;
280280
std::vector<bounded_vector<CellSeed>> mCells;
281281
bounded_vector<TrackITSExt> mTracks;
282-
std::vector<TrackITSExt> mFittedExtensionTracks;
283282
bounded_vector<MCCompLabel> mTracksLabel;
284283
std::vector<bounded_vector<int>> mCellsNeighbours;
285284
std::vector<bounded_vector<int>> mCellsNeighboursTopology;

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,6 @@ class Tracker
7474
void computeCells(int iteration) { mTraits->computeLayerCells(iteration); }
7575
void findCellsNeighbours(int iteration) { mTraits->findCellsNeighbours(iteration); }
7676
void findRoads(int iteration) { mTraits->findRoads(iteration); }
77-
void extendTracks(int iteration) { mTraits->extendTracks(iteration); }
7877

7978
void rectifyClusterIndices();
8079
void sortTracks();

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

Lines changed: 7 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include <oneapi/tbb.h>
2121
#include <vector>
2222

23+
#include "DetectorsBase/Propagator.h"
2324
#include "ITStracking/Configuration.h"
2425
#include "ITStracking/Constants.h"
2526
#include "ITStracking/IndexTableUtils.h"
@@ -57,8 +58,6 @@ class TrackerTraits
5758
virtual void computeLayerCells(const int iteration);
5859
virtual void findCellsNeighbours(const int iteration);
5960
virtual void findRoads(const int iteration);
60-
virtual bool supportsExtendTracks() const noexcept { return true; }
61-
virtual void extendTracks(const int iteration);
6261

6362
template <typename InputSeed>
6463
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);
@@ -93,54 +92,19 @@ class TrackerTraits
9392
std::shared_ptr<tbb::task_arena> mTaskArena;
9493

9594
protected:
96-
using TrackExtensionCandidateN = TrackExtensionCandidate<NLayers>;
97-
struct TrackExtensionCandidates {
98-
TrackExtensionCandidates() = default;
99-
explicit TrackExtensionCandidates(size_t nTracks)
100-
: candidates(nTracks * MaxTrackExtensionCandidatesPerTrack), counts(nTracks, 0)
101-
{
102-
}
103-
104-
int add(int trackIndex, const TrackExtensionCandidateN& candidate)
105-
{
106-
auto& count = counts[trackIndex];
107-
if (count >= MaxTrackExtensionCandidatesPerTrack) {
108-
return -1;
109-
}
110-
const int flatIndex = static_cast<int>(getFlatTrackExtensionCandidateIndex(trackIndex, count));
111-
candidates[flatIndex] = candidate;
112-
++count;
113-
return flatIndex;
114-
}
115-
116-
void pop_back(int trackIndex)
117-
{
118-
--counts[trackIndex];
119-
}
120-
121-
bool empty(int trackIndex) const { return counts[trackIndex] == 0; }
122-
int size(int trackIndex) const { return counts[trackIndex]; }
123-
TrackExtensionCandidateN* begin(int trackIndex) { return candidates.data() + getFlatTrackExtensionCandidateIndex(trackIndex, 0); }
124-
TrackExtensionCandidateN* end(int trackIndex) { return begin(trackIndex) + counts[trackIndex]; }
125-
TrackExtensionCandidateN& get(int trackIndex, int candidateIndex) { return candidates[getFlatTrackExtensionCandidateIndex(trackIndex, candidateIndex)]; }
126-
const TrackExtensionCandidateN& get(int trackIndex, int candidateIndex) const { return candidates[getFlatTrackExtensionCandidateIndex(trackIndex, candidateIndex)]; }
127-
TrackExtensionCandidateN& getFlat(int flatIndex) { return candidates[flatIndex]; }
128-
129-
std::vector<TrackExtensionCandidateN> candidates;
130-
std::vector<int> counts;
131-
};
132-
13395
struct TrackFollowerScratch {
13496
std::vector<TrackExtensionHypothesis<NLayers>> activeHypotheses;
13597
std::vector<TrackExtensionHypothesis<NLayers>> nextHypotheses;
13698
};
13799

100+
bool finaliseTrackSeed(const TrackSeedN& seed,
101+
TrackITSExt& track,
102+
const int iteration,
103+
const TrackingFrameInfo* const* tfInfos,
104+
const Cluster* const* unsortedClusters,
105+
const o2::base::Propagator* propagator);
138106
bool trackFollowing(TrackITSExt* track, bool outward, const int iteration, TrackFollowerScratch& scratch);
139107
bool refitExtendedTrack(TrackITSExt& track, const int iteration);
140-
void updateExtendedTrackTimeStamp(TrackITSExt& track, const int iteration);
141-
virtual bool materializeTrackExtensionCandidate(TrackITSExt& track, const TrackExtensionCandidateN& candidate, const int iteration);
142-
virtual void buildTrackExtensionCandidates(const int iteration, TrackExtensionCandidates& candidatesPerTrack);
143-
void applyTrackExtensionCandidates(const int iteration, TrackExtensionCandidates& candidatesPerTrack);
144108

145109
o2::gpu::GPUChainITS* mChain = nullptr;
146110
TimeFrame<NLayers>* mTimeFrame;

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -475,7 +475,6 @@ template <int NLayers>
475475
void TimeFrame<NLayers>::wipe()
476476
{
477477
deepVectorClear(mTracks);
478-
deepVectorClear(mFittedExtensionTracks);
479478
deepVectorClear(mTracklets);
480479
deepVectorClear(mCells);
481480
deepVectorClear(mCellsNeighbours);

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

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -93,18 +93,6 @@ float Tracker<NLayers>::clustersToTracks(const LogFunc& logger, const LogFunc& e
9393
logger(std::format(" - Neighbours finding: {} neighbours found in {:.2f} ms", nNeighbours, timeNeighbours));
9494
logger(std::format(" - Track finding: {} tracks found in {:.2f} ms", nTracks + mTimeFrame->getNumberOfTracks(), timeRoads));
9595
total += timeTracklets + timeCells + timeNeighbours + timeRoads;
96-
if (mTraits->supportsExtendTracks() && (mTrkParams[iteration].PassFlags[IterationStep::TrackFollowerTop] || mTrkParams[iteration].PassFlags[IterationStep::TrackFollowerBot])) {
97-
const int nClustersBefore = mTimeFrame->getNumberOfUsedClusters();
98-
const int nTracksBefore = std::count_if(mTimeFrame->getTracks().begin(), mTimeFrame->getTracks().end(), [](const auto& track) {
99-
return track.getPattern() & 0xff000000;
100-
});
101-
const auto timeExtending = evaluateTask(&Tracker::extendTracks, StateNames[mCurStep = Extending], iteration, evalLog, iteration);
102-
const int nTracksAfter = std::count_if(mTimeFrame->getTracks().begin(), mTimeFrame->getTracks().end(), [](const auto& track) {
103-
return track.getPattern() & 0xff000000;
104-
});
105-
total += timeExtending;
106-
logger(std::format(" - Extending tracks: {} tracks using {} clusters in {:.2f} ms", nTracksAfter - nTracksBefore, mTimeFrame->getNumberOfUsedClusters() - nClustersBefore, timeExtending));
107-
}
10896
}
10997
} catch (const BoundedMemoryResource::MemoryLimitExceeded& err) {
11098
handleException(err);

0 commit comments

Comments
 (0)