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
27
28namespace o2
29{
30using namespace framework;
31namespace its
32{
34{
35 mRunVertexer = true;
36 mCosmicsProcessing = false;
37 std::vector<VertexingParameters> vertParams;
38 std::vector<TrackingParameters> trackParams;
39 const auto& trackConf = o2::its::TrackerParamConfig::Instance();
40 float bFactor = std::abs(o2::base::Propagator::Instance()->getNominalBz()) / 5.0066791;
41 if (mMode == TrackingMode::Unset) {
42 mMode = (TrackingMode)(trackConf.trackingMode);
43 LOGP(info, "Tracking mode not set, trying to fetch it from configurable params to: {}", asString(mMode));
44 }
45 if (mMode == TrackingMode::Async) {
46 trackParams.resize(trackConf.doUPCIteration ? 4 : 3);
47 vertParams.resize(2); // The number of actual iterations will be set as a configKeyVal to allow for pp/PbPb choice
48 trackParams[1].TrackletMinPt = 0.2f;
49 trackParams[1].CellDeltaTanLambdaSigma *= 2.;
50 trackParams[2].TrackletMinPt = 0.1f;
51 trackParams[2].CellDeltaTanLambdaSigma *= 4.;
52
53 trackParams[0].MinPt[0] = 1.f / 12; // 7cl
54
55 trackParams[1].MinPt[0] = 1.f / 12; // 7cl
56
57 trackParams[2].MinTrackLength = 4;
58 trackParams[2].MinPt[0] = 1.f / 12; // 7cl
59 trackParams[2].MinPt[1] = 1.f / 5; // 6cl
60 trackParams[2].MinPt[2] = 1.f / 1; // 5cl
61 trackParams[2].MinPt[3] = 1.f / 6; // 4cl
62
63 trackParams[2].StartLayerMask = (1 << 6) + (1 << 3);
64 if (o2::its::TrackerParamConfig::Instance().doUPCIteration) {
65 trackParams[3].MinTrackLength = 4;
66 trackParams[3].TrackletMinPt = 0.1f;
67 trackParams[3].CellDeltaTanLambdaSigma *= 4.;
68 trackParams[3].DeltaROF = 0; // UPC specific setting
69 }
70 for (size_t ip = 0; ip < trackParams.size(); ip++) {
71 auto& param = trackParams[ip];
72 param.ZBins = 64;
73 param.PhiBins = 32;
74 param.CellsPerClusterLimit = 1.e3f;
75 param.TrackletsPerClusterLimit = 1.e3f;
76 // check if something was overridden via configurable params
77 if (ip < trackConf.MaxIter) {
78 if (trackConf.minTrackLgtIter[ip] > 0) {
79 param.MinTrackLength = trackConf.minTrackLgtIter[ip];
80 }
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];
85 }
86 }
87 }
88 }
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;
94 } else if (mMode == TrackingMode::Sync) {
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);
101 } else if (mMode == TrackingMode::Cosmics) {
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());
115
116 } else {
117 throw std::runtime_error(fmt::format("Unsupported ITS tracking mode {:s} ", asString(mMode)));
118 }
119
120 for (auto& params : trackParams) {
122 }
123
124 // adjust pT settings to actual mag. field
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;
131 }
132 }
133
134 mTracker->setParameters(trackParams);
135 mVertexer->setParameters(vertParams);
136}
137
138template <bool isGPU>
140{
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) { // use TRD triggers
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();
151 fromTRD.emplace_back(o2::itsmft::PhysTrigger{ir, 0});
152 }
153 }
154 physTriggers = gsl::span<const o2::itsmft::PhysTrigger>(fromTRD.data(), fromTRD.size());
155 } else if (mUseTriggers == 1) { // use Phys triggers from ITS stream
156 physTriggers = pc.inputs().get<gsl::span<o2::itsmft::PhysTrigger>>("phystrig");
157 }
158
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});
162 const auto& alpParams = o2::itsmft::DPLAlpideParam<o2::detectors::DetID::ITS>::Instance(); // RS: this should come from CCDB
163
164 irFrames.reserve(trackROFvec.size());
165 int nBCPerTF = alpParams.roFrameLengthInBC;
166
167 LOGP(info, "ITSTracker pulled {} clusters, {} RO frames", compClusters.size(), trackROFvec.size());
168 const dataformats::MCTruthContainer<MCCompLabel>* labels = nullptr;
169 gsl::span<itsmft::MC2ROFRecord const> mc2rofs;
170 if (mIsMC) {
171 labels = pc.inputs().get<const dataformats::MCTruthContainer<MCCompLabel>*>("itsmclabels").release();
172 // get the array as read-only span, a snapshot is sent forward
173 pc.outputs().snapshot(Output{"ITS", "ITSTrackMC2ROF", 0}, pc.inputs().get<gsl::span<itsmft::MC2ROFRecord>>("ITSMC2ROframes"));
174 LOG(info) << labels->getIndexedSize() << " MC label objects , in " << mc2rofs.size() << " MC events";
175 }
176
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});
181
182 // MC
183 static pmr::vector<o2::MCCompLabel> dummyMCLabTracks, dummyMCLabVerts;
184 static pmr::vector<float> dummyMCPurVerts;
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;
188
189 std::uint32_t roFrame = 0;
190
191 bool continuous = o2::base::GRPGeomHelper::instance().getGRPECS()->isDetContinuousReadOut(o2::detectors::DetID::ITS);
192 LOG(info) << "ITSTracker RO: continuous=" << continuous;
193
194 if (mOverrideBeamEstimation) {
195 mTimeFrame->setBeamPosition(mMeanVertex->getX(),
196 mMeanVertex->getY(),
197 mMeanVertex->getSigmaY2(),
198 mTracker->getParameters()[0].LayerResolution[0],
199 mTracker->getParameters()[0].SystErrorY2[0]);
200 }
201
202 mTracker->setBz(o2::base::Propagator::Instance()->getNominalBz());
203
204 gsl::span<const unsigned char>::iterator pattIt = patterns.begin();
205
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; };
213
214 FastMultEst multEst; // mult estimator
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);
218 mTimeFrame->setMultiplicityCutMask(processingMask);
219 float vertexerElapsedTime{0.f};
220 if (mRunVertexer) {
221 vertROFvec.reserve(trackROFvec.size());
222 // Run seeding vertexer
223 if constexpr (isGPU) {
224 vertexerElapsedTime = mVertexer->clustersToVerticesHybrid(logger);
225 } else {
226 vertexerElapsedTime = mVertexer->clustersToVertices(logger);
227 }
228 } else { // cosmics
230 }
231 const auto& multEstConf = FastMultEstConfig::Instance(); // parameters for mult estimation and cuts
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());
237 if (mRunVertexer) {
238 auto vtxSpan = mTimeFrame->getPrimaryVertices(iRof);
239 if (mIsMC) {
240 vMCRecInfo = mTimeFrame->getPrimaryVerticesMCRecInfo(iRof);
241 }
242 if (o2::its::TrackerParamConfig::Instance().doUPCIteration) {
243 if (vtxSpan.size()) {
244 if (vtxSpan[0].isFlagSet(Vertex::UPCMode) == 1) { // at least one vertex in this ROF and it is from second vertex iteration
245 LOGP(debug, "ROF {} rejected as vertices are from the UPC iteration", iRof);
246 processUPCMask[iRof] = true;
247 cutUPCVertex++;
248 vtxROF.setFlag(o2::itsmft::ROFRecord::VtxUPCMode);
249 } else { // in all cases except if as standard mode vertex was found, the ROF was processed with UPC settings
250 vtxROF.setFlag(o2::itsmft::ROFRecord::VtxStdMode);
251 }
252 } else {
253 vtxROF.setFlag(o2::itsmft::ROFRecord::VtxUPCMode);
254 }
255 } else {
256 vtxROF.setFlag(o2::itsmft::ROFRecord::VtxStdMode);
257 }
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())) {
263 continue; // skip vertex of unwanted multiplicity
264 }
265 selROF = true;
266 vertices.push_back(v);
267 if (mIsMC) {
268 allVerticesLabels.push_back(vMCRecInfo[iV].first);
269 allVerticesPurities.push_back(vMCRecInfo[iV].second);
270 }
271 }
272 if (processingMask[iRof] && !selROF) { // passed selection in clusters and not in vertex multiplicity
273 LOGP(info, "ROF {} rejected by the vertex multiplicity selection [{},{}]", iRof, multEstConf.cutMultVtxLow, multEstConf.cutMultVtxHigh);
274 processingMask[iRof] = selROF;
275 cutVertexMult++;
276 }
277 } else { // cosmics
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);
283 }
284 mTimeFrame->addPrimaryVertices(vtxVecLoc, iRof, 0);
285 }
286 }
287 if (mRunVertexer) {
288 LOG(info) << fmt::format(" - Vertex seeding total elapsed time: {} ms for {} ({} + {}) vertices found in {}/{} ROFs",
289 vertexerElapsedTime,
293 trackROFspan.size() - mTimeFrame->getNoVertexROF(),
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);
296 }
297 if (mOverrideBeamEstimation) {
298 LOG(info) << fmt::format(" - Beam position set to: {}, {} from meanvertex object", mTimeFrame->getBeamX(), mTimeFrame->getBeamY());
299 } else {
300 LOG(info) << fmt::format(" - Beam position computed for the TF: {}, {}", mTimeFrame->getBeamX(), mTimeFrame->getBeamY());
301 }
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.";
304 } else {
305
306 mTimeFrame->setMultiplicityCutMask(processingMask);
307 mTimeFrame->setROFMask(processUPCMask);
308 // Run CA tracker
309 if constexpr (isGPU) {
310 if (mMode == o2::its::TrackingMode::Async && o2::its::TrackerParamConfig::Instance().fataliseUponFailure) {
311 mTracker->clustersToTracksHybrid(logger, fatalLogger);
312 } else {
313 mTracker->clustersToTracksHybrid(logger, errorLogger);
314 }
315 } else {
316 if (mMode == o2::its::TrackingMode::Async && o2::its::TrackerParamConfig::Instance().fataliseUponFailure) {
317 mTracker->clustersToTracks(logger, fatalLogger);
318 } else {
319 mTracker->clustersToTracks(logger, errorLogger);
320 }
321 }
322 size_t totTracks{mTimeFrame->getNumberOfTracks()}, totClusIDs{mTimeFrame->getNumberOfUsedClusters()};
323 allTracks.reserve(totTracks);
324 allClusIdx.reserve(totClusIDs);
325
327 LOG(warning) << fmt::format(" - The processed timeframe had {} clusters with wild z coordinates, check the dictionaries", mTimeFrame->hasBogusClusters());
328 }
329
330 for (unsigned int iROF{0}; iROF < trackROFvec.size(); ++iROF) {
331 auto& tracksROF{trackROFvec[iROF]};
332 auto& vtxROF = vertROFvec[iROF];
333 auto& tracks = mTimeFrame->getTracks(iROF);
334 auto number{tracks.size()};
335 auto first{allTracks.size()};
336 int offset = -tracksROF.getFirstEntry(); // cluster entry!!!
337 tracksROF.setFirstEntry(first);
338 tracksROF.setNEntries(number);
339 tracksROF.setFlags(vtxROF.getFlags()); // copies 0xffffffff if cosmics
340 if (processingMask[iROF]) {
341 irFrames.emplace_back(tracksROF.getBCData(), tracksROF.getBCData() + nBCPerTF - 1).info = tracks.size();
342 }
343 allTrackLabels.reserve(mTimeFrame->getTracksLabel(iROF).size()); // should be 0 if not MC
344 std::copy(mTimeFrame->getTracksLabel(iROF).begin(), mTimeFrame->getTracksLabel(iROF).end(), std::back_inserter(allTrackLabels));
345 // Some conversions that needs to be moved in the tracker internals
346 for (unsigned int iTrk{0}; iTrk < tracks.size(); ++iTrk) {
347 auto& trc{tracks[iTrk]};
348 trc.setFirstClusterEntry(allClusIdx.size()); // before adding tracks, create final cluster indices
349 int ncl = trc.getNumberOfClusters(), nclf = 0;
350 for (int ic = TrackITSExt::MaxClusters; ic--;) { // track internally keeps in->out cluster indices, but we want to store the references as out->in!!!
351 auto clid = trc.getClusterIndex(ic);
352 if (clid >= 0) {
353 trc.setClusterSize(ic, mTimeFrame->getClusterSize(clid));
354 allClusIdx.push_back(clid);
355 nclf++;
356 }
357 }
358 assert(ncl == nclf);
359 allTracks.emplace_back(trc);
360 }
361 }
362 LOGP(info, "ITSTracker pushed {} tracks and {} vertices", allTracks.size(), vertices.size());
363 if (mIsMC) {
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());
367 }
368 }
369}
370
372{
374 static bool initOnceDone = false;
375 if (!initOnceDone) { // this params need to be queried only once
376 initOnceDone = true;
377 pc.inputs().get<o2::itsmft::TopologyDictionary*>("itscldict"); // just to trigger the finaliseCCDB
379 if (pc.inputs().getPos("itsTGeo") >= 0) {
380 pc.inputs().get<o2::its::GeometryTGeo*>("itsTGeo");
381 }
384 initialise();
386 //
387 if (pc.services().get<const o2::framework::DeviceSpec>().inputTimesliceId == 0) { // print settings only for the 1st pipeling
389 o2::its::TrackerParamConfig::Instance().printKeyValues();
390 const auto& trParams = mTracker->getParameters();
391 for (size_t it = 0; it < trParams.size(); it++) {
392 const auto& par = trParams[it];
393 LOGP(info, "recoIter#{} : {}", it, par.asString());
394 }
395 }
396 }
397}
398
400{
401 mVertexer->getGlobalConfiguration();
402 mTracker->getGlobalConfiguration();
403 if (mOverrideBeamEstimation) {
405 }
406}
407
409{
411 return;
412 }
413 if (matcher == ConcreteDataMatcher("ITS", "CLUSDICT", 0)) {
414 LOG(info) << "cluster dictionary updated";
416 return;
417 }
418 // Note: strictly speaking, for Configurable params we don't need finaliseCCDB check, the singletons are updated at the CCDB fetcher level
419 if (matcher == ConcreteDataMatcher("ITS", "ALPIDEPARAM", 0)) {
420 LOG(info) << "Alpide param updated";
422 par.printKeyValues();
423 return;
424 }
425 if (matcher == ConcreteDataMatcher("GLO", "MEANVERTEX", 0)) {
426 LOGP(info, "Mean vertex acquired");
428 return;
429 }
430 if (matcher == ConcreteDataMatcher("ITS", "GEOMTGEO", 0)) {
431 LOG(info) << "ITS GeometryTGeo loaded from ccdb";
433 return;
434 }
435}
436
438 TrackerTraits* trackerTraits,
439 TimeFrame* frame)
440{
441 mVertexer = std::make_unique<Vertexer>(vertexerTraits);
442 mTracker = std::make_unique<Tracker>(trackerTraits);
443 mTimeFrame = frame;
444 mVertexer->adoptTimeFrame(*mTimeFrame);
445 mTracker->adoptTimeFrame(*mTimeFrame);
446}
447
448void ITSTrackingInterface::loadROF(gsl::span<itsmft::ROFRecord>& trackROFspan,
449 gsl::span<const itsmft::CompClusterExt> clusters,
450 gsl::span<const unsigned char>::iterator& pattIt,
452{
453 mTimeFrame->loadROFrameData(trackROFspan, clusters, pattIt, mDict, mcLabels);
454}
455
456template void ITSTrackingInterface::run<true>(framework::ProcessingContext& pc);
457template void ITSTrackingInterface::run<false>(framework::ProcessingContext& pc);
458} // namespace its
459} // namespace o2
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
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)
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)
virtual void finaliseCCDB(framework::ConcreteDataMatcher &matcher, void *obj)
virtual void updateTimeDependentParams(framework::ProcessingContext &pc)
void setTraitsFromProvider(VertexerTraits *, TrackerTraits *, TimeFrame *)
void setMeanVertex(const o2::dataformats::MeanVertexObject *v)
void run(framework::ProcessingContext &pc)
void getConfiguration(framework::ProcessingContext &pc)
void setClusterDictionary(const o2::itsmft::TopologyDictionary *d)
gsl::span< const Vertex > getPrimaryVertices(int rofId) const
Definition TimeFrame.h:355
int hasBogusClusters() const
Definition TimeFrame.h:220
int getClusterSize(int clusterId) const
Definition TimeFrame.h:519
std::vector< MCCompLabel > & getTracksLabel(const int rofId)
Definition TimeFrame.h:170
size_t getNumberOfTracks() const
Definition TimeFrame.h:723
std::vector< TrackITSExt > & getTracks(int rofId)
Definition TimeFrame.h:169
int loadROFrameData(const o2::itsmft::ROFRecord &rof, gsl::span< const itsmft::Cluster > clusters, const dataformats::MCTruthContainer< MCCompLabel > *mcLabels=nullptr)
float getBeamY() const
Definition TimeFrame.h:406
void setMultiplicityCutMask(const std::vector< uint8_t > &cutMask)
Definition TimeFrame.h:216
void setROFMask(const std::vector< uint8_t > &rofMask)
Definition TimeFrame.h:217
void addPrimaryVertices(const std::vector< Vertex > &vertices)
Definition TimeFrame.cxx:77
unsigned int & getNoVertexROF()
Definition TimeFrame.h:207
float getBeamX() const
Definition TimeFrame.h:404
size_t getNumberOfUsedClusters() const
Definition TimeFrame.h:732
std::vector< int > & getTotVertIteration()
Definition TimeFrame.h:93
void setBeamPosition(const float x, const float y, const float s2, const float base=50.f, const float systematic=0.f)
Definition TimeFrame.h:101
gsl::span< const std::pair< MCCompLabel, float > > getPrimaryVerticesMCRecInfo(const int rofId) const
Definition TimeFrame.h:363
int getPrimaryVerticesNum(int rofId=-1) const
Definition TimeFrame.h:384
static constexpr int MaxClusters
< heavy version of TrackITS, with clusters embedded
Definition TrackITS.h:169
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
auto get(const std::byte *buffer, size_t=0)
Definition DataHeader.h:454
std::string asString(TrackingMode mode)
o2::dataformats::Vertex< o2::dataformats::TimeStamp< int > > Vertex
Definition ROframe.h:37
std::vector< T, o2::pmr::polymorphic_allocator< T > > vector
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
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)
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