ATLAS Offline Software
FPGATrackSimOverlapRemovalTool.cxx
Go to the documentation of this file.
1 // Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
2 
6 
7 #include "GaudiKernel/MsgStream.h"
8 
9 #include <sstream>
10 #include <iostream>
11 #include <fstream>
12 
14 FPGATrackSimOverlapRemovalTool::FPGATrackSimOverlapRemovalTool(const std::string& algname, const std::string& name, const IInterface *ifc) :
15  AthAlgTool(algname, name, ifc)
16 {
17 }
18 
20 {
21  ATH_MSG_INFO( "FPGATrackSimOverlapRemovalTool::initialize()" );
22  // Check if this is 2nd stage
23  if(m_do2ndStage)
24  {
25  m_totLayers = m_FPGATrackSimMapping->PlaneMap_2nd()->getNLogiLayers();;
26  }
27  else
28  {
29  m_totLayers = m_FPGATrackSimMapping->PlaneMap_1st()->getNLogiLayers();;
30  }
31  ATH_MSG_DEBUG("Total number of layer: " << m_totLayers);
32 
33  // Check road OR
35  ATH_MSG_WARNING("LocalMaxOR only being run per hough slice (i.e. this tool does nothing) since roadSliceOR is turned off");
36 
37 
38  // Setup OR algorithm
39  if(m_algorithm == "Normal") m_algo=ORAlgo::Normal;
40  else if(m_algorithm == "Invert") m_algo=ORAlgo::InvertGrouping;
41  else
42  {
43  ATH_MSG_ERROR("initialize(): OR algorithm doesn't exist. ");
44  return StatusCode::FAILURE;
45  }
46  ATH_MSG_DEBUG("Overlap removal algorithm is "<<m_algorithm.value());
47 
48  return StatusCode::SUCCESS;
49 }
50 
51 bool isLocalMax(vector2D<FPGATrackSimRoad*> const & acc, unsigned x, unsigned y, int localMaxWindowSize)
52 {
53  if (!acc(y, x)) return false;
54 
55  for (int j = -localMaxWindowSize; j <= localMaxWindowSize; j++)
56  for (int i = -localMaxWindowSize; i <= localMaxWindowSize; i++)
57  {
58  if (i == 0 && j == 0) continue;
59  if (y + j < acc.size(0) && x + i < acc.size(1))
60  {
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())
64  {
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;
67  }
68  }
69  }
70 
71  return true;
72 }
73 
74 StatusCode FPGATrackSimOverlapRemovalTool::runOverlapRemoval(std::vector<FPGATrackSimRoad*>& roads)
75 {
76  if (roads.empty()) return StatusCode::SUCCESS;
77 
78  if (!m_roadSliceOR) return StatusCode::SUCCESS;
79  size_t in = roads.size();
80 
81  // Hough image
83 
84  // Slice-wise duplicate removal: accept only one road (with most hits) per bin
85  for (FPGATrackSimRoad* r: roads)
86  {
87  FPGATrackSimRoad* & old = acc(r->getYBin(), r->getXBin());
88  if (!old) old = r;
89  else if (r->getNHitLayers() > old->getNHitLayers()) old = r;
90  else if (r->getNHitLayers() == old->getNHitLayers() && r->getNHits() > old->getNHits()) old = r;
91  }
92 
93  // All-slices local max
95  for (unsigned y = 0; y < m_imageSize_y; y++)
96  for (unsigned x = 0; x < m_imageSize_x; x++)
98  acc(y, x) = nullptr;
99 
100  // Reformat to vector
101  roads.clear();
102  for (unsigned y = 0; y < m_imageSize_y; y++)
103  for (unsigned x = 0; x < m_imageSize_x; x++)
104  if (acc(y, x))
105  roads.push_back(acc(y, x));
106 
107  ATH_MSG_DEBUG("Input: " << in << " Output: " << roads.size());
108  return StatusCode::SUCCESS;
109 }
110 
111 StatusCode FPGATrackSimOverlapRemovalTool::runOverlapRemoval(std::vector<FPGATrackSimTrack>& tracks)
112 {
113 
114  // Do fast OR instead of requested
115  if (m_doFastOR) return runOverlapRemoval_fast(tracks);
116 
117  // Otherwise, proceed
118  ATH_MSG_DEBUG("Beginning runOverlapRemoval()");
119 
120  // Create tracks to hold and compare
121  FPGATrackSimTrack fit1, fit2;
122  for(unsigned int i=0; i<tracks.size();i++)
123  {
124  fit1=tracks.at(i);
125  // Apply Chi2 cut
126  if(fit1.getChi2ndof()>m_minChi2)
127  {
128  // Only consider track with chi2 smaller than m_minChi2
129  tracks.at(i).setPassedOR(0);
130  continue;
131  }
132 
133  // Create vector for holding duplicate track list
134  std::vector<int> duplicates(1,i);
135 
136  // Loop through the remaning tracks
137  for(unsigned int j=i+1; j<tracks.size(); j++)
138  {
139  if(i!=j)
140  {
141  fit2=tracks.at(j);
142  // Apply Chi2 cut
143  if(fit2.getChi2ndof()>m_minChi2)
144  {
145  // Only consider track with chi2 smaller than m_minChi2
146  tracks.at(j).setPassedOR(0);
147  continue;
148  }
149  // Based on the algorithm choose common hit of non-common hit
151  {
152  // Find the number of common hits between two tracks
153  int nOverlappingHits = 0;
154  nOverlappingHits=findNCommonHits(fit1,fit2);
155 
156  // Group overlapping tracks into a vector for removal if at least [m_NumOfHitPerGrouping] hits are the same
157  if(nOverlappingHits >= m_NumOfHitPerGrouping)
158  {
159  duplicates.push_back(j);
160  }
161  }
163  {
164  // Find the number of non-common hits between two tracks
165  int nNotOverlappingHits=0;
166  nNotOverlappingHits=findNonOverlapHits(fit1, fit2);
167 
168  // If the number of non-overlapping hit is [m_NumOfHitPerGrouping] or less
169  if(nNotOverlappingHits <= m_NumOfHitPerGrouping)
170  {
171  duplicates.push_back(j);
172  }
173  }
174  }
175  }
176 
177  findMinChi2MaxHit(duplicates, tracks);
178  }
179 
180  return StatusCode::SUCCESS;
181 }
182 
183 void FPGATrackSimOverlapRemovalTool::findMinChi2MaxHit(const std::vector<int>& duplicates, std::vector<FPGATrackSimTrack>& RMtracks)
184 {
185  // Hardcode the CHI2MAX for now, should change it later
186  float minChi2=100000.;
187  int prevID =-1;
188  int maxHitLayers=0;
189  for(auto dup: duplicates)
190  {
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())
194  {
195  if(!hit.isReal())
196  {
197  t_nhitlayers--;
198  }
199  }
200 
201  if(t_nhitlayers>maxHitLayers)
202  {
203  if(prevID!=-1)
204  {
205  RMtracks.at(prevID).setPassedOR(0);
206  }
207  prevID=dup;
208  maxHitLayers=t_nhitlayers;
209  minChi2=t_chi2;
210  }
211  else if(t_nhitlayers==maxHitLayers)
212  {
213  if(t_chi2<minChi2)
214  {
215  if(prevID!=-1)
216  {
217  RMtracks.at(prevID).setPassedOR(0);
218  }
219  prevID=dup;
220  minChi2=t_chi2;
221  }
222  else
223  {
224  RMtracks.at(dup).setPassedOR(0);
225  }
226  }
227  else
228  {
229  RMtracks.at(dup).setPassedOR(0);
230  }
231  }
232 }
233 
235 {
236  int nCommHits=0;
237 
238  // Loop through all layers
239  for(unsigned int i = 0; i < Track1.getFPGATrackSimHits().size(); ++i)
240  {
241  const FPGATrackSimHit& hit1 = Track1.getFPGATrackSimHits().at(i);
242  const FPGATrackSimHit& hit2 = Track2.getFPGATrackSimHits().at(i);
243 
244  // Check if hit is missing
245  if(!hit1.isReal() || !hit2.isReal())
246  {
247  continue;
248  }
249  // Check if hit on the same plane
250  else if(hit1.getLayer() != hit2.getLayer())
251  {
252  continue;
253  }
254  // Check if two hits have the same hashID
255  else if(hit1.getIdentifierHash() != hit2.getIdentifierHash())
256  {
257  continue;
258  }
259  // Check if two hits have same coordinate. this is difficult due to spacepoints,
260  // since the same hit can be used to make multiple spacepoints.
261  else if (hit1.getHitType() == HitType::spacepoint && hit2.getHitType() == HitType::spacepoint) {
262  if ((hit1.getX() == hit2.getX()) && (hit1.getY() == hit2.getY()) && (hit1.getZ() == hit2.getZ())) {
263  nCommHits++;
264  } else {
265  continue;
266  }
267  }
268  // If both hits aren't spacepoints, we should be able to do this comparison.
269  else if (hit1.getPhiCoord() == hit2.getPhiCoord()
270  && hit1.getEtaCoord() == hit2.getEtaCoord()) {
271  nCommHits++;
272  }
273  else
274  {
275  continue;
276  }
277  }
278  return nCommHits;
279 }
280 
282 {
283  int nonOverlapHits=0;
284 
285  // Loop through all layers
286  for(unsigned int i = 0; i < Track1.getFPGATrackSimHits().size(); ++i)
287  {
288  const FPGATrackSimHit& hit1 = Track1.getFPGATrackSimHits().at(i);
289  const FPGATrackSimHit& hit2 = Track2.getFPGATrackSimHits().at(i);
290  // First make sure we are looking at real hits
291  if(!hit1.isReal() || !hit2.isReal())
292  {
293  continue;
294  }
295  // Check if two hits are on the same plane
296  else if(hit1.getLayer() != hit2.getLayer())
297  {
298  nonOverlapHits++;
299  }
300  // Check if two hits have the same hashID
301  else if(hit1.getIdentifierHash() != hit2.getIdentifierHash())
302  {
303  nonOverlapHits++;
304  }
305  // Check if two hits have same coordinate. this is difficult due to spacepoints,
306  // since the same hit can be used to make multiple spacepoints.
307  else if (hit1.getHitType() == HitType::spacepoint && hit2.getHitType() == HitType::spacepoint) {
308  if ((hit1.getX() != hit2.getX()) || (hit1.getY() == hit2.getY()) || (hit1.getZ() == hit2.getZ())) {
309  nonOverlapHits++;
310  } else {
311  continue;
312  }
313  }
314  else if(hit1.getPhiCoord() != hit1.getPhiCoord()
315  || hit1.getEtaCoord() != hit1.getEtaCoord())
316  {
317  nonOverlapHits++;
318  }
319  else
320  {
321  continue;
322  }
323  }
324  return nonOverlapHits;
325 }
326 
327 
329 
330  // Hit comparison
331  struct HitCompare {
332  bool operator()(const FPGATrackSimHit* a, const FPGATrackSimHit* b) const {
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;
345  }
346  return eta_a < eta_b;
347  }
348  return phi_a < phi_b;
349  }
350  return hash_a < hash_b;
351  }
352  };
353 
354  std::set<const FPGATrackSimHit*, HitCompare > hitsInTrack1;
355  for ( auto& hit : track1.getFPGATrackSimHits()) {
356  if (hit.isReal()) hitsInTrack1.insert(&hit);
357  }
358 
359  std::set<const FPGATrackSimHit*, HitCompare> hitsInTrack2;
360  for ( auto& hit: track2.getFPGATrackSimHits()){
361  if (hit.isReal()) hitsInTrack2.insert(&hit);
362  }
363 
364  std::vector<const FPGATrackSimHit*> sharedHits;
365  std::set_intersection( hitsInTrack1.begin(), hitsInTrack1.end(),
366  hitsInTrack2.begin(), hitsInTrack2.end(),
367  std::back_inserter(sharedHits),
368  HitCompare() );
369 
370  // Number of real hits in track 1, number of real hits in track 2, number of shared hits, number of non-shared hits (?)
371  int nHitsInTrack1 = hitsInTrack1.size();
372  int nHitsInTrack2 = hitsInTrack2.size();
373  int nSharedHits = sharedHits.size();
374  // Original version seems to be only track 1; I want to compare each pair only once so
375  // let's make this the most conservative option (i.e. smallest number) ?
376  int nonOverlappingHits = std::min(nHitsInTrack1 - nSharedHits, nHitsInTrack2 - nSharedHits);
377 
378  // Now check if these pass our criteria for overlapping. If not, just return.
379  if(getAlgorithm() == ORAlgo::Normal) {
380  // Here decision is based on number of overlapping hits.
381  // Consider these overlapping if they share >= m_NumOfHitPerGrouping
382  if(nSharedHits < m_NumOfHitPerGrouping) return StatusCode::SUCCESS;
383 
384  } else if(getAlgorithm() == ORAlgo::InvertGrouping) {
385  // This is the opposite: duplicates of number of unique hits is <= m_NumOfHitPerGrouping.
386  if(nonOverlappingHits > m_NumOfHitPerGrouping) return StatusCode::SUCCESS;
387 
388  } else {
389  // Unknown.
390  return StatusCode::FAILURE;
391  }
392 
393  // Made it here: these tracks are overlapping.
394  // But we already sorted them such that track 2 is the one
395  // we want to keep, so we can just set track 1 to be removed.
396  track1.setPassedOR(0);
397 
398  return StatusCode::SUCCESS;
399 }
400 
402 {
403  std::vector<const FPGATrackSimHit*> hitsInTrack1;
404  for ( auto& hit : track1.getFPGATrackSimHits()) {
405  if (hit.isReal()) hitsInTrack1.push_back(&hit);
406  }
407 
408  std::vector<const FPGATrackSimHit*> hitsInTrack2;
409  for ( auto& hit: track2.getFPGATrackSimHits()){
410  if (hit.isReal()) hitsInTrack2.push_back(&hit);
411  }
412 
413  // If one track has more hits than the other, it's better.
414  // Return true if track 2 is better than track 1.
415  // Otherwise, decide based on chi2.
416  bool goodOrder = true;
417  if (hitsInTrack1.size() == hitsInTrack2.size()) {
418  // Surprising number of cases where the chi2 is actually identical.
419  // In these cases, let's default to the track ID number as the next most important property.
420  // So put it higher since we are considering later tracks to be better.
421  if (track1.getChi2ndof() == track2.getChi2ndof() && track1.getTrackID() < track2.getTrackID()) goodOrder = false;
422  // Now assuming they're different, we want them in decreasing chi2 order
423  else if (track1.getChi2ndof() < track2.getChi2ndof()) goodOrder = false;
424  } else if (hitsInTrack1.size() > hitsInTrack2.size()) {
425  goodOrder = false;
426  }
427 
428  return goodOrder;
429 
430 }
431 
433 {
434  ATH_MSG_DEBUG("Beginning fast overlap removal");
435 
436  // Sort tracks in order of increasing quality.
437  // This way, once a track has been eliminated in a comparison, we don't
438  // need to check it against any other tracks - they will always be
439  // better than it.
440  std::sort(std::begin(tracks),
441  std::end(tracks),
443 
444  // Now compare every pair of tracks.
445  // Set passedOR to 0 for the worst one (first one)
446  // if they are found to overlap.
447  for (unsigned int i=0; i < tracks.size(); i++) {
448 
449  // Skip track i if bad chi2.
450  if (tracks.at(i).getChi2ndof() > m_minChi2) {
451  tracks.at(i).setPassedOR(0);
452  continue;
453  }
454 
455  // Now check against all other tracks.
456  for (unsigned int j=i+1; j< tracks.size(); j++) {
457 
458  // Uniquely comparing tracks i and j here.
459 
460  // If have set track i to 0 in a previous comparison,
461  // no need to look at it any more - we're done with it.
462  if (!tracks.at(i).passedOR()) break;
463 
464  // Ignore j if its chi2 is bad.
465  if (tracks.at(j).getChi2ndof() > m_minChi2) tracks.at(j).setPassedOR(0);
466 
467  // If we just set track j to zero for bad chi2,
468  // no need to do the comparison.
469  if (!tracks.at(j).passedOR()) continue;
470 
471  // If we're still here, two at least semi-decent tracks.
472  // Compare them and remove one if necessary.
473  ATH_CHECK(removeOverlapping(tracks.at(i),tracks.at(j)));
474 
475  }
476  }
477 
478  return StatusCode::SUCCESS;
479 }
480 
481 
beamspotman.r
def r
Definition: beamspotman.py:676
FPGATrackSimOverlapRemovalTool::m_NumOfHitPerGrouping
Gaudi::Property< int > m_NumOfHitPerGrouping
Definition: FPGATrackSimOverlapRemovalTool.h:62
getMenu.algname
algname
Definition: getMenu.py:53
FPGATrackSimTrack::getTrackID
int getTrackID() const
Definition: FPGATrackSimTrack.h:28
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
FPGATrackSimOverlapRemovalTool::m_do2ndStage
Gaudi::Property< bool > m_do2ndStage
Definition: FPGATrackSimOverlapRemovalTool.h:61
FPGATrackSimTrack
Definition: FPGATrackSimTrack.h:16
FPGATrackSimPlaneMap.h
Maps physical layers to logical layers.
FPGATrackSimOverlapRemovalTool::FPGATrackSimOverlapRemovalTool
FPGATrackSimOverlapRemovalTool()=delete
FPGATrackSimHit::getX
float getX() const
Definition: FPGATrackSimHit.h:125
FPGATrackSimOverlapRemovalTool::getAlgorithm
ORAlgo getAlgorithm() const
Definition: FPGATrackSimOverlapRemovalTool.h:48
FPGATrackSimHit::isReal
bool isReal() const
FPGATrackSimOverlapRemovalTool::m_doFastOR
Gaudi::Property< bool > m_doFastOR
Definition: FPGATrackSimOverlapRemovalTool.h:69
PlotCalibFromCool.begin
begin
Definition: PlotCalibFromCool.py:94
FPGATrackSimHit::getLayer
unsigned getLayer() const
Definition: FPGATrackSimHit.cxx:75
FPGATrackSimTrack::setPassedOR
void setPassedOR(unsigned int)
Definition: FPGATrackSimTrack.cxx:303
ORAlgo::Normal
@ Normal
HitType::spacepoint
@ spacepoint
FPGATrackSimOverlapRemovalTool::findNCommonHits
int findNCommonHits(const FPGATrackSimTrack &, const FPGATrackSimTrack &)
Definition: FPGATrackSimOverlapRemovalTool.cxx:234
FPGATrackSimOverlapRemovalTool::m_imageSize_x
Gaudi::Property< unsigned > m_imageSize_x
Definition: FPGATrackSimOverlapRemovalTool.h:66
FPGATrackSimOverlapRemovalTool::m_imageSize_y
Gaudi::Property< unsigned > m_imageSize_y
Definition: FPGATrackSimOverlapRemovalTool.h:67
x
#define x
isLocalMax
bool isLocalMax(vector2D< FPGATrackSimRoad * > const &acc, unsigned x, unsigned y, int localMaxWindowSize)
Definition: FPGATrackSimOverlapRemovalTool.cxx:51
mergePhysValFiles.end
end
Definition: DataQuality/DataQualityUtils/scripts/mergePhysValFiles.py:93
FPGATrackSimHit
Definition: FPGATrackSimHit.h:38
FPGATrackSimTrack::getFPGATrackSimHits
const std::vector< FPGATrackSimHit > & getFPGATrackSimHits() const
Definition: FPGATrackSimTrack.h:54
FPGATrackSimHit::getPhiCoord
float getPhiCoord() const
Definition: FPGATrackSimHit.h:103
python.setupRTTAlg.size
int size
Definition: setupRTTAlg.py:39
FPGATrackSimVectors.h
Defines several vector wrappers for homogenous multi-dimensional vectors, declared as 1D arrays for l...
vector2D
Definition: FPGATrackSimVectors.h:28
FPGATrackSimOverlapRemovalTool::m_roadSliceOR
Gaudi::Property< bool > m_roadSliceOR
Definition: FPGATrackSimOverlapRemovalTool.h:64
FPGATrackSimTrack::getChi2ndof
float getChi2ndof() const
Definition: FPGATrackSimTrack.h:41
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
lumiFormat.i
int i
Definition: lumiFormat.py:92
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
FPGATrackSimOverlapRemovalTool::m_algorithm
Gaudi::Property< std::string > m_algorithm
Definition: FPGATrackSimOverlapRemovalTool.h:68
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
FPGATrackSimOverlapRemovalTool::m_totLayers
int m_totLayers
Definition: FPGATrackSimOverlapRemovalTool.h:71
AthenaPoolTestRead.acc
acc
Definition: AthenaPoolTestRead.py:16
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
FPGATrackSimOverlapRemovalTool::m_minChi2
Gaudi::Property< float > m_minChi2
Definition: FPGATrackSimOverlapRemovalTool.h:63
FPGATrackSimHit::getY
float getY() const
Definition: FPGATrackSimHit.h:126
FPGATrackSimHit::getIdentifierHash
unsigned getIdentifierHash() const
Definition: FPGATrackSimHit.h:76
FPGATrackSimHit::getZ
float getZ() const
Definition: FPGATrackSimHit.h:127
FPGATrackSimOverlapRemovalTool::m_localMaxWindowSize
Gaudi::Property< int > m_localMaxWindowSize
Definition: FPGATrackSimOverlapRemovalTool.h:65
min
#define min(a, b)
Definition: cfImp.cxx:40
FPGATrackSimOverlapRemovalTool::findNonOverlapHits
int findNonOverlapHits(const FPGATrackSimTrack &, const FPGATrackSimTrack &)
Definition: FPGATrackSimOverlapRemovalTool.cxx:281
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:192
plotBeamSpotMon.b
b
Definition: plotBeamSpotMon.py:77
FPGATrackSimOverlapRemovalTool::m_FPGATrackSimMapping
ServiceHandle< IFPGATrackSimMappingSvc > m_FPGATrackSimMapping
Definition: FPGATrackSimOverlapRemovalTool.h:78
FPGATrackSimOverlapRemovalTool::m_algo
ORAlgo m_algo
Definition: FPGATrackSimOverlapRemovalTool.h:72
FPGATrackSimOverlapRemovalTool::compareTrackQuality
static bool compareTrackQuality(const FPGATrackSimTrack &track1, const FPGATrackSimTrack &track2)
Definition: FPGATrackSimOverlapRemovalTool.cxx:401
FPGATrackSimOverlapRemovalTool.h
Overlap removal tool for FPGATrackSimTrack.
FPGATrackSimOverlapRemovalTool::runOverlapRemoval_fast
StatusCode runOverlapRemoval_fast(std::vector< FPGATrackSimTrack > &tracks)
Definition: FPGATrackSimOverlapRemovalTool.cxx:432
FPGATrackSimHit::getEtaCoord
float getEtaCoord() const
Definition: FPGATrackSimHit.h:104
FPGATrackSimOverlapRemovalTool::removeOverlapping
StatusCode removeOverlapping(FPGATrackSimTrack &track1, FPGATrackSimTrack &track2)
Definition: FPGATrackSimOverlapRemovalTool.cxx:328
a
TList * a
Definition: liststreamerinfos.cxx:10
y
#define y
CSV_InDetExporter.old
old
Definition: CSV_InDetExporter.py:145
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
FPGATrackSimOverlapRemovalTool::runOverlapRemoval
StatusCode runOverlapRemoval(std::vector< FPGATrackSimRoad * > &roads)
Definition: FPGATrackSimOverlapRemovalTool.cxx:74
FPGATrackSimOverlapRemovalTool::initialize
StatusCode initialize() override
Definition: FPGATrackSimOverlapRemovalTool.cxx:19
FPGATrackSimOverlapRemovalTool::findMinChi2MaxHit
void findMinChi2MaxHit(const std::vector< int > &duplicates, std::vector< FPGATrackSimTrack > &tracks)
Definition: FPGATrackSimOverlapRemovalTool.cxx:183
AthAlgTool
Definition: AthAlgTool.h:26
set_intersection
Set * set_intersection(Set *set1, Set *set2)
Perform an intersection of two sets.
ORAlgo::InvertGrouping
@ InvertGrouping
generateReferenceFile.duplicates
duplicates
Definition: generateReferenceFile.py:24
FPGATrackSimRoad
Definition: FPGATrackSimRoad.h:29
FPGATrackSimHit::getHitType
HitType getHitType() const
Definition: FPGATrackSimHit.h:54