CMS 3D CMS Logo

TrajectoryCleanerBySharedHits.cc
Go to the documentation of this file.
4 
6 
7 //#define DEBUG_PRINT(X) X
8 #define DEBUG_PRINT(X)
9 
10 namespace {
11 
12  // Define when two rechits are equals
13  struct EqualsBySharesInput {
14  bool operator()(const TransientTrackingRecHit *h1, const TransientTrackingRecHit *h2) const {
15  return (h1 == h2) || ((h1->geographicalId() == h2->geographicalId()) &&
16  (h1->hit()->sharesInput(h2->hit(), TrackingRecHit::some)));
17  }
18  };
19  // Define a hash, i.e. a number that must be equal if hits are equal, and should be different if they're not
20  struct HashByDetId {
21  std::size_t operator()(const TransientTrackingRecHit *hit) const {
22  std::hash<uint32_t> hasher;
23  return hasher(hit->geographicalId().rawId());
24  }
25  };
26 
27  using RecHitMap =
30 
31  struct Maps {
32  Maps() : theRecHitMap(128, 256, 1024) {} // allocate 128 buckets, one row for 256 keys and one row for 512 values
33  RecHitMap theRecHitMap;
34  TrajMap theTrajMap;
35  };
36 
37  thread_local Maps theMaps;
38 } // namespace
39 
40 using namespace std;
41 
43  if (tc.size() <= 1)
44  return; // nothing to clean
45 
46  auto &theRecHitMap = theMaps.theRecHitMap;
47 
48  theRecHitMap.clear(10 * tc.size()); // set 10*tc.size() active buckets
49  // numbers are not optimized
50 
51  DEBUG_PRINT(std::cout << "Filling RecHit map" << std::endl);
52  for (auto const &it : tc) {
53  DEBUG_PRINT(std::cout << " Processing trajectory " << it << " (" << it->foundHits() << " valid hits)"
54  << std::endl);
55  auto const &pd = it->measurements();
56  for (auto const &im : pd) {
57  auto theRecHit = &(*im.recHit());
58  if (theRecHit->isValid()) {
59  DEBUG_PRINT(std::cout << " Added hit " << theRecHit << " for trajectory " << it << std::endl);
60  theRecHitMap.insert(theRecHit, it);
61  }
62  }
63  }
64  DEBUG_PRINT(theRecHitMap.dump());
65 
66  DEBUG_PRINT(std::cout << "Using RecHit map" << std::endl);
67  // for each trajectory fill theTrajMap
68  auto &theTrajMap = theMaps.theTrajMap;
69  for (auto const &itt : tc) {
70  if (itt->isValid()) {
71  DEBUG_PRINT(std::cout << " Processing trajectory " << itt << " (" << itt->foundHits() << " valid hits)"
72  << std::endl);
73  theTrajMap.clear();
74  const Trajectory::DataContainer &pd = itt->measurements();
75  for (auto const &im : pd) {
76  auto theRecHit = &(*im.recHit());
77  if (theRecHit->isValid()) {
78  DEBUG_PRINT(std::cout << " Searching for overlaps on hit " << theRecHit << " for trajectory " << itt
79  << std::endl);
80  for (RecHitMap::value_iterator ivec = theRecHitMap.values(theRecHit); ivec.good(); ++ivec) {
81  if (*ivec != itt) {
82  if ((*ivec)->isValid()) {
83  theTrajMap[*ivec]++;
84  }
85  }
86  }
87  }
88  }
89  //end filling theTrajMap
90 
91  auto score = [&](Trajectory const &t) -> float {
92  // possible variant under study
93  // auto ns = t.foundHits()-t.trailingFoundHits();
94  //auto penalty = 0.8f*missingHitPenalty_;
95  // return validHitBonus_*(t.foundHits()-0.2f*t.cccBadHits()) - penalty*t.lostHits() - t.chiSquared();
96  // classical score
97  return validHitBonus_ * t.foundHits() - missingHitPenalty_ * t.lostHits() - t.chiSquared();
98  };
99 
100  // check for duplicated tracks
101  if (!theTrajMap.empty() > 0) {
102  for (auto const &imapp : theTrajMap) {
103  if (imapp.second > 0) { // at least 1 hits in common!!!
104  int innerHit = 0;
105  if (allowSharedFirstHit) {
106  const TrajectoryMeasurement &innerMeasure1 =
107  (itt->direction() == alongMomentum) ? itt->firstMeasurement() : itt->lastMeasurement();
108  const TransientTrackingRecHit *h1 = &(*(innerMeasure1).recHit());
109  const TrajectoryMeasurement &innerMeasure2 = (imapp.first->direction() == alongMomentum)
110  ? imapp.first->firstMeasurement()
111  : imapp.first->lastMeasurement();
112  const TransientTrackingRecHit *h2 = &(*(innerMeasure2).recHit());
113  if ((h1 == h2) || ((h1->geographicalId() == h2->geographicalId()) &&
114  (h1->hit()->sharesInput(h2->hit(), TrackingRecHit::some)))) {
115  innerHit = 1;
116  }
117  }
118  int nhit1 = itt->foundHits();
119  int nhit2 = imapp.first->foundHits();
120  if ((imapp.second - innerHit) >= ((min(nhit1, nhit2) - innerHit) * theFraction)) {
121  Trajectory *badtraj;
122  auto score1 = score(*itt);
123  auto score2 = score(*imapp.first);
124  badtraj = (score1 > score2) ? imapp.first : itt;
125  badtraj->invalidate(); // invalidate this trajectory
126  }
127  }
128  }
129  }
130  }
131  }
132 }
void invalidate()
Method to invalidate a trajectory. Useful during ambiguity resolution.
Definition: Trajectory.h:260
virtual bool sharesInput(const TrackingRecHit *other, SharedInputType what) const
std::vector< Trajectory * > TrajectoryPointerContainer
void clean(TrajectoryPointerContainer &) const override
std::vector< TrajectoryMeasurement > DataContainer
Definition: Trajectory.h:40
#define DEBUG_PRINT(X)
DetId geographicalId() const
virtual TrackingRecHit const * hit() const
constexpr float validHitBonus_
Definition: Config.h:75
constexpr float missingHitPenalty_
Definition: Config.h:78