Skip to content

Commit 7e53089

Browse files
committed
ITS: fix upc iteration
Signed-off-by: Felix Schlepper <felix.schlepper@cern.ch>
1 parent b61cf4a commit 7e53089

8 files changed

Lines changed: 69 additions & 58 deletions

File tree

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,9 @@ struct TrackingParameters {
8484
struct VertexingParameters {
8585
std::string asString() const;
8686

87-
int nIterations = 1; // Number of vertexing passes to perform
8887
std::vector<float> LayerZ = {16.333f + 1, 16.333f + 1, 16.333f + 1, 42.140f + 1, 42.140f + 1, 73.745f + 1, 73.745f + 1};
8988
std::vector<float> LayerRadii = {2.33959f, 3.14076f, 3.91924f, 19.6213f, 24.5597f, 34.388f, 39.3329f};
89+
int vertPerRofThreshold = 0; // Maximum number of vertices per ROF to trigger second a round
9090
int ZBins = 1;
9191
int PhiBins = 128;
9292
float zCut = -1.f;

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ class Vertexer
9191

9292
void printEpilog(LogFunc& logger,
9393
const unsigned int trackletN01, const unsigned int trackletN12,
94-
const unsigned selectedN, const unsigned int vertexN, const float initT,
94+
const unsigned selectedN, const unsigned int vertexN, const unsigned int totalVertexN,
9595
const float trackletT, const float selecT, const float vertexT);
9696

9797
void setNThreads(int n, std::shared_ptr<tbb::task_arena>& arena) { mTraits->setNThreads(n, arena); }

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,8 @@ class VertexerTraits
115115
// Frame related quantities
116116
TimeFrameN* mTimeFrame = nullptr; // observer ptr
117117
private:
118+
bool skipROF(int iteration, int rof) const;
119+
118120
std::shared_ptr<BoundedMemoryResource> mMemoryPool;
119121
std::shared_ptr<tbb::task_arena> mTaskArena;
120122
};

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

Lines changed: 33 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ std::vector<TrackingParameters> TrackingMode::getTrackingParameters(TrackingMode
136136
trackParams[3].TrackletMinPt = 0.1f;
137137
trackParams[3].CellDeltaTanLambdaSigma *= 4.;
138138
}
139-
for (size_t ip = 0; ip < trackParams.size(); ip++) {
139+
for (int ip = 0; ip < (int)trackParams.size(); ip++) {
140140
auto& param = trackParams[ip];
141141
param.ZBins = 64;
142142
param.PhiBins = 32;
@@ -149,7 +149,7 @@ std::vector<TrackingParameters> TrackingMode::getTrackingParameters(TrackingMode
149149
param.MinTrackLength = tc.minTrackLgtIter[ip];
150150
}
151151
for (int ilg = tc.MaxTrackLength; ilg >= tc.MinTrackLength; ilg--) {
152-
int lslot0 = (tc.MaxTrackLength - ilg), lslot = lslot0 + ip * (tc.MaxTrackLength - tc.MinTrackLength + 1);
152+
int lslot0 = (tc.MaxTrackLength - ilg), lslot = lslot0 + (ip * (tc.MaxTrackLength - tc.MinTrackLength + 1));
153153
if (tc.minPtIterLgt[lslot] > 0.) {
154154
param.MinPt[lslot0] = tc.minPtIterLgt[lslot];
155155
}
@@ -240,26 +240,14 @@ std::vector<TrackingParameters> TrackingMode::getTrackingParameters(TrackingMode
240240
std::vector<VertexingParameters> TrackingMode::getVertexingParameters(TrackingMode::Type mode)
241241
{
242242
const auto& vc = o2::its::VertexerParamConfig::Instance();
243-
std::vector<VertexingParameters> vertParams;
244-
if (mode == TrackingMode::Async) {
245-
vertParams.resize(2); // The number of actual iterations will be set as a configKeyVal to allow for pp/PbPb choice
246-
vertParams[1].phiCut = 0.015f;
247-
vertParams[1].tanLambdaCut = 0.015f;
248-
} else if (mode == TrackingMode::Sync) {
249-
vertParams.resize(1);
250-
} else if (mode == TrackingMode::Cosmics) {
251-
vertParams.resize(1);
252-
} else {
253-
LOGP(fatal, "Unsupported ITS vertexing mode {} ", toString(mode));
254-
}
255-
243+
std::vector<VertexingParameters> vertParams(2); // The number of actual iterations will be set as a configKeyVal to allow for pp/PbPb choice
256244
// global parameters set for every iteration
257245
for (auto& p : vertParams) {
246+
p.vertPerRofThreshold = vc.vertPerRofThreshold;
258247
p.SaveTimeBenchmarks = vc.saveTimeBenchmarks;
259248
p.PrintMemory = vc.printMemory;
260249
p.MaxMemory = vc.maxMemory;
261250
p.DropTFUponFailure = vc.dropTFUponFailure;
262-
p.nIterations = vc.nIterations;
263251
p.trackletSigma = vc.trackletSigma;
264252
p.maxZPositionAllowed = vc.maxZPositionAllowed;
265253
p.clusterContributorsCut = vc.clusterContributorsCut;
@@ -270,24 +258,37 @@ std::vector<VertexingParameters> TrackingMode::getVertexingParameters(TrackingMo
270258
p.nThreads = vc.nThreads;
271259
p.ZBins = vc.ZBins;
272260
p.PhiBins = vc.PhiBins;
273-
274261
p.useTruthSeeding = vc.useTruthSeeding;
262+
p.vertNsigmaCut = vc.vertNsigmaCut;
263+
p.vertRadiusSigma = vc.vertRadiusSigma;
264+
p.maxTrackletsPerCluster = vc.maxTrackletsPerCluster;
265+
p.zCut = vc.zCut;
266+
p.phiCut = vc.phiCut;
267+
p.pairCut = vc.pairCut;
268+
p.clusterCut = vc.clusterCut;
269+
p.coarseZWindow = vc.coarseZWindow;
270+
p.seedDedupZCut = vc.seedDedupZCut;
271+
p.refitDedupZCut = vc.refitDedupZCut;
272+
p.duplicateZCut = vc.duplicateZCut;
273+
p.finalSelectionZCut = vc.finalSelectionZCut;
274+
p.duplicateDistance2Cut = vc.duplicateDistance2Cut;
275+
p.tanLambdaCut = vc.tanLambdaCut;
276+
}
277+
278+
if (mode == TrackingMode::Async) {
279+
// relax for UPC iteration
280+
vertParams[1].phiCut = 0.015f;
281+
vertParams[1].tanLambdaCut = 0.015f;
282+
vertParams[1].maxTrackletsPerCluster = 2000;
283+
} else if (mode == TrackingMode::Sync || TrackingMode::Cosmics) {
284+
vertParams.resize(1);
285+
} else {
286+
LOGP(fatal, "Unsupported ITS vertexing mode {} ", toString(mode));
287+
}
288+
289+
if (vertParams.size() > vc.nIterations) {
290+
vertParams.resize(vc.nIterations);
275291
}
276-
// set for now outside to not disturb status quo
277-
vertParams[0].vertNsigmaCut = vc.vertNsigmaCut;
278-
vertParams[0].vertRadiusSigma = vc.vertRadiusSigma;
279-
vertParams[0].maxTrackletsPerCluster = vc.maxTrackletsPerCluster;
280-
vertParams[0].zCut = vc.zCut;
281-
vertParams[0].phiCut = vc.phiCut;
282-
vertParams[0].pairCut = vc.pairCut;
283-
vertParams[0].clusterCut = vc.clusterCut;
284-
vertParams[0].coarseZWindow = vc.coarseZWindow;
285-
vertParams[0].seedDedupZCut = vc.seedDedupZCut;
286-
vertParams[0].refitDedupZCut = vc.refitDedupZCut;
287-
vertParams[0].duplicateZCut = vc.duplicateZCut;
288-
vertParams[0].finalSelectionZCut = vc.finalSelectionZCut;
289-
vertParams[0].duplicateDistance2Cut = vc.duplicateDistance2Cut;
290-
vertParams[0].tanLambdaCut = vc.tanLambdaCut;
291292

292293
return vertParams;
293294
}

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ void Tracker<NLayers>::clustersToTracks(const LogFunc& logger, const LogFunc& er
4646

4747
double total{0};
4848
mTraits->updateTrackingParameters(mTrkParams);
49-
mTimeFrame->updateROFVertexLookupTable();
5049

5150
int maxNvertices{-1};
5251
if (mTrkParams[0].PerPrimaryVertexProcessing) {

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

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -209,10 +209,7 @@ void ITSTrackingInterface::run(framework::ProcessingContext& pc)
209209
auto clockROFspan = rofsinput[clockLayerId];
210210
auto clockTiming = mTimeFrame->getROFOverlapTableView().getClockLayer();
211211
for (auto iRof{0}; iRof < clockROFspan.size(); ++iRof) {
212-
bounded_vector<Vertex> vtxVecLoc;
213212
auto& vtxROF = vertROFvec.emplace_back(clockROFspan[iRof]);
214-
vtxROF.setFirstEntry((int)vertices.size());
215-
216213
if (mRunVertexer) {
217214
auto vtxSpan = mTimeFrame->getPrimaryVertices(clockLayerId, iRof);
218215
if (o2::its::TrackerParamConfig::Instance().doUPCIteration) {
@@ -231,7 +228,6 @@ void ITSTrackingInterface::run(framework::ProcessingContext& pc)
231228
} else {
232229
vtxROF.setFlag(o2::itsmft::ROFRecord::VtxStdMode);
233230
}
234-
vtxROF.setNEntries((int)vtxSpan.size());
235231
}
236232
}
237233

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

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ float Vertexer<NLayers>::clustersToVertices(LogFunc logger)
6060

6161
float timeTracklet{0.f}, timeSelection{0.f}, timeVertexing{0.f}, timeInit{0.f};
6262
try {
63-
for (int iteration = 0; iteration < std::min(mVertParams[0].nIterations, (int)mVertParams.size()); ++iteration) {
63+
for (int iteration = 0; iteration < (int)mVertParams.size(); ++iteration) {
6464
mMemoryPool->setMaxMemory(mVertParams[iteration].MaxMemory);
6565
unsigned int nTracklets01{0}, nTracklets12{0};
6666
logger(fmt::format("=== ITS {} Seeding vertexer iteration {} summary:", mTraits->getName(), iteration));
@@ -71,12 +71,18 @@ float Vertexer<NLayers>::clustersToVertices(LogFunc logger)
7171
nTracklets01 = mTimeFrame->getTotalTrackletsTF(0);
7272
nTracklets12 = mTimeFrame->getTotalTrackletsTF(1);
7373
auto timeSelectionIteration = evaluateTask(&Vertexer::validateTracklets, StateNames[mCurState = Validating], iteration, evalLog, iteration);
74+
const auto nVerticesBefore = mTimeFrame->getPrimaryVertices().size();
7475
auto timeVertexingIteration = evaluateTask(&Vertexer::findVertices, StateNames[mCurState = Finding], iteration, evalLog, iteration);
75-
printEpilog(logger, nTracklets01, nTracklets12, mTimeFrame->getNLinesTotal(), mTimeFrame->getPrimaryVertices().size(), timeInitIteration, timeTrackletIteration, timeSelectionIteration, timeVertexingIteration);
76+
const auto nVerticesAfter = mTimeFrame->getPrimaryVertices().size();
77+
printEpilog(logger, nTracklets01, nTracklets12, mTimeFrame->getNLinesTotal(), nVerticesAfter - nVerticesBefore, nVerticesAfter, timeTrackletIteration, timeSelectionIteration, timeVertexingIteration);
7678
timeInit += timeInitIteration;
7779
timeTracklet += timeTrackletIteration;
7880
timeSelection += timeSelectionIteration;
7981
timeVertexing += timeVertexingIteration;
82+
83+
// update LUT with all currently found vertices so in second iteration we can check vertPerROFThreshold
84+
sortVertices();
85+
mTimeFrame->updateROFVertexLookupTable();
8086
}
8187
} catch (const BoundedMemoryResource::MemoryLimitExceeded& err) {
8288
handleException(err);
@@ -86,8 +92,6 @@ float Vertexer<NLayers>::clustersToVertices(LogFunc logger)
8692
LOGP(fatal, "Uncaught exception!");
8793
}
8894

89-
sortVertices();
90-
9195
return timeInit + timeTracklet + timeSelection + timeVertexing;
9296
}
9397

@@ -134,12 +138,12 @@ void Vertexer<NLayers>::adoptTimeFrame(TimeFrameN& tf)
134138
template <int NLayers>
135139
void Vertexer<NLayers>::printEpilog(LogFunc& logger,
136140
const unsigned int trackletN01, const unsigned int trackletN12,
137-
const unsigned selectedN, const unsigned int vertexN, const float initT,
141+
const unsigned selectedN, const unsigned int vertexN, const unsigned int totalVertexN,
138142
const float trackletT, const float selecT, const float vertexT)
139143
{
140144
logger(fmt::format(" - {} Vertexer: found {} | {} tracklets in: {} ms", mTraits->getName(), trackletN01, trackletN12, trackletT));
141145
logger(fmt::format(" - {} Vertexer: selected {} tracklets in: {} ms", mTraits->getName(), selectedN, selecT));
142-
logger(fmt::format(" - {} Vertexer: found {} vertices in: {} ms", mTraits->getName(), vertexN, vertexT));
146+
logger(fmt::format(" - {} Vertexer: found {} vertices in: {} ms (total: {})", mTraits->getName(), vertexN, vertexT, totalVertexN));
143147
if (mVertParams[0].PrintMemory) {
144148
mTimeFrame->printArtefactsMemory();
145149
mMemoryPool->print();

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

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -168,15 +168,15 @@ void VertexerTraits<NLayers>::computeTracklets(const int iteration)
168168
{
169169
mTaskArena->execute([&] {
170170
tbb::parallel_for(0, mTimeFrame->getNrof(1), [&](const short pivotRofId) {
171-
bool skipROF = !mTimeFrame->getROFMaskView().isROFEnabled(1, pivotRofId);
171+
bool skip = skipROF(iteration, pivotRofId);
172172
const auto& rofRange01 = mTimeFrame->getROFOverlapTableView().getOverlap(1, 0, pivotRofId);
173173
for (auto targetRofId = rofRange01.getFirstEntry(); targetRofId < rofRange01.getEntriesBound(); ++targetRofId) {
174174
const auto timeErr = mTimeFrame->getROFOverlapTableView().getTimeStamp(0, targetRofId, 1, pivotRofId);
175175
trackleterKernelHost<TrackletMode::Layer0Layer1, true>(
176-
!skipROF ? mTimeFrame->getClustersOnLayer(targetRofId, 0) : gsl::span<Cluster>(), // Clusters to be matched with the next layer in target rof
177-
!skipROF ? mTimeFrame->getClustersOnLayer(pivotRofId, 1) : gsl::span<Cluster>(), // Clusters to be matched with the current layer in pivot rof
178-
mTimeFrame->getUsedClustersROF(targetRofId, 0), // Span of the used clusters in the target rof
179-
mTimeFrame->getIndexTable(targetRofId, 0).data(), // Index table to access the data on the next layer in target rof
176+
!skip ? mTimeFrame->getClustersOnLayer(targetRofId, 0) : gsl::span<Cluster>(), // Clusters to be matched with the next layer in target rof
177+
!skip ? mTimeFrame->getClustersOnLayer(pivotRofId, 1) : gsl::span<Cluster>(), // Clusters to be matched with the current layer in pivot rof
178+
mTimeFrame->getUsedClustersROF(targetRofId, 0), // Span of the used clusters in the target rof
179+
mTimeFrame->getIndexTable(targetRofId, 0).data(), // Index table to access the data on the next layer in target rof
180180
mVrtParams[iteration].phiCut,
181181
mTimeFrame->getTracklets()[0], // Flat tracklet buffer
182182
mTimeFrame->getNTrackletsCluster(pivotRofId, 0), // Span of the number of tracklets per each cluster in pivot rof
@@ -191,8 +191,8 @@ void VertexerTraits<NLayers>::computeTracklets(const int iteration)
191191
for (auto targetRofId = rofRange12.getFirstEntry(); targetRofId < rofRange12.getEntriesBound(); ++targetRofId) {
192192
const auto timeErr = mTimeFrame->getROFOverlapTableView().getTimeStamp(2, targetRofId, 1, pivotRofId);
193193
trackleterKernelHost<TrackletMode::Layer1Layer2, true>(
194-
!skipROF ? mTimeFrame->getClustersOnLayer(targetRofId, 2) : gsl::span<Cluster>(),
195-
!skipROF ? mTimeFrame->getClustersOnLayer(pivotRofId, 1) : gsl::span<Cluster>(),
194+
!skip ? mTimeFrame->getClustersOnLayer(targetRofId, 2) : gsl::span<Cluster>(),
195+
!skip ? mTimeFrame->getClustersOnLayer(pivotRofId, 1) : gsl::span<Cluster>(),
196196
mTimeFrame->getUsedClustersROF(targetRofId, 2),
197197
mTimeFrame->getIndexTable(targetRofId, 2).data(),
198198
mVrtParams[iteration].phiCut,
@@ -219,14 +219,14 @@ void VertexerTraits<NLayers>::computeTracklets(const int iteration)
219219
}
220220

221221
tbb::parallel_for(0, mTimeFrame->getNrof(1), [&](const short pivotRofId) {
222-
bool skipROF = !mTimeFrame->getROFMaskView().isROFEnabled(1, pivotRofId);
222+
bool skip = skipROF(iteration, pivotRofId);
223223
const int globalOffsetPivot = mTimeFrame->getSortedStartIndex(pivotRofId, 1);
224224
const auto& rofRange01 = mTimeFrame->getROFOverlapTableView().getOverlap(1, 0, pivotRofId);
225225
for (auto targetRofId = rofRange01.getFirstEntry(); targetRofId < rofRange01.getEntriesBound(); ++targetRofId) {
226226
const auto timeErr = mTimeFrame->getROFOverlapTableView().getTimeStamp(0, targetRofId, 1, pivotRofId);
227227
trackleterKernelHost<TrackletMode::Layer0Layer1, false>(
228-
!skipROF ? mTimeFrame->getClustersOnLayer(targetRofId, 0) : gsl::span<Cluster>(),
229-
!skipROF ? mTimeFrame->getClustersOnLayer(pivotRofId, 1) : gsl::span<Cluster>(),
228+
!skip ? mTimeFrame->getClustersOnLayer(targetRofId, 0) : gsl::span<Cluster>(),
229+
!skip ? mTimeFrame->getClustersOnLayer(pivotRofId, 1) : gsl::span<Cluster>(),
230230
mTimeFrame->getUsedClustersROF(targetRofId, 0),
231231
mTimeFrame->getIndexTable(targetRofId, 0).data(),
232232
mVrtParams[iteration].phiCut,
@@ -243,8 +243,8 @@ void VertexerTraits<NLayers>::computeTracklets(const int iteration)
243243
for (auto targetRofId = rofRange12.getFirstEntry(); targetRofId < rofRange12.getEntriesBound(); ++targetRofId) {
244244
const auto timeErr = mTimeFrame->getROFOverlapTableView().getTimeStamp(2, targetRofId, 1, pivotRofId);
245245
trackleterKernelHost<TrackletMode::Layer1Layer2, false>(
246-
!skipROF ? mTimeFrame->getClustersOnLayer(targetRofId, 2) : gsl::span<Cluster>(),
247-
!skipROF ? mTimeFrame->getClustersOnLayer(pivotRofId, 1) : gsl::span<Cluster>(),
246+
!skip ? mTimeFrame->getClustersOnLayer(targetRofId, 2) : gsl::span<Cluster>(),
247+
!skip ? mTimeFrame->getClustersOnLayer(pivotRofId, 1) : gsl::span<Cluster>(),
248248
mTimeFrame->getUsedClustersROF(targetRofId, 2),
249249
mTimeFrame->getIndexTable(targetRofId, 2).data(),
250250
mVrtParams[iteration].phiCut,
@@ -293,7 +293,7 @@ void VertexerTraits<NLayers>::computeTrackletMatching(const int iteration)
293293
tbb::blocked_range<short>(0, (short)mTimeFrame->getNrof(1)),
294294
[&](const tbb::blocked_range<short>& Rofs) {
295295
for (short pivotRofId = Rofs.begin(); pivotRofId < Rofs.end(); ++pivotRofId) {
296-
if (mTimeFrame->getFoundTracklets(pivotRofId, 0).empty()) {
296+
if (mTimeFrame->getFoundTracklets(pivotRofId, 0).empty() || skipROF(iteration, pivotRofId)) {
297297
continue;
298298
}
299299
mTimeFrame->getLines(pivotRofId).reserve(mTimeFrame->getNTrackletsCluster(pivotRofId, 0).size());
@@ -352,6 +352,9 @@ void VertexerTraits<NLayers>::computeVertices(const int iteration)
352352
settings.memoryPool = mMemoryPool;
353353

354354
const auto processROF = [&](const int rofId) {
355+
if (skipROF(iteration, rofId)) {
356+
return;
357+
}
355358
auto& lines = mTimeFrame->getLines(rofId);
356359
auto clusters = line_vertexer::buildClusters(std::span<const Line>{lines.data(), lines.size()}, settings);
357360
deepVectorClear(lines); // not needed after
@@ -620,5 +623,11 @@ void VertexerTraits<NLayers>::setNThreads(int n, std::shared_ptr<tbb::task_arena
620623
}
621624
}
622625

626+
template <int NLayers>
627+
bool VertexerTraits<NLayers>::skipROF(int iteration, int rof) const
628+
{
629+
return iteration && (int)mTimeFrame->getROFVertexLookupTableView().getVertices(1, rof).getEntries() > mVrtParams[iteration].vertPerRofThreshold;
630+
}
631+
623632
template class VertexerTraits<7>;
624633
} // namespace o2::its

0 commit comments

Comments
 (0)