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.get();
82 else if (
r->getNHitLayers() == old->getNHitLayers() &&
r->getNHits() > old->getNHits()) *old = *
r.get();
90 roads.emplace_back(std::shared_ptr<const FPGATrackSimRoad>(tempPtr));
98 ATH_MSG_DEBUG(
"Input: " << in <<
" Output: " << roads.size());
99 return StatusCode::SUCCESS;
122 auto hash_a =
a->getIdentifierHash();
123 auto hash_b = b->getIdentifierHash();
124 if ( hash_a == hash_b ) {
125 auto phi_a =
a->getPhiIndex();
126 auto phi_b = b->getPhiIndex();
127 if ( phi_a == phi_b ) {
128 auto eta_a =
a->getEtaIndex();
129 auto eta_b = b->getEtaIndex();
130 if ( eta_a == eta_b) {
131 auto layer_a =
a->getPhysLayer();
132 auto layer_b = b->getPhysLayer();
133 return layer_a < layer_b;
135 return eta_a < eta_b;
137 return phi_a < phi_b;
139 return hash_a < hash_b;
143 std::set<const FPGATrackSimHit*, HitCompare > hitsInTrack1;
145 if (hit.isReal()) hitsInTrack1.insert(&hit);
148 std::set<const FPGATrackSimHit*, HitCompare> hitsInTrack2;
150 if (hit.isReal()) hitsInTrack2.insert(&hit);
153 std::vector<const FPGATrackSimHit*> sharedHits;
154 std::set_intersection( hitsInTrack1.begin(), hitsInTrack1.end(),
155 hitsInTrack2.begin(), hitsInTrack2.end(),
156 std::back_inserter(sharedHits),
160 int nHitsInTrack1 = hitsInTrack1.size();
161 int nHitsInTrack2 = hitsInTrack2.size();
162 int nSharedHits = sharedHits.size();
165 int nonOverlappingHits = std::min(nHitsInTrack1 - nSharedHits, nHitsInTrack2 - nSharedHits);
179 return StatusCode::FAILURE;
187 return StatusCode::SUCCESS;
192 std::vector<const FPGATrackSimHit*> hitsInTrack1;
194 if (hit.isReal()) hitsInTrack1.push_back(&hit);
197 std::vector<const FPGATrackSimHit*> hitsInTrack2;
199 if (hit.isReal()) hitsInTrack2.push_back(&hit);
205 bool goodOrder =
true;
206 if (hitsInTrack1.size() == hitsInTrack2.size()) {
213 }
else if (hitsInTrack1.size() > hitsInTrack2.size()) {
236 for (
unsigned int i=0; i < tracks.size(); i++) {
239 if (tracks.at(i).getChi2ndof() >
m_minChi2.value()) {
240 tracks.at(i).setPassedOR(0);
245 for (
unsigned int j=i+1; j< tracks.size(); j++) {
251 if (!tracks.at(i).passedOR())
break;
254 if (tracks.at(j).getChi2ndof() >
m_minChi2.value()) tracks.at(j).setPassedOR(0);
258 if (!tracks.at(j).passedOR())
continue;
267 return StatusCode::SUCCESS;
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_WARNING(x)
Maps physical layers to logical layers.
Defines several vector wrappers for homogenous multi-dimensional vectors, declared as 1D arrays for l...
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.