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 | Private Attributes
GroupedCkfTrajectoryBuilder Class Reference

#include <GroupedCkfTrajectoryBuilder.h>

Inheritance diagram for GroupedCkfTrajectoryBuilder:
BaseCkfTrajectoryBuilder TrajectoryBuilder

Public Member Functions

double chiSquareCut ()
 
const
Chi2MeasurementEstimatorBase
estimator () const
 
 GroupedCkfTrajectoryBuilder (const edm::ParameterSet &conf, const TrajectoryStateUpdator *updator, const Propagator *propagatorAlong, const Propagator *propagatorOpposite, const Chi2MeasurementEstimatorBase *estimator, const TransientTrackingRecHitBuilder *RecHitBuilder, const MeasurementTracker *measurementTracker, const TrajectoryFilter *filter, const TrajectoryFilter *inOutFilter)
 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
 
virtual void setEvent (const edm::Event &event) const
 set Event for the internal MeasurementTracker data member More...
 
TrajectoryContainer trajectories (const TrajectorySeed &) const
 trajectories building starting from a seed 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, const TrajectoryStateUpdator *updator, const Propagator *propagatorAlong, const Propagator *propagatorOpposite, const Chi2MeasurementEstimatorBase *estimator, const TransientTrackingRecHitBuilder *RecHitBuilder, const MeasurementTracker *measurementTracker, const TrajectoryFilter *filter, const TrajectoryFilter *inOutFilter=0)
 
virtual void setDebugger (CkfDebugger *dbg) 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
 
- Protected Member Functions inherited from BaseCkfTrajectoryBuilder
void addToResult (TempTrajectory &traj, TrajectoryContainer &result, bool inOut=false) const
 
void addToResult (TempTrajectory &traj, TempTrajectoryContainer &result, bool inOut=false) const
 
virtual bool analyzeMeasurementsDebugger (Trajectory &traj, std::vector< TrajectoryMeasurement > meas, const MeasurementTracker *theMeasurementTracker, const Propagator *theForwardPropagator, const Chi2MeasurementEstimatorBase *theEstimator, const TransientTrackingRecHitBuilder *theTTRHBuilder) const
 
virtual bool analyzeMeasurementsDebugger (TempTrajectory &traj, std::vector< TrajectoryMeasurement > meas, const MeasurementTracker *theMeasurementTracker, const Propagator *theForwardPropagator, const Chi2MeasurementEstimatorBase *theEstimator, const TransientTrackingRecHitBuilder *theTTRHBuilder) const
 
TempTrajectory createStartingTrajectory (const TrajectorySeed &seed) const
 
virtual void fillSeedHistoDebugger (std::vector< TrajectoryMeasurement >::iterator begin, std::vector< TrajectoryMeasurement >::iterator end) const
 
StateAndLayers findStateAndLayers (const TempTrajectory &traj) const
 
bool qualityFilter (const TempTrajectory &traj, bool inOut=false) const
 
bool toBeContinued (TempTrajectory &traj, bool inOut=false) const
 

Private Types

enum  work_MaxSize_Size_ { work_MaxSize_ = 50 }
 

Private Member Functions

bool advanceOneLayer (TempTrajectory &traj, const TrajectoryFilter *regionalCondition, const Propagator *propagator, bool inOut, TempTrajectoryContainer &newCand, TempTrajectoryContainer &result) const
 
void backwardFit (TempTrajectory &candidate, unsigned int nSeed, const TrajectoryFitter &fitter, TempTrajectoryContainer &fittedTracks, std::vector< const TrackingRecHit * > &remainingHits) const
 
void buildTrajectories (const TrajectorySeed &, TrajectoryContainer &ret, const TrajectoryFilter *) const
 common part of both public trajectory building methods More...
 
 GroupedCkfTrajectoryBuilder (const GroupedCkfTrajectoryBuilder &)
 no copy constructor More...
 
void groupedIntermediaryClean (TempTrajectoryContainer &theTrajectories) const
 intermediate cleaning in the case of grouped measurements More...
 
void groupedLimitedCandidates (TempTrajectory &startingTraj, const TrajectoryFilter *regionalCondition, const Propagator *propagator, bool inOut, TempTrajectoryContainer &result) const
 
void layers (const TempTrajectory::DataContainer &measurements, std::vector< const DetLayer * > &fillme) const
 
GroupedCkfTrajectoryBuilderoperator= (const GroupedCkfTrajectoryBuilder &)
 no assignment operator More...
 
PropagationDirection oppositeDirection (PropagationDirection dir) const
 change of propagation direction More...
 
void rebuildSeedingRegion (TempTrajectory &startingTraj, TempTrajectoryContainer &result) const
 try to find additional hits in seeding region More...
 
int rebuildSeedingRegion (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...
 

Private Attributes

bool theAlwaysUseInvalid
 
bool theBestHitOnly
 
double theChiSquareCut
 
TrajectoryFiltertheConfigurableCondition
 
float theFoundHitBonus
 
bool theIntermediateCleaning
 
bool theLockHits
 
float theLostHitPenalty
 
double theMass
 
int theMaxCand
 
unsigned int theMinNrOf2dHitsForRebuild
 
unsigned int theMinNrOfHitsForRebuild
 
double theptCut
 
bool theRequireSeedHitsInRebuild
 
TempTrajectoryContainer work_
 

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 FreeTrajectoryState FTS
 
typedef std::pair< TSOS,
std::vector< const DetLayer * > > 
StateAndLayers
 
typedef TrajectoryMeasurement TM
 
typedef TrajectoryStateOnSurface TSOS
 
- Protected Attributes inherited from BaseCkfTrajectoryBuilder
const PropagatortheBackwardPropagator
 
const
Chi2MeasurementEstimatorBase
theEstimator
 
const PropagatortheForwardPropagator
 
const LayerMeasurementstheLayerMeasurements
 
const MeasurementTrackertheMeasurementTracker
 
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 23 of file GroupedCkfTrajectoryBuilder.h.

Member Enumeration Documentation

Enumerator
work_MaxSize_ 

Definition at line 199 of file GroupedCkfTrajectoryBuilder.h.

199 { 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,
const TrajectoryStateUpdator updator,
const Propagator propagatorAlong,
const Propagator propagatorOpposite,
const Chi2MeasurementEstimatorBase estimator,
const TransientTrackingRecHitBuilder RecHitBuilder,
const MeasurementTracker measurementTracker,
const TrajectoryFilter filter,
const TrajectoryFilter inOutFilter 
)

constructor from ParameterSet

Definition at line 61 of file GroupedCkfTrajectoryBuilder.cc.

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

69  :
70 
71 
73  updator, propagatorAlong,propagatorOpposite,
74  estimator, recHitBuilder, measurementTracker, filter, inOutFilter)
75 {
76  // fill data members from parameters (eventually data members could be dropped)
77  //
78  theMaxCand = conf.getParameter<int>("maxCand");
79 
80  theLostHitPenalty = conf.getParameter<double>("lostHitPenalty");
81  theFoundHitBonus = conf.getParameter<double>("foundHitBonus");
82  theIntermediateCleaning = conf.getParameter<bool>("intermediateCleaning");
83  theAlwaysUseInvalid = conf.getParameter<bool>("alwaysUseInvalidHits");
84  theLockHits = conf.getParameter<bool>("lockHits");
85  theBestHitOnly = conf.getParameter<bool>("bestHitOnly");
87  theRequireSeedHitsInRebuild = conf.getParameter<bool>("requireSeedHitsInRebuild");
88  theMinNrOfHitsForRebuild = max(0,conf.getParameter<int>("minNrOfHitsForRebuild"));
89 
90  /* ======= B.M. to be ported layer ===========
91  bool setOK = thePropagator->setMaxDirectionChange(1.6);
92  if (!setOK)
93  cout << "GroupedCkfTrajectoryBuilder WARNING: "
94  << "propagator does not support setMaxDirectionChange"
95  << endl;
96  // addStopCondition(theMinPtStopCondition);
97 
98  theConfigurableCondition = createAlgo<TrajectoryFilter>(componentConfig("StopCondition"));
99  ===================================== */
100 
101 }
T getParameter(std::string const &) const
BaseCkfTrajectoryBuilder(const edm::ParameterSet &conf, const TrajectoryStateUpdator *updator, const Propagator *propagatorAlong, const Propagator *propagatorOpposite, const Chi2MeasurementEstimatorBase *estimator, const TransientTrackingRecHitBuilder *RecHitBuilder, const MeasurementTracker *measurementTracker, const TrajectoryFilter *filter, const TrajectoryFilter *inOutFilter=0)
const T & max(const T &a, const T &b)
virtual GroupedCkfTrajectoryBuilder::~GroupedCkfTrajectoryBuilder ( )
inlinevirtual

