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
12#include <memory>
13
14#include <oneapi/tbb/task_arena.h>
15
18
21
24
32
33using namespace o2::framework;
34using namespace o2::its;
35
37{
38 // get parameters
39 const auto& trackConf = o2::its::TrackerParamConfig::Instance();
40 const auto& vertConf = o2::its::VertexerParamConfig::Instance();
41 if (auto parmode = (TrackingMode::Type)trackConf.trackingMode; mMode == TrackingMode::Unset || (parmode != TrackingMode::Unset && mMode != parmode)) {
42 LOGP(info, "Tracking mode overwritten by configurable params from {} to {}", TrackingMode::toString(mMode), TrackingMode::toString(parmode));
43 mMode = parmode;
44 }
45 auto trackParams = TrackingMode::getTrackingParameters(mMode);
46 auto vertParams = TrackingMode::getVertexingParameters(mMode);
47 LOGP(info, "Initializing tracker in {} phase reconstruction with {} passes for tracking and {}/{} for vertexing", TrackingMode::toString(mMode), trackParams.size(), o2::its::VertexerParamConfig::Instance().nIterations, vertParams.size());
48 mTracker->setParameters(trackParams);
49 mVertexer->setParameters(vertParams);
50
51 if (mMode == TrackingMode::Cosmics) {
52 mRunVertexer = false;
53 mCosmicsProcessing = true;
54 LOGP(info, "Cosmic mode enabled, will skip vertexing");
55 }
56
57 // threading
58 if (trackConf.nThreads == vertConf.nThreads) {
59 bool clamped{false};
60 int nThreads = trackConf.nThreads;
61 if (nThreads > 0) {
62 const int hw = std::thread::hardware_concurrency();
63 const int maxThreads = (hw == 0 ? 1 : hw);
64 nThreads = std::clamp(nThreads, 1, maxThreads);
65 clamped = trackConf.nThreads > maxThreads;
66 }
67 LOGP(info, "Tracker and Vertexer will share the task arena with {} thread(s){}", nThreads, (clamped) ? " (clamped)" : "");
68 mTaskArena = std::make_shared<tbb::task_arena>(std::abs(nThreads));
69 }
70 mVertexer->setNThreads(vertConf.nThreads, mTaskArena);
71 mTracker->setNThreads(trackConf.nThreads, mTaskArena);
72}
73
75{
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) { // use TRD triggers
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();
86 fromTRD.emplace_back(o2::itsmft::PhysTrigger{ir, 0});
87 }
88 }
89 physTriggers = gsl::span<const o2::itsmft::PhysTrigger>(fromTRD.data(), fromTRD.size());
90 } else if (mUseTriggers == 1) { // use Phys triggers from ITS stream
91 physTriggers = pc.inputs().get<gsl::span<o2::itsmft::PhysTrigger>>("phystrig");
92 }
93
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});
97 const auto& alpParams = o2::itsmft::DPLAlpideParam<o2::detectors::DetID::ITS>::Instance(); // RS: this should come from CCDB
98
99 irFrames.reserve(trackROFvec.size());
100 int nBCPerTF = alpParams.roFrameLengthInBC;
101
102 LOGP(info, "ITSTracker pulled {} clusters, {} RO frames {}", compClusters.size(), trackROFvec.size(), compClusters.empty() ? " -> received no processable data will skip" : "");
103 const dataformats::MCTruthContainer<MCCompLabel>* labels = nullptr;
104 gsl::span<itsmft::MC2ROFRecord const> mc2rofs;
105 if (mIsMC) {
106 labels = pc.inputs().get<const dataformats::MCTruthContainer<MCCompLabel>*>("itsmclabels").release();
107 // get the array as read-only span, a snapshot is sent forward
108 pc.outputs().snapshot(Output{"ITS", "ITSTrackMC2ROF", 0}, pc.inputs().get<gsl::span<itsmft::MC2ROFRecord>>("ITSMC2ROframes"));
109 LOG(info) << labels->getIndexedSize() << " MC label objects , in " << mc2rofs.size() << " MC events";
110 }
111
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});
116
117 // MC
118 static pmr::vector<o2::MCCompLabel> dummyMCLabTracks, dummyMCLabVerts;
119 static pmr::vector<float> dummyMCPurVerts;
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;
122 bool writeContLabels = mIsMC && o2::its::VertexerParamConfig::Instance().outputContLabels;
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;
125
126 std::uint32_t roFrame = 0;
127
128 bool continuous = o2::base::GRPGeomHelper::instance().getGRPECS()->isDetContinuousReadOut(o2::detectors::DetID::ITS);
129 LOG(info) << "ITSTracker RO: continuous=" << continuous;
130
131 if (mOverrideBeamEstimation) {
132 mTimeFrame->setBeamPosition(mMeanVertex->getX(),
133 mMeanVertex->getY(),
134 mMeanVertex->getSigmaY2(),
135 mTracker->getParameters()[0].LayerResolution[0],
136 mTracker->getParameters()[0].SystErrorY2[0]);
137 }
138
139 mTracker->setBz(o2::base::Propagator::Instance()->getNominalBz());
140
141 gsl::span<const unsigned char>::iterator pattIt = patterns.begin();
142
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; };
150
151 FastMultEst multEst; // mult estimator
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);
155 mTimeFrame->setMultiplicityCutMask(processingMask);
156 float vertexerElapsedTime{0.f};
157 if (mRunVertexer) {
158 vertROFvec.reserve(trackROFvec.size());
159 // Run seeding vertexer
160 if (!compClusters.empty()) {
161 vertexerElapsedTime = mVertexer->clustersToVertices(logger);
162 }
163 } else { // cosmics
165 }
166 const auto& multEstConf = FastMultEstConfig::Instance(); // parameters for mult estimation and cuts
167 gsl::span<const std::pair<MCCompLabel, float>> vMCRecInfo;
168 gsl::span<const MCCompLabel> vMCContLabels;
169 for (auto iRof{0}; iRof < trackROFspan.size(); ++iRof) {
170 bounded_vector<Vertex> vtxVecLoc;
171 auto& vtxROF = vertROFvec.emplace_back(trackROFspan[iRof]);
172 vtxROF.setFirstEntry(vertices.size());
173 if (mRunVertexer) {
174 auto vtxSpan = mTimeFrame->getPrimaryVertices(iRof);
175 if (mIsMC) {
176 vMCRecInfo = mTimeFrame->getPrimaryVerticesMCRecInfo(iRof);
177 if (o2::its::VertexerParamConfig::Instance().outputContLabels) {
178 vMCContLabels = mTimeFrame->getPrimaryVerticesContributors(iRof);
179 }
180 }
181 if (o2::its::TrackerParamConfig::Instance().doUPCIteration) {
182 if (!vtxSpan.empty()) {
183 if (vtxSpan[0].isFlagSet(Vertex::UPCMode) == 1) { // at least one vertex in this ROF and it is from second vertex iteration
184 LOGP(debug, "ROF {} rejected as vertices are from the UPC iteration", iRof);
185 processUPCMask[iRof] = true;
186 cutUPCVertex++;
187 vtxROF.setFlag(o2::itsmft::ROFRecord::VtxUPCMode);
188 } else { // in all cases except if as standard mode vertex was found, the ROF was processed with UPC settings
189 vtxROF.setFlag(o2::itsmft::ROFRecord::VtxStdMode);
190 }
191 } else {
192 vtxROF.setFlag(o2::itsmft::ROFRecord::VtxUPCMode);
193 }
194 } else {
195 vtxROF.setFlag(o2::itsmft::ROFRecord::VtxStdMode);
196 }
197 vtxROF.setNEntries(vtxSpan.size());
198 bool selROF = vtxSpan.empty();
199 for (int iV{0}, iVC{0}; iV < vtxSpan.size(); ++iV) {
200 const auto& v = vtxSpan[iV];
201 if (multEstConf.isVtxMultCutRequested() && !multEstConf.isPassingVtxMultCut(v.getNContributors())) {
202 iVC += v.getNContributors();
203 continue; // skip vertex of unwanted multiplicity
204 }
205 selROF = true;
206 vertices.push_back(v);
207 if (mIsMC && !VertexerParamConfig::Instance().useTruthSeeding) {
208 allVerticesLabels.push_back(vMCRecInfo[iV].first);
209 allVerticesPurities.push_back(vMCRecInfo[iV].second);
210 if (o2::its::VertexerParamConfig::Instance().outputContLabels) {
211 allVerticesContLabels.insert(allVerticesContLabels.end(), vMCContLabels.begin() + iVC, vMCContLabels.begin() + iVC + v.getNContributors());
212 }
213 }
214 iVC += v.getNContributors();
215 }
216 if (processingMask[iRof] && !selROF) { // passed selection in clusters and not in vertex multiplicity
217 LOGP(info, "ROF {} rejected by the vertex multiplicity selection [{},{}]", iRof, multEstConf.cutMultVtxLow, multEstConf.cutMultVtxHigh);
218 processingMask[iRof] = selROF;
219 cutVertexMult++;
220 }
221 } else { // cosmics
222 vtxVecLoc.emplace_back();
223 vtxVecLoc.back().setNContributors(1);
224 vtxROF.setNEntries(vtxVecLoc.size());
225 for (auto& v : vtxVecLoc) {
226 vertices.push_back(v);
227 }
228 mTimeFrame->addPrimaryVertices(vtxVecLoc, 0);
229 }
230 }
231 if (mRunVertexer && !compClusters.empty()) {
232 LOG(info) << fmt::format(" - Vertex seeding total elapsed time: {} ms for {} ({} + {}) vertices found in {}/{} ROFs",
233 vertexerElapsedTime,
237 trackROFspan.size() - mTimeFrame->getNoVertexROF(),
238 trackROFspan.size());
239 LOG(info) << fmt::format(" - FastMultEst: rejected {}/{} ROFs: random/mult.sel:{} (seed {}), vtx.sel:{}", cutRandomMult + cutVertexMult, trackROFspan.size(), cutRandomMult, multEst.lastRandomSeed, cutVertexMult);
240 }
241 if (mOverrideBeamEstimation) {
242 LOG(info) << fmt::format(" - Beam position set to: {}, {} from meanvertex object", mTimeFrame->getBeamX(), mTimeFrame->getBeamY());
243 } else {
244 LOG(info) << fmt::format(" - Beam position computed for the TF: {}, {}", mTimeFrame->getBeamX(), mTimeFrame->getBeamY());
245 }
246 if (mCosmicsProcessing && compClusters.size() > 1500 * trackROFspan.size()) {
247 LOG(error) << "Cosmics processing was requested with an average detector occupancy exceeding 1.e-7, skipping TF processing.";
248 } else {
249 if (!compClusters.empty()) {
250 mTimeFrame->setMultiplicityCutMask(processingMask);
251 mTimeFrame->setROFMask(processUPCMask);
252 // Run CA tracker
253 if (mMode == o2::its::TrackingMode::Async && o2::its::TrackerParamConfig::Instance().fataliseUponFailure) {
254 mTracker->clustersToTracks(logger, fatalLogger);
255 } else {
256 mTracker->clustersToTracks(logger, errorLogger);
257 }
258 }
259 size_t totTracks{mTimeFrame->getNumberOfTracks()}, totClusIDs{mTimeFrame->getNumberOfUsedClusters()};
260 if (totTracks) {
261 allTracks.reserve(totTracks);
262 allClusIdx.reserve(totClusIDs);
263
265 LOG(warning) << fmt::format(" - The processed timeframe had {} clusters with wild z coordinates, check the dictionaries", mTimeFrame->hasBogusClusters());
266 }
267
268 for (unsigned int iROF{0}; iROF < trackROFvec.size(); ++iROF) {
269 auto& tracksROF{trackROFvec[iROF]};
270 auto& vtxROF = vertROFvec[iROF];
271 auto& tracks = mTimeFrame->getTracks(iROF);
272 auto number{tracks.size()};
273 auto first{allTracks.size()};
274 int offset = -tracksROF.getFirstEntry(); // cluster entry!!!
275 tracksROF.setFirstEntry(first);
276 tracksROF.setNEntries(number);
277 tracksROF.setFlags(vtxROF.getFlags()); // copies 0xffffffff if cosmics
278 if (processingMask[iROF]) {
279 irFrames.emplace_back(tracksROF.getBCData(), tracksROF.getBCData() + nBCPerTF - 1).info = tracks.size();
280 }
281 allTrackLabels.reserve(mTimeFrame->getTracksLabel(iROF).size()); // should be 0 if not MC
282 std::copy(mTimeFrame->getTracksLabel(iROF).begin(), mTimeFrame->getTracksLabel(iROF).end(), std::back_inserter(allTrackLabels));
283 // Some conversions that needs to be moved in the tracker internals
284 for (unsigned int iTrk{0}; iTrk < tracks.size(); ++iTrk) {
285 auto& trc{tracks[iTrk]};
286 trc.setFirstClusterEntry(allClusIdx.size()); // before adding tracks, create final cluster indices
287 int ncl = trc.getNumberOfClusters(), nclf = 0;
288 for (int ic = TrackITSExt::MaxClusters; ic--;) { // track internally keeps in->out cluster indices, but we want to store the references as out->in!!!
289 auto clid = trc.getClusterIndex(ic);
290 if (clid >= 0) {
291 trc.setClusterSize(ic, mTimeFrame->getClusterSize(clid));
292 allClusIdx.push_back(clid);
293 nclf++;
294 }
295 }
296 assert(ncl == nclf);
297 allTracks.emplace_back(trc);
298 }
299 }
300 } else {
301 for (auto& r : trackROFvec) { // reset data copied from the clusters
302 r.setFirstEntry(0);
303 r.setNEntries(0);
304 }
305 }
306 LOGP(info, "ITSTracker pushed {} tracks and {} vertices", allTracks.size(), vertices.size());
307 if (mIsMC) {
308 LOGP(info, "ITSTracker pushed {} track labels", allTrackLabels.size());
309 LOGP(info, "ITSTracker pushed {} vertex labels", allVerticesLabels.size());
310 if (!allVerticesContLabels.empty()) {
311 LOGP(info, "ITSTracker pushed {} vertex contributor labels", allVerticesContLabels.size());
312 }
313 LOGP(info, "ITSTracker pushed {} vertex purities", allVerticesPurities.size());
314 }
315 }
316 mTimeFrame->wipe();
317}
318
320{
322 static bool initOnceDone = false;
323 if (mOverrideBeamEstimation) {
325 }
326 if (!initOnceDone) { // this params need to be queried only once
327 initOnceDone = true;
328 pc.inputs().get<o2::itsmft::TopologyDictionary*>("itscldict"); // just to trigger the finaliseCCDB
330 if (pc.inputs().getPos("itsTGeo") >= 0) {
331 pc.inputs().get<o2::its::GeometryTGeo*>("itsTGeo");
332 }
335 initialise();
336
337 if (pc.services().get<const o2::framework::DeviceSpec>().inputTimesliceId == 0) { // print settings only for the 1st pipeling
340 const auto& vtxParams = mVertexer->getParameters();
341 for (size_t it = 0; it < vtxParams.size(); it++) {
342 const auto& par = vtxParams[it];
343 LOGP(info, "vtxIter#{} : {}", it, par.asString());
344 }
345 const auto& trParams = mTracker->getParameters();
346 for (size_t it = 0; it < trParams.size(); it++) {
347 const auto& par = trParams[it];
348 LOGP(info, "recoIter#{} : {}", it, par.asString());
349 }
350 }
351 }
352}
353
355{
357 return;
358 }
359 if (matcher == ConcreteDataMatcher("ITS", "CLUSDICT", 0)) {
360 LOG(info) << "cluster dictionary updated";
362 return;
363 }
364 // Note: strictly speaking, for Configurable params we don't need finaliseCCDB check, the singletons are updated at the CCDB fetcher level
365 if (matcher == ConcreteDataMatcher("ITS", "ALPIDEPARAM", 0)) {
366 LOG(info) << "Alpide param updated";
368 par.printKeyValues();
369 return;
370 }
371 if (matcher == ConcreteDataMatcher("GLO", "MEANVERTEX", 0)) {
372 LOGP(info, "Mean vertex acquired");
374 return;
375 }
376 if (matcher == ConcreteDataMatcher("ITS", "GEOMTGEO", 0)) {
377 LOG(info) << "ITS GeometryTGeo loaded from ccdb";
379 return;
380 }
381}
382
384{
385 mTracker->printSummary();
386}
387
389 TrackerTraitsN* trackerTraits,
390 TimeFrameN* frame)
391{
392 mVertexer = std::make_unique<VertexerN>(vertexerTraits);
393 mTracker = std::make_unique<TrackerN>(trackerTraits);
394 mTimeFrame = frame;
395 mVertexer->adoptTimeFrame(*mTimeFrame);
396 mTracker->adoptTimeFrame(*mTimeFrame);
397
398 // set common memory resource
399 if (!mMemoryPool) {
400 mMemoryPool = std::make_shared<BoundedMemoryResource>();
401 }
402 vertexerTraits->setMemoryPool(mMemoryPool);
403 trackerTraits->setMemoryPool(mMemoryPool);
404 mTimeFrame->setMemoryPool(mMemoryPool);
405 mTracker->setMemoryPool(mMemoryPool);
406 mVertexer->setMemoryPool(mMemoryPool);
407}
408
409void ITSTrackingInterface::loadROF(gsl::span<itsmft::ROFRecord>& trackROFspan,
410 gsl::span<const itsmft::CompClusterExt> clusters,
411 gsl::span<const unsigned char>::iterator& pattIt,
413{
414 mTimeFrame->loadROFrameData(trackROFspan, clusters, pattIt, mDict, mcLabels);
415}
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)
virtual void finaliseCCDB(framework::ConcreteDataMatcher &matcher, void *obj)
void setTraitsFromProvider(VertexerTraitsN *, TrackerTraitsN *, TimeFrameN *)
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
GLintptr offset
Definition glcorearb.h:660
GLboolean r
Definition glcorearb.h:1233
Defining PrimaryVertex explicitly as messageable.
Definition TFIDInfo.h:20
auto get(const std::byte *buffer, size_t=0)
Definition DataHeader.h:454
std::vector< VertexingParameters > getVertexingParameters(Type mode)
std::string toString(Type mode)
std::vector< TrackingParameters > getTrackingParameters(Type mode)
std::pmr::vector< T > bounded_vector
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)
gsl::span< const MCCompLabel > getPrimaryVerticesContributors(const int rofId) const
Definition TimeFrame.h:380
void addPrimaryVertices(const bounded_vector< Vertex > &vertices, const int iteration)
Definition TimeFrame.cxx:62
float getBeamX() const
Definition TimeFrame.h:114
auto & getTracks(int rofId)
Definition TimeFrame.h:176
size_t getNumberOfTracks() const
Definition TimeFrame.h:677
unsigned int & getNoVertexROF()
Definition TimeFrame.h:220
gsl::span< const std::pair< MCCompLabel, float > > getPrimaryVerticesMCRecInfo(const int rofId) const
Definition TimeFrame.h:371
virtual void wipe()
void setMultiplicityCutMask(const std::vector< uint8_t > &cutMask)
Definition TimeFrame.h:229
size_t getNumberOfUsedClusters() const
Definition TimeFrame.h:687
void setBeamPosition(const float x, const float y, const float s2, const float base=50.f, const float systematic=0.f)
Definition TimeFrame.h:108
auto & getTotVertIteration()
Definition TimeFrame.h:101
int getPrimaryVerticesNum(int rofId=-1) const
Definition TimeFrame.h:415
void setROFMask(const std::vector< uint8_t > &rofMask)
Definition TimeFrame.h:230
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:359
void setMemoryPool(std::shared_ptr< BoundedMemoryResource > &pool)
memory management
auto & getTracksLabel(const int rofId)
Definition TimeFrame.h:177
float getBeamY() const
Definition TimeFrame.h:115
int hasBogusClusters() const
Definition TimeFrame.h:233
int getClusterSize(int clusterId) const
Definition TimeFrame.h:145
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