7#include "GaudiKernel/MsgStream.h"
21 ATH_MSG_INFO(
"FPGATrackSimOverlapRemovalTool::initialize()" );
27 ATH_MSG_WARNING(
"LocalMaxOR only being run per hough slice (i.e. this tool does nothing) since roadSliceOR is turned off");
36 return StatusCode::FAILURE;
40 return StatusCode::SUCCESS;
45 if (!localMaxWindowSize)
return true;
46 if (!acc(
y,
x))
return false;
47 for (
int j = -localMaxWindowSize; j <= localMaxWindowSize; j++)
48 for (
int i = -localMaxWindowSize; i <= localMaxWindowSize; i++)
50 if (i == 0 && j == 0)
continue;
51 if (
y + j < acc.size(0) &&
x + i < acc.size(1))
53 if (!acc(
y+j,
x+i))
continue;
54 if (acc(
y+j,
x+i)->getNHitLayers() > acc(
y,
x)->getNHitLayers())
return false;
55 if (acc(
y+j,
x+i)->getNHitLayers() == acc(
y,
x)->getNHitLayers())
57 if (acc(
y+j,
x+i)->getNHits() > acc(
y,
x)->getNHits())
return false;
58 if (acc(
y+j,
x+i)->getNHits() == acc(
y,
x)->getNHits() && j <= 0 && i <= 0)
return false;
68 if (roads.empty())
return StatusCode::SUCCESS;
71 size_t in = roads.size();
81 else if (
r.getNHitLayers() > old->getNHitLayers()) *old =
r;
82 else if (
r.getNHitLayers() == old->getNHitLayers() &&
r.getNHits() > old->getNHits()) *old =
r;
90 roads.emplace_back(*tempPtr);
98 ATH_MSG_DEBUG(
"Input: " << in <<
" Output: " << roads.size());
99 return StatusCode::SUCCESS;
125 auto hash_a =
a->getIdentifierHash();
126 auto hash_b = b->getIdentifierHash();
127 if ( hash_a == hash_b ) {
128 auto phi_a =
a->getPhiIndex();
129 auto phi_b = b->getPhiIndex();
130 if ( phi_a == phi_b ) {
131 auto eta_a =
a->getEtaIndex();
132 auto eta_b = b->getEtaIndex();
133 if ( eta_a == eta_b) {
134 auto layer_a =
a->getPhysLayer();
135 auto layer_b = b->getPhysLayer();
136 return layer_a < layer_b;
138 return eta_a < eta_b;
140 return phi_a < phi_b;
142 return hash_a < hash_b;
146 std::set<const FPGATrackSimHit*, HitCompare > hitsInTrack1;
148 if (hit.isReal()) hitsInTrack1.insert(&hit);
151 std::set<const FPGATrackSimHit*, HitCompare> hitsInTrack2;
153 if (hit.isReal()) hitsInTrack2.insert(&hit);
156 std::vector<const FPGATrackSimHit*> sharedHits;
157 std::set_intersection( hitsInTrack1.begin(), hitsInTrack1.end(),
158 hitsInTrack2.begin(), hitsInTrack2.end(),
159 std::back_inserter(sharedHits),
163 int nHitsInTrack1 = hitsInTrack1.size();
164 int nHitsInTrack2 = hitsInTrack2.size();
165 int nSharedHits = sharedHits.size();
168 int nonOverlappingHits = std::min(nHitsInTrack1 - nSharedHits, nHitsInTrack2 - nSharedHits);
182 return StatusCode::FAILURE;
190 return StatusCode::SUCCESS;
195 std::vector<const FPGATrackSimHit*> hitsInTrack1;
197 if (hit.isReal()) hitsInTrack1.push_back(&hit);
200 std::vector<const FPGATrackSimHit*> hitsInTrack2;
202 if (hit.isReal()) hitsInTrack2.push_back(&hit);
208 bool goodOrder =
true;
209 if (hitsInTrack1.size() == hitsInTrack2.size()) {
216 }
else if (hitsInTrack1.size() > hitsInTrack2.size()) {
239 for (
unsigned int i=0; i < tracks.size(); i++) {
242 if (tracks.at(i).getChi2ndof() >
m_minChi2.value()) {
243 tracks.at(i).setPassedOR(0);
248 for (
unsigned int j=i+1; j< tracks.size(); j++) {
254 if (!tracks.at(i).passedOR())
break;
257 if (tracks.at(j).getChi2ndof() >
m_minChi2.value()) tracks.at(j).setPassedOR(0);
261 if (!tracks.at(j).passedOR())
continue;
270 return StatusCode::SUCCESS;
284 if (nHits1 != nHits2) {
285 return nHits1 < nHits2;
293 if (std::abs(chi2_1 - chi2_2) > std::numeric_limits<float>::epsilon()) {
294 return chi2_1 > chi2_2;
305 for (
const auto& hit : track.getFPGATrackSimHits()) {
306 if (hit.isReal())
nHits++;
323 ATH_MSG_DEBUG(
"Beginning v2 overlap removal on " << tracks.size() <<
" tracks");
326 for (
auto& track : tracks) {
327 if (track.getChi2ndof() >
m_minChi2.value()) {
328 track.setPassedOR(0);
340 for (
size_t i = 0; i < tracks.size(); i++) {
343 if (!tracks[i].passedOR())
continue;
346 for (
size_t j = i + 1; j < tracks.size(); j++) {
349 if (!tracks[j].passedOR())
continue;
355 bool isOverlap =
false;
362 int nonOverlapping = std::min(nHits_i - nOverlapping, nHits_j - nOverlapping);
368 tracks[i].setPassedOR(0);
369 ATH_MSG_DEBUG(
"Track " << i <<
" rejected due to overlap with better track " << j);
379 for (
const auto& track : tracks) {
380 if (track.passedOR()) nSurvivors++;
382 ATH_MSG_DEBUG(
"V2 OR complete: " << nSurvivors <<
" tracks surviving out of " << tracks.size());
384 return StatusCode::SUCCESS;
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_WARNING(x)
int findNCommonHitsGlobal(const FPGATrackSimTrack &Track1, const FPGATrackSimTrack &Track2)
int findNCommonHits(const FPGATrackSimTrack &Track1, const FPGATrackSimTrack &Track2)
Maps physical layers to logical layers.
Defines several vector wrappers for homogenous multi-dimensional vectors, declared as 1D arrays for l...
static const uint32_t nHits
void setPassedOR(unsigned int)
float getChi2ndof() const
const std::vector< FPGATrackSimHit > & getFPGATrackSimHits() const
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.