File indexing completed on 2024-04-06 12:05:25
0001 #include "DetectorDescription/Core/interface/DDCompactView.h"
0002
0003 #include <cstdlib>
0004
0005 #include "DetectorDescription/Core/interface/DDRotationMatrix.h"
0006 #include "DetectorDescription/Core/interface/DDBase.h"
0007 #include "DetectorDescription/Core/interface/DDCompactViewImpl.h"
0008 #include "DetectorDescription/Core/interface/DDLogicalPart.h"
0009 #include "DetectorDescription/Core/interface/DDMaterial.h"
0010 #include "DetectorDescription/Core/interface/DDPosData.h"
0011 #include "DetectorDescription/Core/interface/DDSolid.h"
0012 #include "DetectorDescription/Core/interface/DDSpecifics.h"
0013 #include "DetectorDescription/Core/interface/DDVector.h"
0014 #include "DetectorDescription/Core/interface/LogicalPart.h"
0015 #include "DetectorDescription/Core/interface/Material.h"
0016 #include "DetectorDescription/Core/interface/Solid.h"
0017 #include "DetectorDescription/Core/interface/Specific.h"
0018
0019 class DDDivision;
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038 DDCompactView::DDCompactView(const DDLogicalPart& rootnodedata)
0039 : rep_(std::make_unique<DDCompactViewImpl>(rootnodedata)),
0040 worldpos_(std::make_unique<DDPosData>(DDTranslation(), DDRotation(), 0)) {}
0041
0042 DDCompactView::DDCompactView(const DDName& name) {
0043 DDMaterial::StoreT::instance().setReadOnly(false);
0044 DDSolid::StoreT::instance().setReadOnly(false);
0045 DDLogicalPart::StoreT::instance().setReadOnly(false);
0046 DDSpecifics::StoreT::instance().setReadOnly(false);
0047 DDRotation::StoreT::instance().setReadOnly(false);
0048 rep_ = std::make_unique<DDCompactViewImpl>(DDLogicalPart(name));
0049 worldpos_ = std::make_unique<DDPosData>(DDTranslation(), DDRotation(), 0);
0050 }
0051
0052 DDCompactView::~DDCompactView() = default;
0053
0054
0055
0056
0057
0058
0059 const DDCompactView::Graph& DDCompactView::graph() const { return rep_->graph(); }
0060
0061 DDCompactView::GraphWalker DDCompactView::walker() const { return rep_->walker(); }
0062
0063 const DDLogicalPart& DDCompactView::root() const { return rep_->root(); }
0064
0065 const DDPosData* DDCompactView::worldPosition() const { return worldpos_.get(); }
0066
0067 const std::vector<double>& DDCompactView::vector(std::string_view iKey) const {
0068 auto itFind = vectors_.find(std::string(iKey));
0069 if (itFind != vectors_.end()) {
0070 return itFind->second;
0071 }
0072 static const std::vector<double> s_empty;
0073 return s_empty;
0074 }
0075
0076 void DDCompactView::position(const DDLogicalPart& self,
0077 const DDLogicalPart& parent,
0078 const std::string& copyno,
0079 const DDTranslation& trans,
0080 const DDRotation& rot,
0081 const DDDivision* div) {
0082 int cpno = atoi(copyno.c_str());
0083 position(self, parent, cpno, trans, rot, div);
0084 }
0085
0086 void DDCompactView::position(const DDLogicalPart& self,
0087 const DDLogicalPart& parent,
0088 int copyno,
0089 const DDTranslation& trans,
0090 const DDRotation& rot,
0091 const DDDivision* div) {
0092 rep_->position(self, parent, copyno, trans, rot, div);
0093 }
0094
0095
0096 void DDCompactView::setRoot(const DDLogicalPart& root) { rep_->setRoot(root); }
0097
0098 void DDCompactView::swap(DDCompactView& repToSwap) { rep_->swap(*(repToSwap.rep_)); }
0099
0100 DDCompactView::DDCompactView()
0101 : rep_(std::make_unique<DDCompactViewImpl>()),
0102 worldpos_(std::make_unique<DDPosData>(DDTranslation(), DDRotation(), 0)) {}
0103
0104 void DDCompactView::lockdown() {
0105
0106
0107 DDMaterial::StoreT::instance().swap(matStore_);
0108 DDSolid::StoreT::instance().swap(solidStore_);
0109 DDLogicalPart::StoreT::instance().swap(lpStore_);
0110 DDSpecifics::StoreT::instance().swap(specStore_);
0111 DDRotation::StoreT::instance().swap(rotStore_);
0112
0113
0114 DDVector::iterator<DDVector> vit;
0115 DDVector::iterator<DDVector> ved(DDVector::end());
0116
0117 for (; vit != ved; ++vit) {
0118 if (vit->isDefined().second) {
0119 DDName vname(vit->name());
0120 vectors_.emplace(vname.name(), vit->values());
0121 }
0122 }
0123
0124
0125
0126
0127
0128 DDMaterial::StoreT::instance().setReadOnly(false);
0129 DDSolid::StoreT::instance().setReadOnly(false);
0130 DDLogicalPart::StoreT::instance().setReadOnly(false);
0131 DDSpecifics::StoreT::instance().setReadOnly(false);
0132 DDRotation::StoreT::instance().setReadOnly(false);
0133 }