25 #include <boost/dynamic_bitset.hpp>
36 declareInterface<IFPGATrackSimRoadFilterTool>(
this);
47 m_inputRoads =
new TH1I(
"srft_input_roads",
"srft_input_roads", 1000, -0.5, 1000-0.5);
48 m_inputRoads_2nd =
new TH1I(
"srft_input_roads_2nd",
"srft_input_roads_2nd", 1000, -0.5, 1000-0.5);
49 m_badRoads =
new TH1I(
"srft_bad_roads",
"srft_bad_roads", 1000, -0.5, 1000-0.5);
50 m_badRoads_2nd =
new TH1I(
"srft_bad_roads_2nd",
"srft_bad_roads_2nd", 1000, -0.5, 1000-0.5);
52 return StatusCode::SUCCESS;
57 ATH_MSG_DEBUG(
"Spacepoint road filter: processed average of " <<
m_inputRoads->GetMean() <<
" input roads, found average of " <<
m_badRoads->GetMean() <<
" bad roads per event.");
59 return StatusCode::SUCCESS;
68 bool isSecondStage =
false;
69 if (prefilter_roads.size() > 0) {
71 isSecondStage =
false;
80 postfilter_roads.clear();
81 if (prefilter_roads.size() == 0) {
84 return StatusCode::SUCCESS;
98 for (
auto& road : prefilter_roads) {
113 postfilter_roads.push_back(&
r);
115 return StatusCode::SUCCESS;
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++) {
259 if (wildcard_layer != -1) {
261 wc_layers |= (0x1 << wildcard_layer);
265 hit_layers -= (0x1 << wildcard_layer);
267 ATH_MSG_WARNING(
"Found weird problem: current layers is " << strips_only.
getHitLayers() <<
", adding wildcard in layer " << wildcard_layer);
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());
315 std::vector<module_t> modules;
318 unsigned num_pixel = 0;
319 unsigned num_spacepoints = 0;
322 modules.push_back(-1);
324 modules.push_back(-1);
331 bool is_pixel = (road.
getHits(
il)[0]->isPixel());
335 num_spacepoints += 1;
343 unsigned numSpacePlusPixel = (num_spacepoints/2) + num_pixel;
348 return numSpacePlusPixel;
352 std::vector<const FPGATrackSimHit*>& unique_in, std::vector<const FPGATrackSimHit*>& unique_out,
353 std::vector<const FPGATrackSimHit*>& new_sp_in, std::vector<const FPGATrackSimHit*>& new_sp_out) {
355 std::map<std::tuple<float, float, float>,
const FPGATrackSimHit*> merged_map;
356 std::tuple<float, float, float> coords;
359 unsigned num_unique = 0;
370 if (merged_map.count(coords) == 0) {
374 unique_out.push_back(original);
380 merged_map.erase(coords);
388 if (merged_map.count(coords) != 0) {
391 unique_in.push_back(original);