43#include <unordered_map>
44#include <unordered_set>
55#include <libdap/DDS.h>
56#include <libdap/D4Group.h>
57#include <libdap/D4Attributes.h>
60#include <HE5GridPara.h>
66#if (H5_VERS_MAJOR == 1 && ((H5_VERS_MINOR == 12) || (H5_VERS_MINOR == 13)) || (H5_VERS_MINOR == 14))
68 H5O_token_t link_addr;
79enum class HE5_TYPE {SW,GD,ZA};
104 EOS5GridPRType pixelregistration;
107 EOS5GridOriginType gridorigin;
110 EOS5GridPCType projection;
131 std::string cf_gmap_path;
135 std::unordered_map<std::string,std::vector<std::string>> varpath_to_dims;
136 std::unordered_map<std::string,std::vector<HE5Dim>> grppath_to_dims;
137 std::unordered_map<std::string,eos5_grid_info_t> gridname_to_info;
138 std::vector<std::pair<eos5_dname_info_t,eos5_cname_info_t>> dimpath_to_cvpath;
142bool breadth_first(hid_t, hid_t,
const char *, libdap::D4Group* par_grp,
const char *,
bool,
bool,
143 std::vector<link_info_t>&,
eos5_dim_info_t & ,std::vector<std::string> &);
144void obtain_hdf5_object_name(hid_t pid, hsize_t obj_index,
const char *gname, std::vector<char> &oname);
145bool check_soft_external_links(libdap::D4Group *par_grp, hid_t pid,
int & slinkindex,
const char *gname,
146 const std::vector<char> &oname,
bool handle_softlink);
147void handle_actual_dataset(libdap::D4Group *par_grp, hid_t pid,
const string &full_path_name,
const string &fname,
149void handle_pure_dimension(libdap::D4Group *par_grp, hid_t pid,
const std::vector<char>& oname,
bool is_eos5,
150 const std::string &full_path_name);
151void handle_eos5_datasets(libdap::D4Group* par_grp,
const char *gname,
eos5_dim_info_t &eos5_dim_info);
152void handle_child_grp(hid_t file_id, hid_t pid,
const char *gname, libdap::D4Group* par_grp,
const char *fname,
153 bool use_dimscale,
bool is_eos5,std::vector<link_info_t> & hdf5_hls,
154 eos5_dim_info_t & eos5_dim_info, std::vector<std::string> & handled_cv_names,
155 const std::vector<char>& oname);
157void read_objects(libdap::D4Group* d4_grp,hid_t,
const std::string & varname,
const std::string & filename, hid_t,
bool,
bool,
159void read_objects_base_type(libdap::D4Group* d4_grp,hid_t,
const std::string & varname,
const std::string & filename, hid_t,
161void read_objects_basetype_attr_hl(
const std::string &varname, libdap::BaseType *bt, hid_t dset_id,
bool is_eos5);
163void read_objects_structure(libdap::D4Group* d4_grp,
const std::string & varname,
const std::string & filename,
165void read_objects_structure_arrays(libdap::D4Group *d4_grp, libdap::Structure *structure,
const std::string & varname,
166 const std::string &newvarname,
const std::string &filename, hid_t dset_id,
168void read_objects_structure_scalar(libdap::D4Group *d4_grp, libdap::Structure *structure,
const std::string & varname,
169 hid_t dset_id,
bool is_eos5);
171std::string obtain_new_varname(
const std::string &varname,
bool use_dimscale,
bool is_eos5);
173std::string get_hardlink_dmr(hid_t,
const std::string &);
174void get_softlink(libdap::D4Group* par_grp, hid_t,
const std::string &,
int,
size_t);
175void map_h5_dset_hardlink_to_d4(hid_t h5_objid,
const std::string & full_path, libdap::BaseType* d4b,
176 libdap::Structure * d4s,
int flag);
179void map_h5_attrs_to_dap4(hid_t oid,libdap::D4Group* d4g, libdap::BaseType* d4b, libdap::Structure * d4s,
int flag);
182 const std::string &,
short flag);
186void add_dap4_coverage_default_internal(libdap::D4Group* d4_grp, std::unordered_map<std::string,libdap::Array*> &,
187 std::unordered_map<std::string,libdap::Array*> &);
188void obtain_ds_name_array_maps(libdap::D4Group*, std::unordered_map<std::string,libdap::Array*> &,
189 const std::vector<std::string>& handled_coord_names);
190void obtain_ds_name_array_maps_internal(libdap::BaseType *v, std::unordered_map<string,libdap::Array*>&dsn_array_maps,
191 const std::vector<std::string>& handled_all_cv_names);
192void obtain_coord_names(libdap::Array*, std::vector<std::string>& coord_names);
193void obtain_multi_string_coord_names(libdap::D4Attribute *d4_attr, std::vector<std::string> & coord_names);
194void make_coord_names_fpath(libdap::D4Group*, std::vector<std::string>& coord_names);
195bool obtain_no_path_cv(libdap::D4Group*, std::string &coord_name);
196void handle_absolute_path_cv(
const libdap::D4Group*, std::string &coord_name);
197void handle_relative_path_cv(
const libdap::D4Group*, std::string &coord_name);
198void handle_relative_path_cvname_internal(
const libdap::D4Group *d4_grp, std::string &coord_name,
199 unsigned short sep_count);
201void remove_empty_coord_names(std::vector<std::string>&);
202void obtain_handled_dim_names(libdap::Array*, std::unordered_set<std::string> & handled_dim_names);
203void add_coord_maps(libdap::D4Group*, libdap::Array*, std::vector<std::string> &coord_name,
204 std::unordered_map<std::string,libdap::Array*> & coname_array_maps, std::unordered_set<std::string>&);
205void add_dimscale_maps(libdap::Array*, std::unordered_map<std::string,libdap::Array*> & dc_array_maps,
206 const std::unordered_set<std::string> & handled_dim_names);
207void reorder_vars(libdap::D4Group*,
const std::map<std::string,libdap::Array*> &coname_array_maps,
208 const std::map<std::string,libdap::Array*> & dc_array_maps);
209void reorder_vars_internal(libdap::D4Group* d4_grp,
const std::vector<int> &cv_pos,
210 const std::vector<libdap::BaseType *> &cv_obj_ptr,
int stop_index);
211void reorder_vars_internal_final_phase(libdap::D4Group* d4_grp,
const std::vector<int> &mov_cv_pos,
212 const std::vector<int> &mov_front_pos,
213 const std::vector<libdap::BaseType *> &mov_front_vptr,
214 const std::vector<libdap::BaseType *> &mov_cv_ptr);
216bool is_cvar(
const libdap::BaseType*,
const std::unordered_map<std::string,libdap::Array*> &coname_array_maps,
const std::unordered_map<std::string,libdap::Array*> & dc_array_maps);
221void obtain_struct_metadata_info(hid_t ecs_grp_id, std::vector<std::string> &s_oname, std::vector<bool> &smetatype,
222 int &strmeta_num_total,
bool &strmeta_no_suffix, hsize_t nelems) ;
223int obtain_struct_metadata_value(hid_t ecs_grp_id,
const std::vector<std::string> &s_oname,
224 const std::vector<bool> &smetatype, hsize_t nelems,
225 std::vector<std::string> &strmeta_value, std::string &total_strmeta_value) ;
226int obtain_struct_metadata_value_internal(hid_t ecs_grp_id,
const vector<string> &s_oname,
228 const string &finstr, hsize_t i);
229int get_strmetadata_num(
const string & meta_str);
232void build_var_dim_path(
const std::string & eos5_obj_name,
const std::vector<HE5Var>& var_list,
233 std::unordered_map<std::string, std::vector<std::string>>& varpath_to_dims,
234 HE5_TYPE eos5_type,
bool is_geo);
235void build_grp_dim_path(
const std::string & eos5_obj_name,
const std::vector<HE5Dim>& dim_list,
236 std::unordered_map<std::string, std::vector<HE5Dim>>& grppath_to_dims, HE5_TYPE eos5_type);
237bool obtain_eos5_dim(
const std::string & varname,
const std::unordered_map<std::string,
239bool obtain_eos5_grp_dim(
const std::string & varname,
const std::unordered_map<std::string,
243void add_eos5_grid_vars_geo(libdap::D4Group* d4_grp,
const eos5_grid_info_t & eg_info);
245bool no_eos5_grid_vars_in_grp(libdap::D4Group *d4_group,
const eos5_grid_info_t &eg_info);
247void build_gd_info(
const HE5Grid &gd,std::unordered_map<std::string,eos5_grid_info_t>& gridname_to_info);
251hsize_t obtain_unlim_pure_dim_size(hid_t pid,
const std::string &dname);
252hsize_t obtain_unlim_pure_dim_size_internal(hid_t dset_id,
const std::string &dname,
const std::string &reference_name);
253hsize_t obtain_unlim_pure_dim_size_internal_value(hid_t dset_id, hid_t attr_id, hid_t atype_id,
254 const std::string &reference_name,
const std::string &dname);
255void add_ps_cf_grid_mapping_attrs(libdap::BaseType *dummy_proj_cf,
const eos5_grid_info_t &);
256void add_lamaz_cf_grid_mapping_attrs(libdap::BaseType *dummy_proj_cf,
const eos5_grid_info_t &);
257void add_possible_var_cv_info(libdap::BaseType *,
const eos5_dim_info_t &eos5_dim_info);
258void make_attributes_to_cf(libdap::BaseType *,
const eos5_dim_info_t &eos5_dim_info);
void read_objects(DAS &das, const string &varname, hid_t oid, int num_attr)
void map_h5_attrs_to_dap4(hid_t oid, libdap::D4Group *d4g, libdap::BaseType *d4b, libdap::Structure *d4s, int flag)
A function that maps HDF5 attributes to DAP4.
void get_softlink(libdap::D4Group *par_grp, hid_t, const std::string &, int, size_t)
string read_struct_metadata(hid_t s_file_id)
EOS5 handling.
void map_h5_varpath_to_dap4_attr(libdap::D4Group *d4g, libdap::BaseType *d4b, libdap::Structure *d4s, const std::string &, short flag)
A function that maps HDF5 object full path as an attribute to DAP4.
bool breadth_first(hid_t, hid_t, const char *, libdap::D4Group *par_grp, const char *, bool, bool, std::vector< link_info_t > &, eos5_dim_info_t &, std::vector< std::string > &)
void read_objects_structure(libdap::D4Group *d4_grp, const std::string &varname, const std::string &filename, hid_t, bool, bool)
void read_objects_base_type(libdap::D4Group *d4_grp, hid_t, const std::string &varname, const std::string &filename, hid_t, bool, bool, eos5_dim_info_t &)
void add_dap4_coverage_default(libdap::D4Group *d4_grp, const std::vector< std::string > &handled_coord_names)
Add DAP4 coverage.
double point_right
The rightmost coordinate value of a Grid.
double point_upper
The top coordinate value of a Grid.
double point_lower
The bottom coordinate value of a Grid.
double point_left
The leftmost coordinate value of a Grid.