File indexing completed on 2026-09-09 08:38:12
0001
0002
0003
0004
0005
0006
0007
0008
0009 #pragma once
0010
0011 #include "Acts/Seeding/BinnedGroupIterator.hpp"
0012
0013 namespace Acts {
0014
0015 template <typename grid_t>
0016 BinnedGroupIterator<grid_t>::BinnedGroupIterator(
0017 const BinnedGroup<grid_t>& group,
0018 std::array<std::size_t, BinnedGroupIterator<grid_t>::DIM> index,
0019 std::array<std::vector<std::size_t>, BinnedGroupIterator<grid_t>::DIM>
0020 navigation)
0021 : m_group(group), m_gridItr(group.grid(), index, navigation) {
0022 std::array<std::size_t, DIM> endline{};
0023 for (std::size_t i(0ul); i < DIM; ++i) {
0024 endline[i] = navigation[i].size();
0025 }
0026 m_gridItrEnd = typename grid_t::local_iterator_t(m_group->grid(), endline,
0027 std::move(navigation));
0028 findNotEmptyBin();
0029 }
0030
0031 template <typename grid_t>
0032 bool BinnedGroupIterator<grid_t>::operator==(
0033 const BinnedGroupIterator<grid_t>& other) const {
0034 return m_group.ptr == other.m_group.ptr && m_gridItr == other.m_gridItr;
0035 }
0036
0037 template <typename grid_t>
0038 BinnedGroupIterator<grid_t>& BinnedGroupIterator<grid_t>::operator++() {
0039 ++m_gridItr;
0040 findNotEmptyBin();
0041 return *this;
0042 }
0043
0044 template <typename grid_t>
0045 std::tuple<boost::container::small_vector<std::size_t, ipow(3, grid_t::DIM)>,
0046 std::size_t,
0047 boost::container::small_vector<std::size_t, ipow(3, grid_t::DIM)>>
0048 BinnedGroupIterator<grid_t>::operator*() const {
0049
0050
0051 std::array<std::size_t, DIM> localPosition = m_gridItr.localBinsIndices();
0052 std::size_t global_index =
0053 m_group->grid().globalBinFromLocalBins(localPosition);
0054
0055
0056 boost::container::small_vector<std::size_t, ipow(3, DIM)> bottoms =
0057 m_group->m_bottomBinFinder->findBins(localPosition, m_group->grid());
0058 boost::container::small_vector<std::size_t, ipow(3, DIM)> tops =
0059 m_group->m_topBinFinder->findBins(localPosition, m_group->grid());
0060
0061
0062
0063 #if defined(__GNUC__) && __GNUC__ >= 12 && !defined(__clang__)
0064 #pragma GCC diagnostic push
0065 #pragma GCC diagnostic ignored "-Wstringop-overread"
0066 #endif
0067 return {std::move(bottoms), global_index, std::move(tops)};
0068 #if defined(__GNUC__) && __GNUC__ >= 12 && !defined(__clang__)
0069 #pragma GCC diagnostic pop
0070 #endif
0071 }
0072
0073 template <typename grid_t>
0074 void BinnedGroupIterator<grid_t>::findNotEmptyBin() {
0075 if (m_gridItr == m_gridItrEnd) {
0076 return;
0077 }
0078
0079
0080 while (m_gridItr != m_gridItrEnd) {
0081 std::size_t dimCollection = (*m_gridItr).size();
0082 bool passesMask = m_group->mask().at(m_gridItr.globalBinIndex());
0083
0084
0085 if (dimCollection > 0ul && passesMask) {
0086 break;
0087 }
0088
0089 ++m_gridItr;
0090 }
0091 }
0092
0093 }