51 LogFunc evalLog = [](
const std::string&) {};
54 mTraits->updateTrackingParameters(mTrkParams);
56 if (mTrkParams[0].PerPrimaryVertexProcessing) {
57 for (
int iROF{0}; iROF < mTimeFrame->getNrof(); ++iROF) {
58 int minRof = o2::gpu::CAMath::Max(0, iROF - mTrkParams[0].DeltaROF);
59 int maxRof = o2::gpu::CAMath::Min(mTimeFrame->getNrof(), iROF + mTrkParams[0].DeltaROF);
60 maxNvertices = std::max(maxNvertices, (
int)mTimeFrame->getPrimaryVertices(minRof, maxRof).size());
64 int iteration{0}, iROFs{0}, iVertex{0};
65 auto handleException = [&](
const auto& err) {
66 LOGP(error,
"Too much memory used during {} in iteration {} in ROF span {}-{} iVtx={}: {:.2f} GB. Current limit is {:.2f} GB, check the detector status and/or the selections.",
67 StateNames[mCurState], iteration, iROFs, iROFs + mTrkParams[iteration].nROFsPerIterations, iVertex,
68 (
double)mTimeFrame->getArtefactsMemory() /
GB, (
double)mTrkParams[iteration].MaxMemory /
GB);
69 if (
typeid(err) !=
typeid(std::bad_alloc)) {
70 LOGP(error,
"Exception: {}", err.what());
72 if (mTrkParams[iteration].DropTFUponFailure) {
75 ++mNumberOfDroppedTFs;
76 error(
"...Dropping Timeframe...");
83 for (iteration = 0; iteration < (
int)mTrkParams.size(); ++iteration) {
84 mMemoryPool->setMaxMemory(mTrkParams[iteration].MaxMemory);
85 if (iteration == 3 && mTrkParams[0].DoUPCIteration) {
86 mTimeFrame->swapMasks();
88 double timeTracklets{0.}, timeCells{0.}, timeNeighbours{0.}, timeRoads{0.};
89 int nTracklets{0}, nCells{0}, nNeighbours{0}, nTracks{-
static_cast<int>(mTimeFrame->getNumberOfTracks())};
90 int nROFsIterations = (mTrkParams[iteration].nROFsPerIterations > 0 && !mTimeFrame->mIsGPU) ? mTimeFrame->getNrof() / mTrkParams[iteration].nROFsPerIterations + bool(mTimeFrame->getNrof() % mTrkParams[iteration].nROFsPerIterations) : 1;
91 iVertex = std::min(maxNvertices, 0);
92 logger(std::format(
"==== ITS {} Tracking iteration {} summary ====", mTraits->getName(), iteration));
94 total += evaluateTask(&Tracker::initialiseTimeFrame, StateNames[mCurState = TFInit], iteration, logger, iteration);
96 for (iROFs = 0; iROFs < nROFsIterations; ++iROFs) {
97 timeTracklets += evaluateTask(&Tracker::computeTracklets, StateNames[mCurState = Trackleting], iteration, evalLog, iteration, iROFs, iVertex);
98 nTracklets += mTraits->getTFNumberOfTracklets();
99 float trackletsPerCluster = mTraits->getTFNumberOfClusters() > 0 ? float(mTraits->getTFNumberOfTracklets()) / float(mTraits->getTFNumberOfClusters()) : 0.f;
100 if (trackletsPerCluster > mTrkParams[iteration].TrackletsPerClusterLimit) {
101 error(std::format(
"Too many tracklets per cluster ({}) in iteration {} in ROF span {}-{}:, check the detector status and/or the selections. Current limit is {}",
102 trackletsPerCluster, iteration, iROFs, iROFs + mTrkParams[iteration].nROFsPerIterations, mTrkParams[iteration].TrackletsPerClusterLimit));
105 timeCells += evaluateTask(&Tracker::computeCells, StateNames[mCurState = Celling], iteration, evalLog, iteration);
106 nCells += mTraits->getTFNumberOfCells();
107 float cellsPerCluster = mTraits->getTFNumberOfClusters() > 0 ? float(mTraits->getTFNumberOfCells()) / float(mTraits->getTFNumberOfClusters()) : 0.f;
108 if (cellsPerCluster > mTrkParams[iteration].CellsPerClusterLimit) {
109 error(std::format(
"Too many cells per cluster ({}) in iteration {} in ROF span {}-{}, check the detector status and/or the selections. Current limit is {}",
110 cellsPerCluster, iteration, iROFs, iROFs + mTrkParams[iteration].nROFsPerIterations, mTrkParams[iteration].CellsPerClusterLimit));
113 timeNeighbours += evaluateTask(&Tracker::findCellsNeighbours, StateNames[mCurState = Neighbouring], iteration, evalLog, iteration);
114 nNeighbours += mTimeFrame->getNumberOfNeighbours();
115 timeRoads += evaluateTask(&Tracker::findRoads, StateNames[mCurState = Roading], iteration, evalLog, iteration);
117 }
while (++iVertex < maxNvertices);
118 logger(std::format(
" - Tracklet finding: {} tracklets found in {:.2f} ms", nTracklets, timeTracklets));
119 logger(std::format(
" - Cell finding: {} cells found in {:.2f} ms", nCells, timeCells));
120 logger(std::format(
" - Neighbours finding: {} neighbours found in {:.2f} ms", nNeighbours, timeNeighbours));
121 logger(std::format(
" - Track finding: {} tracks found in {:.2f} ms", nTracks + mTimeFrame->getNumberOfTracks(), timeRoads));
122 total += timeTracklets + timeCells + timeNeighbours + timeRoads;
123 if (mTraits->supportsExtendTracks() && mTrkParams[iteration].UseTrackFollower) {
124 int nExtendedTracks{-mTimeFrame->mNExtendedTracks}, nExtendedClusters{-mTimeFrame->mNExtendedUsedClusters};
125 auto timeExtending = evaluateTask(&Tracker::extendTracks,
"Extending tracks", iteration, evalLog, iteration);
126 total += timeExtending;
127 logger(std::format(
" - Extending Tracks: {} extended tracks using {} clusters found in {:.2f} ms", nExtendedTracks + mTimeFrame->mNExtendedTracks, nExtendedClusters + mTimeFrame->mNExtendedUsedClusters, timeExtending));
129 if (mTrkParams[iteration].PrintMemory) {
130 mMemoryPool->print();
133 if (mTraits->supportsFindShortPrimaries() && mTrkParams[0].FindShortTracks) {
134 auto nTracksB = mTimeFrame->getNumberOfTracks();
135 total += evaluateTask(&Tracker::findShortPrimaries,
"Short primaries finding", 0, logger);
136 auto nTracksA = mTimeFrame->getNumberOfTracks();
137 logger(std::format(
" `-> found {} additional tracks", nTracksA - nTracksB));
140 logger(std::format(
"=== TimeFrame {} processing completed in: {:.2f} ms using {} thread(s) ===", mTimeFrameCounter, total, mTraits->getNThreads()));
143 handleException(err);
145 }
catch (
const std::bad_alloc& err) {
146 handleException(err);
149 error(
"Uncaught exception, all bets are off...");
152 if (mTimeFrame->hasMCinformation()) {
153 computeTracksMClabels();
155 rectifyClusterIndices();
159 if (mTrkParams[0].PrintMemory) {
160 mTimeFrame->printArtefactsMemory();
161 mMemoryPool->print();