100 std::map<size_t, std::vector<std::shared_ptr<const FPGATrackSimHit>>> strip_hits;
101 std::map<size_t, std::vector<std::shared_ptr<const FPGATrackSimHit>>> inner_spacepoints;
102 std::map<size_t, std::vector<std::shared_ptr<const FPGATrackSimHit>>> outer_spacepoints;
118 std::vector<std::shared_ptr<const FPGATrackSimHit>> strip_hits_in;
119 std::vector<std::shared_ptr<const FPGATrackSimHit>> spacepoints_in;
120 const std::vector<std::shared_ptr<const FPGATrackSimHit>> hits_in = initial_road->
getHits(
layer);
121 for (
auto& hit : hits_in) {
123 spacepoints_in.push_back(hit);
125 strip_hits_in.push_back(hit);
130 std::vector<std::shared_ptr<const FPGATrackSimHit>> strip_hits_out;
131 std::vector<std::shared_ptr<const FPGATrackSimHit>> spacepoints_out;
132 const std::vector<std::shared_ptr<const FPGATrackSimHit>> hits_out = initial_road->
getHits(
layer + 1);
133 for (
auto& hit : hits_out) {
135 spacepoints_out.push_back(hit);
137 strip_hits_out.push_back(hit);
147 std::vector<std::shared_ptr<const FPGATrackSimHit>> new_sp_in;
148 std::vector<std::shared_ptr<const FPGATrackSimHit>> new_sp_out;
149 unsigned num_unique =
findUnique(spacepoints_in, spacepoints_out, strip_hits_in, strip_hits_out, new_sp_in, new_sp_out);
151 if (num_unique > 0) {
156 ATH_MSG_DEBUG(
"Found inconsistent number of spacepoints in road with x = " << initial_road->
getXBin() <<
", y = " << initial_road->
getYBin() <<
": spacepoints_in = " << spacepoints_in <<
", spacepoints_out = " << spacepoints_out);
159 spacepoints_in = std::move(new_sp_in);
160 spacepoints_out = std::move(new_sp_out);
163 std::vector<std::shared_ptr<const FPGATrackSimHit>> new_all_in = spacepoints_in;
167 std::vector<std::shared_ptr<const FPGATrackSimHit>> new_all_out = spacepoints_out;
169 initial_road->
setHits(
layer + 1, std::move(new_all_out));
173 inner_spacepoints.emplace(
layer, spacepoints_in);
174 outer_spacepoints.emplace(
layer+1, spacepoints_out);
175 if (spacepoints_in.size() != spacepoints_out.size()) {
176 ATH_MSG_WARNING(
"Handling of unique spacepoints failed, " << spacepoints_in.size() <<
" != " << spacepoints_out.size());
182 strip_hits_in.clear();
183 strip_hits_out.clear();
185 strip_hits.emplace(
layer, strip_hits_in);
186 strip_hits.emplace(
layer + 1, strip_hits_out);
192 std::vector<FPGATrackSimRoad> working_roads;
194 working_roads.push_back(new_road);
197 for (
auto&
entry : inner_spacepoints) {
201 std::vector<std::shared_ptr<const FPGATrackSimHit>> strip_hits_in = strip_hits[
layer];
202 std::vector<std::shared_ptr<const FPGATrackSimHit>> strip_hits_out = strip_hits[
layer + 1];
204 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());
208 if ((strip_hits_in.size() > 0 &&
entry.second.size() > 0) ||
209 (strip_hits_out.size() > 0 &&
entry.second.size() > 0)) {
212 int wildcard_layer = -1;
213 if (strip_hits_in.size() == 0 || strip_hits_out.size() == 0) {
214 std::unique_ptr<FPGATrackSimHit> wcHit = std::make_unique<FPGATrackSimHit>();
217 if (strip_hits_in.size() == 0) {
218 wildcard_layer =
layer;
220 strip_hits_in.push_back(std::move(wcHit));
222 wildcard_layer =
layer + 1;
224 strip_hits_out.push_back(std::move(wcHit));
230 unsigned num_working = working_roads.size();
231 for (
unsigned i = 0;
i < num_working;
i++) {
237 strips_only.setHits(
layer, std::vector<std::shared_ptr<const FPGATrackSimHit>>(strip_hits_in));
238 strips_only.setHits(
layer + 1, std::vector<std::shared_ptr<const FPGATrackSimHit>>(strip_hits_out));
239 spacepoints_only.setHits(
layer, std::vector<std::shared_ptr<const FPGATrackSimHit>>(
entry.second));
240 spacepoints_only.setHits(
layer + 1, std::vector<std::shared_ptr<const FPGATrackSimHit>>(outer_spacepoints[
layer + 1]));
244 if (wildcard_layer != -1) {
246 wc_layers |= (0x1 << wildcard_layer);
247 strips_only.setWCLayers(wc_layers);
250 hit_layers -= (0x1 << wildcard_layer);
251 if (strips_only.getHitLayers() < (
unsigned)(0
x1 << wildcard_layer)) {
252 ATH_MSG_WARNING(
"Found weird problem: current layers is " << strips_only.getHitLayers() <<
", adding wildcard in layer " << wildcard_layer);
254 strips_only.setHitLayers(hit_layers);
260 working_roads[
i] = std::move(spacepoints_only);
262 working_roads.push_back(std::move(strips_only));
268 ATH_MSG_DEBUG(
"Created " << working_roads.size() <<
" new roads in spacepoint road filter.");
271 for (
auto road : working_roads) {
272 unsigned numSpacePlusPixel =
setSector(road);
273 ATH_MSG_DEBUG(
"This road has sector = " << road.getSector() <<
" and q/pt = " << road.getX() <<
", x = " << road.getY());
274 ATH_MSG_DEBUG(
"numSpacePlusPixel = " << numSpacePlusPixel <<
", nhitlayers = " << road.getNHitLayers());