30#include <TGeoGlobalMagField.h>
47 const std::string& hitRecoConfigFileName,
50 if (!hitRecoConfigFileName.empty()) {
51 std::ifstream configFile(hitRecoConfigFileName);
52 mHitRecoConfig = nlohmann::json::parse(configFile);
75 LOGF(info,
"CPU Reconstruction total timing: Cpu: %.3e Real: %.3e s in %d slots", mTimer.CpuTime(), mTimer.RealTime(), mTimer.Counter() - 1);
78std::vector<o2::its::TrackingParameters> TrackerDPL::createTrackingParamsFromConfig()
80 std::vector<o2::its::TrackingParameters> trackingParams;
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;
87 for (
const auto& paramConfig : mHitRecoConfig[
"trackingparams"]) {
91 if (paramConfig.contains(
"NLayers")) {
94 if (paramConfig.contains(
"ZBins")) {
95 params.ZBins = paramConfig[
"ZBins"].get<
int>();
97 if (paramConfig.contains(
"PhiBins")) {
98 params.PhiBins = paramConfig[
"PhiBins"].get<
int>();
100 if (paramConfig.contains(
"ClusterSharing")) {
101 params.ClusterSharing = paramConfig[
"ClusterSharing"].get<
int>();
103 if (paramConfig.contains(
"MinTrackLength")) {
104 params.MinTrackLength = paramConfig[
"MinTrackLength"].get<
int>();
106 if (paramConfig.contains(
"ReseedIfShorter")) {
107 params.ReseedIfShorter = paramConfig[
"ReseedIfShorter"].get<
int>();
109 if (paramConfig.contains(
"StartLayerMask")) {
110 params.StartLayerMask = paramConfig[
"StartLayerMask"].get<uint16_t>();
114 if (paramConfig.contains(
"NSigmaCut")) {
115 params.NSigmaCut = paramConfig[
"NSigmaCut"].get<
float>();
117 if (paramConfig.contains(
"PVres")) {
118 params.PVres = paramConfig[
"PVres"].get<
float>();
120 if (paramConfig.contains(
"TrackletMinPt")) {
121 params.TrackletMinPt = paramConfig[
"TrackletMinPt"].get<
float>();
123 if (paramConfig.contains(
"CellDeltaTanLambdaSigma")) {
124 params.CellDeltaTanLambdaSigma = paramConfig[
"CellDeltaTanLambdaSigma"].get<
float>();
126 if (paramConfig.contains(
"MaxChi2ClusterAttachment")) {
127 params.MaxChi2ClusterAttachment = paramConfig[
"MaxChi2ClusterAttachment"].get<
float>();
129 if (paramConfig.contains(
"MaxChi2NDF")) {
130 params.MaxChi2NDF = paramConfig[
"MaxChi2NDF"].get<
float>();
140 if (paramConfig.contains(
"UseDiamond")) {
141 params.UseDiamond = paramConfig[
"UseDiamond"].get<
bool>();
143 if (paramConfig.contains(
"AllowSharingFirstCluster")) {
144 params.AllowSharingFirstCluster = paramConfig[
"AllowSharingFirstCluster"].get<
bool>();
146 if (paramConfig.contains(
"RepeatRefitOut")) {
147 params.RepeatRefitOut = paramConfig[
"RepeatRefitOut"].get<
bool>();
149 if (paramConfig.contains(
"ShiftRefToCluster")) {
150 params.ShiftRefToCluster = paramConfig[
"ShiftRefToCluster"].get<
bool>();
155 if (paramConfig.contains(
"PerPrimaryVertexProcessing")) {
156 params.PerPrimaryVertexProcessing = paramConfig[
"PerPrimaryVertexProcessing"].get<
bool>();
158 if (paramConfig.contains(
"SaveTimeBenchmarks")) {
159 params.SaveTimeBenchmarks = paramConfig[
"SaveTimeBenchmarks"].get<
bool>();
161 if (paramConfig.contains(
"DoUPCIteration")) {
162 params.DoUPCIteration = paramConfig[
"DoUPCIteration"].get<
bool>();
164 if (paramConfig.contains(
"FataliseUponFailure")) {
165 params.FataliseUponFailure = paramConfig[
"FataliseUponFailure"].get<
bool>();
179 if (paramConfig.contains(
"createArtefactLabels")) {
180 params.createArtefactLabels = paramConfig[
"createArtefactLabels"].get<
bool>();
182 if (paramConfig.contains(
"PrintMemory")) {
183 params.PrintMemory = paramConfig[
"PrintMemory"].get<
bool>();
185 if (paramConfig.contains(
"DropTFUponFailure")) {
186 params.DropTFUponFailure = paramConfig[
"DropTFUponFailure"].get<
bool>();
190 if (paramConfig.contains(
"LayerZ")) {
191 params.LayerZ = paramConfig[
"LayerZ"].get<std::vector<float>>();
193 if (paramConfig.contains(
"LayerRadii")) {
194 params.LayerRadii = paramConfig[
"LayerRadii"].get<std::vector<float>>();
196 if (paramConfig.contains(
"LayerxX0")) {
197 params.LayerxX0 = paramConfig[
"LayerxX0"].get<std::vector<float>>();
199 if (paramConfig.contains(
"LayerResolution")) {
200 params.LayerResolution = paramConfig[
"LayerResolution"].get<std::vector<float>>();
202 if (paramConfig.contains(
"SystErrorY2")) {
203 params.SystErrorY2 = paramConfig[
"SystErrorY2"].get<std::vector<float>>();
205 if (paramConfig.contains(
"SystErrorZ2")) {
206 params.SystErrorZ2 = paramConfig[
"SystErrorZ2"].get<std::vector<float>>();
208 if (paramConfig.contains(
"MinPt")) {
209 params.MinPt = paramConfig[
"MinPt"].get<std::vector<float>>();
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>();
220 if (paramConfig.contains(
"MaxMemory")) {
221 params.MaxMemory = paramConfig[
"MaxMemory"].get<
size_t>();
225 if (paramConfig.contains(
"CorrType")) {
226 int corrTypeInt = paramConfig[
"CorrType"].get<
int>();
230 trackingParams.push_back(
params);
233 LOGP(info,
"Loaded {} tracking parameter sets from configuration", trackingParams.size());
234 return trackingParams;
239 auto cput = mTimer.CpuTime();
240 auto realt = mTimer.RealTime();
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);
250 TTree* mcHeaderTree = mcHeaderFile.Get<TTree>(
"o2sim");
252 mcHeaderTree->SetBranchAddress(
"MCEventHeader.", &mcheader);
257 const Long64_t
nEvents{hitsTree->GetEntries()};
258 LOGP(info,
"Starting reconstruction from hits for {} events",
nEvents);
260 if (mMemoryPool.get() ==
nullptr) {
261 mMemoryPool = std::make_shared<its::BoundedMemoryResource>();
263 if (mTaskArena.get() ==
nullptr) {
264 mTaskArena = std::make_shared<tbb::task_arena>(1);
272 itsTrackerTraits.
setNThreads(mTaskArena->max_concurrency(), mTaskArena);
274 itsTrackerTraits.
setBz(mHitRecoConfig[
"geometry"][
"bz"].get<float>());
276 TGeoGlobalMagField::Instance()->SetField(field);
277 TGeoGlobalMagField::Instance()->Lock();
281 const int inROFpileup{mHitRecoConfig.contains(
"inROFpileup") ? mHitRecoConfig[
"inROFpileup"].get<
int>() : 1};
286 auto trackingParams = createTrackingParamsFromConfig();
292 LOG(info) <<
"Running the tracking with ACTS";
294 actsTracker.
setBz(mHitRecoConfig[
"geometry"][
"bz"].get<float>());
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);
307 LOGP(info,
"Number of cells in iteration {}: {}", iter, timeFrame.
getNumberOfCells());
309 LOGP(info,
"Number of cell neighbours in iteration {}: {}", iter, timeFrame.
getNumberOfNeighbours());
311 LOGP(info,
"Number of tracks in iteration {}: {}", iter, timeFrame.
getNumberOfTracks());
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);
319 const auto& tracks = timeFrame.
getTracks();
323 std::vector<o2::its::TrackITS> allTracks(tracks.begin(), tracks.end());
324 std::vector<o2::MCCompLabel> allLabels(
labels.begin(),
labels.end());
326 int totalTracks = allTracks.size();
330 for (
const auto&
label : allLabels) {
331 if (
label.isFake()) {
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);
347 LOGP(info,
"Tracks and MC labels streamed to output");
354 LOGP(info,
"CPU Reconstruction time for this TF {} s (cpu), {} s (wall)", mTimer.CpuTime() - cput, mTimer.RealTime() - realt);
364 LOGF(info,
"TRK CA-Tracker total timing: Cpu: %.3e Real: %.3e s in %d slots", mTimer.CpuTime(), mTimer.RealTime(), mTimer.Counter() - 1);
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,
381 if (!hitRecoConfig.empty()) {
382 outputs.emplace_back(
"TRK",
"TRACKSMCTR", 0, Lifetime::Timeframe);
399 inputs.emplace_back(
"dummy",
"TRK",
"DUMMY", 0, Lifetime::Timeframe);
401 constexpr bool expectClusterInputs =
false;
402 if (expectClusterInputs) {
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);
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)
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 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)
void computeTracksMClabels()
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)
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 ...
virtual size_t getNumberOfCells() const
void setMemoryPool(std::shared_ptr< BoundedMemoryResource > pool)
memory management
size_t getNumberOfTracks() const
virtual size_t getNumberOfNeighbours() const
void initialise(const int iteration, const TrackingParameters &trkParam, const int maxLayers=NLayers, bool resetVertices=true)
virtual size_t getNumberOfTracklets() const
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"