CMS 3D CMS Logo

GlobalTrajectoryBuilderBase.cc
Go to the documentation of this file.
1 
21 
22 //---------------
23 // C++ Headers --
24 //---------------
25 
26 #include <iostream>
27 #include <algorithm>
28 #include <limits>
29 
30 //-------------------------------
31 // Collaborating Class Headers --
32 //-------------------------------
33 
37 
42 
44 
49 
54 
61 
66 
69 
72 
73 //----------------
74 // Constructors --
75 //----------------
79  theLayerMeasurements(nullptr),theTrackTransformer(nullptr),theRegionBuilder(nullptr), theService(service),theGlbRefitter(nullptr) {
80 
81  theCategory = par.getUntrackedParameter<std::string>("Category", "Muon|RecoMuon|GlobalMuon|GlobalTrajectoryBuilderBase");
82 
83 
84  edm::ParameterSet trackMatcherPSet = par.getParameter<edm::ParameterSet>("GlobalMuonTrackMatcher");
85  theTrackMatcher = new GlobalMuonTrackMatcher(trackMatcherPSet,theService);
86 
87  theTrackerPropagatorName = par.getParameter<std::string>("TrackerPropagator");
88 
89  edm::ParameterSet trackTransformerPSet = par.getParameter<edm::ParameterSet>("TrackTransformer");
90  theTrackTransformer = new TrackTransformer(trackTransformerPSet);
91 
92  edm::ParameterSet regionBuilderPSet = par.getParameter<edm::ParameterSet>("MuonTrackingRegionBuilder");
93 
94  theRegionBuilder = new MuonTrackingRegionBuilder(regionBuilderPSet,iC);
95 
96  // TrackRefitter parameters
97  edm::ParameterSet refitterParameters = par.getParameter<edm::ParameterSet>("GlbRefitterParameters");
98  theGlbRefitter = new GlobalMuonRefitter(refitterParameters, theService, iC);
99 
100  theMuonHitsOption = refitterParameters.getParameter<int>("MuonHitsOption");
101  theRefitFlag = refitterParameters.getParameter<bool>("RefitFlag");
102 
103  theTrackerRecHitBuilderName = par.getParameter<std::string>("TrackerRecHitBuilder");
104  theMuonRecHitBuilderName = par.getParameter<std::string>("MuonRecHitBuilder");
105 
106  theRPCInTheFit = par.getParameter<bool>("RefitRPCHits");
107 
108  theTECxScale = par.getParameter<double>("ScaleTECxFactor");
109  theTECyScale = par.getParameter<double>("ScaleTECyFactor");
110  thePtCut = par.getParameter<double>("PtCut");
111  thePCut = par.getParameter<double>("PCut");
112 
113  theCacheId_TRH = 0;
114 
115 }
116 
117 
118 //--------------
119 // Destructor --
120 //--------------
122 
123  if (theTrackMatcher) delete theTrackMatcher;
126  if (theGlbRefitter) delete theGlbRefitter;
127 }
128 
129 
130 //
131 // set Event
132 //
134 
135  theEvent = &event;
136 
138  theRegionBuilder->setEvent(event);
139 
140  theGlbRefitter->setEvent(event);
142 
143  unsigned long long newCacheId_TRH = theService->eventSetup().get<TransientRecHitRecord>().cacheIdentifier();
144  if ( newCacheId_TRH != theCacheId_TRH ) {
145  LogDebug(theCategory) << "TransientRecHitRecord changed!";
146  theCacheId_TRH = newCacheId_TRH;
149  }
150 
151  //Retrieve tracker topology from geometry
153  theService->eventSetup().get<TrackerTopologyRcd>().get(tTopoHand);
154  theTopo=tTopoHand.product();
155 
156 }
157 
158 
159 //
160 // build a combined tracker-muon trajectory
161 //
164  MuonCandidate::CandidateContainer& tkTrajs ) const {
165 
166  LogTrace(theCategory) << " Begin Build" << std::endl;
167 
168  // tracker trajectory should be built and refit before this point
169  if ( tkTrajs.empty() ) return CandidateContainer();
170 
171  // add muon hits and refit/smooth trajectories
172  CandidateContainer refittedResult;
173  ConstRecHitContainer muonRecHits = getTransientRecHits(*(staCand.second));
174 
175  // check order of muon measurements
176  if ( (muonRecHits.size() > 1) &&
177  ( muonRecHits.front()->globalPosition().mag() >
178  muonRecHits.back()->globalPosition().mag() ) ) {
179  LogTrace(theCategory)<< " reverse order: ";
180  }
181 
182  for (auto&& it: tkTrajs){
183  // cut on tracks with low momenta
184  LogTrace(theCategory)<< " Track p and pT " << it->trackerTrack()->p() << " " << it->trackerTrack()->pt();
185  if( it->trackerTrack()->p() < thePCut || it->trackerTrack()->pt() < thePtCut ) continue;
186 
187  // If true we will run theGlbRefitter->refit from all hits
188  if (theRefitFlag){
189  ConstRecHitContainer trackerRecHits;
190  if (it->trackerTrack().isNonnull()) {
191  trackerRecHits = getTransientRecHits(*it->trackerTrack());
192  } else {
193  LogDebug(theCategory)<<" NEED HITS FROM TRAJ";
194  }
195 
196  // ToDo: Do we need the following ?:
197  // check for single TEC RecHits in trajectories in the overalp region
198  if ( std::abs(it->trackerTrack()->eta()) > 0.95 && std::abs(it->trackerTrack()->eta()) < 1.15 && it->trackerTrack()->pt() < 60 ) {
199  if ( theTECxScale < 0 || theTECyScale < 0 )
200  trackerRecHits = selectTrackerHits(trackerRecHits);
201  else
202  fixTEC(trackerRecHits,theTECxScale,theTECyScale);
203  }
204 
205  RefitDirection recHitDir = checkRecHitsOrdering(trackerRecHits);
206  if ( recHitDir == outToIn ) reverse(trackerRecHits.begin(),trackerRecHits.end());
207 
209  TrajectoryStateOnSurface innerTsos = tTT.innermostMeasurementState();
210 
212  if(it->trackerTrack()->seedRef().isAvailable()) tmpSeed = it->trackerTrack()->seedRef();
213 
214  if ( !innerTsos.isValid() ) {
215  LogTrace(theCategory) << " inner Trajectory State is invalid. ";
216  continue;
217  }
218 
219  innerTsos.rescaleError(100.);
220 
221  TC refitted0,refitted1;
222  MuonCandidate* finalTrajectory = nullptr;
223  Trajectory *tkTrajectory = nullptr;
224 
225  // tracker only track
226  if ( ! (it->trackerTrajectory() && it->trackerTrajectory()->isValid()) ) {
227  refitted0 = theTrackTransformer->transform(it->trackerTrack()) ;
228  if (!refitted0.empty()) tkTrajectory = new Trajectory(*(refitted0.begin()));
229  else edm::LogWarning(theCategory)<< " Failed to load tracker track trajectory";
230  } else tkTrajectory = it->trackerTrajectory();
231  if (tkTrajectory) tkTrajectory->setSeedRef(tmpSeed);
232 
233  // full track with all muon hits using theGlbRefitter
234  ConstRecHitContainer allRecHits = trackerRecHits;
235  allRecHits.insert(allRecHits.end(), muonRecHits.begin(),muonRecHits.end());
236  refitted1 = theGlbRefitter->refit( *it->trackerTrack(), tTT, allRecHits,theMuonHitsOption, theTopo);
237  LogTrace(theCategory)<<" This track-sta refitted to " << refitted1.size() << " trajectories";
238 
239  Trajectory *glbTrajectory1 = nullptr;
240  if (!refitted1.empty()) glbTrajectory1 = new Trajectory(*(refitted1.begin()));
241  else LogDebug(theCategory)<< " Failed to load global track trajectory 1";
242  if (glbTrajectory1) glbTrajectory1->setSeedRef(tmpSeed);
243 
244  finalTrajectory = nullptr;
245  if(glbTrajectory1 && tkTrajectory) finalTrajectory = new MuonCandidate(glbTrajectory1, it->muonTrack(), it->trackerTrack(),
246  tkTrajectory? new Trajectory(*tkTrajectory) : nullptr);
247 
248  if ( finalTrajectory ) refittedResult.push_back(finalTrajectory);
249  if(tkTrajectory) delete tkTrajectory;
250  }
251  else{
252  MuonCandidate* finalTrajectory = nullptr;
254  if(it->trackerTrack()->seedRef().isAvailable()) tmpSeed = it->trackerTrack()->seedRef();
255 
256  TC refitted0;
257  Trajectory *tkTrajectory = nullptr;
258  if ( ! (it->trackerTrajectory() && it->trackerTrajectory()->isValid()) ) {
259  refitted0 = theTrackTransformer->transform(it->trackerTrack());
260  if (!refitted0.empty()){
261  tkTrajectory = new Trajectory(*(refitted0.begin()));
262  }
263  else edm::LogWarning(theCategory)<< " Failed to load tracker track trajectory";
264  }
265  else tkTrajectory = it->trackerTrajectory();
266  if (tkTrajectory) tkTrajectory->setSeedRef(tmpSeed);
267  // Creating MuonCandidate using only the tracker trajectory:
268  finalTrajectory = new MuonCandidate(new Trajectory(*tkTrajectory), it->muonTrack(), it->trackerTrack(),new Trajectory(*tkTrajectory));
269  if (finalTrajectory) refittedResult.push_back(finalTrajectory);
270  if(tkTrajectory) delete tkTrajectory;
271  }
272  }
273 
274  // choose the best global fit for this Standalone Muon based on the track probability
275  CandidateContainer selectedResult;
276  MuonCandidate* tmpCand = nullptr;
277  if ( !refittedResult.empty() ) tmpCand = *(refittedResult.begin());
279 
280  for (auto&& iter: refittedResult){
281  double prob = trackProbability(*iter->trajectory());
282  LogTrace(theCategory)<<" refitted-track-sta with pT " << iter->trackerTrack()->pt() << " has probability " << prob;
283 
284  if (prob < minProb) {
285  minProb = prob;
286  tmpCand = iter;
287  }
288  }
289 
290  if ( tmpCand ) selectedResult.push_back(new MuonCandidate(new Trajectory(*(tmpCand->trajectory())), tmpCand->muonTrack(), tmpCand->trackerTrack(),
291  (tmpCand->trackerTrajectory())? new Trajectory( *(tmpCand->trackerTrajectory()) ):nullptr ) );
292 
293  for (auto&& it: refittedResult){
294  if ( it->trajectory() ) delete it->trajectory();
295  if ( it->trackerTrajectory() ) delete it->trackerTrajectory();
296  if ( it ) delete it;
297  }
298  refittedResult.clear();
299 
300  return selectedResult;
301 
302 }
303 
304 
305 //
306 // select tracker tracks within a region of interest
307 //
308 std::vector<GlobalTrajectoryBuilderBase::TrackCand>
310  const std::vector<TrackCand>& tkTs) {
311 
312  // define eta-phi region
313  RectangularEtaPhiTrackingRegion regionOfInterest = defineRegionOfInterest(staCand.second);
314 
315  // get region's etaRange and phiMargin
316  //UNUSED: PixelRecoRange<float> etaRange = regionOfInterest.etaRange();
317  //UNUSED: TkTrackingRegionsMargin<float> phiMargin = regionOfInterest.phiMargin();
318 
319  std::vector<TrackCand> result;
320 
321  double deltaR_max = 1.0;
322 
323  for (auto&& is: tkTs){
324  double deltaR_tmp = deltaR(static_cast<double>(regionOfInterest.direction().eta()),
325  static_cast<double>(regionOfInterest.direction().phi()),
326  is.second->eta(), is.second->phi());
327 
328  // for each trackCand in region, add trajectory and add to result
329  //if ( inEtaRange && inPhiRange ) {
330  if (deltaR_tmp < deltaR_max) {
331  TrackCand tmpCand = TrackCand(is);
332  result.push_back(tmpCand);
333  }
334  }
335 
336  return result;
337 
338 }
339 
340 
341 //
342 // define a region of interest within the tracker
343 //
346 
347  std::unique_ptr<RectangularEtaPhiTrackingRegion> region1 = theRegionBuilder->region(staTrack);
348 
349  TkTrackingRegionsMargin<float> etaMargin(std::abs(region1->etaRange().min() - region1->etaRange().mean()),
350  std::abs(region1->etaRange().max() - region1->etaRange().mean()));
351 
352  RectangularEtaPhiTrackingRegion region2(region1->direction(),
353  region1->origin(),
354  region1->ptMin(),
355  region1->originRBound(),
356  region1->originZBound(),
357  etaMargin,
358  region1->phiMargin());
359 
360  return region2;
361 
362 }
363 
364 
365 //
366 // calculate the tail probability (-ln(P)) of a fit
367 //
368 double
370 
371  if ( track.ndof() > 0 && track.chiSquared() > 0 ) {
372  return -LnChiSquaredProbability(track.chiSquared(), track.ndof());
373  } else {
374  return 0.0;
375  }
376 
377 }
378 
379 
380 //
381 // print RecHits
382 //
384 
385  LogTrace(theCategory) << "Used RecHits: " << hits.size();
386  for (auto&& ir: hits){
387  if ( !ir->isValid() ) {
388  LogTrace(theCategory) << "invalid RecHit";
389  continue;
390  }
391 
392  const GlobalPoint& pos = ir->globalPosition();
393 
395  << "r = " << sqrt(pos.x() * pos.x() + pos.y() * pos.y())
396  << " z = " << pos.z()
397  << " dimension = " << ir->dimension()
398  << " " << ir->det()->geographicalId().det()
399  << " " << ir->det()->subDetector();
400 
401  }
402 
403 }
404 
405 //
406 // check order of RechIts on a trajectory
407 //
410 
411  if ( !recHits.empty() ) {
412  ConstRecHitContainer::const_iterator frontHit = recHits.begin();
413  ConstRecHitContainer::const_iterator backHit = recHits.end() - 1;
414  while ( !(*frontHit)->isValid() && frontHit != backHit ) {frontHit++;}
415  while ( !(*backHit)->isValid() && backHit != frontHit ) {backHit--;}
416 
417  double rFirst = (*frontHit)->globalPosition().mag();
418  double rLast = (*backHit) ->globalPosition().mag();
419 
420  if ( rFirst < rLast ) return inToOut;
421  else if (rFirst > rLast) return outToIn;
422  else {
423  edm::LogError(theCategory) << "Impossible to determine the rechits order" << std::endl;
424  return undetermined;
425  }
426  }
427  else {
428  edm::LogError(theCategory) << "Impossible to determine the rechits order" << std::endl;
429  return undetermined;
430  }
431 }
432 
433 
434 //
435 // select trajectories with only a single TEC hit
436 //
439 
440  int nTEC(0);
441 
443  for (auto&& i: all){
444  if ( !i->isValid() ) continue;
445  if ( i->det()->geographicalId().det() == DetId::Tracker &&
446  i->det()->geographicalId().subdetId() == StripSubdetector::TEC) {
447  nTEC++;
448  } else {
449  hits.push_back(i);
450  }
451  if ( nTEC > 1 ) return all;
452  }
453 
454  return hits;
455 
456 }
457 
458 
459 //
460 // rescale errors of outermost TEC RecHit
461 //
463  double scl_x,
464  double scl_y) const {
465 
466  int nTEC(0);
467  ConstRecHitContainer::iterator lone_tec;
468 
469  for ( ConstRecHitContainer::iterator i = all.begin(); i != all.end(); i++) {
470  if ( !(*i)->isValid() ) continue;
471 
472  if ( (*i)->det()->geographicalId().det() == DetId::Tracker &&
473  (*i)->det()->geographicalId().subdetId() == StripSubdetector::TEC) {
474  lone_tec = i;
475  nTEC++;
476 
477  if ( (i+1) != all.end() && (*(i+1))->isValid() &&
478  (*(i+1))->det()->geographicalId().det() == DetId::Tracker &&
479  (*(i+1))->det()->geographicalId().subdetId() == StripSubdetector::TEC) {
480  nTEC++;
481  break;
482  }
483  }
484 
485  if (nTEC > 1) break;
486  }
487 
488  int hitDet = (*lone_tec)->hit()->geographicalId().det();
489  int hitSubDet = (*lone_tec)->hit()->geographicalId().subdetId();
490  if ( nTEC == 1 && (*lone_tec)->hit()->isValid() &&
491  hitDet == DetId::Tracker && hitSubDet == StripSubdetector::TEC) {
492 
493  // rescale the TEC rechit error matrix in its rotated frame
494  const SiStripRecHit2D* strip = dynamic_cast<const SiStripRecHit2D*>((*lone_tec)->hit());
495  if (strip && strip->det() ) {
496  LocalPoint pos = strip->localPosition();
497  if ((*lone_tec)->detUnit()) {
498  const StripTopology* topology = dynamic_cast<const StripTopology*>(&(*lone_tec)->detUnit()->topology());
499  if (topology) {
500  // rescale the local error along/perp the strip by a factor
501  float angle = topology->stripAngle(topology->strip((*lone_tec)->hit()->localPosition()));
503  LocalError rotError = error.rotate(angle);
504  LocalError scaledError(rotError.xx() * scl_x * scl_x, 0, rotError.yy() * scl_y * scl_y);
505  error = scaledError.rotate(-angle);
510  SiStripRecHit2D* st = new SiStripRecHit2D(pos,error,
511  *strip->det(),
512  strip->cluster());
513  *lone_tec = MuonTransientTrackingRecHit::build((*lone_tec)->det(),st);
514 
515  }
516  }
517  }
518  }
519 
520 }
521 
522 
524 //
525 // get transient RecHits
526 //
529 
531 
532 
533 
535 
536  auto tkbuilder = static_cast<TkTransientTrackingRecHitBuilder const *>(theTrackerRecHitBuilder.product());
537  auto hitCloner = tkbuilder->cloner();
538  for (trackingRecHit_iterator hit = track.recHitsBegin(); hit != track.recHitsEnd(); ++hit) {
539  if((*hit)->isValid()) {
540  DetId recoid = (*hit)->geographicalId();
541  if ( recoid.det() == DetId::Tracker ) {
542  if (!(*hit)->hasPositionAndError()){
544 
545  if ( !predTsos.isValid() ) {
546  edm::LogError("MissingTransientHit")
547  <<"Could not get a tsos on the hit surface. We will miss a tracking hit.";
548  continue;
549  }
550  currTsos = predTsos;
551  auto h = (**hit).cloneForFit(*tkbuilder->geometry()->idToDet( (**hit).geographicalId() ) );
552  result.emplace_back(hitCloner.makeShared(h,predTsos));
553  }else{
554  result.push_back((*hit)->cloneSH());
555  }
556  } else if ( recoid.det() == DetId::Muon ) {
557  if ( (*hit)->geographicalId().subdetId() == 3 && !theRPCInTheFit) {
558  LogDebug(theCategory) << "RPC Rec Hit discarded";
559  continue;
560  }
561  result.push_back(theMuonRecHitBuilder->build(&**hit));
562  }
563  }
564  }
565 
566  return result;
567 }
#define LogDebug(id)
const reco::TrackRef muonTrack() const
return muon track
Definition: MuonCandidate.h:43
T getParameter(std::string const &) const
MuonCandidate::CandidateContainer CandidateContainer
void printHits(const ConstRecHitContainer &) const
print all RecHits of a trajectory
T getUntrackedParameter(std::string const &, T const &) const
float xx() const
Definition: LocalError.h:24
const edm::EventSetup & eventSetup() const
get the whole EventSetup
ConstRecHitContainer selectTrackerHits(const ConstRecHitContainer &) const
select tracker hits; exclude some tracker hits in the global trajectory
void setServices(const edm::EventSetup &) override
set the services needed by the TrackTransformer
LocalError localPositionError() const final
std::pair< const Trajectory *, reco::TrackRef > TrackCand
FWCore Framework interface EventSetupRecordImplementation h
Helper function to determine trigger accepts.
CaloTopology const * topology(0)
edm::ESHandle< TransientTrackingRecHitBuilder > theMuonRecHitBuilder
float LnChiSquaredProbability(double chiSquared, double nrDOF)
virtual void setEvent(const edm::Event &)
Pass the Event to the algo at each event.
#define nullptr
Geom::Phi< T > phi() const
Definition: PV3DBase.h:69
T y() const
Definition: PV3DBase.h:63
virtual float strip(const LocalPoint &) const =0
void setServices(const edm::EventSetup &)
set the services needed by the TrackTransformer
std::vector< TrackCand > chooseRegionalTrackerTracks(const TrackCand &, const std::vector< TrackCand > &)
choose tracker tracks within region of interest
edm::ESHandle< MagneticField > magneticField() const
get the magnetic field
const Plane & surface() const
The nominal surface of the GeomDet.
Definition: GeomDet.h:42
~GlobalTrajectoryBuilderBase() override
destructor
std::unique_ptr< RectangularEtaPhiTrackingRegion > region(const reco::TrackRef &) const
Define tracking region.
const reco::TrackRef trackerTrack() const
return tracker track
Definition: MuonCandidate.h:46
void fixTEC(ConstRecHitContainer &all, double scl_x, double scl_y) const
rescale errors of outermost TEC RecHit
GlobalVector const & direction() const
the direction around which region is constructed
double trackProbability(const Trajectory &) const
calculate chi2 probability (-ln(P))
float yy() const
Definition: LocalError.h:26
virtual float stripAngle(float strip) const =0
const GeomDet * det() const
T sqrt(T t)
Definition: SSEVec.h:18
Trajectory * trackerTrajectory() const
return tracker trajectory
Definition: MuonCandidate.h:49
T z() const
Definition: PV3DBase.h:64
TransientTrackingRecHit::ConstRecHitContainer getTransientRecHits(const reco::Track &) const
get transient RecHits of a Track
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
ClusterRef cluster() const
void setEvent(const edm::Event &) override
pass the Event to the algo at each event
trackingRecHit_iterator recHitsBegin() const
Iterator to first hit on the track.
Definition: Track.h:109
std::vector< Trajectory > transform(const reco::Track &) const override
Convert a reco::Track into Trajectory.
std::vector< MuonCandidate * > CandidateContainer
Definition: MuonCandidate.h:20
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger but the state exists so we define the behavior If all triggers are the negative crieriion will lead to accepting the event(this again matches the behavior of"!*"before the partial wildcard feature was incorporated).The per-event"cost"of each negative criterion with multiple relevant triggers is about the same as!*was in the past
#define LogTrace(id)
virtual RecHitPointer build(const TrackingRecHit *p) const =0
build a tracking rechit from an existing rechit
TransientTrackingRecHit::ConstRecHitContainer ConstRecHitContainer
std::vector< ConstRecHitPointer > ConstRecHitContainer
GlobalTrajectoryBuilderBase(const edm::ParameterSet &, const MuonServiceProxy *, edm::ConsumesCollector &)
constructor with Parameter Set and MuonServiceProxy
virtual void setEvent(const edm::Event &)
pass the Event to the algo at each event
Definition: DetId.h:18
int ndof(bool bon=true) const
Definition: Trajectory.cc:102
GlobalMuonTrackMatcher * theTrackMatcher
MuonTrajectoryBuilder::CandidateContainer build(const TrackCand &, MuonTrajectoryBuilder::CandidateContainer &) const
build combined trajectory from sta Track and tracker RecHits
TrajectoryStateOnSurface propagate(STA const &state, SUR const &surface) const
Definition: Propagator.h:53
void setSeedRef(const edm::RefToBase< TrajectorySeed > &seedRef)
Definition: Trajectory.h:323
float chiSquared() const
Definition: Trajectory.h:262
RectangularEtaPhiTrackingRegion defineRegionOfInterest(const reco::TrackRef &) const
define region of interest with tracker
edm::ESHandle< GlobalTrackingGeometry > trackingGeometry() const
get the tracking geometry
T eta() const
Definition: PV3DBase.h:76
T get() const
Definition: EventSetup.h:71
const GeomDet * idToDet(DetId) const override
RefitDirection checkRecHitsOrdering(const ConstRecHitContainer &) const
This does nothing now.
LocalPoint localPosition() const final
MuonTrackingRegionBuilder * theRegionBuilder
Trajectory * trajectory() const
return trajectory
Definition: MuonCandidate.h:40
LocalError rotate(float x, float y) const
Return a new LocalError, rotated by an angle defined by the direction (x,y)
Definition: LocalError.h:39
T x() const
Definition: PV3DBase.h:62
T const * product() const
Definition: ESHandle.h:86
static RecHitPointer build(const GeomDet *geom, const TrackingRecHit *rh)
FIXME virtual ConstMuonRecHitContainer specificTransientHits() const;.
std::vector< Trajectory > refit(const reco::Track &globalTrack, const int theMuonHitsOption, const TrackerTopology *tTopo) const
build combined trajectory from sta Track and tracker RecHits
edm::ESHandle< Propagator > propagator(std::string propagatorName) const
get the propagator
edm::ESHandle< TransientTrackingRecHitBuilder > theTrackerRecHitBuilder
Definition: event.py:1
TrajectoryStateOnSurface innerStateOnSurface(const reco::Track &tk, const TrackingGeometry &geom, const MagneticField *field, bool withErr=true)
constexpr Detector det() const
get the detector field from this detid
Definition: DetId.h:39
T angle(T x1, T y1, T z1, T x2, T y2, T z2)
Definition: angle.h:11
trackingRecHit_iterator recHitsEnd() const
Iterator to last hit on the track.
Definition: Track.h:114