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, m_minZ0.value(), m_maxZ0.value());
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
48 m_pixelHashToLayer = &m_layerTool->pixelLayers();
49 m_stripHashToLayer = &m_layerTool->stripLayers();
50
52 ATH_MSG_ERROR("Neither pixel nor strip layers are enabled, there is "
53 "nothing to seed on.");
54 return StatusCode::FAILURE;
55 }
56
57 std::vector<Acts::Experimental::GbtsLayerConnection> connections;
58 float etaBinWidth = 0.0f;
59 ATH_CHECK(readConnections(layers, connections, etaBinWidth));
60
61 // option that allows for adding custom eta binning (default is at 0.2)
62 if (m_etaBinWidthOverride.value() != 0.0f) {
63 etaBinWidth = m_etaBinWidthOverride.value();
64 }
65
66 // the cluster width cuts are the only user of the tau lookup table
67 if (m_finderCfg.useClusterWidthCuts) {
69 }
70
71 // create geoemtry object that holds allowed pairing of allowed eta regions in each layer
72 // holds all geometry information (m_layergeomtry and connection table)
73 auto gbtsGeo = std::make_shared<Acts::Experimental::GbtsGeometry>(
74 layers, connections, etaBinWidth, Acts::Experimental::GbtsZ0Range{}, logger());
75
76 m_finder = Acts::Experimental::GraphBasedTrackSeeder(
77 Acts::Experimental::GraphBasedTrackSeeder::DerivedConfig(m_finderCfg),
78 gbtsGeo, logger().cloneWithSuffix("gbtsFinder"));
79
80 m_filter = Acts::Experimental::GbtsTrackingFilter(m_filterCfg, gbtsGeo);
81
82 return StatusCode::SUCCESS;
83 }
84
87 const EventContext& ctx,
88 const std::vector<const xAOD::SpacePointContainer*>& spacePointCollections,
89 const Eigen::Vector3f& beamSpotPos, float bFieldInZ,
90 ActsTrk::SeedContainer& seedContainer) const
91 {
92 // to avoid compile issues with unused veriables
93 (void) ctx;
94
95 const Acts::Experimental::GraphBasedTrackSeeder::Options options{
96 .bFieldInZ = bFieldInZ};
97
98
99 std::vector<const xAOD::SpacePoint*> tmpSpacePoints;
100
101 // add spacepoint pointers to singel container, this makes indexing them easier
102 for (const xAOD::SpacePointContainer* spacePoints : spacePointCollections) {
103 for (const xAOD::SpacePoint* sp : *spacePoints) {
104 tmpSpacePoints.emplace_back(sp);
105 }
106 }
107
108
109 // create the node storage and fill it from the xAOD space points
110 Acts::Experimental::GbtsNodeStorage nodeStorage = m_finder->makeNodeStorage();
111
112 // node positions are relative to the beam spot in x and y if the correction is on
113 const float offsetX = m_finderCfg.beamSpotCorrection ? beamSpotPos[0] : 0.0f;
114 const float offsetY = m_finderCfg.beamSpotCorrection ? beamSpotPos[1] : 0.0f;
115
116 std::size_t nPixelNodes = 0;
117 std::size_t nStripNodes = 0;
118
119 // space points GBTS has no layer for, counted rather than reported per
120 // space point: the loop runs over the whole event
121 std::size_t nUnmappedHashes = 0;
122 std::size_t nUngroupedModules = 0;
123
124 // add spacepoints to node storage
125 for(std::size_t idx = 0; idx < tmpSpacePoints.size(); ++idx){
126 // obtain module hash for spacepoint
127 const xAOD::SpacePoint* sp = tmpSpacePoints[idx];
128 const std::vector<xAOD::DetectorIDHashType>& elementlist = sp->elementIdList();
129
130 // a strip space point is made of one cluster on each side of a stereo pair
131 const bool isPixel(elementlist.size() == 1);
132
133 if (isPixel ? !m_usePixelLayers : !m_useStripLayers) {
134 continue;
135 }
136
137 const std::vector<short>& hashToLayer =
139 const auto hash = static_cast<std::size_t>(elementlist[0]);
140 if (hash >= hashToLayer.size()) [[unlikely]] {
141 ++nUnmappedHashes;
142 continue;
143 }
144
145 const short layer = hashToLayer[hash];
146 if (layer == IGbtsLayerTool::kNoLayer) {
147 // a wafer GBTS does not group into any of its layers
148 ++nUngroupedModules;
149 continue;
150 }
151
152 float clusterWidth = 0.0f;
153 float localPositionY = 0.0f;
154 if (m_finderCfg.useClusterWidthCuts && isPixel) {
155 assert(dynamic_cast<const xAOD::PixelCluster*>(sp->measurements().front())!=nullptr);
156 const xAOD::PixelCluster* pCL = static_cast<const xAOD::PixelCluster*>(sp->measurements().front());
157 clusterWidth = pCL->widthInEta();
158 localPositionY = pCL->localPosition<2>().y();
159 }
160
161 // the stereo pair of a strip space point, for the strip calibration in GBTS
162 Acts::OuterStripSpacePointCalibrationDetails stripDetails{};
163 const Acts::OuterStripSpacePointCalibrationDetails* strip = nullptr;
164 if (!isPixel) {
165 // topStripCenter is global, the node frame shifts only x and y
166 Eigen::Map<Eigen::Vector3f>(stripDetails.outerCenter.data()) =
167 sp->topStripCenter() - Eigen::Vector3f(offsetX, offsetY, 0.0f);
168 Eigen::Map<Eigen::Vector3f>(stripDetails.innerToOuterSeparation.data()) =
169 sp->stripCenterDistance();
170 Eigen::Map<Eigen::Vector3f>(stripDetails.outerHalfVector.data()) =
171 sp->topHalfStripLength() * sp->topStripDirection();
172 Eigen::Map<Eigen::Vector3f>(stripDetails.innerHalfVector.data()) =
173 sp->bottomHalfStripLength() * sp->bottomStripDirection();
174 strip = &stripDetails;
175 }
176
177 const float x = static_cast<float>(sp->x()) - offsetX;
178 const float y = static_cast<float>(sp->y()) - offsetY;
179 const std::optional<std::uint32_t> bin = nodeStorage.insert(
180 static_cast<Acts::SpacePointIndex>(idx), x, y,
181 static_cast<float>(sp->z()), std::hypot(x, y), std::atan2(y, x),
182 static_cast<Acts::Experimental::GbtsLayerIndex>(layer), clusterWidth,
183 localPositionY, strip);
184
185 if (bin.has_value()) {
186 ++(isPixel ? nPixelNodes : nStripNodes);
187 }
188 }
189
190 ATH_MSG_DEBUG("Inserted " << nPixelNodes << " pixel and " << nStripNodes
191 << " strip nodes; the graph "
192 << (nodeStorage.hasStrips() ? "carries" : "does not carry")
193 << " stereo pairs");
194
195 if (nUnmappedHashes != 0) [[unlikely]] {
196 ATH_MSG_WARNING(nUnmappedHashes << " space points sit on a wafer hash "
197 "outside the GBTS layer map and were dropped");
198 }
199 if (nUngroupedModules != 0) {
200 ATH_MSG_DEBUG(nUngroupedModules << " space points sit on a wafer GBTS "
201 "does not group into a layer");
202 }
203
204 // order the nodes and build the derived per-node data
205 nodeStorage.finalize();
206
207 ATH_MSG_VERBOSE("Spacepoints successfully added to node storage");
208
209 Acts::SeedContainer seeds;
210 m_finder->createSeeds(nodeStorage, m_internalRoi.value(), *m_filter, options, seeds);
211
212 // add seeds to the output container
213 seedContainer.reserve(seedContainer.size() + seeds.size(), 7.0f);
214 for (auto seed : seeds) {
215 seedContainer.push_back(
216 seed.asConst(),
217 [&](const Acts::SpacePointIndex spIndex) {
218 return tmpSpacePoints[spIndex];
219 });
220 }
221
222 ATH_MSG_VERBOSE("Number of seeds created is " << seedContainer.size());
223 return StatusCode::SUCCESS;
224 }
225
226 // this is called in initialise
227 // adds all veriables that may have been changed in the gaudi properties defined in headerfile
228
230 const std::vector<Acts::Experimental::GbtsLayerDescription>& layers,
231 std::vector<Acts::Experimental::GbtsLayerConnection>& connections,
232 float& etaBinWidth) const
233 {
234 std::ifstream connectionStream(m_connectorInputFile.value());
235 if (!connectionStream.is_open()) {
236 ATH_MSG_ERROR("Cannot open the GBTS connection table "
237 << m_connectorInputFile.value());
238 return StatusCode::FAILURE;
239 }
240
242 try {
243 table = GbtsConnectionTable::read(connectionStream);
244 } catch (const std::exception& e) {
245 ATH_MSG_ERROR("Cannot read " << m_connectorInputFile.value() << ": "
246 << e.what());
247 return StatusCode::FAILURE;
248 }
249
250 // the table names a layer by its id, the layer tool by its dense index
251 std::unordered_map<Acts::Experimental::GbtsExperimentLayerId,
252 Acts::Experimental::GbtsLayerTechnology>
253 layerTechnologies;
254 layerTechnologies.reserve(layers.size());
255 for (const Acts::Experimental::GbtsLayerDescription& layer : layers) {
256 layerTechnologies.emplace(layer.id, layer.technology);
257 }
258
259 etaBinWidth = table.etaBinWidth;
260
261 // the stage column only fixes the order the connections are handed over in
262 std::vector<std::pair<std::uint32_t, Acts::Experimental::GbtsLayerConnection>> staged;
263 staged.reserve(table.connections.size());
264
265 std::size_t nOtherTechnology = 0;
266 std::size_t nUnknownLayer = 0;
267
268 for (const GbtsConnectionTable::Connection& connection :
269 table.connections) {
270 const auto src = layerTechnologies.find(connection.src);
271 const auto dst = layerTechnologies.find(connection.dst);
272 if (src == layerTechnologies.end() || dst == layerTechnologies.end()) {
273 ++nUnknownLayer;
274 continue;
275 }
276
277 // GBTS pairs a layer only with one of its own technology
278 const bool wanted = src->second == dst->second &&
279 (src->second ==
280 Acts::Experimental::GbtsLayerTechnology::Pixel
281 ? m_pixelConnections.value()
282 : m_stripConnections.value());
283 if (!wanted) {
284 ++nOtherTechnology;
285 continue;
286 }
287
288 staged.emplace_back(connection.stage,
289 Acts::Experimental::GbtsLayerConnection{connection.src,
290 connection.dst});
291 }
292
293 std::ranges::stable_sort(staged, {}, [](const auto& entry) { return entry.first; });
294
295 connections.clear();
296 connections.reserve(staged.size());
297 for (const auto& entry : staged) {
298 connections.push_back(entry.second);
299 }
300 const std::size_t nKept = connections.size();
301
302 if (nUnknownLayer != 0) {
303 ATH_MSG_WARNING(nUnknownLayer << " connections of "
304 << m_connectorInputFile.value() << " name no GBTS layer "
305 "and were dropped");
306 }
307 if (nKept == 0) {
308 ATH_MSG_ERROR("None of the connections of "
309 << m_connectorInputFile.value() << " are usable: the table "
310 "does not match the detector this job is reconstructing");
311 return StatusCode::FAILURE;
312 }
313 ATH_MSG_DEBUG("Kept " << nKept << " GBTS layer connections, dropping "
314 << nOtherTechnology << " of a technology not asked for, eta bin width "
315 << etaBinWidth);
316
317 return StatusCode::SUCCESS;
318 }
319
321 Acts::Experimental::detail::GbtsTauLookupTable& tauLookupTable) const
322 {
323 std::ifstream lutStream(m_lutFile.value());
324 if (!lutStream.is_open()) {
325 ATH_MSG_ERROR("Cannot open the GBTS tau lookup table " << m_lutFile.value());
326 return StatusCode::FAILURE;
327 }
328
329 tauLookupTable.clear();
330
331 // the width is dropped: a row is located by index, one row per
332 // tauLutBinWidth of cluster width, never searched
333 float clusterWidth = 0.0f;
334 Acts::Experimental::detail::GbtsTauBounds bounds;
335 while (lutStream >> clusterWidth >> bounds.minTau >> bounds.maxTau >>
336 bounds.minTauNearEdge >> bounds.maxTauNearEdge) {
337 tauLookupTable.push_back(bounds);
338 }
339
340 if (!lutStream.eof()) {
341 // ended on a parse error, not on a clean end of file
342 ATH_MSG_ERROR("Malformed GBTS tau lookup table " << m_lutFile.value());
343 return StatusCode::FAILURE;
344 }
345 if (tauLookupTable.empty()) {
346 ATH_MSG_ERROR("The GBTS tau lookup table " << m_lutFile.value() << " is empty");
347 return StatusCode::FAILURE;
348 }
349
350 ATH_MSG_DEBUG("Read " << tauLookupTable.size() << " rows of the GBTS tau lookup table "
351 << m_lutFile.value());
352
353 return StatusCode::SUCCESS;
354 }
355
357 m_finderCfg.useStripConnections = m_stripConnections;
358 m_finderCfg.useClusterWidthCuts = m_useML;
359 m_finderCfg.matchBeforeCreate = m_matchBeforeCreate;
360 m_finderCfg.beamSpotCorrection = m_beamSpotCorrection;
361 m_finderCfg.minPt = m_minPt;
362 m_finderCfg.nMaxPhiSlice = m_nMaxPhiSlice;
363 m_finderCfg.useEtaBinning = m_useEtaBinning;
364 m_finderCfg.doubletFilterRZ = m_doubletFilterRZ;
365 m_finderCfg.minDeltaRadius = m_minDeltaRadius;
366 m_finderCfg.nMaxEdges = m_nMaxEdges;
367 m_finderCfg.tauRatioCut = m_tauRatioCut;
368 m_finderCfg.tauRatioPrecut = m_tauRatioPrecut;
369 m_finderCfg.edgeMaskMinEta = m_edgeMaskMinEta;
370 m_finderCfg.hitShareThreshold = m_hitShareThreshold;
371 m_finderCfg.maxEndcapClusterWidth = m_maxEndcapClusterwidth;
372 m_finderCfg.d0Max = m_d0Max;
373
374 //use roi for pixel and given value for strip
375 m_finderCfg.maxZ0 = m_maxZ0.value();
376 m_finderCfg.minZ0 = m_minZ0.value();
377
378 m_finderCfg.validateTriplets = m_validateTriplets;
379 m_finderCfg.useAdaptiveCuts = m_useAdaptiveCuts;
380 m_finderCfg.tauRatioCorr = m_tauRatioCorr;
381 m_finderCfg.addTriplets = m_addTriplets;
382 m_finderCfg.maxAbsEtaAddTriplets = m_maxEtaAddTriplets;
383 m_finderCfg.cutDPhiMax = m_cutDPhiMax;
384 m_finderCfg.cutDCurvMax = m_cutDCurvMax;
385 m_finderCfg.maxOuterRadius = m_maxOuterRadius;
386
387 // The seeder no longer recognises an LRT mode, so spell out what it used
388 // to imply: a triplet with no confirmation.
389 if (m_LRTmode) {
390 m_finderCfg.minSeedLevel = 2;
391 }
392
393 m_filterCfg.sigmaMS = m_sigmaMS;
394 m_filterCfg.radLen = m_radLen;
395 m_filterCfg.sigmaX = m_sigmaX;
396 m_filterCfg.sigmaY = m_sigmaY;
397 m_filterCfg.weightX = m_weightX;
398 m_filterCfg.weightY = m_weightY;
399 m_filterCfg.maxDChi2X = m_maxDChi2X;
400 m_filterCfg.maxDChi2Y = m_maxDChi2Y;
401 m_filterCfg.addHit = m_addHit;
402 m_filterCfg.maxCurvature = m_maxCurvature;
404
405 return StatusCode::SUCCESS;
406 }
407
408 // called in initialise, used to make sure all config settings look sensible
410 ATH_MSG_DEBUG("===== GBTS finder config =====");
411 ATH_MSG_DEBUG( "beamSpotCorrection: " << m_finderCfg.beamSpotCorrection);
412 ATH_MSG_DEBUG( "connectorInputFile: " << m_connectorInputFile.value());
413 ATH_MSG_DEBUG( "lutInputFile: " << m_lutFile.value());
414 ATH_MSG_DEBUG( "LRTmode: " << m_LRTmode.value());
415 ATH_MSG_DEBUG( "useStripConnections: " << m_finderCfg.useStripConnections);
416 ATH_MSG_DEBUG( "useClusterWidthCuts: " << m_finderCfg.useClusterWidthCuts);
417 ATH_MSG_DEBUG( "matchBeforeCreate: " << m_finderCfg.matchBeforeCreate);
418 ATH_MSG_DEBUG( "minSeedLevel: " << m_finderCfg.minSeedLevel);
419 ATH_MSG_DEBUG( "tauRatioPrecut: " << m_finderCfg.tauRatioPrecut);
420 ATH_MSG_DEBUG( "tauRatioCut: " << m_finderCfg.tauRatioCut);
421 ATH_MSG_DEBUG( "tauRatioCorr: " << m_finderCfg.tauRatioCorr);
422 ATH_MSG_DEBUG( "etaBinWidthOverride: " << m_etaBinWidthOverride.value());
423 ATH_MSG_DEBUG( "nMaxPhiSlice: " << m_finderCfg.nMaxPhiSlice);
424 ATH_MSG_DEBUG( "minPt: " << m_finderCfg.minPt);
425 ATH_MSG_DEBUG( "useEtaBinning: " << m_finderCfg.useEtaBinning);
426 ATH_MSG_DEBUG( "doubletFilterRZ: " << m_finderCfg.doubletFilterRZ);
427 ATH_MSG_DEBUG( "nMaxEdges: " << m_finderCfg.nMaxEdges);
428 ATH_MSG_DEBUG( "minDeltaRadius: " << m_finderCfg.minDeltaRadius);
429 ATH_MSG_DEBUG( "edgeMaskMinEta: " << m_finderCfg.edgeMaskMinEta);
430 ATH_MSG_DEBUG( "hitShareThreshold: " << m_finderCfg.hitShareThreshold);
431 ATH_MSG_DEBUG( "maxEndcapClusterWidth: " << m_finderCfg.maxEndcapClusterWidth);
432 ATH_MSG_DEBUG( "d0Max: " << m_finderCfg.d0Max);
433 ATH_MSG_DEBUG("maxZ0: " << m_finderCfg.maxZ0);
434 ATH_MSG_DEBUG("minZ0: " << m_finderCfg.minZ0);
435 ATH_MSG_DEBUG( "validateTriplets: " << m_finderCfg.validateTriplets);
436 ATH_MSG_DEBUG( "useAdaptiveCuts: " << m_finderCfg.useAdaptiveCuts);
437 ATH_MSG_DEBUG( "addTriplets: " << m_finderCfg.addTriplets);
438 ATH_MSG_DEBUG( "maxEtaAddTriplets: " << m_finderCfg.maxAbsEtaAddTriplets);
439 ATH_MSG_DEBUG("cutDphiMax: " << m_finderCfg.cutDPhiMax);
440 ATH_MSG_DEBUG("cutDCurvMax: " << m_finderCfg.cutDCurvMax);
441 ATH_MSG_DEBUG("maxOuterRadius: " << m_finderCfg.maxOuterRadius);
442
443 ATH_MSG_DEBUG("===== GBTS filter config =====");
444 ATH_MSG_DEBUG( "sigmaMS: " << m_filterCfg.sigmaMS);
445 ATH_MSG_DEBUG( "radLen: " << m_filterCfg.radLen);
446 ATH_MSG_DEBUG( "sigmaX: " << m_filterCfg.sigmaX);
447 ATH_MSG_DEBUG( "sigmaY: " << m_filterCfg.sigmaY);
448 ATH_MSG_DEBUG( "weightX: " << m_filterCfg.weightX);
449 ATH_MSG_DEBUG( "weightY: " << m_filterCfg.weightY);
450 ATH_MSG_DEBUG( "maxDChi2X: " << m_filterCfg.maxDChi2X);
451 ATH_MSG_DEBUG( "maxDChi2Y: " << m_filterCfg.maxDChi2Y);
452 ATH_MSG_DEBUG( "addHit: " << m_filterCfg.addHit);
453 ATH_MSG_DEBUG( "maxCurvature: " << m_filterCfg.maxCurvature);
454 ATH_MSG_DEBUG( "filterMaxZ0: " << m_filterCfg.maxZ0);
455}
456
457} // 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
#define x
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< bool > m_usePixelLayers
Which technologies this instance seeds on.
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_useStripLayers
Gaudi::Property< bool > m_pixelConnections
Gaudi::Property< float > m_maxOuterRadius
Gaudi::Property< float > m_etaBinWidthOverride
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< 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
StatusCode readConnections(const std::vector< Acts::Experimental::GbtsLayerDescription > &layers, 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< 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