@@ -117,6 +117,8 @@ void ITSTrackingInterface::run(framework::ProcessingContext& pc)
117117 static pmr::vector<float > dummyMCPurVerts;
118118 auto & allTrackLabels = mIsMC ? pc.outputs ().make <std::vector<o2::MCCompLabel>>(Output{" ITS" , " TRACKSMCTR" , 0 }) : dummyMCLabTracks;
119119 auto & allVerticesLabels = mIsMC ? pc.outputs ().make <std::vector<o2::MCCompLabel>>(Output{" ITS" , " VERTICESMCTR" , 0 }) : dummyMCLabVerts;
120+ bool writeContLabels = mIsMC && o2::its::VertexerParamConfig::Instance ().outputContLabels ;
121+ auto & allVerticesContLabels = writeContLabels ? pc.outputs ().make <std::vector<o2::MCCompLabel>>(Output{" ITS" , " VERTICESMCTRCONT" , 0 }) : dummyMCLabVerts;
120122 auto & allVerticesPurities = mIsMC ? pc.outputs ().make <std::vector<float >>(Output{" ITS" , " VERTICESMCPUR" , 0 }) : dummyMCPurVerts;
121123
122124 std::uint32_t roFrame = 0 ;
@@ -159,6 +161,7 @@ void ITSTrackingInterface::run(framework::ProcessingContext& pc)
159161 }
160162 const auto & multEstConf = FastMultEstConfig::Instance (); // parameters for mult estimation and cuts
161163 gsl::span<const std::pair<MCCompLabel, float >> vMCRecInfo;
164+ gsl::span<const MCCompLabel> vMCContLabels;
162165 for (auto iRof{0 }; iRof < trackROFspan.size (); ++iRof) {
163166 std::vector<Vertex> vtxVecLoc;
164167 auto & vtxROF = vertROFvec.emplace_back (trackROFspan[iRof]);
@@ -167,6 +170,9 @@ void ITSTrackingInterface::run(framework::ProcessingContext& pc)
167170 auto vtxSpan = mTimeFrame ->getPrimaryVertices (iRof);
168171 if (mIsMC ) {
169172 vMCRecInfo = mTimeFrame ->getPrimaryVerticesMCRecInfo (iRof);
173+ if (o2::its::VertexerParamConfig::Instance ().outputContLabels ) {
174+ vMCContLabels = mTimeFrame ->getPrimaryVerticesContributors (iRof);
175+ }
170176 }
171177 if (o2::its::TrackerParamConfig::Instance ().doUPCIteration ) {
172178 if (!vtxSpan.empty ()) {
@@ -186,17 +192,22 @@ void ITSTrackingInterface::run(framework::ProcessingContext& pc)
186192 }
187193 vtxROF.setNEntries (vtxSpan.size ());
188194 bool selROF = vtxSpan.empty ();
189- for (auto iV{0 }; iV < vtxSpan.size (); ++iV) {
195+ for (int iV{ 0 }, iVC {0 }; iV < vtxSpan.size (); ++iV) {
190196 const auto & v = vtxSpan[iV];
191197 if (multEstConf.isVtxMultCutRequested () && !multEstConf.isPassingVtxMultCut (v.getNContributors ())) {
198+ iVC += v.getNContributors ();
192199 continue ; // skip vertex of unwanted multiplicity
193200 }
194201 selROF = true ;
195202 vertices.push_back (v);
196203 if (mIsMC && !VertexerParamConfig::Instance ().useTruthSeeding ) {
197204 allVerticesLabels.push_back (vMCRecInfo[iV].first );
198205 allVerticesPurities.push_back (vMCRecInfo[iV].second );
206+ if (o2::its::VertexerParamConfig::Instance ().outputContLabels ) {
207+ allVerticesContLabels.insert (allVerticesContLabels.end (), vMCContLabels.begin () + iVC, vMCContLabels.begin () + iVC + v.getNContributors ());
208+ }
199209 }
210+ iVC += v.getNContributors ();
200211 }
201212 if (processingMask[iRof] && !selROF) { // passed selection in clusters and not in vertex multiplicity
202213 LOGP (info, " ROF {} rejected by the vertex multiplicity selection [{},{}]" , iRof, multEstConf.cutMultVtxLow , multEstConf.cutMultVtxHigh );
@@ -291,6 +302,9 @@ void ITSTrackingInterface::run(framework::ProcessingContext& pc)
291302 if (mIsMC ) {
292303 LOGP (info, " ITSTracker pushed {} track labels" , allTrackLabels.size ());
293304 LOGP (info, " ITSTracker pushed {} vertex labels" , allVerticesLabels.size ());
305+ if (!allVerticesContLabels.empty ()) {
306+ LOGP (info, " ITSTracker pushed {} vertex contributor labels" , allVerticesContLabels.size ());
307+ }
294308 LOGP (info, " ITSTracker pushed {} vertex purities" , allVerticesPurities.size ());
295309 }
296310 }
0 commit comments