File indexing completed on 2025-08-06 08:11:27
0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <boost/test/unit_test.hpp>
0010
0011 #include "Acts/Seeding/BinnedGroup.hpp"
0012 #include "Acts/Utilities/Grid.hpp"
0013 #include "Acts/Utilities/GridBinFinder.hpp"
0014 #include "Acts/Utilities/GridIterator.hpp"
0015
0016 #include <array>
0017 #include <memory>
0018 #include <vector>
0019
0020 namespace Acts::Test {
0021
0022 BOOST_AUTO_TEST_CASE(binned_group_constructor) {
0023 Acts::detail::EquidistantAxis xAxis(0, 100, 10);
0024 Acts::detail::EquidistantAxis yAxis(0, 100, 10);
0025 Acts::detail::EquidistantAxis zAxis(0, 100, 10);
0026
0027 using grid_1d_t =
0028 Acts::Grid<std::vector<std::size_t>, Acts::detail::EquidistantAxis>;
0029 using grid_2d_t =
0030 Acts::Grid<std::vector<std::size_t>, Acts::detail::EquidistantAxis,
0031 Acts::detail::EquidistantAxis>;
0032 using grid_3d_t =
0033 Acts::Grid<std::vector<std::size_t>, Acts::detail::EquidistantAxis,
0034 Acts::detail::EquidistantAxis, Acts::detail::EquidistantAxis>;
0035
0036 grid_1d_t grid_1d(std::make_tuple(xAxis));
0037 grid_2d_t grid_2d(std::make_tuple(xAxis, yAxis));
0038 grid_3d_t grid_3d(std::make_tuple(xAxis, yAxis, zAxis));
0039
0040 Acts::GridBinFinder<1ul> binFinder_1d(1);
0041 Acts::GridBinFinder<2ul> binFinder_2d(1, 1);
0042 Acts::GridBinFinder<3ul> binFinder_3d(1, 2, 1);
0043
0044 std::array<std::vector<std::size_t>, 1ul> navigation_1d;
0045 navigation_1d[0ul].resize(10);
0046 std::array<std::vector<std::size_t>, 2ul> navigation_2d;
0047 navigation_2d[1ul].resize(10);
0048
0049
0050
0051 Acts::BinnedGroup<grid_1d_t> group_1d(std::move(grid_1d), binFinder_1d,
0052 binFinder_1d, std::move(navigation_1d));
0053
0054 Acts::BinnedGroup<grid_2d_t> group_2d(std::move(grid_2d), binFinder_2d,
0055 binFinder_2d, std::move(navigation_2d));
0056
0057 Acts::BinnedGroup<grid_3d_t> group_3d(std::move(grid_3d), binFinder_3d,
0058 binFinder_3d);
0059
0060
0061 const Acts::BinnedGroup<grid_1d_t> group_1d_moved(std::move(group_1d));
0062 const Acts::BinnedGroup<grid_2d_t> group_2d_moved(std::move(group_2d));
0063 const Acts::BinnedGroup<grid_3d_t> group_3d_moved = std::move(group_3d);
0064
0065 [[maybe_unused]] const grid_1d_t& retrievedGrid = group_1d.grid();
0066 }
0067
0068 BOOST_AUTO_TEST_CASE(binned_group_iterations_1d_emptyGrid) {
0069 using grid_t =
0070 Acts::Grid<std::vector<std::size_t>, Acts::detail::EquidistantAxis>;
0071 using binfinder_t = Acts::GridBinFinder<1ul>;
0072
0073 Acts::detail::EquidistantAxis xAxis(0, 100, 10);
0074 grid_t grid(std::make_tuple(std::move(xAxis)));
0075 binfinder_t binfinder(0);
0076 Acts::BinnedGroup<grid_t> group(std::move(grid), binfinder, binfinder);
0077
0078 Acts::BinnedGroupIterator<grid_t> itrStart = group.begin();
0079 Acts::BinnedGroupIterator<grid_t> itrStop = group.end();
0080
0081 std::size_t nIterations = 0ul;
0082 for (; itrStart != itrStop; ++itrStart, ++nIterations) {
0083 [[maybe_unused]] auto candidates = *itrStart;
0084 }
0085
0086 BOOST_CHECK_EQUAL(nIterations, 0ul);
0087 }
0088
0089 BOOST_AUTO_TEST_CASE(binned_group_iterations_2d_emptyGrid) {
0090 using grid_t =
0091 Acts::Grid<std::vector<std::size_t>, Acts::detail::EquidistantAxis,
0092 Acts::detail::EquidistantAxis>;
0093 using binfinder_t = Acts::GridBinFinder<2ul>;
0094
0095 Acts::detail::EquidistantAxis xAxis(0, 100, 10);
0096 Acts::detail::EquidistantAxis yAxis(0, 100, 10);
0097 grid_t grid(std::make_tuple(std::move(xAxis), std::move(yAxis)));
0098 binfinder_t binfinder(0, 0);
0099 Acts::BinnedGroup<grid_t> group(std::move(grid), binfinder, binfinder);
0100
0101 Acts::BinnedGroupIterator<grid_t> itrStart = group.begin();
0102 Acts::BinnedGroupIterator<grid_t> itrStop = group.end();
0103
0104 std::size_t nIterations = 0ul;
0105 for (; itrStart != itrStop; ++itrStart, ++nIterations) {
0106 [[maybe_unused]] auto candidates = *itrStart;
0107 }
0108
0109 BOOST_CHECK_EQUAL(nIterations, 0ul);
0110 }
0111
0112 BOOST_AUTO_TEST_CASE(binned_group_iterations_1d_perFilledGrid) {
0113 using grid_t =
0114 Acts::Grid<std::vector<std::size_t>, Acts::detail::EquidistantAxis>;
0115 using binfinder_t = Acts::GridBinFinder<1ul>;
0116
0117 Acts::detail::EquidistantAxis xAxis(0, 100, 10);
0118 grid_t grid(std::make_tuple(xAxis));
0119
0120 grid.at(1ul).push_back(4ul);
0121 grid.at(1ul).push_back(1ul);
0122 grid.at(8ul).push_back(7ul);
0123 grid.at(9ul).push_back(2ul);
0124
0125 binfinder_t botBinfinder(0);
0126 binfinder_t topBinfinder(1);
0127 Acts::BinnedGroup<grid_t> group(std::move(grid), botBinfinder, topBinfinder);
0128
0129 std::size_t nIterations = 0ul;
0130 for (const auto [bottom, middle, top] : group) {
0131 ++nIterations;
0132 BOOST_CHECK_EQUAL(bottom.size(), 1ul);
0133 BOOST_CHECK_EQUAL(top.size(), 3ul);
0134 }
0135
0136 BOOST_CHECK_EQUAL(nIterations, 3ul);
0137 }
0138
0139 BOOST_AUTO_TEST_CASE(binned_group_iterations_2d_perFilledGrid) {
0140 using grid_t =
0141 Acts::Grid<std::vector<std::size_t>, Acts::detail::EquidistantAxis,
0142 Acts::detail::EquidistantAxis>;
0143 using binfinder_t = Acts::GridBinFinder<2ul>;
0144
0145 Acts::detail::EquidistantAxis xAxis(0, 100, 10);
0146 Acts::detail::EquidistantAxis yAxis(0, 100, 10);
0147 grid_t grid(std::make_tuple(xAxis, yAxis));
0148
0149 grid.atLocalBins({2ul, 4ul}).push_back(4ul);
0150 grid.atLocalBins({4ul, 4ul}).push_back(4ul);
0151
0152 binfinder_t botBinfinder(1, 2);
0153 binfinder_t topBinfinder(1, 1);
0154 Acts::BinnedGroup<grid_t> group(std::move(grid), botBinfinder, topBinfinder);
0155
0156 std::size_t nIterations = 0ul;
0157 for (const auto [bottom, middle, top] : group) {
0158 ++nIterations;
0159 BOOST_CHECK_EQUAL(bottom.size(), 15ul);
0160 BOOST_CHECK_EQUAL(top.size(), 9ul);
0161 }
0162
0163 BOOST_CHECK_EQUAL(nIterations, 2ul);
0164 }
0165
0166 BOOST_AUTO_TEST_CASE(binned_group_fill_2d) {
0167 using value_t = std::size_t;
0168 using phiAxis_t = Acts::detail::Axis<detail::AxisType::Equidistant,
0169 detail::AxisBoundaryType::Closed>;
0170 using zAxis_t = detail::Axis<detail::AxisType::Equidistant,
0171 detail::AxisBoundaryType::Bound>;
0172 using grid_t = Acts::Grid<std::vector<value_t>, phiAxis_t, zAxis_t>;
0173 using binfinder_t = Acts::GridBinFinder<2ul>;
0174
0175 phiAxis_t phiAxis(-M_PI, M_PI, 40);
0176 zAxis_t zAxis(0, 100, 10);
0177
0178 grid_t grid(std::make_tuple(std::move(phiAxis), std::move(zAxis)));
0179 binfinder_t binfinder(1, 1);
0180 Acts::BinnedGroup<grid_t> group(std::move(grid), binfinder, binfinder);
0181
0182
0183
0184 std::array<std::size_t, 2ul> locPosition({4ul, 6ul});
0185 std::size_t globPos = group.grid().globalBinFromLocalBins(locPosition);
0186
0187 grid_t& storedGrid = group.grid();
0188 for (std::size_t i(0ul); i < 30ul; ++i) {
0189 storedGrid.at(globPos).push_back(1ul);
0190 }
0191
0192 std::size_t nIterations = 0ul;
0193 for (const auto [bottom, middle, top] : group) {
0194 ++nIterations;
0195 const auto& coll = group.grid().at(middle);
0196 BOOST_CHECK_EQUAL(coll.size(), 30ul);
0197 }
0198
0199 BOOST_CHECK_EQUAL(nIterations, 1ul);
0200 }
0201
0202 BOOST_AUTO_TEST_CASE(binned_group_fill_3d) {
0203 using value_t = std::size_t;
0204 using phiAxis_t = Acts::detail::Axis<detail::AxisType::Equidistant,
0205 detail::AxisBoundaryType::Closed>;
0206 using zAxis_t = detail::Axis<detail::AxisType::Equidistant,
0207 detail::AxisBoundaryType::Bound>;
0208 using rAxis_t = detail::Axis<detail::AxisType::Equidistant,
0209 detail::AxisBoundaryType::Bound>;
0210 using grid_t = Acts::Grid<std::vector<value_t>, phiAxis_t, zAxis_t, rAxis_t>;
0211 using binfinder_t = Acts::GridBinFinder<3ul>;
0212
0213 phiAxis_t phiAxis(-M_PI, M_PI, 40);
0214 zAxis_t zAxis(0, 100, 10);
0215 rAxis_t rAxis(0, 11000, 1);
0216
0217 grid_t grid(
0218 std::make_tuple(std::move(phiAxis), std::move(zAxis), std::move(rAxis)));
0219 binfinder_t binfinder(1, 1, 0);
0220 Acts::BinnedGroup<grid_t> group(std::move(grid), binfinder, binfinder);
0221
0222
0223
0224 std::array<std::size_t, grid_t::DIM> locPosition({4ul, 6ul, 1ul});
0225 std::size_t globPos = group.grid().globalBinFromLocalBins(locPosition);
0226
0227 grid_t& storedGrid = group.grid();
0228 for (std::size_t i(0ul); i < 30ul; ++i) {
0229 storedGrid.at(globPos).push_back(1ul);
0230 }
0231
0232 std::size_t nIterations = 0ul;
0233 for (const auto [bottom, middle, top] : group) {
0234 ++nIterations;
0235 const auto& coll = group.grid().at(middle);
0236 BOOST_CHECK_EQUAL(coll.size(), 30ul);
0237 }
0238
0239 BOOST_CHECK_EQUAL(nIterations, 1ul);
0240 }
0241
0242 }