7#include "GaudiKernel/PhysicalConstants.h"
22 std::vector<const TrackParameters*> perigeeList;
23 perigeeList.reserve(vectorTrk.size());
25 for (
const Track* itrk : vectorTrk)
27 perigeeList.push_back(itrk->perigeeParameters());
41 std::unique_ptr<ITrackDensity>& density)
const
43 std::vector<const TrackParameters*> perigeeList;
44 perigeeList.reserve(vectorTrk.size());
46 for (
const Track* itrk : vectorTrk)
48 perigeeList.push_back(itrk->perigeeParameters());
71 std::unique_ptr<ITrackDensity>& density)
const
73 auto d = std::make_unique<TrackDensity> (
m_gaussStep);
75 density = std::move(d);
80 const std::vector<const TrackParameters*>& perigeeList)
const {
132 double firstDeriv, secondDeriv = 0;
147 double& firstDerivative,
148 double& secondDerivative)
const
151 for (
const auto & trackAndPerigeePair :
m_lowerMap){
152 densityResult.
addTrack(trackAndPerigeePair.first);
154 density = densityResult.
density();
159 std::pair<double,double>
172 double maximumPosition = 0.0;
173 double maximumDensity = 0.0;
174 double maxCurvature = 0. ;
175 const std::pair<double,double> invalidResult(0.,std::numeric_limits<double>::quiet_NaN());
179 double trialZ = entry.first.parameters()[
Trk::z0];
180 double density = 0.0;
182 double curvature = 0.0;
184 if ( curvature >= 0.0 || density <= 0.0 ) {
187 updateMaximum( trialZ, density, curvature, maximumPosition, maximumDensity, maxCurvature);
188 trialZ +=
stepSize( density, slope, curvature );
190 if ( curvature >= 0.0 || density <= 0.0 ) {
193 updateMaximum( trialZ, density, curvature, maximumPosition, maximumDensity, maxCurvature);
194 trialZ +=
stepSize( density, slope, curvature );
196 if ( curvature >= 0.0 || density <= 0.0) {
199 updateMaximum( trialZ, density, curvature, maximumPosition, maximumDensity, maxCurvature);
201 if (maxCurvature == 0.)
return invalidResult;
202 return {maximumPosition,std::sqrt(-maximumDensity/maxCurvature)};
223 const double d0SignificanceCut,
224 const double z0SignificanceCut)
227 const double d0 = itrk.parameters()[
Trk::d0];
228 const double z0 = itrk.parameters()[
Trk::z0];
229 const AmgSymMatrix(5) & perigeeCov = *(itrk.covariance());
231 if ( cov_dd <= 0 )
return;
232 if (
d0*
d0/cov_dd > d0SignificanceCut )
return;
234 if (cov_zz <= 0 )
return;
236 const double covDeterminant = cov_dd*cov_zz - cov_dz*cov_dz;
237 if ( covDeterminant <= 0 )
return;
238 double constantTerm = -(
d0*
d0*cov_zz +
z0*
z0*cov_dd + 2*
d0*
z0*cov_dz) / (2*covDeterminant);
239 const double linearTerm = (
d0*cov_dz +
z0*cov_dd) / covDeterminant ;
240 const double quadraticTerm = -cov_dd / (2*covDeterminant);
241 double discriminant = linearTerm*linearTerm - 4*quadraticTerm*(constantTerm + 2*z0SignificanceCut);
242 if (discriminant < 0)
return;
243 discriminant = std::sqrt(discriminant);
244 const double zMax = (-linearTerm - discriminant)/(2*quadraticTerm);
245 const double zMin = (-linearTerm + discriminant)/(2*quadraticTerm);
247 constantTerm -= std::log(2*
M_PI*std::sqrt(covDeterminant));
249 std::forward_as_tuple(itrk),
250 std::forward_as_tuple(constantTerm, linearTerm, quadraticTerm, zMin, zMax));
252 std::forward_as_tuple(constantTerm, linearTerm, quadraticTerm, zMin, zMax),
253 std::forward_as_tuple(itrk));
258 if (entry.lowerBound <
m_z && entry.upperBound >
m_z) {
259 double delta = std::exp(entry.c_0+
m_z*(entry.c_1 +
m_z*entry.c_2));
260 double qPrime = entry.c_1 + 2*
m_z*entry.c_2;
261 double deltaPrime = delta * qPrime;
#define AmgSymMatrix(dim)
void addTrack(const Perigee &itrk, const double d0SignificanceCut, const double z0SignificanceCut)
Add a track to the set being considered.
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.
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.
virtual double globalMaximum(const std::vector< const Track * > &vectorTrk, std::unique_ptr< ITrackDensity > &density) const override final
Find position of global maximum 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)
ParametersBase< TrackParametersDim, Charged > TrackParameters
void addTrack(const TrackEntry &entry)
double firstDerivative() const
double m_secondDerivative
double secondDerivative() const