1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
#ifndef DETECTOR_DESCRIPTION_DD_NAMESPACE_H
#define DETECTOR_DESCRIPTION_DD_NAMESPACE_H
#include "XML/XML.h"
#include "DD4hep/Objects.h"
#include "DD4hep/Shapes.h"
#include "DD4hep/Volumes.h"
#include <unordered_map>
#include <vector>
namespace cms {
namespace rotation_utils {
std::string rotHash(const Double_t* rot);
std::string rotHash(const dd4hep::Rotation3D& rot);
double roundBinary(double value);
} // namespace rotation_utils
class DDParsingContext;
using DDVectorsMap = std::unordered_map<std::string, std::vector<double>>;
class DDNamespace {
public:
DDNamespace(DDParsingContext*, xml_h);
DDNamespace(DDParsingContext&, xml_h, bool);
DDNamespace(DDParsingContext*);
DDNamespace(DDParsingContext&);
~DDNamespace();
DDNamespace() = delete;
DDNamespace(const DDNamespace&) = delete;
DDNamespace& operator=(const DDNamespace&) = delete;
std::string prepend(const std::string&) const;
std::string realName(const std::string&) const;
static std::string objName(const std::string&);
static std::string nsName(const std::string&);
template <typename T>
T attr(xml_elt_t element, const xml_tag_t& name) const {
std::string val = realName(element.attr<std::string>(name));
element.setAttr(name, val);
return element.attr<T>(name);
}
template <typename T>
T attr(xml_elt_t element, const xml_tag_t& name, T defaultValue) const {
if (element.hasAttr(name)) {
std::string val = realName(element.attr<std::string>(name));
element.setAttr(name, val);
return element.attr<T>(name);
}
return defaultValue;
}
void addConstant(const std::string& name, const std::string& value, const std::string& type) const;
void addConstantNS(const std::string& name, const std::string& value, const std::string& type) const;
dd4hep::Material material(const std::string& name) const;
dd4hep::Solid solid(const std::string& name) const;
dd4hep::Solid addSolid(const std::string& name, dd4hep::Solid solid) const;
dd4hep::Solid addSolidNS(const std::string& name, dd4hep::Solid solid) const;
dd4hep::Assembly assembly(const std::string& name, bool exception = true) const;
dd4hep::Assembly addAssembly(dd4hep::Assembly asmb, bool addSolid = true) const;
dd4hep::Assembly addAssemblySolid(dd4hep::Assembly assembly) const;
dd4hep::Volume volume(const std::string& name, bool exc = true) const;
dd4hep::Volume addVolume(dd4hep::Volume vol) const;
dd4hep::Volume addVolumeNS(dd4hep::Volume vol) const;
const dd4hep::Rotation3D& rotation(const std::string& name) const;
void addRotation(const std::string& name, const dd4hep::Rotation3D& rot) const;
DDParsingContext* const context() const { return m_context; }
DDParsingContext* setContext() { return m_context; }
std::string_view name() const { return m_name; }
std::string noNamespace(const std::string&) const;
std::vector<double> vecDbl(const std::string& name) const;
std::vector<float> vecFloat(const std::string& name) const;
private:
DDParsingContext* m_context = nullptr;
std::string m_name;
bool m_pop = false;
};
} // namespace cms
#define NAMESPACE_SEP ':'
#endif
|