From fa73db7cd45a14c8a1068db6675178ae1d9c69cd Mon Sep 17 00:00:00 2001
From: Xiaocong Ai <xiaocong.ai@cern.ch>
Date: Sun, 23 Jun 2024 17:41:19 +0200
Subject: [PATCH] update seeding tools

---
 .../FaserActsKalmanFilter/ITrackSeedTool.h    |  2 +-
 .../src/ActsTrackSeedTool.cxx                 | 49 ++++++-----
 .../src/ActsTrackSeedTool.h                   | 10 +--
 .../src/CircleFitTrackSeedTool.cxx            | 39 ++++++---
 .../src/CircleFitTrackSeedTool.h              |  8 +-
 .../src/MyTrackSeedTool.cxx                   | 28 +++++--
 .../src/MyTrackSeedTool.h                     |  8 +-
 .../src/SPSeedBasedInitialParameterTool.cxx   | 27 +++++--
 .../src/SPSeedBasedInitialParameterTool.h     | 12 +--
 .../src/SPSimpleInitialParameterTool.cxx      | 81 ++++++++++++++-----
 .../src/SPSimpleInitialParameterTool.h        | 20 ++---
 .../src/ThreeStationTrackSeedTool.cxx         | 32 +++++---
 .../src/ThreeStationTrackSeedTool.h           | 10 +--
 .../src/TruthBasedInitialParameterTool.cxx    | 64 ++++++++++-----
 .../src/TruthBasedInitialParameterTool.h      | 10 +--
 15 files changed, 255 insertions(+), 145 deletions(-)

diff --git a/Tracking/Acts/FaserActsKalmanFilter/FaserActsKalmanFilter/ITrackSeedTool.h b/Tracking/Acts/FaserActsKalmanFilter/FaserActsKalmanFilter/ITrackSeedTool.h
index 7a429b3e2..a9e09cd55 100644
--- a/Tracking/Acts/FaserActsKalmanFilter/FaserActsKalmanFilter/ITrackSeedTool.h
+++ b/Tracking/Acts/FaserActsKalmanFilter/FaserActsKalmanFilter/ITrackSeedTool.h
@@ -21,7 +21,7 @@ public:
   DeclareInterfaceID(ITrackSeedTool, 1, 0);
 
   virtual StatusCode run(std::vector<int> maskedLayers = {}, bool backward = false) = 0;
-  virtual const std::shared_ptr<std::vector<Acts::CurvilinearTrackParameters>> initialTrackParameters() const = 0;
+  virtual const std::shared_ptr<std::vector<Acts::BoundTrackParameters>> initialTrackParameters() const = 0;
   virtual const std::shared_ptr<const Acts::Surface> initialSurface() const = 0;
   virtual const std::shared_ptr<std::vector<IndexSourceLink>> sourceLinks() const = 0;
   virtual const std::shared_ptr<IdentifierLink> idLinks() const = 0;
diff --git a/Tracking/Acts/FaserActsKalmanFilter/src/ActsTrackSeedTool.cxx b/Tracking/Acts/FaserActsKalmanFilter/src/ActsTrackSeedTool.cxx
index 0f41f2d91..a987611bd 100644
--- a/Tracking/Acts/FaserActsKalmanFilter/src/ActsTrackSeedTool.cxx
+++ b/Tracking/Acts/FaserActsKalmanFilter/src/ActsTrackSeedTool.cxx
@@ -40,7 +40,7 @@ StatusCode ActsTrackSeedTool::run(std::vector<int> /*maskedLayers*/, bool /*back
   Acts::GeometryContext geoctx = gctx.context();
 
   const int kSize = 1;
-  using ThisMeasurement = Acts::Measurement<IndexSourceLink, Acts::BoundIndices, kSize>;
+  using ThisMeasurement = Acts::Measurement<Acts::BoundIndices, kSize>;
   std::array<Acts::BoundIndices, kSize> Indices = {Acts::eBoundLoc0};
   std::vector<IndexSourceLink> sourceLinks;
   std::vector<Measurement> measurements;
@@ -57,7 +57,7 @@ StatusCode ActsTrackSeedTool::run(std::vector<int> /*maskedLayers*/, bool /*back
         const auto& par = cluster->localPosition();
         Eigen::Matrix<double, 1, 1> pos {par.x(),};
         Eigen::Matrix<double, 1, 1> cov {m_std_cluster * m_std_cluster,};
-        ThisMeasurement meas(sourceLink, Indices, pos, cov);
+        ThisMeasurement meas(Acts::SourceLink{sourceLink}, Indices, pos, cov);
         sourceLinks.push_back(sourceLink);
         measurements.emplace_back(std::move(meas));
         clusters.push_back(cluster);
@@ -82,7 +82,7 @@ StatusCode ActsTrackSeedTool::run(std::vector<int> /*maskedLayers*/, bool /*back
     }
   }
 
-  Acts::BoundSymMatrix cov = Acts::BoundSymMatrix::Zero();
+  Acts::BoundSquareMatrix cov = Acts::BoundSquareMatrix::Zero();
   cov(Acts::eBoundLoc0, Acts::eBoundLoc0) = m_covLoc0;
   cov(Acts::eBoundLoc1, Acts::eBoundLoc1) = m_covLoc1;
   cov(Acts::eBoundPhi, Acts::eBoundPhi) = m_covPhi;
@@ -90,7 +90,7 @@ StatusCode ActsTrackSeedTool::run(std::vector<int> /*maskedLayers*/, bool /*back
   cov(Acts::eBoundQOverP, Acts::eBoundQOverP) = m_covQOverP;
   cov(Acts::eBoundTime, Acts::eBoundTime) = m_covTime;
 
-  std::vector<Acts::CurvilinearTrackParameters> initParams {};
+  std::vector<Acts::BoundTrackParameters> initParams {};
   for (const Amg::Vector3D& pos1 : station_position_map[1]) {
     for (const Amg::Vector3D& pos2 : station_position_map[2]) {
       for (const Amg::Vector3D& pos3 : station_position_map[3]) {
@@ -101,7 +101,7 @@ StatusCode ActsTrackSeedTool::run(std::vector<int> /*maskedLayers*/, bool /*back
     }
   }
 
-  m_initialTrackParameters = std::make_shared<std::vector<Acts::CurvilinearTrackParameters>>(initParams);
+  m_initialTrackParameters = std::make_shared<std::vector<Acts::BoundTrackParameters>>(initParams);
   m_sourceLinks = std::make_shared<std::vector<IndexSourceLink>>(sourceLinks);
   m_idLinks = std::make_shared<IdentifierLink>(identifierLinkMap);
   m_measurements = std::make_shared<std::vector<Measurement>>(measurements);
@@ -118,30 +118,41 @@ StatusCode ActsTrackSeedTool::finalize() {
 }
 
 
-Acts::CurvilinearTrackParameters ActsTrackSeedTool::get_params(
+Acts::BoundTrackParameters ActsTrackSeedTool::get_params(
     const Acts::GeometryContext& gctx, const Amg::Vector3D& pos1,
     const Amg::Vector3D& pos2, const Amg::Vector3D& pos3,
-    const Acts::BoundSymMatrix& cov, double /*origin*/) {
+    const Acts::BoundSquareMatrix& cov, double /*origin*/) {
   const auto surface = Acts::Surface::makeShared<Acts::PlaneSurface>(
       Acts::Vector3 {0, 0, pos1.z()}, Acts::Vector3{0, 0, -1});
-  boost::container::small_vector<const Amg::Vector3D*, 3> spacepoints {};
-  spacepoints.push_back(&pos1);
-  spacepoints.push_back(&pos2);
-  spacepoints.push_back(&pos3);
-  auto trackParams = Acts::CurvilinearTrackParameters(Acts::Vector4{0, 0, 0, 0}, Acts::Vector3{0, 0, 0}, 0, 0, cov);
+  struct SP{
+   double x_;
+   double y_;
+   double z_;
+   double t_;
+   double x() const {return x_;} 
+   double y() const {return y_;} 
+   double z() const {return z_;} 
+   double t() const {return t_;} 
+  }; 
+  SP sp1{pos1.x(), pos1.y(), pos1.z(), 0};
+  SP sp2{pos2.x(), pos2.y(), pos2.z(), 0};
+  SP sp3{pos3.x(), pos3.y(), pos3.z(), 0};
+  std::array<const SP*, 3>  spacepoints = {&sp1, &sp2, &sp3};
+  //boost::container::small_vector<const Amg::Vector3D*, 3> spacepoints {};
+  //spacepoints.push_back(&pos1);
+  //spacepoints.push_back(&pos2);
+  //spacepoints.push_back(&pos3);
+  //@todo: fix the ParticleHypothesis
+  auto trackParams = Acts::BoundTrackParameters(surface, Acts::BoundVector::Zero(), cov,  Acts::ParticleHypothesis::muon());
   auto optParams = Acts::estimateTrackParamsFromSeed(
       gctx, spacepoints.begin(), spacepoints.end(), *surface, Acts::Vector3{0.57_T, 0, 0}, 0.1_T);
   if (not optParams.has_value()) {
     std::cout << "Estimation of track parameters failed." << std::endl;
   } else {
     const auto& params = optParams.value();
-    double charge = std::copysign(1, params[Acts::eBoundQOverP]);
-    Acts::Vector4 pos {params.x(), params.y(), params.z(), params.w()};
-    Acts::Vector3 dir{std::sin(params[Acts::eBoundTheta]) * std::cos(params[Acts::eBoundPhi]),
-                      std::sin(params[Acts::eBoundTheta]) * std::sin(params[Acts::eBoundPhi]),
-                      std::cos(params[Acts::eBoundTheta])};
-    double abs_momentum = std::abs(1/params[Acts::eBoundQOverP]);
-    trackParams = Acts::CurvilinearTrackParameters(pos, dir, charge, abs_momentum, cov);
+    
+    //@todo: fix the ParticleHypothesis
+    trackParams = Acts::BoundTrackParameters(surface, params, cov, Acts::ParticleHypothesis::muon());
   }
   return trackParams;
 }
