CMS 3D CMS Logo

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