CMS 3D CMS Logo

MatcherUsingTracksAlgorithm.cc
Go to the documentation of this file.
2 
5 
8 
15 
18 
20  : whichTrack1_(None),
21  whichTrack2_(None),
22  whichState1_(AtVertex),
23  whichState2_(AtVertex),
24  srcCut_(iConfig.existsAs<std::string>("srcPreselection") ? iConfig.getParameter<std::string>("srcPreselection")
25  : ""),
26  matchedCut_(iConfig.existsAs<std::string>("matchedPreselection")
27  ? iConfig.getParameter<std::string>("matchedPreselection")
28  : ""),
29  requireSameCharge_(iConfig.existsAs<bool>("requireSameCharge") ? iConfig.getParameter<bool>("requireSameCharge")
30  : false),
31  magfieldToken_(iC.esConsumes()),
32  propagatorToken_(iC.esConsumes(edm::ESInputTag("", "SteppingHelixPropagatorAny"))),
33  geometryToken_(iC.esConsumes()) {
34  std::string algo = iConfig.getParameter<std::string>("algorithm");
35  if (algo == "byTrackRef") {
36  algo_ = ByTrackRef;
37  } else if (algo == "byPropagatingSrc") {
39  } else if (algo == "byPropagatingMatched") {
41  } else if (algo == "byDirectComparison") {
43  } else
44  throw cms::Exception("Configuration") << "Value '" << algo << "' for algorithm not yet implemented.\n";
45 
46  getConf(iConfig, "src", whichTrack1_, whichState1_);
47  getConf(iConfig, "matched", whichTrack2_, whichState2_);
48 
49  if (algo_ == ByTrackRef) {
50  // validate the config
51  if (whichTrack1_ == None || whichTrack2_ == None)
52  throw cms::Exception("Configuration") << "Algorithm 'byTrackRef' needs tracks not to be 'none'.\n";
54  // read matching cuts
55  maxLocalPosDiff_ = iConfig.getParameter<double>("maxDeltaLocalPos");
56  maxGlobalMomDeltaR_ = iConfig.getParameter<double>("maxDeltaR");
58  iConfig.existsAs<double>("maxDeltaEta") ? iConfig.getParameter<double>("maxDeltaEta") : maxGlobalMomDeltaR_;
60  iConfig.existsAs<double>("maxDeltaPhi") ? iConfig.getParameter<double>("maxDeltaPhi") : maxGlobalMomDeltaR_;
61  maxGlobalDPtRel_ = iConfig.getParameter<double>("maxDeltaPtRel");
62 
63  // choice of sorting variable
64  std::string sortBy = iConfig.getParameter<std::string>("sortBy");
65  if (sortBy == "deltaLocalPos")
67  else if (sortBy == "deltaPtRel")
69  else if (sortBy == "deltaR")
71  else if (sortBy == "deltaEta")
73  else if (sortBy == "deltaPhi")
75  else if (sortBy == "chi2")
76  sortBy_ = Chi2;
77  else
78  throw cms::Exception("Configuration")
79  << "Parameter 'sortBy' must be one of: deltaLocalPos, deltaPtRel, deltaR, chi2.\n";
80  // validate the config
81  if (algo_ == ByPropagatingSrc) {
82  if (whichTrack2_ == None || whichState2_ == AtVertex) {
84  //throw cms::Exception("Configuration") << "Destination track must be non-null, and state must not be 'AtVertex' (not yet).\n";
85  }
86  } else if (algo_ == ByPropagatingMatched) {
87  if (whichTrack1_ == None || whichState1_ == AtVertex) {
89  //throw cms::Exception("Configuration") << "Destination track must be non-null, and state must not be 'AtVertex' (not yet).\n";
90  }
91  } else if (algo_ == ByDirectComparison) {
92  bool firstAtVertex = (whichTrack1_ == None || whichState1_ == AtVertex);
93  bool secAtVertex = (whichTrack2_ == None || whichState2_ == AtVertex);
94  if (firstAtVertex) {
95  if (!secAtVertex)
96  throw cms::Exception("Configuration")
97  << "When using 'byDirectComparison' with 'src' at vertex (or None), 'matched' must be at vertex too.\n";
98  } else {
99  if (secAtVertex)
100  throw cms::Exception("Configuration")
101  << "When using 'byDirectComparison' with 'src' not at vertex, 'matched' can't be at vertex or None.\n";
102  if (whichState1_ != whichState2_)
103  throw cms::Exception("Configuration") << "You can't use 'byDirectComparison' with non-matching states.\n";
104  }
105  }
106 
107  useChi2_ = iConfig.existsAs<bool>("computeChi2") ? iConfig.getParameter<bool>("computeChi2") : false;
108  if (useChi2_) {
109  if (whichTrack1_ == None && whichTrack2_ == None)
110  throw cms::Exception("Configuration") << "Can't compute chi2s if both tracks are set to 'none'.\n";
111  maxChi2_ = iConfig.getParameter<double>("maxChi2");
112  chi2DiagonalOnly_ = iConfig.getParameter<bool>("chi2DiagonalOnly");
114  chi2UseVertex_ = iConfig.getParameter<bool>("chi2UsePosition");
115  } else {
116  chi2UseVertex_ = iConfig.getParameter<bool>("chi2UseVertex");
117  if (algo_ == ByDirectComparison) {
118  std::string choice = iConfig.getParameter<std::string>("chi2MomentumForDxy");
119  if (choice == "src")
120  chi2FirstMomentum_ = true;
121  else if (choice != "matched")
122  throw cms::Exception("Configuration") << "chi2MomentumForDxy must be 'src' or 'matched'\n";
123  }
124  }
125  } else
126  maxChi2_ = 1;
127 
128  if (sortBy_ == Chi2 && !useChi2_)
129  throw cms::Exception("Configuration") << "Can't sort by chi2s if 'computeChi2s' is not set to true.\n";
130  }
131 }
132 
134  const std::string &whatFor,
135  WhichTrack &whichTrack,
136  WhichState &whichState) {
137  std::string s_whichTrack = iConfig.getParameter<std::string>(whatFor + "Track");
138  if (s_whichTrack == "none") {
139  whichTrack = None;
140  } else if (s_whichTrack == "tracker") {
141  whichTrack = TrackerTk;
142  } else if (s_whichTrack == "muon") {
143  whichTrack = MuonTk;
144  } else if (s_whichTrack == "global") {
145  whichTrack = GlobalTk;
146  } else
147  throw cms::Exception("Configuration") << "Parameter 'useTrack' must be 'none', 'tracker', 'muon', 'global'\n";
148  if ((whichTrack != None) && (algo_ != ByTrackRef)) {
149  std::string s_whichState = iConfig.getParameter<std::string>(whatFor + "State");
150  if (s_whichState == "atVertex") {
151  whichState = AtVertex;
152  } else if (s_whichState == "innermost") {
153  whichState = Innermost;
154  } else if (s_whichState == "outermost") {
155  whichState = Outermost;
156  } else
157  throw cms::Exception("Configuration") << "Parameter 'useState' must be 'atVertex', 'innermost', 'outermost'\n";
158  }
159 }
160 
164  const reco::Candidate &c2,
165  float &deltR,
166  float &deltEta,
167  float &deltPhi,
168  float &deltaLocalPos,
169  float &deltaPtRel,
170  float &chi2) const {
171  if (!(srcCut_(c1) && matchedCut_(c2)))
172  return false;
173  if (requireSameCharge_ && (c1.charge() != c2.charge()))
174  return false;
175  switch (algo_) {
176  case ByTrackRef: {
179  if (t1.isNonnull()) {
180  if (t1 == t2)
181  return true;
182  if (t1.id() != t2.id()) {
183  edm::LogWarning("MatcherUsingTracksAlgorithm")
184  << "Trying to match by reference tracks coming from different collections.\n";
185  }
186  }
187  }
188  [[fallthrough]];
189  case ByPropagatingSrc: {
192  return matchWithPropagation(start, target, deltR, deltEta, deltPhi, deltaLocalPos, deltaPtRel, chi2);
193  }
194  case ByPropagatingMatched: {
197  return matchWithPropagation(start, target, deltR, deltEta, deltPhi, deltaLocalPos, deltaPtRel, chi2);
198  }
199  case ByPropagatingSrcTSCP: {
202  return matchWithPropagation(start, target, deltR, deltEta, deltPhi, deltaLocalPos, deltaPtRel, chi2);
203  }
207  return matchWithPropagation(start, target, deltR, deltEta, deltPhi, deltaLocalPos, deltaPtRel, chi2);
208  }
209 
210  case ByDirectComparison: {
213  return matchByDirectComparison(start, otherstart, deltR, deltEta, deltPhi, deltaLocalPos, deltaPtRel, chi2);
214  }
215  }
216  return false;
217 }
218 
223  const edm::View<reco::Candidate> &c2s,
224  float &deltR,
225  float &deltEta,
226  float &deltPhi,
227  float &deltaLocalPos,
228  float &deltaPtRel,
229  float &chi2) const {
230  if (!srcCut_(c1))
231  return -1;
232 
233  // working and output variables
236  int match = -1;
237 
238  // pre-fetch some states if needed
242  } else if (algo_ == ByPropagatingMatched)
244 
245  // loop on the collection
247  int i;
248  for (it = c2s.begin(), ed = c2s.end(), i = 0; it != ed; ++it, ++i) {
249  if (!matchedCut_(*it))
250  continue;
251  if (requireSameCharge_ && (c1.charge() != it->charge()))
252  continue;
253  bool exit = false;
254  switch (algo_) {
255  case ByTrackRef: {
258  if (t1.isNonnull()) {
259  if (t1 == t2) {
260  match = i;
261  exit = true;
262  }
263  if (t1.id() != t2.id()) {
264  edm::LogWarning("MatcherUsingTracksAlgorithm")
265  << "Trying to match by reference tracks coming from different collections.\n";
266  }
267  }
268  } break;
269  case ByPropagatingSrc:
270  case ByPropagatingMatched: {
273  else if (algo_ == ByPropagatingSrc)
275  if (matchWithPropagation(start, target, deltR, deltEta, deltPhi, deltaLocalPos, deltaPtRel, chi2)) {
276  match = i;
277  }
278  } break;
279  case ByDirectComparison: {
281  if (matchByDirectComparison(start, otherstart, deltR, deltEta, deltPhi, deltaLocalPos, deltaPtRel, chi2)) {
282  match = i;
283  }
284  } break;
285  case ByPropagatingSrcTSCP: {
287  if (matchWithPropagation(start, otherstart, deltR, deltEta, deltPhi, deltaLocalPos, deltaPtRel, chi2)) {
288  match = i;
289  }
290  } break;
293  if (matchWithPropagation(otherstart, start, deltR, deltEta, deltPhi, deltaLocalPos, deltaPtRel, chi2)) {
294  match = i;
295  }
296  } break;
297  }
298  if (exit)
299  break;
300  }
301 
302  return match;
303 }
304 
309 }
310 
312  reco::TrackRef tk;
313  const reco::RecoCandidate *rc = dynamic_cast<const reco::RecoCandidate *>(&reco);
314  if (rc == nullptr)
315  throw cms::Exception("Invalid Data") << "Input object is not a RecoCandidate.\n";
316  switch (whichTrack) {
317  case TrackerTk:
318  tk = rc->track();
319  break;
320  case MuonTk:
321  tk = rc->standAloneMuon();
322  break;
323  case GlobalTk:
324  tk = rc->combinedMuon();
325  break;
326  default:
327  break; // just to make gcc happy
328  }
329  return tk;
330 }
331 
333  WhichTrack whichTrack,
334  WhichState whichState) const {
336  if (whichTrack != None) {
337  reco::TrackRef tk = getTrack(reco, whichTrack);
338  if (tk.isNull()) {
340  } else {
341  switch (whichState) {
342  case AtVertex:
344  break;
345  case Innermost:
347  break;
348  case Outermost:
350  break;
351  }
352  }
353  } else {
354  ret = FreeTrajectoryState(GlobalPoint(reco.vx(), reco.vy(), reco.vz()),
355  GlobalVector(reco.px(), reco.py(), reco.pz()),
356  reco.charge(),
357  magfield_.product());
358  }
359  return ret;
360 }
361 
363  WhichTrack whichTrack,
364  WhichState whichState) const {
366  reco::TrackRef tk = getTrack(reco, whichTrack);
367  if (tk.isNonnull()) {
368  switch (whichState) {
369  case Innermost:
371  break;
372  case Outermost:
374  break;
375  default:
376  break; // just to make gcc happy
377  }
378  }
379  return ret;
380 }
381 
384  float &lastDeltaR,
385  float &lastDeltaEta,
386  float &lastDeltaPhi,
387  float &lastDeltaLocalPos,
388  float &lastGlobalDPtRel,
389  float &lastChi2) const {
390  if ((start.momentum().mag() == 0) || !target.isValid())
391  return false;
392 
394 
395  bool isBest = false;
396  if (tsos.isValid()) {
397  float thisLocalPosDiff = (tsos.localPosition() - target.localPosition()).mag();
398  float thisGlobalMomDeltaR = deltaR(tsos.globalMomentum(), target.globalMomentum());
399  float thisGlobalMomDeltaPhi = fabs(deltaPhi(tsos.globalMomentum().barePhi(), target.globalMomentum().barePhi()));
400  float thisGlobalMomDeltaEta = fabs(tsos.globalMomentum().eta() - target.globalMomentum().eta());
401  float thisGlobalDPtRel =
402  (tsos.globalMomentum().perp() - target.globalMomentum().perp()) / target.globalMomentum().perp();
403 
404  if ((thisLocalPosDiff < maxLocalPosDiff_) && (thisGlobalMomDeltaR < maxGlobalMomDeltaR_) &&
405  (thisGlobalMomDeltaEta < maxGlobalMomDeltaEta_) && (thisGlobalMomDeltaPhi < maxGlobalMomDeltaPhi_) &&
406  (fabs(thisGlobalDPtRel) < maxGlobalDPtRel_)) {
407  float thisChi2 = useChi2_ ? getChi2(target, tsos, chi2DiagonalOnly_, chi2UseVertex_) : 0;
408  if (thisChi2 >= maxChi2_)
409  return false;
410  switch (sortBy_) {
411  case LocalPosDiff:
412  isBest = (thisLocalPosDiff < lastDeltaLocalPos);
413  break;
414  case GlobalMomDeltaR:
415  isBest = (thisGlobalMomDeltaR < lastDeltaR);
416  break;
417  case GlobalMomDeltaEta:
418  isBest = (thisGlobalMomDeltaEta < lastDeltaEta);
419  break;
420  case GlobalMomDeltaPhi:
421  isBest = (thisGlobalMomDeltaPhi < lastDeltaPhi);
422  break;
423  case GlobalDPtRel:
424  isBest = (thisGlobalDPtRel < lastGlobalDPtRel);
425  break;
426  case Chi2:
427  isBest = (thisChi2 < lastChi2);
428  break;
429  }
430  if (isBest) {
431  lastDeltaLocalPos = thisLocalPosDiff;
432  lastDeltaR = thisGlobalMomDeltaR;
433  lastDeltaEta = thisGlobalMomDeltaEta;
434  lastDeltaPhi = thisGlobalMomDeltaPhi;
435  lastGlobalDPtRel = thisGlobalDPtRel;
436  lastChi2 = thisChi2;
437  }
438  } // if match
439  }
440 
441  return isBest;
442 }
443 
446  float &lastDeltaR,
447  float &lastDeltaEta,
448  float &lastDeltaPhi,
449  float &lastDeltaLocalPos,
450  float &lastGlobalDPtRel,
451  float &lastChi2) const {
452  if ((start.momentum().mag() == 0) || (target.momentum().mag() == 0))
453  return false;
455  /*2.2.X*/ try {
457  // if (!tscp.isValid()) return false; // in 3.1.X
458 
459  bool isBest = false;
460  float thisLocalPosDiff = (tscp.position() - target.position()).mag();
461  float thisGlobalMomDeltaR = deltaR(tscp.momentum(), target.momentum());
462  float thisGlobalMomDeltaPhi = fabs(deltaPhi(tscp.momentum().barePhi(), target.momentum().barePhi()));
463  float thisGlobalMomDeltaEta = fabs(tscp.momentum().eta() - target.momentum().eta());
464  float thisGlobalDPtRel = (tscp.momentum().perp() - target.momentum().perp()) / target.momentum().perp();
465 
466  if ((thisLocalPosDiff < maxLocalPosDiff_) && (thisGlobalMomDeltaR < maxGlobalMomDeltaR_) &&
467  (thisGlobalMomDeltaEta < maxGlobalMomDeltaEta_) && (thisGlobalMomDeltaPhi < maxGlobalMomDeltaPhi_) &&
468  (fabs(thisGlobalDPtRel) < maxGlobalDPtRel_)) {
469  float thisChi2 = useChi2_ ? getChi2(target, tscp, chi2DiagonalOnly_, chi2UseVertex_) : 0;
470  if (thisChi2 >= maxChi2_)
471  return false;
472  switch (sortBy_) {
473  case LocalPosDiff:
474  isBest = (thisLocalPosDiff < lastDeltaLocalPos);
475  break;
476  case GlobalMomDeltaR:
477  isBest = (thisGlobalMomDeltaR < lastDeltaR);
478  break;
479  case GlobalMomDeltaEta:
480  isBest = (thisGlobalMomDeltaEta < lastDeltaEta);
481  break;
482  case GlobalMomDeltaPhi:
483  isBest = (thisGlobalMomDeltaPhi < lastDeltaPhi);
484  break;
485  case GlobalDPtRel:
486  isBest = (thisGlobalDPtRel < lastGlobalDPtRel);
487  break;
488  case Chi2:
489  isBest = (thisChi2 < lastChi2);
490  break;
491  }
492  if (isBest) {
493  lastDeltaLocalPos = thisLocalPosDiff;
494  lastDeltaR = thisGlobalMomDeltaR;
495  lastDeltaEta = thisGlobalMomDeltaEta;
496  lastDeltaPhi = thisGlobalMomDeltaPhi;
497  lastGlobalDPtRel = thisGlobalDPtRel;
498  lastChi2 = thisChi2;
499  }
500  } // if match
501 
502  return isBest;
503  /*2.2.X*/ } catch (const TrajectoryStateException &err) { return false; }
504 }
505 
508  float &lastDeltaR,
509  float &lastDeltaEta,
510  float &lastDeltaPhi,
511  float &lastDeltaLocalPos,
512  float &lastGlobalDPtRel,
513  float &lastChi2) const {
514  if ((start.momentum().mag() == 0) || target.momentum().mag() == 0)
515  return false;
516 
517  bool isBest = false;
518  float thisLocalPosDiff = (start.position() - target.position()).mag();
519  float thisGlobalMomDeltaR = deltaR(start.momentum(), target.momentum());
520  float thisGlobalMomDeltaPhi = fabs(deltaPhi(start.momentum().barePhi(), target.momentum().barePhi()));
521  float thisGlobalMomDeltaEta = fabs(start.momentum().eta() - target.momentum().eta());
522  float thisGlobalDPtRel = (start.momentum().perp() - target.momentum().perp()) / target.momentum().perp();
523 
524  if ((thisLocalPosDiff < maxLocalPosDiff_) && (thisGlobalMomDeltaR < maxGlobalMomDeltaR_) &&
525  (thisGlobalMomDeltaEta < maxGlobalMomDeltaEta_) && (thisGlobalMomDeltaPhi < maxGlobalMomDeltaPhi_) &&
526  (fabs(thisGlobalDPtRel) < maxGlobalDPtRel_)) {
528  if (thisChi2 >= maxChi2_)
529  return false;
530  switch (sortBy_) {
531  case LocalPosDiff:
532  isBest = (thisLocalPosDiff < lastDeltaLocalPos);
533  break;
534  case GlobalMomDeltaR:
535  isBest = (thisGlobalMomDeltaR < lastDeltaR);
536  break;
537  case GlobalMomDeltaEta:
538  isBest = (thisGlobalMomDeltaEta < lastDeltaEta);
539  break;
540  case GlobalMomDeltaPhi:
541  isBest = (thisGlobalMomDeltaPhi < lastDeltaPhi);
542  break;
543  case GlobalDPtRel:
544  isBest = (thisGlobalDPtRel < lastGlobalDPtRel);
545  break;
546  case Chi2:
547  isBest = (thisChi2 < lastChi2);
548  break;
549  }
550  if (isBest) {
551  lastDeltaLocalPos = thisLocalPosDiff;
552  lastDeltaR = thisGlobalMomDeltaR;
553  lastDeltaEta = thisGlobalMomDeltaEta;
554  lastDeltaPhi = thisGlobalMomDeltaPhi;
555  lastGlobalDPtRel = thisGlobalDPtRel;
556  lastChi2 = thisChi2;
557  }
558  } // if match
559 
560  return isBest;
561 }
562 
564  const FreeTrajectoryState &other,
565  bool diagonalOnly,
566  bool useVertex,
567  bool useFirstMomentum) {
568  if (!start.hasError() && !other.hasError())
569  throw cms::Exception("LogicError") << "At least one of the two states must have errors to make chi2s.\n";
571  if (start.hasError())
572  cov += start.curvilinearError().matrix();
573  if (other.hasError())
574  cov += other.curvilinearError().matrix();
576  GlobalVector p1 = start.momentum(), p2 = other.momentum();
577  GlobalPoint x1 = start.position(), x2 = other.position();
578  GlobalVector p = useFirstMomentum ? p1 : p2;
579  double pt = p.perp(), pm = p.mag();
580  double dsz = (x1.z() - x2.z()) * pt / pm - ((x1.x() - x2.x()) * p.x() + (x1.y() - x2.y()) * p.y()) / pt * p.z() / pm;
581  double dxy = (-(x1.x() - x2.x()) * p.y() + (x1.y() - x2.y()) * p.x()) / pt;
582  AlgebraicVector5 diff(start.charge() / p1.mag() - other.charge() / p2.mag(),
583  p1.theta() - p2.theta(),
584  (p1.phi() - p2.phi()).value(),
585  dxy,
586  dsz);
587  return ROOT::Math::Similarity(diff, cov);
588 }
589 
592  bool diagonalOnly,
593  bool useVertex) {
594  if (!start.hasError() && !other.hasError())
595  throw cms::Exception("LogicError") << "At least one of the two states must have errors to make chi2s.\n";
596  double pt; // needed by pgconvert
598  if (start.hasError())
600  if (other.hasError())
601  cov += other.perigeeError().covarianceMatrix();
604  if (not params) {
605  throw cms::Exception("PerigeeConversions") << "track had pt == 0.";
606  }
607  AlgebraicVector5 pgpar1 = params->vector();
608  AlgebraicVector5 pgpar2 = other.perigeeParameters().vector();
609  AlgebraicVector5 diff(pgpar1 - pgpar2);
610  return ROOT::Math::Similarity(diff, cov);
611 }
612 
615  bool diagonalOnly,
616  bool usePosition) {
617  if (!start.hasError() && !other.hasError())
618  throw cms::Exception("LogicError") << "At least one of the two states must have errors to make chi2s.\n";
620  if (start.hasError())
621  cov += start.localError().matrix();
622  if (other.hasError())
623  cov += other.localError().matrix();
625  AlgebraicVector5 diff(start.localParameters().mixedFormatVector() - other.localParameters().mixedFormatVector());
626  return ROOT::Math::Similarity(diff, cov);
627 }
628 
630  if (!top3by3only) {
631  if (diagonalOnly) {
632  for (size_t i = 0; i < 5; ++i) {
633  for (size_t j = i + 1; j < 5; ++j) {
634  cov(i, j) = 0;
635  }
636  }
637  }
638  cov.Invert();
639  } else {
640  // get 3x3 covariance
641  AlgebraicSymMatrix33 momCov = cov.Sub<AlgebraicSymMatrix33>(0, 0); // get 3x3 matrix
642  if (diagonalOnly) {
643  momCov(0, 1) = 0;
644  momCov(0, 2) = 0;
645  momCov(1, 2) = 0;
646  }
647  // invert
648  momCov.Invert();
649  // place it
650  cov.Place_at(momCov, 0, 0);
651  // zero the rest
652  for (size_t i = 3; i < 5; ++i) {
653  for (size_t j = i; j < 5; ++j) {
654  cov(i, j) = 0;
655  }
656  }
657  }
658 }
Definition: start.py:1
ESGetTokenH3DDVariant esConsumes(std::string const &Record, edm::ConsumesCollector &)
Definition: DeDxTools.cc:283
T getParameter(std::string const &) const
Definition: ParameterSet.h:307
FreeTrajectoryState startingState(const reco::Candidate &reco, WhichTrack whichTrack, WhichState whichState) const
Starting state for the propagation.
const AlgebraicSymMatrix55 & covarianceMatrix() const
T perp() const
Definition: PV3DBase.h:69
edm::ESGetToken< GlobalTrackingGeometry, GlobalTrackingGeometryRecord > geometryToken_
bool match(const reco::Candidate &c1, const reco::Candidate &c2, float &deltaR, float &deltaEta, float &deltaPhi, float &deltaLocalPos, float &deltaPtRel, float &chi2) const
TrajectoryStateOnSurface outerStateOnSurface(const reco::Track &tk, const TrackingGeometry &geom, const MagneticField *field, bool withErr=true)
TrajectoryStateOnSurface targetState(const reco::Candidate &reco, WhichTrack whichTrack, WhichState whichState) const
End state for the propagation.
ret
prodAgent to be discontinued
void getConf(const edm::ParameterSet &iConfig, const std::string &whatFor, WhichTrack &whichTrack, WhichState &whichState)
Parse some configuration.
T eta() const
Definition: PV3DBase.h:73
bool matchWithPropagation(const FreeTrajectoryState &start, const FreeTrajectoryState &target, float &lastDeltaR, float &lastDeltaEta, float &lastDeltaPhi, float &lastDeltaLocalPos, float &lastGlobalDPtRel, float &lastChi2) const
Global3DPoint GlobalPoint
Definition: GlobalPoint.h:10
bool isNonnull() const
Checks for non-null.
Definition: Ref.h:232
std::optional< PerigeeTrajectoryParameters > ftsToPerigeeParameters(const FTS &originalFTS, const GlobalPoint &referencePoint, double &pt)
edm::ESGetToken< MagneticField, IdealMagneticFieldRecord > magfieldToken_
bool existsAs(std::string const &parameterName, bool trackiness=true) const
checks if a parameter exists as a given type
Definition: ParameterSet.h:172
static double getChi2(const FreeTrajectoryState &start, const FreeTrajectoryState &other, bool diagonalOnly, bool useVertex, bool useFirstMomentum)
TrajectoryStateOnSurface propagate(STA const &state, SUR const &surface) const
Definition: Propagator.h:50
T barePhi() const
Definition: PV3DBase.h:65
StringCutObjectSelector< reco::Candidate, true > matchedCut_
T const * product() const
Definition: ESHandle.h:86
edm::ESHandle< GlobalTrackingGeometry > geometry_
edm::ESHandle< MagneticField > magfield_
ROOT::Math::SVector< double, 5 > AlgebraicVector5
StringCutObjectSelector< reco::Candidate, true > srcCut_
virtual int charge() const =0
electric charge
bool isNull() const
Checks for null.
Definition: Ref.h:229
ESHandle< T > getHandle(const ESGetToken< T, R > &iToken) const
Definition: EventSetup.h:130
edm::ESHandle< Propagator > propagator_
MatcherUsingTracksAlgorithm(const edm::ParameterSet &iConfig, edm::ConsumesCollector)
bool matchByDirectComparison(const FreeTrajectoryState &start, const FreeTrajectoryState &other, float &lastDeltaR, float &lastDeltaEta, float &lastDeltaPhi, float &lastDeltaLocalPos, float &lastGlobalDPtRel, float &lastChi2) const
Compare directly two states. return true if current pair is the new best match (in that case...
T mag() const
The vector magnitude. Equivalent to sqrt(vec.mag2())
ROOT::Math::SMatrix< double, 5, 5, ROOT::Math::MatRepSym< double, 5 > > AlgebraicSymMatrix55
GlobalVector globalMomentum() const
static void cropAndInvert(AlgebraicSymMatrix55 &cov, bool diagonalOnly, bool top3by3only)
Possibly crop the 3x3 part of the matrix or remove off-diagonal terms, then invert.
edm::ESGetToken< Propagator, TrackingComponentsRecord > propagatorToken_
fixed size matrix
HLT enums.
boost::indirect_iterator< typename seq_t::const_iterator > const_iterator
Definition: View.h:88
virtual reco::TrackRef track() const
reference to a Track
void init(const edm::EventSetup &iSetup)
Call this method at the beginning of each run, to initialize geometry, magnetic field and propagators...
ROOT::Math::SMatrix< double, 3, 3, ROOT::Math::MatRepSym< double, 3 > > AlgebraicSymMatrix33
virtual reco::TrackRef combinedMuon() const
reference to a stand-alone muon Track
PerigeeTrajectoryError ftsToPerigeeError(const FTS &originalFTS)
const_iterator begin() const
FreeTrajectoryState innerFreeState(const reco::Track &tk, const MagneticField *field, bool withErr=true)
Log< level::Warning, false > LogWarning
Definition: Chi2.h:15
reco::TrackRef getTrack(const reco::Candidate &reco, WhichTrack which) const
Get track reference out of a Candidate (via dynamic_cast to reco::RecoCandidate)
FreeTrajectoryState outerFreeState(const reco::Track &tk, const MagneticField *field, bool withErr=true)
FreeTrajectoryState initialFreeState(const reco::Track &tk, const MagneticField *field, bool withErr=true)
const_iterator end() const
Global3DVector GlobalVector
Definition: GlobalVector.h:10
TrajectoryStateOnSurface innerStateOnSurface(const reco::Track &tk, const TrackingGeometry &geom, const MagneticField *field, bool withErr=true)
virtual reco::TrackRef standAloneMuon() const
reference to a stand-alone muon Track
def exit(msg="")