61 int endROF{mTimeFrameGPU->getNrof()};
64 for (
int iLayer{nLayers}; iLayer-- > nLayers - 2;) {
65 mTimeFrameGPU->createUsedClustersDevice(iteration, iLayer);
66 mTimeFrameGPU->loadClustersDevice(iteration, iLayer);
67 mTimeFrameGPU->loadClustersIndexTables(iteration, iLayer);
68 mTimeFrameGPU->loadROFrameClustersDevice(iteration, iLayer);
69 mTimeFrameGPU->recordEvent(iLayer);
72 for (
int iLayer{this->mTrkParams[iteration].TrackletsPerRoad()}; iLayer--;) {
74 mTimeFrameGPU->createUsedClustersDevice(iteration, iLayer - 1);
75 mTimeFrameGPU->loadClustersDevice(iteration, iLayer - 1);
76 mTimeFrameGPU->loadClustersIndexTables(iteration, iLayer - 1);
77 mTimeFrameGPU->loadROFrameClustersDevice(iteration, iLayer - 1);
78 mTimeFrameGPU->recordEvent(iLayer - 1);
80 mTimeFrameGPU->createTrackletsLUTDevice(iteration, iLayer);
81 mTimeFrameGPU->waitEvent(iLayer, iLayer + 1);
82 countTrackletsInROFsHandler<nLayers>(mTimeFrameGPU->getDeviceIndexTableUtils(),
83 mTimeFrameGPU->getDeviceMultCutMask(),
87 mTimeFrameGPU->getNrof(),
88 this->mTrkParams[iteration].DeltaROF,
90 mTimeFrameGPU->getDeviceVertices(),
91 mTimeFrameGPU->getDeviceROFramesPV(),
92 mTimeFrameGPU->getPrimaryVerticesNum(),
93 mTimeFrameGPU->getDeviceArrayClusters(),
94 mTimeFrameGPU->getClusterSizes(),
95 mTimeFrameGPU->getDeviceROFrameClusters(),
96 mTimeFrameGPU->getDeviceArrayUsedClusters(),
97 mTimeFrameGPU->getDeviceArrayClustersIndexTables(),
98 mTimeFrameGPU->getDeviceArrayTrackletsLUT(),
99 mTimeFrameGPU->getDeviceTrackletsLUTs(),
101 this->mTrkParams[iteration].NSigmaCut,
102 mTimeFrameGPU->getPhiCuts(),
103 this->mTrkParams[iteration].PVres,
104 mTimeFrameGPU->getMinRs(),
105 mTimeFrameGPU->getMaxRs(),
106 mTimeFrameGPU->getPositionResolutions(),
107 this->mTrkParams[iteration].LayerRadii,
108 mTimeFrameGPU->getMSangles(),
109 mTimeFrameGPU->getExternalAllocator(),
110 conf.nBlocksLayerTracklets[iteration],
111 conf.nThreadsLayerTracklets[iteration],
112 mTimeFrameGPU->getStreams());
113 mTimeFrameGPU->createTrackletsBuffers(iLayer);
114 if (mTimeFrameGPU->getNTracklets()[iLayer] == 0) {
117 computeTrackletsInROFsHandler<nLayers>(mTimeFrameGPU->getDeviceIndexTableUtils(),
118 mTimeFrameGPU->getDeviceMultCutMask(),
122 mTimeFrameGPU->getNrof(),
123 this->mTrkParams[iteration].DeltaROF,
125 mTimeFrameGPU->getDeviceVertices(),
126 mTimeFrameGPU->getDeviceROFramesPV(),
127 mTimeFrameGPU->getPrimaryVerticesNum(),
128 mTimeFrameGPU->getDeviceArrayClusters(),
129 mTimeFrameGPU->getClusterSizes(),
130 mTimeFrameGPU->getDeviceROFrameClusters(),
131 mTimeFrameGPU->getDeviceArrayUsedClusters(),
132 mTimeFrameGPU->getDeviceArrayClustersIndexTables(),
133 mTimeFrameGPU->getDeviceArrayTracklets(),
134 mTimeFrameGPU->getDeviceTracklets(),
135 mTimeFrameGPU->getNTracklets(),
136 mTimeFrameGPU->getDeviceArrayTrackletsLUT(),
137 mTimeFrameGPU->getDeviceTrackletsLUTs(),
139 this->mTrkParams[iteration].NSigmaCut,
140 mTimeFrameGPU->getPhiCuts(),
141 this->mTrkParams[iteration].PVres,
142 mTimeFrameGPU->getMinRs(),
143 mTimeFrameGPU->getMaxRs(),
144 mTimeFrameGPU->getPositionResolutions(),
145 this->mTrkParams[iteration].LayerRadii,
146 mTimeFrameGPU->getMSangles(),
147 mTimeFrameGPU->getExternalAllocator(),
148 conf.nBlocksLayerTracklets[iteration],
149 conf.nThreadsLayerTracklets[iteration],
150 mTimeFrameGPU->getStreams());
160 for (
int iLayer{nLayers}; iLayer-- > nLayers - 3;) {
161 mTimeFrameGPU->loadUnsortedClustersDevice(iteration, iLayer);
162 mTimeFrameGPU->loadTrackingFrameInfoDevice(iteration, iLayer);
163 mTimeFrameGPU->recordEvent(iLayer);
166 for (
int iLayer{this->mTrkParams[iteration].CellsPerRoad()}; iLayer--;) {
168 mTimeFrameGPU->loadUnsortedClustersDevice(iteration, iLayer - 1);
169 mTimeFrameGPU->loadTrackingFrameInfoDevice(iteration, iLayer - 1);
170 mTimeFrameGPU->recordEvent(iLayer - 1);
174 const int currentLayerTrackletsNum{
static_cast<int>(mTimeFrameGPU->getNTracklets()[iLayer])};
175 if (!currentLayerTrackletsNum || !mTimeFrameGPU->getNTracklets()[iLayer + 1]) {
176 mTimeFrameGPU->getNCells()[iLayer] = 0;
180 mTimeFrameGPU->createCellsLUTDevice(iLayer);
181 mTimeFrameGPU->waitEvent(iLayer, iLayer + 1);
182 mTimeFrameGPU->waitEvent(iLayer, iLayer + 2);
183 countCellsHandler<nLayers>(mTimeFrameGPU->getDeviceArrayClusters(),
184 mTimeFrameGPU->getDeviceArrayUnsortedClusters(),
185 mTimeFrameGPU->getDeviceArrayTrackingFrameInfo(),
186 mTimeFrameGPU->getDeviceArrayTracklets(),
187 mTimeFrameGPU->getDeviceArrayTrackletsLUT(),
188 currentLayerTrackletsNum,
191 mTimeFrameGPU->getDeviceArrayCellsLUT(),
192 mTimeFrameGPU->getDeviceCellLUTs()[iLayer],
193 this->mTrkParams[iteration].DeltaROF,
195 this->mTrkParams[iteration].MaxChi2ClusterAttachment,
196 this->mTrkParams[iteration].CellDeltaTanLambdaSigma,
197 this->mTrkParams[iteration].NSigmaCut,
198 mTimeFrameGPU->getExternalAllocator(),
199 conf.nBlocksLayerCells[iteration],
200 conf.nThreadsLayerCells[iteration],
201 mTimeFrameGPU->getStreams());
202 mTimeFrameGPU->createCellsBuffers(iLayer);
203 if (mTimeFrameGPU->getNCells()[iLayer] == 0) {
206 computeCellsHandler<nLayers>(mTimeFrameGPU->getDeviceArrayClusters(),
207 mTimeFrameGPU->getDeviceArrayUnsortedClusters(),
208 mTimeFrameGPU->getDeviceArrayTrackingFrameInfo(),
209 mTimeFrameGPU->getDeviceArrayTracklets(),
210 mTimeFrameGPU->getDeviceArrayTrackletsLUT(),
211 currentLayerTrackletsNum,
213 mTimeFrameGPU->getDeviceCells()[iLayer],
214 mTimeFrameGPU->getDeviceArrayCellsLUT(),
215 mTimeFrameGPU->getDeviceCellLUTs()[iLayer],
216 this->mTrkParams[iteration].DeltaROF,
218 this->mTrkParams[iteration].MaxChi2ClusterAttachment,
219 this->mTrkParams[iteration].CellDeltaTanLambdaSigma,
220 this->mTrkParams[iteration].NSigmaCut,
221 conf.nBlocksLayerCells[iteration],
222 conf.nThreadsLayerCells[iteration],
223 mTimeFrameGPU->getStreams());
232 for (
int iLayer{0}; iLayer < this->mTrkParams[iteration].NeighboursPerRoad(); ++iLayer) {
233 const int currentLayerCellsNum{
static_cast<int>(mTimeFrameGPU->getNCells()[iLayer])};
234 const int nextLayerCellsNum{
static_cast<int>(mTimeFrameGPU->getNCells()[iLayer + 1])};
235 if (!nextLayerCellsNum || !currentLayerCellsNum) {
236 mTimeFrameGPU->getNNeighbours()[iLayer] = 0;
239 mTimeFrameGPU->createNeighboursIndexTablesDevice(iLayer);
240 mTimeFrameGPU->createNeighboursLUTDevice(iLayer, nextLayerCellsNum);
241 countCellNeighboursHandler<nLayers>(mTimeFrameGPU->getDeviceArrayCells(),
242 mTimeFrameGPU->getDeviceNeighboursLUT(iLayer),
243 mTimeFrameGPU->getDeviceArrayCellsLUT(),
244 mTimeFrameGPU->getDeviceNeighbourPairs(iLayer),
245 mTimeFrameGPU->getDeviceNeighboursIndexTables(iLayer),
246 (
const Tracklet**)mTimeFrameGPU->getDeviceArrayTracklets(),
247 this->mTrkParams[0].DeltaROF,
248 this->mTrkParams[0].MaxChi2ClusterAttachment,
251 currentLayerCellsNum,
254 mTimeFrameGPU->getExternalAllocator(),
255 conf.nBlocksFindNeighbours[iteration],
256 conf.nThreadsFindNeighbours[iteration],
257 mTimeFrameGPU->getStream(iLayer));
258 mTimeFrameGPU->createNeighboursDevice(iLayer);
259 if (mTimeFrameGPU->getNNeighbours()[iLayer] == 0) {
262 computeCellNeighboursHandler<nLayers>(mTimeFrameGPU->getDeviceArrayCells(),
263 mTimeFrameGPU->getDeviceNeighboursLUT(iLayer),
264 mTimeFrameGPU->getDeviceArrayCellsLUT(),
265 mTimeFrameGPU->getDeviceNeighbourPairs(iLayer),
266 mTimeFrameGPU->getDeviceNeighboursIndexTables(iLayer),
267 (
const Tracklet**)mTimeFrameGPU->getDeviceArrayTracklets(),
268 this->mTrkParams[0].DeltaROF,
269 this->mTrkParams[0].MaxChi2ClusterAttachment,
272 currentLayerCellsNum,
275 conf.nBlocksFindNeighbours[iteration],
276 conf.nThreadsFindNeighbours[iteration],
277 mTimeFrameGPU->getStream(iLayer));
279 mTimeFrameGPU->getDeviceNeighbours(iLayer),
280 mTimeFrameGPU->getArrayNNeighbours()[iLayer],
281 mTimeFrameGPU->getStream(iLayer),
282 mTimeFrameGPU->getExternalAllocator());
284 mTimeFrameGPU->syncStreams(
false);
291 for (
int startLevel{this->mTrkParams[iteration].CellsPerRoad()}; startLevel >= this->mTrkParams[iteration].CellMinimumLevel(); --startLevel) {
292 const int minimumLayer{startLevel - 1};
294 for (
int startLayer{this->mTrkParams[iteration].CellsPerRoad() - 1}; startLayer >= minimumLayer; --startLayer) {
295 if ((this->mTrkParams[iteration].StartLayerMask & (1 << (startLayer + 2))) == 0) {
298 processNeighboursHandler<nLayers>(startLayer,
300 mTimeFrameGPU->getDeviceArrayCells(),
301 mTimeFrameGPU->getDeviceCells()[startLayer],
302 mTimeFrameGPU->getArrayNCells(),
303 mTimeFrameGPU->getDeviceArrayUsedClusters(),
304 mTimeFrameGPU->getDeviceNeighboursAll(),
305 mTimeFrameGPU->getDeviceNeighboursLUTs(),
306 mTimeFrameGPU->getDeviceArrayTrackingFrameInfo(),
309 this->mTrkParams[0].MaxChi2ClusterAttachment,
310 this->mTrkParams[0].MaxChi2NDF,
311 mTimeFrameGPU->getDevicePropagator(),
312 this->mTrkParams[0].CorrType,
313 mTimeFrameGPU->getExternalAllocator(),
314 conf.nBlocksProcessNeighbours[iteration],
315 conf.nThreadsProcessNeighbours[iteration]);
318 if (trackSeeds.empty()) {
319 LOGP(
debug,
"No track seeds found, skipping track finding");
322 mTimeFrameGPU->createTrackITSExtDevice(trackSeeds);
323 mTimeFrameGPU->loadTrackSeedsDevice(trackSeeds);
326 mTimeFrameGPU->getDeviceArrayTrackingFrameInfo(),
327 mTimeFrameGPU->getDeviceTrackITSExt(),
328 this->mTrkParams[iteration].MinPt,
332 this->mTrkParams[0].MaxChi2ClusterAttachment,
333 this->mTrkParams[0].MaxChi2NDF,
334 mTimeFrameGPU->getDevicePropagator(),
335 this->mTrkParams[0].CorrType,
336 conf.nBlocksTracksSeeds[iteration],
337 conf.nThreadsTracksSeeds[iteration]);
339 mTimeFrameGPU->downloadTrackITSExtDevice(trackSeeds);
341 auto& tracks = mTimeFrameGPU->getTrackITSExt();
343 for (
auto& track : tracks) {
344 if (!track.getChi2()) {
348 bool isFirstShared{
false};
349 for (
int iLayer{0}; iLayer < this->mTrkParams[0].NLayers; ++iLayer) {
350 if (track.getClusterIndex(iLayer) == constants::UnusedIndex) {
353 nShared +=
int(mTimeFrameGPU->isClusterUsed(iLayer, track.getClusterIndex(iLayer)));
354 isFirstShared |= !iLayer && mTimeFrameGPU->isClusterUsed(iLayer, track.getClusterIndex(iLayer));
357 if (nShared > this->mTrkParams[0].ClusterSharing) {
361 std::array<int, 3> rofs{INT_MAX, INT_MAX, INT_MAX};
362 for (
int iLayer{0}; iLayer < this->mTrkParams[0].NLayers; ++iLayer) {
363 if (track.getClusterIndex(iLayer) == constants::UnusedIndex) {
366 mTimeFrameGPU->markUsedCluster(iLayer, track.getClusterIndex(iLayer));
367 int currentROF = mTimeFrameGPU->getClusterROF(iLayer, track.getClusterIndex(iLayer));
368 for (
int iR{0}; iR < 3; ++iR) {
369 if (rofs[iR] == INT_MAX) {
370 rofs[iR] = currentROF;
372 if (rofs[iR] == currentROF) {
377 if (rofs[2] != INT_MAX) {
380 if (rofs[1] != INT_MAX) {
381 track.setNextROFbit();
383 mTimeFrameGPU->getTracks(std::min(rofs[0], rofs[1])).emplace_back(track);
385 mTimeFrameGPU->loadUsedClustersDevice();