From b65ea010d835bea39e4d51bf554a2118c6d83bc2 Mon Sep 17 00:00:00 2001
From: Paul Gessinger-Befurt <paul.gessinger@cern.ch>
Date: Thu, 14 Mar 2024 20:01:29 +0100
Subject: [PATCH] Bump ACTS to v33.0.0

Bump ACTS to v33.0.0
---
 Projects/Athena/build_externals.sh            |  2 +-
 Tools/WorkflowTestRunner/python/References.py |  2 +-
 .../python/ActsPriVxFinderConfig.py           |  4 +-
 .../src/SeedingTool.cxx                       |  2 +-
 .../ActsPatternRecognition/src/SeedingTool.h  |  2 +-
 .../src/AdaptiveMultiPriVtxFinderTool.cxx     | 60 ++++++++++---------
 .../src/AdaptiveMultiPriVtxFinderTool.h       | 20 +++++--
 .../src/IterativePriVtxFinderTool.cxx         | 54 ++++++++---------
 .../src/IterativePriVtxFinderTool.h           | 20 +++++--
 9 files changed, 95 insertions(+), 71 deletions(-)

diff --git a/Projects/Athena/build_externals.sh b/Projects/Athena/build_externals.sh
index 59e9f6e1450a..188808eeec48 100755
--- a/Projects/Athena/build_externals.sh
+++ b/Projects/Athena/build_externals.sh
@@ -12,7 +12,7 @@ ATLAS_BUILDTYPE="RelWithDebInfo"
 ATLAS_EXTRA_CMAKE_ARGS=(-DLCG_VERSION_NUMBER=104
                         -DLCG_VERSION_POSTFIX="d_ATLAS_9"
                         -DATLAS_GAUDI_SOURCE="URL;https://gitlab.cern.ch/atlas/Gaudi/-/archive/v38r0.000/Gaudi-v38r0.000.tar.gz;URL_MD5;af374562de2c29151881f49b4d8b49cf"
-                        -DATLAS_ACTS_SOURCE="URL;https://github.com/acts-project/acts/archive/refs/tags/v32.0.2.tar.gz;URL_HASH;SHA256=a817a9b6434ae206c36b1c25df6139ffcde95234944d09e718125e14da7996b8"
+                        -DATLAS_ACTS_SOURCE="URL;https://github.com/acts-project/acts/archive/refs/tags/v33.0.0.tar.gz;URL_HASH;SHA256=7fa226e59890d0693311fba3119fd4806458850c8741dc7970d50e0cfabb5889"
                         -DATLAS_GEOMODEL_SOURCE="URL;https://gitlab.cern.ch/GeoModelDev/GeoModel/-/archive/5.3.0/GeoModel-5.3.0.tar.bz2;URL_MD5;69c41f2c12ada4d953b6452454f92a04"
 			-DATLAS_GEOMODEL_PATCH=""
                         -DATLAS_GEOMODEL_FORCEDOWNLOAD_MESSAGE="Forcing_the_re-download_of_GeoModel_(2024.01.27.)")
