File indexing completed on 2024-04-06 12:28:00
0001 #include "RecoTracker/CkfPattern/interface/IntermediateTrajectoryCleaner.h"
0002 #include <algorithm>
0003 #include <functional>
0004
0005
0006 #ifdef GIO_WAIT
0007 void IntermediateTrajectoryCleaner::clean(TempTrajectoryContainer &theTrajectories) {}
0008 #else
0009
0010 void IntermediateTrajectoryCleaner::clean(IntermediateTrajectoryCleaner::TempTrajectoryContainer &theTrajectories) {
0011 if (theTrajectories.empty())
0012 return;
0013 if (theTrajectories[0].measurements().size() < 4)
0014 return;
0015
0016 for (TempTrajectoryContainer::iterator firstTraj = theTrajectories.begin(), firstEnd = theTrajectories.end() - 1;
0017 firstTraj != firstEnd;
0018 ++firstTraj) {
0019 if ((!firstTraj->isValid()) || (!firstTraj->lastMeasurement().recHit()->isValid()))
0020 continue;
0021
0022 TempTrajectory::DataContainer::const_iterator itFirst = firstTraj->measurements().rbegin();
0023 ConstRecHitPointer first_hit1 = itFirst->recHit();
0024 --itFirst;
0025 ConstRecHitPointer first_hit2 = itFirst->recHit();
0026 --itFirst;
0027 ConstRecHitPointer first_hit3 = itFirst->recHit();
0028
0029 bool fh2Valid = first_hit2->isValid();
0030
0031 for (TempTrajectoryContainer::iterator secondTraj = (firstTraj + 1), secondEnd = theTrajectories.end();
0032 secondTraj != secondEnd;
0033 ++secondTraj) {
0034 if ((!secondTraj->isValid()) || (!secondTraj->lastMeasurement().recHit()->isValid()))
0035 continue;
0036
0037 TempTrajectory::DataContainer::const_iterator itSecond = secondTraj->measurements().rbegin();
0038 ConstRecHitPointer second_hit1 = itSecond->recHit();
0039 --itSecond;
0040 ConstRecHitPointer second_hit2 = itSecond->recHit();
0041 --itSecond;
0042 ConstRecHitPointer second_hit3 = itSecond->recHit();
0043
0044 if (&(*first_hit3) == &(*second_hit3)) {
0045 if (fh2Valid ^ second_hit2->isValid()) {
0046 if (first_hit1->hit()->sharesInput(second_hit1->hit(), TrackingRecHit::all)) {
0047 if (!fh2Valid) {
0048 firstTraj->invalidate();
0049 break;
0050 }
0051
0052 secondTraj->invalidate();
0053 }
0054 }
0055 }
0056 }
0057 }
0058 theTrajectories.erase(
0059 std::remove_if(theTrajectories.begin(), theTrajectories.end(), std::not_fn(&TempTrajectory::isValid)),
0060 theTrajectories.end());
0061 }
0062 #endif