ATLAS Offline Software
Loading...
Searching...
No Matches
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
10#include "TrkTrack/Track.h"
11
12namespace 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,
91 const Trk::TrackParameters& pars,
92 bool onlyUseMeasured = false) {
93 return closestParameters(track, pars.position(), onlyUseMeasured);
94 }
95 };
96
97} // namespace Muon
98
99#endif
Derived DataVector<T>.
Definition DataVector.h:795
DataModel_detail::const_iterator< DataVector > const_iterator
Standard const_iterator.
Definition DataVector.h:838
std::reverse_iterator< const_iterator > const_reverse_iterator
Standard const_reverse_iterator.
Definition DataVector.h:847
static std::unique_ptr< Trk::TrackParameters > closestParameters(const Trk::Track &track, const Trk::Surface &surf, bool onlyUseMeasured=false)
static std::unique_ptr< Trk::TrackParameters > closestParameters(const Trk::Track &track, const Trk::TrackParameters &pars, bool onlyUseMeasured=false)
static double distance(const Trk::TrackParameters &pars, const Amg::Vector3D &pos)
static std::unique_ptr< Trk::TrackParameters > closestParameters(const Trk::Track &track, const Amg::Vector3D &pos, bool onlyUseMeasured=false)
Abstract Base Class for tracking surfaces.
const Amg::Vector3D & center() const
Returns the center position of the Surface.
Eigen::Matrix< double, 3, 1 > Vector3D
NRpcCablingAlg reads raw condition data and writes derived condition data to the condition store.
ParametersBase< TrackParametersDim, Charged > TrackParameters