diff --git a/InnerDetector/InDetRecTools/InDetIncSecVxFinderTool/src/InDetIterativeSecVtxFinderTool.cxx b/InnerDetector/InDetRecTools/InDetIncSecVxFinderTool/src/InDetIterativeSecVtxFinderTool.cxx index 26f62835e079065b34612582accc7f2f25ab5d4c..413f9870baf2e1d4dd7599f04a760376a13357c4 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 3e38b32849dce17aba84fcb6a7004cb97c14291e..80b72185a5fc54d39006b4faf60f7031cdddd4c8 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 9b21e38ba10dcafcda7fd36d5646862bb329e9f1..053bb69a453cef8cab760e44ae4c6d6099513d88 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 4d1d6b197d4402db2c3ddbf35474ee04435b1f5b..1efb236f69db35853447a5c7670d13fed331917d 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 @@ -43,18 +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; - - /** - * Access to the 3D impact point - */ - virtual Amg::Vector3D* get3dIP() const = 0; - - /** - * Access to the IP 3D distance - */ - virtual double getDistance() 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 3ac955e8684ec6c820a4c103b6cfe0b9acc59794..c1f57273ad6afc35d3c48eb1d01c6e8acbaf3885 100755 --- a/Tracking/TrkVertexFitter/TrkVertexFitterUtils/src/ImpactPoint3dEstimator.cxx +++ b/Tracking/TrkVertexFitter/TrkVertexFitterUtils/src/ImpactPoint3dEstimator.cxx @@ -29,10 +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_distance(0.) + m_precision(1e-10)//DeltaPhi { declareProperty("Extrapolator",m_extrapolator); declareProperty("MagFieldSvc", m_magFieldSvc); @@ -42,8 +39,6 @@ namespace Trk } ImpactPoint3dEstimator::~ImpactPoint3dEstimator() { -// if (m_planeSurface!=0) delete m_planeSurface; - if (m_vertex!=0) delete m_vertex; } StatusCode ImpactPoint3dEstimator::initialize() @@ -69,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 ) @@ -79,7 +74,7 @@ namespace Trk Amg::Vector3D POCA = thePerigee->position() + pathLength * momentumUnit;// Position of closest approach Amg::Vector3D DeltaR = *theVertex - POCA; - m_distance=DeltaR.mag(); + distance=DeltaR.mag(); DeltaR=DeltaR.unit(); @@ -95,12 +90,7 @@ 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: " << m_distance); - - ATH_MSG_DEBUG( "POCA in 3D is: " << *m_vertex ); + ATH_MSG_VERBOSE( "final minimal distance is: " << distance); //store the plane... ATH_MSG_VERBOSE( "plane to which to extrapolate X " << DeltaRcorrected << " Y " << YDir << " Z " << momentumUnit); @@ -115,30 +105,18 @@ 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; - } - + 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{ - // 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; - } - + 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); } @@ -256,8 +234,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.){ + distance=DeltaR.mag(); + if (distance==0.){ ATH_MSG_WARNING("DeltaR is zero in ImpactPoint3dEstimator::Estimate3dIP, returning nullptr"); return nullptr; } @@ -276,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)) { @@ -287,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; @@ -307,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()) { @@ -340,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) { @@ -367,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 a49e12109e92dc3a59701521bd7765a0fea79a2f..c7fed47432a24daf3964c508ba0f7f2ad16db911 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 @@ -52,36 +52,15 @@ 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 */ - 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; - /** - * Access to the 3D impact point - */ - Amg::Vector3D* get3dIP() const; - - /** - * Access to the IP 3D distance - */ - double getDistance() const; - /** * Actual estimate method, changing the state of Trk::VxTrackAtVertex */ @@ -108,18 +87,8 @@ namespace Trk int m_maxiterations; double m_precision; - 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 6acc39752fded27b018e482ecdad9580c67dc1fe..fb4831e590c8ef15561c40e9a129d2b9946d4238 100644 --- a/Tracking/TrkVertexFitter/TrkVertexFitterUtils/test/ImpactPoint3dEstimator_test.cxx +++ b/Tracking/TrkVertexFitter/TrkVertexFitterUtils/test/ImpactPoint3dEstimator_test.cxx @@ -89,14 +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 (tool.getDistance(), 3.10391, 1e-5) ); + 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 (tool.getDistance(), 3.10391, 1e-5) ); + 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 0ca01b875292cc9f094b271df0d5bda851ff209b..92fe5430816479e701318cb48d48d4ddba4b291d 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;