42#include <TGeoGlobalMagField.h>
67 constexpr const char* kGPUBackendFunction =
"runALICE3GPUTracking";
72 const std::string& hitRecoConfigFileName,
73 const std::string& clusterRecoConfigFileName,
77 if (!hitRecoConfigFileName.empty()) {
78 std::ifstream configFile(hitRecoConfigFileName);
79 mHitRecoConfig = nlohmann::json::parse(configFile);
81 if (!clusterRecoConfigFileName.empty()) {
82 std::ifstream configFile(clusterRecoConfigFileName);
83 mClusterRecoConfig = nlohmann::json::parse(configFile);
87 mTrackingThreads = std::max(1, trackingThreads);
99 LOGF(info,
"CPU Reconstruction total timing: Cpu: %.3e Real: %.3e s in %d slots", mTimer.CpuTime(), mTimer.RealTime(), mTimer.Counter() - 1);
102std::vector<o2::its::TrackingParameters> TrackerDPL::createTrackingParamsFromConfig()
104 std::vector<o2::its::TrackingParameters> trackingParams;
105 auto loadTrackingParamsFromJson = [](std::vector<o2::its::TrackingParameters>& trackingParams,
const nlohmann::json& paramConfigJson) {
106 for (
const auto& paramConfig : paramConfigJson) {
109 if (paramConfig.contains(
name)) {
110 if (paramConfig[
name].get<bool>()) {
113 params.PassFlags.reset(step);
118 if (paramConfig.contains(
"NLayers")) {
119 params.NLayers = paramConfig[
"NLayers"].get<
int>();
121 if (paramConfig.contains(
"ZBins")) {
122 params.ZBins = paramConfig[
"ZBins"].get<
int>();
124 if (paramConfig.contains(
"PhiBins")) {
125 params.PhiBins = paramConfig[
"PhiBins"].get<
int>();
127 if (paramConfig.contains(
"SharedMaxClusters")) {
128 params.SharedMaxClusters = paramConfig[
"SharedMaxClusters"].get<
int>();
130 if (paramConfig.contains(
"MinTrackLength")) {
131 params.MinTrackLength = paramConfig[
"MinTrackLength"].get<
int>();
133 if (paramConfig.contains(
"ReseedIfShorter")) {
134 params.ReseedIfShorter = paramConfig[
"ReseedIfShorter"].get<
int>();
136 if (paramConfig.contains(
"StartLayerMask")) {
137 params.StartLayerMask = paramConfig[
"StartLayerMask"].get<uint16_t>();
140 if (paramConfig.contains(
"NSigmaCut")) {
141 params.NSigmaCut = paramConfig[
"NSigmaCut"].get<
float>();
143 if (paramConfig.contains(
"PVres")) {
144 params.PVres = paramConfig[
"PVres"].get<
float>();
146 if (paramConfig.contains(
"TrackletMinPt")) {
147 params.TrackletMinPt = paramConfig[
"TrackletMinPt"].get<
float>();
149 if (paramConfig.contains(
"CellDeltaTanLambdaSigma")) {
150 params.CellDeltaTanLambdaSigma = paramConfig[
"CellDeltaTanLambdaSigma"].get<
float>();
152 if (paramConfig.contains(
"MaxChi2ClusterAttachment")) {
153 params.MaxChi2ClusterAttachment = paramConfig[
"MaxChi2ClusterAttachment"].get<
float>();
155 if (paramConfig.contains(
"MaxChi2NDF")) {
156 params.MaxChi2NDF = paramConfig[
"MaxChi2NDF"].get<
float>();
159 if (paramConfig.contains(
"UseDiamond")) {
160 params.UseDiamond = paramConfig[
"UseDiamond"].get<
bool>();
162 if (paramConfig.contains(
"AllowSharingFirstCluster")) {
163 params.AllowSharingFirstCluster = paramConfig[
"AllowSharingFirstCluster"].get<
bool>();
165 if (paramConfig.contains(
"RepeatRefitOut")) {
166 params.RepeatRefitOut = paramConfig[
"RepeatRefitOut"].get<
bool>();
168 if (paramConfig.contains(
"ShiftRefToCluster")) {
169 params.ShiftRefToCluster = paramConfig[
"ShiftRefToCluster"].get<
bool>();
171 if (paramConfig.contains(
"PerPrimaryVertexProcessing")) {
172 params.PerPrimaryVertexProcessing = paramConfig[
"PerPrimaryVertexProcessing"].get<
bool>();
174 if (paramConfig.contains(
"SaveTimeBenchmarks")) {
175 params.SaveTimeBenchmarks = paramConfig[
"SaveTimeBenchmarks"].get<
bool>();
177 if (paramConfig.contains(
"DoUPCIteration")) {
178 params.DoUPCIteration = paramConfig[
"DoUPCIteration"].get<
bool>();
180 if (paramConfig.contains(
"FataliseUponFailure")) {
181 params.FataliseUponFailure = paramConfig[
"FataliseUponFailure"].get<
bool>();
183 if (paramConfig.contains(
"CreateArtefactLabels")) {
184 params.CreateArtefactLabels = paramConfig[
"CreateArtefactLabels"].get<
bool>();
186 if (paramConfig.contains(
"TrackFollower")) {
187 const auto mode = paramConfig[
"TrackFollower"].get<std::string>();
188 if (
mode ==
"top" ||
mode ==
"outward") {
190 }
else if (
mode ==
"bot" ||
mode ==
"bottom" ||
mode ==
"inward") {
192 }
else if (
mode ==
"mix" ||
mode ==
"both") {
195 }
else if (
mode !=
"off") {
196 LOGP(fatal,
"Invalid ALICE3 TRK tracking parameter TrackFollower: {}",
mode);
199 if (paramConfig.contains(
"TrackFollowerNSigmaCutZ")) {
200 params.TrackFollowerNSigmaCutZ = paramConfig[
"TrackFollowerNSigmaCutZ"].get<
float>();
202 if (paramConfig.contains(
"TrackFollowerNSigmaCutPhi")) {
203 params.TrackFollowerNSigmaCutPhi = paramConfig[
"TrackFollowerNSigmaCutPhi"].get<
float>();
205 if (paramConfig.contains(
"TrackFollowerMaxHypotheses")) {
206 params.TrackFollowerMaxHypotheses = std::max(1, paramConfig[
"TrackFollowerMaxHypotheses"].get<int>());
217 if (paramConfig.contains(
"PrintMemory")) {
218 params.PrintMemory = paramConfig[
"PrintMemory"].get<
bool>();
220 if (paramConfig.contains(
"DropTFUponFailure")) {
221 params.DropTFUponFailure = paramConfig[
"DropTFUponFailure"].get<
bool>();
224 if (paramConfig.contains(
"LayerZ")) {
225 params.LayerZ = paramConfig[
"LayerZ"].get<std::vector<float>>();
227 if (paramConfig.contains(
"LayerRadii")) {
228 params.LayerRadii = paramConfig[
"LayerRadii"].get<std::vector<float>>();
230 if (paramConfig.contains(
"LayerxX0")) {
231 params.LayerxX0 = paramConfig[
"LayerxX0"].get<std::vector<float>>();
233 if (paramConfig.contains(
"LayerResolution")) {
234 params.LayerResolution = paramConfig[
"LayerResolution"].get<std::vector<float>>();
236 if (paramConfig.contains(
"SystErrorY2")) {
237 params.SystErrorY2 = paramConfig[
"SystErrorY2"].get<std::vector<float>>();
239 if (paramConfig.contains(
"SystErrorZ2")) {
240 params.SystErrorZ2 = paramConfig[
"SystErrorZ2"].get<std::vector<float>>();
242 if (paramConfig.contains(
"MinPt")) {
243 params.MinPt = paramConfig[
"MinPt"].get<std::vector<float>>();
245 if (paramConfig.contains(
"AddTimeError")) {
246 params.AddTimeError = paramConfig[
"AddTimeError"].get<std::vector<UInt_t>>();
249 if (paramConfig.contains(
"Diamond") && paramConfig[
"Diamond"].is_array() && paramConfig[
"Diamond"].size() == 3) {
250 params.Diamond[0] = paramConfig[
"Diamond"][0].get<
float>();
251 params.Diamond[1] = paramConfig[
"Diamond"][1].get<
float>();
252 params.Diamond[2] = paramConfig[
"Diamond"][2].get<
float>();
255 if (paramConfig.contains(
"MaxMemory")) {
256 params.MaxMemory = paramConfig[
"MaxMemory"].get<
size_t>();
259 if (paramConfig.contains(
"CorrType")) {
260 int corrTypeInt = paramConfig[
"CorrType"].get<
int>();
265 LOG_IF(fatal,
params.LayerZ.size() != nLayers) <<
"Invalid ALICE3 TRK tracking parameter LayerZ: expected " <<
nLayers <<
" entries, got " <<
params.LayerZ.size();
266 LOG_IF(fatal,
params.LayerRadii.size() != nLayers) <<
"Invalid ALICE3 TRK tracking parameter LayerRadii: expected " <<
nLayers <<
" entries, got " <<
params.LayerRadii.size();
267 LOG_IF(fatal,
params.LayerxX0.size() != nLayers) <<
"Invalid ALICE3 TRK tracking parameter LayerxX0: expected " <<
nLayers <<
" entries, got " <<
params.LayerxX0.size();
268 LOG_IF(fatal,
params.LayerResolution.size() != nLayers) <<
"Invalid ALICE3 TRK tracking parameter LayerResolution: expected " <<
nLayers <<
" entries, got " <<
params.LayerResolution.size();
269 LOG_IF(fatal,
params.SystErrorY2.size() != nLayers) <<
"Invalid ALICE3 TRK tracking parameter SystErrorY2: expected " <<
nLayers <<
" entries, got " <<
params.SystErrorY2.size();
270 LOG_IF(fatal,
params.SystErrorZ2.size() != nLayers) <<
"Invalid ALICE3 TRK tracking parameter SystErrorZ2: expected " <<
nLayers <<
" entries, got " <<
params.SystErrorZ2.size();
271 LOG_IF(fatal,
params.AddTimeError.size() != nLayers) <<
"Invalid ALICE3 TRK tracking parameter AddTimeError: expected " <<
nLayers <<
" entries, got " <<
params.AddTimeError.size();
273 LOG_IF(fatal,
params.MinTrackLength >
params.NLayers) <<
"Invalid ALICE3 TRK tracking parameter MinTrackLength: expected <= NLayers (" <<
params.NLayers <<
"), got " <<
params.MinTrackLength;
274 const auto minPtSize =
static_cast<size_t>(
params.NLayers -
params.MinTrackLength + 1);
275 LOG_IF(fatal,
params.MinPt.size() != minPtSize) <<
"Invalid ALICE3 TRK tracking parameter MinPt: expected " << minPtSize <<
" entries, got " <<
params.MinPt.size();
277 trackingParams.push_back(
params);
281 if (mHitRecoConfig.contains(
"trackingparams") && mHitRecoConfig[
"trackingparams"].is_array()) {
282 loadTrackingParamsFromJson(trackingParams, mHitRecoConfig[
"trackingparams"]);
283 }
else if (mClusterRecoConfig.contains(
"trackingparams") && mClusterRecoConfig[
"trackingparams"].is_array()) {
284 loadTrackingParamsFromJson(trackingParams, mClusterRecoConfig[
"trackingparams"]);
286 LOGP(fatal,
"No trackingparams field found in configuration or it is not an array. Returning empty vector.");
287 return trackingParams;
290 LOGP(info,
"Loaded {} tracking parameter sets from configuration", trackingParams.size());
291 return trackingParams;
296 if (mMemoryPool.get() ==
nullptr) {
297 mMemoryPool = std::make_shared<its::BoundedMemoryResource>();
299 if (mTaskArena.get() ==
nullptr) {
300 mTaskArena = std::make_shared<tbb::task_arena>(mTrackingThreads);
303 mTrackingParams = createTrackingParamsFromConfig();
305 auto cput = mTimer.CpuTime();
306 auto realt = mTimer.RealTime();
323 LOGP(info,
"CPU Reconstruction time for this TF {} s (cpu), {} s (wall)", mTimer.CpuTime() - cput, mTimer.RealTime() - realt);
328 auto& loader = ALICE3TrackingBackendLoader::Instance();
329 switch (mDeviceType) {
331#ifdef TRK_HAS_CUDA_TRACKING
335 LOGP(fatal,
"CUDA TRK GPU tracking was requested but this build has no CUDA TRK GPU tracking backend");
338#ifdef TRK_HAS_HIP_TRACKING
342 LOGP(fatal,
"HIP TRK GPU tracking was requested but this build has no HIP TRK GPU tracking backend");
345 LOGP(fatal,
"Unsupported TRK GPU device type {}",
static_cast<int>(mDeviceType));
351 LOGF(info,
"TRK CA-Tracker total timing: Cpu: %.3e Real: %.3e s in %d slots", mTimer.CpuTime(), mTimer.RealTime(), mTimer.Counter() - 1);
356 std::vector<InputSpec> inputs;
357 std::vector<OutputSpec> outputs;
358 outputs.emplace_back(
"TRK",
"TRACKS", 0, Lifetime::Timeframe);
359 outputs.emplace_back(
"TRK",
"TRACKSROF", 0, Lifetime::Timeframe);
360 outputs.emplace_back(
"TRK",
"IRFRAMES", 0, Lifetime::Timeframe);
361 auto ggRequest = std::make_shared<o2::base::GRPGeomRequest>(
false,
370 if (!hitRecoConfig.empty()) {
372 outputs.emplace_back(
"TRK",
"TRACKSMCTR", 0, Lifetime::Timeframe);
392 inputs.emplace_back(
"dummy",
"TRK",
"DUMMY", 0, Lifetime::Timeframe);
394 if (!clusterRecoConfig.empty()) {
396 constexpr int nLayers{11};
397 for (
int iLayer = 0; iLayer < nLayers; ++iLayer) {
398 inputs.emplace_back(std::format(
"compClusters_{}", iLayer),
"TRK",
"COMPCLUSTERS", iLayer, Lifetime::Timeframe);
399 inputs.emplace_back(std::format(
"patterns_{}", iLayer),
"TRK",
"PATTERNS", iLayer, Lifetime::Timeframe);
400 inputs.emplace_back(std::format(
"ROframes_{}", iLayer),
"TRK",
"CLUSTERSROF", iLayer, Lifetime::Timeframe);
402 inputs.emplace_back(std::format(
"trkmclabels_{}", iLayer),
"TRK",
"CLUSTERSMCTR", iLayer, Lifetime::Timeframe);
408 outputs.emplace_back(
"TRK",
"TRACKSMCTR", 0, Lifetime::Timeframe);
#define O2DLLoaderDef(classname)
#define O2DLLoaderImpl(classname)
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.
T get(const char *key) const
ConfigParamRegistry const & options()
ServiceRegistryRef services()
The services registry associated with this processing context.
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, int trackingThreads=1)
void runTracking(framework::ProcessingContext &pc, TimeFrameT &timeFrame, TrackerTraitsT &trackerTraits)
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
void set(const std::string &s, int base=DefaultBase)
GLuint const GLchar * name
GLenum const GLfloat * params
@ Me
Only quit this data processor.
std::vector< ConfigParamSpec > Options
const bool const int nLayers
framework::DataProcessorSpec getTrackerSpec(bool useMC, const std::string &hitRecoConfig, const std::string &clusterRecoConfig, gpu::gpudatatypes::DeviceType dType=gpu::gpudatatypes::DeviceType::CPU, int trackingThreads=1)
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...