@@ -409,6 +409,7 @@ void TrackerTraitsGPU<NLayers>::buildTrackExtensionCandidates(const int iteratio
409409 mTimeFrameGPU ->getDeviceROFrameClusters (),
410410 mTimeFrameGPU ->getDeviceArrayTrackingFrameInfo (),
411411 mTimeFrameGPU ->getDeviceTrackExtensionCandidates (),
412+ mTimeFrameGPU ->getDeviceTrackExtensionCandidateOffsets (),
412413 mTimeFrameGPU ->getDeviceActiveTrackExtensionHypotheses (),
413414 mTimeFrameGPU ->getDeviceNextTrackExtensionHypotheses (),
414415 this ->mTrkParams [iteration].LayerRadii ,
@@ -427,12 +428,57 @@ void TrackerTraitsGPU<NLayers>::buildTrackExtensionCandidates(const int iteratio
427428 mTimeFrameGPU ->getDevicePropagator (),
428429 this ->mTrkParams [iteration].CorrType ,
429430 mTimeFrameGPU ->getStream (0 ));
430- mTimeFrameGPU ->downloadTrackExtensionCandidatesDevice ();
431- this ->importFlatTrackExtensionCandidates (mTimeFrameGPU ->getTrackExtensionCandidates (), candidatesPerTrack);
432- if (std::any_of (candidatesPerTrack.begin (), candidatesPerTrack.end (), [](const auto & candidates) { return !candidates.empty (); })) {
433- return ;
431+ mTimeFrameGPU ->createTrackExtensionResultsDevice (nTracks);
432+ computeTrackExtensionResultsHandler<NLayers>(mTimeFrameGPU ->getDeviceTrackExtensionStartStates (),
433+ mTimeFrameGPU ->getDeviceTrackExtensionCandidates (),
434+ mTimeFrameGPU ->getDeviceTrackExtensionCandidateOffsets (),
435+ mTimeFrameGPU ->getDeviceTrackExtensionResults (),
436+ mTimeFrameGPU ->getDeviceArrayTrackingFrameInfo (),
437+ this ->mTrkParams [iteration].LayerxX0 ,
438+ static_cast <int >(nTracks),
439+ this ->mTrkParams [iteration].NLayers ,
440+ this ->mBz ,
441+ this ->mTrkParams [iteration].MaxChi2ClusterAttachment ,
442+ this ->mTrkParams [iteration].MaxChi2NDF ,
443+ mTimeFrameGPU ->getDevicePropagator (),
444+ this ->mTrkParams [iteration].CorrType ,
445+ this ->mTrkParams [iteration].ShiftRefToCluster ,
446+ mTimeFrameGPU ->getStream (0 ));
447+ mTimeFrameGPU ->downloadTrackExtensionResultsDevice ();
448+
449+ const auto & results = mTimeFrameGPU ->getTrackExtensionResults ();
450+ for (int iResult{0 }; iResult < static_cast <int >(results.size ()); ++iResult) {
451+ const auto & result = results[iResult];
452+ if (!result.isValid ()) {
453+ continue ;
454+ }
455+ auto candidate = result.candidate ;
456+ candidate.fittedTrackIndex = iResult;
457+ candidatesPerTrack[result.trackIndex ].push_back (candidate);
458+ }
459+ }
460+
461+ template <int NLayers>
462+ bool TrackerTraitsGPU<NLayers>::materializeTrackExtensionCandidate(TrackITSExt& track, const typename TrackerTraits<NLayers>::TrackExtensionCandidateN& candidate, const int iteration)
463+ {
464+ const auto & results = mTimeFrameGPU ->getTrackExtensionResults ();
465+ if (candidate.fittedTrackIndex < 0 || candidate.fittedTrackIndex >= static_cast <int >(results.size ())) {
466+ return TrackerTraits<NLayers>::materializeTrackExtensionCandidate (track, candidate, iteration);
467+ }
468+ const auto & result = results[candidate.fittedTrackIndex ];
469+ if (!result.isValid () || result.trackIndex != candidate.trackIndex ) {
470+ return false ;
471+ }
472+ track = result.track ;
473+ this ->updateExtendedTrackTimeStamp (track, iteration);
474+ uint32_t diff{0 };
475+ for (int iLayer{0 }; iLayer < this ->mTrkParams [iteration].NLayers ; ++iLayer) {
476+ if (candidate.addedClusters [iLayer] != constants::UnusedIndex) {
477+ diff |= (0x1u << iLayer);
478+ }
434479 }
435- TrackerTraits<NLayers>::buildTrackExtensionCandidates (iteration, candidatesPerTrack);
480+ track.setPattern (track.getPattern () | (diff << 24 ));
481+ return true ;
436482}
437483
438484template <int NLayers>
0 commit comments