CMS 3D CMS Logo

TrackExtenderWithMTD.cc
Go to the documentation of this file.
7 
10 
13 
15 
17 
22 
27 
29 
33 
35 
38 
41 
43 
46 
47 #include <sstream>
48 
50 
53 #include "CLHEP/Units/GlobalPhysicalConstants.h"
54 #include "CLHEP/Units/GlobalSystemOfUnits.h"
55 
56 using namespace std;
57 using namespace edm;
58 
59 template <class TrackCollection>
61 public:
64 
66 
67  template <class H, class T>
68  void fillValueMap(edm::Event& iEvent, const H& handle, const std::vector<T>& vec, const std::string& name) const;
69 
70  void produce(edm::Event& ev, const edm::EventSetup& es) final;
71 
72  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
73 
74  TransientTrackingRecHit::ConstRecHitContainer tryBTLLayers(const TrackType&,
76  const MTDDetLayerGeometry*,
77  const MagneticField* field,
78  const Propagator* prop) const;
79 
80  TransientTrackingRecHit::ConstRecHitContainer tryETLLayers(const TrackType&,
82  const MTDDetLayerGeometry*,
83  const MagneticField* field,
84  const Propagator* prop) const;
85 
88  if (!recHits.empty()) {
89  GlobalPoint first = gtg->idToDet(recHits.front()->geographicalId())->position();
90  GlobalPoint last = gtg->idToDet(recHits.back()->geographicalId())->position();
91 
92  // maybe perp2?
93  auto rFirst = first.mag2();
94  auto rLast = last.mag2();
95  if (rFirst < rLast)
97  if (rFirst > rLast)
99  }
100  LogDebug("TrackExtenderWithMTD") << "Impossible to determine the rechits order" << endl;
102  }
103 
104  reco::Track buildTrack(const reco::Track&,
105  const Trajectory&,
106  const Trajectory&,
107  const reco::BeamSpot&,
108  const MagneticField* field,
109  const Propagator* prop,
110  bool hasMTD,
111  float& pathLength,
112  float& tmtdOut,
113  float& sigmatmtdOut) const;
114  reco::TrackExtra buildTrackExtra(const Trajectory& trajectory) const;
115 
116  string dumpLayer(const DetLayer* layer) const;
117 
118 private:
119  static constexpr char pathLengthName[] = "pathLength";
120  static constexpr char tmtdName[] = "tmtd";
121  static constexpr char sigmatmtdName[] = "sigmatmtd";
122  static constexpr char pOrigTrkName[] = "generalTrackp";
123  static constexpr char betaOrigTrkName[] = "generalTrackBeta";
124  static constexpr char t0OrigTrkName[] = "generalTrackt0";
125  static constexpr char sigmat0OrigTrkName[] = "generalTracksigmat0";
126  static constexpr char pathLengthOrigTrkName[] = "generalTrackPathLength";
127  static constexpr char tmtdOrigTrkName[] = "generalTracktmtd";
128  static constexpr char sigmatmtdOrigTrkName[] = "generalTracksigmatmtd";
129 
133  const bool updateTraj_, updateExtra_, updatePattern_;
134  const std::string mtdRecHitBuilder_, propagator_, transientTrackBuilder_;
135  std::unique_ptr<MeasurementEstimator> theEstimator;
136  std::unique_ptr<TrackTransformer> theTransformer;
141 };
142 
143 template <class TrackCollection>
145  : tracksToken_(consumes<InputCollection>(iConfig.getParameter<edm::InputTag>("tracksSrc"))),
146  hitsToken_(consumes<MTDTrackingDetSetVector>(iConfig.getParameter<edm::InputTag>("hitsSrc"))),
147  bsToken_(consumes<reco::BeamSpot>(iConfig.getParameter<edm::InputTag>("beamSpotSrc"))),
148  updateTraj_(iConfig.getParameter<bool>("updateTrackTrajectory")),
149  updateExtra_(iConfig.getParameter<bool>("updateTrackExtra")),
150  updatePattern_(iConfig.getParameter<bool>("updateTrackHitPattern")),
151  mtdRecHitBuilder_(iConfig.getParameter<std::string>("MTDRecHitBuilder")),
152  propagator_(iConfig.getParameter<std::string>("Propagator")),
153  transientTrackBuilder_(iConfig.getParameter<std::string>("TransientTrackBuilder")) {
154  constexpr float maxChi2 = 500.;
155  constexpr float nSigma = 10.;
156  theEstimator = std::make_unique<Chi2MeasurementEstimator>(maxChi2, nSigma);
157 
158  theTransformer = std::make_unique<TrackTransformer>(iConfig.getParameterSet("TrackTransformer"));
159 
160  produces<edm::ValueMap<float>>(pathLengthName);
161  produces<edm::ValueMap<float>>(tmtdName);
162  produces<edm::ValueMap<float>>(sigmatmtdName);
163  produces<edm::ValueMap<float>>(pOrigTrkName);
164  produces<edm::ValueMap<float>>(betaOrigTrkName);
165  produces<edm::ValueMap<float>>(t0OrigTrkName);
166  produces<edm::ValueMap<float>>(sigmat0OrigTrkName);
167  produces<edm::ValueMap<float>>(pathLengthOrigTrkName);
168  produces<edm::ValueMap<float>>(tmtdOrigTrkName);
169  produces<edm::ValueMap<float>>(sigmatmtdOrigTrkName);
170 
171  produces<edm::OwnVector<TrackingRecHit>>();
172  produces<reco::TrackExtraCollection>();
173  produces<TrackCollection>();
174 }
175 
176 template <class TrackCollection>
178  edm::ParameterSetDescription desc, transDesc;
179  desc.add<edm::InputTag>("tracksSrc", edm::InputTag("generalTracks"));
180  desc.add<edm::InputTag>("hitsSrc", edm::InputTag("mtdTrackingRecHits"));
181  desc.add<edm::InputTag>("beamSpotSrc", edm::InputTag("offlineBeamSpot"));
182  desc.add<bool>("updateTrackTrajectory", true);
183  desc.add<bool>("updateTrackExtra", true);
184  desc.add<bool>("updateTrackHitPattern", true);
185  desc.add<std::string>("TransientTrackBuilder", "TransientTrackBuilder");
186  desc.add<std::string>("MTDRecHitBuilder", "MTDRecHitBuilder");
187  desc.add<std::string>("Propagator", "PropagatorWithMaterialForMTD");
189  false,
190  "KFFitterForRefitInsideOut",
191  "KFSmootherForRefitInsideOut",
192  "PropagatorWithMaterialForMTD",
193  "alongMomentum",
194  true,
195  "WithTrackAngle",
196  "MuonRecHitBuilder",
197  "MTDRecHitBuilder");
198  desc.add<edm::ParameterSetDescription>("TrackTransformer", transDesc);
199  descriptions.add("trackExtenderWithMTDBase", desc);
200 }
201 
202 template <class TrackCollection>
203 template <class H, class T>
205  const H& handle,
206  const std::vector<T>& vec,
207  const std::string& name) const {
208  auto out = std::make_unique<edm::ValueMap<T>>();
210  filler.insert(handle, vec.begin(), vec.end());
211  filler.fill();
212  iEvent.put(std::move(out), name);
213 }
214 
215 template <class TrackCollection>
217  //this produces pieces of the track extra
218  Traj2TrackHits t2t;
219 
220  theTransformer->setServices(es);
221 
224 
226 
228  es.get<MTDRecoGeometryRecord>().get(geo);
229 
231  es.get<IdealMagneticFieldRecord>().get(magfield);
232 
235 
237  es.get<TrackingComponentsRecord>().get(propagator_, prop);
238 
240  es.get<TrackerTopologyRcd>().get(httopo);
241  const TrackerTopology& ttopo = *httopo;
242 
243  auto output = std::make_unique<TrackCollection>();
244  auto extras = std::make_unique<reco::TrackExtraCollection>();
245  auto outhits = std::make_unique<edm::OwnVector<TrackingRecHit>>();
246 
247  std::vector<float> pathLengthsRaw;
248  std::vector<float> tmtdRaw;
249  std::vector<float> sigmatmtdRaw;
250  std::vector<float> pOrigTrkRaw;
251  std::vector<float> betaOrigTrkRaw;
252  std::vector<float> t0OrigTrkRaw;
253  std::vector<float> sigmat0OrigTrkRaw;
254  std::vector<float> pathLengthsOrigTrkRaw;
255  std::vector<float> tmtdOrigTrkRaw;
256  std::vector<float> sigmatmtdOrigTrkRaw;
257 
259  ev.getByToken(tracksToken_, tracksH);
260  const auto& tracks = *tracksH;
261 
263  ev.getByToken(hitsToken_, hitsH);
264  const auto& hits = *hitsH;
265 
267  ev.getByToken(bsToken_, bsH);
268  const auto& bs = *bsH;
269 
270  std::vector<unsigned> track_indices;
271  unsigned itrack = 0;
272  for (const auto& track : tracks) {
273  reco::TransientTrack ttrack(track, magfield.product(), gtg);
274  const auto& trajs = theTransformer->transform(track);
275  auto thits = theTransformer->getTransientRecHits(ttrack);
276 
278  const auto& btlhits = tryBTLLayers(track, hits, geo.product(), magfield.product(), prop.product());
279  mtdthits.insert(mtdthits.end(), btlhits.begin(), btlhits.end());
280 
281  // in the future this should include an intermediate refit before propagating to the ETL
282  // for now it is ok
283  const auto& etlhits = tryETLLayers(track, hits, geo.product(), magfield.product(), prop.product());
284  mtdthits.insert(mtdthits.end(), etlhits.begin(), etlhits.end());
285 
286  auto ordering = checkRecHitsOrdering(thits);
288  thits.insert(thits.end(), mtdthits.begin(), mtdthits.end());
289  } else {
290  std::reverse(mtdthits.begin(), mtdthits.end());
291  mtdthits.insert(mtdthits.end(), thits.begin(), thits.end());
292  thits.swap(mtdthits);
293  }
294  const auto& trajwithmtd = theTransformer->transform(ttrack, thits);
295  float pMap = 0.f, betaMap = 0.f, t0Map = 0.f, sigmat0Map = -1.f, pathLengthMap = -1.f, tmtdMap = 0.f,
296  sigmatmtdMap = -1.f;
297 
298  for (const auto& trj : trajwithmtd) {
299  const auto& thetrj = (updateTraj_ ? trj : trajs.front());
300  float pathLength = 0.f, tmtd = 0.f, sigmatmtd = -1.f;
302  track, thetrj, trj, bs, magfield.product(), prop.product(), !mtdthits.empty(), pathLength, tmtd, sigmatmtd);
303  if (result.ndof() >= 0) {
305  reco::TrackExtra::TrajParams trajParams;
307  size_t hitsstart = outhits->size();
308  if (updatePattern_) {
309  t2t(trj, *outhits, trajParams, chi2s); // this fills the output hit collection
310  } else {
311  t2t(thetrj, *outhits, trajParams, chi2s);
312  }
313  size_t hitsend = outhits->size();
314  extras->push_back(buildTrackExtra(trj)); // always push back the fully built extra, update by setting in track
315  extras->back().setHits(hitsRefProd, hitsstart, hitsend - hitsstart);
316  extras->back().setTrajParams(trajParams, chi2s);
317  //create the track
318  output->push_back(result);
319  pathLengthsRaw.push_back(pathLength);
320  tmtdRaw.push_back(tmtd);
321  sigmatmtdRaw.push_back(sigmatmtd);
322  pathLengthMap = pathLength;
323  tmtdMap = tmtd;
324  sigmatmtdMap = sigmatmtd;
325  auto& backtrack = output->back();
326  pMap = backtrack.p();
327  betaMap = backtrack.beta();
328  t0Map = backtrack.t0();
329  sigmat0Map = std::copysign(std::sqrt(std::abs(backtrack.covt0t0())), backtrack.covt0t0());
330  reco::TrackExtraRef extraRef(extrasRefProd, extras->size() - 1);
331  backtrack.setExtra((updateExtra_ ? extraRef : track.extra()));
332  for (unsigned ihit = hitsstart; ihit < hitsend; ++ihit) {
333  backtrack.appendHitPattern((*outhits)[ihit], ttopo);
334  }
335  }
336  }
337  pOrigTrkRaw.push_back(pMap);
338  betaOrigTrkRaw.push_back(betaMap);
339  t0OrigTrkRaw.push_back(t0Map);
340  sigmat0OrigTrkRaw.push_back(sigmat0Map);
341  pathLengthsOrigTrkRaw.push_back(pathLengthMap);
342  tmtdOrigTrkRaw.push_back(tmtdMap);
343  sigmatmtdOrigTrkRaw.push_back(sigmatmtdMap);
344  ++itrack;
345  }
346 
347  auto outTrksHandle = ev.put(std::move(output));
348  ev.put(std::move(extras));
349  ev.put(std::move(outhits));
350 
351  fillValueMap(ev, outTrksHandle, pathLengthsRaw, pathLengthName);
352  fillValueMap(ev, outTrksHandle, tmtdRaw, tmtdName);
353  fillValueMap(ev, outTrksHandle, sigmatmtdRaw, sigmatmtdName);
354  fillValueMap(ev, tracksH, pOrigTrkRaw, pOrigTrkName);
355  fillValueMap(ev, tracksH, betaOrigTrkRaw, betaOrigTrkName);
356  fillValueMap(ev, tracksH, t0OrigTrkRaw, t0OrigTrkName);
357  fillValueMap(ev, tracksH, sigmat0OrigTrkRaw, sigmat0OrigTrkName);
358  fillValueMap(ev, tracksH, pathLengthsOrigTrkRaw, pathLengthOrigTrkName);
359  fillValueMap(ev, tracksH, tmtdOrigTrkRaw, tmtdOrigTrkName);
360  fillValueMap(ev, tracksH, sigmatmtdOrigTrkRaw, sigmatmtdOrigTrkName);
361 }
362 
363 namespace {
364  bool cmp_for_detset(const unsigned one, const unsigned two) { return one < two; };
365 
366  void find_hits_in_dets(const MTDTrackingDetSetVector& hits,
367  const DetLayer* layer,
368  const TrajectoryStateOnSurface& tsos,
369  const Propagator* prop,
373  pair<bool, TrajectoryStateOnSurface> comp = layer->compatible(tsos, *prop, theEstimator);
374  if (comp.first) {
375  vector<DetLayer::DetWithState> compDets = layer->compatibleDets(tsos, *prop, theEstimator);
376  if (!compDets.empty()) {
377  MTDTrackingRecHit* best = nullptr;
378  double best_chi2 = std::numeric_limits<double>::max();
379  for (const auto& detWithState : compDets) {
380  auto range = hits.equal_range(detWithState.first->geographicalId(), cmp_for_detset);
381  for (auto detitr = range.first; detitr != range.second; ++detitr) {
382  for (auto itr = detitr->begin(); itr != detitr->end(); ++itr) {
383  auto est = theEstimator.estimate(detWithState.second, *itr);
384  if (est.first && est.second < best_chi2) { // just take the best chi2
385  best = &(*itr);
386  best_chi2 = est.second;
387  }
388  }
389  }
390  }
391  if (best)
392  output.push_back(hitbuilder.build(best));
393  }
394  }
395  }
396 } // namespace
397 
398 template <class TrackCollection>
400  const TrackType& track,
402  const MTDDetLayerGeometry* geo,
403  const MagneticField* field,
404  const Propagator* prop) const {
406  const vector<const DetLayer*>& layers = geo->allBTLLayers();
407  auto tTrack = builder->build(track);
408 
409  for (const DetLayer* ilay : layers) {
410  // get the outermost trajectory point on the track
411  TrajectoryStateOnSurface tsos = tTrack.outermostMeasurementState();
412  find_hits_in_dets(hits, ilay, tsos, prop, *theEstimator, *hitbuilder, output);
413  }
414  return output;
415 }
416 
417 template <class TrackCollection>
419  const TrackType& track,
421  const MTDDetLayerGeometry* geo,
422  const MagneticField* field,
423  const Propagator* prop) const {
425  const vector<const DetLayer*>& layers = geo->allETLLayers();
426 
427  auto tTrack = builder->build(track);
428 
429  for (const DetLayer* ilay : layers) {
430  const BoundDisk& disk = static_cast<const MTDRingForwardDoubleLayer*>(ilay)->specificSurface();
431  const double diskZ = disk.position().z();
432 
433  // get the outermost trajectory point on the track
434  TrajectoryStateOnSurface tsos = tTrack.outermostMeasurementState();
435  if (tsos.globalPosition().z() * diskZ < 0)
436  continue; // only propagate to the disk that's on the same side
437  find_hits_in_dets(hits, ilay, tsos, prop, *theEstimator, *hitbuilder, output);
438  }
439  return output;
440 }
441 
442 //below is unfortunately ripped from other places but
443 //since track producer doesn't know about MTD we have to do this
444 template <class TrackCollection>
446  const Trajectory& traj,
447  const Trajectory& trajWithMtd,
448  const reco::BeamSpot& bs,
449  const MagneticField* field,
450  const Propagator* thePropagator,
451  bool hasMTD,
452  float& pathLengthOut,
453  float& tmtdOut,
454  float& sigmatmtdOut) const {
455  // get the state closest to the beamline
456  TrajectoryStateOnSurface stateForProjectionToBeamLineOnSurface =
457  traj.closestMeasurement(GlobalPoint(bs.x0(), bs.y0(), bs.z0())).updatedState();
458 
459  if
460  UNLIKELY(!stateForProjectionToBeamLineOnSurface.isValid()) {
461  edm::LogError("CannotPropagateToBeamLine") << "the state on the closest measurement isnot valid. skipping track.";
462  return reco::Track();
463  }
464 
465  constexpr double m_pi = 0.13957018;
466  constexpr double m_pi_inv2 = 1.0 / m_pi / m_pi;
467  constexpr double m_p = 0.9382720813;
468  constexpr double m_p_inv2 = 1.0 / m_p / m_p;
469  constexpr double c_cm_ns = CLHEP::c_light * CLHEP::ns / CLHEP::cm; //[cm/ns]
470  constexpr double c_inv = 1.0 / c_cm_ns;
471 
472  const FreeTrajectoryState& stateForProjectionToBeamLine = *stateForProjectionToBeamLineOnSurface.freeState();
473 
474  TSCBLBuilderWithPropagator tscblBuilder(*thePropagator);
475  TrajectoryStateClosestToBeamLine tscbl = tscblBuilder(stateForProjectionToBeamLine, bs);
476 
477  if
478  UNLIKELY(!tscbl.isValid()) { return reco::Track(); }
479 
481  math::XYZPoint pos(v.x(), v.y(), v.z());
483  math::XYZVector mom(p.x(), p.y(), p.z());
484 
485  int ndof = traj.ndof();
486 
487  double t0 = 0.;
488  double covt0t0 = -1.;
489  pathLengthOut = -1.f; // if there is no MTD flag the pathlength with -1
490  tmtdOut = 0.f;
491  sigmatmtdOut = -1.f;
492  double betaOut = 0.;
493  double covbetabeta = -1.;
494 
495  //compute path length for time backpropagation, using first MTD hit for the momentum
496  if (hasMTD) {
497  bool validpropagation = true;
498  double pathlength = 0.;
499  double pathlength1 = 0.;
500  double pathlength2 = 0.;
501  for (auto it = trajWithMtd.measurements().begin(); it != trajWithMtd.measurements().end() - 1; ++it) {
502  const auto& propresult = thePropagator->propagateWithPath(it->updatedState(), (it + 1)->updatedState().surface());
503  double layerpathlength = std::abs(propresult.second);
504  if (layerpathlength == 0.) {
505  validpropagation = false;
506  }
507  pathlength1 += layerpathlength;
508  }
509 
510  double thit = 0.;
511  double thiterror = -1.;
512  bool validmtd = false;
513  if (trajWithMtd.direction() == alongMomentum) {
514  for (auto it = trajWithMtd.measurements().begin(); it != trajWithMtd.measurements().end(); ++it) {
515  bool ismtd = it->recHit()->geographicalId().det() == DetId::Forward &&
516  ForwardSubdetector(it->recHit()->geographicalId().subdetId()) == FastTime;
517  if (ismtd) {
518  const auto& propresult2 = thePropagator->propagateWithPath(
519  tscbl.trackStateAtPCA(), trajWithMtd.firstMeasurement().updatedState().surface());
520  pathlength2 = propresult2.second;
521  if (pathlength2 == 0.) {
522  validpropagation = false;
523  }
524  pathlength = pathlength1 + pathlength2;
525  const MTDTrackingRecHit* mtdhit = static_cast<const MTDTrackingRecHit*>(it->recHit()->hit());
526  thit = mtdhit->time();
527  thiterror = mtdhit->timeError();
528  validmtd = true;
529  break;
530  }
531  }
532  } else {
533  for (auto it = trajWithMtd.measurements().rbegin(); it != trajWithMtd.measurements().rend(); ++it) {
534  bool ismtd = it->recHit()->geographicalId().det() == DetId::Forward &&
535  ForwardSubdetector(it->recHit()->geographicalId().subdetId()) == FastTime;
536  if (ismtd) {
537  const auto& propresult2 = thePropagator->propagateWithPath(
538  tscbl.trackStateAtPCA(), trajWithMtd.lastMeasurement().updatedState().surface());
539  pathlength2 = propresult2.second;
540  if (pathlength2 == 0.) {
541  validpropagation = false;
542  }
543  pathlength = pathlength1 + pathlength2;
544  const MTDTrackingRecHit* mtdhit = static_cast<const MTDTrackingRecHit*>(it->recHit()->hit());
545  thit = mtdhit->time();
546  thiterror = mtdhit->timeError();
547  validmtd = true;
548  break;
549  }
550  }
551  }
552 
553  if (validmtd && validpropagation) {
554  double magp2 = p.mag2();
555 
556  double gammasq_pi = 1. + magp2 * m_pi_inv2;
557  double beta_pi = std::sqrt(1. - 1. / gammasq_pi);
558  double dt_pi = pathlength / beta_pi * c_inv;
559 
560  double gammasq_p = 1. + magp2 * m_p_inv2;
561  double beta_p = std::sqrt(1. - 1. / gammasq_p);
562  double dt_p = pathlength / beta_p * c_inv;
563 
564  double dterror = dt_p - dt_pi;
565  double betaerror = beta_p - beta_pi;
566 
567  pathLengthOut = pathlength; // set path length if we've got a timing hit
568  tmtdOut = thit;
569  sigmatmtdOut = thiterror;
570  t0 = thit - dt_pi;
571  covt0t0 = thiterror * thiterror + dterror * dterror;
572  betaOut = beta_pi;
573  covbetabeta = betaerror * betaerror;
574  }
575  }
576 
577  return reco::Track(traj.chiSquared(),
578  int(ndof),
579  pos,
580  mom,
581  tscbl.trackStateAtPCA().charge(),
583  orig.algo(),
585  t0,
586  betaOut,
587  covt0t0,
588  covbetabeta);
589 }
590 
591 template <class TrackCollection>
593  static const string metname = "TrackExtenderWithMTD";
594 
595  const Trajectory::RecHitContainer transRecHits = trajectory.recHits();
596 
597  // put the collection of TrackingRecHit in the event
598 
599  // sets the outermost and innermost TSOSs
600  // ToDo: validation for track states with MTD
601  TrajectoryStateOnSurface outerTSOS;
602  TrajectoryStateOnSurface innerTSOS;
603  unsigned int innerId = 0, outerId = 0;
605  DetId outerDetId;
606 
607  if (trajectory.direction() == alongMomentum) {
608  LogTrace(metname) << "alongMomentum";
609  outerTSOS = trajectory.lastMeasurement().updatedState();
610  innerTSOS = trajectory.firstMeasurement().updatedState();
611  outerId = trajectory.lastMeasurement().recHit()->geographicalId().rawId();
612  innerId = trajectory.firstMeasurement().recHit()->geographicalId().rawId();
613  outerRecHit = trajectory.lastMeasurement().recHit();
614  outerDetId = trajectory.lastMeasurement().recHit()->geographicalId();
615  } else if (trajectory.direction() == oppositeToMomentum) {
616  LogTrace(metname) << "oppositeToMomentum";
617  outerTSOS = trajectory.firstMeasurement().updatedState();
618  innerTSOS = trajectory.lastMeasurement().updatedState();
619  outerId = trajectory.firstMeasurement().recHit()->geographicalId().rawId();
620  innerId = trajectory.lastMeasurement().recHit()->geographicalId().rawId();
621  outerRecHit = trajectory.firstMeasurement().recHit();
622  outerDetId = trajectory.firstMeasurement().recHit()->geographicalId();
623  } else
624  LogError(metname) << "Wrong propagation direction!";
625 
626  const GeomDet* outerDet = gtg->idToDet(outerDetId);
627  GlobalPoint outerTSOSPos = outerTSOS.globalParameters().position();
628  bool inside = outerDet->surface().bounds().inside(outerDet->toLocal(outerTSOSPos));
629 
630  GlobalPoint hitPos =
631  (outerRecHit->isValid()) ? outerRecHit->globalPosition() : outerTSOS.globalParameters().position();
632 
633  if (!inside) {
634  LogTrace(metname) << "The Global Muon outerMostMeasurementState is not compatible with the recHit detector!"
635  << " Setting outerMost postition to recHit position if recHit isValid: "
636  << outerRecHit->isValid();
637  LogTrace(metname) << "From " << outerTSOSPos << " to " << hitPos;
638  }
639 
640  //build the TrackExtra
641  GlobalPoint v = (inside) ? outerTSOSPos : hitPos;
642  GlobalVector p = outerTSOS.globalParameters().momentum();
643  math::XYZPoint outpos(v.x(), v.y(), v.z());
644  math::XYZVector outmom(p.x(), p.y(), p.z());
645 
646  v = innerTSOS.globalParameters().position();
647  p = innerTSOS.globalParameters().momentum();
648  math::XYZPoint inpos(v.x(), v.y(), v.z());
649  math::XYZVector inmom(p.x(), p.y(), p.z());
650 
651  reco::TrackExtra trackExtra(outpos,
652  outmom,
653  true,
654  inpos,
655  inmom,
656  true,
657  outerTSOS.curvilinearError(),
658  outerId,
659  innerTSOS.curvilinearError(),
660  innerId,
661  trajectory.direction(),
662  trajectory.seedRef());
663 
664  return trackExtra;
665 }
666 
667 template <class TrackCollection>
669  stringstream output;
670 
671  const BoundSurface* sur = nullptr;
672  const BoundCylinder* bc = nullptr;
673  const BoundDisk* bd = nullptr;
674 
675  sur = &(layer->surface());
676  if ((bc = dynamic_cast<const BoundCylinder*>(sur))) {
677  output << " Cylinder of radius: " << bc->radius() << endl;
678  } else if ((bd = dynamic_cast<const BoundDisk*>(sur))) {
679  output << " Disk at: " << bd->position().z() << endl;
680  }
681  return output.str();
682 }
683 
684 //define this as a plug-in
691 
#define LogDebug(id)
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
double z0() const
z coordinate
Definition: BeamSpot.h:65
TrackExtenderWithMTDT< reco::TrackCollection > TrackExtenderWithMTD
T mag2() const
Definition: PV3DBase.h:63
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:131
ConstRecHitPointer const & recHit() const
float time() const
Range equal_range(id_type i, CMP cmp, bool update=false) const
std::vector< unsigned char > Chi2sFive
reco::TrackExtra buildTrackExtra(const Trajectory &trajectory) const
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:525
const std::string metname
edm::EDGetTokenT< reco::BeamSpot > bsToken_
std::unique_ptr< MeasurementEstimator > theEstimator
TrackExtenderWithMTDT(const ParameterSet &pset)
const CurvilinearTrajectoryError & curvilinearError() const
Global3DPoint GlobalPoint
Definition: GlobalPoint.h:10
reco::TransientTrack build(const reco::Track *p) const
T y() const
Definition: PV3DBase.h:60
string dumpLayer(const DetLayer *layer) const
edm::View< TrackType > InputCollection
GlobalPoint globalPosition() const
LocalPoint toLocal(const GlobalPoint &gp) const
Conversion to the R.F. of the GeomDet.
Definition: GeomDet.h:58
ConstRecHitContainer recHits() const
Definition: Trajectory.h:186
const Bounds & bounds() const
Definition: Surface.h:89
edm::ESHandle< GlobalTrackingGeometry > gtg
bool ev
const std::vector< const DetLayer * > & allBTLLayers() const
return the BTL DetLayers (barrel), inside-out
TrackCharge charge() const
reco::Track buildTrack(const reco::Track &, const Trajectory &, const Trajectory &, const reco::BeamSpot &, const MagneticField *field, const Propagator *prop, bool hasMTD, float &pathLength, float &tmtdOut, float &sigmatmtdOut) const
TrajectoryMeasurement const & closestMeasurement(GlobalPoint) const
Definition: Trajectory.cc:256
ForwardSubdetector
const Plane & surface() const
The nominal surface of the GeomDet.
Definition: GeomDet.h:37
const CurvilinearTrajectoryError & curvilinearError() const
virtual std::vector< DetWithState > compatibleDets(const TrajectoryStateOnSurface &startingState, const Propagator &prop, const MeasurementEstimator &est) const
edm::EDGetTokenT< MTDTrackingDetSetVector > hitsToken_
PropagationDirection const & direction() const
Definition: Trajectory.cc:133
TrackAlgorithm algo() const
Definition: TrackBase.h:526
DataContainer const & measurements() const
Definition: Trajectory.h:178
std::vector< LocalTrajectoryParameters > TrajParams
virtual bool inside(const Local3DPoint &) const =0
Determine if the point is inside the bounds.
int iEvent
Definition: GenABIO.cc:224
const SurfaceType & surface() const
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
const std::vector< const DetLayer * > & allETLLayers() const
return the ETL DetLayers (endcap), -Z to +Z
const std::string mtdRecHitBuilder_
edm::ESHandle< TransientTrackingRecHitBuilder > hitbuilder
double ndof() const
number of degrees of freedom of the fit
Definition: TrackBase.h:569
T sqrt(T t)
Definition: SSEVec.h:19
TrajectoryMeasurement const & lastMeasurement() const
Definition: Trajectory.h:150
FreeTrajectoryState const * freeState(bool withErrors=true) const
T z() const
Definition: PV3DBase.h:61
RefitDirection::GeometricalDirection checkRecHitsOrdering(TransientTrackingRecHit::ConstRecHitContainer const &recHits) const
virtual std::pair< TrajectoryStateOnSurface, double > propagateWithPath(const FreeTrajectoryState &, const Surface &) const final
Definition: Propagator.cc:10
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
virtual const BoundSurface & surface() const =0
The surface of the GeometricSearchDet.
const std::string propagator_
ParameterDescriptionBase * add(U const &iLabel, T const &value)
edm::RefToBase< TrajectorySeed > seedRef(void) const
Definition: Trajectory.h:303
virtual std::pair< bool, TrajectoryStateOnSurface > compatible(const TrajectoryStateOnSurface &ts, const Propagator &, const MeasurementEstimator &) const =0
#define LogTrace(id)
GlobalVector momentum() const
RefProd< PROD > getRefBeforePut()
Definition: Event.h:156
virtual RecHitPointer build(const TrackingRecHit *p) const =0
build a tracking rechit from an existing rechit
std::vector< ConstRecHitPointer > ConstRecHitContainer
const std::string transientTrackBuilder_
Definition: DetId.h:17
GlobalPoint position() const
int ndof(bool bon=true) const
Definition: Trajectory.cc:97
std::vector< TrackExtra > TrackExtraCollection
collection of TrackExtra objects
Definition: TrackExtraFwd.h:10
TrajectoryMeasurement const & firstMeasurement() const
Definition: Trajectory.h:166
static void fillPSetDescription(edm::ParameterSetDescription &descriptions, bool DoPredictionsOnly=false, const std::string &Fitter="KFFitterForRefitInsideOut", const std::string &Smoother="KFSmootherForRefitInsideOut", const std::string &Propagator="SmartPropagatorAnyRK", const std::string &RefitDirection="alongMomentum", bool RefitRPCHits=true, const std::string &TrackerRecHitBuilder="WithTrackAngle", const std::string &MuonRecHitBuilder="MuonRecHitBuilder", const std::string &MTDRecHitBuilder="MTDRecHitBuilder")
fillDescriptions
ConstRecHitContainer RecHitContainer
Definition: Trajectory.h:42
TransientTrackingRecHit::ConstRecHitContainer tryBTLLayers(const TrackType &, const MTDTrackingDetSetVector &, const MTDDetLayerGeometry *, const MagneticField *field, const Propagator *prop) const
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
edm::ESHandle< Propagator > prop
const GlobalTrajectoryParameters & globalParameters() const
ParameterSet const & getParameterSet(std::string const &) const
XYZVectorD XYZVector
spatial vector with cartesian internal representation
Definition: Vector3D.h:31
TransientTrackingRecHit::ConstRecHitContainer tryETLLayers(const TrackType &, const MTDTrackingDetSetVector &, const MTDDetLayerGeometry *, const MagneticField *field, const Propagator *prop) const
edm::ESHandle< TransientTrackBuilder > builder
XYZPointD XYZPoint
point in space with cartesian internal representation
Definition: Point3D.h:12
A 2D TrackerRecHit with time and time error information.
void add(std::string const &label, ParameterSetDescription const &psetDescription)
TrackingRecHit::ConstRecHitPointer ConstRecHitPointer
std::unique_ptr< TrackTransformer > theTransformer
float chiSquared() const
Definition: Trajectory.h:241
fixed size matrix
HLT enums.
static int position[264][3]
Definition: ReadPGInfo.cc:289
T get() const
Definition: EventSetup.h:73
const GeomDet * idToDet(DetId) const override
double y0() const
y coordinate
Definition: BeamSpot.h:63
virtual HitReturnType estimate(const TrajectoryStateOnSurface &ts, const TrackingRecHit &hit) const =0
TrajectoryStateOnSurface const & updatedState() const
#define UNLIKELY(x)
Definition: Likely.h:21
float timeError() const
T x() const
Definition: PV3DBase.h:59
ordering
Definition: config.py:7
T const * product() const
Definition: ESHandle.h:86
void produce(edm::Event &ev, const edm::EventSetup &es) final
TrackCollection::value_type TrackType
edm::EDGetTokenT< InputCollection > tracksToken_
def move(src, dest)
Definition: eostools.py:511
#define constexpr
void fillValueMap(edm::Event &iEvent, const H &handle, const std::vector< T > &vec, const std::string &name) const
#define m_pi
Definition: RPCConst.cc:8
double x0() const
x coordinate
Definition: BeamSpot.h:61