diff --git a/Tools/WorkflowTestRunner/python/References.py b/Tools/WorkflowTestRunner/python/References.py
index 3130342127fc..aad80956f5b4 100644
--- a/Tools/WorkflowTestRunner/python/References.py
+++ b/Tools/WorkflowTestRunner/python/References.py
@@ -24,7 +24,7 @@ references_map = {
     "d1912": "v1",
     # Reco
     "q442": "v45",
-    "q449": "v69",
+    "q449": "v70",
     "q452": "v3",
     "q454": "v3",
     # Derivations
diff --git a/Tracking/Acts/ActsConfig/python/ActsPriVxFinderConfig.py b/Tracking/Acts/ActsConfig/python/ActsPriVxFinderConfig.py
index b76b994c6a96..d0f9e375f3fa 100644
--- a/Tracking/Acts/ActsConfig/python/ActsPriVxFinderConfig.py
+++ b/Tracking/Acts/ActsConfig/python/ActsPriVxFinderConfig.py
@@ -29,7 +29,7 @@ def ActsGaussAdaptiveMultiFindingCfg(flags,
                       flags.Tracking.PriVertex.useBeamConstraint)
     kwargs.setdefault("tracksMaxZinterval",
                       flags.Tracking.PriVertex.maxZinterval)
-    kwargs.setdefault("do3dSplitting",
+    kwargs.setdefault("doFullSplitting",
                       not flags.Tracking.PriVertex.useBeamConstraint)
 
     if flags.GeoModel.Run >= LHCPeriod.Run4:
@@ -55,7 +55,7 @@ def TrigActsGaussAdaptiveMultiFindingCfg(
     kwargs.setdefault("useBeamConstraint", True)
     kwargs.setdefault("useSeedConstraint", False)
     kwargs.setdefault("tracksMaxZinterval", flags.Tracking.ActiveConfig.TracksMaxZinterval)
-    kwargs.setdefault("do3dSplitting", False)
+    kwargs.setdefault("doFullSplitting", False)
     kwargs.setdefault("addSingleTrackVertices", flags.Tracking.ActiveConfig.addSingleTrackVertices)
 
     acc.setPrivateTools(acc.popToolsAndMerge(
diff --git a/Tracking/Acts/ActsPatternRecognition/src/SeedingTool.cxx b/Tracking/Acts/ActsPatternRecognition/src/SeedingTool.cxx
index 51c4c60ae77a..32832c8c79cf 100644
--- a/Tracking/Acts/ActsPatternRecognition/src/SeedingTool.cxx
+++ b/Tracking/Acts/ActsPatternRecognition/src/SeedingTool.cxx
@@ -488,7 +488,7 @@ namespace ActsTrk {
     m_gridCfg = m_gridCfg.toInternalUnits();
 
     // Seed Finder
-    m_finder = Acts::SeedFinder< value_type >(m_finderCfg);
+    m_finder = {m_finderCfg};
  
     return StatusCode::SUCCESS;
   }
diff --git a/Tracking/Acts/ActsPatternRecognition/src/SeedingTool.h b/Tracking/Acts/ActsPatternRecognition/src/SeedingTool.h
index f136d023f4cd..17b96c46947d 100644
--- a/Tracking/Acts/ActsPatternRecognition/src/SeedingTool.h
+++ b/Tracking/Acts/ActsPatternRecognition/src/SeedingTool.h
@@ -79,7 +79,7 @@ namespace ActsTrk {
     // *********************************************************************
 
   protected:
-    Acts::SeedFinder< value_type > m_finder;
+    Acts::SeedFinder< value_type, Acts::CylindricalSpacePointGrid<value_type> > m_finder;
     Acts::SeedFinderConfig< value_type > m_finderCfg;
     Acts::CylindricalSpacePointGridConfig m_gridCfg;
 
diff --git a/Tracking/Acts/ActsVertexReconstruction/src/AdaptiveMultiPriVtxFinderTool.cxx b/Tracking/Acts/ActsVertexReconstruction/src/AdaptiveMultiPriVtxFinderTool.cxx
index 0c60c8a68d12..39710ab994ad 100644
--- a/Tracking/Acts/ActsVertexReconstruction/src/AdaptiveMultiPriVtxFinderTool.cxx
+++ b/Tracking/Acts/ActsVertexReconstruction/src/AdaptiveMultiPriVtxFinderTool.cxx
@@ -20,6 +20,8 @@
 #include "Acts/Propagator/EigenStepper.hpp"
 #include "Acts/Propagator/Propagator.hpp"
 #include "Acts/Utilities/AnnealingUtility.hpp"
+#include "Acts/Surfaces/PerigeeSurface.hpp"
+#include "Acts/Vertexing/TrackAtVertex.hpp"
 
 // STL
 #include <iostream>
@@ -64,24 +66,23 @@ ActsTrk::AdaptiveMultiPriVtxFinderTool::initialize()
 
     auto bField = std::make_shared<ATLASMagneticFieldWrapper>();
     auto stepper = Acts::EigenStepper<>(bField);
-    auto propagator = std::make_shared<Propagator>(std::move(stepper), 
+    m_propagator = std::make_shared<Propagator>(std::move(stepper), 
       std::move(navigator));
+
     // IP Estimator
-    using IPEstimator = Acts::ImpactPointEstimator<TrackWrapper, Propagator>;
-    IPEstimator::Config ipEstCfg(bField, propagator);
+    Acts::ImpactPointEstimator::Config ipEstCfg(bField, m_propagator);
     ipEstCfg.maxIterations = m_ipEstMaxIterations;
     ipEstCfg.precision = m_ipEstPrecision;
-    IPEstimator ipEst(ipEstCfg);
+    Acts::ImpactPointEstimator ipEst(ipEstCfg);
 
     Acts::AnnealingUtility::Config annealingConfig;
     annealingConfig.setOfTemperatures = m_annealingTemps;
     annealingConfig.cutOff = m_annealingCutOff;
     Acts::AnnealingUtility annealingUtility(annealingConfig);
 
-    // Create a custom std::function to extract BoundParameters 
-    // from TrackWrapper
-    std::function<Acts::BoundTrackParameters(TrackWrapper)> extractParameters =
-        [](const TrackWrapper& params) { return params.parameters(); };
+    // Linearizer for Acts::BoundParameters type test
+    TrackLinearizer::Config ltConfig(bField, m_propagator);
+    m_linearizer.emplace(ltConfig);
 
     // Vertex fitter configuration
     VertexFitter::Config fitterCfg(ipEst);
@@ -91,24 +92,22 @@ ActsTrk::AdaptiveMultiPriVtxFinderTool::initialize()
     fitterCfg.minWeight = m_minWeightFitter;
     fitterCfg.maxRelativeShift = m_fitterMaxRelativeShift;
     fitterCfg.doSmoothing = m_fitterDoSmoothing;
-    VertexFitter fitter(fitterCfg, extractParameters);
-
-    // Linearizer for Acts::BoundParameters type test
-    TrackLinearizer::Config ltConfig(bField, propagator);
-    TrackLinearizer linearizer(ltConfig);
+    fitterCfg.extractParameters.connect<&TrackWrapper::extractParameters>();
+    fitterCfg.trackLinearizer.connect<&TrackLinearizer::linearizeTrack>(&*m_linearizer);
+    VertexFitter fitter(fitterCfg);
 
     // Set up Gaussian track density
-    Acts::GaussianTrackDensity<TrackWrapper>::Config trackDensityConfig;
+    Acts::GaussianTrackDensity::Config trackDensityConfig;
     trackDensityConfig.d0MaxSignificance = m_gaussianMaxD0Significance;
     trackDensityConfig.z0MaxSignificance = m_gaussianMaxZ0Significance;
-    Acts::GaussianTrackDensity<TrackWrapper> trackDensity(trackDensityConfig);
+    trackDensityConfig.extractParameters.connect<&TrackWrapper::extractParameters>();
+    Acts::GaussianTrackDensity trackDensity(trackDensityConfig);
 
     // Vertex seed finder
-    VertexSeedFinder::Config seedFinderConfig;
-    seedFinderConfig.trackDensityEstimator = trackDensity;
-    VertexSeedFinder seedFinder(seedFinderConfig, extractParameters);
+    VertexSeedFinder::Config seedFinderConfig{trackDensity};
+    auto seedFinder = std::make_shared<VertexSeedFinder>(seedFinderConfig);
     VertexFinder::Config finderConfig(std::move(fitter), seedFinder,
-        ipEst, std::move(linearizer), bField);
+        ipEst, bField);
 
     // Vertex finder config
     finderConfig.tracksMaxZinterval = m_tracksMaxZinterval;
@@ -120,12 +119,13 @@ ActsTrk::AdaptiveMultiPriVtxFinderTool::initialize()
     finderConfig.minWeight = m_minWeight;
     finderConfig.maxIterations = m_maxIterations;
     finderConfig.addSingleTrackVertices = m_addSingleTrackVertices;
-    finderConfig.do3dSplitting = m_do3dSplitting;
+    finderConfig.doFullSplitting = m_doFullSplitting;
     finderConfig.maximumVertexContamination = m_maximumVertexContamination;
     finderConfig.initialVariances = Acts::Vector4::Constant(m_looseConstrValue);
     finderConfig.useVertexCovForIPEstimation = m_useVertexCovForIPEstimation;
     finderConfig.useSeedConstraint = m_useSeedConstraint;
-    m_vertexFinder = std::make_shared<VertexFinder>(std::move(finderConfig), extractParameters);
+    finderConfig.extractParameters.connect<&TrackWrapper::extractParameters>();
+    m_vertexFinder = std::make_shared<VertexFinder>(std::move(finderConfig));
     
     ATH_MSG_INFO("ACTS AMVF tool successfully initialized");
     return StatusCode::SUCCESS;
@@ -215,7 +215,7 @@ ActsTrk::AdaptiveMultiPriVtxFinderTool::findVertex(const EventContext& ctx,
     
     SG::ReadCondHandle<InDet::BeamSpotData> beamSpotHandle { m_beamSpotKey, ctx};
     const Acts::Vector3& beamSpotPos = beamSpotHandle->beamVtx().position();
-    Acts::Vertex<TrackWrapper> beamSpotConstraintVtx(beamSpotPos);
+    Acts::Vertex beamSpotConstraintVtx(beamSpotPos);
     beamSpotConstraintVtx.setCovariance(beamSpotHandle->beamVtx().covariancePosition());
 
     // Get the magnetic field context
@@ -271,14 +271,14 @@ ActsTrk::AdaptiveMultiPriVtxFinderTool::findVertex(const EventContext& ctx,
       allTracks.emplace_back(trk.get(),Acts::BoundTrackParameters(perigeeSurface, actsParams, covMat, Acts::ParticleHypothesis::pion()));
     }
 
-    std::vector<const TrackWrapper*> allTrackPtrs;
+    std::vector<Acts::InputTrack> allTrackPtrs;
     allTrackPtrs.reserve(allTracks.size());
     
     for(const auto& trk : allTracks){
-      allTrackPtrs.push_back(&trk);
+      allTrackPtrs.emplace_back(&trk);
     }
 
-    Acts::VertexingOptions<TrackWrapper> vertexingOptions( geoContext, magFieldContext );
+    Acts::VertexingOptions vertexingOptions( geoContext, magFieldContext );
 
     if(!m_useBeamConstraint){
       beamSpotConstraintVtx.setPosition(Acts::Vector3::Zero());
@@ -291,7 +291,7 @@ ActsTrk::AdaptiveMultiPriVtxFinderTool::findVertex(const EventContext& ctx,
     vertexingOptions.useConstraintInFit = m_useBeamConstraint;
     vertexingOptions.constraint = beamSpotConstraintVtx;
 
-    VertexFinder::State finderState;
+    auto finderState = m_vertexFinder->makeState(magFieldContext);
 
     auto findResult = m_vertexFinder->find(allTrackPtrs, vertexingOptions, finderState);
     
@@ -304,7 +304,7 @@ ActsTrk::AdaptiveMultiPriVtxFinderTool::findVertex(const EventContext& ctx,
       return std::make_pair(theVertexContainer, theVertexAuxContainer);
     }
 
-    std::vector<Acts::Vertex<TrackWrapper>> allVertices = *findResult;
+    std::vector<Acts::Vertex> allVertices = *findResult;
 
     std::vector<VertexAndSignalComp> vtxList;
     
@@ -333,8 +333,10 @@ ActsTrk::AdaptiveMultiPriVtxFinderTool::findVertex(const EventContext& ctx,
           continue;
         }
 
+        const TrackWrapper* originalParams = trk.originalParams.template as<TrackWrapper>();
+
         Trk::Perigee* fittedPerigee = actsBoundToTrkPerigee(trk.fittedParams, beamSpotPos);
-        Trk::VxTrackAtVertex trkAtVtx((trk.originalParams)->trackLink()->clone());
+        Trk::VxTrackAtVertex trkAtVtx(originalParams->trackLink()->clone());
         trkAtVtx.setPerigeeAtVertex(fittedPerigee);
         trkAtVtx.setTrackQuality(Trk::FitQuality(trk.chi2Track, trk.ndf));
         trkAtVtx.setVtxCompatibility(trk.vertexCompatibility);
@@ -342,7 +344,7 @@ ActsTrk::AdaptiveMultiPriVtxFinderTool::findVertex(const EventContext& ctx,
         trkAtVtxVec->push_back(trkAtVtx);
 
         const Trk::LinkToXAODTrackParticle* linkToXAODTP =
-        dynamic_cast<const Trk::LinkToXAODTrackParticle*>((trk.originalParams)->trackLink());
+        dynamic_cast<const Trk::LinkToXAODTrackParticle*>(originalParams->trackLink());
         if (linkToXAODTP) {
           xAODVtx->addTrackAtVertex(*linkToXAODTP, trk.trackWeight);
         }
diff --git a/Tracking/Acts/ActsVertexReconstruction/src/AdaptiveMultiPriVtxFinderTool.h b/Tracking/Acts/ActsVertexReconstruction/src/AdaptiveMultiPriVtxFinderTool.h
index 7057b0bfdfde..2b64bf3b1db8 100644
--- a/Tracking/Acts/ActsVertexReconstruction/src/AdaptiveMultiPriVtxFinderTool.h
+++ b/Tracking/Acts/ActsVertexReconstruction/src/AdaptiveMultiPriVtxFinderTool.h
@@ -38,6 +38,7 @@
 #include "Acts/Vertexing/AdaptiveMultiVertexFitter.hpp"
 #include "Acts/Vertexing/HelicalTrackLinearizer.hpp"
 #include "Acts/Vertexing/TrackDensityVertexFinder.hpp"
+#include "Acts/Vertexing/TrackAtVertex.hpp"
 #include "Acts/Vertexing/Vertex.hpp"
 #include "Acts/Vertexing/ImpactPointEstimator.hpp"
 
@@ -65,6 +66,10 @@ namespace ActsTrk {
 
     const Trk::ITrackLink* trackLink() const {return m_trkLink;}
 
+    static Acts::BoundTrackParameters extractParameters(const Acts::InputTrack& input) {
+      return input.template as<TrackWrapper>()->parameters();
+    }
+
   private:
     const Trk::ITrackLink* m_trkLink;
     Acts::BoundTrackParameters m_boundParams;
@@ -104,13 +109,18 @@ namespace ActsTrk {
     }
 
     using Propagator = Acts::Propagator<Acts::EigenStepper<>, Acts::Navigator>;
-    using TrackLinearizer = Acts::HelicalTrackLinearizer<Propagator>;
-    using VertexFitter = Acts::AdaptiveMultiVertexFitter<TrackWrapper, TrackLinearizer>;
-    using VertexSeedFinder = Acts::TrackDensityVertexFinder<VertexFitter, Acts::GaussianTrackDensity<TrackWrapper>>;
-    using VertexFinder = Acts::AdaptiveMultiVertexFinder<VertexFitter, VertexSeedFinder>;
+    using TrackLinearizer = Acts::HelicalTrackLinearizer;
+    using VertexFitter = Acts::AdaptiveMultiVertexFitter;
+    using VertexSeedFinder = Acts::TrackDensityVertexFinder;
+    using VertexFinder = Acts::AdaptiveMultiVertexFinder;
 
     std::shared_ptr<VertexFinder> m_vertexFinder = nullptr;
 
+    std::shared_ptr<Propagator> m_propagator = nullptr;
+
+    // optional because of late initializatio
+    std::optional<TrackLinearizer> m_linearizer = std::nullopt;
+
     ToolHandle<IActsTrackingGeometryTool> m_trackingGeometryTool{this, "TrackingGeometryTool", "", "ActsTrackingGeometryTool"};
     ToolHandle<IActsExtrapolationTool> m_extrapolationTool{this, "ExtrapolationTool", "", "ActsExtrapolationTool"};
     ToolHandle<InDet::IInDetTrackSelectionTool> m_trkFilter{this, "TrackSelector", "", "InDetTrackSelectionTool"};
@@ -140,7 +150,7 @@ namespace ActsTrk {
     DoubleProperty m_minWeight{this, "minWeight", 0.0001, "Min track weight for finder"};
     UnsignedIntegerProperty m_maxIterations{this, "maxIterations", 100, "Vertex finder max. iterations"};
     BooleanProperty m_addSingleTrackVertices{this, "addSingleTrackVertices", false, "Add single-track vertices"};
-    BooleanProperty m_do3dSplitting{this, "do3dSplitting", false, "Do 3d-splitting"};
+    BooleanProperty m_doFullSplitting{this, "doFullSplitting", false, "Do full-splitting"};
     DoubleProperty m_maximumVertexContamination{this, "maximumVertexContamination", 0.5, "Max. vertex contamination"};
     DoubleProperty m_looseConstrValue{this, "looseConstrValue", 1e+8, "Loose constraint value"};
     BooleanProperty m_useVertexCovForIPEstimation{this, "useVertexCovForIPEstimation", false, "Use seed vertex cov for IPEstimation"};
diff --git a/Tracking/Acts/ActsVertexReconstruction/src/IterativePriVtxFinderTool.cxx b/Tracking/Acts/ActsVertexReconstruction/src/IterativePriVtxFinderTool.cxx
index 41048e8fe99d..396d3f45f8c6 100644
--- a/Tracking/Acts/ActsVertexReconstruction/src/IterativePriVtxFinderTool.cxx
+++ b/Tracking/Acts/ActsVertexReconstruction/src/IterativePriVtxFinderTool.cxx
@@ -20,6 +20,7 @@
 #include "Acts/Propagator/EigenStepper.hpp"
 #include "Acts/Propagator/Propagator.hpp"
 #include "Acts/Utilities/AnnealingUtility.hpp"
+#include "Acts/Vertexing/TrackAtVertex.hpp"
 
 // STL
 #include <iostream>
@@ -64,44 +65,40 @@ ActsTrk::IterativePriVtxFinderTool::initialize()
 
   m_bField = std::make_shared<ATLASMagneticFieldWrapper>();
   auto stepper = Acts::EigenStepper<>(m_bField);
-  auto propagator = std::make_shared<Propagator>(std::move(stepper),
+  m_propagator = std::make_shared<Propagator>(std::move(stepper),
 						 std::move(navigator));
   // IP Estimator
-  using IPEstimator = Acts::ImpactPointEstimator<TrackWrapper, Propagator>;
-  IPEstimator::Config ipEstCfg(m_bField, propagator);
+  Acts::ImpactPointEstimator::Config ipEstCfg(m_bField, m_propagator);
   ipEstCfg.maxIterations = m_ipEstMaxIterations;
   ipEstCfg.precision = m_ipEstPrecision;
-  IPEstimator ipEst(ipEstCfg);
+  Acts::ImpactPointEstimator ipEst(ipEstCfg);
 
-  // Create a custom std::function to extract BoundParameters 
-  // from TrackWrapper
-  std::function<Acts::BoundTrackParameters(TrackWrapper)> extractParameters =
-    [](const TrackWrapper& params) { return params.parameters(); };
+  // Linearizer for Acts::BoundParameters type test
+  TrackLinearizer::Config ltConfig(m_bField, m_propagator);
+  m_linearizer.emplace(ltConfig);
 
   // Full Billoir Vertex fitter setup
   VertexFitter::Config fitterCfg;
   fitterCfg.maxIterations = m_fitterMaxIterations;
-  VertexFitter fitter(fitterCfg, extractParameters);
+  fitterCfg.extractParameters.connect<&TrackWrapper::extractParameters>();
+  fitterCfg.trackLinearizer.connect<&TrackLinearizer::linearizeTrack>(&*m_linearizer);
+  VertexFitter fitter(fitterCfg);
 
-  // Linearizer for Acts::BoundParameters type test
-  TrackLinearizer::Config ltConfig(m_bField, propagator);
-  TrackLinearizer linearizer(ltConfig);
 
   // Seed finder setup
   // Set up Gaussian track density
-  Acts::GaussianTrackDensity<TrackWrapper>::Config trackDensityConfig;
+  Acts::GaussianTrackDensity::Config trackDensityConfig;
   trackDensityConfig.d0MaxSignificance = m_gaussianMaxD0Significance;
   trackDensityConfig.z0MaxSignificance = m_gaussianMaxZ0Significance;
-  Acts::GaussianTrackDensity<TrackWrapper> trackDensity(trackDensityConfig);
+  trackDensityConfig.extractParameters.connect<&TrackWrapper::extractParameters>();
+  Acts::GaussianTrackDensity trackDensity(trackDensityConfig);
 
   // Vertex seed finder
-  VertexSeedFinder::Config seedFinderConfig;
-  seedFinderConfig.trackDensityEstimator = trackDensity;
-  VertexSeedFinder seedFinder(seedFinderConfig, extractParameters);
+  VertexSeedFinder::Config seedFinderConfig{trackDensity};
+  auto seedFinder = std::make_shared<VertexSeedFinder>(seedFinderConfig);
     
   // Iterative Vertex Finder setup
   VertexFinder::Config finderConfig(std::move(fitter), 
-                                    std::move(linearizer), 
                                     std::move(seedFinder), 
                                     ipEst);
   finderConfig.significanceCutSeeding = m_significanceCutSeeding;
@@ -113,7 +110,9 @@ ActsTrk::IterativePriVtxFinderTool::initialize()
   finderConfig.doMaxTracksCut = m_doMaxTracksCut;
   finderConfig.maxTracks = m_maxTracks;
   finderConfig.cutOffTrackWeight = m_cutOffTrackWeight;
-  m_vertexFinder = std::make_shared<VertexFinder>(std::move(finderConfig), extractParameters); 
+  finderConfig.extractParameters.connect<&TrackWrapper::extractParameters>();
+  finderConfig.trackLinearizer.connect<&TrackLinearizer::linearizeTrack>(&*m_linearizer);
+  m_vertexFinder = std::make_shared<VertexFinder>(std::move(finderConfig)); 
 
   ATH_MSG_INFO("ACTS Iterative Vertex Finder tool successfully initialized");
   return StatusCode::SUCCESS;
@@ -227,7 +226,7 @@ ActsTrk::IterativePriVtxFinderTool::findVertex(const EventContext& ctx,
   }
 
   const Acts::Vector3& beamSpotPos = beamSpotHandle->beamVtx().position();
-  Acts::Vertex<TrackWrapper> beamSpotConstraintVtx(beamSpotPos);
+  Acts::Vertex beamSpotConstraintVtx(beamSpotPos);
   beamSpotConstraintVtx.setCovariance(beamSpotHandle->beamVtx().covariancePosition());
 
   std::shared_ptr<Acts::PerigeeSurface> perigeeSurface =
@@ -269,14 +268,14 @@ ActsTrk::IterativePriVtxFinderTool::findVertex(const EventContext& ctx,
     allTracks.emplace_back(trk.get(),Acts::BoundTrackParameters(perigeeSurface, actsParams, covMat, Acts::ParticleHypothesis::pion()));
   }
   
-  std::vector<const TrackWrapper*> allTrackPtrs;
+  std::vector<Acts::InputTrack> allTrackPtrs;
   allTrackPtrs.reserve(allTracks.size());
 
 for(const auto& trk : allTracks){
-    allTrackPtrs.push_back(&trk);
+    allTrackPtrs.emplace_back(&trk);
   }
   
-  Acts::VertexingOptions<TrackWrapper> vertexingOptions(geoContext,
+  Acts::VertexingOptions vertexingOptions(geoContext,
 							magFieldContext);
 
   if(!m_useBeamConstraint){
@@ -300,7 +299,7 @@ for(const auto& trk : allTracks){
   vertexingOptions.constraint.setFullPosition(vtxConstraintPos);
   vertexingOptions.constraint.setFullCovariance(vtxConstraintCov);
 
-  VertexFinder::State finderState(*m_bField, magFieldContext);
+  auto finderState = m_vertexFinder->makeState(magFieldContext);
 
   auto findResult = m_vertexFinder->find(allTrackPtrs, vertexingOptions, finderState);
 
@@ -315,7 +314,7 @@ for(const auto& trk : allTracks){
     return std::make_pair(theVertexContainer, theVertexAuxContainer);
   }
 
-  std::vector<Acts::Vertex<TrackWrapper>> allVertices = *findResult;
+  std::vector<Acts::Vertex> allVertices = *findResult;
 
   for(const auto& vtx : allVertices){
     xAOD::Vertex* xAODVtx = new xAOD::Vertex;
@@ -330,9 +329,10 @@ for(const auto& trk : allTracks){
 
       Trk::Perigee* fittedPerigee = actsBoundToTrkPerigee(trk.fittedParams, beamSpotPos);
       //Trk::Perigee* originalPerigee = actsBoundToTrkPerigee((trk.originalParams)->parameters(), beamSpotPos);
+      const TrackWrapper* originalParams = trk.originalParams.template as<TrackWrapper>();
 
       //Trk::VxTrackAtVertex trkAtVtx(trk.chi2Track, fittedPerigee, originalPerigee);
-      Trk::VxTrackAtVertex trkAtVtx((trk.originalParams)->trackLink()->clone());
+      Trk::VxTrackAtVertex trkAtVtx(originalParams->trackLink()->clone());
       trkAtVtx.setPerigeeAtVertex(fittedPerigee);
       trkAtVtx.setTrackQuality(Trk::FitQuality(trk.chi2Track, trk.ndf));
       trkAtVtx.setVtxCompatibility(trk.vertexCompatibility);
@@ -340,7 +340,7 @@ for(const auto& trk : allTracks){
       trkAtVtxVec->push_back(trkAtVtx);
 
       const Trk::LinkToXAODTrackParticle* linkToXAODTP =
-        dynamic_cast<const Trk::LinkToXAODTrackParticle*>((trk.originalParams)->trackLink());
+        dynamic_cast<const Trk::LinkToXAODTrackParticle*>(originalParams->trackLink());
       if (linkToXAODTP) {
 	xAODVtx->addTrackAtVertex(*linkToXAODTP, trk.trackWeight);
       }
diff --git a/Tracking/Acts/ActsVertexReconstruction/src/IterativePriVtxFinderTool.h b/Tracking/Acts/ActsVertexReconstruction/src/IterativePriVtxFinderTool.h
index d5dd7821f9ec..5bc96c1c4936 100644
--- a/Tracking/Acts/ActsVertexReconstruction/src/IterativePriVtxFinderTool.h
+++ b/Tracking/Acts/ActsVertexReconstruction/src/IterativePriVtxFinderTool.h
@@ -39,12 +39,14 @@
 #include "Acts/Vertexing/FullBilloirVertexFitter.hpp"
 #include "Acts/Vertexing/HelicalTrackLinearizer.hpp"
 #include "Acts/Vertexing/TrackDensityVertexFinder.hpp"
+#include "Acts/Vertexing/TrackAtVertex.hpp"
 #include "Acts/Vertexing/Vertex.hpp"
 #include "Acts/Vertexing/ImpactPointEstimator.hpp"
 #include "Acts/Utilities/Logger.hpp"
 
 
 #include <cmath>
+#include <optional>
 
 namespace Acts {
 class Surface;
@@ -67,6 +69,10 @@ namespace ActsTrk {
 
     const Trk::ITrackLink* trackLink() const {return m_trkLink;}
 
+    static Acts::BoundTrackParameters extractParameters(const Acts::InputTrack& input) {
+      return input.template as<TrackWrapper>()->parameters();
+    }
+
   private:
     const Trk::ITrackLink* m_trkLink;
     Acts::BoundTrackParameters m_boundParams;
@@ -106,13 +112,19 @@ namespace ActsTrk {
     }
 
     using Propagator = Acts::Propagator<Acts::EigenStepper<>, Acts::Navigator>;
-    using TrackLinearizer = Acts::HelicalTrackLinearizer<Propagator>;
-    using VertexFitter = Acts::FullBilloirVertexFitter<TrackWrapper, TrackLinearizer>;
-    using VertexSeedFinder = Acts::TrackDensityVertexFinder<VertexFitter, Acts::GaussianTrackDensity<TrackWrapper>>;
-    using VertexFinder = Acts::IterativeVertexFinder<VertexFitter, VertexSeedFinder>;
+    using TrackLinearizer = Acts::HelicalTrackLinearizer;
+    using VertexFitter = Acts::FullBilloirVertexFitter;
+    using VertexSeedFinder = Acts::TrackDensityVertexFinder;
+    using VertexFinder = Acts::IterativeVertexFinder;
 
     std::shared_ptr<VertexFinder> m_vertexFinder = nullptr;
     std::shared_ptr<ATLASMagneticFieldWrapper> m_bField = nullptr;
+
+    std::shared_ptr<Propagator> m_propagator = nullptr;
+
+    // optional because of late initializatio
+    std::optional<TrackLinearizer> m_linearizer = std::nullopt;
+
     ToolHandle<IActsTrackingGeometryTool> m_trackingGeometryTool{this, "TrackingGeometryTool", "", "ActsTrackingGeometryTool"};
     ToolHandle<IActsExtrapolationTool> m_extrapolationTool{this, "ExtrapolationTool", "", "ActsExtrapolationTool"};
     ToolHandle<InDet::IInDetTrackSelectionTool> m_trkFilter{this, "TrackSelector", "", "InDetTrackSelectionTool"};
-- 
GitLab