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  std::string algo = iConfig.getParameter<std::string>("algorithm");
32  if (algo == "byTrackRef") {
33  algo_ = ByTrackRef;
34  } else if (algo == "byPropagatingSrc") {
36  } else if (algo == "byPropagatingMatched") {
38  } else if (algo == "byDirectComparison") {
40  } else
41  throw cms::Exception("Configuration") << "Value '" << algo << "' for algorithm not yet implemented.\n";
42 
43  getConf(iConfig, "src", whichTrack1_, whichState1_);
44  getConf(iConfig, "matched", whichTrack2_, whichState2_);
45 
46  if (algo_ == ByTrackRef) {
47  // validate the config
48  if (whichTrack1_ == None || whichTrack2_ == None)
49  throw cms::Exception("Configuration") << "Algorithm 'byTrackRef' needs tracks not to be 'none'.\n";
51  // read matching cuts
52  maxLocalPosDiff_ = iConfig.getParameter<double>("maxDeltaLocalPos");
53  maxGlobalMomDeltaR_ = iConfig.getParameter<double>("maxDeltaR");
55  iConfig.existsAs<double>("maxDeltaEta") ? iConfig.getParameter<double>("maxDeltaEta") : maxGlobalMomDeltaR_;
57  iConfig.existsAs<double>("maxDeltaPhi") ? iConfig.getParameter<double>("maxDeltaPhi") : maxGlobalMomDeltaR_;
58  maxGlobalDPtRel_ = iConfig.getParameter<double>("maxDeltaPtRel");
59 
60  // choice of sorting variable
61  std::string sortBy = iConfig.getParameter<std::string>("sortBy");
62  if (sortBy == "deltaLocalPos")
64  else if (sortBy == "deltaPtRel")
66  else if (sortBy == "deltaR")
68  else if (sortBy == "deltaEta")
70  else if (sortBy == "deltaPhi")
72  else if (sortBy == "chi2")
73  sortBy_ = Chi2;
74  else
75  throw cms::Exception("Configuration")
76  << "Parameter 'sortBy' must be one of: deltaLocalPos, deltaPtRel, deltaR, chi2.\n";
77  // validate the config
78  if (algo_ == ByPropagatingSrc) {
79  if (whichTrack2_ == None || whichState2_ == AtVertex) {
81  //throw cms::Exception("Configuration") << "Destination track must be non-null, and state must not be 'AtVertex' (not yet).\n";
82  }
83  } else if (algo_ == ByPropagatingMatched) {
84  if (whichTrack1_ == None || whichState1_ == AtVertex) {
86  //throw cms::Exception("Configuration") << "Destination track must be non-null, and state must not be 'AtVertex' (not yet).\n";
87  }
88  } else if (algo_ == ByDirectComparison) {
89  bool firstAtVertex = (whichTrack1_ == None || whichState1_ == AtVertex);
90  bool secAtVertex = (whichTrack2_ == None || whichState2_ == AtVertex);
91  if (firstAtVertex) {
92  if (!secAtVertex)
93  throw cms::Exception("Configuration")
94  << "When using 'byDirectComparison' with 'src' at vertex (or None), 'matched' must be at vertex too.\n";
95  } else {
96  if (secAtVertex)
97  throw cms::Exception("Configuration")
98  << "When using 'byDirectComparison' with 'src' not at vertex, 'matched' can't be at vertex or None.\n";
100  throw cms::Exception("Configuration") << "You can't use 'byDirectComparison' with non-matching states.\n";
101  }
102  }
103 
104  useChi2_ = iConfig.existsAs<bool>("computeChi2") ? iConfig.getParameter<bool>("computeChi2") : false;
105  if (useChi2_) {
106  if (whichTrack1_ == None && whichTrack2_ == None)
107  throw cms::Exception("Configuration") << "Can't compute chi2s if both tracks are set to 'none'.\n";
108  maxChi2_ = iConfig.getParameter<double>("maxChi2");
109  chi2DiagonalOnly_ = iConfig.getParameter<bool>("chi2DiagonalOnly");
111  chi2UseVertex_ = iConfig.getParameter<bool>("chi2UsePosition");
112  } else {
113  chi2UseVertex_ = iConfig.getParameter<bool>("chi2UseVertex");
114  if (algo_ == ByDirectComparison) {
115  std::string choice = iConfig.getParameter<std::string>("chi2MomentumForDxy");
116  if (choice == "src")
117  chi2FirstMomentum_ = true;
118  else if (choice != "matched")
119  throw cms::Exception("Configuration") << "chi2MomentumForDxy must be 'src' or 'matched'\n";
120  }
121  }
122  } else
123  maxChi2_ = 1;
124 
125  if (sortBy_ == Chi2 && !useChi2_)
126  throw cms::Exception("Configuration") << "Can't sort by chi2s if 'computeChi2s' is not set to true.\n";
127  }
128 }
129 
131  const std::string &whatFor,
132  WhichTrack &whichTrack,
133  WhichState &whichState) {
134  std::string s_whichTrack = iConfig.getParameter<std::string>(whatFor + "Track");
135  if (s_whichTrack == "none") {
136  whichTrack = None;
137  } else if (s_whichTrack == "tracker") {
138  whichTrack = TrackerTk;
139  } else if (s_whichTrack == "muon") {
140  whichTrack = MuonTk;
141  } else if (s_whichTrack == "global") {
142  whichTrack = GlobalTk;
143  } else
144  throw cms::Exception("Configuration") << "Parameter 'useTrack' must be 'none', 'tracker', 'muon', 'global'\n";
145  if ((whichTrack != None) && (algo_ != ByTrackRef)) {
146  std::string s_whichState = iConfig.getParameter<std::string>(whatFor + "State");
147  if (s_whichState == "atVertex") {
148  whichState = AtVertex;
149  } else if (s_whichState == "innermost") {
150  whichState = Innermost;
151  } else if (s_whichState == "outermost") {
152  whichState = Outermost;
153  } else
154  throw cms::Exception("Configuration") << "Parameter 'useState' must be 'atVertex', 'innermost', 'outermost'\n";
155  }
156 }
157 
161  const reco::Candidate &c2,
162  float &deltR,
163  float &deltEta,
164  float &deltPhi,
165  float &deltaLocalPos,
166  float &deltaPtRel,
167  float &chi2) const {
168  if (!(srcCut_(c1) && matchedCut_(c2)))
169  return false;
170  if (requireSameCharge_ && (c1.charge() != c2.charge()))
171  return false;
172  switch (algo_) {
173  case ByTrackRef: {
176  if (t1.isNonnull()) {
177  if (t1 == t2)
178  return true;
179  if (t1.id() != t2.id()) {
180  edm::LogWarning("MatcherUsingTracksAlgorithm")
181  << "Trying to match by reference tracks coming from different collections.\n";
182  }
183  }
184  }
185  [[fallthrough]];
186  case ByPropagatingSrc: {
189  return matchWithPropagation(start, target, deltR, deltEta, deltPhi, deltaLocalPos, deltaPtRel, chi2);
190  }
191  case ByPropagatingMatched: {
194  return matchWithPropagation(start, target, deltR, deltEta, deltPhi, deltaLocalPos, deltaPtRel, chi2);
195  }
196  case ByPropagatingSrcTSCP: {
199  return matchWithPropagation(start, target, deltR, deltEta, deltPhi, deltaLocalPos, deltaPtRel, chi2);
200  }
204  return matchWithPropagation(start, target, deltR, deltEta, deltPhi, deltaLocalPos, deltaPtRel, chi2);
205  }
206 
207  case ByDirectComparison: {
210  return matchByDirectComparison(start, otherstart, deltR, deltEta, deltPhi, deltaLocalPos, deltaPtRel, chi2);
211  }
212  }
213  return false;
214 }
215 
220  const edm::View<reco::Candidate> &c2s,
221  float &deltR,
222  float &deltEta,
223  float &deltPhi,
224  float &deltaLocalPos,
225  float &deltaPtRel,
226  float &chi2) const {
227  if (!srcCut_(c1))
228  return -1;
229 
230  // working and output variables
233  int match = -1;
234 
235  // pre-fetch some states if needed
239  } else if (algo_ == ByPropagatingMatched)
240  target = targetState(c1, whichTrack1_, whichState1_);
241 
242  // loop on the collection
244  int i;
245  for (it = c2s.begin(), ed = c2s.end(), i = 0; it != ed; ++it, ++i) {
246  if (!matchedCut_(*it))
247  continue;
248  if (requireSameCharge_ && (c1.charge() != it->charge()))
249  continue;
250  bool exit = false;
251  switch (algo_) {
252  case ByTrackRef: {
255  if (t1.isNonnull()) {
256  if (t1 == t2) {
257  match = i;
258  exit = true;
259  }
260  if (t1.id() != t2.id()) {
261  edm::LogWarning("MatcherUsingTracksAlgorithm")
262  << "Trying to match by reference tracks coming from different collections.\n";
263  }
264  }
265  } break;
266  case ByPropagatingSrc:
267  case ByPropagatingMatched: {
269  start = startingState(*it, whichTrack2_, whichState2_);
270  else if (algo_ == ByPropagatingSrc)
271  target = targetState(*it, whichTrack2_, whichState2_);
272  if (matchWithPropagation(start, target, deltR, deltEta, deltPhi, deltaLocalPos, deltaPtRel, chi2)) {
273  match = i;
274  }
275  } break;
276  case ByDirectComparison: {
278  if (matchByDirectComparison(start, otherstart, deltR, deltEta, deltPhi, deltaLocalPos, deltaPtRel, chi2)) {
279  match = i;
280  }
281  } break;
282  case ByPropagatingSrcTSCP: {
284  if (matchWithPropagation(start, otherstart, deltR, deltEta, deltPhi, deltaLocalPos, deltaPtRel, chi2)) {
285  match = i;
286  }
287  } break;
290  if (matchWithPropagation(otherstart, start, deltR, deltEta, deltPhi, deltaLocalPos, deltaPtRel, chi2)) {
291  match = i;
292  }
293  } break;
294  }
295  if (exit)
296  break;
297  }
298 
299  return match;
300 }
301 
303  iSetup.get<IdealMagneticFieldRecord>().get(magfield_);
304  iSetup.get<TrackingComponentsRecord>().get("SteppingHelixPropagatorAny", propagator_);
306 }
307 
309  reco::TrackRef tk;
310  const reco::RecoCandidate *rc = dynamic_cast<const reco::RecoCandidate *>(&reco);
311  if (rc == nullptr)
312  throw cms::Exception("Invalid Data") << "Input object is not a RecoCandidate.\n";
313  switch (whichTrack) {
314  case TrackerTk:
315  tk = rc->track();
316  break;
317  case MuonTk:
318  tk = rc->standAloneMuon();
319  break;
320  case GlobalTk:
321  tk = rc->combinedMuon();
322  break;
323  default:
324  break; // just to make gcc happy
325  }
326  return tk;
327 }
328 
330  WhichTrack whichTrack,
331  WhichState whichState) const {
333  if (whichTrack != None) {
334  reco::TrackRef tk = getTrack(reco, whichTrack);
335  if (tk.isNull()) {
336  ret = FreeTrajectoryState();
337  } else {
338  switch (whichState) {
339  case AtVertex:
341  break;
342  case Innermost:
344  break;
345  case Outermost:
347  break;
348  }
349  }
350  } else {
351  ret = FreeTrajectoryState(GlobalPoint(reco.vx(), reco.vy(), reco.vz()),
352  GlobalVector(reco.px(), reco.py(), reco.pz()),
353  reco.charge(),
354  magfield_.product());
355  }
356  return ret;
357 }
358 
360  WhichTrack whichTrack,
361  WhichState whichState) const {
363  reco::TrackRef tk = getTrack(reco, whichTrack);
364  if (tk.isNonnull()) {
365  switch (whichState) {
366  case Innermost:
368  break;
369  case Outermost:
371  break;
372  default:
373  break; // just to make gcc happy
374  }
375  }
376  return ret;
377 }
378 
381  float &lastDeltaR,
382  float &lastDeltaEta,
383  float &lastDeltaPhi,
384  float &lastDeltaLocalPos,
385  float &lastGlobalDPtRel,
386  float &lastChi2) const {
387  if ((start.momentum().mag() == 0) || !target.isValid())
388  return false;
389 
390  TrajectoryStateOnSurface tsos = propagator_->propagate(start, target.surface());
391 
392  bool isBest = false;
393  if (tsos.isValid()) {
394  float thisLocalPosDiff = (tsos.localPosition() - target.localPosition()).mag();
395  float thisGlobalMomDeltaR = deltaR(tsos.globalMomentum(), target.globalMomentum());
396  float thisGlobalMomDeltaPhi = fabs(deltaPhi(tsos.globalMomentum().barePhi(), target.globalMomentum().barePhi()));
397  float thisGlobalMomDeltaEta = fabs(tsos.globalMomentum().eta() - target.globalMomentum().eta());
398  float thisGlobalDPtRel =
399  (tsos.globalMomentum().perp() - target.globalMomentum().perp()) / target.globalMomentum().perp();
400 
401  if ((thisLocalPosDiff < maxLocalPosDiff_) && (thisGlobalMomDeltaR < maxGlobalMomDeltaR_) &&
402  (thisGlobalMomDeltaEta < maxGlobalMomDeltaEta_) && (thisGlobalMomDeltaPhi < maxGlobalMomDeltaPhi_) &&
403  (fabs(thisGlobalDPtRel) < maxGlobalDPtRel_)) {
404  float thisChi2 = useChi2_ ? getChi2(target, tsos, chi2DiagonalOnly_, chi2UseVertex_) : 0;
405  if (thisChi2 >= maxChi2_)
406  return false;
407  switch (sortBy_) {
408  case LocalPosDiff:
409  isBest = (thisLocalPosDiff < lastDeltaLocalPos);
410  break;
411  case GlobalMomDeltaR:
412  isBest = (thisGlobalMomDeltaR < lastDeltaR);
413  break;
414  case GlobalMomDeltaEta:
415  isBest = (thisGlobalMomDeltaEta < lastDeltaEta);
416  break;
417  case GlobalMomDeltaPhi:
418  isBest = (thisGlobalMomDeltaPhi < lastDeltaPhi);
419  break;
420  case GlobalDPtRel:
421  isBest = (thisGlobalDPtRel < lastGlobalDPtRel);
422  break;
423  case Chi2:
424  isBest = (thisChi2 < lastChi2);
425  break;
426  }
427  if (isBest) {
428  lastDeltaLocalPos = thisLocalPosDiff;
429  lastDeltaR = thisGlobalMomDeltaR;
430  lastDeltaEta = thisGlobalMomDeltaEta;
431  lastDeltaPhi = thisGlobalMomDeltaPhi;
432  lastGlobalDPtRel = thisGlobalDPtRel;
433  lastChi2 = thisChi2;
434  }
435  } // if match
436  }
437 
438  return isBest;
439 }
440 
443  float &lastDeltaR,
444  float &lastDeltaEta,
445  float &lastDeltaPhi,
446  float &lastDeltaLocalPos,
447  float &lastGlobalDPtRel,
448  float &lastChi2) const {
449  if ((start.momentum().mag() == 0) || (target.momentum().mag() == 0))
450  return false;
452  /*2.2.X*/ try {
453  TrajectoryStateClosestToPoint tscp = propagator(start, target.position());
454  // if (!tscp.isValid()) return false; // in 3.1.X
455 
456  bool isBest = false;
457  float thisLocalPosDiff = (tscp.position() - target.position()).mag();
458  float thisGlobalMomDeltaR = deltaR(tscp.momentum(), target.momentum());
459  float thisGlobalMomDeltaPhi = fabs(deltaPhi(tscp.momentum().barePhi(), target.momentum().barePhi()));
460  float thisGlobalMomDeltaEta = fabs(tscp.momentum().eta() - target.momentum().eta());
461  float thisGlobalDPtRel = (tscp.momentum().perp() - target.momentum().perp()) / target.momentum().perp();
462 
463  if ((thisLocalPosDiff < maxLocalPosDiff_) && (thisGlobalMomDeltaR < maxGlobalMomDeltaR_) &&
464  (thisGlobalMomDeltaEta < maxGlobalMomDeltaEta_) && (thisGlobalMomDeltaPhi < maxGlobalMomDeltaPhi_) &&
465  (fabs(thisGlobalDPtRel) < maxGlobalDPtRel_)) {
466  float thisChi2 = useChi2_ ? getChi2(target, tscp, chi2DiagonalOnly_, chi2UseVertex_) : 0;
467  if (thisChi2 >= maxChi2_)
468  return false;
469  switch (sortBy_) {
470  case LocalPosDiff:
471  isBest = (thisLocalPosDiff < lastDeltaLocalPos);
472  break;
473  case GlobalMomDeltaR:
474  isBest = (thisGlobalMomDeltaR < lastDeltaR);
475  break;
476  case GlobalMomDeltaEta:
477  isBest = (thisGlobalMomDeltaEta < lastDeltaEta);
478  break;
479  case GlobalMomDeltaPhi:
480  isBest = (thisGlobalMomDeltaPhi < lastDeltaPhi);
481  break;
482  case GlobalDPtRel:
483  isBest = (thisGlobalDPtRel < lastGlobalDPtRel);
484  break;
485  case Chi2:
486  isBest = (thisChi2 < lastChi2);
487  break;
488  }
489  if (isBest) {
490  lastDeltaLocalPos = thisLocalPosDiff;
491  lastDeltaR = thisGlobalMomDeltaR;
492  lastDeltaEta = thisGlobalMomDeltaEta;
493  lastDeltaPhi = thisGlobalMomDeltaPhi;
494  lastGlobalDPtRel = thisGlobalDPtRel;
495  lastChi2 = thisChi2;
496  }
497  } // if match
498 
499  return isBest;
500  /*2.2.X*/ } catch (const TrajectoryStateException &err) { return false; }
501 }
502 
505  float &lastDeltaR,
506  float &lastDeltaEta,
507  float &lastDeltaPhi,
508  float &lastDeltaLocalPos,
509  float &lastGlobalDPtRel,
510  float &lastChi2) const {
511  if ((start.momentum().mag() == 0) || target.momentum().mag() == 0)
512  return false;
513 
514  bool isBest = false;
515  float thisLocalPosDiff = (start.position() - target.position()).mag();
516  float thisGlobalMomDeltaR = deltaR(start.momentum(), target.momentum());
517  float thisGlobalMomDeltaPhi = fabs(deltaPhi(start.momentum().barePhi(), target.momentum().barePhi()));
518  float thisGlobalMomDeltaEta = fabs(start.momentum().eta() - target.momentum().eta());
519  float thisGlobalDPtRel = (start.momentum().perp() - target.momentum().perp()) / target.momentum().perp();
520 
521  if ((thisLocalPosDiff < maxLocalPosDiff_) && (thisGlobalMomDeltaR < maxGlobalMomDeltaR_) &&
522  (thisGlobalMomDeltaEta < maxGlobalMomDeltaEta_) && (thisGlobalMomDeltaPhi < maxGlobalMomDeltaPhi_) &&
523  (fabs(thisGlobalDPtRel) < maxGlobalDPtRel_)) {
524  float thisChi2 = useChi2_ ? getChi2(start, target, chi2DiagonalOnly_, chi2UseVertex_, chi2FirstMomentum_) : 0;
525  if (thisChi2 >= maxChi2_)
526  return false;
527  switch (sortBy_) {
528  case LocalPosDiff:
529  isBest = (thisLocalPosDiff < lastDeltaLocalPos);
530  break;
531  case GlobalMomDeltaR:
532  isBest = (thisGlobalMomDeltaR < lastDeltaR);
533  break;
534  case GlobalMomDeltaEta:
535  isBest = (thisGlobalMomDeltaEta < lastDeltaEta);
536  break;
537  case GlobalMomDeltaPhi:
538  isBest = (thisGlobalMomDeltaPhi < lastDeltaPhi);
539  break;
540  case GlobalDPtRel:
541  isBest = (thisGlobalDPtRel < lastGlobalDPtRel);
542  break;
543  case Chi2:
544  isBest = (thisChi2 < lastChi2);
545  break;
546  }
547  if (isBest) {
548  lastDeltaLocalPos = thisLocalPosDiff;
549  lastDeltaR = thisGlobalMomDeltaR;
550  lastDeltaEta = thisGlobalMomDeltaEta;
551  lastDeltaPhi = thisGlobalMomDeltaPhi;
552  lastGlobalDPtRel = thisGlobalDPtRel;
553  lastChi2 = thisChi2;
554  }
555  } // if match
556 
557  return isBest;
558 }
559 
561  const FreeTrajectoryState &other,
562  bool diagonalOnly,
563  bool useVertex,
564  bool useFirstMomentum) {
565  if (!start.hasError() && !other.hasError())
566  throw cms::Exception("LogicError") << "At least one of the two states must have errors to make chi2s.\n";
568  if (start.hasError())
569  cov += start.curvilinearError().matrix();
570  if (other.hasError())
571  cov += other.curvilinearError().matrix();
572  cropAndInvert(cov, diagonalOnly, !useVertex);
573  GlobalVector p1 = start.momentum(), p2 = other.momentum();
574  GlobalPoint x1 = start.position(), x2 = other.position();
575  GlobalVector p = useFirstMomentum ? p1 : p2;
576  double pt = p.perp(), pm = p.mag();
577  double dsz = (x1.z() - x2.z()) * pt / pm - ((x1.x() - x2.x()) * p.x() + (x1.y() - x2.y()) * p.y()) / pt * p.z() / pm;
578  double dxy = (-(x1.x() - x2.x()) * p.y() + (x1.y() - x2.y()) * p.x()) / pt;
579  AlgebraicVector5 diff(start.charge() / p1.mag() - other.charge() / p2.mag(),
580  p1.theta() - p2.theta(),
581  (p1.phi() - p2.phi()).value(),
582  dxy,
583  dsz);
584  return ROOT::Math::Similarity(diff, cov);
585 }
586 
589  bool diagonalOnly,
590  bool useVertex) {
591  if (!start.hasError() && !other.hasError())
592  throw cms::Exception("LogicError") << "At least one of the two states must have errors to make chi2s.\n";
593  double pt; // needed by pgconvert
595  if (start.hasError())
597  if (other.hasError())
598  cov += other.perigeeError().covarianceMatrix();
599  cropAndInvert(cov, diagonalOnly, !useVertex);
601  AlgebraicVector5 pgpar2 = other.perigeeParameters().vector();
602  AlgebraicVector5 diff(pgpar1 - pgpar2);
603  return ROOT::Math::Similarity(diff, cov);
604 }
605 
608  bool diagonalOnly,
609  bool usePosition) {
610  if (!start.hasError() && !other.hasError())
611  throw cms::Exception("LogicError") << "At least one of the two states must have errors to make chi2s.\n";
613  if (start.hasError())
614  cov += start.localError().matrix();
615  if (other.hasError())
616  cov += other.localError().matrix();
617  cropAndInvert(cov, diagonalOnly, !usePosition);
619  return ROOT::Math::Similarity(diff, cov);
620 }
621 
623  if (!top3by3only) {
624  if (diagonalOnly) {
625  for (size_t i = 0; i < 5; ++i) {
626  for (size_t j = i + 1; j < 5; ++j) {
627  cov(i, j) = 0;
628  }
629  }
630  }
631  cov.Invert();
632  } else {
633  // get 3x3 covariance
634  AlgebraicSymMatrix33 momCov = cov.Sub<AlgebraicSymMatrix33>(0, 0); // get 3x3 matrix
635  if (diagonalOnly) {
636  momCov(0, 1) = 0;
637  momCov(0, 2) = 0;
638  momCov(1, 2) = 0;
639  }
640  // invert
641  momCov.Invert();
642  // place it
643  cov.Place_at(momCov, 0, 0);
644  // zero the rest
645  for (size_t i = 3; i < 5; ++i) {
646  for (size_t j = i; j < 5; ++j) {
647  cov(i, j) = 0;
648  }
649  }
650  }
651 }
Definition: start.py:1
T getParameter(std::string const &) const
const AlgebraicVector5 & vector() const
PerigeeTrajectoryParameters ftsToPerigeeParameters(const FTS &originalFTS, const GlobalPoint &referencePoint, double &pt)
virtual double pz() const =0
z coordinate of momentum vector
bool isNonnull() const
Checks for non-null.
Definition: Ref.h:238
bool existsAs(std::string const &parameterName, bool trackiness=true) const
checks if a parameter exists as a given type
Definition: ParameterSet.h:160
T perp() const
Definition: PV3DBase.h:69
virtual double vx() const =0
x coordinate of vertex position
const PerigeeTrajectoryError & perigeeError() const
const LocalTrajectoryParameters & localParameters() const
TrajectoryStateOnSurface outerStateOnSurface(const reco::Track &tk, const TrackingGeometry &geom, const MagneticField *field, bool withErr=true)
ret
prodAgent to be discontinued
T mag() const
The vector magnitude. Equivalent to sqrt(vec.mag2())
void getConf(const edm::ParameterSet &iConfig, const std::string &whatFor, WhichTrack &whichTrack, WhichState &whichState)
Parse some configuration.
Geom::Phi< T > phi() const
Definition: PV3DBase.h:66
Global3DPoint GlobalPoint
Definition: GlobalPoint.h:10
T y() const
Definition: PV3DBase.h:60
virtual double vy() const =0
y coordinate of vertex position
TrackCharge charge() const
virtual reco::TrackRef standAloneMuon() const
reference to a stand-alone muon Track
static double getChi2(const FreeTrajectoryState &start, const FreeTrajectoryState &other, bool diagonalOnly, bool useVertex, bool useFirstMomentum)
const CurvilinearTrajectoryError & curvilinearError() const
bool matchWithPropagation(const FreeTrajectoryState &start, const FreeTrajectoryState &target, float &lastDeltaR, float &lastDeltaEta, float &lastDeltaPhi, float &lastDeltaLocalPos, float &lastGlobalDPtRel, float &lastChi2) const
ProductID id() const
Accessor for product ID.
Definition: Ref.h:244
virtual reco::TrackRef track() const
reference to a Track
Geom::Theta< T > theta() const
Definition: PV3DBase.h:72
T barePhi() const
Definition: PV3DBase.h:65
StringCutObjectSelector< reco::Candidate, true > matchedCut_
virtual double py() const =0
y coordinate of momentum vector
const SurfaceType & surface() const
T mag() const
Definition: PV3DBase.h:64
const_iterator begin() const
const PerigeeTrajectoryParameters & perigeeParameters() const
edm::ESHandle< GlobalTrackingGeometry > geometry_
T z() const
Definition: PV3DBase.h:61
edm::ESHandle< MagneticField > magfield_
ROOT::Math::SVector< double, 5 > AlgebraicVector5
const AlgebraicSymMatrix55 & matrix() const
StringCutObjectSelector< reco::Candidate, true > srcCut_
MatcherUsingTracksAlgorithm(const edm::ParameterSet &iConfig)
const LocalTrajectoryError & localError() const
double p2[4]
Definition: TauolaWrapper.h:90
bool isNull() const
Checks for null.
Definition: Ref.h:235
GlobalVector momentum() const
edm::ESHandle< Propagator > propagator_
const AlgebraicSymMatrix55 & covarianceMatrix() const
TrajectoryStateOnSurface targetState(const reco::Candidate &reco, WhichTrack whichTrack, WhichState whichState) const
End state for the propagation.
GlobalPoint position() const
const GlobalPoint & referencePoint() const
FreeTrajectoryState startingState(const reco::Candidate &reco, WhichTrack whichTrack, WhichState whichState) const
Starting state for the propagation.
ROOT::Math::SMatrix< double, 5, 5, ROOT::Math::MatRepSym< double, 5 > > AlgebraicSymMatrix55
TrajectoryStateOnSurface propagate(STA const &state, SUR const &surface) const
Definition: Propagator.h:50
static void cropAndInvert(AlgebraicSymMatrix55 &cov, bool diagonalOnly, bool top3by3only)
Possibly crop the 3x3 part of the matrix or remove off-diagonal terms, then invert.
AlgebraicVector5 mixedFormatVector() const
T eta() const
Definition: PV3DBase.h:73
virtual int charge() const =0
electric charge
fixed size matrix
double p1[4]
Definition: TauolaWrapper.h:89
const AlgebraicSymMatrix55 & matrix() const
GlobalVector globalMomentum() const
boost::indirect_iterator< typename seq_t::const_iterator > const_iterator
Definition: View.h:86
T get() const
Definition: EventSetup.h:73
bool match(const reco::Candidate &c1, const reco::Candidate &c2, float &deltaR, float &deltaEta, float &deltaPhi, float &deltaLocalPos, float &deltaPtRel, float &chi2) const
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
PerigeeTrajectoryError ftsToPerigeeError(const FTS &originalFTS)
const_iterator end() const
virtual double vz() const =0
z coordinate of vertex position
reco::TrackRef getTrack(const reco::Candidate &reco, WhichTrack which) const
Get track reference out of a Candidate (via dynamic_cast to reco::RecoCandidate)
FreeTrajectoryState innerFreeState(const reco::Track &tk, const MagneticField *field, bool withErr=true)
virtual double px() const =0
x coordinate of momentum vector
Definition: Chi2.h:15
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 x() const
Definition: PV3DBase.h:59
FreeTrajectoryState outerFreeState(const reco::Track &tk, const MagneticField *field, bool withErr=true)
FreeTrajectoryState initialFreeState(const reco::Track &tk, const MagneticField *field, bool withErr=true)
T const * product() const
Definition: ESHandle.h:86
Global3DVector GlobalVector
Definition: GlobalVector.h:10
TrajectoryStateOnSurface innerStateOnSurface(const reco::Track &tk, const TrackingGeometry &geom, const MagneticField *field, bool withErr=true)
def exit(msg="")
virtual reco::TrackRef combinedMuon() const
reference to a stand-alone muon Track