Pandora
Pandora source code navigator
Loading...
Searching...
No Matches
XmlHelper.h
Go to the documentation of this file.
1
8#ifndef PANDORA_XML_HELPER_H
9#define PANDORA_XML_HELPER_H 1
10
12#include "Objects/TrackState.h"
13
15#include "Pandora/StatusCodes.h"
16
17#include "Xml/tinyxml.h"
18
19namespace pandora
20{
21
26{
27public:
35 template <typename T>
36 static StatusCode ReadValue(const TiXmlHandle &xmlHandle, const std::string &xmlElementName, T &t);
37
45 template <typename T>
46 static StatusCode ReadVectorOfValues(const TiXmlHandle &xmlHandle, const std::string &xmlElementName, std::vector<T> &vector);
47
57 template <typename T>
58 static StatusCode Read2DVectorOfValues(const TiXmlHandle &xmlHandle, const std::string &xmlElementName, const std::string &rowName,
59 std::vector< std::vector<T> > &vector);
60
69 static StatusCode ProcessAlgorithm(const Algorithm &algorithm, const TiXmlHandle &xmlHandle, const std::string &description,
70 std::string &algorithmName);
71
79 static StatusCode ProcessFirstAlgorithm(const Algorithm &algorithm, const TiXmlHandle &xmlHandle, std::string &algorithmName);
80
89 static StatusCode ProcessAlgorithmList(const Algorithm &algorithm, const TiXmlHandle &xmlHandle, const std::string &listName,
90 StringVector &algorithmNames);
91
100 static StatusCode ProcessAlgorithmTool(const Algorithm &algorithm, const TiXmlHandle &xmlHandle, const std::string &description,
101 AlgorithmTool *&pAlgorithmTool);
102
110 static StatusCode ProcessFirstAlgorithmTool(const Algorithm &algorithm, const TiXmlHandle &xmlHandle, AlgorithmTool *&pAlgorithmTool);
111
120 static StatusCode ProcessAlgorithmToolList(const Algorithm &algorithm, const TiXmlHandle &xmlHandle, const std::string &listName,
121 AlgorithmToolVector &algorithmToolVector);
122
130 static void TokenizeString(const std::string &inputString, StringVector &tokens, const std::string &delimiter = " ");
131};
132
133//------------------------------------------------------------------------------------------------------------------------------------------
134
135template <typename T>
136inline StatusCode XmlHelper::ReadValue(const TiXmlHandle &xmlHandle, const std::string &xmlElementName, T &t)
137{
138 const TiXmlElement *const pXmlElement = xmlHandle.FirstChild(xmlElementName).Element();
139
140 if (!pXmlElement)
141 return STATUS_CODE_NOT_FOUND;
142
143 if (!StringToType(pXmlElement->GetText(), t))
144 return STATUS_CODE_FAILURE;
145
146 return STATUS_CODE_SUCCESS;
147}
148
149template <>
150inline StatusCode XmlHelper::ReadValue<CartesianVector>(const TiXmlHandle &xmlHandle, const std::string &xmlElementName, CartesianVector &t)
151{
152 const TiXmlElement *const pXmlElement = xmlHandle.FirstChild(xmlElementName).Element();
153
154 if (!pXmlElement)
155 return STATUS_CODE_NOT_FOUND;
156
157 StringVector tokens;
158 TokenizeString(pXmlElement->GetText(), tokens);
159
160 if (tokens.size() != 3)
161 return STATUS_CODE_FAILURE;
162
163 float x(0.f), y(0.f), z(0.f);
164
165 if (!StringToType(tokens[0], x) || !StringToType(tokens[1], y) || !StringToType(tokens[2], z))
166 return STATUS_CODE_FAILURE;
167
168 t = CartesianVector(x, y, z);
169
170 return STATUS_CODE_SUCCESS;
171}
172
173template <>
174inline StatusCode XmlHelper::ReadValue<TrackState>(const TiXmlHandle &xmlHandle, const std::string &xmlElementName, TrackState &t)
175{
176 const TiXmlElement *const pXmlElement = xmlHandle.FirstChild(xmlElementName).Element();
177
178 if (!pXmlElement)
179 return STATUS_CODE_NOT_FOUND;
180
181 StringVector tokens;
182 TokenizeString(pXmlElement->GetText(), tokens);
183
184 if (tokens.size() != 6)
185 return STATUS_CODE_FAILURE;
186
187 float x(0.f), y(0.f), z(0.f), px(0.f), py(0.f), pz(0.f);
188
189 if (!StringToType(tokens[0], x) || !StringToType(tokens[1], y) || !StringToType(tokens[2], z) ||
190 !StringToType(tokens[3], px) || !StringToType(tokens[4], py) || !StringToType(tokens[5], pz))
191 {
192 return STATUS_CODE_FAILURE;
193 }
194
195 t = TrackState(x, y, z, px, py, pz);
196
197 return STATUS_CODE_SUCCESS;
198}
199
200template <>
201inline StatusCode XmlHelper::ReadValue<bool>(const TiXmlHandle &xmlHandle, const std::string &xmlElementName, bool &t)
202{
203 const TiXmlElement *const pXmlElement = xmlHandle.FirstChild(xmlElementName).Element();
204
205 if (!pXmlElement)
206 return STATUS_CODE_NOT_FOUND;
207
208 const std::string xmlElementString = pXmlElement->GetText();
209
210 if ((xmlElementString == "1") || (xmlElementString == "true"))
211 {
212 t = true;
213 }
214 else if ((xmlElementString == "0") || (xmlElementString == "false"))
215 {
216 t = false;
217 }
218 else
219 {
220 return STATUS_CODE_FAILURE;
221 }
222
223 return STATUS_CODE_SUCCESS;
224}
225
226//------------------------------------------------------------------------------------------------------------------------------------------
227
228template <typename T>
229inline StatusCode XmlHelper::ReadVectorOfValues(const TiXmlHandle &xmlHandle, const std::string &xmlElementName, std::vector<T> &vector)
230{
231 const TiXmlElement *const pXmlElement = xmlHandle.FirstChild(xmlElementName).Element();
232
233 if (!pXmlElement)
234 return STATUS_CODE_NOT_FOUND;
235
236 StringVector tokens;
237 TokenizeString(pXmlElement->GetText(), tokens);
238
239 for (const std::string &token : tokens)
240 {
241 T t;
242
243 if (!StringToType(token, t))
244 return STATUS_CODE_FAILURE;
245
246 vector.push_back(t);
247 }
248
249 return STATUS_CODE_SUCCESS;
250}
251
252//------------------------------------------------------------------------------------------------------------------------------------------
253
254template <typename T>
255inline StatusCode XmlHelper::Read2DVectorOfValues(const TiXmlHandle &xmlHandle, const std::string &xmlElementName, const std::string &rowName,
256 std::vector< std::vector<T> > &vector)
257{
258 TiXmlElement *const pXmlElement = xmlHandle.FirstChild(xmlElementName).Element();
259
260 if (!pXmlElement)
261 return STATUS_CODE_NOT_FOUND;
262
263 TiXmlElement *pXmlRowElement = TiXmlHandle(pXmlElement).FirstChild(rowName).Element();
264
265 if (!pXmlRowElement)
266 return STATUS_CODE_NOT_FOUND;
267
268 for ( ; nullptr != pXmlRowElement; pXmlRowElement = pXmlRowElement->NextSiblingElement(rowName))
269 {
270 std::vector<T> rowVector;
271
272 StringVector tokens;
273 TokenizeString(pXmlRowElement->GetText(), tokens);
274
275 for (const std::string &token : tokens)
276 {
277 T t;
278
279 if (!StringToType(token, t))
280 return STATUS_CODE_FAILURE;
281
282 rowVector.push_back(t);
283 }
284
285 vector.push_back(rowVector);
286 }
287
288 return STATUS_CODE_SUCCESS;
289}
290
291//------------------------------------------------------------------------------------------------------------------------------------------
292
293inline StatusCode XmlHelper::ProcessFirstAlgorithm(const Algorithm &algorithm, const TiXmlHandle &xmlHandle, std::string &algorithmName)
294{
295 const std::string emptyDescription;
296 return XmlHelper::ProcessAlgorithm(algorithm, xmlHandle, emptyDescription, algorithmName);
297}
298
299//------------------------------------------------------------------------------------------------------------------------------------------
300
301inline StatusCode XmlHelper::ProcessFirstAlgorithmTool(const Algorithm &algorithm, const TiXmlHandle &xmlHandle, AlgorithmTool *&pAlgorithmTool)
302{
303 const std::string emptyDescription;
304 return XmlHelper::ProcessAlgorithmTool(algorithm, xmlHandle, emptyDescription, pAlgorithmTool);
305}
306
307} // namespace pandora
308
309#endif // #ifndef PANDORA_XML_HELPER_H
Header file for the cartesian vector class.
Header file defining relevant internal typedefs, sort and string conversion functions.
Header file defining status codes and relevant preprocessor macros.
Header file for the track state class.
Algorithm class. Algorithm addresses are held only by the algorithm manager. They have a fully define...
Definition Algorithm.h:21
AlgorithmTool class. Algorithm tools will tend to be tailored for specific parent algorithms,...
CartesianVector class.
const char * GetText() const
Definition tinyxml.cc:903
TiXmlElement * Element() const
Definition tinyxml.h:1710
TiXmlHandle FirstChild() const
Return a handle to the first child node.
Definition tinyxml.cc:1635
const TiXmlElement * NextSiblingElement() const
Definition tinyxml.cc:485
TrackState class.
Definition TrackState.h:22
XmlHelper class.
Definition XmlHelper.h:26
static StatusCode ProcessAlgorithm(const Algorithm &algorithm, const TiXmlHandle &xmlHandle, const std::string &description, std::string &algorithmName)
Process an algorithm described in an xml element with a matching "description = .....
Definition XmlHelper.cc:16
static void TokenizeString(const std::string &inputString, StringVector &tokens, const std::string &delimiter=" ")
Tokenize a string.
Definition XmlHelper.cc:122
static StatusCode ReadVectorOfValues(const TiXmlHandle &xmlHandle, const std::string &xmlElementName, std::vector< T > &vector)
Read a vector of values from a (space separated) list in an xml element.
Definition XmlHelper.h:229
static StatusCode Read2DVectorOfValues(const TiXmlHandle &xmlHandle, const std::string &xmlElementName, const std::string &rowName, std::vector< std::vector< T > > &vector)
Read a two-dimensional array of values into a vector of vectors. Each row of values must be contained...
Definition XmlHelper.h:255
static StatusCode ReadValue(const TiXmlHandle &xmlHandle, const std::string &xmlElementName, T &t)
Read a value from an xml element.
Definition XmlHelper.h:136
static StatusCode ProcessAlgorithmToolList(const Algorithm &algorithm, const TiXmlHandle &xmlHandle, const std::string &listName, AlgorithmToolVector &algorithmToolVector)
Process a list of algorithms tools in an xml file.
Definition XmlHelper.cc:101
static StatusCode ProcessFirstAlgorithm(const Algorithm &algorithm, const TiXmlHandle &xmlHandle, std::string &algorithmName)
Process a single algorithm described in an xml file (the first found by the xml handle)
Definition XmlHelper.h:293
static StatusCode ProcessAlgorithmTool(const Algorithm &algorithm, const TiXmlHandle &xmlHandle, const std::string &description, AlgorithmTool *&pAlgorithmTool)
Process an algorithm tool described in an xml element with a matching "description = ....
Definition XmlHelper.cc:69
static StatusCode ProcessAlgorithmList(const Algorithm &algorithm, const TiXmlHandle &xmlHandle, const std::string &listName, StringVector &algorithmNames)
Process a list of daughter algorithms in an xml file.
Definition XmlHelper.cc:48
static StatusCode ProcessFirstAlgorithmTool(const Algorithm &algorithm, const TiXmlHandle &xmlHandle, AlgorithmTool *&pAlgorithmTool)
Process a single algorithm tool described in an xml file (the first found by the xml handle)
Definition XmlHelper.h:301
bool StringToType(const std::string &s, T &t)
std::vector< std::string > StringVector
std::vector< AlgorithmTool * > AlgorithmToolVector
StatusCode
The StatusCode enum.