36 mCosmicsProcessing =
false;
37 std::vector<VertexingParameters> vertParams;
38 std::vector<TrackingParameters> trackParams;
42 float bFactorTracklets = bFactor < 0.01 ? 1. : bFactor;
45 LOGP(info,
"Tracking mode not set, trying to fetch it from configurable params to: {}",
asString(mMode));
48 trackParams.resize(trackConf.doUPCIteration ? 4 : 3);
50 trackParams[1].TrackletMinPt = 0.2f;
51 trackParams[1].CellDeltaTanLambdaSigma *= 2.;
52 trackParams[2].TrackletMinPt = 0.1f;
53 trackParams[2].CellDeltaTanLambdaSigma *= 4.;
55 trackParams[0].MinPt[0] = 1.f / 12;
57 trackParams[1].MinPt[0] = 1.f / 12;
59 trackParams[2].MinTrackLength = 4;
60 trackParams[2].MinPt[0] = 1.f / 12;
61 trackParams[2].MinPt[1] = 1.f / 5;
62 trackParams[2].MinPt[2] = 1.f / 1;
63 trackParams[2].MinPt[3] = 1.f / 6;
65 trackParams[2].StartLayerMask = (1 << 6) + (1 << 3);
67 trackParams[3].MinTrackLength = 4;
68 trackParams[3].TrackletMinPt = 0.1f;
69 trackParams[3].CellDeltaTanLambdaSigma *= 4.;
70 trackParams[3].DeltaROF = 0;
72 for (
size_t ip = 0; ip < trackParams.size(); ip++) {
73 auto&
param = trackParams[ip];
76 param.CellsPerClusterLimit = 1.e3f;
77 param.TrackletsPerClusterLimit = 1.e3f;
79 if (ip < trackConf.MaxIter) {
80 if (trackConf.startLayerMask[ip] > 0) {
81 trackParams[2].StartLayerMask = trackConf.startLayerMask[ip];
83 if (trackConf.minTrackLgtIter[ip] > 0) {
84 param.MinTrackLength = trackConf.minTrackLgtIter[ip];
86 for (
int ilg = trackConf.MaxTrackLength; ilg >= trackConf.MinTrackLength; ilg--) {
87 int lslot0 = (trackConf.MaxTrackLength - ilg), lslot = lslot0 + ip * (trackConf.MaxTrackLength - trackConf.MinTrackLength + 1);
88 if (trackConf.minPtIterLgt[lslot] > 0.) {
89 param.MinPt[lslot0] = trackConf.minPtIterLgt[lslot];
95 vertParams[1].phiCut = 0.015f;
96 vertParams[1].tanLambdaCut = 0.015f;
97 vertParams[1].vertPerRofThreshold = 0;
98 vertParams[1].deltaRof = 0;
100 trackParams.resize(1);
101 trackParams[0].ZBins = 64;
102 trackParams[0].PhiBins = 32;
103 trackParams[0].MinTrackLength = 4;
104 LOGP(info,
"Initializing tracker in sync. phase reconstruction with {} passes", trackParams.size());
105 vertParams.resize(1);
107 mCosmicsProcessing =
true;
108 mRunVertexer =
false;
109 trackParams.resize(1);
110 trackParams[0].MinTrackLength = 4;
111 trackParams[0].CellDeltaTanLambdaSigma *= 10;
112 trackParams[0].PhiBins = 4;
113 trackParams[0].ZBins = 16;
114 trackParams[0].PVres = 1.e5f;
115 trackParams[0].MaxChi2ClusterAttachment = 60.;
116 trackParams[0].MaxChi2NDF = 40.;
117 trackParams[0].TrackletsPerClusterLimit = 100.;
118 trackParams[0].CellsPerClusterLimit = 100.;
119 LOGP(info,
"Initializing tracker in reconstruction for cosmics with {} passes", trackParams.size());
122 throw std::runtime_error(fmt::format(
"Unsupported ITS tracking mode {:s} ",
asString(mMode)));
126 for (
auto& p : vertParams) {
127 p.PrintMemory = vertConf.printMemory;
128 p.MaxMemory = vertConf.maxMemory;
129 p.DropTFUponFailure = vertConf.dropTFUponFailure;
131 for (
auto& p : trackParams) {
132 p.PrintMemory = trackConf.printMemory;
133 p.MaxMemory = trackConf.maxMemory;
134 p.DropTFUponFailure = trackConf.dropTFUponFailure;
137 for (
auto&
params : trackParams) {
141 for (
size_t ip = 0; ip < trackParams.size(); ip++) {
142 auto&
param = trackParams[ip];
143 param.TrackletMinPt *= bFactorTracklets;
144 for (
int ilg = trackConf.MaxTrackLength; ilg >= trackConf.MinTrackLength; ilg--) {
145 int lslot = trackConf.MaxTrackLength - ilg;
146 param.MinPt[lslot] *= bFactor;
149 mTracker->setParameters(trackParams);
150 mVertexer->setParameters(vertParams);
155 auto compClusters = pc.
inputs().
get<gsl::span<o2::itsmft::CompClusterExt>>(
"compClusters");
156 gsl::span<const unsigned char> patterns = pc.
inputs().
get<gsl::span<unsigned char>>(
"patterns");
157 gsl::span<const o2::itsmft::PhysTrigger> physTriggers;
158 std::vector<o2::itsmft::PhysTrigger> fromTRD;
159 if (mUseTriggers == 2) {
161 auto trdTriggers = pc.
inputs().
get<gsl::span<o2::trd::TriggerRecord>>(
"phystrig");
162 for (
const auto& trig : trdTriggers) {
163 if (trig.getBCData() >=
ir && trig.getNumberOfTracklets()) {
164 ir = trig.getBCData();
168 physTriggers = gsl::span<const o2::itsmft::PhysTrigger>(fromTRD.data(), fromTRD.size());
169 }
else if (mUseTriggers == 1) {
170 physTriggers = pc.
inputs().
get<gsl::span<o2::itsmft::PhysTrigger>>(
"phystrig");
173 auto rofsinput = pc.
inputs().
get<gsl::span<o2::itsmft::ROFRecord>>(
"ROframes");
174 auto& trackROFvec = pc.
outputs().
make<std::vector<o2::itsmft::ROFRecord>>(
Output{
"ITS",
"ITSTrackROF", 0}, rofsinput.begin(), rofsinput.end());
175 auto& irFrames = pc.
outputs().
make<std::vector<o2::dataformats::IRFrame>>(
Output{
"ITS",
"IRFRAMES", 0});
178 irFrames.reserve(trackROFvec.size());
179 int nBCPerTF = alpParams.roFrameLengthInBC;
181 LOGP(info,
"ITSTracker pulled {} clusters, {} RO frames", compClusters.size(), trackROFvec.size());
183 gsl::span<itsmft::MC2ROFRecord const> mc2rofs;
188 LOG(info) << labels->
getIndexedSize() <<
" MC label objects , in " << mc2rofs.size() <<
" MC events";
191 auto& allClusIdx = pc.
outputs().
make<std::vector<int>>(
Output{
"ITS",
"TRACKCLSID", 0});
192 auto& allTracks = pc.
outputs().
make<std::vector<o2::its::TrackITS>>(
Output{
"ITS",
"TRACKS", 0});
193 auto& vertROFvec = pc.
outputs().
make<std::vector<o2::itsmft::ROFRecord>>(
Output{
"ITS",
"VERTICESROF", 0});
194 auto& vertices = pc.
outputs().
make<std::vector<Vertex>>(
Output{
"ITS",
"VERTICES", 0});
199 auto& allTrackLabels = mIsMC ? pc.
outputs().
make<std::vector<o2::MCCompLabel>>(
Output{
"ITS",
"TRACKSMCTR", 0}) : dummyMCLabTracks;
200 auto& allVerticesLabels = mIsMC ? pc.
outputs().
make<std::vector<o2::MCCompLabel>>(
Output{
"ITS",
"VERTICESMCTR", 0}) : dummyMCLabVerts;
201 auto& allVerticesPurities = mIsMC ? pc.
outputs().
make<std::vector<float>>(
Output{
"ITS",
"VERTICESMCPUR", 0}) : dummyMCPurVerts;
203 std::uint32_t roFrame = 0;
206 LOG(info) <<
"ITSTracker RO: continuous=" << continuous;
208 if (mOverrideBeamEstimation) {
211 mMeanVertex->getSigmaY2(),
212 mTracker->getParameters()[0].LayerResolution[0],
213 mTracker->getParameters()[0].SystErrorY2[0]);
218 gsl::span<const unsigned char>::iterator pattIt = patterns.begin();
220 gsl::span<itsmft::ROFRecord> trackROFspan(trackROFvec);
221 loadROF(trackROFspan, compClusters, pattIt, labels);
222 pattIt = patterns.begin();
223 std::vector<int> savedROF;
224 auto logger = [&](
const std::string& s) {
LOG(info) << s; };
225 auto fatalLogger = [&](
const std::string& s) {
LOG(fatal) << s; };
226 auto errorLogger = [&](
const std::string& s) {
LOG(error) << s; };
229 std::vector<uint8_t> processingMask, processUPCMask;
230 int cutVertexMult{0}, cutUPCVertex{0}, cutRandomMult =
int(trackROFvec.size()) - multEst.
selectROFs(trackROFvec, compClusters, physTriggers, processingMask);
231 processUPCMask.resize(processingMask.size(),
false);
233 float vertexerElapsedTime{0.f};
235 vertROFvec.reserve(trackROFvec.size());
237 vertexerElapsedTime = mVertexer->clustersToVertices(logger);
242 gsl::span<const std::pair<MCCompLabel, float>> vMCRecInfo;
243 for (
auto iRof{0}; iRof < trackROFspan.size(); ++iRof) {
244 std::vector<Vertex> vtxVecLoc;
245 auto& vtxROF = vertROFvec.emplace_back(trackROFspan[iRof]);
246 vtxROF.setFirstEntry(vertices.size());
253 if (!vtxSpan.empty()) {
255 LOGP(
debug,
"ROF {} rejected as vertices are from the UPC iteration", iRof);
256 processUPCMask[iRof] =
true;
258 vtxROF.setFlag(o2::itsmft::ROFRecord::VtxUPCMode);
260 vtxROF.setFlag(o2::itsmft::ROFRecord::VtxStdMode);
263 vtxROF.setFlag(o2::itsmft::ROFRecord::VtxUPCMode);
266 vtxROF.setFlag(o2::itsmft::ROFRecord::VtxStdMode);
268 vtxROF.setNEntries(vtxSpan.size());
269 bool selROF = vtxSpan.empty();
270 for (
auto iV{0}; iV < vtxSpan.size(); ++iV) {
271 auto&
v = vtxSpan[iV];
272 if (multEstConf.isVtxMultCutRequested() && !multEstConf.isPassingVtxMultCut(
v.getNContributors())) {
276 vertices.push_back(
v);
278 allVerticesLabels.push_back(vMCRecInfo[iV].
first);
279 allVerticesPurities.push_back(vMCRecInfo[iV].second);
282 if (processingMask[iRof] && !selROF) {
283 LOGP(info,
"ROF {} rejected by the vertex multiplicity selection [{},{}]", iRof, multEstConf.cutMultVtxLow, multEstConf.cutMultVtxHigh);
284 processingMask[iRof] = selROF;
288 vtxVecLoc.emplace_back();
289 vtxVecLoc.back().setNContributors(1);
290 vtxROF.setNEntries(vtxVecLoc.size());
291 for (
auto&
v : vtxVecLoc) {
292 vertices.push_back(
v);
298 LOG(info) << fmt::format(
" - Vertex seeding total elapsed time: {} ms for {} ({} + {}) vertices found in {}/{} ROFs",
304 trackROFspan.size());
305 LOG(info) << fmt::format(
" - FastMultEst: rejected {}/{} ROFs: random/mult.sel:{} (seed {}), vtx.sel:{}", cutRandomMult + cutVertexMult, trackROFspan.size(), cutRandomMult, multEst.
lastRandomSeed, cutVertexMult);
307 if (mOverrideBeamEstimation) {
312 if (mCosmicsProcessing && compClusters.size() > 1500 * trackROFspan.size()) {
313 LOG(error) <<
"Cosmics processing was requested with an average detector occupancy exceeding 1.e-7, skipping TF processing.";
320 mTracker->clustersToTracks(logger, fatalLogger);
322 mTracker->clustersToTracks(logger, errorLogger);
325 allTracks.reserve(totTracks);
326 allClusIdx.reserve(totClusIDs);
329 LOG(warning) << fmt::format(
" - The processed timeframe had {} clusters with wild z coordinates, check the dictionaries",
mTimeFrame->
hasBogusClusters());
332 for (
unsigned int iROF{0}; iROF < trackROFvec.size(); ++iROF) {
333 auto& tracksROF{trackROFvec[iROF]};
334 auto& vtxROF = vertROFvec[iROF];
336 auto number{tracks.size()};
337 auto first{allTracks.size()};
338 int offset = -tracksROF.getFirstEntry();
339 tracksROF.setFirstEntry(
first);
340 tracksROF.setNEntries(number);
341 tracksROF.setFlags(vtxROF.getFlags());
342 if (processingMask[iROF]) {
343 irFrames.emplace_back(tracksROF.getBCData(), tracksROF.getBCData() + nBCPerTF - 1).info = tracks.size();
348 for (
unsigned int iTrk{0}; iTrk < tracks.size(); ++iTrk) {
349 auto& trc{tracks[iTrk]};
350 trc.setFirstClusterEntry(allClusIdx.size());
351 int ncl = trc.getNumberOfClusters(), nclf = 0;
353 auto clid = trc.getClusterIndex(ic);
356 allClusIdx.push_back(clid);
361 allTracks.emplace_back(trc);
364 LOGP(info,
"ITSTracker pushed {} tracks and {} vertices", allTracks.size(), vertices.size());
366 LOGP(info,
"ITSTracker pushed {} track labels", allTrackLabels.size());
367 LOGP(info,
"ITSTracker pushed {} vertex labels", allVerticesLabels.size());
368 LOGP(info,
"ITSTracker pushed {} vertex purities", allVerticesPurities.size());