44using namespace HDF5CF;
47EOS5CVar::EOS5CVar(
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 (
auto ira = var->attrs.begin(); ira != var->attrs.end(); ++ira) {
63 attr->name = (*ira)->name;
64 attr->newname = (*ira)->newname;
65 attr->dtype = (*ira)->dtype;
66 attr->count = (*ira)->count;
67 attr->strsize = (*ira)->strsize;
68 attr->fstrsize = (*ira)->fstrsize;
69 attr->value = (*ira)->value;
70 attrs.push_back(attr);
73 for (
auto ird = var->dims.begin(); ird != var->dims.end(); ++ird) {
75 dim->name = (*ird)->name;
76 dim->newname = (*ird)->newname;
77 dim->unlimited_dim = (*ird)->unlimited_dim;
91 eos5_pixelreg = HE5_HDFE_CENTER;
92 eos5_origin = HE5_HDFE_GD_UL;
93 eos5_projcode = HE5_GCTP_GEO;
96 std::fill_n(param, 13, 0);
103void EOS5CFGrid::Update_Dimnamelist()
106 BESDEBUG(
"h5",
"coming to Update_Dimnamelist" <<endl);
112 for (
auto it = this->vardimnames.begin(); it != this->vardimnames.end(); ++it) {
113 string xydimname_candidate = HDF5CFUtil::obtain_string_after_lastslash(*it);
114 if (
"XDim" == xydimname_candidate) {
115 this->vardimnames.erase(*it);
120 for (
auto it = this->vardimnames.begin(); it != this->vardimnames.end(); ++it) {
121 string xydimname_candidate = HDF5CFUtil::obtain_string_after_lastslash(*it);
122 if (
"YDim" == xydimname_candidate) {
123 this->vardimnames.erase(*it);
133 for (vector<EOS5CVar *>::const_iterator i = this->cvars.begin(); i != this->cvars.end(); ++i)
136 for (vector<EOS5CFGrid *>::const_iterator i = this->eos5cfgrids.begin(); i != this->eos5cfgrids.end(); ++i)
139 for (vector<EOS5CFSwath *>::const_iterator i = this->eos5cfswaths.begin(); i != this->eos5cfswaths.end(); ++i)
142 for (vector<EOS5CFZa *>::const_iterator i = this->eos5cfzas.begin(); i != this->eos5cfzas.end(); ++i)
148string EOS5File::get_CF_string(
string s)
153 return File::get_CF_string(s);
156 return File::get_CF_string(s);
171 for (
auto ircv = this->cvars.begin(); ircv != this->cvars.end(); ++ircv) {
174 if ((CV_EXIST == (*ircv)->cvartype) || (CV_MODIFY == (*ircv)->cvartype)) {
175 for (
auto ira = (*ircv)->attrs.begin(); ira != (*ircv)->attrs.end(); ++ira)
176 Retrieve_H5_Attr_Value(*ira, (*ircv)->fullpath);
188 for (
auto ircv = this->cvars.begin(); ircv != this->cvars.end(); ++ircv) {
191 if ((CV_EXIST == (*ircv)->cvartype) || (CV_MODIFY == (*ircv)->cvartype)) {
192 for (
auto ira = (*ircv)->attrs.begin(); ira != (*ircv)->attrs.end(); ++ira)
193 Retrieve_H5_Attr_Value(*ira, (*ircv)->fullpath);
200void EOS5File::Adjust_H5_Attr_Value(
Attribute *attr)
210 if (
true == check_ignored) {
211 Gen_Unsupported_Dtype_Info(include_attr);
215 Handle_EOS5_Unsupported_Dtype(include_attr);
219void EOS5File::Handle_EOS5_Unsupported_Dtype(
bool include_attr)
222 for (
auto ircv = this->cvars.begin(); ircv != this->cvars.end();) {
223 if (
true == include_attr) {
224 for (
auto ira = (*ircv)->attrs.begin(); ira != (*ircv)->attrs.end();) {
225 H5DataType temp_dtype = (*ira)->getType();
226 if (
false == HDF5CFUtil::cf_strict_support_type(temp_dtype,_is_dap4)) {
228 ira = (*ircv)->attrs.erase(ira);
237 H5DataType temp_dtype = (*ircv)->getType();
238 if (!HDF5CFUtil::cf_strict_support_type(temp_dtype,_is_dap4)) {
240 ircv = this->cvars.erase(ircv);
249void EOS5File::Gen_Unsupported_Dtype_Info(
bool include_attr)
252 if (
true == include_attr) {
254 File::Gen_Group_Unsupported_Dtype_Info();
255 File::Gen_Var_Unsupported_Dtype_Info();
256 Gen_VarAttr_Unsupported_Dtype_Info();
263void EOS5File::Gen_VarAttr_Unsupported_Dtype_Info()
267 Gen_DimScale_VarAttr_Unsupported_Dtype_Info();
270 Gen_EOS5_VarAttr_Unsupported_Dtype_Info();
274void EOS5File::Gen_EOS5_VarAttr_Unsupported_Dtype_Info()
277 for (
auto irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
280 bool is_ignored = ignored_dimscale_ref_list((*irv));
281 if (
false == (*irv)->attrs.empty()) {
283 for (
auto ira = (*irv)->attrs.begin(); ira != (*irv)->attrs.end(); ++ira) {
284 H5DataType temp_dtype = (*ira)->getType();
286 if (
false == HDF5CFUtil::cf_strict_support_type(temp_dtype,_is_dap4) || (temp_dtype == H5INT64) ||(temp_dtype == H5UINT64)) {
290 if ((
"DIMENSION_LIST" != (*ira)->name)
291 && (
"REFERENCE_LIST" != (*ira)->name ||
true == is_ignored))
292 this->add_ignored_info_attrs(
false, (*irv)->fullpath, (*ira)->name);
305 if (
true == check_ignored) {
306 Gen_Unsupported_Dspace_Info();
310 Handle_EOS5_Unsupported_Dspace(include_attr);
315void EOS5File::Handle_EOS5_Unsupported_Dspace(
bool include_attr)
318 if (
true == this->unsupported_var_dspace) {
319 for (
auto ircv = this->cvars.begin(); ircv != this->cvars.end();) {
320 if (
true == (*ircv)->unsupported_dspace) {
322 ircv = this->cvars.erase(ircv);
330 if (
true == include_attr) {
331 if (
true == this->unsupported_var_attr_dspace) {
332 for (
auto ircv = this->cvars.begin(); ircv != this->cvars.end(); ++ircv) {
333 if (
false == (*ircv)->attrs.empty()) {
334 if (
true == (*ircv)->unsupported_attr_dspace) {
335 for (
auto ira = (*ircv)->attrs.begin(); ira != (*ircv)->attrs.end();) {
336 if (0 == (*ira)->count) {
338 ira = (*ircv)->attrs.erase(ira);
352void EOS5File::Gen_Unsupported_Dspace_Info()
355 File::Gen_Unsupported_Dspace_Info();
363 remove_netCDF_internal_attributes(include_attr);
365 if(
true == include_attr) {
366 for (
auto irv = this->
vars.begin();
367 irv != this->vars.end(); ++irv) {
368 for (
auto ira = (*irv)->attrs.begin();
369 ira != (*irv)->attrs.end();) {
370 if((*ira)->name ==
"CLASS") {
371 string class_value = Retrieve_Str_Attr_Value(*ira,(*irv)->fullpath);
375 if (0 == class_value.compare(0,15,
"DIMENSION_SCALE")) {
377 ira = (*irv)->attrs.erase(ira);
389 else if((*ira)->name ==
"NAME") {
390 string name_value = Retrieve_Str_Attr_Value(*ira,(*irv)->fullpath);
391 if( 0 == name_value.compare(0,(*irv)->name.size(),(*irv)->name)) {
393 ira =(*irv)->attrs.erase(ira);
396 string netcdf_dim_mark=
"This is a netCDF dimension but not a netCDF variable";
397 if( 0 == name_value.compare(0,netcdf_dim_mark.size(),netcdf_dim_mark)) {
399 ira =(*irv)->attrs.erase(ira);
407 else if((*ira)->name ==
"_Netcdf4Dimid") {
409 ira =(*irv)->attrs.erase(ira);
418 if(
true == include_attr) {
419 for (
auto irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
420 for (
auto ira = (*irv)->attrs.begin(); ira != (*irv)->attrs.end();) {
421 if((*ira)->name ==
"CLASS") {
422 string class_value = Retrieve_Str_Attr_Value(*ira,(*irv)->fullpath);
426 if (0 == class_value.compare(0,15,
"DIMENSION_SCALE")) {
428 ira = (*irv)->attrs.erase(ira);
435 else if((*ira)->name ==
"NAME") {
437 ira=(*irv)->attrs.erase(ira);
440 string name_value = Retrieve_Str_Attr_Value(*ira,(*irv)->fullpath);
441 if( 0 == name_value.compare(0,(*irv)->name.size(),(*irv)->name)) {
443 ira =(*irv)->attrs.erase(ira);
446 string netcdf_dim_mark=
"This is a netCDF dimension but not a netCDF variable";
447 if( 0 == name_value.compare(0,netcdf_dim_mark.size(),netcdf_dim_mark)) {
449 ira =(*irv)->attrs.erase(ira);
457 else if((*ira)->name ==
"_Netcdf4Dimid") {
459 ira =(*irv)->attrs.erase(ira);
474 if (
true == this->check_ignored &&
true == include_attr) {
477 if (
true == HDF5RequestHandler::get_drop_long_string()) {
479 for (
auto ira = this->
root_attrs.begin(); ira != this->root_attrs.end(); ++ira) {
480 if (H5FSTRING == (*ira)->dtype || H5VSTRING == (*ira)->dtype) {
481 if ((*ira)->getBufSize() > NC_JAVA_STR_SIZE_LIMIT) {
482 this->add_ignored_droplongstr_hdr();
483 this->add_ignored_grp_longstr_info(
"/", (*ira)->name);
488 for (
auto irg = this->
groups.begin(); irg != this->groups.end(); ++irg) {
489 for (
auto ira = (*irg)->attrs.begin(); ira != (*irg)->attrs.end(); ++ira) {
490 if (H5FSTRING == (*ira)->dtype || H5VSTRING == (*ira)->dtype) {
491 if ((*ira)->getBufSize() > NC_JAVA_STR_SIZE_LIMIT) {
492 this->add_ignored_droplongstr_hdr();
493 this->add_ignored_grp_longstr_info((*irg)->path, (*ira)->name);
500 for (
auto irv = this->
vars.begin(); irv != this->vars.end(); ++irv) {
501 if (
true == Check_DropLongStr((*irv),
nullptr)) {
502 string ecsmeta_grp =
"/HDFEOS INFORMATION";
504 if ((*irv)->fullpath.find(ecsmeta_grp) != 0
505 || ((*irv)->fullpath.rfind(
"/") != ecsmeta_grp.size())) {
506 this->add_ignored_droplongstr_hdr();
507 this->add_ignored_var_longstr_info((*irv),
nullptr);
511 for (
auto ira = (*irv)->attrs.begin(); ira != (*irv)->attrs.end(); ++ira) {
512 if (
true == Check_DropLongStr((*irv), (*ira))) {
513 this->add_ignored_droplongstr_hdr();
514 this->add_ignored_var_longstr_info((*irv), (*ira));
520 for (
auto irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
521 for (
auto ira = (*irv)->attrs.begin(); ira != (*irv)->attrs.end(); ++ira) {
522 if (
true == Check_DropLongStr((*irv), (*ira))) {
523 this->add_ignored_droplongstr_hdr();
524 this->add_ignored_var_longstr_info((*irv), (*ira));
532 if (
false == this->have_ignored) this->add_no_ignored_info();
540 BESDEBUG(
"h5",
"coming to Adjust_EOS5Dim_Info" <<endl);
543 for (
unsigned int i = 0; i < strmeta_info->swath_list.size(); ++i) {
544 HE5Swath& he5s = strmeta_info->swath_list.at(i);
546 Adjust_EOS5Dim_List(he5s.dim_list);
556 if(this->have_udim ==
true) {
557 vector<HE5Var> svlist = he5s.geo_var_list;
558 svlist.insert(svlist.end(),he5s.data_var_list.begin(),he5s.data_var_list.end());
560 Adjust_EOS5DimSize_List(he5s.dim_list,svlist,SWATH,he5s.name);
563 for (
unsigned int j = 0; j < he5s.geo_var_list.size(); ++j) {
564 Adjust_EOS5VarDim_Info((he5s.geo_var_list)[j].dim_list, he5s.dim_list, he5s.name, SWATH);
566 for (
unsigned int j = 0; j < he5s.data_var_list.size(); ++j) {
567 Adjust_EOS5VarDim_Info((he5s.data_var_list)[j].dim_list, he5s.dim_list, he5s.name, SWATH);
571 for (
unsigned int i = 0; i < strmeta_info->grid_list.size(); ++i) {
573 HE5Grid& he5g = strmeta_info->grid_list.at(i);
575 Adjust_EOS5Dim_List(he5g.dim_list);
578 if(this->have_udim ==
true) {
580 Adjust_EOS5DimSize_List(he5g.dim_list,he5g.data_var_list,GRID,he5g.name);
583 for (
unsigned int j = 0; j < he5g.data_var_list.size(); ++j) {
584 Adjust_EOS5VarDim_Info((he5g.data_var_list)[j].dim_list, he5g.dim_list, he5g.name, GRID);
588 for (
unsigned int i = 0; i < strmeta_info->za_list.size(); ++i) {
589 HE5Za& he5z = strmeta_info->za_list.at(i);
591 Adjust_EOS5Dim_List(he5z.dim_list);
594 if(this->have_udim ==
true) {
596 Adjust_EOS5DimSize_List(he5z.dim_list,he5z.data_var_list,ZA,he5z.name);
599 for (
unsigned int j = 0; j < he5z.data_var_list.size(); ++j) {
600 Adjust_EOS5VarDim_Info((he5z.data_var_list)[j].dim_list, he5z.dim_list, he5z.name, ZA);
606void EOS5File::Adjust_EOS5Dim_List(vector<HE5Dim>& groupdimlist)
609 BESDEBUG(
"h5",
"Coming to Adjust_EOS5Dim_List"<<endl);
613 Remove_NegativeSizeDims(groupdimlist);
616 Condense_EOS5Dim_List(groupdimlist);
622void EOS5File::Remove_NegativeSizeDims(vector<HE5Dim>& groupdimlist)
625 BESDEBUG(
"h5",
"Coming to Remove_NegativeSizeDims" <<endl);
634 for (
auto id = groupdimlist.begin();
id != groupdimlist.end();) {
635 if ((*id).size <= 0) {
636 id = groupdimlist.erase(
id);
648void EOS5File::Condense_EOS5Dim_List(vector<HE5Dim>& groupdimlist)
651 BESDEBUG(
"h5",
"Coming to Condense_EOS5Dim_List"<<endl);
654 pair<set<int>::iterator,
bool> setret;
655 vector<HE5Dim>::iterator id;
657 for (
id = groupdimlist.begin();
id != groupdimlist.end();) {
658 if (
"XDim" == (*id).name ||
"Xdim" == (*id).name) {
659 setret = xdimsizes.insert((*id).size);
660 if (
false == setret.second) {
661 id = groupdimlist.erase(
id);
663 else if (
"Xdim" == (*id).name) {
677 for (
id = groupdimlist.begin();
id != groupdimlist.end();) {
678 if (
"YDim" == (*id).name ||
"Ydim" == (*id).name) {
679 setret = ydimsizes.insert((*id).size);
680 if (
false == setret.second) {
681 id = groupdimlist.erase(
id);
683 else if (
"Ydim" == (*id).name) {
697void EOS5File:: Adjust_EOS5DimSize_List(vector<HE5Dim>& eos5objdimlist,
const vector<HE5Var> & eos5objvarlist,
698 const EOS5Type eos5type,
const string & eos5objname)
701 set<string>updated_dimlist;
702 pair<set<string>::iterator,
bool> set_insert_ret;
704 for(
unsigned int i = 0; i<eos5objvarlist.size();i++) {
705 HE5Var he5v = eos5objvarlist.at(i);
706 for(
unsigned int j = 0; j<he5v.dim_list.size();j++) {
707 HE5Dim he5d = he5v.dim_list.at(j);
708 set_insert_ret = updated_dimlist.insert(he5d.name);
709 if(set_insert_ret.second ==
true) {
711 unsigned int objdimlist_index = 9999;
712 bool has_objdimlist_index =
false;
713 for(
unsigned int k = 0; k <eos5objdimlist.size();k++) {
714 if(eos5objdimlist[k].name == he5d.name) {
715 objdimlist_index = k;
716 has_objdimlist_index =
true;
720 if(has_objdimlist_index ==
false)
721 throw2(
"Cannot find the dimension in the EOS5 object dimension list for the dimension ", he5d.name);
722 for (vector<Var *>::const_iterator irv = this->
vars.begin(); irv != this->vars.end(); ++irv) {
724 EOS5Type vartype = Get_Var_EOS5_Type((*irv));
727 if(vartype == eos5type) {
728 string var_eos5gname = Obtain_Var_EOS5Type_GroupName((*irv),vartype);
731 if(var_eos5gname == eos5objname) {
732 if((*irv)->name == he5v.name) {
733 if (he5v.dim_list.size() != (*irv)->dims.size())
734 throw2(
"Number of dimensions don't match with the structmetadata for variable ", (*irv)->name);
736 (eos5objdimlist[objdimlist_index]).size = ((*irv)->dims[j])->size;
747 if(updated_dimlist.size() == eos5objdimlist.size())
751for(
unsigned int k = 0; k <eos5objdimlist.size();k++) {
752 cerr<<
"eos5 obj dim name is "<<eos5objdimlist[k].name <<
" Size is "<< eos5objdimlist[k].size << endl;
759void EOS5File::Adjust_EOS5VarDim_Info(vector<HE5Dim>& vardimlist, vector<HE5Dim>& groupdimlist,
760 const string & eos5_obj_name, EOS5Type eos5type)
763 BESDEBUG(
"h5",
"Coming to Adjust_EOS5VarDim_Info"<<endl);
764 set<string> dimnamelist;
765 pair<set<string>::iterator,
bool> setret;
772 for (
unsigned int i = 0; i < vardimlist.size(); ++i) {
774 HE5Dim& he5d = vardimlist.at(i);
775 bool dim_in_groupdimlist =
false;
776 for (
unsigned int j = 0; j < groupdimlist.size(); ++j) {
777 HE5Dim he5gd = groupdimlist.at(j);
778 if (he5gd.name == he5d.name) {
779 he5d.size = he5gd.size;
780 dim_in_groupdimlist =
true;
785 if (
false == dim_in_groupdimlist)
786 throw2(
"The EOS5 group dimension name list doesn't include the dimension ", he5d.name);
791 setret = dimnamelist.insert(he5d.name);
792 if (
false == setret.second) {
794 string temp_clashname = he5d.name +
'_';
795 HDF5CFUtil::gen_unique_name(temp_clashname, dimnamelist, clash_index);
797 string ori_dimname = he5d.name;
799 he5d.name = temp_clashname;
802 bool dim_exist =
false;
803 for (
unsigned int j = 0; j < groupdimlist.size(); ++j) {
804 if (he5d.name == groupdimlist[j].name && he5d.size == groupdimlist[j].size) {
811 if (
false == dim_exist) {
812 ori_dimname = eos5_obj_name +
"/" + ori_dimname;
813 string dup_dimname = eos5_obj_name +
"/" + he5d.name;
814 if (GRID == eos5type) {
815 ori_dimname =
"/GRIDS/" + ori_dimname;
816 dup_dimname =
"/GRIDS/" + dup_dimname;
818 else if (SWATH == eos5type) {
819 ori_dimname =
"/SWATHS/" + ori_dimname;
820 dup_dimname =
"/SWATHS/" + dup_dimname;
822 else if (ZA == eos5type) {
823 ori_dimname =
"/ZAS/" + ori_dimname;
824 dup_dimname =
"/ZAS/" + dup_dimname;
828 dimname_to_dupdimnamelist.insert(pair<string, string>(ori_dimname, dup_dimname));
829 groupdimlist.push_back(he5d);
841 BESDEBUG(
"h5",
"Coming to Add_EOS5File_Info"<<endl);
842 string fslash_str =
"/";
843 string grid_str =
"/GRIDS/";
844 string swath_str =
"/SWATHS/";
845 string za_str =
"/ZAS/";
853 this->orig_num_grids = (
int)(strmeta_info->grid_list.size());
856 for (
unsigned int i = 0; i < strmeta_info->grid_list.size(); i++) {
857 HE5Grid he5g = strmeta_info->grid_list.at(i);
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);
926 eos5swath->name = he5s.name;
927 eos5swath->dimnames.resize(he5s.dim_list.size());
929 for (
unsigned int j = 0; j < he5s.dim_list.size(); j++) {
931 HE5Dim he5d = he5s.dim_list.at(j);
941 string unique_dimname = swath_str + he5s.name + fslash_str + he5d.name;
942 (eos5swath->dimnames)[j] = unique_dimname;
946 pair<map<hsize_t, string>::iterator,
bool> mapret1;
947 mapret1 = eos5swath->dimsizes_to_dimnames.insert(
948 pair<hsize_t, string>((hsize_t) he5d.size, unique_dimname));
953 pair<map<string, hsize_t>::iterator,
bool> mapret2;
954 mapret2 = eos5swath->dimnames_to_dimsizes.insert(
955 pair<string, hsize_t>(unique_dimname, (hsize_t) he5d.size));
956 if (
false == mapret2.second)
957 throw5(
"The dimension name ", unique_dimname,
" with the dimension size ", he5d.size,
"is not unique");
962 EOS5SwathGrid_Set_LatLon_Flags(eos5swath, he5s.geo_var_list);
965 map<string, string> dnames_to_geo1dvnames;
966 EOS5Handle_nonlatlon_dimcvars(he5s.geo_var_list, SWATH, he5s.name, dnames_to_geo1dvnames);
967 eos5swath->dnames_to_geo1dvnames = dnames_to_geo1dvnames;
968 this->eos5cfswaths.push_back(eos5swath);
972 for (
unsigned int i = 0; i < strmeta_info->za_list.size(); i++) {
974 HE5Za he5z = strmeta_info->za_list.at(i);
977 eos5za->name = he5z.name;
978 eos5za->dimnames.resize(he5z.dim_list.size());
980 for (
unsigned int j = 0; j < he5z.dim_list.size(); j++) {
982 HE5Dim he5d = he5z.dim_list.at(j);
988 string unique_dimname = za_str + he5z.name + fslash_str + he5d.name;
989 (eos5za->dimnames)[j] = unique_dimname;
990 pair<map<hsize_t, string>::iterator,
bool> mapret1;
991 mapret1 = eos5za->dimsizes_to_dimnames.insert(pair<hsize_t, string>((hsize_t) he5d.size, unique_dimname));
996 pair<map<string, hsize_t>::iterator,
bool> mapret2;
997 mapret2 = eos5za->dimnames_to_dimsizes.insert(pair<string, hsize_t>(unique_dimname, (hsize_t) he5d.size));
998 if (
false == mapret2.second)
999 throw5(
"The dimension name ", unique_dimname,
" with the dimension size ", he5d.size,
"is not unique");
1004 map<string, string> dnames_to_1dvnames;
1005 EOS5Handle_nonlatlon_dimcvars(he5z.data_var_list, ZA, he5z.name, dnames_to_1dvnames);
1006 eos5za->dnames_to_1dvnames = dnames_to_1dvnames;
1007 this->eos5cfzas.push_back(eos5za);
1012 for (
auto irg = this->eos5cfgrids.begin();
1013 irg != this->eos5cfgrids.end(); ++irg) {
1015 cerr<<
"grid name "<<(*irg)->name <<endl;
1016 cerr<<
"eos5_pixelreg"<<(*irg)->eos5_pixelreg <<endl;
1017 cerr<<
"eos5_origin"<<(*irg)->eos5_pixelreg <<endl;
1018 cerr<<
"point_lower "<<(*irg)->point_lower <<endl;
1019 cerr<<
"xdimsize "<<(*irg)->xdimsize <<endl;
1021 if((*irg)->has_g2dlatlon) cerr<<
"has g2dlatlon"<<endl;
1022 if((*irg)->has_2dlatlon) cerr<<
"has 2dlatlon"<<endl;
1023 if((*irg)->has_1dlatlon) cerr<<
"has 1dlatlon"<<endl;
1024 if((*irg)->has_nolatlon) cerr<<
"has no latlon" <<endl;
1025 if(this->grids_multi_latloncvs) cerr<<
"having multiple lat/lon from structmeta" <<endl;
1026 else cerr<<
"no multiple lat/lon from structmeta" <<endl;
1029 "h5",
"number of dimensions "<<(*irg)->dimnames.size() <<endl;
1030 for (
auto irv = (*irg)->dimnames.begin();
1031 irv != (*irg)->dimnames.end(); ++irv)
1032 cerr<<
"dim names" <<*irv <<endl;
1035 for (
auto im1 = (*irg)->dimsizes_to_dimnames.begin();
1036 im1 !=(*irg)->dimsizes_to_dimnames.end();++im1) {
1037 cerr<<
"size to name "<< (
int)((*im1).first) <<
"=> "<<(*im1).second <<endl;
1041 for (
auto im2 = (*irg)->dnames_to_1dvnames.begin();
1042 im2 !=(*irg)->dnames_to_1dvnames.end();++im2) {
1043 cerr<<
"dimanme to 1d var name "<< (*im2).first <<
"=> "<<(*im2).second <<endl;
1048 for (
auto irg = this->eos5cfswaths.begin();
1049 irg != this->eos5cfswaths.end(); ++irg) {
1051 cerr<<
"swath name "<<(*irg)->name <<endl;
1052 if((*irg)->has_nolatlon) cerr<<
"has no latlon" <<endl;
1053 if((*irg)->has_1dlatlon) cerr<<
"has 1dlatlon"<<endl;
1054 if((*irg)->has_2dlatlon) cerr<<
"has 2dlatlon"<<endl;
1057 for (
auto irv = (*irg)->dimnames.begin();
1058 irv != (*irg)->dimnames.end(); ++irv)
1059 cerr<<
"dim names" <<*irv <<endl;
1062 for (
auto im1 = (*irg)->dimsizes_to_dimnames.begin();
1063 im1 !=(*irg)->dimsizes_to_dimnames.end();++im1) {
1064 cerr<<
"size to name "<< (
int)((*im1).first) <<
"=> "<<(*im1).second <<endl;
1068 for (
auto im2 = (*irg)->dnames_to_geo1dvnames.begin();
1069 im2 !=(*irg)->dnames_to_geo1dvnames.end();++im2) {
1070 cerr<<
"dimname to 1d varname "<< (*im2).first <<
"=> "<<(*im2).second <<endl;
1074 for (
auto irg = this->eos5cfzas.begin();
1075 irg != this->eos5cfzas.end(); ++irg) {
1077 cerr<<
"za name now"<<(*irg)->name <<endl;
1080 for (
auto irv = (*irg)->dimnames.begin();
1081 irv != (*irg)->dimnames.end(); ++irv)
1082 cerr<<
"dim names" <<*irv <<endl;
1085 for (
auto im1 = (*irg)->dimsizes_to_dimnames.begin();
1086 im1 !=(*irg)->dimsizes_to_dimnames.end();++im1) {
1087 cerr<<
"size to name "<< (
int)((*im1).first) <<
"=> "<<(*im1).second <<endl;
1091 for (
auto im2 = (*irg)->dnames_to_1dvnames.begin();
1092 im2 !=(*irg)->dnames_to_1dvnames.end();++im2) {
1093 cerr<<
"dimname to 1d varname "<< (*im2).first <<
"=> "<<(*im2).second <<endl;
1102void EOS5File::EOS5SwathGrid_Set_LatLon_Flags(T* eos5gridswath, vector<HE5Var> &eos5varlist)
1105 BESDEBUG(
"h5",
"Coming to EOS5SwathGrid_Set_LatLon_Flags"<<endl);
1106 bool find_lat =
false;
1107 bool find_lon =
false;
1108 bool has_1dlat =
false;
1109 bool has_1dlon =
false;
1110 bool has_2dlat =
false;
1111 string lat_xdimname;
1112 string lat_ydimname;
1113 string lon_xdimname;
1114 string lon_ydimname;
1115 bool has_2dlon =
false;
1116 bool has_g2dlat =
false;
1117 bool has_g2dlon =
false;
1119 for (
unsigned int i = 0; i < eos5varlist.size(); ++i) {
1120 HE5Var he5v = eos5varlist.at(i);
1121 if (
"Latitude" == he5v.name) {
1123 auto num_dims = (
int)(he5v.dim_list.size());
1126 else if (2 == num_dims) {
1127 lat_ydimname = (he5v.dim_list)[0].name;
1128 lat_xdimname = (he5v.dim_list)[1].name;
1131 else if (num_dims > 2)
1134 throw1(
"The number of dimension should not be 0 for grids or swaths");
1137 if (
"Longitude" == he5v.name) {
1139 auto num_dims = (
int)(he5v.dim_list.size());
1142 else if (2 == num_dims) {
1143 lon_ydimname = (he5v.dim_list)[0].name;
1144 lon_xdimname = (he5v.dim_list)[1].name;
1147 else if (num_dims > 2)
1150 throw1(
"The number of dimension should not be 0 for grids or swaths");
1153 if (
true == find_lat &&
true == find_lon) {
1154 if (
true == has_1dlat &&
true == has_1dlon) eos5gridswath->has_1dlatlon =
true;
1157 if (
true == has_2dlat &&
true == has_2dlon && lat_ydimname == lon_ydimname && lat_xdimname == lon_xdimname)
1158 eos5gridswath->has_2dlatlon =
true;
1160 if (
true == has_g2dlat &&
true == has_g2dlon) eos5gridswath->has_g2dlatlon =
true;
1162 eos5gridswath->has_nolatlon =
false;
1170void EOS5File::EOS5Handle_nonlatlon_dimcvars(vector<HE5Var> & eos5varlist, EOS5Type eos5type,
string groupname,
1171 map<string, string>& dnamesgeo1dvnames)
1174 BESDEBUG(
"h5",
"Coming to EOS5Handle_nonlatlon_dimcvars"<<endl);
1176 set<string> nocvdimnames;
1177 string grid_str =
"/GRIDS/";
1178 string xdim_str =
"XDim";
1179 string ydim_str =
"YDim";
1180 string fslash_str =
"/";
1183 if (GRID == eos5type) {
1184 string xdimname = grid_str + groupname + fslash_str + xdim_str;
1185 nocvdimnames.insert(xdimname);
1186 string ydimname = grid_str + groupname + fslash_str + ydim_str;
1187 nocvdimnames.insert(ydimname);
1188 eos5typestr =
"/GRIDS/";
1190 else if (SWATH == eos5type)
1191 eos5typestr =
"/SWATHS/";
1192 else if (ZA == eos5type)
1193 eos5typestr =
"/ZAS/";
1195 throw1(
"Unsupported HDF-EOS5 type, this type is not swath, grid or zonal average");
1199 pair<map<string, string>::iterator,
bool> mapret;
1200 for (
unsigned int i = 0; i < eos5varlist.size(); ++i) {
1201 HE5Var he5v = eos5varlist.at(i);
1202 if (1 == he5v.dim_list.size()) {
1203 HE5Dim he5d = he5v.dim_list.at(0);
1205 dimname = eos5typestr + groupname + fslash_str + he5d.name;
1207 varname = eos5typestr + groupname + fslash_str + he5v.name;
1208 mapret = dnamesgeo1dvnames.insert(pair<string, string>(dimname, varname));
1213 if (
false == mapret.second) nocvdimnames.insert(dimname);
1219 for (
auto itset = nocvdimnames.begin(); itset != nocvdimnames.end(); ++itset)
1220 dnamesgeo1dvnames.erase(*itset);
1227 BESDEBUG(
"h5",
"Coming to Adjust_Var_NewName_After_Parsing"<<endl);
1228 for (
auto irv = this->
vars.begin(); irv != this->vars.end(); ++irv) {
1229 Obtain_Var_NewName(*irv);
1233void EOS5File::Obtain_Var_NewName(
Var *var)
1236 BESDEBUG(
"h5",
"Coming to Obtain_Var_NewName"<<endl);
1237 string fslash_str =
"/";
1238 string eos5typestr =
"";
1240 EOS5Type vartype = Get_Var_EOS5_Type(var);
1248 eos5typestr =
"/GRIDS/";
1249 string eos5_groupname = Obtain_Var_EOS5Type_GroupName(var, vartype);
1254 var->newname = eos5typestr + eos5_groupname + fslash_str + var->name;
1259 eos5typestr =
"/SWATHS/";
1260 string eos5_groupname = Obtain_Var_EOS5Type_GroupName(var, vartype);
1265 var->newname = eos5typestr + eos5_groupname + fslash_str + var->name;
1269 eos5typestr =
"/ZAS/";
1270 string eos5_groupname = Obtain_Var_EOS5Type_GroupName(var, vartype);
1275 var->newname = eos5typestr + eos5_groupname + fslash_str + var->name;
1279 string eos5infopath =
"/HDFEOS INFORMATION";
1280 if (var->fullpath.size() > eos5infopath.size()) {
1281 if (eos5infopath == var->fullpath.substr(0, eos5infopath.size())) var->newname = var->name;
1284 var->newname = var->fullpath;
1288 throw1(
"Non-supported EOS type");
1293EOS5Type EOS5File::Get_Var_EOS5_Type(
Var* var)
1296 BESDEBUG(
"h5",
"Coming to Get_Var_EOS5_Type"<<endl);
1298 string EOS5GRIDPATH =
"/HDFEOS/GRIDS";
1299 string EOS5SWATHPATH =
"/HDFEOS/SWATHS";
1300 string EOS5ZAPATH =
"/HDFEOS/ZAS";
1302 if (var->fullpath.size() >= EOS5GRIDPATH.size()) {
1303 if (EOS5GRIDPATH == var->fullpath.substr(0, EOS5GRIDPATH.size()))
return GRID;
1305 if (var->fullpath.size() >= EOS5SWATHPATH.size()) {
1306 if (EOS5SWATHPATH == var->fullpath.substr(0, EOS5SWATHPATH.size()))
return SWATH;
1308 if (var->fullpath.size() >= EOS5ZAPATH.size()) {
1309 if (EOS5ZAPATH == var->fullpath.substr(0, EOS5ZAPATH.size()))
return ZA;
1319 BESDEBUG(
"h5",
"Coming to Add_Dim_Name"<<endl);
1320 for (
auto irv = this->
vars.begin(); irv != this->vars.end(); ++irv) {
1321 Obtain_Var_Dims(*irv, strmeta_info);
1323 for (
auto ird = (*irv)->dims.begin();
1324 ird != (*irv)->dims.end();++ird) {
1325 cerr<<
"dim name right after change "<<(*ird)->newname <<endl;
1333bool EOS5File::Obtain_Var_Dims(
Var *var,
HE5Parser * strmeta_info)
1336 BESDEBUG(
"h5",
"Coming to Obtain_Var_Dims"<<endl);
1337 string varname_from_parser =
"";
1338 EOS5Type vartype = Get_Var_EOS5_Type(var);
1340 if (GRID == vartype) {
1342 auto num_grids = (
int)(strmeta_info->grid_list.size());
1344 for (
int i = 0; i < num_grids; ++i) {
1345 HE5Grid he5g = strmeta_info->grid_list.at(i);
1346 if (he5g.name == Obtain_Var_EOS5Type_GroupName(var, vartype)) {
1347 EOS5CFGrid *eos5cfgrid = (this->eos5cfgrids)[i];
1348 bool var_is_parsed = Set_Var_Dims(eos5cfgrid, var, he5g.data_var_list, he5g.name, num_grids, GRID);
1349 if (
false == var_is_parsed) {
1350 map<hsize_t, string> dimsizes_to_dimnames = eos5cfgrid->dimsizes_to_dimnames;
1355 Set_NonParse_Var_Dims(eos5cfgrid, var, dimsizes_to_dimnames, num_grids, vartype);
1361 else if (SWATH == vartype) {
1363 auto num_swaths = (
int)(strmeta_info->swath_list.size());
1365 for (
int i = 0; i < num_swaths; ++i) {
1367 HE5Swath he5s = strmeta_info->swath_list.at(i);
1369 if (he5s.name == Obtain_Var_EOS5Type_GroupName(var, vartype)) {
1371 EOS5CFSwath *eos5cfswath = (this->eos5cfswaths)[i];
1373 bool var_is_parsed =
true;
1374 int swath_fieldtype_flag = Check_EOS5Swath_FieldType(var);
1375 if (1 == swath_fieldtype_flag)
1376 var_is_parsed = Set_Var_Dims(eos5cfswath, var, he5s.geo_var_list, he5s.name, num_swaths, SWATH);
1377 else if (0 == swath_fieldtype_flag)
1378 var_is_parsed = Set_Var_Dims(eos5cfswath, var, he5s.data_var_list, he5s.name, num_swaths, SWATH);
1381 var_is_parsed =
false;
1383 if (
false == var_is_parsed) {
1384 map<hsize_t, string> dimsizes_to_dimnames = eos5cfswath->dimsizes_to_dimnames;
1385 Set_NonParse_Var_Dims(eos5cfswath, var, dimsizes_to_dimnames, num_swaths, vartype);
1391 else if (ZA == vartype) {
1393 auto num_zas = (
int)(strmeta_info->za_list.size());
1395 for (
int i = 0; i < num_zas; ++i) {
1396 HE5Za he5z = strmeta_info->za_list.at(i);
1397 if (he5z.name == Obtain_Var_EOS5Type_GroupName(var, vartype)) {
1398 EOS5CFZa *eos5cfza = (this->eos5cfzas)[i];
1399 bool var_is_parsed = Set_Var_Dims(eos5cfza, var, he5z.data_var_list, he5z.name, num_zas, ZA);
1400 if (
false == var_is_parsed) {
1401 map<hsize_t, string> dimsizes_to_dimnames = eos5cfza->dimsizes_to_dimnames;
1402 Set_NonParse_Var_Dims(eos5cfza, var, dimsizes_to_dimnames, num_zas, vartype);
1412bool EOS5File::Set_Var_Dims(T* eos5data,
Var *var, vector<HE5Var> &he5var,
const string& groupname,
int num_groups,
1416 BESDEBUG(
"h5",
"Coming to Set_Var_Dims"<<endl);
1418 bool is_parsed =
false;
1419 string eos5typestr =
"";
1420 string fslash_str =
"/";
1422 if (GRID == eos5type)
1423 eos5typestr =
"/GRIDS/";
1424 else if (SWATH == eos5type)
1425 eos5typestr =
"/SWATHS/";
1426 else if (ZA == eos5type)
1427 eos5typestr =
"/ZAS/";
1429 throw1(
"Unsupported HDF-EOS5 type, this type is not swath, grid or zonal average");
1431 for (
unsigned int i = 0; i < he5var.size(); i++) {
1433 HE5Var he5v = he5var.at(i);
1435 if (he5v.name == var->name) {
1436 if (he5v.dim_list.size() != var->dims.size())
1437 throw2(
"Number of dimensions don't match with the structmetadata for variable ", var->name);
1467 set<hsize_t> dimsize_have_name_set;
1468 pair<set<hsize_t>::iterator,
bool> setret1;
1469 set<string> thisvar_dimname_set;
1470 pair<set<string>::iterator,
bool> setret2;
1472 for (
unsigned int j = 0; j < he5v.dim_list.size(); j++) {
1473 HE5Dim he5d = he5v.dim_list.at(j);
1474 for (
auto ird = var->dims.begin(); ird != var->dims.end(); ++ird) {
1476 if ((hsize_t) (he5d.size) == (*ird)->size) {
1478 if (
"" == (*ird)->name) {
1479 string dimname_candidate = eos5typestr + groupname + fslash_str + he5d.name;
1480 setret2 = thisvar_dimname_set.insert(dimname_candidate);
1481 if (
true == setret2.second) {
1482 (*ird)->name = dimname_candidate;
1484 (*ird)->newname = (num_groups == 1) ? he5d.name : (*ird)->name;
1485 eos5data->vardimnames.insert((*ird)->name);
1489 eos5data->dimnames_to_unlimited[(*ird)->name] = (*ird)->unlimited_dim;
1498 for (
auto ird = var->dims.begin(); ird != var->dims.end(); ++ird) {
1499 if (
"" == (*ird)->name)
1500 Create_Unique_DimName(eos5data, thisvar_dimname_set, *ird, num_groups, eos5type);
1509void EOS5File::Create_Unique_DimName(T*eos5data, set<string>& thisvar_dimname_set,
Dimension *dim,
int num_groups,
1513 BESDEBUG(
"h5",
"Coming to Create_Unique_DimName"<<endl);
1514 map<hsize_t, string>::iterator itmap1;
1515 map<string, hsize_t>::iterator itmap2;
1516 pair<set<string>::iterator,
bool> setret2;
1517 itmap1 = (eos5data->dimsizes_to_dimnames).find(dim->size);
1524 if (itmap1 != (eos5data->dimsizes_to_dimnames).end()) {
1525 string dimname_candidate = (eos5data->dimsizes_to_dimnames)[dim->size];
1528 setret2 = thisvar_dimname_set.insert(dimname_candidate);
1530 if (
false == setret2.second) {
1533 bool match_some_dimname = Check_All_DimNames(eos5data, dimname_candidate, dim->size);
1535 if (
false == match_some_dimname) {
1538 Get_Unique_Name(eos5data->vardimnames, dimname_candidate);
1539 thisvar_dimname_set.insert(dimname_candidate);
1542 Insert_One_NameSizeMap_Element2(eos5data->dimnames_to_dimsizes, eos5data->dimnames_to_unlimited,
1543 dimname_candidate, dim->size, dim->unlimited_dim);
1544 eos5data->dimsizes_to_dimnames.insert(pair<hsize_t, string>(dim->size, dimname_candidate));
1545 eos5data->dimnames.push_back(dimname_candidate);
1550 dim->name = dimname_candidate;
1552 dim->newname = dim->name;
1554 string dname = HDF5CFUtil::obtain_string_after_lastslash(dim->name);
1556 throw3(
"The dimension name ", dim->name,
" of the variable is not right");
1558 dim->newname = dname;
1564 string Fakedimname = Create_Unique_FakeDimName(eos5data, eos5type);
1565 thisvar_dimname_set.insert(Fakedimname);
1568 Insert_One_NameSizeMap_Element2(eos5data->dimnames_to_dimsizes, eos5data->dimnames_to_unlimited, Fakedimname,
1569 dim->size, dim->unlimited_dim);
1570 eos5data->dimsizes_to_dimnames.insert(pair<hsize_t, string>(dim->size, Fakedimname));
1571 eos5data->dimnames.push_back(Fakedimname);
1572 dim->name = Fakedimname;
1574 dim->newname = dim->name;
1576 string dname = HDF5CFUtil::obtain_string_after_lastslash(dim->name);
1578 throw3(
"The dimension name ", dim->name,
" of the variable is not right");
1580 dim->newname = dname;
1587bool EOS5File::Check_All_DimNames(T* eos5data,
string& dimname, hsize_t dimsize)
1590 BESDEBUG(
"h5",
"Coming to Check_All_DimNames"<<endl);
1591 bool ret_flag =
false;
1592 for (map<string, hsize_t>::iterator im = eos5data->dimnames_to_dimsizes.begin();
1593 im != eos5data->dimnames_to_dimsizes.end(); ++im) {
1595 if (dimsize == (*im).second && dimname != (*im).first) {
1596 dimname = (*im).first;
1605void EOS5File::Get_Unique_Name(set<string> & nameset,
string& dimname_candidate)
1608 BESDEBUG(
"h5",
"Coming to Get_Unique_Name"<<endl);
1609 int clash_index = 1;
1610 string temp_clashname = dimname_candidate +
'_';
1611 HDF5CFUtil::gen_unique_name(temp_clashname, nameset, clash_index);
1612 dimname_candidate = temp_clashname;
1617string EOS5File::Create_Unique_FakeDimName(T*eos5data, EOS5Type eos5type)
1620 BESDEBUG(
"h5",
"Coming to Create_Unique_FakeDimName"<<endl);
1621 string fslash_str =
"/";
1623 if (GRID == eos5type)
1624 eos5typestr =
"/GRIDS/";
1625 else if (SWATH == eos5type)
1626 eos5typestr =
"/SWATHS/";
1627 else if (ZA == eos5type)
1628 eos5typestr =
"/ZAS/";
1630 throw1(
"Unsupported HDF-EOS5 type, this type is not swath, grid or zonal average");
1632 stringstream sfakedimindex;
1633 sfakedimindex << eos5data->addeddimindex;
1634 string fakedimstr =
"FakeDim";
1635 string added_dimname = eos5typestr + eos5data->name + fslash_str + fakedimstr + sfakedimindex.str();
1637 pair<set<string>::iterator,
bool> setret;
1638 setret = eos5data->vardimnames.insert(added_dimname);
1639 if (
false == setret.second) Get_Unique_Name(eos5data->vardimnames, added_dimname);
1640 eos5data->addeddimindex = eos5data->addeddimindex + 1;
1641 return added_dimname;
1645string EOS5File::Obtain_Var_EOS5Type_GroupName(
const Var*var, EOS5Type eos5type)
const
1648 BESDEBUG(
"h5",
"Coming to Obtain_Var_EOS5Type_GroupName"<<endl);
1649 string EOS5GRIDPATH =
"/HDFEOS/GRIDS";
1650 string EOS5SWATHPATH =
"/HDFEOS/SWATHS";
1651 string EOS5ZAPATH =
"/HDFEOS/ZAS";
1652 size_t eostypename_start_pos = 0;
1653 size_t eostypename_end_pos;
1660 if (GRID == eos5type)
1661 eostypename_start_pos = EOS5GRIDPATH.size() + 1;
1662 else if (SWATH == eos5type)
1663 eostypename_start_pos = EOS5SWATHPATH.size() + 1;
1664 else if (ZA == eos5type)
1665 eostypename_start_pos = EOS5ZAPATH.size() + 1;
1667 throw2(
"Non supported eos5 type for var ", var->fullpath);
1669 eostypename_end_pos = var->fullpath.find(
'/', eostypename_start_pos) - 1;
1670 groupname = var->fullpath.substr(eostypename_start_pos, eostypename_end_pos - eostypename_start_pos + 1);
1672 BESDEBUG(
"h5",
"In Obtain_Var_EOS5Type_GroupName(), the groupname is "<<groupname << endl);
1678int EOS5File::Check_EOS5Swath_FieldType(
const Var*var)
const
1681 string geofield_relative_path =
"/Geolocation Fields/" + var->name;
1682 string datafield_relative_path =
"/Data Fields/" + var->name;
1686 if (var->fullpath.size() > datafield_relative_path.size()) {
1687 size_t field_pos_in_full_path = var->fullpath.size() - datafield_relative_path.size();
1688 if (var->fullpath.rfind(datafield_relative_path, field_pos_in_full_path) != string::npos) tempflag = 0;
1691 if (tempflag != 0 && (var->fullpath.size() > geofield_relative_path.size())) {
1692 size_t field_pos_in_full_path = var->fullpath.size() - geofield_relative_path.size();
1693 if (var->fullpath.rfind(geofield_relative_path, field_pos_in_full_path) != string::npos) tempflag = 1;
1701void EOS5File::Set_NonParse_Var_Dims(T*eos5data,
Var* var,
const map<hsize_t, string>& ,
1702 int num_groups, EOS5Type eos5type)
1705 BESDEBUG(
"h5",
"Coming to Set_NonParse_Var_Dims"<<endl);
1706 map<hsize_t, string>::iterator itmap;
1707 set<string> thisvar_dimname_set;
1709 for (
auto ird = var->dims.begin(); ird != var->dims.end(); ++ird) {
1710 if (
"" == (*ird)->name)
1711 Create_Unique_DimName(eos5data, thisvar_dimname_set, *ird, num_groups, eos5type);
1713 throw5(
"The dimension name ", (*ird)->name,
" of the variable ", var->name,
" is not right");
1721 BESDEBUG(
"h5",
"Coming to Check_Aura_Product_Status"<<endl);
1724 string eos5_fattr_group_name =
"/HDFEOS/ADDITIONAL/FILE_ATTRIBUTES";
1725 string instrument_attr_name =
"InstrumentName";
1728 for (
auto irg = this->
groups.begin(); irg != this->groups.end(); ++irg) {
1729 if (eos5_fattr_group_name == (*irg)->path) {
1730 for (
auto ira = (*irg)->attrs.begin(); ira != (*irg)->attrs.end(); ++ira) {
1731 if (instrument_attr_name == (*ira)->name) {
1732 Retrieve_H5_Attr_Value(*ira, (*irg)->path);
1733 string attr_value((*ira)->value.begin(), (*ira)->value.end());
1734 if (
"OMI" == attr_value) {
1735 this->isaura =
true;
1736 this->aura_name = OMI;
1738 else if (
"MLS Aura" == attr_value) {
1739 this->isaura =
true;
1740 this->aura_name = MLS;
1742 else if (
"TES" == attr_value) {
1743 this->isaura =
true;
1744 this->aura_name = TES;
1746 else if (
"HIRDLS" == attr_value) {
1747 this->isaura =
true;
1748 this->aura_name = HIRDLS;
1757 if (
true == this->isaura) {
1758 eos5_to_cf_attr_map[
"FillValue"] =
"_FillValue";
1759 eos5_to_cf_attr_map[
"MissingValue"] =
"missing_value";
1760 eos5_to_cf_attr_map[
"Units"] =
"units";
1761 eos5_to_cf_attr_map[
"Offset"] =
"add_offset";
1762 eos5_to_cf_attr_map[
"ScaleFactor"] =
"scale_factor";
1763 eos5_to_cf_attr_map[
"ValidRange"] =
"valid_range";
1764 eos5_to_cf_attr_map[
"Title"] =
"title";
1773 BESDEBUG(
"h5",
"Coming to Handle_CVar()"<<endl);
1776 bool is_augmented = Check_Augmentation_Status();
1779 if(is_augmented) cerr<<
"The file is augmented "<<endl;
1780 else cerr<<
"The file is not augmented "<<endl;
1784 if (this->eos5cfgrids.empty() ==
false)
1785 Handle_Grid_CVar(is_augmented);
1786 if (this->eos5cfswaths.empty() ==
false)
1787 Handle_Swath_CVar(is_augmented);
1788 if (this->eos5cfzas.empty() ==
false)
1789 Handle_Za_CVar(is_augmented);
1792 for (
auto irv = this->cvars.begin();
1793 irv != this->cvars.end(); irv++) {
1794 cerr<<
"EOS5CVar name "<<(*irv)->name <<endl;
1795 cerr<<
"EOS5CVar dimension name "<< (*irv)->cfdimname <<endl;
1796 cerr<<
"EOS5CVar new name "<<(*irv)->newname <<endl;
1797 cerr<<
"EOS5CVar type is "<<(*irv)->cvartype <<endl;
1805void EOS5File::Handle_Grid_CVar(
bool is_augmented)
1808 BESDEBUG(
"h5",
"Coming to Handle_Grid_CVar"<<endl);
1809 if (
true == is_augmented) {
1811 Handle_Augmented_Grid_CVar();
1814 Remove_MultiDim_LatLon_EOS5CFGrid();
1817 if (this->eos5cfgrids.empty())
return;
1818 if (1 == this->eos5cfgrids.size())
1819 Handle_Single_Nonaugment_Grid_CVar((this->eos5cfgrids)[0]);
1821 Handle_Multi_Nonaugment_Grid_CVar();
1828bool EOS5File::Check_Augmentation_Status()
1831 BESDEBUG(
"h5",
"Coming to Check_Augmentation_Status()"<<endl);
1832 bool aug_status =
false;
1833 int num_aug_eos5grp = 0;
1835 for (
auto irg = this->eos5cfgrids.begin(); irg != this->eos5cfgrids.end(); ++irg) {
1836 for (
auto irv = this->
vars.begin(); irv != this->vars.end(); ++irv) {
1837 bool is_augmented = Check_Augmented_Var_Candidate(*irg, *irv, GRID);
1838 if (
true == is_augmented) {
1845 for (
auto irg = this->eos5cfswaths.begin(); irg != this->eos5cfswaths.end(); ++irg) {
1846 for (
auto irv = this->
vars.begin(); irv != this->vars.end(); ++irv) {
1847 bool is_augmented = Check_Augmented_Var_Candidate(*irg, *irv, SWATH);
1848 if (
true == is_augmented) {
1856 for (
auto irg = this->eos5cfzas.begin(); irg != this->eos5cfzas.end(); ++irg) {
1857 for (
auto irv = this->
vars.begin(); irv != this->vars.end(); ++irv) {
1858 bool is_augmented = Check_Augmented_Var_Candidate(*irg, *irv, ZA);
1859 if (
true == is_augmented) {
1866 int total_num_eos5grp = this->eos5cfgrids.size() + this->eos5cfswaths.size() + this->eos5cfzas.size();
1873 if (num_aug_eos5grp == total_num_eos5grp) aug_status =
true;
1881bool EOS5File::Check_Augmented_Var_Attrs(
Var *var) {
1885 bool has_dimscale_class =
false;
1886 bool has_reflist =
false;
1887 for (
auto ira = var->attrs.begin(); ira != var->attrs.end(); ++ira) {
1888 if (
"CLASS" == (*ira)->name) {
1889 Retrieve_H5_Attr_Value(*ira,var->fullpath);
1890 string class_value((*ira)->value.begin(),(*ira)->value.end());
1891 if (
"DIMENSION_SCALE"==class_value)
1892 has_dimscale_class =
true;
1895 if (
"REFERENCE_LIST" == (*ira)->name)
1897 if (
true == has_reflist &&
true == has_dimscale_class)
1901 if (
true == has_reflist &&
true == has_dimscale_class)
1916bool EOS5File::Check_Augmented_Var_Candidate(T *eos5data,
Var *var, EOS5Type eos5type)
1919 BESDEBUG(
"h5",
"Coming to Check_Augmented_Var_Candidate"<<endl);
1920 bool augmented_var =
false;
1922 string EOS5DATAPATH =
"";
1923 if (GRID == eos5type)
1924 EOS5DATAPATH =
"/HDFEOS/GRIDS/";
1925 else if (ZA == eos5type)
1926 EOS5DATAPATH =
"/HDFEOS/ZAS/";
1927 else if (SWATH == eos5type)
1928 EOS5DATAPATH =
"/HDFEOS/SWATHS/";
1930 throw1(
"Non supported EOS5 type");
1932 string fslash_str =
"/";
1933 string THIS_EOS5DATAPATH = EOS5DATAPATH + eos5data->name + fslash_str;
1936 if (eos5type == Get_Var_EOS5_Type(var)) {
1937 string var_eos5data_name = Obtain_Var_EOS5Type_GroupName(var, eos5type);
1939 if (var_eos5data_name == eos5data->name) {
1940 if (var->fullpath.size() > THIS_EOS5DATAPATH.size()) {
1942 string var_path_after_eos5dataname = var->fullpath.substr(THIS_EOS5DATAPATH.size());
1944 if (var_path_after_eos5dataname == var->name) augmented_var =
true;
1949 return augmented_var;
1954void EOS5File::Handle_Augmented_Grid_CVar()
1956 BESDEBUG(
"h5",
"Coming to Handle_Augmented_Grid_CVar()"<<endl);
1957 for (
auto irv = this->eos5cfgrids.begin(); irv != this->eos5cfgrids.end(); ++irv)
1958 Handle_Single_Augment_CVar(*irv, GRID);
1963void EOS5File::Handle_Single_Augment_CVar(T* cfeos5data, EOS5Type eos5type)
1966 BESDEBUG(
"h5",
"Coming to Handle_Single_Augment_CVar()"<<endl);
1967 set<string> tempvardimnamelist;
1968 tempvardimnamelist = cfeos5data->vardimnames;
1969 set<string>::iterator its;
1970 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its) {
1971 for (
auto irv = this->
vars.begin(); irv != this->vars.end();) {
1973 bool is_augmented = Check_Augmented_Var_Candidate(cfeos5data, *irv, eos5type);
1975 if (
true == is_augmented) {
1979 string tempdimname = HDF5CFUtil::obtain_string_after_lastslash(*its);
1982 if (tempdimname == (*irv)->name) {
1985 auto EOS5cvar =
new EOS5CVar(*irv);
1989 EOS5cvar->cfdimname = *its;
1990 EOS5cvar->cvartype = CV_EXIST;
1991 EOS5cvar->eos_type = eos5type;
1994 this->cvars.push_back(EOS5cvar);
1998 irv = this->
vars.erase(irv);
2010 for (
auto irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
2011 its = tempvardimnamelist.find((*irv)->cfdimname);
2012 if (its != tempvardimnamelist.end()) tempvardimnamelist.erase(its);
2015 if (
false == tempvardimnamelist.empty())
2016 throw1(
"Augmented files still need to provide more coordinate variables");
2022void EOS5File::Remove_MultiDim_LatLon_EOS5CFGrid()
2025 BESDEBUG(
"h5",
"Coming to Remove_MultiDim_LatLon_EOS5CFGrid()"<<endl);
2026 for (
auto irg = this->eos5cfgrids.begin(); irg != this->eos5cfgrids.end();) {
2037 bool irg_erase =
false;
2039 if (
true == (*irg)->has_2dlatlon) {
2041 if ((
true == this->isaura) && (OMI == this->aura_name) && (HE5_GCTP_GEO == (*irg)->eos5_projcode))
2045 string EOS5GRIDPATH =
"/HDFEOS/GRIDS/";
2046 string fslash_str =
"/";
2047 string THIS_EOS5GRIDPATH = EOS5GRIDPATH + (*irg)->name + fslash_str;
2048 int catch_latlon = 0;
2050 for (
auto irv = this->
vars.begin(); (irv != this->vars.end()) && (catch_latlon != 2);
2052 if (GRID == Get_Var_EOS5_Type(*irv) && ((*irv)->fullpath.size() > THIS_EOS5GRIDPATH.size())) {
2054 string var_grid_name = Obtain_Var_EOS5Type_GroupName(*irv, GRID);
2055 if (var_grid_name == (*irg)->name) {
2056 if ((
"Longitude" == (*irv)->name) || (
"Latitude" == (*irv)->name)) {
2060 irv = this->
vars.erase(irv);
2074 if (2 == catch_latlon) {
2075 (*irg)->has_nolatlon =
true;
2076 (*irg)->has_2dlatlon =
false;
2082 irg = this->eos5cfgrids.erase(irg);
2087 if (
false == irg_erase) {
2094 for (
auto irg = this->eos5cfgrids.begin(); irg != this->eos5cfgrids.end();) {
2096 if (
true == (*irg)->has_g2dlatlon) {
2098 irg = this->eos5cfgrids.erase(irg);
2107void EOS5File::Handle_Single_Nonaugment_Grid_CVar(
EOS5CFGrid* cfgrid)
2110 BESDEBUG(
"h5",
"Coming to Handle_Single_Nonaugment_Grid_CVar()"<<endl);
2111 set<string> tempvardimnamelist;
2112 tempvardimnamelist = cfgrid->vardimnames;
2115 bool use_own_latlon =
false;
2116 if (
true == cfgrid->has_1dlatlon)
2117 use_own_latlon = Handle_Single_Nonaugment_Grid_CVar_OwnLatLon(cfgrid, tempvardimnamelist);
2119 if(use_own_latlon)
"h5",
"using 1D latlon"<<endl;
2120 else "h5",
"use_own_latlon is false "<<endl;
2123 if (
false == use_own_latlon) {
2124 bool use_eos5_latlon =
false;
2125 use_eos5_latlon = Handle_Single_Nonaugment_Grid_CVar_EOS5LatLon(cfgrid, tempvardimnamelist);
2128 if (
false == use_eos5_latlon)
return;
2132 Handle_NonLatLon_Grid_CVar(cfgrid, tempvardimnamelist);
2137bool EOS5File::Handle_Single_Nonaugment_Grid_CVar_OwnLatLon(
const EOS5CFGrid *cfgrid, set<string>& tempvardimnamelist)
2141 BESDEBUG(
"h5",
"Coming to Handle_Single_Nonaugment_Grid_CVar_OwnLatLon()"<<endl);
2142 set<string>::iterator its;
2143 string EOS5GRIDPATH =
"/HDFEOS/GRIDS/";
2144 string fslash_str =
"/";
2145 string THIS_EOS5GRIDPATH = EOS5GRIDPATH + cfgrid->name + fslash_str;
2148 bool find_latydim =
false;
2149 bool find_lonxdim =
false;
2151 for (
auto irv = this->
vars.begin(); irv != this->vars.end(); ++irv) {
2152 if (GRID == Get_Var_EOS5_Type(*irv) && ((*irv)->fullpath.size() > THIS_EOS5GRIDPATH.size())) {
2154 string var_grid_name = Obtain_Var_EOS5Type_GroupName(*irv, GRID);
2155 if ((var_grid_name == cfgrid->name) && ((*irv)->name ==
"Latitude")) {
2157 string tempdimname = (((*irv)->dims)[0])->name;
2159 if (
"YDim" == HDF5CFUtil::obtain_string_after_lastslash(tempdimname)) {
2161 auto EOS5cvar =
new EOS5CVar(*irv);
2165 EOS5cvar->cfdimname = tempdimname;
2166 EOS5cvar->cvartype = CV_EXIST;
2167 EOS5cvar->eos_type = GRID;
2170 this->cvars.push_back(EOS5cvar);
2174 this->
vars.erase(irv);
2177 find_latydim =
true;
2184 for (
auto irv = this->
vars.begin(); irv != this->vars.end(); ++irv) {
2186 if (GRID == Get_Var_EOS5_Type(*irv) && ((*irv)->fullpath.size() > THIS_EOS5GRIDPATH.size())) {
2188 string var_grid_name = Obtain_Var_EOS5Type_GroupName(*irv, GRID);
2190 if ((var_grid_name == cfgrid->name) && ((*irv)->name ==
"Longitude")) {
2192 string tempdimname = (((*irv)->dims)[0])->name;
2194 if (
"XDim" == HDF5CFUtil::obtain_string_after_lastslash(tempdimname)) {
2196 auto EOS5cvar =
new EOS5CVar(*irv);
2200 EOS5cvar->cfdimname = tempdimname;
2201 EOS5cvar->cvartype = CV_EXIST;
2202 EOS5cvar->eos_type = GRID;
2205 this->cvars.push_back(EOS5cvar);
2209 this->
vars.erase(irv);
2210 find_lonxdim =
true;
2217 for (
auto irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
2218 its = tempvardimnamelist.find((*irv)->cfdimname);
2219 if (its != tempvardimnamelist.end()) tempvardimnamelist.erase(its);
2224 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its)
2225 "h5",
"tempvardim "<<*its <<endl;
2228 return (find_latydim ==
true && find_lonxdim ==
true);
2232bool EOS5File::Handle_Single_Nonaugment_Grid_CVar_EOS5LatLon(
const EOS5CFGrid *cfgrid, set<string>& tempvardimnamelist)
2236 BESDEBUG(
"h5",
"Coming to Handle_Single_Nonaugment_Grid_CVar_EOS5LatLon()"<<endl);
2239 bool find_ydim =
false;
2240 bool find_xdim =
false;
2241 set<string>::iterator its;
2244 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its)
2245 cerr<<
"dim names "<<(*its) <<endl;
2248 string ydim_full_path;
2249 string xdim_full_path;
2251 if (cfgrid->eos5_projcode != HE5_GCTP_GEO) {
2253 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its) {
2254 if (
"YDim" == HDF5CFUtil::obtain_string_after_lastslash(*its))
2255 ydim_full_path = *its;
2256 else if (
"XDim" == HDF5CFUtil::obtain_string_after_lastslash(*its)) xdim_full_path = *its;
2261 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end();) {
2262 if (
"YDim" == HDF5CFUtil::obtain_string_after_lastslash(*its)) {
2266 EOS5cvar->name =
"lat";
2267 Create_Added_Var_NewName_FullPath(GRID, cfgrid->name, EOS5cvar->name, EOS5cvar->newname,
2268 EOS5cvar->fullpath);
2270 if (cfgrid->eos5_projcode != HE5_GCTP_GEO) {
2272 EOS5cvar->dtype = H5FLOAT64;
2276 EOS5cvar->dtype = H5FLOAT32;
2279 auto eos5cvar_dim =
new Dimension((hsize_t) cfgrid->ydimsize);
2280 eos5cvar_dim->name = *its;
2281 eos5cvar_dim->newname = (this->eos5cfgrids.size() == 1) ?
"YDim" : *its;
2282 EOS5cvar->dims.push_back(eos5cvar_dim);
2283 EOS5cvar->cfdimname = eos5cvar_dim->name;
2285 if (EOS5cvar->rank == 2) {
2287 eos5cvar_dim =
new Dimension((hsize_t) cfgrid->xdimsize);
2288 eos5cvar_dim->name = xdim_full_path;
2289 eos5cvar_dim->newname = (this->eos5cfgrids.size() == 1) ?
"XDim" : xdim_full_path;
2290 EOS5cvar->dims.push_back(eos5cvar_dim);
2293 EOS5cvar->cvartype = CV_LAT_MISS;
2294 EOS5cvar->eos_type = GRID;
2295 EOS5cvar->xdimsize = cfgrid->xdimsize;
2296 EOS5cvar->ydimsize = cfgrid->ydimsize;
2299 EOS5cvar->point_lower = cfgrid->point_lower;
2300 EOS5cvar->point_upper = cfgrid->point_upper;
2301 EOS5cvar->point_left = cfgrid->point_left;
2302 EOS5cvar->point_right = cfgrid->point_right;
2303 EOS5cvar->eos5_pixelreg = cfgrid->eos5_pixelreg;
2304 EOS5cvar->eos5_origin = cfgrid->eos5_origin;
2305 EOS5cvar->eos5_projcode = cfgrid->eos5_projcode;
2307 for (
unsigned int k = 0; k < 13; k++)
2308 EOS5cvar->param[k] = cfgrid->param[k];
2310 EOS5cvar->zone = cfgrid->zone;
2311 EOS5cvar->sphere = cfgrid->sphere;
2314 this->cvars.push_back(EOS5cvar);
2318 tempvardimnamelist.erase(its++);
2322 else if (
"XDim" == HDF5CFUtil::obtain_string_after_lastslash(*its)) {
2326 EOS5cvar->name =
"lon";
2327 Create_Added_Var_NewName_FullPath(GRID, cfgrid->name, EOS5cvar->name, EOS5cvar->newname,
2328 EOS5cvar->fullpath);
2333 if (cfgrid->eos5_projcode != HE5_GCTP_GEO) {
2335 EOS5cvar->dtype = H5FLOAT64;
2339 EOS5cvar->dtype = H5FLOAT32;
2343 if (EOS5cvar->rank == 2) {
2344 eos5cvar_dim =
new Dimension((hsize_t) cfgrid->ydimsize);
2348 eos5cvar_dim->name = ydim_full_path;
2349 eos5cvar_dim->newname = (this->eos5cfgrids.size() == 1) ?
"YDim" : ydim_full_path;
2350 EOS5cvar->dims.push_back(eos5cvar_dim);
2353 eos5cvar_dim =
new Dimension((hsize_t) cfgrid->xdimsize);
2357 eos5cvar_dim->name = *its;
2358 eos5cvar_dim->newname = (this->eos5cfgrids.size() == 1) ?
"XDim" : *its;
2359 EOS5cvar->dims.push_back(eos5cvar_dim);
2360 EOS5cvar->cfdimname = eos5cvar_dim->name;
2362 EOS5cvar->cvartype = CV_LON_MISS;
2363 EOS5cvar->eos_type = GRID;
2364 EOS5cvar->xdimsize = cfgrid->xdimsize;
2365 EOS5cvar->ydimsize = cfgrid->ydimsize;
2368 EOS5cvar->point_lower = cfgrid->point_lower;
2369 EOS5cvar->point_upper = cfgrid->point_upper;
2370 EOS5cvar->point_left = cfgrid->point_left;
2371 EOS5cvar->point_right = cfgrid->point_right;
2372 EOS5cvar->eos5_pixelreg = cfgrid->eos5_pixelreg;
2373 EOS5cvar->eos5_origin = cfgrid->eos5_origin;
2374 EOS5cvar->eos5_projcode = cfgrid->eos5_projcode;
2375 for (
unsigned int k = 0; k < 13; k++)
2376 EOS5cvar->param[k] = cfgrid->param[k];
2377 EOS5cvar->zone = cfgrid->zone;
2378 EOS5cvar->sphere = cfgrid->sphere;
2381 this->cvars.push_back(EOS5cvar);
2384 tempvardimnamelist.erase(its++);
2390 if (
true == find_xdim &&
true == find_ydim)
break;
2393 return (
true == find_xdim &&
true == find_ydim);
2397void EOS5File::Handle_NonLatLon_Grid_CVar(
EOS5CFGrid *cfgrid, set<string>& tempvardimnamelist)
2401 set<string>::iterator its;
2402 auto num_dimnames = (
int)(tempvardimnamelist.size());
2403 bool has_dimnames =
true;
2405 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its) {
2406 if (cfgrid->dnames_to_1dvnames.find(*its) != cfgrid->dnames_to_1dvnames.end()) {
2407 for (
auto irv = this->
vars.begin(); has_dimnames && (irv != this->
vars.end());) {
2411 if (GRID == Get_Var_EOS5_Type(*irv) && (*irv)->newname == (cfgrid->dnames_to_1dvnames)[*its]) {
2414 auto EOS5cvar =
new EOS5CVar(*irv);
2418 EOS5cvar->cfdimname = *its;
2419 EOS5cvar->cvartype = CV_EXIST;
2420 EOS5cvar->eos_type = GRID;
2423 this->cvars.push_back(EOS5cvar);
2427 irv = this->
vars.erase(irv);
2429 if (0 == num_dimnames) has_dimnames =
false;
2439 for (
auto irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
2440 its = tempvardimnamelist.find((*irv)->cfdimname);
2441 if (its != tempvardimnamelist.end()) tempvardimnamelist.erase(its);
2445 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its) {
2448 Create_Missing_CV(cfgrid, EOS5cvar, *its, GRID, this->eos5cfgrids.size());
2449 this->cvars.push_back(EOS5cvar);
2455void EOS5File::Handle_Multi_Nonaugment_Grid_CVar()
2458 BESDEBUG(
"h5",
"Coming to Handle_Multi_nonaugment_Grid_CVar()"<<endl);
2462 if (
true == this->grids_multi_latloncvs) {
2463 for (
auto irv = this->eos5cfgrids.begin(); irv != this->eos5cfgrids.end(); ++irv)
2464 Handle_Single_Nonaugment_Grid_CVar(*irv);
2475 int num_1dlatlon_pairs = 0;
2476 for (
auto irv = this->eos5cfgrids.begin(); irv != this->eos5cfgrids.end(); ++irv)
2477 if (
true == (*irv)->has_1dlatlon) num_1dlatlon_pairs++;
2479 bool use_eos5_latlon =
false;
2480 if ((0 == num_1dlatlon_pairs)
2481 || ((num_1dlatlon_pairs == (
int) (this->eos5cfgrids.size())) && (
true == this->isaura))) {
2482 set<string> tempvardimnamelist = ((this->eos5cfgrids)[0])->vardimnames;
2483 if (0 == num_1dlatlon_pairs) {
2484 use_eos5_latlon = Handle_Single_Nonaugment_Grid_CVar_EOS5LatLon((this->eos5cfgrids)[0],
2485 tempvardimnamelist);
2487 if (
false == use_eos5_latlon)
return;
2492 bool use_own_latlon =
false;
2493 use_own_latlon = Handle_Single_Nonaugment_Grid_CVar_OwnLatLon((this->eos5cfgrids)[0],
2494 tempvardimnamelist);
2495 if (
false == use_own_latlon) {
2496 use_eos5_latlon = Handle_Single_Nonaugment_Grid_CVar_EOS5LatLon((this->eos5cfgrids)[0],
2497 tempvardimnamelist);
2498 if (
false == use_eos5_latlon)
return;
2503 Handle_NonLatLon_Grid_CVar((this->eos5cfgrids)[0], tempvardimnamelist);
2506 for (
unsigned j = 1; j < this->eos5cfgrids.size(); j++)
2507 (this->eos5cfgrids)[j]->Update_Dimnamelist();
2510 Adjust_EOS5GridDimNames((this->eos5cfgrids)[0]);
2513 for (
unsigned j = 1; j < this->eos5cfgrids.size(); j++) {
2514 tempvardimnamelist = (this->eos5cfgrids)[j]->vardimnames;
2515 Handle_NonLatLon_Grid_CVar((this->eos5cfgrids)[j], tempvardimnamelist);
2516 tempvardimnamelist.clear();
2522 this->grids_multi_latloncvs =
true;
2523 for (
auto irv = this->eos5cfgrids.begin(); irv != this->eos5cfgrids.end(); ++irv)
2524 Handle_Single_Nonaugment_Grid_CVar(*irv);
2532void EOS5File::Adjust_EOS5GridDimNames(
EOS5CFGrid *cfgrid)
2535 BESDEBUG(
"h5",
"Coming to Adjust_EOS5GridDimNames()"<<endl);
2538 bool find_xdim =
false;
2539 bool find_ydim =
false;
2541 for (
auto it = cfgrid->vardimnames.begin(); it != cfgrid->vardimnames.end(); ++it) {
2542 string xydimname_candidate = HDF5CFUtil::obtain_string_after_lastslash(*it);
2543 if (
"XDim" == xydimname_candidate) {
2547 else if (
"YDim" == xydimname_candidate) {
2551 if (find_xdim && find_ydim)
break;
2554 if (
false == find_xdim ||
false == find_ydim)
2555 throw2(
"Cannot find Dimension name that includes XDim or YDim in the grid ", cfgrid->name);
2557 for (
auto irv = this->
vars.begin(); irv != this->vars.end(); ++irv) {
2558 if (GRID == Get_Var_EOS5_Type(*irv)) {
2559 for (
auto id = (*irv)->dims.begin();
id != (*irv)->dims.end(); ++
id) {
2560 string xydimname_candidate = HDF5CFUtil::obtain_string_after_lastslash((*id)->name);
2561 if (
"XDim" == xydimname_candidate)
2562 (*id)->name = xdimname;
2563 else if (
"YDim" == xydimname_candidate) (*id)->name = ydimname;
2570void EOS5File::Handle_Swath_CVar(
bool isaugmented)
2573 BESDEBUG(
"h5",
"Coming to Handle_Swath_CVar()"<<endl);
2577 for (
auto irs = this->eos5cfswaths.begin(); irs != this->eos5cfswaths.end();) {
2578 if ((*irs)->has_1dlatlon) {
2579 Handle_Single_1DLatLon_Swath_CVar(*irs, isaugmented);
2582 else if ((*irs)->has_2dlatlon) {
2583 Handle_Single_2DLatLon_Swath_CVar(*irs, isaugmented);
2593 irs = this->eos5cfswaths.erase(irs);
2599void EOS5File::Handle_Single_1DLatLon_Swath_CVar(
EOS5CFSwath *cfswath,
bool is_augmented)
2602 BESDEBUG(
"h5",
"Coming to Handle_Single_1DLatLon_Swath_CVar"<<endl);
2604 set<string> tempvardimnamelist = cfswath->vardimnames;
2605 string EOS5SWATHPATH =
"/HDFEOS/SWATHS/";
2606 string fslash_str =
"/";
2607 string THIS_EOS5SWATHPATH = EOS5SWATHPATH + cfswath->name + fslash_str;
2609 for (
auto its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its)
2610 cerr<<
"Dimension name befor latitude " << *its << endl;
2615 for (
auto irv = this->
vars.begin(); irv != this->vars.end(); ++irv) {
2616 if (SWATH == Get_Var_EOS5_Type(*irv) && ((*irv)->fullpath.size() > THIS_EOS5SWATHPATH.size())) {
2618 string var_swath_name = Obtain_Var_EOS5Type_GroupName(*irv, SWATH);
2619 if ((var_swath_name == cfswath->name) && ((*irv)->name ==
"Latitude")) {
2622 auto EOS5cvar =
new EOS5CVar(*irv);
2626 EOS5cvar->cfdimname = ((*irv)->dims)[0]->name;
2627 EOS5cvar->cvartype = CV_EXIST;
2628 EOS5cvar->eos_type = SWATH;
2631 this->cvars.push_back(EOS5cvar);
2635 this->
vars.erase(irv);
2643 bool find_lat_dim =
false;
2644 for (
auto its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its) {
2646 for (
auto irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
2647 if (((*irv)->name ==
"Latitude") && (*irv)->cfdimname == (*its)) {
2648 tempvardimnamelist.erase(its);
2649 find_lat_dim =
true;
2654 if (
true == find_lat_dim)
break;
2658 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its)
2659 cerr<<
"Dimension name afte latitude " << *its << endl;
2662 Handle_NonLatLon_Swath_CVar(cfswath, tempvardimnamelist);
2665 if (
true == is_augmented) {
2666 for (
auto irv = this->
vars.begin(); irv != this->vars.end();) {
2668 if (SWATH == Get_Var_EOS5_Type(*irv)) {
2670 string my_swath_short_path = (*irv)->fullpath.substr(EOS5SWATHPATH.size());
2671 size_t first_fslash_pos = my_swath_short_path.find_first_of(
"/");
2672 string my_swath_name = my_swath_short_path.substr(0,first_fslash_pos);
2675 string my_swath_name = Obtain_Var_EOS5Type_GroupName(*irv, SWATH);
2677 if (my_swath_name == cfswath->name) {
2678 string var_path_after_swathname = (*irv)->fullpath.substr(THIS_EOS5SWATHPATH.size());
2679 if (var_path_after_swathname == (*irv)->name) {
2681 irv = this->
vars.erase(irv);
2699void EOS5File::Handle_Single_2DLatLon_Swath_CVar(
EOS5CFSwath *cfswath,
bool is_augmented)
2702 BESDEBUG(
"h5",
"Coming to Handle_Single_2DLatLon_Swath_CVar()"<<endl);
2704 set<string>::iterator its;
2705 set<string> tempvardimnamelist = cfswath->vardimnames;
2706 string EOS5SWATHPATH =
"/HDFEOS/SWATHS/";
2707 string fslash_str =
"/";
2708 string THIS_EOS5SWATHPATH = EOS5SWATHPATH + cfswath->name + fslash_str;
2709 bool find_lat =
false;
2710 bool find_lon =
false;
2713 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its)
2714 cerr<<
"Dimension name befor latitude " << *its << endl;
2718 for (
auto irv = this->
vars.begin(); irv != this->vars.end();) {
2719 if (SWATH == Get_Var_EOS5_Type(*irv) && ((*irv)->fullpath.size() > THIS_EOS5SWATHPATH.size())) {
2720 string var_swath_name = Obtain_Var_EOS5Type_GroupName(*irv, SWATH);
2721 if ((var_swath_name == cfswath->name) && ((*irv)->name ==
"Latitude")) {
2724 auto EOS5cvar =
new EOS5CVar(*irv);
2728 EOS5cvar->cfdimname = ((*irv)->dims)[0]->name;
2729 EOS5cvar->cvartype = CV_EXIST;
2730 EOS5cvar->eos_type = SWATH;
2731 EOS5cvar->is_2dlatlon =
true;
2734 this->cvars.push_back(EOS5cvar);
2738 irv = this->
vars.erase(irv);
2741 else if ((var_swath_name == cfswath->name) && ((*irv)->name ==
"Longitude")) {
2744 auto EOS5cvar =
new EOS5CVar(*irv);
2748 EOS5cvar->cfdimname = ((*irv)->dims)[1]->name;
2749 EOS5cvar->cvartype = CV_EXIST;
2750 EOS5cvar->eos_type = SWATH;
2751 EOS5cvar->is_2dlatlon =
true;
2754 this->cvars.push_back(EOS5cvar);
2758 irv = this->
vars.erase(irv);
2770 if (
true == find_lat &&
true == find_lon)
break;
2775 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its) {
2776 for (
auto irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
2777 if (((*irv)->name ==
"Latitude") && (*irv)->cfdimname == (*its)) {
2778 tempvardimnamelist.erase(its);
2784 if (
true == find_lat)
break;
2789 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its) {
2791 for (
auto irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
2793 if (((*irv)->name ==
"Longitude") && (*irv)->cfdimname == (*its)) {
2794 tempvardimnamelist.erase(its);
2800 if (
true == find_lon)
break;
2804 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its)
2805 cerr<<
"Dimension name afte latitude " << *its << endl;
2808 Handle_NonLatLon_Swath_CVar(cfswath, tempvardimnamelist);
2815 if (
true == is_augmented) {
2816 for (
auto irv = this->
vars.begin(); irv != this->vars.end();) {
2818 if (SWATH == Get_Var_EOS5_Type(*irv)) {
2820 string my_swath_name = Obtain_Var_EOS5Type_GroupName(*irv, SWATH);
2821 if (my_swath_name == cfswath->name) {
2822 string var_path_after_swathname = (*irv)->fullpath.substr(THIS_EOS5SWATHPATH.size());
2823 if (var_path_after_swathname == (*irv)->name) {
2825 irv = this->
vars.erase(irv);
2843void EOS5File::Handle_NonLatLon_Swath_CVar(
EOS5CFSwath *cfswath, set<string>& tempvardimnamelist)
2846 BESDEBUG(
"h5",
"Coming to Handle_NonLatLon_Swath_CVar()"<<endl);
2848 set<string>::iterator its;
2849 auto num_dimnames = (
int)(tempvardimnamelist.size());
2850 bool has_dimnames =
true;
2851 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its) {
2852 if (cfswath->dnames_to_geo1dvnames.find(*its) != cfswath->dnames_to_geo1dvnames.end()) {
2853 for (
auto irv = this->
vars.begin(); has_dimnames && (irv != this->
vars.end());) {
2858 if (SWATH == Get_Var_EOS5_Type(*irv) && (*irv)->newname == (cfswath->dnames_to_geo1dvnames)[*its]) {
2861 auto EOS5cvar =
new EOS5CVar(*irv);
2865 EOS5cvar->cfdimname = *its;
2866 EOS5cvar->cvartype = CV_EXIST;
2867 EOS5cvar->eos_type = SWATH;
2870 this->cvars.push_back(EOS5cvar);
2874 irv = this->
vars.erase(irv);
2876 if (0 == num_dimnames) has_dimnames =
false;
2886 for (
auto irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
2887 its = tempvardimnamelist.find((*irv)->cfdimname);
2888 if (its != tempvardimnamelist.end()) tempvardimnamelist.erase(its);
2893 Handle_Special_NonLatLon_Swath_CVar(cfswath, tempvardimnamelist);
2896 for (
auto irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
2897 its = tempvardimnamelist.find((*irv)->cfdimname);
2898 if (its != tempvardimnamelist.end()) tempvardimnamelist.erase(its);
2902 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its) {
2905 Create_Missing_CV(cfswath, EOS5cvar, *its, SWATH, this->eos5cfswaths.size());
2906 this->cvars.push_back(EOS5cvar);
2912void EOS5File::Handle_Special_NonLatLon_Swath_CVar(
EOS5CFSwath *cfswath, set<string>& tempvardimnamelist)
2916 BESDEBUG(
"h5",
"Handle_Special_NonLatLon_Swath_CVar()"<<endl);
2923 if (
true == this->isaura && TES == this->aura_name) {
2925 string eos5_swath_group_name =
"/HDFEOS/SWATHS/" + cfswath->name;
2926 string eos5_vc_attr_name =
"VerticalCoordinate";
2927 string eos5_pre_attr_name =
"Pressure";
2928 bool has_vc_attr =
false;
2929 Group *vc_group =
nullptr;
2932 for (
auto irg = this->
groups.begin(); irg != this->groups.end(); ++irg) {
2933 if (eos5_swath_group_name == (*irg)->path) {
2934 for (
auto ira = (*irg)->attrs.begin(); ira != (*irg)->attrs.end(); ++ira) {
2935 if (eos5_vc_attr_name == (*ira)->name) {
2936 Retrieve_H5_Attr_Value(*ira, (*irg)->path);
2937 string attr_value((*ira)->value.begin(), (*ira)->value.end());
2938 if (eos5_pre_attr_name == attr_value) {
2945 if (
true == has_vc_attr)
break;
2963 if (
true == has_vc_attr) {
2964 string dimname_candidate =
"/SWATHS/" + cfswath->name +
"/nLevels";
2965 for (
auto it = tempvardimnamelist.begin(); it != tempvardimnamelist.end(); ++it) {
2966 if ((*it).find(dimname_candidate) != string::npos) {
2967 hsize_t dimsize_candidate = 0;
2968 if ((cfswath->dimnames_to_dimsizes).find(*it) != (cfswath->dimnames_to_dimsizes).end())
2969 dimsize_candidate = cfswath->dimnames_to_dimsizes[*it];
2971 throw2(
"Cannot find the dimension size of the dimension name ", *it);
2978 for (
auto ira = vc_group->attrs.begin(); ira != vc_group->attrs.end();
2980 if ((eos5_pre_attr_name == (*ira)->name) && ((*ira)->count == (dimsize_candidate - 1))) {
2985 string reduced_dimname = HDF5CFUtil::obtain_string_after_lastslash(*it);
2986 string orig_dimname =
"nLevels";
2987 if (
"nLevels" == reduced_dimname)
2988 EOS5cvar->name = eos5_pre_attr_name +
"_CV";
2991 EOS5cvar->name = eos5_pre_attr_name +
"_CV"
2992 + reduced_dimname.substr(orig_dimname.size());
2993 Create_Added_Var_NewName_FullPath(SWATH, cfswath->name, EOS5cvar->name, EOS5cvar->newname,
2994 EOS5cvar->fullpath);
2996 EOS5cvar->dtype = (*ira)->dtype;
2997 auto eos5cvar_dim =
new Dimension(dimsize_candidate);
2998 eos5cvar_dim->name = *it;
2999 if (1 == this->eos5cfswaths.size())
3000 eos5cvar_dim->newname = reduced_dimname;
3002 eos5cvar_dim->newname = eos5cvar_dim->name;
3004 EOS5cvar->dims.push_back(eos5cvar_dim);
3005 EOS5cvar->cvartype = CV_SPECIAL;
3006 EOS5cvar->cfdimname = eos5cvar_dim->name;
3007 EOS5cvar->eos_type = SWATH;
3010 this->cvars.push_back(EOS5cvar);
3020void EOS5File::Handle_Za_CVar(
bool isaugmented)
3023 BESDEBUG(
"h5",
"Coming to Handle_Za_CVar()"<<endl);
3025 if (
false == isaugmented)
return;
3027 for (
auto irv = this->eos5cfzas.begin(); irv != this->eos5cfzas.end(); ++irv)
3028 Handle_Single_Augment_CVar(*irv, ZA);
3036 BESDEBUG(
"h5",
"Coming to Adjust_Var_Dim_NewName_Before_Flattening()"<<endl);
3037 auto num_grids = (
int)(this->eos5cfgrids.size());
3038 auto num_swaths = (
int)(this->eos5cfswaths.size());
3039 auto num_zas = (
int)(this->eos5cfzas.size());
3041 bool mixed_eos5typefile =
false;
3044 if (((num_grids > 0) && (num_swaths > 0)) || ((num_grids > 0) && (num_zas > 0))
3045 || ((num_swaths > 0) && (num_zas > 0))) mixed_eos5typefile =
true;
3048 for (
auto irv = this->
vars.begin(); irv != this->
vars.end(); ++irv)
3049 Adjust_Per_Var_Dim_NewName_Before_Flattening(*irv, mixed_eos5typefile, num_grids, num_swaths, num_zas);
3051 for (
auto irv = this->cvars.begin(); irv != this->cvars.end(); ++irv)
3052 Adjust_Per_Var_Dim_NewName_Before_Flattening(*irv, mixed_eos5typefile, num_grids, num_swaths, num_zas);
3054 for (
auto irv = this->cvars.begin();
3055 irv != this->cvars.end(); ++irv) {
3056 cerr<<
"eos5svar var new name "<<(*irv)->newname <<endl;
3057 for (
auto ird = (*irv)->dims.begin();
3058 ird !=(*irv)->dims.end(); ++ird) {
3059 cerr<<
"eos5svar dimension new name "<<(*ird)->newname <<endl;
3064 Adjust_SharedLatLon_Grid_Var_Dim_Name();
3070void EOS5File::Adjust_Per_Var_Dim_NewName_Before_Flattening(T* var,
bool mixed_eos5type,
int num_grids,
int num_swaths,
3074 BESDEBUG(
"h5",
"Coming to Adjust_Per_Var_Dim_NewName_Before_Flattening()"<<endl);
3077 EOS5Type vartype = Get_Var_EOS5_Type(var);
3081 eos5typestr =
"/GRIDS/";
3082 if (
false == mixed_eos5type) {
3084 var->newname = ((1 == this->orig_num_grids) ? var->name : var->newname.substr(eos5typestr.size()));
3086 var->newname = ((1 == num_grids) ? var->name : var->newname.substr(eos5typestr.size()));
3101 if (num_grids > 1) {
3102 for (
auto ird = var->dims.begin(); ird != var->dims.end(); ird++) {
3103 if ((*ird)->newname.size() <= eos5typestr.size())
3104 throw5(
"The size of the dimension new name ", (*ird)->newname,
"of variable ", var->newname,
3106 (*ird)->newname = (*ird)->newname.substr(eos5typestr.size());
3112 var->newname = ((1 == num_grids) ? (eos5typestr + var->name) : var->newname);
3118 eos5typestr =
"/SWATHS/";
3119 if (
false == mixed_eos5type) {
3120 var->newname = ((1 == num_swaths) ? var->name : var->newname.substr(eos5typestr.size()));
3121 if (num_swaths > 1) {
3122 for (
auto ird = var->dims.begin(); ird != var->dims.end(); ird++) {
3123 if ((*ird)->newname.size() <= eos5typestr.size())
3124 throw5(
"The size of the dimension new name ", (*ird)->newname,
"of variable ", var->newname,
3126 (*ird)->newname = (*ird)->newname.substr(eos5typestr.size());
3131 var->newname = ((1 == num_swaths) ? (eos5typestr + var->name) : var->newname);
3137 eos5typestr =
"/ZAS/";
3138 if (
false == mixed_eos5type) {
3139 var->newname = ((1 == num_zas) ? var->name : var->newname.substr(eos5typestr.size()));
3141 for (
auto ird = var->dims.begin(); ird != var->dims.end(); ird++) {
3142 if ((*ird)->newname.size() <= eos5typestr.size())
3143 throw5(
"The size of the dimension new name ", (*ird)->newname,
"of variable ", var->newname,
3145 (*ird)->newname = (*ird)->newname.substr(eos5typestr.size());
3150 var->newname = ((1 == num_zas) ? (eos5typestr + var->name) : var->newname);
3157 throw1(
"Non-supported EOS type");
3163void EOS5File::Adjust_SharedLatLon_Grid_Var_Dim_Name()
3166 BESDEBUG(
"h5",
"Adjust_SharedLatLon_Grid_Var_Dim_Name()"<<endl);
3171 if ((this->eos5cfgrids.size() > 1) && (0 == this->eos5cfswaths.size()) && (0 == this->eos5cfzas.size())
3172 && (
false == this->grids_multi_latloncvs)) {
3176 string lat_dimnewname;
3178 string lon_dimnewname;
3179 for (
auto irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
3180 if (
"lat" == (*irv)->name ||
"Latitude" == (*irv)->name) {
3181 (*irv)->newname = (*irv)->name;
3182 lat_dimnewname = (((*irv)->dims)[0])->newname;
3183 lat_dimnewname = HDF5CFUtil::obtain_string_after_lastslash(lat_dimnewname);
3184 if (
"" == lat_dimnewname)
3185 throw2(
"/ is not included in the dimension new name ", (((*irv)->dims)[0])->newname);
3186 (((*irv)->dims)[0])->newname = lat_dimnewname;
3187 lat_dimname = (*irv)->cfdimname;
3189 else if (
"lon" == (*irv)->name ||
"Longitude" == (*irv)->name) {
3190 (*irv)->newname = (*irv)->name;
3191 lon_dimnewname = (((*irv)->dims)[0])->newname;
3192 lon_dimnewname = HDF5CFUtil::obtain_string_after_lastslash(lon_dimnewname);
3193 if (
"" == lon_dimnewname)
3194 throw2(
"/ is not included in the dimension new name ", (((*irv)->dims)[0])->newname);
3195 (((*irv)->dims)[0])->newname = lon_dimnewname;
3196 lon_dimname = (*irv)->cfdimname;
3200 for (
auto irv = this->
vars.begin(); irv != this->
vars.end(); ++irv) {
3201 for (
auto ird = (*irv)->dims.begin(); ird != (*irv)->dims.end(); ++ird) {
3202 if ((*ird)->name == lat_dimname)
3203 (*ird)->newname = lat_dimnewname;
3204 else if ((*ird)->name == lon_dimname) (*ird)->newname = lon_dimnewname;
3214 BESDEBUG(
"h5",
"Coming to Flatten_Obj_Name()"<<endl);
3217 for (
auto irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
3218 (*irv)->newname = get_CF_string((*irv)->newname);
3220 for (
auto ird = (*irv)->dims.begin(); ird != (*irv)->dims.end(); ++ird) {
3221 (*ird)->newname = get_CF_string((*ird)->newname);
3224 if (
true == include_attr) {
3225 for (
auto ira = (*irv)->attrs.begin(); ira != (*irv)->attrs.end(); ++ira) {
3226 (*ira)->newname = File::get_CF_string((*ira)->newname);
3236 BESDEBUG(
"h5",
"Coming to Handle_Obj_NameClashing()"<<endl);
3240 set<string> objnameset;
3241 Handle_EOS5CVar_NameClashing(objnameset);
3242 File::Handle_GeneralObj_NameClashing(include_attr, objnameset);
3243 if (
true == include_attr) {
3244 Handle_EOS5CVar_AttrNameClashing();
3253void EOS5File::Handle_EOS5CVar_NameClashing(set<string> &objnameset)
3256 BESDEBUG(
"h5",
"Coming to Handle_EOS5CVar_NameClashing()"<<endl);
3257 EOS5Handle_General_NameClashing(objnameset, this->cvars);
3261void EOS5File::Handle_EOS5CVar_AttrNameClashing()
3264 BESDEBUG(
"h5",
"Coming to Handle_EOS5CVar_AttrNameClashing()"<<endl);
3265 set<string> objnameset;
3267 for (
auto irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
3268 Handle_General_NameClashing(objnameset, (*irv)->attrs);
3274template<
class T>
void EOS5File::EOS5Handle_General_NameClashing(set<string>&objnameset, vector<T*>& objvec)
3278 BESDEBUG(
"h5",
"Coming to EOS5Handle_General_NameClashing()"<<endl);
3279 pair<set<string>::iterator,
bool> setret;
3280 set<string>::iterator iss;
3282 vector<string> clashnamelist;
3284 map<int, int> cl_to_ol;
3289 typename vector<T*>::iterator irv;
3292 for (
auto irv = objvec.begin(); irv != objvec.end(); ++irv) {
3294 setret = objnameset.insert((*irv)->newname);
3295 if (!setret.second) {
3296 clashnamelist.insert(clashnamelist.end(), (*irv)->newname);
3297 cl_to_ol[cl_index] = ol_index;
3305 for (
auto ivs = clashnamelist.begin(); ivs != clashnamelist.end(); ++ivs) {
3306 int clash_index = 1;
3307 string temp_clashname = *ivs +
'_';
3308 HDF5CFUtil::gen_unique_name(temp_clashname, objnameset, clash_index);
3309 *ivs = temp_clashname;
3313 for (
unsigned int i = 0; i < clashnamelist.size(); i++)
3314 objvec[cl_to_ol[i]]->newname = clashnamelist[i];
3322 BESDEBUG(
"h5",
"Coming to Handle_DimNameClashing()"<<endl);
3323 map<string, string> dimname_to_dimnewname;
3324 pair<map<string, string>::iterator,
bool> mapret;
3325 set<string> dimnameset;
3326 vector<Dimension*> vdims;
3327 set<string> dimnewnameset;
3328 pair<set<string>::iterator,
bool> setret;
3331 for (
auto irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
3332 for (
auto ird = (*irv)->dims.begin(); ird != (*irv)->dims.end(); ++ird) {
3336 setret = dimnameset.insert((*ird)->name);
3337 if (setret.second) vdims.push_back(*ird);
3345 for (
auto irv = this->
vars.begin(); irv != this->vars.end(); ++irv) {
3346 for (
auto ird = (*irv)->dims.begin(); ird != (*irv)->dims.end(); ++ird) {
3350 setret = dimnameset.insert((*ird)->name);
3351 if (setret.second) vdims.push_back(*ird);
3356 for (
auto ird=vdims.begin();ird!=vdims.end();++ird)
3357 cerr<<
"dimension name "<<(*ird)->name <<endl;
3362 EOS5Handle_General_NameClashing(dimnewnameset, vdims);
3365 for (
auto ird = vdims.begin(); ird != vdims.end(); ++ird) {
3366 mapret = dimname_to_dimnewname.insert(pair<string, string>((*ird)->name, (*ird)->newname));
3367 if (
false == mapret.second)
3368 throw4(
"The dimension name ", (*ird)->name,
" should map to ", (*ird)->newname);
3372 for (
auto irv = this->cvars.begin(); irv != this->cvars.end(); ++irv)
3373 for (
auto ird = (*irv)->dims.begin(); ird != (*irv)->dims.end(); ++ird)
3374 (*ird)->newname = dimname_to_dimnewname[(*ird)->name];
3376 for (
auto irv = this->
vars.begin(); irv != this->vars.end(); ++irv)
3377 for (
auto ird = (*irv)->dims.begin(); ird != (*irv)->dims.end(); ++ird)
3378 (*ird)->newname = dimname_to_dimnewname[(*ird)->name];
3387 BESDEBUG(
"h5",
"Coming to Set_COARDS_Status()"<<endl);
3389 for (
auto irg = this->eos5cfgrids.begin(); irg != this->eos5cfgrids.end(); ++irg) {
3390 if (
false == (*irg)->has_1dlatlon) {
3391 if (
false == (*irg)->has_nolatlon || (HE5_GCTP_GEO != (*irg)->eos5_projcode)) iscoard =
false;
3396 if (
true == iscoard) {
3397 for (
auto irg = this->eos5cfswaths.begin(); irg != this->eos5cfswaths.end(); ++irg) {
3398 if (
false == (*irg)->has_1dlatlon) {
3410 BESDEBUG(
"h5",
"Coming to Adjust_Attr_Info()"<<endl);
3411 if (
true == this->isaura) {
3412 Adjust_Aura_Attr_Name();
3413 Adjust_Aura_Attr_Value();
3416 Handle_EOS5CVar_Unit_Attr();
3417 Add_EOS5_Grid_CF_Attr();
3422void EOS5File::Adjust_Aura_Attr_Name()
3425 BESDEBUG(
"h5",
"Coming to Adjust_Attr_Name() for Aura"<<endl);
3426 for (
auto irv = this->
vars.begin(); irv != this->vars.end(); ++irv) {
3427 for (
auto ira = (*irv)->attrs.begin(); ira != (*irv)->attrs.end(); ++ira) {
3428 if (eos5_to_cf_attr_map.find((*ira)->name) != eos5_to_cf_attr_map.end()) (*ira)->newname =
3429 eos5_to_cf_attr_map[(*ira)->name];
3434 for (
auto irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
3435 for (
auto ira = (*irv)->attrs.begin(); ira != (*irv)->attrs.end(); ++ira) {
3436 if (eos5_to_cf_attr_map.find((*ira)->name) != eos5_to_cf_attr_map.end()) (*ira)->newname =
3437 eos5_to_cf_attr_map[(*ira)->name];
3443void EOS5File::Adjust_Aura_Attr_Value()
3446 BESDEBUG(
"h5",
"Coming to Adjust_Attr_Value() for Aura"<<endl);
3448 Handle_EOS5CVar_Unit_Attr();
3449 Handle_Aura_Special_Attr();
3454 string time_cf_units_value =
"seconds since 1993-01-01";
3455 for (
auto irv = this->
vars.begin(); irv != this->vars.end(); irv++) {
3456 if (((*irv)->name ==
"Time") || ((*irv)->name ==
"nTimes")) {
3457 for (
auto ira = (*irv)->attrs.begin(); ira != (*irv)->attrs.end(); ira++) {
3458 if (
"units" == (*ira)->name) {
3459 Retrieve_H5_Attr_Value(*ira, (*irv)->fullpath);
3460 string units_value((*ira)->value.begin(), (*ira)->value.end());
3461 if (time_cf_units_value != units_value) {
3463 units_value = time_cf_units_value;
3464 (*ira)->value.resize(units_value.size());
3465 if (H5FSTRING == (*ira)->dtype) (*ira)->fstrsize = units_value.size();
3467 (*ira)->strsize.resize(1);
3468 (*ira)->strsize[0] = units_value.size();
3470 copy(units_value.begin(), units_value.end(), (*ira)->value.begin());
3480void EOS5File::Handle_Aura_Special_Attr()
3483 BESDEBUG(
"h5",
"Coming to Handle_Aura_Special_Attr()"<<endl);
3485 if (
true == this->isaura && MLS == this->aura_name) {
3487 const string File_attr_group_path =
"/HDFEOS/ADDITIONAL/FILE_ATTRIBUTES";
3488 const string PCF1_attr_name =
"PCF1";
3489 bool find_group =
false;
3490 bool find_attr =
false;
3491 for (
auto it_g = this->
groups.begin(); it_g != this->groups.end(); ++it_g) {
3492 if (File_attr_group_path == (*it_g)->path) {
3494 for (
auto ira = (*it_g)->attrs.begin(); ira != (*it_g)->attrs.end(); ++ira) {
3495 if (PCF1_attr_name == (*ira)->name) {
3496 Retrieve_H5_Attr_Value(*ira, (*it_g)->path);
3497 string pcf_value((*ira)->value.begin(), (*ira)->value.end());
3498 HDF5CFDAPUtil::replace_double_quote(pcf_value);
3499 (*ira)->value.resize(pcf_value.size());
3500 if (H5FSTRING == (*ira)->dtype) (*ira)->fstrsize = pcf_value.size();
3502 (*ira)->strsize.resize(1);
3503 (*ira)->strsize[0] = pcf_value.size();
3505 copy(pcf_value.begin(), pcf_value.end(), (*ira)->value.begin());
3511 if (
true == find_group &&
true == find_attr)
break;
3517void EOS5File::Handle_EOS5CVar_Unit_Attr()
3520 BESDEBUG(
"h5",
"Coming to Handle_EOS5CVar_Unit_Attr()"<<endl);
3521 string unit_attrname =
"units";
3522 string nonll_cf_level_attrvalue =
"level";
3523 string lat_cf_unit_attrvalue =
"degrees_north";
3524 string lon_cf_unit_attrvalue =
"degrees_east";
3525 string tes_cf_pre_attrvalue =
"hPa";
3527 for (
auto irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
3528 switch ((*irv)->cvartype) {
3531 for (
auto ira = (*irv)->attrs.begin(); ira != (*irv)->attrs.end(); ++ira) {
3532 if ((*ira)->newname == unit_attrname) {
3533 Retrieve_H5_Attr_Value(*ira, (*irv)->fullpath);
3534 string units_value((*ira)->value.begin(), (*ira)->value.end());
3535 if ((lat_cf_unit_attrvalue != units_value)
3536 && (((*irv)->name ==
"Latitude") || ((this->eos5cfzas.empty() ==
false) && ((*irv)->name ==
"nLats")))) {
3537 units_value = lat_cf_unit_attrvalue;
3542 (*ira)->value.resize(units_value.size());
3543 if (H5FSTRING == (*ira)->dtype) (*ira)->fstrsize = units_value.size();
3545 (*ira)->strsize.resize(1);
3546 (*ira)->strsize[0] = units_value.size();
3547 copy(units_value.begin(), units_value.end(), (*ira)->value.begin());
3549 else if ((lon_cf_unit_attrvalue != units_value) && (*irv)->name ==
"Longitude") {
3550 units_value = lon_cf_unit_attrvalue;
3551 (*ira)->value.resize(units_value.size());
3552 if (H5FSTRING == (*ira)->dtype) (*ira)->fstrsize = units_value.size();
3554 (*ira)->strsize.resize(1);
3555 (*ira)->strsize[0] = units_value.size();
3557 copy(units_value.begin(), units_value.end(), (*ira)->value.begin());
3567 Add_Str_Attr(attr, unit_attrname, lat_cf_unit_attrvalue);
3568 (*irv)->attrs.push_back(attr);
3574 Add_Str_Attr(attr, unit_attrname, lon_cf_unit_attrvalue);
3575 (*irv)->attrs.push_back(attr);
3579 case CV_NONLATLON_MISS: {
3581 Add_Str_Attr(attr, unit_attrname, nonll_cf_level_attrvalue);
3582 (*irv)->attrs.push_back(attr);
3586 if (
true == this->isaura && TES == this->aura_name) {
3588 Add_Str_Attr(attr, unit_attrname, tes_cf_pre_attrvalue);
3589 (*irv)->attrs.push_back(attr);
3594 throw1(
"Non-supported Coordinate Variable Type.");
3599void EOS5File::Add_EOS5_Grid_CF_Attr()
3601 BESDEBUG(
"h5",
"Coming to Add_EOS5_Grid_CF_Attr()"<<endl);
3603 bool has_eos5_grid_nongeo_proj =
false;
3606 for (
auto irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
3607 if ((*irv)->cvartype == CV_LAT_MISS) {
3608 if((*irv)->eos5_projcode !=HE5_GCTP_GEO) {
3609 has_eos5_grid_nongeo_proj =
true;
3616 if(
true == has_eos5_grid_nongeo_proj) {
3617 string conventions_attrname =
"Conventions";
3618 string conventions_attrvalue =
"CF-1.7";
3619 bool has_conventions_attr=
false;
3620 for(vector<HDF5CF::Attribute *>::const_iterator it_ra=this->
root_attrs.begin();
3621 it_ra!=this->root_attrs.end();it_ra++) {
3622 if((*it_ra)->name==conventions_attrname){
3623 has_conventions_attr =
true;
3628 if(
false==has_conventions_attr) {
3630 Add_Str_Attr(attr,conventions_attrname,conventions_attrvalue);
3643 BESDEBUG(
"h5",
"Coming to Adjust_Dim_Name()"<<endl);
3645 if (
false == this->iscoard)
3648 for (
auto irv = this->cvars.begin(); irv != this->cvars.end(); irv++) {
3649 if ((*irv)->dims.size() != 1)
3650 throw3(
"Coard coordinate variable ", (*irv)->name,
"is not 1D");
3651 if ((*irv)->newname != (((*irv)->dims)[0]->newname)) {
3652 ((*irv)->dims)[0]->newname = (*irv)->newname;
3655 for (
auto irv2 = this->
vars.begin(); irv2 != this->
vars.end(); irv2++) {
3656 for (
auto ird = (*irv2)->dims.begin(); ird != (*irv2)->dims.end(); ird++) {
3661 if ((*ird)->name == ((*irv)->dims)[0]->name) (*ird)->newname = ((*irv)->dims)[0]->newname;
3673 BESDEBUG(
"h5",
"Coming to Add_Supplement_Attrs()"<<endl);
3674 if (
true == add_path) {
3679 for (
auto irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
3680 if (((*irv)->cvartype == CV_EXIST) || ((*irv)->cvartype == CV_MODIFY)) {
3682 const string varname = (*irv)->name;
3683 const string attrname =
"origname";
3684 Add_Str_Attr(attr, attrname, varname);
3685 (*irv)->attrs.push_back(attr);
3689 for (
auto irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
3690 if (((*irv)->cvartype == CV_EXIST) || ((*irv)->cvartype == CV_MODIFY)) {
3694 if((*irv)->zero_storage_size==
false
3695 || HDF5RequestHandler::get_no_zero_size_fullnameattr() ==
false) {
3697 const string varname = (*irv)->fullpath;
3698 const string attrname =
"fullnamepath";
3699 Add_Str_Attr(attr, attrname, varname);
3700 (*irv)->attrs.push_back(attr);
3706 if (
true == this->iscoard) {
3707 for (
auto irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
3708 if (((*irv)->cvartype == CV_EXIST) || ((*irv)->cvartype == CV_MODIFY)) {
3710 const string attrname =
"orig_dimname";
3711 string orig_dimname = (((*irv)->dims)[0])->name;
3712 orig_dimname = HDF5CFUtil::obtain_string_after_lastslash(orig_dimname);
3713 if (
"" == orig_dimname)
3714 throw2(
"wrong dimension name ", orig_dimname);
3715 if (orig_dimname.find(
"FakeDim") != string::npos) orig_dimname =
"";
3716 Add_Str_Attr(attr, attrname, orig_dimname);
3717 (*irv)->attrs.push_back(attr);
3721 for (
auto irv = this->
vars.begin(); irv != this->vars.end(); ++irv) {
3723 if ((*irv)->dims.empty() ==
false) {
3725 if (1 == (*irv)->dims.size()) {
3726 const string attrname =
"orig_dimname";
3727 string orig_dimname = (((*irv)->dims)[0])->name;
3728 if (
"" == orig_dimname)
3729 orig_dimname =
"NoDimName";
3731 orig_dimname = HDF5CFUtil::obtain_string_after_lastslash(orig_dimname);
3732 if (orig_dimname.find(
"FakeDim") != string::npos) orig_dimname =
"NoDimName";
3733 Add_Str_Attr(attr, attrname, orig_dimname);
3736 const string attrname =
"orig_dimname_list";
3737 string orig_dimname_list;
3738 for (
auto ird = (*irv)->dims.begin(); ird != (*irv)->dims.end(); ++ird) {
3739 string orig_dimname = (*ird)->name;
3740 if (
"" == orig_dimname)
3741 orig_dimname =
"NoDimName";
3743 orig_dimname = HDF5CFUtil::obtain_string_after_lastslash((*ird)->name);
3744 if (orig_dimname.find(
"FakeDim") != string::npos) orig_dimname =
"NoDimName";
3745 if (
"" == orig_dimname_list)
3746 orig_dimname_list = orig_dimname;
3748 orig_dimname_list = orig_dimname_list +
" " + orig_dimname;
3753 Add_Str_Attr(attr, attrname, orig_dimname_list);
3755 (*irv)->attrs.push_back(attr);
3766 BESDEBUG(
"h5",
"Coming to Handle_Coor_Attr()"<<endl);
3767 string co_attrname =
"coordinates";
3768 string co_attrvalue =
"";
3770 if (iscoard)
return;
3772 for (
auto irv = this->
vars.begin(); irv != this->vars.end(); ++irv) {
3774 for (
auto ird = (*irv)->dims.begin(); ird != (*irv)->dims.end(); ++ird) {
3775 for (
auto ircv = this->cvars.begin(); ircv != this->cvars.end(); ++ircv) {
3776 if ((*ird)->name == (*ircv)->cfdimname)
3777 co_attrvalue = (co_attrvalue.empty()) ? (*ircv)->newname : co_attrvalue +
" " + (*ircv)->newname;
3780 if (
false == co_attrvalue.empty()) {
3782 Add_Str_Attr(attr, co_attrname, co_attrvalue);
3783 (*irv)->attrs.push_back(attr);
3785 co_attrvalue.clear();
3789 bool has_2dlatlon_cv =
false;
3790 for (
auto ircv = this->cvars.begin(); ircv != this->cvars.end(); ++ircv) {
3791 if (
true == (*ircv)->is_2dlatlon) {
3792 has_2dlatlon_cv =
true;
3797 if (
true == has_2dlatlon_cv) {
3801 for (
auto ircv = this->cvars.begin(); ircv != this->cvars.end(); ++ircv) {
3802 if (
true == (*ircv)->is_2dlatlon) {
3803 dimname1 = (((*ircv)->dims)[0])->name;
3804 dimname2 = (((*ircv)->dims)[1])->name;
3809 int num_latlondims = 0;
3811 for (
auto irv = this->
vars.begin(); irv != this->
vars.end(); ++irv) {
3812 for (
auto ird = (*irv)->dims.begin(); ird != (*irv)->dims.end(); ++ird) {
3813 if (dimname1 == (*ird)->name) num_latlondims++;
3814 if (dimname2 == (*ird)->name) num_latlondims++;
3816 if ((num_latlondims != 0) && (num_latlondims != 2)) {
3818 for (
auto ira = (*irv)->attrs.begin(); ira != (*irv)->attrs.end(); ++ira) {
3819 if (co_attrname == (*ira)->name) {
3821 (*irv)->attrs.erase(ira);
3834void EOS5File::Adjust_Special_EOS5CVar_Name() {
3836 int num_grids =this->eos5cfgrids.size();
3837 int num_swaths = this->eos5cfswaths.size();
3838 int num_zas = this->eos5cfzas.size();
3840 bool mixed_eos5typefile =
false;
3843 if (((num_grids > 0) && (num_swaths > 0)) ||
3844 ((num_grids > 0) && (num_zas > 0)) ||
3845 ((num_swaths >0) && (num_zas > 0)))
3846 mixed_eos5typefile =
true;
3848 if (
false == mixed_eos5typefile) {
3853 if ((1 == num_swaths) || ( 1 == num_zas) ||
3854 (1 == num_grids) || ((num_grids >1) && (this->grids_multi_latloncvs))) {
3856 string unit_attrname =
"units";
3857 string nonll_cf_level_attralue =
"level";
3858 string lat_cf_unit_attrvalue =
"degrees_north";
3859 string lon_cf_unit_attrvalue =
"degrees_east";
3861 for (
auto irv = this->cvars.begin();
3862 irv != this->cvars.end(); irv++) {
3863 switch((*irv)->eos_type) {
3869 for(vector <Attribute*>::iterator ira = (*irv)->attrs.begin();
3870 ira != (*irv)->attrs.end(); ira++) {
3871 if ((*ira)->name ==unit_attrname) {
3872 if ((*ira)->value.size() > 0) {
3873 string units_value((*ira)->value.begin(),(*ira)->value.end());
3874 if (lat_cf_unit_attrvalue ==units_value) (*irv)->newname =
"lat";
3875 if (lon_cf_unit_attrvalue ==units_value) (*irv)->newname =
"lon";
3881 case CV_NONLATLON_MISS:
3883 for(vector <Attribute*>::iterator ira = (*irv)->attrs.begin();
3884 ira != (*irv)->attrs.end(); ira++) {
3885 if ((*ira)->name ==unit_attrname) {
3886 if ((*ira)->value.size() > 0) {
3887 string units_value((*ira)->value.begin(),(*ira)->value.end());
3888 if (nonll_cf_level_attralue ==units_value) {
3889 (*irv)->newname =
"lev";
3898 throw1(
"Non-supported coordinate variable type");
3911void EOS5File::Create_Missing_CV(T* eos5data,
EOS5CVar *EOS5cvar,
const string& dimname, EOS5Type eos5type,
3915 BESDEBUG(
"h5",
"Coming to Create_Missing_CV()"<<endl);
3916 string reduced_dimname = HDF5CFUtil::obtain_string_after_lastslash(dimname);
3917 if (
"" == reduced_dimname) throw2(
"wrong dimension name ", dimname);
3918 EOS5cvar->name = reduced_dimname;
3919 Create_Added_Var_NewName_FullPath(eos5type, eos5data->name, EOS5cvar->name, EOS5cvar->newname, EOS5cvar->fullpath);
3921 EOS5cvar->dtype = H5INT32;
3922 hsize_t eos5cvar_dimsize = (eos5data->dimnames_to_dimsizes)[dimname];
3923 auto eos5cvar_dim =
new Dimension(eos5cvar_dimsize);
3924 eos5cvar_dim->name = dimname;
3925 eos5cvar_dim->unlimited_dim = (eos5data->dimnames_to_unlimited)[dimname];
3926 if (1 == num_eos5data)
3927 eos5cvar_dim->newname = reduced_dimname;
3929 eos5cvar_dim->newname = dimname;
3931 EOS5cvar->dims.push_back(eos5cvar_dim);
3932 EOS5cvar->cfdimname = dimname;
3933 EOS5cvar->cvartype = CV_NONLATLON_MISS;
3934 EOS5cvar->eos_type = eos5type;
3938void EOS5File::Create_Added_Var_NewName_FullPath(EOS5Type eos5type,
const string& eos5_groupname,
const string& varname,
3939 string &var_newname,
string &var_fullpath)
3942 BESDEBUG(
"h5",
"Coming to Create_Added_Var_NewName_FullPath()"<<endl);
3943 string fslash_str =
"/";
3944 string eos5typestr =
"";
3945 string top_eos5_groupname =
"/HDFEOS";
3949 eos5typestr =
"/GRIDS/";
3950 var_newname = eos5typestr + eos5_groupname + fslash_str + varname;
3951 var_fullpath = top_eos5_groupname + eos5typestr + eos5_groupname + fslash_str + varname;
3956 eos5typestr =
"/SWATHS/";
3957 var_newname = eos5typestr + eos5_groupname + fslash_str + varname;
3958 var_fullpath = top_eos5_groupname + eos5typestr + eos5_groupname + fslash_str + varname;
3964 eos5typestr =
"/ZAS/";
3965 var_newname = eos5typestr + eos5_groupname + fslash_str + varname;
3966 var_fullpath = top_eos5_groupname + eos5typestr + eos5_groupname + fslash_str + varname;
3972 throw1(
"Non-supported EOS type");
3980 BESDEBUG(
"h5",
"Coming to Handle_SpVar()"<<endl);
3981 if (
true == this->isaura && TES == this->aura_name) {
3982 const string ProHist_full_path =
"/HDFEOS/ADDITIONAL/FILE_ATTRIBUTES/ProductionHistory";
3983 for (
auto irv = this->
vars.begin(); irv != this->vars.end(); ++irv) {
3984 if (ProHist_full_path == (*irv)->fullpath) {
3986 this->
vars.erase(irv);
3993 if (dimname_to_dupdimnamelist.empty() ==
false) {
3994 for (
auto ircv = this->cvars.begin(); ircv != this->cvars.end(); ircv++) {
3995 if ((*ircv)->cvartype == CV_EXIST) {
3996 pair<multimap<string, string>::iterator, multimap<string, string>::iterator> mm_er_ret;
3997 multimap<string, string>::iterator itmm;
3998 for (itmm = dimname_to_dupdimnamelist.begin(); itmm != dimname_to_dupdimnamelist.end(); ++itmm) {
4001 if ((*ircv)->cfdimname == (*itmm).first) {
4004 for (
auto irv2 = this->cvars.begin(); irv2 != this->cvars.end();
4006 if ((*irv2)->cvartype == CV_NONLATLON_MISS) {
4012 if ((*irv2)->cfdimname == (*itmm).second) {
4015 string dup_var_name = (*irv2)->newname;
4016 Replace_Var_Info_EOS((*ircv), (*irv2));
4019 (*irv2)->newname = dup_var_name;
4020 (*irv2)->getDimensions()[0]->newname = dup_var_name;
4033 for (
auto irv = this->
vars.begin();
4034 irv != this->vars.end(); ++irv) {
4037 if((*irv)->rank >=2) {
4039 for (
auto ird = (*irv)->dims.begin();
4040 ird != (*irv)->dims.end(); ++ ird) {
4041 pair<multimap<string,string>::iterator,multimap<string,string>::iterator> mm_er_ret;
4042 multimap<string,string>::iterator itmm;
4043 for (itmm = dimname_to_dupdimnamelist.begin(); itmm!=dimname_to_dupdimnamelist.end();++itmm) {
4047 cerr<<
"duplicate dimension name of a variable is "<<(*ird)->name <<endl;
4057 if((*itmm).second == (*ird)->name) {
4058 cerr<<
"coming to find the duplicate dim. name "<<endl;
4059 for (
auto ircv = this->cvars.begin(); ircv != this->cvars.end(); ircv++) {
4060 if((*ircv)->cvartype == CV_EXIST) {
4061 cerr<<
"cf dim. name is "<<(*ircv)->cfdimname <<endl;
4063 if((*ircv)->cfdimname == (*itmm).first) {
4065 for (
auto irv2 = this->cvars.begin();
4066 irv2 != this->cvars.end(); irv2++) {
4067 if((*irv2)->cvartype == CV_NONLATLON_MISS) {
4069 if((*irv2)->cfdimname == (*itmm).second) {
4070 string dup_var_name = (*irv2)->newname;
4071 Replace_Var_Info_EOS((*ircv),(*irv2));
4072 (*irv2)->newname = dup_var_name;
4073 (*irv2)->getDimensions()[0]->newname = dup_var_name;
4102 BESDEBUG(
"h5",
"Coming to Handle_SpVar_Attr()"<<endl);
4105 if (dimname_to_dupdimnamelist.empty() ==
false) {
4107 pair<multimap<string, string>::iterator, multimap<string, string>::iterator> mm_er_ret;
4108 multimap<string, string>::iterator itmm;
4109 for (itmm = dimname_to_dupdimnamelist.begin(); itmm != dimname_to_dupdimnamelist.end(); ++itmm) {
4110 for (
auto ircv = this->cvars.begin(); ircv != this->cvars.end(); ircv++) {
4112 if ((*ircv)->cvartype == CV_EXIST) {
4115 if ((*ircv)->cfdimname == (*itmm).first) {
4119 for (
auto irv2 = this->cvars.begin(); irv2 != this->cvars.end();
4121 if ((*irv2)->cvartype == CV_NONLATLON_MISS) {
4127 if ((*irv2)->cfdimname == (*itmm).second) Replace_Var_Attrs_EOS((*ircv), (*irv2));
4142 BESDEBUG(
"h5",
"Coming to Handle_SpVar_DMR()"<<endl);
4143 if (
true == this->isaura && TES == this->aura_name) {
4144 const string ProHist_full_path =
"/HDFEOS/ADDITIONAL/FILE_ATTRIBUTES/ProductionHistory";
4145 for (
auto irv = this->
vars.begin(); irv != this->vars.end(); ++irv) {
4146 if (ProHist_full_path == (*irv)->fullpath) {
4148 this->
vars.erase(irv);
4155 if (dimname_to_dupdimnamelist.size() > 0) {
4156 for (
auto ircv = this->cvars.begin(); ircv != this->cvars.end(); ircv++) {
4157 if ((*ircv)->cvartype == CV_EXIST) {
4158 pair<multimap<string, string>::iterator, multimap<string, string>::iterator> mm_er_ret;
4159 multimap<string, string>::iterator itmm;
4160 for (itmm = dimname_to_dupdimnamelist.begin(); itmm != dimname_to_dupdimnamelist.end(); ++itmm) {
4163 if ((*ircv)->cfdimname == (*itmm).first) {
4166 for (
auto irv2 = this->cvars.begin(); irv2 != this->cvars.end();
4168 if ((*irv2)->cvartype == CV_NONLATLON_MISS) {
4174 if ((*irv2)->cfdimname == (*itmm).second) {
4176 Replace_Var_Attrs_EOS((*ircv), (*irv2));
4178 string dup_var_name = (*irv2)->newname;
4179 Replace_Var_Info_EOS((*ircv), (*irv2));
4183 (*irv2)->newname = dup_var_name;
4184 (*irv2)->getDimensions()[0]->newname = dup_var_name;
4214 BESDEBUG(
"h5",
"Coming to Replace_Var_Info_EOS()"<<endl);
4215 File::Replace_Var_Info(src, target);
4216 target->cfdimname = src->cfdimname;
4217 target->cvartype = src->cvartype;
4218 target->eos_type = src->eos_type;
4219 target->total_elems = src->total_elems;
4227 BESDEBUG(
"h5",
"Coming to Replace_Var_Attrs_EOS()"<<endl);
4228 File::Replace_Var_Attrs(src, target);
4234EOS5File:: add_ignored_info_attrs(
bool is_grp,
bool is_first) {
4238EOS5File:: 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 repersents one dimension of an HDF5 dataset(variable).
This class simulates an HDF-EOS5 Grid. Currently only geographic projection is supported.
This class simulates an HDF-EOS5 Swath.
This class simulates an HDF-EOS5 Zonal average object.
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 Add_Supplement_Attrs(bool) override
Add the supplemental attributes for HDF-EOS5 products.
void Set_COARDS_Status()
Set COARDS flag.
void Adjust_Var_Dim_NewName_Before_Flattening()
Adjust variable dimension names before the flattening for HDF-EOS5 files.
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 Adjust_Var_NewName_After_Parsing()
Adjust variable names 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 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 an HDF5 group. The group will be flattened according to the CF conventions.
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.