75 {
76
77 TrigInDetTrackSeedingResult seedStats;
78
80
81 SG::ReadCondHandle<InDet::BeamSpotData> beamSpotHandle {
m_beamSpotKey, ctx };
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;
90
93
94 std::map<short, std::vector<IdentifierHash> > detIdMap;
95
97
99
100 if(!sctHandle.isValid()) {
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
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()) {
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
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
157
158 std::unique_ptr<GNNR3_DataStorage> storage = std::make_unique<GNNR3_DataStorage>(*
m_geo);
159
160 std::vector<const Trk::SpacePoint*> vSP;
161
163
164 std::vector<std::vector<GNNR3_Node> > trigSpStorage[2];
165
167
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
193
194 nNewNodes += (isPixel) ? storage->loadPixelGraphNodes(layerIndex, tmpColl,
m_useML) : storage->loadStripGraphNodes(layerIndex, tmpColl);
195 }
196
197 if(isPixel) nPixels += nNewNodes;
199 }
200
203
204 storage->sortByPhi();
205 storage->initializeNodes(
m_useML);
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
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;
224
226 minLevel = 2;
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
246
247
248
249
251
252 output.reserve(vSeeds.size());
253
254 for(auto pS : vSeeds) {
255
256 if(pS->m_level == -1) continue;
257
258 TrigFTF_GNNR3_EdgeState
rs(
false);
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;
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();
284
285 for(const auto& n : vN) {
286 output[lastIdx].addSpacePoint(vSP[
n->m_idx]);
287 }
288 }
289
291 }
292#if 0
293 else {
294
295
296
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
307 const size_t bufferOffset = 256;
308 size_t totalSize = bufferOffset+dataTypeSize;
310
312
313 unsigned int spIdx = 0;
314 int sp_offset = 0;
315 int nLayers = 0;
316 int MaxEtaBin = 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
326
327 bool isPixel = layerKey > 20000;
329
330 auto pCont = isPixel ? pixelSpacePointsContainer : sctSpacePointsContainer;
331
333
337
340
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) {
361 if(cw > 0.2) continue;
362 cw = -1.0;
363 }
364 }
365
366 vSP.emplace_back(
sp);
367 vL.emplace_back(layerIndex);
368
369 const auto&
p =
sp->globalPosition();
370
372
373 memcpy(&pJobData->
m_params[sp_offset], ¶ms[0],
sizeof(params));
374
375 sp_offset += 4;
376 spIdx++;
378 }
380 }
381
383
384 if (isPixel) nPixels += spIdx - pJobData->
m_layerInfo[4*nLayers];
386
387 nLayers++;
388 }
389
395
396
397
398 int pairIdx = 0;
399
400 for(
const auto& bg :
m_geo->bin_groups()) {
401
402 int bin1_idx =
bg.first;
403
404 for(
const auto& bin2_idx :
bg.second) {
407 pairIdx++;
408 }
409 }
410
412
413
414
415 const float ptCoeff = 0.29997*1.9972/2.0;
416
417 float tripletPtMin = 0.8*
m_minPt;
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;
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
451
452 int minLevel = 3;
453
455 minLevel = 2;
456 }
457
459
461
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
470
471 if(!pWork) {
473 return seedStats;
474 }
475
477
478 bool workSuccess = pWork->run();
479 if(!workSuccess) {
481 return seedStats;
482 }
483
484 std::shared_ptr<TrigAccel::OffloadBuffer> pOutput = pWork->getOutput();
485
489
491
493
494 unsigned int lastIdx =
output.size();
498 }
499 }
500 }
501 else {
502
503 unsigned int nEdges = pGraph->
m_nEdges;
505
506
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;
520
524 nodes[
idx].m_r = std::sqrt(xs*xs + ys*ys);
525
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;
537
538 for(
unsigned int idx=0;
idx<nEdges;
idx++) {
539 unsigned int pos =
idx*edgeSize;
540
544
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++) {
553 }
554 }
555
556 graphStats.first = nEdges;
557 graphStats.second = pGraph->
m_nLinks;
558
559
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
582
583
584
586
587 output.reserve(vSeeds.size());
588
589 for(auto pS : vSeeds) {
590
591 if(pS->m_level == -1) continue;
592
593 TrigFTF_GNNR3_EdgeState
rs(
false);
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;
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();
619
620 for(const auto& n : vN) {
621 output[lastIdx].addSpacePoint(vSP[
n->m_idx]);
622 }
623 }
624 }
625
627 }
628
629#endif
630
631 return seedStats;
632
633}
#define ATH_MSG_DEBUG(x,...)
static unsigned int totalSize(const MultiDimArray< T, N > &ht)
const Amg::Vector2D & widthPhiRZ() const
const TrigInDetSiLayer & m_layer
std::vector< int > m_bins
Eigen::Matrix< double, 3, 1 > Vector3D
int nStrips(const MuonGM::TgcReadoutElement &readoutEle, int layer)
constexpr unsigned nEtaBins
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
SpacePointContainer_v1 SpacePointContainer
Define the version of the space point container.
std::unique_ptr< int[]> m_graphArray
unsigned int m_nMaxNeighbours
OUTPUT_SEEDS m_OutputSeeds
COMPRESSED_GRAPH m_CompressedGraph
std::unique_ptr< Tracklet[]> m_seedsArray