Back to home page

sPhenix code displayed by LXR

 
 

    


File indexing completed on 2025-08-05 08:09:35

0001 // This file is part of the Acts project.
0002 //
0003 // Copyright (C) 2023 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 http://mozilla.org/MPL/2.0/.
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 }  // namespace detail_vtc
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   // dynamic columns
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 }  // namespace Acts