CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
List of all members | Public Member Functions | Protected Member Functions | Private Types | Private Member Functions | Static Private Member Functions | Private Attributes
GroupedCkfTrajectoryBuilder Class Referencefinal

#include <GroupedCkfTrajectoryBuilder.h>

Inheritance diagram for GroupedCkfTrajectoryBuilder:
BaseCkfTrajectoryBuilder TrajectoryBuilder

Public Member Functions

TempTrajectory buildTrajectories (const TrajectorySeed &seed, TrajectoryContainer &ret, const TrajectoryFilter *) const
 common part of both public trajectory building methods More...
 
double chiSquareCut ()
 
const
Chi2MeasurementEstimatorBase
estimator () const
 
 GroupedCkfTrajectoryBuilder (const edm::ParameterSet &conf, edm::ConsumesCollector &iC)
 constructor from ParameterSet More...
 
float lostHitPenalty ()
 
double mass ()
 Mass hypothesis used for propagation. More...
 
int maxCand ()
 
double ptCut ()
 Pt cut. More...
 
void rebuildSeedingRegion (const TrajectorySeed &, TrajectoryContainer &result) const
 
void rebuildTrajectories (TempTrajectory const &startingTraj, const TrajectorySeed &, TrajectoryContainer &result) const
 
TrajectoryContainer trajectories (const TrajectorySeed &) const
 set Event for the internal MeasurementTracker data member More...
 
void trajectories (const TrajectorySeed &, TrajectoryContainer &ret) const
 trajectories building starting from a seed, return in an already allocated vector More...
 
TrajectoryContainer trajectories (const TrajectorySeed &, const TrackingRegion &) const
 trajectories building starting from a seed with a region More...
 
void trajectories (const TrajectorySeed &, TrajectoryContainer &ret, const TrackingRegion &) const
 trajectories building starting from a seed with a region More...
 
const TrajectoryStateUpdatorupdator () const
 
virtual ~GroupedCkfTrajectoryBuilder ()
 destructor More...
 
- Public Member Functions inherited from BaseCkfTrajectoryBuilder
 BaseCkfTrajectoryBuilder (const edm::ParameterSet &conf, TrajectoryFilter *filter, TrajectoryFilter *inOutFilter=0)
 
 BaseCkfTrajectoryBuilder (const BaseCkfTrajectoryBuilder &)=delete
 
const
TransientTrackingRecHitBuilder
hitBuilder () const
 
BaseCkfTrajectoryBuilderoperator= (const BaseCkfTrajectoryBuilder &)=delete
 
virtual void setDebugger (CkfDebugger *dbg) const
 
virtual void setEvent (const edm::Event &event) const
 
void setEvent (const edm::Event &iEvent, const edm::EventSetup &iSetup, const MeasurementTrackerEvent *data)
 
void setNavigationSchool (NavigationSchool const *nv)
 
virtual void unset () const
 
virtual ~BaseCkfTrajectoryBuilder ()
 
- Public Member Functions inherited from TrajectoryBuilder
virtual ~TrajectoryBuilder ()
 

Protected Member Functions

virtual void analyseMeasurements (const std::vector< TM > &meas, const Trajectory &traj) const
 
virtual void analyseResult (const TrajectoryContainer &result) const
 
virtual void analyseSeed (const TrajectorySeed &seed) const
 
void setEvent_ (const edm::Event &iEvent, const edm::EventSetup &iSetup) override
 
- Protected Member Functions inherited from BaseCkfTrajectoryBuilder
void addToResult (boost::shared_ptr< const TrajectorySeed > const &seed, TempTrajectory &traj, TrajectoryContainer &result, bool inOut=false) const
 
void addToResult (TempTrajectory const &traj, TempTrajectoryContainer &result, bool inOut=false) const
 
virtual bool analyzeMeasurementsDebugger (Trajectory &traj, const std::vector< TrajectoryMeasurement > &meas, const MeasurementTrackerEvent *theMeasurementTracker, const Propagator *theForwardPropagator, const Chi2MeasurementEstimatorBase *theEstimator, const TransientTrackingRecHitBuilder *theTTRHBuilder) const
 
virtual bool analyzeMeasurementsDebugger (TempTrajectory &traj, const std::vector< TrajectoryMeasurement > &meas, const MeasurementTrackerEvent *theMeasurementTracker, const Propagator *theForwardPropagator, const Chi2MeasurementEstimatorBase *theEstimator, const TransientTrackingRecHitBuilder *theTTRHBuilder) const
 
const PropagatorbackwardPropagator (const TrajectorySeed &seed) const
 
TempTrajectory createStartingTrajectory (const TrajectorySeed &seed) const
 
virtual void fillSeedHistoDebugger (std::vector< TrajectoryMeasurement >::iterator begin, std::vector< TrajectoryMeasurement >::iterator end) const
 
StateAndLayers findStateAndLayers (const TrajectorySeed &seed, const TempTrajectory &traj) const
 
StateAndLayers findStateAndLayers (const TempTrajectory &traj) const
 
const PropagatorforwardPropagator (const TrajectorySeed &seed) const
 
void moveToResult (TempTrajectory &&traj, TempTrajectoryContainer &result, bool inOut=false) const
 
bool qualityFilter (const TempTrajectory &traj, bool inOut=false) const
 
void setData (const MeasurementTrackerEvent *data)
 
bool toBeContinued (TempTrajectory &traj, bool inOut=false) const
 

Private Types

enum  work_MaxSize_Size_ { work_MaxSize_ = 50 }
 

Private Member Functions

bool advanceOneLayer (const TrajectorySeed &seed, TempTrajectory &traj, const TrajectoryFilter *regionalCondition, const Propagator *propagator, bool inOut, TempTrajectoryContainer &newCand, TempTrajectoryContainer &result) const
 
TempTrajectory backwardFit (TempTrajectory &candidate, unsigned int nSeed, const TrajectoryFitter &fitter, std::vector< const TrackingRecHit * > &remainingHits) const
 
void groupedIntermediaryClean (TempTrajectoryContainer &theTrajectories) const
 intermediate cleaning in the case of grouped measurements More...
 
void groupedLimitedCandidates (const TrajectorySeed &seed, TempTrajectory const &startingTraj, const TrajectoryFilter *regionalCondition, const Propagator *propagator, bool inOut, TempTrajectoryContainer &result) const
 
void rebuildSeedingRegion (const TrajectorySeed &seed, TempTrajectory const &startingTraj, TempTrajectoryContainer &result) const
 try to find additional hits in seeding region More...
 
int rebuildSeedingRegion (const TrajectorySeed &seed, const std::vector< const TrackingRecHit * > &seedHits, TempTrajectory &candidate, TempTrajectoryContainer &result) const
 
bool tkxor (bool a, bool b) const
 
bool verifyHits (TempTrajectory::DataContainer::const_iterator rbegin, size_t maxDepth, const std::vector< const TrackingRecHit * > &hits) const
 Verifies presence of a RecHits in a range of TrajectoryMeasurements. More...
 

Static Private Member Functions

static PropagationDirection oppositeDirection (PropagationDirection dir)
 change of propagation direction More...
 

Private Attributes

float maxDPhiForLooperReconstruction
 
float maxPt2ForLooperReconstruction
 
bool theAlwaysUseInvalid
 
bool theBestHitOnly
 
double theChiSquareCut
 
TrajectoryFiltertheConfigurableCondition
 
float theFoundHitBonus
 
bool theIntermediateCleaning
 
bool theKeepOriginalIfRebuildFails
 
bool theLockHits
 
float theLostHitPenalty
 
double theMass
 
int theMaxCand
 
unsigned int theMinNrOf2dHitsForRebuild
 
unsigned int theMinNrOfHitsForRebuild
 
double theptCut
 
bool theRequireSeedHitsInRebuild
 

Additional Inherited Members

- Public Types inherited from BaseCkfTrajectoryBuilder
typedef std::vector
< TempTrajectory
TempTrajectoryContainer
 
typedef std::vector< TrajectoryTrajectoryContainer
 
typedef
TrajectoryContainer::iterator 
TrajectoryIterator
 
- Public Types inherited from TrajectoryBuilder
typedef std::vector< TrajectoryTrajectoryContainer
 
typedef
TrajectoryContainer::iterator 
TrajectoryIterator
 
- Protected Types inherited from BaseCkfTrajectoryBuilder
typedef TrackingComponentsRecord Chi2MeasurementEstimatorRecord
 
typedef FreeTrajectoryState FTS
 
typedef std::pair< TSOS,
std::vector< const DetLayer * > > 
StateAndLayers
 
typedef TrajectoryMeasurement TM
 
typedef TrajectoryStateOnSurface TSOS
 
- Static Protected Member Functions inherited from BaseCkfTrajectoryBuilder
static TrajectoryFiltercreateTrajectoryFilter (const edm::ParameterSet &pset, edm::ConsumesCollector &iC)
 
- Protected Attributes inherited from BaseCkfTrajectoryBuilder
const
Chi2MeasurementEstimatorBase
theEstimator
 
const MeasurementTrackerEventtheMeasurementTracker
 
const NavigationSchooltheNavigationSchool = 0
 
const PropagatorthePropagatorAlong
 
const PropagatorthePropagatorOpposite
 
const
TransientTrackingRecHitBuilder
theTTRHBuilder
 
const TrajectoryStateUpdatortheUpdator
 

Detailed Description

A highly configurable trajectory builder that allows full exploration of the combinatorial tree of possible continuations, and provides efficient ways of trimming the combinatorial tree.

