From 272546be41892a87ff7e87c796a7e8719e8f0244 Mon Sep 17 00:00:00 2001
From: Dave Casper <dcasper@uci.edu>
Date: Wed, 28 Mar 2018 19:49:50 -0700
Subject: [PATCH] Working port to conditions handles for one vertex fitting
 tool

Former-commit-id: 98087c0d3ae42e1afe7b3780477c7f8166b3b233
---
 .../InDetPriVxFinderTool/CMakeLists.txt       |   6 +-
 .../InDetIterativePriVxFinderTool.h           |  11 +-
 .../src/InDetIterativePriVxFinderTool.cxx     | 168 +++++++-----------
 3 files changed, 72 insertions(+), 113 deletions(-)

diff --git a/InnerDetector/InDetRecTools/InDetPriVxFinderTool/CMakeLists.txt b/InnerDetector/InDetRecTools/InDetPriVxFinderTool/CMakeLists.txt
index 1bafa82134ec..88f511adac97 100644
--- a/InnerDetector/InDetRecTools/InDetPriVxFinderTool/CMakeLists.txt
+++ b/InnerDetector/InDetRecTools/InDetPriVxFinderTool/CMakeLists.txt
@@ -8,6 +8,7 @@ atlas_subdir( InDetPriVxFinderTool )
 # Declare the package's dependencies:
 atlas_depends_on_subdirs( PUBLIC
                           Control/AthenaBaseComps
+			  Control/StoreGate
                           Event/xAOD/xAODTracking
                           GaudiKernel
                           InnerDetector/InDetRecTools/InDetRecToolInterfaces
@@ -15,11 +16,12 @@ atlas_depends_on_subdirs( PUBLIC
                           Tracking/TrkEvent/TrkParameters
                           Tracking/TrkEvent/TrkParticleBase
                           Tracking/TrkEvent/TrkTrack
+			  InnerDetector/InDetConditions/BeamSpotConditionsData
+			  InDetBeamSpotService
                           PRIVATE
                           Control/DataModel
                           DetectorDescription/GeoPrimitives
                           Event/EventPrimitives
-                          InnerDetector/InDetConditions/InDetBeamSpotService
                           InnerDetector/InDetRecTools/InDetTrackSelectionTool
                           Tracking/TrkDetDescr/TrkSurfaces
                           Tracking/TrkEvent/TrkEventPrimitives
@@ -41,7 +43,7 @@ atlas_add_component( InDetPriVxFinderTool
                      src/*.cxx
                      src/components/*.cxx
                      INCLUDE_DIRS ${ROOT_INCLUDE_DIRS} ${CLHEP_INCLUDE_DIRS} ${EIGEN_INCLUDE_DIRS}
-                     LINK_LIBRARIES ${ROOT_LIBRARIES} ${CLHEP_LIBRARIES} ${EIGEN_LIBRARIES} AthenaBaseComps xAODTracking GaudiKernel InDetRecToolInterfaces PATCoreLib TrkParameters TrkParticleBase TrkTrack DataModel GeoPrimitives EventPrimitives TrkSurfaces TrkEventPrimitives TrkLinks TrkTrackSummary VxMultiVertex VxVertex TrkVertexFitterInterfaces TrkVertexFittersLib )
+                     LINK_LIBRARIES ${ROOT_LIBRARIES} ${CLHEP_LIBRARIES} ${EIGEN_LIBRARIES} AthenaBaseComps xAODTracking GaudiKernel InDetRecToolInterfaces PATCoreLib TrkParameters TrkParticleBase TrkTrack DataModel GeoPrimitives EventPrimitives TrkSurfaces TrkEventPrimitives TrkLinks TrkTrackSummary VxMultiVertex VxVertex TrkVertexFitterInterfaces TrkVertexFittersLib BeamSpotConditionsData StoreGateLib)
 
 # Install files from the package:
 atlas_install_headers( InDetPriVxFinderTool )
diff --git a/InnerDetector/InDetRecTools/InDetPriVxFinderTool/InDetPriVxFinderTool/InDetIterativePriVxFinderTool.h b/InnerDetector/InDetRecTools/InDetPriVxFinderTool/InDetPriVxFinderTool/InDetIterativePriVxFinderTool.h
index 28c6c96696c7..f0aa49bd2861 100755
--- a/InnerDetector/InDetRecTools/InDetPriVxFinderTool/InDetPriVxFinderTool/InDetIterativePriVxFinderTool.h
+++ b/InnerDetector/InDetRecTools/InDetPriVxFinderTool/InDetPriVxFinderTool/InDetIterativePriVxFinderTool.h
@@ -25,6 +25,9 @@
  *   even when using a TrackCollection or a TrackParticleBaseCollection
  *   as input.
  *
+ * Dave Casper <dcasper@uci.edu> (2018-03-28)
+ *   Migrate beam spot service to conditions handle
+ *
  ***************************************************************************/
 
 //implemented using as template the InDetPriVxFinderTool class of A. Wildauer and F. Akesson
@@ -35,10 +38,11 @@
 #include "InDetRecToolInterfaces/IVertexFinder.h"
 #include "AthenaBaseComps/AthAlgTool.h"
 #include "GaudiKernel/ToolHandle.h"
-#include "GaudiKernel/ServiceHandle.h"
 #include "TrkTrack/TrackCollection.h" // type def ...
 #include "TrkParticleBase/TrackParticleBaseCollection.h" // type def ...
 #include "TrkParameters/TrackParameters.h"
+#include "StoreGate/ReadCondHandleKey.h"
+#include "BeamSpotConditionsData/BeamSpotData.h"
 /**
  * Forward declarations 
  */
@@ -120,13 +124,10 @@ public:
    ToolHandle< Trk::IVertexFitter > m_iVertexFitter;
    ToolHandle< InDet::IInDetTrackSelectionTool > m_trkFilter;
    ToolHandle< Trk::IVertexSeedFinder > m_SeedFinder;
-//   ToolHandle< Trk::ITrkDistanceFinder > m_distFinder;
    ToolHandle< Trk::IImpactPoint3dEstimator > m_ImpactPoint3dEstimator;
-//   ToolHandle< Trk::IVertexTrackCompatibilityEstimator > m_TrackCompatibilityEstimator;
-//   ToolHandle< Trk::ImpactPoint3dAtaPlaneFactory > m_ImpactPoint3dAtaPlaneFactory;
    ToolHandle< Trk::IVertexLinearizedTrackFactory > m_LinearizedTrackFactory;
    
-   ServiceHandle<IBeamCondSvc> m_iBeamCondSvc; //!< pointer to the beam condition service
+   SG::ReadCondHandleKey<InDet::BeamSpotData> m_beamSpotKey { this, "BeamSpotKey", "BeamSpotData", "SG key for beam spot" };
 
    bool m_useBeamConstraint;
    double m_significanceCutSeeding;
diff --git a/InnerDetector/InDetRecTools/InDetPriVxFinderTool/src/InDetIterativePriVxFinderTool.cxx b/InnerDetector/InDetRecTools/InDetPriVxFinderTool/src/InDetIterativePriVxFinderTool.cxx
index 8acf61d19d8d..26e78a17efde 100755
--- a/InnerDetector/InDetRecTools/InDetPriVxFinderTool/src/InDetIterativePriVxFinderTool.cxx
+++ b/InnerDetector/InDetRecTools/InDetPriVxFinderTool/src/InDetIterativePriVxFinderTool.cxx
@@ -31,14 +31,11 @@
 #include "EventPrimitives/EventPrimitives.h"
 #include "EventPrimitives/EventPrimitivesHelpers.h"
 #include "GeoPrimitives/GeoPrimitives.h"
-//#include <TMath.h>
 
 #include "TrkVertexFitterInterfaces/IImpactPoint3dEstimator.h"
-#include "InDetBeamSpotService/IBeamCondSvc.h"
 #include "InDetTrackSelectionTool/IInDetTrackSelectionTool.h"
 #include "TrkVertexFitterInterfaces/IVertexSeedFinder.h"
 
-//#include "VxVertex/VxContainer.h"
 #include "VxVertex/RecVertex.h"
 #include "VxVertex/VxTrackAtVertex.h"
 #include "DataModel/DataVector.h"
@@ -70,12 +67,7 @@ InDetIterativePriVxFinderTool::InDetIterativePriVxFinderTool(const std::string&
           m_iVertexFitter("Trk::AdaptiveVertexFitter"),
 	  m_trkFilter("InDet::InDetTrackSelection"),
           m_SeedFinder("Trk::ZScanSeedFinder"),
-//          m_distFinder("Trk::SeedNewtonTrkDistanceFinder"),
-//          m_TrackCompatibilityEstimator("Trk::Chi2TrackCompatibilityEstimator"),
-//          m_ImpactPoint3dAtaPlaneFactory("Trk::ImpactPoint3dAtaPlaneFactory"),
-//          m_ImpactPoint3dAtaPlaneFactory("Trk::ImpactPoint3dAtaPlaneFactory"),
           m_ImpactPoint3dEstimator("Trk::ImpactPoint3dEstimator"),
-          m_iBeamCondSvc("BeamCondSvc",n),
           m_useBeamConstraint(false),
           m_significanceCutSeeding(10),
           m_maximumChi2cutForSeeding(6.*6.),
@@ -90,14 +82,9 @@ InDetIterativePriVxFinderTool::InDetIterativePriVxFinderTool(const std::string&
 
     declareProperty("VertexFitterTool", m_iVertexFitter);
     declareProperty("TrackSelector",m_trkFilter);
-    declareProperty("BeamPositionSvc", m_iBeamCondSvc);
     declareProperty("SeedFinder"       , m_SeedFinder);
-//    declareProperty("DistanceFinder",m_distFinder);
-//    declareProperty("TrackCompatibilityEstimator",m_TrackCompatibilityEstimator);
-//    declareProperty("ImpactPoint3dAtaPlaneFactory",m_ImpactPoint3dAtaPlaneFactory);
     declareProperty("ImpactPoint3dEstimator",m_ImpactPoint3dEstimator);
     declareProperty("LinearizedTrackFactory",m_LinearizedTrackFactory);
-
     declareProperty("useBeamConstraint",m_useBeamConstraint);
     declareProperty("significanceCutSeeding",m_significanceCutSeeding);
     declareProperty("maximumChi2cutForSeeding",m_maximumChi2cutForSeeding);
@@ -114,9 +101,6 @@ InDetIterativePriVxFinderTool::~InDetIterativePriVxFinderTool()
 
 StatusCode InDetIterativePriVxFinderTool::initialize()
 {
-    StatusCode sc;
-
-
     if (m_createSplitVertices==true && m_useBeamConstraint==true)
     {
       msg(MSG::FATAL) << " Split vertices cannot be obtained if beam spot constraint is true! Change settings..." << endmsg;
@@ -134,12 +118,7 @@ StatusCode InDetIterativePriVxFinderTool::initialize()
       msg(MSG::FATAL) << "Failed to retrieve tool " << m_SeedFinder << endmsg;
       return StatusCode::FAILURE;
     }
-    /*
-    if ( m_distFinder.retrieve().isFailure() ) {
-      msg(MSG::FATAL) << "Failed to retrieve tool " << m_distFinder << endmsg;
-      return StatusCode::FAILURE;
-    }
-    */
+
     if ( m_LinearizedTrackFactory.retrieve().isFailure() ) {
       msg(MSG::FATAL) << "Failed to retrieve tool " << m_LinearizedTrackFactory << endmsg;
       return StatusCode::FAILURE;
@@ -150,32 +129,12 @@ StatusCode InDetIterativePriVxFinderTool::initialize()
       return StatusCode::FAILURE;
     }
 
-    sc = m_iBeamCondSvc.retrieve();
-    if (sc.isFailure())
-    {
-      msg(MSG::ERROR) << "Could not find BeamCondSvc." << endmsg;
-      return sc;
-    }
+    ATH_CHECK( m_beamSpotKey.initialize() );
 
     if(m_trkFilter.retrieve().isFailure()) {
       msg(MSG::ERROR) <<" Unable to retrieve "<<m_trkFilter<<endmsg;
       return StatusCode::FAILURE;
     }
-    /*
-     if ( m_TrackCompatibilityEstimator.retrieve().isFailure() ) {
-       msg(MSG::ERROR) << "Failed to retrieve tool " << m_TrackCompatibilityEstimator << endmsg;
-       return StatusCode::FAILURE;
-     } else {
-       msg(MSG::INFO) << "Retrieved tool " << m_TrackCompatibilityEstimator << endmsg;
-     }
-     
-     if ( m_ImpactPoint3dAtaPlaneFactory.retrieve().isFailure() ) {
-       msg(MSG::ERROR) << "Failed to retrieve tool " << m_ImpactPoint3dAtaPlaneFactory << endmsg;
-       return StatusCode::FAILURE;
-     } else {
-       msg(MSG::INFO) << "Retrieved tool " << m_ImpactPoint3dAtaPlaneFactory << endmsg;
-     }
-    */
 
     // since some parameters special to an inherited class this method
     // will be overloaded by the inherited class
@@ -200,20 +159,14 @@ StatusCode InDetIterativePriVxFinderTool::initialize()
   } //anonymous namespace
 
   
-std::pair<xAOD::VertexContainer*, xAOD::VertexAuxContainer*> InDetIterativePriVxFinderTool::findVertex(const TrackCollection* trackTES) 
+std::pair<xAOD::VertexContainer*, xAOD::VertexAuxContainer*> 
+InDetIterativePriVxFinderTool::findVertex(const TrackCollection* trackTES) 
 {
 
-  if(msgLvl(MSG::DEBUG)) msg() << " Number of input tracks before track selection: " << trackTES->size() << endmsg;
-
-  // TODO: change trkFilter to allow for this replacement
-  /*
-  xAOD::Vertex beamposition;
-  beamposition.makePrivateStore();
-  beamposition.setPosition(m_iBeamCondSvc->beamVtx().position());
-  beamposition.setCovariancePosition(m_iBeamCondSvc->beamVtx().covariancePosition());
-  */
+  ATH_MSG_DEBUG(" Number of input tracks before track selection: " << trackTES->size());
 
-  Trk::RecVertex beamposition(m_iBeamCondSvc->beamVtx());
+  SG::ReadCondHandle<InDet::BeamSpotData> beamSpotHandle { m_beamSpotKey };
+  const InDet::BeamSpotData* beamSpot = *beamSpotHandle;
 
   std::vector<Trk::ITrackLink*> selectedTracks;
 
@@ -221,13 +174,15 @@ std::pair<xAOD::VertexContainer*, xAOD::VertexAuxContainer*> InDetIterativePriVx
 
   Root::TAccept selectionPassed;
   for (TrackDataVecIter itr  = (*trackTES).begin(); itr != (*trackTES).end(); itr++) {
-    if (m_useBeamConstraint) {
-      selectionPassed=m_trkFilter->accept(**itr,&beamposition);
+    if (m_useBeamConstraint && beamSpot != nullptr) 
+    {
+      Trk::RecVertex beamPosition { beamSpot->beamVtx() };
+      selectionPassed=m_trkFilter->accept(**itr, &beamPosition);
     }
     else
     {
       Trk::Vertex null(Amg::Vector3D(0,0,0));
-      selectionPassed=m_trkFilter->accept(**itr,&null);
+      selectionPassed=m_trkFilter->accept(**itr, &null);
     }
     if (selectionPassed)
     {
@@ -239,8 +194,8 @@ std::pair<xAOD::VertexContainer*, xAOD::VertexAuxContainer*> InDetIterativePriVx
     }
   }
 
-  if(msgLvl(MSG::DEBUG)) msg() << "Of " << trackTES->size() << " tracks "
-      << selectedTracks.size() << " survived the preselection." << endmsg;
+  ATH_MSG_DEBUG("Of " << trackTES->size() << " tracks "
+		<< selectedTracks.size() << " survived the preselection.");
 
   std::pair<xAOD::VertexContainer*, xAOD::VertexAuxContainer*> returnContainers = findVertex( selectedTracks );
 
@@ -248,28 +203,24 @@ std::pair<xAOD::VertexContainer*, xAOD::VertexAuxContainer*> InDetIterativePriVx
 
 }
 
-std::pair<xAOD::VertexContainer*, xAOD::VertexAuxContainer*> InDetIterativePriVxFinderTool::findVertex(const Trk::TrackParticleBaseCollection* trackTES) {
+std::pair<xAOD::VertexContainer*, xAOD::VertexAuxContainer*> 
+InDetIterativePriVxFinderTool::findVertex(const Trk::TrackParticleBaseCollection* trackTES) {
  
-  if(msgLvl(MSG::DEBUG)) msg() << " Number of input tracks before track selection: " << trackTES->size() << endmsg;
-
-  std::vector<Trk::ITrackLink*> selectedTracks;
+  ATH_MSG_DEBUG(" Number of input tracks before track selection: " << trackTES->size());
 
-  // TODO: change trkFilter to allow for this replacement
-  /*
-  xAOD::Vertex beamposition;
-  beamposition.makePrivateStore();
-  beamposition.setPosition(m_iBeamCondSvc->beamVtx().position());
-  beamposition.setCovariancePosition(m_iBeamCondSvc->beamVtx().covariancePosition());
-  */
+  SG::ReadCondHandle<InDet::BeamSpotData> beamSpotHandle { m_beamSpotKey };
+  const InDet::BeamSpotData* beamSpot = *beamSpotHandle;
 
-  Trk::RecVertex beamposition(m_iBeamCondSvc->beamVtx());
+  std::vector<Trk::ITrackLink*> selectedTracks;
 
   typedef DataVector<Trk::TrackParticleBase>::const_iterator TrackParticleDataVecIter;
 
   Root::TAccept selectionPassed;
   for (TrackParticleDataVecIter itr  = (*trackTES).begin(); itr != (*trackTES).end(); itr++) {
-    if (m_useBeamConstraint) {
-      selectionPassed=m_trkFilter->accept(*((*itr)->originalTrack()), &beamposition);
+    if (m_useBeamConstraint && beamSpot != nullptr) 
+    {
+      Trk::RecVertex beamPosition { beamSpot->beamVtx() };
+      selectionPassed=m_trkFilter->accept(*((*itr)->originalTrack()), &beamPosition);
     }
     else
     {
@@ -287,8 +238,8 @@ std::pair<xAOD::VertexContainer*, xAOD::VertexAuxContainer*> InDetIterativePriVx
     }
   }
 
-  if(msgLvl(MSG::DEBUG)) msg() << "Of " << trackTES->size() << " tracks "
-      << selectedTracks.size() << " survived the preselection." << endmsg;
+  ATH_MSG_DEBUG("Of " << trackTES->size() << " tracks "
+		<< selectedTracks.size() << " survived the preselection.");
 
   std::pair<xAOD::VertexContainer*, xAOD::VertexAuxContainer*> returnContainers = findVertex( selectedTracks );
 
@@ -296,23 +247,27 @@ std::pair<xAOD::VertexContainer*, xAOD::VertexAuxContainer*> InDetIterativePriVx
   
 }
 
-std::pair<xAOD::VertexContainer*, xAOD::VertexAuxContainer*> InDetIterativePriVxFinderTool::findVertex(const xAOD::TrackParticleContainer* trackParticles)
+std::pair<xAOD::VertexContainer*, xAOD::VertexAuxContainer*> 
+InDetIterativePriVxFinderTool::findVertex(const xAOD::TrackParticleContainer* trackParticles)
 {
   ATH_MSG_DEBUG(" Number of input tracks before track selection: " << trackParticles->size());
 
-  std::vector<Trk::ITrackLink*> selectedTracks;
+  SG::ReadCondHandle<InDet::BeamSpotData> beamSpotHandle { m_beamSpotKey };
+  const InDet::BeamSpotData* beamSpot = *beamSpotHandle;
 
-  xAOD::Vertex beamposition;
-  beamposition.makePrivateStore();
-  beamposition.setPosition(m_iBeamCondSvc->beamVtx().position());
-  beamposition.setCovariancePosition(m_iBeamCondSvc->beamVtx().covariancePosition());
+  std::vector<Trk::ITrackLink*> selectedTracks;
 
   typedef DataVector<xAOD::TrackParticle>::const_iterator TrackParticleDataVecIter;
 
   Root::TAccept selectionPassed;
   for (TrackParticleDataVecIter itr  = trackParticles->begin(); itr != trackParticles->end(); ++itr) {
-    if (m_useBeamConstraint) {
-      selectionPassed=m_trkFilter->accept(**itr,&beamposition);
+    if (m_useBeamConstraint && beamSpot != nullptr) 
+    {
+      xAOD::Vertex beamPosition;
+      beamPosition.makePrivateStore();
+      beamPosition.setPosition( beamSpot->beamVtx().position());
+      beamPosition.setCovariancePosition( beamSpot->beamVtx().covariancePosition() );
+      selectionPassed=m_trkFilter->accept(**itr, &beamPosition);
     }
     else
     {
@@ -337,20 +292,18 @@ std::pair<xAOD::VertexContainer*, xAOD::VertexAuxContainer*> InDetIterativePriVx
 
   ATH_MSG_DEBUG("Of " << trackParticles->size() << " tracks " << selectedTracks.size() << " survived the preselection.");
 
-  //beamposition.releasePrivateStore(); //TODO: should I add this here? it was in InDetPriVxFinderTool method
-
   std::pair<xAOD::VertexContainer*, xAOD::VertexAuxContainer*> returnContainers=findVertex(selectedTracks);
 
   return returnContainers;
 
 }
 
-std::pair<xAOD::VertexContainer*, xAOD::VertexAuxContainer*> InDetIterativePriVxFinderTool::findVertex(const std::vector<Trk::ITrackLink*> & trackVector) const
+std::pair<xAOD::VertexContainer*, xAOD::VertexAuxContainer*> 
+InDetIterativePriVxFinderTool::findVertex(const std::vector<Trk::ITrackLink*> & trackVector) const
 {
-  
-
+  SG::ReadCondHandle<InDet::BeamSpotData> beamSpotHandle { m_beamSpotKey };
+  const InDet::BeamSpotData* beamSpot = *beamSpotHandle;
 
-  
   //two things need to be added
   //1) the seeding mechanism
   //2) the iterative removal of tracks
@@ -367,11 +320,12 @@ std::pair<xAOD::VertexContainer*, xAOD::VertexAuxContainer*> InDetIterativePriVx
 
   //bail out early with only Dummy vertex if multiplicity cut is applied and exceeded
   if (m_doMaxTracksCut && (trackVector.size() > m_maxTracks)){ 
-    if (msgLvl(MSG::WARNING)) msg() << trackVector.size() << " tracks - exceeds maximum (" << m_maxTracks << "), skipping vertexing and returning only dummy..." << endmsg; 
+    ATH_MSG_WARNING( trackVector.size() << " tracks - exceeds maximum (" << m_maxTracks << 
+		     "), skipping vertexing and returning only dummy..." ); 
     xAOD::Vertex * dummyxAODVertex = new xAOD::Vertex;
     theVertexContainer->push_back( dummyxAODVertex ); // have to add vertex to container here first so it can use its aux store
-    dummyxAODVertex->setPosition( m_iBeamCondSvc->beamVtx().position() );
-    dummyxAODVertex->setCovariancePosition( m_iBeamCondSvc->beamVtx().covariancePosition() );
+    dummyxAODVertex->setPosition( beamSpot->beamVtx().position() );
+    dummyxAODVertex->setCovariancePosition( beamSpot->beamVtx().covariancePosition() );
     dummyxAODVertex->vxTrackAtVertex() = std::vector<Trk::VxTrackAtVertex>();
     dummyxAODVertex->setVertexType(xAOD::VxType::NoVtx);
     return std::make_pair(theVertexContainer, theVertexAuxContainer);
@@ -386,7 +340,6 @@ std::pair<xAOD::VertexContainer*, xAOD::VertexAuxContainer*> InDetIterativePriVx
   //prepare iterators for tracks only necessary for seeding
   std::vector<Trk::ITrackLink*>::iterator seedBegin;
   std::vector<Trk::ITrackLink*>::iterator seedEnd;
-
   
   do
   {
@@ -396,27 +349,30 @@ std::pair<xAOD::VertexContainer*, xAOD::VertexAuxContainer*> InDetIterativePriVx
 
     if (seedtracknumber==0)
     {
-      if(msgLvl(MSG::DEBUG)) msg() << " New iteration. No tracks available after track selection for seeding. No finding done." << endmsg;
+      ATH_MSG_DEBUG(" New iteration. No tracks available after track selection for seeding. No finding done.");
       break;
     }
     
     iterations+=1;
-    if(msgLvl(MSG::DEBUG)) msg() << "ITERATION NUMBER " << iterations << endmsg;
+    ATH_MSG_DEBUG("ITERATION NUMBER " << iterations);
     
     //now find a new SEED
     
     std::vector<const Trk::TrackParameters*> perigeeList;
     for (std::vector<Trk::ITrackLink*>::iterator seedtrkAtVtxIter=seedBegin;
-         seedtrkAtVtxIter!=seedEnd;++seedtrkAtVtxIter) {
+         seedtrkAtVtxIter!=seedEnd;++seedtrkAtVtxIter) 
+    {
       perigeeList.push_back((*seedtrkAtVtxIter)->parameters());
     }
 
     xAOD::Vertex theconstraint;
-    if (m_useBeamConstraint) {
+    if (m_useBeamConstraint && beamSpot != nullptr) 
+    {
       theconstraint = xAOD::Vertex(); // Default constructor creates a private store
-      theconstraint.setPosition( m_iBeamCondSvc->beamVtx().position() );
-      theconstraint.setCovariancePosition( m_iBeamCondSvc->beamVtx().covariancePosition() );
-      theconstraint.setFitQuality( m_iBeamCondSvc->beamVtx().fitQuality().chiSquared(), m_iBeamCondSvc->beamVtx().fitQuality().doubleNumberDoF() );
+      theconstraint.setPosition( beamSpot->beamVtx().position() );
+      theconstraint.setCovariancePosition( beamSpot->beamVtx().covariancePosition() );
+      theconstraint.setFitQuality( beamSpot->beamVtx().fitQuality().chiSquared(), 
+				   beamSpot->beamVtx().fitQuality().doubleNumberDoF() );
       actualVertex = m_SeedFinder->findSeed(perigeeList,&theconstraint);
     } else {
       actualVertex = m_SeedFinder->findSeed(perigeeList);
@@ -912,8 +868,8 @@ std::pair<xAOD::VertexContainer*, xAOD::VertexAuxContainer*> InDetIterativePriVx
         }
         xAOD::Vertex * dummyxAODVertex = new xAOD::Vertex;
         theVertexContainer->push_back( dummyxAODVertex ); // have to add vertex to container here first so it can use its aux store
-        dummyxAODVertex->setPosition( m_iBeamCondSvc->beamVtx().position() );
-        dummyxAODVertex->setCovariancePosition( m_iBeamCondSvc->beamVtx().covariancePosition() );
+        dummyxAODVertex->setPosition( beamSpot->beamVtx().position() );
+        dummyxAODVertex->setCovariancePosition( beamSpot->beamVtx().covariancePosition() );
         dummyxAODVertex->vxTrackAtVertex() = std::vector<Trk::VxTrackAtVertex>();
         dummyxAODVertex->setVertexType(xAOD::VxType::NoVtx);
       }
@@ -931,8 +887,8 @@ std::pair<xAOD::VertexContainer*, xAOD::VertexAuxContainer*> InDetIterativePriVx
         }
         xAOD::Vertex * dummyxAODVertex = new xAOD::Vertex;
         theVertexContainer->push_back( dummyxAODVertex ); // have to add vertex to container here first so it can use its aux store
-        dummyxAODVertex->setPosition( m_iBeamCondSvc->beamVtx().position() );
-        dummyxAODVertex->setCovariancePosition( m_iBeamCondSvc->beamVtx().covariancePosition() );
+        dummyxAODVertex->setPosition( beamSpot->beamVtx().position() );
+        dummyxAODVertex->setCovariancePosition( beamSpot->beamVtx().covariancePosition() );
         dummyxAODVertex->vxTrackAtVertex() = std::vector<Trk::VxTrackAtVertex>();
         dummyxAODVertex->setVertexType(xAOD::VxType::NoVtx);
       }
@@ -975,8 +931,8 @@ std::pair<xAOD::VertexContainer*, xAOD::VertexAuxContainer*> InDetIterativePriVx
     {
       xAOD::Vertex * dummyxAODVertex = new xAOD::Vertex;
       theVertexContainer->push_back( dummyxAODVertex ); // have to add vertex to container here first so it can use its aux store
-      dummyxAODVertex->setPosition( m_iBeamCondSvc->beamVtx().position() );
-      dummyxAODVertex->setCovariancePosition( m_iBeamCondSvc->beamVtx().covariancePosition() );
+      dummyxAODVertex->setPosition( beamSpot->beamVtx().position() );
+      dummyxAODVertex->setCovariancePosition( beamSpot->beamVtx().covariancePosition() );
       dummyxAODVertex->vxTrackAtVertex() = std::vector<Trk::VxTrackAtVertex>();
       dummyxAODVertex->setVertexType(xAOD::VxType::NoVtx);
     }
-- 
GitLab