76 auto compClusters = pc.
inputs().
get<gsl::span<o2::itsmft::CompClusterExt>>(
"compClusters");
77 gsl::span<const unsigned char> patterns = pc.
inputs().
get<gsl::span<unsigned char>>(
"patterns");
78 gsl::span<const o2::itsmft::PhysTrigger> physTriggers;
79 std::vector<o2::itsmft::PhysTrigger> fromTRD;
80 if (mUseTriggers == 2) {
82 auto trdTriggers = pc.
inputs().
get<gsl::span<o2::trd::TriggerRecord>>(
"phystrig");
83 for (
const auto& trig : trdTriggers) {
84 if (trig.getBCData() >=
ir && trig.getNumberOfTracklets()) {
85 ir = trig.getBCData();
89 physTriggers = gsl::span<const o2::itsmft::PhysTrigger>(fromTRD.data(), fromTRD.size());
90 }
else if (mUseTriggers == 1) {
91 physTriggers = pc.
inputs().
get<gsl::span<o2::itsmft::PhysTrigger>>(
"phystrig");
94 auto rofsinput = pc.
inputs().
get<gsl::span<o2::itsmft::ROFRecord>>(
"ROframes");
95 auto& trackROFvec = pc.
outputs().
make<std::vector<o2::itsmft::ROFRecord>>(
Output{
"ITS",
"ITSTrackROF", 0}, rofsinput.begin(), rofsinput.end());
96 auto& irFrames = pc.
outputs().
make<std::vector<o2::dataformats::IRFrame>>(
Output{
"ITS",
"IRFRAMES", 0});
99 irFrames.reserve(trackROFvec.size());
100 int nBCPerTF = alpParams.roFrameLengthInBC;
102 LOGP(info,
"ITSTracker pulled {} clusters, {} RO frames", compClusters.size(), trackROFvec.size());
104 gsl::span<itsmft::MC2ROFRecord const> mc2rofs;
109 LOG(info) << labels->
getIndexedSize() <<
" MC label objects , in " << mc2rofs.size() <<
" MC events";
112 auto& allClusIdx = pc.
outputs().
make<std::vector<int>>(
Output{
"ITS",
"TRACKCLSID", 0});
113 auto& allTracks = pc.
outputs().
make<std::vector<o2::its::TrackITS>>(
Output{
"ITS",
"TRACKS", 0});
114 auto& vertROFvec = pc.
outputs().
make<std::vector<o2::itsmft::ROFRecord>>(
Output{
"ITS",
"VERTICESROF", 0});
115 auto& vertices = pc.
outputs().
make<std::vector<Vertex>>(
Output{
"ITS",
"VERTICES", 0});
120 auto& allTrackLabels = mIsMC ? pc.
outputs().
make<std::vector<o2::MCCompLabel>>(
Output{
"ITS",
"TRACKSMCTR", 0}) : dummyMCLabTracks;
121 auto& allVerticesLabels = mIsMC ? pc.
outputs().
make<std::vector<o2::MCCompLabel>>(
Output{
"ITS",
"VERTICESMCTR", 0}) : dummyMCLabVerts;
123 auto& allVerticesContLabels = writeContLabels ? pc.
outputs().
make<std::vector<o2::MCCompLabel>>(
Output{
"ITS",
"VERTICESMCTRCONT", 0}) : dummyMCLabVerts;
124 auto& allVerticesPurities = mIsMC ? pc.
outputs().
make<std::vector<float>>(
Output{
"ITS",
"VERTICESMCPUR", 0}) : dummyMCPurVerts;
126 std::uint32_t roFrame = 0;
129 LOG(info) <<
"ITSTracker RO: continuous=" << continuous;
131 if (mOverrideBeamEstimation) {
134 mMeanVertex->getSigmaY2(),
135 mTracker->getParameters()[0].LayerResolution[0],
136 mTracker->getParameters()[0].SystErrorY2[0]);
141 gsl::span<const unsigned char>::iterator pattIt = patterns.begin();
143 gsl::span<itsmft::ROFRecord> trackROFspan(trackROFvec);
144 loadROF(trackROFspan, compClusters, pattIt, labels);
145 pattIt = patterns.begin();
146 std::vector<int> savedROF;
147 auto logger = [&](
const std::string& s) {
LOG(info) << s; };
148 auto fatalLogger = [&](
const std::string& s) {
LOG(fatal) << s; };
149 auto errorLogger = [&](
const std::string& s) {
LOG(error) << s; };
152 std::vector<uint8_t> processingMask, processUPCMask;
153 int cutVertexMult{0}, cutUPCVertex{0}, cutRandomMult =
int(trackROFvec.size()) - multEst.
selectROFs(trackROFvec, compClusters, physTriggers, processingMask);
154 processUPCMask.resize(processingMask.size(),
false);
156 float vertexerElapsedTime{0.f};
158 vertROFvec.reserve(trackROFvec.size());
160 vertexerElapsedTime = mVertexer->clustersToVertices(logger);
165 gsl::span<const std::pair<MCCompLabel, float>> vMCRecInfo;
166 gsl::span<const MCCompLabel> vMCContLabels;
167 for (
auto iRof{0}; iRof < trackROFspan.size(); ++iRof) {
169 auto& vtxROF = vertROFvec.emplace_back(trackROFspan[iRof]);
170 vtxROF.setFirstEntry(vertices.size());
180 if (!vtxSpan.empty()) {
182 LOGP(
debug,
"ROF {} rejected as vertices are from the UPC iteration", iRof);
183 processUPCMask[iRof] =
true;
185 vtxROF.setFlag(o2::itsmft::ROFRecord::VtxUPCMode);
187 vtxROF.setFlag(o2::itsmft::ROFRecord::VtxStdMode);
190 vtxROF.setFlag(o2::itsmft::ROFRecord::VtxUPCMode);
193 vtxROF.setFlag(o2::itsmft::ROFRecord::VtxStdMode);
195 vtxROF.setNEntries(vtxSpan.size());
196 bool selROF = vtxSpan.empty();
197 for (
int iV{0}, iVC{0}; iV < vtxSpan.size(); ++iV) {
198 const auto&
v = vtxSpan[iV];
199 if (multEstConf.isVtxMultCutRequested() && !multEstConf.isPassingVtxMultCut(
v.getNContributors())) {
200 iVC +=
v.getNContributors();
204 vertices.push_back(
v);
206 allVerticesLabels.push_back(vMCRecInfo[iV].
first);
207 allVerticesPurities.push_back(vMCRecInfo[iV].second);
209 allVerticesContLabels.insert(allVerticesContLabels.end(), vMCContLabels.begin() + iVC, vMCContLabels.begin() + iVC +
v.getNContributors());
212 iVC +=
v.getNContributors();
214 if (processingMask[iRof] && !selROF) {
215 LOGP(info,
"ROF {} rejected by the vertex multiplicity selection [{},{}]", iRof, multEstConf.cutMultVtxLow, multEstConf.cutMultVtxHigh);
216 processingMask[iRof] = selROF;
220 vtxVecLoc.emplace_back();
221 vtxVecLoc.back().setNContributors(1);
222 vtxROF.setNEntries(vtxVecLoc.size());
223 for (
auto&
v : vtxVecLoc) {
224 vertices.push_back(
v);
230 LOG(info) << fmt::format(
" - Vertex seeding total elapsed time: {} ms for {} ({} + {}) vertices found in {}/{} ROFs",
236 trackROFspan.size());
237 LOG(info) << fmt::format(
" - FastMultEst: rejected {}/{} ROFs: random/mult.sel:{} (seed {}), vtx.sel:{}", cutRandomMult + cutVertexMult, trackROFspan.size(), cutRandomMult, multEst.
lastRandomSeed, cutVertexMult);
239 if (mOverrideBeamEstimation) {
244 if (mCosmicsProcessing && compClusters.size() > 1500 * trackROFspan.size()) {
245 LOG(error) <<
"Cosmics processing was requested with an average detector occupancy exceeding 1.e-7, skipping TF processing.";
252 mTracker->clustersToTracks(logger, fatalLogger);
254 mTracker->clustersToTracks(logger, errorLogger);
258 allTracks.reserve(totTracks);
259 allClusIdx.reserve(totClusIDs);
262 LOG(warning) << fmt::format(
" - The processed timeframe had {} clusters with wild z coordinates, check the dictionaries",
mTimeFrame->
hasBogusClusters());
265 for (
unsigned int iROF{0}; iROF < trackROFvec.size(); ++iROF) {
266 auto& tracksROF{trackROFvec[iROF]};
267 auto& vtxROF = vertROFvec[iROF];
269 auto number{tracks.size()};
270 auto first{allTracks.size()};
271 int offset = -tracksROF.getFirstEntry();
272 tracksROF.setFirstEntry(
first);
273 tracksROF.setNEntries(number);
274 tracksROF.setFlags(vtxROF.getFlags());
275 if (processingMask[iROF]) {
276 irFrames.emplace_back(tracksROF.getBCData(), tracksROF.getBCData() + nBCPerTF - 1).info = tracks.size();
281 for (
unsigned int iTrk{0}; iTrk < tracks.size(); ++iTrk) {
282 auto& trc{tracks[iTrk]};
283 trc.setFirstClusterEntry(allClusIdx.size());
284 int ncl = trc.getNumberOfClusters(), nclf = 0;
286 auto clid = trc.getClusterIndex(ic);
289 allClusIdx.push_back(clid);
294 allTracks.emplace_back(trc);
298 for (
auto&
r : trackROFvec) {
303 LOGP(info,
"ITSTracker pushed {} tracks and {} vertices", allTracks.size(), vertices.size());
305 LOGP(info,
"ITSTracker pushed {} track labels", allTrackLabels.size());
306 LOGP(info,
"ITSTracker pushed {} vertex labels", allVerticesLabels.size());
307 if (!allVerticesContLabels.empty()) {
308 LOGP(info,
"ITSTracker pushed {} vertex contributor labels", allVerticesContLabels.size());
310 LOGP(info,
"ITSTracker pushed {} vertex purities", allVerticesPurities.size());