3
0
mirror of https://github.com/triqs/dft_tools synced 2025-01-13 22:36:03 +01:00

h5: add a parent in group

- add a parent in the group, to allow iteration on group
elements
- normally in h5, one needs to have the parent group and the name
of the group to iterate on its elements.
- added a parent (possibly empty) to get a simply syntax to
get the element of a group...
This commit is contained in:
Olivier Parcollet 2013-09-28 16:09:47 +02:00
parent 33a19227ab
commit e8af74a030

View File

@ -27,11 +27,13 @@ namespace triqs { namespace h5 {
* Rational : use ADL for h5_read/h5_write, catch and rethrow exception, add some policy for opening/creating * Rational : use ADL for h5_read/h5_write, catch and rethrow exception, add some policy for opening/creating
*/ */
class group { class group {
H5::Group _g; H5::Group _g, _parent;
std::string _name_in_parent;
public: public:
group() = default; group() = default;
group( group const & ) = default; group(group const &) = default;
group (H5::Group g) : _g(g) {} group(H5::Group g) : _g(g) {}
group(H5::Group g, H5::Group parent, std::string name_in_parent) : _g(g), _parent(parent), _name_in_parent(name_in_parent) {}
/// Takes the "/" group at the top of the file. /// Takes the "/" group at the top of the file.
group (H5::H5File f) : _g(f.openGroup("/")) {} // can not fail, right ? group (H5::H5File f) : _g(f.openGroup("/")) {} // can not fail, right ?
@ -42,6 +44,9 @@ namespace triqs { namespace h5 {
if (is_group) { _g.setId(id_); } if (is_group) { _g.setId(id_); }
else { H5::H5File f; f.setId(id_); *this = group(f); } else { H5::H5File f; f.setId(id_); *this = group(f); }
} }
bool has_parent() const { return _name_in_parent != "";}
/// Write the triqs tag of the group if it is an object. /// Write the triqs tag of the group if it is an object.
template<typename T> void write_triqs_hdf5_data_scheme (T const & obj) { template<typename T> void write_triqs_hdf5_data_scheme (T const & obj) {
h5::write_string_attribute( &_g, "TRIQS_HDF5_data_scheme" , get_triqs_hdf5_data_scheme(obj).c_str() ) ; h5::write_string_attribute( &_g, "TRIQS_HDF5_data_scheme" , get_triqs_hdf5_data_scheme(obj).c_str() ) ;
@ -56,7 +61,7 @@ namespace triqs { namespace h5 {
group open_group(std::string const & key) const { group open_group(std::string const & key) const {
if (!has_key(key)) TRIQS_RUNTIME_ERROR << "no subgroup "<<key <<" in the group"; if (!has_key(key)) TRIQS_RUNTIME_ERROR << "no subgroup "<<key <<" in the group";
group res; group res;
try { res = _g.openGroup(key.c_str());} try { res = group( _g.openGroup(key.c_str()), _g, key) ;} // has a parent
catch (H5::GroupIException const & e){ TRIQS_RUNTIME_ERROR << "Error in opening the subgroup "<< key <<"\n H5 error message : \n "<< e.getCDetailMsg(); } catch (H5::GroupIException const & e){ TRIQS_RUNTIME_ERROR << "Error in opening the subgroup "<< key <<"\n H5 error message : \n "<< e.getCDetailMsg(); }
return res; return res;
} }
@ -75,7 +80,7 @@ namespace triqs { namespace h5 {
*/ */
group create_group(std::string const & key, bool delete_if_exists = true) const { group create_group(std::string const & key, bool delete_if_exists = true) const {
unlink_key_if_exists(key); unlink_key_if_exists(key);
return _g.createGroup(key.c_str()); return group(_g.createGroup(key.c_str()),_g, key);
} }
/** /**
* \brief Create a dataset. * \brief Create a dataset.
@ -95,9 +100,19 @@ namespace triqs { namespace h5 {
/// Returns all names of subgroup of key in G /// Returns all names of subgroup of key in G
std::vector<std::string> get_all_subgroup_names(std::string const & key) const; std::vector<std::string> get_all_subgroup_names(std::string const & key) const;
std::vector<std::string> get_all_subgroup_names() const {
if (!has_parent()) TRIQS_RUNTIME_ERROR << "Group hdf5 : parent not found";
return group(_parent).get_all_subgroup_names(_name_in_parent);
}
/// Returns all names of dataset of key in G /// Returns all names of dataset of key in G
std::vector<std::string> get_all_dataset_names(std::string const & key) const; std::vector<std::string> get_all_dataset_names(std::string const & key) const;
std::vector<std::string> get_all_dataset_names() const {
if (!has_parent()) TRIQS_RUNTIME_ERROR << "Group hdf5 : parent not found";
return group(_parent).get_all_dataset_names(_name_in_parent);
}
void write_string_attribute (std::string const & obj_name, std::string const & attr_name, std::string const & value){ void write_string_attribute (std::string const & obj_name, std::string const & attr_name, std::string const & value){
herr_t err = H5LTset_attribute_string(_g.getId(),obj_name.c_str(),attr_name.c_str(), value.c_str() ) ; herr_t err = H5LTset_attribute_string(_g.getId(),obj_name.c_str(),attr_name.c_str(), value.c_str() ) ;
if (err<0) TRIQS_RUNTIME_ERROR << "Error in setting attribute of "<< obj_name<<" named "<< attr_name << " to " << value; if (err<0) TRIQS_RUNTIME_ERROR << "Error in setting attribute of "<< obj_name<<" named "<< attr_name << " to " << value;