From 165f817be17de9866f536765c32d888231a41abf Mon Sep 17 00:00:00 2001
From: Susumu Oda <susumu.oda@cern.ch>
Date: Thu, 8 Aug 2019 06:07:42 +0200
Subject: [PATCH 1/3] Remove non-AthenaMT-compatible getDistance method.

---
 .../IImpactPoint3dEstimator.h                     |  7 +------
 .../src/ImpactPoint3dEstimator.cxx                | 11 +++++------
 .../src/ImpactPoint3dEstimator.h                  | 15 +--------------
 .../test/ImpactPoint3dEstimator_test.cxx          |  2 --
 4 files changed, 7 insertions(+), 28 deletions(-)

diff --git a/Tracking/TrkVertexFitter/TrkVertexFitterInterfaces/TrkVertexFitterInterfaces/IImpactPoint3dEstimator.h b/Tracking/TrkVertexFitter/TrkVertexFitterInterfaces/TrkVertexFitterInterfaces/IImpactPoint3dEstimator.h
index 4d1d6b197d44..ccf6df9ad9bc 100755
--- a/Tracking/TrkVertexFitter/TrkVertexFitterInterfaces/TrkVertexFitterInterfaces/IImpactPoint3dEstimator.h
+++ b/Tracking/TrkVertexFitter/TrkVertexFitterInterfaces/TrkVertexFitterInterfaces/IImpactPoint3dEstimator.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef TRKVERTEXFITTERINTERFACES_IIMPACTPOINT3DESTIMATOR_H
@@ -51,11 +51,6 @@ namespace Trk
      */
     virtual Amg::Vector3D* get3dIP() const = 0;
 
-    /**
-     * Access to the IP 3D distance
-     */
-    virtual double getDistance() const = 0;
-
     /**
       * Actual estimate method, changing the state of Trk::VxTrackAtVertex
       */
diff --git a/Tracking/TrkVertexFitter/TrkVertexFitterUtils/src/ImpactPoint3dEstimator.cxx b/Tracking/TrkVertexFitter/TrkVertexFitterUtils/src/ImpactPoint3dEstimator.cxx
index 3ac955e8684e..5cd93373750a 100755
--- a/Tracking/TrkVertexFitter/TrkVertexFitterUtils/src/ImpactPoint3dEstimator.cxx
+++ b/Tracking/TrkVertexFitter/TrkVertexFitterUtils/src/ImpactPoint3dEstimator.cxx
@@ -31,8 +31,7 @@ namespace Trk
     m_maxiterations(20),
     m_precision(1e-10),//DeltaPhi
 //    m_planeSurface(0),
-    m_vertex(0),
-    m_distance(0.)
+    m_vertex(0)
   {   
     declareProperty("Extrapolator",m_extrapolator);
     declareProperty("MagFieldSvc",     m_magFieldSvc);
@@ -79,7 +78,7 @@ namespace Trk
 
       Amg::Vector3D POCA   =  thePerigee->position()  + pathLength * momentumUnit;// Position of closest approach
       Amg::Vector3D DeltaR =  *theVertex  - POCA;
-      m_distance=DeltaR.mag();
+      double distance=DeltaR.mag();
       DeltaR=DeltaR.unit();
 
 
@@ -98,7 +97,7 @@ namespace Trk
       //store the impact 3d point
       m_vertex=new Amg::Vector3D( POCA );
 
-      ATH_MSG_VERBOSE( "final minimal distance is: " << m_distance);
+      ATH_MSG_VERBOSE( "final minimal distance is: " << distance);
 
       ATH_MSG_DEBUG( "POCA in 3D is: " << *m_vertex );
 
@@ -256,8 +255,8 @@ namespace Trk
     //first vector at 3d impact point
     Amg::Vector3D MomentumDir(std::cos(phiactual)*std::sin(theta),std::sin(phiactual)*std::sin(theta),std::cos(theta));
     Amg::Vector3D DeltaR(x0-xc+Rt*cosphiactual,y0-yc+Rt*sinphiactual,z0-zc-Rt*cottheta*phiactual);
-    m_distance=DeltaR.mag();
-    if (m_distance==0.){
+    double distance=DeltaR.mag();
+    if (distance==0.){
       ATH_MSG_WARNING("DeltaR is zero in ImpactPoint3dEstimator::Estimate3dIP, returning nullptr");
       return nullptr;
     }
diff --git a/Tracking/TrkVertexFitter/TrkVertexFitterUtils/src/ImpactPoint3dEstimator.h b/Tracking/TrkVertexFitter/TrkVertexFitterUtils/src/ImpactPoint3dEstimator.h
index a49e12109e92..e4dac5c14385 100755
--- a/Tracking/TrkVertexFitter/TrkVertexFitterUtils/src/ImpactPoint3dEstimator.h
+++ b/Tracking/TrkVertexFitter/TrkVertexFitterUtils/src/ImpactPoint3dEstimator.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef TRKVERTEXFITTERUTILS_IMPACTPOINT3DESTIMATOR_H
@@ -77,11 +77,6 @@ namespace Trk
      */
     Amg::Vector3D* get3dIP() const;
 
-    /**
-     * Access to the IP 3D distance
-     */
-    double getDistance() const;
- 
     /**
       * Actual estimate method, changing the state of Trk::VxTrackAtVertex
       */
@@ -110,16 +105,8 @@ namespace Trk
     
     mutable Amg::Vector3D* m_vertex;
     
-    mutable double m_distance;
-    
-
   };
 
-
-  inline double ImpactPoint3dEstimator::getDistance() const
-  {
-    return m_distance;
-  }
 }
 
 #endif