destructor

Definition at line 38 of file GroupedCkfTrajectoryBuilder.h.

38 {}
GroupedCkfTrajectoryBuilder::GroupedCkfTrajectoryBuilder ( const GroupedCkfTrajectoryBuilder )
private

no copy constructor

Member Function Documentation

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

Definition at line 337 of file GroupedCkfTrajectoryBuilder.cc.

References BaseCkfTrajectoryBuilder::addToResult(), TransverseImpactPointExtrapolator::extrapolate(), BaseCkfTrajectoryBuilder::findStateAndLayers(), TempTrajectory::foundHits(), cmsutils::bqueue< T >::front(), TrajectoryStateOnSurface::isValid(), TempTrajectory::lastLayer(), LogDebug, TrackingRecHit::missing, TempTrajectory::push(), TrajectoryMeasurement::recHit(), TrajectorySegmentBuilder::segments(), cmsutils::bqueue< T >::size(), theAlwaysUseInvalid, theBestHitOnly, BaseCkfTrajectoryBuilder::theEstimator, BaseCkfTrajectoryBuilder::theForwardPropagator, BaseCkfTrajectoryBuilder::theLayerMeasurements, theLockHits, BaseCkfTrajectoryBuilder::theMeasurementTracker, BaseCkfTrajectoryBuilder::theUpdator, BaseCkfTrajectoryBuilder::toBeContinued(), whatIsTheNextStep(), and whatIsTheStateToUse().

Referenced by groupedLimitedCandidates().

343 {
344  std::pair<TSOS,std::vector<const DetLayer*> > stateAndLayers = findStateAndLayers(traj);
345  vector<const DetLayer*>::iterator layerBegin = stateAndLayers.second.begin();
346  vector<const DetLayer*>::iterator layerEnd = stateAndLayers.second.end();
347 
348  // if (nl.empty()) {
349  // addToResult(traj,result,inOut);
350  // return false;
351  // }
352 
353  LogDebug("CkfPattern")<<whatIsTheNextStep(traj, stateAndLayers);
354 
355  bool foundSegments(false);
356  bool foundNewCandidates(false);
357  for ( vector<const DetLayer*>::iterator il=layerBegin;
358  il!=layerEnd; il++) {
359 
360  TSOS stateToUse = stateAndLayers.first;
361  if ((*il)==traj.lastLayer())
362  {
363  LogDebug("CkfPattern")<<" self propagating in advanceOneLayer.\n from: \n"<<stateToUse;
364  //self navigation case
365  // go to a middle point first
367  GlobalPoint center(0,0,0);
368  stateToUse = middle.extrapolate(stateToUse, center, *theForwardPropagator);
369 
370  if (!stateToUse.isValid()) continue;
371  LogDebug("CkfPattern")<<"to: "<<stateToUse;
372  }
373 
376  **il,*propagator,
379 
380  LogDebug("CkfPattern")<<whatIsTheStateToUse(stateAndLayers.first,stateToUse,*il);
381 
382  TempTrajectoryContainer segments=
383  layerBuilder.segments(stateToUse);
384 
385  LogDebug("CkfPattern")<< "GCTB: number of segments = " << segments.size();
386 
387  if ( !segments.empty() ) foundSegments = true;
388 
389  for ( TempTrajectoryContainer::const_iterator is=segments.begin();
390  is!=segments.end(); is++ ) {
391  //
392  // assume "invalid hit only" segment is last in list
393  //
394  const TempTrajectory::DataContainer & measurements = is->measurements();
395  if ( !theAlwaysUseInvalid && is!=segments.begin() && measurements.size()==1 &&
396  (measurements.front().recHit()->getType() == TrackingRecHit::missing) ) break;
397  //
398  // create new candidate
399  //
400  TempTrajectory newTraj(traj);
401 
402  newTraj.push(*is);
403  //GIO// for ( vector<TM>::const_iterator im=measurements.begin();
404  //GIO// im!=measurements.end(); im++ ) newTraj.push(*im);
405  //if ( toBeContinued(newTraj,regionalCondition) ) { TOBE FIXED
406  if ( toBeContinued(newTraj, inOut) ) {
407  // Have added one more hit to track candidate
408 
409  LogDebug("CkfPattern")<<"GCTB: adding updated trajectory to candidates: inOut="<<inOut<<" hits="<<newTraj.foundHits();
410 
411  newCand.push_back(newTraj);
412  foundNewCandidates = true;
413  }
414  else {
415  // Have finished building this track. Check if it passes cuts.
416 
417  LogDebug("CkfPattern")<< "GCTB: adding completed trajectory to results if passes cuts: inOut="<<inOut<<" hits="<<newTraj.foundHits();
418 
419  addToResult(newTraj, result, inOut);
420  }
421  }
422  }
423 
424  if ( !foundSegments ){
425  LogDebug("CkfPattern")<< "GCTB: adding input trajectory to result";
426  addToResult(traj, result, inOut);
427  }
428  return foundNewCandidates;
429 }
#define LogDebug(id)
void addToResult(TempTrajectory &traj, TrajectoryContainer &result, bool inOut=false) const
const TrajectoryStateUpdator * theUpdator
ConstRecHitPointer recHit() const
std::string whatIsTheNextStep(TempTrajectory &traj, std::pair< TrajectoryStateOnSurface, std::vector< const DetLayer * > > &stateAndLayers)
const LayerMeasurements * theLayerMeasurements
tuple result
Definition: query.py:137
std::string whatIsTheStateToUse(TrajectoryStateOnSurface &initial, TrajectoryStateOnSurface &stateToUse, const DetLayer *l)
const MeasurementTracker * theMeasurementTracker
std::vector< TempTrajectory > TempTrajectoryContainer
TrajectoryStateOnSurface extrapolate(const FreeTrajectoryState &fts, const GlobalPoint &vtx) const
extrapolation with default (=geometrical) propagator
bool toBeContinued(TempTrajectory &traj, bool inOut=false) const
StateAndLayers findStateAndLayers(const TempTrajectory &traj) const
size_type size() const
Definition: bqueue.h:143
const DetLayer * lastLayer() const
Redundant method, returns the layer of lastMeasurement() .
const Chi2MeasurementEstimatorBase * theEstimator
const Propagator * theForwardPropagator
virtual void GroupedCkfTrajectoryBuilder::analyseMeasurements ( const std::vector< TM > &  meas,
const Trajectory traj 
) const
inlineprotectedvirtual

