7 #include "GaudiKernel/MsgStream.h"
21 ATH_MSG_INFO(
"FPGATrackSimOverlapRemovalTool::initialize()" );
35 ATH_MSG_WARNING(
"LocalMaxOR only being run per hough slice (i.e. this tool does nothing) since roadSliceOR is turned off");
44 return StatusCode::FAILURE;
48 return StatusCode::SUCCESS;
53 if (!
acc(
y,
x))
return false;
55 for (
int j = -localMaxWindowSize; j <= localMaxWindowSize; j++)
56 for (
int i = -localMaxWindowSize;
i <= localMaxWindowSize;
i++)
58 if (
i == 0 && j == 0)
continue;
59 if (
y + j <
acc.size(0) &&
x +
i <
acc.size(1))
61 if (!
acc(
y+j,
x+
i))
continue;
62 if (
acc(
y+j,
x+
i)->getNHitLayers() >
acc(
y,
x)->getNHitLayers())
return false;
63 if (
acc(
y+j,
x+
i)->getNHitLayers() ==
acc(
y,
x)->getNHitLayers())
65 if (
acc(
y+j,
x+
i)->getNHits() >
acc(
y,
x)->getNHits())
return false;
66 if (
acc(
y+j,
x+
i)->getNHits() ==
acc(
y,
x)->getNHits() && j <= 0 &&
i <= 0)
return false;
76 if (roads.empty())
return StatusCode::SUCCESS;
79 size_t in = roads.size();
89 else if (
r->getNHitLayers() >
old->getNHitLayers())
old =
r;
90 else if (
r->getNHitLayers() ==
old->getNHitLayers() &&
r->getNHits() >
old->getNHits())
old =
r;
105 roads.push_back(
acc(
y,
x));
107 ATH_MSG_DEBUG(
"Input: " << in <<
" Output: " << roads.size());
108 return StatusCode::SUCCESS;
122 for(
unsigned int i=0;
i<tracks.size();
i++)
129 tracks.at(
i).setPassedOR(0);
137 for(
unsigned int j=
i+1; j<tracks.size(); j++)
146 tracks.at(j).setPassedOR(0);
153 int nOverlappingHits = 0;
165 int nNotOverlappingHits=0;
180 return StatusCode::SUCCESS;
186 float minChi2=100000.;
191 float t_chi2 = RMtracks.at(dup).getChi2ndof();
192 int t_nhitlayers = RMtracks.at(dup).getFPGATrackSimHits().size();
193 for(
auto& hit : RMtracks.at(dup).getFPGATrackSimHits())
201 if(t_nhitlayers>maxHitLayers)
205 RMtracks.at(prevID).setPassedOR(0);
208 maxHitLayers=t_nhitlayers;
211 else if(t_nhitlayers==maxHitLayers)
217 RMtracks.at(prevID).setPassedOR(0);
224 RMtracks.at(dup).setPassedOR(0);
229 RMtracks.at(dup).setPassedOR(0);
283 int nonOverlapHits=0;
324 return nonOverlapHits;
333 auto hash_a =
a->getIdentifierHash();
334 auto hash_b =
b->getIdentifierHash();
335 if ( hash_a == hash_b ) {
336 auto phi_a =
a->getPhiCoord();
337 auto phi_b =
b->getPhiCoord();
338 if ( phi_a == phi_b ) {
339 auto eta_a =
a->getEtaCoord();
340 auto eta_b =
b->getEtaCoord();
341 if ( eta_a == eta_b) {
342 auto layer_a =
a->getLayer();
343 auto layer_b =
b->getLayer();
344 return layer_a < layer_b;
346 return eta_a < eta_b;
348 return phi_a < phi_b;
350 return hash_a < hash_b;
354 std::set<const FPGATrackSimHit*, HitCompare > hitsInTrack1;
356 if (hit.isReal()) hitsInTrack1.insert(&hit);
359 std::set<const FPGATrackSimHit*, HitCompare> hitsInTrack2;
361 if (hit.isReal()) hitsInTrack2.insert(&hit);
364 std::vector<const FPGATrackSimHit*> sharedHits;
366 hitsInTrack2.begin(), hitsInTrack2.end(),
367 std::back_inserter(sharedHits),
371 int nHitsInTrack1 = hitsInTrack1.size();
372 int nHitsInTrack2 = hitsInTrack2.size();
373 int nSharedHits = sharedHits.size();
376 int nonOverlappingHits =
std::min(nHitsInTrack1 - nSharedHits, nHitsInTrack2 - nSharedHits);
390 return StatusCode::FAILURE;
398 return StatusCode::SUCCESS;
403 std::vector<const FPGATrackSimHit*> hitsInTrack1;
405 if (hit.isReal()) hitsInTrack1.push_back(&hit);
408 std::vector<const FPGATrackSimHit*> hitsInTrack2;
410 if (hit.isReal()) hitsInTrack2.push_back(&hit);
416 bool goodOrder =
true;
417 if (hitsInTrack1.size() == hitsInTrack2.size()) {
424 }
else if (hitsInTrack1.size() > hitsInTrack2.size()) {
447 for (
unsigned int i=0;
i < tracks.size();
i++) {
451 tracks.at(
i).setPassedOR(0);
456 for (
unsigned int j=
i+1; j< tracks.size(); j++) {
462 if (!tracks.at(
i).passedOR())
break;
465 if (tracks.at(j).getChi2ndof() >
m_minChi2) tracks.at(j).setPassedOR(0);
469 if (!tracks.at(j).passedOR())
continue;
478 return StatusCode::SUCCESS;