Analysis Software
Documentation for sPHENIX simulation software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
GaussianTrackDensity.hpp
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file GaussianTrackDensity.hpp
1 // This file is part of the Acts project.
2 //
3 // Copyright (C) 2020 CERN for the benefit of the Acts project
4 //
5 // This Source Code Form is subject to the terms of the Mozilla Public
6 // License, v. 2.0. If a copy of the MPL was not distributed with this
7 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 
9 #pragma once
10 
12 
13 #include <map>
14 #include <set>
15 
16 namespace Acts {
17 
23 template <typename input_track_t>
25  public:
27  struct TrackEntry {
29  TrackEntry() = default;
37  TrackEntry(double z_, double c0_, double c1_, double c2_,
38  double lowerBound_, double upperBound_)
39  : z(z_),
40  c0(c0_),
41  c1(c1_),
42  c2(c2_),
43  lowerBound(lowerBound_),
44  upperBound(upperBound_) {}
45 
46  double z = 0;
47  // Cached information for a single track
48  // z-independent term in exponent
49  double c0 = 0;
50  // linear coefficient in exponent
51  double c1 = 0;
52  // quadratic coefficient in exponent
53  double c2 = 0;
54  // The lower bound
55  double lowerBound = 0;
56  // The upper bound
57  double upperBound = 0;
58  };
59 
61  struct Config {
62  Config(double d0Sig = 3.5, double z0Sig = 12.)
63  : d0MaxSignificance(d0Sig),
64  z0MaxSignificance(z0Sig),
65  d0SignificanceCut(d0Sig * d0Sig),
66  z0SignificanceCut(z0Sig * z0Sig) {}
67 
68  // Assumed shape of density function:
69  // Gaussian (true) or parabolic (false)
70  bool isGaussianShaped = true;
71 
72  // Maximum d0 impact parameter significance to use a track
74  // Maximum z0 impact parameter significance to use a track
76  // Corresponding cut values
79  };
80 
82  struct State {
83  // Constructor with size track map
84  State(unsigned int nTracks) { trackEntries.reserve(nTracks); }
85  // Vector to cache track information
86  std::vector<TrackEntry> trackEntries;
87  };
88 
90  GaussianTrackDensity() = default;
91 
94 
114  std::pair<double, double> globalMaximumWithWidth(
115  State& state, const std::vector<const input_track_t*>& trackList,
116  const std::function<BoundTrackParameters(input_track_t)>&
117  extractParameters) const;
118 
127  double globalMaximum(State& state,
128  const std::vector<const input_track_t*>& trackList,
129  const std::function<BoundTrackParameters(input_track_t)>&
130  extractParameters) const;
131 
132  private:
135 
143  State& state, const std::vector<const input_track_t*>& trackList,
144  const std::function<BoundTrackParameters(input_track_t)>&
145  extractParameters) const;
146 
154  std::tuple<double, double, double> trackDensityAndDerivatives(State& state,
155  double z) const;
156 
167  std::tuple<double, double, double> updateMaximum(
168  double newZ, double newValue, double newSecondDerivative, double maxZ,
169  double maxValue, double maxSecondDerivative) const;
170 
178  double stepSize(double y, double dy, double ddy) const;
179 
180  // Helper class to evaluate and store track density at specific position
182  public:
183  // Initialise at the z coordinate at which the density is to be evaluated
184  GaussianTrackDensityStore(double z_coordinate) : m_z(z_coordinate) {}
185 
186  // Add the contribution of a single track to the density
187  void addTrackToDensity(const TrackEntry& entry);
188 
189  // Return density, first and second derivatives
190  inline std::tuple<double, double, double> densityAndDerivatives() const {
192  }
193 
194  private:
195  // Store density and derivatives for z position m_z
196  double m_z;
197  double m_density{0};
198  double m_firstDerivative{0};
200  };
201 };
202 
203 } // namespace Acts
204