3 #include "../FPGATrackSimAlgorithms/FPGATrackSimOverlapRemovalTool.h"
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;
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;