12 #include <tracking/trackFindingCDC/utilities/Product.h>
14 #include <framework/utilities/Utils.h>
25 namespace TrackFindingCDC {
47 template<
class ABox, std::size_t... divisions>
48 class SectoredLinearDivision {
52 static const std::size_t
s_nSubBoxes = Product<divisions...>::value;
56 static constexpr std::size_t
s_divisions[
sizeof...(divisions)] = {divisions...};
61 int sectorLevelSkip = 0)
69 template <
class ANode>
70 std::vector<ABox>
operator()(
const ANode& node)
72 const ABox& box = node;
74 std::vector<ABox> result =
makeSubBoxes(box, std::make_index_sequence<s_nSubBoxes>());
77 std::vector<ABox> sectoredBoxes;
79 for (
const ABox& boxToDivide : result) {
80 for (
const ABox& dividedBox :
makeSubBoxes(boxToDivide, std::make_index_sequence<s_nSubBoxes>())) {
81 sectoredBoxes.push_back(dividedBox);
84 result = std::move(sectoredBoxes);
89 return makeSubBoxes(box, std::make_index_sequence<s_nSubBoxes>());
93 template<std::size_t... Is>
95 makeSubBoxes(
const ABox& box, std::index_sequence<Is...> )
97 return {{
makeSubBox(box, Is, std::make_index_sequence<
sizeof...(divisions)>())... }};
101 template <std::size_t... Is>
102 ABox
makeSubBox(
const ABox& box, std::size_t globalISubBox, std::index_sequence<Is...> )
104 std::array<std::size_t,
sizeof...(divisions)> indices;
105 for (
size_t c_Index = 0 ; c_Index <
sizeof...(divisions); ++c_Index) {
106 indices[c_Index] = globalISubBox %
s_divisions[c_Index];
109 assert(globalISubBox == 0);
110 return ABox(box.template getDivisionBoundsWithOverlap<Is>(std::get<Is>(
m_overlaps),
124 template<
class ABox, std::size_t... divisions>