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