File indexing completed on 2025-06-06 08:34:41
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014 #ifndef DDCORE_SRC_PLUGINS_LCDDCONVERTER_H
0015 #define DDCORE_SRC_PLUGINS_LCDDCONVERTER_H
0016
0017
0018 #include <DD4hep/Detector.h>
0019 #include <DD4hep/GeoHandler.h>
0020 #include <DD4hep/DetFactoryHelper.h>
0021
0022
0023 #include <set>
0024 #include <map>
0025
0026
0027 class TGeoVolume;
0028 class TGeoElement;
0029 class TGeoShape;
0030 class TGeoMedium;
0031 class TGeoNode;
0032 class TGeoMatrix;
0033
0034
0035 namespace dd4hep {
0036
0037
0038 namespace detail {
0039
0040
0041 class SensitiveDetectorObject;
0042
0043
0044
0045
0046
0047
0048
0049 class LCDDConverter: public GeoHandler {
0050 public:
0051 typedef xml::XmlElement XmlElement;
0052 typedef std::map<Atom, XmlElement*> ElementMap;
0053 typedef std::map<Material, XmlElement*> MaterialMap;
0054 typedef std::map<LimitSet, XmlElement*> LimitMap;
0055 typedef std::map<PlacedVolume, XmlElement*> PlacementMap;
0056 typedef std::map<Region, XmlElement*> RegionMap;
0057 typedef std::map<SensitiveDetector, XmlElement*> SensDetMap;
0058 typedef std::map<Volume, XmlElement*> VolumeMap;
0059 typedef std::map<IDDescriptor, XmlElement*> IdSpecMap;
0060 typedef std::map<VisAttr, XmlElement*> VisMap;
0061 typedef std::map<const TGeoShape*, XmlElement*> SolidMap;
0062 typedef std::map<OverlayedField, XmlElement*> FieldMap;
0063 typedef std::map<const TGeoMatrix*, XmlElement*> TrafoMap;
0064
0065
0066
0067
0068
0069
0070 class GeometryInfo: public GeoHandler::GeometryInfo {
0071 public:
0072 ElementMap xmlElements;
0073 MaterialMap xmlMaterials;
0074 SolidMap xmlSolids;
0075 VolumeMap xmlVolumes;
0076 PlacementMap xmlPlacements;
0077 RegionMap xmlRegions;
0078 VisMap xmlVis;
0079 LimitMap xmlLimits;
0080 IdSpecMap xmlIdSpecs;
0081 SensDetMap xmlSensDets;
0082 TrafoMap xmlPositions;
0083 TrafoMap xmlRotations;
0084 FieldMap xmlFields;
0085 std::set<SensitiveDetector> sensitives;
0086 std::set<Region> regions;
0087 std::set<LimitSet> limits;
0088
0089 typedef std::map<std::string, const TNamed*> CheckIter;
0090 struct _checks {
0091 std::map<std::string, const TNamed*> positions, rotations, volumes, solids, materials;
0092 };
0093 mutable _checks checks;
0094 void check(const std::string& name, const TNamed* n, std::map<std::string, const TNamed*>& array) const;
0095 void checkPosition(const std::string& name, const TNamed* n) const {
0096 check(name, n, checks.positions);
0097 }
0098 void checkRotation(const std::string& name, const TNamed* n) const {
0099 check(name, n, checks.rotations);
0100 }
0101 void checkVolume(const std::string& name, const TNamed* n) const {
0102 check(name, n, checks.volumes);
0103 }
0104 void checkShape(const std::string& name, const TNamed* n) const {
0105 check(name, n, checks.solids);
0106 }
0107 void checkMaterial(const std::string& name, Material n) const {
0108 check(name, n.ptr(), checks.materials);
0109 }
0110
0111 xml_doc_t doc;
0112 xml_h identity_rot, identity_pos;
0113 xml_elt_t doc_root, doc_header, doc_idDict, doc_detectors, doc_limits, doc_regions, doc_display, doc_gdml, doc_fields,
0114 doc_define, doc_materials, doc_solids, doc_structure, doc_setup;
0115 GeometryInfo();
0116 };
0117 typedef std::set<std::string> NameSet;
0118
0119
0120 Detector& m_detDesc;
0121 mutable NameSet m_checkNames;
0122 GeometryInfo* m_dataPtr;
0123
0124 GeometryInfo& data() const {
0125 return *m_dataPtr;
0126 }
0127
0128
0129 void checkVolumes(const std::string& name, Volume volume) const;
0130
0131
0132 LCDDConverter(Detector& description);
0133
0134
0135 virtual ~LCDDConverter();
0136
0137
0138 xml_doc_t createGDML(DetElement top);
0139
0140
0141 xml_doc_t createDetector(DetElement top);
0142
0143
0144 xml_doc_t createVis(DetElement top);
0145
0146
0147 virtual void handleHeader() const;
0148
0149
0150 virtual xml_h handleMaterial(const std::string& name, Material medium) const;
0151
0152
0153 virtual xml_h handleElement(const std::string& name, Atom element) const;
0154
0155
0156 virtual xml_h handleSolid(const std::string& name, const TGeoShape* volume) const;
0157
0158
0159 virtual xml_h handleVolume(const std::string& name, Volume volume) const;
0160 virtual xml_h handleVolumeVis(const std::string& name, const TGeoVolume* volume) const;
0161 virtual void collectVolume(const std::string& name, const TGeoVolume* volume) const;
0162
0163
0164 virtual xml_h handlePlacement(const std::string& name, PlacedVolume node) const;
0165
0166
0167
0168
0169
0170 virtual xml_h handleRegion(const std::string& name, Region region) const;
0171
0172
0173 virtual xml_h handleVis(const std::string& name, VisAttr vis) const;
0174
0175
0176 virtual xml_h handleIdSpec(const std::string& name, IDDescriptor idspec) const;
0177
0178
0179 virtual xml_h handleLimitSet(const std::string& name, LimitSet limitset) const;
0180
0181
0182 virtual xml_h handleSensitive(const std::string& name, SensitiveDetector sens_det) const;
0183
0184
0185 virtual xml_h handleSegmentation(Segmentation seg) const;
0186
0187
0188 virtual xml_h handlePosition(const std::string& name, const TGeoMatrix* trafo) const;
0189
0190
0191 virtual xml_h handleRotation(const std::string& name, const TGeoMatrix* trafo) const;
0192
0193
0194 virtual xml_h handleField(const std::string& name, OverlayedField field) const;
0195
0196
0197 void handleProperties(Detector::Properties& prp) const;
0198 };
0199 }
0200 }
0201 #endif