diff --git a/Tracking/TrkVertexFitter/TrkVertexFitterUtils/test/ImpactPoint3dEstimator_test.cxx b/Tracking/TrkVertexFitter/TrkVertexFitterUtils/test/ImpactPoint3dEstimator_test.cxx
index 6acc39752fde..88a4b610f431 100644
--- a/Tracking/TrkVertexFitter/TrkVertexFitterUtils/test/ImpactPoint3dEstimator_test.cxx
+++ b/Tracking/TrkVertexFitter/TrkVertexFitterUtils/test/ImpactPoint3dEstimator_test.cxx
@@ -91,12 +91,10 @@ void test1 (Trk::IImpactPoint3dEstimator& tool)
   Trk::Perigee p1 (pos1, mom1, 1, pos1, cov5().release());
   std::unique_ptr<Trk::PlaneSurface> s1 (tool.Estimate3dIP (&p1, &vert));
   checkPlaneSurface (*s1, vert, {0.53466, 0.801692, 0.267261});
-  assert( Athena_test::isEqual (tool.getDistance(), 3.10391, 1e-5) );
   
   Trk::NeutralPerigee p2 (pos1, mom1, 1, pos1, cov5().release());
   std::unique_ptr<Trk::PlaneSurface> s2 (tool.Estimate3dIP (&p2, &vert));
   checkPlaneSurface (*s2, vert, {0.534522, 0.801784, 0.267261});
-  assert( Athena_test::isEqual (tool.getDistance(), 3.10391, 1e-5) );
 
   // Other methods require full Extrapolator / TrackingGeometry machinery;
   // not tested here.
-- 
GitLab


From 7f32b7203895dc08b98a3ed586b0eeacd0a4cf4b Mon Sep 17 00:00:00 2001
From: Susumu Oda <susumu.oda@cern.ch>
Date: Thu, 8 Aug 2019 06:16:50 +0200
Subject: [PATCH 2/3] Remove unused get3dIP method and non-thread-safe mutable
 member

---
 .../IImpactPoint3dEstimator.h                 |  5 ---
 .../src/ImpactPoint3dEstimator.cxx            | 37 +------------------
 .../src/ImpactPoint3dEstimator.h              | 18 ---------
 3 files changed, 1 insertion(+), 59 deletions(-)

diff --git a/Tracking/TrkVertexFitter/TrkVertexFitterInterfaces/TrkVertexFitterInterfaces/IImpactPoint3dEstimator.h b/Tracking/TrkVertexFitter/TrkVertexFitterInterfaces/TrkVertexFitterInterfaces/IImpactPoint3dEstimator.h
index ccf6df9ad9bc..9b5ebfd270ae 100755
--- a/Tracking/TrkVertexFitter/TrkVertexFitterInterfaces/TrkVertexFitterInterfaces/IImpactPoint3dEstimator.h
+++ b/Tracking/TrkVertexFitter/TrkVertexFitterInterfaces/TrkVertexFitterInterfaces/IImpactPoint3dEstimator.h
@@ -46,11 +46,6 @@ namespace Trk
     virtual PlaneSurface* Estimate3dIP(const Trk::TrackParameters* trackPerigee, const Amg::Vector3D* theVertex) const = 0;
     virtual PlaneSurface* Estimate3dIP(const Trk::NeutralParameters* neutralPerigee, const Amg::Vector3D* theVertex) const = 0;
 