Definition at line 93 of file GroupedCkfTrajectoryBuilder.h.

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

Definition at line 95 of file GroupedCkfTrajectoryBuilder.h.

Referenced by buildTrajectories().

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

Definition at line 91 of file GroupedCkfTrajectoryBuilder.h.

Referenced by buildTrajectories().

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

Definition at line 752 of file GroupedCkfTrajectoryBuilder.cc.

References Trajectory::direction(), TempTrajectory::direction(), PrintoutHelper::dumpMeasurement(), PrintoutHelper::dumpMeasurements(), Trajectory::firstMeasurement(), TrajectoryFitter::fit(), TempTrajectory::foundHits(), TrackingRecHit::isValid(), LogDebug, max(), TempTrajectory::measurements(), ExpressReco_HICollisions_FallBack::nHitMin, oppositeDirection(), Trajectory::push(), Trajectory::recHits(), TrajectoryStateOnSurface::rescaleError(), Trajectory::seed(), TempTrajectory::seed(), cmsutils::bqueue< T >::size(), theMinNrOfHitsForRebuild, and TrajectoryMeasurement::updatedState().

Referenced by rebuildSeedingRegion().

756 {
757  //
758  // clear array of non-fitted hits
759  //
760  remainingHits.clear();
761  fittedTracks.clear();
762  //
763  // skip candidates which are not exceeding the seed size
764  // (e.g. Because no Tracker layers exist outside seeding region)
765  //
766  if ( candidate.measurements().size()<=nSeed ) {
767  fittedTracks.clear();
768  return;
769  }
770 
771  LogDebug("CkfPattern")<<"nSeed " << nSeed << endl
772  << "Old traj direction = " << candidate.direction() << endl
774 
775  //
776  // backward fit trajectory.
777  // (Will try to fit only hits outside the seeding region. However,
778  // if there are not enough of these, it will also use the seeding hits).
779  //
780  TempTrajectory::DataContainer oldMeasurements(candidate.measurements());
781 // int nOld(oldMeasurements.size());
782 // const unsigned int nHitAllMin(5);
783 // const unsigned int nHit2dMin(2);
784  unsigned int nHit(0); // number of valid hits after seeding region
785  //unsigned int nHit2d(0); // number of valid hits after seeding region with 2D info
786  // use all hits except the first n (from seed), but require minimum
787  // specified in configuration.
788  // Swapped over next two lines.
789  unsigned int nHitMin = max(candidate.foundHits()-nSeed,theMinNrOfHitsForRebuild);
790  // unsigned int nHitMin = oldMeasurements.size()-nSeed;
791  // we want to rebuild only if the number of VALID measurements excluding the seed measurements is higher than the cut
792  if (nHitMin<theMinNrOfHitsForRebuild){
793  fittedTracks.clear();
794  return;
795  }
796 
797  LogDebug("CkfPattern")/* << "nHitMin " << nHitMin*/ <<"Sizes: " << oldMeasurements.size() << " / ";
798  //
799  // create input trajectory for backward fit
800  //
801  Trajectory fwdTraj(candidate.seed(),oppositeDirection(candidate.direction()));
802  //const TrajectorySeed seed = TrajectorySeed(PTrajectoryStateOnDet(), TrajectorySeed::recHitContainer(), oppositeDirection(candidate.direction()));
803  //Trajectory fwdTraj(seed, oppositeDirection(candidate.direction()));
804  std::vector<const DetLayer*> bwdDetLayer;
805  for ( TempTrajectory::DataContainer::const_iterator im=oldMeasurements.rbegin();
806  im!=oldMeasurements.rend(); --im) {
807  const TrackingRecHit* hit = im->recHit()->hit();
808  //
809  // add hits until required number is reached
810  //
811  if ( nHit<nHitMin ){//|| nHit2d<theMinNrOf2dHitsForRebuild ) {
812  fwdTraj.push(*im);
813  bwdDetLayer.push_back(im->layer());
814  //
815  // count valid / 2D hits
816  //
817  if ( hit->isValid() ) {
818  nHit++;
819  //if ( hit.isMatched() ||
820  // hit.det().detUnits().front()->type().module()==pixel )
821  //nHit2d++;
822  }
823  }
824  //if (nHit==nHitMin) lastBwdDetLayer=im->layer();
825  //
826  // keep remaining (valid) hits for verification
827  //
828  else if ( hit->isValid() ) {
829  //std::cout << "Adding a remaining hit" << std::endl;
830  remainingHits.push_back(hit);
831  }
832  }
833  //
834  // Fit only if required number of valid hits can be used
835  //
836  if ( nHit<nHitMin ){ //|| nHit2d<theMinNrOf2dHitsForRebuild ) {
837  fittedTracks.clear();
838  return;
839  }
840  //
841  // Do the backward fit (important: start from scaled, not random cov. matrix!)
842  //
843  TrajectoryStateOnSurface firstTsos(fwdTraj.firstMeasurement().updatedState());
844  //cout << "firstTsos "<< firstTsos << endl;
845  firstTsos.rescaleError(10.);
846  //TrajectoryContainer bwdFitted(fitter.fit(fwdTraj.seed(),fwdTraj.recHits(),firstTsos));
847  TrajectoryContainer bwdFitted(fitter.fit(
849  fwdTraj.recHits(),firstTsos));
850  if (bwdFitted.size()){
851  LogDebug("CkfPattern")<<"Obtained " << bwdFitted.size() << " bwdFitted trajectories with measurement size " << bwdFitted.front().measurements().size();
852  TempTrajectory fitted(fwdTraj.seed(), fwdTraj.direction());
853  vector<TM> tmsbf = bwdFitted.front().measurements();
854  int iDetLayer=0;
855  //this is ugly but the TM in the fitted track do not contain the DetLayer.
856  //So we have to cache the detLayer pointers and replug them in.
857  //For the backward building it would be enaugh to cache the last DetLayer,
858  //but for the intermediary cleaning we need all
859  for ( vector<TM>::const_iterator im=tmsbf.begin();im!=tmsbf.end(); im++ ) {
860  fitted.push(TM( (*im).forwardPredictedState(),
861  (*im).backwardPredictedState(),
862  (*im).updatedState(),
863  (*im).recHit(),
864  (*im).estimate(),
865  bwdDetLayer[iDetLayer]));
866 
867  LogDebug("CkfPattern")<<PrintoutHelper::dumpMeasurement(*im);
868  iDetLayer++;
869  }
870 /*
871  TM lastMeas = bwdFitted.front().lastMeasurement();
872  fitted.pop();
873  fitted.push(TM(lastMeas.forwardPredictedState(),
874  lastMeas.backwardPredictedState(),
875  lastMeas.updatedState(),
876  lastMeas.recHit(),
877  lastMeas.estimate(),
878  lastBwdDetLayer));*/
879  fittedTracks.push_back(fitted);
880  }
881  //
882  // save result
883  //
884  //fittedTracks.swap(bwdFitted);
885  //cout << "Obtained " << fittedTracks.size() << " fittedTracks trajectories with measurement size " << fittedTracks.front().measurements().size() << endl;
886 }
#define LogDebug(id)
const TrajectorySeed & seed() const
Access to the seed used to reconstruct the Trajectory.
PropagationDirection oppositeDirection(PropagationDirection dir) const
change of propagation direction
const DataContainer & measurements() const
int foundHits() const
obsolete name, use measurements() instead.
static std::string dumpMeasurement(const TrajectoryMeasurement &tm)
static std::string dumpMeasurements(const std::vector< TrajectoryMeasurement > &v)
PropagationDirection direction() const
const T & max(const T &a, const T &b)
range recHits() const
bool isValid() const
virtual std::vector< Trajectory > fit(const Trajectory &) const =0
size_type size() const
Definition: bqueue.h:143
std::vector< Trajectory > TrajectoryContainer
void GroupedCkfTrajectoryBuilder::buildTrajectories ( const TrajectorySeed seed,
GroupedCkfTrajectoryBuilder::TrajectoryContainer result,
const TrajectoryFilter regionalCondition 
) const
private

