Mantid
Loading...
Searching...
No Matches
MDGeometryXMLBuilder.cpp
Go to the documentation of this file.
1// Mantid Repository : https://github.com/mantidproject/mantid
2//
3// Copyright © 2018 ISIS Rutherford Appleton Laboratory UKRI,
4// NScD Oak Ridge National Laboratory, European Spallation Source,
5// Institut Laue - Langevin & CSNS, Institute of High Energy Physics, CAS
6// SPDX - License - Identifier: GPL - 3.0 +
7#include <sstream>
8
11
12#include <Poco/DOM/AutoPtr.h>
13#include <Poco/DOM/DOMParser.h>
14#include <Poco/DOM/DOMWriter.h>
15#include <Poco/DOM/Document.h>
16#include <Poco/DOM/Element.h>
17#include <Poco/DOM/Text.h>
18#include <boost/algorithm/string.hpp>
19#include <boost/format.hpp>
20#include <boost/functional/hash.hpp>
21
22namespace Mantid::Geometry {
23
29template <typename CheckDimensionPolicy>
31 bool bAdded = false; // Addition fails by default.
32 if (dimensionToAdd) {
33 const std::string dimensionId = dimensionToAdd->getDimensionId();
34 auto location =
35 std::find_if(m_vecDimensions.cbegin(), m_vecDimensions.cend(),
36 [&dimensionId](const IMDDimension_const_sptr &b) { return dimensionId == b->getDimensionId(); });
37 if (location == m_vecDimensions.cend()) {
38 m_vecDimensions.emplace_back(std::move(dimensionToAdd));
39 bAdded = true;
40 m_changed = true;
41 }
42 }
43 return bAdded;
44}
45
50template <typename CheckDimensionPolicy>
52 for (const auto &manyDim : manyDims) {
53 addOrdinaryDimension(manyDim);
54 }
55}
56
57template <typename CheckDimensionPolicy>
60 : m_vecDimensions(other.m_vecDimensions), m_spXDimension(other.m_spXDimension),
61 m_spYDimension(other.m_spYDimension), m_spZDimension(other.m_spZDimension), m_spTDimension(other.m_spTDimension),
62 m_changed(other.m_changed), m_lastResult(other.m_lastResult) {}
63
64template <typename CheckDimensionPolicy>
67 if (this != &other) {
68 m_vecDimensions = other.m_vecDimensions;
69 m_spXDimension = other.m_spXDimension;
70 m_spYDimension = other.m_spYDimension;
71 m_spZDimension = other.m_spZDimension;
72 m_spTDimension = other.m_spTDimension;
73 m_changed = other.m_changed;
74 m_lastResult = other.m_lastResult;
75 }
76 return *this;
77}
78
83template <typename CheckDimensionPolicy>
85 CheckDimensionPolicy policy;
86 policy(dimensionToAdd);
87}
88
94template <typename CheckDimensionPolicy>
96
97 bool bAdded = false;
98 if (dimension) {
99 applyPolicyChecking(*dimension);
100 addOrdinaryDimension(dimension);
101 m_spXDimension = dimension;
102 m_changed = true;
103 bAdded = true;
104 }
105 return bAdded;
106}
107
113template <typename CheckDimensionPolicy>
115
116 bool bAdded = false;
117 if (dimension) {
118 applyPolicyChecking(*dimension);
119 addOrdinaryDimension(dimension);
120 m_spYDimension = dimension;
121 m_changed = true;
122 bAdded = true;
123 }
124 return bAdded;
125}
126
132template <typename CheckDimensionPolicy>
134 bool bAdded = false;
135 if (dimension) {
136 applyPolicyChecking(*dimension);
137 addOrdinaryDimension(dimension);
138 m_spZDimension = dimension;
139 m_changed = true;
140 bAdded = true;
141 }
142 return bAdded;
143}
144
150template <typename CheckDimensionPolicy>
152
153 bool bAdded = false;
154 if (dimension) {
155 applyPolicyChecking(*dimension);
156 addOrdinaryDimension(dimension);
157 m_spTDimension = dimension;
158 m_changed = true;
159 bAdded = true;
160 }
161 return bAdded;
162}
163
168template <typename CheckDimensionPolicy> const std::string &MDGeometryBuilderXML<CheckDimensionPolicy>::create() const {
169 using namespace Poco::XML;
170 if (m_changed) {
171 // Create the root element for this fragment.
172 AutoPtr<Document> pDoc = new Document;
173 AutoPtr<Element> dimensionSetElement = pDoc->createElement("DimensionSet");
174 pDoc->appendChild(dimensionSetElement);
175
176 // Loop through dimensions and generate xml for each.
177 std::string dimensionXMLString;
178
179 for (auto it = m_vecDimensions.begin(); it != m_vecDimensions.end(); ++it) {
180 dimensionXMLString += (*it)->toXMLString();
181 }
182
183 // Pass dimensions to dimension set.
184 AutoPtr<Text> percents = pDoc->createTextNode("%s");
185 dimensionSetElement->appendChild(percents);
186
187 // x-dimension mapping.
188 AutoPtr<Element> xDimensionElement = pDoc->createElement("XDimension");
189 AutoPtr<Element> xDimensionIdElement = pDoc->createElement("RefDimensionId");
190 if (hasXDimension()) {
191 std::string xDimensionId = this->m_spXDimension->getDimensionId();
192 AutoPtr<Text> idXText = pDoc->createTextNode(xDimensionId);
193 xDimensionIdElement->appendChild(idXText);
194 }
195 xDimensionElement->appendChild(xDimensionIdElement);
196 dimensionSetElement->appendChild(xDimensionElement);
197
198 // y-dimension mapping.
199 AutoPtr<Element> yDimensionElement = pDoc->createElement("YDimension");
200 AutoPtr<Element> yDimensionIdElement = pDoc->createElement("RefDimensionId");
201 if (hasYDimension()) {
202 std::string yDimensionId = this->m_spYDimension->getDimensionId();
203 AutoPtr<Text> idYText = pDoc->createTextNode(yDimensionId);
204 yDimensionIdElement->appendChild(idYText);
205 }
206 yDimensionElement->appendChild(yDimensionIdElement);
207 dimensionSetElement->appendChild(yDimensionElement);
208
209 // z-dimension mapping.
210 AutoPtr<Element> zDimensionElement = pDoc->createElement("ZDimension");
211 AutoPtr<Element> zDimensionIdElement = pDoc->createElement("RefDimensionId");
212 if (hasZDimension()) {
213 std::string zDimensionId = this->m_spZDimension->getDimensionId();
214 AutoPtr<Text> idZText = pDoc->createTextNode(zDimensionId);
215 zDimensionIdElement->appendChild(idZText);
216 }
217 zDimensionElement->appendChild(zDimensionIdElement);
218 dimensionSetElement->appendChild(zDimensionElement);
219
220 // t-dimension mapping.
221 AutoPtr<Element> tDimensionElement = pDoc->createElement("TDimension");
222 AutoPtr<Element> tDimensionIdElement = pDoc->createElement("RefDimensionId");
223 if (hasTDimension()) {
224 std::string tDimensionId = this->m_spTDimension->getDimensionId();
225 AutoPtr<Text> idTText = pDoc->createTextNode(tDimensionId);
226 tDimensionIdElement->appendChild(idTText);
227 }
228 tDimensionElement->appendChild(tDimensionIdElement);
229 dimensionSetElement->appendChild(tDimensionElement);
230
231 std::stringstream xmlstream;
232 DOMWriter writer;
233 writer.writeNode(xmlstream, pDoc);
234
235 m_lastResult = boost::str(boost::format(xmlstream.str().c_str()) % dimensionXMLString.c_str());
236 m_changed = false;
237 }
238 return m_lastResult;
239}
240
241template <typename CheckDimensionPolicy> bool MDGeometryBuilderXML<CheckDimensionPolicy>::hasXDimension() const {
242 return nullptr != this->m_spXDimension.get();
243}
244
245template <typename CheckDimensionPolicy> bool MDGeometryBuilderXML<CheckDimensionPolicy>::hasYDimension() const {
246 return nullptr != this->m_spYDimension.get();
247}
248
249template <typename CheckDimensionPolicy> bool MDGeometryBuilderXML<CheckDimensionPolicy>::hasZDimension() const {
250 return nullptr != this->m_spZDimension.get();
251}
252
253template <typename CheckDimensionPolicy> bool MDGeometryBuilderXML<CheckDimensionPolicy>::hasTDimension() const {
254 return nullptr != this->m_spTDimension.get();
255}
256
257template <typename CheckDimensionPolicy>
259 return hasTDimension() && this->m_spTDimension->getIsIntegrated();
260}
261
265template <typename CheckDimensionPolicy>
267
271template <typename CheckDimensionPolicy> MDGeometryBuilderXML<CheckDimensionPolicy>::~MDGeometryBuilderXML() = default;
272
273// Create a builder that blocks the creation when a integrated dimension is used
274// in x, y, z, t mappings.
276// Create a builder that applies no blocking/checking.
278} // namespace Mantid::Geometry
The class describes one dimension of multidimensional dataset representing an orthogonal dimension an...
bool addXDimension(const IMDDimension_const_sptr &dimension) const
Add x dimension.
bool hasZDimension() const
Determine whether a valid z dimension has been provided.
bool addZDimension(const IMDDimension_const_sptr &dimension) const
Add z dimension.
bool hasTDimension() const
Determine whether a valid t dimension has been provided.
bool addYDimension(const IMDDimension_const_sptr &dimension) const
Add y dimension.
void addManyOrdinaryDimensions(const VecIMDDimension_sptr &manyDims) const
Add many ordinary dimensions.
bool hasIntegratedTDimension() const
Determine whether an integrated t dimension has been provided.
bool addTDimension(const IMDDimension_const_sptr &dimension) const
Add t dimension.
void applyPolicyChecking(const IMDDimension &dimensionToAdd) const
Instantiate and apply the checking policy.
bool hasXDimension() const
Determine if a valid x dimension has been provided.
const std::string & create() const
Create the xml.
MDGeometryBuilderXML & operator=(const MDGeometryBuilderXML &)
Assignment Operator.
bool addOrdinaryDimension(IMDDimension_const_sptr dimensionToAdd) const
Add a dimension that is neither considered x, y, z or t.
bool hasYDimension() const
Determine whether a valid y dimension has been provided.
std::vector< IMDDimension_sptr > VecIMDDimension_sptr
Vector of shared pointers to IMDDimensions.
std::shared_ptr< const IMDDimension > IMDDimension_const_sptr
Shared Pointer to const IMDDimension.