-    /**
-     * Access to the 3D impact point
-     */
-    virtual Amg::Vector3D* get3dIP() const = 0;
-
     /**
       * Actual estimate method, changing the state of Trk::VxTrackAtVertex
       */
diff --git a/Tracking/TrkVertexFitter/TrkVertexFitterUtils/src/ImpactPoint3dEstimator.cxx b/Tracking/TrkVertexFitter/TrkVertexFitterUtils/src/ImpactPoint3dEstimator.cxx
index 5cd93373750a..a7d8aa92b644 100755
--- a/Tracking/TrkVertexFitter/TrkVertexFitterUtils/src/ImpactPoint3dEstimator.cxx
+++ b/Tracking/TrkVertexFitter/TrkVertexFitterUtils/src/ImpactPoint3dEstimator.cxx
@@ -29,9 +29,7 @@ namespace Trk
     m_extrapolator("Trk::Extrapolator"),
     m_magFieldSvc("AtlasFieldSvc", n),
     m_maxiterations(20),
-    m_precision(1e-10),//DeltaPhi
-//    m_planeSurface(0),
-    m_vertex(0)
+    m_precision(1e-10)//DeltaPhi
   {   
     declareProperty("Extrapolator",m_extrapolator);
     declareProperty("MagFieldSvc",     m_magFieldSvc);
@@ -41,8 +39,6 @@ namespace Trk
   }
   
   ImpactPoint3dEstimator::~ImpactPoint3dEstimator() {
-//    if (m_planeSurface!=0) delete m_planeSurface;
-    if (m_vertex!=0) delete m_vertex;
   }
   
   StatusCode ImpactPoint3dEstimator::initialize() 
@@ -94,13 +90,8 @@ namespace Trk
 
       Amg::Vector3D YDir=momentumUnit.cross(DeltaRcorrected);
 
-      //store the impact 3d point
-      m_vertex=new Amg::Vector3D( POCA );
-
       ATH_MSG_VERBOSE( "final minimal distance is: " << distance);
 
-      ATH_MSG_DEBUG( "POCA in 3D is: " << *m_vertex );
-
       //store the plane...
       ATH_MSG_VERBOSE( "plane to which to extrapolate X " << DeltaRcorrected << " Y " << YDir << " Z " << momentumUnit);
 
@@ -115,24 +106,12 @@ namespace Trk
   }
 
   PlaneSurface* ImpactPoint3dEstimator::Estimate3dIP(const NeutralParameters* neutralPerigee,const Amg::Vector3D* theVertex) const {
-    // clean up before any sanity checks so a return 0 corresponds to internal members reset too
-    if (m_vertex!=0) {
-      delete m_vertex;
-      m_vertex=0;
-    }
-
     ATH_MSG_DEBUG("Neutral particle --  propagate like a straight line");
     return _Estimate3dIPNoCurvature(neutralPerigee, theVertex);
   }
 
   PlaneSurface* 
   ImpactPoint3dEstimator::Estimate3dIP(const TrackParameters* trackPerigee,const Amg::Vector3D* theVertex) const{
-    // clean up before any sanity checks so a return 0 corresponds to internal members reset too
-    if (m_vertex!=0) {
-      delete m_vertex;
-      m_vertex=0;
-    }
-
     double magnFieldVect[3];
     m_magFieldSvc->getField(trackPerigee->associatedSurface().center().data(),magnFieldVect);
     if(magnFieldVect[2] == 0 ){
@@ -275,9 +254,6 @@ namespace Trk
 
     Amg::Vector3D YDir=MomentumDir.cross(DeltaRcorrected);
 
-    //store the impact 3d point
-    m_vertex=new Amg::Vector3D(x0+Rt*cosphiactual,y0+Rt*sinphiactual,z0-Rt*cottheta*phiactual);
-
     if(msgLvl(MSG::VERBOSE))
     {
 
@@ -286,12 +262,6 @@ namespace Trk
                                                                      std::pow(z0-zc-Rt*cottheta*phiactual,2)) << endmsg;
     }
 
-    if(msgLvl(MSG::DEBUG))
-    {
-      msg(MSG::DEBUG) << "POCA in 3D is: " << *m_vertex << endmsg;
-    }
-
-
     //store the plane...
     if (msgLvl(MSG::VERBOSE))
         msg(MSG::VERBOSE)<< "plane to which to extrapolate X " << DeltaRcorrected << " Y " << YDir << " Z " << MomentumDir << endmsg;
@@ -306,11 +276,6 @@ namespace Trk
 
   }//end of estimate 3dIP method
 
