Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-09-08 09:27:57

0001 //!    \file Middleware.h
0002 //!    \brief Declares the class for converting files from DOM to a VecGeom volume and back
0003 //!
0004 //!    \authors Author:  Dmitry Savin <sd57@protonmail.ch>
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 // class UnplacedOrb;
0038 // class UnplacedBox;
0039 } // namespace VECGEOM_IMPL_NAMESPACE
0040 } // namespace vecgeom
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   /// Return map of GDML material name to material data
0055   MaterialMap_t const &GetMaterialMap() const { return materialMap; }
0056 
0057   /// Return map of VecGeom LogicalVolume Id to GDML material
0058   VolumeMatMap_t const &GetVolumeMatMap() const { return volumeMaterialMap; }
0059 
0060   /// Return map of VecGeom LogicalVolume Id to GDML material
0061   VolumeMap_t const &GetVolumeMap() const { return volumeMap; }
0062 
0063   /// Return map of VecGeom LogicalVolume Id to list of GDML auxiliary tags for that volume
0064   VolumeAuxiliaryInfo_t const &GetVolumeAuxiliaryInfo() const { return volumeAuxiliaryInfo; }
0065 
0066   /// Return list of auxiliary tags in GDML userinfo tag
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;                 ///< map of material name to a material record
0157   VolumeMatMap_t volumeMaterialMap;          ///< map of VecGeom logical volume id to a material record
0158   VolumeMap_t volumeMap;                     ///< map of logical volume name to logical volume pointer
0159   VolumeAuxiliaryInfo_t volumeAuxiliaryInfo; ///< map of VecGeom logical volume id to a list of auxiliary tags
0160   UserInfo_t userInfo;                       ///< list of auxiliary tags in userinfo
0161 
0162   double GetDoubleAttribute(std::string const &attrName,
0163                             XERCES_CPP_NAMESPACE_QUALIFIER DOMNamedNodeMap const *theAttributes);
0164 };
0165 } // namespace vgdml
0166 #endif