Project
Loading...
Searching...
No Matches
GPUTPCTrackletSelector.cxx
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
14
16#include "GPUTPCTrack.h"
17#include "GPUTPCTracker.h"
18#include "GPUTPCTrackParam.h"
19#include "GPUTPCTracklet.h"
20#include "GPUCommonMath.h"
21
22using namespace o2::gpu;
23
24template <>
25GPUdii() void GPUTPCTrackletSelector::Thread<0>(int32_t nBlocks, int32_t nThreads, int32_t iBlock, int32_t iThread, GPUsharedref() GPUSharedMemory& s, processorType& GPUrestrict() tracker)
26{
27 // select best tracklets and kill clones
28
29 if (iThread == 0) {
30 s.mNTracklets = *tracker.NTracklets();
31 s.mNThreadsTotal = nThreads * nBlocks;
32 s.mItr0 = nThreads * iBlock;
33 }
34 GPUbarrier();
35
37 const float maxSharedFrac = tracker.Param().rec.tpc.trackletMaxSharedFraction;
38
39 for (int32_t itr = s.mItr0 + iThread; itr < s.mNTracklets; itr += s.mNThreadsTotal) {
41
42 GPUglobalref() GPUTPCTracklet& GPUrestrict() tracklet = tracker.Tracklets()[itr];
43
44 int32_t firstRow = tracklet.FirstRow();
45 int32_t lastRow = tracklet.LastRow();
46
47 const int32_t w = tracklet.HitWeight();
48
49 int32_t irow = firstRow;
50
51 int32_t gap = 0;
52 int32_t nShared = 0;
53 int32_t nHits = 0;
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;
57
58 GPUCA_UNROLL(, U(1))
59 for (irow = firstRow; irow <= lastRow && lastRow - irow + nHits >= minHits; irow++) {
60 calink ih = tracker.TrackletRowHits()[tracklet.FirstHit() + (irow - firstRow)];
61 if (ih != CALINK_DEAD_CHANNEL) {
62 gap++;
63 }
64 if (ih != CALINK_INVAL && ih != CALINK_DEAD_CHANNEL) {
65 GPUglobalref() const GPUTPCRow& row = tracker.Row(irow);
66 bool own = (tracker.HitWeight(row, ih) <= w);
67 bool sharedOK = nShared <= (nHits < sharingMinNorm ? maxShared : nHits * maxSharedFrac);
68 if (own || sharedOK) { // SG!!!
69 gap = 0;
70#if GPUCA_TRACKLET_SELECTOR_HITS_REG_SIZE != 0
72 s.mHits[nHits][iThread].Set(irow, ih);
73 } else
74#endif // GPUCA_TRACKLET_SELECTOR_HITS_REG_SIZE != 0
75 {
76 trackHits[nHits - GPUCA_TRACKLET_SELECTOR_HITS_REG_SIZE].Set(irow, ih);
77 }
78 nHits++;
79 if (!own) {
80 nShared++;
81 }
82 }
83 }
84
85 if (gap > tracker.Param().rec.tpc.trackFollowingMaxRowGap || irow == lastRow) { // store
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());
91 return;
92 }
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());
97 return;
98 }
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];
107 } else
108#endif // GPUCA_TRACKLET_SELECTOR_HITS_REG_SIZE != 0
109 {
110 tracker.TrackHits()[nFirstTrackHit + jh] = trackHits[jh - GPUCA_TRACKLET_SELECTOR_HITS_REG_SIZE];
111 }
112 }
113 }
114 nHits = 0;
115 gap = 0;
116 nShared = 0;
117 }
118 }
119 }
120}
#define GPUsharedref()
#define GPUbarrierWarp()
#define GPUbarrier()
#define GPUrestrict()
#define GPUglobalref()
#define GPUCA_TRACKLET_SELECTOR_MIN_HITS_B5(QPTB5)
#define GPUCA_TRACKLET_SELECTOR_HITS_REG_SIZE
#define GPUCA_UNROLL(optCu, optHi)
#define CALINK_DEAD_CHANNEL
Definition GPUTPCDef.h:22
#define CALINK_INVAL
Definition GPUTPCDef.h:21
#define GPUCA_ROW_COUNT
GPUdii() void GPUTPCTrackletSelector
typedef void(APIENTRYP PFNGLCULLFACEPROC)(GLenum mode)
GLubyte GLubyte GLubyte GLubyte w
Definition glcorearb.h:852
uint32_t calink
Definition GPUTPCDef.h:30
std::vector< int > row