34 xercesc::XMLPlatformUtils::Initialize();
44 G4String preFatalCode;
51 xercesc::XercesDOMParser parser;
52 parser.setDoNamespaces(
false);
53 parser.setDoSchema(
false);
54 parser.setCreateEntityReferenceNodes(
false);
57 parser.parse(path.c_str());
58 }
catch (
const xercesc::XMLException& e) {
59 preFatalCode =
"G4OCCT_SDReader003";
60 preFatalMsg =
"XML error parsing '" + path +
"': " + Transcode(e.getMessage());
62 }
catch (
const xercesc::DOMException& e) {
63 preFatalCode =
"G4OCCT_SDReader004";
64 preFatalMsg =
"DOM error parsing '" + path +
"': " + Transcode(e.getMessage());
68 const xercesc::DOMDocument*
const doc = parser.getDocument();
70 preFatalCode =
"G4OCCT_SDReader005";
71 preFatalMsg =
"Cannot open document: " + path;
75 const xercesc::DOMElement*
const root = doc->getDocumentElement();
77 preFatalCode =
"G4OCCT_SDReader006";
78 preFatalMsg =
"Empty document: " + path;
82 const G4String rootTag = Transcode(root->getTagName());
83 if (rootTag !=
"sensitive_detector_map") {
84 preFatalCode =
"G4OCCT_SDReader007";
86 "Root element must be <sensitive_detector_map>, got <" + rootTag +
"> in '" + path +
"'";
90 for (xercesc::DOMNode* node = root->getFirstChild(); node !=
nullptr;
91 node = node->getNextSibling()) {
92 if (node->getNodeType() != xercesc::DOMNode::ELEMENT_NODE) {
95 const auto* child =
dynamic_cast<const xercesc::DOMElement*
>(node);
99 if (Transcode(child->getTagName()) !=
"volume") {
105 const xercesc::DOMNamedNodeMap* attrs = child->getAttributes();
106 for (XMLSize_t i = 0; i < attrs->getLength(); ++i) {
107 const auto* attr =
dynamic_cast<const xercesc::DOMAttr*
>(attrs->item(i));
111 const G4String aName = Transcode(attr->getName());
112 const G4String aValue = Transcode(attr->getValue());
113 if (aName ==
"name") {
115 }
else if (aName ==
"sensDet") {
120 if (volumeName.empty()) {
121 G4Exception(
"G4OCCTSensitiveDetectorMapReader::ReadFile",
"G4OCCT_SDReader000",
123 (
"<volume> element in '" + path +
"' is missing the required 'name' attribute.")
128 if (sdName.empty()) {
129 G4Exception(
"G4OCCTSensitiveDetectorMapReader::ReadFile",
"G4OCCT_SDReader001",
131 (
"<volume name=\"" + volumeName +
"\"> in '" + path +
132 "' is missing the required 'sensDet' attribute.")
137 G4VSensitiveDetector* sd =
138 G4SDManager::GetSDMpointer()->FindSensitiveDetector(sdName,
false);
140 G4Exception(
"G4OCCTSensitiveDetectorMapReader::ReadFile",
"G4OCCT_SDReader002",
142 (
"Sensitive detector '" + sdName +
"' (volume pattern '" + volumeName +
143 "') not found in G4SDManager. Ensure all SDs are registered before "
144 "calling ReadFile().")
149 result.
Add(volumeName, sd);
153 xercesc::XMLPlatformUtils::Terminate();
155 if (!preFatalCode.empty()) {
156 G4Exception(
"G4OCCTSensitiveDetectorMapReader::ReadFile", preFatalCode.c_str(), FatalException,
157 preFatalMsg.c_str());