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 <algorithm>
14#include <array>
15#include <chrono>
16#include <format>
17#include <fstream>
18#include <numeric>
19
26#include "Field/MagneticField.h"
27#include "Field/MagFieldParam.h"
37#include "TRKSimulation/Hit.h"
39#ifdef TRK_HAS_GPU_TRACKING
43#endif
45#include <TGeoGlobalMagField.h>
46
47#ifdef O2_WITH_ACTS
49#endif
50
51#include <TFile.h>
52#include <TTree.h>
53
54namespace o2
55{
56using namespace framework;
57namespace trk
58{
60
61TrackerDPL::TrackerDPL(std::shared_ptr<o2::base::GRPGeomRequest> gr,
62 bool isMC,
63 const std::string& hitRecoConfigFileName,
64 const std::string& clusterRecoConfigFileName,
66{
67 if (!hitRecoConfigFileName.empty()) {
68 std::ifstream configFile(hitRecoConfigFileName);
69 mHitRecoConfig = nlohmann::json::parse(configFile);
70 }
71 if (!clusterRecoConfigFileName.empty()) {
72 std::ifstream configFile(clusterRecoConfigFileName);
73 mClusterRecoConfig = nlohmann::json::parse(configFile);
74 }
75 mIsMC = isMC;
76 mDeviceType = dType;
77}
78
80{
81#ifdef O2_WITH_ACTS
82 mUseACTS = ic.options().get<bool>("useACTS");
83#endif
84}
85
87{
88 LOGF(info, "CPU Reconstruction total timing: Cpu: %.3e Real: %.3e s in %d slots", mTimer.CpuTime(), mTimer.RealTime(), mTimer.Counter() - 1);
89}
90
91std::vector<o2::its::TrackingParameters> TrackerDPL::createTrackingParamsFromConfig()
92{
93 std::vector<o2::its::TrackingParameters> trackingParams;
94 auto loadTrackingParamsFromJson = [](std::vector<o2::its::TrackingParameters>& trackingParams, const nlohmann::json& paramConfigJson) {
95 for (const auto& paramConfig : paramConfigJson) {
97
98 if (paramConfig.contains("NLayers")) {
99 params.NLayers = paramConfig["NLayers"].get<int>();
100 }
101 if (paramConfig.contains("ZBins")) {
102 params.ZBins = paramConfig["ZBins"].get<int>();
103 }
104 if (paramConfig.contains("PhiBins")) {
105 params.PhiBins = paramConfig["PhiBins"].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 if (paramConfig.contains("NSigmaCut")) {
121 params.NSigmaCut = paramConfig["NSigmaCut"].get<float>();
122 }
123 if (paramConfig.contains("PVres")) {
124 params.PVres = paramConfig["PVres"].get<float>();
125 }
126 if (paramConfig.contains("TrackletMinPt")) {
127 params.TrackletMinPt = paramConfig["TrackletMinPt"].get<float>();
128 }
129 if (paramConfig.contains("CellDeltaTanLambdaSigma")) {
130 params.CellDeltaTanLambdaSigma = paramConfig["CellDeltaTanLambdaSigma"].get<float>();
131 }
132 if (paramConfig.contains("MaxChi2ClusterAttachment")) {
133 params.MaxChi2ClusterAttachment = paramConfig["MaxChi2ClusterAttachment"].get<float>();
134 }
135 if (paramConfig.contains("MaxChi2NDF")) {
136 params.MaxChi2NDF = paramConfig["MaxChi2NDF"].get<float>();
137 }
138
139 if (paramConfig.contains("UseDiamond")) {
140 params.UseDiamond = paramConfig["UseDiamond"].get<bool>();
141 }
142 if (paramConfig.contains("AllowSharingFirstCluster")) {
143 params.AllowSharingFirstCluster = paramConfig["AllowSharingFirstCluster"].get<bool>();
144 }
145 if (paramConfig.contains("RepeatRefitOut")) {
146 params.RepeatRefitOut = paramConfig["RepeatRefitOut"].get<bool>();
147 }
148 if (paramConfig.contains("ShiftRefToCluster")) {
149 params.ShiftRefToCluster = paramConfig["ShiftRefToCluster"].get<bool>();
150 }
151 if (paramConfig.contains("PerPrimaryVertexProcessing")) {
152 params.PerPrimaryVertexProcessing = paramConfig["PerPrimaryVertexProcessing"].get<bool>();
153 }
154 if (paramConfig.contains("SaveTimeBenchmarks")) {
155 params.SaveTimeBenchmarks = paramConfig["SaveTimeBenchmarks"].get<bool>();
156 }
157 if (paramConfig.contains("DoUPCIteration")) {
158 params.DoUPCIteration = paramConfig["DoUPCIteration"].get<bool>();
159 }
160 if (paramConfig.contains("FataliseUponFailure")) {
161 params.FataliseUponFailure = paramConfig["FataliseUponFailure"].get<bool>();
162 }
163 if (paramConfig.contains("CreateArtefactLabels")) {
164 params.CreateArtefactLabels = paramConfig["CreateArtefactLabels"].get<bool>();
165 }
166 if (paramConfig.contains("PrintMemory")) {
167 params.PrintMemory = paramConfig["PrintMemory"].get<bool>();
168 }
169 if (paramConfig.contains("DropTFUponFailure")) {
170 params.DropTFUponFailure = paramConfig["DropTFUponFailure"].get<bool>();
171 }
172
173 if (paramConfig.contains("LayerZ")) {
174 params.LayerZ = paramConfig["LayerZ"].get<std::vector<float>>();
175 }
176 if (paramConfig.contains("LayerRadii")) {
177 params.LayerRadii = paramConfig["LayerRadii"].get<std::vector<float>>();
178 }
179 if (paramConfig.contains("LayerxX0")) {
180 params.LayerxX0 = paramConfig["LayerxX0"].get<std::vector<float>>();
181 }
182 if (paramConfig.contains("LayerResolution")) {
183 params.LayerResolution = paramConfig["LayerResolution"].get<std::vector<float>>();
184 }
185 if (paramConfig.contains("SystErrorY2")) {
186 params.SystErrorY2 = paramConfig["SystErrorY2"].get<std::vector<float>>();
187 }
188 if (paramConfig.contains("SystErrorZ2")) {
189 params.SystErrorZ2 = paramConfig["SystErrorZ2"].get<std::vector<float>>();
190 }
191 if (paramConfig.contains("MinPt")) {
192 params.MinPt = paramConfig["MinPt"].get<std::vector<float>>();
193 }
194 if (paramConfig.contains("AddTimeError")) {
195 params.AddTimeError = paramConfig["AddTimeError"].get<std::vector<UInt_t>>();
196 }
197
198 if (paramConfig.contains("Diamond") && paramConfig["Diamond"].is_array() && paramConfig["Diamond"].size() == 3) {
199 params.Diamond[0] = paramConfig["Diamond"][0].get<float>();
200 params.Diamond[1] = paramConfig["Diamond"][1].get<float>();
201 params.Diamond[2] = paramConfig["Diamond"][2].get<float>();
202 }
203
204 if (paramConfig.contains("MaxMemory")) {
205 params.MaxMemory = paramConfig["MaxMemory"].get<size_t>();
206 }
207
208 if (paramConfig.contains("CorrType")) {
209 int corrTypeInt = paramConfig["CorrType"].get<int>();
210 params.CorrType = static_cast<o2::base::PropagatorImpl<float>::MatCorrType>(corrTypeInt);
211 }
212
213 const auto nLayers = static_cast<size_t>(params.NLayers);
214 LOG_IF(fatal, params.LayerZ.size() != nLayers) << "Invalid ALICE3 TRK tracking parameter LayerZ: expected " << nLayers << " entries, got " << params.LayerZ.size();
215 LOG_IF(fatal, params.LayerRadii.size() != nLayers) << "Invalid ALICE3 TRK tracking parameter LayerRadii: expected " << nLayers << " entries, got " << params.LayerRadii.size();
216 LOG_IF(fatal, params.LayerxX0.size() != nLayers) << "Invalid ALICE3 TRK tracking parameter LayerxX0: expected " << nLayers << " entries, got " << params.LayerxX0.size();
217 LOG_IF(fatal, params.LayerResolution.size() != nLayers) << "Invalid ALICE3 TRK tracking parameter LayerResolution: expected " << nLayers << " entries, got " << params.LayerResolution.size();
218 LOG_IF(fatal, params.SystErrorY2.size() != nLayers) << "Invalid ALICE3 TRK tracking parameter SystErrorY2: expected " << nLayers << " entries, got " << params.SystErrorY2.size();
219 LOG_IF(fatal, params.SystErrorZ2.size() != nLayers) << "Invalid ALICE3 TRK tracking parameter SystErrorZ2: expected " << nLayers << " entries, got " << params.SystErrorZ2.size();
220 LOG_IF(fatal, params.AddTimeError.size() != nLayers) << "Invalid ALICE3 TRK tracking parameter AddTimeError: expected " << nLayers << " entries, got " << params.AddTimeError.size();
221
222 LOG_IF(fatal, params.MinTrackLength > params.NLayers) << "Invalid ALICE3 TRK tracking parameter MinTrackLength: expected <= NLayers (" << params.NLayers << "), got " << params.MinTrackLength;
223 const auto minPtSize = static_cast<size_t>(params.NLayers - params.MinTrackLength + 1);
224 LOG_IF(fatal, params.MinPt.size() != minPtSize) << "Invalid ALICE3 TRK tracking parameter MinPt: expected " << minPtSize << " entries, got " << params.MinPt.size();
225
226 trackingParams.push_back(params);
227 }
228 };
229
230 if (mHitRecoConfig.contains("trackingparams") && mHitRecoConfig["trackingparams"].is_array()) {
231 loadTrackingParamsFromJson(trackingParams, mHitRecoConfig["trackingparams"]);
232 } else if (mClusterRecoConfig.contains("trackingparams") && mClusterRecoConfig["trackingparams"].is_array()) {
233 loadTrackingParamsFromJson(trackingParams, mClusterRecoConfig["trackingparams"]);
234 } else {
235 LOGP(fatal, "No trackingparams field found in configuration or it is not an array. Returning empty vector.");
236 return trackingParams;
237 }
238
239 LOGP(info, "Loaded {} tracking parameter sets from configuration", trackingParams.size());
240 return trackingParams;
241}
242
244{
245 if (mMemoryPool.get() == nullptr) {
246 mMemoryPool = std::make_shared<its::BoundedMemoryResource>();
247 }
248 if (mTaskArena.get() == nullptr) {
249 mTaskArena = std::make_shared<tbb::task_arena>(1);
250 }
251
252 auto trackingParams = createTrackingParamsFromConfig();
253
254 auto cput = mTimer.CpuTime();
255 auto realt = mTimer.RealTime();
256 mTimer.Start(false);
257
258 const bool useGPU = mDeviceType != o2::gpu::gpudatatypes::DeviceType::CPU;
259#ifndef TRK_HAS_GPU_TRACKING
260 if (useGPU) {
261 LOGP(fatal, "TRK GPU tracking was requested but this build has no TRK GPU tracking backend");
262 }
263#else
264#ifdef TRK_HAS_CUDA_TRACKING
265 if (useGPU && mDeviceType != o2::gpu::gpudatatypes::DeviceType::CUDA) {
266 LOGP(fatal, "This build provides the CUDA TRK tracking backend only, but device type {} was requested", static_cast<int>(mDeviceType));
267 }
268#elif defined(TRK_HAS_HIP_TRACKING)
269 if (useGPU && mDeviceType != o2::gpu::gpudatatypes::DeviceType::HIP) {
270 LOGP(fatal, "This build provides the HIP TRK tracking backend only, but device type {} was requested", static_cast<int>(mDeviceType));
271 }
272#endif
273#endif
274
275 auto runTracking = [&](auto& timeFrame, auto& trackerTraits) {
276 o2::its::Tracker<11> itsTracker(&trackerTraits);
277 timeFrame.setMemoryPool(mMemoryPool);
278 trackerTraits.setMemoryPool(mMemoryPool);
279 trackerTraits.setNThreads(mTaskArena->max_concurrency(), mTaskArena);
280 trackerTraits.adoptTimeFrame(static_cast<o2::its::TimeFrame<11>*>(&timeFrame));
281 itsTracker.adoptTimeFrame(timeFrame);
282 trackerTraits.updateTrackingParameters(trackingParams);
283
284 int nRofs{0};
285 if (!mHitRecoConfig.empty()) {
286 TFile hitsFile(mHitRecoConfig["inputfiles"]["hits"].get<std::string>().c_str(), "READ");
287 TFile mcHeaderFile(mHitRecoConfig["inputfiles"]["mcHeader"].get<std::string>().c_str(), "READ");
288 TTree* hitsTree = hitsFile.Get<TTree>("o2sim");
289 std::vector<o2::trk::Hit>* trkHit = nullptr;
290 hitsTree->SetBranchAddress("TRKHit", &trkHit);
291
292 TTree* mcHeaderTree = mcHeaderFile.Get<TTree>("o2sim");
293 auto mcheader = new o2::dataformats::MCEventHeader;
294 mcHeaderTree->SetBranchAddress("MCEventHeader.", &mcheader);
295
296 o2::base::GeometryManager::loadGeometry(mHitRecoConfig["inputfiles"]["geometry"].get<std::string>().c_str(), false, true);
297 auto* gman = o2::trk::GeometryTGeo::Instance();
298
299 const Long64_t nEvents{hitsTree->GetEntries()};
300 LOGP(info, "Starting {} reconstruction from hits for {} events", trackerTraits.getName(), nEvents);
301
302 trackerTraits.setBz(mHitRecoConfig["geometry"]["bz"].get<float>());
303 auto field = new field::MagneticField("ALICE3Mag", "ALICE 3 Magnetic Field", mHitRecoConfig["geometry"]["bz"].get<float>() / 5.f, 0.0, o2::field::MagFieldParam::k5kGUniform);
304 TGeoGlobalMagField::Instance()->SetField(field);
305 TGeoGlobalMagField::Instance()->Lock();
306
307 nRofs = timeFrame.loadROFsFromHitTree(hitsTree, gman, mHitRecoConfig);
308 const int inROFpileup{mHitRecoConfig.contains("inROFpileup") ? mHitRecoConfig["inROFpileup"].get<int>() : 1};
309 timeFrame.getPrimaryVerticesFromMC(mcHeaderTree, nRofs, nEvents, inROFpileup);
310 } else if (!mClusterRecoConfig.empty()) {
311 LOGP(info, "Starting {} reconstruction from clusters", trackerTraits.getName());
312
313 o2::base::GeometryManager::loadGeometry(mClusterRecoConfig["inputfiles"]["geometry"].get<std::string>().c_str(), false, true);
315
316 trackerTraits.setBz(mClusterRecoConfig["geometry"]["bz"].get<float>());
317 auto field = new field::MagneticField("ALICE3Mag", "ALICE 3 Magnetic Field", mClusterRecoConfig["geometry"]["bz"].get<float>() / 5.f, 0.0, o2::field::MagFieldParam::k5kGUniform);
318 TGeoGlobalMagField::Instance()->SetField(field);
319 TGeoGlobalMagField::Instance()->Lock();
320
321 constexpr int nLayers{11};
322 std::array<gsl::span<const o2::trk::Cluster>, nLayers> layerClusters;
323 std::array<gsl::span<const unsigned char>, nLayers> layerPatterns;
324 std::array<gsl::span<const o2::trk::ROFRecord>, nLayers> layerROFs;
325 std::array<const dataformats::MCTruthContainer<MCCompLabel>*, nLayers> layerLabels{};
326
327 size_t nInputRofs{0};
328 for (int iLayer = 0; iLayer < nLayers; ++iLayer) {
329 layerClusters[iLayer] = pc.inputs().get<gsl::span<o2::trk::Cluster>>(std::format("compClusters_{}", iLayer));
330 layerPatterns[iLayer] = pc.inputs().get<gsl::span<unsigned char>>(std::format("patterns_{}", iLayer));
331 layerROFs[iLayer] = pc.inputs().get<gsl::span<o2::trk::ROFRecord>>(std::format("ROframes_{}", iLayer));
332 nInputRofs = std::max(nInputRofs, layerROFs[iLayer].size());
333 if (mIsMC) {
334 layerLabels[iLayer] = pc.inputs().get<const dataformats::MCTruthContainer<MCCompLabel>*>(std::format("trkmclabels_{}", iLayer)).release();
335 }
336 }
337
338 timeFrame.deriveAndInitTiming(layerROFs);
339
340 const float yPlaneMLOT = 0.0010f;
341 nRofs = timeFrame.loadROFrameData(layerROFs, layerClusters, layerPatterns, mIsMC ? &layerLabels : nullptr, yPlaneMLOT);
342 timeFrame.addTruthSeedingVertices();
343 }
344
345 const auto trackingLoopStart = std::chrono::steady_clock::now();
346 for (size_t iter{0}; iter < trackingParams.size(); ++iter) {
347 LOGP(info, "{}", trackingParams[iter].asString());
348 trackerTraits.initialiseTimeFrame(iter);
349 trackerTraits.computeLayerTracklets(iter, -1);
350 LOGP(info, "Number of tracklets in iteration {}: {}", iter, timeFrame.getNumberOfTracklets());
351 trackerTraits.computeLayerCells(iter);
352 LOGP(info, "Number of cells in iteration {}: {}", iter, timeFrame.getNumberOfCells());
353 trackerTraits.findCellsNeighbours(iter);
354 LOGP(info, "Number of cell neighbours in iteration {}: {}", iter, timeFrame.getNumberOfNeighbours());
355 trackerTraits.findRoads(iter);
356 LOGP(info, "Number of roads in iteration {}: {}", iter, timeFrame.getNumberOfTracks());
357 }
358 const auto trackingLoopElapsedMs = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now() - trackingLoopStart).count();
359 LOGP(info, "Tracking iterations block took {} ms", trackingLoopElapsedMs);
360
361 if (mIsMC) {
362 itsTracker.computeTracksMClabels();
363 }
364
365 const auto& tracks = timeFrame.getTracks();
366 const auto& labels = timeFrame.getTracksLabel();
367 std::vector<o2::its::TrackITS> allTracks(tracks.begin(), tracks.end());
368 std::vector<o2::MCCompLabel> allLabels;
369
370 int totalTracks = allTracks.size();
371 int goodTracks = 0;
372 int fakeTracks = 0;
373
374 if (mIsMC) {
375 allLabels.assign(labels.begin(), labels.end());
376 for (const auto& label : allLabels) {
377 if (label.isFake()) {
378 ++fakeTracks;
379 } else {
380 ++goodTracks;
381 }
382 }
383 }
384
385 LOGP(info, "=== Tracking Summary ===");
386 LOGP(info, "Total tracks reconstructed: {}", totalTracks);
387 LOGP(info, "Good tracks: {} ({:.1f}%)", goodTracks, totalTracks > 0 ? 100.0 * goodTracks / totalTracks : 0);
388 LOGP(info, "Fake tracks: {} ({:.1f}%)", fakeTracks, totalTracks > 0 ? 100.0 * fakeTracks / totalTracks : 0);
389
390 const auto& rofView = timeFrame.getROFOverlapTableView();
391 const auto& clockLayer = rofView.getClockLayer();
392 const int clockLayerId = rofView.getClock();
393 const int64_t anchorBC = timeFrame.getTFAnchorIR().toLong();
394
395 int highestROF = static_cast<int>(clockLayer.mNROFsTF);
396 for (const auto& trc : allTracks) {
397 highestROF = std::max(highestROF, static_cast<int>(clockLayer.getROF(trc.getTimeStamp())));
398 }
399 for (const auto& vtx : timeFrame.getPrimaryVertices()) {
400 highestROF = std::max(highestROF, static_cast<int>(clockLayer.getROF(vtx.getTimeStamp().lower())));
401 }
402
403 std::vector<o2::trk::ROFRecord> allTrackROFs(highestROF);
404 for (size_t iROF = 0; iROF < allTrackROFs.size(); ++iROF) {
405 auto& rof = allTrackROFs[iROF];
407 ir.setFromLong(anchorBC + static_cast<int64_t>(clockLayer.getROFStartInBC(iROF)));
408 rof.setBCData(ir);
409 rof.setROFrame(iROF);
410 rof.setFirstEntry(0);
411 rof.setNEntries(0);
412 }
413
414 std::vector<int> rofEntries(highestROF + 1, 0);
415 for (const auto& trc : allTracks) {
416 const int rof = static_cast<int>(clockLayer.getROF(trc.getTimeStamp()));
417 if (rof >= 0 && rof < highestROF) {
418 ++rofEntries[rof];
419 }
420 }
421 std::exclusive_scan(rofEntries.begin(), rofEntries.end(), rofEntries.begin(), 0);
422
423 std::vector<o2::dataformats::IRFrame> irFrames;
424 irFrames.reserve(allTrackROFs.size());
425 const auto& maskView = timeFrame.getROFMaskView();
426 const auto rofLenMinus1 = clockLayer.mROFLength > 0 ? clockLayer.mROFLength - 1 : 0;
427 for (size_t iROF = 0; iROF < allTrackROFs.size(); ++iROF) {
428 allTrackROFs[iROF].setFirstEntry(rofEntries[iROF]);
429 allTrackROFs[iROF].setNEntries(rofEntries[iROF + 1] - rofEntries[iROF]);
430 if (maskView.isROFEnabled(clockLayerId, static_cast<int>(iROF))) {
431 const auto& bcStart = allTrackROFs[iROF].getBCData();
432 auto& irFrame = irFrames.emplace_back(bcStart, bcStart + rofLenMinus1);
433 irFrame.info = allTrackROFs[iROF].getNEntries();
434 }
435 }
436
437 pc.outputs().snapshot(o2::framework::Output{"TRK", "TRACKS", 0}, allTracks);
438 pc.outputs().snapshot(o2::framework::Output{"TRK", "TRACKSROF", 0}, allTrackROFs);
439 pc.outputs().snapshot(o2::framework::Output{"TRK", "IRFRAMES", 0}, irFrames);
440 if (mIsMC) {
441 pc.outputs().snapshot(o2::framework::Output{"TRK", "TRACKSMCTR", 0}, allLabels);
442 }
443
444 LOGP(info, "TRK pushed {} tracks in {} ROFs and {} IR frames{}",
445 allTracks.size(), allTrackROFs.size(), irFrames.size(),
446 mIsMC ? " (with MC labels)" : "");
447
448 timeFrame.wipe();
449 };
450
451#ifdef TRK_HAS_GPU_TRACKING
452 if (useGPU) {
454 o2::its::TrackerTraitsGPU<11> itsTrackerTraits;
455 if (!mGPUAllocator) {
456 mGPUAllocator = std::make_shared<o2::trk::GPUExternalAllocator>();
457 }
458 timeFrame.setFrameworkAllocator(mGPUAllocator.get());
459 runTracking(timeFrame, itsTrackerTraits);
460 } else
461#endif
462 {
463 o2::trk::TimeFrame<11> timeFrame;
464 o2::its::TrackerTraits<11> itsTrackerTraits;
465 runTracking(timeFrame, itsTrackerTraits);
466 }
467
470
471 mTimer.Stop();
472 LOGP(info, "CPU Reconstruction time for this TF {} s (cpu), {} s (wall)", mTimer.CpuTime() - cput, mTimer.RealTime() - realt);
473}
474
476{
477 LOGF(info, "TRK CA-Tracker total timing: Cpu: %.3e Real: %.3e s in %d slots", mTimer.CpuTime(), mTimer.RealTime(), mTimer.Counter() - 1);
478}
479
480DataProcessorSpec getTrackerSpec(bool useMC, const std::string& hitRecoConfig, const std::string& clusterRecoConfig, o2::gpu::gpudatatypes::DeviceType dType)
481{
482 std::vector<InputSpec> inputs;
483 std::vector<OutputSpec> outputs;
484 outputs.emplace_back("TRK", "TRACKS", 0, Lifetime::Timeframe);
485 outputs.emplace_back("TRK", "TRACKSROF", 0, Lifetime::Timeframe);
486 outputs.emplace_back("TRK", "IRFRAMES", 0, Lifetime::Timeframe);
487 auto ggRequest = std::make_shared<o2::base::GRPGeomRequest>(false, // orbitResetTime
488 false, // GRPECS=true
489 false, // GRPLHCIF
490 false, // GRPMagField
491 false, // askMatLUT
492 o2::base::GRPGeomRequest::None, // geometry, but ignored until it will be put in the CCDB
493 inputs,
494 true);
495
496 if (!hitRecoConfig.empty()) {
497 if (useMC) {
498 outputs.emplace_back("TRK", "TRACKSMCTR", 0, Lifetime::Timeframe);
499 }
500 return DataProcessorSpec{
501 "trk-hits-tracker",
502 {},
503 outputs,
504 AlgorithmSpec{adaptFromTask<TrackerDPL>(ggRequest,
505 useMC,
506 hitRecoConfig,
507 clusterRecoConfig,
508 dType)},
509 Options{ConfigParamSpec{"max-loops", VariantType::Int, 1, {"max number of loops"}}
510#ifdef O2_WITH_ACTS
511 ,
512 {"useACTS", o2::framework::VariantType::Bool, false, {"Use ACTS for tracking"}}
513#endif
514 }};
515 }
516
517 inputs.emplace_back("dummy", "TRK", "DUMMY", 0, Lifetime::Timeframe);
518
519 if (!clusterRecoConfig.empty()) {
520 inputs.pop_back();
521 constexpr int nLayers{11};
522 for (int iLayer = 0; iLayer < nLayers; ++iLayer) {
523 inputs.emplace_back(std::format("compClusters_{}", iLayer), "TRK", "COMPCLUSTERS", iLayer, Lifetime::Timeframe);
524 inputs.emplace_back(std::format("patterns_{}", iLayer), "TRK", "PATTERNS", iLayer, Lifetime::Timeframe);
525 inputs.emplace_back(std::format("ROframes_{}", iLayer), "TRK", "CLUSTERSROF", iLayer, Lifetime::Timeframe);
526 if (useMC) {
527 inputs.emplace_back(std::format("trkmclabels_{}", iLayer), "TRK", "CLUSTERSMCTR", iLayer, Lifetime::Timeframe);
528 }
529 }
530 }
531
532 if (useMC) {
533 outputs.emplace_back("TRK", "TRACKSMCTR", 0, Lifetime::Timeframe);
534 }
535
536 return DataProcessorSpec{
537 "trk-tracker",
538 inputs,
539 outputs,
540 AlgorithmSpec{adaptFromTask<TrackerDPL>(ggRequest,
541 useMC,
542 hitRecoConfig,
543 clusterRecoConfig,
544 dType)},
545 Options{}};
546}
547
548} // namespace trk
549} // namespace o2
std::vector< std::string > labels
std::string asString(TDataMember const &dm, char *pointer)
Definition of the GeometryManager class.
CPU TRK TimeFrame wrapper.
Definition of the TRK Hit class.
Class to delimit start and end IR of certain time period.
Definition of a container to keep Monte Carlo truth external to simulation objects.
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.
GPU TRK TimeFrame wrapper.
static void loadGeometry(std::string_view geomFilePath="", bool applyMisalignment=false, bool preferAlignedFile=true)
A container to hold and manage MC truth information/labels.
void snapshot(const Output &spec, T const &object)
ConfigParamRegistry const & options()
Definition InitContext.h:33
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.
void adoptTimeFrame(TimeFrame< NLayers > &tf)
Definition Tracker.cxx:226
void computeTracksMClabels()
Definition Tracker.cxx:122
static GeometryTGeo * Instance()
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
TrackerDPL(std::shared_ptr< o2::base::GRPGeomRequest > gr, bool isMC, const std::string &hitRecoConfig, const std::string &clusterRecoConfig, gpu::gpudatatypes::DeviceType dType=gpu::gpudatatypes::DeviceType::CPU)
GLsizeiptr size
Definition glcorearb.h:659
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
constexpr int nLayers
Definition Specs.h:47
framework::DataProcessorSpec getTrackerSpec(bool useMC, const std::string &hitRecoConfig, const std::string &clusterRecoConfig, 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 setFromLong(int64_t l)
const int nEvents
Definition test_Fifo.cxx:27
o2::InteractionRecord ir(0, 0)