ATLAS Offline Software
MuonGetClosestParameters.h
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 #ifndef MUONGETCLOSESTPARAMETERS_H
6 #define MUONGETCLOSESTPARAMETERS_H
7 
9 #include "TrkSurfaces/Surface.h"
10 #include "TrkTrack/Track.h"
11 
12 namespace Muon {
13 
15  public:
16  static double distance(const Trk::TrackParameters& pars, const Amg::Vector3D& pos) {
17  return (pars.position() - pos).dot(pars.momentum().unit());
18  }
19  static std::unique_ptr<Trk::TrackParameters> closestParameters(const Trk::Track& track, const Amg::Vector3D& pos, bool onlyUseMeasured = false) {
20  const DataVector<const Trk::TrackParameters>* pars = track.trackParameters();
21  if (!pars || pars->empty()) { return nullptr; }
22 
23  bool firstOk = onlyUseMeasured ? pars->front()->covariance() != nullptr : true;
24  bool lastOk = onlyUseMeasured ? pars->back()->covariance() != nullptr : true;
25 
26  const double distFront = distance(*pars->front(), pos);
27  if (distFront > 0. && firstOk) { return pars->front()->uniqueClone(); }
28 
29  const double distBack = distance(*pars->back(), pos);
30  if (distBack < 0. && lastOk) { return pars->back()->uniqueClone(); }
31 
32  bool startFront = std::abs(distFront) < distBack;
33 
34  const Trk::TrackParameters* result{nullptr}, *prevresult{nullptr};
35  if (startFront) {
36  double prevDist = distFront - 1.;
37  // loop over parameters, calculate distance
40  for (; it != it_end; ++it) {
41  if (onlyUseMeasured && !(*it)->covariance()) continue;
42 
43  double dist = distance(**it, pos);
44  // check whether dist flips sign, if this happens select either the current hit or the previous
45  if (dist > 0.) {
46  if (std::abs(dist) < std::abs(prevDist))
47  result = *it;
48  else if (it == pars->begin())
49  result = *it;
50  else
51  result = prevresult;
52  break;
53  }
54  prevDist = dist;
55  prevresult = *it;
56  }
57  } else {
58  double prevDist = distBack + 1.;
59  // loop over parameters, calculate distance
62  for (; it != it_end; ++it) {
63  if (onlyUseMeasured && !(*it)->covariance()) continue;
64 
65  const double dist = distance(**it, pos);
66  // check whether dist flips sign, if this happens select either the current hit or the previous
67  if (dist < 0.) {
68  if (std::abs(dist) < std::abs(prevDist))
69  result = *it;
70  else if (it == pars->rbegin())
71  result = *it;
72  else
73  result = prevresult;
74  break;
75  }
76  prevDist = dist;
77  prevresult = *it;
78  }
79  }
80 
81  return result ? result->uniqueClone() : nullptr;
82  }
83 
84  static std::unique_ptr<Trk::TrackParameters> closestParameters(const Trk::Track& track,
85  const Trk::Surface& surf,
86  bool onlyUseMeasured = false) {
87  return closestParameters(track, surf.center(), onlyUseMeasured);
88  }
89 
90  static std::unique_ptr<Trk::TrackParameters> closestParameters(const Trk::Track& track,
92  bool onlyUseMeasured = false) {
93  return closestParameters(track, pars.position(), onlyUseMeasured);
94  }
95  };
96 
97 } // namespace Muon
98 
99 #endif
Muon::MuonGetClosestParameters::closestParameters
static std::unique_ptr< Trk::TrackParameters > closestParameters(const Trk::Track &track, const Trk::TrackParameters &pars, bool onlyUseMeasured=false)
Definition: MuonGetClosestParameters.h:90
make_hlt_rep.pars
pars
Definition: make_hlt_rep.py:90
DataModel_detail::const_iterator
Const iterator class for DataVector/DataList.
Definition: DVLIterator.h:82
get_generator_info.result
result
Definition: get_generator_info.py:21
TrackParameters.h
Surface.h
Trk::Track
The ATLAS Track class.
Definition: Tracking/TrkEvent/TrkTrack/TrkTrack/Track.h:73
Muon::MuonGetClosestParameters::closestParameters
static std::unique_ptr< Trk::TrackParameters > closestParameters(const Trk::Track &track, const Amg::Vector3D &pos, bool onlyUseMeasured=false)
Definition: MuonGetClosestParameters.h:19
skel.it
it
Definition: skel.GENtoEVGEN.py:423
Trk::Surface::center
const Amg::Vector3D & center() const
Returns the center position of the Surface.
Muon
This class provides conversion from CSC RDO data to CSC Digits.
Definition: TrackSystemController.h:49
Muon::MuonGetClosestParameters::distance
static double distance(const Trk::TrackParameters &pars, const Amg::Vector3D &pos)
Definition: MuonGetClosestParameters.h:16
Track.h
Muon::MuonGetClosestParameters::closestParameters
static std::unique_ptr< Trk::TrackParameters > closestParameters(const Trk::Track &track, const Trk::Surface &surf, bool onlyUseMeasured=false)
Definition: MuonGetClosestParameters.h:84
Trk::ParametersBase
Definition: ParametersBase.h:55
DataVector
Derived DataVector<T>.
Definition: DataVector.h:581
DataVector::const_reverse_iterator
std::reverse_iterator< const_iterator > const_reverse_iterator
Standard const_reverse_iterator.
Definition: DataVector.h:846
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition: GeoPrimitives.h:47
python.LumiBlobConversion.pos
pos
Definition: LumiBlobConversion.py:18
Muon::MuonGetClosestParameters
Definition: MuonGetClosestParameters.h:14
xAOD::track
@ track
Definition: TrackingPrimitives.h:512
Trk::Surface
Definition: Tracking/TrkDetDescr/TrkSurfaces/TrkSurfaces/Surface.h:75