319 mIndexTableUtils.setTrackingParameters(trkParam);
323 for (
unsigned int iLayer{0}; iLayer < std::min((
int)mClusters.size(), maxLayers); ++iLayer) {
332 for (
int iLayer{0}; iLayer < trkParam.
NLayers; ++iLayer) {
334 for (
auto& tfInfo : mTrackingFrameInfo[iLayer]) {
336 tfInfo.covarianceTrackingFrame[0] += trkParam.
SystErrorY2[iLayer];
337 tfInfo.covarianceTrackingFrame[2] += trkParam.
SystErrorZ2[iLayer];
342 mNTrackletsPerROF.resize(2);
343 for (
auto&
v : mNTrackletsPerROF) {
344 v = bounded_vector<int>(mNrof + 1, 0, mMemoryPool.get());
346 if (iteration == 0 || iteration == 3) {
347 prepareClusters(trkParam, maxLayers);
349 mTotalTracklets = {0, 0};
350 if (maxLayers < trkParam.
NLayers) {
351 for (
size_t iLayer{0}; iLayer < maxLayers; ++iLayer) {
357 mTotVertPerIteration.resize(1 + iteration);
362 mMSangles.resize(trkParam.
NLayers);
363 mPhiCuts.resize(mClusters.size() - 1, 0.f);
365 float oneOverR{0.001f * 0.3f * std::abs(mBz) / trkParam.
TrackletMinPt};
366 for (
unsigned int iLayer{0}; iLayer < mClusters.size(); ++iLayer) {
369 if (iLayer < mClusters.size() - 1) {
370 const float& r1 = trkParam.
LayerRadii[iLayer];
371 const float& r2 = trkParam.
LayerRadii[iLayer + 1];
372 const float res1 = o2::gpu::CAMath::Hypot(trkParam.
PVres, mPositionResolution[iLayer]);
373 const float res2 = o2::gpu::CAMath::Hypot(trkParam.
PVres, mPositionResolution[iLayer + 1]);
374 const float cosTheta1half = o2::gpu::CAMath::Sqrt(1.f - Sq(0.5f * r1 * oneOverR));
375 const float cosTheta2half = o2::gpu::CAMath::Sqrt(1.f - Sq(0.5f * r2 * oneOverR));
376 float x = r2 * cosTheta1half - r1 * cosTheta2half;
377 float delta = o2::gpu::CAMath::Sqrt(1. / (1.f - 0.25f * Sq(
x * oneOverR)) * (Sq(0.25f * r1 * r2 * Sq(oneOverR) / cosTheta2half + cosTheta1half) * Sq(res1) + Sq(0.25f * r1 * r2 * Sq(oneOverR) / cosTheta1half + cosTheta2half) * Sq(res2)));
378 mPhiCuts[iLayer] = std::min(o2::gpu::CAMath::ASin(0.5f *
x * oneOverR) + 2.f * mMSangles[iLayer] + delta,
constants::math::Pi * 0.5f);
382 for (
int iLayer{0}; iLayer < std::min((
int)mTracklets.size(), maxLayers); ++iLayer) {
385 if (iLayer < (
int)mCells.size()) {
388 mTrackletsLookupTable[iLayer].resize(mClusters[iLayer + 1].
size(), 0);
392 if (iLayer < (
int)mCells.size() - 1) {
400template <
int nLayers>
403 unsigned long size{0};
404 for (
auto& trkl : mTracklets) {
407 for (
auto&
cells : mCells) {
410 for (
auto& cellsN : mCellsNeighbours) {
411 size +=
sizeof(
int) * cellsN.size();
413 return size +
sizeof(
Road<nLayers - 2>) * mRoads.size();
416template <
int nLayers>
419 LOGP(info,
"TimeFrame: Artefacts occupy {:.2f} MB", getArtefactsMemory() /
constants::MB);
422template <
int nLayers>
425 if (mPValphaX.size()) {
428 mPValphaX.reserve(mPrimaryVertices.size());
429 for (
auto& pv : mPrimaryVertices) {
430 mPValphaX.emplace_back(std::array<float, 2>{o2::gpu::CAMath::Hypot(pv.getX(), pv.getY()), math_utils::computePhi(pv.getX(), pv.getY())});
434template <
int nLayers>
437 for (ushort iLayer = 0; iLayer < 2; ++iLayer) {
438 for (
unsigned int iRof{0}; iRof < mNrof; ++iRof) {
439 if (mMultiplicityCutMask[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>
451 for (uint32_t iLayer{0}; iLayer < getTracklets().size(); ++iLayer) {
454 for (uint32_t iTracklet{0}; iTracklet < getTracklets()[iLayer].size(); ++iTracklet) {
455 auto& trk = getTracklets()[iLayer][iTracklet];
456 int currentId{trk.firstClusterIndex};
457 if (currentId < prev) {
458 std::cout <<
"First Cluster Index not increasing monotonically on L:T:ID:Prev " << iLayer <<
"\t" << iTracklet <<
"\t" << currentId <<
"\t" << prev << std::endl;
459 }
else if (currentId == prev) {
463 auto& lut{getTrackletsLookupTable()[iLayer - 1]};
464 if (
count != lut[prev + 1] - lut[prev]) {
465 std::cout <<
"LUT count broken " << iLayer - 1 <<
"\t" << prev <<
"\t" <<
count <<
"\t" << lut[prev + 1] <<
"\t" << lut[prev] << std::endl;
472 auto& lut{getTrackletsLookupTable()[iLayer - 1]};
473 if (iTracklet >= (uint32_t)(lut[currentId + 1]) || iTracklet < (uint32_t)(lut[currentId])) {
474 std::cout <<
"LUT broken: " << iLayer - 1 <<
"\t" << currentId <<
"\t" << iTracklet << std::endl;
481template <
int nLayers>
486 for (
int iLayers{nLayers}; iLayers--;) {
487 mClusters[iLayers].clear();
488 mUnsortedClusters[iLayers].clear();
489 mTrackingFrameInfo[iLayers].clear();
490 mClusterExternalIndices[iLayers].clear();
491 mUsedClusters[iLayers].clear();
492 mROFramesClusters[iLayers].clear();
493 mNClustersPerROF[iLayers].clear();
495 for (
int i{2};
i--;) {
496 mTrackletsIndexROF[
i].clear();
500template <
int nLayers>
503 for (
auto& trkl : mTracklets) {
509template <
int nLayers>
512 std::cout <<
"--------" << std::endl
513 <<
"Tracklet LUT " <<
i << std::endl;
514 for (
int j : mTrackletsLookupTable[
i]) {
515 std::cout <<
j <<
"\t";
517 std::cout <<
"\n--------" << std::endl
521template <
int nLayers>
524 std::cout <<
"--------" << std::endl
525 <<
"Cell LUT " <<
i << std::endl;
526 for (
int j : mCellsLookupTable[
i]) {
527 std::cout <<
j <<
"\t";
529 std::cout <<
"\n--------" << std::endl
533template <
int nLayers>
536 for (
unsigned int i{0};
i < mTrackletsLookupTable.size(); ++
i) {
537 printTrackletLUTonLayer(
i);
541template <
int nLayers>
544 for (
unsigned int i{0};
i < mCellsLookupTable.size(); ++
i) {
545 printCellLUTonLayer(
i);
549template <
int nLayers>
552 std::cout <<
"Vertices in ROF (nROF = " << mNrof <<
", lut size = " << mROFramesPV.size() <<
")" << std::endl;
553 for (
unsigned int iR{0}; iR < mROFramesPV.size(); ++iR) {
554 std::cout << mROFramesPV[iR] <<
"\t";
556 std::cout <<
"\n\n Vertices:" << std::endl;
557 for (
unsigned int iV{0}; iV < mPrimaryVertices.size(); ++iV) {
558 std::cout << mPrimaryVertices[iV].getX() <<
"\t" << mPrimaryVertices[iV].getY() <<
"\t" << mPrimaryVertices[iV].getZ() << std::endl;
560 std::cout <<
"--------" << std::endl;
563template <
int nLayers>
566 std::cout <<
"--------" << std::endl;
567 for (
unsigned int iLayer{0}; iLayer < mROFramesClusters.size(); ++iLayer) {
568 std::cout <<
"Layer " << iLayer << std::endl;
569 for (
auto value : mROFramesClusters[iLayer]) {
570 std::cout <<
value <<
"\t";
572 std::cout << std::endl;
576template <
int nLayers>
579 std::cout <<
"--------" << std::endl;
580 for (
unsigned int iLayer{0}; iLayer < mNClustersPerROF.size(); ++iLayer) {
581 std::cout <<
"Layer " << iLayer << std::endl;
582 for (
auto&
value : mNClustersPerROF[iLayer]) {
583 std::cout <<
value <<
"\t";
585 std::cout << std::endl;
589template <
int nLayers>
592 std::cout <<
"Dumping slice of " << sliceSize <<
" rofs:" << std::endl;
593 for (
int iROF{startROF}; iROF < startROF + sliceSize; ++iROF) {
594 std::cout <<
"ROF " << iROF <<
" dump:" << std::endl;
595 for (
unsigned int iLayer{0}; iLayer < mClusters.size(); ++iLayer) {
596 std::cout <<
"Layer " << iLayer <<
" has: " << getClustersOnLayer(iROF, iLayer).size() <<
" clusters." << std::endl;
598 std::cout <<
"Number of seeding vertices: " << getPrimaryVertices(iROF).size() << std::endl;
600 for (
auto&
v : getPrimaryVertices(iROF)) {
601 std::cout <<
"\t vertex " << iVertex++ <<
": x=" <<
v.getX() <<
" " <<
" y=" <<
v.getY() <<
" z=" <<
v.getZ() <<
" has " <<
v.getNContributors() <<
" contributors." << std::endl;
606template <
int nLayers>
613 auto alloc =
vec.get_allocator().resource();
614 if (alloc != mMemoryPool.get()) {
618 auto initArrays = [&]<
typename T,
size_t S>(std::array<bounded_vector<T>,
S>& arr) {
619 for (
size_t i{0};
i <
S; ++
i) {
620 auto alloc = arr[
i].get_allocator().resource();
621 if (alloc != mMemoryPool.get()) {
626 auto initVectors = [&]<
typename T>(std::vector<bounded_vector<T>>&
vec) {
627 for (
size_t i{0};
i <
vec.size(); ++
i) {
628 auto alloc =
vec[
i].get_allocator().resource();
629 if (alloc != mMemoryPool.get()) {
635 initVector(mTotVertPerIteration);
636 initVector(mPrimaryVertices);
637 initVector(mROFramesPV);
638 initArrays(mClusters);
639 initArrays(mTrackingFrameInfo);
640 initArrays(mClusterExternalIndices);
641 initArrays(mROFramesClusters);
642 initArrays(mNTrackletsPerCluster);
643 initArrays(mNTrackletsPerClusterSum);
644 initArrays(mNClustersPerROF);
645 initArrays(mIndexTables);
646 initArrays(mUsedClusters);
647 initArrays(mUnsortedClusters);
648 initVector(mROFramesPV);
649 initVector(mPrimaryVertices);
651 initVector(mRoadLabels);
652 initVector(mMSangles);
653 initVector(mPhiCuts);
654 initVector(mPositionResolution);
655 initVector(mClusterSize);
656 initVector(mPValphaX);
657 initVector(mBogusClusters);
658 initArrays(mTrackletsIndexROF);
659 initVectors(mTracks);
660 initVectors(mTracklets);
662 initVectors(mCellSeeds);
663 initVectors(mCellSeedsChi2);
664 initVectors(mCellsNeighbours);
665 initVectors(mCellsLookupTable);
668template <
int nLayers>