36 mCosmicsProcessing =
false;
37 std::vector<VertexingParameters> vertParams;
38 std::vector<TrackingParameters> trackParams;
43 LOGP(info,
"Tracking mode not set, trying to fetch it from configurable params to: {}",
asString(mMode));
46 trackParams.resize(trackConf.doUPCIteration ? 4 : 3);
48 trackParams[1].TrackletMinPt = 0.2f;
49 trackParams[1].CellDeltaTanLambdaSigma *= 2.;
50 trackParams[2].TrackletMinPt = 0.1f;
51 trackParams[2].CellDeltaTanLambdaSigma *= 4.;
53 trackParams[0].MinPt[0] = 1.f / 12;
55 trackParams[1].MinPt[0] = 1.f / 12;
57 trackParams[2].MinTrackLength = 4;
58 trackParams[2].MinPt[0] = 1.f / 12;
59 trackParams[2].MinPt[1] = 1.f / 5;
60 trackParams[2].MinPt[2] = 1.f / 1;
61 trackParams[2].MinPt[3] = 1.f / 6;
63 trackParams[2].StartLayerMask = (1 << 6) + (1 << 3);
65 trackParams[3].MinTrackLength = 4;
66 trackParams[3].TrackletMinPt = 0.1f;
67 trackParams[3].CellDeltaTanLambdaSigma *= 4.;
68 trackParams[3].DeltaROF = 0;
70 for (
size_t ip = 0; ip < trackParams.size(); ip++) {
71 auto&
param = trackParams[ip];
74 param.CellsPerClusterLimit = 1.e3f;
75 param.TrackletsPerClusterLimit = 1.e3f;
77 if (ip < trackConf.MaxIter) {
78 if (trackConf.minTrackLgtIter[ip] > 0) {
79 param.MinTrackLength = trackConf.minTrackLgtIter[ip];
81 for (
int ilg = trackConf.MaxTrackLenght; ilg >= trackConf.MinTrackLenght; ilg--) {
82 int lslot0 = (trackConf.MaxTrackLenght - ilg), lslot = lslot0 + ip * (trackConf.MaxTrackLenght - trackConf.MinTrackLenght + 1);
83 if (trackConf.minPtIterLgt[lslot] > 0.) {
84 param.MinPt[lslot0] = trackConf.minPtIterLgt[lslot];
89 LOGP(info,
"Initializing tracker in async. phase reconstruction with {} passes for tracking and {}/{} for vertexing", trackParams.size(),
o2::its::VertexerParamConfig::Instance().nIterations, vertParams.size());
90 vertParams[1].phiCut = 0.015f;
91 vertParams[1].tanLambdaCut = 0.015f;
92 vertParams[1].vertPerRofThreshold = 0;
93 vertParams[1].deltaRof = 0;
95 trackParams.resize(1);
96 trackParams[0].ZBins = 64;
97 trackParams[0].PhiBins = 32;
98 trackParams[0].MinTrackLength = 4;
99 LOGP(info,
"Initializing tracker in sync. phase reconstruction with {} passes", trackParams.size());
100 vertParams.resize(1);
102 mCosmicsProcessing =
true;
103 mRunVertexer =
false;
104 trackParams.resize(1);
105 trackParams[0].MinTrackLength = 4;
106 trackParams[0].CellDeltaTanLambdaSigma *= 10;
107 trackParams[0].PhiBins = 4;
108 trackParams[0].ZBins = 16;
109 trackParams[0].PVres = 1.e5f;
110 trackParams[0].MaxChi2ClusterAttachment = 60.;
111 trackParams[0].MaxChi2NDF = 40.;
112 trackParams[0].TrackletsPerClusterLimit = 100.;
113 trackParams[0].CellsPerClusterLimit = 100.;
114 LOGP(info,
"Initializing tracker in reconstruction for cosmics with {} passes", trackParams.size());
117 throw std::runtime_error(fmt::format(
"Unsupported ITS tracking mode {:s} ",
asString(mMode)));
120 for (
auto&
params : trackParams) {
125 for (
size_t ip = 0; ip < trackParams.size(); ip++) {
126 auto&
param = trackParams[ip];
127 for (
int ilg = trackConf.MaxTrackLenght; ilg >= trackConf.MinTrackLenght; ilg--) {
128 int lslot = trackConf.MaxTrackLenght - ilg;
129 param.MinPt[lslot] *= bFactor;
130 param.TrackletMinPt *= bFactor;
134 mTracker->setParameters(trackParams);
135 mVertexer->setParameters(vertParams);
141 auto compClusters = pc.
inputs().
get<gsl::span<o2::itsmft::CompClusterExt>>(
"compClusters");
142 gsl::span<const unsigned char> patterns = pc.
inputs().
get<gsl::span<unsigned char>>(
"patterns");
143 gsl::span<const o2::itsmft::PhysTrigger> physTriggers;
144 std::vector<o2::itsmft::PhysTrigger> fromTRD;
145 if (mUseTriggers == 2) {
147 auto trdTriggers = pc.
inputs().
get<gsl::span<o2::trd::TriggerRecord>>(
"phystrig");
148 for (
const auto& trig : trdTriggers) {
149 if (trig.getBCData() >=
ir && trig.getNumberOfTracklets()) {
150 ir = trig.getBCData();
154 physTriggers = gsl::span<const o2::itsmft::PhysTrigger>(fromTRD.data(), fromTRD.size());
155 }
else if (mUseTriggers == 1) {
156 physTriggers = pc.
inputs().
get<gsl::span<o2::itsmft::PhysTrigger>>(
"phystrig");
159 auto rofsinput = pc.
inputs().
get<gsl::span<o2::itsmft::ROFRecord>>(
"ROframes");
160 auto& trackROFvec = pc.
outputs().
make<std::vector<o2::itsmft::ROFRecord>>(
Output{
"ITS",
"ITSTrackROF", 0}, rofsinput.begin(), rofsinput.end());
161 auto& irFrames = pc.
outputs().
make<std::vector<o2::dataformats::IRFrame>>(
Output{
"ITS",
"IRFRAMES", 0});
164 irFrames.reserve(trackROFvec.size());
165 int nBCPerTF = alpParams.roFrameLengthInBC;
167 LOGP(info,
"ITSTracker pulled {} clusters, {} RO frames", compClusters.size(), trackROFvec.size());
169 gsl::span<itsmft::MC2ROFRecord const> mc2rofs;
174 LOG(info) << labels->
getIndexedSize() <<
" MC label objects , in " << mc2rofs.size() <<
" MC events";
177 auto& allClusIdx = pc.
outputs().
make<std::vector<int>>(
Output{
"ITS",
"TRACKCLSID", 0});
178 auto& allTracks = pc.
outputs().
make<std::vector<o2::its::TrackITS>>(
Output{
"ITS",
"TRACKS", 0});
179 auto& vertROFvec = pc.
outputs().
make<std::vector<o2::itsmft::ROFRecord>>(
Output{
"ITS",
"VERTICESROF", 0});
180 auto& vertices = pc.
outputs().
make<std::vector<Vertex>>(
Output{
"ITS",
"VERTICES", 0});
185 auto& allTrackLabels = mIsMC ? pc.
outputs().
make<std::vector<o2::MCCompLabel>>(
Output{
"ITS",
"TRACKSMCTR", 0}) : dummyMCLabTracks;
186 auto& allVerticesLabels = mIsMC ? pc.
outputs().
make<std::vector<o2::MCCompLabel>>(
Output{
"ITS",
"VERTICESMCTR", 0}) : dummyMCLabVerts;
187 auto& allVerticesPurities = mIsMC ? pc.
outputs().
make<std::vector<float>>(
Output{
"ITS",
"VERTICESMCPUR", 0}) : dummyMCPurVerts;
189 std::uint32_t roFrame = 0;
192 LOG(info) <<
"ITSTracker RO: continuous=" << continuous;
194 if (mOverrideBeamEstimation) {
197 mMeanVertex->getSigmaY2(),
198 mTracker->getParameters()[0].LayerResolution[0],
199 mTracker->getParameters()[0].SystErrorY2[0]);
204 gsl::span<const unsigned char>::iterator pattIt = patterns.begin();
206 gsl::span<itsmft::ROFRecord> trackROFspan(trackROFvec);
207 loadROF(trackROFspan, compClusters, pattIt, labels);
208 pattIt = patterns.begin();
209 std::vector<int> savedROF;
210 auto logger = [&](std::string s) {
LOG(info) << s; };
211 auto fatalLogger = [&](std::string s) {
LOG(fatal) << s; };
212 auto errorLogger = [&](std::string s) {
LOG(error) << s; };
215 std::vector<uint8_t> processingMask, processUPCMask;
216 int cutVertexMult{0}, cutUPCVertex{0}, cutRandomMult =
int(trackROFvec.size()) - multEst.
selectROFs(trackROFvec, compClusters, physTriggers, processingMask);
217 processUPCMask.resize(processingMask.size(),
false);
219 float vertexerElapsedTime{0.f};
221 vertROFvec.reserve(trackROFvec.size());
223 if constexpr (isGPU) {
224 vertexerElapsedTime = mVertexer->clustersToVerticesHybrid(logger);
226 vertexerElapsedTime = mVertexer->clustersToVertices(logger);
232 gsl::span<const std::pair<MCCompLabel, float>> vMCRecInfo;
233 for (
auto iRof{0}; iRof < trackROFspan.size(); ++iRof) {
234 std::vector<Vertex> vtxVecLoc;
235 auto& vtxROF = vertROFvec.emplace_back(trackROFspan[iRof]);
236 vtxROF.setFirstEntry(vertices.size());
243 if (vtxSpan.size()) {
245 LOGP(
debug,
"ROF {} rejected as vertices are from the UPC iteration", iRof);
246 processUPCMask[iRof] =
true;
248 vtxROF.setFlag(o2::itsmft::ROFRecord::VtxUPCMode);
250 vtxROF.setFlag(o2::itsmft::ROFRecord::VtxStdMode);
253 vtxROF.setFlag(o2::itsmft::ROFRecord::VtxUPCMode);
256 vtxROF.setFlag(o2::itsmft::ROFRecord::VtxStdMode);
258 vtxROF.setNEntries(vtxSpan.size());
259 bool selROF = vtxSpan.size() == 0;
260 for (
auto iV{0}; iV < vtxSpan.size(); ++iV) {
261 auto&
v = vtxSpan[iV];
262 if (multEstConf.isVtxMultCutRequested() && !multEstConf.isPassingVtxMultCut(
v.getNContributors())) {
266 vertices.push_back(
v);
268 allVerticesLabels.push_back(vMCRecInfo[iV].
first);
269 allVerticesPurities.push_back(vMCRecInfo[iV].second);
272 if (processingMask[iRof] && !selROF) {
273 LOGP(info,
"ROF {} rejected by the vertex multiplicity selection [{},{}]", iRof, multEstConf.cutMultVtxLow, multEstConf.cutMultVtxHigh);
274 processingMask[iRof] = selROF;
278 vtxVecLoc.emplace_back(
Vertex());
279 vtxVecLoc.back().setNContributors(1);
280 vtxROF.setNEntries(vtxVecLoc.size());
281 for (
auto&
v : vtxVecLoc) {
282 vertices.push_back(
v);
288 LOG(info) << fmt::format(
" - Vertex seeding total elapsed time: {} ms for {} ({} + {}) vertices found in {}/{} ROFs",
294 trackROFspan.size());
295 LOG(info) << fmt::format(
"FastMultEst: rejected {}/{} ROFs: random/mult.sel:{} (seed {}), vtx.sel:{}", cutRandomMult + cutVertexMult, trackROFspan.size(), cutRandomMult, multEst.
lastRandomSeed, cutVertexMult);
297 if (mOverrideBeamEstimation) {
302 if (mCosmicsProcessing && compClusters.size() > 1500 * trackROFspan.size()) {
303 LOG(error) <<
"Cosmics processing was requested with an average detector occupancy exceeding 1.e-7, skipping TF processing.";
309 if constexpr (isGPU) {
311 mTracker->clustersToTracksHybrid(logger, fatalLogger);
313 mTracker->clustersToTracksHybrid(logger, errorLogger);
317 mTracker->clustersToTracks(logger, fatalLogger);
319 mTracker->clustersToTracks(logger, errorLogger);
323 allTracks.reserve(totTracks);
324 allClusIdx.reserve(totClusIDs);
327 LOG(warning) << fmt::format(
" - The processed timeframe had {} clusters with wild z coordinates, check the dictionaries",
mTimeFrame->
hasBogusClusters());
330 for (
unsigned int iROF{0}; iROF < trackROFvec.size(); ++iROF) {
331 auto& tracksROF{trackROFvec[iROF]};
332 auto& vtxROF = vertROFvec[iROF];
334 auto number{tracks.size()};
335 auto first{allTracks.size()};
336 int offset = -tracksROF.getFirstEntry();
337 tracksROF.setFirstEntry(
first);
338 tracksROF.setNEntries(number);
339 tracksROF.setFlags(vtxROF.getFlags());
340 if (processingMask[iROF]) {
341 irFrames.emplace_back(tracksROF.getBCData(), tracksROF.getBCData() + nBCPerTF - 1).info = tracks.size();
346 for (
unsigned int iTrk{0}; iTrk < tracks.size(); ++iTrk) {
347 auto& trc{tracks[iTrk]};
348 trc.setFirstClusterEntry(allClusIdx.size());
349 int ncl = trc.getNumberOfClusters(), nclf = 0;
351 auto clid = trc.getClusterIndex(ic);
354 allClusIdx.push_back(clid);
359 allTracks.emplace_back(trc);
362 LOGP(info,
"ITSTracker pushed {} tracks and {} vertices", allTracks.size(), vertices.size());
364 LOGP(info,
"ITSTracker pushed {} track labels", allTrackLabels.size());
365 LOGP(info,
"ITSTracker pushed {} vertex labels", allVerticesLabels.size());
366 LOGP(info,
"ITSTracker pushed {} vertex purities", allVerticesPurities.size());