63 int endROF{mTimeFrameGPU->getNrof()};
66 for (
int iLayer{nLayers}; iLayer-- > nLayers - 2;) {
67 mTimeFrameGPU->createUsedClustersDevice(iteration, iLayer);
68 mTimeFrameGPU->loadClustersDevice(iteration, iLayer);
69 mTimeFrameGPU->loadClustersIndexTables(iteration, iLayer);
70 mTimeFrameGPU->loadROFrameClustersDevice(iteration, iLayer);
71 mTimeFrameGPU->recordEvent(iLayer);
74 for (
int iLayer{this->mTrkParams[iteration].TrackletsPerRoad()}; iLayer--;) {
76 mTimeFrameGPU->createUsedClustersDevice(iteration, iLayer - 1);
77 mTimeFrameGPU->loadClustersDevice(iteration, iLayer - 1);
78 mTimeFrameGPU->loadClustersIndexTables(iteration, iLayer - 1);
79 mTimeFrameGPU->loadROFrameClustersDevice(iteration, iLayer - 1);
80 mTimeFrameGPU->recordEvent(iLayer - 1);
82 mTimeFrameGPU->createTrackletsLUTDevice(iteration, iLayer);
83 mTimeFrameGPU->waitEvent(iLayer, iLayer + 1);
84 countTrackletsInROFsHandler<nLayers>(mTimeFrameGPU->getDeviceIndexTableUtils(),
85 mTimeFrameGPU->getDeviceMultCutMask(),
89 mTimeFrameGPU->getNrof(),
90 this->mTrkParams[iteration].DeltaROF,
92 mTimeFrameGPU->getDeviceVertices(),
93 mTimeFrameGPU->getDeviceROFramesPV(),
94 mTimeFrameGPU->getPrimaryVerticesNum(),
95 mTimeFrameGPU->getDeviceArrayClusters(),
96 mTimeFrameGPU->getClusterSizes(),
97 mTimeFrameGPU->getDeviceROFrameClusters(),
98 (
const uint8_t**)mTimeFrameGPU->getDeviceArrayUsedClusters(),
99 mTimeFrameGPU->getDeviceArrayClustersIndexTables(),
100 mTimeFrameGPU->getDeviceArrayTrackletsLUT(),
101 mTimeFrameGPU->getDeviceTrackletsLUTs(),
103 this->mTrkParams[iteration].NSigmaCut,
104 mTimeFrameGPU->getPhiCuts(),
105 this->mTrkParams[iteration].PVres,
106 mTimeFrameGPU->getMinRs(),
107 mTimeFrameGPU->getMaxRs(),
108 mTimeFrameGPU->getPositionResolutions(),
109 this->mTrkParams[iteration].LayerRadii,
110 mTimeFrameGPU->getMSangles(),
111 mTimeFrameGPU->getExternalDeviceAllocator(),
112 conf.nBlocksLayerTracklets[iteration],
113 conf.nThreadsLayerTracklets[iteration],
114 mTimeFrameGPU->getStreams());
115 mTimeFrameGPU->createTrackletsBuffers(iLayer);
116 if (mTimeFrameGPU->getNTracklets()[iLayer] == 0) {
119 computeTrackletsInROFsHandler<nLayers>(mTimeFrameGPU->getDeviceIndexTableUtils(),
120 mTimeFrameGPU->getDeviceMultCutMask(),
124 mTimeFrameGPU->getNrof(),
125 this->mTrkParams[iteration].DeltaROF,
127 mTimeFrameGPU->getDeviceVertices(),
128 mTimeFrameGPU->getDeviceROFramesPV(),
129 mTimeFrameGPU->getPrimaryVerticesNum(),
130 mTimeFrameGPU->getDeviceArrayClusters(),
131 mTimeFrameGPU->getClusterSizes(),
132 mTimeFrameGPU->getDeviceROFrameClusters(),
133 (
const uint8_t**)mTimeFrameGPU->getDeviceArrayUsedClusters(),
134 mTimeFrameGPU->getDeviceArrayClustersIndexTables(),
135 mTimeFrameGPU->getDeviceArrayTracklets(),
136 mTimeFrameGPU->getDeviceTracklets(),
137 mTimeFrameGPU->getNTracklets(),
138 mTimeFrameGPU->getDeviceArrayTrackletsLUT(),
139 mTimeFrameGPU->getDeviceTrackletsLUTs(),
141 this->mTrkParams[iteration].NSigmaCut,
142 mTimeFrameGPU->getPhiCuts(),
143 this->mTrkParams[iteration].PVres,
144 mTimeFrameGPU->getMinRs(),
145 mTimeFrameGPU->getMaxRs(),
146 mTimeFrameGPU->getPositionResolutions(),
147 this->mTrkParams[iteration].LayerRadii,
148 mTimeFrameGPU->getMSangles(),
149 mTimeFrameGPU->getExternalDeviceAllocator(),
150 conf.nBlocksLayerTracklets[iteration],
151 conf.nThreadsLayerTracklets[iteration],
152 mTimeFrameGPU->getStreams());
162 for (
int iLayer{nLayers}; iLayer-- > nLayers - 3;) {
163 mTimeFrameGPU->loadUnsortedClustersDevice(iteration, iLayer);
164 mTimeFrameGPU->loadTrackingFrameInfoDevice(iteration, iLayer);
165 mTimeFrameGPU->recordEvent(iLayer);
168 for (
int iLayer{this->mTrkParams[iteration].CellsPerRoad()}; iLayer--;) {
170 mTimeFrameGPU->loadUnsortedClustersDevice(iteration, iLayer - 1);
171 mTimeFrameGPU->loadTrackingFrameInfoDevice(iteration, iLayer - 1);
172 mTimeFrameGPU->recordEvent(iLayer - 1);
176 const int currentLayerTrackletsNum{
static_cast<int>(mTimeFrameGPU->getNTracklets()[iLayer])};
177 if (!currentLayerTrackletsNum || !mTimeFrameGPU->getNTracklets()[iLayer + 1]) {
178 mTimeFrameGPU->getNCells()[iLayer] = 0;
182 mTimeFrameGPU->createCellsLUTDevice(iLayer);
183 mTimeFrameGPU->waitEvent(iLayer, iLayer + 1);
184 mTimeFrameGPU->waitEvent(iLayer, iLayer + 2);
185 countCellsHandler<nLayers>(mTimeFrameGPU->getDeviceArrayClusters(),
186 mTimeFrameGPU->getDeviceArrayUnsortedClusters(),
187 mTimeFrameGPU->getDeviceArrayTrackingFrameInfo(),
188 mTimeFrameGPU->getDeviceArrayTracklets(),
189 mTimeFrameGPU->getDeviceArrayTrackletsLUT(),
190 currentLayerTrackletsNum,
193 mTimeFrameGPU->getDeviceArrayCellsLUT(),
194 mTimeFrameGPU->getDeviceCellLUTs()[iLayer],
195 this->mTrkParams[iteration].DeltaROF,
197 this->mTrkParams[iteration].MaxChi2ClusterAttachment,
198 this->mTrkParams[iteration].CellDeltaTanLambdaSigma,
199 this->mTrkParams[iteration].NSigmaCut,
200 mTimeFrameGPU->getExternalDeviceAllocator(),
201 conf.nBlocksLayerCells[iteration],
202 conf.nThreadsLayerCells[iteration],
203 mTimeFrameGPU->getStreams());
204 mTimeFrameGPU->createCellsBuffers(iLayer);
205 if (mTimeFrameGPU->getNCells()[iLayer] == 0) {
208 computeCellsHandler<nLayers>(mTimeFrameGPU->getDeviceArrayClusters(),
209 mTimeFrameGPU->getDeviceArrayUnsortedClusters(),
210 mTimeFrameGPU->getDeviceArrayTrackingFrameInfo(),
211 mTimeFrameGPU->getDeviceArrayTracklets(),
212 mTimeFrameGPU->getDeviceArrayTrackletsLUT(),
213 currentLayerTrackletsNum,
215 mTimeFrameGPU->getDeviceCells()[iLayer],
216 mTimeFrameGPU->getDeviceArrayCellsLUT(),
217 mTimeFrameGPU->getDeviceCellLUTs()[iLayer],
218 this->mTrkParams[iteration].DeltaROF,
220 this->mTrkParams[iteration].MaxChi2ClusterAttachment,
221 this->mTrkParams[iteration].CellDeltaTanLambdaSigma,
222 this->mTrkParams[iteration].NSigmaCut,
223 conf.nBlocksLayerCells[iteration],
224 conf.nThreadsLayerCells[iteration],
225 mTimeFrameGPU->getStreams());
234 for (
int iLayer{0}; iLayer < this->mTrkParams[iteration].NeighboursPerRoad(); ++iLayer) {
235 const int currentLayerCellsNum{
static_cast<int>(mTimeFrameGPU->getNCells()[iLayer])};
236 const int nextLayerCellsNum{
static_cast<int>(mTimeFrameGPU->getNCells()[iLayer + 1])};
237 if (!nextLayerCellsNum || !currentLayerCellsNum) {
238 mTimeFrameGPU->getNNeighbours()[iLayer] = 0;
241 mTimeFrameGPU->createNeighboursIndexTablesDevice(iLayer);
242 mTimeFrameGPU->createNeighboursLUTDevice(iLayer, nextLayerCellsNum);
243 countCellNeighboursHandler<nLayers>(mTimeFrameGPU->getDeviceArrayCells(),
244 mTimeFrameGPU->getDeviceNeighboursLUT(iLayer),
245 mTimeFrameGPU->getDeviceArrayCellsLUT(),
246 mTimeFrameGPU->getDeviceNeighbourPairs(iLayer),
247 mTimeFrameGPU->getDeviceNeighboursIndexTables(iLayer),
248 (
const Tracklet**)mTimeFrameGPU->getDeviceArrayTracklets(),
249 this->mTrkParams[0].DeltaROF,
250 this->mTrkParams[0].MaxChi2ClusterAttachment,
253 currentLayerCellsNum,
256 mTimeFrameGPU->getExternalDeviceAllocator(),
257 conf.nBlocksFindNeighbours[iteration],
258 conf.nThreadsFindNeighbours[iteration],
259 mTimeFrameGPU->getStream(iLayer));
260 mTimeFrameGPU->createNeighboursDevice(iLayer);
261 if (mTimeFrameGPU->getNNeighbours()[iLayer] == 0) {
264 computeCellNeighboursHandler<nLayers>(mTimeFrameGPU->getDeviceArrayCells(),
265 mTimeFrameGPU->getDeviceNeighboursLUT(iLayer),
266 mTimeFrameGPU->getDeviceArrayCellsLUT(),
267 mTimeFrameGPU->getDeviceNeighbourPairs(iLayer),
268 mTimeFrameGPU->getDeviceNeighboursIndexTables(iLayer),
269 (
const Tracklet**)mTimeFrameGPU->getDeviceArrayTracklets(),
270 this->mTrkParams[0].DeltaROF,
271 this->mTrkParams[0].MaxChi2ClusterAttachment,
274 currentLayerCellsNum,
277 conf.nBlocksFindNeighbours[iteration],
278 conf.nThreadsFindNeighbours[iteration],
279 mTimeFrameGPU->getStream(iLayer));
281 mTimeFrameGPU->getDeviceNeighbours(iLayer),
282 mTimeFrameGPU->getArrayNNeighbours()[iLayer],
283 mTimeFrameGPU->getStream(iLayer),
284 mTimeFrameGPU->getExternalDeviceAllocator());
286 mTimeFrameGPU->syncStreams(
false);
293 for (
int startLevel{this->mTrkParams[iteration].CellsPerRoad()}; startLevel >= this->mTrkParams[iteration].CellMinimumLevel(); --startLevel) {
294 const int minimumLayer{startLevel - 1};
296 for (
int startLayer{this->mTrkParams[iteration].CellsPerRoad() - 1}; startLayer >= minimumLayer; --startLayer) {
297 if ((this->mTrkParams[iteration].StartLayerMask & (1 << (startLayer + 2))) == 0) {
300 processNeighboursHandler<nLayers>(startLayer,
302 mTimeFrameGPU->getDeviceArrayCells(),
303 mTimeFrameGPU->getDeviceCells()[startLayer],
304 mTimeFrameGPU->getArrayNCells(),
305 (
const uint8_t**)mTimeFrameGPU->getDeviceArrayUsedClusters(),
306 mTimeFrameGPU->getDeviceNeighboursAll(),
307 mTimeFrameGPU->getDeviceNeighboursLUTs(),
308 mTimeFrameGPU->getDeviceArrayTrackingFrameInfo(),
311 this->mTrkParams[0].MaxChi2ClusterAttachment,
312 this->mTrkParams[0].MaxChi2NDF,
313 mTimeFrameGPU->getDevicePropagator(),
314 this->mTrkParams[0].CorrType,
315 mTimeFrameGPU->getExternalDeviceAllocator(),
316 conf.nBlocksProcessNeighbours[iteration],
317 conf.nThreadsProcessNeighbours[iteration]);
320 if (trackSeeds.empty()) {
321 LOGP(
debug,
"No track seeds found, skipping track finding");
324 mTimeFrameGPU->createTrackITSExtDevice(trackSeeds);
325 mTimeFrameGPU->loadTrackSeedsDevice(trackSeeds);
328 mTimeFrameGPU->getDeviceArrayTrackingFrameInfo(),
329 mTimeFrameGPU->getDeviceTrackITSExt(),
330 this->mTrkParams[iteration].MinPt,
334 this->mTrkParams[0].MaxChi2ClusterAttachment,
335 this->mTrkParams[0].MaxChi2NDF,
336 mTimeFrameGPU->getDevicePropagator(),
337 this->mTrkParams[0].CorrType,
338 conf.nBlocksTracksSeeds[iteration],
339 conf.nThreadsTracksSeeds[iteration]);
341 mTimeFrameGPU->downloadTrackITSExtDevice(trackSeeds);
343 auto& tracks = mTimeFrameGPU->getTrackITSExt();
345 for (
auto& track : tracks) {
346 if (!track.getChi2()) {
350 bool isFirstShared{
false};
351 for (
int iLayer{0}; iLayer < this->mTrkParams[0].NLayers; ++iLayer) {
352 if (track.getClusterIndex(iLayer) == constants::UnusedIndex) {
355 nShared +=
int(mTimeFrameGPU->isClusterUsed(iLayer, track.getClusterIndex(iLayer)));
356 isFirstShared |= !iLayer && mTimeFrameGPU->isClusterUsed(iLayer, track.getClusterIndex(iLayer));
359 if (nShared > this->mTrkParams[0].ClusterSharing) {
363 std::array<int, 3> rofs{INT_MAX, INT_MAX, INT_MAX};
364 for (
int iLayer{0}; iLayer < this->mTrkParams[0].NLayers; ++iLayer) {
365 if (track.getClusterIndex(iLayer) == constants::UnusedIndex) {
368 mTimeFrameGPU->markUsedCluster(iLayer, track.getClusterIndex(iLayer));
369 int currentROF = mTimeFrameGPU->getClusterROF(iLayer, track.getClusterIndex(iLayer));
370 for (
int iR{0}; iR < 3; ++iR) {
371 if (rofs[iR] == INT_MAX) {
372 rofs[iR] = currentROF;
374 if (rofs[iR] == currentROF) {
379 if (rofs[2] != INT_MAX) {
382 if (rofs[1] != INT_MAX) {
383 track.setNextROFbit();
385 mTimeFrameGPU->getTracks(std::min(rofs[0], rofs[1])).emplace_back(track);
387 mTimeFrameGPU->loadUsedClustersDevice();