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;