File indexing completed on 2025-10-17 07:58:49
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 explicit BinnedArrayXD(T object)
0044 : BinnedArray<T>(),
0045 m_objectGrid(
0046 1, std::vector<std::vector<T>>(1, std::vector<T>(1, nullptr))),
0047 m_arrayObjects({object}),
0048 m_binUtility(nullptr) {
0049
0050 m_objectGrid[0][0][0] = object;
0051 }
0052
0053
0054
0055
0056
0057
0058 BinnedArrayXD(const std::vector<TAP>& tapvector,
0059 std::unique_ptr<const BinUtility> bu)
0060 : BinnedArray<T>(),
0061 m_objectGrid(bu->bins(2),
0062 std::vector<std::vector<T>>(
0063 bu->bins(1), std::vector<T>(bu->bins(0), nullptr))),
0064 m_arrayObjects(),
0065 m_binUtility(std::move(bu)) {
0066
0067 m_arrayObjects.reserve(tapvector.size());
0068
0069 for (auto& tap : tapvector) {
0070
0071 if (m_binUtility->inside(tap.second)) {
0072
0073
0074 auto bins = m_binUtility->binTriple(tap.second);
0075
0076 m_objectGrid[bins[2]][bins[1]][bins[0]] = tap.first;
0077
0078 if (!rangeContainsValue(m_arrayObjects, tap.first)) {
0079 m_arrayObjects.push_back(tap.first);
0080 }
0081 }
0082 }
0083 }
0084
0085
0086
0087
0088
0089 BinnedArrayXD(const std::vector<std::vector<std::vector<T>>>& grid,
0090 std::unique_ptr<const BinUtility> bu)
0091 : BinnedArray<T>(),
0092 m_objectGrid(grid),
0093 m_arrayObjects(),
0094 m_binUtility(std::move(bu)) {
0095
0096 std::size_t objects =
0097 m_binUtility->bins(0) * m_binUtility->bins(1) * m_binUtility->bins(2);
0098
0099 m_arrayObjects.reserve(objects);
0100
0101 for (auto& o2 : m_objectGrid) {
0102 for (auto& o1 : o2) {
0103 for (auto& o0 : o1) {
0104
0105 if (o0 && !rangeContainsValue(m_arrayObjects, o0)) {
0106 m_arrayObjects.push_back(o0);
0107 }
0108 }
0109 }
0110 }
0111 }
0112
0113
0114
0115 BinnedArrayXD(const BinnedArrayXD<T>& barr) = delete;
0116
0117
0118
0119 BinnedArrayXD& operator=(const BinnedArrayXD<T>& barr) = delete;
0120
0121
0122 ~BinnedArrayXD() override = default;
0123
0124
0125
0126
0127
0128
0129
0130
0131 T object(const Vector2& lposition,
0132 std::array<std::size_t, 3>& bins) const final {
0133 if (m_binUtility) {
0134 std::size_t bdim = m_binUtility->dimensions();
0135 bins[2] = bdim > 2 ? m_binUtility->bin(lposition, 2) : 0;
0136 bins[1] = bdim > 1 ? m_binUtility->bin(lposition, 1) : 0;
0137 bins[0] = m_binUtility->bin(lposition, 0);
0138 return m_objectGrid[bins[2]][bins[1]][bins[0]];
0139 }
0140 return m_objectGrid[0][0][0];
0141 }
0142
0143
0144 T object(const Vector2& lposition) const override {
0145 std::array<std::size_t, 3> bins{};
0146 return object(lposition, bins);
0147 }
0148
0149
0150
0151
0152
0153
0154
0155 T object(const Vector3& position,
0156 std::array<std::size_t, 3>& bins) const final {
0157 if (m_binUtility) {
0158 std::size_t bdim = m_binUtility->dimensions();
0159 bins[2] = bdim > 2 ? m_binUtility->bin(position, 2) : 0;
0160 bins[1] = bdim > 1 ? m_binUtility->bin(position, 1) : 0;
0161 bins[0] = m_binUtility->bin(position, 0);
0162 return m_objectGrid[bins[2]][bins[1]][bins[0]];
0163 }
0164 return m_objectGrid[0][0][0];
0165 }
0166
0167
0168 T object(const Vector3& position) const override {
0169 std::array<std::size_t, 3> bins{};
0170 return object(position, bins);
0171 }
0172
0173
0174
0175 const std::vector<T>& arrayObjects() const final { return m_arrayObjects; }
0176
0177
0178
0179
0180 const std::vector<std::vector<std::vector<T>>>& objectGrid() const final {
0181 return m_objectGrid;
0182 }
0183
0184
0185
0186 const BinUtility* binUtility() const final { return (m_binUtility.get()); }
0187
0188 private:
0189
0190 std::vector<std::vector<std::vector<T>>> m_objectGrid;
0191
0192 std::vector<T> m_arrayObjects;
0193
0194 std::unique_ptr<const BinUtility> m_binUtility;
0195 };
0196 }