-  Amg::Vector3D* ImpactPoint3dEstimator::get3dIP() const
-  {
-    return m_vertex;
-  }
-
   bool ImpactPoint3dEstimator::addIP3dAtaPlane(VxTrackAtVertex & vtxTrack,const Amg::Vector3D & vertex) const
   {
     if (vtxTrack.initialPerigee()) {
diff --git a/Tracking/TrkVertexFitter/TrkVertexFitterUtils/src/ImpactPoint3dEstimator.h b/Tracking/TrkVertexFitter/TrkVertexFitterUtils/src/ImpactPoint3dEstimator.h
index e4dac5c14385..7741d78d739f 100755
--- a/Tracking/TrkVertexFitter/TrkVertexFitterUtils/src/ImpactPoint3dEstimator.h
+++ b/Tracking/TrkVertexFitter/TrkVertexFitterUtils/src/ImpactPoint3dEstimator.h
@@ -52,17 +52,6 @@ namespace Trk
     */
     ~ImpactPoint3dEstimator();
     
-   /**
-    * Actual estimate method
-    */
-//    void Estimate3dIP(const ParametersBase* trackPerigee,const Vertex* theVertex);
-    
-   /**
-    * Access to the plane through 3D impact point
-    */  
- //   PlaneSurface* getPlaneThrough3dIP() const;
-   
-   
    /**
     * New method implementing the features of two above methods at once
     */
@@ -72,11 +61,6 @@ namespace Trk
 
     PlaneSurface* Estimate3dIP(const Trk::NeutralParameters* neutralPerigee, const Amg::Vector3D* theVertex) const;
    
-    /**
-     * Access to the 3D impact point
-     */
-    Amg::Vector3D* get3dIP() const;
-
     /**
       * Actual estimate method, changing the state of Trk::VxTrackAtVertex
       */
@@ -103,8 +87,6 @@ namespace Trk
     int m_maxiterations;
     double m_precision;
     
-    mutable Amg::Vector3D* m_vertex;
-    
   };
 
 }
-- 
GitLab


From 81914c276e58cad82a83c22b6b5ac913f71c1982 Mon Sep 17 00:00:00 2001
From: Susumu Oda <susumu.oda@cern.ch>
Date: Thu, 8 Aug 2019 06:57:42 +0200
Subject: [PATCH 3/3] Add distance argument to Estimate3dIP

---
 .../src/InDetIterativeSecVtxFinderTool.cxx    | 10 ++++-----
 .../src/InDetIterativePriVxFinderTool.cxx     |  6 +++---
 .../src/InDetMultiPriVxFinderTool.cxx         |  6 +++---
 .../IImpactPoint3dEstimator.h                 |  4 ++--
 .../src/ImpactPoint3dEstimator.cxx            | 21 +++++++++++--------
 .../src/ImpactPoint3dEstimator.h              |  6 +++---
 .../test/ImpactPoint3dEstimator_test.cxx      |  7 +++++--
 .../src/ImagingSeedTuningAlg.cxx              |  6 +++---
 8 files changed, 36 insertions(+), 30 deletions(-)

