File indexing completed on 2025-07-12 07:51:53
0001
0002
0003
0004
0005
0006
0007
0008
0009 #include "Acts/EventData/SpacePointContainer2.hpp"
0010
0011 #include "Acts/Utilities/Helpers.hpp"
0012
0013 namespace Acts::Experimental {
0014
0015 SpacePointContainer2::SpacePointContainer2(
0016 const SpacePointContainer2 &other) noexcept
0017 : m_x(other.m_x),
0018 m_y(other.m_y),
0019 m_z(other.m_z),
0020 m_sourceLinkOffsets(other.m_sourceLinkOffsets),
0021 m_sourceLinkCounts(other.m_sourceLinkCounts),
0022 m_sourceLinks(other.m_sourceLinks) {
0023 copyExtraColumns(other);
0024 }
0025
0026 SpacePointContainer2::SpacePointContainer2(
0027 SpacePointContainer2 &&other) noexcept
0028 : m_x(std::move(other.m_x)),
0029 m_y(std::move(other.m_y)),
0030 m_z(std::move(other.m_z)),
0031 m_sourceLinkOffsets(std::move(other.m_sourceLinkOffsets)),
0032 m_sourceLinkCounts(std::move(other.m_sourceLinkCounts)),
0033 m_sourceLinks(std::move(other.m_sourceLinks)) {
0034 moveExtraColumns(other);
0035 }
0036
0037 SpacePointContainer2 &SpacePointContainer2::operator=(
0038 const SpacePointContainer2 &other) noexcept {
0039 if (this == &other) {
0040 return *this;
0041 }
0042
0043 m_x = other.m_x;
0044 m_y = other.m_y;
0045 m_z = other.m_z;
0046 m_sourceLinkOffsets = other.m_sourceLinkOffsets;
0047 m_sourceLinkCounts = other.m_sourceLinkCounts;
0048 m_sourceLinks = other.m_sourceLinks;
0049
0050 copyExtraColumns(other);
0051
0052 return *this;
0053 }
0054
0055 SpacePointContainer2 &SpacePointContainer2::operator=(
0056 SpacePointContainer2 &&other) noexcept {
0057 if (this == &other) {
0058 return *this;
0059 }
0060
0061 m_x = std::move(other.m_x);
0062 m_y = std::move(other.m_y);
0063 m_z = std::move(other.m_z);
0064 m_sourceLinkOffsets = std::move(other.m_sourceLinkOffsets);
0065 m_sourceLinkCounts = std::move(other.m_sourceLinkCounts);
0066 m_sourceLinks = std::move(other.m_sourceLinks);
0067
0068 moveExtraColumns(other);
0069
0070 return *this;
0071 }
0072
0073 void SpacePointContainer2::copyExtraColumns(const SpacePointContainer2 &other) {
0074 m_extraColumns.reserve(other.m_extraColumns.size());
0075
0076 for (const auto &[name, column] : other.m_namedExtraColumns) {
0077 m_namedExtraColumns.try_emplace(name, column->copy());
0078 }
0079
0080 m_knownExtraColumns = other.m_knownExtraColumns;
0081 knownExtraColumns() = other.knownExtraColumns();
0082
0083 initializeExtraColumns();
0084 }
0085
0086 void SpacePointContainer2::moveExtraColumns(
0087 SpacePointContainer2 &other) noexcept {
0088 m_extraColumns.reserve(other.m_extraColumns.size());
0089
0090 for (auto &[name, column] : other.m_namedExtraColumns) {
0091 m_namedExtraColumns.try_emplace(name, std::move(column));
0092 }
0093
0094 other.m_namedExtraColumns.clear();
0095 other.m_extraColumns.clear();
0096
0097 m_knownExtraColumns = other.m_knownExtraColumns;
0098 knownExtraColumns() = std::move(other).knownExtraColumns();
0099
0100 initializeExtraColumns();
0101 }
0102
0103 void SpacePointContainer2::initializeExtraColumns() noexcept {
0104 m_extraColumns.clear();
0105
0106 for (const auto &[name, column] : m_namedExtraColumns) {
0107 m_extraColumns.push_back(column.get());
0108 }
0109
0110 const auto appendExtraColumn = [this]<typename T>(std::optional<T> &column) {
0111 if (column.has_value()) {
0112 m_extraColumns.push_back(&*column);
0113 }
0114 };
0115 std::apply([&](auto &...args) { ((appendExtraColumn(args)), ...); },
0116 knownExtraColumns());
0117 }
0118
0119 void SpacePointContainer2::reserve(std::size_t size,
0120 float averageSourceLinks) noexcept {
0121 m_x.reserve(size);
0122 m_y.reserve(size);
0123 m_z.reserve(size);
0124 m_sourceLinkOffsets.reserve(size);
0125 m_sourceLinkCounts.reserve(size);
0126 m_sourceLinks.reserve(static_cast<std::size_t>(size * averageSourceLinks));
0127
0128 for (auto &column : m_extraColumns) {
0129 column->reserve(size);
0130 }
0131 }
0132
0133 void SpacePointContainer2::clear() noexcept {
0134 m_x.clear();
0135 m_y.clear();
0136 m_z.clear();
0137 m_sourceLinkOffsets.clear();
0138 m_sourceLinkCounts.clear();
0139 m_sourceLinks.clear();
0140
0141 for (auto &column : m_extraColumns) {
0142 column->clear();
0143 }
0144 }
0145
0146 void SpacePointContainer2::createExtraColumns(
0147 SpacePointKnownExtraColumn columns) noexcept {
0148 using enum SpacePointKnownExtraColumn;
0149
0150 if (ACTS_CHECK_BIT(columns, R) && !m_rColumn.has_value()) {
0151 m_rColumn = SpacePointExtraColumnHolder<float>();
0152 m_rColumn->resize(size());
0153 }
0154 if (ACTS_CHECK_BIT(columns, Phi) && !m_phiColumn.has_value()) {
0155 m_phiColumn = SpacePointExtraColumnHolder<float>();
0156 m_phiColumn->resize(size());
0157 }
0158 if (ACTS_CHECK_BIT(columns, Time) && !m_timeColumn.has_value()) {
0159 m_timeColumn = SpacePointExtraColumnHolder<float>(NoTime);
0160 m_timeColumn->resize(size());
0161 }
0162 if (ACTS_CHECK_BIT(columns, VarianceZ) && !m_varianceZColumn.has_value()) {
0163 m_varianceZColumn = SpacePointExtraColumnHolder<float>();
0164 m_varianceZColumn->resize(size());
0165 }
0166 if (ACTS_CHECK_BIT(columns, VarianceR) && !m_varianceRColumn.has_value()) {
0167 m_varianceRColumn = SpacePointExtraColumnHolder<float>();
0168 m_varianceRColumn->resize(size());
0169 }
0170 if (ACTS_CHECK_BIT(columns, TopStripVector) &&
0171 !m_topStripVectorColumn.has_value()) {
0172 m_topStripVectorColumn = SpacePointExtraColumnHolder<Eigen::Vector3f>();
0173 m_topStripVectorColumn->resize(size());
0174 }
0175 if (ACTS_CHECK_BIT(columns, BottomStripVector) &&
0176 !m_bottomStripVectorColumn.has_value()) {
0177 m_bottomStripVectorColumn = SpacePointExtraColumnHolder<Eigen::Vector3f>();
0178 m_bottomStripVectorColumn->resize(size());
0179 }
0180 if (ACTS_CHECK_BIT(columns, StripCenterDistance) &&
0181 !m_stripCenterDistanceColumn.has_value()) {
0182 m_stripCenterDistanceColumn =
0183 SpacePointExtraColumnHolder<Eigen::Vector3f>();
0184 m_stripCenterDistanceColumn->resize(size());
0185 }
0186 if (ACTS_CHECK_BIT(columns, TopStripCenter) &&
0187 !m_topStripCenterColumn.has_value()) {
0188 m_topStripCenterColumn = SpacePointExtraColumnHolder<Eigen::Vector3f>();
0189 m_topStripCenterColumn->resize(size());
0190 }
0191 if (ACTS_CHECK_BIT(columns, CopyFromIndex) &&
0192 !m_copyFromIndexColumn.has_value()) {
0193 m_copyFromIndexColumn = SpacePointExtraColumnHolder<std::size_t>();
0194 m_copyFromIndexColumn->resize(size());
0195 }
0196
0197 m_knownExtraColumns = m_knownExtraColumns | columns;
0198
0199 initializeExtraColumns();
0200 }
0201
0202 void SpacePointContainer2::dropExtraColumns(
0203 SpacePointKnownExtraColumn columns) noexcept {
0204 using enum SpacePointKnownExtraColumn;
0205
0206 if (ACTS_CHECK_BIT(columns, R)) {
0207 m_rColumn.reset();
0208 }
0209 if (ACTS_CHECK_BIT(columns, Phi)) {
0210 m_phiColumn.reset();
0211 }
0212 if (ACTS_CHECK_BIT(columns, Time)) {
0213 m_timeColumn.reset();
0214 }
0215 if (ACTS_CHECK_BIT(columns, VarianceZ)) {
0216 m_varianceZColumn.reset();
0217 }
0218 if (ACTS_CHECK_BIT(columns, VarianceR)) {
0219 m_varianceRColumn.reset();
0220 }
0221 if (ACTS_CHECK_BIT(columns, TopStripVector)) {
0222 m_topStripVectorColumn.reset();
0223 }
0224 if (ACTS_CHECK_BIT(columns, BottomStripVector)) {
0225 m_bottomStripVectorColumn.reset();
0226 }
0227 if (ACTS_CHECK_BIT(columns, StripCenterDistance)) {
0228 m_stripCenterDistanceColumn.reset();
0229 }
0230 if (ACTS_CHECK_BIT(columns, TopStripCenter)) {
0231 m_topStripCenterColumn.reset();
0232 }
0233 if (ACTS_CHECK_BIT(columns, CopyFromIndex)) {
0234 m_copyFromIndexColumn.reset();
0235 }
0236
0237 m_knownExtraColumns = m_knownExtraColumns & ~columns;
0238
0239 initializeExtraColumns();
0240 }
0241
0242 void SpacePointContainer2::dropExtraColumn(const std::string &name) {
0243 auto it = m_namedExtraColumns.find(name);
0244
0245 if (it == m_namedExtraColumns.end()) {
0246 throw std::runtime_error("Extra column '" + name + "' does not exist");
0247 }
0248
0249 m_namedExtraColumns.erase(it);
0250
0251 initializeExtraColumns();
0252 }
0253
0254 bool SpacePointContainer2::hasExtraColumn(
0255 const std::string &name) const noexcept {
0256 return m_namedExtraColumns.contains(name);
0257 }
0258
0259 }