CMS 3D CMS Logo

TrajectoryCleanerBySharedHits Class Reference

A concrete TrajectoryCleaner that considers two trajectories to be mutually exclusive if they share more than some fraction of their hits. More...

#include <TrackingTools/TrajectoryCleaning/interface/TrajectoryCleanerBySharedHits.h>

Inheritance diagram for TrajectoryCleanerBySharedHits:

TrajectoryCleaner

List of all members.

Public Types

typedef std::vector< Trajectory * > TrajectoryPointerContainer

Public Member Functions

virtual void clean (TrajectoryPointerContainer &) const
 TrajectoryCleanerBySharedHits ()
virtual ~TrajectoryCleanerBySharedHits ()


Detailed Description

A concrete TrajectoryCleaner that considers two trajectories to be mutually exclusive if they share more than some fraction of their hits.

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.


Member Typedef Documentation

typedef std::vector<Trajectory*> TrajectoryCleanerBySharedHits::TrajectoryPointerContainer

Reimplemented from TrajectoryCleaner.

Definition at line 20 of file TrajectoryCleanerBySharedHits.h.


Constructor & Destructor Documentation

TrajectoryCleanerBySharedHits::TrajectoryCleanerBySharedHits (  )  [inline]

Definition at line 22 of file TrajectoryCleanerBySharedHits.h.

00022 {};

virtual TrajectoryCleanerBySharedHits::~TrajectoryCleanerBySharedHits (  )  [inline, virtual]

Definition at line 23 of file TrajectoryCleanerBySharedHits.h.

00023 {};


Member Function Documentation

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 }


The documentation for this class was generated from the following files:
Generated on Tue Jun 9 18:34:20 2009 for CMSSW by  doxygen 1.5.4