File indexing completed on 2025-07-12 07:51:25
0001
0002
0003
0004
0005
0006
0007
0008
0009 #pragma once
0010
0011 #include "Acts/EventData/SourceLink.hpp"
0012 #include "Acts/EventData/Types.hpp"
0013 #include "Acts/Utilities/EnumBitwiseOperators.hpp"
0014 #include "Acts/Utilities/TypeTraits.hpp"
0015
0016 #include <cassert>
0017 #include <memory>
0018 #include <optional>
0019 #include <span>
0020 #include <stdexcept>
0021 #include <string>
0022 #include <unordered_map>
0023 #include <vector>
0024
0025 #include <Eigen/Core>
0026
0027 namespace Acts::Experimental {
0028
0029 static constexpr float NoTime = std::numeric_limits<float>::quiet_NaN();
0030
0031 template <bool read_only>
0032 class SpacePointProxy2;
0033 using MutableSpacePointProxy2 = SpacePointProxy2<false>;
0034 using ConstSpacePointProxy2 = SpacePointProxy2<true>;
0035
0036 enum class SpacePointKnownExtraColumn : std::uint32_t {
0037 None = 0,
0038
0039 R = 1 << 0,
0040 Phi = 1 << 1,
0041 Time = 1 << 2,
0042 VarianceZ = 1 << 3,
0043 VarianceR = 1 << 4,
0044 TopStripVector = 1 << 5,
0045 BottomStripVector = 1 << 6,
0046 StripCenterDistance = 1 << 7,
0047 TopStripCenter = 1 << 8,
0048 CopyFromIndex = 1 << 9,
0049
0050
0051 Strip =
0052 TopStripVector | BottomStripVector | StripCenterDistance | TopStripCenter
0053 };
0054
0055 ACTS_DEFINE_ENUM_BITWISE_OPERATORS(SpacePointKnownExtraColumn);
0056
0057
0058
0059 template <typename T>
0060 class SpacePointExtraColumnProxy {
0061 public:
0062 using ValueType = T;
0063 using ContainerType = std::vector<ValueType>;
0064
0065 explicit SpacePointExtraColumnProxy(const ContainerType &data)
0066 : m_data(&data) {}
0067 SpacePointExtraColumnProxy(const SpacePointExtraColumnProxy &other) = default;
0068 SpacePointExtraColumnProxy(SpacePointExtraColumnProxy &&other) noexcept =
0069 default;
0070 SpacePointExtraColumnProxy &operator=(
0071 const SpacePointExtraColumnProxy &other) = default;
0072 SpacePointExtraColumnProxy &operator=(
0073 SpacePointExtraColumnProxy &&other) noexcept = default;
0074
0075 private:
0076 const ContainerType *m_data{};
0077
0078 ContainerType &data() { return const_cast<ContainerType &>(*m_data); }
0079 const ContainerType &data() const { return *m_data; }
0080
0081 friend class SpacePointContainer2;
0082 };
0083
0084 class SpacePointColumnHolderBase {
0085 public:
0086 virtual ~SpacePointColumnHolderBase() = default;
0087
0088 virtual std::unique_ptr<SpacePointColumnHolderBase> copy() const = 0;
0089
0090 virtual std::size_t size() const = 0;
0091 virtual void reserve(std::size_t size) = 0;
0092 virtual void resize(std::size_t size) = 0;
0093 virtual void clear() = 0;
0094 virtual void emplace_back() = 0;
0095 };
0096
0097 template <typename T>
0098 class SpacePointExtraColumnHolder final : public SpacePointColumnHolderBase {
0099 public:
0100 using ValueType = T;
0101 using ContainerType = std::vector<ValueType>;
0102 using ProxyType = SpacePointExtraColumnProxy<ValueType>;
0103
0104 SpacePointExtraColumnHolder() = default;
0105 explicit SpacePointExtraColumnHolder(ValueType defaultValue)
0106 : m_default(std::move(defaultValue)) {}
0107
0108 ProxyType proxy() const { return ProxyType(m_data); }
0109
0110 std::unique_ptr<SpacePointColumnHolderBase> copy() const override {
0111 return std::make_unique<SpacePointExtraColumnHolder<T>>(*this);
0112 }
0113
0114 std::size_t size() const override { return m_data.size(); }
0115 void reserve(std::size_t size) override { m_data.reserve(size); }
0116 void clear() override { m_data.clear(); }
0117 void resize(std::size_t size) override { m_data.resize(size, m_default); }
0118 void emplace_back() override { m_data.emplace_back(m_default); }
0119
0120 private:
0121 ValueType m_default{};
0122 ContainerType m_data;
0123 };
0124
0125
0126
0127
0128
0129 class SpacePointContainer2 {
0130 public:
0131 using IndexType = SpacePointIndex2;
0132 using IndexRangeType = SpacePointIndexRange2;
0133 using MutableProxyType = MutableSpacePointProxy2;
0134 using ConstProxyType = ConstSpacePointProxy2;
0135
0136
0137 SpacePointContainer2() noexcept = default;
0138
0139
0140
0141
0142 SpacePointContainer2(const SpacePointContainer2 &other) noexcept;
0143
0144
0145
0146
0147 SpacePointContainer2(SpacePointContainer2 &&other) noexcept;
0148
0149
0150 ~SpacePointContainer2() noexcept = default;
0151
0152
0153
0154
0155
0156 SpacePointContainer2 &operator=(const SpacePointContainer2 &other) noexcept;
0157
0158
0159
0160
0161
0162 SpacePointContainer2 &operator=(SpacePointContainer2 &&other) noexcept;
0163
0164
0165
0166 std::size_t size() const noexcept { return m_sourceLinkOffsets.size(); }
0167
0168
0169 [[nodiscard]] bool empty() const noexcept { return size() == 0; }
0170
0171
0172
0173
0174
0175
0176 void reserve(std::size_t size, float averageSourceLinks = 1) noexcept;
0177
0178
0179 void clear() noexcept;
0180
0181
0182
0183
0184
0185
0186
0187
0188 MutableProxyType createSpacePoint(std::span<const SourceLink> sourceLinks,
0189 float x, float y, float z) noexcept;
0190
0191
0192
0193
0194
0195
0196 MutableProxyType at(IndexType index);
0197
0198
0199
0200
0201
0202 ConstProxyType at(IndexType index) const;
0203
0204
0205
0206
0207 MutableProxyType operator[](IndexType index) noexcept;
0208
0209
0210
0211 ConstProxyType operator[](IndexType index) const noexcept;
0212
0213
0214
0215
0216 std::span<SourceLink> sourceLinks(IndexType index) {
0217 assert(index < m_x.size() && "Index out of bounds");
0218 return std::span<SourceLink>(
0219 m_sourceLinks.data() + m_sourceLinkOffsets[index],
0220 m_sourceLinkCounts[index]);
0221 }
0222
0223
0224
0225 float &x(IndexType index) noexcept {
0226 assert(index < m_y.size() && "Index out of bounds");
0227 return m_x[index];
0228 }
0229
0230
0231
0232 float &y(IndexType index) noexcept {
0233 assert(index < m_y.size() && "Index out of bounds");
0234 return m_y[index];
0235 }
0236
0237
0238
0239 float &z(IndexType index) noexcept {
0240 assert(index < m_z.size() && "Index out of bounds");
0241 return m_z[index];
0242 }
0243
0244
0245
0246
0247
0248 float &r(IndexType index) noexcept {
0249 assert(m_rColumn.has_value() && "Extra column 'r' does not exist");
0250 assert(index < m_rColumn->size() && "Index out of bounds");
0251 return extra(m_rColumn->proxy(), index);
0252 }
0253
0254
0255
0256
0257 float &phi(IndexType index) noexcept {
0258 assert(m_phiColumn.has_value() && "Extra column 'phi' does not exist");
0259 assert(index < m_phiColumn->size() && "Index out of bounds");
0260 return extra(m_phiColumn->proxy(), index);
0261 }
0262
0263
0264
0265
0266 float &time(IndexType index) noexcept {
0267 assert(m_timeColumn.has_value() && "Extra column 'time' does not exist");
0268 assert(index < m_timeColumn->size() && "Index out of bounds");
0269 return extra(m_timeColumn->proxy(), index);
0270 }
0271
0272
0273
0274
0275 float &varianceZ(IndexType index) noexcept {
0276 assert(m_varianceZColumn.has_value() &&
0277 "Extra column 'varianceZ' does not exist");
0278 assert(index < m_varianceZColumn->size() && "Index out of bounds");
0279 return extra(m_varianceZColumn->proxy(), index);
0280 }
0281
0282
0283
0284
0285 float &varianceR(IndexType index) noexcept {
0286 assert(m_varianceRColumn.has_value() &&
0287 "Extra column 'varianceR' does not exist");
0288 assert(index < m_varianceRColumn->size() && "Index out of bounds");
0289 return extra(m_varianceRColumn->proxy(), index);
0290 }
0291
0292
0293
0294
0295 Eigen::Vector3f &topStripVector(IndexType index) noexcept {
0296 assert(m_topStripVectorColumn.has_value() &&
0297 "Extra column 'topStripVector' does not exist");
0298 assert(index < m_topStripVectorColumn->size() && "Index out of bounds");
0299 return extra(m_topStripVectorColumn->proxy(), index);
0300 }
0301
0302
0303
0304
0305 Eigen::Vector3f &bottomStripVector(IndexType index) noexcept {
0306 assert(m_bottomStripVectorColumn.has_value() &&
0307 "Extra column 'bottomStripVector' does not exist");
0308 assert(index < m_bottomStripVectorColumn->size() && "Index out of bounds");
0309 return extra(m_bottomStripVectorColumn->proxy(), index);
0310 }
0311
0312
0313
0314
0315 Eigen::Vector3f &stripCenterDistance(IndexType index) noexcept {
0316 assert(m_stripCenterDistanceColumn.has_value() &&
0317 "Extra column 'stripCenterDistance' does not exist");
0318 assert(index < m_stripCenterDistanceColumn->size() &&
0319 "Index out of bounds");
0320 return extra(m_stripCenterDistanceColumn->proxy(), index);
0321 }
0322
0323
0324
0325
0326 Eigen::Vector3f &topStripCenter(IndexType index) noexcept {
0327 assert(m_topStripCenterColumn.has_value() &&
0328 "Extra column 'topStripCenter' does not exist");
0329 assert(index < m_topStripCenterColumn->size() && "Index out of bounds");
0330 return extra(m_topStripCenterColumn->proxy(), index);
0331 }
0332
0333
0334
0335
0336 std::size_t ©FromIndex(IndexType index) noexcept {
0337 assert(m_copyFromIndexColumn.has_value() &&
0338 "Extra column 'copyFromIndex' does not exist");
0339 assert(index < m_copyFromIndexColumn->size() && "Index out of bounds");
0340 return extra(m_copyFromIndexColumn->proxy(), index);
0341 }
0342
0343
0344
0345
0346 std::span<const SourceLink> sourceLinks(IndexType index) const noexcept {
0347 assert(index < m_sourceLinkCounts.size() && "Index out of bounds");
0348 assert(index < m_sourceLinkOffsets.size() && "Index out of bounds");
0349 return std::span<const SourceLink>(
0350 m_sourceLinks.data() + m_sourceLinkOffsets[index],
0351 m_sourceLinkCounts[index]);
0352 }
0353
0354
0355
0356 float x(IndexType index) const noexcept {
0357 assert(index < m_x.size() && "Index out of bounds");
0358 return m_x[index];
0359 }
0360
0361
0362
0363 float y(IndexType index) const noexcept {
0364 assert(index < m_y.size() && "Index out of bounds");
0365 return m_y[index];
0366 }
0367
0368
0369
0370 float z(IndexType index) const noexcept {
0371 assert(index < m_z.size() && "Index out of bounds");
0372 return m_z[index];
0373 }
0374
0375
0376
0377
0378
0379 float r(IndexType index) const noexcept {
0380 assert(m_rColumn.has_value() && "Extra column 'r' does not exist");
0381 assert(index < m_rColumn->size() && "Index out of bounds");
0382 return extra(m_rColumn->proxy(), index);
0383 }
0384
0385
0386
0387
0388 float phi(IndexType index) const noexcept {
0389 assert(m_phiColumn.has_value() && "Extra column 'phi' does not exist");
0390 assert(index < m_phiColumn->size() && "Index out of bounds");
0391 return extra(m_phiColumn->proxy(), index);
0392 }
0393
0394
0395
0396
0397 float time(IndexType index) const noexcept {
0398 assert(m_timeColumn.has_value() && "Extra column 'time' does not exist");
0399 assert(index < m_timeColumn->size() && "Index out of bounds");
0400 return extra(m_timeColumn->proxy(), index);
0401 }
0402
0403
0404
0405
0406 float varianceZ(IndexType index) const noexcept {
0407 assert(m_varianceZColumn.has_value() &&
0408 "Extra column 'varianceZ' does not exist");
0409 assert(index < m_varianceZColumn->size() && "Index out of bounds");
0410 return extra(m_varianceZColumn->proxy(), index);
0411 }
0412
0413
0414
0415
0416 float varianceR(IndexType index) const noexcept {
0417 assert(m_varianceRColumn.has_value() &&
0418 "Extra column 'varianceR' does not exist");
0419 assert(index < m_varianceRColumn->size() && "Index out of bounds");
0420 return extra(m_varianceRColumn->proxy(), index);
0421 }
0422
0423
0424
0425
0426 const Eigen::Vector3f &topStripVector(IndexType index) const noexcept {
0427 assert(m_topStripVectorColumn.has_value() &&
0428 "Extra column 'topStripVector' does not exist");
0429 assert(index < m_topStripVectorColumn->size() && "Index out of bounds");
0430 return extra(m_topStripVectorColumn->proxy(), index);
0431 }
0432
0433
0434
0435
0436 const Eigen::Vector3f &bottomStripVector(IndexType index) const noexcept {
0437 assert(m_bottomStripVectorColumn.has_value() &&
0438 "Extra column 'bottomStripVector' does not exist");
0439 assert(index < m_bottomStripVectorColumn->size() && "Index out of bounds");
0440 return extra(m_bottomStripVectorColumn->proxy(), index);
0441 }
0442
0443
0444
0445
0446 const Eigen::Vector3f &stripCenterDistance(IndexType index) const noexcept {
0447 assert(m_stripCenterDistanceColumn.has_value() &&
0448 "Extra column 'stripCenterDistance' does not exist");
0449 assert(index < m_stripCenterDistanceColumn->size() &&
0450 "Index out of bounds");
0451 return extra(m_stripCenterDistanceColumn->proxy(), index);
0452 }
0453
0454
0455
0456
0457 const Eigen::Vector3f &topStripCenter(IndexType index) const noexcept {
0458 assert(m_topStripCenterColumn.has_value() &&
0459 "Extra column 'topStripCenter' does not exist");
0460 assert(index < m_topStripCenterColumn->size() && "Index out of bounds");
0461 return extra(m_topStripCenterColumn->proxy(), index);
0462 }
0463
0464
0465
0466
0467 std::size_t copyFromIndex(IndexType index) const noexcept {
0468 assert(m_copyFromIndexColumn.has_value() &&
0469 "Extra column 'copyFromIndex' does not exist");
0470 assert(index < m_copyFromIndexColumn->size() && "Index out of bounds");
0471 return extra(m_copyFromIndexColumn->proxy(), index);
0472 }
0473
0474 template <typename T>
0475 T &extra(SpacePointExtraColumnProxy<T> column, IndexType index) noexcept {
0476 return column.data()[index];
0477 }
0478
0479 template <typename T>
0480 const T &extra(const SpacePointExtraColumnProxy<T> &column,
0481 IndexType index) const noexcept {
0482 return column.data()[index];
0483 }
0484
0485
0486
0487
0488
0489 void createExtraColumns(SpacePointKnownExtraColumn columns) noexcept;
0490
0491
0492
0493
0494 void dropExtraColumns(SpacePointKnownExtraColumn columns) noexcept;
0495
0496
0497
0498
0499
0500 bool hasExtraColumns(SpacePointKnownExtraColumn columns) const noexcept {
0501 return (m_knownExtraColumns & columns) == columns;
0502 }
0503
0504
0505
0506
0507
0508 SpacePointExtraColumnProxy<float> rColumn() const {
0509 if (!m_rColumn.has_value()) {
0510 throw std::runtime_error("Extra column 'r' does not exist");
0511 }
0512 return m_rColumn->proxy();
0513 }
0514
0515
0516
0517
0518 SpacePointExtraColumnProxy<float> phiColumn() const {
0519 if (!m_phiColumn.has_value()) {
0520 throw std::runtime_error("Extra column 'phi' does not exist");
0521 }
0522 return m_phiColumn->proxy();
0523 }
0524
0525
0526
0527
0528 SpacePointExtraColumnProxy<float> timeColumn() const {
0529 if (!m_timeColumn.has_value()) {
0530 throw std::runtime_error("Extra column 'time' does not exist");
0531 }
0532 return m_timeColumn->proxy();
0533 }
0534
0535
0536
0537
0538 SpacePointExtraColumnProxy<float> varianceZColumn() const {
0539 if (!m_varianceZColumn.has_value()) {
0540 throw std::runtime_error("Extra column 'varianceZ' does not exist");
0541 }
0542 return m_varianceZColumn->proxy();
0543 }
0544
0545
0546
0547
0548 SpacePointExtraColumnProxy<float> varianceRColumn() const {
0549 if (!m_varianceRColumn.has_value()) {
0550 throw std::runtime_error("Extra column 'varianceR' does not exist");
0551 }
0552 return m_varianceRColumn->proxy();
0553 }
0554
0555
0556
0557
0558 SpacePointExtraColumnProxy<Eigen::Vector3f> topStripVectorColumn() const {
0559 if (!m_topStripVectorColumn.has_value()) {
0560 throw std::runtime_error("Extra column 'topStripVector' does not exist");
0561 }
0562 return m_topStripVectorColumn->proxy();
0563 }
0564
0565
0566
0567
0568 SpacePointExtraColumnProxy<Eigen::Vector3f> bottomStripVectorColumn() const {
0569 if (!m_bottomStripVectorColumn.has_value()) {
0570 throw std::runtime_error(
0571 "Extra column 'bottomStripVector' does not exist");
0572 }
0573 return m_bottomStripVectorColumn->proxy();
0574 }
0575
0576
0577
0578
0579 SpacePointExtraColumnProxy<Eigen::Vector3f> stripCenterDistanceColumn()
0580 const {
0581 if (!m_stripCenterDistanceColumn.has_value()) {
0582 throw std::runtime_error(
0583 "Extra column 'stripCenterDistance' does not exist");
0584 }
0585 return m_stripCenterDistanceColumn->proxy();
0586 }
0587
0588
0589
0590
0591 SpacePointExtraColumnProxy<Eigen::Vector3f> topStripCenterColumn() const {
0592 if (!m_topStripCenterColumn.has_value()) {
0593 throw std::runtime_error("Extra column 'topStripCenter' does not exist");
0594 }
0595 return m_topStripCenterColumn->proxy();
0596 }
0597
0598
0599
0600
0601 SpacePointExtraColumnProxy<std::size_t> copyFromIndexColumn() const {
0602 if (!m_copyFromIndexColumn.has_value()) {
0603 throw std::runtime_error("Extra column 'copyFromIndex' does not exist");
0604 }
0605 return m_copyFromIndexColumn->proxy();
0606 }
0607
0608
0609
0610
0611
0612
0613 template <typename T>
0614 SpacePointExtraColumnProxy<T> createExtraColumn(const std::string &name) {
0615 return createExtraColumnImpl<SpacePointExtraColumnHolder<T>>(name);
0616 }
0617
0618
0619
0620
0621
0622 void dropExtraColumn(const std::string &name);
0623
0624
0625
0626
0627 bool hasExtraColumn(const std::string &name) const noexcept;
0628
0629
0630
0631
0632
0633
0634 template <typename T>
0635 SpacePointExtraColumnProxy<T> extraColumn(const std::string &name) const {
0636 return extraColumnImpl<SpacePointExtraColumnHolder<T>>(name);
0637 }
0638
0639 template <bool read_only>
0640 class Iterator {
0641 public:
0642 static constexpr bool ReadOnly = read_only;
0643
0644 using ContainerType = const_if_t<ReadOnly, SpacePointContainer2>;
0645
0646 using iterator_category = std::forward_iterator_tag;
0647 using value_type = SpacePointProxy2<ReadOnly>;
0648 using difference_type = std::ptrdiff_t;
0649
0650 Iterator() noexcept = default;
0651 Iterator(ContainerType &container, IndexType index) noexcept
0652 : m_container(&container), m_index(index) {}
0653
0654 Iterator &operator++() noexcept {
0655 ++m_index;
0656 return *this;
0657 }
0658 Iterator operator++(int) noexcept {
0659 Iterator tmp(*this);
0660 ++(*this);
0661 return tmp;
0662 }
0663
0664 value_type operator*() const noexcept {
0665 return value_type(*m_container, m_index);
0666 }
0667
0668 private:
0669 ContainerType *m_container{};
0670 IndexType m_index{};
0671
0672 friend bool operator==(const Iterator &a, const Iterator &b) noexcept {
0673 return a.m_index == b.m_index && a.m_container == b.m_container;
0674 }
0675 };
0676 using iterator = Iterator<false>;
0677 using const_iterator = Iterator<true>;
0678
0679 iterator begin() noexcept { return iterator(*this, 0); }
0680 iterator end() noexcept { return iterator(*this, size()); }
0681
0682 const_iterator begin() const noexcept { return const_iterator(*this, 0); }
0683 const_iterator end() const noexcept { return const_iterator(*this, size()); }
0684
0685 template <bool read_only>
0686 class Range {
0687 public:
0688 static constexpr bool ReadOnly = read_only;
0689 using ContainerType = const_if_t<ReadOnly, SpacePointContainer2>;
0690
0691 using iterator = Iterator<read_only>;
0692 using const_iterator = Iterator<true>;
0693
0694 Range(ContainerType &container, const IndexRangeType &range) noexcept
0695 : m_container(&container), m_range(range) {}
0696
0697 std::size_t size() const noexcept { return m_range.second - m_range.first; }
0698 bool empty() const noexcept { return size() == 0; }
0699
0700 iterator begin() const noexcept {
0701 return iterator(*m_container, m_range.first);
0702 }
0703 iterator end() const noexcept {
0704 return iterator(*m_container, m_range.second);
0705 }
0706
0707 const_iterator cbegin() const noexcept {
0708 return const_iterator(*m_container, m_range.first);
0709 }
0710 const_iterator cend() const noexcept {
0711 return const_iterator(*m_container, m_range.second);
0712 }
0713
0714 private:
0715 ContainerType *m_container{};
0716 IndexRangeType m_range{};
0717 };
0718 using MutableRange = Range<false>;
0719 using ConstRange = Range<true>;
0720
0721 MutableRange range(const IndexRangeType &range) noexcept {
0722 return MutableRange(*this, range);
0723 }
0724 ConstRange range(const IndexRangeType &range) const noexcept {
0725 return ConstRange(*this, range);
0726 }
0727
0728 private:
0729 std::vector<float> m_x;
0730 std::vector<float> m_y;
0731 std::vector<float> m_z;
0732 std::vector<std::size_t> m_sourceLinkOffsets;
0733 std::vector<std::uint8_t> m_sourceLinkCounts;
0734 std::vector<SourceLink> m_sourceLinks;
0735
0736
0737 SpacePointKnownExtraColumn m_knownExtraColumns{
0738 SpacePointKnownExtraColumn::None};
0739
0740 std::optional<SpacePointExtraColumnHolder<float>> m_rColumn;
0741 std::optional<SpacePointExtraColumnHolder<float>> m_phiColumn;
0742
0743 std::optional<SpacePointExtraColumnHolder<float>> m_timeColumn;
0744
0745 std::optional<SpacePointExtraColumnHolder<float>> m_varianceZColumn;
0746 std::optional<SpacePointExtraColumnHolder<float>> m_varianceRColumn;
0747
0748 std::optional<SpacePointExtraColumnHolder<Eigen::Vector3f>>
0749 m_topStripVectorColumn;
0750 std::optional<SpacePointExtraColumnHolder<Eigen::Vector3f>>
0751 m_bottomStripVectorColumn;
0752 std::optional<SpacePointExtraColumnHolder<Eigen::Vector3f>>
0753 m_stripCenterDistanceColumn;
0754 std::optional<SpacePointExtraColumnHolder<Eigen::Vector3f>>
0755 m_topStripCenterColumn;
0756
0757 std::optional<SpacePointExtraColumnHolder<std::size_t>> m_copyFromIndexColumn;
0758
0759 std::unordered_map<std::string, std::unique_ptr<SpacePointColumnHolderBase>>
0760 m_namedExtraColumns;
0761
0762 std::vector<SpacePointColumnHolderBase *> m_extraColumns;
0763
0764 auto knownExtraColumns() & noexcept {
0765 return std::tie(m_rColumn, m_phiColumn, m_timeColumn, m_varianceZColumn,
0766 m_varianceRColumn, m_topStripVectorColumn,
0767 m_bottomStripVectorColumn, m_stripCenterDistanceColumn,
0768 m_topStripCenterColumn, m_copyFromIndexColumn);
0769 }
0770 auto knownExtraColumns() const & noexcept {
0771 return std::tie(m_rColumn, m_phiColumn, m_timeColumn, m_varianceZColumn,
0772 m_varianceRColumn, m_topStripVectorColumn,
0773 m_bottomStripVectorColumn, m_stripCenterDistanceColumn,
0774 m_topStripCenterColumn, m_copyFromIndexColumn);
0775 }
0776 auto knownExtraColumns() && noexcept {
0777 return std::tuple(
0778 std::move(m_rColumn), std::move(m_phiColumn), std::move(m_timeColumn),
0779 std::move(m_varianceZColumn), std::move(m_varianceRColumn),
0780 std::move(m_topStripVectorColumn), std::move(m_bottomStripVectorColumn),
0781 std::move(m_stripCenterDistanceColumn),
0782 std::move(m_topStripCenterColumn), std::move(m_copyFromIndexColumn));
0783 }
0784
0785 void copyExtraColumns(const SpacePointContainer2 &other);
0786 void moveExtraColumns(SpacePointContainer2 &other) noexcept;
0787
0788 void initializeExtraColumns() noexcept;
0789
0790 template <typename Holder>
0791 auto createExtraColumnImpl(const std::string &name) {
0792 if (hasExtraColumn(name)) {
0793 throw std::runtime_error("Extra column already exists: " + name);
0794 }
0795 auto holder = std::make_unique<Holder>();
0796 holder->resize(size());
0797 auto proxy = holder->proxy();
0798 m_extraColumns.push_back(holder.get());
0799 m_namedExtraColumns[name] = std::move(holder);
0800 return proxy;
0801 }
0802 template <typename Holder>
0803 auto extraColumnImpl(const std::string &name) const {
0804 auto it = m_namedExtraColumns.find(name);
0805 if (it == m_namedExtraColumns.end()) {
0806 throw std::runtime_error("Extra column not found: " + name);
0807 }
0808 auto &holder = dynamic_cast<Holder &>(*it->second);
0809 return holder.proxy();
0810 }
0811 };
0812
0813 }
0814
0815 #include "Acts/EventData/SpacePointContainer2.ipp"