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;
145 std::set<const FPGATrackSimHit*, HitCompare > hitsInTrack1;
147 if (!hit_ptr)
throw std::runtime_error(
"Null hit pointer in compareTrackQuality: tracks should not have unassigned layers");
148 if (hit_ptr->isReal()) hitsInTrack1.insert(hit_ptr.get());
151 std::set<const FPGATrackSimHit*, HitCompare> hitsInTrack2;
153 if (!hit_ptr)
throw std::runtime_error(
"Null hit pointer in compareTrackQuality: tracks should not have unassigned layers");
154 if (hit_ptr->isReal()) hitsInTrack2.insert(hit_ptr.get());
157 std::vector<const FPGATrackSimHit*> sharedHits;
158 std::set_intersection( hitsInTrack1.begin(), hitsInTrack1.end(),
159 hitsInTrack2.begin(), hitsInTrack2.end(),
160 std::back_inserter(sharedHits),
164 int nHitsInTrack1 = hitsInTrack1.size();
165 int nHitsInTrack2 = hitsInTrack2.size();
166 int nSharedHits = sharedHits.size();
169 int nonOverlappingHits = std::min(nHitsInTrack1 - nSharedHits, nHitsInTrack2 - nSharedHits);
183 return StatusCode::FAILURE;
191 return StatusCode::SUCCESS;
196 std::vector<const FPGATrackSimHit*> hitsInTrack1;
198 if (!hit_ptr)
throw std::runtime_error(
"Null hit pointer in countOverlappingHits_v2: tracks should not have unassigned layers");
199 if (hit_ptr->isReal()) hitsInTrack1.push_back(hit_ptr.get());
202 std::vector<const FPGATrackSimHit*> hitsInTrack2;
204 if (!hit_ptr)
throw std::runtime_error(
"Null hit pointer in countOverlappingHits_v2: tracks should not have unassigned layers");
205 if (hit_ptr->isReal()) hitsInTrack2.push_back(hit_ptr.get());
211 bool goodOrder =
true;
212 if (hitsInTrack1.size() == hitsInTrack2.size()) {
219 }
else if (hitsInTrack1.size() > hitsInTrack2.size()) {
242 for (
unsigned int i=0; i < tracks.size(); i++) {
245 if (tracks.at(i).getChi2ndof() >
m_minChi2.value()) {
246 tracks.at(i).setPassedOR(0);
251 for (
unsigned int j=i+1; j< tracks.size(); j++) {
257 if (!tracks.at(i).passedOR())
break;
260 if (tracks.at(j).getChi2ndof() >
m_minChi2.value()) tracks.at(j).setPassedOR(0);
264 if (!tracks.at(j).passedOR())
continue;
273 return StatusCode::SUCCESS;
287 if (nHits1 != nHits2) {
288 return nHits1 < nHits2;
296 if (std::abs(chi2_1 - chi2_2) > std::numeric_limits<float>::epsilon()) {
297 return chi2_1 > chi2_2;
308 for (
const auto& hit_ptr : track.getFPGATrackSimHitPtrs()) {
309 if (!hit_ptr)
throw std::runtime_error(
"Null hit pointer in countRealHits_v2: tracks should not have unassigned layers");
310 if (hit_ptr->isReal())
nHits++;
327 ATH_MSG_DEBUG(
"Beginning v2 overlap removal on " << tracks.size() <<
" tracks");
330 for (
auto& track : tracks) {
331 if (track.getChi2ndof() >
m_minChi2.value()) {
332 track.setPassedOR(0);
344 for (
size_t i = 0; i < tracks.size(); i++) {
347 if (!tracks[i].passedOR())
continue;
350 for (
size_t j = i + 1; j < tracks.size(); j++) {
353 if (!tracks[j].passedOR())
continue;
359 bool isOverlap =
false;
366 int nonOverlapping = std::min(nHits_i - nOverlapping, nHits_j - nOverlapping);
372 tracks[i].setPassedOR(0);
373 ATH_MSG_DEBUG(
"Track " << i <<
" rejected due to overlap with better track " << j);
383 for (
const auto& track : tracks) {
384 if (track.passedOR()) nSurvivors++;
386 ATH_MSG_DEBUG(
"V2 OR complete: " << nSurvivors <<
" tracks surviving out of " << tracks.size());
388 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)
const std::vector< std::shared_ptr< const FPGATrackSimHit > > & getFPGATrackSimHitPtrs() const
float getChi2ndof() const
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.