Back to home page

EIC code displayed by LXR

 
 

    


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     In [3]: 1240./800./1e6
0038     Out[3]: 1.55e-06
0039     In [4]: 1240./80./1e6 
0040     Out[4]: 1.55e-05
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    <matrix coldim="2" name="bisMSBTIMECONSTANT0x6833de0" values="-1 1.4 1 1.4"/>
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         //xercesc::DOMElement* gdml = doc->getDocumentElement();
0088     }
0089 
0090 #if XERCES_VERSION_MAJOR >= 3
0091                                              // DOM L3 as per Xerces 3.0 API
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                                             // DOM L3 as per Xerces 3.0 API
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 }