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.
9 
10 #ifdef EDM_ML_DEBUG
23 #endif
24 
26 
28 
29  if(aTraj.empty()) return Trajectory();
30 
31  TM firstTM = aTraj.firstMeasurement();
32  TSOS firstTsos = TrajectoryStateWithArbitraryError()(firstTM.updatedState());
33 
34  return fitOne(aTraj.seed(), aTraj.recHits(), firstTsos,type);
35 }
36 
38  const RecHitContainer&, fitType) const{
39 
40  throw cms::Exception("TrackFitters",
41  "KFTrajectoryFitter::fit(TrajectorySeed, <TransientTrackingRecHit>) not implemented");
42 
43  return Trajectory();
44 }
45 
47  const RecHitContainer& hits,
48  const TSOS& firstPredTsos,fitType) const
49 {
50  if(hits.empty()) return Trajectory();
51 
52 
53  if unlikely(aSeed.direction() == anyDirection)
54  throw cms::Exception("KFTrajectoryFitter","TrajectorySeed::direction() requested but not set");
55 
56  std::unique_ptr<Propagator> p_cloned = SetPropagationDirection(*thePropagator,
57  aSeed.direction());
58 
59 #ifdef EDM_ML_DEBUG
60  LogDebug("TrackFitters")
61  <<" +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n"
62  <<" KFTrajectoryFitter::fit starting with " << hits.size() <<" HITS";
63 
64  for (unsigned int j=0;j<hits.size();j++) {
65  if (hits[j]->det())
66  LogTrace("TrackFitters") << "hit #:" << j+1 << " rawId=" << hits[j]->det()->geographicalId().rawId()
67  << " validity=" << hits[j]->isValid();
68  else
69  LogTrace("TrackFitters") << "hit #:" << j+1 << " Hit with no Det information";
70  }
71  LogTrace("TrackFitters") << " INITIAL STATE "<< firstPredTsos;
72 #endif
73 
74  Trajectory ret(aSeed, p_cloned->propagationDirection());
75  Trajectory & myTraj = ret;
76  myTraj.reserve(hits.size());
77 
78  TSOS predTsos(firstPredTsos);
79  TSOS currTsos;
80 
81  int hitcounter = 1;
82  for(RecHitContainer::const_iterator ihit = hits.begin(); ihit != hits.end(); ++ihit, ++hitcounter) {
83 
84  const TransientTrackingRecHit & hit = (**ihit);
85 
86  // if unlikely(hit.det() == nullptr) continue;
87 
88  if unlikely( (!hit.isValid()) && hit.surface() == nullptr) {
89  LogDebug("TrackFitters")<< " Error: invalid hit with no GeomDet attached .... skipping";
90  continue;
91  }
92  // if (hit.det() && hit.geographicalId()<1000U) LogDebug("TrackFitters")<< "Problem 0 det id for " << typeid(hit).name() << ' ' << hit.det()->geographicalId() ;
93  // if (hit.isValid() && hit.geographicalId()<1000U) LogDebug("TrackFitters")<< "Problem 0 det id for " << typeid(hit).name() << ' ' << hit.det()->geographicalId();
94 
95 #ifdef EDM_ML_DEBUG
96  if (hit.isValid()) {
97  LogTrace("TrackFitters")<< " ----------------- HIT #" << hitcounter << " (VALID)-----------------------\n"
98  << " HIT IS AT R " << hit.globalPosition().perp() << "\n"
99  << " HIT IS AT Z " << hit.globalPosition().z() << "\n"
100  << " HIT IS AT Phi " << hit.globalPosition().phi() << "\n"
101  << " HIT IS AT Loc " << hit.localPosition() << "\n"
102  << " WITH LocError " << hit.localPositionError() << "\n"
103  << " HIT IS AT Glo " << hit.globalPosition() << "\n"
104  << "SURFACE POSITION" << "\n"
105  << hit.surface()->position()<<"\n"
106  << "SURFACE ROTATION" << "\n"
107  << hit.surface()->rotation()
108  << "dimension " << hit.dimension();
109 
110  DetId hitId = hit.geographicalId();
111 
112  LogDebug("TrackFitters") << " hit det=" << hitId.rawId();
113 
114  if(hitId.det() == DetId::Tracker) {
115  if (hitId.subdetId() == StripSubdetector::TIB )
116  LogDebug("TrackFitters") << " I am TIB " << TIBDetId(hitId).layer();
117  else if (hitId.subdetId() == StripSubdetector::TOB )
118  LogDebug("TrackFitters") << " I am TOB " << TOBDetId(hitId).layer();
119  else if (hitId.subdetId() == StripSubdetector::TEC )
120  LogDebug("TrackFitters") << " I am TEC " << TECDetId(hitId).wheel();
121  else if (hitId.subdetId() == StripSubdetector::TID )
122  LogDebug("TrackFitters") << " I am TID " << TIDDetId(hitId).wheel();
123  else if (hitId.subdetId() == (int) PixelSubdetector::PixelBarrel )
124  LogDebug("TrackFitters") << " I am PixBar " << PXBDetId(hitId).layer();
125  else if (hitId.subdetId() == (int) PixelSubdetector::PixelEndcap )
126  LogDebug("TrackFitters") << " I am PixFwd " << PXFDetId(hitId).disk();
127  else
128  LogDebug("TrackFitters") << " UNKNOWN TRACKER HIT TYPE ";
129  }
130  else if(hitId.det() == DetId::Muon) {
131  if(hitId.subdetId() == MuonSubdetId::DT)
132  LogDebug("TrackFitters") << " I am DT " << DTWireId(hitId);
133  else if (hitId.subdetId() == MuonSubdetId::CSC )
134  LogDebug("TrackFitters") << " I am CSC " << CSCDetId(hitId);
135  else if (hitId.subdetId() == MuonSubdetId::RPC )
136  LogDebug("TrackFitters") << " I am RPC " << RPCDetId(hitId);
137  else if (hitId.subdetId() == MuonSubdetId::GEM )
138  LogDebug("TrackFitters") << " I am GEM " << GEMDetId(hitId);
139 
140  else if (hitId.subdetId() == MuonSubdetId::ME0 )
141  LogDebug("TrackFitters") << " I am ME0 " << ME0DetId(hitId);
142  else
143  LogDebug("TrackFitters") << " UNKNOWN MUON HIT TYPE ";
144  }
145  else
146  LogDebug("TrackFitters") << " UNKNOWN HIT TYPE ";
147 
148  } else {
149  LogDebug("TrackFitters")
150  << " ----------------- INVALID HIT #" << hitcounter << " -----------------------";
151  }
152 #endif
153 
154  if ( hitcounter != 1) //no propagation needed for the first hit
155  predTsos = p_cloned->propagate( currTsos, *(hit.surface()) );
156 
157 
158  if unlikely(!predTsos.isValid()) {
159  LogDebug("TrackFitters")
160  << "SOMETHING WRONG !" << "\n"
161  << "KFTrajectoryFitter: predicted tsos not valid!\n"
162  << "current TSOS: " << currTsos << "\n";
163 
164  if(hit.surface()) LogTrace("TrackFitters") << "next Surface: " << hit.surface()->position() << "\n";
165 
166  if( myTraj.foundHits() >= minHits_ ) {
167  LogDebug("TrackFitters") << " breaking trajectory" << "\n";
168  break;
169  } else {
170  LogDebug("TrackFitters") << " killing trajectory" << "\n";
171  return Trajectory();
172  }
173  }
174 
175 
176  if likely(hit.isValid()) {
177  assert( (hit.geographicalId()!=0U) | !hit.canImproveWithTrack() ) ;
178  assert(hit.surface()!=nullptr);
179  //update
180  LogTrace("TrackFitters") << "THE HIT IS VALID: updating hit with predTsos";
181  assert( (!(*ihit)->canImproveWithTrack()) | (nullptr!=theHitCloner));
182  assert( (!(*ihit)->canImproveWithTrack()) | (nullptr!=dynamic_cast<BaseTrackerRecHit const*>((*ihit).get())));
183  auto preciseHit = theHitCloner->makeShared(*ihit,predTsos);
184  assert(preciseHit->isValid());
185  assert( (preciseHit->geographicalId()!=0U) | (!preciseHit->canImproveWithTrack()) );
186  assert(preciseHit->surface()!=nullptr);
187 
188  if unlikely(!preciseHit->isValid()){
189  LogTrace("TrackFitters") << "THE Precise HIT IS NOT VALID: using currTsos = predTsos" << "\n";
190  currTsos = predTsos;
191  myTraj.push(TM(predTsos, *ihit,0,theGeometry->idToLayer((*ihit)->geographicalId()) ));
192 
193  }else{
194  LogTrace("TrackFitters") << "THE Precise HIT IS VALID: updating currTsos" << "\n";
195  currTsos = updator()->update(predTsos, *preciseHit);
196  //check for valid hits with no det (refitter with constraints)
197  bool badState = (!currTsos.isValid())
198  || (hit.geographicalId().det() == DetId::Tracker
199  &&
200  (std::abs(currTsos.localParameters().qbp())>100
201  || std::abs(currTsos.localParameters().position().y()) > 1000
202  || std::abs(currTsos.localParameters().position().x()) > 1000
203  ) ) || edm::isNotFinite(currTsos.localParameters().qbp());
204  if unlikely(badState){
205  if (!currTsos.isValid()) {
206  edm::LogError("FailedUpdate") <<"updating with the hit failed. Not updating the trajectory with the hit";
207 
208  }
209  else if (edm::isNotFinite(currTsos.localParameters().qbp())) {
210  edm::LogError("TrajectoryNaN")<<"Trajectory has NaN";
211 
212  }
213  else{
214  LogTrace("FailedUpdate")<<"updated state is valid but pretty bad, skipping. currTsos " <<currTsos<<"\n predTsos "<<predTsos;
215  }
216  myTraj.push(TM(predTsos, *ihit,0,theGeometry->idToLayer((*ihit)->geographicalId()) ));
217  //There is a no-fail policy here. So, it's time to give up
218  //Keep the traj with invalid TSOS so that it's clear what happened
219  if( myTraj.foundHits() >= minHits_ ) {
220  LogDebug("TrackFitters") << " breaking trajectory" << "\n";
221  break;
222  } else {
223  LogDebug("TrackFitters") << " killing trajectory" << "\n";
224  return Trajectory();
225  }
226  } else{
227  if (preciseHit->det()){
228  myTraj.push(TM(predTsos, currTsos, preciseHit,
229  estimator()->estimate(predTsos, *preciseHit).second,
230  theGeometry->idToLayer(preciseHit->geographicalId()) ));
231  }
232  else{
233  myTraj.push(TM(predTsos, currTsos, preciseHit,
234  estimator()->estimate(predTsos, *preciseHit).second));
235  }
236  }
237  }
238  } else {
239  //no update
240  LogDebug("TrackFitters") << "THE HIT IS NOT VALID: using currTsos" << "\n";
241  currTsos = predTsos;
242  assert( ((*ihit)->det()==nullptr) || (*ihit)->geographicalId()!=0U);
243  if ((*ihit)->det()) myTraj.push(TM(predTsos, *ihit,0,theGeometry->idToLayer((*ihit)->geographicalId()) ));
244  else myTraj.push(TM(predTsos, *ihit,0));
245  }
246  LogTrace("TrackFitters")
247  << "predTsos !" << "\n"
248  << predTsos
249  <<" with local position " << predTsos.localPosition()
250  <<"currTsos !" << "\n"
251  << currTsos
252  <<" with local position " << currTsos.localPosition();
253  }
254 
255  LogDebug("TrackFitters") << "Found 1 trajectory with " << myTraj.foundHits() << " valid hits\n";
256 
257  return ret;
258 }
259 
#define LogDebug(id)
PropagationDirection direction() const
bool empty() const
True if trajectory has no measurements.
Definition: Trajectory.h:299
type
Definition: HCALResponse.h:21
virtual int dimension() const =0
tuple ret
prodAgent to be discontinued
virtual const Surface * surface() const
T perp() const
Definition: PV3DBase.h:72
unsigned int layer() const
layer id
Definition: TOBDetId.h:39
TrajectorySeed const & seed() const
Access to the seed used to reconstruct the Trajectory.
Definition: Trajectory.h:330
const LocalTrajectoryParameters & localParameters() const
const TrajectoryStateUpdator * updator() const
LocalPoint position() const
Local x and y position coordinates.
assert(m_qm.get())
static const int GEM
Definition: MuonSubdetId.h:15
Geom::Phi< T > phi() const
Definition: PV3DBase.h:69
const MeasurementEstimator * estimator() const
T y() const
Definition: PV3DBase.h:63
ConstRecHitContainer recHits() const
Definition: Trajectory.h:258
TrajectoryMeasurement TM
virtual GlobalPoint globalPosition() const
unsigned int layer() const
layer id
Definition: PXBDetId.h:35
uint32_t rawId() const
get the raw id
Definition: DetId.h:43
#define unlikely(x)
U second(std::pair< T, U > const &p)
#define likely(x)
std::unique_ptr< Propagator > SetPropagationDirection(Propagator const &iprop, PropagationDirection dir)
static const int ME0
Definition: MuonSubdetId.h:16
virtual TrajectoryStateOnSurface update(const TrajectoryStateOnSurface &, const TrackingRecHit &) const =0
static const int CSC
Definition: MuonSubdetId.h:13
bool isNotFinite(T x)
Definition: isFinite.h:10
static const DetLayerGeometry dummyGeometry
T z() const
Definition: PV3DBase.h:64
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
int j
Definition: DBlmapReader.cc:9
int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:37
#define LogTrace(id)
unsigned int disk() const
disk id
Definition: PXFDetId.h:43
const DetLayerGeometry * theGeometry
Definition: DetId.h:18
TrajectoryMeasurement const & firstMeasurement() const
Definition: Trajectory.h:241
virtual LocalError localPositionError() const =0
virtual bool canImproveWithTrack() const
bool isValid() const
TrackingRecHit *operator()[[cms TrackingRecHit::ConstRecHitPointer makeShared(TrackingRecHit::ConstRecHitPointer const &hit, TrajectoryStateOnSurface const &tsos) const
Definition: TkCloner.h:22
unsigned int wheel() const
wheel id
Definition: TECDetId.h:52
unsigned int layer() const
layer id
Definition: TIBDetId.h:41
Trajectory fitOne(const Trajectory &aTraj, fitType) const
static const int RPC
Definition: MuonSubdetId.h:14
const Propagator * thePropagator
const RotationType & rotation() const
static const int DT
Definition: MuonSubdetId.h:12
TrajectoryStateOnSurface const & updatedState() const
DetId geographicalId() const
virtual const DetLayer * idToLayer(const DetId &detId) const
Detector det() const
get the detector field from this detid
Definition: DetId.h:35
T x() const
Definition: PV3DBase.h:62
virtual LocalPoint localPosition() const =0
const PositionType & position() const
Trajectory::RecHitContainer RecHitContainer
unsigned int wheel() const
wheel id
Definition: TIDDetId.h:50
TkCloner const * theHitCloner