File indexing completed on 2024-04-06 12:05:27
0001 #ifndef DETECTOR_DESCRIPTION_DD_NAMESPACE_H
0002 #define DETECTOR_DESCRIPTION_DD_NAMESPACE_H
0003
0004 #include "XML/XML.h"
0005 #include "DD4hep/Objects.h"
0006 #include "DD4hep/Shapes.h"
0007 #include "DD4hep/Volumes.h"
0008 #include <unordered_map>
0009 #include <vector>
0010
0011 namespace cms {
0012
0013 namespace rotation_utils {
0014 std::string rotHash(const Double_t* rot);
0015 std::string rotHash(const dd4hep::Rotation3D& rot);
0016 double roundBinary(double value);
0017 }
0018
0019 class DDParsingContext;
0020 using DDVectorsMap = std::unordered_map<std::string, std::vector<double>>;
0021
0022 class DDNamespace {
0023 public:
0024 DDNamespace(DDParsingContext*, xml_h);
0025 DDNamespace(DDParsingContext&, xml_h, bool);
0026 DDNamespace(DDParsingContext*);
0027 DDNamespace(DDParsingContext&);
0028 ~DDNamespace();
0029
0030 DDNamespace() = delete;
0031 DDNamespace(const DDNamespace&) = delete;
0032 DDNamespace& operator=(const DDNamespace&) = delete;
0033
0034 std::string prepend(const std::string&) const;
0035 std::string realName(const std::string&) const;
0036 static std::string objName(const std::string&);
0037 static std::string nsName(const std::string&);
0038
0039 template <typename T>
0040 T attr(xml_elt_t element, const xml_tag_t& name) const {
0041 std::string val = realName(element.attr<std::string>(name));
0042 element.setAttr(name, val);
0043 return element.attr<T>(name);
0044 }
0045
0046 template <typename T>
0047 T attr(xml_elt_t element, const xml_tag_t& name, T defaultValue) const {
0048 if (element.hasAttr(name)) {
0049 std::string val = realName(element.attr<std::string>(name));
0050 element.setAttr(name, val);
0051 return element.attr<T>(name);
0052 }
0053 return defaultValue;
0054 }
0055
0056 void addConstant(const std::string& name, const std::string& value, const std::string& type) const;
0057 void addConstantNS(const std::string& name, const std::string& value, const std::string& type) const;
0058
0059 dd4hep::Material material(const std::string& name) const;
0060
0061 dd4hep::Solid solid(const std::string& name) const;
0062 dd4hep::Solid addSolid(const std::string& name, dd4hep::Solid solid) const;
0063 dd4hep::Solid addSolidNS(const std::string& name, dd4hep::Solid solid) const;
0064
0065 dd4hep::Assembly assembly(const std::string& name, bool exception = true) const;
0066 dd4hep::Assembly addAssembly(dd4hep::Assembly asmb, bool addSolid = true) const;
0067 dd4hep::Assembly addAssemblySolid(dd4hep::Assembly assembly) const;
0068
0069 dd4hep::Volume volume(const std::string& name, bool exc = true) const;
0070 dd4hep::Volume addVolume(dd4hep::Volume vol) const;
0071 dd4hep::Volume addVolumeNS(dd4hep::Volume vol) const;
0072
0073 const dd4hep::Rotation3D& rotation(const std::string& name) const;
0074 void addRotation(const std::string& name, const dd4hep::Rotation3D& rot) const;
0075
0076 DDParsingContext* const context() const { return m_context; }
0077 DDParsingContext* setContext() { return m_context; }
0078
0079 std::string_view name() const { return m_name; }
0080 std::string noNamespace(const std::string&) const;
0081
0082 std::vector<double> vecDbl(const std::string& name) const;
0083 std::vector<float> vecFloat(const std::string& name) const;
0084
0085 private:
0086 DDParsingContext* m_context = nullptr;
0087 std::string m_name;
0088 bool m_pop = false;
0089 };
0090 }
0091
0092 #define NAMESPACE_SEP ':'
0093
0094 #endif