Back to home page

Project CMSSW displayed by LXR

 
 

    


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 //#define GIO_WAIT
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()) {  // ^ = XOR!
0046           if (first_hit1->hit()->sharesInput(second_hit1->hit(), TrackingRecHit::all)) {
0047             if (!fh2Valid) {
0048               firstTraj->invalidate();
0049               break;
0050             }
0051             // else // if (!second_hit2->isValid())  // should be always true, as we did XOR !
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