Skip to content

Commit 612661a

Browse files
committed
ITS: integrate track extension in road finding
1 parent 67c3b6f commit 612661a

11 files changed

Lines changed: 541 additions & 516 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/ITStrackingGPU/TrackingKernels.h

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,6 @@ void countTrackSeedHandler(TrackSeed<NLayers>* trackSeeds,
262262
const std::vector<float>& layerxX0Host,
263263
const unsigned int nSeeds,
264264
const float Bz,
265-
const int startLevel,
266265
const float maxChi2ClusterAttachment,
267266
const float maxChi2NDF,
268267
const int reseedIfShorter,
@@ -276,20 +275,35 @@ template <int NLayers>
276275
void computeTrackSeedHandler(TrackSeed<NLayers>* trackSeeds,
277276
const TrackingFrameInfo** foundTrackingFrameInfo,
278277
const Cluster** unsortedClusters,
278+
const IndexTableUtils<NLayers>* utils,
279+
const typename ROFMaskTable<NLayers>::View& rofMask,
280+
const typename ROFOverlapTable<NLayers>::View& rofOverlaps,
281+
const Cluster** clusters,
282+
const unsigned char** usedClusters,
283+
const int** clustersIndexTables,
284+
const int** ROFClusters,
279285
o2::its::TrackITSExt* tracks,
280286
const int* seedLUT,
287+
TrackExtensionHypothesis<NLayers>* activeHypotheses,
288+
TrackExtensionHypothesis<NLayers>* nextHypotheses,
281289
const std::vector<float>& layerRadiiHost,
282290
const std::vector<float>& minPtsHost,
283291
const std::vector<float>& layerxX0Host,
284292
const unsigned int nSeeds,
285293
const unsigned int nTracks,
286294
const float Bz,
287-
const int startLevel,
288295
const float maxChi2ClusterAttachment,
289296
const float maxChi2NDF,
290297
const int reseedIfShorter,
291298
const bool repeatRefitOut,
292299
const bool shiftRefToCluster,
300+
const int nLayers,
301+
const int phiBins,
302+
const int beamWidth,
303+
const bool extendTop,
304+
const bool extendBot,
305+
const float nSigmaCutPhi,
306+
const float nSigmaCutZ,
293307
const o2::base::Propagator* propagator,
294308
const o2::base::PropagatorF::MatCorrType matCorrType,
295309
o2::its::ExternalAllocator* alloc);

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

Lines changed: 30 additions & 122 deletions
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,11 @@ void TrackerTraitsGPU<NLayers>::findRoads(const int iteration)
308308
firstClusters.resize(this->mTrkParams[iteration].NLayers);
309309
sharedFirstClusters.resize(this->mTrkParams[iteration].NLayers);
310310
const auto hostTopology = mTimeFrameGPU->getTrackingTopologyView();
311+
const bool extendTop = this->mTrkParams[iteration].PassFlags[IterationStep::TrackFollowerTop];
312+
const bool extendBot = this->mTrkParams[iteration].PassFlags[IterationStep::TrackFollowerBot];
313+
const bool extendTracks = extendTop || extendBot;
314+
size_t nExtendedTracks{0};
315+
size_t nExtendedClusters{0};
311316
for (int startLevel{this->mTrkParams[iteration].CellsPerRoad()}; startLevel >= this->mTrkParams[iteration].CellMinimumLevel(); --startLevel) {
312317
bounded_vector<TrackSeed<NLayers>> trackSeeds(this->getMemoryPool().get());
313318
for (int startCellTopologyId{0}; startCellTopologyId < hostTopology.nCells; ++startCellTopologyId) {
@@ -357,7 +362,6 @@ void TrackerTraitsGPU<NLayers>::findRoads(const int iteration)
357362
this->mTrkParams[iteration].LayerxX0,
358363
trackSeeds.size(),
359364
this->mBz,
360-
startLevel,
361365
this->mTrkParams[iteration].MaxChi2ClusterAttachment,
362366
this->mTrkParams[iteration].MaxChi2NDF,
363367
this->mTrkParams[iteration].ReseedIfShorter,
@@ -367,153 +371,57 @@ void TrackerTraitsGPU<NLayers>::findRoads(const int iteration)
367371
this->mTrkParams[iteration].CorrType,
368372
mTimeFrameGPU->getFrameworkAllocator());
369373
mTimeFrameGPU->createTrackITSExtDevice(trackSeeds.size());
374+
if (extendTracks) {
375+
mTimeFrameGPU->createTrackExtensionScratchDevice(kTrackExtensionLaunchThreads, this->mTrkParams[iteration].TrackFollowerBeamWidth);
376+
}
370377
computeTrackSeedHandler(mTimeFrameGPU->getDeviceTrackSeeds(),
371378
mTimeFrameGPU->getDeviceArrayTrackingFrameInfo(),
372379
mTimeFrameGPU->getDeviceArrayUnsortedClusters(),
380+
mTimeFrameGPU->getDeviceIndexTableUtils(),
381+
mTimeFrameGPU->getDeviceROFMaskTableView(),
382+
mTimeFrameGPU->getDeviceROFOverlapTableView(),
383+
mTimeFrameGPU->getDeviceArrayClusters(),
384+
(const unsigned char**)mTimeFrameGPU->getDeviceArrayUsedClusters(),
385+
mTimeFrameGPU->getDeviceArrayClustersIndexTables(),
386+
mTimeFrameGPU->getDeviceROFrameClusters(),
373387
mTimeFrameGPU->getDeviceTrackITSExt(),
374388
mTimeFrameGPU->getDeviceTrackSeedsLUT(),
389+
extendTracks ? mTimeFrameGPU->getDeviceActiveTrackExtensionHypotheses() : nullptr,
390+
extendTracks ? mTimeFrameGPU->getDeviceNextTrackExtensionHypotheses() : nullptr,
375391
this->mTrkParams[iteration].LayerRadii,
376392
this->mTrkParams[iteration].MinPt,
377393
this->mTrkParams[iteration].LayerxX0,
378394
trackSeeds.size(),
379395
mTimeFrameGPU->getNTrackSeeds(),
380396
this->mBz,
381-
startLevel,
382397
this->mTrkParams[iteration].MaxChi2ClusterAttachment,
383398
this->mTrkParams[iteration].MaxChi2NDF,
384399
this->mTrkParams[iteration].ReseedIfShorter,
385400
this->mTrkParams[iteration].RepeatRefitOut,
386401
this->mTrkParams[iteration].ShiftRefToCluster,
402+
this->mTrkParams[iteration].NLayers,
403+
this->mTrkParams[iteration].PhiBins,
404+
this->mTrkParams[iteration].TrackFollowerBeamWidth,
405+
extendTop,
406+
extendBot,
407+
this->mTrkParams[iteration].TrackFollowerNSigmaCutPhi,
408+
this->mTrkParams[iteration].TrackFollowerNSigmaCutZ,
387409
mTimeFrameGPU->getDevicePropagator(),
388410
this->mTrkParams[iteration].CorrType,
389411
mTimeFrameGPU->getFrameworkAllocator());
390412
mTimeFrameGPU->downloadTrackITSExtDevice();
391413

392414
auto& tracks = mTimeFrameGPU->getTrackITSExt();
393-
this->acceptTracks(iteration, tracks, firstClusters, sharedFirstClusters);
415+
this->acceptTracks(iteration, tracks, firstClusters, sharedFirstClusters, &nExtendedTracks, &nExtendedClusters);
394416
mTimeFrameGPU->loadUsedClustersDevice();
395417
}
396-
this->markTracks(iteration, sharedFirstClusters);
397-
if (!hasTrackFollower(iteration)) {
398-
// wipe the artefact memory
399-
mTimeFrameGPU->popMemoryStack(iteration);
418+
if (extendTracks) {
419+
LOGP(info, "Integrated track extension accepted {} tracks using {} clusters in iteration {}", nExtendedTracks, nExtendedClusters, iteration);
400420
}
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
421+
this->markTracks(iteration, sharedFirstClusters);
422+
// wipe the artefact memory
409423
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-
}
424+
};
517425

518426
template <int NLayers>
519427
int TrackerTraitsGPU<NLayers>::getTFNumberOfClusters() const

0 commit comments

Comments
 (0)