18 #include <boost/algorithm/string.hpp>
20 using namespace asg::msgUserCode;
63 return StatusCode::FAILURE;
71 if(
line.substr(0,1) ==
"#" ||
line ==
"")
73 std::vector<std::string> strs, cuts_str;
79 std::pair<float,float>
cuts;
80 cuts.first = std::stof(cuts_str[0]);
81 cuts.second = std::stof(cuts_str[1]);
91 ANA_MSG_ERROR(
"you asked to use Nstrips in stub selection, but that only works when reading in a file (defaults not set)");
92 return StatusCode::FAILURE;
94 for(
int i=0;
i<4;
i++) {
95 for(
int j=-14; j<14; j++) {
99 for(
int i=0;
i<6;
i++) {
100 for(
int j=0; j<6; j++) {
113 for(
const auto& layer_map : zone_map.second) {
114 for(
const auto& ring_map : layer_map.second) {
115 ANA_MSG_INFO(
" " << zone_map.first <<
" " << layer_map.first
116 <<
" " << ring_map.first <<
" " << ring_map.second.first
117 <<
", " << ring_map.second.second);
123 return StatusCode::SUCCESS;
130 return StatusCode::SUCCESS;
135 if(pixelFrac==0 && stripFrac==0)
136 return StatusCode::SUCCESS;
138 for (
int i = 0;
i <
header.nTowers(); ++
i) {
140 std::vector<FPGATrackSimHit>
hits;
144 std::vector<FPGATrackSimHit> filteredHits;
145 for(
const auto & hit :
hits) {
148 filteredHits.push_back(hit);
152 filteredHits.push_back(hit);
157 for (
const auto & hit : filteredHits) {
161 std::string hit_or_cluster_str = hit_or_cluster ?
"hit" :
"cluster";
162 ANA_MSG_INFO(
"After random " << hit_or_cluster_str <<
" removal - (pixel, strip) = (" << pixelFrac <<
", " << stripFrac <<
") - have " << filteredHits.size() <<
" left of " <<
hits.size() <<
" " << hit_or_cluster_str <<
"s");
165 return StatusCode::SUCCESS;
172 std::vector<int> all_strip_layers;
174 for(
int logiLayer = 0; logiLayer <
int(planeMap->
getNLogiLayers()); logiLayer++) {
181 all_strip_layers.push_back(thisLayerInfo.
physLayer);
184 ANA_MSG_ERROR(
"expected parity of strip physLayer and stereo doesn't hold: " <<
185 logiLayer <<
", " <<
section <<
": " << thisLayerInfo.
siTech <<
186 ", " << thisLayerInfo.
zone <<
", " << thisLayerInfo.
physLayer <<
187 ", " << thisLayerInfo.
stereo);
188 return StatusCode::FAILURE;
201 for(
const auto& physLayer : all_strip_layers) {
202 if(physLayer % 2 == 1) {
203 if(
std::find(all_strip_layers.begin(), all_strip_layers.end(), physLayer-1) != all_strip_layers.end())
204 paired_strip_layers.push_back(physLayer);
207 if(
std::find(all_strip_layers.begin(), all_strip_layers.end(), physLayer+1) != all_strip_layers.end())
208 paired_strip_layers.push_back(physLayer);
211 return StatusCode::SUCCESS;
216 std::vector<int> filter_pixel_physLayers,
217 std::vector<int> filter_strip_physLayers,
218 std::vector<FPGATrackSimCluster> &filteredClusters)
223 for (
int i = 0;
i <
header.nTowers(); ++
i) {
225 std::vector<FPGATrackSimHit>
hits;
229 std::vector<FPGATrackSimHit> filteredHits;
230 FilterHits(
hits, filter_pixel_physLayers, filter_strip_physLayers, filteredHits);
234 for (
auto& hit : filteredHits) {
244 filteredClusters.push_back(cluster);
251 if(nHits_postFilt == nHits_preFilt) {
252 ANA_MSG_INFO(
"Stub filtering had no impact: " << nHits_preFilt <<
" hits/clusters");
254 else if(nHits_postFilt < nHits_preFilt) {
255 ANA_MSG_INFO(
"Stub filtering reduced from " << nHits_preFilt <<
" to " << nHits_postFilt <<
" hits/clusters");
258 ANA_MSG_WARNING(
"Stub filtering has led to duplication - started with " << nHits_preFilt <<
" and ended up with " << nHits_postFilt <<
" hits/clusters");
263 return StatusCode::SUCCESS;
268 std::vector<int> &filter_pixel_physLayers,
269 std::vector<int> &filter_strip_physLayers,
270 std::vector<FPGATrackSimHit> &filteredHits)
281 filteredHits.clear();
286 std::vector< std::pair<FPGATrackSimHit,unsigned> > filteredHits_ID, hits_to_filter;
288 for (
const auto &hit :
hits) {
290 std::pair<FPGATrackSimHit,unsigned> hit_ID;
297 if( std::any_of(
std::begin(filter_pixel_physLayers),
std::end(filter_pixel_physLayers),
298 [&](
unsigned i) {
return i == hit.getPhysLayer(); }) )
299 hits_to_filter.push_back(hit_ID);
301 filteredHits_ID.push_back(hit_ID);
305 if( std::any_of(
std::begin(filter_strip_physLayers),
std::end(filter_strip_physLayers),
306 [&](
unsigned i) {
return i == hit.getPhysLayer(); }) )
307 hits_to_filter.push_back(hit_ID);
309 filteredHits_ID.push_back(hit_ID);
314 std::vector< std::pair<FPGATrackSimHit,unsigned> > hits_to_filter_inner, hits_to_filter_outer;
319 for (
const auto &hit : hits_to_filter) {
320 if (hit.first.getPhysLayer() % 2 == 0)
321 hits_to_filter_inner.push_back(hit);
323 hits_to_filter_outer.push_back(hit);
327 std::vector< std::pair<FPGATrackSimHit,unsigned> > passed_inner_hits, passed_outer_hits;
328 for (
const auto &innerHit : hits_to_filter_inner) {
329 std::vector<std::pair<FPGATrackSimHit,unsigned>> nearby_outer_hits;
336 for (
const auto &outerHit : nearby_outer_hits) {
337 bool hitPassed =
check_hit_stub(innerHit.first, outerHit.first, cut_m, cut_p);
340 passed_inner_hits.push_back(innerHit);
341 passed_outer_hits.push_back(outerHit);
347 std::vector< std::pair<FPGATrackSimHit,unsigned> > passed_outer_hits_unique;
348 for (
const auto &hit : passed_outer_hits) {
349 auto it = std::find_if(passed_outer_hits_unique.begin(), passed_outer_hits_unique.end(),
350 [&hit](
const std::pair<FPGATrackSimHit,unsigned>&
h) {return h.second == hit.second;} );
351 if(
it == passed_outer_hits_unique.end()) {
352 passed_outer_hits_unique.push_back(hit);
355 std::vector< std::pair<FPGATrackSimHit,unsigned> > passed_inner_hits_unique;
356 for (
const auto &hit : passed_inner_hits) {
357 auto it = std::find_if(passed_inner_hits_unique.begin(), passed_inner_hits_unique.end(),
358 [&hit](
const std::pair<FPGATrackSimHit,unsigned>&
h) {return h.second == hit.second;} );
359 if(
it == passed_inner_hits_unique.end()) {
360 passed_inner_hits_unique.push_back(hit);
366 for (
auto &hit : passed_inner_hits_unique) {
367 filteredHits_ID.push_back(hit);
369 for (
const auto &hit : passed_outer_hits_unique) {
370 filteredHits_ID.push_back(hit);
374 std::sort(filteredHits_ID.begin(), filteredHits_ID.end(),
375 [](
const std::pair<FPGATrackSimHit,unsigned> & hit1,
const std::pair<FPGATrackSimHit,unsigned> & hit2){
376 return hit1.second < hit2.second;
378 for (
const auto &hit_ID : filteredHits_ID) {
379 filteredHits.push_back(hit_ID.first);
406 ring =
int(floor(hit.
getZ() / 100.));
409 zone = (hit.
getZ() < 0) ?
"EC-" :
"EC+";
416 ANA_MSG_ERROR(
"hit radius " << hit.
getR() <<
"is not within bounds of endcap innerRadii vector");
462 return (
val > cut_m &&
val < cut_p);
467 void fill_nearby_hits(
const FPGATrackSimHit& innerHit, std::vector< std::pair<FPGATrackSimHit,unsigned> > & outerHits, std::vector< std::pair<FPGATrackSimHit,unsigned> > & nearby_outer_hits)
469 for (
const auto& outerHit : outerHits) {
471 if(outerHit.first.getPhysLayer() != innerHit.
getPhysLayer() + 1)
482 if(fabs(innerHit.
getZ() - outerHit.first.getZ()) > 80)
486 if(fabs(innerHit.
getR() - outerHit.first.getR()) > 80)
491 if(fabs(innerHit.
getX() - outerHit.first.getX()) > 80)
493 if( fabs(innerHit.
getY() - outerHit.first.getY()) > 80)
496 nearby_outer_hits.push_back(outerHit);
504 for (
int i = 0;
i <
header.nTowers(); ++
i) {
506 std::vector<FPGATrackSimHit>
hits = tower.
hits();
507 nHits +=
hits.size();
515 for (
int i = 0;
i <
header.nTowers(); ++
i) {
517 std::vector<FPGATrackSimHit>
hits = tower.
hits();
519 for(
const auto& hit :
hits) {
520 ANA_MSG_DEBUG(
" isStrip, side, x, y, z, rho, phi, physLayer, layer, section, phiM, etaM = " << hit.isStrip() <<
", " << hit.getPhysLayer()%2 <<
", " << hit.getX() <<
", " << hit.getY() <<
", " << hit.getZ() <<
", " << hit.getR() <<
", " << hit.getGPhi() <<
", " << hit.getPhysLayer() <<
", " << hit.getLayer() <<
", " << hit.getSection() <<
", " << hit.getPhiModule() <<
", " << hit.getEtaModule());