325 deepVectorClear(mPrimaryVertices);
326 deepVectorClear(mPrimaryVerticesLabels);
328 clearResizeBoundedVector(mLinesLabels, getNrof(1), mMemoryPool.get());
329 mIndexTableUtils.setTrackingParameters(trkParam);
330 clearResizeBoundedVector(mPositionResolution, NLayers, mMemoryPool.get());
331 clearResizeBoundedVector(mBogusClusters, NLayers, mMemoryPool.get());
332 deepVectorClear(mTrackletClusters);
333 for (
unsigned int iLayer{0}; iLayer < std::min((
int)mClusters.size(), maxLayers); ++iLayer) {
334 clearResizeBoundedVector(mUsedClusters[iLayer], mUnsortedClusters[iLayer].
size(), getMaybeFrameworkHostResource(maxLayers != NLayers));
337 clearResizeBoundedVector(mLines, getNrof(1), mMemoryPool.get());
338 clearResizeBoundedVector(mLinesQuality, getNrof(1), mMemoryPool.get());
339 clearResizeBoundedVector(mTrackletClusters, getNrof(1), mMemoryPool.get());
340 allocateClusterSortStorage(trkParam, maxLayers);
341 for (
int iLayer{0}; iLayer < trkParam.
NLayers; ++iLayer) {
342 if (mSystErrorsApplied.has(iLayer)) {
346 mSystErrorsApplied.set(iLayer);
347 for (
auto& tfInfo : mTrackingFrameInfo[iLayer]) {
348 tfInfo.covarianceTrackingFrame[0] += trkParam.
SystErrorY2[iLayer];
349 tfInfo.covarianceTrackingFrame[2] += trkParam.
SystErrorZ2[iLayer];
354 mMinR.fill(std::numeric_limits<float>::max());
355 mMaxR.fill(std::numeric_limits<float>::min());
368 mNTrackletsPerROF.resize(2);
369 for (
auto&
v : mNTrackletsPerROF) {
370 v = bounded_vector<int>(getNrof(1) + 1, 0, mMemoryPool.get());
372 for (
int i = 0;
i < 2; ++
i) {
373 mNTrackletsPerCluster[
i].assign(mUnsortedClusters[1].
size(), 0);
374 mNTrackletsPerClusterSum[
i].assign(mUnsortedClusters[1].
size() + 1, 0);
377 prepareClusters(trkParam, maxLayers);
379 mTotalTracklets = {0, 0};
380 if (maxLayers < trkParam.
NLayers) {
381 for (
size_t iLayer{0}; iLayer < maxLayers; ++iLayer) {
388 std::array<float, NLayers> msAngles{};
389 for (
unsigned int iLayer{0}; iLayer < NLayers; ++iLayer) {
395 float oneOverR{0.001f * 0.3f * std::abs(mBz) / trkParam.
TrackletMinPt};
396 for (
int linkId{0}; linkId < (
int)mTracklets.size(); ++linkId) {
397 const auto&
link = mTrackingTopologyView.getLink(linkId);
400 ms2 += math_utils::Sq(msAngles[
layer]);
402 mLinkMSAngles[linkId] = o2::gpu::CAMath::Sqrt(ms2);
405 oneOverR = (0.5 * oneOverR >= 1.f / r2) ? (2.f / r2) - o2::constants::math::Almost0 : oneOverR;
406 const float res1 = o2::gpu::CAMath::Hypot(trkParam.
PVres, mPositionResolution[
link.fromLayer]);
407 const float res2 = o2::gpu::CAMath::Hypot(trkParam.
PVres, mPositionResolution[
link.toLayer]);
408 const float cosTheta1half = o2::gpu::CAMath::Sqrt(1.f - math_utils::Sq(0.5f * r1 * oneOverR));
409 const float cosTheta2half = o2::gpu::CAMath::Sqrt(1.f - math_utils::Sq(0.5f * r2 * oneOverR));
410 float x = (r2 * cosTheta1half) - (r1 * cosTheta2half);
411 float delta = o2::gpu::CAMath::Sqrt(1.f / (1.f - 0.25f * math_utils::Sq(
x * oneOverR)) * (math_utils::Sq((0.25f * r1 * r2 * math_utils::Sq(oneOverR) / cosTheta2half) + cosTheta1half) * math_utils::Sq(res1) + math_utils::Sq((0.25f * r1 * r2 * math_utils::Sq(oneOverR) / cosTheta1half) + cosTheta2half) * math_utils::Sq(res2)));
413 mLinkPhiCuts[linkId] = o2::gpu::CAMath::Min(o2::gpu::CAMath::ASin(0.5f *
x * oneOverR) + 2.f * mLinkMSAngles[linkId] + delta, o2::constants::math::PI * 0.5f);
419 mTrackletsLookupTable[linkId].resize(mClusters[
link.fromLayer].size() + 1, 0);
422 for (
int cellId{0}; cellId < (
int)mCells.size(); ++cellId) {
432template <
int NLayers>
435 unsigned long size{0};
436 for (
const auto& trkl : mTracklets) {
439 for (
const auto&
cells : mCells) {
442 for (
const auto& cellsN : mCellsNeighbours) {
443 size +=
sizeof(int) * cellsN.size();
445 for (
const auto& cellsN : mCellsNeighboursTopology) {
446 size +=
sizeof(int) * cellsN.size();
451template <
int NLayers>
454 LOGP(info,
"TimeFrame: Artefacts occupy {:.2f} MB", getArtefactsMemory() /
constants::MB);
457template <
int NLayers>
460 for (ushort iLayer = 0; iLayer < 2; ++iLayer) {
461 for (
unsigned int iRof{0}; iRof < getNrof(1); ++iRof) {
462 if (mROFMaskView.isROFEnabled(1, iRof)) {
463 mTotalTracklets[iLayer] += mNTrackletsPerROF[iLayer][iRof];
466 std::exclusive_scan(mNTrackletsPerROF[iLayer].begin(), mNTrackletsPerROF[iLayer].
end(), mNTrackletsPerROF[iLayer].begin(), 0);
467 std::exclusive_scan(mNTrackletsPerCluster[iLayer].begin(), mNTrackletsPerCluster[iLayer].
end(), mNTrackletsPerClusterSum[iLayer].begin(), 0);
471template <
int NLayers>
476 auto initVector = [&]<
typename T>(bounded_vector<T>&
vec,
bool useExternal =
false) {
478 deepVectorClear(
vec, mr);
481 auto initContainers = [&]<
typename Container>(Container& container,
bool useExternal =
false) {
482 for (
auto&
v : container) {
483 initVector(
v, useExternal);
488 initContainers(mClusterExternalIndices);
489 initContainers(mNTrackletsPerCluster);
490 initContainers(mNTrackletsPerClusterSum);
491 initContainers(mNClustersPerROF);
492 initVector(mPrimaryVertices);
493 initVector(mLinkPhiCuts);
494 initVector(mLinkMSAngles);
495 initVector(mPositionResolution);
496 initContainers(mClusterSize);
497 initVector(mPValphaX);
498 initVector(mBogusClusters);
499 initContainers(mTrackletsIndexROF);
501 initContainers(mTracklets);
502 initContainers(mCells);
503 initContainers(mCellsNeighbours);
504 initContainers(mCellsLookupTable);
506 initVector(mPrimaryVerticesLabels);
507 initContainers(mLinesLabels);
508 initContainers(mTrackletLabels);
509 initContainers(mCellLabels);
510 initVector(mTracksLabel);
512 initContainers(mClusters, hasFrameworkAllocator());
513 initContainers(mUsedClusters, hasFrameworkAllocator());
514 initContainers(mUnsortedClusters, hasFrameworkAllocator());
515 initContainers(mIndexTables, hasFrameworkAllocator());
516 initContainers(mTrackingFrameInfo, hasFrameworkAllocator());
517 initContainers(mROFramesClusters, hasFrameworkAllocator());
520template <
int NLayers>
523 mExternalAllocator = ext;
524 mExtMemoryPool = std::make_shared<BoundedMemoryResource>(std::make_unique<ExternalAllocatorAdaptor>(mExternalAllocator));
527template <
int NLayers>
530 resetTrackExtensionCounters();
531 deepVectorClear(mTracks);
532 deepVectorClear(mTracklets);
533 deepVectorClear(mCells);
534 deepVectorClear(mCellsNeighbours);
535 deepVectorClear(mCellsNeighboursTopology);
536 deepVectorClear(mCellsLookupTable);
537 deepVectorClear(mPrimaryVertices);
538 deepVectorClear(mTrackletsLookupTable);
539 deepVectorClear(mClusterExternalIndices);
540 deepVectorClear(mNTrackletsPerCluster);
541 deepVectorClear(mNTrackletsPerClusterSum);
542 deepVectorClear(mNClustersPerROF);
543 deepVectorClear(mLinkPhiCuts);
544 deepVectorClear(mLinkMSAngles);
545 deepVectorClear(mPositionResolution);
546 deepVectorClear(mClusterSize);
547 deepVectorClear(mPValphaX);
548 deepVectorClear(mBogusClusters);
549 deepVectorClear(mTrackletsIndexROF);
550 deepVectorClear(mTrackletClusters);
551 deepVectorClear(mLines);
552 deepVectorClear(mLinesQuality);
555 if (!hasFrameworkAllocator()) {
556 deepVectorClear(mClusters);
557 deepVectorClear(mUsedClusters);
558 deepVectorClear(mUnsortedClusters);
559 deepVectorClear(mIndexTables);
560 deepVectorClear(mTrackingFrameInfo);
562 deepVectorClear(mROFramesClusters);
565 if (hasMCinformation()) {
566 deepVectorClear(mLinesLabels);
567 deepVectorClear(mPrimaryVerticesLabels);
568 deepVectorClear(mTrackletLabels);
569 deepVectorClear(mCellLabels);
570 deepVectorClear(mTracksLabel);
576#ifdef ENABLE_UPGRADES