diff --git a/Tracking/Acts/FaserActsKalmanFilter/src/ActsTrackSeedTool.h b/Tracking/Acts/FaserActsKalmanFilter/src/ActsTrackSeedTool.h
index e957fa8f2..ce19c1e89 100644
--- a/Tracking/Acts/FaserActsKalmanFilter/src/ActsTrackSeedTool.h
+++ b/Tracking/Acts/FaserActsKalmanFilter/src/ActsTrackSeedTool.h
@@ -20,7 +20,7 @@ public:
   virtual StatusCode finalize() override;
   virtual StatusCode run(std::vector<int> /*maskedLayers*/, bool /*backward*/) override;
 
-  const std::shared_ptr<std::vector<Acts::CurvilinearTrackParameters>> initialTrackParameters() const override;
+  const std::shared_ptr<std::vector<Acts::BoundTrackParameters>> initialTrackParameters() const override;
   const std::shared_ptr<const Acts::Surface> initialSurface() const override;
   const std::shared_ptr<std::vector<IndexSourceLink>> sourceLinks() const override;
   const std::shared_ptr<IdentifierLink> idLinks() const override;
@@ -31,7 +31,7 @@ public:
   double targetZPosition() const override;
 
 private:
-  std::shared_ptr<std::vector<Acts::CurvilinearTrackParameters>> m_initialTrackParameters;
+  std::shared_ptr<std::vector<Acts::BoundTrackParameters>> m_initialTrackParameters;
   std::shared_ptr<const Acts::Surface> m_initialSurface;
   std::shared_ptr<std::vector<IndexSourceLink>> m_sourceLinks {};
   std::shared_ptr<IdentifierLink> m_idLinks {};
@@ -63,13 +63,13 @@ private:
   Gaudi::Property<double> m_covTime {this, "covTime", 1};
   Gaudi::Property<double> m_origin {this, "origin", 0, "z position of the reference surface"};
 
-  static Acts::CurvilinearTrackParameters get_params(
+  static Acts::BoundTrackParameters get_params(
       const Acts::GeometryContext& gctx, const Amg::Vector3D& position_st1,
       const Amg::Vector3D& position_st2, const Amg::Vector3D& position_st3,
-      const Acts::BoundSymMatrix& cov, double origin);
+      const Acts::BoundSquareMatrix& cov, double origin);
 };
 
-inline const std::shared_ptr<std::vector<Acts::CurvilinearTrackParameters>>
+inline const std::shared_ptr<std::vector<Acts::BoundTrackParameters>>
 ActsTrackSeedTool::initialTrackParameters() const {
   return m_initialTrackParameters;
 }
diff --git a/Tracking/Acts/FaserActsKalmanFilter/src/CircleFitTrackSeedTool.cxx b/Tracking/Acts/FaserActsKalmanFilter/src/CircleFitTrackSeedTool.cxx
index 51703a125..970fc14b9 100644
--- a/Tracking/Acts/FaserActsKalmanFilter/src/CircleFitTrackSeedTool.cxx
+++ b/Tracking/Acts/FaserActsKalmanFilter/src/CircleFitTrackSeedTool.cxx
@@ -6,6 +6,7 @@
 #include "TrackerPrepRawData/FaserSCT_Cluster.h"
 #include "Identifier/Identifier.h"
 #include "Acts/Geometry/GeometryIdentifier.hpp"
+#include "Acts/Surfaces/PerigeeSurface.hpp"
 #include "CircleFit.h"
 #include "LinearFit.h"
 #include "TrackClassification.h"
@@ -68,7 +69,7 @@ StatusCode CircleFitTrackSeedTool::run(std::vector<int> maskedLayers, bool backw
   }
 
 
-  using ThisMeasurement = Acts::Measurement<IndexSourceLink, Acts::BoundIndices, 1>;
+  using ThisMeasurement = Acts::Measurement<Acts::BoundIndices, 1>;
   std::array<Acts::BoundIndices, 1> Indices = {Acts::eBoundLoc0};
   std::vector<IndexSourceLink> sourceLinks {};
   std::vector<Measurement> measurements {};
@@ -90,7 +91,8 @@ StatusCode CircleFitTrackSeedTool::run(std::vector<int> maskedLayers, bool backw
 	auto cova = cluster->localCovariance();
         Eigen::Matrix<double, 1, 1> pos {par.x(),};
         Eigen::Matrix<double, 1, 1> cov {0.0231 * 0.0231,};
-        ThisMeasurement meas(sourceLink, Indices, pos, cov);
+        Acts::SourceLink sl{sourceLink}; 
+        ThisMeasurement meas(std::move(sl), Indices, pos, cov);
         sourceLinks.push_back(sourceLink);
         measurements.emplace_back(std::move(meas));
       }
@@ -156,7 +158,7 @@ StatusCode CircleFitTrackSeedTool::run(std::vector<int> maskedLayers, bool backw
     });
   }
 
-  Acts::BoundSymMatrix cov = Acts::BoundSymMatrix::Zero();
+  Acts::BoundSquareMatrix cov = Acts::BoundSquareMatrix::Zero();
   cov(Acts::eBoundLoc0, Acts::eBoundLoc0) = m_covLoc0;
   cov(Acts::eBoundLoc1, Acts::eBoundLoc1) = m_covLoc1;
   cov(Acts::eBoundPhi, Acts::eBoundPhi) = m_covPhi;
@@ -175,17 +177,18 @@ StatusCode CircleFitTrackSeedTool::run(std::vector<int> maskedLayers, bool backw
     origin = 2470;
   }
   m_targetZPosition = origin;
-  std::vector<Acts::CurvilinearTrackParameters> initParams {};
+  std::vector<Acts::BoundTrackParameters> initParams {};
   ATH_MSG_DEBUG("Sorted seed properties:");
   for (const Seed &seed : selectedSeeds) {
     ATH_MSG_DEBUG("seed size: " << seed.size << ", chi2: " << seed.chi2);
     initParams.push_back(seed.get_params(origin, cov, backward));
   }
 
-  m_initialTrackParameters = std::make_shared<std::vector<Acts::CurvilinearTrackParameters>>(initParams);
+  m_initialTrackParameters = std::make_shared<std::vector<Acts::BoundTrackParameters>>(initParams);
   m_sourceLinks = std::make_shared<std::vector<IndexSourceLink>>(sourceLinks);
   // m_idLinks = std::make_shared<IdentifierLink>(identifierLinkMap);
   m_measurements = std::make_shared<std::vector<Measurement>>(measurements);
+  //@todo make sure this is correct 
   m_initialSurface = Acts::Surface::makeShared<Acts::PlaneSurface>(
       Acts::Vector3 {0, 0, origin}, Acts::Vector3{0, 0, -1});
   m_clusters = std::make_shared<std::vector<const Tracker::FaserSCT_Cluster*>>(clusters);
@@ -345,15 +348,27 @@ void CircleFitTrackSeedTool::Seed::getChi2() {
   }
 }
 