common part of both public trajectory building methods

Definition at line 171 of file GroupedCkfTrajectoryBuilder.cc.

References analyseResult(), analyseSeed(), BaseCkfTrajectoryBuilder::createStartingTrajectory(), groupedLimitedCandidates(), LogDebug, BaseCkfTrajectoryBuilder::theForwardPropagator, work_, and work_MaxSize_.

Referenced by trajectories().

174 {
175  //
176  // Build trajectory outwards from seed
177  //
178 
179  analyseSeed( seed);
180 
181  TempTrajectory startingTraj = createStartingTrajectory( seed);
182 
183  work_.clear();
184  const bool inOut = true;
185  groupedLimitedCandidates( startingTraj, regionalCondition, theForwardPropagator, inOut, work_);
186  if ( work_.empty() ) return ;
187 
188 
189 
190  /* rebuilding is de-coupled from standard building
191  //
192  // try to additional hits in the seeding region
193  //
194  if ( theMinNrOfHitsForRebuild>0 ) {
195  // reverse direction
196  //thePropagator->setPropagationDirection(oppositeDirection(seed.direction()));
197  // rebuild part of the trajectory
198  rebuildSeedingRegion(startingTraj,work);
199  }
200 
201  */
202 
203  result.reserve(work_.size());
204  for (TempTrajectoryContainer::const_iterator it = work_.begin(), ed = work_.end(); it != ed; ++it) {
205  result.push_back( it->toTrajectory() );
206  }
207 
208  work_.clear();
209  if (work_.capacity() > work_MaxSize_) { TempTrajectoryContainer().swap(work_); work_.reserve(work_MaxSize_/2); }
210 
212 
213  LogDebug("CkfPattern")<< "GroupedCkfTrajectoryBuilder: returning result of size " << result.size();
214 
215 }
#define LogDebug(id)
virtual void analyseSeed(const TrajectorySeed &seed) const
virtual void analyseResult(const TrajectoryContainer &result) const
void groupedLimitedCandidates(TempTrajectory &startingTraj, const TrajectoryFilter *regionalCondition, const Propagator *propagator, bool inOut, TempTrajectoryContainer &result) const
tuple result
Definition: query.py:137
std::vector< TempTrajectory > TempTrajectoryContainer
TempTrajectory createStartingTrajectory(const TrajectorySeed &seed) const
const Propagator * theForwardPropagator
double GroupedCkfTrajectoryBuilder::chiSquareCut ( )
inline

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

Definition at line 71 of file GroupedCkfTrajectoryBuilder.h.

References theChiSquareCut.

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

Definition at line 66 of file GroupedCkfTrajectoryBuilder.h.

References BaseCkfTrajectoryBuilder::theEstimator.

Referenced by rebuildSeedingRegion().

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

intermediate cleaning in the case of grouped measurements