Definition at line 24 of file GroupedCkfTrajectoryBuilder.h.

Member Enumeration Documentation

Enumerator
work_MaxSize_ 

Definition at line 207 of file GroupedCkfTrajectoryBuilder.h.

207 { work_MaxSize_ = 50 }; // if it grows above this number, it is forced to resize to half this amount when cleared

Constructor & Destructor Documentation

GroupedCkfTrajectoryBuilder::GroupedCkfTrajectoryBuilder ( const edm::ParameterSet conf,
edm::ConsumesCollector iC 
)

constructor from ParameterSet

Definition at line 121 of file GroupedCkfTrajectoryBuilder.cc.

References edm::ParameterSet::existsAs(), edm::ParameterSet::getParameter(), bookConverter::max, maxDPhiForLooperReconstruction, maxPt2ForLooperReconstruction, theAlwaysUseInvalid, theBestHitOnly, theFoundHitBonus, theIntermediateCleaning, theKeepOriginalIfRebuildFails, theLockHits, theLostHitPenalty, theMaxCand, theMinNrOf2dHitsForRebuild, theMinNrOfHitsForRebuild, and theRequireSeedHitsInRebuild.

121  :
124  conf.getParameter<bool>("useSameTrajFilter") ?
127  )
128 {
129  // fill data members from parameters (eventually data members could be dropped)
130  //
131  theMaxCand = conf.getParameter<int>("maxCand");
132 
133  theLostHitPenalty = conf.getParameter<double>("lostHitPenalty");
134  theFoundHitBonus = conf.getParameter<double>("foundHitBonus");
135  theIntermediateCleaning = conf.getParameter<bool>("intermediateCleaning");
136  theAlwaysUseInvalid = conf.getParameter<bool>("alwaysUseInvalidHits");
137  theLockHits = conf.getParameter<bool>("lockHits");
138  theBestHitOnly = conf.getParameter<bool>("bestHitOnly");
140  theRequireSeedHitsInRebuild = conf.getParameter<bool>("requireSeedHitsInRebuild");
141  theKeepOriginalIfRebuildFails = conf.getParameter<bool>("keepOriginalIfRebuildFails");
142  theMinNrOfHitsForRebuild = max(0,conf.getParameter<int>("minNrOfHitsForRebuild"));
143  maxPt2ForLooperReconstruction = conf.existsAs<double>("maxPtForLooperReconstruction") ?
144  conf.getParameter<double>("maxPtForLooperReconstruction") : 0;
146  maxDPhiForLooperReconstruction = conf.existsAs<double>("maxDPhiForLooperReconstruction") ?
147  conf.getParameter<double>("maxDPhiForLooperReconstruction") : 2.0;
148 
149 
150  /* ======= B.M. to be ported layer ===========
151  bool setOK = thePropagator->setMaxDirectionChange(1.6);
152  if (!setOK)
153  cout << "GroupedCkfTrajectoryBuilder WARNING: "
154  << "propagator does not support setMaxDirectionChange"
155  << endl;
156  // addStopCondition(theMinPtStopCondition);
157 
158  theConfigurableCondition = createAlgo<TrajectoryFilter>(componentConfig("StopCondition"));
159  ===================================== */
160 
161 }
T getParameter(std::string const &) const
bool existsAs(std::string const &parameterName, bool trackiness=true) const
checks if a parameter exists as a given type
Definition: ParameterSet.h:186
static TrajectoryFilter * createTrajectoryFilter(const edm::ParameterSet &pset, edm::ConsumesCollector &iC)
BaseCkfTrajectoryBuilder(const edm::ParameterSet &conf, TrajectoryFilter *filter, TrajectoryFilter *inOutFilter=0)
virtual GroupedCkfTrajectoryBuilder::~GroupedCkfTrajectoryBuilder ( )
inlinevirtual

destructor

Definition at line 31 of file GroupedCkfTrajectoryBuilder.h.

31 {}

Member Function Documentation

bool GroupedCkfTrajectoryBuilder::advanceOneLayer ( const TrajectorySeed seed,
TempTrajectory traj,
const TrajectoryFilter regionalCondition,
const Propagator propagator,
bool  inOut,
TempTrajectoryContainer newCand,
TempTrajectoryContainer result 
) const
private

Definition at line 456 of file GroupedCkfTrajectoryBuilder.cc.

References funct::abs(), BaseCkfTrajectoryBuilder::addToResult(), PV3DBase< T, PVType, FrameType >::basicVector(), gather_cfg::cout, PV3DBase< T, PVType, FrameType >::eta(), TransverseImpactPointExtrapolator::extrapolate(), f, BaseCkfTrajectoryBuilder::findStateAndLayers(), BaseCkfTrajectoryBuilder::forwardPropagator(), TempTrajectory::foundHits(), TrajectoryStateOnSurface::globalMomentum(), TrajectoryStateOnSurface::globalPosition(), TempTrajectory::incrementLoops(), TrajectoryStateOnSurface::isValid(), TempTrajectory::join(), TempTrajectory::lastLayer(), TempTrajectory::lastMeasurement(), Bounds::length(), DetLayer::location(), LogDebug, TempTrajectory::lostHits(), maxDPhiForLooperReconstruction, maxPt2ForLooperReconstruction, TempTrajectory::measurements(), TrackingRecHit::missing, eostools::move(), BaseCkfTrajectoryBuilder::moveToResult(), PV3DBase< T, PVType, FrameType >::perp(), PV3DBase< T, PVType, FrameType >::phi(), Propagator::propagationDirection(), cmsutils::bqueue< T >::rbegin(), rejected(), cmsutils::bqueue< T >::rend(), TempTrajectory::setDPhiCacheForLoopersReconstruction(), BarrelDetLayer::specificSurface(), filterCSVwithJSON::target, theAlwaysUseInvalid, theBestHitOnly, BaseCkfTrajectoryBuilder::theEstimator, theLockHits, theMaxCand, BaseCkfTrajectoryBuilder::theMeasurementTracker, BaseCkfTrajectoryBuilder::theUpdator, BaseCkfTrajectoryBuilder::toBeContinued(), TrajectoryStateOnSurface::transverseCurvature(), unlikely, TrajectoryMeasurement::updatedState(), and PV3DBase< T, PVType, FrameType >::z().

Referenced by groupedLimitedCandidates().

