121 std::map<size_t, std::vector<const FPGATrackSimHit*>> strip_hits;
122 std::map<size_t, std::vector<const FPGATrackSimHit*>> inner_spacepoints;
123 std::map<size_t, std::vector<const FPGATrackSimHit*>> outer_spacepoints;
139 std::vector<const FPGATrackSimHit*> strip_hits_in;
140 std::vector<const FPGATrackSimHit*> spacepoints_in;
141 const std::vector<const FPGATrackSimHit*> hits_in = initial_road->
getHits(
layer);
142 for (
auto* hit : hits_in) {
144 spacepoints_in.push_back(hit);
146 strip_hits_in.push_back(hit);
151 std::vector<const FPGATrackSimHit*> strip_hits_out;
152 std::vector<const FPGATrackSimHit*> spacepoints_out;
153 const std::vector<const FPGATrackSimHit*> hits_out = initial_road->
getHits(
layer + 1);
154 for (
auto* hit : hits_out) {
156 spacepoints_out.push_back(hit);
158 strip_hits_out.push_back(hit);
168 std::vector<const FPGATrackSimHit*> new_sp_in;
169 std::vector<const FPGATrackSimHit*> new_sp_out;
170 unsigned num_unique =
findUnique(spacepoints_in, spacepoints_out, strip_hits_in, strip_hits_out, new_sp_in, new_sp_out);
172 if (num_unique > 0) {
177 spacepoints_in = new_sp_in;
178 spacepoints_out = new_sp_out;
181 std::vector<const FPGATrackSimHit*> new_all_in = spacepoints_in;
185 std::vector<const FPGATrackSimHit*> new_all_out = spacepoints_out;
190 ATH_MSG_DEBUG(
"Found inconsistent number of spacepoints in road with x = " << initial_road->
getXBin() <<
", y = " << initial_road->
getYBin());
193 strip_hits.emplace(
layer, strip_hits_in);
194 strip_hits.emplace(
layer + 1, strip_hits_out);
197 inner_spacepoints.emplace(
layer, spacepoints_in);
198 outer_spacepoints.emplace(
layer+1, spacepoints_out);
199 if (spacepoints_in.size() != spacepoints_out.size()) {
200 ATH_MSG_WARNING(
"Handling of unique spacepoints failed, " << spacepoints_in.size() <<
" != " << spacepoints_out.size());
208 std::vector<FPGATrackSimRoad> working_roads;
210 working_roads.push_back(new_road);
213 for (
auto&
entry : inner_spacepoints) {
217 std::vector<const FPGATrackSimHit*> strip_hits_in = strip_hits[
layer];
218 std::vector<const FPGATrackSimHit*> strip_hits_out = strip_hits[
layer + 1];
220 ATH_MSG_DEBUG(
"Road (x = " << new_road.getXBin() <<
", y = " << new_road.getYBin() <<
") has merged spacepoints: " <<
entry.second.size() <<
", unpaired inner hits: " << strip_hits_in.size() <<
", unpaired outer hits: " << strip_hits_out.size());
224 if ((strip_hits_in.size() > 0 &&
entry.second.size() > 0) ||
225 (strip_hits_out.size() > 0 &&
entry.second.size() > 0)) {
228 int wildcard_layer = -1;
229 if (strip_hits_in.size() == 0 || strip_hits_out.size() == 0) {
233 if (strip_hits_in.size() == 0) {
234 strip_hits_in.push_back(wcHit);
235 wildcard_layer =
layer;
237 strip_hits_out.push_back(wcHit);
238 wildcard_layer =
layer + 1;
245 unsigned num_working = working_roads.size();
246 for (
unsigned i = 0;
i < num_working;
i++) {
252 strips_only.setHits(
layer, strip_hits_in);
253 strips_only.setHits(
layer + 1, strip_hits_out);
254 spacepoints_only.setHits(
layer,
entry.second);
255 spacepoints_only.setHits(
layer + 1, outer_spacepoints[
layer + 1]);
259 if (wildcard_layer != -1) {
261 wc_layers |= (0x1 << wildcard_layer);
262 strips_only.setWCLayers(wc_layers);
265 hit_layers -= (0x1 << wildcard_layer);
266 if (strips_only.getHitLayers() < (
unsigned)(0
x1 << wildcard_layer)) {
267 ATH_MSG_WARNING(
"Found weird problem: current layers is " << strips_only.getHitLayers() <<
", adding wildcard in layer " << wildcard_layer);
269 strips_only.setHitLayers(hit_layers);
275 working_roads[
i] = spacepoints_only;
277 working_roads.push_back(strips_only);
283 ATH_MSG_DEBUG(
"Created " << working_roads.size() <<
" new roads in spacepoint road filter.");
286 for (
auto road : working_roads) {
288 unsigned numSpacePlusPixel =
setSector(road);
289 ATH_MSG_DEBUG(
"This road has sector = " << road.getSector() <<
" and q/pt = " << road.getX() <<
", x = " << road.getY());