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 LOGP(error,
"Exception: {}", err.what());
70 if (mTrkParams[iteration].DropTFUponFailure) {
73 ++mNumberOfDroppedTFs;
74 error(
"...Dropping Timeframe...");
81 for (iteration = 0; iteration < (
int)mTrkParams.size(); ++iteration) {
82 mMemoryPool->setMaxMemory(mTrkParams[iteration].MaxMemory);
83 if (iteration == 3 && mTrkParams[0].DoUPCIteration) {
84 mTimeFrame->swapMasks();
86 double timeTracklets{0.}, timeCells{0.}, timeNeighbours{0.}, timeRoads{0.};
87 int nTracklets{0}, nCells{0}, nNeighbours{0}, nTracks{-
static_cast<int>(mTimeFrame->getNumberOfTracks())};
88 int nROFsIterations = mTrkParams[iteration].nROFsPerIterations > 0 ? mTimeFrame->getNrof() / mTrkParams[iteration].nROFsPerIterations + bool(mTimeFrame->getNrof() % mTrkParams[iteration].nROFsPerIterations) : 1;
89 iVertex = std::min(maxNvertices, 0);
90 logger(std::format(
"==== ITS {} Tracking iteration {} summary ====", mTraits->getName(), iteration));
92 total += evaluateTask(&Tracker::initialiseTimeFrame, StateNames[mCurState = TFInit], iteration, logger, iteration);
94 for (iROFs = 0; iROFs < nROFsIterations; ++iROFs) {
95 timeTracklets += evaluateTask(&Tracker::computeTracklets, StateNames[mCurState = Trackleting], iteration, evalLog, iteration, iROFs, iVertex);
96 nTracklets += mTraits->getTFNumberOfTracklets();
97 float trackletsPerCluster = mTraits->getTFNumberOfClusters() > 0 ? float(mTraits->getTFNumberOfTracklets()) / float(mTraits->getTFNumberOfClusters()) : 0.f;
98 if (trackletsPerCluster > mTrkParams[iteration].TrackletsPerClusterLimit) {
99 error(std::format(
"Too many tracklets per cluster ({}) in iteration {} in ROF span {}-{}:, check the detector status and/or the selections. Current limit is {}",
100 trackletsPerCluster, iteration, iROFs, iROFs + mTrkParams[iteration].nROFsPerIterations, mTrkParams[iteration].TrackletsPerClusterLimit));
103 timeCells += evaluateTask(&Tracker::computeCells, StateNames[mCurState = Celling], iteration, evalLog, iteration);
104 nCells += mTraits->getTFNumberOfCells();
105 float cellsPerCluster = mTraits->getTFNumberOfClusters() > 0 ? float(mTraits->getTFNumberOfCells()) / float(mTraits->getTFNumberOfClusters()) : 0.f;
106 if (cellsPerCluster > mTrkParams[iteration].CellsPerClusterLimit) {
107 error(std::format(
"Too many cells per cluster ({}) in iteration {} in ROF span {}-{}, check the detector status and/or the selections. Current limit is {}",
108 cellsPerCluster, iteration, iROFs, iROFs + mTrkParams[iteration].nROFsPerIterations, mTrkParams[iteration].CellsPerClusterLimit));
111 timeNeighbours += evaluateTask(&Tracker::findCellsNeighbours, StateNames[mCurState = Neighbouring], iteration, evalLog, iteration);
112 nNeighbours += mTimeFrame->getNumberOfNeighbours();
113 timeRoads += evaluateTask(&Tracker::findRoads, StateNames[mCurState = Roading], iteration, evalLog, iteration);
115 }
while (++iVertex < maxNvertices);
116 logger(std::format(
" - Tracklet finding: {} tracklets found in {:.2f} ms", nTracklets, timeTracklets));
117 logger(std::format(
" - Cell finding: {} cells found in {:.2f} ms", nCells, timeCells));
118 logger(std::format(
" - Neighbours finding: {} neighbours found in {:.2f} ms", nNeighbours, timeNeighbours));
119 logger(std::format(
" - Track finding: {} tracks found in {:.2f} ms", nTracks + mTimeFrame->getNumberOfTracks(), timeRoads));
120 total += timeTracklets + timeCells + timeNeighbours + timeRoads;
121 if (mTraits->supportsExtendTracks() && mTrkParams[iteration].UseTrackFollower) {
122 int nExtendedTracks{-mTimeFrame->mNExtendedTracks}, nExtendedClusters{-mTimeFrame->mNExtendedUsedClusters};
123 auto timeExtending = evaluateTask(&Tracker::extendTracks,
"Extending tracks", iteration, evalLog, iteration);
124 total += timeExtending;
125 logger(std::format(
" - Extending Tracks: {} extended tracks using {} clusters found in {:.2f} ms", nExtendedTracks + mTimeFrame->mNExtendedTracks, nExtendedClusters + mTimeFrame->mNExtendedUsedClusters, timeExtending));
127 if (mTrkParams[iteration].PrintMemory) {
128 mMemoryPool->print();
131 if (mTraits->supportsFindShortPrimaries() && mTrkParams[0].FindShortTracks) {
132 auto nTracksB = mTimeFrame->getNumberOfTracks();
133 total += evaluateTask(&Tracker::findShortPrimaries,
"Short primaries finding", 0, logger);
134 auto nTracksA = mTimeFrame->getNumberOfTracks();
135 logger(std::format(
" `-> found {} additional tracks", nTracksA - nTracksB));
138 logger(std::format(
"=== TimeFrame {} processing completed in: {:.2f} ms using {} thread(s) ===", mTimeFrameCounter, total, mTraits->getNThreads()));
141 handleException(err);
143 }
catch (
const std::bad_alloc& err) {
144 handleException(err);
147 error(
"Uncaught exception, all bets are off...");
150 if (mTimeFrame->hasMCinformation()) {
151 computeTracksMClabels();
153 rectifyClusterIndices();
157 if (mTrkParams[0].PrintMemory) {
158 mTimeFrame->printArtefactsMemory();
159 mMemoryPool->print();