ATLAS Offline Software
Loading...
Searching...
No Matches
GaussianTrackDensity.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 TRKVERTEXSEEDFINDERUTILIS_GAUSSIANTRACKDENSITY_H
6#define TRKVERTEXSEEDFINDERUTILIS_GAUSSIANTRACKDENSITY_H
7
10
11#include <map>
12
14namespace Trk
15{
16
17 class Track;
19
30
31 class GaussianTrackDensity final: public extends<AthAlgTool, IVertexTrackDensityEstimator>
32 {
33 public:
35 using base_class::base_class;
36
41 virtual double
42 globalMaximum (const std::vector<const Track*>& vectorTrk) const override final;
43
49 virtual double
50 globalMaximum (const std::vector<const Track*>& vectorTrk,
51 std::unique_ptr<ITrackDensity>& density) const override final;
52
57 virtual double
58 globalMaximum (const std::vector<const TrackParameters*>& perigeeList) const override final;
59
65 virtual double
66 globalMaximum (const std::vector<const TrackParameters*>& perigeeList,
67 std::unique_ptr<ITrackDensity>& density) const override final;
68
69 virtual std::pair<double, double> globalMaximumWithWidth(
70 const std::vector<const TrackParameters*>& perigeeList)
71 const override final;
72
73 private:
74 struct TrackEntry {
75 TrackEntry() = default;
76 TrackEntry(const TrackEntry&) = default;
77 TrackEntry(TrackEntry&&) = default;
78 TrackEntry& operator=(const TrackEntry&) = default;
80 ~TrackEntry() = default;
81
82 TrackEntry(double c0, double c1, double c2, double zMin, double zMax)
83 : c_0(c0), c_1(c1), c_2(c2), lowerBound(zMin), upperBound(zMax) {}
84 explicit TrackEntry(double z)
85 : c_0(0), c_1(0), c_2(0), lowerBound(z), upperBound(z) {}
86 // Cached information for a single track
87 double c_0 = 0; // z-independent term in exponent
88 double c_1 = 1; // linear coefficient in exponent
89 double c_2 = 0; // quadratic coefficient in exponent
90 double lowerBound = 0;
91 double upperBound = 0;
92 };
93
94 // helper to handle the evaluation of the parametrised track density
96 public:
97 // initialise with the z coordinate at which the density is to be evaluated
98 TrackDensityEval(double z_coordinate): m_z(z_coordinate){}
99 // add the contribution for one track to the density.
100 // will internally check if the z coordinate is within
101 // the bounds of the track
102 void addTrack (const TrackEntry & entry);
103 // retrieve the density and its derivatives
104 inline double density() const {return m_density;}
105 inline double firstDerivative() const {return m_firstDerivative;}
106 inline double secondDerivative() const {return m_secondDerivative;}
107 private:
108 double m_z;
109 double m_density{0};
112 };
113
114 class TrackDensity final : public ITrackDensity {
115 public:
116 explicit TrackDensity(bool gaussStep) : m_gaussStep(gaussStep) {}
117 virtual ~TrackDensity() = default;
118
123 virtual double trackDensity(double z) const override final;
124
129 virtual void trackDensity(
130 double z, double& density, double& firstDerivative,
131 double& secondDerivative) const override final;
135 double globalMaximum() const;
140 std::pair<double, double> globalMaximumWithWidth() const;
147 void addTrack(const Perigee& itrk, const double d0SignificanceCut,
148 const double z0SignificanceCut);
149
150 private:
151 inline void updateMaximum(double trialZ, double trialValue,
152 double secondDerivative, double& maxZ,
153 double& maxValue,
154 double& maxSecondDerivative) const {
155 if (trialValue > maxValue) {
156 maxZ = trialZ;
157 maxValue = trialValue;
158 maxSecondDerivative = secondDerivative;
159 }
160 }
161
162 inline double stepSize(double y, double dy, double ddy) const {
163 return (m_gaussStep ? (y * dy) / (dy * dy - y * ddy) : -dy / ddy);
164 }
166 double m_maxRange = 0;
167 // Cache for track information
168 // functor to compare two Perigee values
170 inline bool operator()(const Perigee& left,
171 const Perigee& right) const {
172 return left.parameters()[Trk::z0] < right.parameters()[Trk::z0];
173 }
174 };
175 // functor to compare two TrackEntry values based on their upper limits (low
176 // to high)
178 inline bool operator()(const TrackEntry& left,
179 const TrackEntry& right) const {
180 return left.upperBound < right.upperBound;
181 }
182 };
183
184 using trackMap =
188
189 using lowerMap = std::map<
192 std::pair<const GaussianTrackDensity::TrackEntry, Perigee>>>;
193
196 };
197
203 double
204 globalMaximumImpl (const std::vector<const TrackParameters*>& perigeeList,
205 TrackDensity& density) const;
206
212 std::pair<double,double>
213 globalMaximumWithWidthImpl (const std::vector<const TrackParameters*>& perigeeList,
214 TrackDensity& density) const;
215
216
222 void addTracks(const std::vector<const TrackParameters*>& perigeeList,
223 TrackDensity& density) const;
224
225
226
227 // Cuts set by configurable properties
228
229 // Maximum allowed d0 significance to use (in sigma)
230 Gaudi::Property<double> m_d0MaxSignificance{
231 this,
232 "MaxD0Significance",
233 3.5,
234 "Maximum radial impact parameter significance to use track"
235 };
236
237 // Tracks within this many sigma(z) are added to weight; increasing cut
238 // trades CPU efficiency for improved smoothness in tails
239 Gaudi::Property<double> m_z0MaxSignificance{
240 this,
241 "MaxZ0Significance",
242 12.0,
243 "Maximum longitudinal impact parameter significance to include track in "
244 "weight"
245 };
246
247 // Assumed shape of density function near peak; Gaussian (true) or parabolic
248 // (false)
249 Gaudi::Property<bool> m_gaussStep{
250 this,
251 "GaussianStep",
252 true,
253 "Peak search: True means assume Gaussian behavior, False means "
254 "Newton/parabolic"
255 };
256 };
257}
258#endif
STL-style allocator wrapper for ArenaPoolAllocator.
#define maxValue(current, test)
STL-style allocator wrapper for ArenaPoolAllocator.
void addTrack(const Perigee &itrk, const double d0SignificanceCut, const double z0SignificanceCut)
Add a track to the set being considered.
std::map< Perigee, GaussianTrackDensity::TrackEntry, pred_perigee, SG::ArenaPoolSTLAllocator< std::pair< const Perigee, GaussianTrackDensity::TrackEntry > > > trackMap
std::map< GaussianTrackDensity::TrackEntry, Perigee, pred_entry_by_max, SG::ArenaPoolSTLAllocator< std::pair< const GaussianTrackDensity::TrackEntry, Perigee > > > lowerMap
std::pair< double, double > globalMaximumWithWidth() const
Return position of global maximum with Gaussian width for density function.
double stepSize(double y, double dy, double ddy) const
virtual double trackDensity(double z) const override final
Evaluate the density function at the specified coordinate along the beamline.
void updateMaximum(double trialZ, double trialValue, double secondDerivative, double &maxZ, double &maxValue, double &maxSecondDerivative) const
double globalMaximum() const
Return position of global maximum for density function.
Implementation of IVertexTrackDensityEstimator modeling reconstructed tracks as two-dimensional Gauss...
std::pair< double, double > globalMaximumWithWidthImpl(const std::vector< const TrackParameters * > &perigeeList, TrackDensity &density) const
Find position of global maximum with Gaussian width for density function.
Gaudi::Property< double > m_d0MaxSignificance
virtual double globalMaximum(const std::vector< const Track * > &vectorTrk) const override final
Find position of global maximum for density function.
Gaudi::Property< bool > m_gaussStep
void addTracks(const std::vector< const TrackParameters * > &perigeeList, TrackDensity &density) const
Add a set of tracks to a density object.
virtual std::pair< double, double > globalMaximumWithWidth(const std::vector< const TrackParameters * > &perigeeList) const override final
Gaudi::Property< double > m_z0MaxSignificance
double globalMaximumImpl(const std::vector< const TrackParameters * > &perigeeList, TrackDensity &density) const
Find position of global maximum for density function.
Ensure that the ATLAS eigen extensions are properly loaded.
ParametersT< TrackParametersDim, Charged, PerigeeSurface > Perigee
@ z
global position (cartesian)
Definition ParamDefs.h:57
@ y
Definition ParamDefs.h:56
@ z0
Definition ParamDefs.h:64
bool operator()(const TrackEntry &left, const TrackEntry &right) const
bool operator()(const Perigee &left, const Perigee &right) const
TrackEntry(double c0, double c1, double c2, double zMin, double zMax)
TrackEntry & operator=(const TrackEntry &)=default
TrackEntry(TrackEntry &&)=default
TrackEntry & operator=(TrackEntry &&)=default
TrackEntry(const TrackEntry &)=default