463 {
464  std::pair<TSOS,std::vector<const DetLayer*> > && stateAndLayers = findStateAndLayers(traj);
465 
466 
468  if(
469  //stateAndLayers.second.size()==0 &&
470  traj.lastLayer()->location()==0) {
471  float pt2 = stateAndLayers.first.globalMomentum().perp2();
473  pt2>(0.3f*0.3f)
474  )
475  stateAndLayers.second.push_back(traj.lastLayer());
476  }
477  }
478 
479  auto layerBegin = stateAndLayers.second.begin();
480  auto layerEnd = stateAndLayers.second.end();
481 
482  // if (nl.empty()) {
483  // addToResult(traj,result,inOut);
484  // return false;
485  // }
486 
487 #ifdef EDM_ML_DEBUG
488  LogDebug("CkfPattern")<<whatIsTheNextStep(traj, stateAndLayers);
489 #endif
490 
491  bool foundSegments(false);
492  bool foundNewCandidates(false);
493  for ( auto il=layerBegin; il!=layerEnd; il++) {
494 
495  TSOS stateToUse = stateAndLayers.first;
496 
497  double dPhiCacheForLoopersReconstruction(0);
498  if unlikely((*il)==traj.lastLayer()){
499 
501  // ------ For loopers reconstruction
502  //cout<<" self propagating in advanceOneLayer (for loopers) \n";
503  const BarrelDetLayer* sbdl = dynamic_cast<const BarrelDetLayer*>(traj.lastLayer());
504  if(sbdl){
505  HelixBarrelCylinderCrossing cylinderCrossing(stateToUse.globalPosition(),
506  stateToUse.globalMomentum(),
507  stateToUse.transverseCurvature(),
508  propagator->propagationDirection(),
509  sbdl->specificSurface());
510  if(!cylinderCrossing.hasSolution()) continue;
511  GlobalPoint starting = stateToUse.globalPosition();
512  GlobalPoint target1 = cylinderCrossing.position1();
513  GlobalPoint target2 = cylinderCrossing.position2();
514 
515  GlobalPoint farther = fabs(starting.phi()-target1.phi()) > fabs(starting.phi()-target2.phi()) ?
516  target1 : target2;
517 
518  const Bounds& bounds( sbdl->specificSurface().bounds());
519  float length = 0.5f*bounds.length();
520 
521  /*
522  cout << "starting: " << starting << endl;
523  cout << "target1: " << target1 << endl;
524  cout << "target2: " << target2 << endl;
525  cout << "dphi: " << (target1.phi()-target2.phi()) << endl;
526  cout << "length: " << length << endl;
527  */
528 
529  /*
530  float deltaZ = bounds.thickness()/2.f/fabs(tan(stateToUse.globalDirection().theta()) ) ;
531  if(stateToUse.hasError())
532  deltaZ += 3*sqrt(stateToUse.cartesianError().position().czz());
533  if( fabs(farther.z()) > length + deltaZ ) continue;
534  */
535  if(fabs(farther.z())*0.95f>length) continue;
536 
537  Geom::Phi<float> tmpDphi = target1.phi()-target2.phi();
538  if(std::abs(tmpDphi)>maxDPhiForLooperReconstruction) continue;
539  GlobalPoint target(0.5f*(target1.basicVector()+target2.basicVector()));
540  //cout << "target: " << target << endl;
541 
542 
543 
545  stateToUse = extrapolator.extrapolate(stateToUse, target, *propagator);
546  if (!stateToUse.isValid()) continue; //SK: consider trying the original? probably not
547 
548  //dPhiCacheForLoopersReconstruction = fabs(target1.phi()-target2.phi())*2.;
549  dPhiCacheForLoopersReconstruction = std::abs(tmpDphi);
550  traj.incrementLoops();
551  }else{ // not barrel
552  continue;
553  }
554  }else{ // loopers not requested (why else???)
555  // ------ For cosmics reconstruction
556  LogDebug("CkfPattern")<<" self propagating in advanceOneLayer.\n from: \n"<<stateToUse;
557  //self navigation case
558  // go to a middle point first
560  GlobalPoint center(0,0,0);
561  stateToUse = middle.extrapolate(stateToUse, center, *(forwardPropagator(seed)));
562 
563  if (!stateToUse.isValid()) continue;
564  LogDebug("CkfPattern")<<"to: "<<stateToUse;
565  }
566  } // last layer...
567 
568  //unsigned int maxCandidates = theMaxCand > 21 ? theMaxCand*2 : 42; //limit the number of returned segments
569  LayerMeasurements layerMeasurements(theMeasurementTracker->measurementTracker(), *theMeasurementTracker);
570  TrajectorySegmentBuilder layerBuilder(&layerMeasurements,
571  **il,*propagator,
574 
575 #ifdef EDM_ML_DEBUG
576  LogDebug("CkfPattern")<<whatIsTheStateToUse(stateAndLayers.first,stateToUse,*il);
577 #endif
578 
579  auto && segments= layerBuilder.segments(stateToUse);
580 
581  LogDebug("CkfPattern")<< "GCTB: number of segments = " << segments.size();
582 
583  if ( !segments.empty() ) foundSegments = true;
584 
585  for (auto is=segments.begin(); is!=segments.end(); is++ ) {
586  //
587  // assume "invalid hit only" segment is last in list
588  //
589  auto const & measurements = is->measurements();
590  if ( !theAlwaysUseInvalid && is!=segments.begin() && measurements.size()==1 &&
591  (measurements.front().recHit()->getType() == TrackingRecHit::missing) ) break;
592 
593 
594  //---- avoid to add the same hits more than once in the trajectory ----
595  bool toBeRejected(false);
596  for(auto revIt = measurements.rbegin(); revIt!=measurements.rend(); --revIt){
597  // int tmpCounter(0);
598  for(auto newTrajMeasIt = traj.measurements().rbegin();
599  newTrajMeasIt != traj.measurements().rend(); --newTrajMeasIt){
600  //if(tmpCounter==2) break;
601  if(revIt->recHitR().geographicalId()==newTrajMeasIt->recHitR().geographicalId()
602  && (revIt->recHitR().geographicalId() != DetId(0)) ){
603  toBeRejected=true;
604  goto rejected; //break; // see http://stackoverflow.com/questions/1257744/can-i-use-break-to-exit-multiple-nested-for-loops
605  }
606  // tmpCounter++;
607  }
608  }
609 
610  rejected:; // http://xkcd.com/292/
611  if(toBeRejected){
612 #ifdef VI_DEBUG
613  cout << "WARNING: neglect candidate because it contains the same hit twice \n";
614  cout << "-- discarded track's pt,eta,#found/lost: "
615  << traj.lastMeasurement().updatedState().globalMomentum().perp() << " , "
616  << traj.lastMeasurement().updatedState().globalMomentum().eta() << " , "
617  << traj.foundHits() << '/' << traj.lostHits() << "\n";
618 #endif
619  traj.setDPhiCacheForLoopersReconstruction(dPhiCacheForLoopersReconstruction);
620  continue; //Are we sure about this????
621  }
622  // ------------------------
623 
624  //
625  // create new candidate
626  //
627  TempTrajectory newTraj(traj);
628  traj.setDPhiCacheForLoopersReconstruction(dPhiCacheForLoopersReconstruction);
629  newTraj.join(*is);
630 
631  //std::cout << "DEBUG: newTraj after push found,lost: "
632  // << newTraj.foundHits() << " , "
633  // << newTraj.lostHits() << " , "
634  // << newTraj.measurements().size() << std::endl;
635 
636 
637 
638  //GIO// for ( vector<TM>::const_iterator im=measurements.begin();
639  //GIO// im!=measurements.end(); im++ ) newTraj.push(*im);
640  //if ( toBeContinued(newTraj,regionalCondition) ) { TOBE FIXED
641  if ( toBeContinued(newTraj, inOut) ) {
642  // Have added one more hit to track candidate
643 
644  LogDebug("CkfPattern")<<"GCTB: adding updated trajectory to candidates: inOut="<<inOut<<" hits="<<newTraj.foundHits();
645 
646  newCand.push_back(std::move(newTraj));
647  foundNewCandidates = true;
648  }
649  else {
650  // Have finished building this track. Check if it passes cuts.
651 
652  LogDebug("CkfPattern")<< "GCTB: adding completed trajectory to results if passes cuts: inOut="<<inOut<<" hits="<<newTraj.foundHits();
653 
654  moveToResult(std::move(newTraj), result, inOut);
655  }
656  } // loop over segs
657  } // loop over layers
658 
659  if ( !foundSegments ){
660  LogDebug("CkfPattern")<< "GCTB: adding input trajectory to result";
661  addToResult(traj, result, inOut);
662  }
663  return foundNewCandidates;
664 }
#define LogDebug(id)
const_iterator rend() const
Definition: bqueue.h:164
virtual float length() const =0
T perp() const
Definition: PV3DBase.h:72
virtual PropagationDirection propagationDirection() const
Definition: Propagator.h:155
virtual Location location() const =0
Which part of the detector (barrel, endcap)
const Propagator * forwardPropagator(const TrajectorySeed &seed) const
const DataContainer & measurements() const
Geom::Phi< T > phi() const
Definition: PV3DBase.h:69
const TrajectoryStateUpdator * theUpdator
GlobalPoint globalPosition() const
int foundHits() const
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is rejected(acceptEvent retursns false).There are 3 relevant cases of types of criteria
const TrajectoryMeasurement & lastMeasurement() const
#define unlikely(x)
void setDPhiCacheForLoopersReconstruction(float dphi)
T z() const
Definition: PV3DBase.h:64
tuple result
Definition: query.py:137
def move
Definition: eostools.py:510
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
double f[11][100]
void addToResult(boost::shared_ptr< const TrajectorySeed > const &seed, TempTrajectory &traj, TrajectoryContainer &result, bool inOut=false) const
const_iterator rbegin() const
Definition: bqueue.h:163
StateAndLayers findStateAndLayers(const TrajectorySeed &seed, const TempTrajectory &traj) const
const MeasurementTrackerEvent * theMeasurementTracker
Definition: DetId.h:18
virtual const BoundCylinder & specificSurface() const
Extension of the interface.
void moveToResult(TempTrajectory &&traj, TempTrajectoryContainer &result, bool inOut=false) const
T eta() const
Definition: PV3DBase.h:76
TrajectoryStateOnSurface extrapolate(const FreeTrajectoryState &fts, const GlobalPoint &vtx) const
extrapolation with default (=geometrical) propagator
GlobalVector globalMomentum() const
bool toBeContinued(TempTrajectory &traj, bool inOut=false) const
tuple cout
Definition: gather_cfg.py:121
TrajectoryStateOnSurface const & updatedState() const
Definition: Bounds.h:22
const DetLayer * lastLayer() const
Redundant method, returns the layer of lastMeasurement() .
const BasicVectorType & basicVector() const
Definition: PV3DBase.h:56
const Chi2MeasurementEstimatorBase * theEstimator
int lostHits() const
virtual void GroupedCkfTrajectoryBuilder::analyseMeasurements ( const std::vector< TM > &  meas,
const Trajectory traj 
) const
inlineprotectedvirtual

Definition at line 100 of file GroupedCkfTrajectoryBuilder.h.

101  {}
virtual void GroupedCkfTrajectoryBuilder::analyseResult ( const TrajectoryContainer result) const
inlineprotectedvirtual

Definition at line 102 of file GroupedCkfTrajectoryBuilder.h.

Referenced by buildTrajectories().

102 {}
virtual void GroupedCkfTrajectoryBuilder::analyseSeed ( const TrajectorySeed seed) const
inlineprotectedvirtual

Definition at line 98 of file GroupedCkfTrajectoryBuilder.h.

Referenced by buildTrajectories().

98 {}
TempTrajectory GroupedCkfTrajectoryBuilder::backwardFit ( TempTrajectory candidate,
unsigned int  nSeed,
const TrajectoryFitter fitter,
std::vector< const TrackingRecHit * > &  remainingHits 
) const
private

Definition at line 1009 of file GroupedCkfTrajectoryBuilder.cc.

References TempTrajectory::direction(), Trajectory::direction(), PrintoutHelper::dumpMeasurement(), PrintoutHelper::dumpMeasurements(), Trajectory::firstMeasurement(), TrajectoryFitter::fitOne(), TempTrajectory::foundHits(), TrackingRecHit::isValid(), Trajectory::isValid(), likely, LogDebug, bookConverter::max, Trajectory::measurements(), TempTrajectory::measurements(), TempTrajectory::nLoops(), Trajectory::nLoops(), oppositeDirection(), Trajectory::push(), TrajectoryStateOnSurface::rescaleError(), Trajectory::setNLoops(), cmsutils::bqueue< T >::size(), theMinNrOfHitsForRebuild, unlikely, and TrajectoryMeasurement::updatedState().

