30#include <TGeoGlobalMagField.h>
48 const std::string& hitRecoConfigFileName,
51 if (!hitRecoConfigFileName.empty()) {
52 std::ifstream configFile(hitRecoConfigFileName);
53 mHitRecoConfig = nlohmann::json::parse(configFile);
76 LOGF(info,
"CPU Reconstruction total timing: Cpu: %.3e Real: %.3e s in %d slots", mTimer.CpuTime(), mTimer.RealTime(), mTimer.Counter() - 1);
79std::vector<o2::its::TrackingParameters> TrackerDPL::createTrackingParamsFromConfig()
81 std::vector<o2::its::TrackingParameters> trackingParams;
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;
88 for (
const auto& paramConfig : mHitRecoConfig[
"trackingparams"]) {
92 if (paramConfig.contains(
"NLayers")) {
95 if (paramConfig.contains(
"DeltaROF")) {
96 params.DeltaROF = paramConfig[
"DeltaROF"].get<
int>();
98 if (paramConfig.contains(
"ZBins")) {
99 params.ZBins = paramConfig[
"ZBins"].get<
int>();
101 if (paramConfig.contains(
"PhiBins")) {
102 params.PhiBins = paramConfig[
"PhiBins"].get<
int>();
104 if (paramConfig.contains(
"nROFsPerIterations")) {
105 params.nROFsPerIterations = paramConfig[
"nROFsPerIterations"].get<
int>();
107 if (paramConfig.contains(
"ClusterSharing")) {
108 params.ClusterSharing = paramConfig[
"ClusterSharing"].get<
int>();
110 if (paramConfig.contains(
"MinTrackLength")) {
111 params.MinTrackLength = paramConfig[
"MinTrackLength"].get<
int>();
113 if (paramConfig.contains(
"ReseedIfShorter")) {
114 params.ReseedIfShorter = paramConfig[
"ReseedIfShorter"].get<
int>();
116 if (paramConfig.contains(
"StartLayerMask")) {
117 params.StartLayerMask = paramConfig[
"StartLayerMask"].get<uint16_t>();
121 if (paramConfig.contains(
"NSigmaCut")) {
122 params.NSigmaCut = paramConfig[
"NSigmaCut"].get<
float>();
124 if (paramConfig.contains(
"PVres")) {
125 params.PVres = paramConfig[
"PVres"].get<
float>();
127 if (paramConfig.contains(
"TrackletMinPt")) {
128 params.TrackletMinPt = paramConfig[
"TrackletMinPt"].get<
float>();
130 if (paramConfig.contains(
"TrackletsPerClusterLimit")) {
131 params.TrackletsPerClusterLimit = paramConfig[
"TrackletsPerClusterLimit"].get<
float>();
133 if (paramConfig.contains(
"CellDeltaTanLambdaSigma")) {
134 params.CellDeltaTanLambdaSigma = paramConfig[
"CellDeltaTanLambdaSigma"].get<
float>();
136 if (paramConfig.contains(
"CellsPerClusterLimit")) {
137 params.CellsPerClusterLimit = paramConfig[
"CellsPerClusterLimit"].get<
float>();
139 if (paramConfig.contains(
"MaxChi2ClusterAttachment")) {
140 params.MaxChi2ClusterAttachment = paramConfig[
"MaxChi2ClusterAttachment"].get<
float>();
142 if (paramConfig.contains(
"MaxChi2NDF")) {
143 params.MaxChi2NDF = paramConfig[
"MaxChi2NDF"].get<
float>();
145 if (paramConfig.contains(
"TrackFollowerNSigmaCutZ")) {
146 params.TrackFollowerNSigmaCutZ = paramConfig[
"TrackFollowerNSigmaCutZ"].get<
float>();
148 if (paramConfig.contains(
"TrackFollowerNSigmaCutPhi")) {
149 params.TrackFollowerNSigmaCutPhi = paramConfig[
"TrackFollowerNSigmaCutPhi"].get<
float>();
153 if (paramConfig.contains(
"UseDiamond")) {
154 params.UseDiamond = paramConfig[
"UseDiamond"].get<
bool>();
156 if (paramConfig.contains(
"AllowSharingFirstCluster")) {
157 params.AllowSharingFirstCluster = paramConfig[
"AllowSharingFirstCluster"].get<
bool>();
159 if (paramConfig.contains(
"RepeatRefitOut")) {
160 params.RepeatRefitOut = paramConfig[
"RepeatRefitOut"].get<
bool>();
162 if (paramConfig.contains(
"ShiftRefToCluster")) {
163 params.ShiftRefToCluster = paramConfig[
"ShiftRefToCluster"].get<
bool>();
165 if (paramConfig.contains(
"FindShortTracks")) {
166 params.FindShortTracks = paramConfig[
"FindShortTracks"].get<
bool>();
168 if (paramConfig.contains(
"PerPrimaryVertexProcessing")) {
169 params.PerPrimaryVertexProcessing = paramConfig[
"PerPrimaryVertexProcessing"].get<
bool>();
171 if (paramConfig.contains(
"SaveTimeBenchmarks")) {
172 params.SaveTimeBenchmarks = paramConfig[
"SaveTimeBenchmarks"].get<
bool>();
174 if (paramConfig.contains(
"DoUPCIteration")) {
175 params.DoUPCIteration = paramConfig[
"DoUPCIteration"].get<
bool>();
177 if (paramConfig.contains(
"FataliseUponFailure")) {
178 params.FataliseUponFailure = paramConfig[
"FataliseUponFailure"].get<
bool>();
180 if (paramConfig.contains(
"UseTrackFollower")) {
181 params.UseTrackFollower = paramConfig[
"UseTrackFollower"].get<
bool>();
183 if (paramConfig.contains(
"UseTrackFollowerTop")) {
184 params.UseTrackFollowerTop = paramConfig[
"UseTrackFollowerTop"].get<
bool>();
186 if (paramConfig.contains(
"UseTrackFollowerBot")) {
187 params.UseTrackFollowerBot = paramConfig[
"UseTrackFollowerBot"].get<
bool>();
189 if (paramConfig.contains(
"UseTrackFollowerMix")) {
190 params.UseTrackFollowerMix = paramConfig[
"UseTrackFollowerMix"].get<
bool>();
192 if (paramConfig.contains(
"createArtefactLabels")) {
193 params.createArtefactLabels = paramConfig[
"createArtefactLabels"].get<
bool>();
195 if (paramConfig.contains(
"PrintMemory")) {
196 params.PrintMemory = paramConfig[
"PrintMemory"].get<
bool>();
198 if (paramConfig.contains(
"DropTFUponFailure")) {
199 params.DropTFUponFailure = paramConfig[
"DropTFUponFailure"].get<
bool>();
203 if (paramConfig.contains(
"LayerZ")) {
204 params.LayerZ = paramConfig[
"LayerZ"].get<std::vector<float>>();
206 if (paramConfig.contains(
"LayerRadii")) {
207 params.LayerRadii = paramConfig[
"LayerRadii"].get<std::vector<float>>();
209 if (paramConfig.contains(
"LayerxX0")) {
210 params.LayerxX0 = paramConfig[
"LayerxX0"].get<std::vector<float>>();
212 if (paramConfig.contains(
"LayerResolution")) {
213 params.LayerResolution = paramConfig[
"LayerResolution"].get<std::vector<float>>();
215 if (paramConfig.contains(
"SystErrorY2")) {
216 params.SystErrorY2 = paramConfig[
"SystErrorY2"].get<std::vector<float>>();
218 if (paramConfig.contains(
"SystErrorZ2")) {
219 params.SystErrorZ2 = paramConfig[
"SystErrorZ2"].get<std::vector<float>>();
221 if (paramConfig.contains(
"MinPt")) {
222 params.MinPt = paramConfig[
"MinPt"].get<std::vector<float>>();
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>();
233 if (paramConfig.contains(
"MaxMemory")) {
234 params.MaxMemory = paramConfig[
"MaxMemory"].get<
size_t>();
238 if (paramConfig.contains(
"CorrType")) {
239 int corrTypeInt = paramConfig[
"CorrType"].get<
int>();
243 trackingParams.push_back(
params);
246 LOGP(info,
"Loaded {} tracking parameter sets from configuration", trackingParams.size());
247 return trackingParams;
252 auto cput = mTimer.CpuTime();
253 auto realt = mTimer.RealTime();
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);
263 TTree* mcHeaderTree = mcHeaderFile.Get<TTree>(
"o2sim");
265 mcHeaderTree->SetBranchAddress(
"MCEventHeader.", &mcheader);
270 const Long64_t
nEvents{hitsTree->GetEntries()};
271 LOGP(info,
"Starting reconstruction from hits for {} events",
nEvents);
273 if (mMemoryPool.get() ==
nullptr) {
274 mMemoryPool = std::make_shared<its::BoundedMemoryResource>();
276 if (mTaskArena.get() ==
nullptr) {
277 mTaskArena = std::make_shared<tbb::task_arena>(1);
285 itsTrackerTraits.
setNThreads(mTaskArena->max_concurrency(), mTaskArena);
287 itsTrackerTraits.
setBz(mHitRecoConfig[
"geometry"][
"bz"].get<float>());
289 TGeoGlobalMagField::Instance()->SetField(field);
290 TGeoGlobalMagField::Instance()->Lock();
294 const int inROFpileup{mHitRecoConfig.contains(
"inROFpileup") ? mHitRecoConfig[
"inROFpileup"].get<
int>() : 1};
299 auto trackingParams = createTrackingParamsFromConfig();
305 LOG(info) <<
"Running the tracking with ACTS";
307 actsTracker.
setBz(mHitRecoConfig[
"geometry"][
"bz"].get<float>());
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);
320 LOGP(info,
"Number of cells in iteration {}: {}", iter, timeFrame.
getNumberOfCells());
322 LOGP(info,
"Number of cell neighbours in iteration {}: {}", iter, timeFrame.
getNumberOfNeighbours());
324 LOGP(info,
"Number of roads in iteration {}: {}", iter, timeFrame.
getNumberOfTracks());
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);
334 std::vector<o2::its::TrackITS> allTracks;
335 std::vector<o2::MCCompLabel> allLabels;
341 for (
int iRof = 0; iRof < nRofs; ++iRof) {
342 const auto& rofTracks = timeFrame.
getTracks(iRof);
345 allTracks.insert(allTracks.end(), rofTracks.begin(), rofTracks.end());
346 allLabels.insert(allLabels.end(), rofLabels.begin(), rofLabels.end());
348 totalTracks += rofTracks.size();
349 for (
const auto&
label : rofLabels) {
350 if (
label.isFake()) {
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);
367 LOGP(info,
"Tracks and MC labels streamed to output");
374 LOGP(info,
"CPU Reconstruction time for this TF {} s (cpu), {} s (wall)", mTimer.CpuTime() - cput, mTimer.RealTime() - realt);
384 LOGF(info,
"TRK CA-Tracker total timing: Cpu: %.3e Real: %.3e s in %d slots", mTimer.CpuTime(), mTimer.RealTime(), mTimer.Counter() - 1);
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,
401 if (!hitRecoConfig.empty()) {
402 outputs.emplace_back(
"TRK",
"TRACKSMCTR", 0, Lifetime::Timeframe);
419 inputs.emplace_back(
"dummy",
"TRK",
"DUMMY", 0, Lifetime::Timeframe);
421 constexpr bool expectClusterInputs =
false;
422 if (expectClusterInputs) {
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);
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)
T get(const char *key) const
void snapshot(const Output &spec, T const &object)
ConfigParamRegistry const & options()
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()
void adoptTimeFrame(TimeFrame< nLayers > &tf)
static GeometryTGeo * Instance()
int loadROFsFromHitTree(TTree *hitsTree, GeometryTGeo *gman, const nlohmann::json &config)
void getPrimaryVerticesFromMC(TTree *mcHeaderTree, int nRofs, Long64_t nEvents, int inROFpileup)
TRK Tracker using ACTS algorithms for seeding and track finding.
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
GLuint GLsizei const GLchar * label
@ 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)
size_t getNumberOfTracks() const
virtual int getNumberOfTracklets() const
void setMemoryPool(std::shared_ptr< BoundedMemoryResource > pool)
memory management
virtual int getNumberOfCells() const
virtual int getNumberOfNeighbours() const
auto & getTracksLabel(const int rofId)
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"