64 int endROF{mTimeFrameGPU->getNrof()};
67 for (
int iLayer{nLayers}; iLayer-- > nLayers - 2;) {
68 mTimeFrameGPU->createUsedClustersDevice(iteration, iLayer);
69 mTimeFrameGPU->loadClustersDevice(iteration, iLayer);
70 mTimeFrameGPU->loadClustersIndexTables(iteration, iLayer);
71 mTimeFrameGPU->loadROFrameClustersDevice(iteration, iLayer);
72 mTimeFrameGPU->recordEvent(iLayer);
75 for (
int iLayer{this->mTrkParams[iteration].TrackletsPerRoad()}; iLayer--;) {
77 mTimeFrameGPU->createUsedClustersDevice(iteration, iLayer - 1);
78 mTimeFrameGPU->loadClustersDevice(iteration, iLayer - 1);
79 mTimeFrameGPU->loadClustersIndexTables(iteration, iLayer - 1);
80 mTimeFrameGPU->loadROFrameClustersDevice(iteration, iLayer - 1);
81 mTimeFrameGPU->recordEvent(iLayer - 1);
83 mTimeFrameGPU->createTrackletsLUTDevice(iteration, iLayer);
84 mTimeFrameGPU->waitEvent(iLayer, iLayer + 1);
85 countTrackletsInROFsHandler<nLayers>(mTimeFrameGPU->getDeviceIndexTableUtils(),
86 mTimeFrameGPU->getDeviceMultCutMask(),
90 mTimeFrameGPU->getNrof(),
91 this->mTrkParams[iteration].DeltaROF,
93 mTimeFrameGPU->getDeviceVertices(),
94 mTimeFrameGPU->getDeviceROFramesPV(),
95 mTimeFrameGPU->getPrimaryVerticesNum(),
96 mTimeFrameGPU->getDeviceArrayClusters(),
97 mTimeFrameGPU->getClusterSizes(),
98 mTimeFrameGPU->getDeviceROFrameClusters(),
99 (
const uint8_t**)mTimeFrameGPU->getDeviceArrayUsedClusters(),
100 mTimeFrameGPU->getDeviceArrayClustersIndexTables(),
101 mTimeFrameGPU->getDeviceArrayTrackletsLUT(),
102 mTimeFrameGPU->getDeviceTrackletsLUTs(),
104 this->mTrkParams[iteration].NSigmaCut,
105 mTimeFrameGPU->getPhiCuts(),
106 this->mTrkParams[iteration].PVres,
107 mTimeFrameGPU->getMinRs(),
108 mTimeFrameGPU->getMaxRs(),
109 mTimeFrameGPU->getPositionResolutions(),
110 this->mTrkParams[iteration].LayerRadii,
111 mTimeFrameGPU->getMSangles(),
112 mTimeFrameGPU->getFrameworkAllocator(),
113 conf.nBlocksLayerTracklets[iteration],
114 conf.nThreadsLayerTracklets[iteration],
115 mTimeFrameGPU->getStreams());
116 mTimeFrameGPU->createTrackletsBuffers(iLayer);
117 if (mTimeFrameGPU->getNTracklets()[iLayer] == 0) {
120 computeTrackletsInROFsHandler<nLayers>(mTimeFrameGPU->getDeviceIndexTableUtils(),
121 mTimeFrameGPU->getDeviceMultCutMask(),
125 mTimeFrameGPU->getNrof(),
126 this->mTrkParams[iteration].DeltaROF,
128 mTimeFrameGPU->getDeviceVertices(),
129 mTimeFrameGPU->getDeviceROFramesPV(),
130 mTimeFrameGPU->getPrimaryVerticesNum(),
131 mTimeFrameGPU->getDeviceArrayClusters(),
132 mTimeFrameGPU->getClusterSizes(),
133 mTimeFrameGPU->getDeviceROFrameClusters(),
134 (
const uint8_t**)mTimeFrameGPU->getDeviceArrayUsedClusters(),
135 mTimeFrameGPU->getDeviceArrayClustersIndexTables(),
136 mTimeFrameGPU->getDeviceArrayTracklets(),
137 mTimeFrameGPU->getDeviceTracklets(),
138 mTimeFrameGPU->getNTracklets(),
139 mTimeFrameGPU->getDeviceArrayTrackletsLUT(),
140 mTimeFrameGPU->getDeviceTrackletsLUTs(),
142 this->mTrkParams[iteration].NSigmaCut,
143 mTimeFrameGPU->getPhiCuts(),
144 this->mTrkParams[iteration].PVres,
145 mTimeFrameGPU->getMinRs(),
146 mTimeFrameGPU->getMaxRs(),
147 mTimeFrameGPU->getPositionResolutions(),
148 this->mTrkParams[iteration].LayerRadii,
149 mTimeFrameGPU->getMSangles(),
150 mTimeFrameGPU->getFrameworkAllocator(),
151 conf.nBlocksLayerTracklets[iteration],
152 conf.nThreadsLayerTracklets[iteration],
153 mTimeFrameGPU->getStreams());
163 for (
int iLayer{nLayers}; iLayer-- > nLayers - 3;) {
164 mTimeFrameGPU->loadUnsortedClustersDevice(iteration, iLayer);
165 mTimeFrameGPU->loadTrackingFrameInfoDevice(iteration, iLayer);
166 mTimeFrameGPU->recordEvent(iLayer);
169 for (
int iLayer{this->mTrkParams[iteration].CellsPerRoad()}; iLayer--;) {
171 mTimeFrameGPU->loadUnsortedClustersDevice(iteration, iLayer - 1);
172 mTimeFrameGPU->loadTrackingFrameInfoDevice(iteration, iLayer - 1);
173 mTimeFrameGPU->recordEvent(iLayer - 1);
177 const int currentLayerTrackletsNum{
static_cast<int>(mTimeFrameGPU->getNTracklets()[iLayer])};
178 if (!currentLayerTrackletsNum || !mTimeFrameGPU->getNTracklets()[iLayer + 1]) {
179 mTimeFrameGPU->getNCells()[iLayer] = 0;
183 mTimeFrameGPU->createCellsLUTDevice(iLayer);
184 mTimeFrameGPU->waitEvent(iLayer, iLayer + 1);
185 mTimeFrameGPU->waitEvent(iLayer, iLayer + 2);
186 countCellsHandler<nLayers>(mTimeFrameGPU->getDeviceArrayClusters(),
187 mTimeFrameGPU->getDeviceArrayUnsortedClusters(),
188 mTimeFrameGPU->getDeviceArrayTrackingFrameInfo(),
189 mTimeFrameGPU->getDeviceArrayTracklets(),
190 mTimeFrameGPU->getDeviceArrayTrackletsLUT(),
191 currentLayerTrackletsNum,
194 mTimeFrameGPU->getDeviceArrayCellsLUT(),
195 mTimeFrameGPU->getDeviceCellLUTs()[iLayer],
196 this->mTrkParams[iteration].DeltaROF,
198 this->mTrkParams[iteration].MaxChi2ClusterAttachment,
199 this->mTrkParams[iteration].CellDeltaTanLambdaSigma,
200 this->mTrkParams[iteration].NSigmaCut,
201 mTimeFrameGPU->getFrameworkAllocator(),
202 conf.nBlocksLayerCells[iteration],
203 conf.nThreadsLayerCells[iteration],
204 mTimeFrameGPU->getStreams());
205 mTimeFrameGPU->createCellsBuffers(iLayer);
206 if (mTimeFrameGPU->getNCells()[iLayer] == 0) {
209 computeCellsHandler<nLayers>(mTimeFrameGPU->getDeviceArrayClusters(),
210 mTimeFrameGPU->getDeviceArrayUnsortedClusters(),
211 mTimeFrameGPU->getDeviceArrayTrackingFrameInfo(),
212 mTimeFrameGPU->getDeviceArrayTracklets(),
213 mTimeFrameGPU->getDeviceArrayTrackletsLUT(),
214 currentLayerTrackletsNum,
216 mTimeFrameGPU->getDeviceCells()[iLayer],
217 mTimeFrameGPU->getDeviceArrayCellsLUT(),
218 mTimeFrameGPU->getDeviceCellLUTs()[iLayer],
219 this->mTrkParams[iteration].DeltaROF,
221 this->mTrkParams[iteration].MaxChi2ClusterAttachment,
222 this->mTrkParams[iteration].CellDeltaTanLambdaSigma,
223 this->mTrkParams[iteration].NSigmaCut,
224 conf.nBlocksLayerCells[iteration],
225 conf.nThreadsLayerCells[iteration],
226 mTimeFrameGPU->getStreams());
235 for (
int iLayer{0}; iLayer < this->mTrkParams[iteration].NeighboursPerRoad(); ++iLayer) {
236 const int currentLayerCellsNum{
static_cast<int>(mTimeFrameGPU->getNCells()[iLayer])};
237 const int nextLayerCellsNum{
static_cast<int>(mTimeFrameGPU->getNCells()[iLayer + 1])};
238 if (!nextLayerCellsNum || !currentLayerCellsNum) {
239 mTimeFrameGPU->getNNeighbours()[iLayer] = 0;
242 mTimeFrameGPU->createNeighboursIndexTablesDevice(iLayer);
243 mTimeFrameGPU->createNeighboursLUTDevice(iLayer, nextLayerCellsNum);
244 countCellNeighboursHandler<nLayers>(mTimeFrameGPU->getDeviceArrayCells(),
245 mTimeFrameGPU->getDeviceNeighboursLUT(iLayer),
246 mTimeFrameGPU->getDeviceArrayCellsLUT(),
247 mTimeFrameGPU->getDeviceNeighbourPairs(iLayer),
248 mTimeFrameGPU->getDeviceNeighboursIndexTables(iLayer),
249 (
const Tracklet**)mTimeFrameGPU->getDeviceArrayTracklets(),
250 this->mTrkParams[0].DeltaROF,
251 this->mTrkParams[0].MaxChi2ClusterAttachment,
254 currentLayerCellsNum,
257 mTimeFrameGPU->getFrameworkAllocator(),
258 conf.nBlocksFindNeighbours[iteration],
259 conf.nThreadsFindNeighbours[iteration],
260 mTimeFrameGPU->getStream(iLayer));
261 mTimeFrameGPU->createNeighboursDevice(iLayer);
262 if (mTimeFrameGPU->getNNeighbours()[iLayer] == 0) {
265 computeCellNeighboursHandler<nLayers>(mTimeFrameGPU->getDeviceArrayCells(),
266 mTimeFrameGPU->getDeviceNeighboursLUT(iLayer),
267 mTimeFrameGPU->getDeviceArrayCellsLUT(),
268 mTimeFrameGPU->getDeviceNeighbourPairs(iLayer),
269 mTimeFrameGPU->getDeviceNeighboursIndexTables(iLayer),
270 (
const Tracklet**)mTimeFrameGPU->getDeviceArrayTracklets(),
271 this->mTrkParams[0].DeltaROF,
272 this->mTrkParams[0].MaxChi2ClusterAttachment,
275 currentLayerCellsNum,
278 conf.nBlocksFindNeighbours[iteration],
279 conf.nThreadsFindNeighbours[iteration],
280 mTimeFrameGPU->getStream(iLayer));
282 mTimeFrameGPU->getDeviceNeighbours(iLayer),
283 mTimeFrameGPU->getArrayNNeighbours()[iLayer],
284 mTimeFrameGPU->getStream(iLayer),
285 mTimeFrameGPU->getFrameworkAllocator());
287 mTimeFrameGPU->syncStreams(
false);
294 for (
int startLevel{this->mTrkParams[iteration].CellsPerRoad()}; startLevel >= this->mTrkParams[iteration].CellMinimumLevel(); --startLevel) {
295 const int minimumLayer{startLevel - 1};
297 for (
int startLayer{this->mTrkParams[iteration].CellsPerRoad() - 1}; startLayer >= minimumLayer; --startLayer) {
298 if ((this->mTrkParams[iteration].StartLayerMask & (1 << (startLayer + 2))) == 0) {
301 processNeighboursHandler<nLayers>(startLayer,
303 mTimeFrameGPU->getDeviceArrayCells(),
304 mTimeFrameGPU->getDeviceCells()[startLayer],
305 mTimeFrameGPU->getArrayNCells(),
306 (
const uint8_t**)mTimeFrameGPU->getDeviceArrayUsedClusters(),
307 mTimeFrameGPU->getDeviceNeighboursAll(),
308 mTimeFrameGPU->getDeviceNeighboursLUTs(),
309 mTimeFrameGPU->getDeviceArrayTrackingFrameInfo(),
312 this->mTrkParams[0].MaxChi2ClusterAttachment,
313 this->mTrkParams[0].MaxChi2NDF,
314 mTimeFrameGPU->getDevicePropagator(),
315 this->mTrkParams[0].CorrType,
316 mTimeFrameGPU->getFrameworkAllocator(),
317 conf.nBlocksProcessNeighbours[iteration],
318 conf.nThreadsProcessNeighbours[iteration]);
321 if (trackSeeds.empty()) {
322 LOGP(
debug,
"No track seeds found, skipping track finding");
325 mTimeFrameGPU->createTrackITSExtDevice(trackSeeds);
326 mTimeFrameGPU->loadTrackSeedsDevice(trackSeeds);
329 mTimeFrameGPU->getDeviceArrayTrackingFrameInfo(),
330 mTimeFrameGPU->getDeviceTrackITSExt(),
331 this->mTrkParams[iteration].MinPt,
335 this->mTrkParams[0].MaxChi2ClusterAttachment,
336 this->mTrkParams[0].MaxChi2NDF,
337 mTimeFrameGPU->getDevicePropagator(),
338 this->mTrkParams[0].CorrType,
339 conf.nBlocksTracksSeeds[iteration],
340 conf.nThreadsTracksSeeds[iteration]);
342 mTimeFrameGPU->downloadTrackITSExtDevice(trackSeeds);
344 auto& tracks = mTimeFrameGPU->getTrackITSExt();
346 for (
auto& track : tracks) {
347 if (!track.getChi2()) {
351 bool isFirstShared{
false};
352 for (
int iLayer{0}; iLayer < this->mTrkParams[0].NLayers; ++iLayer) {
353 if (track.getClusterIndex(iLayer) == constants::UnusedIndex) {
356 nShared +=
int(mTimeFrameGPU->isClusterUsed(iLayer, track.getClusterIndex(iLayer)));
357 isFirstShared |= !iLayer && mTimeFrameGPU->isClusterUsed(iLayer, track.getClusterIndex(iLayer));
360 if (nShared > this->mTrkParams[0].ClusterSharing) {
364 std::array<int, 3> rofs{INT_MAX, INT_MAX, INT_MAX};
365 for (
int iLayer{0}; iLayer < this->mTrkParams[0].NLayers; ++iLayer) {
366 if (track.getClusterIndex(iLayer) == constants::UnusedIndex) {
369 mTimeFrameGPU->markUsedCluster(iLayer, track.getClusterIndex(iLayer));
370 int currentROF = mTimeFrameGPU->getClusterROF(iLayer, track.getClusterIndex(iLayer));
371 for (
int iR{0}; iR < 3; ++iR) {
372 if (rofs[iR] == INT_MAX) {
373 rofs[iR] = currentROF;
375 if (rofs[iR] == currentROF) {
380 if (rofs[2] != INT_MAX) {
383 if (rofs[1] != INT_MAX) {
384 track.setNextROFbit();
386 mTimeFrameGPU->getTracks(std::min(rofs[0], rofs[1])).emplace_back(track);
388 mTimeFrameGPU->loadUsedClustersDevice();
391 mTimeFrameGPU->popMemoryStack(iteration);