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
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
150 std::array<XercesString, NGROUPS> xercesValues;
151
152 constexpr unsigned int NAXES = 3;
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());
164
165 const xercesc::DOMElement* axisDef0 = element->getFirstElementChild();
166 if (!axisDef0 and element->hasChildNodes()) {
168 const std::string textContent =
toNative(xercesContent);
169 if (textContent.empty()) {
171 }
174 sx.histoType = std::move(type);
176 }
177
178 if (not axisDef0)
return s;
179 const xercesc::DOMElement* axisDef1 = axisDef0->getNextElementSibling();
180 if (not axisDef1)
return s;
181
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
192 if (axisName0 == allowedAxisNames[1]) {
193
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
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
217 const float NaN = std::nanf("");
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
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]);
233 }
235}
#define TYPE(CODE, TYP, IOTYP)
static SingleHistogramDefinition parseTProfileText(const std::string &line)
static SingleHistogramDefinition parseTextLine(const std::string &line)
std::string toNative(const XMLCh *str)