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