297 for (
auto& tfInfo : mTrackingFrameInfo[iLayer]) {
299 tfInfo.covarianceTrackingFrame[0] += trkParam.
SystErrorY2[iLayer];
300 tfInfo.covarianceTrackingFrame[2] += trkParam.
SystErrorZ2[iLayer];
305 mMinR.fill(std::numeric_limits<float>::max());
306 mMaxR.fill(std::numeric_limits<float>::min());
319 mNTrackletsPerROF.resize(2);
320 for (
auto&
v : mNTrackletsPerROF) {
321 v = bounded_vector<int>(getNrof(1) + 1, 0, mMemoryPool.get());
324 prepareClusters(trkParam, maxLayers);
326 mTotalTracklets = {0, 0};
327 if (maxLayers < trkParam.
NLayers) {
328 for (
size_t iLayer{0}; iLayer < maxLayers; ++iLayer) {
335 std::array<float, NLayers> msAngles{};
336 for (
unsigned int iLayer{0}; iLayer < NLayers; ++iLayer) {
342 float oneOverR{0.001f * 0.3f * std::abs(mBz) / trkParam.
TrackletMinPt};
343 for (
int transitionId{0}; transitionId < (
int)mTracklets.size(); ++transitionId) {
344 const auto& transition = mTrackingTopologyView.getTransition(transitionId);
346 for (
int layer = transition.fromLayer;
layer < transition.toLayer; ++
layer) {
347 ms2 += math_utils::Sq(msAngles[
layer]);
349 mTransitionMSAngles[transitionId] = o2::gpu::CAMath::Sqrt(ms2);
350 const float& r1 = trkParam.
LayerRadii[transition.fromLayer];
351 const float& r2 = trkParam.
LayerRadii[transition.toLayer];
353 const float res1 = o2::gpu::CAMath::Hypot(trkParam.
PVres, mPositionResolution[transition.fromLayer]);
354 const float res2 = o2::gpu::CAMath::Hypot(trkParam.
PVres, mPositionResolution[transition.toLayer]);
355 const float cosTheta1half = o2::gpu::CAMath::Sqrt(1.f - math_utils::Sq(0.5f * r1 * oneOverR));
356 const float cosTheta2half = o2::gpu::CAMath::Sqrt(1.f - math_utils::Sq(0.5f * r2 * oneOverR));
357 float x = (r2 * cosTheta1half) - (r1 * cosTheta2half);
358 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)));
360 mTransitionPhiCuts[transitionId] = o2::gpu::CAMath::Min(o2::gpu::CAMath::ASin(0.5f *
x * oneOverR) + 2.f * mTransitionMSAngles[transitionId] + delta,
o2::constants::math::PI * 0.5f);
366 mTrackletsLookupTable[transitionId].resize(mClusters[transition.fromLayer].size() + 1, 0);
369 for (
int cellId{0}; cellId < (
int)mCells.size(); ++cellId) {
379template <
int NLayers>
382 unsigned long size{0};
383 for (
const auto& trkl : mTracklets) {
386 for (
const auto&
cells : mCells) {
389 for (
const auto& cellsN : mCellsNeighbours) {
390 size +=
sizeof(
int) * cellsN.size();
392 for (
const auto& cellsN : mCellsNeighboursTopology) {
393 size +=
sizeof(
int) * cellsN.size();
398template <
int NLayers>
401 LOGP(info,
"TimeFrame: Artefacts occupy {:.2f} MB", getArtefactsMemory() /
constants::MB);
404template <
int NLayers>
407 for (ushort iLayer = 0; iLayer < 2; ++iLayer) {
408 for (
unsigned int iRof{0}; iRof < getNrof(1); ++iRof) {
409 if (mROFMaskView.isROFEnabled(1, iRof)) {
410 mTotalTracklets[iLayer] += mNTrackletsPerROF[iLayer][iRof];
413 std::exclusive_scan(mNTrackletsPerROF[iLayer].begin(), mNTrackletsPerROF[iLayer].
end(), mNTrackletsPerROF[iLayer].begin(), 0);
414 std::exclusive_scan(mNTrackletsPerCluster[iLayer].begin(), mNTrackletsPerCluster[iLayer].
end(), mNTrackletsPerClusterSum[iLayer].begin(), 0);
418template <
int NLayers>
428 auto initContainers = [&]<
typename Container>(Container& container,
bool useExternal =
false) {
429 for (
auto&
v : container) {
430 initVector(
v, useExternal);
435 initContainers(mClusterExternalIndices);
436 initContainers(mNTrackletsPerCluster);
437 initContainers(mNTrackletsPerClusterSum);
438 initContainers(mNClustersPerROF);
439 initVector(mPrimaryVertices);
440 initVector(mTransitionPhiCuts);
441 initVector(mTransitionMSAngles);
442 initVector(mPositionResolution);
443 initContainers(mClusterSize);
444 initVector(mPValphaX);
445 initVector(mBogusClusters);
446 initContainers(mTrackletsIndexROF);
448 initContainers(mTracklets);
449 initContainers(mCells);
450 initContainers(mCellsNeighbours);
451 initContainers(mCellsLookupTable);
453 initVector(mPrimaryVerticesLabels);
454 initContainers(mLinesLabels);
455 initContainers(mTrackletLabels);
456 initContainers(mCellLabels);
457 initVector(mTracksLabel);
459 initContainers(mClusters, hasFrameworkAllocator());
460 initContainers(mUsedClusters, hasFrameworkAllocator());
461 initContainers(mUnsortedClusters, hasFrameworkAllocator());
462 initContainers(mIndexTables, hasFrameworkAllocator());
463 initContainers(mTrackingFrameInfo, hasFrameworkAllocator());
464 initContainers(mROFramesClusters, hasFrameworkAllocator());
467template <
int NLayers>
470 mExternalAllocator = ext;
471 mExtMemoryPool = std::make_shared<BoundedMemoryResource>(mExternalAllocator);
474template <
int NLayers>
500 if (!hasFrameworkAllocator()) {
509 if (hasMCinformation()) {
520#ifdef ENABLE_UPGRADES