recHitEqualByChannels(im1->recHit(),im2->recHit()) ) {

recHitEqualByChannels(im1->recHit(),im2->recHit()) ) {

Definition at line 433 of file GroupedCkfTrajectoryBuilder.cc.

References ecalTPGAnalyzer_cfg::firstValid, TempTrajectory::isValid(), layers(), cmsutils::bqueue< T >::rbegin(), cmsutils::bqueue< T >::rend(), TrackingRecHit::some, and tkxor().

Referenced by groupedLimitedCandidates().

434 {
435  //if (theTrajectories.empty()) return TrajectoryContainer();
436  //TrajectoryContainer result;
437  if (theTrajectories.empty()) return;
438  //RecHitEqualByChannels recHitEqualByChannels(false, false);
439  int firstLayerSize, secondLayerSize;
440  vector<const DetLayer*> firstLayers, secondLayers;
441 
442  for (TempTrajectoryContainer::iterator firstTraj=theTrajectories.begin();
443  firstTraj!=(theTrajectories.end()-1); firstTraj++) {
444 
445  if ( (!firstTraj->isValid()) ||
446  (!firstTraj->lastMeasurement().recHit()->isValid()) ) continue;
447  const TempTrajectory::DataContainer & firstMeasurements = firstTraj->measurements();
448  layers(firstMeasurements, firstLayers);
449  firstLayerSize = firstLayers.size();
450  if ( firstLayerSize<4 ) continue;
451 
452  for (TempTrajectoryContainer::iterator secondTraj=(firstTraj+1);
453  secondTraj!=theTrajectories.end(); secondTraj++) {
454 
455  if ( (!secondTraj->isValid()) ||
456  (!secondTraj->lastMeasurement().recHit()->isValid()) ) continue;
457  const TempTrajectory::DataContainer & secondMeasurements = secondTraj->measurements();
458  layers(secondMeasurements, secondLayers);
459  secondLayerSize = secondLayers.size();
460  //
461  // only candidates using the same last 3 layers are compared
462  //
463  if ( firstLayerSize!=secondLayerSize ) continue;
464  if ( firstLayers[0]!=secondLayers[0] ||
465  firstLayers[1]!=secondLayers[1] ||
466  firstLayers[2]!=secondLayers[2] ) continue;
467 
468  TempTrajectory::DataContainer::const_iterator im1 = firstMeasurements.rbegin();
469  TempTrajectory::DataContainer::const_iterator im2 = secondMeasurements.rbegin();
470  //
471  // check for identical hits in the last layer
472  //
473  bool unequal(false);
474  const DetLayer* layerPtr = firstLayers[0];
475  while ( im1!=firstMeasurements.rend()&&im2!=secondMeasurements.rend() ) {
476  if ( im1->layer()!=layerPtr || im2->layer()!=layerPtr ) break;
477  if ( !(im1->recHit()->isValid()) || !(im2->recHit()->isValid()) ||
479  !im1->recHit()->hit()->sharesInput(im2->recHit()->hit(), TrackingRecHit::some) ) {
480  unequal = true;
481  break;
482  }
483  --im1;
484  --im2;
485  }
486  if ( im1==firstMeasurements.rend() || im2==secondMeasurements.rend() ||
487  im1->layer()==layerPtr || im2->layer()==layerPtr || unequal ) continue;
488  //
489  // check for invalid hits in the layer -2
490  // compare only candidates with invalid / valid combination
491  //
492  layerPtr = firstLayers[1];
493  bool firstValid(true);
494  while ( im1!=firstMeasurements.rend()&&im1->layer()==layerPtr ) {
495  if ( !im1->recHit()->isValid() ) firstValid = false;
496  --im1;
497  }
498  bool secondValid(true);
499  while ( im2!=secondMeasurements.rend()&&im2->layer()==layerPtr ) {
500  if ( !im2->recHit()->isValid() ) secondValid = false;
501  --im2;
502  }
503  if ( !tkxor(firstValid,secondValid) ) continue;
504  //
505  // ask for identical hits in layer -3
506  //
507  unequal = false;
508  layerPtr = firstLayers[2];
509  while ( im1!=firstMeasurements.rend()&&im2!=secondMeasurements.rend() ) {
510  if ( im1->layer()!=layerPtr || im2->layer()!=layerPtr ) break;
511  if ( !(im1->recHit()->isValid()) || !(im2->recHit()->isValid()) ||
513  !im1->recHit()->hit()->sharesInput(im2->recHit()->hit(), TrackingRecHit::some) ) {
514  unequal = true;
515  break;
516  }
517  --im1;
518  --im2;
519  }
520  if ( im1==firstMeasurements.rend() || im2==secondMeasurements.rend() ||
521  im1->layer()==layerPtr || im2->layer()==layerPtr || unequal ) continue;
522 
523  if ( !firstValid ) {
524  firstTraj->invalidate();
525  break;
526  }
527  else {
528  secondTraj->invalidate();
529  break;
530  }
531  }
532  }
533 /*
534  for (TempTrajectoryContainer::const_iterator it = theTrajectories.begin();
535  it != theTrajectories.end(); it++) {
536  if(it->isValid()) result.push_back( *it);
537  }
538 
539  return result;
540 */
541  theTrajectories.erase(std::remove_if( theTrajectories.begin(),theTrajectories.end(),
542  std::not1(std::mem_fun_ref(&TempTrajectory::isValid))),
543  // boost::bind(&TempTrajectory::isValid,_1)),
544  theTrajectories.end());
545 }
const_iterator rend() const
Definition: bqueue.h:142
bool isValid() const
iterator rbegin()
Definition: bqueue.h:140
bool tkxor(bool a, bool b) const
void layers(const TempTrajectory::DataContainer &measurements, std::vector< const DetLayer * > &fillme) const
void GroupedCkfTrajectoryBuilder::groupedLimitedCandidates ( TempTrajectory startingTraj,
const TrajectoryFilter regionalCondition,
const Propagator propagator,
bool  inOut,
TempTrajectoryContainer result 
) const
private

Definition at line 219 of file GroupedCkfTrajectoryBuilder.cc.

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

Referenced by buildTrajectories(), and rebuildSeedingRegion().

224 {
225  unsigned int nIter=1;
226  TempTrajectoryContainer candidates;
227  TempTrajectoryContainer newCand;
228  candidates.push_back( startingTraj);
229 
230  while ( !candidates.empty()) {
231 
232  newCand.clear();
233  for (TempTrajectoryContainer::iterator traj=candidates.begin();
234  traj!=candidates.end(); traj++) {
235  if ( !advanceOneLayer(*traj, regionalCondition, propagator, inOut, newCand, result) ) {
236  LogDebug("CkfPattern")<< "GCTB: terminating after advanceOneLayer==false";
237  continue;
238  }
239 
240  LogDebug("CkfPattern")<<"newCand(1): after advanced one layer:\n"<<PrintoutHelper::dumpCandidates(newCand);
241 
242  if ((int)newCand.size() > theMaxCand) {
243  //ShowCand()(newCand);
244 
245  sort( newCand.begin(), newCand.end(), GroupedTrajCandLess(theLostHitPenalty,theFoundHitBonus));
246  newCand.erase( newCand.begin()+theMaxCand, newCand.end());
247  }
248  LogDebug("CkfPattern")<<"newCand(2): after removing extra candidates.\n"<<PrintoutHelper::dumpCandidates(newCand);
249  }
250 
251  LogDebug("CkfPattern") << "newCand.size() at end = " << newCand.size();
252 /*
253  if (theIntermediateCleaning) {
254  candidates.clear();
255  candidates = groupedIntermediaryClean(newCand);
256  } else {
257  candidates.swap(newCand);
258  }
259 */
261 #ifdef STANDARD_INTERMEDIARYCLEAN
263 #else
264  groupedIntermediaryClean(newCand);
265 #endif
266 
267  }
268  candidates.swap(newCand);
269 
270  LogDebug("CkfPattern") <<"candidates(3): "<<result.size()<<" candidates after "<<nIter++<<" groupedCKF iteration: \n"
272  <<"\n "<<candidates.size()<<" running candidates are: \n"
273  <<PrintoutHelper::dumpCandidates(candidates);
274  }
275 }
#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(TempTrajectory &traj, const TrajectoryFilter *regionalCondition, const Propagator *propagator, bool inOut, TempTrajectoryContainer &newCand, TempTrajectoryContainer &result) const
std::vector< TempTrajectory > TempTrajectoryContainer
void GroupedCkfTrajectoryBuilder::layers ( const TempTrajectory::DataContainer measurements,
std::vector< const DetLayer * > &  fillme 
) const
private

