CMS 3D CMS Logo

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