Skip to content

Commit e16b054

Browse files
committed
Break down pileup processing to 1 vertex per ROF
1 parent c5c2be9 commit e16b054

6 files changed

Lines changed: 72 additions & 42 deletions

File tree

Detectors/ITSMFT/ITS/tracking/include/ITStracking/Configuration.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ struct TrackingParameters {
8686
float MaxChi2NDF = 30.f;
8787
bool UseTrackFollower = false;
8888
bool FindShortTracks = false;
89+
bool PerPrimaryVertexProcessing = false;
8990
};
9091

9192
inline int TrackingParameters::CellMinimumLevel()

Detectors/ITSMFT/ITS/tracking/include/ITStracking/Tracker.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,13 +78,13 @@ class Tracker
7878

7979
private:
8080
void initialiseTimeFrame(int& iteration);
81-
void computeTracklets(int& iteration, int& iROFslice);
81+
void computeTracklets(int& iteration, int& iROFslice, int& iVertex);
8282
void computeCells(int& iteration);
8383
void findCellsNeighbours(int& iteration);
8484
void findRoads(int& iteration);
8585

8686
void initialiseTimeFrameHybrid(int& iteration);
87-
void computeTrackletsHybrid(int& iteration, int& iROFslice);
87+
void computeTrackletsHybrid(int& iteration, int& iROFslice, int& iVertex);
8888
void computeCellsHybrid(int& iteration);
8989
void findCellsNeighboursHybrid(int& iteration);
9090
void findRoadsHybrid(int& iteration);

Detectors/ITSMFT/ITS/tracking/include/ITStracking/TrackerTraits.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ class TrackerTraits
5252
virtual ~TrackerTraits() = default;
5353
virtual void adoptTimeFrame(TimeFrame* tf);
5454
virtual void initialiseTimeFrame(const int iteration);
55-
virtual void computeLayerTracklets(const int iteration, int iROFslice);
55+
virtual void computeLayerTracklets(const int iteration, int iROFslice, int iVertex);
5656
virtual void computeLayerCells(const int iteration);
5757
virtual void findCellsNeighbours(const int iteration);
5858
virtual void findRoads(const int iteration);

Detectors/ITSMFT/ITS/tracking/include/ITStracking/TrackingConfigParam.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ struct TrackerParamConfig : public o2::conf::ConfigurableParamHelper<TrackerPara
7676
int nThreads = 1;
7777
int nOrbitsPerIterations = 0;
7878
int nROFsPerIterations = 0;
79+
bool perPrimaryVertexProcessing = false;
7980

8081
O2ParamDef(TrackerParamConfig, "ITSCATrackerParam");
8182
};

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

