diff --git a/Core/include/Acts/EventData/Seed.hpp b/Core/include/Acts/EventData/Seed.hpp index 15484c00496..469f8e76656 100644 --- a/Core/include/Acts/EventData/Seed.hpp +++ b/Core/include/Acts/EventData/Seed.hpp @@ -13,21 +13,31 @@ namespace Acts { -template +template class Seed { + static_assert(N >= 3ul, "A seed needs at least 3 space points"); + public: - Seed(const external_spacepoint_t& b, const external_spacepoint_t& m, - const external_spacepoint_t& u); + using value_type = external_spacepoint_t; + static constexpr std::size_t DIM = N; + + template + Seed(const args_t&... points) + requires(sizeof...(points) == N) && + (std::same_as && ...); void setVertexZ(float vertex); void setQuality(float seedQuality); - const std::array& sp() const; + const std::array& sp() const; float z() const; float seedQuality() const; private: - std::array m_spacepoints; + template + void storeValues(const external_spacepoint_t& value, const args_t&... others); + + std::array m_spacepoints{}; float m_vertexZ{0.f}; float m_seedQuality{-std::numeric_limits::infinity()}; }; diff --git a/Core/include/Acts/EventData/Seed.ipp b/Core/include/Acts/EventData/Seed.ipp index 7fe7404513c..80abe64f82b 100644 --- a/Core/include/Acts/EventData/Seed.ipp +++ b/Core/include/Acts/EventData/Seed.ipp @@ -8,35 +8,49 @@ namespace Acts { -template -Seed::Seed(const external_spacepoint_t& b, - const external_spacepoint_t& m, - const external_spacepoint_t& u) - : m_spacepoints({&b, &m, &u}) {} - -template -void Seed::setVertexZ(float vertex) { +template +template +Seed::Seed(const args_t&... points) + requires(sizeof...(points) == N) && + (std::same_as && ...) +{ + storeValues(points...); +} + +template +template +void Seed::storeValues( + const external_spacepoint_t& value, const args_t&... others) { + constexpr std::size_t M = sizeof...(others); + m_spacepoints[N - M - 1] = &value; + if constexpr (M != 0ul) { + storeValues(others...); + } +} + +template +void Seed::setVertexZ(float vertex) { m_vertexZ = vertex; } -template -void Seed::setQuality(float seedQuality) { +template +void Seed::setQuality(float seedQuality) { m_seedQuality = seedQuality; } -template -const std::array& -Seed::sp() const { +template +const std::array& +Seed::sp() const { return m_spacepoints; } -template -float Seed::z() const { +template +float Seed::z() const { return m_vertexZ; } -template -float Seed::seedQuality() const { +template +float Seed::seedQuality() const { return m_seedQuality; } diff --git a/Core/include/Acts/EventData/SpacePointProxyIterator.ipp b/Core/include/Acts/EventData/SpacePointProxyIterator.ipp index 06f7dcb664e..0990e21536b 100644 --- a/Core/include/Acts/EventData/SpacePointProxyIterator.ipp +++ b/Core/include/Acts/EventData/SpacePointProxyIterator.ipp @@ -48,7 +48,6 @@ template bool SpacePointProxyIterator::operator==( const SpacePointProxyIterator& other) const { return m_container == other.m_container && m_index == other.m_index; - ; } template diff --git a/Tests/UnitTests/Core/EventData/CMakeLists.txt b/Tests/UnitTests/Core/EventData/CMakeLists.txt index 22a914df5b8..5699dc4527f 100644 --- a/Tests/UnitTests/Core/EventData/CMakeLists.txt +++ b/Tests/UnitTests/Core/EventData/CMakeLists.txt @@ -14,5 +14,6 @@ add_unittest(TrackStatePropMask TrackStatePropMaskTests.cpp) add_unittest(ParticleHypothesis ParticleHypothesisTests.cpp) add_unittest(MultiTrajectoryHelpers MultiTrajectoryHelpersTests.cpp) add_unittest(SubspaceHelpers SubspaceHelpersTests.cpp) +add_unittest(SeedEdm SeedEdmTests.cpp) add_non_compile_test(MultiTrajectory TrackContainerComplianceTests.cpp) diff --git a/Tests/UnitTests/Core/EventData/SeedEdmTests.cpp b/Tests/UnitTests/Core/EventData/SeedEdmTests.cpp new file mode 100644 index 00000000000..a44786e9bde --- /dev/null +++ b/Tests/UnitTests/Core/EventData/SeedEdmTests.cpp @@ -0,0 +1,107 @@ +// This file is part of the Acts project. +// +// Copyright (C) 2024 CERN for the benefit of the Acts project +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +#include + +#include "Acts/EventData/Seed.hpp" + +#include + +namespace Acts::Test { + +struct SpacePoint {}; + +BOOST_AUTO_TEST_CASE(seed_edm_constructors) { + std::array storage{}; + Acts::Seed seed(storage[0], storage[1], storage[2], + storage[3], storage[4]); + const std::array& sps = seed.sp(); + for (std::size_t i(0ul); i < 5ul; ++i) { + BOOST_CHECK_NE(sps[i], nullptr); + BOOST_CHECK_EQUAL(sps[i], &storage[i]); + } + + // Copy 1 + Acts::Seed seed_copy1(seed); + const std::array& sps_copy1 = + seed_copy1.sp(); + for (std::size_t i(0ul); i < 5ul; ++i) { + BOOST_CHECK_NE(sps_copy1[i], nullptr); + BOOST_CHECK_EQUAL(sps_copy1[i], sps[i]); + } + + // Copy 2 + Acts::Seed seed_copy2{seed}; + const std::array& sps_copy2 = + seed_copy2.sp(); + for (std::size_t i(0ul); i < 5ul; ++i) { + BOOST_CHECK_NE(sps_copy2[i], nullptr); + BOOST_CHECK_EQUAL(sps_copy2[i], sps[i]); + } + + // Collection + std::vector> seeds{seed}; + // Copy 1 + std::vector> seeds_copy1(seeds); + BOOST_CHECK_EQUAL(seeds_copy1.size(), seeds.size()); + // Copy 2 + std::vector> seeds_copy2{seeds}; + BOOST_CHECK_EQUAL(seeds_copy2.size(), seeds.size()); +} + +BOOST_AUTO_TEST_CASE(seed_edm_default) { + std::array storage{}; + Acts::Seed seed(storage[0], storage[1], storage[2]); + const std::array& sps = seed.sp(); + for (std::size_t i(0ul); i < 3ul; ++i) { + BOOST_CHECK_NE(sps[i], nullptr); + BOOST_CHECK_EQUAL(sps[i], &storage[i]); + } + + seed.setVertexZ(-1.2f); + BOOST_CHECK_EQUAL(seed.z(), -1.2f); + + seed.setQuality(345.23f); + BOOST_CHECK_EQUAL(seed.seedQuality(), 345.23f); +} + +BOOST_AUTO_TEST_CASE(seed_edm_3d) { + std::array storage{}; + Acts::Seed seed(storage[0], storage[1], + storage[2]); + const std::array& sps = seed.sp(); + for (std::size_t i(0ul); i < 3ul; ++i) { + BOOST_CHECK_NE(sps[i], nullptr); + BOOST_CHECK_EQUAL(sps[i], &storage[i]); + } + + seed.setVertexZ(-1.2f); + BOOST_CHECK_EQUAL(seed.z(), -1.2f); + + seed.setQuality(345.23f); + BOOST_CHECK_EQUAL(seed.seedQuality(), 345.23f); +} + +BOOST_AUTO_TEST_CASE(seed_edm_4d) { + std::array storage{}; + Acts::Seed seed(storage[0], storage[1], storage[2], + storage[3]); + const std::array& sps = seed.sp(); + for (std::size_t i(0ul); i < 4ul; ++i) { + BOOST_CHECK_NE(sps[i], nullptr); + BOOST_CHECK_EQUAL(sps[i], &storage[i]); + } + + seed.setVertexZ(-1.2f); + BOOST_CHECK_EQUAL(seed.z(), -1.2f); + + seed.setQuality(345.23f); + BOOST_CHECK_EQUAL(seed.seedQuality(), 345.23f); +} + +} // namespace Acts::Test