CMS 3D CMS Logo

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