28 return StatusCode::SUCCESS;
37 std::unique_ptr<GNN_DataStorage> storage = std::make_unique<GNN_DataStorage>(*
m_geo,
m_mlLUT);
43 float shift_x =
vertex.x() - beamSpotHandle->beamTilt(0)*
vertex.z();
44 float shift_y =
vertex.y() - beamSpotHandle->beamTilt(1)*
vertex.z();
46 std::vector<std::vector<GNN_Node> > node_storage;
49 for(
auto&
v : node_storage)
v.reserve(100000);
51 unsigned int nPixelLoaded = 0;
52 unsigned int nStripLoaded = 0;
54 for(
size_t idx=0;
idx<spContainer.size();
idx++){
55 const auto & sp = spContainer.at(
idx);
56 const auto & extSP = sp.externalSpacePoint();
57 const std::vector<xAOD::DetectorIDHashType>& elementlist = extSP.elementIdList() ;
59 bool isPixel(elementlist.size() == 1);
67 const auto&
pos = extSP.globalPosition();
78 assert(
dynamic_cast<const xAOD::PixelCluster*
>(extSP.measurements().front())!=
nullptr);
85 for(
size_t l = 0;
l < node_storage.size();
l++) {
87 const std::vector<GNN_Node>& nodes = node_storage[
l];
89 if(nodes.size() == 0)
continue;
97 ATH_MSG_DEBUG(
"Loaded "<<nPixelLoaded<<
" pixel spacepoints and "<<nStripLoaded<<
" strip spacepoints");
105 std::vector<GNN_Edge> edgeStorage;
109 std::pair<int, int> graphStats =
buildTheGraph(fakeRoi, storage, edgeStorage);
111 ATH_MSG_DEBUG(
"Created graph with "<<graphStats.first<<
" edges and "<<graphStats.second<<
" edge links");
113 int maxLevel =
runCCA(graphStats.first, edgeStorage);
115 ATH_MSG_DEBUG(
"Reached Level "<<maxLevel<<
" after GNN iterations");
123 if(maxLevel < minLevel)
return StatusCode::SUCCESS;
125 std::vector<GNN_Edge*> vSeeds;
127 vSeeds.reserve(graphStats.first/2);
129 for(
int edgeIndex = 0; edgeIndex < graphStats.first; edgeIndex++) {
131 GNN_Edge* pS = &(edgeStorage.at(edgeIndex));
133 if(pS->
m_level < minLevel)
continue;
135 vSeeds.push_back(pS);
138 if(vSeeds.empty())
return StatusCode::SUCCESS;
146 for(
auto pS : vSeeds) {
147 if(pS->m_level == -1)
continue;
157 if(
static_cast<int>(rs.
m_vs.size()) < minLevel)
continue;
159 std::vector<const GNN_Node*> vN;
161 for(std::vector<GNN_Edge*>::reverse_iterator sIt=rs.
m_vs.rbegin();sIt!=rs.
m_vs.rend();++sIt) {
162 (*sIt)->m_level = -1;
164 if(sIt == rs.
m_vs.rbegin()) {
165 vN.push_back((*sIt)->m_n1);
168 vN.push_back((*sIt)->m_n2);
172 if(vN.size()<3)
continue;
174 std::vector<const xAOD::SpacePoint*> sps;
175 sps.reserve(vN.size());
176 for (
const auto* vNptr : vN) {
177 sps.push_back(&spContainer.at(vNptr->sp_idx()).externalSpacePoint());
182 std::unique_ptr<ActsTrk::Seed> to_add = std::make_unique<ActsTrk::Seed>(std::move(sps));
184 seedContainer.
push_back(std::move(to_add));
189 return StatusCode::SUCCESS;