CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
GlobalTrajectoryBuilderBase.cc
Go to the documentation of this file.
1 
27 
28 //---------------
29 // C++ Headers --
30 //---------------
31 
32 #include <iostream>
33 #include <algorithm>
34 
35 //-------------------------------
36 // Collaborating Class Headers --
37 //-------------------------------
38 
42 
49 
51 
56 
60 
62 
69 
76 
79 
83 
84 using namespace std;
85 using namespace edm;
86 
87 //----------------
88 // Constructors --
89 //----------------
91  const MuonServiceProxy* service) :
92  theTrackMatcher(0),theLayerMeasurements(0),theTrackTransformer(0),theRegionBuilder(0), theService(service),theGlbRefitter(0) {
93 
94  theCategory = par.getUntrackedParameter<string>("Category", "Muon|RecoMuon|GlobalMuon|GlobalTrajectoryBuilderBase");
95 
96 
97  ParameterSet trackMatcherPSet = par.getParameter<ParameterSet>("GlobalMuonTrackMatcher");
98  theTrackMatcher = new GlobalMuonTrackMatcher(trackMatcherPSet,theService);
99 
100  theTrackerPropagatorName = par.getParameter<string>("TrackerPropagator");
101 
102  ParameterSet trackTransformerPSet = par.getParameter<ParameterSet>("TrackTransformer");
103  theTrackTransformer = new TrackTransformer(trackTransformerPSet);
104 
105  ParameterSet regionBuilderPSet = par.getParameter<ParameterSet>("MuonTrackingRegionBuilder");
106 
107  theRegionBuilder = new MuonTrackingRegionBuilder(regionBuilderPSet,theService);
108 
109  // TrackRefitter parameters
110  ParameterSet refitterParameters = par.getParameter<ParameterSet>("GlbRefitterParameters");
111  theGlbRefitter = new GlobalMuonRefitter(refitterParameters, theService);
112 
113  theMuonHitsOption = refitterParameters.getParameter<int>("MuonHitsOption");
114 
115  theTrackerRecHitBuilderName = par.getParameter<string>("TrackerRecHitBuilder");
116  theMuonRecHitBuilderName = par.getParameter<string>("MuonRecHitBuilder");
117 
118  theRPCInTheFit = par.getParameter<bool>("RefitRPCHits");
119 
120  theTECxScale = par.getParameter<double>("ScaleTECxFactor");
121  theTECyScale = par.getParameter<double>("ScaleTECyFactor");
122  thePtCut = par.getParameter<double>("PtCut");
123  thePCut = par.getParameter<double>("PCut");
124 
125  theCacheId_TRH = 0;
126 
127 }
128 
129 
130 //--------------
131 // Destructor --
132 //--------------
134 
135  if (theTrackMatcher) delete theTrackMatcher;
138  if (theGlbRefitter) delete theGlbRefitter;
139 }
140 
141 
142 //
143 // set Event
144 //
146 
147  theEvent = &event;
148 
150  theRegionBuilder->setEvent(event);
151 
152  theGlbRefitter->setEvent(event);
153  theGlbRefitter->setServices(theService->eventSetup());
154 
155  unsigned long long newCacheId_TRH = theService->eventSetup().get<TransientRecHitRecord>().cacheIdentifier();
156  if ( newCacheId_TRH != theCacheId_TRH ) {
157  LogDebug(theCategory) << "TransientRecHitRecord changed!";
158  theCacheId_TRH = newCacheId_TRH;
161  }
162 
163 }
164 
165 
166 //
167 // build a combined tracker-muon trajectory
168 //
171  MuonCandidate::CandidateContainer& tkTrajs) const {
172 
173  LogTrace(theCategory) << " Begin Build" << endl;
174 
175  // tracker trajectory should be built and refit before this point
176  if ( tkTrajs.empty() ) return CandidateContainer();
177 
178  // add muon hits and refit/smooth trajectories
179  CandidateContainer refittedResult;
180  ConstRecHitContainer muonRecHits = getTransientRecHits(*(staCand.second));
181 
182  // check order of muon measurements
183  if ( (muonRecHits.size() > 1) &&
184  ( muonRecHits.front()->globalPosition().mag() >
185  muonRecHits.back()->globalPosition().mag() ) ) {
186  LogTrace(theCategory)<< " reverse order: ";
187  }
188 
189  for ( CandidateContainer::const_iterator it = tkTrajs.begin(); it != tkTrajs.end(); it++ ) {
190 
191  // cut on tracks with low momenta
192  LogTrace(theCategory)<< " Track p and pT " << (*it)->trackerTrack()->p() << " " << (*it)->trackerTrack()->pt();
193  if( (*it)->trackerTrack()->p() < thePCut || (*it)->trackerTrack()->pt() < thePtCut ) continue;
194 
195  ConstRecHitContainer trackerRecHits;
196  if ((*it)->trackerTrack().isNonnull()) {
197  trackerRecHits = getTransientRecHits(*(*it)->trackerTrack());
198  } else {
199  LogDebug(theCategory)<<" NEED HITS FROM TRAJ";
200  //trackerRecHits = (*it)->trackerTrajectory()->recHits();
201  }
202 
203  // check for single TEC RecHits in trajectories in the overalp region
204  if ( fabs((*it)->trackerTrack()->eta()) > 0.95 && fabs((*it)->trackerTrack()->eta()) < 1.15 && (*it)->trackerTrack()->pt() < 60 ) {
205  if ( theTECxScale < 0 || theTECyScale < 0 )
206  trackerRecHits = selectTrackerHits(trackerRecHits);
207  else
208  fixTEC(trackerRecHits,theTECxScale,theTECyScale);
209  }
210 
211  RefitDirection recHitDir = checkRecHitsOrdering(trackerRecHits);
212  if ( recHitDir == outToIn ) reverse(trackerRecHits.begin(),trackerRecHits.end());
213 
214  reco::TransientTrack tTT((*it)->trackerTrack(),&*theService->magneticField(),theService->trackingGeometry());
215  TrajectoryStateOnSurface innerTsos = tTT.innermostMeasurementState();
216 
218  if((*it)->trackerTrack()->seedRef().isAvailable()) tmpSeed = (*it)->trackerTrack()->seedRef();
219 
220  if ( !innerTsos.isValid() ) {
221  LogTrace(theCategory) << " inner Trajectory State is invalid. ";
222  continue;
223  }
224 
225  innerTsos.rescaleError(100.);
226 
227  TC refitted0,refitted1;
228  MuonCandidate* finalTrajectory = 0;
229  Trajectory *tkTrajectory = 0;
230 
231  // tracker only track
232  if ( ! ((*it)->trackerTrajectory() && (*it)->trackerTrajectory()->isValid()) ) {
233  refitted0 = theTrackTransformer->transform((*it)->trackerTrack()) ;
234  if (!refitted0.empty()) tkTrajectory = new Trajectory(*(refitted0.begin()));
235  else LogWarning(theCategory)<< " Failed to load tracker track trajectory";
236  } else tkTrajectory = (*it)->trackerTrajectory();
237  if (tkTrajectory) tkTrajectory->setSeedRef(tmpSeed);
238 
239  // full track with all muon hits using theGlbRefitter
240  ConstRecHitContainer allRecHits = trackerRecHits;
241  allRecHits.insert(allRecHits.end(), muonRecHits.begin(),muonRecHits.end());
242  refitted1 = theGlbRefitter->refit( *(*it)->trackerTrack(), tTT, allRecHits,theMuonHitsOption);
243  LogTrace(theCategory)<<" This track-sta refitted to " << refitted1.size() << " trajectories";
244 
245  Trajectory *glbTrajectory1 = 0;
246  if (!refitted1.empty()) glbTrajectory1 = new Trajectory(*(refitted1.begin()));
247  else LogDebug(theCategory)<< " Failed to load global track trajectory 1";
248  if (glbTrajectory1) glbTrajectory1->setSeedRef(tmpSeed);
249 
250  finalTrajectory = 0;
251  if(glbTrajectory1 && tkTrajectory) finalTrajectory = new MuonCandidate(glbTrajectory1, (*it)->muonTrack(), (*it)->trackerTrack(),
252  tkTrajectory? new Trajectory(*tkTrajectory) : 0);
253 
254  if ( finalTrajectory )
255  refittedResult.push_back(finalTrajectory);
256 
257  if(tkTrajectory) delete tkTrajectory;
258  }
259 
260  // choose the best global fit for this Standalone Muon based on the track probability
261  CandidateContainer selectedResult;
262  MuonCandidate* tmpCand = 0;
263  if ( refittedResult.size() > 0 ) tmpCand = *(refittedResult.begin());
264  double minProb = 9999;
265 
266  for (CandidateContainer::const_iterator iter=refittedResult.begin(); iter != refittedResult.end(); iter++) {
267  double prob = trackProbability(*(*iter)->trajectory());
268  LogTrace(theCategory)<<" refitted-track-sta with pT " << (*iter)->trackerTrack()->pt() << " has probability " << prob;
269 
270  if (prob < minProb) {
271  minProb = prob;
272  tmpCand = (*iter);
273  }
274  }
275 
276  if ( tmpCand ) selectedResult.push_back(new MuonCandidate(new Trajectory(*(tmpCand->trajectory())), tmpCand->muonTrack(), tmpCand->trackerTrack(),
277  (tmpCand->trackerTrajectory())? new Trajectory( *(tmpCand->trackerTrajectory()) ):0 ) );
278 
279  for (CandidateContainer::const_iterator it = refittedResult.begin(); it != refittedResult.end(); ++it) {
280  if ( (*it)->trajectory() ) delete (*it)->trajectory();
281  if ( (*it)->trackerTrajectory() ) delete (*it)->trackerTrajectory();
282  if ( *it ) delete (*it);
283  }
284  refittedResult.clear();
285 
286  return selectedResult;
287 
288 }
289 
290 
291 //
292 // select tracker tracks within a region of interest
293 //
294 vector<GlobalTrajectoryBuilderBase::TrackCand>
296  const vector<TrackCand>& tkTs) {
297 
298  // define eta-phi region
299  RectangularEtaPhiTrackingRegion regionOfInterest = defineRegionOfInterest(staCand.second);
300 
301  // get region's etaRange and phiMargin
302  //UNUSED: PixelRecoRange<float> etaRange = regionOfInterest.etaRange();
303  //UNUSED: TkTrackingRegionsMargin<float> phiMargin = regionOfInterest.phiMargin();
304 
305  vector<TrackCand> result;
306 
307  double deltaR_max = 1.0;
308 
309  for ( vector<TrackCand>::const_iterator is = tkTs.begin(); is != tkTs.end(); ++is ) {
310  // check if each trackCand is in region of interest
311 // bool inEtaRange = etaRange.inside(is->second->eta());
312 // bool inPhiRange = (fabs(Geom::Phi<float>(is->second->phi()) - Geom::Phi<float>(regionOfInterest.direction().phi())) < phiMargin.right() ) ? true : false ;
313 
314  double deltaR_tmp = deltaR(static_cast<double>(regionOfInterest.direction().eta()),
315  static_cast<double>(regionOfInterest.direction().phi()),
316  is->second->eta(), is->second->phi());
317 
318  // for each trackCand in region, add trajectory and add to result
319  //if ( inEtaRange && inPhiRange ) {
320  if (deltaR_tmp < deltaR_max) {
321  TrackCand tmpCand = TrackCand(*is);
322  result.push_back(tmpCand);
323  }
324  }
325 
326  return result;
327 
328 }
329 
330 
331 //
332 // define a region of interest within the tracker
333 //
336 
338 
339  TkTrackingRegionsMargin<float> etaMargin(fabs(region1->etaRange().min() - region1->etaRange().mean()),
340  fabs(region1->etaRange().max() - region1->etaRange().mean()));
341 
342  RectangularEtaPhiTrackingRegion region2(region1->direction(),
343  region1->origin(),
344  region1->ptMin(),
345  region1->originRBound(),
346  region1->originZBound(),
347  etaMargin,
348  region1->phiMargin());
349 
350  delete region1;
351  return region2;
352 
353 }
354 
355 
356 //
357 // calculate the tail probability (-ln(P)) of a fit
358 //
359 double
361 
362  if ( track.ndof() > 0 && track.chiSquared() > 0 ) {
363  return -LnChiSquaredProbability(track.chiSquared(), track.ndof());
364  } else {
365  return 0.0;
366  }
367 
368 }
369 
370 
371 //
372 // print RecHits
373 //
375 
376  LogTrace(theCategory) << "Used RecHits: " << hits.size();
377  for (ConstRecHitContainer::const_iterator ir = hits.begin(); ir != hits.end(); ir++ ) {
378  if ( !(*ir)->isValid() ) {
379  LogTrace(theCategory) << "invalid RecHit";
380  continue;
381  }
382 
383  const GlobalPoint& pos = (*ir)->globalPosition();
384 
386  << "r = " << sqrt(pos.x() * pos.x() + pos.y() * pos.y())
387  << " z = " << pos.z()
388  << " dimension = " << (*ir)->dimension()
389  << " " << (*ir)->det()->geographicalId().det()
390  << " " << (*ir)->det()->subDetector();
391 
392  }
393 
394 }
395 
396 //
397 // check order of RechIts on a trajectory
398 //
401 
402  if ( !recHits.empty() ) {
403  ConstRecHitContainer::const_iterator frontHit = recHits.begin();
404  ConstRecHitContainer::const_iterator backHit = recHits.end() - 1;
405  while ( !(*frontHit)->isValid() && frontHit != backHit ) {frontHit++;}
406  while ( !(*backHit)->isValid() && backHit != frontHit ) {backHit--;}
407 
408  double rFirst = (*frontHit)->globalPosition().mag();
409  double rLast = (*backHit) ->globalPosition().mag();
410 
411  if ( rFirst < rLast ) return inToOut;
412  else if (rFirst > rLast) return outToIn;
413  else {
414  LogError(theCategory) << "Impossible to determine the rechits order" << endl;
415  return undetermined;
416  }
417  }
418  else {
419  LogError(theCategory) << "Impossible to determine the rechits order" << endl;
420  return undetermined;
421  }
422 }
423 
424 
425 //
426 // select trajectories with only a single TEC hit
427 //
430 
431  int nTEC(0);
432 
434  for (ConstRecHitContainer::const_iterator i = all.begin(); i != all.end(); i++) {
435  if ( !(*i)->isValid() ) continue;
436  if ( (*i)->det()->geographicalId().det() == DetId::Tracker &&
437  (*i)->det()->geographicalId().subdetId() == StripSubdetector::TEC) {
438  nTEC++;
439  } else {
440  hits.push_back((*i).get());
441  }
442  if ( nTEC > 1 ) return all;
443  }
444 
445  return hits;
446 
447 }
448 
449 
450 //
451 // rescale errors of outermost TEC RecHit
452 //
454  double scl_x,
455  double scl_y) const {
456 
457  int nTEC(0);
458  ConstRecHitContainer::iterator lone_tec;
459 
460  for ( ConstRecHitContainer::iterator i = all.begin(); i != all.end(); i++) {
461  if ( !(*i)->isValid() ) continue;
462 
463  if ( (*i)->det()->geographicalId().det() == DetId::Tracker &&
464  (*i)->det()->geographicalId().subdetId() == StripSubdetector::TEC) {
465  lone_tec = i;
466  nTEC++;
467 
468  if ( (i+1) != all.end() && (*(i+1))->isValid() &&
469  (*(i+1))->det()->geographicalId().det() == DetId::Tracker &&
470  (*(i+1))->det()->geographicalId().subdetId() == StripSubdetector::TEC) {
471  nTEC++;
472  break;
473  }
474  }
475 
476  if (nTEC > 1) break;
477  }
478 
479  int hitDet = (*lone_tec)->hit()->geographicalId().det();
480  int hitSubDet = (*lone_tec)->hit()->geographicalId().subdetId();
481  if ( nTEC == 1 && (*lone_tec)->hit()->isValid() &&
482  hitDet == DetId::Tracker && hitSubDet == StripSubdetector::TEC) {
483 
484  // rescale the TEC rechit error matrix in its rotated frame
485  const SiStripRecHit2D* strip = dynamic_cast<const SiStripRecHit2D*>((*lone_tec)->hit());
486  const TSiStripRecHit2DLocalPos* Tstrip = dynamic_cast<const TSiStripRecHit2DLocalPos*>((*lone_tec).get());
487  if (strip && Tstrip->det() && Tstrip) {
488  LocalPoint pos = Tstrip->localPosition();
489  if ((*lone_tec)->detUnit()) {
490  const StripTopology* topology = dynamic_cast<const StripTopology*>(&(*lone_tec)->detUnit()->topology());
491  if (topology) {
492  // rescale the local error along/perp the strip by a factor
493  float angle = topology->stripAngle(topology->strip((*lone_tec)->hit()->localPosition()));
494  LocalError error = Tstrip->localPositionError();
495  LocalError rotError = error.rotate(angle);
496  LocalError scaledError(rotError.xx() * scl_x * scl_x, 0, rotError.yy() * scl_y * scl_y);
497  error = scaledError.rotate(-angle);
498  MuonTransientTrackingRecHit* mtt_rechit;
499  if (strip->cluster().isNonnull()) {
503  SiStripRecHit2D* st = new SiStripRecHit2D(pos,error,
504  (*lone_tec)->geographicalId().rawId(),
505  strip->cluster());
506  *lone_tec = mtt_rechit->build((*lone_tec)->det(),st);
507  }
508  else {
509  SiStripRecHit2D* st = new SiStripRecHit2D(pos,error,
510  (*lone_tec)->geographicalId().rawId(),
511  strip->cluster_regional());
512  *lone_tec = mtt_rechit->build((*lone_tec)->det(),st);
513  }
514  }
515  }
516  }
517  }
518 
519 }
520 
521 
522 //
523 // get transient RecHits
524 //
527 
529 
530 
531 
532  TrajectoryStateOnSurface currTsos = trajectoryStateTransform::innerStateOnSurface(track, *theService->trackingGeometry(), &*theService->magneticField());
533 
534  for (trackingRecHit_iterator hit = track.recHitsBegin(); hit != track.recHitsEnd(); ++hit) {
535  if((*hit)->isValid()) {
536  DetId recoid = (*hit)->geographicalId();
537  if ( recoid.det() == DetId::Tracker ) {
539  if (!ttrhit->hit()->hasPositionAndError()){
540  TrajectoryStateOnSurface predTsos = theService->propagator(theTrackerPropagatorName)->propagate(currTsos, theService->trackingGeometry()->idToDet(recoid)->surface());
541 
542  if ( !predTsos.isValid() ) {
543  edm::LogError("MissingTransientHit")
544  <<"Could not get a tsos on the hit surface. We will miss a tracking hit.";
545  continue;
546  }
547  currTsos = predTsos;
548  TransientTrackingRecHit::RecHitPointer preciseHit = ttrhit->clone(predTsos);
549  result.push_back(preciseHit);
550  }else{
551  result.push_back(ttrhit);
552  }
553  } else if ( recoid.det() == DetId::Muon ) {
554  if ( (*hit)->geographicalId().subdetId() == 3 && !theRPCInTheFit) {
555  LogDebug(theCategory) << "RPC Rec Hit discarded";
556  continue;
557  }
558  result.push_back(theMuonRecHitBuilder->build(&**hit));
559  }
560  }
561  }
562 
563  return result;
564 }
#define LogDebug(id)
const reco::TrackRef muonTrack() const
return muon track
Definition: MuonCandidate.h:45
RectangularEtaPhiTrackingRegion * region(const reco::TrackRef &) const
define tracking region
virtual LocalPoint localPosition() const
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
int i
Definition: DBlmapReader.cc:9
float xx() const
Definition: LocalError.h:24
ConstRecHitContainer selectTrackerHits(const ConstRecHitContainer &) const
select tracker hits; exclude some tracker hits in the global trajectory
virtual void setEvent(const edm::Event &)
pass the Event to the algo at each event
void strip(std::string &input, const std::string &blanks=" \n\t")
Definition: stringTools.cc:16
std::pair< const Trajectory *, reco::TrackRef > TrackCand
T max() const
virtual float stripAngle(float strip) const =0
TrajectoryStateOnSurface innerStateOnSurface(const reco::Track &tk, const TrackingGeometry &geom, const MagneticField *field)
GlobalTrajectoryBuilderBase(const edm::ParameterSet &, const MuonServiceProxy *)
constructor with Parameter Set and MuonServiceProxy
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
ClusterRegionalRef cluster_regional() const
Geom::Phi< T > phi() const
Definition: PV3DBase.h:68
virtual GlobalPoint origin() const
T y() const
Definition: PV3DBase.h:62
virtual GlobalVector direction() const
the direction around which region is constructed
void setServices(const edm::EventSetup &)
set the services needed by the TrackTransformer
T min() const
std::vector< TrackCand > chooseRegionalTrackerTracks(const TrackCand &, const std::vector< TrackCand > &)
choose tracker tracks within region of interest
virtual float strip(const LocalPoint &) const =0
const reco::TrackRef trackerTrack() const
return tracker track
Definition: MuonCandidate.h:48
void fixTEC(ConstRecHitContainer &all, double scl_x, double scl_y) const
rescale errors of outermost TEC RecHit
bool isNonnull() const
Checks for non-null.
Definition: Ref.h:250
double trackProbability(const Trajectory &) const
calculate chi2 probability (-ln(P))
float yy() const
Definition: LocalError.h:26
virtual ~GlobalTrajectoryBuilderBase()
destructor
virtual float ptMin() const
minimal pt of interest
T sqrt(T t)
Definition: SSEVec.h:46
virtual LocalError localPositionError() const
Trajectory * trackerTrajectory() const
return tracker trajectory
Definition: MuonCandidate.h:51
T z() const
Definition: PV3DBase.h:63
tuple result
Definition: query.py:137
TransientTrackingRecHit::ConstRecHitContainer getTransientRecHits(const reco::Track &) const
get transient RecHits of a Track
ClusterRef cluster() const
virtual void setServices(const edm::EventSetup &)
set the services needed by the TrackTransformer
trackingRecHit_iterator recHitsBegin() const
Iterator to first hit on the track.
Definition: Track.h:63
std::vector< MuonCandidate * > CandidateContainer
Definition: MuonCandidate.h:22
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)
TransientTrackingRecHit::ConstRecHitContainer ConstRecHitContainer
double deltaR(double eta1, double eta2, double phi1, double phi2)
Definition: TreeUtility.cc:17
std::vector< ConstRecHitPointer > ConstRecHitContainer
virtual void setEvent(const edm::Event &)
pass the Event to the algo at each event
Definition: DetId.h:20
int ndof(bool bon=true) const
Definition: Trajectory.cc:74
GlobalMuonTrackMatcher * theTrackMatcher
T mean() const
MuonTrajectoryBuilder::CandidateContainer build(const TrackCand &, MuonTrajectoryBuilder::CandidateContainer &) const
build combined trajectory from sta Track and tracker RecHits
std::vector< Trajectory > refit(const reco::Track &globalTrack, const int theMuonHitsOption) const
build combined trajectory from sta Track and tracker RecHits
void setSeedRef(const edm::RefToBase< TrajectorySeed > &seedRef)
Definition: Trajectory.h:298
RectangularEtaPhiTrackingRegion defineRegionOfInterest(const reco::TrackRef &) const
define region of interest with tracker
T eta() const
Definition: PV3DBase.h:75
virtual std::vector< Trajectory > transform(const reco::Track &) const
Convert a reco::Track into Trajectory.
const GeomDet * det() const
The GomeDet* can be zero for InvalidTransientRecHits and for TConstraintRecHit2Ds.
RefitDirection checkRecHitsOrdering(const ConstRecHitContainer &) const
This does nothing now.
MuonTrackingRegionBuilder * theRegionBuilder
Trajectory * trajectory() const
return trajectory
Definition: MuonCandidate.h:42
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
Detector det() const
get the detector field from this detid
Definition: DetId.h:37
T x() const
Definition: PV3DBase.h:61
virtual float originZBound() const
bounds the particle vertex in the longitudinal plane
static RecHitPointer build(const GeomDet *geom, const TrackingRecHit *rh)
FIXME virtual ConstMuonRecHitContainer specificTransientHits() const;.
edm::ESHandle< TransientTrackingRecHitBuilder > theTrackerRecHitBuilder
double chiSquared() const
Definition: Trajectory.h:242
virtual float originRBound() const
bounds the particle vertex in the transverse plane
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:65
const Range & etaRange() const
allowed eta range [eta_min, eta_max] interval