diff --git a/InnerDetector/InDetRecTools/InDetIncSecVxFinderTool/src/InDetIterativeSecVtxFinderTool.cxx b/InnerDetector/InDetRecTools/InDetIncSecVxFinderTool/src/InDetIterativeSecVtxFinderTool.cxx
index 26f62835e079..413f9870baf2 100644
--- a/InnerDetector/InDetRecTools/InDetIncSecVxFinderTool/src/InDetIterativeSecVtxFinderTool.cxx
+++ b/InnerDetector/InDetRecTools/InDetIncSecVxFinderTool/src/InDetIterativeSecVtxFinderTool.cxx
@@ -479,7 +479,7 @@ std::pair<xAOD::VertexContainer*, xAOD::VertexAuxContainer*> InDetIterativeSecVt
         double distance=0.;
         try
         {
-          Trk::PlaneSurface* mySurface=m_ImpactPoint3dEstimator->Estimate3dIP(*perigeeListIter,&seedVertex);
+          Trk::PlaneSurface* mySurface=m_ImpactPoint3dEstimator->Estimate3dIP(*perigeeListIter,&seedVertex, distance);
           delete mySurface;
           isOK=true;
           ATH_MSG_VERBOSE( " ImpactPoint3dEstimator done " );
@@ -489,9 +489,9 @@ std::pair<xAOD::VertexContainer*, xAOD::VertexAuxContainer*> InDetIterativeSecVt
           ATH_MSG_WARNING( " ImpactPoint3dEstimator failed to find minimum distance between track and vertex seed: " << err.p );
         }
         
-        if (isOK)
+        if (not isOK)
         {
-          distance=m_ImpactPoint3dEstimator->getDistance();
+          distance=0.;
         }
         
         if (distance<0)
@@ -1268,7 +1268,7 @@ std::pair<xAOD::VertexContainer*, xAOD::VertexAuxContainer*> InDetIterativeSecVt
             try
             {
               Trk::PlaneSurface* mySurface= 
-                   m_ImpactPoint3dEstimator->Estimate3dIP( (*tracksIter).initialPerigee(), &((*vxIter)->position()) );
+                m_ImpactPoint3dEstimator->Estimate3dIP( (*tracksIter).initialPerigee(), &((*vxIter)->position()), distance);
               delete mySurface;
               isOK=true;
             }
@@ -1277,7 +1277,7 @@ std::pair<xAOD::VertexContainer*, xAOD::VertexAuxContainer*> InDetIterativeSecVt
               ATH_MSG_WARNING( " ImpactPoint3dEstimator failed  " << err.p );
             }
         
-            if (isOK) distance=m_ImpactPoint3dEstimator->getDistance();
+            if (not isOK) distance=0.;
 
             double error= 1. ;
 	
