81 float shift_x =
vertex.x() - beamSpotHandle->beamTilt(0)*
vertex.z();
82 float shift_y =
vertex.y() - beamSpotHandle->beamTilt(1)*
vertex.z();
84 std::unique_ptr<GNN_DataStorage> storage = std::make_unique<GNN_DataStorage>(*
m_geo);
92 std::map<short, std::vector<IdentifierHash> > detIdMap;
98 if(!sctHandle.isValid()) {
104 sctSpacePointsContainer = sctHandle.ptr();
106 std::vector<IdentifierHash> listOfSctIds;
107 m_regsel_sct->lookup(ctx)->HashIDList( internalRoI, listOfSctIds );
111 for(
const auto& hashId : listOfSctIds) {
113 short layerIndex = h2l->at(
static_cast<int>(hashId));
115 auto it = detIdMap.find(layerIndex);
116 if(
it != detIdMap.end()) (*it).second.push_back(hashId);
118 std::vector<IdentifierHash>
v = {hashId};
119 detIdMap.insert(std::make_pair(layerIndex,
v));
128 if(!pixHandle.isValid()) {
133 pixelSpacePointsContainer = pixHandle.ptr();
135 std::vector<IdentifierHash> listOfPixIds;
137 m_regsel_pix->lookup(ctx)->HashIDList( internalRoI, listOfPixIds );
141 for(
const auto& hashId : listOfPixIds) {
143 short layerIndex = h2l->at(
static_cast<int>(hashId));
145 auto it = detIdMap.find(layerIndex);
146 if(
it != detIdMap.end()) (*it).second.push_back(hashId);
148 std::vector<IdentifierHash>
v = {hashId};
149 detIdMap.insert(std::make_pair(layerIndex,
v));
156 std::unique_ptr<GNN_DataStorage> storage = std::make_unique<GNN_DataStorage>(*
m_geo);
158 std::vector<const Trk::SpacePoint*> vSP;
162 std::vector<std::vector<GNN_Node> > trigSpStorage[2];
168 for(
const auto& lColl : detIdMap) {
170 short layerIndex = lColl.first;
172 int layerKey =
m_geo->getTrigFTF_GNN_LayerByIndex(layerIndex)->m_layer.m_subdet;
174 bool isPixel = layerKey > 20000;
176 auto pCont = isPixel ? pixelSpacePointsContainer : sctSpacePointsContainer;
178 int contIdx= isPixel ? 0 : 1;
182 for(
const auto&
idx : lColl.second) {
184 std::vector<GNN_Node>& tmpColl = trigSpStorage[contIdx].at(
static_cast<int>(
idx));
186 auto input_coll = pCont->indexFindPtr(
idx);
188 if(input_coll ==
nullptr)
continue;
195 if(isPixel) nPixels += nNewNodes;
206 std::vector<GNN_Edge> edgeStorage;
208 std::pair<int, int> graphStats =
buildTheGraph(internalRoI, storage, edgeStorage);
210 ATH_MSG_DEBUG(
"Created graph with "<<graphStats.first<<
" edges and "<<graphStats.second<<
" edge links");
215 if(graphStats.second == 0)
return seedStats;
217 int maxLevel =
runCCA(graphStats.first, edgeStorage);
219 ATH_MSG_DEBUG(
"Reached Level "<<maxLevel<<
" after GNN iterations");
227 if(maxLevel < minLevel)
return seedStats;
229 std::vector<GNN_Edge*> vSeeds;
231 vSeeds.reserve(graphStats.first/2);
233 for(
int edgeIndex=0;edgeIndex<graphStats.first;edgeIndex++) {
234 GNN_Edge* pS = &(edgeStorage.at(edgeIndex));
236 if(pS->m_level < minLevel)
continue;
238 vSeeds.push_back(pS);
241 if(vSeeds.empty())
return seedStats;
243 std::sort(vSeeds.begin(), vSeeds.end(), GNN_Edge::CompareLevel());
249 output.reserve(vSeeds.size());
251 for(
auto pS : vSeeds) {
253 if(pS->m_level == -1)
continue;
257 tFilter.followTrack(pS, rs);
259 if(!rs.m_initialized) {
263 if(
static_cast<int>(rs.m_vs.size()) < minLevel)
continue;
265 std::vector<const GNN_Node*> vN;
267 for(std::vector<GNN_Edge*>::reverse_iterator sIt=rs.m_vs.rbegin();sIt!=rs.m_vs.rend();++sIt) {
269 (*sIt)->m_level = -1;
271 if(sIt == rs.m_vs.rbegin()) {
272 vN.push_back((*sIt)->m_n1);
274 vN.push_back((*sIt)->m_n2);
277 if(vN.size()<3)
continue;
279 unsigned int lastIdx =
output.size();
280 output.emplace_back(rs.m_J);
282 for(
const auto&
n : vN) {
283 output[lastIdx].addSpacePoint(vSP[
n->m_idx]);
293 std::vector<const Trk::SpacePoint*> vSP;
294 std::vector<short> vL;
296 vSP.reserve(TrigAccel::ITk::GBTS_MAX_NUMBER_SPACEPOINTS);
297 vL.reserve(TrigAccel::ITk::GBTS_MAX_NUMBER_SPACEPOINTS);
302 const size_t bufferOffset = 256;
303 size_t totalSize = bufferOffset+dataTypeSize;
308 unsigned int spIdx = 0;
314 for(
const auto& lColl : detIdMap) {
316 short layerIndex = lColl.first;
322 bool isPixel = layerKey > 20000;
325 auto pCont = isPixel ? pixelSpacePointsContainer : sctSpacePointsContainer;
339 if(
b > MaxEtaBin) MaxEtaBin =
b;
342 for(
const auto&
idx : lColl.second) {
344 auto input_coll = pCont->indexFindPtr(
idx);
346 if(input_coll ==
nullptr)
continue;
348 for(
const auto& sp : *input_coll) {
356 if(cw > 0.2)
continue;
361 vSP.emplace_back(sp);
362 vL.emplace_back(layerIndex);
364 const auto&
p = sp->globalPosition();
366 float params[4] = {(
float)(
p.x() - shift_x),
float(
p.y() - shift_y), (
float)(
p.z()), cw};
372 if(spIdx >= TrigAccel::ITk::GBTS_MAX_NUMBER_SPACEPOINTS)
break;
374 if(spIdx >= TrigAccel::ITk::GBTS_MAX_NUMBER_SPACEPOINTS)
break;
379 if (isPixel) nPixels += spIdx - pJobData->
m_layerInfo[4*nLayers];
395 for(
const auto&
bg :
m_geo->bin_groups()) {
397 int bin1_idx =
bg.first;
399 for(
const auto& bin2_idx :
bg.second) {
410 const float ptCoeff = 0.29997*1.9972/2.0;
412 float tripletPtMin = 0.8*
m_minPt;
414 float maxCurv = ptCoeff/tripletPtMin;
416 const float min_deltaPhi = 0.001;
417 const float dphi_coeff = 0.68*maxCurv;
418 const float cut_dphi_max =
m_LRTmode ? 0.07 : 0.012;
419 const float cut_dcurv_max =
m_LRTmode ? 0.015 : 0.001;
420 const float cut_tau_ratio_max =
m_LRTmode ? 0.015 : 0.007;
424 const float maxOuterRadius =
m_LRTmode ? 1050.0 : 550.0;
425 const float minDeltaRadius = 2.0;
427 const float cut_zMinU = min_z0 + maxOuterRadius*internalRoI.
dzdrMinus();
428 const float cut_zMaxU = max_z0 + maxOuterRadius*internalRoI.
dzdrPlus();
430 const float maxKappa_high_eta =
m_LRTmode ? 1.0*maxCurv : std::sqrt(0.8)*maxCurv;
431 const float maxKappa_low_eta =
m_LRTmode ? 1.0*maxCurv : std::sqrt(0.6)*maxCurv;
452 std::shared_ptr<TrigAccel::OffloadBuffer> pBuff = std::make_shared<TrigAccel::OffloadBuffer>(dataBuffer);
465 std::shared_ptr<TrigAccel::OffloadBuffer> pOutput = pWork->
getOutput();
469 unsigned int nEdges = pGraph->
m_nEdges;
474 std::vector<GNN_Node> nodes;
476 nodes.reserve(vSP.size());
478 for(
unsigned int idx = 0;
idx < vSP.size();
idx++) {
480 nodes.emplace_back(vL[
idx]);
482 const auto&
pos = vSP[
idx]->globalPosition();
483 float xs =
pos.x() - shift_x;
484 float ys =
pos.y() - shift_y;
490 nodes[
idx].m_r = std::sqrt(xs*xs + ys*ys);
496 std::vector<GNN_Edge> edgeStorage;
498 std::pair<int, int> graphStats(0,0);
500 edgeStorage.resize(nEdges);
502 unsigned int edgeSize = nMaxNei + 1 + 2;
504 for(
unsigned int idx=0;
idx<nEdges;
idx++) {
505 unsigned int pos =
idx*edgeSize;
513 edgeStorage[
idx].m_n1 = &nodes[node1Idx];
514 edgeStorage[
idx].m_n2 = &nodes[node2Idx];
515 edgeStorage[
idx].m_level = 1;
516 edgeStorage[
idx].m_nNei = nNei;
517 for(
int k=0;
k<nNei;
k++) {
522 graphStats.first = nEdges;
523 graphStats.second = pGraph->
m_nLinks;
535 int maxLevel =
runCCA(graphStats.first, edgeStorage);
537 ATH_MSG_DEBUG(
"Reached Level "<<maxLevel<<
" after GNN iterations");
545 if(maxLevel < minLevel)
return seedStats;
547 std::vector<GNN_Edge*> vSeeds;
549 vSeeds.reserve(graphStats.first/2);
551 for(
int edgeIndex=0;edgeIndex<graphStats.first;edgeIndex++) {
552 GNN_Edge* pS = &(edgeStorage.at(edgeIndex));
554 if(pS->m_level < minLevel)
continue;
556 vSeeds.push_back(pS);
559 if(vSeeds.empty())
return seedStats;
561 std::sort(vSeeds.begin(), vSeeds.end(), GNN_Edge::CompareLevel());
567 output.reserve(vSeeds.size());
569 for(
auto pS : vSeeds) {
571 if(pS->m_level == -1)
continue;
575 tFilter.followTrack(pS, rs);
577 if(!rs.m_initialized) {
581 if(
static_cast<int>(rs.m_vs.size()) < minLevel)
continue;
583 std::vector<const GNN_Node*> vN;
585 for(std::vector<GNN_Edge*>::reverse_iterator sIt=rs.m_vs.rbegin();sIt!=rs.m_vs.rend();++sIt) {
587 (*sIt)->m_level = -1;
589 if(sIt == rs.m_vs.rbegin()) {
590 vN.push_back((*sIt)->m_n1);
592 vN.push_back((*sIt)->m_n2);
595 if(vN.size()<3)
continue;
597 unsigned int lastIdx =
output.size();
598 output.emplace_back(rs.m_J);
600 for(
const auto&
n : vN) {
601 output[lastIdx].addSpacePoint(vSP[
n->m_idx]);