Geant4 11.4.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
HAPI.hpp
Go to the documentation of this file.
1/*
2# <<BEGIN-copyright>>
3# Copyright 2019, Lawrence Livermore National Security, LLC.
4# This file is part of the gidiplus package (https://github.com/LLNL/gidiplus).
5# gidiplus is licensed under the MIT license (see https://opensource.org/licenses/MIT).
6# SPDX-License-Identifier: MIT
7# <<END-copyright>>
8*/
9
10#ifndef HAPI_hpp_included
11#define HAPI_hpp_included 1
12
13#include <string>
14#include <stdlib.h>
15#include <vector>
16#include <stdexcept>
17
18#include <nf_buffer.h>
19#include <nf_utilities.h>
20
21#define HAPI_USE_PUGIXML 1
22
23#ifdef HAPI_USE_PUGIXML
24#include <pugixml.hpp>
25#endif
26
27
28#ifdef HAPI_USE_HDF5
29#include <hdf5.h>
30#endif
31
32#include <LUPI.hpp>
33
34namespace HAPI {
35
37
38// container classes for reading in from various data sources:
39
40/*
41============================================================
42========================= Attribute ========================
43============================================================
44 */
45
46class Node_internal;
47class Attribute {
48
49 private:
50 Node_internal *m_node;
51 std::string m_name;
52 //std::string m_value;
53
54 public:
55 inline Attribute() : m_node(nullptr), m_name() {}
56
57 inline Attribute(Node_internal *a_node, std::string const &a_name) :
58 m_node(a_node),
59 m_name(a_name)
60 {
61 }
62 ~Attribute() = default;
63 //std::string const &name() const { return( m_name ); }
64 inline std::string const value() const;
65 inline int as_int() const;
66 inline long as_long() const;
67 inline double as_double() const;
68};
69
70/*
71============================================================
72=========================== Text ===========================
73============================================================
74 */
75class Text {
76
77 private:
78 std::string m_text;
79
80 public:
81 Text();
82 Text(std::string const &a_text);
83 ~Text();
84 std::string const &get() const { return( m_text ); }
85};
86
87/*
88============================================================
89================== Data_internal (base class) ==============
90============================================================
91 */
93
94 public:
96 virtual ~Data_internal() = 0;
97 //std::string const getDataType();
98 //virtual template <typename T> T read() = 0;
99 virtual void getDoubles(nf_Buffer<double> &buffer) = 0;
100 virtual void getInts(nf_Buffer<int> &buffer) = 0;
101 virtual size_t length() const = 0;
102};
103
104/*
105============================================================
106=================== Node_internal (base class) =============
107============================================================
108 */
110
111 private:
112 NodeInteralType m_type;
113
114 public:
116 Node_internal( Node_internal const &a_node );
117 virtual ~Node_internal() = 0;
118
119 NodeInteralType type( ) const { return( m_type ); }
120
121 virtual std::string attribute(const char* name) = 0;
122 virtual int attribute_as_int(const char* name) = 0;
123 virtual long attribute_as_long(const char* name) = 0;
124 virtual double attribute_as_double(const char* name) = 0;
125 virtual Node_internal *child(const char* name) = 0;
128 virtual void to_next_sibling() = 0;
129 virtual Node_internal *copy() = 0;
130 virtual std::string name() const = 0;
131 virtual bool empty() const = 0;
132 virtual Text text() const = 0;
133 virtual Data_internal *data() const = 0;
134};
135
136
137inline std::string const Attribute::value() const { return( m_node->attribute( m_name.c_str()) ); }
138inline int Attribute::as_int() const { return( m_node->attribute_as_int(m_name.c_str()) ); }
139inline long Attribute::as_long() const { return( m_node->attribute_as_long(m_name.c_str()) ); }
140inline double Attribute::as_double() const { return( m_node->attribute_as_double(m_name.c_str()) ); }
141
142/*
143============================================================
144=========================== Data ===========================
145============================================================
146 */
147class Data {
148
149 private:
150 Data_internal *m_data;
151
152 public:
153 Data();
154 Data( Data_internal *a_data );
155 ~Data();
156 void getDoubles(nf_Buffer<double> &buffer);
157 void getInts(nf_Buffer<int> &buffer);
158 size_t length() const;
159};
160
161/*
162============================================================
163============================ Node ==========================
164============================================================
165 */
166class Node {
167
168 private:
169 Node_internal *m_node;
170
171 public:
172 Node();
173 Node( Node_internal *a_node );
174 Node( Node const &a_node );
175 ~Node();
176 inline Attribute attribute(const char* a_name) const{
177 return Attribute(m_node, a_name);
178 }
179 inline std::string attribute_as_string(const char* a_name) const{
180 if(m_node == nullptr){
181 return "";
182 }
183 return m_node->attribute(a_name);
184 }
185 inline int attribute_as_int(const char* a_name) const{
186 if(m_node == nullptr){
187 return 0;
188 }
189 return m_node->attribute_as_int(a_name);
190 }
191 inline long attribute_as_long(const char* a_name) const{
192 if(m_node == nullptr){
193 return 0;
194 }
195 return m_node->attribute_as_long(a_name);
196 }
197 inline double attribute_as_double(const char* a_name) const{
198 if(m_node == nullptr){
199 return 0.0;
200 }
201 return m_node->attribute_as_double(a_name);
202 }
203 Node child(const char* name) const;
204 Node first_child() const;
205 Node next_sibling() const;
206 void to_next_sibling() const;
207 Node &operator=(const Node &other);
208 std::string name() const;
209 bool empty() const;
210 Text text() const;
211 Data data() const;
212};
213
214
215/*
216============================================================
217======================= File (base class) ==================
218============================================================
219 */
220class File {
221
222 public:
223 File() { };
224 virtual ~File() = 0;
225 virtual Node child(const char* name) = 0;
226 virtual Node first_child() = 0;
227 virtual std::string name() const = 0;
228};
229
230
231/*
232============================================================
233=============== Data Manager (for hybrid files) ============
234============================================================
235 */
237
238 public:
240 virtual ~DataManager() {};
242
243 public:
244 virtual void getDoubles(nf_Buffer<double> &result, size_t startIndex, size_t endIndex) = 0;
245 virtual void getInts(nf_Buffer<int> &result, size_t startIndex, size_t endIndex) = 0;
246};
247
248
249#ifdef HAPI_USE_PUGIXML
250/*
251============================================================
252===================== XML using Pugi =======================
253============================================================
254 */
256
257 private:
258 pugi::xml_node m_node;
259
260 public:
264 virtual ~PugiXMLNode();
265
266 std::string attribute(const char* name);
267 int attribute_as_int(const char* name);
268 long attribute_as_long(const char* name);
269 double attribute_as_double(const char* name);
270 Node_internal *child(char const *name);
276 std::string name() const;
277 bool empty() const;
278 Text text() const;
280};
281
283
284 private:
285 pugi::xml_node m_node;
286 size_t m_length;
287 bool m_dataRead;
288
289 public:
292 virtual ~PugiXMLData();
293 void getDoubles(nf_Buffer<double> &buffer);
294 void getInts(nf_Buffer<int> &buffer);
295 size_t length() const;
296};
297
298class PugiXMLFile : public File {
299
300 private:
301 std::string m_name;
302 pugi::xml_document m_doc;
303
304 public:
306 PugiXMLFile(char const *filename, std::string const &a_callingFunctionName);
307 virtual ~PugiXMLFile();
308 Node child(char const *name);
310 std::string name() const;
311};
312#endif
313
314
315#ifdef HAPI_USE_HDF5
316/*
317============================================================
318=========================== HDF ============================
319============================================================
320 */
321typedef struct {
322 std::string name;
323 std::string xmlName; // HDF sometimes mangles names, need original name here
324 size_t index;
325 hid_t node_id;
326} childInfo;
327
328class HDFNode : public Node_internal {
329
330 private:
331 hid_t m_node_id;
332 hid_t m_parent_id;
333 size_t m_index;
334 std::vector<childInfo> m_siblings;
335 std::vector<childInfo> m_children;
336
337 public:
338 HDFNode();
339 HDFNode(hid_t a_node_id, hid_t a_parent_id, size_t a_index, std::vector<childInfo> a_siblings);
340 explicit HDFNode(hid_t a_file_id);
341 HDFNode(const HDFNode &other);
342 virtual ~HDFNode();
343
344 //Attribute attribute(char const *name);
345 std::string attribute(const char* name);
346 int attribute_as_int(const char* name);
347 long attribute_as_long(const char* name);
348 double attribute_as_double(const char* name);
349 Node_internal *child(char const *name);
350 Node_internal *first_child();
351 Node_internal *next_sibling();
352 void to_next_sibling();
353 Node_internal *copy();
354 Node_internal &operator=(const HDFNode &other);
355 std::string name() const;
356 bool empty() const;
357 Text text() const;
358 Data_internal *data() const;
359
360};
361
362class HDFData : public Data_internal {
363
364 private:
365 hid_t m_node_id;
366 hid_t m_dataspace_id;
367 size_t m_length;
368
369 public:
370 HDFData();
371 explicit HDFData(hid_t node_id);
372 virtual ~HDFData();
373 void getDoubles(nf_Buffer<double> &buffer);
374 void getInts(nf_Buffer<int> &buffer);
375 size_t length() const;
376};
377
378class HDFFile : public File {
379
380 private:
381 std::string m_name;
382 hid_t m_doc;
383 HDFNode *m_doc_as_node;
384
385 public:
386 HDFFile();
387 explicit HDFFile(char const *filename);
388 virtual ~HDFFile();
389 Node child(char const *name);
390 Node first_child();
391 std::string name() const;
392};
393
394class HDFDataManager : public DataManager{
395
396 private:
397 std::string m_filename;
398 bool m_iDataPresent;
399 bool m_dDataPresent;
400 hid_t m_file_id;
401 hid_t m_dataset_ints, m_dataset_doubles;
402 hid_t m_dataspace_ints, m_dataspace_doubles;
403
404 hsize_t m_stride[1], m_block[1];
405
406 size_t m_num_double_reads;
407 size_t m_num_double_elem;
408 size_t m_num_int_reads;
409 size_t m_num_int_elem;
410
411 public:
412 HDFDataManager(std::string const &filename);
413 virtual ~HDFDataManager();
414 virtual void getDoubles(nf_Buffer<double> &result, size_t startIndex, size_t endIndex);
415 virtual void getInts(nf_Buffer<int> &result, size_t startIndex, size_t endIndex);
416};
417#endif
418
419} // end of namespace 'HAPI'
420
421#endif // End of HAPI_hpp_included
G4PVDivision & operator=(const G4PVDivision &)=delete
~Attribute()=default
std::string const value() const
Definition HAPI.hpp:137
Attribute(Node_internal *a_node, std::string const &a_name)
Definition HAPI.hpp:57
int as_int() const
Definition HAPI.hpp:138
long as_long() const
Definition HAPI.hpp:139
double as_double() const
Definition HAPI.hpp:140
virtual ~DataManager()
Definition HAPI.hpp:240
virtual void getInts(nf_Buffer< int > &result, size_t startIndex, size_t endIndex)=0
static DataManager * m_instance
Definition HAPI.hpp:241
virtual void getDoubles(nf_Buffer< double > &result, size_t startIndex, size_t endIndex)=0
virtual void getDoubles(nf_Buffer< double > &buffer)=0
virtual size_t length() const =0
virtual void getInts(nf_Buffer< int > &buffer)=0
void getDoubles(nf_Buffer< double > &buffer)
Definition HAPI_Data.cc:48
void getInts(nf_Buffer< int > &buffer)
Definition HAPI_Data.cc:55
size_t length() const
Definition HAPI_Data.cc:42
virtual Node first_child()=0
virtual std::string name() const =0
virtual ~File()=0
Definition HAPI_File.cc:21
virtual Node child(const char *name)=0
virtual bool empty() const =0
NodeInteralType type() const
Definition HAPI.hpp:119
virtual void to_next_sibling()=0
virtual double attribute_as_double(const char *name)=0
virtual Data_internal * data() const =0
virtual Node_internal * child(const char *name)=0
virtual std::string name() const =0
virtual int attribute_as_int(const char *name)=0
virtual Node_internal * next_sibling()=0
virtual long attribute_as_long(const char *name)=0
virtual Text text() const =0
virtual Node_internal * first_child()=0
Node_internal(NodeInteralType a_type)
virtual std::string attribute(const char *name)=0
virtual Node_internal * copy()=0
Node next_sibling() const
Definition HAPI_Node.cc:96
long attribute_as_long(const char *a_name) const
Definition HAPI.hpp:191
std::string name() const
Definition HAPI_Node.cc:136
bool empty() const
Definition HAPI_Node.cc:150
double attribute_as_double(const char *a_name) const
Definition HAPI.hpp:197
std::string attribute_as_string(const char *a_name) const
Definition HAPI.hpp:179
void to_next_sibling() const
Definition HAPI_Node.cc:112
Data data() const
Definition HAPI_Node.cc:178
Node & operator=(const Node &other)
Definition HAPI_Node.cc:122
Node first_child() const
Definition HAPI_Node.cc:82
Node child(const char *name) const
Definition HAPI_Node.cc:72
Text text() const
Definition HAPI_Node.cc:164
int attribute_as_int(const char *a_name) const
Definition HAPI.hpp:185
Attribute attribute(const char *a_name) const
Definition HAPI.hpp:176
PugiXMLData(pugi::xml_node a_node)
void getDoubles(nf_Buffer< double > &buffer)
virtual ~PugiXMLData()
size_t length() const
void getInts(nf_Buffer< int > &buffer)
PugiXMLFile(char const *filename, std::string const &a_callingFunctionName)
std::string name() const
virtual ~PugiXMLFile()
Node child(char const *name)
bool empty() const
int attribute_as_int(const char *name)
PugiXMLNode(const PugiXMLNode &other)
Data_internal * data() const
virtual ~PugiXMLNode()
Node_internal * first_child()
Text text() const
long attribute_as_long(const char *name)
Node_internal * child(char const *name)
Node_internal * next_sibling()
double attribute_as_double(const char *name)
Node_internal & operator=(const PugiXMLNode &other)
Node_internal * copy()
PugiXMLNode(pugi::xml_node a_node)
std::string name() const
std::string attribute(const char *name)
std::string const & get() const
Definition HAPI.hpp:84
const char * name(G4int ptype)
Definition HAPI.hpp:34
NodeInteralType
Definition HAPI.hpp:36