fills in a list of layers from a container of TrajectoryMeasurements the "fillme" vector is cleared beforehand.

Definition at line 548 of file GroupedCkfTrajectoryBuilder.cc.

References cmsutils::bqueue< T >::back(), cmsutils::bqueue< T >::empty(), TrajectoryMeasurement::layer(), cmsutils::bqueue< T >::rbegin(), and cmsutils::bqueue< T >::rend().

Referenced by groupedIntermediaryClean().

550 {
551  result.clear();
552 
553  if ( measurements.empty() ) return ;
554 
555  result.push_back(measurements.back().layer());
557  --ifirst;
559  im!=measurements.rend(); --im ) {
560  if ( im->layer()!=result.back() ) result.push_back(im->layer());
561  }
562 
563  for (vector<const DetLayer*>::const_iterator iter = result.begin(); iter != result.end(); iter++){
564  if (!*iter) edm::LogWarning("CkfPattern")<< "Warning: null det layer!! ";
565  }
566 }
const_iterator rend() const
Definition: bqueue.h:142
bool empty() const
Definition: bqueue.h:144
tuple result
Definition: query.py:137
const DetLayer * layer() const
iterator rbegin()
Definition: bqueue.h:140
float GroupedCkfTrajectoryBuilder::lostHitPenalty ( )
inline

Chi**2 Penalty for each lost hit.

Definition at line 78 of file GroupedCkfTrajectoryBuilder.h.

References theLostHitPenalty.

double GroupedCkfTrajectoryBuilder::mass ( )
inline

Mass hypothesis used for propagation.

Definition at line 87 of file GroupedCkfTrajectoryBuilder.h.

References theMass.

int GroupedCkfTrajectoryBuilder::maxCand ( )
inline

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

Definition at line 74 of file GroupedCkfTrajectoryBuilder.h.

References theMaxCand.

GroupedCkfTrajectoryBuilder& GroupedCkfTrajectoryBuilder::operator= ( const GroupedCkfTrajectoryBuilder )
private

no assignment operator

PropagationDirection GroupedCkfTrajectoryBuilder::oppositeDirection ( PropagationDirection  dir) const
inlineprivate

change of propagation direction

Definition at line 157 of file GroupedCkfTrajectoryBuilder.h.

References alongMomentum, dir, and oppositeToMomentum.

Referenced by backwardFit().

157  {
158  if ( dir==alongMomentum ) return oppositeToMomentum;
159  else if ( dir==oppositeToMomentum ) return alongMomentum;
160  return dir;
161  }
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 84 of file GroupedCkfTrajectoryBuilder.h.

References theptCut.

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 145 of file GroupedCkfTrajectoryBuilder.cc.

References BaseCkfTrajectoryBuilder::createStartingTrajectory().

Referenced by rebuildSeedingRegion().

146  {
147  TempTrajectory startingTraj = createStartingTrajectory( seed);
149 
150  TrajectoryContainer final;
151 
152  work.reserve(result.size());
153  for (TrajectoryContainer::iterator traj=result.begin();
154  traj!=result.end(); ++traj) {
155  if(traj->isValid()) work.push_back(TempTrajectory(*traj));
156  }
157 
158  rebuildSeedingRegion(startingTraj,work);
159  final.reserve(work.size());
160 
161  for (TempTrajectoryContainer::iterator traj=work.begin();
162  traj!=work.end(); ++traj) {
163  final.push_back(traj->toTrajectory());
164  }
165 
166  result.swap(final);
167 
168 }
tuple result
Definition: query.py:137
void rebuildSeedingRegion(const TrajectorySeed &, TrajectoryContainer &result) const
std::vector< TempTrajectory > TempTrajectoryContainer
std::vector< Trajectory > TrajectoryContainer
TempTrajectory createStartingTrajectory(const TrajectorySeed &seed) const
void GroupedCkfTrajectoryBuilder::rebuildSeedingRegion ( TempTrajectory startingTraj,
TempTrajectoryContainer result 
) const
private

try to find additional hits in seeding region

Definition at line 569 of file GroupedCkfTrajectoryBuilder.cc.

References backwardFit(), estimator(), TempTrajectory::isValid(), LogDebug, TempTrajectory::measurements(), rebuildSeedingRegion(), TrajectorySeed::recHits(), TempTrajectory::seed(), cmsutils::bqueue< T >::size(), BaseCkfTrajectoryBuilder::theBackwardPropagator, and updator().

571 {
572  //
573  // Rebuilding of trajectories. Candidates are taken from result,
574  // which will be replaced with the solutions after rebuild
575  // (assume vector::swap is more efficient than building new container)
576  //
577  LogDebug("CkfPattern")<< "Starting to rebuild " << result.size() << " tracks";
578  //
579  // Fitter (need to create it here since the propagation direction
580  // might change between different starting trajectories)
581  //
583  //
584  TempTrajectoryContainer reFitted;
585  TrajectorySeed::range rseedHits = startingTraj.seed().recHits();
586  std::vector<const TrackingRecHit*> seedHits;
587  //seedHits.insert(seedHits.end(), rseedHits.first, rseedHits.second);
588  //for (TrajectorySeed::recHitContainer::const_iterator iter = rseedHits.first; iter != rseedHits.second; iter++){
589  // seedHits.push_back(&*iter);
590  //}
591 
592  //unsigned int nSeed(seedHits.size());
593  unsigned int nSeed(rseedHits.second-rseedHits.first);
594  //seedHits.reserve(nSeed);
595  TempTrajectoryContainer rebuiltTrajectories;
596  for ( TempTrajectoryContainer::iterator it=result.begin();
597  it!=result.end(); it++ ) {
598  //
599  // skip candidates which are not exceeding the seed size
600  // (e.g. because no Tracker layers outside seeding region)
601  //
602 
603  if ( it->measurements().size()<=startingTraj.measurements().size() ) {
604  rebuiltTrajectories.push_back(*it);
605  LogDebug("CkfPattern")<< "RebuildSeedingRegion skipped as in-out trajectory does not exceed seed size.";
606  continue;
607  }
608  //
609  // Refit - keep existing trajectory in case fit is not possible
610  // or fails
611  //
612  backwardFit(*it,nSeed,fitter,reFitted,seedHits);
613  if ( reFitted.size()!=1 ) {
614  rebuiltTrajectories.push_back(*it);
615  LogDebug("CkfPattern")<< "RebuildSeedingRegion skipped as backward fit failed";
616  // << "after reFitted.size() " << reFitted.size();
617  continue;
618  }
619  //LogDebug("CkfPattern")<<"after reFitted.size() " << reFitted.size();
620  //
621  // Rebuild seeding part. In case it fails: keep initial trajectory
622  // (better to drop it??)
623  //
624  int nRebuilt =
625  rebuildSeedingRegion (seedHits,reFitted.front(),rebuiltTrajectories);
626 
627  if ( nRebuilt==0 ) it->invalidate(); // won't use original in-out track
628 
629  if ( nRebuilt<=0 ) rebuiltTrajectories.push_back(*it);
630 
631  }
632  //
633  // Replace input trajectories with new ones
634  //
635  result.swap(rebuiltTrajectories);
636  result.erase(std::remove_if( result.begin(),result.end(),
637  std::not1(std::mem_fun_ref(&TempTrajectory::isValid))),
638  result.end());
639 }
#define LogDebug(id)
const TrajectorySeed & seed() const
Access to the seed used to reconstruct the Trajectory.
const Propagator * theBackwardPropagator
const DataContainer & measurements() const
tuple result
Definition: query.py:137
void backwardFit(TempTrajectory &candidate, unsigned int nSeed, const TrajectoryFitter &fitter, TempTrajectoryContainer &fittedTracks, std::vector< const TrackingRecHit * > &remainingHits) const
const Chi2MeasurementEstimatorBase & estimator() const
std::pair< const_iterator, const_iterator > range
void rebuildSeedingRegion(const TrajectorySeed &, TrajectoryContainer &result) const
bool isValid() const
std::vector< TempTrajectory > TempTrajectoryContainer
range recHits() const
const TrajectoryStateUpdator & updator() const
size_type size() const
Definition: bqueue.h:143
int GroupedCkfTrajectoryBuilder::rebuildSeedingRegion ( const std::vector< const TrackingRecHit * > &  seedHits,
TempTrajectory candidate,
TempTrajectoryContainer result 
) const
private

