From ab33c557e292e40946ce9a683d6d26f30e329be7 Mon Sep 17 00:00:00 2001 From: Dave Casper <dcasper@uci.edu> Date: Thu, 1 Mar 2018 22:40:17 -0800 Subject: [PATCH] Add logic to compute and return first and second derivatives of density function. Former-commit-id: 6f0360ba4058e820297bf50d7ce89604f9b408e2 --- .../IVertexTrackDensityEstimator.h | 7 ++++++- .../GaussianTrackDensity.h | 7 ++++++- .../src/GaussianTrackDensity.cxx | 20 +++++++++++++++++-- 3 files changed, 30 insertions(+), 4 deletions(-) diff --git a/Tracking/TrkVertexFitter/TrkVertexFitterInterfaces/TrkVertexFitterInterfaces/IVertexTrackDensityEstimator.h b/Tracking/TrkVertexFitter/TrkVertexFitterInterfaces/TrkVertexFitterInterfaces/IVertexTrackDensityEstimator.h index 01c1bb1a39c..f6d60e480cb 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 fe708753e7e..ca56a88be79 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 64e202806da..06dc9822f0e 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; -- GitLab