ATLAS Offline Software
Loading...
Searching...
No Matches
TrigInDetTrackSeedingTool.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
7
13
15
17
19
20#include "GNN_TrackingFilter.h"
21
22//for GPU offloading
23
26
28 const std::string& n,
29 const IInterface* p ) : SeedingToolBase(t,n,p)
30{
31
32}
33
35
37
38 ATH_CHECK(m_regsel_pix.retrieve());
39 ATH_CHECK(m_regsel_sct.retrieve());
40
41 ATH_CHECK(m_beamSpotKey.initialize());
42
43 if(m_useGPU) {//for GPU offloading
44 ATH_CHECK(m_accelSvc.retrieve());
45 ATH_CHECK(m_accelSvc->isReady());
46 }
47
49 ATH_MSG_FATAL("Both usePixelSpacePoints and useSctSpacePoints set to False. At least one needs to be True");
50 return StatusCode::FAILURE;
51 }
52
53 if (!m_useSctSpacePoints) ATH_MSG_INFO("Only using Pixel spacepoints => Pixel seeds only");
54
55 if (!m_usePixelSpacePoints) ATH_MSG_INFO("Only using SCT spacepoints => Strip seeds only");
56
57 if (m_usePixelSpacePoints && m_useSctSpacePoints) ATH_MSG_INFO("Using SCT and Pixel spacepoints");
58
60
62
63 ATH_MSG_INFO("TrigInDetTrackSeedingTool initialized with " << m_useGPU);
64
65 return StatusCode::SUCCESS;
66}
67
71
72
73TrigInDetTrackSeedingResult TrigInDetTrackSeedingTool::findSeeds(const IRoiDescriptor& internalRoI, std::vector<TrigInDetTracklet>& output, const EventContext& ctx) const {
74
76
77 output.clear();
78
80 const Amg::Vector3D &vertex = beamSpotHandle->beamPos();
81 float shift_x = vertex.x() - beamSpotHandle->beamTilt(0)*vertex.z();
82 float shift_y = vertex.y() - beamSpotHandle->beamTilt(1)*vertex.z();
83
84 std::unique_ptr<GNN_DataStorage> storage = std::make_unique<GNN_DataStorage>(*m_geo, m_mlLUT);
85
86 int nPixels = 0;
87 int nStrips = 0;
88
89 const SpacePointContainer* sctSpacePointsContainer = nullptr;
90 const SpacePointContainer* pixelSpacePointsContainer = nullptr;
91
92 std::map<short, std::vector<IdentifierHash> > detIdMap;//relates global detector layer ID to constituent detector elements
93
95
97
98 if(!sctHandle.isValid()) {
99 ATH_MSG_WARNING("Invalid Strip Spacepoints handle: "<<sctHandle);
100 return seedStats;
101
102 }
103
104 sctSpacePointsContainer = sctHandle.ptr();
105
106 std::vector<IdentifierHash> listOfSctIds;
107 m_regsel_sct->lookup(ctx)->HashIDList( internalRoI, listOfSctIds );
108
109 const std::vector<short>* h2l = m_layerNumberTool->sctLayers();
110
111 for(const auto& hashId : listOfSctIds) {
112
113 short layerIndex = h2l->at(static_cast<int>(hashId));
114
115 auto it = detIdMap.find(layerIndex);
116 if(it != detIdMap.end()) (*it).second.push_back(hashId);
117 else {
118 std::vector<IdentifierHash> v = {hashId};
119 detIdMap.insert(std::make_pair(layerIndex,v));
120 }
121 }
122 }
123
125
127
128 if(!pixHandle.isValid()) {
129 ATH_MSG_WARNING("Invalid Pixel Spacepoints handle: "<<pixHandle);
130 return seedStats;
131 }
132
133 pixelSpacePointsContainer = pixHandle.ptr();
134
135 std::vector<IdentifierHash> listOfPixIds;
136
137 m_regsel_pix->lookup(ctx)->HashIDList( internalRoI, listOfPixIds );
138
139 const std::vector<short>* h2l = m_layerNumberTool->pixelLayers();
140
141 for(const auto& hashId : listOfPixIds) {
142
143 short layerIndex = h2l->at(static_cast<int>(hashId));
144
145 auto it = detIdMap.find(layerIndex);
146 if(it != detIdMap.end()) (*it).second.push_back(hashId);
147 else {
148 std::vector<IdentifierHash> v = {hashId};
149 detIdMap.insert(std::make_pair(layerIndex,v));
150 }
151 }
152 }
153
154 if(!m_useGPU) {
155
156 std::unique_ptr<GNN_DataStorage> storage = std::make_unique<GNN_DataStorage>(*m_geo, m_mlLUT);
157
158 std::vector<const Trk::SpacePoint*> vSP;
159
160 vSP.reserve(m_nMaxEdges);
161
162 std::vector<std::vector<GNN_Node> > trigSpStorage[2];
163
164 trigSpStorage[1].resize(m_layerNumberTool->sctLayers()->size());
165
166 trigSpStorage[0].resize(m_layerNumberTool->pixelLayers()->size());
167
168 for(const auto& lColl : detIdMap) {
169
170 short layerIndex = lColl.first;
171
172 int layerKey = m_geo->getTrigFTF_GNN_LayerByIndex(layerIndex)->m_layer.m_subdet;
173
174 bool isPixel = layerKey > 20000;
175
176 auto pCont = isPixel ? pixelSpacePointsContainer : sctSpacePointsContainer;
177
178 int contIdx= isPixel ? 0 : 1;
179
180 int nNewNodes = 0;
181
182 for(const auto& idx : lColl.second) {
183
184 std::vector<GNN_Node>& tmpColl = trigSpStorage[contIdx].at(static_cast<int>(idx));
185
186 auto input_coll = pCont->indexFindPtr(idx);
187
188 if(input_coll == nullptr) continue;
189
190 createGraphNodes(input_coll, tmpColl, vSP, layerIndex, shift_x, shift_y);//TO-DO: if(m_useBeamTilt) SP full transform functor
191
192 nNewNodes += (isPixel) ? storage->loadPixelGraphNodes(layerIndex, tmpColl, m_useML) : storage->loadStripGraphNodes(layerIndex, tmpColl);
193 }
194
195 if(isPixel) nPixels += nNewNodes;
196 else nStrips += nNewNodes;
197 }
198
199 seedStats.m_nPixelSPs = nPixels;
200 seedStats.m_nStripSPs = nStrips;
201
202 storage->sortByPhi();
203 storage->initializeNodes(m_useML);
204 storage->generatePhiIndexing(1.5*m_phiSliceWidth);
205
206 std::vector<GNN_Edge> edgeStorage;
207
208 std::pair<int, int> graphStats = buildTheGraph(internalRoI, storage, edgeStorage);
209
210 ATH_MSG_DEBUG("Created graph with "<<graphStats.first<<" edges and "<<graphStats.second<< " edge links");
211
212 seedStats.m_nGraphEdges = graphStats.first;
213 seedStats.m_nEdgeLinks = graphStats.second;
214
215 if (graphStats.second == 0) return seedStats;
216
217 int maxLevel = runCCA(graphStats.first, edgeStorage);
218
219 ATH_MSG_DEBUG("Reached Level "<<maxLevel<<" after GNN iterations");
220
221 std::vector<std::tuple<float, int, std::vector<unsigned int> > > vSeedCandidates;
222
223 extractSeedsFromTheGraph(maxLevel, graphStats.first, vSP.size(), edgeStorage, vSeedCandidates);
224
225 if (vSeedCandidates.empty()) return seedStats;
226
227 for(const auto& seed : vSeedCandidates) {
228
229 if (std::get<1>(seed) != 0) continue;//identified as a clone of a better candidate
230
231 unsigned int lastIdx = output.size();
232 output.emplace_back(std::get<0>(seed));
233
234 for(const auto& sp_idx : std::get<2>(seed)) {
235 output[lastIdx].addSpacePoint(vSP[sp_idx]);
236 }
237 }
238
239 ATH_MSG_DEBUG("Found "<<output.size()<<" tracklets");
240 }
241 else {//GPU-accelerated graph building
242 //1. data export
243
244 std::vector<const Trk::SpacePoint*> vSP;
245 std::vector<short> vL;
246
249
250 std::unique_ptr<TrigAccel::DATA_EXPORT_BUFFER> dataBuffer = std::unique_ptr<TrigAccel::DATA_EXPORT_BUFFER>(new TrigAccel::DATA_EXPORT_BUFFER(5000));
251
252 size_t dataTypeSize = sizeof(TrigAccel::ITk::GRAPH_MAKING_INPUT_DATA);
253 const size_t bufferOffset = 256;
254 size_t totalSize = bufferOffset+dataTypeSize;//make room for the header
255 if(!dataBuffer->fit(totalSize)) dataBuffer->reallocate(totalSize);
256
257 TrigAccel::ITk::GRAPH_MAKING_INPUT_DATA* pJobData = reinterpret_cast<TrigAccel::ITk::GRAPH_MAKING_INPUT_DATA*>(dataBuffer->m_buffer + bufferOffset);
258
259 unsigned int spIdx = 0;
260 int sp_offset = 0;
261 int nLayers = 0;
262 int MaxEtaBin = 0;
263 int nEtaBins = 0;
264
265 for(const auto& lColl : detIdMap) {
266
267 short layerIndex = lColl.first;
268
269 const TrigFTF_GNN_Layer* pL = m_geo->getTrigFTF_GNN_LayerByIndex(layerIndex);
270
271 int layerKey = pL->m_layer.m_subdet;
272
273 bool isPixel = layerKey > 20000;
274 bool isBarrel = (pL->m_layer.m_type == 0);
275
276 auto pCont = isPixel ? pixelSpacePointsContainer : sctSpacePointsContainer;
277
278 pJobData->m_layerIdx[nLayers] = layerIndex;
279
280 pJobData->m_layerInfo[4*nLayers ] = spIdx;//layerInfo.x
281 pJobData->m_layerInfo[4*nLayers + 2] = pL->num_bins();//layerInfo.z
282 pJobData->m_layerInfo[4*nLayers + 3] = pL->m_bins[0];//layerInfo.w
283
284 pJobData->m_layerGeo[2*nLayers ] = pL->m_minEta;//layerGeo.x
285 pJobData->m_layerGeo[2*nLayers + 1] = pL->m_etaBin;//layerGeo.y
286
287 nEtaBins += pL->m_bins.size();
288
289 for(auto b : pL->m_bins) {
290 if(b > MaxEtaBin) MaxEtaBin = b;
291 }
292
293 for(const auto& idx : lColl.second) {
294
295 auto input_coll = pCont->indexFindPtr(idx);
296
297 if(input_coll == nullptr) continue;
298
299 for(const auto sp : *input_coll) {
300
301 float cw = -1.0;
302
303 const InDet::PixelCluster* pCL = dynamic_cast<const InDet::PixelCluster*>(sp->clusterList().first);
304 if(pCL != nullptr) {
305 cw = pCL->width().widthPhiRZ().y();
306 if(!isBarrel && m_useML) {
307 if(cw > 0.2) continue;
308 cw = -1.0;//set it to -1 so that it can be skipped later in the ML code on GPU
309 }
310 }
311
312 vSP.emplace_back(sp);
313 vL.emplace_back(layerIndex);
314
315 const auto& p = sp->globalPosition();
316
317 float params[4] = {(float)(p.x() - shift_x), float(p.y() - shift_y), (float)(p.z()), cw};
318
319 memcpy(&pJobData->m_params[sp_offset], &params[0], sizeof(params));
320
321 sp_offset += 4;
322 spIdx++;
324 }
326 }
327
328 pJobData->m_layerInfo[4*nLayers + 1] = spIdx;//layerInfo.y
329
330 if (isPixel) nPixels += spIdx - pJobData->m_layerInfo[4*nLayers];
331 else nStrips += spIdx - pJobData->m_layerInfo[4*nLayers];
332
333 nLayers++;
334 }
335
336 if(spIdx == 0) return seedStats;
337
338 pJobData->m_nSpacepoints = spIdx;
339 pJobData->m_nLayers = nLayers;
340 pJobData->m_nEtaBins = nEtaBins;
341 pJobData->m_maxEtaBin = MaxEtaBin;
342 pJobData->m_nMaxEdges = static_cast<unsigned int>(7*spIdx);
343
344 //load bin pairs
345
346 int pairIdx = 0;
347
348 for(const auto& bg : m_geo->bin_groups()) {//loop over bin groups
349
350 int bin1_idx = bg.first;
351
352 for(const auto& bin2_idx : bg.second) {
353 pJobData->m_bin_pairs[2*pairIdx ] = bin1_idx;
354 pJobData->m_bin_pairs[2*pairIdx+1] = bin2_idx;
355 pairIdx++;
356 }
357 }
358
359 pJobData->m_nBinPairs = pairIdx;
360
361 //add algorithm parameters
362
363 const float ptCoeff = 0.29997*1.9972/2.0;// ~0.3*B/2 - assuming nominal field of 2*T
364
365 float tripletPtMin = 0.8*m_minPt;//correction due to limited pT resolution
366
367 float maxCurv = ptCoeff/tripletPtMin;
368
369 const float pt_scale = 900/m_minPt;
370
371 const float min_deltaPhi_low_dr = 0.002*pt_scale;
372 const float dphi_coeff_low_dr = 4.33e-4*pt_scale;
373 const float min_deltaPhi = 0.015*pt_scale;
374 const float dphi_coeff = 2.2e-4*pt_scale;
375
376 const float cut_dphi_max = m_LRTmode ? 0.07 : 0.012;
377 const float cut_dcurv_max = m_LRTmode ? 0.015 : 0.001;
378 const float cut_tau_ratio_max = m_LRTmode ? 0.015f : 0.01;
379 const float min_z0 = m_LRTmode ? -600.0 : internalRoI.zedMinus();
380 const float max_z0 = m_LRTmode ? 600.0 : internalRoI.zedPlus();
381
382 const float maxOuterRadius = m_LRTmode ? 1050.0 : 550.0;
383 const float minDeltaRadius = 2.0;
384
385 const float cut_zMinU = min_z0 + maxOuterRadius*internalRoI.dzdrMinus();
386 const float cut_zMaxU = max_z0 + maxOuterRadius*internalRoI.dzdrPlus();
387
388 const float maxKappa = m_LRTmode ? 1.0*maxCurv : 0.9*maxCurv;
389
390 pJobData->m_algo_params[0] = min_deltaPhi;
391 pJobData->m_algo_params[1] = dphi_coeff;
392 pJobData->m_algo_params[2] = min_deltaPhi_low_dr;
393 pJobData->m_algo_params[3] = dphi_coeff_low_dr;
394 pJobData->m_algo_params[4] = minDeltaRadius;
395 pJobData->m_algo_params[5] = min_z0;
396 pJobData->m_algo_params[6] = max_z0;
397 pJobData->m_algo_params[7] = maxOuterRadius;
398 pJobData->m_algo_params[8] = cut_zMinU;
399 pJobData->m_algo_params[9] = cut_zMaxU;
400 pJobData->m_algo_params[10] = maxKappa;
401 pJobData->m_algo_params[11] = cut_dphi_max;
402 pJobData->m_algo_params[12] = cut_dcurv_max;
403 pJobData->m_algo_params[13] = cut_tau_ratio_max;
404
405 int minLevel = 3;//a triplet + 1 confirmation
406
407 if(m_LRTmode) {
408 minLevel = 2;//a triplet
409 }
410
411 pJobData->m_minLevel = minLevel;
412
414
415 seedStats.m_nPixelSPs = nPixels;
416 seedStats.m_nStripSPs = nStrips;
417
418 ATH_MSG_DEBUG("Loaded "<<nPixels<< " Pixel Spacepoints and "<<nStrips<< " Strip SpacePoints");
419
420 std::shared_ptr<TrigAccel::OffloadBuffer> pBuff = std::make_shared<TrigAccel::OffloadBuffer>(dataBuffer.get());
421
422 std::unique_ptr<TrigAccel::Work> pWork = std::unique_ptr<TrigAccel::Work>(m_accelSvc->createWork(TrigAccel::InDetJobControlCode::RUN_GBTS, pBuff));
423
424 if(!pWork) {
425 ATH_MSG_WARNING("Failed to create a work item for task "<<TrigAccel::InDetJobControlCode::RUN_GBTS);
426 return seedStats;
427 }
428
429 bool workSuccess = pWork->run();
430 if(!workSuccess) {
431 ATH_MSG_WARNING("Work item failed to complete");
432 return seedStats;
433 }
434
435 std::shared_ptr<TrigAccel::OffloadBuffer> pOutput = pWork->getOutput();
436
437 TrigAccel::ITk::GRAPH_AND_SEEDS_OUTPUT* pGraphAndSeeds = reinterpret_cast<TrigAccel::ITk::GRAPH_AND_SEEDS_OUTPUT*>(pOutput->m_rawBuffer);
438 TrigAccel::ITk::COMPRESSED_GRAPH* pGraph = &pGraphAndSeeds->m_CompressedGraph;
439 TrigAccel::ITk::OUTPUT_SEEDS* pSeeds = &pGraphAndSeeds->m_OutputSeeds;
440
442 if(pSeeds->m_nSeeds == 0) return seedStats;
443 //converting tracklet into GBTS-CPU format
444 for(unsigned int seed=0; seed<pSeeds->m_nSeeds; seed++) {
445
446 unsigned int lastIdx = output.size();
447 output.emplace_back(pSeeds->m_seedsArray[seed].m_Q);
448 for(int node=0; node<pSeeds->m_seedsArray[seed].m_size; node++) {
449 output[lastIdx].addSpacePoint(vSP[pSeeds->m_seedsArray[seed].m_nodes[node]]);
450 }
451 }
452 }
453 else {
454
455 unsigned int nEdges = pGraph->m_nEdges;
456 unsigned int nMaxNei = pGraph->m_nMaxNeighbours;
457
458 //populating the edgeStorage
459
460 std::vector<GNN_Node> nodes;
461
462 nodes.reserve(vSP.size());
463
464 for(unsigned int idx = 0;idx < vSP.size(); idx++) {
465
466 nodes.emplace_back(vL[idx]);
467
468 const auto& pos = vSP[idx]->globalPosition();
469 float xs = pos.x() - shift_x;
470 float ys = pos.y() - shift_y;
471 float zs = pos.z();
472
473 nodes[idx].m_x = xs;
474 nodes[idx].m_y = ys;
475 nodes[idx].m_z = zs;
476 nodes[idx].m_r = std::sqrt(xs*xs + ys*ys);
477
478 nodes[idx].m_idx = idx;
479
480 }
481
482 std::vector<GNN_Edge> edgeStorage;
483
484 std::pair<int, int> graphStats(0,0);
485
486 edgeStorage.resize(nEdges);
487
488 unsigned int edgeSize = nMaxNei + 1 + 2;//neigbours, num_neighbours, 2 nodes
489
490 for(unsigned int idx=0;idx<nEdges;idx++) {
491 unsigned int pos = idx*edgeSize;
492
493 int node1Idx = pGraph->m_graphArray[pos + TrigAccel::ITk::node1];
494 int node2Idx = pGraph->m_graphArray[pos + TrigAccel::ITk::node2];
495 int nNei = pGraph->m_graphArray[pos + TrigAccel::ITk::nNei];
496
497 if(nNei > N_SEG_CONNS) nNei = N_SEG_CONNS;
498
499 edgeStorage[idx].m_n1 = &nodes[node1Idx];
500 edgeStorage[idx].m_n2 = &nodes[node2Idx];
501 edgeStorage[idx].m_level = 1;
502 edgeStorage[idx].m_nNei = nNei;
503 for(int k=0;k<nNei;k++) {
504 edgeStorage[idx].m_vNei[k] = pGraph->m_graphArray[pos + TrigAccel::ITk::nei_idx_start + k];
505 }
506 }
507
508 graphStats.first = nEdges;
509 graphStats.second = pGraph->m_nLinks;
510
511 //run the rest of the GBTS workflow
512
513 int maxLevel = runCCA(graphStats.first, edgeStorage);
514
515 ATH_MSG_DEBUG("Reached Level "<<maxLevel<<" after GNN iterations");
516
517 if(maxLevel < minLevel) return seedStats;
518
519 std::vector<GNN_Edge*> vSeeds;
520
521 vSeeds.reserve(graphStats.first/2);
522
523 for(int edgeIndex=0;edgeIndex<graphStats.first;edgeIndex++) {
524 GNN_Edge* pS = &(edgeStorage.at(edgeIndex));
525
526 if(pS->m_level < minLevel) continue;
527
528 vSeeds.push_back(pS);
529 }
530
531 if(vSeeds.empty()) return seedStats;
532
533 std::sort(vSeeds.begin(), vSeeds.end(), GNN_Edge::CompareLevel());
534
535 //backtracking
536
537 TrigFTF_GNN_TrackingFilter tFilter(m_layerGeometry, edgeStorage);
538
539 output.reserve(vSeeds.size());
540
541 for(auto pS : vSeeds) {
542
543 if(pS->m_level == -1) continue;
544
546
547 tFilter.followTrack(pS, rs);
548
549 if(!rs.m_initialized) {
550 continue;
551 }
552
553 if(static_cast<int>(rs.m_vs.size()) < minLevel) continue;
554
555 std::vector<const GNN_Node*> vN;
556
557 for(std::vector<GNN_Edge*>::reverse_iterator sIt=rs.m_vs.rbegin();sIt!=rs.m_vs.rend();++sIt) {
558
559 (*sIt)->m_level = -1;//mark as collected
560
561 if(sIt == rs.m_vs.rbegin()) {
562 vN.push_back((*sIt)->m_n1);
563 }
564 vN.push_back((*sIt)->m_n2);
565 }
566
567 if(vN.size()<3) continue;
568
569 unsigned int lastIdx = output.size();
570 output.emplace_back(rs.m_J);
571
572 for(const auto& n : vN) {
573 output[lastIdx].addSpacePoint(vSP[n->m_idx]);
574 }
575 }
576 }
577 ATH_MSG_DEBUG("Found "<<output.size()<<" tracklets");
578 }
579 return seedStats;
580}
581
582void TrigInDetTrackSeedingTool::createGraphNodes(const SpacePointCollection* spColl, std::vector<GNN_Node>& tmpColl, std::vector<const Trk::SpacePoint*>& vSP, unsigned short layer, float shift_x, float shift_y) const {
583
584 tmpColl.resize(spColl->size(), GNN_Node(layer));//all nodes belong to the same layer
585
586 int idx = 0;
587 int init_size = vSP.size();
588 for(const auto sp : *spColl) {
589 const auto& pos = sp->globalPosition();
590 vSP.emplace_back(sp);
591 float xs = pos.x() - shift_x;
592 float ys = pos.y() - shift_y;
593 float zs = pos.z();
594 tmpColl[idx].m_x = xs;
595 tmpColl[idx].m_y = ys;
596 tmpColl[idx].m_z = zs;
597 tmpColl[idx].m_r = std::sqrt(xs*xs + ys*ys);
598 tmpColl[idx].m_phi = std::atan2(ys,xs);
599 tmpColl[idx].m_idx = init_size + idx;
600
601 const InDet::PixelCluster* pCL = dynamic_cast<const InDet::PixelCluster*>(sp->clusterList().first);
602 if(pCL != nullptr){
603 tmpColl[idx].m_pcw = pCL->width().z();
604 tmpColl[idx].m_locPosY = pCL->localPosition().y();
605 }
606
607 idx++;
608 }
609}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_FATAL(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
This class provides an interface to generate or decode an identifier for the upper levels of the dete...
#define N_SEG_CONNS
static Double_t sp
static Double_t rs
static unsigned int totalSize(const MultiDimArray< T, N > &ht)
This is an Identifier helper class for the Pixel subdetector.
This is an Identifier helper class for the SCT subdetector.
size_type size() const noexcept
Returns the number of elements in the collection.
Describes the API of the Region of Ineterest geometry.
virtual double zedPlus() const =0
the zed and eta values at the most forward and most rear ends of the RoI
virtual double dzdrMinus() const =0
return the gradients
virtual double zedMinus() const =0
virtual double dzdrPlus() const =0
const InDet::SiWidth & width() const
return width class reference
double z() const
Definition SiWidth.h:131
const Amg::Vector2D & widthPhiRZ() const
Definition SiWidth.h:121
const_pointer_type ptr()
Dereference the pointer.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
int runCCA(int, std::vector< GNN_Edge > &) const
ToolHandle< ITrigL2LayerNumberTool > m_layerNumberTool
std::vector< std::array< float, 5 > > m_mlLUT
std::vector< TrigInDetSiLayer > m_layerGeometry
std::pair< int, int > buildTheGraph(const IRoiDescriptor &, const std::unique_ptr< GNN_DataStorage > &, std::vector< GNN_Edge > &) const
SeedingToolBase(const std::string &t, const std::string &n, const IInterface *p)
void extractSeedsFromTheGraph(int, int, int, std::vector< GNN_Edge > &, std::vector< std::tuple< float, int, std::vector< unsigned int > > > &) const
std::unique_ptr< const TrigFTF_GNN_Geometry > m_geo
const TrigInDetSiLayer & m_layer
std::vector< int > m_bins
int num_bins() const
void followTrack(TrigFTF_GNN_Edge *, TrigFTF_GNN_EdgeState &)
TrigInDetTrackSeedingTool(const std::string &, const std::string &, const IInterface *)
void createGraphNodes(const SpacePointCollection *, std::vector< GNN_Node > &, std::vector< const Trk::SpacePoint * > &, unsigned short, float, float) const
SG::ReadHandleKey< SpacePointContainer > m_pixelSpacePointsContainerKey
SG::ReadHandleKey< SpacePointContainer > m_sctSpacePointsContainerKey
virtual StatusCode finalize() override
ToolHandle< IRegSelTool > m_regsel_sct
ToolHandle< IRegSelTool > m_regsel_pix
region selector tools
ServiceHandle< ITrigInDetAccelerationSvc > m_accelSvc
virtual TrigInDetTrackSeedingResult findSeeds(const IRoiDescriptor &, std::vector< TrigInDetTracklet > &, const EventContext &) const override final
virtual StatusCode initialize() override
SG::ReadCondHandleKey< InDet::BeamSpotData > m_beamSpotKey
const Amg::Vector2D & localPosition() const
return the local position reference
Definition node.h:24
Eigen::Matrix< double, 3, 1 > Vector3D
struct TrigAccel::ITk::GraphMakingInputData GRAPH_MAKING_INPUT_DATA
static constexpr unsigned int GBTS_MAX_NUMBER_SPACEPOINTS
static constexpr unsigned char nNei
static constexpr unsigned char node1
static constexpr unsigned char node2
struct TrigAccel::ITk::OutputSeeds OUTPUT_SEEDS
struct TrigAccel::ITk::GraphAndSeedsOutput GRAPH_AND_SEEDS_OUTPUT
static constexpr unsigned char nei_idx_start
struct TrigAccel::ITk::CompressedGraph COMPRESSED_GRAPH
struct TrigAccel::DataExportBuffer DATA_EXPORT_BUFFER
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.
std::unique_ptr< int[]> m_graphArray
int m_bin_pairs[2 *GBTS_MAX_ETA_BIN_PAIR]
int m_layerInfo[4 *GBTS_MAX_SILICON_LAYERS]
float m_layerGeo[2 *GBTS_MAX_SILICON_LAYERS]
int m_layerIdx[GBTS_MAX_SILICON_LAYERS]
float m_params[4 *GBTS_MAX_NUMBER_SPACEPOINTS]
std::unique_ptr< Tracklet[]> m_seedsArray