@@ -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