Skip to content

Commit cd34d34

Browse files
authored
[SVertexer] Sort tracks by their decayRef when nthreads>1 (#12003)
* Sort tracks by their decayRef when nthreads>1 * Optimize loops
1 parent dbaa100 commit cd34d34

File tree

1 file changed

+37
-9
lines changed

1 file changed

+37
-9
lines changed

Detectors/Vertexing/src/SVertexer.cxx

Lines changed: 37 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -170,14 +170,16 @@ void SVertexer::process(const o2::globaltracking::RecoContainer& recoData, o2::f
170170
for (int ith = 0; ith < mNThreads; ith++) {
171171
mNStrangeTracks += mStrTracker->getNTracks(ith);
172172
}
173-
auto& strTracksOut = pc.outputs().make<std::vector<o2::dataformats::StrangeTrack>>(o2f::Output{"GLO", "STRANGETRACKS", 0, o2f::Lifetime::Timeframe});
174-
auto& strClustOut = pc.outputs().make<std::vector<o2::strangeness_tracking::ClusAttachments>>(o2f::Output{"GLO", "CLUSUPDATES", 0, o2f::Lifetime::Timeframe});
175-
o2::pmr::vector<o2::MCCompLabel> mcLabsOut;
176-
strTracksOut.reserve(mNStrangeTracks);
177-
strClustOut.reserve(mNStrangeTracks);
173+
174+
std::vector<o2::dataformats::StrangeTrack> strTracksTmp;
175+
std::vector<o2::strangeness_tracking::ClusAttachments> strClusTmp;
176+
std::vector<o2::MCCompLabel> mcLabTmp;
177+
strTracksTmp.reserve(mNStrangeTracks);
178+
strClusTmp.reserve(mNStrangeTracks);
178179
if (mStrTracker->getMCTruthOn()) {
179-
mcLabsOut.reserve(mNStrangeTracks);
180+
mcLabTmp.reserve(mNStrangeTracks);
180181
}
182+
181183
for (int ith = 0; ith < mNThreads; ith++) { // merge results of all threads
182184
auto& strTracks = mStrTracker->getStrangeTrackVec(ith);
183185
auto& strClust = mStrTracker->getClusAttachments(ith);
@@ -193,13 +195,39 @@ void SVertexer::process(const o2::globaltracking::RecoContainer& recoData, o2::f
193195
} else {
194196
LOGP(fatal, "Unknown strange track decay reference type {} for index {}", int(t.mPartType), t.mDecayRef);
195197
}
196-
strTracksOut.push_back(t);
197-
strClustOut.push_back(strClust[i]);
198+
199+
strTracksTmp.push_back(t);
200+
strClusTmp.push_back(strClust[i]);
198201
if (mStrTracker->getMCTruthOn()) {
199-
mcLabsOut.push_back(stcTrMCLab[i]);
202+
mcLabTmp.push_back(stcTrMCLab[i]);
200203
}
201204
}
202205
}
206+
207+
auto& strTracksOut = pc.outputs().make<std::vector<o2::dataformats::StrangeTrack>>(o2f::Output{"GLO", "STRANGETRACKS", 0, o2f::Lifetime::Timeframe});
208+
auto& strClustOut = pc.outputs().make<std::vector<o2::strangeness_tracking::ClusAttachments>>(o2f::Output{"GLO", "CLUSUPDATES", 0, o2f::Lifetime::Timeframe});
209+
o2::pmr::vector<o2::MCCompLabel> mcLabsOut;
210+
strTracksOut.resize(mNStrangeTracks);
211+
strClustOut.resize(mNStrangeTracks);
212+
if (mStrTracker->getMCTruthOn()) {
213+
mcLabsOut.resize(mNStrangeTracks);
214+
}
215+
216+
std::vector<int> sortIdx(strTracksTmp.size());
217+
std::iota(sortIdx.begin(), sortIdx.end(), 0);
218+
// if mNTreads > 1 we need to sort tracks, clus and MCLabs by their mDecayRef
219+
if (mNThreads > 1 && mNStrangeTracks > 1) {
220+
std::sort(sortIdx.begin(), sortIdx.end(), [&strTracksTmp](int i1, int i2) { return strTracksTmp[i1].mDecayRef < strTracksTmp[i2].mDecayRef; });
221+
}
222+
223+
for (int i = 0; i < (int)sortIdx.size(); i++) {
224+
strTracksOut[i] = strTracksTmp[sortIdx[i]];
225+
strClustOut[i] = strClusTmp[sortIdx[i]];
226+
if (mStrTracker->getMCTruthOn()) {
227+
mcLabsOut[i] = mcLabTmp[sortIdx[i]];
228+
}
229+
}
230+
203231
if (mStrTracker->getMCTruthOn()) {
204232
auto& strTrMCLableOut = pc.outputs().make<std::vector<o2::MCCompLabel>>(o2f::Output{"GLO", "STRANGETRACKS_MC", 0, o2f::Lifetime::Timeframe});
205233
strTrMCLableOut.swap(mcLabsOut);

0 commit comments

Comments
 (0)