44using namespace HDF5CF;
47EOS5CVar::EOS5CVar(
const Var*var)
50 newname = var->newname;
52 fullpath = var->fullpath;
54 total_elems = var->total_elems;
55 zero_storage_size = var->zero_storage_size;
57 unsupported_attr_dtype = var->unsupported_attr_dtype;
58 unsupported_dspace = var->unsupported_dspace;
59 coord_attr_add_path =
false;
61 for (
const auto &vattr:var->attrs) {
62 auto attr_unique = make_unique<Attribute>();
63 auto attr = attr_unique.release();
64 attr->name = vattr->name;
65 attr->newname = vattr->newname;
66 attr->dtype = vattr->dtype;
67 attr->count = vattr->count;
68 attr->strsize = vattr->strsize;
69 attr->fstrsize = vattr->fstrsize;
70 attr->value = vattr->value;
71 attrs.push_back(attr);
74 for (
const auto &vdim:var->dims) {
75 auto dim_unique = make_unique<Dimension>(vdim->size);
76 auto dim = dim_unique.release();
77 dim->name = vdim->name;
78 dim->newname = vdim->newname;
79 dim->unlimited_dim = vdim->unlimited_dim;
93 eos5_pixelreg = HE5_HDFE_CENTER;
94 eos5_origin = HE5_HDFE_GD_UL;
95 eos5_projcode = HE5_GCTP_GEO;
98 std::fill_n(param, 13, 0);
105void EOS5CFGrid::Update_Dimnamelist()
108 BESDEBUG(
"h5",
"coming to Update_Dimnamelist" <<endl);
114 for (
auto it = this->vardimnames.begin(); it != this->vardimnames.end(); ++it) {
115 string xydimname_candidate = HDF5CFUtil::obtain_string_after_lastslash(*it);
116 if (
"XDim" == xydimname_candidate) {
117 this->vardimnames.erase(*it);
122 for (
auto it = this->vardimnames.begin(); it != this->vardimnames.end(); ++it) {
123 string xydimname_candidate = HDF5CFUtil::obtain_string_after_lastslash(*it);
124 if (
"YDim" == xydimname_candidate) {
125 this->vardimnames.erase(*it);
135 for (vector<EOS5CVar *>::const_iterator i = this->cvars.begin(); i != this->cvars.end(); ++i)
138 for (vector<EOS5CFGrid *>::const_iterator i = this->eos5cfgrids.begin(); i != this->eos5cfgrids.end(); ++i)
141 for (vector<EOS5CFSwath *>::const_iterator i = this->eos5cfswaths.begin(); i != this->eos5cfswaths.end(); ++i)
144 for (vector<EOS5CFZa *>::const_iterator i = this->eos5cfzas.begin(); i != this->eos5cfzas.end(); ++i)
150string EOS5File::get_CF_string(
string s)
155 return File::get_CF_string(s);
158 return File::get_CF_string(s);
173 for (
const auto &cvar:this->cvars) {
176 if ((CV_EXIST == cvar->cvartype) || (CV_MODIFY == cvar->cvartype)) {
177 for (
const auto &attr:cvar->attrs)
178 Retrieve_H5_Attr_Value(attr, cvar->fullpath);
190 for (
const auto &cvar:this->cvars) {
193 if ((CV_EXIST == cvar->cvartype) || (CV_MODIFY == cvar->cvartype)) {
194 for (
const auto &attr:cvar->attrs)
195 Retrieve_H5_Attr_Value(attr, cvar->fullpath);
201void EOS5File::Adjust_H5_Attr_Value(
const Attribute* )
const
211 if (
true == check_ignored) {
212 Gen_Unsupported_Dtype_Info(include_attr);
216 Handle_EOS5_Unsupported_Dtype(include_attr);
220void EOS5File::Handle_EOS5_Unsupported_Dtype(
bool include_attr)
223 for (
auto ircv = this->cvars.begin(); ircv != this->cvars.end();) {
224 if (
true == include_attr) {
225 for (
auto ira = (*ircv)->attrs.begin(); ira != (*ircv)->attrs.end();) {
226 H5DataType temp_dtype = (*ira)->getType();
227 if (
false == HDF5CFUtil::cf_strict_support_type(temp_dtype,_is_dap4)) {
229 ira = (*ircv)->attrs.erase(ira);
238 H5DataType temp_dtype = (*ircv)->getType();
239 if (!HDF5CFUtil::cf_strict_support_type(temp_dtype,_is_dap4)) {
241 ircv = this->cvars.erase(ircv);
250void EOS5File::Gen_Unsupported_Dtype_Info(
bool include_attr)
253 if (
true == include_attr) {
255 File::Gen_Group_Unsupported_Dtype_Info();
256 File::Gen_Var_Unsupported_Dtype_Info();
257 Gen_VarAttr_Unsupported_Dtype_Info();
264void EOS5File::Gen_VarAttr_Unsupported_Dtype_Info()
268 Gen_DimScale_VarAttr_Unsupported_Dtype_Info();
271 Gen_EOS5_VarAttr_Unsupported_Dtype_Info();
275void EOS5File::Gen_EOS5_VarAttr_Unsupported_Dtype_Info()
278 for (
const auto &cvar:this->cvars) {
281 bool is_ignored = ignored_dimscale_ref_list(cvar);
282 if (
false == cvar->attrs.empty()) {
283 for (
const auto &attr:cvar->attrs) {
284 H5DataType temp_dtype = attr->getType();
286 if (
false == HDF5CFUtil::cf_strict_support_type(temp_dtype,_is_dap4) || (temp_dtype == H5INT64) ||(temp_dtype == H5UINT64)) {
290 if ((
"DIMENSION_LIST" != attr->name)
291 && (
"REFERENCE_LIST" != attr->name ||
true == is_ignored))
292 this->add_ignored_info_attrs(
false, cvar->fullpath, attr->name);
304 if (
true == check_ignored) {
305 Gen_Unsupported_Dspace_Info();
309 Handle_EOS5_Unsupported_Dspace(include_attr);
314void EOS5File::Handle_EOS5_Unsupported_Dspace(
bool include_attr)
317 if (
true == this->unsupported_var_dspace) {
318 for (
auto ircv = this->cvars.begin(); ircv != this->cvars.end();) {
319 if (
true == (*ircv)->unsupported_dspace) {
321 ircv = this->cvars.erase(ircv);
329 if (
true == include_attr) {
330 if (
true == this->unsupported_var_attr_dspace) {
331 for (
auto ircv = this->cvars.begin(); ircv != this->cvars.end(); ++ircv) {
332 if (
false == (*ircv)->attrs.empty()) {
333 if (
true == (*ircv)->unsupported_attr_dspace) {
334 for (
auto ira = (*ircv)->attrs.begin(); ira != (*ircv)->attrs.end();) {
335 if (0 == (*ira)->count) {
337 ira = (*ircv)->attrs.erase(ira);
351void EOS5File::Gen_Unsupported_Dspace_Info()
354 File::Gen_Unsupported_Dspace_Info();
362 remove_netCDF_internal_attributes(include_attr);
364 if(
true == include_attr) {
365 for (
auto irv = this->
vars.begin();
366 irv != this->vars.end(); ++irv) {
367 for (
auto ira = (*irv)->attrs.begin();
368 ira != (*irv)->attrs.end();) {
369 if((*ira)->name ==
"CLASS") {
370 string class_value = Retrieve_Str_Attr_Value(*ira,(*irv)->fullpath);
374 if (0 == class_value.compare(0,15,
"DIMENSION_SCALE")) {
376 ira = (*irv)->attrs.erase(ira);
388 else if((*ira)->name ==
"NAME") {
389 string name_value = Retrieve_Str_Attr_Value(*ira,(*irv)->fullpath);
390 if( 0 == name_value.compare(0,(*irv)->name.size(),(*irv)->name)) {
392 ira =(*irv)->attrs.erase(ira);
395 string netcdf_dim_mark=
"This is a netCDF dimension but not a netCDF variable";
396 if( 0 == name_value.compare(0,netcdf_dim_mark.size(),netcdf_dim_mark)) {
398 ira =(*irv)->attrs.erase(ira);
406 else if((*ira)->name ==
"_Netcdf4Dimid") {
408 ira =(*irv)->attrs.erase(ira);
417 if(
true == include_attr) {
418 for (
auto irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
419 for (
auto ira = (*irv)->attrs.begin(); ira != (*irv)->attrs.end();) {
420 if((*ira)->name ==
"CLASS") {
421 string class_value = Retrieve_Str_Attr_Value(*ira,(*irv)->fullpath);
425 if (0 == class_value.compare(0,15,
"DIMENSION_SCALE")) {
427 ira = (*irv)->attrs.erase(ira);
434 else if((*ira)->name ==
"NAME") {
436 ira=(*irv)->attrs.erase(ira);
439 string name_value = Retrieve_Str_Attr_Value(*ira,(*irv)->fullpath);
440 if( 0 == name_value.compare(0,(*irv)->name.size(),(*irv)->name)) {
442 ira =(*irv)->attrs.erase(ira);
445 string netcdf_dim_mark=
"This is a netCDF dimension but not a netCDF variable";
446 if( 0 == name_value.compare(0,netcdf_dim_mark.size(),netcdf_dim_mark)) {
448 ira =(*irv)->attrs.erase(ira);
456 else if((*ira)->name ==
"_Netcdf4Dimid") {
458 ira =(*irv)->attrs.erase(ira);
473 if (
true == this->check_ignored &&
true == include_attr) {
476 if (
true == HDF5RequestHandler::get_drop_long_string()) {
478 for (
auto ira = this->
root_attrs.begin(); ira != this->root_attrs.end(); ++ira) {
479 if (H5FSTRING == (*ira)->dtype || H5VSTRING == (*ira)->dtype) {
480 if ((*ira)->getBufSize() > NC_JAVA_STR_SIZE_LIMIT) {
481 this->add_ignored_droplongstr_hdr();
482 this->add_ignored_grp_longstr_info(
"/", (*ira)->name);
487 for (
auto irg = this->
groups.begin(); irg != this->groups.end(); ++irg) {
488 for (
auto ira = (*irg)->attrs.begin(); ira != (*irg)->attrs.end(); ++ira) {
489 if (H5FSTRING == (*ira)->dtype || H5VSTRING == (*ira)->dtype) {
490 if ((*ira)->getBufSize() > NC_JAVA_STR_SIZE_LIMIT) {
491 this->add_ignored_droplongstr_hdr();
492 this->add_ignored_grp_longstr_info((*irg)->path, (*ira)->name);
499 for (
auto irv = this->
vars.begin(); irv != this->vars.end(); ++irv) {
500 if (
true == Check_DropLongStr((*irv),
nullptr)) {
501 string ecsmeta_grp =
"/HDFEOS INFORMATION";
503 if ((*irv)->fullpath.find(ecsmeta_grp) != 0
504 || ((*irv)->fullpath.rfind(
"/") != ecsmeta_grp.size())) {
505 this->add_ignored_droplongstr_hdr();
506 this->add_ignored_var_longstr_info((*irv),
nullptr);
510 for (
auto ira = (*irv)->attrs.begin(); ira != (*irv)->attrs.end(); ++ira) {
511 if (
true == Check_DropLongStr((*irv), (*ira))) {
512 this->add_ignored_droplongstr_hdr();
513 this->add_ignored_var_longstr_info((*irv), (*ira));
519 for (
auto irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
520 for (
auto ira = (*irv)->attrs.begin(); ira != (*irv)->attrs.end(); ++ira) {
521 if (
true == Check_DropLongStr((*irv), (*ira))) {
522 this->add_ignored_droplongstr_hdr();
523 this->add_ignored_var_longstr_info((*irv), (*ira));
531 if (
false == this->have_ignored) this->add_no_ignored_info();
539 BESDEBUG(
"h5",
"coming to Adjust_EOS5Dim_Info" <<endl);
542 for (
unsigned int i = 0; i < strmeta_info->swath_list.size(); ++i) {
543 HE5Swath& he5s = strmeta_info->swath_list.at(i);
545 Adjust_EOS5Dim_List(he5s.dim_list);
555 if(this->have_udim ==
true) {
556 vector<HE5Var> svlist = he5s.geo_var_list;
557 svlist.insert(svlist.end(),he5s.data_var_list.begin(),he5s.data_var_list.end());
559 Adjust_EOS5DimSize_List(he5s.dim_list,svlist,SWATH,he5s.name);
562 for (
unsigned int j = 0; j < he5s.geo_var_list.size(); ++j) {
563 Adjust_EOS5VarDim_Info((he5s.geo_var_list)[j].dim_list, he5s.dim_list, he5s.name, SWATH);
565 for (
unsigned int j = 0; j < he5s.data_var_list.size(); ++j) {
566 Adjust_EOS5VarDim_Info((he5s.data_var_list)[j].dim_list, he5s.dim_list, he5s.name, SWATH);
570 for (
unsigned int i = 0; i < strmeta_info->grid_list.size(); ++i) {
572 HE5Grid& he5g = strmeta_info->grid_list.at(i);
574 Adjust_EOS5Dim_List(he5g.dim_list);
577 if(this->have_udim ==
true) {
579 Adjust_EOS5DimSize_List(he5g.dim_list,he5g.data_var_list,GRID,he5g.name);
582 for (
unsigned int j = 0; j < he5g.data_var_list.size(); ++j) {
583 Adjust_EOS5VarDim_Info((he5g.data_var_list)[j].dim_list, he5g.dim_list, he5g.name, GRID);
587 for (
unsigned int i = 0; i < strmeta_info->za_list.size(); ++i) {
588 HE5Za& he5z = strmeta_info->za_list.at(i);
590 Adjust_EOS5Dim_List(he5z.dim_list);
593 if(this->have_udim ==
true) {
595 Adjust_EOS5DimSize_List(he5z.dim_list,he5z.data_var_list,ZA,he5z.name);
598 for (
unsigned int j = 0; j < he5z.data_var_list.size(); ++j) {
599 Adjust_EOS5VarDim_Info((he5z.data_var_list)[j].dim_list, he5z.dim_list, he5z.name, ZA);
605void EOS5File::Adjust_EOS5Dim_List(vector<HE5Dim>& groupdimlist)
const
608 BESDEBUG(
"h5",
"Coming to Adjust_EOS5Dim_List"<<endl);
612 Remove_NegativeSizeDims(groupdimlist);
615 Condense_EOS5Dim_List(groupdimlist);
621void EOS5File::Remove_NegativeSizeDims(vector<HE5Dim>& groupdimlist)
const
624 BESDEBUG(
"h5",
"Coming to Remove_NegativeSizeDims" <<endl);
633 for (
auto id = groupdimlist.begin();
id != groupdimlist.end();) {
634 if ((*id).size <= 0) {
635 id = groupdimlist.erase(
id);
647void EOS5File::Condense_EOS5Dim_List(vector<HE5Dim>& groupdimlist)
const
650 BESDEBUG(
"h5",
"Coming to Condense_EOS5Dim_List"<<endl);
653 pair<set<int>::iterator,
bool> setret;
654 vector<HE5Dim>::iterator id;
656 for (
id = groupdimlist.begin();
id != groupdimlist.end();) {
657 if (
"XDim" == (*id).name ||
"Xdim" == (*id).name) {
658 setret = xdimsizes.insert((*id).size);
659 if (
false == setret.second) {
660 id = groupdimlist.erase(
id);
662 else if (
"Xdim" == (*id).name) {
676 for (
id = groupdimlist.begin();
id != groupdimlist.end();) {
677 if (
"YDim" == (*id).name ||
"Ydim" == (*id).name) {
678 setret = ydimsizes.insert((*id).size);
679 if (
false == setret.second) {
680 id = groupdimlist.erase(
id);
682 else if (
"Ydim" == (*id).name) {
696void EOS5File:: Adjust_EOS5DimSize_List(vector<HE5Dim>& eos5objdimlist,
const vector<HE5Var> & eos5objvarlist,
697 const EOS5Type eos5type,
const string & eos5objname)
const
700 set<string>updated_dimlist;
701 pair<set<string>::iterator,
bool> set_insert_ret;
703 for(
unsigned int i = 0; i<eos5objvarlist.size();i++) {
704 HE5Var he5v = eos5objvarlist.at(i);
705 for(
unsigned int j = 0; j<he5v.dim_list.size();j++) {
706 HE5Dim he5d = he5v.dim_list.at(j);
707 set_insert_ret = updated_dimlist.insert(he5d.name);
708 if(set_insert_ret.second ==
true) {
710 unsigned int objdimlist_index = 9999;
711 bool has_objdimlist_index =
false;
712 for(
unsigned int k = 0; k <eos5objdimlist.size();k++) {
713 if(eos5objdimlist[k].name == he5d.name) {
714 objdimlist_index = k;
715 has_objdimlist_index =
true;
719 if(has_objdimlist_index ==
false)
720 throw2(
"Cannot find the dimension in the EOS5 object dimension list for the dimension ", he5d.name);
721 for (
const auto &var:this->
vars) {
723 EOS5Type vartype = Get_Var_EOS5_Type(var);
726 if(vartype == eos5type) {
727 string var_eos5gname = Obtain_Var_EOS5Type_GroupName(var,vartype);
730 if(var_eos5gname == eos5objname) {
731 if(var->name == he5v.name) {
732 if (he5v.dim_list.size() != var->dims.size())
733 throw2(
"Number of dimensions don't match with the structmetadata for variable ", var->name);
735 (eos5objdimlist[objdimlist_index]).size = (var->dims[j])->size;
746 if(updated_dimlist.size() == eos5objdimlist.size())
750for(
unsigned int k = 0; k <eos5objdimlist.size();k++) {
751 cerr<<
"eos5 obj dim name is "<<eos5objdimlist[k].name <<
" Size is "<< eos5objdimlist[k].size << endl;
758void EOS5File::Adjust_EOS5VarDim_Info(vector<HE5Dim>& vardimlist, vector<HE5Dim>& groupdimlist,
759 const string & eos5_obj_name, EOS5Type eos5type)
762 BESDEBUG(
"h5",
"Coming to Adjust_EOS5VarDim_Info"<<endl);
763 set<string> dimnamelist;
764 pair<set<string>::iterator,
bool> setret;
771 for (
unsigned int i = 0; i < vardimlist.size(); ++i) {
773 HE5Dim& he5d = vardimlist.at(i);
774 bool dim_in_groupdimlist =
false;
775 for (
unsigned int j = 0; j < groupdimlist.size(); ++j) {
776 HE5Dim he5gd = groupdimlist.at(j);
777 if (he5gd.name == he5d.name) {
778 he5d.size = he5gd.size;
779 dim_in_groupdimlist =
true;
784 if (
false == dim_in_groupdimlist)
785 throw2(
"The EOS5 group dimension name list doesn't include the dimension ", he5d.name);
790 setret = dimnamelist.insert(he5d.name);
791 if (
false == setret.second) {
793 string temp_clashname = he5d.name +
'_';
794 HDF5CFUtil::gen_unique_name(temp_clashname, dimnamelist, clash_index);
796 string ori_dimname = he5d.name;
798 he5d.name = temp_clashname;
801 bool dim_exist =
false;
802 for (
unsigned int j = 0; j < groupdimlist.size(); ++j) {
803 if (he5d.name == groupdimlist[j].name && he5d.size == groupdimlist[j].size) {
810 if (
false == dim_exist) {
811 ori_dimname = eos5_obj_name +
"/" + ori_dimname;
812 string dup_dimname = eos5_obj_name +
"/" + he5d.name;
813 if (GRID == eos5type) {
814 ori_dimname =
"/GRIDS/" + ori_dimname;
815 dup_dimname =
"/GRIDS/" + dup_dimname;
817 else if (SWATH == eos5type) {
818 ori_dimname =
"/SWATHS/" + ori_dimname;
819 dup_dimname =
"/SWATHS/" + dup_dimname;
821 else if (ZA == eos5type) {
822 ori_dimname =
"/ZAS/" + ori_dimname;
823 dup_dimname =
"/ZAS/" + dup_dimname;
827 dimname_to_dupdimnamelist.insert(pair<string, string>(ori_dimname, dup_dimname));
828 groupdimlist.push_back(he5d);
840 BESDEBUG(
"h5",
"Coming to Add_EOS5File_Info"<<endl);
841 string fslash_str =
"/";
842 string grid_str =
"/GRIDS/";
843 string swath_str =
"/SWATHS/";
844 string za_str =
"/ZAS/";
852 this->orig_num_grids = (
int)(strmeta_info->grid_list.size());
855 for (
unsigned int i = 0; i < strmeta_info->grid_list.size(); i++) {
856 HE5Grid he5g = strmeta_info->grid_list.at(i);
857 auto eos5grid_unique = make_unique<EOS5CFGrid>();
858 auto eos5grid = eos5grid_unique.release();
859 eos5grid->name = he5g.name;
860 eos5grid->dimnames.resize(he5g.dim_list.size());
862 for (
unsigned int j = 0; j < he5g.dim_list.size(); j++) {
864 HE5Dim he5d = he5g.dim_list.at(j);
865 if (
"XDim" == he5d.name) eos5grid->xdimsize = he5d.size;
866 if (
"YDim" == he5d.name) eos5grid->ydimsize = he5d.size;
876 string unique_dimname = grid_str + he5g.name + fslash_str + he5d.name;
878 (eos5grid->dimnames)[j] = unique_dimname;
880 pair<map<hsize_t, string>::iterator,
bool> mapret1;
881 mapret1 = eos5grid->dimsizes_to_dimnames.insert(pair<hsize_t, string>((hsize_t) he5d.size, unique_dimname));
886 pair<map<string, hsize_t>::iterator,
bool> mapret2;
887 mapret2 = eos5grid->dimnames_to_dimsizes.insert(pair<string, hsize_t>(unique_dimname, (hsize_t) he5d.size));
888 if (
false == mapret2.second)
889 throw5(
"The dimension name ", unique_dimname,
" with the dimension size ", he5d.size,
"is not unique");
894 EOS5SwathGrid_Set_LatLon_Flags(eos5grid, he5g.data_var_list);
897 map<string, string> dnames_to_1dvnames;
898 EOS5Handle_nonlatlon_dimcvars(he5g.data_var_list, GRID, he5g.name, dnames_to_1dvnames);
899 eos5grid->dnames_to_1dvnames = dnames_to_1dvnames;
905 eos5grid->eos5_pixelreg = he5g.pixelregistration;
906 eos5grid->eos5_origin = he5g.gridorigin;
907 eos5grid->eos5_projcode = he5g.projection;
909 for (
unsigned int k = 0; k < 13; k++)
910 eos5grid->param[k] = he5g.param[k];
911 eos5grid->zone = he5g.zone;
912 eos5grid->sphere = he5g.sphere;
914 this->eos5cfgrids.push_back(eos5grid);
919 this->grids_multi_latloncvs = grids_mllcv;
922 for (
unsigned int i = 0; i < strmeta_info->swath_list.size(); i++) {
924 HE5Swath he5s = strmeta_info->swath_list.at(i);
925 auto eos5swath_unique = make_unique<EOS5CFSwath>();
926 auto eos5swath = eos5swath_unique.release();
927 eos5swath->name = he5s.name;
928 eos5swath->dimnames.resize(he5s.dim_list.size());
930 for (
unsigned int j = 0; j < he5s.dim_list.size(); j++) {
932 HE5Dim he5d = he5s.dim_list.at(j);
942 string unique_dimname = swath_str + he5s.name + fslash_str + he5d.name;
943 (eos5swath->dimnames)[j] = unique_dimname;
947 pair<map<hsize_t, string>::iterator,
bool> mapret1;
948 mapret1 = eos5swath->dimsizes_to_dimnames.insert(
949 pair<hsize_t, string>((hsize_t) he5d.size, unique_dimname));
954 pair<map<string, hsize_t>::iterator,
bool> mapret2;
955 mapret2 = eos5swath->dimnames_to_dimsizes.insert(
956 pair<string, hsize_t>(unique_dimname, (hsize_t) he5d.size));
957 if (
false == mapret2.second)
958 throw5(
"The dimension name ", unique_dimname,
" with the dimension size ", he5d.size,
"is not unique");
963 EOS5SwathGrid_Set_LatLon_Flags(eos5swath, he5s.geo_var_list);
966 map<string, string> dnames_to_geo1dvnames;
967 EOS5Handle_nonlatlon_dimcvars(he5s.geo_var_list, SWATH, he5s.name, dnames_to_geo1dvnames);
968 eos5swath->dnames_to_geo1dvnames = dnames_to_geo1dvnames;
969 this->eos5cfswaths.push_back(eos5swath);
973 for (
unsigned int i = 0; i < strmeta_info->za_list.size(); i++) {
975 HE5Za he5z = strmeta_info->za_list.at(i);
977 auto eos5za_unique = make_unique<EOS5CFZa>();
978 auto eos5za = eos5za_unique.release();
979 eos5za->name = he5z.name;
980 eos5za->dimnames.resize(he5z.dim_list.size());
982 for (
unsigned int j = 0; j < he5z.dim_list.size(); j++) {
984 HE5Dim he5d = he5z.dim_list.at(j);
990 string unique_dimname = za_str + he5z.name + fslash_str + he5d.name;
991 (eos5za->dimnames)[j] = unique_dimname;
992 pair<map<hsize_t, string>::iterator,
bool> mapret1;
993 mapret1 = eos5za->dimsizes_to_dimnames.insert(pair<hsize_t, string>((hsize_t) he5d.size, unique_dimname));
998 pair<map<string, hsize_t>::iterator,
bool> mapret2;
999 mapret2 = eos5za->dimnames_to_dimsizes.insert(pair<string, hsize_t>(unique_dimname, (hsize_t) he5d.size));
1000 if (
false == mapret2.second)
1001 throw5(
"The dimension name ", unique_dimname,
" with the dimension size ", he5d.size,
"is not unique");
1006 map<string, string> dnames_to_1dvnames;
1007 EOS5Handle_nonlatlon_dimcvars(he5z.data_var_list, ZA, he5z.name, dnames_to_1dvnames);
1008 eos5za->dnames_to_1dvnames = dnames_to_1dvnames;
1009 this->eos5cfzas.push_back(eos5za);
1014 for (
auto irg = this->eos5cfgrids.begin();
1015 irg != this->eos5cfgrids.end(); ++irg) {
1017 cerr<<
"grid name "<<(*irg)->name <<endl;
1018 cerr<<
"eos5_pixelreg"<<(*irg)->eos5_pixelreg <<endl;
1019 cerr<<
"eos5_origin"<<(*irg)->eos5_pixelreg <<endl;
1020 cerr<<
"point_lower "<<(*irg)->point_lower <<endl;
1021 cerr<<
"xdimsize "<<(*irg)->xdimsize <<endl;
1023 if((*irg)->has_g2dlatlon) cerr<<
"has g2dlatlon"<<endl;
1024 if((*irg)->has_2dlatlon) cerr<<
"has 2dlatlon"<<endl;
1025 if((*irg)->has_1dlatlon) cerr<<
"has 1dlatlon"<<endl;
1026 if((*irg)->has_nolatlon) cerr<<
"has no latlon" <<endl;
1027 if(this->grids_multi_latloncvs) cerr<<
"having multiple lat/lon from structmeta" <<endl;
1028 else cerr<<
"no multiple lat/lon from structmeta" <<endl;
1031 "h5",
"number of dimensions "<<(*irg)->dimnames.size() <<endl;
1032 for (
auto irv = (*irg)->dimnames.begin();
1033 irv != (*irg)->dimnames.end(); ++irv)
1034 cerr<<
"dim names" <<*irv <<endl;
1037 for (
auto im1 = (*irg)->dimsizes_to_dimnames.begin();
1038 im1 !=(*irg)->dimsizes_to_dimnames.end();++im1) {
1039 cerr<<
"size to name "<< (
int)((*im1).first) <<
"=> "<<(*im1).second <<endl;
1043 for (
auto im2 = (*irg)->dnames_to_1dvnames.begin();
1044 im2 !=(*irg)->dnames_to_1dvnames.end();++im2) {
1045 cerr<<
"dimanme to 1d var name "<< (*im2).first <<
"=> "<<(*im2).second <<endl;
1050 for (
auto irg = this->eos5cfswaths.begin();
1051 irg != this->eos5cfswaths.end(); ++irg) {
1053 cerr<<
"swath name "<<(*irg)->name <<endl;
1054 if((*irg)->has_nolatlon) cerr<<
"has no latlon" <<endl;
1055 if((*irg)->has_1dlatlon) cerr<<
"has 1dlatlon"<<endl;
1056 if((*irg)->has_2dlatlon) cerr<<
"has 2dlatlon"<<endl;
1059 for (
auto irv = (*irg)->dimnames.begin();
1060 irv != (*irg)->dimnames.end(); ++irv)
1061 cerr<<
"dim names" <<*irv <<endl;
1064 for (
auto im1 = (*irg)->dimsizes_to_dimnames.begin();
1065 im1 !=(*irg)->dimsizes_to_dimnames.end();++im1) {
1066 cerr<<
"size to name "<< (
int)((*im1).first) <<
"=> "<<(*im1).second <<endl;
1070 for (
auto im2 = (*irg)->dnames_to_geo1dvnames.begin();
1071 im2 !=(*irg)->dnames_to_geo1dvnames.end();++im2) {
1072 cerr<<
"dimname to 1d varname "<< (*im2).first <<
"=> "<<(*im2).second <<endl;
1076 for (
auto irg = this->eos5cfzas.begin();
1077 irg != this->eos5cfzas.end(); ++irg) {
1079 cerr<<
"za name now"<<(*irg)->name <<endl;
1082 for (
auto irv = (*irg)->dimnames.begin();
1083 irv != (*irg)->dimnames.end(); ++irv)
1084 cerr<<
"dim names" <<*irv <<endl;
1087 for (
auto im1 = (*irg)->dimsizes_to_dimnames.begin();
1088 im1 !=(*irg)->dimsizes_to_dimnames.end();++im1) {
1089 cerr<<
"size to name "<< (
int)((*im1).first) <<
"=> "<<(*im1).second <<endl;
1093 for (
auto im2 = (*irg)->dnames_to_1dvnames.begin();
1094 im2 !=(*irg)->dnames_to_1dvnames.end();++im2) {
1095 cerr<<
"dimname to 1d varname "<< (*im2).first <<
"=> "<<(*im2).second <<endl;
1104void EOS5File::EOS5SwathGrid_Set_LatLon_Flags(T* eos5gridswath, vector<HE5Var> &eos5varlist)
const
1107 BESDEBUG(
"h5",
"Coming to EOS5SwathGrid_Set_LatLon_Flags"<<endl);
1108 bool find_lat =
false;
1109 bool find_lon =
false;
1110 bool has_1dlat =
false;
1111 bool has_1dlon =
false;
1112 bool has_2dlat =
false;
1113 string lat_xdimname;
1114 string lat_ydimname;
1115 string lon_xdimname;
1116 string lon_ydimname;
1117 bool has_2dlon =
false;
1118 bool has_g2dlat =
false;
1119 bool has_g2dlon =
false;
1121 for (
unsigned int i = 0; i < eos5varlist.size(); ++i) {
1122 HE5Var he5v = eos5varlist.at(i);
1123 if (
"Latitude" == he5v.name) {
1125 auto num_dims = (
int)(he5v.dim_list.size());
1128 else if (2 == num_dims) {
1129 lat_ydimname = (he5v.dim_list)[0].name;
1130 lat_xdimname = (he5v.dim_list)[1].name;
1133 else if (num_dims > 2)
1136 throw1(
"The number of dimension should not be 0 for grids or swaths");
1139 if (
"Longitude" == he5v.name) {
1141 auto num_dims = (int)(he5v.dim_list.size());
1144 else if (2 == num_dims) {
1145 lon_ydimname = (he5v.dim_list)[0].name;
1146 lon_xdimname = (he5v.dim_list)[1].name;
1149 else if (num_dims > 2)
1152 throw1(
"The number of dimension should not be 0 for grids or swaths");
1155 if (
true == find_lat &&
true == find_lon) {
1156 if (
true == has_1dlat &&
true == has_1dlon) eos5gridswath->has_1dlatlon =
true;
1159 if (
true == has_2dlat &&
true == has_2dlon && lat_ydimname == lon_ydimname && lat_xdimname == lon_xdimname)
1160 eos5gridswath->has_2dlatlon =
true;
1162 if (
true == has_g2dlat &&
true == has_g2dlon) eos5gridswath->has_g2dlatlon =
true;
1164 eos5gridswath->has_nolatlon =
false;
1172void EOS5File::EOS5Handle_nonlatlon_dimcvars(vector<HE5Var> & eos5varlist, EOS5Type eos5type,
const string &groupname,
1173 map<string, string>& dnamesgeo1dvnames)
const
1176 BESDEBUG(
"h5",
"Coming to EOS5Handle_nonlatlon_dimcvars"<<endl);
1178 set<string> nocvdimnames;
1179 string grid_str =
"/GRIDS/";
1180 string xdim_str =
"XDim";
1181 string ydim_str =
"YDim";
1182 string fslash_str =
"/";
1185 if (GRID == eos5type) {
1186 string xdimname = grid_str + groupname + fslash_str + xdim_str;
1187 nocvdimnames.insert(xdimname);
1188 string ydimname = grid_str + groupname + fslash_str + ydim_str;
1189 nocvdimnames.insert(ydimname);
1190 eos5typestr =
"/GRIDS/";
1192 else if (SWATH == eos5type)
1193 eos5typestr =
"/SWATHS/";
1194 else if (ZA == eos5type)
1195 eos5typestr =
"/ZAS/";
1197 throw1(
"Unsupported HDF-EOS5 type, this type is not swath, grid or zonal average");
1201 pair<map<string, string>::iterator,
bool> mapret;
1202 for (
unsigned int i = 0; i < eos5varlist.size(); ++i) {
1203 HE5Var he5v = eos5varlist.at(i);
1204 if (1 == he5v.dim_list.size()) {
1205 HE5Dim he5d = he5v.dim_list.at(0);
1207 dimname = eos5typestr + groupname + fslash_str + he5d.name;
1209 varname = eos5typestr + groupname + fslash_str + he5v.name;
1210 mapret = dnamesgeo1dvnames.insert(pair<string, string>(dimname, varname));
1215 if (
false == mapret.second) nocvdimnames.insert(dimname);
1221 for (
auto itset = nocvdimnames.begin(); itset != nocvdimnames.end(); ++itset)
1222 dnamesgeo1dvnames.erase(*itset);
1229 BESDEBUG(
"h5",
"Coming to Adjust_Var_NewName_After_Parsing"<<endl);
1230 for (
const auto &var:this->vars) {
1231 Obtain_Var_NewName(var);
1235void EOS5File::Obtain_Var_NewName(
Var *var)
const
1238 BESDEBUG(
"h5",
"Coming to Obtain_Var_NewName"<<endl);
1239 string fslash_str =
"/";
1242 EOS5Type vartype = Get_Var_EOS5_Type(var);
1250 eos5typestr =
"/GRIDS/";
1251 string eos5_groupname = Obtain_Var_EOS5Type_GroupName(var, vartype);
1256 var->newname = eos5typestr + eos5_groupname + fslash_str + var->name;
1261 eos5typestr =
"/SWATHS/";
1262 string eos5_groupname = Obtain_Var_EOS5Type_GroupName(var, vartype);
1267 var->newname = eos5typestr + eos5_groupname + fslash_str + var->name;
1271 eos5typestr =
"/ZAS/";
1272 string eos5_groupname = Obtain_Var_EOS5Type_GroupName(var, vartype);
1277 var->newname = eos5typestr + eos5_groupname + fslash_str + var->name;
1281 string eos5infopath =
"/HDFEOS INFORMATION";
1282 if (var->fullpath.size() > eos5infopath.size()) {
1283 if (eos5infopath == var->fullpath.substr(0, eos5infopath.size())) var->newname = var->name;
1286 var->newname = var->fullpath;
1290 throw1(
"Non-supported EOS type");
1295EOS5Type EOS5File::Get_Var_EOS5_Type(
const Var* var)
const
1298 BESDEBUG(
"h5",
"Coming to Get_Var_EOS5_Type"<<endl);
1300 string EOS5GRIDPATH =
"/HDFEOS/GRIDS";
1301 string EOS5SWATHPATH =
"/HDFEOS/SWATHS";
1302 string EOS5ZAPATH =
"/HDFEOS/ZAS";
1304 if (var->fullpath.size() >= EOS5GRIDPATH.size()) {
1305 if (EOS5GRIDPATH == var->fullpath.substr(0, EOS5GRIDPATH.size()))
return GRID;
1307 if (var->fullpath.size() >= EOS5SWATHPATH.size()) {
1308 if (EOS5SWATHPATH == var->fullpath.substr(0, EOS5SWATHPATH.size()))
return SWATH;
1310 if (var->fullpath.size() >= EOS5ZAPATH.size()) {
1311 if (EOS5ZAPATH == var->fullpath.substr(0, EOS5ZAPATH.size()))
return ZA;
1321 BESDEBUG(
"h5",
"Coming to Add_Dim_Name"<<endl);
1322 for (
const auto &var:this->vars) {
1323 Obtain_Var_Dims(var, strmeta_info);
1325 for (
auto ird = (*irv)->dims.begin();
1326 ird != (*irv)->dims.end();++ird) {
1327 cerr<<
"dim name right after change "<<(*ird)->newname <<endl;
1335bool EOS5File::Obtain_Var_Dims(
const Var *var,
HE5Parser * strmeta_info)
1338 BESDEBUG(
"h5",
"Coming to Obtain_Var_Dims"<<endl);
1339 string varname_from_parser;
1340 EOS5Type vartype = Get_Var_EOS5_Type(var);
1342 if (GRID == vartype) {
1344 auto num_grids = (
int)(strmeta_info->grid_list.size());
1346 for (
int i = 0; i < num_grids; ++i) {
1347 HE5Grid he5g = strmeta_info->grid_list.at(i);
1348 if (he5g.name == Obtain_Var_EOS5Type_GroupName(var, vartype)) {
1349 EOS5CFGrid *eos5cfgrid = (this->eos5cfgrids)[i];
1350 bool var_is_parsed = Set_Var_Dims(eos5cfgrid, var, he5g.data_var_list, he5g.name, num_grids, GRID);
1351 if (
false == var_is_parsed) {
1352 map<hsize_t, string> dimsizes_to_dimnames = eos5cfgrid->dimsizes_to_dimnames;
1357 Set_NonParse_Var_Dims(eos5cfgrid, var, dimsizes_to_dimnames, num_grids, vartype);
1363 else if (SWATH == vartype) {
1365 auto num_swaths = (int)(strmeta_info->swath_list.size());
1367 for (
int i = 0; i < num_swaths; ++i) {
1369 HE5Swath he5s = strmeta_info->swath_list.at(i);
1371 if (he5s.name == Obtain_Var_EOS5Type_GroupName(var, vartype)) {
1373 EOS5CFSwath *eos5cfswath = (this->eos5cfswaths)[i];
1375 bool var_is_parsed =
true;
1376 int swath_fieldtype_flag = Check_EOS5Swath_FieldType(var);
1377 if (1 == swath_fieldtype_flag)
1378 var_is_parsed = Set_Var_Dims(eos5cfswath, var, he5s.geo_var_list, he5s.name, num_swaths, SWATH);
1379 else if (0 == swath_fieldtype_flag)
1380 var_is_parsed = Set_Var_Dims(eos5cfswath, var, he5s.data_var_list, he5s.name, num_swaths, SWATH);
1383 var_is_parsed =
false;
1385 if (
false == var_is_parsed) {
1386 map<hsize_t, string> dimsizes_to_dimnames = eos5cfswath->dimsizes_to_dimnames;
1387 Set_NonParse_Var_Dims(eos5cfswath, var, dimsizes_to_dimnames, num_swaths, vartype);
1393 else if (ZA == vartype) {
1395 auto num_zas = (int)(strmeta_info->za_list.size());
1397 for (
int i = 0; i < num_zas; ++i) {
1398 HE5Za he5z = strmeta_info->za_list.at(i);
1399 if (he5z.name == Obtain_Var_EOS5Type_GroupName(var, vartype)) {
1400 EOS5CFZa *eos5cfza = (this->eos5cfzas)[i];
1401 bool var_is_parsed = Set_Var_Dims(eos5cfza, var, he5z.data_var_list, he5z.name, num_zas, ZA);
1402 if (
false == var_is_parsed) {
1403 map<hsize_t, string> dimsizes_to_dimnames = eos5cfza->dimsizes_to_dimnames;
1404 Set_NonParse_Var_Dims(eos5cfza, var, dimsizes_to_dimnames, num_zas, vartype);
1414bool EOS5File::Set_Var_Dims(T* eos5data,
const Var *var, vector<HE5Var> &he5var,
const string& groupname,
int num_groups,
1418 BESDEBUG(
"h5",
"Coming to Set_Var_Dims"<<endl);
1420 bool is_parsed =
false;
1422 string fslash_str =
"/";
1424 if (GRID == eos5type)
1425 eos5typestr =
"/GRIDS/";
1426 else if (SWATH == eos5type)
1427 eos5typestr =
"/SWATHS/";
1428 else if (ZA == eos5type)
1429 eos5typestr =
"/ZAS/";
1431 throw1(
"Unsupported HDF-EOS5 type, this type is not swath, grid or zonal average");
1433 for (
unsigned int i = 0; i < he5var.size(); i++) {
1435 HE5Var he5v = he5var.at(i);
1437 if (he5v.name == var->name) {
1438 if (he5v.dim_list.size() != var->dims.size())
1439 throw2(
"Number of dimensions don't match with the structmetadata for variable ", var->name);
1469 set<hsize_t> dimsize_have_name_set;
1470 pair<set<hsize_t>::iterator,
bool> setret1;
1471 set<string> thisvar_dimname_set;
1472 pair<set<string>::iterator,
bool> setret2;
1474 for (
unsigned int j = 0; j < he5v.dim_list.size(); j++) {
1475 HE5Dim he5d = he5v.dim_list.at(j);
1476 for (
const auto &dim:var->dims) {
1478 if ((hsize_t) (he5d.size) == dim->size) {
1480 if (
"" == dim->name) {
1481 string dimname_candidate = eos5typestr + groupname + fslash_str + he5d.name;
1482 setret2 = thisvar_dimname_set.insert(dimname_candidate);
1483 if (
true == setret2.second) {
1484 dim->name = dimname_candidate;
1486 dim->newname = (num_groups == 1) ? he5d.name : dim->name;
1487 eos5data->vardimnames.insert(dim->name);
1491 eos5data->dimnames_to_unlimited[dim->name] = dim->unlimited_dim;
1500 for (
const auto &dim:var->dims) {
1501 if (
"" == dim->name)
1502 Create_Unique_DimName(eos5data, thisvar_dimname_set, dim, num_groups, eos5type);
1511void EOS5File::Create_Unique_DimName(T*eos5data, set<string>& thisvar_dimname_set, Dimension *dim,
int num_groups,
1515 BESDEBUG(
"h5",
"Coming to Create_Unique_DimName"<<endl);
1516 map<hsize_t, string>::iterator itmap1;
1517 map<string, hsize_t>::iterator itmap2;
1518 pair<set<string>::iterator,
bool> setret2;
1519 itmap1 = (eos5data->dimsizes_to_dimnames).find(dim->size);
1526 if (itmap1 != (eos5data->dimsizes_to_dimnames).end()) {
1527 string dimname_candidate = (eos5data->dimsizes_to_dimnames)[dim->size];
1530 setret2 = thisvar_dimname_set.insert(dimname_candidate);
1532 if (
false == setret2.second) {
1535 bool match_some_dimname = Check_All_DimNames(eos5data, dimname_candidate, dim->size);
1537 if (
false == match_some_dimname) {
1540 Get_Unique_Name(eos5data->vardimnames, dimname_candidate);
1541 thisvar_dimname_set.insert(dimname_candidate);
1544 Insert_One_NameSizeMap_Element2(eos5data->dimnames_to_dimsizes, eos5data->dimnames_to_unlimited,
1545 dimname_candidate, dim->size, dim->unlimited_dim);
1546 eos5data->dimsizes_to_dimnames.insert(pair<hsize_t, string>(dim->size, dimname_candidate));
1547 eos5data->dimnames.push_back(dimname_candidate);
1552 dim->name = dimname_candidate;
1554 dim->newname = dim->name;
1556 string dname = HDF5CFUtil::obtain_string_after_lastslash(dim->name);
1558 throw3(
"The dimension name ", dim->name,
" of the variable is not right");
1560 dim->newname = dname;
1566 string Fakedimname = Create_Unique_FakeDimName(eos5data, eos5type);
1567 thisvar_dimname_set.insert(Fakedimname);
1570 Insert_One_NameSizeMap_Element2(eos5data->dimnames_to_dimsizes, eos5data->dimnames_to_unlimited, Fakedimname,
1571 dim->size, dim->unlimited_dim);
1572 eos5data->dimsizes_to_dimnames.insert(pair<hsize_t, string>(dim->size, Fakedimname));
1573 eos5data->dimnames.push_back(Fakedimname);
1574 dim->name = Fakedimname;
1576 dim->newname = dim->name;
1578 string dname = HDF5CFUtil::obtain_string_after_lastslash(dim->name);
1580 throw3(
"The dimension name ", dim->name,
" of the variable is not right");
1582 dim->newname = dname;
1589bool EOS5File::Check_All_DimNames(T* eos5data,
string& dimname, hsize_t dimsize)
const
1592 BESDEBUG(
"h5",
"Coming to Check_All_DimNames"<<endl);
1593 bool ret_flag =
false;
1594 for (map<string, hsize_t>::iterator im = eos5data->dimnames_to_dimsizes.begin();
1595 im != eos5data->dimnames_to_dimsizes.end(); ++im) {
1597 if (dimsize == (*im).second && dimname != (*im).first) {
1598 dimname = (*im).first;
1607void EOS5File::Get_Unique_Name(set<string> & nameset,
string& dimname_candidate)
const
1610 BESDEBUG(
"h5",
"Coming to Get_Unique_Name"<<endl);
1611 int clash_index = 1;
1612 string temp_clashname = dimname_candidate +
'_';
1613 HDF5CFUtil::gen_unique_name(temp_clashname, nameset, clash_index);
1614 dimname_candidate = temp_clashname;
1619string EOS5File::Create_Unique_FakeDimName(T*eos5data, EOS5Type eos5type)
const
1622 BESDEBUG(
"h5",
"Coming to Create_Unique_FakeDimName"<<endl);
1623 string fslash_str =
"/";
1625 if (GRID == eos5type)
1626 eos5typestr =
"/GRIDS/";
1627 else if (SWATH == eos5type)
1628 eos5typestr =
"/SWATHS/";
1629 else if (ZA == eos5type)
1630 eos5typestr =
"/ZAS/";
1632 throw1(
"Unsupported HDF-EOS5 type, this type is not swath, grid or zonal average");
1634 stringstream sfakedimindex;
1635 sfakedimindex << eos5data->addeddimindex;
1636 string fakedimstr =
"FakeDim";
1637 string added_dimname = eos5typestr + eos5data->name + fslash_str + fakedimstr + sfakedimindex.str();
1639 pair<set<string>::iterator,
bool> setret;
1640 setret = eos5data->vardimnames.insert(added_dimname);
1641 if (
false == setret.second) Get_Unique_Name(eos5data->vardimnames, added_dimname);
1642 eos5data->addeddimindex = eos5data->addeddimindex + 1;
1643 return added_dimname;
1647string EOS5File::Obtain_Var_EOS5Type_GroupName(
const Var*var, EOS5Type eos5type)
const
1650 BESDEBUG(
"h5",
"Coming to Obtain_Var_EOS5Type_GroupName"<<endl);
1651 string EOS5GRIDPATH =
"/HDFEOS/GRIDS";
1652 string EOS5SWATHPATH =
"/HDFEOS/SWATHS";
1653 string EOS5ZAPATH =
"/HDFEOS/ZAS";
1654 size_t eostypename_start_pos = 0;
1655 size_t eostypename_end_pos;
1662 if (GRID == eos5type)
1663 eostypename_start_pos = EOS5GRIDPATH.size() + 1;
1664 else if (SWATH == eos5type)
1665 eostypename_start_pos = EOS5SWATHPATH.size() + 1;
1666 else if (ZA == eos5type)
1667 eostypename_start_pos = EOS5ZAPATH.size() + 1;
1669 throw2(
"Non supported eos5 type for var ", var->fullpath);
1671 eostypename_end_pos = var->fullpath.find(
'/', eostypename_start_pos) - 1;
1672 groupname = var->fullpath.substr(eostypename_start_pos, eostypename_end_pos - eostypename_start_pos + 1);
1674 BESDEBUG(
"h5",
"In Obtain_Var_EOS5Type_GroupName(), the groupname is "<<groupname << endl);
1680int EOS5File::Check_EOS5Swath_FieldType(
const Var*var)
const
1683 string geofield_relative_path =
"/Geolocation Fields/" + var->name;
1684 string datafield_relative_path =
"/Data Fields/" + var->name;
1688 if (var->fullpath.size() > datafield_relative_path.size()) {
1689 size_t field_pos_in_full_path = var->fullpath.size() - datafield_relative_path.size();
1690 if (var->fullpath.rfind(datafield_relative_path, field_pos_in_full_path) != string::npos) tempflag = 0;
1693 if (tempflag != 0 && (var->fullpath.size() > geofield_relative_path.size())) {
1694 size_t field_pos_in_full_path = var->fullpath.size() - geofield_relative_path.size();
1695 if (var->fullpath.rfind(geofield_relative_path, field_pos_in_full_path) != string::npos) tempflag = 1;
1703void EOS5File::Set_NonParse_Var_Dims(T*eos5data,
const Var* var,
const map<hsize_t, string>& ,
1704 int num_groups, EOS5Type eos5type)
1707 BESDEBUG(
"h5",
"Coming to Set_NonParse_Var_Dims"<<endl);
1708 map<hsize_t, string>::iterator itmap;
1709 set<string> thisvar_dimname_set;
1711 for (
const auto &vdim:var->dims) {
1712 if (
"" == vdim->name)
1713 Create_Unique_DimName(eos5data, thisvar_dimname_set, vdim, num_groups, eos5type);
1715 throw5(
"The dimension name ", vdim->name,
" of the variable ", var->name,
" is not right");
1723 BESDEBUG(
"h5",
"Coming to Check_Aura_Product_Status"<<endl);
1726 string eos5_fattr_group_name =
"/HDFEOS/ADDITIONAL/FILE_ATTRIBUTES";
1727 string instrument_attr_name =
"InstrumentName";
1730 for (
const auto &grp:this->
groups) {
1731 if (eos5_fattr_group_name == grp->path) {
1732 for (
const auto &attr:grp->attrs) {
1733 if (instrument_attr_name == attr->name) {
1734 Retrieve_H5_Attr_Value(attr, grp->path);
1735 string attr_value(attr->value.begin(), attr->value.end());
1736 if (
"OMI" == attr_value) {
1737 this->isaura =
true;
1738 this->aura_name = OMI;
1740 else if (
"MLS Aura" == attr_value) {
1741 this->isaura =
true;
1742 this->aura_name = MLS;
1744 else if (
"TES" == attr_value) {
1745 this->isaura =
true;
1746 this->aura_name = TES;
1748 else if (
"HIRDLS" == attr_value) {
1749 this->isaura =
true;
1750 this->aura_name = HIRDLS;
1759 if (
true == this->isaura) {
1760 eos5_to_cf_attr_map[
"FillValue"] =
"_FillValue";
1761 eos5_to_cf_attr_map[
"MissingValue"] =
"missing_value";
1762 eos5_to_cf_attr_map[
"Units"] =
"units";
1763 eos5_to_cf_attr_map[
"Offset"] =
"add_offset";
1764 eos5_to_cf_attr_map[
"ScaleFactor"] =
"scale_factor";
1765 eos5_to_cf_attr_map[
"ValidRange"] =
"valid_range";
1766 eos5_to_cf_attr_map[
"Title"] =
"title";
1775 BESDEBUG(
"h5",
"Coming to Handle_CVar()"<<endl);
1778 bool is_augmented = Check_Augmentation_Status();
1781 if(is_augmented) cerr<<
"The file is augmented "<<endl;
1782 else cerr<<
"The file is not augmented "<<endl;
1786 if (this->eos5cfgrids.empty() ==
false)
1787 Handle_Grid_CVar(is_augmented);
1788 if (this->eos5cfswaths.empty() ==
false)
1789 Handle_Swath_CVar(is_augmented);
1790 if (this->eos5cfzas.empty() ==
false)
1791 Handle_Za_CVar(is_augmented);
1794 for (
auto irv = this->cvars.begin();
1795 irv != this->cvars.end(); irv++) {
1796 cerr<<
"EOS5CVar name "<<(*irv)->name <<endl;
1797 cerr<<
"EOS5CVar dimension name "<< (*irv)->cfdimname <<endl;
1798 cerr<<
"EOS5CVar new name "<<(*irv)->newname <<endl;
1799 cerr<<
"EOS5CVar type is "<<(*irv)->cvartype <<endl;
1807void EOS5File::Handle_Grid_CVar(
bool is_augmented)
1810 BESDEBUG(
"h5",
"Coming to Handle_Grid_CVar"<<endl);
1811 if (
true == is_augmented) {
1813 Handle_Augmented_Grid_CVar();
1816 Remove_MultiDim_LatLon_EOS5CFGrid();
1819 if (this->eos5cfgrids.empty())
return;
1820 if (1 == this->eos5cfgrids.size())
1821 Handle_Single_Nonaugment_Grid_CVar((this->eos5cfgrids)[0]);
1823 Handle_Multi_Nonaugment_Grid_CVar();
1830bool EOS5File::Check_Augmentation_Status()
const
1833 BESDEBUG(
"h5",
"Coming to Check_Augmentation_Status()"<<endl);
1834 bool aug_status =
false;
1835 int num_aug_eos5grp = 0;
1837 for (
const auto &cfgrid:this->eos5cfgrids) {
1838 for (
const auto &var:this->
vars) {
1839 bool is_augmented = Check_Augmented_Var_Candidate(cfgrid, var, GRID);
1840 if (
true == is_augmented) {
1847 for (
const auto &cfswath:this->eos5cfswaths) {
1848 for (
const auto &var:this->
vars) {
1849 bool is_augmented = Check_Augmented_Var_Candidate(cfswath, var, SWATH);
1850 if (
true == is_augmented) {
1858 for (
const auto &cfza:this->eos5cfzas) {
1859 for (
const auto &var:this->
vars) {
1860 bool is_augmented = Check_Augmented_Var_Candidate(cfza, var, ZA);
1861 if (
true == is_augmented) {
1868 int total_num_eos5grp = this->eos5cfgrids.size() + this->eos5cfswaths.size() + this->eos5cfzas.size();
1875 if (num_aug_eos5grp == total_num_eos5grp) aug_status =
true;
1883bool EOS5File::Check_Augmented_Var_Attrs(Var *var) {
1887 bool has_dimscale_class =
false;
1888 bool has_reflist =
false;
1889 for (
auto ira = var->attrs.begin(); ira != var->attrs.end(); ++ira) {
1890 if (
"CLASS" == (*ira)->name) {
1891 Retrieve_H5_Attr_Value(*ira,var->fullpath);
1892 string class_value((*ira)->value.begin(),(*ira)->value.end());
1893 if (
"DIMENSION_SCALE"==class_value)
1894 has_dimscale_class =
true;
1897 if (
"REFERENCE_LIST" == (*ira)->name)
1899 if (
true == has_reflist &&
true == has_dimscale_class)
1903 if (
true == has_reflist &&
true == has_dimscale_class)
1918bool EOS5File::Check_Augmented_Var_Candidate(T *eos5data,
const Var *var, EOS5Type eos5type)
const
1921 BESDEBUG(
"h5",
"Coming to Check_Augmented_Var_Candidate"<<endl);
1922 bool augmented_var =
false;
1924 string EOS5DATAPATH;
1925 if (GRID == eos5type)
1926 EOS5DATAPATH =
"/HDFEOS/GRIDS/";
1927 else if (ZA == eos5type)
1928 EOS5DATAPATH =
"/HDFEOS/ZAS/";
1929 else if (SWATH == eos5type)
1930 EOS5DATAPATH =
"/HDFEOS/SWATHS/";
1932 throw1(
"Non supported EOS5 type");
1934 string fslash_str =
"/";
1935 string THIS_EOS5DATAPATH = EOS5DATAPATH + eos5data->name + fslash_str;
1938 if (eos5type == Get_Var_EOS5_Type(var)) {
1939 string var_eos5data_name = Obtain_Var_EOS5Type_GroupName(var, eos5type);
1941 if (var_eos5data_name == eos5data->name) {
1942 if (var->fullpath.size() > THIS_EOS5DATAPATH.size()) {
1944 string var_path_after_eos5dataname = var->fullpath.substr(THIS_EOS5DATAPATH.size());
1946 if (var_path_after_eos5dataname == var->name) augmented_var =
true;
1951 return augmented_var;
1956void EOS5File::Handle_Augmented_Grid_CVar()
1958 BESDEBUG(
"h5",
"Coming to Handle_Augmented_Grid_CVar()"<<endl);
1959 for (
const auto &cfgrid:this->eos5cfgrids)
1960 Handle_Single_Augment_CVar(cfgrid, GRID);
1965void EOS5File::Handle_Single_Augment_CVar(T* cfeos5data, EOS5Type eos5type)
1968 BESDEBUG(
"h5",
"Coming to Handle_Single_Augment_CVar()"<<endl);
1969 set<string> tempvardimnamelist;
1970 tempvardimnamelist = cfeos5data->vardimnames;
1971 set<string>::iterator its;
1972 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its) {
1973 for (
auto irv = this->
vars.begin(); irv != this->vars.end();) {
1975 bool is_augmented = Check_Augmented_Var_Candidate(cfeos5data, *irv, eos5type);
1977 if (
true == is_augmented) {
1981 string tempdimname = HDF5CFUtil::obtain_string_after_lastslash(*its);
1984 if (tempdimname == (*irv)->name) {
1987 auto EOS5cvar_unique = make_unique<EOS5CVar>(*irv);
1988 auto EOS5cvar = EOS5cvar_unique.release();
1992 EOS5cvar->cfdimname = *its;
1993 EOS5cvar->cvartype = CV_EXIST;
1994 EOS5cvar->eos_type = eos5type;
1997 this->cvars.push_back(EOS5cvar);
2001 irv = this->
vars.erase(irv);
2013 for (
const auto &cvar:this->cvars) {
2014 its = tempvardimnamelist.find(cvar->cfdimname);
2015 if (its != tempvardimnamelist.end()) tempvardimnamelist.erase(its);
2018 if (
false == tempvardimnamelist.empty())
2019 throw1(
"Augmented files still need to provide more coordinate variables");
2025void EOS5File::Remove_MultiDim_LatLon_EOS5CFGrid()
2028 BESDEBUG(
"h5",
"Coming to Remove_MultiDim_LatLon_EOS5CFGrid()"<<endl);
2029 for (
auto irg = this->eos5cfgrids.begin(); irg != this->eos5cfgrids.end();) {
2040 bool irg_erase =
false;
2042 if (
true == (*irg)->has_2dlatlon) {
2044 if ((
true == this->isaura) && (OMI == this->aura_name) && (HE5_GCTP_GEO == (*irg)->eos5_projcode))
2048 string EOS5GRIDPATH =
"/HDFEOS/GRIDS/";
2049 string fslash_str =
"/";
2050 string THIS_EOS5GRIDPATH = EOS5GRIDPATH + (*irg)->name + fslash_str;
2051 int catch_latlon = 0;
2053 for (
auto irv = this->
vars.begin(); (irv != this->vars.end()) && (catch_latlon != 2);
2055 if (GRID == Get_Var_EOS5_Type(*irv) && ((*irv)->fullpath.size() > THIS_EOS5GRIDPATH.size())) {
2057 string var_grid_name = Obtain_Var_EOS5Type_GroupName(*irv, GRID);
2058 if (var_grid_name == (*irg)->name) {
2059 if ((
"Longitude" == (*irv)->name) || (
"Latitude" == (*irv)->name)) {
2063 irv = this->
vars.erase(irv);
2077 if (2 == catch_latlon) {
2078 (*irg)->has_nolatlon =
true;
2079 (*irg)->has_2dlatlon =
false;
2085 irg = this->eos5cfgrids.erase(irg);
2090 if (
false == irg_erase) {
2097 for (
auto irg = this->eos5cfgrids.begin(); irg != this->eos5cfgrids.end();) {
2099 if (
true == (*irg)->has_g2dlatlon) {
2101 irg = this->eos5cfgrids.erase(irg);
2110void EOS5File::Handle_Single_Nonaugment_Grid_CVar(EOS5CFGrid* cfgrid)
2113 BESDEBUG(
"h5",
"Coming to Handle_Single_Nonaugment_Grid_CVar()"<<endl);
2114 set<string> tempvardimnamelist;
2115 tempvardimnamelist = cfgrid->vardimnames;
2118 bool use_own_latlon =
false;
2119 if (
true == cfgrid->has_1dlatlon)
2120 use_own_latlon = Handle_Single_Nonaugment_Grid_CVar_OwnLatLon(cfgrid, tempvardimnamelist);
2122 if(use_own_latlon)
"h5",
"using 1D latlon"<<endl;
2123 else "h5",
"use_own_latlon is false "<<endl;
2126 if (
false == use_own_latlon) {
2127 bool use_eos5_latlon =
false;
2128 use_eos5_latlon = Handle_Single_Nonaugment_Grid_CVar_EOS5LatLon(cfgrid, tempvardimnamelist);
2131 if (
false == use_eos5_latlon)
return;
2135 Handle_NonLatLon_Grid_CVar(cfgrid, tempvardimnamelist);
2140bool EOS5File::Handle_Single_Nonaugment_Grid_CVar_OwnLatLon(
const EOS5CFGrid *cfgrid, set<string>& tempvardimnamelist)
2144 BESDEBUG(
"h5",
"Coming to Handle_Single_Nonaugment_Grid_CVar_OwnLatLon()"<<endl);
2145 set<string>::iterator its;
2146 string EOS5GRIDPATH =
"/HDFEOS/GRIDS/";
2147 string fslash_str =
"/";
2148 string THIS_EOS5GRIDPATH = EOS5GRIDPATH + cfgrid->name + fslash_str;
2151 bool find_latydim =
false;
2152 bool find_lonxdim =
false;
2154 for (
auto irv = this->
vars.begin(); irv != this->vars.end(); ++irv) {
2155 if (GRID == Get_Var_EOS5_Type(*irv) && ((*irv)->fullpath.size() > THIS_EOS5GRIDPATH.size())) {
2157 string var_grid_name = Obtain_Var_EOS5Type_GroupName(*irv, GRID);
2158 if ((var_grid_name == cfgrid->name) && ((*irv)->name ==
"Latitude")) {
2160 string tempdimname = (((*irv)->dims)[0])->name;
2162 if (
"YDim" == HDF5CFUtil::obtain_string_after_lastslash(tempdimname)) {
2164 auto EOS5cvar_unique = make_unique<EOS5CVar>(*irv);
2165 auto EOS5cvar = EOS5cvar_unique.release();
2169 EOS5cvar->cfdimname = tempdimname;
2170 EOS5cvar->cvartype = CV_EXIST;
2171 EOS5cvar->eos_type = GRID;
2174 this->cvars.push_back(EOS5cvar);
2178 this->
vars.erase(irv);
2181 find_latydim =
true;
2188 for (
auto irv = this->
vars.begin(); irv != this->vars.end(); ++irv) {
2190 if (GRID == Get_Var_EOS5_Type(*irv) && ((*irv)->fullpath.size() > THIS_EOS5GRIDPATH.size())) {
2192 string var_grid_name = Obtain_Var_EOS5Type_GroupName(*irv, GRID);
2194 if ((var_grid_name == cfgrid->name) && ((*irv)->name ==
"Longitude")) {
2196 string tempdimname = (((*irv)->dims)[0])->name;
2198 if (
"XDim" == HDF5CFUtil::obtain_string_after_lastslash(tempdimname)) {
2200 auto EOS5cvar_unique = make_unique<EOS5CVar>(*irv);
2201 auto EOS5cvar = EOS5cvar_unique.release();
2205 EOS5cvar->cfdimname = tempdimname;
2206 EOS5cvar->cvartype = CV_EXIST;
2207 EOS5cvar->eos_type = GRID;
2210 this->cvars.push_back(EOS5cvar);
2214 this->
vars.erase(irv);
2215 find_lonxdim =
true;
2222 for (
const auto &cvar:this->cvars) {
2224 its = tempvardimnamelist.find(cvar->cfdimname);
2225 if (its != tempvardimnamelist.end()) tempvardimnamelist.erase(its);
2230 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its)
2231 "h5",
"tempvardim "<<*its <<endl;
2234 return (find_latydim ==
true && find_lonxdim ==
true);
2238bool EOS5File::Handle_Single_Nonaugment_Grid_CVar_EOS5LatLon(
const EOS5CFGrid *cfgrid, set<string>& tempvardimnamelist)
2242 BESDEBUG(
"h5",
"Coming to Handle_Single_Nonaugment_Grid_CVar_EOS5LatLon()"<<endl);
2245 bool find_ydim =
false;
2246 bool find_xdim =
false;
2247 set<string>::iterator its;
2250 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its)
2251 cerr<<
"dim names "<<(*its) <<endl;
2254 string ydim_full_path;
2255 string xdim_full_path;
2257 if (cfgrid->eos5_projcode != HE5_GCTP_GEO) {
2259 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its) {
2260 if (
"YDim" == HDF5CFUtil::obtain_string_after_lastslash(*its))
2261 ydim_full_path = *its;
2262 else if (
"XDim" == HDF5CFUtil::obtain_string_after_lastslash(*its)) xdim_full_path = *its;
2267 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end();) {
2268 if (
"YDim" == HDF5CFUtil::obtain_string_after_lastslash(*its)) {
2271 auto EOS5cvar_unique = make_unique<EOS5CVar>();
2272 auto EOS5cvar = EOS5cvar_unique.release();
2273 EOS5cvar->name =
"lat";
2274 Create_Added_Var_NewName_FullPath(GRID, cfgrid->name, EOS5cvar->name, EOS5cvar->newname,
2275 EOS5cvar->fullpath);
2277 if (cfgrid->eos5_projcode != HE5_GCTP_GEO) {
2279 EOS5cvar->dtype = H5FLOAT64;
2283 EOS5cvar->dtype = H5FLOAT32;
2286 auto eos5cvar_dim_unique = make_unique<Dimension>((hsize_t) cfgrid->ydimsize);
2287 auto eos5cvar_dim = eos5cvar_dim_unique.release();
2288 eos5cvar_dim->name = *its;
2289 eos5cvar_dim->newname = (this->eos5cfgrids.size() == 1) ?
"YDim" : *its;
2290 EOS5cvar->dims.push_back(eos5cvar_dim);
2291 EOS5cvar->cfdimname = eos5cvar_dim->name;
2293 if (EOS5cvar->rank == 2) {
2295 auto eos5cvar_dim2_unique = make_unique<Dimension>((hsize_t) cfgrid->xdimsize);
2296 auto eos5cvar_dim2 = eos5cvar_dim2_unique.release();
2297 eos5cvar_dim2->name = xdim_full_path;
2298 eos5cvar_dim2->newname = (this->eos5cfgrids.size() == 1) ?
"XDim" : xdim_full_path;
2299 EOS5cvar->dims.push_back(eos5cvar_dim2);
2302 EOS5cvar->cvartype = CV_LAT_MISS;
2303 EOS5cvar->eos_type = GRID;
2304 EOS5cvar->xdimsize = cfgrid->xdimsize;
2305 EOS5cvar->ydimsize = cfgrid->ydimsize;
2308 EOS5cvar->point_lower = cfgrid->point_lower;
2309 EOS5cvar->point_upper = cfgrid->point_upper;
2310 EOS5cvar->point_left = cfgrid->point_left;
2311 EOS5cvar->point_right = cfgrid->point_right;
2312 EOS5cvar->eos5_pixelreg = cfgrid->eos5_pixelreg;
2313 EOS5cvar->eos5_origin = cfgrid->eos5_origin;
2314 EOS5cvar->eos5_projcode = cfgrid->eos5_projcode;
2316 for (
unsigned int k = 0; k < 13; k++)
2317 EOS5cvar->param[k] = cfgrid->param[k];
2319 EOS5cvar->zone = cfgrid->zone;
2320 EOS5cvar->sphere = cfgrid->sphere;
2323 this->cvars.push_back(EOS5cvar);
2327 tempvardimnamelist.erase(its++);
2331 else if (
"XDim" == HDF5CFUtil::obtain_string_after_lastslash(*its)) {
2334 auto EOS5cvar_unique = make_unique<EOS5CVar>();
2335 auto EOS5cvar = EOS5cvar_unique.release();
2336 EOS5cvar->name =
"lon";
2337 Create_Added_Var_NewName_FullPath(GRID, cfgrid->name, EOS5cvar->name, EOS5cvar->newname,
2338 EOS5cvar->fullpath);
2340 if (cfgrid->eos5_projcode != HE5_GCTP_GEO) {
2342 EOS5cvar->dtype = H5FLOAT64;
2346 EOS5cvar->dtype = H5FLOAT32;
2350 if (EOS5cvar->rank == 2) {
2351 auto eos5cvar_dim_unique = make_unique<Dimension>((hsize_t) cfgrid->ydimsize);
2352 auto eos5cvar_dim = eos5cvar_dim_unique.release();
2353 eos5cvar_dim->name = ydim_full_path;
2354 eos5cvar_dim->newname = (this->eos5cfgrids.size() == 1) ?
"YDim" : ydim_full_path;
2355 EOS5cvar->dims.push_back(eos5cvar_dim);
2358 auto eos5cvar_dim2_unique = make_unique<Dimension>((hsize_t) cfgrid->xdimsize);
2359 auto eos5cvar_dim2 = eos5cvar_dim2_unique.release();
2361 eos5cvar_dim2->name = *its;
2362 eos5cvar_dim2->newname = (this->eos5cfgrids.size() == 1) ?
"XDim" : *its;
2363 EOS5cvar->dims.push_back(eos5cvar_dim2);
2364 EOS5cvar->cfdimname = eos5cvar_dim2->name;
2366 EOS5cvar->cvartype = CV_LON_MISS;
2367 EOS5cvar->eos_type = GRID;
2368 EOS5cvar->xdimsize = cfgrid->xdimsize;
2369 EOS5cvar->ydimsize = cfgrid->ydimsize;
2372 EOS5cvar->point_lower = cfgrid->point_lower;
2373 EOS5cvar->point_upper = cfgrid->point_upper;
2374 EOS5cvar->point_left = cfgrid->point_left;
2375 EOS5cvar->point_right = cfgrid->point_right;
2376 EOS5cvar->eos5_pixelreg = cfgrid->eos5_pixelreg;
2377 EOS5cvar->eos5_origin = cfgrid->eos5_origin;
2378 EOS5cvar->eos5_projcode = cfgrid->eos5_projcode;
2379 for (
unsigned int k = 0; k < 13; k++)
2380 EOS5cvar->param[k] = cfgrid->param[k];
2381 EOS5cvar->zone = cfgrid->zone;
2382 EOS5cvar->sphere = cfgrid->sphere;
2385 this->cvars.push_back(EOS5cvar);
2388 tempvardimnamelist.erase(its++);
2394 if (
true == find_xdim &&
true == find_ydim)
break;
2397 return (
true == find_xdim &&
true == find_ydim);
2401void EOS5File::Handle_NonLatLon_Grid_CVar(EOS5CFGrid *cfgrid, set<string>& tempvardimnamelist)
2405 set<string>::iterator its;
2406 auto num_dimnames = (int)(tempvardimnamelist.size());
2407 bool has_dimnames =
true;
2409 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its) {
2410 if (cfgrid->dnames_to_1dvnames.find(*its) != cfgrid->dnames_to_1dvnames.end()) {
2411 for (
auto irv = this->
vars.begin(); has_dimnames && (irv != this->vars.end());) {
2415 if (GRID == Get_Var_EOS5_Type(*irv) && (*irv)->newname == (cfgrid->dnames_to_1dvnames)[*its]) {
2418 auto EOS5cvar_unique = make_unique<EOS5CVar>(*irv);
2419 auto EOS5cvar = EOS5cvar_unique.release();
2423 EOS5cvar->cfdimname = *its;
2424 EOS5cvar->cvartype = CV_EXIST;
2425 EOS5cvar->eos_type = GRID;
2428 this->cvars.push_back(EOS5cvar);
2432 irv = this->
vars.erase(irv);
2434 if (0 == num_dimnames) has_dimnames =
false;
2444 for (
auto irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
2445 its = tempvardimnamelist.find((*irv)->cfdimname);
2446 if (its != tempvardimnamelist.end()) tempvardimnamelist.erase(its);
2450 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its) {
2452 auto EOS5cvar_unique = make_unique<EOS5CVar>();
2453 auto EOS5cvar = EOS5cvar_unique.release();
2454 Create_Missing_CV(cfgrid, EOS5cvar, *its, GRID, this->eos5cfgrids.size());
2455 this->cvars.push_back(EOS5cvar);
2461void EOS5File::Handle_Multi_Nonaugment_Grid_CVar()
2464 BESDEBUG(
"h5",
"Coming to Handle_Multi_nonaugment_Grid_CVar()"<<endl);
2468 if (
true == this->grids_multi_latloncvs) {
2469 for (
const auto &cfgrid:this->eos5cfgrids)
2470 Handle_Single_Nonaugment_Grid_CVar(cfgrid);
2481 int num_1dlatlon_pairs = 0;
2482 for (
auto irv = this->eos5cfgrids.begin(); irv != this->eos5cfgrids.end(); ++irv)
2483 if (
true == (*irv)->has_1dlatlon) num_1dlatlon_pairs++;
2485 bool use_eos5_latlon =
false;
2486 if ((0 == num_1dlatlon_pairs)
2487 || ((num_1dlatlon_pairs == (
int) (this->eos5cfgrids.size())) && (
true == this->isaura))) {
2488 set<string> tempvardimnamelist = ((this->eos5cfgrids)[0])->vardimnames;
2489 if (0 == num_1dlatlon_pairs) {
2490 use_eos5_latlon = Handle_Single_Nonaugment_Grid_CVar_EOS5LatLon((this->eos5cfgrids)[0],
2491 tempvardimnamelist);
2493 if (
false == use_eos5_latlon)
return;
2498 bool use_own_latlon =
false;
2499 use_own_latlon = Handle_Single_Nonaugment_Grid_CVar_OwnLatLon((this->eos5cfgrids)[0],
2500 tempvardimnamelist);
2501 if (
false == use_own_latlon) {
2502 use_eos5_latlon = Handle_Single_Nonaugment_Grid_CVar_EOS5LatLon((this->eos5cfgrids)[0],
2503 tempvardimnamelist);
2504 if (
false == use_eos5_latlon)
return;
2509 Handle_NonLatLon_Grid_CVar((this->eos5cfgrids)[0], tempvardimnamelist);
2512 for (
unsigned j = 1; j < this->eos5cfgrids.size(); j++)
2513 (this->eos5cfgrids)[j]->Update_Dimnamelist();
2516 Adjust_EOS5GridDimNames((this->eos5cfgrids)[0]);
2519 for (
unsigned j = 1; j < this->eos5cfgrids.size(); j++) {
2520 tempvardimnamelist = (this->eos5cfgrids)[j]->vardimnames;
2521 Handle_NonLatLon_Grid_CVar((this->eos5cfgrids)[j], tempvardimnamelist);
2522 tempvardimnamelist.clear();
2528 this->grids_multi_latloncvs =
true;
2529 for (
const auto &cfgrid:this->eos5cfgrids)
2530 Handle_Single_Nonaugment_Grid_CVar(cfgrid);
2538void EOS5File::Adjust_EOS5GridDimNames(
const EOS5CFGrid *cfgrid)
const
2541 BESDEBUG(
"h5",
"Coming to Adjust_EOS5GridDimNames()"<<endl);
2544 bool find_xdim =
false;
2545 bool find_ydim =
false;
2547 for (
const auto &vardimname:cfgrid->vardimnames) {
2548 string xydimname_candidate = HDF5CFUtil::obtain_string_after_lastslash(vardimname);
2549 if (
"XDim" == xydimname_candidate) {
2551 xdimname = vardimname;
2553 else if (
"YDim" == xydimname_candidate) {
2555 ydimname = vardimname;
2557 if (find_xdim && find_ydim)
break;
2560 if (
false == find_xdim ||
false == find_ydim)
2561 throw2(
"Cannot find Dimension name that includes XDim or YDim in the grid ", cfgrid->name);
2563 for (
const auto &var:this->
vars) {
2564 if (GRID == Get_Var_EOS5_Type(var)) {
2565 for (
const auto &dim:var->dims) {
2566 string xydimname_candidate = HDF5CFUtil::obtain_string_after_lastslash(dim->name);
2567 if (
"XDim" == xydimname_candidate)
2568 dim->name = xdimname;
2569 else if (
"YDim" == xydimname_candidate) dim->name = ydimname;
2576void EOS5File::Handle_Swath_CVar(
bool isaugmented)
2579 BESDEBUG(
"h5",
"Coming to Handle_Swath_CVar()"<<endl);
2583 for (
auto irs = this->eos5cfswaths.begin(); irs != this->eos5cfswaths.end();) {
2584 if ((*irs)->has_1dlatlon) {
2585 Handle_Single_1DLatLon_Swath_CVar(*irs, isaugmented);
2588 else if ((*irs)->has_2dlatlon) {
2589 Handle_Single_2DLatLon_Swath_CVar(*irs, isaugmented);
2599 irs = this->eos5cfswaths.erase(irs);
2605void EOS5File::Handle_Single_1DLatLon_Swath_CVar(EOS5CFSwath *cfswath,
bool is_augmented)
2608 BESDEBUG(
"h5",
"Coming to Handle_Single_1DLatLon_Swath_CVar"<<endl);
2610 set<string> tempvardimnamelist = cfswath->vardimnames;
2611 string EOS5SWATHPATH =
"/HDFEOS/SWATHS/";
2612 string fslash_str =
"/";
2613 string THIS_EOS5SWATHPATH = EOS5SWATHPATH + cfswath->name + fslash_str;
2615 for (
auto its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its)
2616 cerr<<
"Dimension name befor latitude " << *its << endl;
2621 for (
auto irv = this->
vars.begin(); irv != this->vars.end(); ++irv) {
2622 if (SWATH == Get_Var_EOS5_Type(*irv) && ((*irv)->fullpath.size() > THIS_EOS5SWATHPATH.size())) {
2624 string var_swath_name = Obtain_Var_EOS5Type_GroupName(*irv, SWATH);
2625 if ((var_swath_name == cfswath->name) && ((*irv)->name ==
"Latitude")) {
2628 auto EOS5cvar_unique = make_unique<EOS5CVar>(*irv);
2629 auto EOS5cvar = EOS5cvar_unique.release();
2633 EOS5cvar->cfdimname = ((*irv)->dims)[0]->name;
2634 EOS5cvar->cvartype = CV_EXIST;
2635 EOS5cvar->eos_type = SWATH;
2638 this->cvars.push_back(EOS5cvar);
2642 this->
vars.erase(irv);
2650 bool find_lat_dim =
false;
2651 for (
auto its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its) {
2653 for (
const auto &cvar:this->cvars) {
2654 if ((cvar->name ==
"Latitude") && cvar->cfdimname == (*its)) {
2655 tempvardimnamelist.erase(its);
2656 find_lat_dim =
true;
2661 if (
true == find_lat_dim)
break;
2665 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its)
2666 cerr<<
"Dimension name afte latitude " << *its << endl;
2669 Handle_NonLatLon_Swath_CVar(cfswath, tempvardimnamelist);
2672 if (
true == is_augmented) {
2673 for (
auto irv = this->
vars.begin(); irv != this->vars.end();) {
2675 if (SWATH == Get_Var_EOS5_Type(*irv)) {
2677 string my_swath_short_path = (*irv)->fullpath.substr(EOS5SWATHPATH.size());
2678 size_t first_fslash_pos = my_swath_short_path.find_first_of(
"/");
2679 string my_swath_name = my_swath_short_path.substr(0,first_fslash_pos);
2682 string my_swath_name = Obtain_Var_EOS5Type_GroupName(*irv, SWATH);
2684 if (my_swath_name == cfswath->name) {
2685 string var_path_after_swathname = (*irv)->fullpath.substr(THIS_EOS5SWATHPATH.size());
2686 if (var_path_after_swathname == (*irv)->name) {
2688 irv = this->
vars.erase(irv);
2706void EOS5File::Handle_Single_2DLatLon_Swath_CVar(EOS5CFSwath *cfswath,
bool is_augmented)
2709 BESDEBUG(
"h5",
"Coming to Handle_Single_2DLatLon_Swath_CVar()"<<endl);
2711 set<string>::iterator its;
2712 set<string> tempvardimnamelist = cfswath->vardimnames;
2713 string EOS5SWATHPATH =
"/HDFEOS/SWATHS/";
2714 string fslash_str =
"/";
2715 string THIS_EOS5SWATHPATH = EOS5SWATHPATH + cfswath->name + fslash_str;
2716 bool find_lat =
false;
2717 bool find_lon =
false;
2720 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its)
2721 cerr<<
"Dimension name befor latitude " << *its << endl;
2725 for (
auto irv = this->
vars.begin(); irv != this->vars.end();) {
2726 if (SWATH == Get_Var_EOS5_Type(*irv) && ((*irv)->fullpath.size() > THIS_EOS5SWATHPATH.size())) {
2727 string var_swath_name = Obtain_Var_EOS5Type_GroupName(*irv, SWATH);
2728 if ((var_swath_name == cfswath->name) && ((*irv)->name ==
"Latitude")) {
2731 auto EOS5cvar_unique = make_unique<EOS5CVar>(*irv);
2732 auto EOS5cvar = EOS5cvar_unique.release();
2736 EOS5cvar->cfdimname = ((*irv)->dims)[0]->name;
2737 EOS5cvar->cvartype = CV_EXIST;
2738 EOS5cvar->eos_type = SWATH;
2739 EOS5cvar->is_2dlatlon =
true;
2742 this->cvars.push_back(EOS5cvar);
2746 irv = this->
vars.erase(irv);
2749 else if ((var_swath_name == cfswath->name) && ((*irv)->name ==
"Longitude")) {
2752 auto EOS5cvar_unique = make_unique<EOS5CVar>(*irv);
2753 auto EOS5cvar = EOS5cvar_unique.release();
2757 EOS5cvar->cfdimname = ((*irv)->dims)[1]->name;
2758 EOS5cvar->cvartype = CV_EXIST;
2759 EOS5cvar->eos_type = SWATH;
2760 EOS5cvar->is_2dlatlon =
true;
2763 this->cvars.push_back(EOS5cvar);
2767 irv = this->
vars.erase(irv);
2779 if (
true == find_lat &&
true == find_lon)
break;
2784 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its) {
2785 for (
const auto &cvar:this->cvars) {
2786 if ((cvar->name ==
"Latitude") && cvar->cfdimname == (*its)) {
2787 tempvardimnamelist.erase(its);
2793 if (
true == find_lat)
break;
2798 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its) {
2800 for (
const auto &cvar:this->cvars) {
2802 if ((cvar->name ==
"Longitude") && cvar->cfdimname == (*its)) {
2803 tempvardimnamelist.erase(its);
2809 if (
true == find_lon)
break;
2813 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its)
2814 cerr<<
"Dimension name afte latitude " << *its << endl;
2817 Handle_NonLatLon_Swath_CVar(cfswath, tempvardimnamelist);
2824 if (
true == is_augmented) {
2825 for (
auto irv = this->
vars.begin(); irv != this->vars.end();) {
2827 if (SWATH == Get_Var_EOS5_Type(*irv)) {
2829 string my_swath_name = Obtain_Var_EOS5Type_GroupName(*irv, SWATH);
2830 if (my_swath_name == cfswath->name) {
2831 string var_path_after_swathname = (*irv)->fullpath.substr(THIS_EOS5SWATHPATH.size());
2832 if (var_path_after_swathname == (*irv)->name) {
2834 irv = this->
vars.erase(irv);
2852void EOS5File::Handle_NonLatLon_Swath_CVar(EOS5CFSwath *cfswath, set<string>& tempvardimnamelist)
2855 BESDEBUG(
"h5",
"Coming to Handle_NonLatLon_Swath_CVar()"<<endl);
2857 set<string>::iterator its;
2858 auto num_dimnames = (int)(tempvardimnamelist.size());
2859 bool has_dimnames =
true;
2860 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its) {
2861 if (cfswath->dnames_to_geo1dvnames.find(*its) != cfswath->dnames_to_geo1dvnames.end()) {
2862 for (
auto irv = this->
vars.begin(); has_dimnames && (irv != this->vars.end());) {
2867 if (SWATH == Get_Var_EOS5_Type(*irv) && (*irv)->newname == (cfswath->dnames_to_geo1dvnames)[*its]) {
2870 auto EOS5cvar_unique = make_unique<EOS5CVar>(*irv);
2871 auto EOS5cvar = EOS5cvar_unique.release();
2875 EOS5cvar->cfdimname = *its;
2876 EOS5cvar->cvartype = CV_EXIST;
2877 EOS5cvar->eos_type = SWATH;
2880 this->cvars.push_back(EOS5cvar);
2884 irv = this->
vars.erase(irv);
2886 if (0 == num_dimnames) has_dimnames =
false;
2896 for (
const auto &cvar:this->cvars) {
2897 its = tempvardimnamelist.find(cvar->cfdimname);
2898 if (its != tempvardimnamelist.end()) tempvardimnamelist.erase(its);
2903 Handle_Special_NonLatLon_Swath_CVar(cfswath, tempvardimnamelist);
2906 for (
const auto &cvar:this->cvars) {
2907 its = tempvardimnamelist.find(cvar->cfdimname);
2908 if (its != tempvardimnamelist.end()) tempvardimnamelist.erase(its);
2912 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its) {
2914 auto EOS5cvar_unique = make_unique<EOS5CVar>();
2915 auto EOS5cvar = EOS5cvar_unique.release();
2916 Create_Missing_CV(cfswath, EOS5cvar, *its, SWATH, this->eos5cfswaths.size());
2917 this->cvars.push_back(EOS5cvar);
2923void EOS5File::Handle_Special_NonLatLon_Swath_CVar(EOS5CFSwath *cfswath,
const set<string>& tempvardimnamelist)
2927 BESDEBUG(
"h5",
"Handle_Special_NonLatLon_Swath_CVar()"<<endl);
2934 if (
true == this->isaura && TES == this->aura_name) {
2936 string eos5_swath_group_name =
"/HDFEOS/SWATHS/" + cfswath->name;
2937 string eos5_vc_attr_name =
"VerticalCoordinate";
2938 string eos5_pre_attr_name =
"Pressure";
2939 bool has_vc_attr =
false;
2940 const Group *vc_group =
nullptr;
2943 for (
const auto &grp:this->
groups) {
2944 if (eos5_swath_group_name == grp->path) {
2945 for (
const auto &attr:grp->attrs) {
2946 if (eos5_vc_attr_name == attr->name) {
2947 Retrieve_H5_Attr_Value(attr, grp->path);
2948 string attr_value(attr->value.begin(), attr->value.end());
2949 if (eos5_pre_attr_name == attr_value) {
2956 if (
true == has_vc_attr)
break;
2974 if (
true == has_vc_attr) {
2975 string dimname_candidate =
"/SWATHS/" + cfswath->name +
"/nLevels";
2976 for (
auto it = tempvardimnamelist.begin(); it != tempvardimnamelist.end(); ++it) {
2977 if ((*it).find(dimname_candidate) != string::npos) {
2978 hsize_t dimsize_candidate = 0;
2979 if ((cfswath->dimnames_to_dimsizes).find(*it) != (cfswath->dimnames_to_dimsizes).end())
2980 dimsize_candidate = cfswath->dimnames_to_dimsizes[*it];
2982 throw2(
"Cannot find the dimension size of the dimension name ", *it);
2989 for (
const auto &attr:vc_group->attrs) {
2990 if ((eos5_pre_attr_name == attr->name) && (attr->count == (dimsize_candidate - 1))) {
2994 string reduced_dimname = HDF5CFUtil::obtain_string_after_lastslash(*it);
2995 string orig_dimname =
"nLevels";
2996 auto EOS5cvar_unique = make_unique<EOS5CVar>();
2997 auto EOS5cvar = EOS5cvar_unique.release();
2998 if (
"nLevels" == reduced_dimname)
2999 EOS5cvar->name = eos5_pre_attr_name +
"_CV";
3002 EOS5cvar->name = eos5_pre_attr_name +
"_CV"
3003 + reduced_dimname.substr(orig_dimname.size());
3004 Create_Added_Var_NewName_FullPath(SWATH, cfswath->name, EOS5cvar->name, EOS5cvar->newname,
3005 EOS5cvar->fullpath);
3007 EOS5cvar->dtype = attr->dtype;
3008 auto eos5cvar_dim_unique = make_unique<Dimension>(dimsize_candidate);
3009 auto eos5cvar_dim = eos5cvar_dim_unique.release();
3010 eos5cvar_dim->name = *it;
3011 if (1 == this->eos5cfswaths.size())
3012 eos5cvar_dim->newname = reduced_dimname;
3014 eos5cvar_dim->newname = eos5cvar_dim->name;
3016 EOS5cvar->dims.push_back(eos5cvar_dim);
3017 EOS5cvar->cvartype = CV_SPECIAL;
3018 EOS5cvar->cfdimname = eos5cvar_dim->name;
3019 EOS5cvar->eos_type = SWATH;
3022 this->cvars.push_back(EOS5cvar);
3032void EOS5File::Handle_Za_CVar(
bool isaugmented)
3035 BESDEBUG(
"h5",
"Coming to Handle_Za_CVar()"<<endl);
3037 if (
false == isaugmented)
return;
3039 for (
const auto &cfza:this->eos5cfzas)
3040 Handle_Single_Augment_CVar(cfza, ZA);
3048 BESDEBUG(
"h5",
"Coming to Adjust_Var_Dim_NewName_Before_Flattening()"<<endl);
3049 auto num_grids = (
int)(this->eos5cfgrids.size());
3050 auto num_swaths = (
int)(this->eos5cfswaths.size());
3051 auto num_zas = (
int)(this->eos5cfzas.size());
3053 bool mixed_eos5typefile =
false;
3056 if (((num_grids > 0) && (num_swaths > 0)) || ((num_grids > 0) && (num_zas > 0))
3057 || ((num_swaths > 0) && (num_zas > 0))) mixed_eos5typefile =
true;
3060 for (
const auto &var:this->vars)
3061 Adjust_Per_Var_Dim_NewName_Before_Flattening(var, mixed_eos5typefile, num_grids, num_swaths, num_zas);
3063 for (
const auto &cvar:this->cvars)
3064 Adjust_Per_Var_Dim_NewName_Before_Flattening(cvar, mixed_eos5typefile, num_grids, num_swaths, num_zas);
3066 for (
auto irv = this->cvars.begin();
3067 irv != this->cvars.end(); ++irv) {
3068 cerr<<
"eos5svar var new name "<<(*irv)->newname <<endl;
3069 for (
auto ird = (*irv)->dims.begin();
3070 ird !=(*irv)->dims.end(); ++ird) {
3071 cerr<<
"eos5svar dimension new name "<<(*ird)->newname <<endl;
3076 Adjust_SharedLatLon_Grid_Var_Dim_Name();
3082void EOS5File::Adjust_Per_Var_Dim_NewName_Before_Flattening(T* var,
bool mixed_eos5type,
int num_grids,
int num_swaths,
3086 BESDEBUG(
"h5",
"Coming to Adjust_Per_Var_Dim_NewName_Before_Flattening()"<<endl);
3089 EOS5Type vartype = Get_Var_EOS5_Type(var);
3093 eos5typestr =
"/GRIDS/";
3094 if (
false == mixed_eos5type) {
3096 var->newname = ((1 == this->orig_num_grids) ? var->name : var->newname.substr(eos5typestr.size()));
3098 var->newname = ((1 == num_grids) ? var->name : var->newname.substr(eos5typestr.size()));
3113 if (num_grids > 1) {
3114 for (
auto &dim:var->dims) {
3115 if (dim->newname.size() <= eos5typestr.size())
3116 throw5(
"The size of the dimension new name ", dim->newname,
"of variable ", var->newname,
3118 dim->newname = dim->newname.substr(eos5typestr.size());
3124 var->newname = ((1 == num_grids) ? (eos5typestr + var->name) : var->newname);
3130 eos5typestr =
"/SWATHS/";
3131 if (
false == mixed_eos5type) {
3132 var->newname = ((1 == num_swaths) ? var->name : var->newname.substr(eos5typestr.size()));
3133 if (num_swaths > 1) {
3134 for (
auto &dim:var->dims) {
3135 if (dim->newname.size() <= eos5typestr.size())
3136 throw5(
"The size of the dimension new name ", dim->newname,
"of variable ", var->newname,
3138 dim->newname = dim->newname.substr(eos5typestr.size());
3143 var->newname = ((1 == num_swaths) ? (eos5typestr + var->name) : var->newname);
3149 eos5typestr =
"/ZAS/";
3150 if (
false == mixed_eos5type) {
3151 var->newname = ((1 == num_zas) ? var->name : var->newname.substr(eos5typestr.size()));
3153 for (
auto &dim:var->dims) {
3154 if (dim->newname.size() <= eos5typestr.size())
3155 throw5(
"The size of the dimension new name ", dim->newname,
"of variable ", var->newname,
3157 dim->newname = dim->newname.substr(eos5typestr.size());
3162 var->newname = ((1 == num_zas) ? (eos5typestr + var->name) : var->newname);
3169 throw1(
"Non-supported EOS type");
3175void EOS5File::Adjust_SharedLatLon_Grid_Var_Dim_Name()
const
3178 BESDEBUG(
"h5",
"Adjust_SharedLatLon_Grid_Var_Dim_Name()"<<endl);
3183 if ((this->eos5cfgrids.size() > 1) && (
true == this->eos5cfswaths.empty()) && (
true == this->eos5cfzas.empty())
3184 && (
false == this->grids_multi_latloncvs)) {
3188 string lat_dimnewname;
3190 string lon_dimnewname;
3191 for (
const auto &cvar:this->cvars) {
3192 if (
"lat" == cvar->name ||
"Latitude" == cvar->name) {
3193 cvar->newname = cvar->name;
3194 lat_dimnewname = ((cvar->dims)[0])->newname;
3195 lat_dimnewname = HDF5CFUtil::obtain_string_after_lastslash(lat_dimnewname);
3196 if (
"" == lat_dimnewname)
3197 throw2(
"/ is not included in the dimension new name ", ((cvar->dims)[0])->newname);
3198 ((cvar->dims)[0])->newname = lat_dimnewname;
3199 lat_dimname = cvar->cfdimname;
3201 else if (
"lon" == cvar->name ||
"Longitude" == cvar->name) {
3202 cvar->newname = cvar->name;
3203 lon_dimnewname = ((cvar->dims)[0])->newname;
3204 lon_dimnewname = HDF5CFUtil::obtain_string_after_lastslash(lon_dimnewname);
3205 if (
"" == lon_dimnewname)
3206 throw2(
"/ is not included in the dimension new name ", ((cvar->dims)[0])->newname);
3207 ((cvar->dims)[0])->newname = lon_dimnewname;
3208 lon_dimname = cvar->cfdimname;
3212 for (
auto &var:this->
vars) {
3213 for (
auto &dim:var->dims) {
3214 if (dim->name == lat_dimname)
3215 dim->newname = lat_dimnewname;
3216 else if (dim->name == lon_dimname) dim->newname = lon_dimnewname;
3226 BESDEBUG(
"h5",
"Coming to Flatten_Obj_Name()"<<endl);
3229 for (
auto &cvar:this->cvars) {
3230 cvar->newname = get_CF_string(cvar->newname);
3232 for (
auto &dim:cvar->dims)
3233 dim->newname = get_CF_string(dim->newname);
3235 if (
true == include_attr) {
3236 for (
auto &attr:cvar->attrs) {
3237 attr->newname = File::get_CF_string(attr->newname);
3247 BESDEBUG(
"h5",
"Coming to Handle_Obj_NameClashing()"<<endl);
3251 set<string> objnameset;
3252 Handle_EOS5CVar_NameClashing(objnameset);
3253 File::Handle_GeneralObj_NameClashing(include_attr, objnameset);
3254 if (
true == include_attr) {
3255 Handle_EOS5CVar_AttrNameClashing();
3264void EOS5File::Handle_EOS5CVar_NameClashing(set<string> &objnameset)
3267 BESDEBUG(
"h5",
"Coming to Handle_EOS5CVar_NameClashing()"<<endl);
3268 EOS5Handle_General_NameClashing(objnameset, this->cvars);
3272void EOS5File::Handle_EOS5CVar_AttrNameClashing()
3275 BESDEBUG(
"h5",
"Coming to Handle_EOS5CVar_AttrNameClashing()"<<endl);
3276 set<string> objnameset;
3278 for (
const auto &cvar:this->cvars) {
3279 Handle_General_NameClashing(objnameset, cvar->attrs);
3285template<
class T>
void EOS5File::EOS5Handle_General_NameClashing(set<string>&objnameset, vector<T*>& objvec)
3289 BESDEBUG(
"h5",
"Coming to EOS5Handle_General_NameClashing()"<<endl);
3290 pair<set<string>::iterator,
bool> setret;
3291 set<string>::iterator iss;
3293 vector<string> clashnamelist;
3295 map<int, int> cl_to_ol;
3300 typename vector<T*>::iterator irv;
3303 for (
auto irv = objvec.begin(); irv != objvec.end(); ++irv) {
3305 setret = objnameset.insert((*irv)->newname);
3306 if (!setret.second) {
3307 clashnamelist.insert(clashnamelist.end(), (*irv)->newname);
3308 cl_to_ol[cl_index] = ol_index;
3316 for (
auto &clashname:clashnamelist) {
3317 int clash_index = 1;
3318 string temp_clashname = clashname +
'_';
3319 HDF5CFUtil::gen_unique_name(temp_clashname, objnameset, clash_index);
3320 clashname = temp_clashname;
3324 for (
unsigned int i = 0; i < clashnamelist.size(); i++)
3325 objvec[cl_to_ol[i]]->newname = clashnamelist[i];
3333 BESDEBUG(
"h5",
"Coming to Handle_DimNameClashing()"<<endl);
3334 map<string, string> dimname_to_dimnewname;
3335 pair<map<string, string>::iterator,
bool> mapret;
3336 set<string> dimnameset;
3337 vector<Dimension*> vdims;
3338 set<string> dimnewnameset;
3339 pair<set<string>::iterator,
bool> setret;
3342 for (
const auto &cvar:this->cvars) {
3343 for (
const auto &dim:cvar->dims) {
3347 setret = dimnameset.insert(dim->name);
3348 if (setret.second) vdims.push_back(dim);
3356 for (
const auto &var:this->vars) {
3357 for (
const auto &dim:var->dims) {
3361 setret = dimnameset.insert(dim->name);
3362 if (setret.second) vdims.push_back(dim);
3367 for (
auto ird=vdims.begin();ird!=vdims.end();++ird)
3368 cerr<<
"dimension name "<<(*ird)->name <<endl;
3373 EOS5Handle_General_NameClashing(dimnewnameset, vdims);
3376 for (
const auto &dim:vdims) {
3377 mapret = dimname_to_dimnewname.insert(pair<string, string>(dim->name, dim->newname));
3378 if (
false == mapret.second)
3379 throw4(
"The dimension name ", dim->name,
" should map to ", dim->newname);
3383 for (
auto &cvar:this->cvars)
3384 for (
auto &dim:cvar->dims)
3385 dim->newname = dimname_to_dimnewname[dim->name];
3387 for (
auto &var:this->vars)
3388 for (
auto &dim:var->dims)
3389 dim->newname = dimname_to_dimnewname[dim->name];
3398 BESDEBUG(
"h5",
"Coming to Set_COARDS_Status()"<<endl);
3400 for (
const auto &cfgrid:this->eos5cfgrids) {
3401 if (
false == cfgrid->has_1dlatlon) {
3402 if (
false == cfgrid->has_nolatlon || (HE5_GCTP_GEO != cfgrid->eos5_projcode)) iscoard =
false;
3407 if (
true == iscoard) {
3408 for (
const auto &cfswath:this->eos5cfswaths) {
3409 if (
false == cfswath->has_1dlatlon) {
3421 BESDEBUG(
"h5",
"Coming to Adjust_Attr_Info()"<<endl);
3422 if (
true == this->isaura) {
3423 Adjust_Aura_Attr_Name();
3424 Adjust_Aura_Attr_Value();
3427 Handle_EOS5CVar_Unit_Attr();
3428 Add_EOS5_Grid_CF_Attr();
3433void EOS5File::Adjust_Aura_Attr_Name()
3436 BESDEBUG(
"h5",
"Coming to Adjust_Attr_Name() for Aura"<<endl);
3437 for (
auto &var:this->vars) {
3438 for (
auto &attr:var->attrs) {
3439 if (eos5_to_cf_attr_map.find(attr->name) != eos5_to_cf_attr_map.end())
3440 attr->newname = eos5_to_cf_attr_map[attr->name];
3444 for (
auto &var:this->cvars) {
3445 for (
auto &attr:var->attrs) {
3446 if (eos5_to_cf_attr_map.find(attr->name) != eos5_to_cf_attr_map.end())
3447 attr->newname = eos5_to_cf_attr_map[attr->name];
3452void EOS5File::Adjust_Aura_Attr_Value()
const
3455 BESDEBUG(
"h5",
"Coming to Adjust_Attr_Value() for Aura"<<endl);
3457 Handle_EOS5CVar_Unit_Attr();
3458 Handle_Aura_Special_Attr();
3463 string time_cf_units_value =
"seconds since 1993-01-01";
3464 for (
const auto &var:this->
vars) {
3465 if ((var->name ==
"Time") || (var->name ==
"nTimes")) {
3466 for (
const auto &attr:var->attrs) {
3467 if (
"units" == attr->name) {
3468 Retrieve_H5_Attr_Value(attr, var->fullpath);
3469 string units_value(attr->value.begin(), attr->value.end());
3470 if (time_cf_units_value != units_value) {
3472 units_value = time_cf_units_value;
3473 attr->value.resize(units_value.size());
3474 if (H5FSTRING == attr->dtype) attr->fstrsize = units_value.size();
3476 attr->strsize.resize(1);
3477 attr->strsize[0] = units_value.size();
3479 copy(units_value.begin(), units_value.end(), attr->value.begin());
3489void EOS5File::Handle_Aura_Special_Attr()
const
3492 BESDEBUG(
"h5",
"Coming to Handle_Aura_Special_Attr()"<<endl);
3494 if (
true == this->isaura && MLS == this->aura_name) {
3496 const string File_attr_group_path =
"/HDFEOS/ADDITIONAL/FILE_ATTRIBUTES";
3497 const string PCF1_attr_name =
"PCF1";
3498 bool find_group =
false;
3499 bool find_attr =
false;
3500 for (
const auto &grp:this->
groups) {
3501 if (File_attr_group_path == grp->path) {
3503 for (
const auto &attr:grp->attrs) {
3504 if (PCF1_attr_name == attr->name) {
3505 Retrieve_H5_Attr_Value(attr, grp->path);
3506 string pcf_value(attr->value.begin(), attr->value.end());
3507 HDF5CFDAPUtil::replace_double_quote(pcf_value);
3508 attr->value.resize(pcf_value.size());
3509 if (H5FSTRING == attr->dtype) attr->fstrsize = pcf_value.size();
3511 attr->strsize.resize(1);
3512 attr->strsize[0] = pcf_value.size();
3514 copy(pcf_value.begin(), pcf_value.end(), attr->value.begin());
3520 if (
true == find_group &&
true == find_attr)
break;
3526void EOS5File::Handle_EOS5CVar_Unit_Attr()
const
3529 BESDEBUG(
"h5",
"Coming to Handle_EOS5CVar_Unit_Attr()"<<endl);
3530 string unit_attrname =
"units";
3531 string nonll_cf_level_attrvalue =
"level";
3532 string lat_cf_unit_attrvalue =
"degrees_north";
3533 string lon_cf_unit_attrvalue =
"degrees_east";
3534 string tes_cf_pre_attrvalue =
"hPa";
3536 for (
const auto &cvar:this->cvars) {
3537 switch (cvar->cvartype) {
3540 for (
const auto &attr:cvar->attrs) {
3541 if (attr->newname == unit_attrname) {
3542 Retrieve_H5_Attr_Value(attr, cvar->fullpath);
3543 string units_value(attr->value.begin(), attr->value.end());
3544 if ((lat_cf_unit_attrvalue != units_value)
3545 && ((cvar->name ==
"Latitude") || ((this->eos5cfzas.empty() ==
false) && (cvar->name ==
"nLats")))) {
3546 units_value = lat_cf_unit_attrvalue;
3551 attr->value.resize(units_value.size());
3552 if (H5FSTRING == attr->dtype) attr->fstrsize = units_value.size();
3554 attr->strsize.resize(1);
3555 attr->strsize[0] = units_value.size();
3556 copy(units_value.begin(), units_value.end(), attr->value.begin());
3558 else if ((lon_cf_unit_attrvalue != units_value) && cvar->name ==
"Longitude") {
3559 units_value = lon_cf_unit_attrvalue;
3560 attr->value.resize(units_value.size());
3561 if (H5FSTRING == attr->dtype) attr->fstrsize = units_value.size();
3563 attr->strsize.resize(1);
3564 attr->strsize[0] = units_value.size();
3566 copy(units_value.begin(), units_value.end(), attr->value.begin());
3575 auto attr_unique = make_unique<Attribute>();
3576 auto attr = attr_unique.release();
3577 Add_Str_Attr(attr, unit_attrname, lat_cf_unit_attrvalue);
3578 cvar->attrs.push_back(attr);
3583 auto attr_unique = make_unique<Attribute>();
3584 auto attr = attr_unique.release();
3585 Add_Str_Attr(attr, unit_attrname, lon_cf_unit_attrvalue);
3586 cvar->attrs.push_back(attr);
3590 case CV_NONLATLON_MISS: {
3591 auto attr_unique = make_unique<Attribute>();
3592 auto attr = attr_unique.release();
3593 Add_Str_Attr(attr, unit_attrname, nonll_cf_level_attrvalue);
3594 cvar->attrs.push_back(attr);
3598 if (
true == this->isaura && TES == this->aura_name) {
3599 auto attr_unique = make_unique<Attribute>();
3600 auto attr = attr_unique.release();
3601 Add_Str_Attr(attr, unit_attrname, tes_cf_pre_attrvalue);
3602 cvar->attrs.push_back(attr);
3607 throw1(
"Non-supported Coordinate Variable Type.");
3612void EOS5File::Add_EOS5_Grid_CF_Attr()
3614 BESDEBUG(
"h5",
"Coming to Add_EOS5_Grid_CF_Attr()"<<endl);
3616 bool has_eos5_grid_nongeo_proj =
false;
3619 for (
const auto &cvar:this->cvars) {
3620 if (cvar->cvartype == CV_LAT_MISS) {
3621 if(cvar->eos5_projcode !=HE5_GCTP_GEO) {
3622 has_eos5_grid_nongeo_proj =
true;
3629 if(
true == has_eos5_grid_nongeo_proj) {
3630 string conventions_attrname =
"Conventions";
3631 string conventions_attrvalue =
"CF-1.7";
3632 bool has_conventions_attr=
false;
3633 for (
const auto &root_attr:this->
root_attrs) {
3634 if(root_attr->name==conventions_attrname){
3635 has_conventions_attr =
true;
3640 if(
false==has_conventions_attr) {
3641 auto attr_unique = make_unique<Attribute>();
3642 auto attr = attr_unique.release();
3643 Add_Str_Attr(attr,conventions_attrname,conventions_attrvalue);
3656 BESDEBUG(
"h5",
"Coming to Adjust_Dim_Name()"<<endl);
3658 if (
false == this->iscoard)
3661 for (
const auto &cvar:this->cvars) {
3662 if (cvar->dims.size() != 1)
3663 throw3(
"Coard coordinate variable ", cvar->name,
"is not 1D");
3664 if (cvar->newname != ((cvar->dims)[0]->newname)) {
3665 (cvar->dims)[0]->newname = cvar->newname;
3668 for (
const auto &var:this->vars) {
3669 for (
const auto &dim:var->dims) {
3674 if (dim->name == (cvar->dims)[0]->name) dim->newname = (cvar->dims)[0]->newname;
3686 BESDEBUG(
"h5",
"Coming to Add_Supplement_Attrs()"<<endl);
3687 if (
true == add_path) {
3692 for (
const auto &cvar:this->cvars) {
3693 if ((cvar->cvartype == CV_EXIST) || (cvar->cvartype == CV_MODIFY)) {
3694 const string varname = cvar->name;
3695 const string attrname =
"origname";
3696 auto attr_unique = make_unique<Attribute>();
3697 auto attr = attr_unique.release();
3698 Add_Str_Attr(attr, attrname, varname);
3699 cvar->attrs.push_back(attr);
3703 for (
const auto &cvar:this->cvars) {
3704 if ((cvar->cvartype == CV_EXIST) || (cvar->cvartype == CV_MODIFY)) {
3708 if(cvar->zero_storage_size==
false
3709 || HDF5RequestHandler::get_no_zero_size_fullnameattr() ==
false) {
3710 const string varname = cvar->fullpath;
3711 const string attrname =
"fullnamepath";
3712 auto attr_unique = make_unique<Attribute>();
3713 auto attr = attr_unique.release();
3714 Add_Str_Attr(attr, attrname, varname);
3715 cvar->attrs.push_back(attr);
3721 if (
true == this->iscoard) {
3722 for (
const auto &cvar:this->cvars) {
3723 if ((cvar->cvartype == CV_EXIST) || (cvar->cvartype == CV_MODIFY)) {
3724 const string attrname =
"orig_dimname";
3725 string orig_dimname = ((cvar->dims)[0])->name;
3726 orig_dimname = HDF5CFUtil::obtain_string_after_lastslash(orig_dimname);
3727 if (
"" == orig_dimname)
3728 throw2(
"wrong dimension name ", orig_dimname);
3729 if (orig_dimname.find(
"FakeDim") != string::npos) orig_dimname =
"";
3730 auto attr_unique = make_unique<Attribute>();
3731 auto attr = attr_unique.release();
3732 Add_Str_Attr(attr, attrname, orig_dimname);
3733 cvar->attrs.push_back(attr);
3737 for (
const auto &var:this->vars) {
3739 if (var->dims.empty() ==
false) {
3740 auto attr_unique = make_unique<Attribute>();
3741 auto attr = attr_unique.release();
3742 if (1 == var->dims.size()) {
3743 const string attrname =
"orig_dimname";
3744 string orig_dimname = ((var->dims)[0])->name;
3745 if (
"" == orig_dimname)
3746 orig_dimname =
"NoDimName";
3748 orig_dimname = HDF5CFUtil::obtain_string_after_lastslash(orig_dimname);
3749 if (orig_dimname.find(
"FakeDim") != string::npos) orig_dimname =
"NoDimName";
3750 Add_Str_Attr(attr, attrname, orig_dimname);
3753 const string attrname =
"orig_dimname_list";
3754 string orig_dimname_list;
3755 for (
auto ird = var->dims.begin(); ird != var->dims.end(); ++ird) {
3756 string orig_dimname = (*ird)->name;
3757 if (
"" == orig_dimname)
3758 orig_dimname =
"NoDimName";
3760 orig_dimname = HDF5CFUtil::obtain_string_after_lastslash((*ird)->name);
3761 if (orig_dimname.find(
"FakeDim") != string::npos) orig_dimname =
"NoDimName";
3762 if (
"" == orig_dimname_list)
3763 orig_dimname_list = orig_dimname;
3765 orig_dimname_list = orig_dimname_list +
" " + orig_dimname;
3770 Add_Str_Attr(attr, attrname, orig_dimname_list);
3772 var->attrs.push_back(attr);
3783 BESDEBUG(
"h5",
"Coming to Handle_Coor_Attr()"<<endl);
3784 string co_attrname =
"coordinates";
3785 string co_attrvalue;
3787 if (iscoard)
return;
3789 for (
const auto &var:this->vars) {
3791 for (
const auto &dim:var->dims) {
3792 for (
const auto &cvar:this->cvars) {
3793 if (dim->name == cvar->cfdimname)
3794 co_attrvalue = (co_attrvalue.empty()) ? cvar->newname : co_attrvalue +
" " + cvar->newname;
3797 if (
false == co_attrvalue.empty()) {
3798 auto attr_unique = make_unique<Attribute>();
3799 auto attr = attr_unique.release();
3800 Add_Str_Attr(attr, co_attrname, co_attrvalue);
3801 var->attrs.push_back(attr);
3803 co_attrvalue.clear();
3807 bool has_2dlatlon_cv =
false;
3808 for (
const auto &cvar:this->cvars) {
3809 if (
true == cvar->is_2dlatlon) {
3810 has_2dlatlon_cv =
true;
3815 if (
true == has_2dlatlon_cv) {
3819 for (
const auto &cvar:this->cvars) {
3820 if (
true == cvar->is_2dlatlon) {
3821 dimname1 = ((cvar->dims)[0])->name;
3822 dimname2 = ((cvar->dims)[1])->name;
3827 int num_latlondims = 0;
3829 for (
const auto &var:this->vars) {
3830 for (
const auto &dim:var->dims) {
3831 if (dimname1 == dim->name) num_latlondims++;
3832 if (dimname2 == dim->name) num_latlondims++;
3834 if ((num_latlondims != 0) && (num_latlondims != 2)) {
3836 for (
auto ira = var->attrs.begin(); ira != var->attrs.end(); ++ira) {
3837 if (co_attrname == (*ira)->name) {
3839 var->attrs.erase(ira);
3852void EOS5File::Adjust_Special_EOS5CVar_Name() {
3854 int num_grids =this->eos5cfgrids.size();
3855 int num_swaths = this->eos5cfswaths.size();
3856 int num_zas = this->eos5cfzas.size();
3858 bool mixed_eos5typefile =
false;
3861 if (((num_grids > 0) && (num_swaths > 0)) ||
3862 ((num_grids > 0) && (num_zas > 0)) ||
3863 ((num_swaths >0) && (num_zas > 0)))
3864 mixed_eos5typefile =
true;
3866 if (
false == mixed_eos5typefile) {
3871 if ((1 == num_swaths) || ( 1 == num_zas) ||
3872 (1 == num_grids) || ((num_grids >1) && (this->grids_multi_latloncvs))) {
3874 string unit_attrname =
"units";
3875 string nonll_cf_level_attralue =
"level";
3876 string lat_cf_unit_attrvalue =
"degrees_north";
3877 string lon_cf_unit_attrvalue =
"degrees_east";
3879 for (
auto irv = this->cvars.begin();
3880 irv != this->cvars.end(); irv++) {
3881 switch((*irv)->eos_type) {
3887 for(vector <Attribute*>::iterator ira = (*irv)->attrs.begin();
3888 ira != (*irv)->attrs.end(); ira++) {
3889 if ((*ira)->name ==unit_attrname) {
3890 if ((*ira)->value.size() > 0) {
3891 string units_value((*ira)->value.begin(),(*ira)->value.end());
3892 if (lat_cf_unit_attrvalue ==units_value) (*irv)->newname =
"lat";
3893 if (lon_cf_unit_attrvalue ==units_value) (*irv)->newname =
"lon";
3899 case CV_NONLATLON_MISS:
3901 for(vector <Attribute*>::iterator ira = (*irv)->attrs.begin();
3902 ira != (*irv)->attrs.end(); ira++) {
3903 if ((*ira)->name ==unit_attrname) {
3904 if ((*ira)->value.size() > 0) {
3905 string units_value((*ira)->value.begin(),(*ira)->value.end());
3906 if (nonll_cf_level_attralue ==units_value) {
3907 (*irv)->newname =
"lev";
3916 throw1(
"Non-supported coordinate variable type");
3929void EOS5File::Create_Missing_CV(T* eos5data, EOS5CVar *EOS5cvar,
const string& dimname, EOS5Type eos5type,
3930 int num_eos5data)
const
3933 BESDEBUG(
"h5",
"Coming to Create_Missing_CV()"<<endl);
3934 string reduced_dimname = HDF5CFUtil::obtain_string_after_lastslash(dimname);
3935 if (
"" == reduced_dimname) throw2(
"wrong dimension name ", dimname);
3936 EOS5cvar->name = reduced_dimname;
3937 Create_Added_Var_NewName_FullPath(eos5type, eos5data->name, EOS5cvar->name, EOS5cvar->newname, EOS5cvar->fullpath);
3939 EOS5cvar->dtype = H5INT32;
3940 hsize_t eos5cvar_dimsize = (eos5data->dimnames_to_dimsizes)[dimname];
3941 auto eos5cvar_dim_unique = make_unique<Dimension>(eos5cvar_dimsize);
3942 auto eos5cvar_dim = eos5cvar_dim_unique.release();
3943 eos5cvar_dim->name = dimname;
3944 eos5cvar_dim->unlimited_dim = (eos5data->dimnames_to_unlimited)[dimname];
3945 if (1 == num_eos5data)
3946 eos5cvar_dim->newname = reduced_dimname;
3948 eos5cvar_dim->newname = dimname;
3950 EOS5cvar->dims.push_back(eos5cvar_dim);
3951 EOS5cvar->cfdimname = dimname;
3952 EOS5cvar->cvartype = CV_NONLATLON_MISS;
3953 EOS5cvar->eos_type = eos5type;
3957void EOS5File::Create_Added_Var_NewName_FullPath(EOS5Type eos5type,
const string& eos5_groupname,
const string& varname,
3958 string &var_newname,
string &var_fullpath)
const
3961 BESDEBUG(
"h5",
"Coming to Create_Added_Var_NewName_FullPath()"<<endl);
3962 string fslash_str =
"/";
3964 string top_eos5_groupname =
"/HDFEOS";
3968 eos5typestr =
"/GRIDS/";
3969 var_newname = eos5typestr + eos5_groupname + fslash_str + varname;
3970 var_fullpath = top_eos5_groupname + eos5typestr + eos5_groupname + fslash_str + varname;
3975 eos5typestr =
"/SWATHS/";
3976 var_newname = eos5typestr + eos5_groupname + fslash_str + varname;
3977 var_fullpath = top_eos5_groupname + eos5typestr + eos5_groupname + fslash_str + varname;
3983 eos5typestr =
"/ZAS/";
3984 var_newname = eos5typestr + eos5_groupname + fslash_str + varname;
3985 var_fullpath = top_eos5_groupname + eos5typestr + eos5_groupname + fslash_str + varname;
3991 throw1(
"Non-supported EOS type");
3999 BESDEBUG(
"h5",
"Coming to Handle_SpVar()"<<endl);
4000 if (
true == this->isaura && TES == this->aura_name) {
4001 const string ProHist_full_path =
"/HDFEOS/ADDITIONAL/FILE_ATTRIBUTES/ProductionHistory";
4002 for (
auto irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
4003 if (ProHist_full_path == (*irv)->fullpath) {
4005 this->vars.erase(irv);
4012 if (dimname_to_dupdimnamelist.empty() ==
false) {
4013 for (
auto ircv = this->cvars.begin(); ircv != this->cvars.end(); ircv++) {
4014 if ((*ircv)->cvartype == CV_EXIST) {
4015 pair<multimap<string, string>::iterator, multimap<string, string>::iterator> mm_er_ret;
4016 multimap<string, string>::iterator itmm;
4017 for (itmm = dimname_to_dupdimnamelist.begin(); itmm != dimname_to_dupdimnamelist.end(); ++itmm) {
4020 if ((*ircv)->cfdimname == (*itmm).first) {
4023 for (
auto irv2 = this->cvars.begin(); irv2 != this->cvars.end();
4025 if ((*irv2)->cvartype == CV_NONLATLON_MISS) {
4031 if ((*irv2)->cfdimname == (*itmm).second) {
4034 string dup_var_name = (*irv2)->newname;
4035 Replace_Var_Info_EOS((*ircv), (*irv2));
4038 (*irv2)->newname = dup_var_name;
4039 (*irv2)->getDimensions()[0]->newname = dup_var_name;
4052 for (
auto irv = this->vars.begin();
4053 irv != this->vars.end(); ++irv) {
4056 if((*irv)->rank >=2) {
4058 for (
auto ird = (*irv)->dims.begin();
4059 ird != (*irv)->dims.end(); ++ ird) {
4060 pair<multimap<string,string>::iterator,multimap<string,string>::iterator> mm_er_ret;
4061 multimap<string,string>::iterator itmm;
4062 for (itmm = dimname_to_dupdimnamelist.begin(); itmm!=dimname_to_dupdimnamelist.end();++itmm) {
4066 cerr<<
"duplicate dimension name of a variable is "<<(*ird)->name <<endl;
4076 if((*itmm).second == (*ird)->name) {
4077 cerr<<
"coming to find the duplicate dim. name "<<endl;
4078 for (
auto ircv = this->cvars.begin(); ircv != this->cvars.end(); ircv++) {
4079 if((*ircv)->cvartype == CV_EXIST) {
4080 cerr<<
"cf dim. name is "<<(*ircv)->cfdimname <<endl;
4082 if((*ircv)->cfdimname == (*itmm).first) {
4084 for (
auto irv2 = this->cvars.begin();
4085 irv2 != this->cvars.end(); irv2++) {
4086 if((*irv2)->cvartype == CV_NONLATLON_MISS) {
4088 if((*irv2)->cfdimname == (*itmm).second) {
4089 string dup_var_name = (*irv2)->newname;
4090 Replace_Var_Info_EOS((*ircv),(*irv2));
4091 (*irv2)->newname = dup_var_name;
4092 (*irv2)->getDimensions()[0]->newname = dup_var_name;
4121 BESDEBUG(
"h5",
"Coming to Handle_SpVar_Attr()"<<endl);
4124 if (dimname_to_dupdimnamelist.empty() ==
false) {
4126 pair<multimap<string, string>::iterator, multimap<string, string>::iterator> mm_er_ret;
4127 multimap<string, string>::iterator itmm;
4128 for (itmm = dimname_to_dupdimnamelist.begin(); itmm != dimname_to_dupdimnamelist.end(); ++itmm) {
4129 for (
auto ircv = this->cvars.begin(); ircv != this->cvars.end(); ircv++) {
4131 if ((*ircv)->cvartype == CV_EXIST) {
4134 if ((*ircv)->cfdimname == (*itmm).first) {
4138 for (
auto irv2 = this->cvars.begin(); irv2 != this->cvars.end();
4140 if ((*irv2)->cvartype == CV_NONLATLON_MISS) {
4146 if ((*irv2)->cfdimname == (*itmm).second) Replace_Var_Attrs_EOS((*ircv), (*irv2));
4161 BESDEBUG(
"h5",
"Coming to Handle_SpVar_DMR()"<<endl);
4162 if (
true == this->isaura && TES == this->aura_name) {
4163 const string ProHist_full_path =
"/HDFEOS/ADDITIONAL/FILE_ATTRIBUTES/ProductionHistory";
4164 for (
auto irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
4165 if (ProHist_full_path == (*irv)->fullpath) {
4167 this->vars.erase(irv);
4174 if (dimname_to_dupdimnamelist.empty() ==
false) {
4175 for (
auto ircv = this->cvars.begin(); ircv != this->cvars.end(); ircv++) {
4176 if ((*ircv)->cvartype == CV_EXIST) {
4177 pair<multimap<string, string>::iterator, multimap<string, string>::iterator> mm_er_ret;
4178 multimap<string, string>::iterator itmm;
4179 for (itmm = dimname_to_dupdimnamelist.begin(); itmm != dimname_to_dupdimnamelist.end(); ++itmm) {
4182 if ((*ircv)->cfdimname == (*itmm).first) {
4185 for (
auto irv2 = this->cvars.begin(); irv2 != this->cvars.end();
4187 if ((*irv2)->cvartype == CV_NONLATLON_MISS) {
4193 if ((*irv2)->cfdimname == (*itmm).second) {
4195 Replace_Var_Attrs_EOS((*ircv), (*irv2));
4197 string dup_var_name = (*irv2)->newname;
4198 Replace_Var_Info_EOS((*ircv), (*irv2));
4202 (*irv2)->newname = dup_var_name;
4203 (*irv2)->getDimensions()[0]->newname = dup_var_name;
4233 BESDEBUG(
"h5",
"Coming to Replace_Var_Info_EOS()"<<endl);
4234 File::Replace_Var_Info(src, target);
4235 target->cfdimname = src->cfdimname;
4236 target->cvartype = src->cvartype;
4237 target->eos_type = src->eos_type;
4238 target->total_elems = src->total_elems;
4246 BESDEBUG(
"h5",
"Coming to Replace_Var_Attrs_EOS()"<<endl);
4247 File::Replace_Var_Attrs(src, target);
4253EOS5File:: add_ignored_info_attrs(
bool is_grp,
bool is_first) {
4257EOS5File:: add_ignored_info_objs(
bool is_dim_related,
bool is_first) {
This class specifies the core engineering of mapping HDF5 to DAP by following CF.
include the entry functions to execute the handlers
This class represents one attribute.
This class simulates an HDF-EOS5 Grid. Currently only geographic projection is supported.
This class is a derived class of CVar. It represents a coordinate variable for HDF-EOS5 files.
void Adjust_Obj_Name() override
This method is a no-op operation. Leave here since the method in the base class is pure virtual.
void Add_EOS5File_Info(HE5Parser *, bool)
Add HDF-EOS5 dimension and coordinate variable related info. to EOS5Grid,EOS5Swath etc.
void Handle_Grid_Mapping_Vars() override
Handle Grid Mapping Vars.
void Retrieve_H5_Info(const char *path, hid_t file_id, bool include_attr) override
Retrieve DDS information from the HDF5 file; a real implementation for HDF-EOS5 products.
void Adjust_Var_NewName_After_Parsing() const
Adjust variable names for HDF-EOS5 files.
void Add_Supplement_Attrs(bool) override
Add the supplemental attributes for HDF-EOS5 products.
void Set_COARDS_Status()
Set COARDS flag.
void Handle_CVar() override
Handle coordinate variable for HDF-EOS5 files.
void Adjust_Attr_Info()
Adjust the attribute info for HDF-EOS5 products.
void Handle_SpVar_Attr() override
Handle special variables for HDF-EOS5 files.
void Handle_Obj_NameClashing(bool)
Handle the object name clashing for HDF-EOS5 products.
void Handle_Unsupported_Dtype(bool) override
Handle unsupported HDF5 datatypes for HDF-EOS5 products.
bool Have_Grid_Mapping_Attrs() override
Check if having Grid Mapping Attrs.
void Handle_DimNameClashing() override
void Handle_Unsupported_Others(bool) override
Handle other unmapped objects/attributes for HDF-EOS5 products.
void Retrieve_H5_CVar_Supported_Attr_Values() override
Retrieve coordinate variable attributes.
void Handle_SpVar() override
Handle special variables for HDF-EOS5 files.
void Retrieve_H5_Supported_Attr_Values() override
Retrieve attribute values for the supported HDF5 datatypes for HDF-EOS5 products.
void Add_Dim_Name(HE5Parser *)
Add the dimension name for HDF-EOS5 files.
void Adjust_Dim_Name() override
Adjust the dimension name for HDF-EOS5 products.
void Handle_SpVar_DMR() override
Handle special variables and attributes for HDF-EOS5 files(for DMR)
void Handle_Unsupported_Dspace(bool) override
Handle unsupported HDF5 dataspaces for HDF-EOS5 products.
void Adjust_Var_Dim_NewName_Before_Flattening() const
Adjust variable dimension names before the flattening for HDF-EOS5 files.
void Flatten_Obj_Name(bool include_attr) override
Flatten the object name for HDF-EOS5 files.
void Check_Aura_Product_Status()
Check if the HDF-EOS5 file is an Aura file. Special CF operations need to be used.
void Adjust_EOS5Dim_Info(HE5Parser *strmeta_info)
Adjust HDF-EOS5 dimension information.
void Handle_Coor_Attr() override
Handle the coordinates attribute for HDF-EOS5 products.
std::vector< Group * > groups
Non-root group vectors.
virtual void Handle_Unsupported_Dspace(bool)
Handle unsupported HDF5 dataspaces for datasets.
virtual void Handle_Grid_Mapping_Vars()
Handle Grid Mapping Vars.
virtual void Retrieve_H5_Supported_Attr_Values()
Retrieve attribute values for the supported HDF5 datatypes.
std::vector< Var * > vars
Var vectors.
virtual void Add_Supplement_Attrs(bool)
Add supplemental attributes such as fullpath and original name.
virtual void Retrieve_H5_Info(const char *path, hid_t file_id, bool)
std::vector< Attribute * > root_attrs
Root attribute vectors.
virtual void Handle_Unsupported_Dtype(bool)
Handle unsupported HDF5 datatypes.
virtual void Flatten_Obj_Name(bool)
Flatten the object name.
virtual bool Have_Grid_Mapping_Attrs()
Check if having Grid Mapping Attrs.
This class represents one HDF5 dataset(CF variable)
Helper functions for generating DAS attributes and a function to check BES Key.
double point_right
The rightmost coordinate value of a Grid.
double point_upper
The top coordinate value of a Grid.
double point_left
The leftmost coordinate value of a Grid.
double point_lower
The bottom coordinate value of a Grid.