diff --git a/Tracking/TrkVertexFitter/TrkVertexFitterInterfaces/TrkVertexFitterInterfaces/IVertexTrackDensityEstimator.h b/Tracking/TrkVertexFitter/TrkVertexFitterInterfaces/TrkVertexFitterInterfaces/IVertexTrackDensityEstimator.h index 01c1bb1a39c7137fbdbeaf1fcf039744014b7dd7..f6d60e480cb7da24a35b0ba2c80bc7d03f994884 100755 --- a/Tracking/TrkVertexFitter/TrkVertexFitterInterfaces/TrkVertexFitterInterfaces/IVertexTrackDensityEstimator.h +++ b/Tracking/TrkVertexFitter/TrkVertexFitterInterfaces/TrkVertexFitterInterfaces/IVertexTrackDensityEstimator.h @@ -70,7 +70,12 @@ namespace Trk /** * Evaluate the density function at the specified coordinate along the beam-line. */ - virtual double trackDensity(double z) = 0; + virtual double trackDensity(double z) const = 0; + + /* + * Evaluate the density function and its first two derivatives at the specified coordinate. + */ + virtual void trackDensity(double z, double& density, double& firstDerivative, double& secondDerivative) const = 0; /** * Resets the internal state of the tool, forgetting all tracks previously added. diff --git a/Tracking/TrkVertexFitter/TrkVertexSeedFinderUtils/TrkVertexSeedFinderUtils/GaussianTrackDensity.h b/Tracking/TrkVertexFitter/TrkVertexSeedFinderUtils/TrkVertexSeedFinderUtils/GaussianTrackDensity.h index fe708753e7edb6bf72a1246ad001203cc4a03a83..ca56a88be79224baa96e92d965aa627c9a01a1d5 100644 --- a/Tracking/TrkVertexFitter/TrkVertexSeedFinderUtils/TrkVertexSeedFinderUtils/GaussianTrackDensity.h +++ b/Tracking/TrkVertexFitter/TrkVertexSeedFinderUtils/TrkVertexSeedFinderUtils/GaussianTrackDensity.h @@ -64,7 +64,12 @@ namespace Trk /** * Evaluate the density function at the specified coordinate along the beam-line. */ - virtual double trackDensity(double z); + virtual double trackDensity(double z) const; + + /** + * Evaluate the density and its first two derivatives at the specified coordinate. + */ + virtual void trackDensity(double z, double& density, double& firstDerivative, double& secondDerivativec) const; /** * Resets the internal state of the tool, forgetting all tracks previously added. diff --git a/Tracking/TrkVertexFitter/TrkVertexSeedFinderUtils/src/GaussianTrackDensity.cxx b/Tracking/TrkVertexFitter/TrkVertexSeedFinderUtils/src/GaussianTrackDensity.cxx index 64e202806da5e70b51cb4393ab884300a222a718..06dc9822f0efa874aa0934f7f7f190ec3ecd3068 100644 --- a/Tracking/TrkVertexFitter/TrkVertexSeedFinderUtils/src/GaussianTrackDensity.cxx +++ b/Tracking/TrkVertexFitter/TrkVertexSeedFinderUtils/src/GaussianTrackDensity.cxx @@ -28,16 +28,32 @@ namespace Trk return StatusCode::SUCCESS; } - double GaussianTrackDensity::trackDensity(double z) + double GaussianTrackDensity::trackDensity(double z) const { double sum = 0.0; for (auto& entry : m_trackMap) { - sum += entry.second.constant * exp(z*entry.second.c_1 + z*z*entry.second.c_2); + sum += entry.second.constant * exp(z*(entry.second.c_1 + z*entry.second.c_2)); } return sum; } + void GaussianTrackDensity::trackDensity(double z, double& density, double& firstDerivative, double& secondDerivative) const + { + density = 0.0; + firstDerivative = 0.0; + secondDerivative = 0.0; + for (auto& entry : m_trackMap) + { + double delta = entry.second.constant * exp(z*(entry.second.c_1 + z*entry.second.c_2)); + density += delta; + double qPrime = entry.second.c_1 + 2*z*entry.second.c_2; + double deltaPrime = delta * qPrime; + firstDerivative += deltaPrime; + secondDerivative += 2*entry.second.c_2*delta + qPrime*deltaPrime; + } + } + void GaussianTrackDensity::addTracks(const std::vector<const Trk::Track*>& vectorTrk) { std::vector<const TrackParameters*> perigeeList;