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);
 
  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();