File indexing completed on 2025-07-11 07:50:01
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #pragma once
0014
0015 #include "Acts/Utilities/BinUtility.hpp"
0016 #include "Acts/Utilities/BinnedArray.hpp"
0017 #include "Acts/Utilities/Helpers.hpp"
0018
0019 #include <array>
0020 #include <iostream>
0021 #include <vector>
0022
0023 class MsgStream;
0024
0025 namespace Acts {
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035 template <class T>
0036 class BinnedArrayXD : public BinnedArray<T> {
0037
0038 using TAP = std::pair<T, Vector3>;
0039
0040 public:
0041
0042
0043
0044 explicit BinnedArrayXD(T object)
0045 : BinnedArray<T>(),
0046 m_objectGrid(
0047 1, std::vector<std::vector<T>>(1, std::vector<T>(1, nullptr))),
0048 m_arrayObjects({object}),
0049 m_binUtility(nullptr) {
0050
0051 m_objectGrid[0][0][0] = object;
0052 }
0053
0054
0055
0056
0057
0058
0059 BinnedArrayXD(const std::vector<TAP>& tapvector,
0060 std::unique_ptr<const BinUtility> bu)
0061 : BinnedArray<T>(),
0062 m_objectGrid(bu->bins(2),
0063 std::vector<std::vector<T>>(
0064 bu->bins(1), std::vector<T>(bu->bins(0), nullptr))),
0065 m_arrayObjects(),
0066 m_binUtility(std::move(bu)) {
0067
0068 m_arrayObjects.reserve(tapvector.size());
0069
0070 for (auto& tap : tapvector) {
0071
0072 if (m_binUtility->inside(tap.second)) {
0073
0074
0075 auto bins = m_binUtility->binTriple(tap.second);
0076
0077 m_objectGrid[bins[2]][bins[1]][bins[0]] = tap.first;
0078
0079 if (!rangeContainsValue(m_arrayObjects, tap.first)) {
0080 m_arrayObjects.push_back(tap.first);
0081 }
0082 }
0083 }
0084 }
0085
0086
0087
0088
0089
0090 BinnedArrayXD(const std::vector<std::vector<std::vector<T>>>& grid,
0091 std::unique_ptr<const BinUtility> bu)
0092 : BinnedArray<T>(),
0093 m_objectGrid(grid),
0094 m_arrayObjects(),
0095 m_binUtility(std::move(bu)) {
0096
0097 std::size_t objects =
0098 m_binUtility->bins(0) * m_binUtility->bins(1) * m_binUtility->bins(2);
0099
0100 m_arrayObjects.reserve(objects);
0101
0102 for (auto& o2 : m_objectGrid) {
0103 for (auto& o1 : o2) {
0104 for (auto& o0 : o1) {
0105
0106 if (o0 && !rangeContainsValue(m_arrayObjects, o0)) {
0107 m_arrayObjects.push_back(o0);
0108 }
0109 }
0110 }
0111 }
0112 }
0113
0114
0115
0116 BinnedArrayXD(const BinnedArrayXD<T>& barr) = delete;
0117
0118
0119
0120 BinnedArrayXD& operator=(const BinnedArrayXD<T>& barr) = delete;
0121
0122
0123 ~BinnedArrayXD() override = default;
0124
0125
0126
0127
0128
0129
0130
0131
0132 T object(const Vector2& lposition,
0133 std::array<std::size_t, 3>& bins) const final {
0134 if (m_binUtility) {
0135 std::size_t bdim = m_binUtility->dimensions();
0136 bins[2] = bdim > 2 ? m_binUtility->bin(lposition, 2) : 0;
0137 bins[1] = bdim > 1 ? m_binUtility->bin(lposition, 1) : 0;
0138 bins[0] = m_binUtility->bin(lposition, 0);
0139 return m_objectGrid[bins[2]][bins[1]][bins[0]];
0140 }
0141 return m_objectGrid[0][0][0];
0142 }
0143
0144
0145 T object(const Vector2& lposition) const override {
0146 std::array<std::size_t, 3> bins{};
0147 return object(lposition, bins);
0148 }
0149
0150
0151
0152
0153
0154
0155
0156 T object(const Vector3& position,
0157 std::array<std::size_t, 3>& bins) const final {
0158 if (m_binUtility) {
0159 std::size_t bdim = m_binUtility->dimensions();
0160 bins[2] = bdim > 2 ? m_binUtility->bin(position, 2) : 0;
0161 bins[1] = bdim > 1 ? m_binUtility->bin(position, 1) : 0;
0162 bins[0] = m_binUtility->bin(position, 0);
0163 return m_objectGrid[bins[2]][bins[1]][bins[0]];
0164 }
0165 return m_objectGrid[0][0][0];
0166 }
0167
0168
0169 T object(const Vector3& position) const override {
0170 std::array<std::size_t, 3> bins{};
0171 return object(position, bins);
0172 }
0173
0174
0175
0176 const std::vector<T>& arrayObjects() const final { return m_arrayObjects; }
0177
0178
0179
0180
0181 const std::vector<std::vector<std::vector<T>>>& objectGrid() const final {
0182 return m_objectGrid;
0183 }
0184
0185
0186
0187 const BinUtility* binUtility() const final { return (m_binUtility.get()); }
0188
0189 private:
0190
0191 std::vector<std::vector<std::vector<T>>> m_objectGrid;
0192
0193 std::vector<T> m_arrayObjects;
0194
0195 std::unique_ptr<const BinUtility> m_binUtility;
0196 };
0197 }