Project
Loading...
Searching...
No Matches
TrackerSpec.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 <vector>
13#include <chrono>
14
18#include "Field/MagneticField.h"
19#include "Field/MagFieldParam.h"
27#include "TRKSimulation/Hit.h"
30#include <TGeoGlobalMagField.h>
31
32#ifdef O2_WITH_ACTS
34#endif
35
36#include <TFile.h>
37#include <TTree.h>
38
39namespace o2
40{
41using namespace framework;
42namespace trk
43{
44
45TrackerDPL::TrackerDPL(std::shared_ptr<o2::base::GRPGeomRequest> gr,
46 bool isMC,
47 const std::string& hitRecoConfigFileName,
49{
50 if (!hitRecoConfigFileName.empty()) {
51 std::ifstream configFile(hitRecoConfigFileName);
52 mHitRecoConfig = nlohmann::json::parse(configFile);
53 }
54
55 // mITSTrackingInterface.setTrackingMode(trMode);
56}
57
59{
60 // mTimer.Stop();
61 // mTimer.Reset();
62 // o2::base::GRPGeomHelper::instance().setRequest(mGGCCDBRequest);
63 // mChainITS.reset(mRecChain->AddChain<o2::gpu::GPUChainITS>());
64 // mITSTrackingInterface.setTraitsFromProvider(mChainITS->GetITSVertexerTraits(),
65 // mChainITS->GetITSTrackerTraits(),
66 // mChainITS->GetITSTimeframe());
67
68#ifdef O2_WITH_ACTS
69 mUseACTS = ic.options().get<bool>("useACTS");
70#endif
71}
72
74{
75 LOGF(info, "CPU Reconstruction total timing: Cpu: %.3e Real: %.3e s in %d slots", mTimer.CpuTime(), mTimer.RealTime(), mTimer.Counter() - 1);
76}
77
78std::vector<o2::its::TrackingParameters> TrackerDPL::createTrackingParamsFromConfig()
79{
80 std::vector<o2::its::TrackingParameters> trackingParams;
81
82 if (!mHitRecoConfig.contains("trackingparams") || !mHitRecoConfig["trackingparams"].is_array()) {
83 LOGP(fatal, "No trackingparams field found in configuration or it is not an array. Returning empty vector.");
84 return trackingParams;
85 }
86
87 for (const auto& paramConfig : mHitRecoConfig["trackingparams"]) {
89
90 // Parse integer parameters
91 if (paramConfig.contains("NLayers")) {
92 params.NLayers = paramConfig["NLayers"].get<int>();
93 }
94 if (paramConfig.contains("ZBins")) {
95 params.ZBins = paramConfig["ZBins"].get<int>();
96 }
97 if (paramConfig.contains("PhiBins")) {
98 params.PhiBins = paramConfig["PhiBins"].get<int>();
99 }
100 if (paramConfig.contains("ClusterSharing")) {
101 params.ClusterSharing = paramConfig["ClusterSharing"].get<int>();
102 }
103 if (paramConfig.contains("MinTrackLength")) {
104 params.MinTrackLength = paramConfig["MinTrackLength"].get<int>();
105 }
106 if (paramConfig.contains("ReseedIfShorter")) {
107 params.ReseedIfShorter = paramConfig["ReseedIfShorter"].get<int>();
108 }
109 if (paramConfig.contains("StartLayerMask")) {
110 params.StartLayerMask = paramConfig["StartLayerMask"].get<uint16_t>();
111 }
112
113 // Parse float parameters
114 if (paramConfig.contains("NSigmaCut")) {
115 params.NSigmaCut = paramConfig["NSigmaCut"].get<float>();
116 }
117 if (paramConfig.contains("PVres")) {
118 params.PVres = paramConfig["PVres"].get<float>();
119 }
120 if (paramConfig.contains("TrackletMinPt")) {
121 params.TrackletMinPt = paramConfig["TrackletMinPt"].get<float>();
122 }
123 if (paramConfig.contains("CellDeltaTanLambdaSigma")) {
124 params.CellDeltaTanLambdaSigma = paramConfig["CellDeltaTanLambdaSigma"].get<float>();
125 }
126 if (paramConfig.contains("MaxChi2ClusterAttachment")) {
127 params.MaxChi2ClusterAttachment = paramConfig["MaxChi2ClusterAttachment"].get<float>();
128 }
129 if (paramConfig.contains("MaxChi2NDF")) {
130 params.MaxChi2NDF = paramConfig["MaxChi2NDF"].get<float>();
131 }
132 // if (paramConfig.contains("TrackFollowerNSigmaCutZ")) {
133 // params.TrackFollowerNSigmaCutZ = paramConfig["TrackFollowerNSigmaCutZ"].get<float>();
134 // }
135 // if (paramConfig.contains("TrackFollowerNSigmaCutPhi")) {
136 // params.TrackFollowerNSigmaCutPhi = paramConfig["TrackFollowerNSigmaCutPhi"].get<float>();
137 // }
138
139 // Parse boolean parameters
140 if (paramConfig.contains("UseDiamond")) {
141 params.UseDiamond = paramConfig["UseDiamond"].get<bool>();
142 }
143 if (paramConfig.contains("AllowSharingFirstCluster")) {
144 params.AllowSharingFirstCluster = paramConfig["AllowSharingFirstCluster"].get<bool>();
145 }
146 if (paramConfig.contains("RepeatRefitOut")) {
147 params.RepeatRefitOut = paramConfig["RepeatRefitOut"].get<bool>();
148 }
149 if (paramConfig.contains("ShiftRefToCluster")) {
150 params.ShiftRefToCluster = paramConfig["ShiftRefToCluster"].get<bool>();
151 }
152 // if (paramConfig.contains("FindShortTracks")) {
153 // params.FindShortTracks = paramConfig["FindShortTracks"].get<bool>();
154 // }
155 if (paramConfig.contains("PerPrimaryVertexProcessing")) {
156 params.PerPrimaryVertexProcessing = paramConfig["PerPrimaryVertexProcessing"].get<bool>();
157 }
158 if (paramConfig.contains("SaveTimeBenchmarks")) {
159 params.SaveTimeBenchmarks = paramConfig["SaveTimeBenchmarks"].get<bool>();
160 }
161 if (paramConfig.contains("DoUPCIteration")) {
162 params.DoUPCIteration = paramConfig["DoUPCIteration"].get<bool>();
163 }
164 if (paramConfig.contains("FataliseUponFailure")) {
165 params.FataliseUponFailure = paramConfig["FataliseUponFailure"].get<bool>();
166 }
167 // if (paramConfig.contains("UseTrackFollower")) {
168 // params.UseTrackFollower = paramConfig["UseTrackFollower"].get<bool>();
169 // }
170 // if (paramConfig.contains("UseTrackFollowerTop")) {
171 // params.UseTrackFollowerTop = paramConfig["UseTrackFollowerTop"].get<bool>();
172 // }
173 // if (paramConfig.contains("UseTrackFollowerBot")) {
174 // params.UseTrackFollowerBot = paramConfig["UseTrackFollowerBot"].get<bool>();
175 // }
176 // if (paramConfig.contains("UseTrackFollowerMix")) {
177 // params.UseTrackFollowerMix = paramConfig["UseTrackFollowerMix"].get<bool>();
178 // }
179 if (paramConfig.contains("createArtefactLabels")) {
180 params.createArtefactLabels = paramConfig["createArtefactLabels"].get<bool>();
181 }
182 if (paramConfig.contains("PrintMemory")) {
183 params.PrintMemory = paramConfig["PrintMemory"].get<bool>();
184 }
185 if (paramConfig.contains("DropTFUponFailure")) {
186 params.DropTFUponFailure = paramConfig["DropTFUponFailure"].get<bool>();
187 }
188
189 // Parse vector parameters
190 if (paramConfig.contains("LayerZ")) {
191 params.LayerZ = paramConfig["LayerZ"].get<std::vector<float>>();
192 }
193 if (paramConfig.contains("LayerRadii")) {
194 params.LayerRadii = paramConfig["LayerRadii"].get<std::vector<float>>();
195 }
196 if (paramConfig.contains("LayerxX0")) {
197 params.LayerxX0 = paramConfig["LayerxX0"].get<std::vector<float>>();
198 }
199 if (paramConfig.contains("LayerResolution")) {
200 params.LayerResolution = paramConfig["LayerResolution"].get<std::vector<float>>();
201 }
202 if (paramConfig.contains("SystErrorY2")) {
203 params.SystErrorY2 = paramConfig["SystErrorY2"].get<std::vector<float>>();
204 }
205 if (paramConfig.contains("SystErrorZ2")) {
206 params.SystErrorZ2 = paramConfig["SystErrorZ2"].get<std::vector<float>>();
207 }
208 if (paramConfig.contains("MinPt")) {
209 params.MinPt = paramConfig["MinPt"].get<std::vector<float>>();
210 }
211
212 // Parse Diamond array
213 if (paramConfig.contains("Diamond") && paramConfig["Diamond"].is_array() && paramConfig["Diamond"].size() == 3) {
214 params.Diamond[0] = paramConfig["Diamond"][0].get<float>();
215 params.Diamond[1] = paramConfig["Diamond"][1].get<float>();
216 params.Diamond[2] = paramConfig["Diamond"][2].get<float>();
217 }
218
219 // Parse size_t parameter
220 if (paramConfig.contains("MaxMemory")) {
221 params.MaxMemory = paramConfig["MaxMemory"].get<size_t>();
222 }
223
224 // Parse CorrType enum
225 if (paramConfig.contains("CorrType")) {
226 int corrTypeInt = paramConfig["CorrType"].get<int>();
227 params.CorrType = static_cast<o2::base::PropagatorImpl<float>::MatCorrType>(corrTypeInt);
228 }
229
230 trackingParams.push_back(params);
231 }
232
233 LOGP(info, "Loaded {} tracking parameter sets from configuration", trackingParams.size());
234 return trackingParams;
235}
236
238{
239 auto cput = mTimer.CpuTime();
240 auto realt = mTimer.RealTime();
241 mTimer.Start(false);
242
243 if (!mHitRecoConfig.empty()) {
244 TFile hitsFile(mHitRecoConfig["inputfiles"]["hits"].get<std::string>().c_str(), "READ");
245 TFile mcHeaderFile(mHitRecoConfig["inputfiles"]["mcHeader"].get<std::string>().c_str(), "READ");
246 TTree* hitsTree = hitsFile.Get<TTree>("o2sim");
247 std::vector<o2::trk::Hit>* trkHit = nullptr;
248 hitsTree->SetBranchAddress("TRKHit", &trkHit);
249
250 TTree* mcHeaderTree = mcHeaderFile.Get<TTree>("o2sim");
251 auto mcheader = new o2::dataformats::MCEventHeader;
252 mcHeaderTree->SetBranchAddress("MCEventHeader.", &mcheader);
253
254 o2::base::GeometryManager::loadGeometry(mHitRecoConfig["inputfiles"]["geometry"].get<std::string>().c_str(), false, true);
255 auto* gman = o2::trk::GeometryTGeo::Instance();
256
257 const Long64_t nEvents{hitsTree->GetEntries()};
258 LOGP(info, "Starting reconstruction from hits for {} events", nEvents);
259
260 if (mMemoryPool.get() == nullptr) {
261 mMemoryPool = std::make_shared<its::BoundedMemoryResource>();
262 }
263 if (mTaskArena.get() == nullptr) {
264 mTaskArena = std::make_shared<tbb::task_arena>(1);
265 }
266
267 o2::trk::TimeFrame<11> timeFrame;
268 o2::its::TrackerTraits<11> itsTrackerTraits;
269 o2::its::Tracker<11> itsTracker(&itsTrackerTraits);
270 timeFrame.setMemoryPool(mMemoryPool);
271 itsTrackerTraits.setMemoryPool(mMemoryPool);
272 itsTrackerTraits.setNThreads(mTaskArena->max_concurrency(), mTaskArena);
273 itsTrackerTraits.adoptTimeFrame(static_cast<o2::its::TimeFrame<11>*>(&timeFrame));
274 itsTrackerTraits.setBz(mHitRecoConfig["geometry"]["bz"].get<float>());
275 auto field = new field::MagneticField("ALICE3Mag", "ALICE 3 Magnetic Field", mHitRecoConfig["geometry"]["bz"].get<float>() / 5.f, 0.0, o2::field::MagFieldParam::k5kGUniform);
276 TGeoGlobalMagField::Instance()->SetField(field);
277 TGeoGlobalMagField::Instance()->Lock();
278 itsTracker.adoptTimeFrame(timeFrame);
279
280 const int nRofs = timeFrame.loadROFsFromHitTree(hitsTree, gman, mHitRecoConfig);
281 const int inROFpileup{mHitRecoConfig.contains("inROFpileup") ? mHitRecoConfig["inROFpileup"].get<int>() : 1};
282
283 // Add primary vertices from MC headers for each ROF
284 timeFrame.getPrimaryVerticesFromMC(mcHeaderTree, nRofs, nEvents, inROFpileup);
285 // Create tracking parameters from config and set them in the time frame
286 auto trackingParams = createTrackingParamsFromConfig();
287
288 itsTrackerTraits.updateTrackingParameters(trackingParams);
289
290#ifdef O2_WITH_ACTS
291 if (mUseACTS) {
292 LOG(info) << "Running the tracking with ACTS";
293 o2::trk::TrackerACTS<11> actsTracker;
294 actsTracker.setBz(mHitRecoConfig["geometry"]["bz"].get<float>());
295 actsTracker.adoptTimeFrame(timeFrame);
296 actsTracker.clustersToTracks();
297 }
298#endif
299
300 const auto trackingLoopStart = std::chrono::steady_clock::now();
301 for (size_t iter{0}; iter < trackingParams.size(); ++iter) {
302 LOGP(info, "{}", trackingParams[iter].asString());
303 timeFrame.initialise(iter, trackingParams[iter], 11, false);
304 itsTrackerTraits.computeLayerTracklets(iter, -1);
305 LOGP(info, "Number of tracklets in iteration {}: {}", iter, timeFrame.getNumberOfTracklets());
306 itsTrackerTraits.computeLayerCells(iter);
307 LOGP(info, "Number of cells in iteration {}: {}", iter, timeFrame.getNumberOfCells());
308 itsTrackerTraits.findCellsNeighbours(iter);
309 LOGP(info, "Number of cell neighbours in iteration {}: {}", iter, timeFrame.getNumberOfNeighbours());
310 itsTrackerTraits.findRoads(iter);
311 LOGP(info, "Number of tracks in iteration {}: {}", iter, timeFrame.getNumberOfTracks());
312 }
313 const auto trackingLoopElapsedMs = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now() - trackingLoopStart).count();
314 LOGP(info, "Tracking iterations block took {} ms", trackingLoopElapsedMs);
315
316 itsTracker.computeTracksMClabels();
317
318 // Collect tracks and labels (flat vectors in the new interface)
319 const auto& tracks = timeFrame.getTracks();
320 const auto& labels = timeFrame.getTracksLabel();
321
322 // Copy to output vectors (TrackITSExt -> TrackITS slicing for output compatibility)
323 std::vector<o2::its::TrackITS> allTracks(tracks.begin(), tracks.end());
324 std::vector<o2::MCCompLabel> allLabels(labels.begin(), labels.end());
325
326 int totalTracks = allTracks.size();
327 int goodTracks = 0;
328 int fakeTracks = 0;
329
330 for (const auto& label : allLabels) {
331 if (label.isFake()) {
332 fakeTracks++;
333 } else {
334 goodTracks++;
335 }
336 }
337
338 LOGP(info, "=== Tracking Summary ===");
339 LOGP(info, "Total tracks reconstructed: {}", totalTracks);
340 LOGP(info, "Good tracks: {} ({:.1f}%)", goodTracks, totalTracks > 0 ? 100.0 * goodTracks / totalTracks : 0);
341 LOGP(info, "Fake tracks: {} ({:.1f}%)", fakeTracks, totalTracks > 0 ? 100.0 * fakeTracks / totalTracks : 0);
342
343 // Stream tracks and labels to DPL output
344 pc.outputs().snapshot(o2::framework::Output{"TRK", "TRACKS", 0}, allTracks);
345 pc.outputs().snapshot(o2::framework::Output{"TRK", "TRACKSMCTR", 0}, allLabels);
346
347 LOGP(info, "Tracks and MC labels streamed to output");
348
351 }
352
353 mTimer.Stop();
354 LOGP(info, "CPU Reconstruction time for this TF {} s (cpu), {} s (wall)", mTimer.CpuTime() - cput, mTimer.RealTime() - realt);
355}
356
357// void TrackerDPL::finaliseCCDB(ConcreteDataMatcher& matcher, void* obj)
358// {
359// // mITSTrackingInterface.finaliseCCDB(matcher, obj);
360// }
361
363{
364 LOGF(info, "TRK CA-Tracker total timing: Cpu: %.3e Real: %.3e s in %d slots", mTimer.CpuTime(), mTimer.RealTime(), mTimer.Counter() - 1);
365}
366
367DataProcessorSpec getTrackerSpec(bool useMC, const std::string& hitRecoConfig, o2::gpu::gpudatatypes::DeviceType dType)
368{
369 std::vector<InputSpec> inputs;
370 std::vector<OutputSpec> outputs;
371 outputs.emplace_back("TRK", "TRACKS", 0, Lifetime::Timeframe);
372 auto ggRequest = std::make_shared<o2::base::GRPGeomRequest>(false, // orbitResetTime
373 false, // GRPECS=true
374 false, // GRPLHCIF
375 false, // GRPMagField
376 false, // askMatLUT
377 o2::base::GRPGeomRequest::None, // geometry, but ignored until it will be put in the CCDB
378 inputs,
379 true);
380
381 if (!hitRecoConfig.empty()) {
382 outputs.emplace_back("TRK", "TRACKSMCTR", 0, Lifetime::Timeframe);
383 return DataProcessorSpec{
384 "trk-hits-tracker",
385 {},
386 outputs,
387 AlgorithmSpec{adaptFromTask<TrackerDPL>(ggRequest,
388 useMC,
389 hitRecoConfig,
390 dType)},
391 Options{ConfigParamSpec{"max-loops", VariantType::Int, 1, {"max number of loops"}}
392#ifdef O2_WITH_ACTS
393 ,
394 {"useACTS", o2::framework::VariantType::Bool, false, {"Use ACTS for tracking"}}
395#endif
396 }};
397 }
398
399 inputs.emplace_back("dummy", "TRK", "DUMMY", 0, Lifetime::Timeframe);
400
401 constexpr bool expectClusterInputs = false;
402 if (expectClusterInputs) {
403 inputs.pop_back();
404 inputs.emplace_back("compClusters", "TRK", "COMPCLUSTERS", 0, Lifetime::Timeframe);
405 inputs.emplace_back("patterns", "TRK", "PATTERNS", 0, Lifetime::Timeframe);
406 inputs.emplace_back("ROframes", "TRK", "CLUSTERSROF", 0, Lifetime::Timeframe);
407 }
408
409 // inputs.emplace_back("itscldict", "TRK", "CLUSDICT", 0, Lifetime::Condition, ccdbParamSpec("ITS/Calib/ClusterDictionary"));
410 // inputs.emplace_back("TRK_almiraparam", "TRK", "ALMIRAPARAM", 0, Lifetime::Condition, ccdbParamSpec("TRK/Config/AlmiraParam"));
411
412 // outputs.emplace_back("TRK", "TRACKCLSID", 0, Lifetime::Timeframe);
413 // outputs.emplace_back("TRK", "TRKTrackROF", 0, Lifetime::Timeframe);
414 // outputs.emplace_back("TRK", "VERTICES", 0, Lifetime::Timeframe);
415 // outputs.emplace_back("TRK", "VERTICESROF", 0, Lifetime::Timeframe);
416 // outputs.emplace_back("TRK", "IRFRAMES", 0, Lifetime::Timeframe);
417
418 if (useMC) {
419 // inputs.emplace_back("trkmclabels", "TRK", "CLUSTERSMCTR", 0, Lifetime::Timeframe);
420 // inputs.emplace_back("TRKMC2ROframes", "TRK", "CLUSTERSMC2ROF", 0, Lifetime::Timeframe);
421 // outputs.emplace_back("TRK", "VERTICESMCTR", 0, Lifetime::Timeframe);
422 // outputs.emplace_back("TRK", "VERTICESMCPUR", 0, Lifetime::Timeframe);
423 // outputs.emplace_back("TRK", "TRACKSMCTR", 0, Lifetime::Timeframe);
424 // outputs.emplace_back("TRK", "TRKTrackMC2ROF", 0, Lifetime::Timeframe);
425 }
426
427 return DataProcessorSpec{
428 "trk-tracker",
429 inputs,
430 outputs,
431 AlgorithmSpec{adaptFromTask<TrackerDPL>(ggRequest,
432 useMC,
433 hitRecoConfig,
434 dType)},
435 Options{}};
436}
437
438} // namespace trk
439} // namespace o2
std::vector< std::string > labels
std::string asString(TDataMember const &dm, char *pointer)
Definition of the GeometryManager class.
TRK TimeFrame class derived from ITS TimeFrame.
Definition of the TRK Hit class.
Definition of the MagFieldParam: container for ALICE mag. field parameters.
Definition of the MagF class.
Definition of the SegmentationChipclass.
TRK tracker using ACTS seeding algorithm.
static void loadGeometry(std::string_view geomFilePath="", bool applyMisalignment=false, bool preferAlignedFile=true)
void snapshot(const Output &spec, T const &object)
ConfigParamRegistry const & options()
Definition InitContext.h:33
DataAllocator & outputs()
The data allocator is used to allocate memory for the output data.
ServiceRegistryRef services()
The services registry associated with this processing context.
virtual void findRoads(const int iteration)
void updateTrackingParameters(const std::vector< TrackingParameters > &trkPars)
virtual void adoptTimeFrame(TimeFrame< NLayers > *tf)
virtual void findCellsNeighbours(const int iteration)
void setMemoryPool(std::shared_ptr< BoundedMemoryResource > pool) noexcept
virtual void computeLayerCells(const int iteration)
virtual void setBz(float bz)
void setNThreads(int n, std::shared_ptr< tbb::task_arena > &arena)
virtual void computeLayerTracklets(const int iteration, int iVertex)
void adoptTimeFrame(TimeFrame< NLayers > &tf)
Definition Tracker.cxx:226
void computeTracksMClabels()
Definition Tracker.cxx:122
static GeometryTGeo * Instance()
void getPrimaryVerticesFromMC(TTree *mcHeaderTree, int nRofs, Long64_t nEvents, int inROFpileup, uint32_t rofLength=198)
int loadROFsFromHitTree(TTree *hitsTree, GeometryTGeo *gman, const nlohmann::json &config)
Definition TimeFrame.cxx:32
TRK Tracker using ACTS algorithms for seeding and track finding.
Definition TrackerACTS.h:87
void setBz(float bz)
Set the magnetic field strength.
void clustersToTracks()
Main tracking entry point: convert clusters to tracks.
void adoptTimeFrame(o2::its::TimeFrame< nLayers > &tf)
Adopt a TimeFrame for processing.
TrackerDPL(std::shared_ptr< o2::base::GRPGeomRequest > gr, bool isMC, const std::string &hitRecoConfig, gpu::gpudatatypes::DeviceType dType=gpu::gpudatatypes::DeviceType::CPU)
void endOfStream(framework::EndOfStreamContext &ec) final
This is invoked whenever we have an EndOfStream event.
void run(framework::ProcessingContext &pc) final
void stop() final
This is invoked on stop.
void init(framework::InitContext &ic) final
GLenum const GLfloat * params
Definition glcorearb.h:272
GLuint GLsizei const GLchar * label
Definition glcorearb.h:2519
@ Me
Only quit this data processor.
template std::string ConfigParamRegistry::get< std::string >(const char *key) const
std::vector< ConfigParamSpec > Options
framework::DataProcessorSpec getTrackerSpec(bool useMC, const std::string &hitRecoConfig, gpu::gpudatatypes::DeviceType dType=gpu::gpudatatypes::DeviceType::CPU)
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
virtual size_t getNumberOfCells() const
Definition TimeFrame.h:549
void setMemoryPool(std::shared_ptr< BoundedMemoryResource > pool)
memory management
size_t getNumberOfTracks() const
Definition TimeFrame.h:579
virtual size_t getNumberOfNeighbours() const
Definition TimeFrame.h:569
void initialise(const int iteration, const TrackingParameters &trkParam, const int maxLayers=NLayers, bool resetVertices=true)
auto & getTracksLabel()
Definition TimeFrame.h:198
virtual size_t getNumberOfTracklets() const
Definition TimeFrame.h:559
const int nEvents
Definition test_Fifo.cxx:27
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"