313 mIndexTableUtils.setTrackingParameters(trkParam);
314 clearResizeBoundedVector(mPositionResolution, trkParam.
NLayers, mMemoryPool.get());
315 clearResizeBoundedVector(mBogusClusters, trkParam.
NLayers, mMemoryPool.get());
316 deepVectorClear(mTrackletClusters);
317 for (
unsigned int iLayer{0}; iLayer < std::min((
int)mClusters.size(), maxLayers); ++iLayer) {
318 clearResizeBoundedVector(mClusters[iLayer], mUnsortedClusters[iLayer].
size(), getMaybeFrameworkHostResource(maxLayers != NLayers));
319 clearResizeBoundedVector(mUsedClusters[iLayer], mUnsortedClusters[iLayer].
size(), getMaybeFrameworkHostResource(maxLayers != NLayers));
322 clearResizeBoundedVector(mLines, getNrof(1), mMemoryPool.get());
323 clearResizeBoundedVector(mTrackletClusters, getNrof(1), mMemoryPool.get());
325 for (
int iLayer{0}; iLayer < NLayers; ++iLayer) {
326 clearResizeBoundedVector(mIndexTables[iLayer], getNrof(iLayer) * ((trkParam.
ZBins * trkParam.
PhiBins) + 1), getMaybeFrameworkHostResource());
328 for (
int iLayer{0}; iLayer < trkParam.
NLayers; ++iLayer) {
330 for (
auto& tfInfo : mTrackingFrameInfo[iLayer]) {
332 tfInfo.covarianceTrackingFrame[0] += trkParam.
SystErrorY2[iLayer];
333 tfInfo.covarianceTrackingFrame[2] += trkParam.
SystErrorZ2[iLayer];
338 mMinR.fill(std::numeric_limits<float>::max());
339 mMaxR.fill(std::numeric_limits<float>::min());
352 mNTrackletsPerROF.resize(2);
353 for (
auto&
v : mNTrackletsPerROF) {
354 v = bounded_vector<int>(getNrof(1) + 1, 0, mMemoryPool.get());
357 prepareClusters(trkParam, maxLayers);
359 mTotalTracklets = {0, 0};
360 if (maxLayers < trkParam.
NLayers) {
361 for (
size_t iLayer{0}; iLayer < maxLayers; ++iLayer) {
368 std::array<float, NLayers> msAngles{};
369 for (
unsigned int iLayer{0}; iLayer < NLayers; ++iLayer) {
375 float oneOverR{0.001f * 0.3f * std::abs(mBz) / trkParam.
TrackletMinPt};
376 for (
int linkId{0}; linkId < (
int)mTracklets.size(); ++linkId) {
377 const auto&
link = mTrackingTopologyView.getLink(linkId);
380 ms2 += math_utils::Sq(msAngles[
layer]);
382 mLinkMSAngles[linkId] = o2::gpu::CAMath::Sqrt(ms2);
385 oneOverR = (0.5 * oneOverR >= 1.f / r2) ? (2.f / r2) - o2::constants::math::Almost0 : oneOverR;
386 const float res1 = o2::gpu::CAMath::Hypot(trkParam.
PVres, mPositionResolution[
link.fromLayer]);
387 const float res2 = o2::gpu::CAMath::Hypot(trkParam.
PVres, mPositionResolution[
link.toLayer]);
388 const float cosTheta1half = o2::gpu::CAMath::Sqrt(1.f - math_utils::Sq(0.5f * r1 * oneOverR));
389 const float cosTheta2half = o2::gpu::CAMath::Sqrt(1.f - math_utils::Sq(0.5f * r2 * oneOverR));
390 float x = (r2 * cosTheta1half) - (r1 * cosTheta2half);
391 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)));
393 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);
399 mTrackletsLookupTable[linkId].resize(mClusters[
link.fromLayer].size() + 1, 0);
402 for (
int cellId{0}; cellId < (
int)mCells.size(); ++cellId) {
412template <
int NLayers>
415 unsigned long size{0};
416 for (
const auto& trkl : mTracklets) {
419 for (
const auto&
cells : mCells) {
422 for (
const auto& cellsN : mCellsNeighbours) {
423 size +=
sizeof(
int) * cellsN.size();
425 for (
const auto& cellsN : mCellsNeighboursTopology) {
426 size +=
sizeof(
int) * cellsN.size();
431template <
int NLayers>
434 LOGP(info,
"TimeFrame: Artefacts occupy {:.2f} MB", getArtefactsMemory() /
constants::MB);
437template <
int NLayers>
440 for (ushort iLayer = 0; iLayer < 2; ++iLayer) {
441 for (
unsigned int iRof{0}; iRof < getNrof(1); ++iRof) {
442 if (mROFMaskView.isROFEnabled(1, iRof)) {
443 mTotalTracklets[iLayer] += mNTrackletsPerROF[iLayer][iRof];
446 std::exclusive_scan(mNTrackletsPerROF[iLayer].begin(), mNTrackletsPerROF[iLayer].
end(), mNTrackletsPerROF[iLayer].begin(), 0);
447 std::exclusive_scan(mNTrackletsPerCluster[iLayer].begin(), mNTrackletsPerCluster[iLayer].
end(), mNTrackletsPerClusterSum[iLayer].begin(), 0);
451template <
int NLayers>
456 auto initVector = [&]<
typename T>(bounded_vector<T>&
vec,
bool useExternal =
false) {
458 deepVectorClear(
vec, mr);
461 auto initContainers = [&]<
typename Container>(Container& container,
bool useExternal =
false) {
462 for (
auto&
v : container) {
463 initVector(
v, useExternal);
468 initContainers(mClusterExternalIndices);
469 initContainers(mNTrackletsPerCluster);
470 initContainers(mNTrackletsPerClusterSum);
471 initContainers(mNClustersPerROF);
472 initVector(mPrimaryVertices);
473 initVector(mLinkPhiCuts);
474 initVector(mLinkMSAngles);
475 initVector(mPositionResolution);
476 initContainers(mClusterSize);
477 initVector(mPValphaX);
478 initVector(mBogusClusters);
479 initContainers(mTrackletsIndexROF);
481 initContainers(mTracklets);
482 initContainers(mCells);
483 initContainers(mCellsNeighbours);
484 initContainers(mCellsLookupTable);
486 initVector(mPrimaryVerticesLabels);
487 initContainers(mLinesLabels);
488 initContainers(mTrackletLabels);
489 initContainers(mCellLabels);
490 initVector(mTracksLabel);
492 initContainers(mClusters, hasFrameworkAllocator());
493 initContainers(mUsedClusters, hasFrameworkAllocator());
494 initContainers(mUnsortedClusters, hasFrameworkAllocator());
495 initContainers(mIndexTables, hasFrameworkAllocator());
496 initContainers(mTrackingFrameInfo, hasFrameworkAllocator());
497 initContainers(mROFramesClusters, hasFrameworkAllocator());
500template <
int NLayers>
503 mExternalAllocator = ext;
504 mExtMemoryPool = std::make_shared<BoundedMemoryResource>(std::make_unique<ExternalAllocatorAdaptor>(mExternalAllocator));
507template <
int NLayers>
510 resetTrackExtensionCounters();
511 deepVectorClear(mTracks);
512 deepVectorClear(mTracklets);
513 deepVectorClear(mCells);
514 deepVectorClear(mCellsNeighbours);
515 deepVectorClear(mCellsNeighboursTopology);
516 deepVectorClear(mCellsLookupTable);
517 deepVectorClear(mPrimaryVertices);
518 deepVectorClear(mTrackletsLookupTable);
519 deepVectorClear(mClusterExternalIndices);
520 deepVectorClear(mNTrackletsPerCluster);
521 deepVectorClear(mNTrackletsPerClusterSum);
522 deepVectorClear(mNClustersPerROF);
523 deepVectorClear(mLinkPhiCuts);
524 deepVectorClear(mLinkMSAngles);
525 deepVectorClear(mPositionResolution);
526 deepVectorClear(mClusterSize);
527 deepVectorClear(mPValphaX);
528 deepVectorClear(mBogusClusters);
529 deepVectorClear(mTrackletsIndexROF);
530 deepVectorClear(mTrackletClusters);
531 deepVectorClear(mLines);
534 if (!hasFrameworkAllocator()) {
535 deepVectorClear(mClusters);
536 deepVectorClear(mUsedClusters);
537 deepVectorClear(mUnsortedClusters);
538 deepVectorClear(mIndexTables);
539 deepVectorClear(mTrackingFrameInfo);
540 deepVectorClear(mROFramesClusters);
543 if (hasMCinformation()) {
544 deepVectorClear(mLinesLabels);
545 deepVectorClear(mPrimaryVerticesLabels);
546 deepVectorClear(mTrackletLabels);
547 deepVectorClear(mCellLabels);
548 deepVectorClear(mTracksLabel);
554#ifdef ENABLE_UPGRADES