File indexing completed on 2026-09-08 09:27:57
0001
0002
0003
0004
0005
0006
0007 #pragma once
0008
0009 #ifndef VGDMLMiddleware_h
0010 #define VGDMLMiddleware_h
0011
0012 #include <string>
0013 #include <vector>
0014 #include <map>
0015
0016 #include "xercesc/util/XercesDefs.hpp"
0017
0018 #include "VecGeom/volumes/UnplacedVolume.h"
0019 #include "VecGeom/volumes/BooleanStruct.h"
0020 #include "VecGeom/volumes/LogicalVolume.h"
0021
0022 #include "Auxiliary.h"
0023 #include "MaterialInfo.h"
0024 #include "RegionInfo.h"
0025
0026 XERCES_CPP_NAMESPACE_BEGIN
0027 class DOMDocument;
0028 class DOMLSParser;
0029 class DOMNode;
0030 class DOMNamedNodeMap;
0031 XERCES_CPP_NAMESPACE_END
0032
0033 namespace vecgeom {
0034 inline namespace VECGEOM_IMPL_NAMESPACE {
0035 class VUnplacedVolume;
0036 class UnplacedTessellated;
0037
0038
0039 }
0040 }
0041
0042 namespace vgdml {
0043 class Middleware {
0044 public:
0045 using MaterialMap_t = std::map<std::string, vgdml::Material>;
0046 using VolumeMatMap_t = std::map<int, vgdml::Material>;
0047 using VolumeMap_t = std::map<std::string, vecgeom::LogicalVolume *>;
0048 using VolumeAuxiliaryInfo_t = std::map<int, std::vector<Auxiliary>>;
0049 using UserInfo_t = std::vector<Auxiliary>;
0050
0051 bool Load(XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument const *aDOMDocument);
0052 XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument *Save(void const *);
0053
0054
0055 MaterialMap_t const &GetMaterialMap() const { return materialMap; }
0056
0057
0058 VolumeMatMap_t const &GetVolumeMatMap() const { return volumeMaterialMap; }
0059
0060
0061 VolumeMap_t const &GetVolumeMap() const { return volumeMap; }
0062
0063
0064 VolumeAuxiliaryInfo_t const &GetVolumeAuxiliaryInfo() const { return volumeAuxiliaryInfo; }
0065
0066
0067 UserInfo_t const &GetUserInfo() const { return userInfo; }
0068
0069 private:
0070 bool processNode(XERCES_CPP_NAMESPACE_QUALIFIER DOMNode const *aDOMNode);
0071 bool processSolid(XERCES_CPP_NAMESPACE_QUALIFIER DOMNode const *aDOMNode);
0072 bool processLogicVolume(XERCES_CPP_NAMESPACE_QUALIFIER DOMNode const *aDOMNode);
0073 bool processPhysicalVolume(XERCES_CPP_NAMESPACE_QUALIFIER DOMNode const *aDOMNode,
0074 vecgeom::LogicalVolume *motherLogical);
0075 bool processWorld(XERCES_CPP_NAMESPACE_QUALIFIER DOMNode const *aDOMNode);
0076 bool processConstant(XERCES_CPP_NAMESPACE_QUALIFIER DOMNode const *aDOMNode);
0077 bool processPosition(XERCES_CPP_NAMESPACE_QUALIFIER DOMNode const *aDOMNode);
0078 bool processScale(XERCES_CPP_NAMESPACE_QUALIFIER DOMNode const *aDOMNode);
0079 bool processRotation(XERCES_CPP_NAMESPACE_QUALIFIER DOMNode const *aDOMNode);
0080
0081 bool processIsotope(XERCES_CPP_NAMESPACE_QUALIFIER DOMNode const *aDOMNode);
0082 bool processElement(XERCES_CPP_NAMESPACE_QUALIFIER DOMNode const *aDOMNode);
0083 bool processMaterial(XERCES_CPP_NAMESPACE_QUALIFIER DOMNode const *aDOMNode);
0084 bool processAuxiliary(XERCES_CPP_NAMESPACE_QUALIFIER DOMNode const *aDOMNode, Auxiliary &aux);
0085 bool processUserInfo(XERCES_CPP_NAMESPACE_QUALIFIER DOMNode const *aDOMNode);
0086
0087 bool processFacet(XERCES_CPP_NAMESPACE_QUALIFIER DOMNode const *aDOMNode,
0088 vecgeom::VECGEOM_IMPL_NAMESPACE::UnplacedTessellated &storage);
0089 template <vecgeom::BooleanOperation Op>
0090 vecgeom::VECGEOM_IMPL_NAMESPACE::VUnplacedVolume const *processBoolean(
0091 XERCES_CPP_NAMESPACE_QUALIFIER DOMNode const *aDOMNode);
0092 vecgeom::VECGEOM_IMPL_NAMESPACE::VUnplacedVolume const *processMultiUnion(
0093 XERCES_CPP_NAMESPACE_QUALIFIER DOMNode const *aDOMNode);
0094 vecgeom::VECGEOM_IMPL_NAMESPACE::VPlacedVolume const *processMultiUnionNode(
0095 XERCES_CPP_NAMESPACE_QUALIFIER DOMNode const *aDOMNode);
0096
0097 vecgeom::VECGEOM_IMPL_NAMESPACE::VUnplacedVolume const *processOrb(
0098 XERCES_CPP_NAMESPACE_QUALIFIER DOMNode const *aDOMNode);
0099 const vecgeom::VECGEOM_IMPL_NAMESPACE::VUnplacedVolume *processBox(
0100 XERCES_CPP_NAMESPACE_QUALIFIER DOMNode const *aDOMNode);
0101 const vecgeom::VECGEOM_IMPL_NAMESPACE::VUnplacedVolume *processTube(
0102 XERCES_CPP_NAMESPACE_QUALIFIER DOMNode const *aDOMNode);
0103 const vecgeom::VECGEOM_IMPL_NAMESPACE::VUnplacedVolume *processElTube(
0104 XERCES_CPP_NAMESPACE_QUALIFIER DOMNode const *aDOMNode);
0105 const vecgeom::VECGEOM_IMPL_NAMESPACE::VUnplacedVolume *processCutTube(
0106 XERCES_CPP_NAMESPACE_QUALIFIER DOMNode const *aDOMNode);
0107 const vecgeom::VECGEOM_IMPL_NAMESPACE::VUnplacedVolume *processCone(
0108 XERCES_CPP_NAMESPACE_QUALIFIER DOMNode const *aDOMNode);
0109 const vecgeom::VECGEOM_IMPL_NAMESPACE::VUnplacedVolume *processElCone(
0110 XERCES_CPP_NAMESPACE_QUALIFIER DOMNode const *aDOMNode);
0111 const vecgeom::VECGEOM_IMPL_NAMESPACE::VUnplacedVolume *processPolycone(
0112 XERCES_CPP_NAMESPACE_QUALIFIER DOMNode const *aDOMNode);
0113 const vecgeom::VECGEOM_IMPL_NAMESPACE::VUnplacedVolume *processGenPolycone(
0114 XERCES_CPP_NAMESPACE_QUALIFIER DOMNode const *aDOMNode);
0115 const vecgeom::VECGEOM_IMPL_NAMESPACE::VUnplacedVolume *processPolyhedron(
0116 XERCES_CPP_NAMESPACE_QUALIFIER DOMNode const *aDOMNode);
0117 const vecgeom::VECGEOM_IMPL_NAMESPACE::VUnplacedVolume *processTorus(
0118 XERCES_CPP_NAMESPACE_QUALIFIER DOMNode const *aDOMNode);
0119 const vecgeom::VECGEOM_IMPL_NAMESPACE::VUnplacedVolume *processSphere(
0120 XERCES_CPP_NAMESPACE_QUALIFIER DOMNode const *aDOMNode);
0121 const vecgeom::VECGEOM_IMPL_NAMESPACE::VUnplacedVolume *processEllipsoid(
0122 XERCES_CPP_NAMESPACE_QUALIFIER DOMNode const *aDOMNode);
0123 const vecgeom::VECGEOM_IMPL_NAMESPACE::VUnplacedVolume *processParallelepiped(
0124 XERCES_CPP_NAMESPACE_QUALIFIER DOMNode const *aDOMNode);
0125 const vecgeom::VECGEOM_IMPL_NAMESPACE::VUnplacedVolume *processTrd(
0126 XERCES_CPP_NAMESPACE_QUALIFIER DOMNode const *aDOMNode);
0127 const vecgeom::VECGEOM_IMPL_NAMESPACE::VUnplacedVolume *processTrapezoid(
0128 XERCES_CPP_NAMESPACE_QUALIFIER DOMNode const *aDOMNode);
0129 const vecgeom::VECGEOM_IMPL_NAMESPACE::VUnplacedVolume *processGenTrap(
0130 XERCES_CPP_NAMESPACE_QUALIFIER DOMNode const *aDOMNode);
0131 const vecgeom::VECGEOM_IMPL_NAMESPACE::VUnplacedVolume *processParaboloid(
0132 XERCES_CPP_NAMESPACE_QUALIFIER DOMNode const *aDOMNode);
0133 const vecgeom::VECGEOM_IMPL_NAMESPACE::VUnplacedVolume *processHype(
0134 XERCES_CPP_NAMESPACE_QUALIFIER DOMNode const *aDOMNode);
0135 const vecgeom::VECGEOM_IMPL_NAMESPACE::VUnplacedVolume *processTesselated(
0136 XERCES_CPP_NAMESPACE_QUALIFIER DOMNode const *aDOMNode);
0137 const vecgeom::VECGEOM_IMPL_NAMESPACE::VUnplacedVolume *processExtruded(
0138 XERCES_CPP_NAMESPACE_QUALIFIER DOMNode const *aDOMNode);
0139 const vecgeom::VECGEOM_IMPL_NAMESPACE::VUnplacedVolume *processTet(
0140 XERCES_CPP_NAMESPACE_QUALIFIER DOMNode const *aDOMNode);
0141 const vecgeom::VECGEOM_IMPL_NAMESPACE::VUnplacedVolume *processScaledShape(
0142 XERCES_CPP_NAMESPACE_QUALIFIER DOMNode const *aDOMNode);
0143
0144 double GetLengthMultiplier(XERCES_CPP_NAMESPACE_QUALIFIER DOMNode const *aDOMNode);
0145 double GetAngleMultiplier(XERCES_CPP_NAMESPACE_QUALIFIER DOMNode const *aDOMNode);
0146
0147 private:
0148 std::map<std::string, vecgeom::VECGEOM_IMPL_NAMESPACE::VUnplacedVolume const *> unplacedVolumeMap;
0149 std::map<std::string, double> constantMap;
0150 std::map<std::string, vecgeom::VECGEOM_IMPL_NAMESPACE::Vector3D<double>> positionMap;
0151 std::map<std::string, vecgeom::VECGEOM_IMPL_NAMESPACE::Vector3D<double>> scaleMap;
0152 std::map<std::string, vecgeom::VECGEOM_IMPL_NAMESPACE::Vector3D<double>> rotationMap;
0153 std::map<std::string, vgdml::Isotope> isotopeMap;
0154 std::map<std::string, vgdml::Element> elementMap;
0155
0156 MaterialMap_t materialMap;
0157 VolumeMatMap_t volumeMaterialMap;
0158 VolumeMap_t volumeMap;
0159 VolumeAuxiliaryInfo_t volumeAuxiliaryInfo;
0160 UserInfo_t userInfo;
0161
0162 double GetDoubleAttribute(std::string const &attrName,
0163 XERCES_CPP_NAMESPACE_QUALIFIER DOMNamedNodeMap const *theAttributes);
0164 };
0165 }
0166 #endif