Project
Loading...
Searching...
No Matches
TrackingInterface.cxx
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
14
17
19#include <oneapi/tbb/task_arena.h>
20#include <memory>
21
30
31using namespace o2::framework;
32using namespace o2::its;
33
35{
36 mRunVertexer = true;
37 mCosmicsProcessing = false;
38 std::vector<VertexingParameters> vertParams;
39 std::vector<TrackingParameters> trackParams;
40 const auto& vertConf = o2::its::VertexerParamConfig::Instance();
41 const auto& trackConf = o2::its::TrackerParamConfig::Instance();
42 float bFactor = std::abs(o2::base::Propagator::Instance()->getNominalBz()) / 5.0066791;
43 float bFactorTracklets = bFactor < 0.01 ? 1. : bFactor; // for tracklets only
44 if (mMode == TrackingMode::Unset) {
45 mMode = (TrackingMode)(trackConf.trackingMode);
46 LOGP(info, "Tracking mode not set, trying to fetch it from configurable params to: {}", asString(mMode));
47 }
48 if (mMode == TrackingMode::Async) {
49 trackParams.resize(trackConf.doUPCIteration ? 4 : 3);
50 vertParams.resize(2); // The number of actual iterations will be set as a configKeyVal to allow for pp/PbPb choice
51 trackParams[1].TrackletMinPt = 0.2f;
52 trackParams[1].CellDeltaTanLambdaSigma *= 2.;
53 trackParams[2].TrackletMinPt = 0.1f;
54 trackParams[2].CellDeltaTanLambdaSigma *= 4.;
55
56 trackParams[0].MinPt[0] = 1.f / 12; // 7cl
57
58 trackParams[1].MinPt[0] = 1.f / 12; // 7cl
59
60 trackParams[2].MinTrackLength = 4;
61 trackParams[2].MinPt[0] = 1.f / 12; // 7cl
62 trackParams[2].MinPt[1] = 1.f / 5; // 6cl
63 trackParams[2].MinPt[2] = 1.f / 1; // 5cl
64 trackParams[2].MinPt[3] = 1.f / 6; // 4cl
65
66 trackParams[2].StartLayerMask = (1 << 6) + (1 << 3);
68 trackParams[3].MinTrackLength = 4;
69 trackParams[3].TrackletMinPt = 0.1f;
70 trackParams[3].CellDeltaTanLambdaSigma *= 4.;
71 trackParams[3].DeltaROF = 0; // UPC specific setting
72 }
73 for (size_t ip = 0; ip < trackParams.size(); ip++) {
74 auto& param = trackParams[ip];
75 param.ZBins = 64;
76 param.PhiBins = 32;
77 param.CellsPerClusterLimit = 1.e3f;
78 param.TrackletsPerClusterLimit = 1.e3f;
79 // check if something was overridden via configurable params
80 if (ip < trackConf.MaxIter) {
81 if (trackConf.startLayerMask[ip] > 0) {
82 trackParams[2].StartLayerMask = trackConf.startLayerMask[ip];
83 }
84 if (trackConf.minTrackLgtIter[ip] > 0) {
85 param.MinTrackLength = trackConf.minTrackLgtIter[ip];
86 }
87 for (int ilg = trackConf.MaxTrackLength; ilg >= trackConf.MinTrackLength; ilg--) {
88 int lslot0 = (trackConf.MaxTrackLength - ilg), lslot = lslot0 + ip * (trackConf.MaxTrackLength - trackConf.MinTrackLength + 1);
89 if (trackConf.minPtIterLgt[lslot] > 0.) {
90 param.MinPt[lslot0] = trackConf.minPtIterLgt[lslot];
91 }
92 }
93 }
94 }
95 LOGP(info, "Initializing tracker in async. phase reconstruction with {} passes for tracking and {}/{} for vertexing", trackParams.size(), o2::its::VertexerParamConfig::Instance().nIterations, vertParams.size());
96 vertParams[1].phiCut = 0.015f;
97 vertParams[1].tanLambdaCut = 0.015f;
98 vertParams[1].vertPerRofThreshold = 0;
99 vertParams[1].deltaRof = 0;
100 } else if (mMode == TrackingMode::Sync) {
101 trackParams.resize(1);
102 trackParams[0].ZBins = 64;
103 trackParams[0].PhiBins = 32;
104 trackParams[0].MinTrackLength = 4;
105 LOGP(info, "Initializing tracker in sync. phase reconstruction with {} passes", trackParams.size());
106 vertParams.resize(1);
107 } else if (mMode == TrackingMode::Cosmics) {
108 mCosmicsProcessing = true;
109 mRunVertexer = false;
110 trackParams.resize(1);
111 trackParams[0].MinTrackLength = 4;
112 trackParams[0].CellDeltaTanLambdaSigma *= 10;
113 trackParams[0].PhiBins = 4;
114 trackParams[0].ZBins = 16;
115 trackParams[0].PVres = 1.e5f;
116 trackParams[0].MaxChi2ClusterAttachment = 60.;
117 trackParams[0].MaxChi2NDF = 40.;
118 trackParams[0].TrackletsPerClusterLimit = 100.;
119 trackParams[0].CellsPerClusterLimit = 100.;
120 LOGP(info, "Initializing tracker in reconstruction for cosmics with {} passes", trackParams.size());
121
122 } else {
123 throw std::runtime_error(fmt::format("Unsupported ITS tracking mode {:s} ", asString(mMode)));
124 }
125
126 // TODO this imposes the same memory limits on each iteration
127 for (auto& p : vertParams) {
128 p.PrintMemory = vertConf.printMemory;
129 p.MaxMemory = vertConf.maxMemory;
130 p.DropTFUponFailure = vertConf.dropTFUponFailure;
131 }
132 for (auto& p : trackParams) {
133 p.PrintMemory = trackConf.printMemory;
134 p.MaxMemory = trackConf.maxMemory;
135 p.DropTFUponFailure = trackConf.dropTFUponFailure;
136 }
137
138 for (auto& params : trackParams) {
140 }
141 // adjust pT settings to actual mag. field
142 for (size_t ip = 0; ip < trackParams.size(); ip++) {
143 auto& param = trackParams[ip];
144 param.TrackletMinPt *= bFactorTracklets;
145 for (int ilg = trackConf.MaxTrackLength; ilg >= trackConf.MinTrackLength; ilg--) {
146 int lslot = trackConf.MaxTrackLength - ilg;
147 param.MinPt[lslot] *= bFactor;
148 }
149 }
150 mTracker->setParameters(trackParams);
151 mVertexer->setParameters(vertParams);
152 if (trackConf.nThreads == vertConf.nThreads) {
153 bool clamped{false};
154 int nThreads = trackConf.nThreads;
155 if (nThreads > 0) {
156 const int hw = std::thread::hardware_concurrency();
157 const int maxThreads = (hw == 0 ? 1 : hw);
158 nThreads = std::clamp(nThreads, 1, maxThreads);
159 clamped = trackConf.nThreads > maxThreads;
160 }
161 LOGP(info, "Tracker and Vertexer will share the task arena with {} thread(s){}", nThreads, (clamped) ? " (clamped)" : "");
162 mTaskArena = std::make_shared<tbb::task_arena>(std::abs(nThreads));
163 }
164 mVertexer->setNThreads(vertConf.nThreads, mTaskArena);
165 mTracker->setNThreads(trackConf.nThreads, mTaskArena);
166}
167
169{
170 auto compClusters = pc.inputs().get<gsl::span<o2::itsmft::CompClusterExt>>("compClusters");
171 gsl::span<const unsigned char> patterns = pc.inputs().get<gsl::span<unsigned char>>("patterns");
172 gsl::span<const o2::itsmft::PhysTrigger> physTriggers;
173 std::vector<o2::itsmft::PhysTrigger> fromTRD;
174 if (mUseTriggers == 2) { // use TRD triggers
176 auto trdTriggers = pc.inputs().get<gsl::span<o2::trd::TriggerRecord>>("phystrig");
177 for (const auto& trig : trdTriggers) {
178 if (trig.getBCData() >= ir && trig.getNumberOfTracklets()) {
179 ir = trig.getBCData();
180 fromTRD.emplace_back(o2::itsmft::PhysTrigger{ir, 0});
181 }
182 }
183 physTriggers = gsl::span<const o2::itsmft::PhysTrigger>(fromTRD.data(), fromTRD.size());
184 } else if (mUseTriggers == 1) { // use Phys triggers from ITS stream
185 physTriggers = pc.inputs().get<gsl::span<o2::itsmft::PhysTrigger>>("phystrig");
186 }
187
188 auto rofsinput = pc.inputs().get<gsl::span<o2::itsmft::ROFRecord>>("ROframes");
189 auto& trackROFvec = pc.outputs().make<std::vector<o2::itsmft::ROFRecord>>(Output{"ITS", "ITSTrackROF", 0}, rofsinput.begin(), rofsinput.end());
190 auto& irFrames = pc.outputs().make<std::vector<o2::dataformats::IRFrame>>(Output{"ITS", "IRFRAMES", 0});
191 const auto& alpParams = o2::itsmft::DPLAlpideParam<o2::detectors::DetID::ITS>::Instance(); // RS: this should come from CCDB
192
193 irFrames.reserve(trackROFvec.size());
194 int nBCPerTF = alpParams.roFrameLengthInBC;
195
196 LOGP(info, "ITSTracker pulled {} clusters, {} RO frames", compClusters.size(), trackROFvec.size());
197 const dataformats::MCTruthContainer<MCCompLabel>* labels = nullptr;
198 gsl::span<itsmft::MC2ROFRecord const> mc2rofs;
199 if (mIsMC) {
200 labels = pc.inputs().get<const dataformats::MCTruthContainer<MCCompLabel>*>("itsmclabels").release();
201 // get the array as read-only span, a snapshot is sent forward
202 pc.outputs().snapshot(Output{"ITS", "ITSTrackMC2ROF", 0}, pc.inputs().get<gsl::span<itsmft::MC2ROFRecord>>("ITSMC2ROframes"));
203 LOG(info) << labels->getIndexedSize() << " MC label objects , in " << mc2rofs.size() << " MC events";
204 }
205
206 auto& allClusIdx = pc.outputs().make<std::vector<int>>(Output{"ITS", "TRACKCLSID", 0});
207 auto& allTracks = pc.outputs().make<std::vector<o2::its::TrackITS>>(Output{"ITS", "TRACKS", 0});
208 auto& vertROFvec = pc.outputs().make<std::vector<o2::itsmft::ROFRecord>>(Output{"ITS", "VERTICESROF", 0});
209 auto& vertices = pc.outputs().make<std::vector<Vertex>>(Output{"ITS", "VERTICES", 0});
210
211 // MC
212 static pmr::vector<o2::MCCompLabel> dummyMCLabTracks, dummyMCLabVerts;
213 static pmr::vector<float> dummyMCPurVerts;
214 auto& allTrackLabels = mIsMC ? pc.outputs().make<std::vector<o2::MCCompLabel>>(Output{"ITS", "TRACKSMCTR", 0}) : dummyMCLabTracks;
215 auto& allVerticesLabels = mIsMC ? pc.outputs().make<std::vector<o2::MCCompLabel>>(Output{"ITS", "VERTICESMCTR", 0}) : dummyMCLabVerts;
216 auto& allVerticesPurities = mIsMC ? pc.outputs().make<std::vector<float>>(Output{"ITS", "VERTICESMCPUR", 0}) : dummyMCPurVerts;
217
218 std::uint32_t roFrame = 0;
219
220 bool continuous = o2::base::GRPGeomHelper::instance().getGRPECS()->isDetContinuousReadOut(o2::detectors::DetID::ITS);
221 LOG(info) << "ITSTracker RO: continuous=" << continuous;
222
223 if (mOverrideBeamEstimation) {
224 mTimeFrame->setBeamPosition(mMeanVertex->getX(),
225 mMeanVertex->getY(),
226 mMeanVertex->getSigmaY2(),
227 mTracker->getParameters()[0].LayerResolution[0],
228 mTracker->getParameters()[0].SystErrorY2[0]);
229 }
230
231 mTracker->setBz(o2::base::Propagator::Instance()->getNominalBz());
232
233 gsl::span<const unsigned char>::iterator pattIt = patterns.begin();
234
235 gsl::span<itsmft::ROFRecord> trackROFspan(trackROFvec);
236 loadROF(trackROFspan, compClusters, pattIt, labels);
237 pattIt = patterns.begin();
238 std::vector<int> savedROF;
239 auto logger = [&](const std::string& s) { LOG(info) << s; };
240 auto fatalLogger = [&](const std::string& s) { LOG(fatal) << s; };
241 auto errorLogger = [&](const std::string& s) { LOG(error) << s; };
242
243 FastMultEst multEst; // mult estimator
244 std::vector<uint8_t> processingMask, processUPCMask;
245 int cutVertexMult{0}, cutUPCVertex{0}, cutRandomMult = int(trackROFvec.size()) - multEst.selectROFs(trackROFvec, compClusters, physTriggers, processingMask);
246 processUPCMask.resize(processingMask.size(), false);
247 mTimeFrame->setMultiplicityCutMask(processingMask);
248 float vertexerElapsedTime{0.f};
249 if (mRunVertexer) {
250 vertROFvec.reserve(trackROFvec.size());
251 // Run seeding vertexer
252 vertexerElapsedTime = mVertexer->clustersToVertices(logger);
253 } else { // cosmics
255 }
256 const auto& multEstConf = FastMultEstConfig::Instance(); // parameters for mult estimation and cuts
257 gsl::span<const std::pair<MCCompLabel, float>> vMCRecInfo;
258 for (auto iRof{0}; iRof < trackROFspan.size(); ++iRof) {
259 std::vector<Vertex> vtxVecLoc;
260 auto& vtxROF = vertROFvec.emplace_back(trackROFspan[iRof]);
261 vtxROF.setFirstEntry(vertices.size());
262 if (mRunVertexer) {
263 auto vtxSpan = mTimeFrame->getPrimaryVertices(iRof);
264 if (mIsMC) {
265 vMCRecInfo = mTimeFrame->getPrimaryVerticesMCRecInfo(iRof);
266 }
267 if (o2::its::TrackerParamConfig::Instance().doUPCIteration) {
268 if (!vtxSpan.empty()) {
269 if (vtxSpan[0].isFlagSet(Vertex::UPCMode) == 1) { // at least one vertex in this ROF and it is from second vertex iteration
270 LOGP(debug, "ROF {} rejected as vertices are from the UPC iteration", iRof);
271 processUPCMask[iRof] = true;
272 cutUPCVertex++;
273 vtxROF.setFlag(o2::itsmft::ROFRecord::VtxUPCMode);
274 } else { // in all cases except if as standard mode vertex was found, the ROF was processed with UPC settings
275 vtxROF.setFlag(o2::itsmft::ROFRecord::VtxStdMode);
276 }
277 } else {
278 vtxROF.setFlag(o2::itsmft::ROFRecord::VtxUPCMode);
279 }
280 } else {
281 vtxROF.setFlag(o2::itsmft::ROFRecord::VtxStdMode);
282 }
283 vtxROF.setNEntries(vtxSpan.size());
284 bool selROF = vtxSpan.empty();
285 for (auto iV{0}; iV < vtxSpan.size(); ++iV) {
286 auto& v = vtxSpan[iV];
287 if (multEstConf.isVtxMultCutRequested() && !multEstConf.isPassingVtxMultCut(v.getNContributors())) {
288 continue; // skip vertex of unwanted multiplicity
289 }
290 selROF = true;
291 vertices.push_back(v);
292 if (mIsMC) {
293 allVerticesLabels.push_back(vMCRecInfo[iV].first);
294 allVerticesPurities.push_back(vMCRecInfo[iV].second);
295 }
296 }
297 if (processingMask[iRof] && !selROF) { // passed selection in clusters and not in vertex multiplicity
298 LOGP(info, "ROF {} rejected by the vertex multiplicity selection [{},{}]", iRof, multEstConf.cutMultVtxLow, multEstConf.cutMultVtxHigh);
299 processingMask[iRof] = selROF;
300 cutVertexMult++;
301 }
302 } else { // cosmics
303 vtxVecLoc.emplace_back();
304 vtxVecLoc.back().setNContributors(1);
305 vtxROF.setNEntries(vtxVecLoc.size());
306 for (auto& v : vtxVecLoc) {
307 vertices.push_back(v);
308 }
309 mTimeFrame->addPrimaryVertices(vtxVecLoc, iRof, 0);
310 }
311 }
312 if (mRunVertexer) {
313 LOG(info) << fmt::format(" - Vertex seeding total elapsed time: {} ms for {} ({} + {}) vertices found in {}/{} ROFs",
314 vertexerElapsedTime,
318 trackROFspan.size() - mTimeFrame->getNoVertexROF(),
319 trackROFspan.size());
320 LOG(info) << fmt::format(" - FastMultEst: rejected {}/{} ROFs: random/mult.sel:{} (seed {}), vtx.sel:{}", cutRandomMult + cutVertexMult, trackROFspan.size(), cutRandomMult, multEst.lastRandomSeed, cutVertexMult);
321 }
322 if (mOverrideBeamEstimation) {
323 LOG(info) << fmt::format(" - Beam position set to: {}, {} from meanvertex object", mTimeFrame->getBeamX(), mTimeFrame->getBeamY());
324 } else {
325 LOG(info) << fmt::format(" - Beam position computed for the TF: {}, {}", mTimeFrame->getBeamX(), mTimeFrame->getBeamY());
326 }
327 if (mCosmicsProcessing && compClusters.size() > 1500 * trackROFspan.size()) {
328 LOG(error) << "Cosmics processing was requested with an average detector occupancy exceeding 1.e-7, skipping TF processing.";
329 } else {
330
331 mTimeFrame->setMultiplicityCutMask(processingMask);
332 mTimeFrame->setROFMask(processUPCMask);
333 // Run CA tracker
334 if (mMode == o2::its::TrackingMode::Async && o2::its::TrackerParamConfig::Instance().fataliseUponFailure) {
335 mTracker->clustersToTracks(logger, fatalLogger);
336 } else {
337 mTracker->clustersToTracks(logger, errorLogger);
338 }
339 size_t totTracks{mTimeFrame->getNumberOfTracks()}, totClusIDs{mTimeFrame->getNumberOfUsedClusters()};
340 if (totTracks) {
341 allTracks.reserve(totTracks);
342 allClusIdx.reserve(totClusIDs);
343
345 LOG(warning) << fmt::format(" - The processed timeframe had {} clusters with wild z coordinates, check the dictionaries", mTimeFrame->hasBogusClusters());
346 }
347
348 for (unsigned int iROF{0}; iROF < trackROFvec.size(); ++iROF) {
349 auto& tracksROF{trackROFvec[iROF]};
350 auto& vtxROF = vertROFvec[iROF];
351 auto& tracks = mTimeFrame->getTracks(iROF);
352 auto number{tracks.size()};
353 auto first{allTracks.size()};
354 int offset = -tracksROF.getFirstEntry(); // cluster entry!!!
355 tracksROF.setFirstEntry(first);
356 tracksROF.setNEntries(number);
357 tracksROF.setFlags(vtxROF.getFlags()); // copies 0xffffffff if cosmics
358 if (processingMask[iROF]) {
359 irFrames.emplace_back(tracksROF.getBCData(), tracksROF.getBCData() + nBCPerTF - 1).info = tracks.size();
360 }
361 allTrackLabels.reserve(mTimeFrame->getTracksLabel(iROF).size()); // should be 0 if not MC
362 std::copy(mTimeFrame->getTracksLabel(iROF).begin(), mTimeFrame->getTracksLabel(iROF).end(), std::back_inserter(allTrackLabels));
363 // Some conversions that needs to be moved in the tracker internals
364 for (unsigned int iTrk{0}; iTrk < tracks.size(); ++iTrk) {
365 auto& trc{tracks[iTrk]};
366 trc.setFirstClusterEntry(allClusIdx.size()); // before adding tracks, create final cluster indices
367 int ncl = trc.getNumberOfClusters(), nclf = 0;
368 for (int ic = TrackITSExt::MaxClusters; ic--;) { // track internally keeps in->out cluster indices, but we want to store the references as out->in!!!
369 auto clid = trc.getClusterIndex(ic);
370 if (clid >= 0) {
371 trc.setClusterSize(ic, mTimeFrame->getClusterSize(clid));
372 allClusIdx.push_back(clid);
373 nclf++;
374 }
375 }
376 assert(ncl == nclf);
377 allTracks.emplace_back(trc);
378 }
379 }
380 }
381 LOGP(info, "ITSTracker pushed {} tracks and {} vertices", allTracks.size(), vertices.size());
382 if (mIsMC) {
383 LOGP(info, "ITSTracker pushed {} track labels", allTrackLabels.size());
384 LOGP(info, "ITSTracker pushed {} vertex labels", allVerticesLabels.size());
385 LOGP(info, "ITSTracker pushed {} vertex purities", allVerticesPurities.size());
386 }
387 }
388}
389
391{
393 static bool initOnceDone = false;
394 if (mOverrideBeamEstimation) {
396 }
397 if (!initOnceDone) { // this params need to be queried only once
398 initOnceDone = true;
399 pc.inputs().get<o2::itsmft::TopologyDictionary*>("itscldict"); // just to trigger the finaliseCCDB
401 if (pc.inputs().getPos("itsTGeo") >= 0) {
402 pc.inputs().get<o2::its::GeometryTGeo*>("itsTGeo");
403 }
406 initialise();
408
409 if (pc.services().get<const o2::framework::DeviceSpec>().inputTimesliceId == 0) { // print settings only for the 1st pipeling
412 const auto& vtxParams = mVertexer->getParameters();
413 for (size_t it = 0; it < vtxParams.size(); it++) {
414 const auto& par = vtxParams[it];
415 LOGP(info, "vtxIter#{} : {}", it, par.asString());
416 }
417 const auto& trParams = mTracker->getParameters();
418 for (size_t it = 0; it < trParams.size(); it++) {
419 const auto& par = trParams[it];
420 LOGP(info, "recoIter#{} : {}", it, par.asString());
421 }
422 }
423 }
424}
425
427{
428 mVertexer->getGlobalConfiguration();
429 mTracker->getGlobalConfiguration();
430}
431
433{
435 return;
436 }
437 if (matcher == ConcreteDataMatcher("ITS", "CLUSDICT", 0)) {
438 LOG(info) << "cluster dictionary updated";
440 return;
441 }
442 // Note: strictly speaking, for Configurable params we don't need finaliseCCDB check, the singletons are updated at the CCDB fetcher level
443 if (matcher == ConcreteDataMatcher("ITS", "ALPIDEPARAM", 0)) {
444 LOG(info) << "Alpide param updated";
446 par.printKeyValues();
447 return;
448 }
449 if (matcher == ConcreteDataMatcher("GLO", "MEANVERTEX", 0)) {
450 LOGP(info, "Mean vertex acquired");
452 return;
453 }
454 if (matcher == ConcreteDataMatcher("ITS", "GEOMTGEO", 0)) {
455 LOG(info) << "ITS GeometryTGeo loaded from ccdb";
457 return;
458 }
459}
460
462{
463 mMemoryPool->print();
464 mTracker->printSummary();
465}
466
471
473 TrackerTraits7* trackerTraits,
474 TimeFrame7* frame)
475{
476 mVertexer = std::make_unique<Vertexer>(vertexerTraits);
477 mTracker = std::make_unique<Tracker>(trackerTraits);
478 mTimeFrame = frame;
479 mVertexer->adoptTimeFrame(*mTimeFrame);
480 mTracker->adoptTimeFrame(*mTimeFrame);
481
482 // set common memory resource
483 if (!mMemoryPool) {
484 mMemoryPool = std::make_shared<BoundedMemoryResource>();
485 }
486 vertexerTraits->setMemoryPool(mMemoryPool);
487 trackerTraits->setMemoryPool(mMemoryPool);
488 mTimeFrame->setMemoryPool(mMemoryPool);
489 mTracker->setMemoryPool(mMemoryPool);
490 mVertexer->setMemoryPool(mMemoryPool);
491}
492
493void ITSTrackingInterface::loadROF(gsl::span<itsmft::ROFRecord>& trackROFspan,
494 gsl::span<const itsmft::CompClusterExt> clusters,
495 gsl::span<const unsigned char>::iterator& pattIt,
497{
498 mTimeFrame->loadROFrameData(trackROFspan, clusters, pattIt, mDict, mcLabels);
499}
Helper for geometry and GRP related CCDB requests.
Class to delimit start and end IR of certain time period.
Definition of the GeometryTGeo class.
Configuration parameters for ITS fast multiplicity estimator.
Fast multiplicity estimator for ITS.
Definition of the ITSMFT ROFrame (trigger) record.
Definition Physics trigger record extracted from the ITS/MFT stream.
std::ostringstream debug
void checkUpdates(o2::framework::ProcessingContext &pc)
static GRPGeomHelper & instance()
GPUd() value_type estimateLTFast(o2 static GPUd() float estimateLTIncrement(const o2 PropagatorImpl * Instance(bool uninitialized=false)
Definition Propagator.h:143
void printKeyValues(bool showProv=true, bool useLogger=false, bool withPadding=true, bool showHash=true) const final
A container to hold and manage MC truth information/labels.
static constexpr ID ITS
Definition DetID.h:63
void snapshot(const Output &spec, T const &object)
decltype(auto) make(const Output &spec, Args... args)
int getPos(const char *name) const
decltype(auto) get(R binding, int part=0) const
DataAllocator & outputs()
The data allocator is used to allocate memory for the output data.
InputRecord & inputs()
The inputs associated with this processing context.
ServiceRegistryRef services()
The services registry associated with this processing context.
static GeometryTGeo * Instance()
void fillMatrixCache(int mask) override
static void adopt(GeometryTGeo *raw, bool canDelete=false)
void run(framework::ProcessingContext &pc)
void setMeanVertex(const o2::dataformats::MeanVertexObject *v)
virtual void loadROF(gsl::span< itsmft::ROFRecord > &trackROFspan, gsl::span< const itsmft::CompClusterExt > clusters, gsl::span< const unsigned char >::iterator &pattIt, const dataformats::MCTruthContainer< MCCompLabel > *mcLabels)
void setClusterDictionary(const o2::itsmft::TopologyDictionary *d)
virtual void updateTimeDependentParams(framework::ProcessingContext &pc)
void getConfiguration(framework::ProcessingContext &pc)
virtual void finaliseCCDB(framework::ConcreteDataMatcher &matcher, void *obj)
void setTraitsFromProvider(VertexerTraits *, TrackerTraits7 *, TimeFrame7 *)
static constexpr int MaxClusters
< heavy version of TrackITS, with clusters embedded
Definition TrackITS.h:169
void setMemoryPool(std::shared_ptr< BoundedMemoryResource > &pool) noexcept
void setMemoryPool(std::shared_ptr< BoundedMemoryResource > &pool)
const GLdouble * v
Definition glcorearb.h:832
GLenum const GLfloat * params
Definition glcorearb.h:272
GLintptr offset
Definition glcorearb.h:660
GLenum GLfloat param
Definition glcorearb.h:271
Defining PrimaryVertex explicitly as messageable.
Definition TFIDInfo.h:20
auto get(const std::byte *buffer, size_t=0)
Definition DataHeader.h:454
std::string asString(TrackingMode mode)
std::vector< T, fair::mq::pmr::polymorphic_allocator< T > > vector
size_t inputTimesliceId
The time pipelining id of this particular device.
Definition DeviceSpec.h:68
uint32_t lastRandomSeed
number of layers actually used
Definition FastMultEst.h:41
int selectROFs(const gsl::span< const o2::itsmft::ROFRecord > rofs, const gsl::span< const o2::itsmft::CompClusterExt > clus, const gsl::span< const o2::itsmft::PhysTrigger > trig, std::vector< uint8_t > &sel)
float getBeamX() const
Definition TimeFrame.h:110
auto & getTracks(int rofId)
Definition TimeFrame.h:172
size_t getNumberOfTracks() const
Definition TimeFrame.h:655
unsigned int & getNoVertexROF()
Definition TimeFrame.h:216
gsl::span< const std::pair< MCCompLabel, float > > getPrimaryVerticesMCRecInfo(const int rofId) const
Definition TimeFrame.h:366
void setMultiplicityCutMask(const std::vector< uint8_t > &cutMask)
Definition TimeFrame.h:225
size_t getNumberOfUsedClusters() const
Definition TimeFrame.h:665
void setBeamPosition(const float x, const float y, const float s2, const float base=50.f, const float systematic=0.f)
Definition TimeFrame.h:104
auto & getTotVertIteration()
Definition TimeFrame.h:97
int getPrimaryVerticesNum(int rofId=-1) const
Definition TimeFrame.h:393
void setROFMask(const std::vector< uint8_t > &rofMask)
Definition TimeFrame.h:226
int loadROFrameData(const o2::itsmft::ROFRecord &rof, gsl::span< const itsmft::Cluster > clusters, const dataformats::MCTruthContainer< MCCompLabel > *mcLabels=nullptr)
gsl::span< const Vertex > getPrimaryVertices(int rofId) const
Definition TimeFrame.h:354
void setMemoryPool(std::shared_ptr< BoundedMemoryResource > &pool)
memory management
auto & getTracksLabel(const int rofId)
Definition TimeFrame.h:173
float getBeamY() const
Definition TimeFrame.h:111
int hasBogusClusters() const
Definition TimeFrame.h:229
int getClusterSize(int clusterId) const
Definition TimeFrame.h:141
void addPrimaryVertices(const bounded_vector< Vertex > &vertices)
Definition TimeFrame.cxx:62
static constexpr int T2L
Definition Cartesian.h:55
static constexpr int T2GRot
Definition Cartesian.h:57
static constexpr int T2G
Definition Cartesian.h:56
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"
o2::InteractionRecord ir(0, 0)
std::vector< Cluster > clusters