1 #ifndef MHO_ContainerHDF5Converter_HH__
2 #define MHO_ContainerHDF5Converter_HH__
62 fContainer =
dynamic_cast< XContainerType*
>(element);
71 if(fContainer !=
nullptr)
78 XContainerType* fContainer;
83 template<
typename XCheckType >
void ConstructHDF5(hid_t , std::string ,
const XCheckType* obj)
85 std::string class_name = MHO_ClassIdentity::ClassName< XCheckType >();
86 std::string class_uuid = MHO_ClassIdentity::GetUUIDFromClass< XCheckType >().as_string();
93 template<
typename XCheckType = XContainerType >
94 typename std::enable_if< std::is_base_of< MHO_ScalarContainerBase, XCheckType >::value,
void >::type
95 ConstructHDF5(hid_t file_id, std::string group_prefix,
const XContainerType* obj)
97 std::string class_name = MHO_ClassIdentity::ClassName< XContainerType >();
98 std::string class_uuid = MHO_ClassIdentity::GetUUIDFromClass< XContainerType >().as_string();
99 std::string object_uuid = obj->GetObjectUUID().as_string();
100 msg_debug(
"hdf5interface",
"creating scalar type for object with uuid: "<< object_uuid << eom);
101 std::string item_group = group_prefix +
"/" + object_uuid;
103 if (H5Lexists(file_id, item_group.c_str(), H5P_DEFAULT) == 0)
105 hid_t group_id = H5Gcreate(file_id, item_group.c_str(), H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
108 msg_error(
"hdf5interface",
"failed to create HDF5 group: "<< item_group << eom);
112 std::string name = item_group +
"/data";
114 hid_t dataset_id = -1;
116 make_scalar_dataset< typename XContainerType::value_type >(file_id, dataset_id, name, fContainer->GetValue() );
123 template<
typename XCheckType = XContainerType >
124 typename std::enable_if< (std::is_base_of< MHO_VectorContainerBase, XCheckType >::value &&
125 !std::is_base_of< MHO_AxisBase, XCheckType >::value),
127 ConstructHDF5(hid_t file_id, std::string group_prefix,
const XContainerType* obj)
129 std::string class_name = MHO_ClassIdentity::ClassName< XContainerType >();
130 std::string class_uuid = MHO_ClassIdentity::GetUUIDFromClass< XContainerType >().as_string();
131 std::string object_uuid = obj->GetObjectUUID().as_string();
132 msg_debug(
"hdf5interface",
"creating vector type for object with uuid: "<< object_uuid << eom);
137 auto dim_array = fContainer->GetDimensionArray();
138 for(std::size_t i=0; i<rank; i++){dims[i] = dim_array[i];}
139 std::string item_group = group_prefix +
"/" + object_uuid;
141 if (H5Lexists(file_id, item_group.c_str(), H5P_DEFAULT) == 0)
143 hid_t group_id = H5Gcreate(file_id, item_group.c_str(), H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
146 msg_error(
"hdf5interface",
"failed to create HDF5 group: "<< item_group << eom);
150 std::string name = item_group +
"/data";
152 hid_t dataset_id = -1;
154 make_dataset< typename XContainerType::value_type >(file_id, dataset_id, name, rank, dims, fContainer->GetData(),
fMetaData);
162 template<
typename XCheckType = XContainerType >
163 typename std::enable_if< std::is_base_of< MHO_AxisBase, XCheckType >::value,
void >::type
164 ConstructHDF5(hid_t file_id, std::string group_prefix,
const XContainerType* obj)
166 std::string class_name = MHO_ClassIdentity::ClassName< XContainerType >();
167 std::string class_uuid = MHO_ClassIdentity::GetUUIDFromClass< XContainerType >().as_string();
168 std::string object_uuid = obj->GetObjectUUID().as_string();
169 msg_debug(
"hdf5interface",
"creating axis type for object with uuid: "<< object_uuid << eom);
174 auto dim_array = fContainer->GetDimensionArray();
175 for(std::size_t i=0; i<rank; i++){dims[i] = dim_array[i];}
176 std::string item_group = group_prefix +
"/" + object_uuid;
178 if (H5Lexists(file_id, item_group.c_str(), H5P_DEFAULT) == 0)
180 hid_t group_id = H5Gcreate(file_id, item_group.c_str(), H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
183 msg_error(
"hdf5interface",
"failed to create HDF5 group: "<< item_group << eom);
187 std::string name = item_group +
"/data";
189 hid_t dataset_id = -1;
191 make_dataset< typename XContainerType::value_type >(file_id, dataset_id, name, rank, dims, fContainer->GetData(),
fMetaData);
199 template<
typename XCheckType = XContainerType >
200 typename std::enable_if< std::is_base_of< MHO_TableContainerBase, XCheckType >::value,
void >::type
201 ConstructHDF5(hid_t file_id, std::string group_prefix,
const XContainerType* obj)
203 std::string class_name = MHO_ClassIdentity::ClassName< XContainerType >();
204 std::string class_uuid = MHO_ClassIdentity::GetUUIDFromClass< XContainerType >().as_string();
205 std::string object_uuid = obj->GetObjectUUID().as_string();
206 msg_debug(
"hdf5interface",
"creating table type for object with uuid: "<< object_uuid << eom);
209 hsize_t rank = XContainerType::rank::value;
210 hsize_t dims[XContainerType::rank::value];
211 auto dim_array = obj->GetDimensionArray();
212 for(std::size_t i=0; i<rank; i++){dims[i] = dim_array[i];}
214 std::string item_group = group_prefix +
"/" + object_uuid;
216 if (H5Lexists(file_id, item_group.c_str(), H5P_DEFAULT) == 0)
218 hid_t group_id = H5Gcreate(file_id, item_group.c_str(), H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
221 msg_error(
"hdf5interface",
"failed to create HDF5 group: "<< item_group << eom);
225 std::string name = item_group +
"/data";
227 hid_t dataset_id = -1;
229 make_dataset< typename XContainerType::value_type >(file_id, dataset_id, name, rank, dims, fContainer->GetData(),
fMetaData);
235 for(std::size_t idx = 0; idx < obj->GetRank(); idx++)
238 apply_at< typename XContainerType::axis_pack_tuple_type, AxisDumper >(*obj, idx, axis_dumper);
254 fParentMetadata(pmetadata)
257 AxisDumper(): fFileID(-1), fDataSetID(-1), fParentName(
""){};
267 std::string class_name = MHO_ClassIdentity::ClassName< XAxisType >();
268 std::string class_uuid = MHO_ClassIdentity::GetUUIDFromClass< XAxisType >().as_string();
270 std::stringstream ssn;
271 ssn <<
"axis_" << fIndex;
272 std::string ax_name = ssn.str();
274 std::stringstream ss;
275 ss << fParentName <<
"/axis_";
277 std::string item_group = ss.str();
279 if (H5Lexists(fFileID, item_group.c_str(), H5P_DEFAULT) == 0)
281 hid_t group_id = H5Gcreate(fFileID, item_group.c_str(), H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
284 msg_error(
"hdf5interface",
"failed to create HDF5 group: "<< item_group << eom);
288 std::string name = item_group +
"/data";
291 if(fParentMetadata.contains(ax_name))
293 mdata = fParentMetadata[ax_name];
295 msg_debug(
"hdf5interface",
"creating an axis object with name: " << name<< eom);
298 std::size_t n =
axis.GetSize();
299 std::vector< typename XAxisType::value_type > axis_data;
300 for(std::size_t i=0; i<n; i++){axis_data.push_back(
axis.at(i) ); }
304 hid_t dataset_id = -1;
306 make_scale< typename XAxisType::value_type >(fFileID, fDataSetID, fIndex, item_group, name, &axis_data, mdata);
317 std::string fParentName;
347 if(fContainer !=
nullptr)
357 std::string class_name = MHO_ClassIdentity::ClassName< MHO_ObjectTags >();
358 std::string class_uuid = MHO_ClassIdentity::GetUUIDFromClass< MHO_ObjectTags >().as_string();
360 msg_debug(
"hdf5interface",
"creating tag type for object with uuid: "<< object_uuid << eom);
362 std::string item_group = group_prefix +
"/" + object_uuid;
364 if (H5Lexists(file_id, item_group.c_str(), H5P_DEFAULT) == 0)
366 hid_t group_id = H5Gcreate(file_id, item_group.c_str(), H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
369 msg_error(
"hdf5interface",
"failed to create HDF5 group: "<< item_group << eom);
373 std::string name = item_group +
"/uuid_set";
377 std::vector< std::string > uuid_vec;
378 for(std::size_t i=0; i<uvec.size(); i++){uuid_vec.push_back( uvec[i].as_string() );}
381 mdata[
"class_name"] = class_name;
382 mdata[
"class_uuid"] = class_uuid;
383 hid_t dataset_id = -1;
388 if(mdata.contains(
"plot_data"))
390 std::string plot_group = item_group +
"/" +
"plot_data";
391 hid_t plot_group_id = H5Gcreate(file_id, plot_group.c_str(), H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
393 H5Gclose(plot_group_id);
401 if(mdata.contains(
"parameters"))
403 std::string param_group = item_group +
"/" +
"parameters";
404 hid_t param_group_id = H5Gcreate(file_id, param_group.c_str(), H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
406 H5Gclose(param_group_id);
419 MHO_ObjectTags* fContainer;
#define msg_debug(xKEY, xCONTENT)
Definition: MHO_Message.hh:297
#define msg_error(xKEY, xCONTENT)
Definition: MHO_Message.hh:244
int axis(char *y_axis, char *x_axis)
Definition: axis.c:22
Definition: MHO_ContainerHDF5Converter.hh:248
void SetFileID(hid_t file_id)
Definition: MHO_ContainerHDF5Converter.hh:261
~AxisDumper()
Definition: MHO_ContainerHDF5Converter.hh:258
AxisDumper(hid_t file_id, hid_t ds_id, const std::string &parent, const mho_json &pmetadata)
Definition: MHO_ContainerHDF5Converter.hh:250
void operator()(const XAxisType &axis)
Definition: MHO_ContainerHDF5Converter.hh:264
AxisDumper()
Definition: MHO_ContainerHDF5Converter.hh:257
void SetIndex(std::size_t idx)
Definition: MHO_ContainerHDF5Converter.hh:260
void SetDataSetID(hid_t ds_id)
Definition: MHO_ContainerHDF5Converter.hh:262
Converts a given ndarray-based container into a HDF5 representation - export only for now.
Definition: MHO_ContainerHDF5Converter.hh:56
MHO_ContainerHDF5Converter()
Definition: MHO_ContainerHDF5Converter.hh:58
std::enable_if< std::is_base_of< MHO_ScalarContainerBase, XCheckType >::value, void >::type ConstructHDF5(hid_t file_id, std::string group_prefix, const XContainerType *obj)
Definition: MHO_ContainerHDF5Converter.hh:95
virtual ~MHO_ContainerHDF5Converter()
Definition: MHO_ContainerHDF5Converter.hh:65
virtual void WriteToHDF5File(hid_t file_id, std::string group_prefix)
Definition: MHO_ContainerHDF5Converter.hh:69
MHO_ContainerHDF5Converter(MHO_ExtensibleElement *element)
Definition: MHO_ContainerHDF5Converter.hh:60
std::enable_if< std::is_base_of< MHO_AxisBase, XCheckType >::value, void >::type ConstructHDF5(hid_t file_id, std::string group_prefix, const XContainerType *obj)
Definition: MHO_ContainerHDF5Converter.hh:164
void ConstructHDF5(hid_t, std::string, const XCheckType *obj)
Definition: MHO_ContainerHDF5Converter.hh:83
virtual void SetObjectToConvert(MHO_Serializable *obj)
Definition: MHO_ContainerHDF5Converter.hh:67
std::enable_if<(std::is_base_of< MHO_VectorContainerBase, XCheckType >::value &&!std::is_base_of< MHO_AxisBase, XCheckType >::value), void >::type ConstructHDF5(hid_t file_id, std::string group_prefix, const XContainerType *obj)
Definition: MHO_ContainerHDF5Converter.hh:127
std::enable_if< std::is_base_of< MHO_TableContainerBase, XCheckType >::value, void >::type ConstructHDF5(hid_t file_id, std::string group_prefix, const XContainerType *obj)
Definition: MHO_ContainerHDF5Converter.hh:201
Class MHO_ExtensibleElement.
Definition: MHO_ExtensibleElement.hh:60
Definition: MHO_ContainerHDF5Converter.hh:40
virtual void SetObjectMetaData(const mho_json &mdata)
Definition: MHO_ContainerHDF5Converter.hh:46
virtual void SetObjectToConvert(MHO_Serializable *)=0
mho_json fMetaData
Definition: MHO_ContainerHDF5Converter.hh:51
virtual ~MHO_HDF5Converter()
Definition: MHO_ContainerHDF5Converter.hh:43
virtual void WriteToHDF5File(hid_t, std::string)=0
MHO_HDF5Converter()
Definition: MHO_ContainerHDF5Converter.hh:42
Class MHO_Serializable.
Definition: MHO_Serializable.hh:26
MHO_UUID GetObjectUUID() const
Getter for object uuid.
Definition: MHO_Serializable.hh:61
mho_json GetMetaDataAsJSON() const
Getter for all meta data stored in this object as a json object.
Definition: MHO_Taggable.hh:95
std::string as_string() const
Definition: MHO_UUID.hh:125
struct type_status status
Definition: fourfit3.c:53
Definition: MHO_ChannelLabeler.hh:17
herr_t make_string_vector_dataset(hid_t group_id, hid_t dataset_id, const std::string &name, const std::vector< std::string > *data, const mho_json &metadata)
Definition: MHO_HDF5Datasets.hh:274
void json_to_hdf5_attributes(const mho_json &j, hid_t parent_group)
Definition: MHO_HDF5ConversionHelpers.hh:39