Referenced by rebuildSeedingRegion().

1012 {
1013  //
1014  // clear array of non-fitted hits
1015  //
1016  remainingHits.clear();
1017  //
1018  // skip candidates which are not exceeding the seed size
1019  // (e.g. Because no Tracker layers exist outside seeding region)
1020  //
1021  if unlikely( candidate.measurements().size()<=nSeed ) return TempTrajectory();
1022 
1023  LogDebug("CkfPattern")<<"nSeed " << nSeed << endl
1024  << "Old traj direction = " << candidate.direction() << endl
1026 
1027  //
1028  // backward fit trajectory.
1029  // (Will try to fit only hits outside the seeding region. However,
1030  // if there are not enough of these, it will also use the seeding hits).
1031  //
1032  // const unsigned int nHitAllMin(5);
1033  // const unsigned int nHit2dMin(2);
1034  unsigned int nHit(0); // number of valid hits after seeding region
1035  //unsigned int nHit2d(0); // number of valid hits after seeding region with 2D info
1036  // use all hits except the first n (from seed), but require minimum
1037  // specified in configuration.
1038  // Swapped over next two lines.
1039  unsigned int nHitMin = std::max(candidate.foundHits()-nSeed,theMinNrOfHitsForRebuild);
1040  // unsigned int nHitMin = oldMeasurements.size()-nSeed;
1041  // we want to rebuild only if the number of VALID measurements excluding the seed measurements is higher than the cut
1043 
1044  LogDebug("CkfPattern")/* << "nHitMin " << nHitMin*/ <<"Sizes: " << candidate.measurements().size() << " / ";
1045  //
1046  // create input trajectory for backward fit
1047  //
1048  Trajectory fwdTraj(oppositeDirection(candidate.direction()));
1049  fwdTraj.setNLoops(candidate.nLoops());
1050  //const TrajectorySeed seed = TrajectorySeed(PTrajectoryStateOnDet(), TrajectorySeed::recHitContainer(), oppositeDirection(candidate.direction()));
1051  //Trajectory fwdTraj(seed, oppositeDirection(candidate.direction()));
1052 
1053  const DetLayer* bwdDetLayer[candidate.measurements().size()];
1054  int nl=0;
1055  for ( auto const & tm : candidate.measurements() ) {
1056  const TrackingRecHit* hit = tm.recHitR().hit();
1057  //
1058  // add hits until required number is reached
1059  //
1060  if ( nHit<nHitMin ){//|| nHit2d<theMinNrOf2dHitsForRebuild ) {
1061  fwdTraj.push(tm);
1062  bwdDetLayer[nl++]=tm.layer();
1063  //
1064  // count valid / 2D hits
1065  //
1066  if likely( hit->isValid() ) {
1067  nHit++;
1068  //if ( hit.isMatched() ||
1069  // hit.det().detUnits().front()->type().module()==pixel )
1070  //nHit2d++;
1071  }
1072  }
1073  //if (nHit==nHitMin) lastBwdDetLayer=im->layer();
1074  //
1075  // keep remaining (valid) hits for verification
1076  //
1077  else if ( hit->isValid() ) {
1078  //std::cout << "Adding a remaining hit" << std::endl;
1079  remainingHits.push_back(hit);
1080  }
1081  }
1082  //
1083  // Fit only if required number of valid hits can be used
1084  //
1085  if unlikely( nHit<nHitMin ) return TempTrajectory();
1086 
1087  //
1088  // Do the backward fit (important: start from scaled, not random cov. matrix!)
1089  //
1090  TrajectoryStateOnSurface firstTsos(fwdTraj.firstMeasurement().updatedState());
1091  //cout << "firstTsos "<< firstTsos << endl;
1092  firstTsos.rescaleError(10.);
1093  //TrajectoryContainer bwdFitted(fitter.fit(fwdTraj.seed(),fwdTraj.recHits(),firstTsos));
1094  Trajectory && bwdFitted = fitter.fitOne(TrajectorySeed(PTrajectoryStateOnDet(), TrajectorySeed::recHitContainer(), oppositeDirection(candidate.direction())),
1095  fwdTraj.recHits(),firstTsos);
1096  if unlikely(!bwdFitted.isValid()) return TempTrajectory();
1097 
1098 
1099  LogDebug("CkfPattern")<<"Obtained bwdFitted trajectory with measurement size " << bwdFitted.measurements().size();
1100  TempTrajectory fitted(fwdTraj.direction());
1101  fitted.setNLoops(fwdTraj.nLoops());
1102  vector<TM> const & tmsbf = bwdFitted.measurements();
1103  int iDetLayer=0;
1104  //this is ugly but the TM in the fitted track do not contain the DetLayer.
1105  //So we have to cache the detLayer pointers and replug them in.
1106  //For the backward building it would be enaugh to cache the last DetLayer,
1107  //but for the intermediary cleaning we need all
1108  for ( vector<TM>::const_iterator im=tmsbf.begin();im!=tmsbf.end(); im++ ) {
1109  fitted.emplace( (*im).forwardPredictedState(),
1110  (*im).backwardPredictedState(),
1111  (*im).updatedState(),
1112  (*im).recHit(),
1113  (*im).estimate(),
1114  bwdDetLayer[iDetLayer]
1115  );
1116 
1117  LogDebug("CkfPattern")<<PrintoutHelper::dumpMeasurement(*im);
1118  iDetLayer++;
1119  }
1120  /*
1121  TM lastMeas = bwdFitted.front().lastMeasurement();
1122  fitted.pop();
1123  fitted.push(TM(lastMeas.forwardPredictedState(),
1124  lastMeas.backwardPredictedState(),
1125  lastMeas.updatedState(),
1126  lastMeas.recHit(),
1127  lastMeas.estimate(),
1128  lastBwdDetLayer));
1129  */
1130 
1131 
1132  return fitted;
1133 }
#define LogDebug(id)
const DataContainer & measurements() const
int foundHits() const
static std::string dumpMeasurement(const TrajectoryMeasurement &tm)
static std::string dumpMeasurements(const std::vector< TrajectoryMeasurement > &v)
return((rh^lh)&mask)
#define unlikely(x)
PropagationDirection direction() const
#define likely(x)
static PropagationDirection oppositeDirection(PropagationDirection dir)
change of propagation direction
if(c.getParameter< edm::InputTag >("puppiValueMap").label().size()!=0)
#define end
Definition: vmac.h:37
bool isValid() const
string const
Definition: compareJSON.py:14
#define begin
Definition: vmac.h:30
size_type size() const
Definition: bqueue.h:167
for(const auto &isodef:isoDefs)
tuple size
Write out results.
TempTrajectory GroupedCkfTrajectoryBuilder::buildTrajectories ( const TrajectorySeed seed,
GroupedCkfTrajectoryBuilder::TrajectoryContainer result,
const TrajectoryFilter regionalCondition 
) const
virtual

common part of both public trajectory building methods

Reimplemented from BaseCkfTrajectoryBuilder.

Definition at line 251 of file GroupedCkfTrajectoryBuilder.cc.

References analyseResult(), analyseSeed(), EnergyCorrector::c, compareJSON::const, gather_cfg::cout, BaseCkfTrajectoryBuilder::createStartingTrajectory(), Exception, BaseCkfTrajectoryBuilder::forwardPropagator(), groupedLimitedCandidates(), trackerHitRTTI::isUndef(), LogDebug, BaseCkfTrajectoryBuilder::theMeasurementTracker, and work_MaxSize_.

Referenced by trajectories().

