Skip to content

Commit 4a45211

Browse files
committed
ITS: properly implemenent low mult vert first
Signed-off-by: Felix Schlepper <felix.schlepper@cern.ch>
1 parent f1f128c commit 4a45211

2 files changed

Lines changed: 31 additions & 35 deletions

File tree

Detectors/ITSMFT/ITS/tracking/src/Tracker.cxx

Lines changed: 22 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -78,40 +78,33 @@ void Tracker::clustersToTracks(const LogFunc& logger, const LogFunc& error)
7878

7979
total += evaluateTask(&Tracker::initialiseTimeFrame, StateNames[mCurState = TFInit], iteration, logger, iteration);
8080
for (iROFs = 0; iROFs < nROFsIterations; ++iROFs) {
81-
if (mTimeFrame->getPrimaryVertices(iROFs).empty()) {
81+
auto nPVs = mTimeFrame->getPrimaryVerticesNum(iROFs, nROFsIterations);
82+
if (nPVs == 0) {
8283
continue;
8384
}
8485

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;
86+
timeTracklets += evaluateTask(&Tracker::computeTracklets, StateNames[mCurState = Trackleting], iteration, evalLog, iteration, iROFs, -1);
87+
nTracklets += mTraits->getTFNumberOfTracklets();
88+
float trackletsPerCluster = mTraits->getTFNumberOfClusters() > 0 ? float(mTraits->getTFNumberOfTracklets()) / float(mTraits->getTFNumberOfClusters()) : 0.f;
89+
if (trackletsPerCluster > mTrkParams[iteration].TrackletsPerClusterLimit) {
90+
error(std::format("Too many tracklets per cluster ({}) in iteration {} in ROF span {}-{}:, check the detector status and/or the selections. Current limit is {}",
91+
trackletsPerCluster, iteration, iROFs, iROFs + mTrkParams[iteration].nROFsPerIterations, mTrkParams[iteration].TrackletsPerClusterLimit));
92+
break;
9193
}
9294

93-
do {
94-
// LOGP(info, "iVtx={} -> {} / {}", iVertex, vertOrder[iVertex], vertOrder.size());
95-
timeTracklets += evaluateTask(&Tracker::computeTracklets, StateNames[mCurState = Trackleting], iteration, evalLog, iteration, iROFs, vertOrder[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));
101-
break;
102-
}
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));
109-
break;
110-
}
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);
114-
} while (vertOrder[iVertex] >= 0 && ++iVertex < mTimeFrame->getPrimaryVerticesNum(iROFs));
95+
timeCells += evaluateTask(&Tracker::computeCells, StateNames[mCurState = Celling], iteration, evalLog, iteration);
96+
nCells += mTraits->getTFNumberOfCells();
97+
float cellsPerCluster = mTraits->getTFNumberOfClusters() > 0 ? float(mTraits->getTFNumberOfCells()) / float(mTraits->getTFNumberOfClusters()) : 0.f;
98+
if (cellsPerCluster > mTrkParams[iteration].CellsPerClusterLimit) {
99+
error(std::format("Too many cells per cluster ({}) in iteration {} in ROF span {}-{}, check the detector status and/or the selections. Current limit is {}",
100+
cellsPerCluster, iteration, iROFs, iROFs + mTrkParams[iteration].nROFsPerIterations, mTrkParams[iteration].CellsPerClusterLimit));
101+
break;
102+
}
103+
104+
timeNeighbours += evaluateTask(&Tracker::findCellsNeighbours, StateNames[mCurState = Neighbouring], iteration, evalLog, iteration);
105+
nNeighbours += mTimeFrame->getNumberOfNeighbours();
106+
107+
timeRoads += evaluateTask(&Tracker::findRoads, StateNames[mCurState = Roading], iteration, evalLog, iteration);
115108
}
116109
logger(std::format(" - Tracklet finding: {} tracklets found in {:.2f} ms", nTracklets, timeTracklets));
117110
logger(std::format(" - Cell finding: {} cells found in {:.2f} ms", nCells, timeCells));

Detectors/ITSMFT/ITS/tracking/src/TrackerTraits.cxx

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ struct PassMode {
5151
};
5252

5353
template <int nLayers>
54-
void TrackerTraits<nLayers>::computeLayerTracklets(const int iteration, int iROFslice, int iVertex)
54+
void TrackerTraits<nLayers>::computeLayerTracklets(const int iteration, int iROFslice, int /*iVertex*/)
5555
{
5656
#ifdef OPTIMISATION_OUTPUT
5757
static int iter{0};
@@ -75,10 +75,13 @@ void TrackerTraits<nLayers>::computeLayerTracklets(const int iteration, int iROF
7575
mTaskArena->execute([&] {
7676
for (int rof0{startROF}; rof0 < endROF; ++rof0) {
7777
gsl::span<const Vertex> primaryVertices = mTrkParams[iteration].UseDiamond ? diamondSpan : mTimeFrame->getPrimaryVertices(rof0);
78-
const int startVtx{iVertex >= 0 ? iVertex : 0};
79-
const int endVtx{iVertex >= 0 ? o2::gpu::CAMath::Min(iVertex + 1, static_cast<int>(primaryVertices.size())) : static_cast<int>(primaryVertices.size())};
80-
if (endVtx - startVtx <= 0) {
81-
continue;
78+
const int startVtx{0};
79+
const int endVtx{static_cast<int>(primaryVertices.size())};
80+
std::vector<int> vertOrder(primaryVertices.size());
81+
std::iota(vertOrder.begin(), vertOrder.end(), 0);
82+
// do low mult. cluster first, should steal less, keep relative order though
83+
if (mTrkParams[iteration].PerPrimaryVertexProcessing) {
84+
std::stable_sort(vertOrder.begin(), vertOrder.end(), [&](int a, int b) -> bool { return mTimeFrame->getPrimaryVertices(rof0)[a].getNContributors() < mTimeFrame->getPrimaryVertices(rof0)[b].getNContributors(); });
8285
}
8386
int minRof = o2::gpu::CAMath::Max(startROF, rof0 - mTrkParams[iteration].DeltaROF);
8487
int maxRof = o2::gpu::CAMath::Min(endROF - 1, rof0 + mTrkParams[iteration].DeltaROF);
@@ -104,7 +107,7 @@ void TrackerTraits<nLayers>::computeLayerTracklets(const int iteration, int iROF
104107
const float inverseR0{1.f / currentCluster.radius};
105108

106109
for (int iV{startVtx}; iV < endVtx; ++iV) {
107-
const auto& primaryVertex{primaryVertices[iV]};
110+
const auto& primaryVertex{primaryVertices[vertOrder[iV]]};
108111
if (primaryVertex.isFlagSet(2) && iteration != 3) {
109112
continue;
110113
}

0 commit comments

Comments
 (0)