30#include <TGeoGlobalMagField.h>
44 const std::string& hitRecoConfigFileName,
47 if (!hitRecoConfigFileName.empty()) {
48 std::ifstream configFile(hitRecoConfigFileName);
49 mHitRecoConfig = nlohmann::json::parse(configFile);
68 LOGF(info,
"CPU Reconstruction total timing: Cpu: %.3e Real: %.3e s in %d slots", mTimer.CpuTime(), mTimer.RealTime(), mTimer.Counter() - 1);
71std::vector<o2::its::TrackingParameters> TrackerDPL::createTrackingParamsFromConfig()
73 std::vector<o2::its::TrackingParameters> trackingParams;
75 if (!mHitRecoConfig.contains(
"trackingparams") || !mHitRecoConfig[
"trackingparams"].is_array()) {
76 LOGP(fatal,
"No trackingparams field found in configuration or it is not an array. Returning empty vector.");
77 return trackingParams;
80 for (
const auto& paramConfig : mHitRecoConfig[
"trackingparams"]) {
84 if (paramConfig.contains(
"NLayers")) {
87 if (paramConfig.contains(
"DeltaROF")) {
88 params.DeltaROF = paramConfig[
"DeltaROF"].get<
int>();
90 if (paramConfig.contains(
"ZBins")) {
91 params.ZBins = paramConfig[
"ZBins"].get<
int>();
93 if (paramConfig.contains(
"PhiBins")) {
94 params.PhiBins = paramConfig[
"PhiBins"].get<
int>();
96 if (paramConfig.contains(
"nROFsPerIterations")) {
97 params.nROFsPerIterations = paramConfig[
"nROFsPerIterations"].get<
int>();
99 if (paramConfig.contains(
"ClusterSharing")) {
100 params.ClusterSharing = paramConfig[
"ClusterSharing"].get<
int>();
102 if (paramConfig.contains(
"MinTrackLength")) {
103 params.MinTrackLength = paramConfig[
"MinTrackLength"].get<
int>();
105 if (paramConfig.contains(
"ReseedIfShorter")) {
106 params.ReseedIfShorter = paramConfig[
"ReseedIfShorter"].get<
int>();
108 if (paramConfig.contains(
"StartLayerMask")) {
109 params.StartLayerMask = paramConfig[
"StartLayerMask"].get<uint16_t>();
113 if (paramConfig.contains(
"NSigmaCut")) {
114 params.NSigmaCut = paramConfig[
"NSigmaCut"].get<
float>();
116 if (paramConfig.contains(
"PVres")) {
117 params.PVres = paramConfig[
"PVres"].get<
float>();
119 if (paramConfig.contains(
"TrackletMinPt")) {
120 params.TrackletMinPt = paramConfig[
"TrackletMinPt"].get<
float>();
122 if (paramConfig.contains(
"TrackletsPerClusterLimit")) {
123 params.TrackletsPerClusterLimit = paramConfig[
"TrackletsPerClusterLimit"].get<
float>();
125 if (paramConfig.contains(
"CellDeltaTanLambdaSigma")) {
126 params.CellDeltaTanLambdaSigma = paramConfig[
"CellDeltaTanLambdaSigma"].get<
float>();
128 if (paramConfig.contains(
"CellsPerClusterLimit")) {
129 params.CellsPerClusterLimit = paramConfig[
"CellsPerClusterLimit"].get<
float>();
131 if (paramConfig.contains(
"MaxChi2ClusterAttachment")) {
132 params.MaxChi2ClusterAttachment = paramConfig[
"MaxChi2ClusterAttachment"].get<
float>();
134 if (paramConfig.contains(
"MaxChi2NDF")) {
135 params.MaxChi2NDF = paramConfig[
"MaxChi2NDF"].get<
float>();
137 if (paramConfig.contains(
"TrackFollowerNSigmaCutZ")) {
138 params.TrackFollowerNSigmaCutZ = paramConfig[
"TrackFollowerNSigmaCutZ"].get<
float>();
140 if (paramConfig.contains(
"TrackFollowerNSigmaCutPhi")) {
141 params.TrackFollowerNSigmaCutPhi = paramConfig[
"TrackFollowerNSigmaCutPhi"].get<
float>();
145 if (paramConfig.contains(
"UseDiamond")) {
146 params.UseDiamond = paramConfig[
"UseDiamond"].get<
bool>();
148 if (paramConfig.contains(
"AllowSharingFirstCluster")) {
149 params.AllowSharingFirstCluster = paramConfig[
"AllowSharingFirstCluster"].get<
bool>();
151 if (paramConfig.contains(
"RepeatRefitOut")) {
152 params.RepeatRefitOut = paramConfig[
"RepeatRefitOut"].get<
bool>();
154 if (paramConfig.contains(
"ShiftRefToCluster")) {
155 params.ShiftRefToCluster = paramConfig[
"ShiftRefToCluster"].get<
bool>();
157 if (paramConfig.contains(
"FindShortTracks")) {
158 params.FindShortTracks = paramConfig[
"FindShortTracks"].get<
bool>();
160 if (paramConfig.contains(
"PerPrimaryVertexProcessing")) {
161 params.PerPrimaryVertexProcessing = paramConfig[
"PerPrimaryVertexProcessing"].get<
bool>();
163 if (paramConfig.contains(
"SaveTimeBenchmarks")) {
164 params.SaveTimeBenchmarks = paramConfig[
"SaveTimeBenchmarks"].get<
bool>();
166 if (paramConfig.contains(
"DoUPCIteration")) {
167 params.DoUPCIteration = paramConfig[
"DoUPCIteration"].get<
bool>();
169 if (paramConfig.contains(
"FataliseUponFailure")) {
170 params.FataliseUponFailure = paramConfig[
"FataliseUponFailure"].get<
bool>();
172 if (paramConfig.contains(
"UseTrackFollower")) {
173 params.UseTrackFollower = paramConfig[
"UseTrackFollower"].get<
bool>();
175 if (paramConfig.contains(
"UseTrackFollowerTop")) {
176 params.UseTrackFollowerTop = paramConfig[
"UseTrackFollowerTop"].get<
bool>();
178 if (paramConfig.contains(
"UseTrackFollowerBot")) {
179 params.UseTrackFollowerBot = paramConfig[
"UseTrackFollowerBot"].get<
bool>();
181 if (paramConfig.contains(
"UseTrackFollowerMix")) {
182 params.UseTrackFollowerMix = paramConfig[
"UseTrackFollowerMix"].get<
bool>();
184 if (paramConfig.contains(
"createArtefactLabels")) {
185 params.createArtefactLabels = paramConfig[
"createArtefactLabels"].get<
bool>();
187 if (paramConfig.contains(
"PrintMemory")) {
188 params.PrintMemory = paramConfig[
"PrintMemory"].get<
bool>();
190 if (paramConfig.contains(
"DropTFUponFailure")) {
191 params.DropTFUponFailure = paramConfig[
"DropTFUponFailure"].get<
bool>();
195 if (paramConfig.contains(
"LayerZ")) {
196 params.LayerZ = paramConfig[
"LayerZ"].get<std::vector<float>>();
198 if (paramConfig.contains(
"LayerRadii")) {
199 params.LayerRadii = paramConfig[
"LayerRadii"].get<std::vector<float>>();
201 if (paramConfig.contains(
"LayerxX0")) {
202 params.LayerxX0 = paramConfig[
"LayerxX0"].get<std::vector<float>>();
204 if (paramConfig.contains(
"LayerResolution")) {
205 params.LayerResolution = paramConfig[
"LayerResolution"].get<std::vector<float>>();
207 if (paramConfig.contains(
"SystErrorY2")) {
208 params.SystErrorY2 = paramConfig[
"SystErrorY2"].get<std::vector<float>>();
210 if (paramConfig.contains(
"SystErrorZ2")) {
211 params.SystErrorZ2 = paramConfig[
"SystErrorZ2"].get<std::vector<float>>();
213 if (paramConfig.contains(
"MinPt")) {
214 params.MinPt = paramConfig[
"MinPt"].get<std::vector<float>>();
218 if (paramConfig.contains(
"Diamond") && paramConfig[
"Diamond"].is_array() && paramConfig[
"Diamond"].size() == 3) {
219 params.Diamond[0] = paramConfig[
"Diamond"][0].get<
float>();
220 params.Diamond[1] = paramConfig[
"Diamond"][1].get<
float>();
221 params.Diamond[2] = paramConfig[
"Diamond"][2].get<
float>();
225 if (paramConfig.contains(
"MaxMemory")) {
226 params.MaxMemory = paramConfig[
"MaxMemory"].get<
size_t>();
230 if (paramConfig.contains(
"CorrType")) {
231 int corrTypeInt = paramConfig[
"CorrType"].get<
int>();
235 trackingParams.push_back(
params);
238 LOGP(info,
"Loaded {} tracking parameter sets from configuration", trackingParams.size());
239 return trackingParams;
244 auto cput = mTimer.CpuTime();
245 auto realt = mTimer.RealTime();
248 if (!mHitRecoConfig.empty()) {
249 TFile hitsFile(mHitRecoConfig[
"inputfiles"][
"hits"].
get<std::string>().c_str(),
"READ");
250 TFile mcHeaderFile(mHitRecoConfig[
"inputfiles"][
"mcHeader"].
get<std::string>().c_str(),
"READ");
251 TTree* hitsTree = hitsFile.Get<TTree>(
"o2sim");
252 std::vector<o2::trk::Hit>* trkHit =
nullptr;
253 hitsTree->SetBranchAddress(
"TRKHit", &trkHit);
255 TTree* mcHeaderTree = mcHeaderFile.Get<TTree>(
"o2sim");
257 mcHeaderTree->SetBranchAddress(
"MCEventHeader.", &mcheader);
262 const Long64_t
nEvents{hitsTree->GetEntries()};
263 LOGP(info,
"Starting reconstruction from hits for {} events",
nEvents);
265 if (mMemoryPool.get() ==
nullptr) {
266 mMemoryPool = std::make_shared<its::BoundedMemoryResource>();
268 if (mTaskArena.get() ==
nullptr) {
269 mTaskArena = std::make_shared<tbb::task_arena>(1);
277 itsTrackerTraits.
setNThreads(mTaskArena->max_concurrency(), mTaskArena);
280 itsTrackerTraits.
setBz(mHitRecoConfig[
"geometry"][
"bz"].get<float>());
282 TGeoGlobalMagField::Instance()->SetField(field);
283 TGeoGlobalMagField::Instance()->Lock();
287 const int inROFpileup{mHitRecoConfig.contains(
"inROFpileup") ? mHitRecoConfig[
"inROFpileup"].get<
int>() : 1};
292 auto trackingParams = createTrackingParamsFromConfig();
296 const auto trackingLoopStart = std::chrono::steady_clock::now();
297 for (
size_t iter{0}; iter < trackingParams.size(); ++iter) {
298 LOGP(info,
"{}", trackingParams[iter].
asString());
299 timeFrame.
initialise(iter, trackingParams[iter], 11,
false);
303 LOGP(info,
"Number of cells in iteration {}: {}", iter, timeFrame.
getNumberOfCells());
305 LOGP(info,
"Number of cell neighbours in iteration {}: {}", iter, timeFrame.
getNumberOfNeighbours());
307 LOGP(info,
"Number of roads in iteration {}: {}", iter, timeFrame.
getNumberOfTracks());
310 const auto trackingLoopElapsedMs = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now() - trackingLoopStart).count();
311 LOGP(info,
"Tracking iterations block took {} ms", trackingLoopElapsedMs);
317 std::vector<o2::its::TrackITS> allTracks;
318 std::vector<o2::MCCompLabel> allLabels;
324 for (
int iRof = 0; iRof < nRofs; ++iRof) {
325 const auto& rofTracks = timeFrame.
getTracks(iRof);
328 allTracks.insert(allTracks.end(), rofTracks.begin(), rofTracks.end());
329 allLabels.insert(allLabels.end(), rofLabels.begin(), rofLabels.end());
331 totalTracks += rofTracks.size();
332 for (
const auto&
label : rofLabels) {
333 if (
label.isFake()) {
341 LOGP(info,
"=== Tracking Summary ===");
342 LOGP(info,
"Total tracks reconstructed: {}", totalTracks);
343 LOGP(info,
"Good tracks: {} ({:.1f}%)", goodTracks, totalTracks > 0 ? 100.0 * goodTracks / totalTracks : 0);
344 LOGP(info,
"Fake tracks: {} ({:.1f}%)", fakeTracks, totalTracks > 0 ? 100.0 * fakeTracks / totalTracks : 0);
350 LOGP(info,
"Tracks and MC labels streamed to output");
357 LOGP(info,
"CPU Reconstruction time for this TF {} s (cpu), {} s (wall)", mTimer.CpuTime() - cput, mTimer.RealTime() - realt);
367 LOGF(info,
"TRK CA-Tracker total timing: Cpu: %.3e Real: %.3e s in %d slots", mTimer.CpuTime(), mTimer.RealTime(), mTimer.Counter() - 1);
372 std::vector<InputSpec> inputs;
373 std::vector<OutputSpec> outputs;
374 outputs.emplace_back(
"TRK",
"TRACKS", 0, Lifetime::Timeframe);
375 auto ggRequest = std::make_shared<o2::base::GRPGeomRequest>(
false,
384 if (!hitRecoConfig.empty()) {
385 outputs.emplace_back(
"TRK",
"TRACKSMCTR", 0, Lifetime::Timeframe);
397 inputs.emplace_back(
"dummy",
"TRK",
"DUMMY", 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.
static void loadGeometry(std::string_view geomFilePath="", bool applyMisalignment=false, bool preferAlignedFile=true)
void snapshot(const Output &spec, T const &object)
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)
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)