254 {
255  if (theMeasurementTracker == 0) {
256  throw cms::Exception("LogicError") << "Asking to create trajectories to an un-initialized GroupedCkfTrajectoryBuilder.\nYou have to call clone(const MeasurementTrackerEvent *data) and then call trajectories on it instead.\n";
257  }
258 
259  statCount.seed();
260  //
261  // Build trajectory outwards from seed
262  //
263 
264  analyseSeed( seed);
265 
266  TempTrajectory const & startingTraj = createStartingTrajectory( seed);
267 
268  work_.clear();
269  const bool inOut = true;
270  groupedLimitedCandidates(seed, startingTraj, regionalCondition, forwardPropagator(seed), inOut, work_);
271  if ( work_.empty() ) return startingTraj;
272 
273 
274 
275  /* rebuilding is de-coupled from standard building
276  //
277  // try to additional hits in the seeding region
278  //
279  if ( theMinNrOfHitsForRebuild>0 ) {
280  // reverse direction
281  //thePropagator->setPropagationDirection(oppositeDirection(seed.direction()));
282  // rebuild part of the trajectory
283  rebuildSeedingRegion(startingTraj,work);
284  }
285 
286  */
287  boost::shared_ptr<const TrajectorySeed> pseed(new TrajectorySeed(seed));
288  result.reserve(work_.size());
289  for (TempTrajectoryContainer::const_iterator it = work_.begin(), ed = work_.end(); it != ed; ++it) {
290  result.push_back( it->toTrajectory() ); result.back().setSharedSeed(pseed);
291  }
292 
293  work_.clear();
294  if (work_.capacity() > work_MaxSize_) { TempTrajectoryContainer().swap(work_); work_.reserve(work_MaxSize_/2); }
295 
297 
298  LogDebug("CkfPattern")<< "GroupedCkfTrajectoryBuilder: returning result of size " << result.size();
299  statCount.traj(result.size());
300 
301 #ifdef VI_DEBUG
302  int kt=0;
303  for (auto const & traj : result) {
304 int chit[7]={};
305 for (auto const & tm : traj.measurements()) {
306  auto const & hit = tm.recHitR();
307  if (!hit.isValid()) ++chit[0];
308  if (hit.det()==nullptr) ++chit[1];
309  if ( trackerHitRTTI::isUndef(hit) ) continue;
310  if ( hit.dimension()!=2 ) {
311  ++chit[2];
312  } else {
313  auto const & thit = static_cast<BaseTrackerRecHit const&>(hit);
314  auto const & clus = thit.firstClusterRef();
315  if (clus.isPixel()) ++chit[3];
316  else if (thit.isMatched()) {
317  ++chit[4];
318  } else if (thit.isProjected()) {
319  ++chit[5];
320  } else {
321  ++chit[6];
322  }
323  }
324  }
325 
326 std::cout << "ckf " << kt++ << ": "; for (auto c:chit) std::cout << c <<'/'; std::cout<< std::endl;
327 }
328 #endif
329 
330  return startingTraj;
331 
332 }
#define LogDebug(id)
const Propagator * forwardPropagator(const TrajectorySeed &seed) const
virtual void analyseSeed(const TrajectorySeed &seed) const
virtual void analyseResult(const TrajectoryContainer &result) const
tuple result
Definition: query.py:137
void groupedLimitedCandidates(const TrajectorySeed &seed, TempTrajectory const &startingTraj, const TrajectoryFilter *regionalCondition, const Propagator *propagator, bool inOut, TempTrajectoryContainer &result) const
const MeasurementTrackerEvent * theMeasurementTracker
std::vector< TempTrajectory > TempTrajectoryContainer
string const
Definition: compareJSON.py:14
bool isUndef(TrackingRecHit const &hit)
tuple cout
Definition: gather_cfg.py:121
TempTrajectory createStartingTrajectory(const TrajectorySeed &seed) const
double GroupedCkfTrajectoryBuilder::chiSquareCut ( )
inline

Chi**2 Cut on the new Trajectory Measurements to consider

Definition at line 77 of file GroupedCkfTrajectoryBuilder.h.

const Chi2MeasurementEstimatorBase& GroupedCkfTrajectoryBuilder::estimator ( void  ) const
inline

Definition at line 72 of file GroupedCkfTrajectoryBuilder.h.

References BaseCkfTrajectoryBuilder::theEstimator.

Referenced by rebuildSeedingRegion().

72 {return *theEstimator;}
const Chi2MeasurementEstimatorBase * theEstimator
void GroupedCkfTrajectoryBuilder::groupedIntermediaryClean ( TempTrajectoryContainer theTrajectories) const
private

intermediate cleaning in the case of grouped measurements

im1->recHit()->hit()->sharesInput(im2->recHit()->hit(), TrackingRecHit::all) ) {

im1->recHit()->hit()->sharesInput(im2->recHit()->hit(), TrackingRecHit::all) ) {

Definition at line 699 of file GroupedCkfTrajectoryBuilder.cc.

References lumiContext::fill, ecalTPGAnalyzer_cfg::firstValid, TrackingRecHit::isValid(), TempTrajectory::isValid(), TempTrajectory::lastMeasurement(), LayerTriplets::layers(), cmsutils::bqueue< T >::rbegin(), TrajectoryMeasurement::recHitR(), cmsutils::bqueue< T >::rend(), TrackingRecHit::some, and tkxor().

Referenced by groupedLimitedCandidates().

700 {
701  //if (theTrajectories.empty()) return TrajectoryContainer();
702  //TrajectoryContainer result;
703  if (theTrajectories.empty()) return;
704  //RecHitEqualByChannels recHitEqualByChannels(false, false);
705  LayersInTraj layers[theTrajectories.size()];
706  int ntraj=0;
707  for ( auto & t : theTrajectories) {
708  if ( t.isValid() && t.lastMeasurement().recHitR().isValid() )
709  layers[ntraj++].fill(t);
710  }
711 
712  if (ntraj<2) return;
713 
714  for (int ifirst=0; ifirst!=ntraj-1; ++ifirst) {
715  auto firstTraj = layers[ifirst].traj;
716  if (!firstTraj->isValid()) continue;
717  const TempTrajectory::DataContainer & firstMeasurements = firstTraj->measurements();
718 
719  int firstLayerSize = layers[ifirst].tot;
720  if ( firstLayerSize<4 ) continue;
721  auto const & firstLayers = layers[ifirst].layers;
722 
723  for (int isecond= ifirst+1; isecond!=ntraj; ++isecond) {
724  auto secondTraj = layers[isecond].traj;
725  if (!secondTraj->isValid()) continue;
726 
727  const TempTrajectory::DataContainer & secondMeasurements = secondTraj->measurements();
728 
729  int secondLayerSize = layers[isecond].tot;
730  //
731  // only candidates using the same last 3 layers are compared
732  //
733  if ( firstLayerSize!=secondLayerSize ) continue; // V.I. why equal???
734  auto const & secondLayers = layers[isecond].layers;
735  if ( firstLayers[0]!=secondLayers[0] ||
736  firstLayers[1]!=secondLayers[1] ||
737  firstLayers[2]!=secondLayers[2] ) continue;
738 
739  TempTrajectory::DataContainer::const_iterator im1 = firstMeasurements.rbegin();
740  TempTrajectory::DataContainer::const_iterator im2 = secondMeasurements.rbegin();
741  //
742  // check for identical hits in the last layer
743  //
744  bool unequal(false);
745  const DetLayer* layerPtr = firstLayers[0];
746  while ( im1!=firstMeasurements.rend()&&im2!=secondMeasurements.rend() ) {
747  if ( im1->layer()!=layerPtr || im2->layer()!=layerPtr ) break;
748  if ( !(im1->recHit()->isValid()) || !(im2->recHit()->isValid()) ||
749  !im1->recHit()->hit()->sharesInput(im2->recHit()->hit(), TrackingRecHit::some) ) {
751  unequal = true;
752  break;
753  }
754  --im1;
755  --im2;
756  }
757  if ( im1==firstMeasurements.rend() || im2==secondMeasurements.rend() ||
758  im1->layer()==layerPtr || im2->layer()==layerPtr || unequal ) continue;
759  //
760  // check for invalid hits in the layer -2
761  // compare only candidates with invalid / valid combination
762  //
763  layerPtr = firstLayers[1];
764  bool firstValid(true);
765  while ( im1!=firstMeasurements.rend()&&im1->layer()==layerPtr ) {
766  if ( !im1->recHit()->isValid() ) firstValid = false;
767  --im1;
768  }
769  bool secondValid(true);
770  while ( im2!=secondMeasurements.rend()&&im2->layer()==layerPtr ) {
771  if ( !im2->recHit()->isValid() ) secondValid = false;
772  --im2;
773  }
774  if ( !tkxor(firstValid,secondValid) ) continue;
775  //
776  // ask for identical hits in layer -3
777  //
778  unequal = false;
779  layerPtr = firstLayers[2];
780  while ( im1!=firstMeasurements.rend()&&im2!=secondMeasurements.rend() ) {
781  if ( im1->layer()!=layerPtr || im2->layer()!=layerPtr ) break;
782  if ( !(im1->recHit()->isValid()) || !(im2->recHit()->isValid()) ||
783  !im1->recHit()->hit()->sharesInput(im2->recHit()->hit(), TrackingRecHit::some) ) {
785  unequal = true;
786  break;
787  }
788  --im1;
789  --im2;
790  }
791  if ( im1==firstMeasurements.rend() || im2==secondMeasurements.rend() ||
792  im1->layer()==layerPtr || im2->layer()==layerPtr || unequal ) continue;
793 
794  if ( !firstValid ) {
795  firstTraj->invalidate();
796  break;
797  }
798  else {
799  secondTraj->invalidate(); // V.I. why break?
800  break;
801  }
802  } // second
803  } // first
804 /*
805  for (TempTrajectoryContainer::const_iterator it = theTrajectories.begin();
806  it != theTrajectories.end(); it++) {
807  if(it->isValid()) result.push_back( *it);
808  }
809 
810  return result;
811 */
812  theTrajectories.erase(std::remove_if( theTrajectories.begin(),theTrajectories.end(),
813  std::not1(std::mem_fun_ref(&TempTrajectory::isValid))),
814  // boost::bind(&TempTrajectory::isValid,_1)),
815  theTrajectories.end());
816 }
const_iterator rend() const
Definition: bqueue.h:164
string fill
Definition: lumiContext.py:319
std::vector< LayerSetAndLayers > layers(const SeedingLayerSetsHits &sets)
Definition: LayerTriplets.cc:4
const_iterator rbegin() const
Definition: bqueue.h:163
bool isValid() const
bool tkxor(bool a, bool b) const
void GroupedCkfTrajectoryBuilder::groupedLimitedCandidates ( const TrajectorySeed seed,
TempTrajectory const &  startingTraj,
const TrajectoryFilter regionalCondition,
const Propagator propagator,
bool  inOut,
TempTrajectoryContainer result 
) const
private

Definition at line 336 of file GroupedCkfTrajectoryBuilder.cc.

References advanceOneLayer(), objects.IsoTrackAnalyzer::candidates, IntermediateTrajectoryCleaner::clean(), PrintoutHelper::dumpCandidates(), groupedIntermediaryClean(), LogDebug, python.multivaluedict::sort(), theFoundHitBonus, theIntermediateCleaning, theLostHitPenalty, and theMaxCand.

Referenced by buildTrajectories(), and rebuildSeedingRegion().

342 {
343  unsigned int nIter=1;
345  TempTrajectoryContainer newCand;
346  candidates.push_back( startingTraj);
347 
348  while ( !candidates.empty()) {
349 
350  newCand.clear();
351  for (TempTrajectoryContainer::iterator traj=candidates.begin();
352  traj!=candidates.end(); traj++) {
353  if ( !advanceOneLayer(seed, *traj, regionalCondition, propagator, inOut, newCand, result) ) {
354  LogDebug("CkfPattern")<< "GCTB: terminating after advanceOneLayer==false";
355  continue;
356  }
357 
358  LogDebug("CkfPattern")<<"newCand(1): after advanced one layer:\n"<<PrintoutHelper::dumpCandidates(newCand);
359 
360  if ((int)newCand.size() > theMaxCand) {
361  //ShowCand()(newCand);
362 
363  sort( newCand.begin(), newCand.end(), GroupedTrajCandLess(theLostHitPenalty,theFoundHitBonus));
364  newCand.erase( newCand.begin()+theMaxCand, newCand.end());
365  }
366  LogDebug("CkfPattern")<<"newCand(2): after removing extra candidates.\n"<<PrintoutHelper::dumpCandidates(newCand);
367  }
368 
369  LogDebug("CkfPattern") << "newCand.size() at end = " << newCand.size();
370 /*
371  if (theIntermediateCleaning) {
372  candidates.clear();
373  candidates = groupedIntermediaryClean(newCand);
374  } else {
375  candidates.swap(newCand);
376  }
377 */
379 #ifdef STANDARD_INTERMEDIARYCLEAN
381 #else
382  groupedIntermediaryClean(newCand);
383 #endif
384 
385  }
386  candidates.swap(newCand);
387 
388  LogDebug("CkfPattern") <<"candidates(3): "<<result.size()<<" candidates after "<<nIter++<<" groupedCKF iteration: \n"
390  <<"\n "<<candidates.size()<<" running candidates are: \n"
391  <<PrintoutHelper::dumpCandidates(candidates);
392  }
393 }
#define LogDebug(id)
static std::string dumpCandidates(collection &candidates)
static void clean(TempTrajectoryContainer &tracks)
void groupedIntermediaryClean(TempTrajectoryContainer &theTrajectories) const
intermediate cleaning in the case of grouped measurements
tuple result
Definition: query.py:137
bool advanceOneLayer(const TrajectorySeed &seed, TempTrajectory &traj, const TrajectoryFilter *regionalCondition, const Propagator *propagator, bool inOut, TempTrajectoryContainer &newCand, TempTrajectoryContainer &result) const
std::vector< TempTrajectory > TempTrajectoryContainer
float GroupedCkfTrajectoryBuilder::lostHitPenalty ( )
inline

Chi**2 Penalty for each lost hit.

Definition at line 84 of file GroupedCkfTrajectoryBuilder.h.

double GroupedCkfTrajectoryBuilder::mass ( )
inline

Mass hypothesis used for propagation.

Definition at line 93 of file GroupedCkfTrajectoryBuilder.h.

Referenced by Particle.Particle::__str__(), and DiObject.DiMuon::__str__().

int GroupedCkfTrajectoryBuilder::maxCand ( )
inline

Maximum number of trajectory candidates to propagate to the next layer.

Definition at line 80 of file GroupedCkfTrajectoryBuilder.h.

static PropagationDirection GroupedCkfTrajectoryBuilder::oppositeDirection ( PropagationDirection  dir)
inlinestaticprivate

change of propagation direction

Definition at line 158 of file GroupedCkfTrajectoryBuilder.h.

References alongMomentum, dir, and oppositeToMomentum.

Referenced by backwardFit().

158  {
159  if ( dir==alongMomentum ) return oppositeToMomentum;
160  if ( dir==oppositeToMomentum ) return alongMomentum;
161  return dir;
162  }
dbl *** dir
Definition: mlp_gen.cc:35
double GroupedCkfTrajectoryBuilder::ptCut ( )
inline

Pt cut.

Tells whether an intermediary cleaning stage should take place during TB.

Definition at line 90 of file GroupedCkfTrajectoryBuilder.h.

void GroupedCkfTrajectoryBuilder::rebuildSeedingRegion ( const TrajectorySeed seed,
TrajectoryContainer result 
) const
virtual

trajectories re-building in the seeding region. It looks for additional measurements in the seeding region of the intial trajectories. Only valid trajectories are returned. Invalid ones are dropped from the input collection.

Reimplemented from TrajectoryBuilder.

Definition at line 209 of file GroupedCkfTrajectoryBuilder.cc.

References BaseCkfTrajectoryBuilder::createStartingTrajectory(), and rebuildTrajectories().

Referenced by rebuildSeedingRegion(), and rebuildTrajectories().

210  {
211  TempTrajectory const & startingTraj = createStartingTrajectory( seed);
212  rebuildTrajectories(startingTraj,seed,result);
213 
214 }
void rebuildTrajectories(TempTrajectory const &startingTraj, const TrajectorySeed &, TrajectoryContainer &result) const
tuple result
Definition: query.py:137
TempTrajectory createStartingTrajectory(const TrajectorySeed &seed) const
void GroupedCkfTrajectoryBuilder::rebuildSeedingRegion ( const TrajectorySeed seed,
TempTrajectory const &  startingTraj,
TempTrajectoryContainer result 
) const
private

try to find additional hits in seeding region

Definition at line 820 of file GroupedCkfTrajectoryBuilder.cc.

References backwardFit(), BaseCkfTrajectoryBuilder::backwardPropagator(), estimator(), BaseCkfTrajectoryBuilder::hitBuilder(), TempTrajectory::isValid(), LogDebug, TempTrajectory::measurements(), eostools::move(), rebuildSeedingRegion(), TrajectorySeed::recHits(), cmsutils::bqueue< T >::size(), theKeepOriginalIfRebuildFails, unlikely, and updator().

823 {
824  //
825  // Rebuilding of trajectories. Candidates are taken from result,
826  // which will be replaced with the solutions after rebuild
827  // (assume vector::swap is more efficient than building new container)
828  //
829  LogDebug("CkfPattern")<< "Starting to rebuild " << result.size() << " tracks";
830  //
831  // Fitter (need to create it here since the propagation direction
832  // might change between different starting trajectories)
833  //
834  auto hitCloner = static_cast<TkTransientTrackingRecHitBuilder const *>(hitBuilder())->cloner();
835  KFTrajectoryFitter fitter(backwardPropagator(seed),&updator(),&estimator(),3,nullptr,&hitCloner);
836  //
837  TrajectorySeed::range rseedHits = seed.recHits();
838  std::vector<const TrackingRecHit*> seedHits;
839  //seedHits.insert(seedHits.end(), rseedHits.first, rseedHits.second);
840  //for (TrajectorySeed::recHitContainer::const_iterator iter = rseedHits.first; iter != rseedHits.second; iter++){
841  // seedHits.push_back(&*iter);
842  //}
843 
844  //unsigned int nSeed(seedHits.size());
845  unsigned int nSeed(rseedHits.second-rseedHits.first);
846  //seedHits.reserve(nSeed);
847  TempTrajectoryContainer rebuiltTrajectories;
848 
849  for ( TempTrajectoryContainer::iterator it=result.begin();
850  it!=result.end(); it++ ) {
851  //
852  // skip candidates which are not exceeding the seed size
853  // (e.g. because no Tracker layers outside seeding region)
854  //
855 
856  if ( it->measurements().size()<=startingTraj.measurements().size() ) {
857  rebuiltTrajectories.push_back(std::move(*it));
858  LogDebug("CkfPattern")<< "RebuildSeedingRegion skipped as in-out trajectory does not exceed seed size.";
859  continue;
860  }
861  //
862  // Refit - keep existing trajectory in case fit is not possible
863  // or fails
864  //
865 
866  auto && reFitted = backwardFit(*it,nSeed,fitter,seedHits);
867  if unlikely( !reFitted.isValid() ) {
868  rebuiltTrajectories.push_back(std::move(*it));
869  LogDebug("CkfPattern")<< "RebuildSeedingRegion skipped as backward fit failed";
870  // << "after reFitted.size() " << reFitted.size();
871  continue;
872  }
873  //LogDebug("CkfPattern")<<"after reFitted.size() " << reFitted.size();
874  //
875  // Rebuild seeding part. In case it fails: keep initial trajectory
876  // (better to drop it??)
877  //
878  int nRebuilt =
879  rebuildSeedingRegion (seed, seedHits,reFitted,rebuiltTrajectories);
880 
881  if ( nRebuilt==0 && !theKeepOriginalIfRebuildFails ) it->invalidate(); // won't use original in-out track
882 
883  if ( nRebuilt<0 ) rebuiltTrajectories.push_back(std::move(*it));
884 
885  }
886  //
887  // Replace input trajectories with new ones
888  //
889  result.swap(rebuiltTrajectories);
890  result.erase(std::remove_if( result.begin(),result.end(),
891  std::not1(std::mem_fun_ref(&TempTrajectory::isValid))),
892  result.end());
893 }
#define LogDebug(id)
#define unlikely(x)
const TransientTrackingRecHitBuilder * hitBuilder() const
tuple result
Definition: query.py:137
def move
Definition: eostools.py:510
const Chi2MeasurementEstimatorBase & estimator() const
std::pair< const_iterator, const_iterator > range
TempTrajectory backwardFit(TempTrajectory &candidate, unsigned int nSeed, const TrajectoryFitter &fitter, std::vector< const TrackingRecHit * > &remainingHits) const
void rebuildSeedingRegion(const TrajectorySeed &, TrajectoryContainer &result) const
bool isValid() const
std::vector< TempTrajectory > TempTrajectoryContainer
range recHits() const
const TrajectoryStateUpdator & updator() const
const Propagator * backwardPropagator(const TrajectorySeed &seed) const
int GroupedCkfTrajectoryBuilder::rebuildSeedingRegion ( const TrajectorySeed seed,
const std::vector< const TrackingRecHit * > &  seedHits,
TempTrajectory candidate,
TempTrajectoryContainer result 
) const
private

