ATLAS Offline Software
Loading...
Searching...
No Matches
GbtsSeedingTool.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
5#if defined(FLATTEN) && defined(__GNUC__)
6// Avoid warning in dbg build
7#pragma GCC optimize "-fno-var-tracking-assignments"
8#endif
9
10#include "src/GbtsSeedingTool.h"
11
13
15
16#include <algorithm>
17#include <fstream>
18#include <memory>
19#include <unordered_map>
20#include <utility>
21
22namespace ActsTrk {
23
25 const std::string& name,
26 const IInterface* parent)
27 : base_class(type, name, parent)
28 {}
29
31 ATH_CHECK(m_layerTool.retrieve());
32 ATH_MSG_DEBUG("Initializing " << name() << "...");
33
34 // Make the logger And Propagate to ACTS routines
35 m_logger = makeActsAthenaLogger(this, "Acts");
36
37 // etaMin,etaMax,zMin,zMax
38 m_internalRoi.emplace(-4.5, 4.5, -150.0, 150.0);
39
42
43 // The layer tool builds the GBTS layers, in dense layer index order, and
44 // knows which layer each module hash belongs to and what it is made of.
45 const std::vector<Acts::Experimental::GbtsLayerDescription>& layers =
46 m_layerTool->layerDescriptions();
47 const std::vector<GbtsTechnology>& technologies =
48 m_layerTool->layerTechnologies();
49
50 m_pixelHashToLayer = &m_layerTool->pixelLayers();
51 m_stripHashToLayer = &m_layerTool->stripLayers();
52
53 std::vector<Acts::Experimental::GbtsLayerConnection> connections;
54 float etaBinWidth = 0.0f;
55 ATH_CHECK(readConnections(layers, technologies, connections, etaBinWidth));
56
57 // option that allows for adding custom eta binning (default is at 0.2)
58 if (m_etaBinWidthOverride.value() != 0.0f) {
59 etaBinWidth = m_etaBinWidthOverride.value();
60 }
61
62 // the cluster width cuts are the only user of the tau lookup table
63 if (m_finderCfg.useClusterWidthCuts) {
65 }
66
67 // create geoemtry object that holds allowed pairing of allowed eta regions in each layer
68 // holds all geometry information (m_layergeomtry and connection table)
69 auto gbtsGeo = std::make_shared<Acts::Experimental::GbtsGeometry>(
70 layers, connections, etaBinWidth, Acts::Experimental::GbtsZ0Range{}, logger());
71
72 m_finder = Acts::Experimental::GraphBasedTrackSeeder(
73 Acts::Experimental::GraphBasedTrackSeeder::DerivedConfig(m_finderCfg),
74 gbtsGeo, logger().cloneWithSuffix("gbtsFinder"));
75
76 m_filter = Acts::Experimental::GbtsTrackingFilter(m_filterCfg, gbtsGeo);
77
78 return StatusCode::SUCCESS;
79 }
80
83 const EventContext& ctx,
84 const std::vector<const xAOD::SpacePointContainer*>& spacePointCollections,
85 const Eigen::Vector3f& beamSpotPos, float bFieldInZ,
86 ActsTrk::SeedContainer& seedContainer) const
87 {
88 // to avoid compile issues with unused veriables
89 (void) ctx;
90
91 const Acts::Experimental::GraphBasedTrackSeeder::Options options(bFieldInZ);
92
93
94 std::vector<const xAOD::SpacePoint*> tmpSpacePoints;
95
96 // add spacepoint pointers to singel container, this makes indexing them easier
97 for (const xAOD::SpacePointContainer* spacePoints : spacePointCollections) {
98 for (const xAOD::SpacePoint* sp : *spacePoints) {
99 tmpSpacePoints.emplace_back(sp);
100 }
101 }
102
103
104 // create the node storage and fill it from the xAOD space points
105 Acts::Experimental::GbtsNodeStorage nodeStorage = m_finder->makeNodeStorage();
106
107 // space points GBTS has no layer for, counted rather than reported per
108 // space point: the loop runs over the whole event
109 std::size_t nUnmappedHashes = 0;
110 std::size_t nUngroupedModules = 0;
111
112 // add spacepoints to node storage
113 for(std::size_t idx = 0; idx < tmpSpacePoints.size(); ++idx){
114 // obtain module hash for spacepoint
115 const xAOD::SpacePoint* sp = tmpSpacePoints[idx];
116 const std::vector<xAOD::DetectorIDHashType>& elementlist = sp->elementIdList();
117
118 const bool isPixel(elementlist.size() == 1);
119
120 const std::vector<short>& hashToLayer =
122 const auto hash = static_cast<std::size_t>(elementlist[0]);
123 if (hash >= hashToLayer.size()) [[unlikely]] {
124 ++nUnmappedHashes;
125 continue;
126 }
127
128 const short layer = hashToLayer[hash];
129 if (layer == IGbtsLayerTool::kNoLayer) {
130 // a wafer GBTS does not group into any of its layers
131 ++nUngroupedModules;
132 continue;
133 }
134
135 float clusterWidth = 0.0f;
136 float localPositionY = 0.0f;
137 if (m_finderCfg.useClusterWidthCuts && isPixel) {
138 assert(dynamic_cast<const xAOD::PixelCluster*>(sp->measurements().front())!=nullptr);
139 const xAOD::PixelCluster* pCL = static_cast<const xAOD::PixelCluster*>(sp->measurements().front());
140 clusterWidth = pCL->widthInEta();
141 localPositionY = pCL->localPosition<2>().y();
142 }
143
144 if (m_finderCfg.beamSpotCorrection) {
145 const float new_x = static_cast<float>(sp->x() - beamSpotPos[0]);
146 const float new_y = static_cast<float>(sp->y() - beamSpotPos[1]);
147 nodeStorage.insert(static_cast<Acts::SpacePointIndex>(idx), new_x, new_y, static_cast<float>(sp->z()),
148 std::hypot(new_x, new_y), std::atan2(new_y, new_x),
149 static_cast<std::uint32_t>(layer), clusterWidth, localPositionY);
150 } else {
151 const float new_x = static_cast<float>(sp->x());
152 const float new_y = static_cast<float>(sp->y());
153 nodeStorage.insert(static_cast<Acts::SpacePointIndex>(idx), new_x, new_y, static_cast<float>(sp->z()),
154 std::hypot(new_x, new_y), static_cast<float>(std::atan2(sp->y(), sp->x())),
155 static_cast<std::uint32_t>(layer), clusterWidth, localPositionY);
156 }
157 }
158
159 if (nUnmappedHashes != 0) [[unlikely]] {
160 ATH_MSG_WARNING(nUnmappedHashes << " space points sit on a wafer hash "
161 "outside the GBTS layer map and were dropped");
162 }
163 if (nUngroupedModules != 0) {
164 ATH_MSG_DEBUG(nUngroupedModules << " space points sit on a wafer GBTS "
165 "does not group into a layer");
166 }
167
168 // order the nodes and build the derived per-node data
169 nodeStorage.finalize();
170
171 ATH_MSG_VERBOSE("Spacepoints successfully added to node storage");
172
173 Acts::SeedContainer seeds;
174 m_finder->createSeeds(nodeStorage, m_internalRoi.value(), *m_filter, options, seeds);
175
176 // add seeds to the output container
177 seedContainer.reserve(seedContainer.size() + seeds.size(), 7.0f);
178 for (auto seed : seeds) {
179 seedContainer.push_back(
180 seed.asConst(),
181 [&](const Acts::SpacePointIndex spIndex) {
182 return tmpSpacePoints[spIndex];
183 });
184 }
185
186 ATH_MSG_VERBOSE("Number of seeds created is " << seedContainer.size());
187 return StatusCode::SUCCESS;
188 }
189
190 // this is called in initialise
191 // adds all veriables that may have been changed in the gaudi properties defined in headerfile
192
194 const std::vector<Acts::Experimental::GbtsLayerDescription>& layers,
195 const std::vector<GbtsTechnology>& technologies,
196 std::vector<Acts::Experimental::GbtsLayerConnection>& connections,
197 float& etaBinWidth) const
198 {
199 std::ifstream connectionStream(m_connectorInputFile.value());
200 if (!connectionStream.is_open()) {
201 ATH_MSG_ERROR("Cannot open the GBTS connection table "
202 << m_connectorInputFile.value());
203 return StatusCode::FAILURE;
204 }
205
207 try {
208 table = GbtsConnectionTable::read(connectionStream);
209 } catch (const std::exception& e) {
210 ATH_MSG_ERROR("Cannot read " << m_connectorInputFile.value() << ": "
211 << e.what());
212 return StatusCode::FAILURE;
213 }
214
215 // the table names a layer by its id, the layer tool by its dense index
216 std::unordered_map<std::uint32_t, GbtsTechnology> layerTechnologies;
217 layerTechnologies.reserve(layers.size());
218 for (std::size_t layer = 0; layer < layers.size(); ++layer) {
219 layerTechnologies.emplace(static_cast<std::uint32_t>(layers[layer].id),
220 technologies[layer]);
221 }
222
223 etaBinWidth = table.etaBinWidth;
224
225 // the stage column only fixes the order the connections are handed over in
226 std::vector<std::pair<std::uint32_t, Acts::Experimental::GbtsLayerConnection>> staged;
227 staged.reserve(table.connections.size());
228
229 std::size_t nOtherTechnology = 0;
230 std::size_t nUnknownLayer = 0;
231
232 for (const GbtsConnectionTable::Connection& connection :
233 table.connections) {
234 const auto src = layerTechnologies.find(connection.src);
235 const auto dst = layerTechnologies.find(connection.dst);
236 if (src == layerTechnologies.end() || dst == layerTechnologies.end()) {
237 ++nUnknownLayer;
238 continue;
239 }
240
241 // GBTS pairs a layer only with one of its own technology
242 const bool wanted = src->second == dst->second &&
243 (src->second == GbtsTechnology::Pixel
244 ? m_pixelConnections.value()
245 : m_stripConnections.value());
246 if (!wanted) {
247 ++nOtherTechnology;
248 continue;
249 }
250
251 staged.emplace_back(connection.stage,
252 Acts::Experimental::GbtsLayerConnection{connection.src,
253 connection.dst});
254 }
255
256 std::ranges::stable_sort(staged, {}, [](const auto& entry) { return entry.first; });
257
258 connections.clear();
259 connections.reserve(staged.size());
260 for (const auto& entry : staged) {
261 connections.push_back(entry.second);
262 }
263 const std::size_t nKept = connections.size();
264
265 if (nUnknownLayer != 0) {
266 ATH_MSG_WARNING(nUnknownLayer << " connections of "
267 << m_connectorInputFile.value() << " name no GBTS layer "
268 "and were dropped");
269 }
270 if (nKept == 0) {
271 ATH_MSG_ERROR("None of the connections of "
272 << m_connectorInputFile.value() << " are usable: the table "
273 "does not match the detector this job is reconstructing");
274 return StatusCode::FAILURE;
275 }
276 ATH_MSG_DEBUG("Kept " << nKept << " GBTS layer connections, dropping "
277 << nOtherTechnology << " of a technology not asked for, eta bin width "
278 << etaBinWidth);
279
280 return StatusCode::SUCCESS;
281 }
282
284 Acts::Experimental::detail::GbtsTauLookupTable& tauLookupTable) const
285 {
286 std::ifstream lutStream(m_lutFile.value());
287 if (!lutStream.is_open()) {
288 ATH_MSG_ERROR("Cannot open the GBTS tau lookup table " << m_lutFile.value());
289 return StatusCode::FAILURE;
290 }
291
292 tauLookupTable.clear();
293
294 // the width is dropped: a row is located by index, one row per
295 // tauLutBinWidth of cluster width, never searched
296 float clusterWidth = 0.0f;
297 Acts::Experimental::detail::GbtsTauBounds bounds;
298 while (lutStream >> clusterWidth >> bounds.minTau >> bounds.maxTau >>
299 bounds.minTauNearEdge >> bounds.maxTauNearEdge) {
300 tauLookupTable.push_back(bounds);
301 }
302
303 if (!lutStream.eof()) {
304 // ended on a parse error, not on a clean end of file
305 ATH_MSG_ERROR("Malformed GBTS tau lookup table " << m_lutFile.value());
306 return StatusCode::FAILURE;
307 }
308 if (tauLookupTable.empty()) {
309 ATH_MSG_ERROR("The GBTS tau lookup table " << m_lutFile.value() << " is empty");
310 return StatusCode::FAILURE;
311 }
312
313 ATH_MSG_DEBUG("Read " << tauLookupTable.size() << " rows of the GBTS tau lookup table "
314 << m_lutFile.value());
315
316 return StatusCode::SUCCESS;
317 }
318
320 m_finderCfg.useStripConnections = m_stripConnections;
321 m_finderCfg.useClusterWidthCuts = m_useML;
322 m_finderCfg.matchBeforeCreate = m_matchBeforeCreate;
323 // useOldTunings gated the curvature bounds and the phi window together,
324 // while LRT mode only wanted the first, so the seeder now has them apart
325 m_finderCfg.useOldTuningsCurvature = m_useOldTunings || m_LRTmode;
326 m_finderCfg.useOldTuningsPhiWindow = m_useOldTunings;
327 m_finderCfg.beamSpotCorrection = m_beamSpotCorrection;
328 m_finderCfg.minPt = m_minPt;
329 m_finderCfg.nMaxPhiSlice = m_nMaxPhiSlice;
330 m_finderCfg.useEtaBinning = m_useEtaBinning;
331 m_finderCfg.doubletFilterRZ = m_doubletFilterRZ;
332 m_finderCfg.minDeltaRadius = m_minDeltaRadius;
333 m_finderCfg.nMaxEdges = m_nMaxEdges;
334 m_finderCfg.tauRatioCut = m_tauRatioCut;
335 m_finderCfg.tauRatioPrecut = m_tauRatioPrecut;
336 m_finderCfg.edgeMaskMinEta = m_edgeMaskMinEta;
337 m_finderCfg.hitShareThreshold = m_hitShareThreshold;
338 m_finderCfg.maxEndcapClusterWidth = m_maxEndcapClusterwidth;
339 m_finderCfg.d0Max = m_d0Max;
340
341 //use roi for pixel and given value for strip
342 m_finderCfg.maxZ0 = m_LRTmode ? m_maxZ0.value() : m_internalRoi->zMax();
343 m_finderCfg.minZ0 = m_LRTmode ? m_minZ0.value() : m_internalRoi->zMin();
344
345 m_finderCfg.validateTriplets = m_validateTriplets;
346 m_finderCfg.useAdaptiveCuts = m_useAdaptiveCuts;
347 m_finderCfg.tauRatioCorr = m_tauRatioCorr;
348 m_finderCfg.addTriplets = m_addTriplets;
349 m_finderCfg.maxAbsEtaAddTriplets = m_maxEtaAddTriplets;
350 m_finderCfg.cutDPhiMax = m_cutDPhiMax;
351 m_finderCfg.cutDCurvMax = m_cutDCurvMax;
352 m_finderCfg.minDeltaPhi = m_minDeltaPhi;
353 m_finderCfg.maxOuterRadius = m_maxOuterRadius;
354
355 // The seeder no longer recognises an LRT mode, so spell out the rest of
356 // what it used to imply: the whole of maxCurv for the curvature bounds and
357 // the phi window, a triplet with no confirmation, and no added triplets.
358 // Keep this last, it overrides addTriplets.
359 if (m_LRTmode) {
360 m_finderCfg.oldTuningsCurvatureHighEtaFraction = 1.f;
361 m_finderCfg.oldTuningsCurvatureLowEtaFraction = 1.f;
362 m_finderCfg.oldTuningsPhiWindowFraction = 1.f;
363 m_finderCfg.minSeedLevel = 2;
364 m_finderCfg.addTriplets = false;
365 }
366
367 m_filterCfg.sigmaMS = m_sigmaMS;
368 m_filterCfg.radLen = m_radLen;
369 m_filterCfg.sigmaX = m_sigmaX;
370 m_filterCfg.sigmaY = m_sigmaY;
371 m_filterCfg.weightX = m_weightX;
372 m_filterCfg.weightY = m_weightY;
373 m_filterCfg.maxDChi2X = m_maxDChi2X;
374 m_filterCfg.maxDChi2Y = m_maxDChi2Y;
375 m_filterCfg.addHit = m_addHit;
376 m_filterCfg.maxCurvature = m_maxCurvature;
378
379 return StatusCode::SUCCESS;
380 }
381
382 // called in initialise, used to make sure all config settings look sensible
384 ATH_MSG_DEBUG("===== GBTS finder config =====");
385 ATH_MSG_DEBUG( "beamSpotCorrection: " << m_finderCfg.beamSpotCorrection);
386 ATH_MSG_DEBUG( "connectorInputFile: " << m_connectorInputFile.value());
387 ATH_MSG_DEBUG( "lutInputFile: " << m_lutFile.value());
388 ATH_MSG_DEBUG( "LRTmode: " << m_LRTmode.value());
389 ATH_MSG_DEBUG( "useStripConnections: " << m_finderCfg.useStripConnections);
390 ATH_MSG_DEBUG( "useClusterWidthCuts: " << m_finderCfg.useClusterWidthCuts);
391 ATH_MSG_DEBUG( "matchBeforeCreate: " << m_finderCfg.matchBeforeCreate);
392 ATH_MSG_DEBUG( "useOldTuningsCurvature: " << m_finderCfg.useOldTuningsCurvature);
393 ATH_MSG_DEBUG( "useOldTuningsPhiWindow: " << m_finderCfg.useOldTuningsPhiWindow);
394 ATH_MSG_DEBUG( "minSeedLevel: " << m_finderCfg.minSeedLevel);
395 ATH_MSG_DEBUG( "tauRatioPrecut: " << m_finderCfg.tauRatioPrecut);
396 ATH_MSG_DEBUG( "tauRatioCut: " << m_finderCfg.tauRatioCut);
397 ATH_MSG_DEBUG( "tauRatioCorr: " << m_finderCfg.tauRatioCorr);
398 ATH_MSG_DEBUG( "etaBinWidthOverride: " << m_etaBinWidthOverride.value());
399 ATH_MSG_DEBUG( "nMaxPhiSlice: " << m_finderCfg.nMaxPhiSlice);
400 ATH_MSG_DEBUG( "minPt: " << m_finderCfg.minPt);
401 ATH_MSG_DEBUG( "useEtaBinning: " << m_finderCfg.useEtaBinning);
402 ATH_MSG_DEBUG( "doubletFilterRZ: " << m_finderCfg.doubletFilterRZ);
403 ATH_MSG_DEBUG( "nMaxEdges: " << m_finderCfg.nMaxEdges);
404 ATH_MSG_DEBUG( "minDeltaRadius: " << m_finderCfg.minDeltaRadius);
405 ATH_MSG_DEBUG( "edgeMaskMinEta: " << m_finderCfg.edgeMaskMinEta);
406 ATH_MSG_DEBUG( "hitShareThreshold: " << m_finderCfg.hitShareThreshold);
407 ATH_MSG_DEBUG( "maxEndcapClusterWidth: " << m_finderCfg.maxEndcapClusterWidth);
408 ATH_MSG_DEBUG( "d0Max: " << m_finderCfg.d0Max);
409 ATH_MSG_DEBUG("maxZ0: " << m_finderCfg.maxZ0);
410 ATH_MSG_DEBUG("minZ0: " << m_finderCfg.minZ0);
411 ATH_MSG_DEBUG( "validateTriplets: " << m_finderCfg.validateTriplets);
412 ATH_MSG_DEBUG( "useAdaptiveCuts: " << m_finderCfg.useAdaptiveCuts);
413 ATH_MSG_DEBUG( "addTriplets: " << m_finderCfg.addTriplets);
414 ATH_MSG_DEBUG( "maxEtaAddTriplets: " << m_finderCfg.maxAbsEtaAddTriplets);
415 ATH_MSG_DEBUG("cutDphiMax: " << m_finderCfg.cutDPhiMax);
416 ATH_MSG_DEBUG("cutDCurvMax: " << m_finderCfg.cutDCurvMax);
417 ATH_MSG_DEBUG("minDeltaPhi: " << m_finderCfg.minDeltaPhi);
418 ATH_MSG_DEBUG("maxOuterRadius: " << m_finderCfg.maxOuterRadius);
419
420 ATH_MSG_DEBUG("===== GBTS filter config =====");
421 ATH_MSG_DEBUG( "sigmaMS: " << m_filterCfg.sigmaMS);
422 ATH_MSG_DEBUG( "radLen: " << m_filterCfg.radLen);
423 ATH_MSG_DEBUG( "sigmaX: " << m_filterCfg.sigmaX);
424 ATH_MSG_DEBUG( "sigmaY: " << m_filterCfg.sigmaY);
425 ATH_MSG_DEBUG( "weightX: " << m_filterCfg.weightX);
426 ATH_MSG_DEBUG( "weightY: " << m_filterCfg.weightY);
427 ATH_MSG_DEBUG( "maxDChi2X: " << m_filterCfg.maxDChi2X);
428 ATH_MSG_DEBUG( "maxDChi2Y: " << m_filterCfg.maxDChi2Y);
429 ATH_MSG_DEBUG( "addHit: " << m_filterCfg.addHit);
430 ATH_MSG_DEBUG( "maxCurvature: " << m_filterCfg.maxCurvature);
431 ATH_MSG_DEBUG( "filterMaxZ0: " << m_filterCfg.maxZ0);
432}
433
434} // namespace ActsTrk
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_DEBUG(x,...)
#define ATH_MSG_ERROR(x,...)
#define ATH_MSG_WARNING(x,...)
#define ATH_MSG_VERBOSE(x,...)
static Double_t sp
std::unique_ptr< const Acts::Logger > makeActsAthenaLogger(IMessageSvc *svc, const std::string &name, int level, std::optional< std::string > parent_name)
Definition Logger.cxx:64
#define y
Gaudi::Property< bool > m_doubletFilterRZ
Gaudi::Property< float > m_maxZ0
Gaudi::Property< int > m_nMaxEdges
Gaudi::Property< float > m_maxEtaAddTriplets
Gaudi::Property< float > m_filterMaxZ0
Gaudi::Property< float > m_minPt
Gaudi::Property< bool > m_useAdaptiveCuts
Gaudi::Property< float > m_maxDChi2X
Gaudi::Property< float > m_weightX
Gaudi::Property< float > m_sigmaMS
virtual StatusCode initialize() override
Gaudi::Property< float > m_cutDPhiMax
Gaudi::Property< bool > m_validateTriplets
Gaudi::Property< float > m_sigmaY
Gaudi::Property< bool > m_LRTmode
std::optional< Acts::Experimental::GbtsRoiDescriptor > m_internalRoi
region of interest for pixel seeding
Gaudi::Property< float > m_edgeMaskMinEta
Gaudi::Property< float > m_addHit
std::unique_ptr< const Acts::Logger > m_logger
logging instance
Gaudi::Property< bool > m_stripConnections
StatusCode createSeeds(const EventContext &ctx, const std::vector< const xAOD::SpacePointContainer * > &spacePointCollections, const Eigen::Vector3f &beamSpotPos, float bFieldInZ, ActsTrk::SeedContainer &seedContainer) const override
Gaudi::Property< float > m_nMaxPhiSlice
StatusCode readTauLookupTable(Acts::Experimental::detail::GbtsTauLookupTable &tauLookupTable) const
Reads the tau lookup table the cluster width cuts need: per line a cluster width, the bulk tau bounds...
Gaudi::Property< float > m_maxCurvature
Gaudi::Property< bool > m_pixelConnections
Gaudi::Property< float > m_maxOuterRadius
Gaudi::Property< float > m_etaBinWidthOverride
Gaudi::Property< bool > m_useOldTunings
Gaudi::Property< float > m_minZ0
const Acts::Logger & logger() const
Private access to the logger.
Acts::Experimental::GbtsTrackingFilter::Config m_filterCfg
steering for track filter
void printGbtsConfig() const
prints all current config settings used either with default settings or properties changed by the gau...
Gaudi::Property< float > m_maxDChi2Y
Gaudi::Property< std::string > m_connectorInputFile
Acts::Experimental::GraphBasedTrackSeeder::Config m_finderCfg
steering for seeding algorithm
Gaudi::Property< float > m_cutDCurvMax
Gaudi::Property< float > m_minDeltaPhi
StatusCode readConnections(const std::vector< Acts::Experimental::GbtsLayerDescription > &layers, const std::vector< GbtsTechnology > &technologies, std::vector< Acts::Experimental::GbtsLayerConnection > &connections, float &etaBinWidth) const
Reads the connection table and keeps the connections this pass is for: both layers have to be layers ...
Gaudi::Property< bool > m_useML
Gaudi::Property< float > m_minDeltaRadius
std::optional< Acts::Experimental::GbtsTrackingFilter > m_filter
the seed filter
Gaudi::Property< float > m_tauRatioPrecut
Gaudi::Property< bool > m_useEtaBinning
Gaudi::Property< bool > m_matchBeforeCreate
std::optional< Acts::Experimental::GraphBasedTrackSeeder > m_finder
the actual seed fining algorithm
StatusCode prepareConfiguration()
sets configs based on gaudi properties defined below
ToolHandle< IGbtsLayerTool > m_layerTool
Builds the GBTS layers out of the ITk readout geometry.
Gaudi::Property< float > m_maxEndcapClusterwidth
Gaudi::Property< float > m_tauRatioCorr
Gaudi::Property< float > m_hitShareThreshold
Gaudi::Property< float > m_sigmaX
Gaudi::Property< bool > m_beamSpotCorrection
const std::vector< short > * m_stripHashToLayer
Wafer hash to dense GBTS layer index, one map per technology.
Gaudi::Property< float > m_weightY
Gaudi::Property< float > m_tauRatioCut
Gaudi::Property< float > m_d0Max
Gaudi::Property< bool > m_addTriplets
Gaudi::Property< std::string > m_lutFile
const std::vector< short > * m_pixelHashToLayer
GbtsSeedingTool(const std::string &type, const std::string &name, const IInterface *parent)
Gaudi::Property< float > m_radLen
static constexpr short kNoLayer
Value stored in the hash maps for a module GBTS does not use.
float widthInEta() const
Returns the width of the cluster in phi (x) and eta (y) directions, respectively.
ConstVectorMap< N > localPosition() const
Returns the local position of the measurement.
#define ATH_FLATTEN
ReadResult read(std::istream &inputStream)
Read the GBTS layer connection table.
The AlignStoreProviderAlg loads the rigid alignment corrections and pipes them through the readout ge...
SpacePointContainer_v1 SpacePointContainer
Define the version of the space point container.
PixelCluster_v1 PixelCluster
Define the version of the pixel cluster class.
#define unlikely(x)
One row of the table: the two layers it connects, and the stage it is in.
Seed push_back(SpacePointRange spacePoints, float quality, float vertexZ)
void reserve(std::size_t size, float averageSpacePoints=3) noexcept
std::size_t size() const noexcept