![]() |
![]() |
#include <RecoTracker/CkfPattern/interface/IntermediateTrajectoryCleaner.h>
Static Public Member Functions | |
static void | clean (TempTrajectoryContainer &tracks) |
Private Types | |
typedef TransientTrackingRecHit::ConstRecHitPointer | ConstRecHitPointer |
typedef BaseCkfTrajectoryBuilder::TempTrajectoryContainer | TempTrajectoryContainer |
Definition at line 8 of file IntermediateTrajectoryCleaner.h.
typedef TransientTrackingRecHit::ConstRecHitPointer IntermediateTrajectoryCleaner::ConstRecHitPointer [private] |
Definition at line 10 of file IntermediateTrajectoryCleaner.h.
typedef BaseCkfTrajectoryBuilder::TempTrajectoryContainer IntermediateTrajectoryCleaner::TempTrajectoryContainer [private] |
Definition at line 9 of file IntermediateTrajectoryCleaner.h.
void IntermediateTrajectoryCleaner::clean | ( | IntermediateTrajectoryCleaner::TempTrajectoryContainer & | theTrajectories | ) | [static] |
Definition at line 14 of file IntermediateTrajectoryCleaner.cc.
References TrackingRecHit::all, and TempTrajectory::isValid().
Referenced by GroupedCkfTrajectoryBuilder::groupedLimitedCandidates(), and CkfTrajectoryBuilder::limitedCandidates().
00014 { 00015 00016 if (theTrajectories.empty()) return; 00017 if (theTrajectories[0].measurements().size()<4) return; 00018 00019 for (TempTrajectoryContainer::iterator firstTraj=theTrajectories.begin(), firstEnd=theTrajectories.end() - 1; 00020 firstTraj != firstEnd; ++firstTraj) { 00021 00022 if ( (!firstTraj->isValid()) || 00023 (!firstTraj->lastMeasurement().recHit()->isValid()) ) continue; 00024 00025 TempTrajectory::DataContainer::const_iterator itFirst = firstTraj->measurements().rbegin(); 00026 ConstRecHitPointer first_hit1 = itFirst->recHit(); --itFirst; 00027 ConstRecHitPointer first_hit2 = itFirst->recHit(); --itFirst; 00028 ConstRecHitPointer first_hit3 = itFirst->recHit(); 00029 00030 bool fh2Valid = first_hit2->isValid(); 00031 00032 for (TempTrajectoryContainer::iterator secondTraj = (firstTraj+1), secondEnd = theTrajectories.end(); 00033 secondTraj != secondEnd; ++secondTraj) { 00034 00035 if ( (!secondTraj->isValid()) || 00036 (!secondTraj->lastMeasurement().recHit()->isValid()) ) continue; 00037 00038 TempTrajectory::DataContainer::const_iterator itSecond = secondTraj->measurements().rbegin(); 00039 ConstRecHitPointer second_hit1 = itSecond->recHit(); --itSecond; 00040 ConstRecHitPointer second_hit2 = itSecond->recHit(); --itSecond; 00041 ConstRecHitPointer second_hit3 = itSecond->recHit(); 00042 00043 if ( &(*first_hit3) == &(*second_hit3) ) { 00044 if (fh2Valid ^ second_hit2->isValid()) { // ^ = XOR! 00045 if ( first_hit1->hit()->sharesInput( second_hit1->hit(), TrackingRecHit::all ) ){ 00046 00047 if (!fh2Valid) { 00048 firstTraj->invalidate(); 00049 break; 00050 } 00051 // else // if (!second_hit2->isValid()) // should be always true, as we did XOR ! 00052 secondTraj->invalidate(); 00053 } 00054 } 00055 } 00056 } 00057 } 00058 theTrajectories.erase(std::remove_if( theTrajectories.begin(),theTrajectories.end(), 00059 std::not1(std::mem_fun_ref(&TempTrajectory::isValid))), 00060 // boost::bind(&TempTrajectory::isValid,_1)), 00061 theTrajectories.end()); 00062 }