@@ -118,15 +118,14 @@ void ITSTrackingInterface::run(framework::ProcessingContext& pc)
118118 }
119119
120120 auto rofsinput = pc.inputs ().get <gsl::span<o2::itsmft::ROFRecord>>(" ROframes" );
121- auto & rofs = pc.outputs ().make <std::vector<o2::itsmft::ROFRecord>>(Output{" ITS" , " ITSTrackROF" , 0 }, rofsinput.begin (), rofsinput.end ());
121+ auto & trackROFvec = pc.outputs ().make <std::vector<o2::itsmft::ROFRecord>>(Output{" ITS" , " ITSTrackROF" , 0 }, rofsinput.begin (), rofsinput.end ());
122122 auto & irFrames = pc.outputs ().make <std::vector<o2::dataformats::IRFrame>>(Output{" ITS" , " IRFRAMES" , 0 });
123123 const auto & alpParams = o2::itsmft::DPLAlpideParam<o2::detectors::DetID::ITS>::Instance (); // RS: this should come from CCDB
124124
125- irFrames.reserve (rofs .size ());
125+ irFrames.reserve (trackROFvec .size ());
126126 int nBCPerTF = alpParams.roFrameLengthInBC ;
127127
128- LOGP (info, " ITSTracker pulled {} clusters, {} RO frames" , compClusters.size (), rofs.size ());
129-
128+ LOGP (info, " ITSTracker pulled {} clusters, {} RO frames" , compClusters.size (), trackROFvec.size ());
130129 const dataformats::MCTruthContainer<MCCompLabel>* labels = nullptr ;
131130 gsl::span<itsmft::MC2ROFRecord const > mc2rofs;
132131 if (mIsMC ) {
@@ -165,8 +164,8 @@ void ITSTrackingInterface::run(framework::ProcessingContext& pc)
165164
166165 gsl::span<const unsigned char >::iterator pattIt = patterns.begin ();
167166
168- gsl::span<itsmft::ROFRecord> rofspan (rofs );
169- mTimeFrame ->loadROFrameData (rofspan , compClusters, pattIt, mDict , labels);
167+ gsl::span<itsmft::ROFRecord> trackROFspan (trackROFvec );
168+ mTimeFrame ->loadROFrameData (trackROFspan , compClusters, pattIt, mDict , labels);
170169 pattIt = patterns.begin ();
171170 std::vector<int > savedROF;
172171 auto logger = [&](std::string s) { LOG (info) << s; };
@@ -175,12 +174,12 @@ void ITSTrackingInterface::run(framework::ProcessingContext& pc)
175174
176175 FastMultEst multEst; // mult estimator
177176 std::vector<bool > processingMask, processUPCMask;
178- int cutVertexMult{0 }, cutUPCVertex{0 }, cutRandomMult = int (rofs .size ()) - multEst.selectROFs (rofs , compClusters, physTriggers, processingMask);
177+ int cutVertexMult{0 }, cutUPCVertex{0 }, cutRandomMult = int (trackROFvec .size ()) - multEst.selectROFs (trackROFvec , compClusters, physTriggers, processingMask);
179178 processUPCMask.resize (processingMask.size (), false );
180179 mTimeFrame ->setMultiplicityCutMask (processingMask);
181180 float vertexerElapsedTime{0 .f };
182181 if (mRunVertexer ) {
183- vertROFvec.reserve (rofs .size ());
182+ vertROFvec.reserve (trackROFvec .size ());
184183 // Run seeding vertexer
185184 if constexpr (isGPU) {
186185 vertexerElapsedTime = mVertexer ->clustersToVerticesHybrid (logger);
@@ -192,9 +191,9 @@ void ITSTrackingInterface::run(framework::ProcessingContext& pc)
192191 }
193192 const auto & multEstConf = FastMultEstConfig::Instance (); // parameters for mult estimation and cuts
194193 gsl::span<const std::pair<MCCompLabel, float >> vMCRecInfo;
195- for (auto iRof{0 }; iRof < rofspan .size (); ++iRof) {
194+ for (auto iRof{0 }; iRof < trackROFspan .size (); ++iRof) {
196195 std::vector<Vertex> vtxVecLoc;
197- auto & vtxROF = vertROFvec.emplace_back (rofspan [iRof]);
196+ auto & vtxROF = vertROFvec.emplace_back (trackROFspan [iRof]);
198197 vtxROF.setFirstEntry (vertices.size ());
199198 if (mRunVertexer ) {
200199 auto vtxSpan = mTimeFrame ->getPrimaryVertices (iRof);
@@ -219,6 +218,11 @@ void ITSTrackingInterface::run(framework::ProcessingContext& pc)
219218 allVerticesLabels.push_back (vMCRecInfo[iV].first );
220219 allVerticesPurities.push_back (vMCRecInfo[iV].second );
221220 }
221+ if (v.isFlagSet (2 )) { // Vertex is reconstructed in a second iteration
222+ vtxROF.setFlag (2 ); // flag that at least one vertex is from the second iteration
223+ } else {
224+ vtxROF.setFlag (1 ); // flag that at least one vertex is from the first iteration
225+ }
222226 }
223227 if (processingMask[iRof] && !selROF) { // passed selection in clusters and not in vertex multiplicity
224228 LOGP (info, " ROF {} rejected by the vertex multiplicity selection [{},{}]" , iRof, multEstConf.cutMultVtxLow , multEstConf.cutMultVtxHigh );
@@ -236,22 +240,22 @@ void ITSTrackingInterface::run(framework::ProcessingContext& pc)
236240 }
237241 }
238242 if (mRunVertexer ) {
239- LOG (info) << fmt::format (" - rejected {}/{} ROFs: random/mult.sel:{} (seed {}), vtx.sel:{}, upc.sel:{}" , cutRandomMult + cutVertexMult + cutUPCVertex, rofspan .size (), cutRandomMult, multEst.lastRandomSeed , cutVertexMult, cutUPCVertex);
243+ LOG (info) << fmt::format (" - rejected {}/{} ROFs: random/mult.sel:{} (seed {}), vtx.sel:{}, upc.sel:{}" , cutRandomMult + cutVertexMult + cutUPCVertex, trackROFspan .size (), cutRandomMult, multEst.lastRandomSeed , cutVertexMult, cutUPCVertex);
240244 LOG (info) << fmt::format (" - Vertex seeding total elapsed time: {} ms for {} ({} + {}) vertices found in {}/{} ROFs" ,
241245 vertexerElapsedTime,
242246 mTimeFrame ->getPrimaryVerticesNum (),
243247 mTimeFrame ->getTotVertIteration ()[0 ],
244248 o2::its::VertexerParamConfig::Instance ().nIterations > 1 ? mTimeFrame ->getTotVertIteration ()[1 ] : 0 ,
245- rofspan .size () - mTimeFrame ->getNoVertexROF (),
246- rofspan .size ());
249+ trackROFspan .size () - mTimeFrame ->getNoVertexROF (),
250+ trackROFspan .size ());
247251 }
248252
249253 if (mOverrideBeamEstimation ) {
250254 LOG (info) << fmt::format (" - Beam position set to: {}, {} from meanvertex object" , mTimeFrame ->getBeamX (), mTimeFrame ->getBeamY ());
251255 } else {
252256 LOG (info) << fmt::format (" - Beam position computed for the TF: {}, {}" , mTimeFrame ->getBeamX (), mTimeFrame ->getBeamY ());
253257 }
254- if (mCosmicsProcessing && compClusters.size () > 1500 * rofspan .size ()) {
258+ if (mCosmicsProcessing && compClusters.size () > 1500 * trackROFspan .size ()) {
255259 LOG (error) << " Cosmics processing was requested with an average detector occupancy exceeding 1.e-7, skipping TF processing." ;
256260 } else {
257261
@@ -279,17 +283,18 @@ void ITSTrackingInterface::run(framework::ProcessingContext& pc)
279283 LOG (warning) << fmt::format (" - The processed timeframe had {} clusters with wild z coordinates, check the dictionaries" , mTimeFrame ->hasBogusClusters ());
280284 }
281285
282- for (unsigned int iROF{0 }; iROF < rofs.size (); ++iROF) {
283- auto & rof{rofs[iROF]};
286+ for (unsigned int iROF{0 }; iROF < trackROFvec.size (); ++iROF) {
287+ auto & tracksROF{trackROFvec[iROF]};
288+ auto & vtxROF = vertROFvec[iROF];
284289 auto & tracks = mTimeFrame ->getTracks (iROF);
285290 auto number{tracks.size ()};
286291 auto first{allTracks.size ()};
287- int offset = -rof .getFirstEntry (); // cluster entry!!!
288- rof .setFirstEntry (first);
289- rof .setNEntries (number);
290-
292+ int offset = -tracksROF .getFirstEntry (); // cluster entry!!!
293+ tracksROF .setFirstEntry (first);
294+ tracksROF .setNEntries (number);
295+ tracksROF. setFlags (number ? vtxROF. getFlags () : 0 ); // copies 0xffffffff if cosmics
291296 if (processingMask[iROF]) {
292- irFrames.emplace_back (rof .getBCData (), rof .getBCData () + nBCPerTF - 1 ).info = tracks.size ();
297+ irFrames.emplace_back (tracksROF .getBCData (), tracksROF .getBCData () + nBCPerTF - 1 ).info = tracks.size ();
293298 }
294299 allTrackLabels.reserve (mTimeFrame ->getTracksLabel (iROF).size ()); // should be 0 if not MC
295300 std::copy (mTimeFrame ->getTracksLabel (iROF).begin (), mTimeFrame ->getTracksLabel (iROF).end (), std::back_inserter (allTrackLabels));
0 commit comments