Definition at line 896 of file GroupedCkfTrajectoryBuilder.cc.

References BaseCkfTrajectoryBuilder::backwardPropagator(), gather_cfg::cout, TrajectorySeed::direction(), TempTrajectory::direction(), PrintoutHelper::dumpCandidates(), PrintoutHelper::dumpMeasurements(), groupedLimitedCandidates(), LogDebug, TempTrajectory::measurements(), TempTrajectory::push(), TempTrajectory::setNLoops(), cmsutils::bqueue< T >::size(), theRequireSeedHitsInRebuild, and verifyHits().

900 {
901  //
902  // Starting from track found by in-out tracking phase, extrapolate it inwards through
903  // the seeding region if possible in towards smaller Tracker radii, searching for additional
904  // hits.
905  // The resulting trajectories are returned in result,
906  // the count is the return value.
907  //
908  TempTrajectoryContainer rebuiltTrajectories;
909 #ifdef DBG2_GCTB
910 /* const LayerFinderByDet layerFinder;
911  if ( !seedHits.empty() && seedHits.front().isValid() ) {
912  DetLayer* seedLayer = layerFinder(seedHits.front().det());
913  cout << "Seed hit at " << seedHits.front().globalPosition()
914  << " " << seedLayer << endl;
915  cout << "Started from "
916  << candidate.lastMeasurement().updatedState().globalPosition().perp() << " "
917  << candidate.lastMeasurement().updatedState().globalPosition().z() << endl;
918  pair<bool,TrajectoryStateOnSurface> layerComp(false,TrajectoryStateOnSurface());
919  if ( seedLayer ) layerComp =
920  seedLayer->compatible(candidate.lastMeasurement().updatedState(),
921  propagator(),estimator());
922  pair<bool,TrajectoryStateOnSurface> detComp =
923  seedHits.front().det().compatible(candidate.lastMeasurement().updatedState(),
924  propagator(),estimator());
925  cout << " layer compatibility = " << layerComp.first;
926  cout << " det compatibility = " << detComp.first;
927  if ( detComp.first ) {
928  cout << " estimate = "
929  << estimator().estimate(detComp.second,seedHits.front()).second ;
930  }
931  cout << endl;
932  }*/
933  cout << "Before backward building: #measurements = "
934  << candidate.measurements().size() ; //<< endl;;
935 #endif
936  //
937  // Use standard building with standard cuts. Maybe better to use different
938  // cuts from "forward" building (e.g. no check on nr. of invalid hits)?
939  //
940  const bool inOut = false;
941  groupedLimitedCandidates(seed, candidate, nullptr, backwardPropagator(seed), inOut, rebuiltTrajectories);
942 
943  LogDebug("CkfPattern")<<" After backward building: "<<PrintoutHelper::dumpCandidates(rebuiltTrajectories);
944 
945  //
946  // Check & count resulting candidates
947  //
948  int nrOfTrajectories(0);
949  bool orig_ok = false;
950  //const RecHitEqualByChannels recHitEqual(false,false);
951  //vector<TM> oldMeasurements(candidate.measurements());
952  for ( TempTrajectoryContainer::iterator it=rebuiltTrajectories.begin();
953  it!=rebuiltTrajectories.end(); it++ ) {
954 
955  TempTrajectory::DataContainer newMeasurements(it->measurements());
956  //
957  // Verify presence of seeding hits?
958  //
960  orig_ok = true;
961  // no hits found (and possibly some invalid hits discarded): drop track
962  if ( newMeasurements.size()<=candidate.measurements().size() ){
963  LogDebug("CkfPattern") << "newMeasurements.size()<=candidate.measurements().size()";
964  continue;
965  }
966  // verify presence of hits
967  //GIO//if ( !verifyHits(newMeasurements.begin()+candidate.measurements().size(),
968  //GIO// newMeasurements.end(),seedHits) ){
969  if ( !verifyHits(newMeasurements.rbegin(),
970  newMeasurements.size() - candidate.measurements().size(),
971  seedHits) ){
972  LogDebug("CkfPattern")<< "seed hits not found in rebuild";
973  continue;
974  }
975  }
976  //
977  // construct final trajectory in the right order
978  //
979  // save & count result
980  nrOfTrajectories++;
981  result.emplace_back(seed.direction());
982  TempTrajectory & reversedTrajectory = result.back();
983  reversedTrajectory.setNLoops(it->nLoops());
984  for (TempTrajectory::DataContainer::const_iterator im=newMeasurements.rbegin(), ed = newMeasurements.rend();
985  im != ed; --im ) {
986  reversedTrajectory.push(*im);
987  }
988 
989  LogDebug("CkgPattern")<<"New traj direction = " << reversedTrajectory.direction()<<"\n"
990  <<PrintoutHelper::dumpMeasurements(reversedTrajectory.measurements());
991  } // rebuiltTrajectories
992 
993  // If nrOfTrajectories = 0 and orig_ok = true, this means that a track was actually found on the
994  // out-in step (meeting those requirements) but did not have the seed hits in it.
995  // In this case when we return we will go ahead and use the original in-out track.
996 
997  // If nrOfTrajectories = 0 and orig_ok = false, this means that the out-in step failed to
998  // find any track. Two cases are a technical failure in fitting the original seed hits or
999  // because the track did not meet the out-in criteria (which may be stronger than the out-in
1000  // criteria). In this case we will NOT allow the original in-out track to be used.
1001 
1002  if ( (nrOfTrajectories == 0) && orig_ok ) {
1003  nrOfTrajectories = -1;
1004  }
1005  return nrOfTrajectories;
1006 }
#define LogDebug(id)
PropagationDirection direction() const
static std::string dumpCandidates(collection &candidates)
const DataContainer & measurements() const
void setNLoops(signed char value)
static std::string dumpMeasurements(const std::vector< TrajectoryMeasurement > &v)
PropagationDirection direction() const
bool verifyHits(TempTrajectory::DataContainer::const_iterator rbegin, size_t maxDepth, const std::vector< const TrackingRecHit * > &hits) const
Verifies presence of a RecHits in a range of TrajectoryMeasurements.
tuple result
Definition: query.py:137
void groupedLimitedCandidates(const TrajectorySeed &seed, TempTrajectory const &startingTraj, const TrajectoryFilter *regionalCondition, const Propagator *propagator, bool inOut, TempTrajectoryContainer &result) const
std::vector< TempTrajectory > TempTrajectoryContainer
const Propagator * backwardPropagator(const TrajectorySeed &seed) const
tuple cout
Definition: gather_cfg.py:121
size_type size() const
Definition: bqueue.h:167
void push(const TrajectoryMeasurement &tm)
void GroupedCkfTrajectoryBuilder::rebuildTrajectories ( TempTrajectory const &  startingTraj,
const TrajectorySeed seed,
TrajectoryContainer result 
) const
virtual

Reimplemented from BaseCkfTrajectoryBuilder.

Definition at line 217 of file GroupedCkfTrajectoryBuilder.cc.

References eostools::move(), rebuildSeedingRegion(), and edmIntegrityCheck::work().

Referenced by rebuildSeedingRegion().

218  {
220 
221  TrajectoryContainer final;
222 
223  work.reserve(result.size());
224  for (TrajectoryContainer::iterator traj=result.begin();
225  traj!=result.end(); ++traj) {
226  if(traj->isValid()) work.push_back(TempTrajectory(std::move(*traj)));
227  }
228 
229  rebuildSeedingRegion(seed,startingTraj,work);
230  final.reserve(work.size());
231 
232  // better the seed to be always the same...
233  boost::shared_ptr<const TrajectorySeed> sharedSeed;
234  if (result.empty())
235  sharedSeed.reset(new TrajectorySeed(seed));
236  else sharedSeed = result.front().sharedSeed();
237 
238 
239  for (TempTrajectoryContainer::iterator traj=work.begin();
240  traj!=work.end(); ++traj) {
241  final.push_back(traj->toTrajectory()); final.back().setSharedSeed(sharedSeed);
242  }
243 
244  result.swap(final);
245 
246  statCount.rebuilt(result.size());
247 
248 }
tuple result
Definition: query.py:137
def move
Definition: eostools.py:510
void rebuildSeedingRegion(const TrajectorySeed &, TrajectoryContainer &result) const
std::vector< TempTrajectory > TempTrajectoryContainer
std::vector< Trajectory > TrajectoryContainer
void GroupedCkfTrajectoryBuilder::setEvent_ ( const edm::Event iEvent,
const edm::EventSetup iSetup 
)
overrideprotectedvirtual

Implements BaseCkfTrajectoryBuilder.

Definition at line 170 of file GroupedCkfTrajectoryBuilder.cc.

170  {
171 }
bool GroupedCkfTrajectoryBuilder::tkxor ( bool  a,
bool  b 
) const
inlineprivate

Definition at line 112 of file GroupedCkfTrajectoryBuilder.h.

