30 s.mNTracklets = *tracker.NTracklets();
31 s.mNThreadsTotal = nThreads * nBlocks;
32 s.mItr0 = nThreads * iBlock;
37 const float maxSharedFrac = tracker.Param().rec.tpc.trackletMaxSharedFraction;
39 for (int32_t itr = s.mItr0 + iThread; itr < s.mNTracklets; itr += s.mNThreadsTotal) {
44 int32_t firstRow = tracklet.FirstRow();
45 int32_t lastRow = tracklet.LastRow();
47 const int32_t
w = tracklet.HitWeight();
49 int32_t irow = firstRow;
54 const int32_t minHits = tracker.Param().rec.tpc.minNClustersTrackSeed == -1 ?
GPUCA_TRACKLET_SELECTOR_MIN_HITS_B5(tracklet.Param().QPt() * tracker.Param().qptB5Scaler) : tracker.Param().rec.tpc.minNClustersTrackSeed;
55 const int32_t sharingMinNorm = minHits * tracker.Param().rec.tpc.trackletMinSharedNormFactor;
56 float maxShared = maxSharedFrac * sharingMinNorm;
59 for (irow = firstRow; irow <= lastRow && lastRow - irow + nHits >= minHits; irow++) {
60 calink ih = tracker.TrackletRowHits()[tracklet.FirstHit() + (irow - firstRow)];
66 bool own = (tracker.HitWeight(
row, ih) <=
w);
67 bool sharedOK = nShared <= (nHits < sharingMinNorm ? maxShared : nHits * maxSharedFrac);
68 if (own || sharedOK) {
70#if GPUCA_TRACKLET_SELECTOR_HITS_REG_SIZE != 0
72 s.mHits[nHits][iThread].Set(irow, ih);
85 if (gap > tracker.Param().rec.tpc.trackFollowingMaxRowGap || irow == lastRow) {
86 if (nHits >= minHits) {
87 uint32_t nFirstTrackHit = CAMath::AtomicAdd(tracker.NTrackHits(), (uint32_t)nHits);
88 if (nFirstTrackHit + nHits > tracker.NMaxTrackHits()) {
89 tracker.raiseError(GPUErrors::ERROR_TRACK_HIT_OVERFLOW, tracker.ISector(), nFirstTrackHit + nHits, tracker.NMaxTrackHits());
90 CAMath::AtomicExch(tracker.NTrackHits(), tracker.NMaxTrackHits());
93 uint32_t itrout = CAMath::AtomicAdd(tracker.NTracks(), 1u);
94 if (itrout >= tracker.NMaxTracks()) {
95 tracker.raiseError(GPUErrors::ERROR_TRACK_OVERFLOW, tracker.ISector(), itrout, tracker.NMaxTracks());
96 CAMath::AtomicExch(tracker.NTracks(), tracker.NMaxTracks());
99 tracker.Tracks()[itrout].SetLocalTrackId(itrout);
100 tracker.Tracks()[itrout].SetParam(tracklet.Param());
101 tracker.Tracks()[itrout].SetFirstHitID(nFirstTrackHit);
102 tracker.Tracks()[itrout].SetNHits(nHits);
103 for (int32_t jh = 0; jh < nHits; jh++) {
104#if GPUCA_TRACKLET_SELECTOR_HITS_REG_SIZE != 0
106 tracker.TrackHits()[nFirstTrackHit + jh] = s.mHits[jh][iThread];