Lines changed: 58 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -49,39 +49,64 @@ void Tracker::clustersToTracks(std::function<void(std::string s)> logger, std::f
4949
{
5050
double total{0};
5151
mTraits->UpdateTrackingParameters(mTrkParams);
52+
int maxNvertices{-1};
53+
if (mTrkParams[0].PerPrimaryVertexProcessing) {
54+
for (int iROF{0}; iROF < mTimeFrame->getNrof(); ++iROF) {
55+
maxNvertices = std::max(maxNvertices, (int)mTimeFrame->getPrimaryVertices(iROF).size());
56+
}
57+
}
58+
5259
for (int iteration = 0; iteration < (int)mTrkParams.size(); ++iteration) {
60+
61+
logger(fmt::format("ITS Tracking iteration {} summary:", iteration));
62+
double timeTracklets{0.}, timeCells{0.}, timeNeighbours{0.}, timeRoads{0.};
63+
int nTracklets{0}, nCells{0}, nNeighbours{0}, nTracks{-static_cast<int>(mTimeFrame->getNumberOfTracks())};
64+
5365
total += evaluateTask(&Tracker::initialiseTimeFrame, "Timeframe initialisation", logger, iteration);
5466
int nROFsIterations = mTrkParams[iteration].nROFsPerIterations > 0 ? mTimeFrame->getNrof() / mTrkParams[iteration].nROFsPerIterations + bool(mTimeFrame->getNrof() % mTrkParams[iteration].nROFsPerIterations) : 1;
55-
for (int iROFs{0}; iROFs < nROFsIterations; ++iROFs) {
56-
total += evaluateTask(&Tracker::computeTracklets, "Tracklet finding", logger, iteration, iROFs);
57-
logger(fmt::format("\t- Number of tracklets: {}", mTraits->getTFNumberOfTracklets()));
58-
if (!mTimeFrame->checkMemory(mTrkParams[iteration].MaxMemory)) {
59-
error(fmt::format("Too much memory used during trackleting in iteration {}, check the detector status and/or the selections.", iteration));
60-
break;
61-
}
62-
float trackletsPerCluster = mTraits->getTFNumberOfClusters() > 0 ? float(mTraits->getTFNumberOfTracklets()) / mTraits->getTFNumberOfClusters() : 0.f;
63-
if (trackletsPerCluster > mTrkParams[iteration].TrackletsPerClusterLimit) {
64-
error(fmt::format("Too many tracklets per cluster ({}) in iteration {}, check the detector status and/or the selections. Current limit is {}", trackletsPerCluster, iteration, mTrkParams[iteration].TrackletsPerClusterLimit));
65-
break;
66-
}
67+
int iVertex{std::min(maxNvertices, 0)};
68+
69+
do {
70+
for (int iROFs{0}; iROFs < nROFsIterations; ++iROFs) {
71+
timeTracklets += evaluateTask(
72+
&Tracker::computeTracklets, "Tracklet finding", [](std::string) {}, iteration, iROFs, iVertex);
73+
nTracklets += mTraits->getTFNumberOfTracklets();
74+
if (!mTimeFrame->checkMemory(mTrkParams[iteration].MaxMemory)) {
75+
error(fmt::format("Too much memory used during trackleting in iteration {}, check the detector status and/or the selections.", iteration));
76+
break;
77+
}
78+
float trackletsPerCluster = mTraits->getTFNumberOfClusters() > 0 ? float(mTraits->getTFNumberOfTracklets()) / mTraits->getTFNumberOfClusters() : 0.f;
79+
if (trackletsPerCluster > mTrkParams[iteration].TrackletsPerClusterLimit) {
80+
error(fmt::format("Too many tracklets per cluster ({}) in iteration {}, check the detector status and/or the selections. Current limit is {}", trackletsPerCluster, iteration, mTrkParams[iteration].TrackletsPerClusterLimit));
81+
break;
82+
}
6783

68-
total += evaluateTask(&Tracker::computeCells, "Cell finding", logger, iteration);
69-
logger(fmt::format("\t- Number of Cells: {}", mTraits->getTFNumberOfCells()));
70-
if (!mTimeFrame->checkMemory(mTrkParams[iteration].MaxMemory)) {
71-
error(fmt::format("Too much memory used during cell finding in iteration {}, check the detector status and/or the selections.", iteration));
72-
break;
73-
}
74-
float cellsPerCluster = mTraits->getTFNumberOfClusters() > 0 ? float(mTraits->getTFNumberOfCells()) / mTraits->getTFNumberOfClusters() : 0.f;
75-
if (cellsPerCluster > mTrkParams[iteration].CellsPerClusterLimit) {
76-
error(fmt::format("Too many cells per cluster ({}) in iteration {}, check the detector status and/or the selections. Current limit is {}", cellsPerCluster, iteration, mTrkParams[iteration].CellsPerClusterLimit));
77-
break;
78-
}
84+
timeCells += evaluateTask(
85+
&Tracker::computeCells, "Cell finding", [](std::string) {}, iteration);
86+
nCells += mTraits->getTFNumberOfCells();
87+
if (!mTimeFrame->checkMemory(mTrkParams[iteration].MaxMemory)) {
88+
error(fmt::format("Too much memory used during cell finding in iteration {}, check the detector status and/or the selections.", iteration));
89+
break;
90+
}
91+
float cellsPerCluster = mTraits->getTFNumberOfClusters() > 0 ? float(mTraits->getTFNumberOfCells()) / mTraits->getTFNumberOfClusters() : 0.f;
92+
if (cellsPerCluster > mTrkParams[iteration].CellsPerClusterLimit) {
93+
error(fmt::format("Too many cells per cluster ({}) in iteration {}, check the detector status and/or the selections. Current limit is {}", cellsPerCluster, iteration, mTrkParams[iteration].CellsPerClusterLimit));
94+
break;
95+
}
7996

80-
total += evaluateTask(&Tracker::findCellsNeighbours, "Neighbour finding", logger, iteration);
81-
logger(fmt::format("\t- Number of neighbours: {}", mTimeFrame->getNumberOfNeighbours()));
82-
total += evaluateTask(&Tracker::findRoads, "Road finding", logger, iteration);
83-
logger(fmt::format("\t- Number of Tracks: {}", mTimeFrame->getNumberOfTracks()));
84-
}
97+
timeNeighbours += evaluateTask(
98+
&Tracker::findCellsNeighbours, "Neighbour finding", [](std::string) {}, iteration);
99+
nNeighbours += mTimeFrame->getNumberOfNeighbours();
100+
timeRoads += evaluateTask(
101+
&Tracker::findRoads, "Road finding", [](std::string) {}, iteration);
102+
}
103+
iVertex++;
104+
} while (iVertex < maxNvertices);
105+
logger(fmt::format("\t- Tracklet finding: {} tracklets in {:.2f} ms", nTracklets, timeTracklets));
106+
logger(fmt::format("\t- Cell finding: {} cells found in {:.2f} ms", nCells, timeCells));
107+
logger(fmt::format("\t- Neighbours finding: {} neighbours found in {:.2f} ms", nNeighbours, timeNeighbours));
108+
logger(fmt::format("\t- Track finding: {} tracks found in {:.2f} ms", nTracks + mTimeFrame->getNumberOfTracks(), timeRoads));
109+
total += timeTracklets + timeCells + timeNeighbours + timeRoads;
85110
total += evaluateTask(&Tracker::extendTracks, "Extending tracks", logger, iteration);
86111
}
87112

@@ -108,7 +133,7 @@ void Tracker::clustersToTracksHybrid(std::function<void(std::string s)> logger,
108133
for (int iteration = 0; iteration < (int)mTrkParams.size(); ++iteration) {
109134
LOGP(info, "Iteration {}", iteration);
110135
total += evaluateTask(&Tracker::initialiseTimeFrameHybrid, "Hybrid Timeframe initialisation", logger, iteration);
111-
total += evaluateTask(&Tracker::computeTrackletsHybrid, "Hybrid Tracklet finding", logger, iteration, iteration); // TODO: iteration argument put just for the sake of the interface, to be updated with the proper ROF slicing
136+
total += evaluateTask(&Tracker::computeTrackletsHybrid, "Hybrid Tracklet finding", logger, iteration, iteration, iteration); // TODO: iteration argument put just for the sake of the interface, to be updated with the proper ROF slicing
112137
logger(fmt::format("\t- Number of tracklets: {}", mTraits->getTFNumberOfTracklets()));
113138
if (!mTimeFrame->checkMemory(mTrkParams[iteration].MaxMemory)) {
114139
error("Too much memory used during trackleting, check the detector status and/or the selections.");
@@ -144,9 +169,9 @@ void Tracker::initialiseTimeFrame(int& iteration)
144169
mTraits->initialiseTimeFrame(iteration);
145170
}
146171

147-
void Tracker::computeTracklets(int& iteration, int& iROFslice)
172+
void Tracker::computeTracklets(int& iteration, int& iROFslice, int& iVertex)
148173
{
149-
mTraits->computeLayerTracklets(iteration, iROFslice);
174+
mTraits->computeLayerTracklets(iteration, iROFslice, iVertex);
150175
}
151176

152177
void Tracker::computeCells(int& iteration)
@@ -169,7 +194,7 @@ void Tracker::initialiseTimeFrameHybrid(int& iteration)
169194
mTraits->initialiseTimeFrameHybrid(iteration);
170195
}
171196

172-
void Tracker::computeTrackletsHybrid(int& iteration, int&)
197+
void Tracker::computeTrackletsHybrid(int& iteration, int&, int&)
173198
{
174199
mTraits->computeTrackletsHybrid(iteration);
175200
}
@@ -417,6 +442,7 @@ void Tracker::getGlobalConfiguration()
417442
params.CellDeltaTanLambdaSigma *= tc.deltaTanLres > 0 ? tc.deltaTanLres : 1.f;
418443
params.TrackletMinPt *= tc.minPt > 0 ? tc.minPt : 1.f;
419444
params.nROFsPerIterations = nROFsPerIterations;
445+
params.PerPrimaryVertexProcessing = tc.perPrimaryVertexProcessing;
420446
for (int iD{0}; iD < 3; ++iD) {
421447
params.Diamond[iD] = tc.diamondPos[iD];
422448
}

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

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ namespace its
5151

5252
constexpr int debugLevel{0};
5353

54-
void TrackerTraits::computeLayerTracklets(const int iteration, int iROFslice)
54+
void TrackerTraits::computeLayerTracklets(const int iteration, int iROFslice, int iVertex)
5555
{
5656
TimeFrame* tf = mTimeFrame;
5757

@@ -74,6 +74,8 @@ void TrackerTraits::computeLayerTracklets(const int iteration, int iROFslice)
7474
int endROF{mTrkParams[iteration].nROFsPerIterations > 0 ? std::min((iROFslice + 1) * mTrkParams[iteration].nROFsPerIterations + mTrkParams[iteration].DeltaROF, tf->getNrof()) : tf->getNrof()};
7575
for (int rof0{startROF}; rof0 < endROF; ++rof0) {
7676
gsl::span<const Vertex> primaryVertices = mTrkParams[iteration].UseDiamond ? diamondSpan : tf->getPrimaryVertices(rof0);
77+
const int startVtx{iVertex >= 0 ? iVertex : 0};
78+
const int endVtx{iVertex >= 0 ? std::min(iVertex + 1, static_cast<int>(primaryVertices.size())) : static_cast<int>(primaryVertices.size())};
7779
int minRof = std::max(startROF, rof0 - mTrkParams[iteration].DeltaROF);
7880
int maxRof = std::min(endROF - 1, rof0 + mTrkParams[iteration].DeltaROF);
7981
#pragma omp parallel for num_threads(mNThreads)
@@ -94,7 +96,8 @@ void TrackerTraits::computeLayerTracklets(const int iteration, int iROFslice)
9496
}
9597
const float inverseR0{1.f / currentCluster.radius};
9698

97-
for (auto& primaryVertex : primaryVertices) {
99+
for (int iV{startVtx}; iV < endVtx; ++iV) {
100+
auto& primaryVertex{primaryVertices[iV]};
98101
const float resolution = std::sqrt(Sq(mTrkParams[iteration].PVres) / primaryVertex.getNContributors() + Sq(tf->getPositionResolution(iLayer)));
99102

100103
const float tanLambda{(currentCluster.zCoordinate - primaryVertex.getZ()) * inverseR0};
@@ -402,17 +405,16 @@ void TrackerTraits::findCellsNeighbours(const int iteration)
402405
std::ofstream off(fmt::format("cellneighs{}.txt", iteration));
403406
#endif
404407
for (int iLayer{0}; iLayer < mTrkParams[iteration].CellsPerRoad() - 1; ++iLayer) {
405-
408+
const int nextLayerCellsNum{static_cast<int>(mTimeFrame->getCells()[iLayer + 1].size())};
409+
mTimeFrame->getCellsNeighboursLUT()[iLayer].clear();
410+
mTimeFrame->getCellsNeighboursLUT()[iLayer].resize(nextLayerCellsNum, 0);
406411
if (mTimeFrame->getCells()[iLayer + 1].empty() ||
407412
mTimeFrame->getCellsLookupTable()[iLayer].empty()) {
413+
mTimeFrame->getCellsNeighbours()[iLayer].clear();
408414
continue;
409415
}
410416

411417
int layerCellsNum{static_cast<int>(mTimeFrame->getCells()[iLayer].size())};
412-
const int nextLayerCellsNum{static_cast<int>(mTimeFrame->getCells()[iLayer + 1].size())};
413-
414-
mTimeFrame->getCellsNeighboursLUT()[iLayer].clear();
415-
mTimeFrame->getCellsNeighboursLUT()[iLayer].resize(nextLayerCellsNum, 0);
416418
std::vector<std::pair<int, int>> cellsNeighbours;
417419
cellsNeighbours.reserve(nextLayerCellsNum);
418420

0 commit comments

Comments
 (0)