From afe1a1ecbe0119e5972f5ad6001bb23085b72c0b Mon Sep 17 00:00:00 2001 From: Felix Schlepper Date: Tue, 10 Jun 2025 11:21:59 +0200 Subject: [PATCH 1/3] ITS: simplify tracker rof/vertices loop Signed-off-by: Felix Schlepper --- Detectors/ITSMFT/ITS/tracking/src/Tracker.cxx | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/Detectors/ITSMFT/ITS/tracking/src/Tracker.cxx b/Detectors/ITSMFT/ITS/tracking/src/Tracker.cxx index c92d1e8505356..b5c4c685295b0 100644 --- a/Detectors/ITSMFT/ITS/tracking/src/Tracker.cxx +++ b/Detectors/ITSMFT/ITS/tracking/src/Tracker.cxx @@ -45,15 +45,9 @@ void Tracker::clustersToTracks(const LogFunc& logger, const LogFunc& error) { LogFunc evalLog = [](const std::string&) {}; - double total{0}; mTraits->updateTrackingParameters(mTrkParams); - int maxNvertices{-1}; - if (mTrkParams[0].PerPrimaryVertexProcessing) { - for (int iROF{0}; iROF < mTimeFrame->getNrof(); ++iROF) { - maxNvertices = std::max(maxNvertices, (int)mTimeFrame->getPrimaryVertices(iROF).size()); - } - } + double total{0}; int iteration{0}, iROFs{0}, iVertex{0}; auto handleException = [&](const auto& err) { 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.", @@ -79,12 +73,12 @@ void Tracker::clustersToTracks(const LogFunc& logger, const LogFunc& error) double timeTracklets{0.}, timeCells{0.}, timeNeighbours{0.}, timeRoads{0.}; int nTracklets{0}, nCells{0}, nNeighbours{0}, nTracks{-static_cast(mTimeFrame->getNumberOfTracks())}; int nROFsIterations = mTrkParams[iteration].nROFsPerIterations > 0 ? mTimeFrame->getNrof() / mTrkParams[iteration].nROFsPerIterations + bool(mTimeFrame->getNrof() % mTrkParams[iteration].nROFsPerIterations) : 1; - iVertex = std::min(maxNvertices, 0); logger(std::format("==== ITS {} Tracking iteration {} summary ====", mTraits->getName(), iteration)); total += evaluateTask(&Tracker::initialiseTimeFrame, StateNames[mCurState = TFInit], iteration, logger, iteration); - do { - for (iROFs = 0; iROFs < nROFsIterations; ++iROFs) { + for (iROFs = 0; iROFs < nROFsIterations; ++iROFs) { + iVertex = (!mTrkParams[0].PerPrimaryVertexProcessing) ? -1 : 0; + do { timeTracklets += evaluateTask(&Tracker::computeTracklets, StateNames[mCurState = Trackleting], iteration, evalLog, iteration, iROFs, iVertex); nTracklets += mTraits->getTFNumberOfTracklets(); float trackletsPerCluster = mTraits->getTFNumberOfClusters() > 0 ? float(mTraits->getTFNumberOfTracklets()) / float(mTraits->getTFNumberOfClusters()) : 0.f; @@ -104,8 +98,8 @@ void Tracker::clustersToTracks(const LogFunc& logger, const LogFunc& error) timeNeighbours += evaluateTask(&Tracker::findCellsNeighbours, StateNames[mCurState = Neighbouring], iteration, evalLog, iteration); nNeighbours += mTimeFrame->getNumberOfNeighbours(); timeRoads += evaluateTask(&Tracker::findRoads, StateNames[mCurState = Roading], iteration, evalLog, iteration); - } - } while (++iVertex < maxNvertices); + } while (iVertex >= 0 && ++iVertex < mTimeFrame->getPrimaryVerticesNum(iROFs)); + } logger(std::format(" - Tracklet finding: {} tracklets found in {:.2f} ms", nTracklets, timeTracklets)); logger(std::format(" - Cell finding: {} cells found in {:.2f} ms", nCells, timeCells)); logger(std::format(" - Neighbours finding: {} neighbours found in {:.2f} ms", nNeighbours, timeNeighbours)); From d9b6ec315f6a0512a94098ee1e9790d6e892b4be Mon Sep 17 00:00:00 2001 From: Felix Schlepper Date: Tue, 10 Jun 2025 12:05:10 +0200 Subject: [PATCH 2/3] ITS: perVertex do low multiplicty vertices first Signed-off-by: Felix Schlepper --- Detectors/ITSMFT/ITS/tracking/src/Tracker.cxx | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/Detectors/ITSMFT/ITS/tracking/src/Tracker.cxx b/Detectors/ITSMFT/ITS/tracking/src/Tracker.cxx index b5c4c685295b0..1de2997a9ce0d 100644 --- a/Detectors/ITSMFT/ITS/tracking/src/Tracker.cxx +++ b/Detectors/ITSMFT/ITS/tracking/src/Tracker.cxx @@ -25,6 +25,7 @@ #include "ITStracking/TrackingConfigParam.h" #include "ReconstructionDataFormats/Track.h" +#include #include #include #include @@ -77,9 +78,21 @@ void Tracker::clustersToTracks(const LogFunc& logger, const LogFunc& error) total += evaluateTask(&Tracker::initialiseTimeFrame, StateNames[mCurState = TFInit], iteration, logger, iteration); for (iROFs = 0; iROFs < nROFsIterations; ++iROFs) { - iVertex = (!mTrkParams[0].PerPrimaryVertexProcessing) ? -1 : 0; + if (mTimeFrame->getPrimaryVertices(iROFs).empty()) { + continue; + } + + std::vector vertOrder(mTimeFrame->getPrimaryVerticesNum(iROFs), -1); + if (mTrkParams[0].PerPrimaryVertexProcessing) { + // do low mult. cluster first, should steal less, keep relative order though + std::iota(vertOrder.begin(), vertOrder.end(), 0); + std::stable_sort(vertOrder.begin(), vertOrder.end(), [&](int a, int b) -> bool { return mTimeFrame->getPrimaryVertices(iROFs)[a].getNContributors() < mTimeFrame->getPrimaryVertices(iROFs)[b].getNContributors(); }); + iVertex = 0; + } + do { - timeTracklets += evaluateTask(&Tracker::computeTracklets, StateNames[mCurState = Trackleting], iteration, evalLog, iteration, iROFs, iVertex); + // LOGP(info, "iVtx={} -> {} / {}", iVertex, vertOrder[iVertex], vertOrder.size()); + timeTracklets += evaluateTask(&Tracker::computeTracklets, StateNames[mCurState = Trackleting], iteration, evalLog, iteration, iROFs, vertOrder[iVertex]); nTracklets += mTraits->getTFNumberOfTracklets(); float trackletsPerCluster = mTraits->getTFNumberOfClusters() > 0 ? float(mTraits->getTFNumberOfTracklets()) / float(mTraits->getTFNumberOfClusters()) : 0.f; if (trackletsPerCluster > mTrkParams[iteration].TrackletsPerClusterLimit) { @@ -98,7 +111,7 @@ void Tracker::clustersToTracks(const LogFunc& logger, const LogFunc& error) timeNeighbours += evaluateTask(&Tracker::findCellsNeighbours, StateNames[mCurState = Neighbouring], iteration, evalLog, iteration); nNeighbours += mTimeFrame->getNumberOfNeighbours(); timeRoads += evaluateTask(&Tracker::findRoads, StateNames[mCurState = Roading], iteration, evalLog, iteration); - } while (iVertex >= 0 && ++iVertex < mTimeFrame->getPrimaryVerticesNum(iROFs)); + } while (vertOrder[iVertex] >= 0 && ++iVertex < mTimeFrame->getPrimaryVerticesNum(iROFs)); } logger(std::format(" - Tracklet finding: {} tracklets found in {:.2f} ms", nTracklets, timeTracklets)); logger(std::format(" - Cell finding: {} cells found in {:.2f} ms", nCells, timeCells)); From 9687dd3b50914017408b3a22e75d574534769fad Mon Sep 17 00:00:00 2001 From: Felix Schlepper Date: Fri, 13 Jun 2025 10:26:34 +0200 Subject: [PATCH 3/3] ITS: remove stray print --- Detectors/ITSMFT/ITS/tracking/src/Tracker.cxx | 1 - 1 file changed, 1 deletion(-) diff --git a/Detectors/ITSMFT/ITS/tracking/src/Tracker.cxx b/Detectors/ITSMFT/ITS/tracking/src/Tracker.cxx index 1de2997a9ce0d..efd4af8eb39e5 100644 --- a/Detectors/ITSMFT/ITS/tracking/src/Tracker.cxx +++ b/Detectors/ITSMFT/ITS/tracking/src/Tracker.cxx @@ -91,7 +91,6 @@ void Tracker::clustersToTracks(const LogFunc& logger, const LogFunc& error) } do { - // LOGP(info, "iVtx={} -> {} / {}", iVertex, vertOrder[iVertex], vertOrder.size()); timeTracklets += evaluateTask(&Tracker::computeTracklets, StateNames[mCurState = Trackleting], iteration, evalLog, iteration, iROFs, vertOrder[iVertex]); nTracklets += mTraits->getTFNumberOfTracklets(); float trackletsPerCluster = mTraits->getTFNumberOfClusters() > 0 ? float(mTraits->getTFNumberOfTracklets()) / float(mTraits->getTFNumberOfClusters()) : 0.f;