References a, and b.

Referenced by groupedIntermediaryClean().

112 {return (a||b) && !(a&&b);}
double b
Definition: hdecay.h:120
double a
Definition: hdecay.h:121
GroupedCkfTrajectoryBuilder::TrajectoryContainer GroupedCkfTrajectoryBuilder::trajectories ( const TrajectorySeed seed) const
virtual

set Event for the internal MeasurementTracker data member

trajectories building starting from a seed

Implements TrajectoryBuilder.

Definition at line 174 of file GroupedCkfTrajectoryBuilder.cc.

References buildTrajectories(), and run_regression::ret.

175 {
177  ret.reserve(10);
178  buildTrajectories(seed, ret, 0);
179  return ret;
180 }
TempTrajectory buildTrajectories(const TrajectorySeed &seed, TrajectoryContainer &ret, const TrajectoryFilter *) const
common part of both public trajectory building methods
std::vector< Trajectory > TrajectoryContainer
void GroupedCkfTrajectoryBuilder::trajectories ( const TrajectorySeed seed,
GroupedCkfTrajectoryBuilder::TrajectoryContainer ret 
) const
virtual

trajectories building starting from a seed, return in an already allocated vector

Reimplemented from TrajectoryBuilder.

Definition at line 194 of file GroupedCkfTrajectoryBuilder.cc.

References buildTrajectories().

195 {
196  buildTrajectories(seed,ret,0);
197 }
TempTrajectory buildTrajectories(const TrajectorySeed &seed, TrajectoryContainer &ret, const TrajectoryFilter *) const
common part of both public trajectory building methods
GroupedCkfTrajectoryBuilder::TrajectoryContainer GroupedCkfTrajectoryBuilder::trajectories ( const TrajectorySeed seed,
const TrackingRegion region 
) const

trajectories building starting from a seed with a region

Definition at line 183 of file GroupedCkfTrajectoryBuilder.cc.

References buildTrajectories(), and run_regression::ret.

185 {
187  ret.reserve(10);
188  RegionalTrajectoryFilter regionalCondition(region);
189  buildTrajectories(seed, ret, &regionalCondition);
190  return ret;
191 }
TempTrajectory buildTrajectories(const TrajectorySeed &seed, TrajectoryContainer &ret, const TrajectoryFilter *) const
common part of both public trajectory building methods
std::vector< Trajectory > TrajectoryContainer
void GroupedCkfTrajectoryBuilder::trajectories ( const TrajectorySeed seed,
GroupedCkfTrajectoryBuilder::TrajectoryContainer ret,
const TrackingRegion region 
) const

trajectories building starting from a seed with a region

Definition at line 200 of file GroupedCkfTrajectoryBuilder.cc.

References buildTrajectories().

203 {
204  RegionalTrajectoryFilter regionalCondition(region);
205  buildTrajectories(seed,ret,&regionalCondition);
206 }
TempTrajectory buildTrajectories(const TrajectorySeed &seed, TrajectoryContainer &ret, const TrajectoryFilter *) const
common part of both public trajectory building methods
const TrajectoryStateUpdator& GroupedCkfTrajectoryBuilder::updator ( ) const
inline

Definition at line 71 of file GroupedCkfTrajectoryBuilder.h.

References BaseCkfTrajectoryBuilder::theUpdator.

Referenced by rebuildSeedingRegion().

71 {return *theUpdator;}
const TrajectoryStateUpdator * theUpdator
bool GroupedCkfTrajectoryBuilder::verifyHits ( TempTrajectory::DataContainer::const_iterator  rbegin,
size_t  maxDepth,
const std::vector< const TrackingRecHit * > &  hits 
) const
private

Verifies presence of a RecHits in a range of TrajectoryMeasurements.

Definition at line 1136 of file GroupedCkfTrajectoryBuilder.cc.

References LogDebug, HLT_25ns14e33_v1_cff::maxDepth, and TrackingRecHit::some.

Referenced by rebuildSeedingRegion().

1139 {
1140  //
1141  // verify presence of the seeding hits
1142  //
1143  LogDebug("CkfPattern")<<"Checking for " << hits.size() << " hits in "
1144  << maxDepth << " measurements" << endl;
1145 
1146  auto rend = rbegin;
1147  while (maxDepth > 0) { --maxDepth; --rend; }
1148  for ( auto ir=hits.begin(); ir!=hits.end(); ir++ ) {
1149  // assume that all seeding hits are valid!
1150  bool foundHit(false);
1151  for ( auto im=rbegin; im!=rend; --im ) {
1152  if ( im->recHit()->isValid() && (*ir)->sharesInput(im->recHit()->hit(), TrackingRecHit::some) ) {
1153  foundHit = true;
1154  break;
1155  }
1156  }
1157  if ( !foundHit ) return false;
1158  }
1159  return true;
1160 }
#define LogDebug(id)

Member Data Documentation

float GroupedCkfTrajectoryBuilder::maxDPhiForLooperReconstruction
private

Definition at line 204 of file GroupedCkfTrajectoryBuilder.h.

Referenced by advanceOneLayer(), and GroupedCkfTrajectoryBuilder().

float GroupedCkfTrajectoryBuilder::maxPt2ForLooperReconstruction
private

If the value is greater than zero, the reconstructions for looper is turned on for candidates with pt greater than maxPtForLooperReconstruction

Definition at line 202 of file GroupedCkfTrajectoryBuilder.h.

Referenced by advanceOneLayer(), and GroupedCkfTrajectoryBuilder().

bool GroupedCkfTrajectoryBuilder::theAlwaysUseInvalid
private

Definition at line 185 of file GroupedCkfTrajectoryBuilder.h.

Referenced by advanceOneLayer(), and GroupedCkfTrajectoryBuilder().

bool GroupedCkfTrajectoryBuilder::theBestHitOnly
private

Use only best hit / group when building segments

Definition at line 188 of file GroupedCkfTrajectoryBuilder.h.

Referenced by advanceOneLayer(), and GroupedCkfTrajectoryBuilder().

double GroupedCkfTrajectoryBuilder::theChiSquareCut
private

Chi**2 Cut on the new Trajectory Measurements to consider

Definition at line 171 of file GroupedCkfTrajectoryBuilder.h.

TrajectoryFilter* GroupedCkfTrajectoryBuilder::theConfigurableCondition
private

Definition at line 166 of file GroupedCkfTrajectoryBuilder.h.

float GroupedCkfTrajectoryBuilder::theFoundHitBonus
private
            Chi**2 bonus for each found hit (favours candidates with

more measurements)

Definition at line 180 of file GroupedCkfTrajectoryBuilder.h.

Referenced by GroupedCkfTrajectoryBuilder(), and groupedLimitedCandidates().

bool GroupedCkfTrajectoryBuilder::theIntermediateCleaning
private

Tells whether an intermediary cleaning stage should take place during TB.

Definition at line 182 of file GroupedCkfTrajectoryBuilder.h.

Referenced by GroupedCkfTrajectoryBuilder(), and groupedLimitedCandidates().

bool GroupedCkfTrajectoryBuilder::theKeepOriginalIfRebuildFails
private

Keep original trajectory if rebuilding fails.

Definition at line 197 of file GroupedCkfTrajectoryBuilder.h.

Referenced by GroupedCkfTrajectoryBuilder(), and rebuildSeedingRegion().

bool GroupedCkfTrajectoryBuilder::theLockHits
private

Lock hits when building segments in a layer

Definition at line 187 of file GroupedCkfTrajectoryBuilder.h.

Referenced by advanceOneLayer(), and GroupedCkfTrajectoryBuilder().

float GroupedCkfTrajectoryBuilder::theLostHitPenalty
private

Chi**2 Penalty for each lost hit.

Definition at line 179 of file GroupedCkfTrajectoryBuilder.h.

Referenced by GroupedCkfTrajectoryBuilder(), and groupedLimitedCandidates().

double GroupedCkfTrajectoryBuilder::theMass
private

Mass hypothesis used for propagation

Definition at line 175 of file GroupedCkfTrajectoryBuilder.h.

int GroupedCkfTrajectoryBuilder::theMaxCand
private
    Maximum number of trajectory candidates 

to propagate to the next layer.

Definition at line 177 of file GroupedCkfTrajectoryBuilder.h.

Referenced by advanceOneLayer(), GroupedCkfTrajectoryBuilder(), and groupedLimitedCandidates().

unsigned int GroupedCkfTrajectoryBuilder::theMinNrOf2dHitsForRebuild
private

Minimum nr. of non-seed 2D hits required for rebuild.

Definition at line 195 of file GroupedCkfTrajectoryBuilder.h.

Referenced by GroupedCkfTrajectoryBuilder().

unsigned int GroupedCkfTrajectoryBuilder::theMinNrOfHitsForRebuild
private

Minimum nr. of non-seed hits required for rebuild. If ==0 the seeding part will remain untouched.

Definition at line 192 of file GroupedCkfTrajectoryBuilder.h.

Referenced by backwardFit(), and GroupedCkfTrajectoryBuilder().

double GroupedCkfTrajectoryBuilder::theptCut
private

ptCut

Definition at line 173 of file GroupedCkfTrajectoryBuilder.h.

bool GroupedCkfTrajectoryBuilder::theRequireSeedHitsInRebuild
private

Only accept rebuilt trajectories if they contain the seed hits.

Definition at line 190 of file GroupedCkfTrajectoryBuilder.h.

Referenced by GroupedCkfTrajectoryBuilder(), and rebuildSeedingRegion().