ATLAS Offline Software
Loading...
Searching...
No Matches
ReadFromXmlDom Class Reference

#include <ReadFromXmlDom.h>

Inheritance diagram for ReadFromXmlDom:
Collaboration diagram for ReadFromXmlDom:

Public Member Functions

 ReadFromXmlDom ()
 ReadFromXmlDom (const std::string &source)
std::string source () const final
std::string format () const final
bool histoDefinitionMap (std::map< std::string, SingleHistogramDefinition > &usersMap) const final
bool insertDefinition (const SingleHistogramDefinition &oneDefinition)
bool initialize () final
bool sourceExists () const final

Static Private Member Functions

static SingleHistogramDefinition parseTextLine (const std::string &line)
static SingleHistogramDefinition parseTProfileText (const std::string &line)
static SingleHistogramDefinition parseXmlElement (const xercesc::DOMElement *element)

Private Attributes

std::vector< SingleHistogramDefinitionm_vectorOfDefinitions
std::string m_source
const std::string m_format
std::map< std::string, SingleHistogramDefinitionm_histoDefinitionMap

Detailed Description

Definition at line 31 of file ReadFromXmlDom.h.

Constructor & Destructor Documentation

◆ ReadFromXmlDom() [1/2]

ReadFromXmlDom::ReadFromXmlDom ( )

Definition at line 43 of file ReadFromXmlDom.cxx.

43 : m_source("unspecified file"), m_format("text/xml") {
44}
const std::string m_format
std::string m_source

◆ ReadFromXmlDom() [2/2]

ReadFromXmlDom::ReadFromXmlDom ( const std::string & source)

Definition at line 46 of file ReadFromXmlDom.cxx.

46 :
48 m_format("text/xml")
49{
50}
static std::string find_file(const std::string &logical_file_name, const std::string &search_path)
std::string source() const final

Member Function Documentation

◆ format()

std::string ReadFromXmlDom::format ( ) const
finalvirtual

Implements IReadHistoDef.

Definition at line 58 of file ReadFromXmlDom.cxx.

58 {
59 return m_format;
60}

◆ histoDefinitionMap()

bool ReadFromXmlDom::histoDefinitionMap ( std::map< std::string, SingleHistogramDefinition > & usersMap) const
finalvirtual

Implements IReadHistoDef.

Definition at line 63 of file ReadFromXmlDom.cxx.

63 {
64 bool ok(true);
65
66 for (const auto& i:m_vectorOfDefinitions) {
67 if (i.empty()) {
68 continue;
69 }
70 if (not i.validType()) {
71 continue;
72 }
73 bool thisIsOk = (usersmap.insert(std::pair<std::string, SingleHistogramDefinition>(i.stringIndex(), i))).second;
74 if (not thisIsOk) {
75 ok &= thisIsOk;
76 std::string msg = "You have attempted to add a duplicate histogram definition: " + i.stringIndex();
77 throw std::runtime_error(msg);
78 }
79 }
80 return(ok and(not usersmap.empty()));
81}
std::vector< SingleHistogramDefinition > m_vectorOfDefinitions
MsgStream & msg
Definition testRead.cxx:32

◆ initialize()

bool ReadFromXmlDom::initialize ( )
finalvirtual

Implements IReadHistoDef.

Definition at line 92 of file ReadFromXmlDom.cxx.

92 {
93 bool ok(true);
94
95 if (m_source.empty() or(not sourceExists())) {
96 std::cerr << "Could not open file " << m_source << " in ReadFromXmlDom initialize" << std::endl;
97 return false;
98 }
99 myXerces::Lib xercesFrame; // RAII xerces context
100 static const XMLCh gLS[] = {
101 xercesc::chLatin_L, xercesc::chLatin_S, xercesc::chNull
102 };
103 xercesc::DOMImplementation* impl = xercesc::DOMImplementationRegistry::getDOMImplementation(gLS);
104 xercesc::DOMLSParser* parser = static_cast<xercesc::DOMImplementationLS*> (impl)->createLSParser(
105 xercesc::DOMImplementationLS::MODE_SYNCHRONOUS, nullptr);
106 xercesc::DOMConfiguration* config = parser->getDomConfig();
107 if (config->canSetParameter(xercesc::XMLUni::fgXercesDoXInclude, true)) {
108 config->setParameter(xercesc::XMLUni::fgXercesDoXInclude, true);
109 }
110 XIncludeErrHandler errorHandler;
111 config->setParameter(xercesc::XMLUni::fgDOMErrorHandler, &errorHandler);
112 auto *doc = parser->parseURI(m_source.c_str());
113 const XercesString temp = fromNative("h");
114 xercesc::DOMNodeList* list = doc->getElementsByTagName(temp.c_str());
115 const auto nElements = list->getLength();
116 for (unsigned long i(0); i != nElements; ++i) {
117 xercesc::DOMNode const* thisNode = list->item(i);
118 const auto *thisElement = dynamic_cast<xercesc::DOMElement const*> (thisNode);
119 if (thisElement) {
120 insertDefinition(parseXmlElement(thisElement));
121 }
122 }
123 parser->release();
124 return ok;
125}
static void errorHandler()
bool const RAWDATA *ch2 const
bool insertDefinition(const SingleHistogramDefinition &oneDefinition)
static SingleHistogramDefinition parseXmlElement(const xercesc::DOMElement *element)
bool sourceExists() const final
list(name, path='/')
Definition histSizes.py:38
XercesString fromNative(const char *str)
std::basic_string< XMLCh > XercesString

