#include <TrackingTools/TrajectoryCleaning/interface/TrajectoryCleanerBySharedHits.h>
Public Types | |
typedef std::vector< Trajectory * > | TrajectoryPointerContainer |
Public Member Functions | |
virtual void | clean (TrajectoryPointerContainer &) const |
TrajectoryCleanerBySharedHits () | |
virtual | ~TrajectoryCleanerBySharedHits () |
The "best" trajectory of each set of mutually exclusive ones is kept, the others are eliminated. The goodness of a track is defined in terms of Chi^2, number of reconstructed hits, and number of lost hits.
Definition at line 16 of file TrajectoryCleanerBySharedHits.h.
typedef std::vector<Trajectory*> TrajectoryCleanerBySharedHits::TrajectoryPointerContainer |
Reimplemented from TrajectoryCleaner.
Definition at line 20 of file TrajectoryCleanerBySharedHits.h.
TrajectoryCleanerBySharedHits::TrajectoryCleanerBySharedHits | ( | ) | [inline] |
virtual TrajectoryCleanerBySharedHits::~TrajectoryCleanerBySharedHits | ( | ) | [inline, virtual] |
void TrajectoryCleanerBySharedHits::clean | ( | TrajectoryPointerContainer & | tc | ) | const [virtual] |
Implements TrajectoryCleaner.
Definition at line 9 of file TrajectoryCleanerBySharedHits.cc.
References Trajectory::invalidate(), TrackingRecHit::isValid(), it, and min.
Referenced by RoadSearchTrackCandidateMakerAlgorithm::PrepareTrackCandidates(), RoadSearchTrackCandidateMakerAlgorithm::run(), OutInConversionTrackFinder::tracks(), and InOutConversionTrackFinder::tracks().
00010 { 00011 typedef vector<Trajectory*>::iterator TI; 00012 typedef map<const TransientTrackingRecHit*,vector<TI>,RecHitComparatorByPosition> RecHitMap; 00013 typedef map<Trajectory*,int,less<Trajectory*> > TrajMap; // for each Trajectory it stores the number of shared hits 00014 RecHitMap theRecHitMap; 00015 00016 // start filling theRecHit 00017 for (TrajectoryCleaner::TrajectoryPointerIterator 00018 it = tc.begin(); it != tc.end(); it++) { 00019 Trajectory::DataContainer pd = (*it)->data(); 00020 for (Trajectory::DataContainer::iterator im = pd.begin(); 00021 im != pd.end(); im++) { 00022 //RC const TransientTrackingRecHit* theRecHit = ((*im).recHit()); 00023 const TransientTrackingRecHit* theRecHit = &(*(*im).recHit()); 00024 if (theRecHit->isValid()) 00025 theRecHitMap[theRecHit].push_back(it); 00026 } 00027 } 00028 // end filling theRecHit 00029 00030 // for each trajectory fill theTrajMap 00031 00032 for (TrajectoryCleaner::TrajectoryPointerIterator 00033 itt = tc.begin(); itt != tc.end(); itt++) { 00034 if((*itt)->isValid()){ 00035 TrajMap theTrajMap; 00036 Trajectory::DataContainer pd = (*itt)->data(); 00037 for (Trajectory::DataContainer::iterator im = pd.begin(); 00038 im != pd.end(); im++) { 00039 //RC const TransientTrackingRecHit* theRecHit = ((*im).recHit()); 00040 const TransientTrackingRecHit* theRecHit = &(*(*im).recHit()); 00041 if (theRecHit->isValid()) { 00042 const vector<TI>& hitTrajectories( theRecHitMap[theRecHit]); 00043 for (vector<TI>::const_iterator ivec=hitTrajectories.begin(); 00044 ivec!=hitTrajectories.end(); ivec++) { 00045 if (*ivec != itt){ 00046 if ((**ivec)->isValid()){ 00047 theTrajMap[**ivec]++; 00048 } 00049 } 00050 } 00051 } 00052 } 00053 //end filling theTrajMap 00054 00055 // check for duplicated tracks 00056 if(!theTrajMap.empty() > 0){ 00057 for(TrajMap::iterator imapp = theTrajMap.begin(); 00058 imapp != theTrajMap.end(); imapp++){ 00059 // int nhit1 = (*itt).data().size(); 00060 // int nhit2 = (*imapp).first->data().size(); 00061 int nhit1 = (*itt)->foundHits(); 00062 int nhit2 = (*imapp).first->foundHits(); 00063 if((*imapp).second >= min(nhit1, nhit2)/2){ 00064 Trajectory* badtraj; 00065 if (nhit1 != nhit2) 00066 // select the shortest trajectory 00067 badtraj = (nhit1 > nhit2) ? 00068 (*imapp).first : *itt; 00069 else 00070 // select the trajectory with less chi squared 00071 badtraj = ((*imapp).first->chiSquared() > (*itt)->chiSquared()) ? 00072 (*imapp).first : *itt; 00073 badtraj->invalidate(); // invalidate this trajectory 00074 } 00075 } 00076 } 00077 } 00078 } 00079 00080 }