21 return StatusCode::SUCCESS;
27 StatusCode FPGATrackSimGNNRoadMakerTool::makeRoads(
const std::vector<std::shared_ptr<const FPGATrackSimHit>> &
hits,
const std::vector<std::shared_ptr<FPGATrackSimGNNHit>> & gnn_hits,
const std::vector<std::shared_ptr<FPGATrackSimGNNEdge>> & edges, std::vector<std::shared_ptr<const FPGATrackSimRoad>> & roads)
42 return StatusCode::SUCCESS;
47 for (
const auto& edge : edges) {
58 boost::adjacency_list<boost::vecS, boost::vecS, boost::undirectedS>
g(
m_unique_nodes.size());
66 std::vector<int> components(num_vertices(
g), -1);
67 m_component.resize(num_vertices(
g), std::vector<int>(1,-1));
70 for (
size_t i = 0;
i != components.size(); ++
i){
84 boost::adjacency_list<boost::vecS, boost::vecS, boost::bidirectionalS>
g(
m_unique_nodes.size());
92 std::unordered_map<Vertex, std::vector<Vertex>> pred_map;
94 std::vector<bool> visited(num_vertices(
g),
false);
101 if(!visited[
v] && boost::in_degree(
v,
g) == 0){
103 std::vector<boost::default_color_type> color_map(num_vertices(
g));
104 breadth_first_search(
g,
v, visitor(JA_vis).color_map(boost::make_iterator_property_map(color_map.begin(),
get(boost::vertex_index,
g))));
106 for (
unsigned long u = 0;
u != num_vertices(
g); ++
u){
125 const std::vector<std::shared_ptr<FPGATrackSimGNNHit>> & gnn_hits,
126 std::vector<std::shared_ptr<const FPGATrackSimRoad>> & roads)
134 if(current_label != -1) {
151 std::vector<std::shared_ptr<const FPGATrackSimHit>> mapped_road_hits;
155 for (
const auto& hitID : road_hitIDs) {
156 if(hitID+1 <
static_cast<int>(
hits.size()) &&
hits[hitID]->isStrip() &&
hits[hitID+1]->isStrip() &&
158 hits[hitID]->getX() ==
hits[hitID+1]->getX()) {
159 auto &hit1 =
hits[hitID];
160 std::shared_ptr<FPGATrackSimHit> hitCopy1 = std::make_shared<FPGATrackSimHit>(*hit1);
161 pmap->
map(*hitCopy1);
162 hitLayers |= 1 << hitCopy1->
getLayer();
163 mapped_road_hits.push_back(std::move(hitCopy1));
165 auto &hit2 =
hits[hitID+1];
166 std::shared_ptr<FPGATrackSimHit> hitCopy2 = std::make_shared<FPGATrackSimHit>(*hit2);
167 pmap->
map(*hitCopy2);
168 hitLayers |= 1 << hitCopy2->
getLayer();
169 mapped_road_hits.push_back(std::move(hitCopy2));
172 auto &hit =
hits[hitID];
173 std::shared_ptr<FPGATrackSimHit> hitCopy = std::make_shared<FPGATrackSimHit>(*hit);
175 hitLayers |= 1 << hitCopy->
getLayer();
176 mapped_road_hits.push_back(std::move(hitCopy));
184 r.setHitLayers(hitLayers);
185 r.setHits(std::vector<std::vector<std::shared_ptr<const FPGATrackSimHit>>>(std::move(sorted_hits)));
191 std::vector<std::shared_ptr<const FPGATrackSimHit>> all_hits;
192 std::vector<std::shared_ptr<const FPGATrackSimHit>> track_hit_list;
194 for (
const auto& hitID : road_hitIDs) {
195 auto &hit =
hits[hitID];
196 all_hits.push_back(hit);
200 std::sort(all_hits.begin(), all_hits.end(),
201 [](
const std::shared_ptr<const FPGATrackSimHit>& hit1,
202 const std::shared_ptr<const FPGATrackSimHit>& hit2) {
203 double rho1 = std::hypot(hit1->getX(), hit1->getY());
204 double rho2 = std::hypot(hit2->getX(), hit2->getY());
209 std::unordered_set<int> seenLayers;
210 for (
const auto &hit : all_hits) {
211 short layer =
m_pix_h2l->at(
static_cast<int>(hit->getIdentifierHash()));
213 int combinedId = layerGeometry.
m_subdet;
215 if (seenLayers.count(combinedId) == 0) {
216 track_hit_list.push_back(hit);
217 seenLayers.insert(combinedId);
221 std::size_t nSp = track_hit_list.size();
222 std::vector<std::vector<std::shared_ptr<const FPGATrackSimHit>>> seed_hit_list;
228 auto spacePointIndicesFun = [](std::size_t nSp, std::size_t nSeeds) -> std::vector<std::size_t> {
229 std::vector<std::size_t>
idx;
231 for (std::size_t
i = 0;
i < nSeeds; ++
i) {
232 std::size_t
pos = (
i * (nSp - 1)) / (nSeeds - 1);
242 std::size_t nSeeds = std::min<std::size_t>(5, nSp);
243 auto indices = spacePointIndicesFun(nSp, nSeeds);
246 seed_hit_list.push_back({track_hit_list[
idx]});
251 r.setHits(std::move(seed_hit_list));
285 std::unordered_map<
Vertex, std::vector<Vertex>>& in_pred_map) :
286 m_current_comp(in_current), m_control_vars(in_control_vars), m_components(in_comps),
287 m_pred_map(in_pred_map), m_initial_comp(in_current) {}
289 template <
typename VertexT,
typename GraphT>
298 template <
typename EdgeT,
typename GraphT>
305 std::vector<int> src_comp;
310 src_comp.push_back(
comp);
315 if (boost::in_degree(src_node,
g) > 1){
316 auto in_edges = boost::in_edges(src_node,
g);
317 for (
auto it = in_edges.first;
it != in_edges.second; ++
it){
322 src_comp.push_back(
comp);
331 m_control_vars[tar_node] = boost::out_degree(tar_node,
g) < 2 ? 1 : -2;
337 m_control_vars[tar_node] = boost::out_degree(tar_node,
g) < 2 ? 1 : -2;
347 m_control_vars[tar_node] = boost::out_degree(tar_node,
g) < 2 ? 1 : -2;
349 std::unordered_set<Vertex> visited;
351 if(visited.count(
node))
return;
352 visited.insert(
node);
355 (src_comp.empty() ||
std::find(node_comps.begin(), node_comps.end(), src_comp[
i]) == node_comps.end())){