-Acts::CurvilinearTrackParameters CircleFitTrackSeedTool::Seed::get_params(double origin, Acts::BoundSymMatrix cov, bool backward) const {
+Acts::BoundTrackParameters CircleFitTrackSeedTool::Seed::get_params(double origin, Acts::BoundSquareMatrix cov, bool backward) const {
+  double theta = Acts::VectorHelpers::theta(direction);
+  double phi = Acts::VectorHelpers::phi(direction);
+
+  Acts::BoundVector params = Acts::BoundVector::Zero();
+  params[Acts::eBoundLoc0] = 0;
+  params[Acts::eBoundLoc1] = 0;
+  params[Acts::eBoundTime] = 0;
+  params[Acts::eBoundPhi] = phi;
+  params[Acts::eBoundTheta] = theta;
+  //params[Acts::eBoundQOverP] = particleHypothesis.qOverP(p, charge);
+  params[Acts::eBoundQOverP] = charge/momentum;
+
+  Acts::Vector3 pos(0,0,0);
   if (!backward) {
-    Acts::Vector3 pos = positions[0] - (positions[0].z() - origin)/direction.z() * direction;
-    Acts::Vector4 pos4 {pos.x(), pos.y(), pos.z(), 0};
-    return Acts::CurvilinearTrackParameters(pos4, direction.normalized(), momentum, charge, cov);
+    pos = positions[0] - (positions[0].z() - origin)/direction.z() * direction;
   } else {
     size_t size = positions.size();
-    Acts::Vector3 pos = positions[size-1] + (origin - positions[size-1].z())/direction.z() * direction;
-    Acts::Vector4 pos4 {pos.x(), pos.y(), pos.z(), 0};
-    return Acts::CurvilinearTrackParameters(pos4, direction.normalized(), momentum, charge, cov);
+    pos = positions[size-1] + (origin - positions[size-1].z())/direction.z() * direction;
   }
+  auto perigee = Acts::Surface::makeShared<Acts::PerigeeSurface>(pos); 
+ //@todo make the particle hypothesis configurable
+  return Acts::BoundTrackParameters(perigee, params, cov, Acts::ParticleHypothesis::muon()); 
 }
diff --git a/Tracking/Acts/FaserActsKalmanFilter/src/CircleFitTrackSeedTool.h b/Tracking/Acts/FaserActsKalmanFilter/src/CircleFitTrackSeedTool.h
index ea3d0263a..f937872d9 100644
--- a/Tracking/Acts/FaserActsKalmanFilter/src/CircleFitTrackSeedTool.h
+++ b/Tracking/Acts/FaserActsKalmanFilter/src/CircleFitTrackSeedTool.h
@@ -32,7 +32,7 @@ public:
   virtual StatusCode finalize() override;
   virtual StatusCode run(std::vector<int> maskedLayers = {}, bool backward=false) override;
 
-  const std::shared_ptr<std::vector<Acts::CurvilinearTrackParameters>> initialTrackParameters() const override;
+  const std::shared_ptr<std::vector<Acts::BoundTrackParameters>> initialTrackParameters() const override;
   const std::shared_ptr<const Acts::Surface> initialSurface() const override;
   const std::shared_ptr<std::vector<IndexSourceLink>> sourceLinks() const override;
   const std::shared_ptr<IdentifierLink> idLinks() const override;
@@ -67,7 +67,7 @@ private:
     double c0, c1, cx, cy, r, chi2, momentum, charge, minZ;
     Acts::Vector3 direction;
     size_t size, stations, constraints;
-    Acts::CurvilinearTrackParameters get_params(double origin, Acts::BoundSymMatrix cov, bool backward=false) const;
+    Acts::BoundTrackParameters get_params(double origin, Acts::BoundSquareMatrix cov, bool backward=false) const;
 
   private:
     void getChi2();
@@ -88,7 +88,7 @@ private:
   static std::map<Identifier, Index> s_indexMap;
   static std::map<Identifier, const Tracker::FaserSCT_SpacePoint*> s_spacePointMap;
 
-  std::shared_ptr<std::vector<Acts::CurvilinearTrackParameters>> m_initialTrackParameters;
+  std::shared_ptr<std::vector<Acts::BoundTrackParameters>> m_initialTrackParameters;
   std::shared_ptr<const Acts::Surface> m_initialSurface;
   std::shared_ptr<std::vector<IndexSourceLink>> m_sourceLinks {};
   std::shared_ptr<IdentifierLink> m_idLinks {};
@@ -119,7 +119,7 @@ private:
   Gaudi::Property<bool> m_removeIFT{this, "removeIFT", false};
 };
 
-inline const std::shared_ptr<std::vector<Acts::CurvilinearTrackParameters>>
+inline const std::shared_ptr<std::vector<Acts::BoundTrackParameters>>
 CircleFitTrackSeedTool::initialTrackParameters() const {
   return m_initialTrackParameters;
 }
diff --git a/Tracking/Acts/FaserActsKalmanFilter/src/MyTrackSeedTool.cxx b/Tracking/Acts/FaserActsKalmanFilter/src/MyTrackSeedTool.cxx
index 4477735fa..ba7a71c00 100644
--- a/Tracking/Acts/FaserActsKalmanFilter/src/MyTrackSeedTool.cxx
+++ b/Tracking/Acts/FaserActsKalmanFilter/src/MyTrackSeedTool.cxx
@@ -52,7 +52,7 @@ StatusCode MyTrackSeedTool::run(std::vector<int> /*maskedLayers*/, bool /*backwa
   }
 
   const int kSize = 1;
-  using ThisMeasurement = Acts::Measurement<IndexSourceLink, Acts::BoundIndices, kSize>;
+  using ThisMeasurement = Acts::Measurement<Acts::BoundIndices, kSize>;
   std::array<Acts::BoundIndices, kSize> Indices = {Acts::eBoundLoc0};
   std::vector<IndexSourceLink> sourceLinks;
   std::vector<Measurement> measurements;
@@ -70,7 +70,7 @@ StatusCode MyTrackSeedTool::run(std::vector<int> /*maskedLayers*/, bool /*backwa
         const auto& par = cluster->localPosition();
         Eigen::Matrix<double, 1, 1> pos {par.x(),};
         Eigen::Matrix<double, 1, 1> cov {m_std_cluster * m_std_cluster,};
-        ThisMeasurement meas(sourceLink, Indices, pos, cov);
+        ThisMeasurement meas(Acts::SourceLink{sourceLink}, Indices, pos, cov);
         sourceLinks.push_back(sourceLink);
         measurements.emplace_back(std::move(meas));
         clusters.push_back(cluster);
@@ -84,7 +84,7 @@ StatusCode MyTrackSeedTool::run(std::vector<int> /*maskedLayers*/, bool /*backwa
   }
 
 
-  Acts::BoundSymMatrix cov = Acts::BoundSymMatrix::Zero();
+  Acts::BoundSquareMatrix cov = Acts::BoundSquareMatrix::Zero();
   cov(Acts::eBoundLoc0, Acts::eBoundLoc0) = m_covLoc0;
   cov(Acts::eBoundLoc1, Acts::eBoundLoc1) = m_covLoc1;
   cov(Acts::eBoundPhi, Acts::eBoundPhi) = m_covPhi;
@@ -106,7 +106,7 @@ StatusCode MyTrackSeedTool::run(std::vector<int> /*maskedLayers*/, bool /*backwa
   }
 
 
-  std::vector<Acts::CurvilinearTrackParameters> initParams {};
+  std::vector<Acts::BoundTrackParameters> initParams {};
   for (size_t i = 0; i < stationHitMap.size(); ++i) {
     for (size_t j = i+1; j < stationHitMap.size(); ++j) {
       for (const auto &p1 : stationHitMap[i]) {
@@ -117,7 +117,7 @@ StatusCode MyTrackSeedTool::run(std::vector<int> /*maskedLayers*/, bool /*backwa
     }
   }
 
-  m_initialTrackParameters = std::make_shared<std::vector<Acts::CurvilinearTrackParameters>>(initParams);
+  m_initialTrackParameters = std::make_shared<std::vector<Acts::BoundTrackParameters>>(initParams);
   m_sourceLinks = std::make_shared<std::vector<IndexSourceLink>>(sourceLinks);
   m_idLinks = std::make_shared<IdentifierLink>(identifierLinkMap);
   m_measurements = std::make_shared<std::vector<Measurement>>(measurements);
@@ -135,9 +135,23 @@ StatusCode MyTrackSeedTool::finalize() {
 }
 
 
-Acts::CurvilinearTrackParameters MyTrackSeedTool::get_params(const Amg::Vector3D& p1, const Amg::Vector3D& p2, const Acts::BoundSymMatrix& cov, double origin) {
+Acts::BoundTrackParameters MyTrackSeedTool::get_params(const Amg::Vector3D& p1, const Amg::Vector3D& p2, const Acts::BoundSquareMatrix& cov, double origin) {
   Acts::Vector3 dir = p2 - p1;
   Acts::Vector3 pos = p1 - (p1.z() - origin)/dir.z() * dir;
   Acts::Vector4 pos4 {pos.x(), pos.y(), pos.z(), 0};
-  return Acts::CurvilinearTrackParameters(pos4, dir, 10000000, 1, cov);
+  
+  const auto surface = Acts::Surface::makeShared<Acts::PlaneSurface>(
+      Acts::Vector3 {0, 0, pos.z()}, Acts::Vector3{0, 0, -1});
+
+  Acts::BoundVector params = Acts::BoundVector::Zero();
+  params[Acts::eBoundLoc0] = pos.x();
+  params[Acts::eBoundLoc1] = pos.y();
+  params[Acts::eBoundPhi] = Acts::VectorHelpers::phi(dir.normalized());
+  params[Acts::eBoundTheta] = Acts::VectorHelpers::theta(dir.normalized());
+  //@todo: this needs to be checked 
+  params[Acts::eBoundQOverP] = 1./10000000;
+  params[Acts::eBoundTime] = 0;
+
+  //@todo: make the particle hypothesis configurable
+  return Acts::BoundTrackParameters(surface, params, cov, Acts::ParticleHypothesis::muon());
 }
diff --git a/Tracking/Acts/FaserActsKalmanFilter/src/MyTrackSeedTool.h b/Tracking/Acts/FaserActsKalmanFilter/src/MyTrackSeedTool.h
index 26e857b7b..21646f1c2 100644
--- a/Tracking/Acts/FaserActsKalmanFilter/src/MyTrackSeedTool.h
+++ b/Tracking/Acts/FaserActsKalmanFilter/src/MyTrackSeedTool.h
@@ -27,7 +27,7 @@ public:
   virtual StatusCode finalize() override;
   virtual StatusCode run(std::vector<int> /*maskedLayers*/, bool /*backward*/) override;
 
