Dear Geant4 developers, We have several optical properties are truncated in the output of GDML due to the size of the values is greater than 10000: * https://geant4.kek.jp/lxr/source/persistency/gdml/include/G4GDMLWrite.hh#L135 * https://geant4.kek.jp/lxr/source/persistency/gdml/src/G4GDMLWrite.cc#L158 To avoid such truncated, it would be better to use another "transcode" method: https://xerces.apache.org/xerces-c/apiDocs-3/classXMLString.html#a0f2f01d4ff14825e65bec0b709a401e2 My changes are attached at the end. Thank you! Tao Lin Here are my changes to the source code using "diff -ur": --- source/persistency/gdml/include/G4GDMLWrite.hh.old 2021-02-23 17:47:11.667478445 +0800 +++ source/persistency/gdml/include/G4GDMLWrite.hh 2021-02-23 17:47:37.016846762 +0800 @@ -132,7 +132,7 @@ xercesc::DOMDocument* doc = nullptr; xercesc::DOMElement* extElement = nullptr; xercesc::DOMElement* userinfoElement = nullptr; - XMLCh tempStr[10000]; + G4GDMLAuxListType auxList; G4bool overwriteOutputFile = false; }; --- source/persistency/gdml/src/G4GDMLWrite.cc.old 2021-02-23 17:47:03.943366217 +0800 +++ source/persistency/gdml/src/G4GDMLWrite.cc 2021-02-23 17:54:11.249575039 +0800 @@ -155,10 +155,15 @@ xercesc::DOMAttr* G4GDMLWrite::NewAttribute(const G4String& name, const G4String& value) { - xercesc::XMLString::transcode(name, tempStr, 9999); + XMLCh* tempStr = NULL; + tempStr = xercesc::XMLString::transcode(name); xercesc::DOMAttr* att = doc->createAttribute(tempStr); - xercesc::XMLString::transcode(value, tempStr, 9999); + xercesc::XMLString::release(&tempStr); + + tempStr = xercesc::XMLString::transcode(value); att->setValue(tempStr); + xercesc::XMLString::release(&tempStr); + return att; } @@ -166,22 +171,32 @@ xercesc::DOMAttr* G4GDMLWrite::NewAttribute(const G4String& name, const G4double& value) { - xercesc::XMLString::transcode(name, tempStr, 9999); + XMLCh* tempStr = NULL; + tempStr = xercesc::XMLString::transcode(name); xercesc::DOMAttr* att = doc->createAttribute(tempStr); + xercesc::XMLString::release(&tempStr); + std::ostringstream ostream; ostream.precision(15); ostream << value; G4String str = ostream.str(); - xercesc::XMLString::transcode(str, tempStr, 9999); + + tempStr = xercesc::XMLString::transcode(str); att->setValue(tempStr); + xercesc::XMLString::release(&tempStr); + return att; } // -------------------------------------------------------------------- xercesc::DOMElement* G4GDMLWrite::NewElement(const G4String& name) { - xercesc::XMLString::transcode(name, tempStr, 9999); - return doc->createElement(tempStr); + XMLCh* tempStr = NULL; + tempStr = xercesc::XMLString::transcode(name); + xercesc::DOMElement* elem = doc->createElement(tempStr); + xercesc::XMLString::release(&tempStr); + + return elem; } // -------------------------------------------------------------------- @@ -212,13 +227,17 @@ VolumeMap().clear(); // The module map is global for all modules, // so clear it only at once! - xercesc::XMLString::transcode("LS", tempStr, 9999); + XMLCh* tempStr = NULL; + tempStr = xercesc::XMLString::transcode("LS"); xercesc::DOMImplementationRegistry::getDOMImplementation(tempStr); - xercesc::XMLString::transcode("Range", tempStr, 9999); + xercesc::XMLString::release(&tempStr); + tempStr = xercesc::XMLString::transcode("Range"); xercesc::DOMImplementation* impl = xercesc::DOMImplementationRegistry::getDOMImplementation(tempStr); - xercesc::XMLString::transcode("gdml", tempStr, 9999); + xercesc::XMLString::release(&tempStr); + tempStr = xercesc::XMLString::transcode("gdml"); doc = impl->createDocument(0, tempStr, 0); + xercesc::XMLString::release(&tempStr); xercesc::DOMElement* gdml = doc->getDocumentElement(); #if XERCES_VERSION_MAJOR >= 3
Thank you for spotting the problem and providing the fix. You patch is now in git master and will be part of the next release.