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 (TrajectoryPointerContainer::iterator
52  it = tc.begin(); it != tc.end(); ++it) {
53  DEBUG_PRINT(std::cout << " Processing trajectory " << *it << " (" << (*it)->foundHits() << " valid hits)" << std::endl);
54  const Trajectory::DataContainer & pd = (*it)->measurements();
55  for (Trajectory::DataContainer::const_iterator im = pd.begin();
56  im != pd.end(); im++) {
57  const TransientTrackingRecHit* 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;
70  itt = tc.begin(); itt != tc.end(); ++itt) {
71  if((*itt)->isValid()){
72  DEBUG_PRINT(std::cout << " Processing trajectory " << *itt << " (" << (*itt)->foundHits() << " valid hits)" << std::endl);
73  theTrajMap.clear();
74  const Trajectory::DataContainer & pd = (*itt)->measurements();
75  for (Trajectory::DataContainer::const_iterator im = pd.begin();
76  im != pd.end(); ++im) {
77  //RC const TransientTrackingRecHit* theRecHit = ((*im).recHit());
78  const TransientTrackingRecHit* theRecHit = &(*(*im).recHit());
79  if (theRecHit->isValid()) {
80  DEBUG_PRINT(std::cout << " Searching for overlaps on hit " << theRecHit << " for trajectory " << *itt << std::endl);
81  for (RecHitMap::value_iterator ivec = theRecHitMap.values(theRecHit);
82  ivec.good(); ++ivec) {
83  if (*ivec != *itt){
84  if ((*ivec)->isValid()){
85  theTrajMap[*ivec]++;
86  }
87  }
88  }
89  }
90  }
91  //end filling theTrajMap
92 
93  // check for duplicated tracks
94  if(!theTrajMap.empty() > 0){
95  for(TrajMap::iterator imapp = theTrajMap.begin();
96  imapp != theTrajMap.end(); ++imapp){
97  if((*imapp).second > 0 ){
98  int innerHit = 0;
99  if ( allowSharedFirstHit ) {
100  const TrajectoryMeasurement & innerMeasure1 = ( (*itt)->direction() == alongMomentum ) ?
101  (*itt)->firstMeasurement() : (*itt)->lastMeasurement();
102  const TransientTrackingRecHit* h1 = &(*(innerMeasure1).recHit());
103  const TrajectoryMeasurement & innerMeasure2 = ( (*imapp).first->direction() == alongMomentum ) ?
104  (*imapp).first->firstMeasurement() : (*imapp).first->lastMeasurement();
105  const TransientTrackingRecHit* h2 = &(*(innerMeasure2).recHit());
106  if ( (h1 == h2) || ((h1->geographicalId() == h2->geographicalId()) &&
107  (h1->hit()->sharesInput(h2->hit(), TrackingRecHit::some))) ) {
108  innerHit = 1;
109  }
110  }
111  int nhit1 = (*itt)->foundHits();
112  int nhit2 = (*imapp).first->foundHits();
113  if( ((*imapp).second - innerHit) >= ( (min(nhit1, nhit2)-innerHit) * theFraction) ){
114  Trajectory* badtraj;
115  double score1 = validHitBonus_*nhit1 - missingHitPenalty_*(*itt)->lostHits() - (*itt)->chiSquared();
116  double score2 = validHitBonus_*nhit2 - missingHitPenalty_*(*imapp).first->lostHits() - (*imapp).first->chiSquared();
117  badtraj = (score1 > score2) ? (*imapp).first : *itt;
118  badtraj->invalidate(); // invalidate this trajectory
119  }
120  }
121  }
122  }
123  }
124  }
125 }
int lostHits() const
Definition: Trajectory.h:286
TrajectoryPointerContainer::iterator TrajectoryPointerIterator
virtual void clean(TrajectoryPointerContainer &) const
void invalidate()
Method to invalidate a trajectory. Useful during ambiguity resolution.
Definition: Trajectory.h:327
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
bool isValid() const
tuple cout
Definition: gather_cfg.py:145
DetId geographicalId() const
tuple allowSharedFirstHit