-  const std::shared_ptr<std::vector<Acts::CurvilinearTrackParameters>> initialTrackParameters() const override;
+  const std::shared_ptr<std::vector<Acts::BoundTrackParameters>> initialTrackParameters() const override;
   const std::shared_ptr<const Acts::Surface> initialSurface() const override;
   const std::shared_ptr<std::vector<IndexSourceLink>> sourceLinks() const override;
   const std::shared_ptr<IdentifierLink> idLinks() const override;
@@ -38,7 +38,7 @@ public:
   double targetZPosition() const override;
 
 private:
-  std::shared_ptr<std::vector<Acts::CurvilinearTrackParameters>> m_initialTrackParameters;
+  std::shared_ptr<std::vector<Acts::BoundTrackParameters>> m_initialTrackParameters;
   std::shared_ptr<const Acts::Surface> m_initialSurface;
   std::shared_ptr<std::vector<IndexSourceLink>> m_sourceLinks {};
   std::shared_ptr<IdentifierLink> m_idLinks {};
@@ -72,11 +72,11 @@ private:
   Gaudi::Property<double> m_covTime {this, "covTime", 1};
   Gaudi::Property<double> m_origin {this, "origin", 0, "z position of the reference surface"};
 
-  static Acts::CurvilinearTrackParameters get_params(const Amg::Vector3D& p1, const Amg::Vector3D& p2, const Acts::BoundSymMatrix& cov, double origin);
+  static Acts::BoundTrackParameters get_params(const Amg::Vector3D& p1, const Amg::Vector3D& p2, const Acts::BoundSquareMatrix& cov, double origin);
   // static std::pair<double, double> momentum(const std::map<int, Amg::Vector3D>& pos, double B=0.57);
 };
 
-inline const std::shared_ptr<std::vector<Acts::CurvilinearTrackParameters>>
+inline const std::shared_ptr<std::vector<Acts::BoundTrackParameters>>
 MyTrackSeedTool::initialTrackParameters() const {
   return m_initialTrackParameters;
 }
diff --git a/Tracking/Acts/FaserActsKalmanFilter/src/SPSeedBasedInitialParameterTool.cxx b/Tracking/Acts/FaserActsKalmanFilter/src/SPSeedBasedInitialParameterTool.cxx
index bc8c89d86..3b2c4cfe4 100644
--- a/Tracking/Acts/FaserActsKalmanFilter/src/SPSeedBasedInitialParameterTool.cxx
+++ b/Tracking/Acts/FaserActsKalmanFilter/src/SPSeedBasedInitialParameterTool.cxx
@@ -1,7 +1,7 @@
 #include "SPSeedBasedInitialParameterTool.h"
 
 #include "StoreGate/ReadHandle.h"
-#include "HepMC/GenVertex.h"
+#include "HepMC3/GenVertex.h"
 #include "Acts/EventData/TrackParameters.hpp"
 #include "Acts/Definitions/Units.hpp"
 #include "TrackerIdentifier/FaserSCT_ID.h"
@@ -30,8 +30,8 @@ StatusCode SPSeedBasedInitialParameterTool::finalize() {
 }
 
 
