3 #include "../FPGATrackSimAlgorithms/FPGATrackSimOverlapRemovalTool.h"
7 #include "GaudiKernel/MsgStream.h"
21 ATH_MSG_INFO(
"FPGATrackSimOverlapRemovalTool::initialize()" );
38 ATH_MSG_WARNING(
"LocalMaxOR only being run per hough slice (i.e. this tool does nothing) since roadSliceOR is turned off");
47 return StatusCode::FAILURE;
51 return StatusCode::SUCCESS;
56 if (!localMaxWindowSize)
return true;
57 if (!
acc(
y,
x))
return false;
58 for (
int j = -localMaxWindowSize; j <= localMaxWindowSize; j++)
59 for (
int i = -localMaxWindowSize;
i <= localMaxWindowSize;
i++)
61 if (
i == 0 && j == 0)
continue;
62 if (
y + j <
acc.size(0) &&
x +
i <
acc.size(1))
64 if (!
acc(
y+j,
x+
i))
continue;
65 if (
acc(
y+j,
x+
i)->getNHitLayers() >
acc(
y,
x)->getNHitLayers())
return false;
66 if (
acc(
y+j,
x+
i)->getNHitLayers() ==
acc(
y,
x)->getNHitLayers())
68 if (
acc(
y+j,
x+
i)->getNHits() >
acc(
y,
x)->getNHits())
return false;
69 if (
acc(
y+j,
x+
i)->getNHits() ==
acc(
y,
x)->getNHits() && j <= 0 &&
i <= 0)
return false;
79 if (roads.empty())
return StatusCode::SUCCESS;
82 size_t in = roads.size();
92 else if (
r->getNHitLayers() >
old->getNHitLayers()) *
old = *
r.get();
93 else if (
r->getNHitLayers() ==
old->getNHitLayers() &&
r->getNHits() >
old->getNHits()) *
old = *
r.get();
101 roads.emplace_back(std::shared_ptr<const FPGATrackSimRoad>(tempPtr));
109 ATH_MSG_DEBUG(
"Input: " << in <<
" Output: " << roads.size());
110 return StatusCode::SUCCESS;
133 auto hash_a =
a->getIdentifierHash();
134 auto hash_b =
b->getIdentifierHash();
135 if ( hash_a == hash_b ) {
136 auto phi_a =
a->getPhiIndex();
137 auto phi_b =
b->getPhiIndex();
138 if ( phi_a == phi_b ) {
139 auto eta_a =
a->getEtaIndex();
140 auto eta_b =
b->getEtaIndex();
141 if ( eta_a == eta_b) {
142 auto layer_a =
a->getPhysLayer();
143 auto layer_b =
b->getPhysLayer();
144 return layer_a < layer_b;
146 return eta_a < eta_b;
148 return phi_a < phi_b;
150 return hash_a < hash_b;
154 std::set<const FPGATrackSimHit*, HitCompare > hitsInTrack1;
156 if (hit.isReal()) hitsInTrack1.insert(&hit);
159 std::set<const FPGATrackSimHit*, HitCompare> hitsInTrack2;
161 if (hit.isReal()) hitsInTrack2.insert(&hit);
164 std::vector<const FPGATrackSimHit*> sharedHits;
166 hitsInTrack2.begin(), hitsInTrack2.end(),
167 std::back_inserter(sharedHits),
171 int nHitsInTrack1 = hitsInTrack1.size();
172 int nHitsInTrack2 = hitsInTrack2.size();
173 int nSharedHits = sharedHits.size();
176 int nonOverlappingHits =
std::min(nHitsInTrack1 - nSharedHits, nHitsInTrack2 - nSharedHits);
190 return StatusCode::FAILURE;
198 return StatusCode::SUCCESS;
203 std::vector<const FPGATrackSimHit*> hitsInTrack1;
205 if (hit.isReal()) hitsInTrack1.push_back(&hit);
208 std::vector<const FPGATrackSimHit*> hitsInTrack2;
210 if (hit.isReal()) hitsInTrack2.push_back(&hit);
216 bool goodOrder =
true;
217 if (hitsInTrack1.size() == hitsInTrack2.size()) {
224 }
else if (hitsInTrack1.size() > hitsInTrack2.size()) {
247 for (
unsigned int i=0;
i < tracks.size();
i++) {
250 if (tracks.at(
i).getChi2ndof() >
m_minChi2.value()) {
251 tracks.at(
i).setPassedOR(0);
256 for (
unsigned int j=
i+1; j< tracks.size(); j++) {
262 if (!tracks.at(
i).passedOR())
break;
265 if (tracks.at(j).getChi2ndof() >
m_minChi2.value()) tracks.at(j).setPassedOR(0);
269 if (!tracks.at(j).passedOR())
continue;
278 return StatusCode::SUCCESS;