File indexing completed on 2026-04-09 07:49:04
0001 #include <iostream>
0002 #include <sstream>
0003 #include "GDXMLWrite.hh"
0004 #include "SLOG.hh"
0005
0006 const plog::Severity GDXMLWrite::LEVEL = SLOG::EnvLevel("GDXMLWrite", "DEBUG") ;
0007
0008 GDXMLWrite::GDXMLWrite(xercesc::DOMDocument* doc_)
0009 :
0010 doc(doc_)
0011 {
0012 }
0013
0014 GDXMLWrite::~GDXMLWrite()
0015 {
0016 }
0017
0018 xercesc::DOMElement* GDXMLWrite::NewElement(const char* tagname)
0019 {
0020 xercesc::XMLString::transcode(tagname,tempStr,9999);
0021 return doc->createElement(tempStr);
0022 }
0023
0024
0025 xercesc::DOMAttr* GDXMLWrite::NewAttribute(const char* name, const char* value)
0026 {
0027 xercesc::XMLString::transcode(name,tempStr,9999);
0028 xercesc::DOMAttr* att = doc->createAttribute(tempStr);
0029 xercesc::XMLString::transcode(value,tempStr,9999);
0030 att->setValue(tempStr);
0031 return att;
0032 }
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043 std::string GDXMLWrite::ConstantToMatrixValues(double value, double nm_lo, double nm_hi )
0044 {
0045 double mev_lo = 1240./nm_hi/1e6 ;
0046 double mev_hi = 1240./nm_lo/1e6 ;
0047
0048 std::stringstream ss ;
0049 ss
0050 << mev_lo << " " << value
0051 << " "
0052 << mev_hi << " " << value
0053 ;
0054
0055 std::string s = ss.str();
0056 return s ;
0057 }
0058
0059
0060
0061
0062
0063 xercesc::DOMElement* GDXMLWrite::ConstantToMatrixElement(const char* name, double value, double nm_lo, double nm_hi )
0064 {
0065 std::string values = ConstantToMatrixValues(value, nm_lo, nm_hi );
0066 xercesc::DOMElement* matrixElement = NewElement("matrix");
0067 matrixElement->setAttributeNode(NewAttribute("name", name));
0068 matrixElement->setAttributeNode(NewAttribute("coldim", "2"));
0069 matrixElement->setAttributeNode(NewAttribute("values", values.c_str()));
0070 return matrixElement ;
0071 }
0072
0073
0074 void GDXMLWrite::write(const char* path)
0075 {
0076 LOG(LEVEL) << path ;
0077
0078 xercesc::XMLString::transcode("LS", tempStr, 9999);
0079 xercesc::DOMImplementationRegistry::getDOMImplementation(tempStr);
0080 xercesc::XMLString::transcode("Range", tempStr, 9999);
0081 xercesc::DOMImplementation* impl = xercesc::DOMImplementationRegistry::getDOMImplementation(tempStr);
0082
0083 if( doc == nullptr )
0084 {
0085 xercesc::XMLString::transcode("gdml", tempStr, 9999);
0086 doc = impl->createDocument(0,tempStr,0);
0087
0088 }
0089
0090 #if XERCES_VERSION_MAJOR >= 3
0091
0092 xercesc::DOMLSSerializer* writer = ((xercesc::DOMImplementationLS*)impl)->createLSSerializer();
0093
0094 xercesc::DOMConfiguration *dc = writer->getDomConfig();
0095 dc->setParameter(xercesc::XMLUni::fgDOMWRTFormatPrettyPrint, true);
0096
0097 #else
0098
0099 xercesc::DOMWriter* writer = ((xercesc::DOMImplementationLS*)impl)->createDOMWriter();
0100
0101 if (writer->canSetFeature(xercesc::XMLUni::fgDOMWRTFormatPrettyPrint, true))
0102 writer->setFeature(xercesc::XMLUni::fgDOMWRTFormatPrettyPrint, true);
0103
0104 #endif
0105
0106
0107
0108 xercesc::XMLFormatTarget *myFormTarget = new xercesc::LocalFileFormatTarget(path);
0109
0110 try
0111 {
0112 #if XERCES_VERSION_MAJOR >= 3
0113
0114 xercesc::DOMLSOutput *theOutput = ((xercesc::DOMImplementationLS*)impl)->createLSOutput();
0115 theOutput->setByteStream(myFormTarget);
0116 writer->write(doc, theOutput);
0117 #else
0118 writer->writeNode(myFormTarget, *doc);
0119 #endif
0120 }
0121 catch (const xercesc::XMLException& toCatch)
0122 {
0123 char* message = xercesc::XMLString::transcode(toCatch.getMessage());
0124 std::cout << "GDXMLWrite: Exception message is: " << message << std::endl;
0125 xercesc::XMLString::release(&message);
0126 return ;
0127 }
0128 catch (const xercesc::DOMException& toCatch)
0129 {
0130 char* message = xercesc::XMLString::transcode(toCatch.msg);
0131 std::cout << "GDXMLWrite: Exception message is: " << message << std::endl;
0132 xercesc::XMLString::release(&message);
0133 return ;
0134 }
0135 catch (...)
0136 {
0137 std::cout << "GDXMLWrite: Unexpected Exception!" << std::endl;
0138 return ;
0139 }
0140
0141 delete myFormTarget;
0142 writer->release();
0143
0144
0145
0146 }