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->isGPU()) ? 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);
148 }
catch (
const std::exception& err) {
149 error(std::format(
"Uncaught exception, all bets are off... {}", err.
what()));
151 for (
int iROF{0}; iROF < mTimeFrame->getNrof(); ++iROF) {
152 mTimeFrame->getTracks(iROF).clear();
157 if (mTimeFrame->hasMCinformation()) {
158 computeTracksMClabels();
160 rectifyClusterIndices();
164 if (mTrkParams[0].PrintMemory) {
165 mTimeFrame->printArtefactsMemory();
166 mMemoryPool->print();
278 for (
int iROF{0}; iROF < mTimeFrame->getNrof(); ++iROF) {
279 for (
auto& track : mTimeFrame->getTracks(iROF)) {
280 std::vector<std::pair<MCCompLabel, size_t>> occurrences;
284 const int index = track.getClusterIndex(iCluster);
285 if (
index == constants::UnusedIndex) {
288 auto labels = mTimeFrame->getClusterLabels(iCluster,
index);
290 for (
size_t iOcc{0}; iOcc < occurrences.size(); ++iOcc) {
291 std::pair<o2::MCCompLabel, size_t>& occurrence = occurrences[iOcc];
293 if (
label == occurrence.first) {
302 occurrences.emplace_back(
label, 1);
306 std::sort(std::begin(occurrences), std::end(occurrences), [](
auto e1,
auto e2) {
307 return e1.second > e2.second;
310 auto maxOccurrencesValue = occurrences[0].first;
311 uint32_t
pattern = track.getPattern();
314 auto clid = track.getClusterIndex(ic);
315 if (clid != constants::UnusedIndex) {
316 auto labelsSpan = mTimeFrame->getClusterLabels(ic, clid);
317 for (
const auto& currentLabel : labelsSpan) {
318 if (currentLabel == maxOccurrencesValue) {
326 if (occurrences[0].second < track.getNumberOfClusters()) {
327 maxOccurrencesValue.setFakeFlag();
329 mTimeFrame->getTracksLabel(iROF).emplace_back(maxOccurrencesValue);