diff --git a/InnerDetector/InDetRecTools/InDetPriVxFinderTool/src/InDetIterativePriVxFinderTool.cxx b/InnerDetector/InDetRecTools/InDetPriVxFinderTool/src/InDetIterativePriVxFinderTool.cxx
index 3e38b32849dc..80b72185a5fc 100755
--- a/InnerDetector/InDetRecTools/InDetPriVxFinderTool/src/InDetIterativePriVxFinderTool.cxx
+++ b/InnerDetector/InDetRecTools/InDetPriVxFinderTool/src/InDetIterativePriVxFinderTool.cxx
@@ -430,7 +430,7 @@ InDetIterativePriVxFinderTool::findVertex(const Trk::TrackParticleBaseCollection
           double distance = 0.;
           try
           {
-            Trk::PlaneSurface* mySurface = m_ImpactPoint3dEstimator->Estimate3dIP(*perigeeListIter, &actualVertex);
+            Trk::PlaneSurface* mySurface = m_ImpactPoint3dEstimator->Estimate3dIP(*perigeeListIter, &actualVertex, distance);
             delete mySurface;
             isOK = true;
           }
@@ -442,8 +442,8 @@ InDetIterativePriVxFinderTool::findVertex(const Trk::TrackParticleBaseCollection
           }
 
 
-          if (isOK) {
-            distance = m_ImpactPoint3dEstimator->getDistance();
+          if (not isOK) {
+            distance = 0.;
           }
 
           if (distance < 0) {
diff --git a/InnerDetector/InDetRecTools/InDetPriVxFinderTool/src/InDetMultiPriVxFinderTool.cxx b/InnerDetector/InDetRecTools/InDetPriVxFinderTool/src/InDetMultiPriVxFinderTool.cxx
index 9b21e38ba10d..053bb69a453c 100755
--- a/InnerDetector/InDetRecTools/InDetPriVxFinderTool/src/InDetMultiPriVxFinderTool.cxx
+++ b/InnerDetector/InDetRecTools/InDetPriVxFinderTool/src/InDetMultiPriVxFinderTool.cxx
@@ -619,7 +619,7 @@ namespace InDet
     bool isOK = false;
     double distance = 0.;
     try {
-      Trk::PlaneSurface* mySurface = m_ImpactPoint3dEstimator->Estimate3dIP(params, vertex);
+      Trk::PlaneSurface* mySurface = m_ImpactPoint3dEstimator->Estimate3dIP(params, vertex, distance);
       delete mySurface;
       isOK = true;
     }
@@ -628,8 +628,8 @@ namespace InDet
       err.p << endmsg;
     }
 
-    if (isOK) {
-      distance = m_ImpactPoint3dEstimator->getDistance();
+    if (not isOK) {
+      distance = 0.;
     }
     if (distance < 0) {
       msg(MSG::WARNING) << " Distance between track and seed vtx is negative: " << distance << endmsg;
diff --git a/Tracking/TrkVertexFitter/TrkVertexFitterInterfaces/TrkVertexFitterInterfaces/IImpactPoint3dEstimator.h b/Tracking/TrkVertexFitter/TrkVertexFitterInterfaces/TrkVertexFitterInterfaces/IImpactPoint3dEstimator.h
index 9b5ebfd270ae..1efb236f69db 100755
--- a/Tracking/TrkVertexFitter/TrkVertexFitterInterfaces/TrkVertexFitterInterfaces/IImpactPoint3dEstimator.h
+++ b/Tracking/TrkVertexFitter/TrkVertexFitterInterfaces/TrkVertexFitterInterfaces/IImpactPoint3dEstimator.h
@@ -43,8 +43,8 @@ namespace Trk
    /**
     * method calculating the surface (returned), distance and point of closest approach
     */
-    virtual PlaneSurface* Estimate3dIP(const Trk::TrackParameters* trackPerigee, const Amg::Vector3D* theVertex) const = 0;
-    virtual PlaneSurface* Estimate3dIP(const Trk::NeutralParameters* neutralPerigee, const Amg::Vector3D* theVertex) const = 0;
+    virtual PlaneSurface* Estimate3dIP(const Trk::TrackParameters* trackPerigee, const Amg::Vector3D* theVertex, double& distance) const = 0;
+    virtual PlaneSurface* Estimate3dIP(const Trk::NeutralParameters* neutralPerigee, const Amg::Vector3D* theVertex, double& distance) const = 0;
 
     /**
       * Actual estimate method, changing the state of Trk::VxTrackAtVertex
diff --git a/Tracking/TrkVertexFitter/TrkVertexFitterUtils/src/ImpactPoint3dEstimator.cxx b/Tracking/TrkVertexFitter/TrkVertexFitterUtils/src/ImpactPoint3dEstimator.cxx
index a7d8aa92b644..c1f57273ad6a 100755
--- a/Tracking/TrkVertexFitter/TrkVertexFitterUtils/src/ImpactPoint3dEstimator.cxx
+++ b/Tracking/TrkVertexFitter/TrkVertexFitterUtils/src/ImpactPoint3dEstimator.cxx
@@ -64,7 +64,7 @@ namespace Trk
   }
 
 
-  template<typename T> PlaneSurface* ImpactPoint3dEstimator::_Estimate3dIPNoCurvature(const T* thePerigee,const Amg::Vector3D* theVertex) const  {
+  template<typename T> PlaneSurface* ImpactPoint3dEstimator::_Estimate3dIPNoCurvature(const T* thePerigee,const Amg::Vector3D* theVertex, double& distance) const  {
 
       const Amg::Vector3D  momentumUnit = thePerigee->momentum().unit();
       double pathLength  =  ( *theVertex  - thePerigee->position() ).dot( momentumUnit )
@@ -74,7 +74,7 @@ namespace Trk
 
       Amg::Vector3D POCA   =  thePerigee->position()  + pathLength * momentumUnit;// Position of closest approach
       Amg::Vector3D DeltaR =  *theVertex  - POCA;
-      double distance=DeltaR.mag();
+      distance=DeltaR.mag();
       DeltaR=DeltaR.unit();
 
 
@@ -105,18 +105,18 @@ namespace Trk
 
   }
 
-  PlaneSurface* ImpactPoint3dEstimator::Estimate3dIP(const NeutralParameters* neutralPerigee,const Amg::Vector3D* theVertex) const {
+  PlaneSurface* ImpactPoint3dEstimator::Estimate3dIP(const NeutralParameters* neutralPerigee,const Amg::Vector3D* theVertex, double& distance) const {
     ATH_MSG_DEBUG("Neutral particle --  propagate like a straight line");
-    return _Estimate3dIPNoCurvature(neutralPerigee, theVertex);
+    return _Estimate3dIPNoCurvature(neutralPerigee, theVertex, distance);
   }
 
   PlaneSurface* 
-  ImpactPoint3dEstimator::Estimate3dIP(const TrackParameters* trackPerigee,const Amg::Vector3D* theVertex) const{
+  ImpactPoint3dEstimator::Estimate3dIP(const TrackParameters* trackPerigee,const Amg::Vector3D* theVertex, double& distance) const{
     double magnFieldVect[3];
     m_magFieldSvc->getField(trackPerigee->associatedSurface().center().data(),magnFieldVect);
     if(magnFieldVect[2] == 0 ){
       ATH_MSG_DEBUG("Magnetic field in the Z direction is 0 --  propagate like a straight line");
-      return _Estimate3dIPNoCurvature(trackPerigee, theVertex);
+      return _Estimate3dIPNoCurvature(trackPerigee, theVertex, distance);
     }
 
 
@@ -234,7 +234,7 @@ namespace Trk
     //first vector at 3d impact point
     Amg::Vector3D MomentumDir(std::cos(phiactual)*std::sin(theta),std::sin(phiactual)*std::sin(theta),std::cos(theta));
     Amg::Vector3D DeltaR(x0-xc+Rt*cosphiactual,y0-yc+Rt*sinphiactual,z0-zc-Rt*cottheta*phiactual);
-    double distance=DeltaR.mag();
+    distance=DeltaR.mag();
     if (distance==0.){
       ATH_MSG_WARNING("DeltaR is zero in ImpactPoint3dEstimator::Estimate3dIP, returning nullptr");
       return nullptr;
@@ -304,9 +304,11 @@ namespace Trk
 
     const PlaneSurface* theSurfaceAtIP(0);
 
+    double distance = 0.;
+
     try
     {
-      theSurfaceAtIP = Estimate3dIP(vtxTrack.initialPerigee(),&vertex);
+      theSurfaceAtIP = Estimate3dIP(vtxTrack.initialPerigee(),&vertex, distance);
     }
     catch (error::ImpactPoint3dEstimatorProblem err)
     {
@@ -331,10 +333,11 @@ namespace Trk
   Trk::NeutralAtaPlane * ImpactPoint3dEstimator::IP3dNeutralAtaPlane(const NeutralParameters * initNeutPerigee,const Amg::Vector3D & vertex) const
   {
     const PlaneSurface* theSurfaceAtIP(0);
+    double distance = 0.;
 
     try
     {
-        theSurfaceAtIP = Estimate3dIP(initNeutPerigee,&vertex);
+      theSurfaceAtIP = Estimate3dIP(initNeutPerigee,&vertex, distance);
     }
     catch (error::ImpactPoint3dEstimatorProblem err)
     {
diff --git a/Tracking/TrkVertexFitter/TrkVertexFitterUtils/src/ImpactPoint3dEstimator.h b/Tracking/TrkVertexFitter/TrkVertexFitterUtils/src/ImpactPoint3dEstimator.h
index 7741d78d739f..c7fed47432a2 100755
--- a/Tracking/TrkVertexFitter/TrkVertexFitterUtils/src/ImpactPoint3dEstimator.h
+++ b/Tracking/TrkVertexFitter/TrkVertexFitterUtils/src/ImpactPoint3dEstimator.h
@@ -55,11 +55,11 @@ namespace Trk
    /**
     * New method implementing the features of two above methods at once
     */
-    template<typename T> PlaneSurface* _Estimate3dIPNoCurvature(const T*, const Amg::Vector3D* theVertex) const;
+    template<typename T> PlaneSurface* _Estimate3dIPNoCurvature(const T*, const Amg::Vector3D* theVertex, double& distance) const;
 
-    PlaneSurface* Estimate3dIP(const Trk::TrackParameters* trackPerigee, const Amg::Vector3D* theVertex) const;
+    PlaneSurface* Estimate3dIP(const Trk::TrackParameters* trackPerigee, const Amg::Vector3D* theVertex, double& distance) const;
 
-    PlaneSurface* Estimate3dIP(const Trk::NeutralParameters* neutralPerigee, const Amg::Vector3D* theVertex) const;
+    PlaneSurface* Estimate3dIP(const Trk::NeutralParameters* neutralPerigee, const Amg::Vector3D* theVertex, double& distance) const;
    
     /**
       * Actual estimate method, changing the state of Trk::VxTrackAtVertex
diff --git a/Tracking/TrkVertexFitter/TrkVertexFitterUtils/test/ImpactPoint3dEstimator_test.cxx b/Tracking/TrkVertexFitter/TrkVertexFitterUtils/test/ImpactPoint3dEstimator_test.cxx
index 88a4b610f431..fb4831e590c8 100644
--- a/Tracking/TrkVertexFitter/TrkVertexFitterUtils/test/ImpactPoint3dEstimator_test.cxx
+++ b/Tracking/TrkVertexFitter/TrkVertexFitterUtils/test/ImpactPoint3dEstimator_test.cxx
@@ -89,12 +89,15 @@ void test1 (Trk::IImpactPoint3dEstimator& tool)
   Amg::Vector3D vert { 1.2*mm, 0.8*mm, -7*mm };
 
   Trk::Perigee p1 (pos1, mom1, 1, pos1, cov5().release());
-  std::unique_ptr<Trk::PlaneSurface> s1 (tool.Estimate3dIP (&p1, &vert));
+  double distance = 0.;
+  std::unique_ptr<Trk::PlaneSurface> s1 (tool.Estimate3dIP (&p1, &vert, distance));
   checkPlaneSurface (*s1, vert, {0.53466, 0.801692, 0.267261});
+  assert( Athena_test::isEqual (distance, 3.10391, 1e-5) );
   
   Trk::NeutralPerigee p2 (pos1, mom1, 1, pos1, cov5().release());
-  std::unique_ptr<Trk::PlaneSurface> s2 (tool.Estimate3dIP (&p2, &vert));
+  std::unique_ptr<Trk::PlaneSurface> s2 (tool.Estimate3dIP (&p2, &vert, distance));
   checkPlaneSurface (*s2, vert, {0.534522, 0.801784, 0.267261});
+  assert( Athena_test::isEqual (distance, 3.10391, 1e-5) );
 
   // Other methods require full Extrapolator / TrackingGeometry machinery;
   // not tested here.
diff --git a/Tracking/TrkVertexFitter/TrkVertexSeedFinderUtils/src/ImagingSeedTuningAlg.cxx b/Tracking/TrkVertexFitter/TrkVertexSeedFinderUtils/src/ImagingSeedTuningAlg.cxx
index 0ca01b875292..92fe54308164 100644
--- a/Tracking/TrkVertexFitter/TrkVertexSeedFinderUtils/src/ImagingSeedTuningAlg.cxx
+++ b/Tracking/TrkVertexFitter/TrkVertexSeedFinderUtils/src/ImagingSeedTuningAlg.cxx
@@ -586,7 +586,7 @@ double ImagingSeedTuningAlg::distanceAndError(const Trk::TrackParameters* params
     bool isOK=false;
     double distance=0.;
     try {
-      Trk::PlaneSurface* mySurface=m_impactPoint3dEstimator->Estimate3dIP(params,vertex);
+      Trk::PlaneSurface* mySurface=m_impactPoint3dEstimator->Estimate3dIP(params,vertex, distance);
       delete mySurface;
       isOK=true;
     }
@@ -594,8 +594,8 @@ double ImagingSeedTuningAlg::distanceAndError(const Trk::TrackParameters* params
       msg(MSG::WARNING) << " ImpactPoin3dEstimator failed to find minimum distance between track and vertex seed: " << 
         err.p << endmsg;
     }
-    if (isOK) {
-      distance=m_impactPoint3dEstimator->getDistance();
+    if (not isOK) {
+      distance=0.;
     }  
     if (distance<0) {
       msg(MSG::WARNING) << " Distance between track and seed vtx is negative: " << distance << endmsg;
-- 
GitLab