ATLAS Offline Software
Loading...
Searching...
No Matches
Element.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
6#include <list>
7
8using namespace NswAsBuilt;
9
10//===============================================================================
11Element::Element(std::unique_ptr<ElementModel> deformationModel)
12: m_deformationModel(std::move(deformationModel))
13, m_nominalPar(m_deformationModel->nParameters())
14, m_correctedPar(m_deformationModel->nParameters())
15{ }
16
17
18//===============================================================================
23
24
25//===============================================================================
30
31
32//===============================================================================
33void Element::transform(ParameterClass iclass, const VectorSetRef& local) const
34{
35 m_deformationModel->transform(parameterVector(iclass), local);
36}
37
38
39//===============================================================================
40void Element::transformToFrame(ParameterClass iclass, const VectorSetRef& local, const Element* frame) const
41{
42 const Element* el = this;
43 while ((el!=nullptr) && (el!=frame)) {
44 el->transform(iclass, local);
45 el = el->m_mother;
46 }
47}
48
49
50//===============================================================================
52{
53 m_deformationModel->cacheTransform(m_correctedPar);
54 m_deformationModel->cacheTransform(m_nominalPar);
55}
56
57
58//===============================================================================
59double Element::getParameter(ParameterClass iclass, ipar_t ipar) const
60{
61 const auto& parvec = parameterVector(iclass).parameters;
62 if (ipar>=parvec.size()) {
63 throw std::runtime_error("Element::getParameter: Parameter exceeds parvec size "+std::to_string(ipar));
64 }
65 return parvec[ipar];
66}
67
68
69//===============================================================================
70void Element::setParameter(ParameterClass iclass, ipar_t ipar, double value)
71{
72 auto& parvec = parameterVector(iclass).parameters;
73 if (ipar>=parvec.size()) {
74 throw std::runtime_error("Element::setParameter: Parameter exceeds parvec size "+std::to_string(ipar));
75 }
76 parvec[ipar] = value;
78}
79
80
81//===============================================================================
82void Element::setParametersFromMap(ParameterClass iclass, const std::map<std::string, double>& values)
83{
84 for (const auto& p : values) {
85 setParameter(iclass, m_deformationModel->getParameterIndex(p.first), p.second);
86 }
87 m_deformationModel->cacheTransform(parameterVector(iclass));
88}
89
90
91//===============================================================================
92Element* Element::addDaughter(std::unique_ptr<Element> daughter)
93{
94 if (daughter->m_mother) {
95 throw std::runtime_error("Element has a defined mother already");
96 }
97 daughter->m_mother = this;
98 m_daughters.push_back(std::move(daughter));
99 return m_daughters.back().get();
100}
101
102
103//===============================================================================
104void Element::traverseTree(const std::function<void(Element&)>& callback)
105{
106 struct tree_t {
107 using iter = daughterVec_t::iterator;
108 tree_t(iter it_, iter end_):
109 it{it_},end{end_}{}
110 iter it;
111 iter end;
112 };
113 std::list<tree_t> dtree;
114 callback(*this);
115 dtree.emplace_back(m_daughters.begin(), m_daughters.end());
116 while (!dtree.empty()) {
117 auto& it = dtree.back().it;
118 if (it != dtree.back().end) {
119 Element& el = **it;
120 callback(el);
121 dtree.emplace_back(el.m_daughters.begin(), el.m_daughters.end());
122 ++it;
123 } else {
124 dtree.pop_back();
125 }
126 }
127}
128
void traverseTree(const std::function< void(Element &)> &callback)
Definition Element.cxx:104
ParameterVector m_correctedPar
Definition Element.h:113
ParameterVector m_nominalPar
Definition Element.h:112
ElementModel::VectorSetRef VectorSetRef
Definition Element.h:57
void setParametersFromMap(ParameterClass iclass, const std::map< std::string, double > &values)
Definition Element.cxx:82
Element(std::unique_ptr< ElementModel > deformationModel)
Definition Element.cxx:11
std::unique_ptr< ElementModel > m_deformationModel
Definition Element.h:111
void setParameter(ParameterClass iclass, ipar_t ipar, double value)
Definition Element.cxx:70
Element * addDaughter(std::unique_ptr< Element > daughter)
Definition Element.cxx:92
daughterVec_t m_daughters
Definition Element.h:115
void transform(ParameterClass iclass, const VectorSetRef &local) const
Definition Element.cxx:33
void transformToFrame(ParameterClass iclass, const VectorSetRef &local, const Element *frame) const
Definition Element.cxx:40
ParameterVector & parameterVector(ParameterClass iclass)
Definition Element.cxx:19
ElementModel::ParameterVector ParameterVector
Definition Element.h:54
double getParameter(ParameterClass iclass, ipar_t ipar) const
Definition Element.cxx:59
ElementModel::ipar_t ipar_t
Definition Element.h:55
STL namespace.