2525#include " ITStracking/TrackingConfigParam.h"
2626
2727#include " ReconstructionDataFormats/Track.h"
28+ #include < algorithm>
2829#include < cassert>
2930#include < format>
3031#include < cstdlib>
@@ -77,9 +78,21 @@ void Tracker::clustersToTracks(const LogFunc& logger, const LogFunc& error)
7778
7879 total += evaluateTask (&Tracker::initialiseTimeFrame, StateNames[mCurState = TFInit], iteration, logger, iteration);
7980 for (iROFs = 0 ; iROFs < nROFsIterations; ++iROFs) {
80- iVertex = (!mTrkParams [0 ].PerPrimaryVertexProcessing ) ? -1 : 0 ;
81+ if (mTimeFrame ->getPrimaryVertices (iROFs).empty ()) {
82+ continue ;
83+ }
84+
85+ std::vector<int > vertOrder (mTimeFrame ->getPrimaryVerticesNum (iROFs), -1 );
86+ if (mTrkParams [0 ].PerPrimaryVertexProcessing ) {
87+ // do low mult. cluster first, should steal less, keep relative order though
88+ std::iota (vertOrder.begin (), vertOrder.end (), 0 );
89+ std::stable_sort (vertOrder.begin (), vertOrder.end (), [&](int a, int b) -> bool { return mTimeFrame ->getPrimaryVertices (iROFs)[a].getNContributors () < mTimeFrame ->getPrimaryVertices (iROFs)[b].getNContributors (); });
90+ iVertex = 0 ;
91+ }
92+
8193 do {
82- timeTracklets += evaluateTask (&Tracker::computeTracklets, StateNames[mCurState = Trackleting], iteration, evalLog, iteration, iROFs, iVertex);
94+ // LOGP(info, "iVtx={} -> {} / {}", iVertex, vertOrder[iVertex], vertOrder.size());
95+ timeTracklets += evaluateTask (&Tracker::computeTracklets, StateNames[mCurState = Trackleting], iteration, evalLog, iteration, iROFs, vertOrder[iVertex]);
8396 nTracklets += mTraits ->getTFNumberOfTracklets ();
8497 float trackletsPerCluster = mTraits ->getTFNumberOfClusters () > 0 ? float (mTraits ->getTFNumberOfTracklets ()) / float (mTraits ->getTFNumberOfClusters ()) : 0 .f ;
8598 if (trackletsPerCluster > mTrkParams [iteration].TrackletsPerClusterLimit ) {
@@ -98,7 +111,7 @@ void Tracker::clustersToTracks(const LogFunc& logger, const LogFunc& error)
98111 timeNeighbours += evaluateTask (&Tracker::findCellsNeighbours, StateNames[mCurState = Neighbouring], iteration, evalLog, iteration);
99112 nNeighbours += mTimeFrame ->getNumberOfNeighbours ();
100113 timeRoads += evaluateTask (&Tracker::findRoads, StateNames[mCurState = Roading], iteration, evalLog, iteration);
101- } while (iVertex >= 0 && ++iVertex < mTimeFrame ->getPrimaryVerticesNum (iROFs));
114+ } while (vertOrder[ iVertex] >= 0 && ++iVertex < mTimeFrame ->getPrimaryVerticesNum (iROFs));
102115 }
103116 logger (std::format (" - Tracklet finding: {} tracklets found in {:.2f} ms" , nTracklets, timeTracklets));
104117 logger (std::format (" - Cell finding: {} cells found in {:.2f} ms" , nCells, timeCells));
0 commit comments