-std::vector<Acts::CurvilinearTrackParameters> SPSeedBasedInitialParameterTool::getInitialParameters() const {
-  std::vector<Acts::CurvilinearTrackParameters> initialParameters;
+std::vector<Acts::BoundTrackParameters> SPSeedBasedInitialParameterTool::getInitialParameters() const {
+  std::vector<Acts::BoundTrackParameters> initialParameters;
   initialParameters.clear();
   SG::ReadHandle<Tracker::TrackerSeedCollection> trackerSeedCollection(m_trackerSeedContainerKey);
   if (!trackerSeedCollection.isValid()){
@@ -103,18 +103,29 @@ std::vector<Acts::CurvilinearTrackParameters> SPSeedBasedInitialParameterTool::g
     double sigmaTheta = 1_degree;
     double sigmaQOverP = 0.01*p / (p*p);
     double sigmaT0 = 1_ns;
-    Acts::BoundSymMatrix cov = Acts::BoundSymMatrix::Zero();
+    Acts::BoundSquareMatrix cov = Acts::BoundSquareMatrix::Zero();
     cov(Acts::eBoundLoc0, Acts::eBoundLoc0) = sigmaU * sigmaU;
     cov(Acts::eBoundLoc1, Acts::eBoundLoc1) = sigmaV * sigmaV;
     cov(Acts::eBoundPhi, Acts::eBoundPhi) = sigmaPhi * sigmaPhi;
     cov(Acts::eBoundTheta, Acts::eBoundTheta) = sigmaTheta * sigmaTheta;
     cov(Acts::eBoundQOverP, Acts::eBoundQOverP) = sigmaQOverP * sigmaQOverP;
     cov(Acts::eBoundTime, Acts::eBoundTime) = sigmaT0 * sigmaT0;
-    double time =0;
-    const Acts::Vector4 postime(pos.x(), pos.y(), pos.z(),time);
-    Acts::CurvilinearTrackParameters InitTrackParam(postime, mom.normalized(), mom.norm(), charge, std::make_optional(std::move(cov)));
+ 
+
+    const auto surface = Acts::Surface::makeShared<Acts::PlaneSurface>(
+    Acts::Vector3 {0, 0, pos.z()}, Acts::Vector3{0, 0, -1});
+
+    Acts::BoundVector params = Acts::BoundVector::Zero();
+    params[Acts::eBoundLoc0] = pos.x();
+    params[Acts::eBoundLoc1] = pos.y();
+    params[Acts::eBoundPhi] = Acts::VectorHelpers::phi(mom.normalized());
+    params[Acts::eBoundTheta] = Acts::VectorHelpers::theta(mom.normalized());
+    params[Acts::eBoundQOverP] = charge/p;
+    params[Acts::eBoundTime] = 0;
+
+    //@todo: make the particle hypothesis configurable
+    Acts::BoundTrackParameters InitTrackParam  = Acts::BoundTrackParameters(surface, params, cov, Acts::ParticleHypothesis::muon());
 
-    //    Acts::CurvilinearTrackParameters InitTrackParam(std::make_optional(std::move(cov)), pos, mom, charge, time); // calculated initial parameters
     initialParameters.push_back(InitTrackParam);
   }
 
diff --git a/Tracking/Acts/FaserActsKalmanFilter/src/SPSeedBasedInitialParameterTool.h b/Tracking/Acts/FaserActsKalmanFilter/src/SPSeedBasedInitialParameterTool.h
index 678fef289..ee673bcd3 100644
--- a/Tracking/Acts/FaserActsKalmanFilter/src/SPSeedBasedInitialParameterTool.h
+++ b/Tracking/Acts/FaserActsKalmanFilter/src/SPSeedBasedInitialParameterTool.h
@@ -2,19 +2,13 @@
 #define SPSEEDBASEDINITIALPARAMETERTOOL_H
 
 #include "AthenaBaseComps/AthAlgTool.h"
+#include "Acts/EventData/TrackParameters.hpp"
 #include "TrackerSeedFinder/TrackerSeedFinder.h"
 #include "TrackerSpacePoint/TrackerSeedCollection.h"
 #include "TrackerSpacePoint/TrackerSeed.h"
 
 class FaserSCT_ID;
 
-namespace Acts {
-  struct SinglyCharged;
-  template <typename charge_t> class SingleCurvilinearTrackParameters;
-  using CurvilinearTrackParameters =
-    SingleCurvilinearTrackParameters<SinglyCharged>;
-}
-
 
 class SPSeedBasedInitialParameterTool : public AthAlgTool {
   public:
@@ -25,8 +19,8 @@ class SPSeedBasedInitialParameterTool : public AthAlgTool {
     virtual StatusCode initialize() override;
     virtual StatusCode finalize() override;
 
-    std::vector<Acts::CurvilinearTrackParameters> getInitialParameters() const;
-    //Acts::CurvilinearTrackParameters getInitialParameters(std::vector<Identifier> ids) const;
+    std::vector<Acts::BoundTrackParameters> getInitialParameters() const;
+    //Acts::BoundTrackParameters getInitialParameters(std::vector<Identifier> ids) const;
 
   private:
     const FaserSCT_ID* m_idHelper{nullptr}; 
diff --git a/Tracking/Acts/FaserActsKalmanFilter/src/SPSimpleInitialParameterTool.cxx b/Tracking/Acts/FaserActsKalmanFilter/src/SPSimpleInitialParameterTool.cxx
index 995492627..07b3fcb54 100644
--- a/Tracking/Acts/FaserActsKalmanFilter/src/SPSimpleInitialParameterTool.cxx
+++ b/Tracking/Acts/FaserActsKalmanFilter/src/SPSimpleInitialParameterTool.cxx
@@ -1,8 +1,12 @@
 #include "SPSimpleInitialParameterTool.h"
 
+
 #include "StoreGate/ReadHandle.h"
-#include "HepMC/GenVertex.h"
+#include "HepMC3/GenVertex.h"
 #include "TrackerIdentifier/FaserSCT_ID.h"
+
+#include "Acts/Surfaces/PerigeeSurface.hpp"
+
 #include <random>
 #include <cmath>
 
@@ -26,7 +30,7 @@ StatusCode SPSimpleInitialParameterTool::finalize() {
 }
 
 
-Acts::CurvilinearTrackParameters SPSimpleInitialParameterTool::getInitialParameters(Acts::Vector3 pos1, Acts::Vector3 pos2, Acts::Vector3 pos3) const {
+Acts::BoundTrackParameters SPSimpleInitialParameterTool::getInitialParameters(Acts::Vector3 pos1, Acts::Vector3 pos2, Acts::Vector3 pos3) const {
 
   double charge = pos1.y()+pos3.y()>2.*pos2.y()?1:-1;
   double B = 0.55;
@@ -48,6 +52,8 @@ Acts::CurvilinearTrackParameters SPSimpleInitialParameterTool::getInitialParamet
 
   const Acts::Vector3 mom(p_x, p_y, p_z);
   double p = mom.norm();
+  double theta = Acts::VectorHelpers::theta(mom.normalized());
+  double phi = Acts::VectorHelpers::phi(mom.normalized());
   msg(MSG::DEBUG)<<"!!!!!!!!!!!  InitTrack momentum on layer 0: ( "<<mom.x()*1000<<",  "<<mom.y()*1000<<",  "<<mom.z()*1000<<",  "<<p*1000<<")  "<<endmsg;
   // build the track covariance matrix using the smearing sigmas
   double sigmaU = 10000_um;
@@ -57,7 +63,7 @@ Acts::CurvilinearTrackParameters SPSimpleInitialParameterTool::getInitialParamet
   double sigmaQOverP = 10.00*p / (p*p);
   //double sigmaQOverP = 0.02*p / (p*p);
   double sigmaT0 = 1_ns;
-  Acts::BoundSymMatrix cov = Acts::BoundSymMatrix::Zero();
+  Acts::BoundSquareMatrix cov = Acts::BoundSquareMatrix::Zero();
   cov(Acts::eBoundLoc0, Acts::eBoundLoc0) = sigmaU * sigmaU;
   cov(Acts::eBoundLoc1, Acts::eBoundLoc1) = sigmaV * sigmaV;
   cov(Acts::eBoundPhi, Acts::eBoundPhi) = sigmaPhi * sigmaPhi;
@@ -65,13 +71,25 @@ Acts::CurvilinearTrackParameters SPSimpleInitialParameterTool::getInitialParamet
   cov(Acts::eBoundQOverP, Acts::eBoundQOverP) = sigmaQOverP * sigmaQOverP;
   cov(Acts::eBoundTime, Acts::eBoundTime) = sigmaT0 * sigmaT0;
   double time =0;
-  const Acts::Vector4 postime(pos1.x(), pos1.y(), pos1.z(),time);
-  Acts::CurvilinearTrackParameters InitTrackParam(postime, mom.normalized(), mom.norm(), charge, std::make_optional(std::move(cov)));
 
-  return InitTrackParam;
+  Acts::BoundVector params = Acts::BoundVector::Zero();
+  params[Acts::eBoundLoc0] = 0;
+  params[Acts::eBoundLoc1] = 0;
+  params[Acts::eBoundTime] = time;
+  params[Acts::eBoundPhi] = phi;
+  params[Acts::eBoundTheta] = theta;
+  //params[Acts::eBoundQOverP] = particleHypothesis.qOverP(p, charge);
+  params[Acts::eBoundQOverP] = charge/p;
+
+  //@todo: use the first plane as the reference surface
+  auto perigee = Acts::Surface::makeShared<const Acts::PerigeeSurface>(pos1);
+
+ //@todo make the particle hypothesis configurable
+  return  Acts::BoundTrackParameters(perigee, params, cov, Acts::ParticleHypothesis::muon());
+
 }
 
-Acts::CurvilinearTrackParameters SPSimpleInitialParameterTool::getInitialParameters_2stations(Acts::Vector3 pos1, Acts::Vector3 pos2, Acts::Vector3 dir1) const {
+Acts::BoundTrackParameters SPSimpleInitialParameterTool::getInitialParameters_2stations(Acts::Vector3 pos1, Acts::Vector3 pos2, Acts::Vector3 dir1) const {
 
   Acts::Vector3 dir2=(pos2-pos1).normalized();
   dir1*=1./sqrt(dir1.y()*dir1.y()+dir1.z()*dir1.z());
@@ -89,9 +107,10 @@ Acts::CurvilinearTrackParameters SPSimpleInitialParameterTool::getInitialParamet
   double p_y=p_z*dir1.y()/dir1.z();
   double p_x=p_z*dir1.x()/dir1.z();
 
-
   const Acts::Vector3 mom(p_x, p_y, p_z);
   double p = mom.norm();
+  double theta = Acts::VectorHelpers::theta(mom.normalized());
+  double phi = Acts::VectorHelpers::phi(mom.normalized());
   msg(MSG::DEBUG)<<"!!!!!!!!!!!  InitTrack momentum on layer 0: ( "<<mom.x()*1000<<",  "<<mom.y()*1000<<",  "<<mom.z()*1000<<",  "<<p*1000<<")  "<<st<<" "<<charge<<endmsg;
   // build the track covariance matrix using the smearing sigmas
   double sigmaU = 1000_um;
@@ -101,7 +120,7 @@ Acts::CurvilinearTrackParameters SPSimpleInitialParameterTool::getInitialParamet
   double sigmaQOverP = 0.20*p / (p*p);
   //double sigmaQOverP = 0.02*p / (p*p);
   double sigmaT0 = 1_ns;
-  Acts::BoundSymMatrix cov = Acts::BoundSymMatrix::Zero();
+  Acts::BoundSquareMatrix cov = Acts::BoundSquareMatrix::Zero();
   cov(Acts::eBoundLoc0, Acts::eBoundLoc0) = sigmaU * sigmaU;
   cov(Acts::eBoundLoc1, Acts::eBoundLoc1) = sigmaV * sigmaV;
   cov(Acts::eBoundPhi, Acts::eBoundPhi) = sigmaPhi * sigmaPhi;
@@ -109,14 +128,25 @@ Acts::CurvilinearTrackParameters SPSimpleInitialParameterTool::getInitialParamet
   cov(Acts::eBoundQOverP, Acts::eBoundQOverP) = sigmaQOverP * sigmaQOverP;
   cov(Acts::eBoundTime, Acts::eBoundTime) = sigmaT0 * sigmaT0;
   double time =0;
-  const Acts::Vector4 postime(pos1.x(), pos1.y(), pos1.z(),time);
-  Acts::CurvilinearTrackParameters InitTrackParam(postime, mom.normalized(), mom.norm(), charge, std::make_optional(std::move(cov)));
 
-  return InitTrackParam;
+  Acts::BoundVector params = Acts::BoundVector::Zero();
+  params[Acts::eBoundLoc0] = 0;
+  params[Acts::eBoundLoc1] = 0;
+  params[Acts::eBoundTime] = time;
+  params[Acts::eBoundPhi] = phi;
+  params[Acts::eBoundTheta] = theta;
+  //params[Acts::eBoundQOverP] = particleHypothesis.qOverP(p, charge);
+  params[Acts::eBoundQOverP] = charge/p;
+
+  //@todo: use the first plane as the reference surface
+  auto perigee = Acts::Surface::makeShared<const Acts::PerigeeSurface>(pos1);
+
+  //@todo make the particle hypothesis configurable
+  return Acts::BoundTrackParameters(perigee, params, cov, Acts::ParticleHypothesis::muon()); 
 }
 
-std::vector<Acts::CurvilinearTrackParameters> SPSimpleInitialParameterTool::getInitialParameters_1station(std::vector<Acts::Vector3> pos1, std::vector<Acts::Vector3> pos2, std::vector<Acts::Vector3> pos3) const {
-  std::vector<Acts::CurvilinearTrackParameters> InitTrackParams;
+std::vector<Acts::BoundTrackParameters> SPSimpleInitialParameterTool::getInitialParameters_1station(std::vector<Acts::Vector3> pos1, std::vector<Acts::Vector3> pos2, std::vector<Acts::Vector3> pos3) const {
+  std::vector<Acts::BoundTrackParameters> InitTrackParams;
   InitTrackParams.clear();
 
   for(std::size_t i1=0;i1<pos1.size();i1++){
@@ -141,6 +171,8 @@ std::vector<Acts::CurvilinearTrackParameters> SPSimpleInitialParameterTool::getI
 
 	const Acts::Vector3 mom(p_x, p_y, p_z);
 	double p = mom.norm();
+        double theta = Acts::VectorHelpers::theta(mom.normalized());
+        double phi = Acts::VectorHelpers::phi(mom.normalized());
 	msg(MSG::DEBUG)<<"!!!!!!!!!!!  InitTrack momentum on layer 0: ( "<<mom.x()*1000<<",  "<<mom.y()*1000<<",  "<<mom.z()*1000<<",  "<<p*1000<<")  "<<endmsg;
 	// build the track covariance matrix using the smearing sigmas
 	double sigmaU = 2000_um;
@@ -150,7 +182,7 @@ std::vector<Acts::CurvilinearTrackParameters> SPSimpleInitialParameterTool::getI
 	double sigmaQOverP = 1.20*p / (p*p);
 	//double sigmaQOverP = 0.02*p / (p*p);
 	double sigmaT0 = 1_ns;
-	Acts::BoundSymMatrix cov = Acts::BoundSymMatrix::Zero();
+	Acts::BoundSquareMatrix cov = Acts::BoundSquareMatrix::Zero();
 	cov(Acts::eBoundLoc0, Acts::eBoundLoc0) = sigmaU * sigmaU;
 	cov(Acts::eBoundLoc1, Acts::eBoundLoc1) = sigmaV * sigmaV;
 	cov(Acts::eBoundPhi, Acts::eBoundPhi) = sigmaPhi * sigmaPhi;
@@ -158,9 +190,22 @@ std::vector<Acts::CurvilinearTrackParameters> SPSimpleInitialParameterTool::getI
 	cov(Acts::eBoundQOverP, Acts::eBoundQOverP) = sigmaQOverP * sigmaQOverP;
 	cov(Acts::eBoundTime, Acts::eBoundTime) = sigmaT0 * sigmaT0;
 	double time =0;
-	const Acts::Vector4 postime(pstart.x(), pstart.y(), pstart.z(),time);
-	Acts::CurvilinearTrackParameters InitTrackParam(postime, mom.normalized(), mom.norm(), charge, std::make_optional(std::move(cov)));
-	InitTrackParams.push_back(InitTrackParam);
+	//const Acts::Vector4 postime(pstart.x(), pstart.y(), pstart.z(),time);
+
+        Acts::BoundVector params = Acts::BoundVector::Zero();
+        params[Acts::eBoundLoc0] = 0;
+        params[Acts::eBoundLoc1] = 0;
+        params[Acts::eBoundTime] = time;
+        params[Acts::eBoundPhi] = phi;
+        params[Acts::eBoundTheta] = theta;
+        //params[Acts::eBoundQOverP] = particleHypothesis.qOverP(p, charge);
+        params[Acts::eBoundQOverP] = charge/p;
+       
+        //@todo: use the first plane as the reference surface
+        //@todo make the particle hypothesis configurable
+        auto perigee = Acts::Surface::makeShared<const Acts::PerigeeSurface>(pstart);
+
+	InitTrackParams.emplace_back(perigee, params, cov, Acts::ParticleHypothesis::muon());
       }
     }
   }
diff --git a/Tracking/Acts/FaserActsKalmanFilter/src/SPSimpleInitialParameterTool.h b/Tracking/Acts/FaserActsKalmanFilter/src/SPSimpleInitialParameterTool.h
index 9db75f35f..fd7f7e488 100644
--- a/Tracking/Acts/FaserActsKalmanFilter/src/SPSimpleInitialParameterTool.h
+++ b/Tracking/Acts/FaserActsKalmanFilter/src/SPSimpleInitialParameterTool.h
@@ -1,5 +1,5 @@
-#ifndef SPSIMPLEBASEDINITIALPARAMETERTOOL_H
-#define SPSIMPLEBASEDINITIALPARAMETERTOOL_H
+#ifndef SPSIMPLEINITIALPARAMETERTOOL_H
+#define SPSIMPLEINITIALPARAMETERTOOL_H
 
 #include "AthenaBaseComps/AthAlgTool.h"
 #include "Acts/EventData/TrackParameters.hpp"
@@ -9,13 +9,6 @@
 
 class FaserSCT_ID;
 
-namespace Acts {
-  struct SinglyCharged;
-  template <typename charge_t> class SingleCurvilinearTrackParameters;
-  using CurvilinearTrackParameters =
-    SingleCurvilinearTrackParameters<SinglyCharged>;
-}
-
 
 class SPSimpleInitialParameterTool : public AthAlgTool {
   public:
@@ -26,12 +19,11 @@ class SPSimpleInitialParameterTool : public AthAlgTool {
     virtual StatusCode initialize() override;
     virtual StatusCode finalize() override;
 
-    Acts::CurvilinearTrackParameters getInitialParameters(Acts::Vector3 pos1, Acts::Vector3 pos2, Acts::Vector3 pos3) const;
-    Acts::CurvilinearTrackParameters getInitialParameters_2stations(Acts::Vector3 pos1, Acts::Vector3 pos2, Acts::Vector3 pos3) const;
-    std::vector<Acts::CurvilinearTrackParameters> getInitialParameters_1station(std::vector<Acts::Vector3> pos1, std::vector<Acts::Vector3> pos2, std::vector<Acts::Vector3> pos3) const;
-    //Acts::CurvilinearTrackParameters getInitialParameters(std::vector<Identifier> ids) const;
+    Acts::BoundTrackParameters getInitialParameters(Acts::Vector3 pos1, Acts::Vector3 pos2, Acts::Vector3 pos3) const;
+    Acts::BoundTrackParameters getInitialParameters_2stations(Acts::Vector3 pos1, Acts::Vector3 pos2, Acts::Vector3 pos3) const;
+    std::vector<Acts::BoundTrackParameters> getInitialParameters_1station(std::vector<Acts::Vector3> pos1, std::vector<Acts::Vector3> pos2, std::vector<Acts::Vector3> pos3) const;
 
   private:
 };
 
-#endif  // TRUTHBASEDINITIALPARAMETERTOOL_H
+#endif  // SPSIMPLEINITIALPARAMETERTOOL_H
diff --git a/Tracking/Acts/FaserActsKalmanFilter/src/ThreeStationTrackSeedTool.cxx b/Tracking/Acts/FaserActsKalmanFilter/src/ThreeStationTrackSeedTool.cxx
index 65d15e723..2358f5847 100644
--- a/Tracking/Acts/FaserActsKalmanFilter/src/ThreeStationTrackSeedTool.cxx
+++ b/Tracking/Acts/FaserActsKalmanFilter/src/ThreeStationTrackSeedTool.cxx
@@ -35,7 +35,7 @@ StatusCode ThreeStationTrackSeedTool::run(std::vector<int> /*maskedLayers*/, boo
   std::shared_ptr<IdentifierMap> identifierMap = m_trackingGeometryTool->getIdentifierMap();
 
   const int kSize = 1;
-  using ThisMeasurement = Acts::Measurement<IndexSourceLink, Acts::BoundIndices, kSize>;
+  using ThisMeasurement = Acts::Measurement<Acts::BoundIndices, kSize>;
   std::array<Acts::BoundIndices, kSize> Indices = {Acts::eBoundLoc0};
   std::vector<IndexSourceLink> sourceLinks;
   std::vector<Measurement> measurements;
@@ -52,7 +52,8 @@ StatusCode ThreeStationTrackSeedTool::run(std::vector<int> /*maskedLayers*/, boo
         const auto& par = cluster->localPosition();
         Eigen::Matrix<double, 1, 1> pos {par.x(),};
         Eigen::Matrix<double, 1, 1> cov {m_std_cluster * m_std_cluster,};
-        ThisMeasurement meas(sourceLink, Indices, pos, cov);
+        Acts::SourceLink sl{sourceLink};
+        ThisMeasurement meas(std::move(sl), Indices, pos, cov);
         sourceLinks.push_back(sourceLink);
         measurements.emplace_back(std::move(meas));
         clusters.push_back(cluster);
@@ -83,7 +84,7 @@ StatusCode ThreeStationTrackSeedTool::run(std::vector<int> /*maskedLayers*/, boo
     station_tracklet_map[station].push_back(Tracklet(trackletPosition, trackletClusters));
   }
 
-  Acts::BoundSymMatrix cov = Acts::BoundSymMatrix::Zero();
+  Acts::BoundSquareMatrix cov = Acts::BoundSquareMatrix::Zero();
   cov(Acts::eBoundLoc0, Acts::eBoundLoc0) = m_covLoc0;
   cov(Acts::eBoundLoc1, Acts::eBoundLoc1) = m_covLoc1;
   cov(Acts::eBoundPhi, Acts::eBoundPhi) = m_covPhi;
@@ -91,7 +92,7 @@ StatusCode ThreeStationTrackSeedTool::run(std::vector<int> /*maskedLayers*/, boo
   cov(Acts::eBoundQOverP, Acts::eBoundQOverP) = m_covQOverP;
   cov(Acts::eBoundTime, Acts::eBoundTime) = m_covTime;
 
-  std::vector<Acts::CurvilinearTrackParameters> initParams {};
+  std::vector<Acts::BoundTrackParameters> initParams {};
   std::vector<std::array<std::vector<const Tracker::FaserSCT_Cluster*>, 3>> seeds;
   for (const auto& tracklet1 : station_tracklet_map[1]) {
     for (const auto& tracklet2 : station_tracklet_map[2]) {
@@ -103,7 +104,7 @@ StatusCode ThreeStationTrackSeedTool::run(std::vector<int> /*maskedLayers*/, boo
     }
   }
 
-  m_initialTrackParameters = std::make_shared<std::vector<Acts::CurvilinearTrackParameters>>(initParams);
+  m_initialTrackParameters = std::make_shared<std::vector<Acts::BoundTrackParameters>>(initParams);
   m_sourceLinks = std::make_shared<std::vector<IndexSourceLink>>(sourceLinks);
   m_idLinks = std::make_shared<IdentifierLink>(identifierLinkMap);
   m_measurements = std::make_shared<std::vector<Measurement>>(measurements);
@@ -121,14 +122,27 @@ StatusCode ThreeStationTrackSeedTool::finalize() {
 }
 
 
-Acts::CurvilinearTrackParameters ThreeStationTrackSeedTool::get_params(
-    const Amg::Vector3D& position_st1, const Amg::Vector3D& position_st2, const Amg::Vector3D& position_st3, const Acts::BoundSymMatrix& cov, double origin) {
+Acts::BoundTrackParameters ThreeStationTrackSeedTool::get_params(
+    const Amg::Vector3D& position_st1, const Amg::Vector3D& position_st2, const Amg::Vector3D& position_st3, const Acts::BoundSquareMatrix& cov, double origin) {
   Acts::Vector3 dir = position_st2 - position_st1;
   Acts::Vector3 pos = position_st1 - (position_st1.z() - origin)/dir.z() * dir;
-  Acts::Vector4 pos4 {pos.x(), pos.y(), pos.z(), 0};
   auto [abs_momentum, charge] = momentum({{1, position_st1}, {2, position_st2}, {3, position_st3}});
-  return Acts::CurvilinearTrackParameters(pos4, dir, abs_momentum, charge, cov);
+ 
+  const auto surface = Acts::Surface::makeShared<Acts::PlaneSurface>(
+      Acts::Vector3 {0, 0, pos.z()}, Acts::Vector3{0, 0, -1});
+ 
+  Acts::BoundVector params = Acts::BoundVector::Zero();
+  params[Acts::eBoundLoc0] = pos.x(); 
+  params[Acts::eBoundLoc1] = pos.y(); 
+  params[Acts::eBoundPhi] = Acts::VectorHelpers::phi(dir.normalized()); 
+  params[Acts::eBoundTheta] = Acts::VectorHelpers::theta(dir.normalized()); 
+  params[Acts::eBoundQOverP] = charge/abs_momentum; 
+  params[Acts::eBoundTime] = 0; 
+
+  //@todo: make the particle hypothesis configurable
+  return Acts::BoundTrackParameters(surface, params, cov, Acts::ParticleHypothesis::muon());
 }
+
 std::pair<double, double> ThreeStationTrackSeedTool::momentum(const std::map<int, Amg::Vector3D>& pos, double B) {
   Acts::Vector3 vec_l = pos.at(3) - pos.at(1);
   double abs_l = std::sqrt(vec_l.y() * vec_l.y() + vec_l.z() * vec_l.z());
diff --git a/Tracking/Acts/FaserActsKalmanFilter/src/ThreeStationTrackSeedTool.h b/Tracking/Acts/FaserActsKalmanFilter/src/ThreeStationTrackSeedTool.h
index 7c4c521b8..ac3c960b1 100644
--- a/Tracking/Acts/FaserActsKalmanFilter/src/ThreeStationTrackSeedTool.h
+++ b/Tracking/Acts/FaserActsKalmanFilter/src/ThreeStationTrackSeedTool.h
@@ -25,7 +25,7 @@ public:
   virtual StatusCode finalize() override;
   virtual StatusCode run(std::vector<int> /*maskedLayers*/, bool /*backward*/) override;
 
-  const std::shared_ptr<std::vector<Acts::CurvilinearTrackParameters>> initialTrackParameters() const override;
+  const std::shared_ptr<std::vector<Acts::BoundTrackParameters>> initialTrackParameters() const override;
   const std::shared_ptr<const Acts::Surface> initialSurface() const override;
   const std::shared_ptr<std::vector<IndexSourceLink>> sourceLinks() const override;
   const std::shared_ptr<IdentifierLink> idLinks() const override;
@@ -49,7 +49,7 @@ private:
     const std::vector<const Tracker::FaserSCT_Cluster*> m_clusters;
   };
 
-  std::shared_ptr<std::vector<Acts::CurvilinearTrackParameters>> m_initialTrackParameters;
+  std::shared_ptr<std::vector<Acts::BoundTrackParameters>> m_initialTrackParameters;
   std::shared_ptr<const Acts::Surface> m_initialSurface;
   std::shared_ptr<std::vector<IndexSourceLink>> m_sourceLinks {};
   std::shared_ptr<IdentifierLink> m_idLinks {};
@@ -82,12 +82,12 @@ private:
 
   Gaudi::Property<double> m_origin {this, "origin", 0, "z position of the reference surface"};
 
-  static Acts::CurvilinearTrackParameters get_params(
-      const Amg::Vector3D& position_st1, const Amg::Vector3D& position_st2, const Amg::Vector3D& position_st3, const Acts::BoundSymMatrix& cov, double origin);
+  static Acts::BoundTrackParameters get_params(
+      const Amg::Vector3D& position_st1, const Amg::Vector3D& position_st2, const Amg::Vector3D& position_st3, const Acts::BoundSquareMatrix& cov, double origin);
   static std::pair<double, double> momentum(const std::map<int, Amg::Vector3D>& pos, double B=0.57);
 };
 
-inline const std::shared_ptr<std::vector<Acts::CurvilinearTrackParameters>>
+inline const std::shared_ptr<std::vector<Acts::BoundTrackParameters>>
 ThreeStationTrackSeedTool::initialTrackParameters() const {
   return m_initialTrackParameters;
 }
diff --git a/Tracking/Acts/FaserActsKalmanFilter/src/TruthBasedInitialParameterTool.cxx b/Tracking/Acts/FaserActsKalmanFilter/src/TruthBasedInitialParameterTool.cxx
index 8be51c434..683dfe1a0 100644
--- a/Tracking/Acts/FaserActsKalmanFilter/src/TruthBasedInitialParameterTool.cxx
+++ b/Tracking/Acts/FaserActsKalmanFilter/src/TruthBasedInitialParameterTool.cxx
@@ -1,8 +1,8 @@
 #include "TruthBasedInitialParameterTool.h"
 
 #include "StoreGate/ReadHandle.h"
-#include "HepMC/GenVertex.h"
-#include "Acts/EventData/TrackParameters.hpp"
+#include "HepMC3/GenVertex.h"
+#include "Acts/Surfaces/PerigeeSurface.hpp"
 #include "Acts/Definitions/Units.hpp"
 #include <random>
 #include <cmath>
@@ -29,13 +29,13 @@ StatusCode TruthBasedInitialParameterTool::finalize() {
 }
 
 
-Acts::CurvilinearTrackParameters TruthBasedInitialParameterTool::getInitialParameters(std::vector<Identifier> ids) const {
+Acts::BoundTrackParameters TruthBasedInitialParameterTool::getInitialParameters(std::vector<Identifier> ids) const {
   SG::ReadHandle<TrackerSimDataCollection> simDataCollection(m_simDataCollectionKey);
 
   // get simulated vertex and momentum of the HepMcParticle with the highest energy deposit
   float highestDep = 0;
-  HepMC::FourVector vertex;
-  HepMC::FourVector momentum;
+  HepMC3::FourVector vertex;
+  HepMC3::FourVector momentum;
 
   for (Identifier id : ids) {
     if( simDataCollection->count(id) == 0)
@@ -60,11 +60,13 @@ Acts::CurvilinearTrackParameters TruthBasedInitialParameterTool::getInitialParam
   double sigmaV = 200_um;
   double sigmaPhi = 1_degree;
   double sigmaTheta = 1_degree;
-  double sigmaQOverP = 0.1 * truthVertex.norm() / (truthMomentum.norm() * truthMomentum.norm());
+  double sigmaP = 0.1 * truthVertex.norm();
+  // var(q/p) = (d(1/p)/dp)² * var(p) = (-1/p²)² * var(p)
+  double sigmaQOverP = sigmaP / (truthMomentum.norm() * truthMomentum.norm());
   double sigmaT0 = 1_ns;
 
   // create covariance matrix
-  Acts::BoundSymMatrix cov = Acts::BoundSymMatrix::Zero();
+  Acts::BoundSquareMatrix cov = Acts::BoundSquareMatrix::Zero();
   cov(Acts::eBoundLoc0, Acts::eBoundLoc1) = sigmaU * sigmaU;
   cov(Acts::eBoundLoc1, Acts::eBoundLoc1) = sigmaV * sigmaV;
   cov(Acts::eBoundPhi, Acts::eBoundPhi) = sigmaPhi * sigmaPhi;
@@ -78,21 +80,39 @@ Acts::CurvilinearTrackParameters TruthBasedInitialParameterTool::getInitialParam
   std::normal_distribution<> norm; // mu: 0 sigma: 1
   double charge = 1;
   double time =0;
-  Acts::Vector3 deltaPos(sigmaU*norm(rng), sigmaU*norm(rng), sigmaU*norm(rng));
-  Acts::Vector4 posTime = {(truthVertex+deltaPos).x(), (truthVertex+deltaPos).y(), (truthVertex+deltaPos).z(), time};
   auto theta = Acts::VectorHelpers::theta(truthMomentum.normalized());
   auto phi = Acts::VectorHelpers::phi(truthMomentum.normalized());
-  auto angles = Acts::detail::normalizePhiTheta(phi + sigmaPhi*norm(rng), theta + sigmaTheta*norm(rng));
-  Acts::Vector3 dir(std::sin(angles.second) * std::cos(angles.first),
-                    std::sin(angles.second) * std::sin(angles.first),
-                    std::cos(angles.second));
-  const Acts::Vector3 initMomentum = ( truthMomentum.norm()*(1 + 0.1*norm(rng)) ) * dir;
-  const Acts::Vector3 momentum_dir = initMomentum.normalized();
-  double momentum_abs = initMomentum.norm();
-
-  ATH_MSG_DEBUG("x: " << posTime.x() << ", y: " << posTime.y() << ", z: " << posTime.z());
-  ATH_MSG_DEBUG("p: " << momentum_abs << ", px: " << momentum_dir.x() << ", py: " << momentum_dir.y() << ", pz: " << momentum_dir.z());
+
+  auto perigee = Acts::Surface::makeShared<const Acts::PerigeeSurface>(truthVertex);
+  //@todo make the particle hypothesis configurable
+  Acts::ParticleHypothesis particleHypothesis = Acts::ParticleHypothesis::muon();
+  
+  Acts::BoundVector params = Acts::BoundVector::Zero();
+  // smear the position/time
+  params[Acts::eBoundLoc0] = sigmaU * norm(rng);
+  params[Acts::eBoundLoc1] = sigmaV * norm(rng);
+  params[Acts::eBoundTime] = time + sigmaT0 * norm(rng);
+  // smear direction angles phi,theta ensuring correct bounds
+  const auto [newPhi, newTheta] = Acts::detail::normalizePhiTheta(
+      phi + sigmaPhi * norm(rng), theta + sigmaTheta * norm(rng));
+  params[Acts::eBoundPhi] = newPhi;
+  params[Acts::eBoundTheta] = newTheta;
+  // compute smeared absolute momentum vector
+  const double newP = std::max(0.0, truthMomentum.norm() + sigmaP * norm(rng));
+  params[Acts::eBoundQOverP] = particleHypothesis.qOverP(newP, charge);; 
+
   
-  Acts::CurvilinearTrackParameters initialTrackParameters(posTime, momentum_dir, momentum_abs, charge, std::make_optional(std::move(cov)));
-  return initialTrackParameters;
-}
\ No newline at end of file
+  ATH_MSG_DEBUG("Smeared starting parameters : " << perigee
+                            ->localToGlobal(
+                                Acts::GeometryContext(),
+                                Acts::Vector2{params[Acts::eBoundLoc0],
+                                              params[Acts::eBoundLoc1]},
+                                truthMomentum)
+                            .transpose()
+                     << ", " << params[Acts::eBoundTime] << ", "
+                     << params[Acts::eBoundPhi] << ", "
+                     << params[Acts::eBoundTheta] << ", "
+                     << params[Acts::eBoundQOverP]);
+ 
+  return Acts::BoundTrackParameters(perigee, params, cov, particleHypothesis); 
+}
diff --git a/Tracking/Acts/FaserActsKalmanFilter/src/TruthBasedInitialParameterTool.h b/Tracking/Acts/FaserActsKalmanFilter/src/TruthBasedInitialParameterTool.h
index f22a904ce..6079564c0 100644
--- a/Tracking/Acts/FaserActsKalmanFilter/src/TruthBasedInitialParameterTool.h
+++ b/Tracking/Acts/FaserActsKalmanFilter/src/TruthBasedInitialParameterTool.h
@@ -5,13 +5,7 @@
 #include "TrackerSimData/TrackerSimDataCollection.h"
 #include "SimWriterTool.h"
 
-
-namespace Acts {
-  struct SinglyCharged;
-  template <typename charge_t> class SingleCurvilinearTrackParameters;
-  using CurvilinearTrackParameters =
-    SingleCurvilinearTrackParameters<SinglyCharged>;
-}
+#include "Acts/EventData/TrackParameters.hpp"
 
 
 class TruthBasedInitialParameterTool : public AthAlgTool {
@@ -23,7 +17,7 @@ class TruthBasedInitialParameterTool : public AthAlgTool {
   virtual StatusCode initialize() override;
   virtual StatusCode finalize() override;
 
-  Acts::CurvilinearTrackParameters getInitialParameters(std::vector<Identifier> ids) const;
+  Acts::BoundTrackParameters getInitialParameters(std::vector<Identifier> ids) const;
 
  private:
   SG::ReadHandleKey<TrackerSimDataCollection> m_simDataCollectionKey {this, "TrackerSimDataCollection", "SCT_SDO_Map"};
-- 
GitLab