310 mIndexTableUtils.setTrackingParameters(trkParam);
314 for (
unsigned int iLayer{0}; iLayer < std::min((
int)mClusters.size(), maxLayers); ++iLayer) {
322 for (
int iLayer{0}; iLayer < NLayers; ++iLayer) {
325 for (
int iLayer{0}; iLayer < trkParam.
NLayers; ++iLayer) {
327 for (
auto& tfInfo : mTrackingFrameInfo[iLayer]) {
329 tfInfo.covarianceTrackingFrame[0] += trkParam.
SystErrorY2[iLayer];
330 tfInfo.covarianceTrackingFrame[2] += trkParam.
SystErrorZ2[iLayer];
335 mMinR.fill(std::numeric_limits<float>::max());
336 mMaxR.fill(std::numeric_limits<float>::min());
349 mNTrackletsPerROF.resize(2);
350 for (
auto&
v : mNTrackletsPerROF) {
351 v = bounded_vector<int>(getNrof(1) + 1, 0, mMemoryPool.get());
354 prepareClusters(trkParam, maxLayers);
356 mTotalTracklets = {0, 0};
357 if (maxLayers < trkParam.
NLayers) {
358 for (
size_t iLayer{0}; iLayer < maxLayers; ++iLayer) {
365 std::array<float, NLayers> msAngles{};
366 for (
unsigned int iLayer{0}; iLayer < NLayers; ++iLayer) {
372 float oneOverR{0.001f * 0.3f * std::abs(mBz) / trkParam.
TrackletMinPt};
373 for (
int linkId{0}; linkId < (
int)mTracklets.size(); ++linkId) {
374 const auto&
link = mTrackingTopologyView.getLink(linkId);
377 ms2 += math_utils::Sq(msAngles[
layer]);
379 mLinkMSAngles[linkId] = o2::gpu::CAMath::Sqrt(ms2);
383 const float res1 = o2::gpu::CAMath::Hypot(trkParam.
PVres, mPositionResolution[
link.fromLayer]);
384 const float res2 = o2::gpu::CAMath::Hypot(trkParam.
PVres, mPositionResolution[
link.toLayer]);
385 const float cosTheta1half = o2::gpu::CAMath::Sqrt(1.f - math_utils::Sq(0.5f * r1 * oneOverR));
386 const float cosTheta2half = o2::gpu::CAMath::Sqrt(1.f - math_utils::Sq(0.5f * r2 * oneOverR));
387 float x = (r2 * cosTheta1half) - (r1 * cosTheta2half);
388 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)));
390 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);
396 mTrackletsLookupTable[linkId].resize(mClusters[
link.fromLayer].size() + 1, 0);
399 for (
int cellId{0}; cellId < (
int)mCells.size(); ++cellId) {
409template <
int NLayers>
412 unsigned long size{0};
413 for (
const auto& trkl : mTracklets) {
416 for (
const auto&
cells : mCells) {
419 for (
const auto& cellsN : mCellsNeighbours) {
420 size +=
sizeof(
int) * cellsN.size();
422 for (
const auto& cellsN : mCellsNeighboursTopology) {
423 size +=
sizeof(
int) * cellsN.size();
428template <
int NLayers>
431 LOGP(info,
"TimeFrame: Artefacts occupy {:.2f} MB", getArtefactsMemory() /
constants::MB);
434template <
int NLayers>
437 for (ushort iLayer = 0; iLayer < 2; ++iLayer) {
438 for (
unsigned int iRof{0}; iRof < getNrof(1); ++iRof) {
439 if (mROFMaskView.isROFEnabled(1, iRof)) {
440 mTotalTracklets[iLayer] += mNTrackletsPerROF[iLayer][iRof];
443 std::exclusive_scan(mNTrackletsPerROF[iLayer].begin(), mNTrackletsPerROF[iLayer].
end(), mNTrackletsPerROF[iLayer].begin(), 0);
444 std::exclusive_scan(mNTrackletsPerCluster[iLayer].begin(), mNTrackletsPerCluster[iLayer].
end(), mNTrackletsPerClusterSum[iLayer].begin(), 0);
448template <
int NLayers>
458 auto initContainers = [&]<
typename Container>(Container& container,
bool useExternal =
false) {
459 for (
auto&
v : container) {
460 initVector(
v, useExternal);
465 initContainers(mClusterExternalIndices);
466 initContainers(mNTrackletsPerCluster);
467 initContainers(mNTrackletsPerClusterSum);
468 initContainers(mNClustersPerROF);
469 initVector(mPrimaryVertices);
470 initVector(mLinkPhiCuts);
471 initVector(mLinkMSAngles);
472 initVector(mPositionResolution);
473 initContainers(mClusterSize);
474 initVector(mPValphaX);
475 initVector(mBogusClusters);
476 initContainers(mTrackletsIndexROF);
478 initContainers(mTracklets);
479 initContainers(mCells);
480 initContainers(mCellsNeighbours);
481 initContainers(mCellsLookupTable);
483 initVector(mPrimaryVerticesLabels);
484 initContainers(mLinesLabels);
485 initContainers(mTrackletLabels);
486 initContainers(mCellLabels);
487 initVector(mTracksLabel);
489 initContainers(mClusters, hasFrameworkAllocator());
490 initContainers(mUsedClusters, hasFrameworkAllocator());
491 initContainers(mUnsortedClusters, hasFrameworkAllocator());
492 initContainers(mIndexTables, hasFrameworkAllocator());
493 initContainers(mTrackingFrameInfo, hasFrameworkAllocator());
494 initContainers(mROFramesClusters, hasFrameworkAllocator());
497template <
int NLayers>
500 mExternalAllocator = ext;
501 mExtMemoryPool = std::make_shared<BoundedMemoryResource>(mExternalAllocator);
504template <
int NLayers>
507 resetTrackExtensionCounters();
531 if (!hasFrameworkAllocator()) {
540 if (hasMCinformation()) {
551#ifdef ENABLE_UPGRADES