CMS 3D CMS Logo

All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
KFTrajectoryFitter.cc
Go to the documentation of this file.
10 
12 
14  if (aTraj.empty())
15  return Trajectory();
16 
17  const TM& firstTM = aTraj.firstMeasurement();
18  TSOS firstTsos = TrajectoryStateWithArbitraryError()(firstTM.updatedState());
19 
20  return fitOne(aTraj.seed(), aTraj.recHits(), firstTsos, type);
21 }
22 
24  throw cms::Exception("TrackFitters",
25  "KFTrajectoryFitter::fit(TrajectorySeed, <TransientTrackingRecHit>) not implemented");
26 
27  return Trajectory();
28 }
29 
31  const RecHitContainer& hits,
32  const TSOS& firstPredTsos,
33  fitType) const {
34  if (hits.empty())
35  return Trajectory();
36 
37  if
38  UNLIKELY(aSeed.direction() == anyDirection)
39  throw cms::Exception("KFTrajectoryFitter", "TrajectorySeed::direction() requested but not set");
40 
41  std::unique_ptr<Propagator> p_cloned = SetPropagationDirection(*thePropagator, aSeed.direction());
42 
43 #ifdef EDM_ML_DEBUG
44  LogDebug("TrackFitters")
45  << " +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n"
46  << " KFTrajectoryFitter::fit starting with " << hits.size() << " HITS";
47 
48  for (unsigned int j = 0; j < hits.size(); j++) {
49  if (hits[j]->det())
50  LogTrace("TrackFitters") << "hit #:" << j + 1 << " rawId=" << hits[j]->det()->geographicalId().rawId()
51  << " validity=" << hits[j]->isValid();
52  else
53  LogTrace("TrackFitters") << "hit #:" << j + 1 << " Hit with no Det information";
54  }
55  LogTrace("TrackFitters") << " INITIAL STATE " << firstPredTsos;
56 #endif
57 
58  Trajectory ret(aSeed, p_cloned->propagationDirection());
59  Trajectory& myTraj = ret;
60  myTraj.reserve(hits.size());
61 
62  TSOS predTsos(firstPredTsos);
63  TSOS currTsos;
64 
65  int hitcounter = 0;
66  for (auto ihit : hits) {
67  ++hitcounter;
68 
69  const TransientTrackingRecHit& hit = (*ihit);
70 
71  // if UNLIKELY(hit.det() == nullptr) continue;
72 
73  if
74  UNLIKELY((!hit.isValid()) && hit.surface() == nullptr) {
75  LogDebug("TrackFitters") << " Error: invalid hit with no GeomDet attached .... skipping";
76  continue;
77  }
78  // if (hit.det() && hit.geographicalId()<1000U) LogDebug("TrackFitters")<< "Problem 0 det id for " << typeid(hit).name() << ' ' << hit.det()->geographicalId() ;
79  // if (hit.isValid() && hit.geographicalId()<1000U) LogDebug("TrackFitters")<< "Problem 0 det id for " << typeid(hit).name() << ' ' << hit.det()->geographicalId();
80 
81  if (hitcounter != 1) //no propagation needed for the first hit
82  predTsos = p_cloned->propagate(currTsos, *(hit.surface()));
83 
84  if
85  UNLIKELY(!predTsos.isValid()) {
86  LogDebug("TrackFitters") << "SOMETHING WRONG !"
87  << "\n"
88  << "KFTrajectoryFitter: predicted tsos not valid!\n"
89  << "current TSOS: " << currTsos << "\n";
90 
91  if (hit.surface())
92  LogTrace("TrackFitters") << "next Surface: " << hit.surface()->position() << "\n";
93 
94  if (myTraj.foundHits() >= minHits_) {
95  LogDebug("TrackFitters") << " breaking trajectory"
96  << "\n";
97  break;
98  } else {
99  LogDebug("TrackFitters") << " killing trajectory"
100  << "\n";
101  return Trajectory();
102  }
103  }
104 
105  if
106  LIKELY(hit.isValid()) {
107  assert((hit.geographicalId() != 0U) | !hit.canImproveWithTrack());
108  assert(hit.surface() != nullptr);
109  //update
110  LogTrace("TrackFitters") << "THE HIT IS VALID: updating hit with predTsos";
111  assert((!hit.canImproveWithTrack()) | (nullptr != theHitCloner));
112  assert((!hit.canImproveWithTrack()) | (nullptr != dynamic_cast<BaseTrackerRecHit const*>((ihit).get())));
113  auto preciseHit = theHitCloner->makeShared(ihit, predTsos);
114  dump(*preciseHit, hitcounter, "TrackFitters");
115  assert(preciseHit->isValid());
116  assert((preciseHit->geographicalId() != 0U) | (!preciseHit->canImproveWithTrack()));
117  assert(preciseHit->surface() != nullptr);
118 
119  if
120  UNLIKELY(!preciseHit->isValid()) {
121  LogTrace("TrackFitters") << "THE Precise HIT IS NOT VALID: using currTsos = predTsos"
122  << "\n";
123  currTsos = predTsos;
124  myTraj.push(TM(predTsos, ihit, 0, theGeometry->idToLayer((ihit)->geographicalId())));
125  }
126  else {
127  LogTrace("TrackFitters") << "THE Precise HIT IS VALID: updating currTsos"
128  << "\n";
129  currTsos = updator()->update(predTsos, *preciseHit);
130  //check for valid hits with no det (refitter with constraints)
131  bool badState = (!currTsos.isValid()) ||
132  (hit.geographicalId().det() == DetId::Tracker &&
133  (std::abs(currTsos.localParameters().qbp()) > 100 ||
134  std::abs(currTsos.localParameters().position().y()) > 1000 ||
135  std::abs(currTsos.localParameters().position().x()) > 1000)) ||
136  edm::isNotFinite(currTsos.localParameters().qbp()) || !currTsos.localError().posDef();
137  if
138  UNLIKELY(badState) {
139  if (!currTsos.isValid()) {
140  edm::LogError("FailedUpdate")
141  << "updating with the hit failed. Not updating the trajectory with the hit";
142 
143  } else if (edm::isNotFinite(currTsos.localParameters().qbp())) {
144  edm::LogError("TrajectoryNaN") << "Trajectory has NaN";
145 
146  } else if (!currTsos.localError().posDef()) {
147  edm::LogError("TrajectoryNotPosDef") << "Trajectory covariance is not positive-definite";
148 
149  } else {
150  LogTrace("FailedUpdate") << "updated state is valid but pretty bad, skipping. currTsos " << currTsos
151  << "\n predTsos " << predTsos;
152  }
153  myTraj.push(TM(predTsos, ihit, 0, theGeometry->idToLayer((ihit)->geographicalId())));
154  //There is a no-fail policy here. So, it's time to give up
155  //Keep the traj with invalid TSOS so that it's clear what happened
156  if (myTraj.foundHits() >= minHits_) {
157  LogDebug("TrackFitters") << " breaking trajectory"
158  << "\n";
159  break;
160  } else {
161  LogDebug("TrackFitters") << " killing trajectory"
162  << "\n";
163  return Trajectory();
164  }
165  }
166  else {
167  if (preciseHit->det()) {
168  myTraj.push(TM(predTsos,
169  currTsos,
170  preciseHit,
171  estimator()->estimate(predTsos, *preciseHit).second,
172  theGeometry->idToLayer(preciseHit->geographicalId())));
173  } else {
174  myTraj.push(TM(predTsos, currTsos, preciseHit, estimator()->estimate(predTsos, *preciseHit).second));
175  }
176  }
177  }
178  }
179  else { // invalid hit
180  dump(hit, hitcounter, "TrackFitters");
181  //no update
182  LogDebug("TrackFitters") << "THE HIT IS NOT VALID: using currTsos"
183  << "\n";
184  currTsos = predTsos;
185  assert(((ihit)->det() == nullptr) || (ihit)->geographicalId() != 0U);
186  if ((ihit)->det())
187  myTraj.push(TM(predTsos, ihit, 0, theGeometry->idToLayer((ihit)->geographicalId())));
188  else
189  myTraj.push(TM(predTsos, ihit, 0));
190  }
191  LogTrace("TrackFitters") << "predTsos !"
192  << "\n"
193  << predTsos << " with local position " << predTsos.localPosition() << "currTsos !"
194  << "\n"
195  << currTsos << " with local position " << currTsos.localPosition();
196  }
197 
198  LogDebug("TrackFitters") << "Found 1 trajectory with " << myTraj.foundHits() << " valid hits\n";
199 
200  return ret;
201 }
#define LogDebug(id)
PropagationDirection direction() const
bool empty() const
True if trajectory has no measurements.
Definition: Trajectory.h:233
type
Definition: HCALResponse.h:21
virtual const Surface * surface() const
TrajectorySeed const & seed() const
Access to the seed used to reconstruct the Trajectory.
Definition: Trajectory.h:263
const LocalTrajectoryParameters & localParameters() const
const TrajectoryStateUpdator * updator() const
constexpr bool isNotFinite(T x)
Definition: isFinite.h:9
LocalPoint position() const
Local x and y position coordinates.
ret
prodAgent to be discontinued
const MeasurementEstimator * estimator() const
T y() const
Definition: PV3DBase.h:60
#define LIKELY(x)
Definition: Likely.h:20
ConstRecHitContainer recHits() const
Definition: Trajectory.h:186
TrajectoryMeasurement TM
TrackingRecHit::ConstRecHitPointer makeShared(TrackingRecHit::ConstRecHitPointer const &hit, TrajectoryStateOnSurface const &tsos) const
Definition: TkCloner.h:23
virtual TrajectoryStateOnSurface update(const TrajectoryStateOnSurface &, const TrackingRecHit &) const =0
Trajectory fitOne(const Trajectory &aTraj, fitType) const override
U second(std::pair< T, U > const &p)
std::unique_ptr< Propagator > SetPropagationDirection(Propagator const &iprop, PropagationDirection dir)
static const DetLayerGeometry dummyGeometry
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
const LocalTrajectoryError & localError() const
#define LogTrace(id)
const DetLayerGeometry * theGeometry
TrajectoryMeasurement const & firstMeasurement() const
Definition: Trajectory.h:166
virtual bool canImproveWithTrack() const
bool isValid() const
const Propagator * thePropagator
TrajectoryStateOnSurface const & updatedState() const
DetId geographicalId() const
#define UNLIKELY(x)
Definition: Likely.h:21
virtual const DetLayer * idToLayer(const DetId &detId) const
T x() const
Definition: PV3DBase.h:59
const PositionType & position() const
Trajectory::RecHitContainer RecHitContainer
TkCloner const * theHitCloner
constexpr Detector det() const
get the detector field from this detid
Definition: DetId.h:46