Definition at line 642 of file GroupedCkfTrajectoryBuilder.cc.

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

645 {
646  //
647  // Starting from track found by in-out tracking phase, extrapolate it inwards through
648  // the seeding region if possible in towards smaller Tracker radii, searching for additional
649  // hits.
650  // The resulting trajectories are returned in result,
651  // the count is the return value.
652  //
653  TempTrajectoryContainer rebuiltTrajectories;
654 #ifdef DBG2_GCTB
655 /* const LayerFinderByDet layerFinder;
656  if ( !seedHits.empty() && seedHits.front().isValid() ) {
657  DetLayer* seedLayer = layerFinder(seedHits.front().det());
658  cout << "Seed hit at " << seedHits.front().globalPosition()
659  << " " << seedLayer << endl;
660  cout << "Started from "
661  << candidate.lastMeasurement().updatedState().globalPosition().perp() << " "
662  << candidate.lastMeasurement().updatedState().globalPosition().z() << endl;
663  pair<bool,TrajectoryStateOnSurface> layerComp(false,TrajectoryStateOnSurface());
664  if ( seedLayer ) layerComp =
665  seedLayer->compatible(candidate.lastMeasurement().updatedState(),
666  propagator(),estimator());
667  pair<bool,TrajectoryStateOnSurface> detComp =
668  seedHits.front().det().compatible(candidate.lastMeasurement().updatedState(),
669  propagator(),estimator());
670  cout << " layer compatibility = " << layerComp.first;
671  cout << " det compatibility = " << detComp.first;
672  if ( detComp.first ) {
673  cout << " estimate = "
674  << estimator().estimate(detComp.second,seedHits.front()).second ;
675  }
676  cout << endl;
677  }*/
678  cout << "Before backward building: #measurements = "
679  << candidate.measurements().size() ; //<< endl;;
680 #endif
681  //
682  // Use standard building with standard cuts. Maybe better to use different
683  // cuts from "forward" building (e.g. no check on nr. of invalid hits)?
684  //
685  const bool inOut = false;
686  groupedLimitedCandidates(candidate, (const TrajectoryFilter*)0, theBackwardPropagator, inOut, rebuiltTrajectories);
687 
688  LogDebug("CkfPattern")<<" After backward building: "<<PrintoutHelper::dumpCandidates(rebuiltTrajectories);
689 
690  //
691  // Check & count resulting candidates
692  //
693  int nrOfTrajectories(0);
694  bool orig_ok = false;
695  //const RecHitEqualByChannels recHitEqual(false,false);
696  //vector<TM> oldMeasurements(candidate.measurements());
697  for ( TempTrajectoryContainer::iterator it=rebuiltTrajectories.begin();
698  it!=rebuiltTrajectories.end(); it++ ) {
699 
700  TempTrajectory::DataContainer newMeasurements(it->measurements());
701  //
702  // Verify presence of seeding hits?
703  //
705  orig_ok = true;
706  // no hits found (and possibly some invalid hits discarded): drop track
707  if ( newMeasurements.size()<=candidate.measurements().size() ){
708  LogDebug("CkfPattern") << "newMeasurements.size()<=candidate.measurements().size()";
709  continue;
710  }
711  // verify presence of hits
712  //GIO//if ( !verifyHits(newMeasurements.begin()+candidate.measurements().size(),
713  //GIO// newMeasurements.end(),seedHits) ){
714  if ( !verifyHits(newMeasurements.rbegin(),
715  newMeasurements.size() - candidate.measurements().size(),
716  seedHits) ){
717  LogDebug("CkfPattern")<< "seed hits not found in rebuild";
718  continue;
719  }
720  }
721  //
722  // construct final trajectory in the right order
723  //
724  TempTrajectory reversedTrajectory(it->seed(),it->seed().direction());
725  for (TempTrajectory::DataContainer::const_iterator im=newMeasurements.rbegin(), ed = newMeasurements.rend();
726  im != ed; --im ) {
727  reversedTrajectory.push(*im);
728  }
729  // save & count result
730  result.push_back(reversedTrajectory);
731  nrOfTrajectories++;
732 
733  LogDebug("CkgPattern")<<"New traj direction = " << reversedTrajectory.direction()<<"\n"
734  <<PrintoutHelper::dumpMeasurements(reversedTrajectory.measurements());
735  }
736  // If nrOfTrajectories = 0 and orig_ok = true, this means that a track was actually found on the
737  // out-in step (meeting those requirements) but did not have the seed hits in it.
738  // In this case when we return we will go ahead and use the original in-out track.
739 
740  // If nrOfTrajectories = 0 and orig_ok = false, this means that the out-in step failed to
741  // find any track. Two cases are a technical failure in fitting the original seed hits or
742  // because the track did not meet the out-in criteria (which may be stronger than the out-in
743  // criteria). In this case we will NOT allow the original in-out track to be used.
744 
745  if ( (nrOfTrajectories == 0) && orig_ok ) {
746  nrOfTrajectories = -1;
747  }
748  return nrOfTrajectories;
749 }
#define LogDebug(id)
static std::string dumpCandidates(collection &candidates)
const Propagator * theBackwardPropagator
const DataContainer & measurements() const
static std::string dumpMeasurements(const std::vector< TrajectoryMeasurement > &v)
void groupedLimitedCandidates(TempTrajectory &startingTraj, const TrajectoryFilter *regionalCondition, const Propagator *propagator, bool inOut, TempTrajectoryContainer &result) 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
std::vector< TempTrajectory > TempTrajectoryContainer
tuple cout
Definition: gather_cfg.py:41
size_type size() const
Definition: bqueue.h:143
void push(const TrajectoryMeasurement &tm)
void GroupedCkfTrajectoryBuilder::setEvent ( const edm::Event event) const
virtual

set Event for the internal MeasurementTracker data member

Implements BaseCkfTrajectoryBuilder.

Definition at line 104 of file GroupedCkfTrajectoryBuilder.cc.

References BaseCkfTrajectoryBuilder::theMeasurementTracker.

105 {
106  theMeasurementTracker->update(event);
107 }
const MeasurementTracker * theMeasurementTracker
bool GroupedCkfTrajectoryBuilder::tkxor ( bool  a,
bool  b 
) const
inlineprivate

Definition at line 109 of file GroupedCkfTrajectoryBuilder.h.

References b.

Referenced by groupedIntermediaryClean().

109 {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

trajectories building starting from a seed

Implements BaseCkfTrajectoryBuilder.

Definition at line 110 of file GroupedCkfTrajectoryBuilder.cc.

References buildTrajectories(), and runTheMatrix::ret.

111 {
113  ret.reserve(10);
114  buildTrajectories(seed, ret, 0);
115  return ret;
116 }
void buildTrajectories(const TrajectorySeed &, 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 130 of file GroupedCkfTrajectoryBuilder.cc.

References buildTrajectories().

131 {
132  buildTrajectories(seed,ret,0);
133 }
void buildTrajectories(const TrajectorySeed &, 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 119 of file GroupedCkfTrajectoryBuilder.cc.

References buildTrajectories(), and runTheMatrix::ret.

121 {
123  ret.reserve(10);
124  RegionalTrajectoryFilter regionalCondition(region);
125  buildTrajectories(seed, ret, &regionalCondition);
126  return ret;
127 }
void buildTrajectories(const TrajectorySeed &, 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 136 of file GroupedCkfTrajectoryBuilder.cc.

References buildTrajectories().

139 {
140  RegionalTrajectoryFilter regionalCondition(region);
141  buildTrajectories(seed,ret,&regionalCondition);
142 }
void buildTrajectories(const TrajectorySeed &, TrajectoryContainer &ret, const TrajectoryFilter *) const
common part of both public trajectory building methods
const TrajectoryStateUpdator& GroupedCkfTrajectoryBuilder::updator ( ) const
inline

Definition at line 65 of file GroupedCkfTrajectoryBuilder.h.

References BaseCkfTrajectoryBuilder::theUpdator.

Referenced by rebuildSeedingRegion().

65 {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 889 of file GroupedCkfTrajectoryBuilder.cc.

References LogDebug, and TrackingRecHit::some.

Referenced by rebuildSeedingRegion().

892 {
893  //
894  // verify presence of the seeding hits
895  //
896  LogDebug("CkfPattern")<<"Checking for " << hits.size() << " hits in "
897  << maxDepth << " measurements" << endl;
898 
900  while (maxDepth > 0) { --maxDepth; --rend; }
901  for ( vector<const TrackingRecHit*>::const_iterator ir=hits.begin();
902  ir!=hits.end(); ir++ ) {
903  // assume that all seeding hits are valid!
904  bool foundHit(false);
905  for ( TempTrajectory::DataContainer::const_iterator im=rbegin; im!=rend; --im ) {
906  if ( im->recHit()->isValid() && (*ir)->sharesInput(im->recHit()->hit(), TrackingRecHit::some) ) {
907  foundHit = true;
908  break;
909  }
910  }
911  if ( !foundHit ) return false;
912  }
913  return true;
914 }
#define LogDebug(id)

Member Data Documentation

bool GroupedCkfTrajectoryBuilder::theAlwaysUseInvalid
private

Definition at line 184 of file GroupedCkfTrajectoryBuilder.h.

Referenced by advanceOneLayer(), and GroupedCkfTrajectoryBuilder().

bool GroupedCkfTrajectoryBuilder::theBestHitOnly
private

Use only best hit / group when building segments

Definition at line 187 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 170 of file GroupedCkfTrajectoryBuilder.h.

Referenced by chiSquareCut().

TrajectoryFilter* GroupedCkfTrajectoryBuilder::theConfigurableCondition
private

Definition at line 165 of file GroupedCkfTrajectoryBuilder.h.

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

more measurements)

Definition at line 179 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 181 of file GroupedCkfTrajectoryBuilder.h.

Referenced by GroupedCkfTrajectoryBuilder(), and groupedLimitedCandidates().

bool GroupedCkfTrajectoryBuilder::theLockHits
private

Lock hits when building segments in a layer

Definition at line 186 of file GroupedCkfTrajectoryBuilder.h.

Referenced by advanceOneLayer(), and GroupedCkfTrajectoryBuilder().

float GroupedCkfTrajectoryBuilder::theLostHitPenalty
private

Chi**2 Penalty for each lost hit.

Definition at line 178 of file GroupedCkfTrajectoryBuilder.h.

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

double GroupedCkfTrajectoryBuilder::theMass
private

Mass hypothesis used for propagation

Definition at line 174 of file GroupedCkfTrajectoryBuilder.h.

Referenced by mass().

int GroupedCkfTrajectoryBuilder::theMaxCand
private
    Maximum number of trajectory candidates 

to propagate to the next layer.

Definition at line 176 of file GroupedCkfTrajectoryBuilder.h.

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

unsigned int GroupedCkfTrajectoryBuilder::theMinNrOf2dHitsForRebuild
private

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

Definition at line 194 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 191 of file GroupedCkfTrajectoryBuilder.h.

Referenced by backwardFit(), and GroupedCkfTrajectoryBuilder().

double GroupedCkfTrajectoryBuilder::theptCut
private

ptCut

Definition at line 172 of file GroupedCkfTrajectoryBuilder.h.

Referenced by ptCut().

bool GroupedCkfTrajectoryBuilder::theRequireSeedHitsInRebuild
private

Only accept rebuilt trajectories if they contain the seed hits.

Definition at line 189 of file GroupedCkfTrajectoryBuilder.h.

Referenced by GroupedCkfTrajectoryBuilder(), and rebuildSeedingRegion().

TempTrajectoryContainer GroupedCkfTrajectoryBuilder::work_
mutableprivate

Definition at line 198 of file GroupedCkfTrajectoryBuilder.h.

Referenced by buildTrajectories().