CbmRoot
Loading...
Searching...
No Matches
CaConfigReader.cxx
Go to the documentation of this file.
1/* Copyright (C) 2022-2023 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Sergei Zharko [committer] */
4
9
10#include "CaConfigReader.h"
11
12#include "CaDefs.h"
13#include "CaInitManager.h"
14
15#include <boost/algorithm/string.hpp>
16
17#include <iostream>
18#include <numeric>
19#include <sstream>
20#include <unordered_map>
21
22#include <yaml-cpp/yaml.h>
23
24
29
30// ---------------------------------------------------------------------------------------------------------------------
31//
32ConfigReader::ConfigReader(InitManager* pInitManager, int verbose) : fpInitManager(pInitManager), fVerbose(verbose) {}
33
34// ---------------------------------------------------------------------------------------------------------------------
35//
36YAML::Node ConfigReader::GetNode(std::function<YAML::Node(YAML::Node)> fn) const
37{
38 auto node = YAML::Node(YAML::NodeType::Undefined);
39 if (fUserConfigNode) {
40 node = fn(fUserConfigNode);
41 }
42 if (!node) {
43 node = fn(fMainConfigNode);
44 }
45 if (!node) {
46 std::stringstream msg;
47 msg << "requested node was not found ";
48 if (fUserConfigNode) {
49 msg << "either in user config (path: " << fsUserConfigPath << ") or ";
50 }
51 msg << "in main config (path: " << fsMainConfigPath << ")";
52 throw std::runtime_error(msg.str());
53 }
54 return node;
55}
56
57// ---------------------------------------------------------------------------------------------------------------------
58//
59std::vector<std::string> ConfigReader::GetNodeKeys(const YAML::Node& node) const
60{
61 std::vector<std::string> res;
62 res.reserve(node.size());
63 try {
64 for (const auto& item : node) {
65 res.push_back(item.first.as<std::string>());
66 }
67 }
68 catch (const YAML::InvalidNode& exc) {
69 LOG(warn)
70 << "L1 config: attempt to call ConfigReader::GetNodeKeys for node, keys of which could not be represented "
71 << "with strings. An empty vector will be returned";
72 std::vector<std::string>().swap(res);
73 }
74 return res;
75}
76
77// ---------------------------------------------------------------------------------------------------------------------
78//
80{
81 // TODO: Remove fbGeometryLock as soon as the legacy geometry variables are removed from the ca::Parameters class
82 if (!fbGeometryLock) { // Unset inactive tracking stations
83 if (fVerbose >= 1) {
84 LOG(info) << "- disabling inactive tracking stations";
85 }
86 auto inactiveMap = this->ReadInactiveStationMap();
87
88 if (std::any_of(inactiveMap.begin(), inactiveMap.end(), [](const auto& s) { return (s.size() != 0); })) {
89 for (auto& station : fpInitManager->GetStationInfo()) {
90 int iDet = static_cast<int>(station.GetDetectorID());
91 int iStLoc = station.GetStationID();
92 if (inactiveMap[iDet].find(iStLoc) != inactiveMap[iDet].end()) {
93 station.SetTrackingStatus(false);
94 }
95 }
96 // Since we disabled some stations, we have to rerun the layout initialization again, thus the station scheme is
97 // kept consistent
99 }
100 }
101
102 { // Init CA iterations in L1InitManager
103 if (fVerbose >= 1) {
104 LOG(info) << "- reading track finder iterations";
105 }
106 auto iters = this->ReadCAIterationVector();
107 assert(iters.size());
110 std::for_each(iters.begin(), iters.end(), [&](auto& iter) { fpInitManager->PushBackCAIteration(iter); });
111 }
112
113
114 // Init parameters, independnent from the tracking iteration
115
116 if (fVerbose >= 1) {
117 LOG(info) << "- reading miscellaneous parameters";
118 }
119
121 GetNode([](YAML::Node n) { return n["core"]["common"]["random_seed"]; }).as<unsigned int>());
123 GetNode([](YAML::Node n) { return n["core"]["track_finder"]["is_ghost_suppression"]; }).as<bool>());
125 GetNode([](YAML::Node n) { return n["core"]["track_finder"]["max_doublets_per_singlet"]; }).as<unsigned int>());
127 GetNode([](YAML::Node n) { return n["core"]["track_finder"]["max_triplets_per_doublet"]; }).as<unsigned int>());
128
130
131 if (fVerbose >= 1) {
132 LOG(info) << "- reading developement parameters";
133 }
134 // Dev flags
136 GetNode([](YAML::Node n) { return n["core"]["dev"]["ignore_hit_search_areas"]; }).as<bool>());
138 GetNode([](YAML::Node n) { return n["core"]["dev"]["use_of_original_field"]; }).as<bool>());
140 GetNode([](YAML::Node n) { return n["core"]["dev"]["match_doublets_via_mc"]; }).as<bool>());
142 GetNode([](YAML::Node n) { return n["core"]["dev"]["match_triplets_via_mc"]; }).as<bool>());
144 GetNode([](YAML::Node n) { return n["core"]["dev"]["extend_tracks_via_mc"]; }).as<bool>());
146 GetNode([](YAML::Node n) { return n["core"]["dev"]["suppress_overlap_hits_via_mc"]; }).as<bool>());
147}
148
149// ---------------------------------------------------------------------------------------------------------------------
150//
152{
153 std::vector<Iteration> res;
154
155 // Read iterations store
156 std::unordered_map<std::string, Iteration> mPossibleIterations;
157 {
158 auto currentNode = fMainConfigNode["possible_iterations"];
159 assert(currentNode);
160 for (const auto& iterNode : currentNode) {
161 std::string thisIterName = iterNode["name"].as<std::string>("");
162 std::string baseIterName = iterNode["base_iteration"].as<std::string>("");
163
164 if (baseIterName.size()) { // Create iteration from previously defined one
165 if (mPossibleIterations.find(baseIterName) == mPossibleIterations.end()) {
166 std::stringstream msg;
167 msg << "A CA iteration \"" << thisIterName << "\" requires a base iteration with name \"" << baseIterName
168 << "\", which was not registered yet. Please, place an entry with the requested base iteration above "
169 << "in the possible_iterations node";
170 throw std::runtime_error(std::move(msg.str()));
171 }
172 mPossibleIterations[thisIterName] = ReadSingleCAIteration(iterNode, mPossibleIterations.at(baseIterName));
173 }
174 else {
175 mPossibleIterations[thisIterName] = ReadSingleCAIteration(iterNode, Iteration());
176 }
177 }
178 }
179
180 // Read actual iteration sequence
181 //
182 if (fUserConfigNode) {
183 if (fVerbose >= 1) {
184 LOG(info) << "- Reading user iterations ";
185 }
186
187 auto currentNode = fUserConfigNode["core"]["track_finder"]["iterations"];
188 if (currentNode) {
189 for (const auto& iterNode : currentNode) {
190 std::string thisIterName = iterNode["name"].as<std::string>("");
191 std::string baseIterName = iterNode["base_iteration"].as<std::string>("");
192 if (fVerbose >= 2) {
193 LOG(info) << "- Reading user iteration " << thisIterName << "(" << baseIterName << ")";
194 }
195 if (mPossibleIterations.find(thisIterName) != mPossibleIterations.end()) {
196 // This is an update of existing possible iteration
197 if (fVerbose >= 2) {
198 LOG(info) << "- Select A";
199 }
200 res.push_back(ReadSingleCAIteration(iterNode, mPossibleIterations.at(thisIterName)));
201 }
202 else if (mPossibleIterations.find(baseIterName) != mPossibleIterations.end()) {
203 // This is a user iteration based on the existing possible iteration
204 if (fVerbose >= 2) {
205 LOG(info) << "- Select B";
206 }
207 res.push_back(ReadSingleCAIteration(iterNode, mPossibleIterations.at(baseIterName)));
208 }
209 else {
210 // Try to find a base iteration from user-defined
211 auto itFound = std::find_if(res.begin(), res.end(), [&](auto& i) { return i.GetName() == baseIterName; });
212 if (itFound != res.end()) {
213 if (fVerbose >= 2) {
214 LOG(info) << "- Select C";
215 }
216 res.push_back(ReadSingleCAIteration(iterNode, *itFound));
217 }
218 else {
219 if (fVerbose >= 2) {
220 LOG(info) << "- Select D";
221 }
222 res.push_back(ReadSingleCAIteration(iterNode, Iteration()));
223 }
224 }
225 }
226 }
227 }
228
229 if (res.size() == 0) {
230 auto currentNode = fMainConfigNode["core"]["track_finder"]["iteration_sequence"];
231 assert(currentNode);
232 assert(currentNode.size());
233 for (const auto& iterNode : currentNode) {
234 std::string thisIterName = iterNode.as<std::string>();
235 if (mPossibleIterations.find(thisIterName) == mPossibleIterations.end()) {
236 std::stringstream msg;
237 msg << "Unknow iteration in the iteration sequence, defined in main config file: " << thisIterName;
238 throw std::runtime_error(std::move(msg.str()));
239 }
240 res.push_back(mPossibleIterations.at(thisIterName));
241 }
242 }
243
244 return res;
245}
246
247// ---------------------------------------------------------------------------------------------------------------------
248//
249std::vector<std::set<int>> ConfigReader::ReadInactiveStationMap()
250{
251 // Check, if the "skip_stations" branch exists either in the user config or in the main config
252 std::string sNodePath = "ca/core/common/inactive_stations";
253 auto node = this->GetNode([](YAML::Node n) { return n["core"]["common"]["inactive_stations"]; });
254
255 // Fill map of inactive stations
256 std::vector<std::set<int>> vGeoIdToTrackingStatus(constants::size::MaxNdetectors);
257
258 if (node && node.size()) {
259 std::unordered_map<std::string, int> mDetNameToID;
260 for (int iDet = 0; iDet < constants::size::MaxNdetectors; ++iDet) {
261 auto detName = boost::algorithm::to_lower_copy(fpInitManager->GetDetectorName(static_cast<EDetectorID>(iDet)));
262 if (!detName.size()) {
263 continue;
264 }
265 mDetNameToID[detName] = iDet;
266 }
267 for (const auto& item : node) {
268 std::string stName = item.as<std::string>();
269 if (!stName.size()) {
270 continue;
271 }
272 //
273 // Check name for spaces
274 if (std::any_of(stName.begin(), stName.end(), [](auto c) { return c == ' ' || c == '\t' || c == '\n'; })) {
275 std::stringstream msg;
276 msg << "Illegal station name in the configuration branch \"" << sNodePath << "\": \"" << stName
277 << "\" contains illegal characters";
278 throw std::runtime_error(msg.str());
279 }
280 //
281 // Split stName into a detector name and a station number
282 std::vector<std::string> vNames;
283 boost::algorithm::split(vNames, stName, boost::is_any_of(":"));
284 if (vNames.size() > 2) {
285 std::stringstream msg;
286 msg << "Illegal station name in the configuration branch \"" << sNodePath << "\": \"" << stName
287 << "\" contains more then one colon character";
288 throw std::runtime_error(msg.str());
289 }
290 //
291 // Parse detector name
292 const auto& detName = boost::algorithm::to_lower_copy(vNames.front());
293 auto it = mDetNameToID.find(detName);
294 if (it == mDetNameToID.end()) {
295 std::stringstream msg;
296 msg << "ConfigReader: legal but undefined name of the detector \"" << detName << "\" (originally \"" << stName
297 << "\") was passed to the " << sNodePath << " config "
298 << "branch";
299 throw std::runtime_error(msg.str());
300 }
301
302 int nStations = fpInitManager->GetNstationsGeometry(static_cast<EDetectorID>(it->second));
303 if (vNames.size() == 2) { // Disable one particular station
304 try {
305 int iStLoc = std::stoi(vNames.back());
306 if (iStLoc < 0 || iStLoc >= nStations) {
307 throw std::runtime_error("illegal local station index");
308 }
309 vGeoIdToTrackingStatus[it->second].insert(iStLoc);
310 }
311 catch (const std::exception&) {
312 std::stringstream msg;
313 msg << "Illegal station name in the configuration branch \"" << sNodePath << "\": \"" << stName
314 << "\" contains expression after the colon symbol, which cannot be translated "
315 << "to a local number of station";
316 throw std::runtime_error(msg.str());
317 }
318 }
319 else { // Disable all stations for this detector
320 for (int iStLoc = 0; iStLoc < nStations; ++iStLoc) {
321 vGeoIdToTrackingStatus[it->second].insert(iStLoc);
322 }
323 }
324 }
325
326 std::stringstream msg;
327 msg << "\033[1;31m ConfigReader: the next tracking stations will be disabled from the configuration file:\n";
328 for (int iDet = 0; iDet < static_cast<int>(mDetNameToID.size()); ++iDet) {
329 const auto& detName = fpInitManager->GetDetectorName(static_cast<EDetectorID>(iDet));
330 int nStations = fpInitManager->GetNstationsGeometry(static_cast<EDetectorID>(iDet));
331 for (int iStLoc = 0; iStLoc < nStations; ++iStLoc) {
332 if (vGeoIdToTrackingStatus[iDet].find(iStLoc) != vGeoIdToTrackingStatus[iDet].end()) {
333 msg << "\t- " << detName << iStLoc << '\n';
334 }
335 }
336 }
337 msg << "\033[0m";
338 LOG(warn) << msg.str();
339 }
340
341 return vGeoIdToTrackingStatus;
342}
343
344// ---------------------------------------------------------------------------------------------------------------------
345//
347{
348 // Check, if the "misalignment_tolerance" branch exists either in the user config or in the main config
349
350 std::string sNodePath = "ca/core/common/misalignment_tolerance";
351
352 YAML::Node node(YAML::NodeType::Undefined);
353
354 try {
355 node = this->GetNode([](YAML::Node n) { return n["core"]["common"]["misalignment_tolerance"]; });
356 }
357 catch (const std::exception&) {
358 }
359
360 if (!node) {
361 std::stringstream msg;
362 msg << "Ca ConfigReader: misalignment_tolerance node was not found\n ";
363 if (fUserConfigNode) {
364 msg << " either in the user config (path: " << fsUserConfigPath;
365 msg << " or ";
366 }
367 else {
368 msg << " ";
369 }
370
371 msg << "in the main config (path: " << fsMainConfigPath << ")";
372 LOG(info) << msg.str();
373 LOG(info) << "Ca ConfigReader: run with zero misalignment tolerance";
374 return;
375 }
376
377
378 std::unordered_map<std::string, int> mDetNameToID;
379 for (int iDet = 0; iDet < constants::size::MaxNdetectors; ++iDet) {
380 auto detName = boost::algorithm::to_lower_copy(fpInitManager->GetDetectorName(static_cast<EDetectorID>(iDet)));
381 if (!detName.empty()) {
382 mDetNameToID[detName] = iDet;
383 }
384 }
385
386 for (const auto& item : node) {
387 std::string stName = boost::algorithm::to_lower_copy(item.first.as<std::string>());
388
389 auto it = mDetNameToID.find(stName);
390 if (it == mDetNameToID.end()) {
391 std::stringstream msg;
392 msg << "Illegal station name in the configuration branch \"" << sNodePath << "\": \"" << stName << "\"";
393 throw std::runtime_error(msg.str());
394 }
395 int iDetSystem = it->second;
396 auto v = item.second.as<std::vector<double>>();
397 if (v.size() != 3) {
398 std::stringstream msg;
399 msg << "Illegal number of misalignbment tolerances in configuration branch \"" << sNodePath << "\": \"" << stName
400 << "\": " << v.size() << " values were passed, while 3 values are expected";
401 throw std::runtime_error(msg.str());
402 }
403 fpInitManager->SetMisalignmentTolerance(static_cast<EDetectorID>(iDetSystem), v[0], v[1], v[2]);
404 }
405}
406
407// ---------------------------------------------------------------------------------------------------------------------
408//
409Iteration ConfigReader::ReadSingleCAIteration(const YAML::Node& node, const Iteration& defaultIter) const
410{
411 auto iter = Iteration();
412 try {
413 iter.SetName(node["name"].as<std::string>());
414 iter.SetTrackChi2Cut(node["track_chi2_cut"].as<float>(defaultIter.GetTrackChi2Cut()));
415 iter.SetTripletChi2Cut(node["triplet_chi2_cut"].as<float>(defaultIter.GetTripletChi2Cut()));
416 iter.SetTripletFinalChi2Cut(node["triplet_final_chi2_cut"].as<float>(defaultIter.GetTripletFinalChi2Cut()));
417 iter.SetDoubletChi2Cut(node["doublet_chi2_cut"].as<float>(defaultIter.GetDoubletChi2Cut()));
418 iter.SetPickGather(node["pick_gather"].as<float>(defaultIter.GetPickGather()));
419 iter.SetTripletLinkChi2(node["triplet_link_chi2"].as<float>(defaultIter.GetTripletLinkChi2()));
420 iter.SetMaxQp(node["max_qp"].as<float>(defaultIter.GetMaxQp()));
421 iter.SetMaxSlopePV(node["max_slope_pv"].as<float>(defaultIter.GetMaxSlopePV()));
422 iter.SetMaxSlope(node["max_slope"].as<float>(defaultIter.GetMaxSlope()));
423 iter.SetMaxDZ(node["max_dz"].as<float>(defaultIter.GetMaxDZ()));
424 iter.SetTargetPosSigmaXY(node["target_pos_sigma_x"].as<float>(defaultIter.GetTargetPosSigmaX()),
425 node["target_pos_sigma_y"].as<float>(defaultIter.GetTargetPosSigmaY()));
426 iter.SetFirstStationIndex(node["first_station_index"].as<int>(defaultIter.GetFirstStationIndex()));
427 iter.SetPrimaryFlag(node["is_primary"].as<bool>(defaultIter.GetPrimaryFlag()));
428 iter.SetElectronFlag(node["is_electron"].as<bool>(defaultIter.GetElectronFlag()));
429 iter.SetTrackFromTripletsFlag(node["is_track_from_triplets"].as<bool>(defaultIter.GetTrackFromTripletsFlag()));
430 iter.SetExtendTracksFlag(node["is_extend_tracks"].as<bool>(defaultIter.GetExtendTracksFlag()));
431 iter.SetMaxStationGap(node["max_station_gap"].as<int>(defaultIter.GetMaxStationGap()));
432 iter.SetMinNhits(node["min_n_hits"].as<int>(defaultIter.GetMinNhits()));
433 iter.SetMinNhitsStation0(node["min_n_hits_station_0"].as<int>(defaultIter.GetMinNhitsStation0()));
434 }
435 catch (const YAML::InvalidNode& exc) {
436 const auto nodeKeys = this->GetNodeKeys(node);
437 const auto nodeKeysStr =
438 std::accumulate(nodeKeys.cbegin(), nodeKeys.cend(), std::string(""),
439 [](std::string lhs, std::string rhs) { return std::move(lhs) + "\n\t" + std::move(rhs); });
440 LOG(fatal) << "L1 config: attempt to access key which does not exist in the configuration file (message from "
441 << "YAML exception: " << exc.what() << "). Defined keys: " << nodeKeysStr;
442 }
443 return iter;
444}
445
446// ---------------------------------------------------------------------------------------------------------------------
447//
448void ConfigReader::SetMainConfigPath(const std::string& path)
449{
450 if (path.size()) {
451 try {
452 fsMainConfigPath = path;
453 fMainConfigNode = YAML::LoadFile(fsMainConfigPath)["ca"];
454 if (fVerbose >= 1) {
455 LOG(info) << "ConfigReader: Registering main configuraiton file: \"\033[1;32m" << path << "\033[0m\"";
456 }
457 }
458 catch (const std::exception& err) {
459 LOG(error) << "ERROR: " << err.what();
460 }
461 }
462}
463
464// ---------------------------------------------------------------------------------------------------------------------
465//
466void ConfigReader::SetUserConfigPath(const std::string& path)
467{
468 if (path.size()) {
469 try {
470 fsUserConfigPath = path;
471 fUserConfigNode = YAML::LoadFile(fsUserConfigPath)["ca"];
472 if (fVerbose >= 1) {
473 LOG(info) << "ConfigReader: Registering user configuraiton file: \"\033[1;32m" << path << "\033[0m\"";
474 }
475 }
476 catch (const std::exception& err) {
477 LOG(error) << "ERROR: " << err.what();
478 }
479 }
480}
Configuration parameter file reader for the CA tracking algorithm (header)
Compile-time constants definition for the CA tracking algorithm.
Input data management class for the CA tracking algorithm (header)
fscal v[fmask::Size]
Definition KfSimdPseudo.h:4
A reader for the CA parameters from the YAML configuration files.
YAML::Node fUserConfigNode
User configuration node.
std::vector< Iteration > ReadCAIterationVector()
Reads CA track finder iterations from YAML node.
int fVerbose
Verbosity level.
void SetUserConfigPath(const std::string &path)
Sets user config file.
Iteration ReadSingleCAIteration(const YAML::Node &node, const Iteration &defaultIter) const
Reads iteration from config file.
YAML::Node fMainConfigNode
Main configuration node.
bool fbGeometryLock
Geometry initialization locked.
void ReadMisalignmentTolerance()
Reads the misalignment tolerance.
YAML::Node GetNode(std::function< YAML::Node(YAML::Node)> fn) const
Accesses a node either from user config or from main config.
std::vector< std::set< int > > ReadInactiveStationMap()
Reads inactive tracking station map.
std::string fsUserConfigPath
Path to the user config file (optional)
InitManager * fpInitManager
Pointer to the L1InitManager instance.
void Read()
Reads configuration from files.
std::vector< std::string > GetNodeKeys(const YAML::Node &node) const
Gets parameters content of the node.
std::string fsMainConfigPath
Path to the main config file (mandatory)
ConfigReader(InitManager *pInitManager, int verbose=1)
Constructor.
void SetMainConfigPath(const std::string &path)
Sets main config file.
A CA Parameters object initialization class.
std::vector< StationInitializer > & GetStationInfo()
Gets a reference to the stations array.
void SetCAIterationsNumberCrosscheck(int nIterations)
Sets a number of CA track finder iterations to provide initialization cross-check.
int GetNstationsGeometry() const
Gets total number of stations, provided by setup geometry.
void ClearCAIterations()
Clears vector of CA track finder iterations.
void DevSetIsExtendTracksViaMc(bool value=true)
Flag to match triplets using Mc information.
void InitStationLayout()
Initializes station layout.
void SetMaxDoubletsPerSinglet(unsigned int value)
Sets upper-bound cut on max number of doublets per one singlet.
void SetGhostSuppression(int ghostSuppression)
Sets the flag to enable/disable the ghost suppression routine.
void DevSetIsMatchTripletsViaMc(bool value=true)
Flag to match triplets using Mc information.
void SetRandomSeed(unsigned int seed)
Sets pseudo-random numbers generator seed.
void DevSetUseOfOriginalField(bool value=true)
Force use of the original field (not approximated)
void DevSetIsMatchDoubletsViaMc(bool value=true)
Flag to match doublets using MC information.
void DevSetIgnoreHitSearchAreas(bool value=true)
Ignore hit search areas.
const std::string & GetDetectorName(EDetectorID detId) const
Gets name of the detector.
void SetMisalignmentTolerance(EDetectorID detectorId, double x, double y, double t)
Sets misalignment parameters in X direction.
void DevSetIsSuppressOverlapHitsViaMc(bool value=true)
Flag to match triplets using Mc information.
void SetMaxTripletPerDoublets(unsigned int value)
Sets upper-bound cut on max number of triplets per one doublet.
A set of parameters for the CA Track finder iteration.
int GetMinNhits() const
Gets min n hits.
Definition CaIteration.h:88
float GetTripletChi2Cut() const
Gets triplet chi2 upper cut.
float GetMaxSlope() const
Gets max slope (tx\ty) in 3D hit position of a triplet.
Definition CaIteration.h:82
float GetPickGather() const
Gets size of region [TODO: units??] to attach new hits to the created track.
Definition CaIteration.h:97
float GetTrackChi2Cut() const
Gets track chi2 upper cut.
bool GetElectronFlag() const
flag check: electrons/positrons - true, heavy charged - false
Definition CaIteration.h:64
float GetDoubletChi2Cut() const
Gets doublet chi2 upper cut.
Definition CaIteration.h:61
float GetTripletFinalChi2Cut() const
Gets triplet chi2 upper cut.
int GetMaxStationGap() const
Gets flag: true - triplets are also built with skipping <= GetMaxStationGap stations.
Definition CaIteration.h:73
int GetMinNhitsStation0() const
Gets min n hits for tracks that start on station 0.
Definition CaIteration.h:91
float GetTargetPosSigmaX() const
Gets sigma target position in X direction [cm].
bool GetTrackFromTripletsFlag() const
float GetTripletLinkChi2() const
Gets min value of dp/dp_error, for which two tiplets are neighbours.
float GetMaxQp() const
Gets max considered q/p for tracks.
Definition CaIteration.h:79
float GetMaxDZ() const
Gets correction for accounting overlaping and iff z.
Definition CaIteration.h:76
bool GetPrimaryFlag() const
Checks flag: true - only primary tracks are searched, false - [all or only secondary?...
float GetTargetPosSigmaY() const
Gets sigma target position in Y direction [cm].
int GetFirstStationIndex() const
Gets station index of the first station used in tracking.
Definition CaIteration.h:70
bool GetExtendTracksFlag() const
Sets flag: true - extends track candidates with unused hits.
Definition CaIteration.h:67
float GetMaxSlopePV() const
Gets max slope (tx\ty) in primary vertex.
Definition CaIteration.h:85
constexpr int MaxNdetectors
Max number of tracking detectors.
Definition CaDefs.h:43
EDetectorID
Enumeration for the tracking detector subsystems in CBM-CA.
Definition CbmDefs.h:176