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