File indexing completed on 2025-08-05 08:09:35
0001
0002
0003
0004
0005
0006
0007
0008
0009 #include "Acts/EventData/VectorTrackContainer.hpp"
0010
0011 #include "Acts/EventData/ParticleHypothesis.hpp"
0012 #include "Acts/Utilities/HashedString.hpp"
0013
0014 #include <iterator>
0015
0016 namespace Acts {
0017
0018 namespace detail_vtc {
0019
0020 VectorTrackContainerBase::VectorTrackContainerBase(
0021 const VectorTrackContainerBase& other)
0022 : m_tipIndex{other.m_tipIndex},
0023 m_stemIndex{other.m_stemIndex},
0024 m_particleHypothesis{other.m_particleHypothesis},
0025 m_params{other.m_params},
0026 m_cov{other.m_cov},
0027 m_referenceSurfaces{other.m_referenceSurfaces},
0028 m_nMeasurements{other.m_nMeasurements},
0029 m_nHoles{other.m_nHoles},
0030 m_chi2{other.m_chi2},
0031 m_ndf{other.m_ndf},
0032 m_nOutliers{other.m_nOutliers},
0033 m_nSharedHits{other.m_nSharedHits} {
0034 for (const auto& [key, value] : other.m_dynamic) {
0035 m_dynamic.insert({key, value->clone()});
0036 }
0037 m_dynamicKeys = other.m_dynamicKeys;
0038 assert(checkConsistency());
0039 }
0040 }
0041
0042 VectorTrackContainer::IndexType VectorTrackContainer::addTrack_impl() {
0043 assert(checkConsistency());
0044
0045 m_tipIndex.emplace_back(kInvalid);
0046 m_stemIndex.emplace_back(kInvalid);
0047
0048 m_particleHypothesis.emplace_back(ParticleHypothesis::pion());
0049 m_params.emplace_back();
0050 m_cov.emplace_back();
0051 m_referenceSurfaces.emplace_back();
0052
0053 m_nMeasurements.emplace_back();
0054 m_nHoles.emplace_back();
0055
0056 m_chi2.emplace_back();
0057 m_ndf.emplace_back();
0058
0059 m_nOutliers.emplace_back();
0060 m_nSharedHits.emplace_back();
0061
0062
0063 for (auto& [key, vec] : m_dynamic) {
0064 vec->add();
0065 }
0066
0067 assert(checkConsistency());
0068
0069 return m_tipIndex.size() - 1;
0070 }
0071
0072 void VectorTrackContainer::removeTrack_impl(IndexType itrack) {
0073 auto erase = [&](auto& vec) {
0074 assert(itrack < vec.size() && "Index is out of range");
0075 auto it = vec.begin();
0076 std::advance(it, itrack);
0077 vec.erase(it);
0078 };
0079
0080 erase(m_tipIndex);
0081 erase(m_stemIndex);
0082
0083 erase(m_params);
0084 erase(m_cov);
0085 erase(m_referenceSurfaces);
0086
0087 erase(m_nMeasurements);
0088 erase(m_nHoles);
0089
0090 erase(m_chi2);
0091 erase(m_ndf);
0092
0093 erase(m_nOutliers);
0094 erase(m_nSharedHits);
0095
0096 for (auto& [key, vec] : m_dynamic) {
0097 vec->erase(itrack);
0098 }
0099 }
0100
0101 void VectorTrackContainer::copyDynamicFrom_impl(IndexType dstIdx,
0102 HashedString key,
0103 const std::any& srcPtr) {
0104 auto it = m_dynamic.find(key);
0105 if (it == m_dynamic.end()) {
0106 throw std::invalid_argument{
0107 "Destination container does not have matching dynamic column"};
0108 }
0109
0110 it->second->copyFrom(dstIdx, srcPtr);
0111 }
0112
0113 void VectorTrackContainer::ensureDynamicColumns_impl(
0114 const detail_vtc::VectorTrackContainerBase& other) {
0115 for (auto& [key, value] : other.m_dynamic) {
0116 if (m_dynamic.find(key) == m_dynamic.end()) {
0117 m_dynamic[key] = value->clone(true);
0118 }
0119 }
0120 }
0121
0122 void VectorTrackContainer::reserve(IndexType size) {
0123 m_tipIndex.reserve(size);
0124 m_stemIndex.reserve(size);
0125
0126 m_particleHypothesis.reserve(size);
0127 m_params.reserve(size);
0128 m_cov.reserve(size);
0129 m_referenceSurfaces.reserve(size);
0130
0131 m_nMeasurements.reserve(size);
0132 m_nHoles.reserve(size);
0133
0134 m_chi2.reserve(size);
0135 m_ndf.reserve(size);
0136
0137 m_nOutliers.reserve(size);
0138 m_nSharedHits.reserve(size);
0139
0140 for (auto& [key, vec] : m_dynamic) {
0141 vec->reserve(size);
0142 }
0143 }
0144
0145 void VectorTrackContainer::clear() {
0146 m_tipIndex.clear();
0147 m_stemIndex.clear();
0148
0149 m_particleHypothesis.clear();
0150 m_params.clear();
0151 m_cov.clear();
0152 m_referenceSurfaces.clear();
0153
0154 m_nMeasurements.clear();
0155 m_nHoles.clear();
0156
0157 m_chi2.clear();
0158 m_ndf.clear();
0159
0160 m_nOutliers.clear();
0161 m_nSharedHits.clear();
0162
0163 for (auto& [key, vec] : m_dynamic) {
0164 vec->clear();
0165 }
0166 }
0167
0168 }