Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-07-12 07:51:53

0001 // This file is part of the ACTS project.
0002 //
0003 // Copyright (C) 2016 CERN for the benefit of the ACTS project
0004 //
0005 // This Source Code Form is subject to the terms of the Mozilla Public
0006 // License, v. 2.0. If a copy of the MPL was not distributed with this
0007 // file, You can obtain one at https://mozilla.org/MPL/2.0/.
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 }  // namespace Acts::Experimental