◆ insertDefinition()

bool ReadFromXmlDom::insertDefinition ( const SingleHistogramDefinition & oneDefinition)
virtual

Implements IReadHistoDef.

Definition at line 84 of file ReadFromXmlDom.cxx.

84 {
85 bool ok(true);
86
87 m_vectorOfDefinitions.push_back(oneDefinition);
88 return ok;
89}

◆ parseTextLine()

SingleHistogramDefinition ReadFromXmlDom::parseTextLine ( const std::string & line)
staticprivate

Definition at line 238 of file ReadFromXmlDom.cxx.

238 {
239 SingleHistogramDefinition s;
240 enum RegXHistoGroups {
241 TOTAL, TITLE, NBINS, XLO, XHI, XAXIS, YAXIS, DUMMY, FOLDER, NGROUPS
242 };
243
244 std::string rex =
245 R"delim(^\s+"([^"]+)"\s+(\d+)\s+([-+.0-9eE]+)\s+([-+.0-9eE]+)\s+"([^"]+)"\s+"([^"]+)"\s*(.*)\s*$)delim";
246 std::regex reg(rex);
247 std::smatch m;
248
249 if (std::regex_match(line, m, reg)) {
250 const bool hasFolder = (m.size() == NGROUPS);
251 s.title = m[TITLE].str();
252 s.xTitle = m[XAXIS].str();
253 s.yTitle = m[YAXIS].str();
254 s.xAxis = IHistogramDefinitionSvc::axesLimits_t(std::stof(m[XLO].str()), std::stof(m[XHI].str()));
255 s.nBinsX = std::stoi(m[NBINS].str());
256 if (hasFolder) {
257 s.folder = m[FOLDER].str();
258 }
259 }
260 s.m_empty = false;
261 return s;
262}
std::pair< float, float > axesLimits_t
typedef for axes limits, (lower bound, upper bound)
#define NBINS
Definition windows.h:9

◆ parseTProfileText()

SingleHistogramDefinition ReadFromXmlDom::parseTProfileText ( const std::string & line)
staticprivate

Definition at line 265 of file ReadFromXmlDom.cxx.

265 {
266 SingleHistogramDefinition s;
267 enum RegXHistoGroups {
268 TOTAL, TITLE, NBINS, XLO, XHI, YLO, YHI, XAXIS, YAXIS, DUMMY, FOLDER, NGROUPS
269 };
270
271 // text like: &quot;Test of TProfile&quot; 20 -50 50 0 200 &quot;#eta&quot; &quot;testEntries&quot;
272 std::string rex =
273 R"delim(^\s+"([^"]+)"\s+(\d+)\s+([-+.0-9eE]+)\s+([-+.0-9eE]+)\s+([-+.0-9eE]+)\s+([-+.0-9eE]+)\s+"([^"]+)"\s+"([^"]+)"\s*(.*)\s*$)delim";
274 std::regex reg(rex);
275 std::smatch m;
276
277 if (std::regex_match(line, m, reg)) {
278 const bool hasFolder = (m.size() == NGROUPS);
279 s.title = m[TITLE].str();
280 s.xTitle = m[XAXIS].str();
281 s.yTitle = m[YAXIS].str();
282 s.xAxis = IHistogramDefinitionSvc::axesLimits_t(std::stof(m[XLO].str()), std::stof(m[XHI].str()));
283 s.yAxis = IHistogramDefinitionSvc::axesLimits_t(std::stof(m[YLO].str()), std::stof(m[YHI].str()));
284 s.nBinsX = std::stoi(m[NBINS].str());
285 if (hasFolder) {
286 s.folder = m[FOLDER].str();
287 }
288 }
289 s.m_empty = false;
290 return s;
291}

◆ parseXmlElement()

SingleHistogramDefinition ReadFromXmlDom::parseXmlElement ( const xercesc::DOMElement * element)
staticprivate

Definition at line 135 of file ReadFromXmlDom.cxx.

135 {
136 SingleHistogramDefinition s;
137 enum RegXHistoGroups {
138 TYPE, NAME, TITLE, NX, NY, NZ, XLO, YLO, ZLO, XHI, YHI, ZHI, XAXIS, YAXIS, ZAXIS, FOLDER, NGROUPS
139 };
140 const std::array<std::string, NGROUPS> attrNames = {
141 "type", "id", "title", "n", "n", "n", "lo", "lo", "lo", "hi", "hi", "hi", "title", "title", "title", "folder"
142 };
143 //
144 // transform the std::string attribute names to Xerces string attribute names
145 std::array<XercesString, NGROUPS> xercesNames;
146 std::transform(attrNames.begin(), attrNames.end(), xercesNames.begin(), [](const std::string& s) {
147 return fromNative(s);
148 });
149 // Use this array to store the primary returned attribute values, which will be Xerces strings
150 std::array<XercesString, NGROUPS> xercesValues;
151 //
152 constexpr unsigned int NAXES = 3; // allow only three axes, could be extended later
153 const std::array<std::string, NAXES> allowedAxisNames = {
154 "x", "y", "z"
155 };
156
157 //
158 xercesValues[NAME] = element->getAttribute(xercesNames[NAME].c_str());
159 xercesValues[TITLE] = element->getAttribute(xercesNames[TITLE].c_str());
160 xercesValues[TYPE] = element->getAttribute(xercesNames[TYPE].c_str());
161 xercesValues[FOLDER] = element->getAttribute(xercesNames[FOLDER].c_str());
162 const std::string type = toNative(xercesValues[TYPE]);
163 const bool isTProfile = (type == "TProfile");
164 // get children of the histogram, these are the two axes
165 const xercesc::DOMElement* axisDef0 = element->getFirstElementChild();
166 if (!axisDef0 and element->hasChildNodes()) {
167 XercesString xercesContent = element->getTextContent();
168 const std::string textContent = toNative(xercesContent);
169 if (textContent.empty()) {
170 return s;
171 }
172 SingleHistogramDefinition sx = isTProfile ? parseTProfileText(textContent) : parseTextLine(textContent);
173 sx.name = toNative(xercesValues[NAME]);
174 sx.histoType = std::move(type);
175 return sx;
176 }
177 //if get to here and axisDef0 is null, theres a problem
178 if (not axisDef0) return s;
179 const xercesc::DOMElement* axisDef1 = axisDef0->getNextElementSibling();
180 if (not axisDef1) return s; //no y axis, abort
181 // but could be ordered x-y or y-x. The following assumes x, y, z ordering for now.
182 std::string axisName0 = toNative(axisDef0->getTagName());
183 std::string axisName1 = toNative(axisDef1->getTagName());
184 const xercesc::DOMElement* axisDef2 = axisDef1->getNextElementSibling();
185 std::string axisName2 = axisDef2 ? toNative(axisDef2->getTagName()) : "z";
186 if (validAxisName(axisName0, allowedAxisNames)
187 and validAxisName(axisName1,allowedAxisNames)
188 and validAxisName(axisName2,allowedAxisNames)
189 and (axisName1 != axisName0) and (axisName2 != axisName1)) {
190 // default order
191 unsigned int xIndex = 0, yIndex = 1, zIndex = 2;
192 if (axisName0 == allowedAxisNames[1]) {
193 // inverted order
194 xIndex = 1;
195 yIndex = 0;
196 }
197 xercesValues[NX + xIndex] = axisDef0->getAttribute(xercesNames[NX + xIndex].c_str());
198 xercesValues[NX + yIndex] = axisDef1->getAttribute(xercesNames[NX + yIndex].c_str());
199 xercesValues[NX + zIndex] = axisDef2 ? axisDef2->getAttribute(xercesNames[NX + zIndex].c_str()) : XercesString();
200 xercesValues[XLO + xIndex] = axisDef0->getAttribute(xercesNames[XLO + xIndex].c_str());
201 xercesValues[XLO + yIndex] = axisDef1->getAttribute(xercesNames[XLO + yIndex].c_str());
202 xercesValues[XLO + zIndex] = axisDef2 ? axisDef2->getAttribute(xercesNames[XLO + zIndex].c_str()) : XercesString();
203 xercesValues[XHI + xIndex] = axisDef0->getAttribute(xercesNames[XHI + xIndex].c_str());
204 xercesValues[XHI + yIndex] = axisDef1->getAttribute(xercesNames[XHI + yIndex].c_str());
205 xercesValues[XHI + zIndex] = axisDef2 ? axisDef2->getAttribute(xercesNames[XHI + zIndex].c_str()) : XercesString();
206 xercesValues[XAXIS + xIndex] = axisDef0->getAttribute(xercesNames[XAXIS + xIndex].c_str());
207 xercesValues[XAXIS + yIndex] = axisDef1->getAttribute(xercesNames[XAXIS + yIndex].c_str());
208 xercesValues[XAXIS + zIndex] = axisDef2 ? axisDef2->getAttribute(xercesNames[XAXIS + zIndex].c_str()) : XercesString();
209 // transform Xerces strings to normal std::string
210 std::array<std::string, NGROUPS> stringValues {
211 ""
212 };
213 std::transform(xercesValues.begin(), xercesValues.end(), stringValues.begin(), [](const XercesString& s) {
214 return toNative(s);
215 });
216 // numerical values are required for some quantities
217 const float NaN = std::nanf(""); // default 'invalid' float is not-a-number (NaN)
218 const unsigned int nx = stringValues[NX].empty() ? 0 : (unsigned int) (std::stoul(stringValues[NX]));
219 const unsigned int ny = stringValues[NY].empty() ? 0 : (unsigned int) (std::stoul(stringValues[NY]));
220 const unsigned int nz = stringValues[NZ].empty() ? 0 : (unsigned int) (std::stoul(stringValues[NZ]));
221 const float xlo = stringValues[XLO].empty() ? NaN : std::stof(stringValues[XLO]);
222 const float ylo = stringValues[YLO].empty() ? NaN : std::stof(stringValues[YLO]);
223 const float zlo = stringValues[ZLO].empty() ? NaN : std::stof(stringValues[ZLO]);
224 const float xhi = stringValues[XHI].empty() ? NaN : std::stof(stringValues[XHI]);
225 const float yhi = stringValues[YHI].empty() ? NaN : std::stof(stringValues[YHI]);
226 const float zhi = stringValues[ZHI].empty() ? NaN : std::stof(stringValues[ZHI]);
227 // now build the histogram definition to return
228 SingleHistogramDefinition sx(stringValues[NAME], stringValues[TYPE], stringValues[TITLE],
229 nx, ny, nz, xlo, xhi, ylo, yhi, zlo, zhi,
230 stringValues[XAXIS], stringValues[YAXIS], stringValues[ZAXIS],
231 stringValues[FOLDER]);
232 return sx;
233 }
234 return s;
235}
#define TYPE(CODE, TYP, IOTYP)
static SingleHistogramDefinition parseTProfileText(const std::string &line)
static SingleHistogramDefinition parseTextLine(const std::string &line)
isTProfile(obj)
Definition PlotEFTrk.py:72
std::string toNative(const XMLCh *str)

◆ source()

std::string ReadFromXmlDom::source ( ) const
finalvirtual

Implements IReadHistoDef.

Definition at line 53 of file ReadFromXmlDom.cxx.

53 {
54 return m_source;
55}

◆ sourceExists()

bool ReadFromXmlDom::sourceExists ( ) const
finalvirtual

Implements IReadHistoDef.

Definition at line 128 of file ReadFromXmlDom.cxx.

128 {
129 struct stat buffer{};
130
131 return(stat(m_source.c_str(), &buffer) == 0);
132}

Member Data Documentation

◆ m_format

const std::string ReadFromXmlDom::m_format
private

Definition at line 44 of file ReadFromXmlDom.h.

◆ m_histoDefinitionMap

std::map<std::string, SingleHistogramDefinition> IReadHistoDef::m_histoDefinitionMap
privateinherited

Definition at line 29 of file IReadHistoDef.h.

◆ m_source

std::string ReadFromXmlDom::m_source
private

Definition at line 43 of file ReadFromXmlDom.h.

◆ m_vectorOfDefinitions

std::vector<SingleHistogramDefinition> ReadFromXmlDom::m_vectorOfDefinitions
private

Definition at line 42 of file ReadFromXmlDom.h.


The documentation for this class was generated from the following files: