CMS 3D CMS Logo

GsfTrajectoryFitter.cc
Go to the documentation of this file.
2 
8 
11 
13 
14 
16  const TrajectoryStateUpdator& aUpdator,
17  const MeasurementEstimator& aEstimator,
18  const MultiTrajectoryStateMerger& aMerger,
19  const DetLayerGeometry* detLayerGeometry) :
20  thePropagator(aPropagator.clone()),
21  theUpdator(aUpdator.clone()),
22  theEstimator(aEstimator.clone()),
23  theMerger(aMerger.clone()),
24  theGeometry(detLayerGeometry)
25 {
27 }
28 
30  delete thePropagator;
31  delete theUpdator;
32  delete theEstimator;
33  delete theMerger;
34 }
35 
37  if(aTraj.empty()) return Trajectory();
38 
39  TM const & firstTM = aTraj.firstMeasurement();
40  TSOS firstTsos = TrajectoryStateWithArbitraryError()(firstTM.updatedState());
41 
42  return fitOne(aTraj.seed(), aTraj.recHits(), firstTsos,type);
43 }
44 
46  const RecHitContainer& hits, fitType type) const {
47 
48  edm::LogError("GsfTrajectoryFitter")
49  << "GsfTrajectoryFitter::fit(TrajectorySeed, vector<RecHit>) not implemented";
50 
51  return Trajectory();
52 }
53 
55  const RecHitContainer& hits,
56  const TrajectoryStateOnSurface& firstPredTsos,
57  fitType) const {
58 
59  if(hits.empty()) return Trajectory();
60 
61  Trajectory myTraj(aSeed, propagator()->propagationDirection());
62 
63  TSOS predTsos(firstPredTsos);
64  if(!predTsos.isValid()) {
65  edm::LogInfo("GsfTrackFitters")
66  << "GsfTrajectoryFitter: predicted tsos of first measurement not valid!";
67  return Trajectory();
68  }
69 
70  TSOS currTsos;
71  if(hits.front()->isValid()) {
72  auto const & ihit = hits.front();
73  //update
74  assert( (!(ihit)->canImproveWithTrack()) | (nullptr!=theHitCloner));
75  assert( (!(ihit)->canImproveWithTrack()) | (nullptr!=dynamic_cast<BaseTrackerRecHit const*>(ihit.get())));
76  auto preciseHit = theHitCloner->makeShared(ihit,predTsos);
77  dump(*preciseHit,1,"GsfTrackFitters");
78  {
79  currTsos = updator()->update(predTsos, *preciseHit);
80  }
81  if (!predTsos.isValid() || !currTsos.isValid()){
82  edm::LogError("InvalidState")<<"first hit";
83  return Trajectory();
84  }
85  myTraj.push(TM(predTsos, currTsos, preciseHit, 0., theGeometry->idToLayer(preciseHit->geographicalId() )),
86  estimator()->estimate(predTsos, *preciseHit).second);
87  } else {
88  currTsos = predTsos;
89  if (!predTsos.isValid()){
90  edm::LogError("InvalidState")<<"first invalid hit";
91  return Trajectory();
92  }
93  myTraj.push(TM(predTsos, hits.front(),0., theGeometry->idToLayer((hits.front())->geographicalId()) ));
94  }
95 
96  int hitcounter = 1;
97  for(RecHitContainer::const_iterator ihit = hits.begin() + 1;
98  ihit != hits.end(); ihit++) {
99  ++hitcounter;
100 
101  //
102  // temporary protection copied from KFTrajectoryFitter.
103  //
104  if ((**ihit).isValid() == false && (**ihit).det() == nullptr) {
105  LogDebug("GsfTrackFitters") << " Error: invalid hit with no GeomDet attached .... skipping";
106  continue;
107  }
108 
109  {
110  // TimeMe t(*propTimer,false);
111  predTsos = propagator()->propagate(currTsos,
112  (**ihit).det()->surface());
113  }
114  if(!predTsos.isValid()) {
115  if ( myTraj.foundHits()>=3 ) {
116  edm::LogInfo("GsfTrackFitters")
117  << "GsfTrajectoryFitter: predicted tsos not valid! \n"
118  << "Returning trajectory with " << myTraj.foundHits() << " found hits.";
119  return myTraj;
120  }
121  else {
122  edm::LogInfo("GsfTrackFitters")
123  << "GsfTrajectoryFitter: predicted tsos not valid after " << myTraj.foundHits()
124  << " hits, discarding candidate!";
125  return Trajectory();
126  }
127  }
128  if ( merger() ) predTsos = merger()->merge(predTsos);
129 
130  if((**ihit).isValid()) {
131  //update
132  assert( (!(*ihit)->canImproveWithTrack()) | (nullptr!=theHitCloner));
133  assert( (!(*ihit)->canImproveWithTrack()) | (nullptr!=dynamic_cast<BaseTrackerRecHit const*>((*ihit).get())));
134  auto preciseHit = theHitCloner->makeShared(*ihit,predTsos);
135  dump(*preciseHit,hitcounter,"GsfTrackFitters");
136  currTsos = updator()->update(predTsos, *preciseHit);
137  if (!predTsos.isValid() || !currTsos.isValid()){
138  edm::LogError("InvalidState")<<"inside hit";
139  return Trajectory();
140  }
141  auto chi2=estimator()->estimate(predTsos, *preciseHit).second;
142  myTraj.push(TM(predTsos, currTsos, preciseHit,
143  chi2,
144  theGeometry->idToLayer(preciseHit->geographicalId() )));
145  LogDebug("GsfTrackFitters") << "added measurement with chi2 " << chi2;
146  } else {
147  currTsos = predTsos;
148  if (!predTsos.isValid()){
149  edm::LogError("InvalidState")<<"inside invalid hit";
150  return Trajectory();
151  }
152  myTraj.push(TM(predTsos, *ihit,0., theGeometry->idToLayer( (*ihit)->geographicalId()) ));
153  }
154  dump(predTsos,"predTsos","GsfTrackFitters");
155  dump(currTsos,"currTsos","GsfTrackFitters");
156  }
157  return myTraj;
158 }
#define LogDebug(id)
Trajectory fitOne(const Trajectory &t, fitType type) const override
bool empty() const
True if trajectory has no measurements.
Definition: Trajectory.h:254
const Propagator * thePropagator
type
Definition: HCALResponse.h:21
const MultiTrajectoryStateMerger * theMerger
int foundHits() const
Definition: Trajectory.h:225
GsfTrajectoryFitter(const Propagator &aPropagator, const TrajectoryStateUpdator &aUpdator, const MeasurementEstimator &aEstimator, const MultiTrajectoryStateMerger &aMerger, const DetLayerGeometry *detLayerGeometry=0)
TrajectorySeed const & seed() const
Access to the seed used to reconstruct the Trajectory.
Definition: Trajectory.h:285
ConstRecHitContainer recHits() const
Definition: Trajectory.h:204
TrajectoryStateOnSurface merge(const TrajectoryStateOnSurface &tsos) const
TrackingRecHit::ConstRecHitPointer makeShared(TrackingRecHit::ConstRecHitPointer const &hit, TrajectoryStateOnSurface const &tsos) const
Definition: TkCloner.h:23
const DetLayerGeometry * theGeometry
const MeasurementEstimator * theEstimator
virtual TrajectoryStateOnSurface update(const TrajectoryStateOnSurface &, const TrackingRecHit &) const =0
const SurfaceType & surface() const
TrajectoryMeasurement TM
const MultiTrajectoryStateMerger * merger() const
TrajectoryMeasurement const & firstMeasurement() const
Definition: Trajectory.h:187
TEveGeoShape * clone(const TEveElement *element, TEveElement *parent)
Definition: eve_macros.cc:135
TrajectoryStateOnSurface propagate(STA const &state, SUR const &surface) const
Definition: Propagator.h:53
const Propagator * propagator() const
const TrajectoryStateUpdator * updator() const
const TrajectoryStateUpdator * theUpdator
virtual HitReturnType estimate(const TrajectoryStateOnSurface &ts, const TrackingRecHit &hit) const =0
TrajectoryStateOnSurface const & updatedState() const
virtual const DetLayer * idToLayer(const DetId &detId) const
Trajectory::RecHitContainer RecHitContainer
void push(const TrajectoryMeasurement &tm)
Definition: Trajectory.cc:50
const MeasurementEstimator * estimator() const
const DetLayerGeometry dummyGeometry
TkCloner const * theHitCloner