97 std::map<size_t, std::vector<std::shared_ptr<const FPGATrackSimHit>>> strip_hits;
98 std::map<size_t, std::vector<std::shared_ptr<const FPGATrackSimHit>>> inner_spacepoints;
99 std::map<size_t, std::vector<std::shared_ptr<const FPGATrackSimHit>>> outer_spacepoints;
115 std::vector<std::shared_ptr<const FPGATrackSimHit>> strip_hits_in;
116 std::vector<std::shared_ptr<const FPGATrackSimHit>> spacepoints_in;
117 const std::vector<std::shared_ptr<const FPGATrackSimHit>> hits_in = initial_road->
getHits(
layer);
118 for (
auto& hit : hits_in) {
120 spacepoints_in.push_back(hit);
122 strip_hits_in.push_back(hit);
127 std::vector<std::shared_ptr<const FPGATrackSimHit>> strip_hits_out;
128 std::vector<std::shared_ptr<const FPGATrackSimHit>> spacepoints_out;
129 const std::vector<std::shared_ptr<const FPGATrackSimHit>> hits_out = initial_road->
getHits(
layer + 1);
130 for (
auto& hit : hits_out) {
132 spacepoints_out.push_back(hit);
134 strip_hits_out.push_back(hit);
144 std::vector<std::shared_ptr<const FPGATrackSimHit>> new_sp_in;
145 std::vector<std::shared_ptr<const FPGATrackSimHit>> new_sp_out;
146 unsigned num_unique =
findUnique(spacepoints_in, spacepoints_out, strip_hits_in, strip_hits_out, new_sp_in, new_sp_out);
148 if (num_unique > 0) {
153 spacepoints_in = new_sp_in;
154 spacepoints_out = new_sp_out;
157 std::vector<std::shared_ptr<const FPGATrackSimHit>> new_all_in = spacepoints_in;
161 std::vector<std::shared_ptr<const FPGATrackSimHit>> new_all_out = spacepoints_out;
163 initial_road->
setHits(
layer + 1, std::move(new_all_out));
166 ATH_MSG_DEBUG(
"Found inconsistent number of spacepoints in road with x = " << initial_road->
getXBin() <<
", y = " << initial_road->
getYBin());
169 strip_hits.emplace(
layer, strip_hits_in);
170 strip_hits.emplace(
layer + 1, strip_hits_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());
184 std::vector<FPGATrackSimRoad> working_roads;
186 working_roads.push_back(new_road);
189 for (
auto&
entry : inner_spacepoints) {
193 std::vector<std::shared_ptr<const FPGATrackSimHit>> strip_hits_in = strip_hits[
layer];
194 std::vector<std::shared_ptr<const FPGATrackSimHit>> strip_hits_out = strip_hits[
layer + 1];
196 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());
200 if ((strip_hits_in.size() > 0 &&
entry.second.size() > 0) ||
201 (strip_hits_out.size() > 0 &&
entry.second.size() > 0)) {
204 int wildcard_layer = -1;
205 if (strip_hits_in.size() == 0 || strip_hits_out.size() == 0) {
206 std::unique_ptr<FPGATrackSimHit> wcHit = std::make_unique<FPGATrackSimHit>();
209 if (strip_hits_in.size() == 0) {
210 wildcard_layer =
layer;
212 strip_hits_in.push_back(std::move(wcHit));
214 wildcard_layer =
layer + 1;
216 strip_hits_out.push_back(std::move(wcHit));
222 unsigned num_working = working_roads.size();
223 for (
unsigned i = 0;
i < num_working;
i++) {
229 strips_only.setHits(
layer, std::vector<std::shared_ptr<const FPGATrackSimHit>>(strip_hits_in));
230 strips_only.setHits(
layer + 1, std::vector<std::shared_ptr<const FPGATrackSimHit>>(strip_hits_out));
231 spacepoints_only.setHits(
layer, std::vector<std::shared_ptr<const FPGATrackSimHit>>(
entry.second));
232 spacepoints_only.setHits(
layer + 1, std::vector<std::shared_ptr<const FPGATrackSimHit>>(outer_spacepoints[
layer + 1]));
236 if (wildcard_layer != -1) {
238 wc_layers |= (0x1 << wildcard_layer);
239 strips_only.setWCLayers(wc_layers);
242 hit_layers -= (0x1 << wildcard_layer);
243 if (strips_only.getHitLayers() < (
unsigned)(0
x1 << wildcard_layer)) {
244 ATH_MSG_WARNING(
"Found weird problem: current layers is " << strips_only.getHitLayers() <<
", adding wildcard in layer " << wildcard_layer);
246 strips_only.setHitLayers(hit_layers);
252 working_roads[
i] = spacepoints_only;
254 working_roads.push_back(strips_only);
260 ATH_MSG_DEBUG(
"Created " << working_roads.size() <<
" new roads in spacepoint road filter.");
263 for (
auto road : working_roads) {
264 unsigned numSpacePlusPixel =
setSector(road);
265 ATH_MSG_DEBUG(
"This road has sector = " << road.getSector() <<
" and q/pt = " << road.getX() <<
", x = " << road.getY());
266 ATH_MSG_DEBUG(
"numSpacePlusPixel = " << numSpacePlusPixel <<
", nhitlayers = " << road.getNHitLayers());