44 using namespace HDF5CF;
47 EOS5CVar::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 (vector<Attribute*>::iterator 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 (vector<Dimension*>::iterator 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);
103 void EOS5CFGrid::Update_Dimnamelist()
106 BESDEBUG(
"h5",
"coming to Update_Dimnamelist" <<endl);
112 for (set<string>::iterator 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 (set<string>::iterator 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);
131 EOS5File::~EOS5File()
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)
148 string EOS5File::get_CF_string(
string s)
153 return File::get_CF_string(s);
156 return File::get_CF_string(s);
161 void EOS5File::Retrieve_H5_Info(
const char *file_fullpath, hid_t file_id,
bool )
165 File::Retrieve_H5_Info(file_fullpath, file_id,
true);
168 void EOS5File::Retrieve_H5_CVar_Supported_Attr_Values()
171 for (vector<EOS5CVar *>::iterator ircv = this->cvars.begin(); ircv != this->cvars.end(); ++ircv) {
174 if ((CV_EXIST == (*ircv)->cvartype) || (CV_MODIFY == (*ircv)->cvartype)) {
175 for (vector<Attribute *>::iterator ira = (*ircv)->attrs.begin(); ira != (*ircv)->attrs.end(); ++ira)
176 Retrieve_H5_Attr_Value(*ira, (*ircv)->fullpath);
184 void EOS5File::Retrieve_H5_Supported_Attr_Values()
187 File::Retrieve_H5_Supported_Attr_Values();
188 for (vector<EOS5CVar *>::iterator ircv = this->cvars.begin(); ircv != this->cvars.end(); ++ircv) {
191 if ((CV_EXIST == (*ircv)->cvartype) || (CV_MODIFY == (*ircv)->cvartype)) {
192 for (vector<Attribute *>::iterator ira = (*ircv)->attrs.begin(); ira != (*ircv)->attrs.end(); ++ira)
193 Retrieve_H5_Attr_Value(*ira, (*ircv)->fullpath);
200 void EOS5File::Adjust_H5_Attr_Value(
Attribute *attr)
207 void EOS5File::Handle_Unsupported_Dtype(
bool include_attr)
210 if (
true == check_ignored) {
211 Gen_Unsupported_Dtype_Info(include_attr);
214 File::Handle_Unsupported_Dtype(include_attr);
215 Handle_EOS5_Unsupported_Dtype(include_attr);
219 void EOS5File::Handle_EOS5_Unsupported_Dtype(
bool include_attr)
222 for (vector<EOS5CVar *>::iterator ircv = this->cvars.begin(); ircv != this->cvars.end();) {
223 if (
true == include_attr) {
224 for (vector<Attribute *>::iterator 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);
249 void 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();
263 void EOS5File::Gen_VarAttr_Unsupported_Dtype_Info()
267 Gen_DimScale_VarAttr_Unsupported_Dtype_Info();
270 Gen_EOS5_VarAttr_Unsupported_Dtype_Info();
274 void EOS5File::Gen_EOS5_VarAttr_Unsupported_Dtype_Info()
277 for (vector<EOS5CVar *>::iterator 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 (vector<Attribute *>::iterator 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);
301 void EOS5File::Handle_Unsupported_Dspace(
bool include_attr)
305 if (
true == check_ignored) {
306 Gen_Unsupported_Dspace_Info();
309 File::Handle_Unsupported_Dspace(include_attr);
310 Handle_EOS5_Unsupported_Dspace(include_attr);
315 void EOS5File::Handle_EOS5_Unsupported_Dspace(
bool include_attr)
318 if (
true == this->unsupported_var_dspace) {
319 for (vector<EOS5CVar *>::iterator 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 (vector<EOS5CVar *>::iterator ircv = this->cvars.begin(); ircv != this->cvars.end(); ++ircv) {
333 if (
false == (*ircv)->attrs.empty()) {
334 if (
true == (*ircv)->unsupported_attr_dspace) {
335 for (vector<Attribute *>::iterator ira = (*ircv)->attrs.begin(); ira != (*ircv)->attrs.end();) {
336 if (0 == (*ira)->count) {
338 ira = (*ircv)->attrs.erase(ira);
352 void EOS5File::Gen_Unsupported_Dspace_Info()
355 File::Gen_Unsupported_Dspace_Info();
360 void EOS5File::Handle_Unsupported_Others(
bool include_attr)
363 remove_netCDF_internal_attributes(include_attr);
365 if(
true == include_attr) {
366 for (vector<Var *>::iterator irv = this->vars.begin();
367 irv != this->vars.end(); ++irv) {
368 for(vector<Attribute *>::iterator 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 (vector<EOS5CVar *>::iterator irv = this->cvars.begin();
420 irv != this->cvars.end(); ++irv) {
421 for(vector<Attribute *>::iterator ira = (*irv)->attrs.begin();
422 ira != (*irv)->attrs.end();) {
423 if((*ira)->name ==
"CLASS") {
424 string class_value = Retrieve_Str_Attr_Value(*ira,(*irv)->fullpath);
428 if (0 == class_value.compare(0,15,
"DIMENSION_SCALE")) {
430 ira = (*irv)->attrs.erase(ira);
437 else if((*ira)->name ==
"NAME") {
439 ira=(*irv)->attrs.erase(ira);
442 string name_value = Retrieve_Str_Attr_Value(*ira,(*irv)->fullpath);
443 if( 0 == name_value.compare(0,(*irv)->name.size(),(*irv)->name)) {
445 ira =(*irv)->attrs.erase(ira);
448 string netcdf_dim_mark=
"This is a netCDF dimension but not a netCDF variable";
449 if( 0 == name_value.compare(0,netcdf_dim_mark.size(),netcdf_dim_mark)) {
451 ira =(*irv)->attrs.erase(ira);
459 else if((*ira)->name ==
"_Netcdf4Dimid") {
461 ira =(*irv)->attrs.erase(ira);
476 if (
true == this->check_ignored &&
true == include_attr) {
479 if (
true == HDF5RequestHandler::get_drop_long_string()) {
481 for (vector<Attribute *>::iterator ira = this->root_attrs.begin(); ira != this->root_attrs.end(); ++ira) {
482 if (H5FSTRING == (*ira)->dtype || H5VSTRING == (*ira)->dtype) {
483 if ((*ira)->getBufSize() > NC_JAVA_STR_SIZE_LIMIT) {
484 this->add_ignored_droplongstr_hdr();
485 this->add_ignored_grp_longstr_info(
"/", (*ira)->name);
490 for (vector<Group *>::iterator irg = this->groups.begin(); irg != this->groups.end(); ++irg) {
491 for (vector<Attribute *>::iterator ira = (*irg)->attrs.begin(); ira != (*irg)->attrs.end(); ++ira) {
492 if (H5FSTRING == (*ira)->dtype || H5VSTRING == (*ira)->dtype) {
493 if ((*ira)->getBufSize() > NC_JAVA_STR_SIZE_LIMIT) {
494 this->add_ignored_droplongstr_hdr();
495 this->add_ignored_grp_longstr_info((*irg)->path, (*ira)->name);
502 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
503 if (
true == Check_DropLongStr((*irv), NULL)) {
504 string ecsmeta_grp =
"/HDFEOS INFORMATION";
506 if ((*irv)->fullpath.find(ecsmeta_grp) != 0
507 || ((*irv)->fullpath.rfind(
"/") != ecsmeta_grp.size())) {
508 this->add_ignored_droplongstr_hdr();
509 this->add_ignored_var_longstr_info((*irv), NULL);
513 for (vector<Attribute *>::iterator ira = (*irv)->attrs.begin(); ira != (*irv)->attrs.end(); ++ira) {
514 if (
true == Check_DropLongStr((*irv), (*ira))) {
515 this->add_ignored_droplongstr_hdr();
516 this->add_ignored_var_longstr_info((*irv), (*ira));
522 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
523 for (vector<Attribute *>::iterator ira = (*irv)->attrs.begin(); ira != (*irv)->attrs.end(); ++ira) {
524 if (
true == Check_DropLongStr((*irv), (*ira))) {
525 this->add_ignored_droplongstr_hdr();
526 this->add_ignored_var_longstr_info((*irv), (*ira));
534 if (
false == this->have_ignored) this->add_no_ignored_info();
539 void EOS5File::Adjust_EOS5Dim_Info(
HE5Parser*strmeta_info)
542 BESDEBUG(
"h5",
"coming to Adjust_EOS5Dim_Info" <<endl);
545 for (
unsigned int i = 0; i < strmeta_info->swath_list.size(); ++i) {
546 HE5Swath& he5s = strmeta_info->swath_list.at(i);
548 Adjust_EOS5Dim_List(he5s.dim_list);
558 if(this->have_udim ==
true) {
559 vector<HE5Var> svlist = he5s.geo_var_list;
560 svlist.insert(svlist.end(),he5s.data_var_list.begin(),he5s.data_var_list.end());
562 Adjust_EOS5DimSize_List(he5s.dim_list,svlist,SWATH,he5s.name);
565 for (
unsigned int j = 0; j < he5s.geo_var_list.size(); ++j) {
566 Adjust_EOS5VarDim_Info((he5s.geo_var_list)[j].dim_list, he5s.dim_list, he5s.name, SWATH);
568 for (
unsigned int j = 0; j < he5s.data_var_list.size(); ++j) {
569 Adjust_EOS5VarDim_Info((he5s.data_var_list)[j].dim_list, he5s.dim_list, he5s.name, SWATH);
573 for (
unsigned int i = 0; i < strmeta_info->grid_list.size(); ++i) {
575 HE5Grid& he5g = strmeta_info->grid_list.at(i);
577 Adjust_EOS5Dim_List(he5g.dim_list);
580 if(this->have_udim ==
true) {
582 Adjust_EOS5DimSize_List(he5g.dim_list,he5g.data_var_list,GRID,he5g.name);
585 for (
unsigned int j = 0; j < he5g.data_var_list.size(); ++j) {
586 Adjust_EOS5VarDim_Info((he5g.data_var_list)[j].dim_list, he5g.dim_list, he5g.name, GRID);
590 for (
unsigned int i = 0; i < strmeta_info->za_list.size(); ++i) {
591 HE5Za& he5z = strmeta_info->za_list.at(i);
593 Adjust_EOS5Dim_List(he5z.dim_list);
596 if(this->have_udim ==
true) {
598 Adjust_EOS5DimSize_List(he5z.dim_list,he5z.data_var_list,ZA,he5z.name);
601 for (
unsigned int j = 0; j < he5z.data_var_list.size(); ++j) {
602 Adjust_EOS5VarDim_Info((he5z.data_var_list)[j].dim_list, he5z.dim_list, he5z.name, ZA);
608 void EOS5File::Adjust_EOS5Dim_List(vector<HE5Dim>& groupdimlist)
611 BESDEBUG(
"h5",
"Coming to Adjust_EOS5Dim_List"<<endl);
615 Remove_NegativeSizeDims(groupdimlist);
618 Condense_EOS5Dim_List(groupdimlist);
624 void EOS5File::Remove_NegativeSizeDims(vector<HE5Dim>& groupdimlist)
627 BESDEBUG(
"h5",
"Coming to Remove_NegativeSizeDims" <<endl);
628 vector<HE5Dim>::iterator id;
637 for (
id = groupdimlist.begin();
id != groupdimlist.end();) {
638 if ((*id).size <= 0) {
639 id = groupdimlist.erase(
id);
651 void EOS5File::Condense_EOS5Dim_List(vector<HE5Dim>& groupdimlist)
654 BESDEBUG(
"h5",
"Coming to Condense_EOS5Dim_List"<<endl);
657 pair<set<int>::iterator,
bool> setret;
658 vector<HE5Dim>::iterator id;
660 for (
id = groupdimlist.begin();
id != groupdimlist.end();) {
661 if (
"XDim" == (*id).name ||
"Xdim" == (*id).name) {
662 setret = xdimsizes.insert((*id).size);
663 if (
false == setret.second) {
664 id = groupdimlist.erase(
id);
666 else if (
"Xdim" == (*id).name) {
680 for (
id = groupdimlist.begin();
id != groupdimlist.end();) {
681 if (
"YDim" == (*id).name ||
"Ydim" == (*id).name) {
682 setret = ydimsizes.insert((*id).size);
683 if (
false == setret.second) {
684 id = groupdimlist.erase(
id);
686 else if (
"Ydim" == (*id).name) {
700 void EOS5File:: Adjust_EOS5DimSize_List(vector<HE5Dim>& eos5objdimlist,
const vector<HE5Var> & eos5objvarlist,
701 const EOS5Type eos5type,
const string & eos5objname)
704 set<string>updated_dimlist;
705 pair<set<string>::iterator,
bool> set_insert_ret;
707 for(
unsigned int i = 0; i<eos5objvarlist.size();i++) {
708 HE5Var he5v = eos5objvarlist.at(i);
709 for(
unsigned int j = 0; j<he5v.dim_list.size();j++) {
710 HE5Dim he5d = he5v.dim_list.at(j);
711 set_insert_ret = updated_dimlist.insert(he5d.name);
712 if(set_insert_ret.second ==
true) {
714 unsigned int objdimlist_index = 9999;
715 bool has_objdimlist_index =
false;
716 for(
unsigned int k = 0; k <eos5objdimlist.size();k++) {
717 if(eos5objdimlist[k].name == he5d.name) {
718 objdimlist_index = k;
719 has_objdimlist_index =
true;
723 if(has_objdimlist_index ==
false)
724 throw2(
"Cannot find the dimension in the EOS5 object dimension list for the dimension ", he5d.name);
725 for (vector<Var *>::const_iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
727 EOS5Type vartype = Get_Var_EOS5_Type((*irv));
730 if(vartype == eos5type) {
731 string var_eos5gname = Obtain_Var_EOS5Type_GroupName((*irv),vartype);
734 if(var_eos5gname == eos5objname) {
735 if((*irv)->name == he5v.name) {
736 if (he5v.dim_list.size() != (*irv)->dims.size())
737 throw2(
"Number of dimensions don't match with the structmetadata for variable ", (*irv)->name);
739 (eos5objdimlist[objdimlist_index]).size = ((*irv)->dims[j])->size;
750 if(updated_dimlist.size() == eos5objdimlist.size())
754 for(
unsigned int k = 0; k <eos5objdimlist.size();k++) {
755 cerr<<
"eos5 obj dim name is "<<eos5objdimlist[k].name <<
" Size is "<< eos5objdimlist[k].size << endl;
762 void EOS5File::Adjust_EOS5VarDim_Info(vector<HE5Dim>& vardimlist, vector<HE5Dim>& groupdimlist,
763 const string & eos5_obj_name, EOS5Type eos5type)
766 BESDEBUG(
"h5",
"Coming to Adjust_EOS5VarDim_Info"<<endl);
767 set<string> dimnamelist;
768 pair<set<string>::iterator,
bool> setret;
775 for (
unsigned int i = 0; i < vardimlist.size(); ++i) {
777 HE5Dim& he5d = vardimlist.at(i);
778 bool dim_in_groupdimlist =
false;
779 for (
unsigned int j = 0; j < groupdimlist.size(); ++j) {
780 HE5Dim he5gd = groupdimlist.at(j);
781 if (he5gd.name == he5d.name) {
782 he5d.size = he5gd.size;
783 dim_in_groupdimlist =
true;
788 if (
false == dim_in_groupdimlist)
789 throw2(
"The EOS5 group dimension name list doesn't include the dimension ", he5d.name);
794 setret = dimnamelist.insert(he5d.name);
795 if (
false == setret.second) {
797 string temp_clashname = he5d.name +
'_';
798 HDF5CFUtil::gen_unique_name(temp_clashname, dimnamelist, clash_index);
800 string ori_dimname = he5d.name;
802 he5d.name = temp_clashname;
805 bool dim_exist =
false;
806 for (
unsigned int j = 0; j < groupdimlist.size(); ++j) {
807 if (he5d.name == groupdimlist[j].name && he5d.size == groupdimlist[j].size) {
814 if (
false == dim_exist) {
815 ori_dimname = eos5_obj_name +
"/" + ori_dimname;
816 string dup_dimname = eos5_obj_name +
"/" + he5d.name;
817 if (GRID == eos5type) {
818 ori_dimname =
"/GRIDS/" + ori_dimname;
819 dup_dimname =
"/GRIDS/" + dup_dimname;
821 else if (SWATH == eos5type) {
822 ori_dimname =
"/SWATHS/" + ori_dimname;
823 dup_dimname =
"/SWATHS/" + dup_dimname;
825 else if (ZA == eos5type) {
826 ori_dimname =
"/ZAS/" + ori_dimname;
827 dup_dimname =
"/ZAS/" + dup_dimname;
831 dimname_to_dupdimnamelist.insert(pair<string, string>(ori_dimname, dup_dimname));
832 groupdimlist.push_back(he5d);
841 void EOS5File::Add_EOS5File_Info(
HE5Parser * strmeta_info,
bool grids_mllcv)
844 BESDEBUG(
"h5",
"Coming to Add_EOS5File_Info"<<endl);
845 string fslash_str =
"/";
846 string grid_str =
"/GRIDS/";
847 string swath_str =
"/SWATHS/";
848 string za_str =
"/ZAS/";
856 this->orig_num_grids = strmeta_info->grid_list.size();
859 for (
unsigned int i = 0; i < strmeta_info->grid_list.size(); i++) {
860 HE5Grid he5g = strmeta_info->grid_list.at(i);
862 eos5grid->name = he5g.name;
863 eos5grid->dimnames.resize(he5g.dim_list.size());
865 for (
unsigned int j = 0; j < he5g.dim_list.size(); j++) {
867 HE5Dim he5d = he5g.dim_list.at(j);
868 if (
"XDim" == he5d.name) eos5grid->xdimsize = he5d.size;
869 if (
"YDim" == he5d.name) eos5grid->ydimsize = he5d.size;
879 string unique_dimname = grid_str + he5g.name + fslash_str + he5d.name;
881 (eos5grid->dimnames)[j] = unique_dimname;
883 pair<map<hsize_t, string>::iterator,
bool> mapret1;
884 mapret1 = eos5grid->dimsizes_to_dimnames.insert(pair<hsize_t, string>((hsize_t) he5d.size, unique_dimname));
889 pair<map<string, hsize_t>::iterator,
bool> mapret2;
890 mapret2 = eos5grid->dimnames_to_dimsizes.insert(pair<string, hsize_t>(unique_dimname, (hsize_t) he5d.size));
891 if (
false == mapret2.second)
892 throw5(
"The dimension name ", unique_dimname,
" with the dimension size ", he5d.size,
"is not unique");
897 EOS5SwathGrid_Set_LatLon_Flags(eos5grid, he5g.data_var_list);
900 map<string, string> dnames_to_1dvnames;
901 EOS5Handle_nonlatlon_dimcvars(he5g.data_var_list, GRID, he5g.name, dnames_to_1dvnames);
902 eos5grid->dnames_to_1dvnames = dnames_to_1dvnames;
908 eos5grid->eos5_pixelreg = he5g.pixelregistration;
909 eos5grid->eos5_origin = he5g.gridorigin;
910 eos5grid->eos5_projcode = he5g.projection;
912 for (
unsigned int k = 0; k < 13; k++)
913 eos5grid->param[k] = he5g.param[k];
914 eos5grid->zone = he5g.zone;
915 eos5grid->sphere = he5g.sphere;
917 this->eos5cfgrids.push_back(eos5grid);
922 this->grids_multi_latloncvs = grids_mllcv;
925 for (
unsigned int i = 0; i < strmeta_info->swath_list.size(); i++) {
927 HE5Swath he5s = strmeta_info->swath_list.at(i);
929 eos5swath->name = he5s.name;
930 eos5swath->dimnames.resize(he5s.dim_list.size());
932 for (
unsigned int j = 0; j < he5s.dim_list.size(); j++) {
934 HE5Dim he5d = he5s.dim_list.at(j);
944 string unique_dimname = swath_str + he5s.name + fslash_str + he5d.name;
945 (eos5swath->dimnames)[j] = unique_dimname;
949 pair<map<hsize_t, string>::iterator,
bool> mapret1;
950 mapret1 = eos5swath->dimsizes_to_dimnames.insert(
951 pair<hsize_t, string>((hsize_t) he5d.size, unique_dimname));
956 pair<map<string, hsize_t>::iterator,
bool> mapret2;
957 mapret2 = eos5swath->dimnames_to_dimsizes.insert(
958 pair<string, hsize_t>(unique_dimname, (hsize_t) he5d.size));
959 if (
false == mapret2.second)
960 throw5(
"The dimension name ", unique_dimname,
" with the dimension size ", he5d.size,
"is not unique");
965 EOS5SwathGrid_Set_LatLon_Flags(eos5swath, he5s.geo_var_list);
968 map<string, string> dnames_to_geo1dvnames;
969 EOS5Handle_nonlatlon_dimcvars(he5s.geo_var_list, SWATH, he5s.name, dnames_to_geo1dvnames);
970 eos5swath->dnames_to_geo1dvnames = dnames_to_geo1dvnames;
971 this->eos5cfswaths.push_back(eos5swath);
975 for (
unsigned int i = 0; i < strmeta_info->za_list.size(); i++) {
977 HE5Za he5z = strmeta_info->za_list.at(i);
980 eos5za->name = he5z.name;
981 eos5za->dimnames.resize(he5z.dim_list.size());
983 for (
unsigned int j = 0; j < he5z.dim_list.size(); j++) {
985 HE5Dim he5d = he5z.dim_list.at(j);
991 string unique_dimname = za_str + he5z.name + fslash_str + he5d.name;
992 (eos5za->dimnames)[j] = unique_dimname;
993 pair<map<hsize_t, string>::iterator,
bool> mapret1;
994 mapret1 = eos5za->dimsizes_to_dimnames.insert(pair<hsize_t, string>((hsize_t) he5d.size, unique_dimname));
999 pair<map<string, hsize_t>::iterator,
bool> mapret2;
1000 mapret2 = eos5za->dimnames_to_dimsizes.insert(pair<string, hsize_t>(unique_dimname, (hsize_t) he5d.size));
1001 if (
false == mapret2.second)
1002 throw5(
"The dimension name ", unique_dimname,
" with the dimension size ", he5d.size,
"is not unique");
1007 map<string, string> dnames_to_1dvnames;
1008 EOS5Handle_nonlatlon_dimcvars(he5z.data_var_list, ZA, he5z.name, dnames_to_1dvnames);
1009 eos5za->dnames_to_1dvnames = dnames_to_1dvnames;
1010 this->eos5cfzas.push_back(eos5za);
1015 for (vector<EOS5CFGrid *>::iterator irg = this->eos5cfgrids.begin();
1016 irg != this->eos5cfgrids.end(); ++irg) {
1018 cerr<<
"grid name "<<(*irg)->name <<endl;
1019 cerr<<
"eos5_pixelreg"<<(*irg)->eos5_pixelreg <<endl;
1020 cerr<<
"eos5_origin"<<(*irg)->eos5_pixelreg <<endl;
1021 cerr<<
"point_lower "<<(*irg)->point_lower <<endl;
1022 cerr<<
"xdimsize "<<(*irg)->xdimsize <<endl;
1024 if((*irg)->has_g2dlatlon) cerr<<
"has g2dlatlon"<<endl;
1025 if((*irg)->has_2dlatlon) cerr<<
"has 2dlatlon"<<endl;
1026 if((*irg)->has_1dlatlon) cerr<<
"has 1dlatlon"<<endl;
1027 if((*irg)->has_nolatlon) cerr<<
"has no latlon" <<endl;
1028 if(this->grids_multi_latloncvs) cerr<<
"having multiple lat/lon from structmeta" <<endl;
1029 else cerr<<
"no multiple lat/lon from structmeta" <<endl;
1032 "h5",
"number of dimensions "<<(*irg)->dimnames.size() <<endl;
1033 for (vector<string>::iterator irv = (*irg)->dimnames.begin();
1034 irv != (*irg)->dimnames.end(); ++irv)
1035 cerr<<
"dim names" <<*irv <<endl;
1038 for (map<hsize_t,string>::iterator im1 = (*irg)->dimsizes_to_dimnames.begin();
1039 im1 !=(*irg)->dimsizes_to_dimnames.end();++im1) {
1040 cerr<<
"size to name "<< (
int)((*im1).first) <<
"=> "<<(*im1).second <<endl;
1044 for (map<string,string>::iterator im2 = (*irg)->dnames_to_1dvnames.begin();
1045 im2 !=(*irg)->dnames_to_1dvnames.end();++im2) {
1046 cerr<<
"dimanme to 1d var name "<< (*im2).first <<
"=> "<<(*im2).second <<endl;
1051 for (vector<EOS5CFSwath *>::iterator irg = this->eos5cfswaths.begin();
1052 irg != this->eos5cfswaths.end(); ++irg) {
1054 cerr<<
"swath name "<<(*irg)->name <<endl;
1055 if((*irg)->has_nolatlon) cerr<<
"has no latlon" <<endl;
1056 if((*irg)->has_1dlatlon) cerr<<
"has 1dlatlon"<<endl;
1057 if((*irg)->has_2dlatlon) cerr<<
"has 2dlatlon"<<endl;
1060 for (vector<string>::iterator irv = (*irg)->dimnames.begin();
1061 irv != (*irg)->dimnames.end(); ++irv)
1062 cerr<<
"dim names" <<*irv <<endl;
1065 for (map<hsize_t,string>::iterator im1 = (*irg)->dimsizes_to_dimnames.begin();
1066 im1 !=(*irg)->dimsizes_to_dimnames.end();++im1) {
1067 cerr<<
"size to name "<< (
int)((*im1).first) <<
"=> "<<(*im1).second <<endl;
1071 for (map<string,string>::iterator im2 = (*irg)->dnames_to_geo1dvnames.begin();
1072 im2 !=(*irg)->dnames_to_geo1dvnames.end();++im2) {
1073 cerr<<
"dimname to 1d varname "<< (*im2).first <<
"=> "<<(*im2).second <<endl;
1077 for (vector<EOS5CFZa *>::iterator irg = this->eos5cfzas.begin();
1078 irg != this->eos5cfzas.end(); ++irg) {
1080 cerr<<
"za name now"<<(*irg)->name <<endl;
1083 for (vector<string>::iterator irv = (*irg)->dimnames.begin();
1084 irv != (*irg)->dimnames.end(); ++irv)
1085 cerr<<
"dim names" <<*irv <<endl;
1088 for (map<hsize_t,string>::iterator im1 = (*irg)->dimsizes_to_dimnames.begin();
1089 im1 !=(*irg)->dimsizes_to_dimnames.end();++im1) {
1090 cerr<<
"size to name "<< (
int)((*im1).first) <<
"=> "<<(*im1).second <<endl;
1094 for (map<string,string>::iterator im2 = (*irg)->dnames_to_1dvnames.begin();
1095 im2 !=(*irg)->dnames_to_1dvnames.end();++im2) {
1096 cerr<<
"dimname to 1d varname "<< (*im2).first <<
"=> "<<(*im2).second <<endl;
1105 void EOS5File::EOS5SwathGrid_Set_LatLon_Flags(T* eos5gridswath, vector<HE5Var> &eos5varlist)
1108 BESDEBUG(
"h5",
"Coming to EOS5SwathGrid_Set_LatLon_Flags"<<endl);
1109 bool find_lat =
false;
1110 bool find_lon =
false;
1111 bool has_1dlat =
false;
1112 bool has_1dlon =
false;
1113 bool has_2dlat =
false;
1114 string lat_xdimname;
1115 string lat_ydimname;
1116 string lon_xdimname;
1117 string lon_ydimname;
1118 bool has_2dlon =
false;
1119 bool has_g2dlat =
false;
1120 bool has_g2dlon =
false;
1122 for (
unsigned int i = 0; i < eos5varlist.size(); ++i) {
1123 HE5Var he5v = eos5varlist.at(i);
1124 if (
"Latitude" == he5v.name) {
1126 int num_dims = he5v.dim_list.size();
1129 else if (2 == num_dims) {
1130 lat_ydimname = (he5v.dim_list)[0].name;
1131 lat_xdimname = (he5v.dim_list)[1].name;
1134 else if (num_dims > 2)
1137 throw1(
"The number of dimension should not be 0 for grids or swaths");
1140 if (
"Longitude" == he5v.name) {
1142 int num_dims = he5v.dim_list.size();
1145 else if (2 == num_dims) {
1146 lon_ydimname = (he5v.dim_list)[0].name;
1147 lon_xdimname = (he5v.dim_list)[1].name;
1150 else if (num_dims > 2)
1153 throw1(
"The number of dimension should not be 0 for grids or swaths");
1156 if (
true == find_lat &&
true == find_lon) {
1157 if (
true == has_1dlat &&
true == has_1dlon) eos5gridswath->has_1dlatlon =
true;
1160 if (
true == has_2dlat &&
true == has_2dlon && lat_ydimname == lon_ydimname && lat_xdimname == lon_xdimname)
1161 eos5gridswath->has_2dlatlon =
true;
1163 if (
true == has_g2dlat &&
true == has_g2dlon) eos5gridswath->has_g2dlatlon =
true;
1165 eos5gridswath->has_nolatlon =
false;
1173 void EOS5File::EOS5Handle_nonlatlon_dimcvars(vector<HE5Var> & eos5varlist, EOS5Type eos5type,
string groupname,
1174 map<string, string>& dnamesgeo1dvnames)
1177 BESDEBUG(
"h5",
"Coming to EOS5Handle_nonlatlon_dimcvars"<<endl);
1179 set<string> nocvdimnames;
1180 string grid_str =
"/GRIDS/";
1181 string xdim_str =
"XDim";
1182 string ydim_str =
"YDim";
1183 string fslash_str =
"/";
1186 if (GRID == eos5type) {
1187 string xdimname = grid_str + groupname + fslash_str + xdim_str;
1188 nocvdimnames.insert(xdimname);
1189 string ydimname = grid_str + groupname + fslash_str + ydim_str;
1190 nocvdimnames.insert(ydimname);
1191 eos5typestr =
"/GRIDS/";
1193 else if (SWATH == eos5type)
1194 eos5typestr =
"/SWATHS/";
1195 else if (ZA == eos5type)
1196 eos5typestr =
"/ZAS/";
1198 throw1(
"Unsupported HDF-EOS5 type, this type is not swath, grid or zonal average");
1202 pair<map<string, string>::iterator,
bool> mapret;
1203 for (
unsigned int i = 0; i < eos5varlist.size(); ++i) {
1204 HE5Var he5v = eos5varlist.at(i);
1205 if (1 == he5v.dim_list.size()) {
1206 HE5Dim he5d = he5v.dim_list.at(0);
1208 dimname = eos5typestr + groupname + fslash_str + he5d.name;
1210 varname = eos5typestr + groupname + fslash_str + he5v.name;
1211 mapret = dnamesgeo1dvnames.insert(pair<string, string>(dimname, varname));
1216 if (
false == mapret.second) nocvdimnames.insert(dimname);
1222 set<string>::iterator itset;
1223 for (itset = nocvdimnames.begin(); itset != nocvdimnames.end(); ++itset)
1224 dnamesgeo1dvnames.erase(*itset);
1228 void EOS5File::Adjust_Var_NewName_After_Parsing()
1231 BESDEBUG(
"h5",
"Coming to Adjust_Var_NewName_After_Parsing"<<endl);
1232 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
1233 Obtain_Var_NewName(*irv);
1237 void EOS5File::Obtain_Var_NewName(
Var *var)
1240 BESDEBUG(
"h5",
"Coming to Obtain_Var_NewName"<<endl);
1241 string fslash_str =
"/";
1242 string eos5typestr =
"";
1244 EOS5Type vartype = Get_Var_EOS5_Type(var);
1252 eos5typestr =
"/GRIDS/";
1253 string eos5_groupname = Obtain_Var_EOS5Type_GroupName(var, vartype);
1258 var->newname = eos5typestr + eos5_groupname + fslash_str + var->name;
1263 eos5typestr =
"/SWATHS/";
1264 string eos5_groupname = Obtain_Var_EOS5Type_GroupName(var, vartype);
1269 var->newname = eos5typestr + eos5_groupname + fslash_str + var->name;
1273 eos5typestr =
"/ZAS/";
1274 string eos5_groupname = Obtain_Var_EOS5Type_GroupName(var, vartype);
1279 var->newname = eos5typestr + eos5_groupname + fslash_str + var->name;
1283 string eos5infopath =
"/HDFEOS INFORMATION";
1284 if (var->fullpath.size() > eos5infopath.size()) {
1285 if (eos5infopath == var->fullpath.substr(0, eos5infopath.size())) var->newname = var->name;
1288 var->newname = var->fullpath;
1292 throw1(
"Non-supported EOS type");
1297 EOS5Type EOS5File::Get_Var_EOS5_Type(
Var* var)
1300 BESDEBUG(
"h5",
"Coming to Get_Var_EOS5_Type"<<endl);
1302 string EOS5GRIDPATH =
"/HDFEOS/GRIDS";
1303 string EOS5SWATHPATH =
"/HDFEOS/SWATHS";
1304 string EOS5ZAPATH =
"/HDFEOS/ZAS";
1306 if (var->fullpath.size() >= EOS5GRIDPATH.size()) {
1307 if (EOS5GRIDPATH == var->fullpath.substr(0, EOS5GRIDPATH.size()))
return GRID;
1309 if (var->fullpath.size() >= EOS5SWATHPATH.size()) {
1310 if (EOS5SWATHPATH == var->fullpath.substr(0, EOS5SWATHPATH.size()))
return SWATH;
1312 if (var->fullpath.size() >= EOS5ZAPATH.size()) {
1313 if (EOS5ZAPATH == var->fullpath.substr(0, EOS5ZAPATH.size()))
return ZA;
1323 BESDEBUG(
"h5",
"Coming to Add_Dim_Name"<<endl);
1324 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
1325 Obtain_Var_Dims(*irv, strmeta_info);
1327 for (vector<Dimension *>::iterator ird = (*irv)->dims.begin();
1328 ird != (*irv)->dims.end();++ird) {
1329 cerr<<
"dim name right after change "<<(*ird)->newname <<endl;
1337 bool EOS5File::Obtain_Var_Dims(
Var *var,
HE5Parser * strmeta_info)
1340 BESDEBUG(
"h5",
"Coming to Obtain_Var_Dims"<<endl);
1341 string varname_from_parser =
"";
1342 EOS5Type vartype = Get_Var_EOS5_Type(var);
1344 if (GRID == vartype) {
1345 int num_grids = strmeta_info->grid_list.size();
1346 for (
int i = 0; i < num_grids; ++i) {
1347 HE5Grid he5g = strmeta_info->grid_list.at(i);
1348 if (he5g.name == Obtain_Var_EOS5Type_GroupName(var, vartype)) {
1349 EOS5CFGrid *eos5cfgrid = (this->eos5cfgrids)[i];
1350 bool var_is_parsed = Set_Var_Dims(eos5cfgrid, var, he5g.data_var_list, he5g.name, num_grids, GRID);
1351 if (
false == var_is_parsed) {
1352 map<hsize_t, string> dimsizes_to_dimnames = eos5cfgrid->dimsizes_to_dimnames;
1357 Set_NonParse_Var_Dims(eos5cfgrid, var, dimsizes_to_dimnames, num_grids, vartype);
1362 else if (SWATH == vartype) {
1363 int num_swaths = strmeta_info->swath_list.size();
1364 for (
int i = 0; i < num_swaths; ++i) {
1366 HE5Swath he5s = strmeta_info->swath_list.at(i);
1368 if (he5s.name == Obtain_Var_EOS5Type_GroupName(var, vartype)) {
1370 EOS5CFSwath *eos5cfswath = (this->eos5cfswaths)[i];
1372 bool var_is_parsed =
true;
1373 int swath_fieldtype_flag = Check_EOS5Swath_FieldType(var);
1374 if (1 == swath_fieldtype_flag)
1375 var_is_parsed = Set_Var_Dims(eos5cfswath, var, he5s.geo_var_list, he5s.name, num_swaths, SWATH);
1376 else if (0 == swath_fieldtype_flag)
1377 var_is_parsed = Set_Var_Dims(eos5cfswath, var, he5s.data_var_list, he5s.name, num_swaths, SWATH);
1380 var_is_parsed =
false;
1382 if (
false == var_is_parsed) {
1383 map<hsize_t, string> dimsizes_to_dimnames = eos5cfswath->dimsizes_to_dimnames;
1384 Set_NonParse_Var_Dims(eos5cfswath, var, dimsizes_to_dimnames, num_swaths, vartype);
1390 else if (ZA == vartype) {
1392 int num_zas = strmeta_info->za_list.size();
1393 for (
int i = 0; i < num_zas; ++i) {
1394 HE5Za he5z = strmeta_info->za_list.at(i);
1395 if (he5z.name == Obtain_Var_EOS5Type_GroupName(var, vartype)) {
1396 EOS5CFZa *eos5cfza = (this->eos5cfzas)[i];
1397 bool var_is_parsed = Set_Var_Dims(eos5cfza, var, he5z.data_var_list, he5z.name, num_zas, ZA);
1398 if (
false == var_is_parsed) {
1399 map<hsize_t, string> dimsizes_to_dimnames = eos5cfza->dimsizes_to_dimnames;
1400 Set_NonParse_Var_Dims(eos5cfza, var, dimsizes_to_dimnames, num_zas, vartype);
1410 bool EOS5File::Set_Var_Dims(T* eos5data,
Var *var, vector<HE5Var> &he5var,
const string& groupname,
int num_groups,
1414 BESDEBUG(
"h5",
"Coming to Set_Var_Dims"<<endl);
1416 bool is_parsed =
false;
1417 string eos5typestr =
"";
1418 string fslash_str =
"/";
1420 if (GRID == eos5type)
1421 eos5typestr =
"/GRIDS/";
1422 else if (SWATH == eos5type)
1423 eos5typestr =
"/SWATHS/";
1424 else if (ZA == eos5type)
1425 eos5typestr =
"/ZAS/";
1427 throw1(
"Unsupported HDF-EOS5 type, this type is not swath, grid or zonal average");
1429 for (
unsigned int i = 0; i < he5var.size(); i++) {
1431 HE5Var he5v = he5var.at(i);
1433 if (he5v.name == var->name) {
1434 if (he5v.dim_list.size() != var->dims.size())
1435 throw2(
"Number of dimensions don't match with the structmetadata for variable ", var->name);
1465 set<hsize_t> dimsize_have_name_set;
1466 pair<set<hsize_t>::iterator,
bool> setret1;
1467 set<string> thisvar_dimname_set;
1468 pair<set<string>::iterator,
bool> setret2;
1470 for (
unsigned int j = 0; j < he5v.dim_list.size(); j++) {
1471 HE5Dim he5d = he5v.dim_list.at(j);
1472 for (vector<Dimension *>::iterator ird = var->dims.begin(); ird != var->dims.end(); ++ird) {
1474 if ((hsize_t) (he5d.size) == (*ird)->size) {
1476 if (
"" == (*ird)->name) {
1477 string dimname_candidate = eos5typestr + groupname + fslash_str + he5d.name;
1478 setret2 = thisvar_dimname_set.insert(dimname_candidate);
1479 if (
true == setret2.second) {
1480 (*ird)->name = dimname_candidate;
1482 (*ird)->newname = (num_groups == 1) ? he5d.name : (*ird)->name;
1483 eos5data->vardimnames.insert((*ird)->name);
1487 eos5data->dimnames_to_unlimited[(*ird)->name] = (*ird)->unlimited_dim;
1496 for (vector<Dimension *>::iterator ird = var->dims.begin(); ird != var->dims.end(); ++ird) {
1497 if (
"" == (*ird)->name)
1498 Create_Unique_DimName(eos5data, thisvar_dimname_set, *ird, num_groups, eos5type);
1507 void EOS5File::Create_Unique_DimName(T*eos5data, set<string>& thisvar_dimname_set,
Dimension *dim,
int num_groups,
1511 BESDEBUG(
"h5",
"Coming to Create_Unique_DimName"<<endl);
1512 map<hsize_t, string>::iterator itmap1;
1513 map<string, hsize_t>::iterator itmap2;
1514 pair<set<string>::iterator,
bool> setret2;
1515 itmap1 = (eos5data->dimsizes_to_dimnames).find(dim->size);
1522 if (itmap1 != (eos5data->dimsizes_to_dimnames).end()) {
1523 string dimname_candidate = (eos5data->dimsizes_to_dimnames)[dim->size];
1526 setret2 = thisvar_dimname_set.insert(dimname_candidate);
1528 if (
false == setret2.second) {
1531 bool match_some_dimname = Check_All_DimNames(eos5data, dimname_candidate, dim->size);
1533 if (
false == match_some_dimname) {
1536 Get_Unique_Name(eos5data->vardimnames, dimname_candidate);
1537 thisvar_dimname_set.insert(dimname_candidate);
1540 Insert_One_NameSizeMap_Element2(eos5data->dimnames_to_dimsizes, eos5data->dimnames_to_unlimited,
1541 dimname_candidate, dim->size, dim->unlimited_dim);
1542 eos5data->dimsizes_to_dimnames.insert(pair<hsize_t, string>(dim->size, dimname_candidate));
1543 eos5data->dimnames.push_back(dimname_candidate);
1548 dim->name = dimname_candidate;
1550 dim->newname = dim->name;
1552 string dname = HDF5CFUtil::obtain_string_after_lastslash(dim->name);
1554 throw3(
"The dimension name ", dim->name,
" of the variable is not right");
1556 dim->newname = dname;
1562 string Fakedimname = Create_Unique_FakeDimName(eos5data, eos5type);
1563 thisvar_dimname_set.insert(Fakedimname);
1566 Insert_One_NameSizeMap_Element2(eos5data->dimnames_to_dimsizes, eos5data->dimnames_to_unlimited, Fakedimname,
1567 dim->size, dim->unlimited_dim);
1568 eos5data->dimsizes_to_dimnames.insert(pair<hsize_t, string>(dim->size, Fakedimname));
1569 eos5data->dimnames.push_back(Fakedimname);
1570 dim->name = Fakedimname;
1572 dim->newname = dim->name;
1574 string dname = HDF5CFUtil::obtain_string_after_lastslash(dim->name);
1576 throw3(
"The dimension name ", dim->name,
" of the variable is not right");
1578 dim->newname = dname;
1585 bool EOS5File::Check_All_DimNames(T* eos5data,
string& dimname, hsize_t dimsize)
1588 BESDEBUG(
"h5",
"Coming to Check_All_DimNames"<<endl);
1589 bool ret_flag =
false;
1590 for (map<string, hsize_t>::iterator im = eos5data->dimnames_to_dimsizes.begin();
1591 im != eos5data->dimnames_to_dimsizes.end(); ++im) {
1593 if (dimsize == (*im).second && dimname != (*im).first) {
1594 dimname = (*im).first;
1603 void EOS5File::Get_Unique_Name(set<string> & nameset,
string& dimname_candidate)
1606 BESDEBUG(
"h5",
"Coming to Get_Unique_Name"<<endl);
1607 int clash_index = 1;
1608 string temp_clashname = dimname_candidate +
'_';
1609 HDF5CFUtil::gen_unique_name(temp_clashname, nameset, clash_index);
1610 dimname_candidate = temp_clashname;
1615 string EOS5File::Create_Unique_FakeDimName(T*eos5data, EOS5Type eos5type)
1618 BESDEBUG(
"h5",
"Coming to Create_Unique_FakeDimName"<<endl);
1619 string fslash_str =
"/";
1621 if (GRID == eos5type)
1622 eos5typestr =
"/GRIDS/";
1623 else if (SWATH == eos5type)
1624 eos5typestr =
"/SWATHS/";
1625 else if (ZA == eos5type)
1626 eos5typestr =
"/ZAS/";
1628 throw1(
"Unsupported HDF-EOS5 type, this type is not swath, grid or zonal average");
1630 stringstream sfakedimindex;
1631 sfakedimindex << eos5data->addeddimindex;
1632 string fakedimstr =
"FakeDim";
1633 string added_dimname = eos5typestr + eos5data->name + fslash_str + fakedimstr + sfakedimindex.str();
1635 pair<set<string>::iterator,
bool> setret;
1636 setret = eos5data->vardimnames.insert(added_dimname);
1637 if (
false == setret.second) Get_Unique_Name(eos5data->vardimnames, added_dimname);
1638 eos5data->addeddimindex = eos5data->addeddimindex + 1;
1639 return added_dimname;
1643 string EOS5File::Obtain_Var_EOS5Type_GroupName(
Var*var, EOS5Type eos5type)
1646 BESDEBUG(
"h5",
"Coming to Obtain_Var_EOS5Type_GroupName"<<endl);
1647 string EOS5GRIDPATH =
"/HDFEOS/GRIDS";
1648 string EOS5SWATHPATH =
"/HDFEOS/SWATHS";
1649 string EOS5ZAPATH =
"/HDFEOS/ZAS";
1650 size_t eostypename_start_pos = 0;
1651 size_t eostypename_end_pos;
1658 if (GRID == eos5type)
1659 eostypename_start_pos = EOS5GRIDPATH.size() + 1;
1660 else if (SWATH == eos5type)
1661 eostypename_start_pos = EOS5SWATHPATH.size() + 1;
1662 else if (ZA == eos5type)
1663 eostypename_start_pos = EOS5ZAPATH.size() + 1;
1665 throw2(
"Non supported eos5 type for var ", var->fullpath);
1667 eostypename_end_pos = var->fullpath.find(
'/', eostypename_start_pos) - 1;
1668 groupname = var->fullpath.substr(eostypename_start_pos, eostypename_end_pos - eostypename_start_pos + 1);
1670 BESDEBUG(
"h5",
"In Obtain_Var_EOS5Type_GroupName(), the groupname is "<<groupname << endl);
1676 int EOS5File::Check_EOS5Swath_FieldType(
Var*var)
1679 string geofield_relative_path =
"/Geolocation Fields/" + var->name;
1680 string datafield_relative_path =
"/Data Fields/" + var->name;
1684 if (var->fullpath.size() > datafield_relative_path.size()) {
1685 size_t field_pos_in_full_path = var->fullpath.size() - datafield_relative_path.size();
1686 if (var->fullpath.rfind(datafield_relative_path, field_pos_in_full_path) != string::npos) tempflag = 0;
1689 if (tempflag != 0 && (var->fullpath.size() > geofield_relative_path.size())) {
1690 size_t field_pos_in_full_path = var->fullpath.size() - geofield_relative_path.size();
1691 if (var->fullpath.rfind(geofield_relative_path, field_pos_in_full_path) != string::npos) tempflag = 1;
1699 void EOS5File::Set_NonParse_Var_Dims(T*eos5data,
Var* var, map<hsize_t, string>& ,
1700 int num_groups, EOS5Type eos5type)
1703 BESDEBUG(
"h5",
"Coming to Set_NonParse_Var_Dims"<<endl);
1704 map<hsize_t, string>::iterator itmap;
1705 set<string> thisvar_dimname_set;
1707 for (vector<Dimension *>::iterator ird = var->dims.begin(); ird != var->dims.end(); ++ird) {
1708 if (
"" == (*ird)->name)
1709 Create_Unique_DimName(eos5data, thisvar_dimname_set, *ird, num_groups, eos5type);
1711 throw5(
"The dimension name ", (*ird)->name,
" of the variable ", var->name,
" is not right");
1716 void EOS5File::Check_Aura_Product_Status()
1719 BESDEBUG(
"h5",
"Coming to Check_Aura_Product_Status"<<endl);
1722 string eos5_fattr_group_name =
"/HDFEOS/ADDITIONAL/FILE_ATTRIBUTES";
1723 string instrument_attr_name =
"InstrumentName";
1726 for (vector<Group *>::iterator irg = this->groups.begin(); irg != this->groups.end(); ++irg) {
1727 if (eos5_fattr_group_name == (*irg)->path) {
1728 for (vector<Attribute *>::iterator ira = (*irg)->attrs.begin(); ira != (*irg)->attrs.end(); ++ira) {
1729 if (instrument_attr_name == (*ira)->name) {
1730 Retrieve_H5_Attr_Value(*ira, (*irg)->path);
1731 string attr_value((*ira)->value.begin(), (*ira)->value.end());
1732 if (
"OMI" == attr_value) {
1733 this->isaura =
true;
1734 this->aura_name = OMI;
1736 else if (
"MLS Aura" == attr_value) {
1737 this->isaura =
true;
1738 this->aura_name = MLS;
1740 else if (
"TES" == attr_value) {
1741 this->isaura =
true;
1742 this->aura_name = TES;
1744 else if (
"HIRDLS" == attr_value) {
1745 this->isaura =
true;
1746 this->aura_name = HIRDLS;
1755 if (
true == this->isaura) {
1756 eos5_to_cf_attr_map[
"FillValue"] =
"_FillValue";
1757 eos5_to_cf_attr_map[
"MissingValue"] =
"missing_value";
1758 eos5_to_cf_attr_map[
"Units"] =
"units";
1759 eos5_to_cf_attr_map[
"Offset"] =
"add_offset";
1760 eos5_to_cf_attr_map[
"ScaleFactor"] =
"scale_factor";
1761 eos5_to_cf_attr_map[
"ValidRange"] =
"valid_range";
1762 eos5_to_cf_attr_map[
"Title"] =
"title";
1768 void EOS5File::Handle_CVar()
1771 BESDEBUG(
"h5",
"Coming to Handle_CVar()"<<endl);
1774 bool is_augmented = Check_Augmentation_Status();
1777 if(is_augmented) cerr<<
"The file is augmented "<<endl;
1778 else cerr<<
"The file is not augmented "<<endl;
1782 if (this->eos5cfgrids.size() > 0)
1783 Handle_Grid_CVar(is_augmented);
1784 if (this->eos5cfswaths.size() > 0)
1785 Handle_Swath_CVar(is_augmented);
1786 if (this->eos5cfzas.size() > 0)
1787 Handle_Za_CVar(is_augmented);
1790 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin();
1791 irv != this->cvars.end(); irv++) {
1792 cerr<<
"EOS5CVar name "<<(*irv)->name <<endl;
1793 cerr<<
"EOS5CVar dimension name "<< (*irv)->cfdimname <<endl;
1794 cerr<<
"EOS5CVar new name "<<(*irv)->newname <<endl;
1795 cerr<<
"EOS5CVar type is "<<(*irv)->cvartype <<endl;
1803 void EOS5File::Handle_Grid_CVar(
bool is_augmented)
1806 BESDEBUG(
"h5",
"Coming to Handle_Grid_CVar"<<endl);
1807 if (
true == is_augmented) {
1809 Handle_Augmented_Grid_CVar();
1812 Remove_MultiDim_LatLon_EOS5CFGrid();
1815 if (0 == this->eos5cfgrids.size())
return;
1816 if (1 == this->eos5cfgrids.size())
1817 Handle_Single_Nonaugment_Grid_CVar((this->eos5cfgrids)[0]);
1819 Handle_Multi_Nonaugment_Grid_CVar();
1826 bool EOS5File::Check_Augmentation_Status()
1829 BESDEBUG(
"h5",
"Coming to Check_Augmentation_Status()"<<endl);
1830 bool aug_status =
false;
1831 int num_aug_eos5grp = 0;
1833 for (vector<EOS5CFGrid *>::iterator irg = this->eos5cfgrids.begin(); irg != this->eos5cfgrids.end(); ++irg) {
1834 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
1835 bool is_augmented = Check_Augmented_Var_Candidate(*irg, *irv, GRID);
1836 if (
true == is_augmented) {
1843 for (vector<EOS5CFSwath *>::iterator irg = this->eos5cfswaths.begin(); irg != this->eos5cfswaths.end(); ++irg) {
1844 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
1845 bool is_augmented = Check_Augmented_Var_Candidate(*irg, *irv, SWATH);
1846 if (
true == is_augmented) {
1854 for (vector<EOS5CFZa *>::iterator irg = this->eos5cfzas.begin(); irg != this->eos5cfzas.end(); ++irg) {
1855 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
1856 bool is_augmented = Check_Augmented_Var_Candidate(*irg, *irv, ZA);
1857 if (
true == is_augmented) {
1864 int total_num_eos5grp = this->eos5cfgrids.size() + this->eos5cfswaths.size() + this->eos5cfzas.size();
1868 if (num_aug_eos5grp == total_num_eos5grp) aug_status =
true;
1876 bool EOS5File::Check_Augmented_Var_Attrs(
Var *var) {
1880 bool has_dimscale_class =
false;
1881 bool has_reflist =
false;
1882 for (vector<Attribute *>::iterator ira = var->attrs.begin();
1883 ira != var->attrs.end(); ++ira) {
1884 if (
"CLASS" == (*ira)->name) {
1885 Retrieve_H5_Attr_Value(*ira,var->fullpath);
1886 string class_value((*ira)->value.begin(),(*ira)->value.end());
1887 if (
"DIMENSION_SCALE"==class_value)
1888 has_dimscale_class =
true;
1891 if (
"REFERENCE_LIST" == (*ira)->name)
1893 if (
true == has_reflist &&
true == has_dimscale_class)
1897 if (
true == has_reflist &&
true == has_dimscale_class)
1912 bool EOS5File::Check_Augmented_Var_Candidate(T *eos5data,
Var *var, EOS5Type eos5type)
1915 BESDEBUG(
"h5",
"Coming to Check_Augmented_Var_Candidate"<<endl);
1916 bool augmented_var =
false;
1918 string EOS5DATAPATH =
"";
1919 if (GRID == eos5type)
1920 EOS5DATAPATH =
"/HDFEOS/GRIDS/";
1921 else if (ZA == eos5type)
1922 EOS5DATAPATH =
"/HDFEOS/ZAS/";
1923 else if (SWATH == eos5type)
1924 EOS5DATAPATH =
"/HDFEOS/SWATHS/";
1926 throw1(
"Non supported EOS5 type");
1928 string fslash_str =
"/";
1929 string THIS_EOS5DATAPATH = EOS5DATAPATH + eos5data->name + fslash_str;
1932 if (eos5type == Get_Var_EOS5_Type(var)) {
1933 string var_eos5data_name = Obtain_Var_EOS5Type_GroupName(var, eos5type);
1935 if (var_eos5data_name == eos5data->name) {
1936 if (var->fullpath.size() > THIS_EOS5DATAPATH.size()) {
1938 string var_path_after_eos5dataname = var->fullpath.substr(THIS_EOS5DATAPATH.size());
1940 if (var_path_after_eos5dataname == var->name) augmented_var =
true;
1945 return augmented_var;
1950 void EOS5File::Handle_Augmented_Grid_CVar()
1952 BESDEBUG(
"h5",
"Coming to Handle_Augmented_Grid_CVar()"<<endl);
1953 for (vector<EOS5CFGrid *>::iterator irv = this->eos5cfgrids.begin(); irv != this->eos5cfgrids.end(); ++irv)
1954 Handle_Single_Augment_CVar(*irv, GRID);
1959 void EOS5File::Handle_Single_Augment_CVar(T* cfeos5data, EOS5Type eos5type)
1962 BESDEBUG(
"h5",
"Coming to Handle_Single_Augment_CVar()"<<endl);
1963 set<string> tempvardimnamelist;
1964 tempvardimnamelist = cfeos5data->vardimnames;
1965 set<string>::iterator its;
1966 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its) {
1967 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end();) {
1969 bool is_augmented = Check_Augmented_Var_Candidate(cfeos5data, *irv, eos5type);
1971 if (
true == is_augmented) {
1975 string tempdimname = HDF5CFUtil::obtain_string_after_lastslash(*its);
1978 if (tempdimname == (*irv)->name) {
1985 EOS5cvar->cfdimname = *its;
1986 EOS5cvar->cvartype = CV_EXIST;
1987 EOS5cvar->eos_type = eos5type;
1990 this->cvars.push_back(EOS5cvar);
1994 irv = this->vars.erase(irv);
2006 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
2007 its = tempvardimnamelist.find((*irv)->cfdimname);
2008 if (its != tempvardimnamelist.end()) tempvardimnamelist.erase(its);
2011 if (
false == tempvardimnamelist.empty())
2012 throw1(
"Augmented files still need to provide more coordinate variables");
2018 void EOS5File::Remove_MultiDim_LatLon_EOS5CFGrid()
2021 BESDEBUG(
"h5",
"Coming to Remove_MultiDim_LatLon_EOS5CFGrid()"<<endl);
2022 for (vector<EOS5CFGrid *>::iterator irg = this->eos5cfgrids.begin(); irg != this->eos5cfgrids.end();) {
2033 bool irg_erase =
false;
2035 if (
true == (*irg)->has_2dlatlon) {
2037 if ((
true == this->isaura) && (OMI == this->aura_name) && (HE5_GCTP_GEO == (*irg)->eos5_projcode))
2041 string EOS5GRIDPATH =
"/HDFEOS/GRIDS/";
2042 string fslash_str =
"/";
2043 string THIS_EOS5GRIDPATH = EOS5GRIDPATH + (*irg)->name + fslash_str;
2044 int catch_latlon = 0;
2046 for (vector<Var *>::iterator irv = this->vars.begin(); (irv != this->vars.end()) && (catch_latlon != 2);
2048 if (GRID == Get_Var_EOS5_Type(*irv) && ((*irv)->fullpath.size() > THIS_EOS5GRIDPATH.size())) {
2050 string var_grid_name = Obtain_Var_EOS5Type_GroupName(*irv, GRID);
2051 if (var_grid_name == (*irg)->name) {
2052 if ((
"Longitude" == (*irv)->name) || (
"Latitude" == (*irv)->name)) {
2056 irv = this->vars.erase(irv);
2070 if (2 == catch_latlon) {
2071 (*irg)->has_nolatlon =
true;
2072 (*irg)->has_2dlatlon =
false;
2078 irg = this->eos5cfgrids.erase(irg);
2083 if (
false == irg_erase) {
2090 for (vector<EOS5CFGrid *>::iterator irg = this->eos5cfgrids.begin(); irg != this->eos5cfgrids.end();) {
2092 if (
true == (*irg)->has_g2dlatlon) {
2094 irg = this->eos5cfgrids.erase(irg);
2103 void EOS5File::Handle_Single_Nonaugment_Grid_CVar(
EOS5CFGrid* cfgrid)
2106 BESDEBUG(
"h5",
"Coming to Handle_Single_Nonaugment_Grid_CVar()"<<endl);
2107 set<string> tempvardimnamelist;
2108 tempvardimnamelist = cfgrid->vardimnames;
2111 bool use_own_latlon =
false;
2112 if (
true == cfgrid->has_1dlatlon)
2113 use_own_latlon = Handle_Single_Nonaugment_Grid_CVar_OwnLatLon(cfgrid, tempvardimnamelist);
2115 if(use_own_latlon)
"h5",
"using 1D latlon"<<endl;
2116 else "h5",
"use_own_latlon is false "<<endl;
2119 if (
false == use_own_latlon) {
2120 bool use_eos5_latlon =
false;
2121 use_eos5_latlon = Handle_Single_Nonaugment_Grid_CVar_EOS5LatLon(cfgrid, tempvardimnamelist);
2124 if (
false == use_eos5_latlon)
return;
2128 Handle_NonLatLon_Grid_CVar(cfgrid, tempvardimnamelist);
2133 bool EOS5File::Handle_Single_Nonaugment_Grid_CVar_OwnLatLon(
EOS5CFGrid *cfgrid, set<string>& tempvardimnamelist)
2137 BESDEBUG(
"h5",
"Coming to Handle_Single_Nonaugment_Grid_CVar_OwnLatLon()"<<endl);
2138 set<string>::iterator its;
2139 string EOS5GRIDPATH =
"/HDFEOS/GRIDS/";
2140 string fslash_str =
"/";
2141 string THIS_EOS5GRIDPATH = EOS5GRIDPATH + cfgrid->name + fslash_str;
2144 bool find_latydim =
false;
2145 bool find_lonxdim =
false;
2147 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
2148 if (GRID == Get_Var_EOS5_Type(*irv) && ((*irv)->fullpath.size() > THIS_EOS5GRIDPATH.size())) {
2150 string var_grid_name = Obtain_Var_EOS5Type_GroupName(*irv, GRID);
2151 if ((var_grid_name == cfgrid->name) && ((*irv)->name ==
"Latitude")) {
2153 string tempdimname = (((*irv)->dims)[0])->name;
2155 if (
"YDim" == HDF5CFUtil::obtain_string_after_lastslash(tempdimname)) {
2161 EOS5cvar->cfdimname = tempdimname;
2162 EOS5cvar->cvartype = CV_EXIST;
2163 EOS5cvar->eos_type = GRID;
2166 this->cvars.push_back(EOS5cvar);
2170 this->vars.erase(irv);
2173 find_latydim =
true;
2180 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
2182 if (GRID == Get_Var_EOS5_Type(*irv) && ((*irv)->fullpath.size() > THIS_EOS5GRIDPATH.size())) {
2184 string var_grid_name = Obtain_Var_EOS5Type_GroupName(*irv, GRID);
2186 if ((var_grid_name == cfgrid->name) && ((*irv)->name ==
"Longitude")) {
2188 string tempdimname = (((*irv)->dims)[0])->name;
2190 if (
"XDim" == HDF5CFUtil::obtain_string_after_lastslash(tempdimname)) {
2196 EOS5cvar->cfdimname = tempdimname;
2197 EOS5cvar->cvartype = CV_EXIST;
2198 EOS5cvar->eos_type = GRID;
2201 this->cvars.push_back(EOS5cvar);
2205 this->vars.erase(irv);
2206 find_lonxdim =
true;
2213 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
2214 its = tempvardimnamelist.find((*irv)->cfdimname);
2215 if (its != tempvardimnamelist.end()) tempvardimnamelist.erase(its);
2220 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its)
2221 "h5",
"tempvardim "<<*its <<endl;
2224 return (find_latydim ==
true && find_lonxdim ==
true);
2228 bool EOS5File::Handle_Single_Nonaugment_Grid_CVar_EOS5LatLon(
EOS5CFGrid *cfgrid, set<string>& tempvardimnamelist)
2232 BESDEBUG(
"h5",
"Coming to Handle_Single_Nonaugment_Grid_CVar_EOS5LatLon()"<<endl);
2235 bool find_ydim =
false;
2236 bool find_xdim =
false;
2237 set<string>::iterator its;
2240 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its)
2241 cerr<<
"dim names "<<(*its) <<endl;
2244 string ydim_full_path;
2245 string xdim_full_path;
2247 if (cfgrid->eos5_projcode != HE5_GCTP_GEO) {
2249 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its) {
2250 if (
"YDim" == HDF5CFUtil::obtain_string_after_lastslash(*its))
2251 ydim_full_path = *its;
2252 else if (
"XDim" == HDF5CFUtil::obtain_string_after_lastslash(*its)) xdim_full_path = *its;
2257 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end();) {
2258 if (
"YDim" == HDF5CFUtil::obtain_string_after_lastslash(*its)) {
2262 EOS5cvar->name =
"lat";
2263 Create_Added_Var_NewName_FullPath(GRID, cfgrid->name, EOS5cvar->name, EOS5cvar->newname,
2264 EOS5cvar->fullpath);
2266 if (cfgrid->eos5_projcode != HE5_GCTP_GEO) {
2268 EOS5cvar->dtype = H5FLOAT64;
2272 EOS5cvar->dtype = H5FLOAT32;
2276 eos5cvar_dim->name = *its;
2277 eos5cvar_dim->newname = (this->eos5cfgrids.size() == 1) ?
"YDim" : *its;
2278 EOS5cvar->dims.push_back(eos5cvar_dim);
2279 EOS5cvar->cfdimname = eos5cvar_dim->name;
2281 if (EOS5cvar->rank == 2) {
2283 eos5cvar_dim =
new Dimension((hsize_t) cfgrid->xdimsize);
2284 eos5cvar_dim->name = xdim_full_path;
2285 eos5cvar_dim->newname = (this->eos5cfgrids.size() == 1) ?
"XDim" : xdim_full_path;
2286 EOS5cvar->dims.push_back(eos5cvar_dim);
2289 EOS5cvar->cvartype = CV_LAT_MISS;
2290 EOS5cvar->eos_type = GRID;
2291 EOS5cvar->xdimsize = cfgrid->xdimsize;
2292 EOS5cvar->ydimsize = cfgrid->ydimsize;
2295 EOS5cvar->point_lower = cfgrid->point_lower;
2296 EOS5cvar->point_upper = cfgrid->point_upper;
2297 EOS5cvar->point_left = cfgrid->point_left;
2298 EOS5cvar->point_right = cfgrid->point_right;
2299 EOS5cvar->eos5_pixelreg = cfgrid->eos5_pixelreg;
2300 EOS5cvar->eos5_origin = cfgrid->eos5_origin;
2301 EOS5cvar->eos5_projcode = cfgrid->eos5_projcode;
2303 for (
unsigned int k = 0; k < 13; k++)
2304 EOS5cvar->param[k] = cfgrid->param[k];
2306 EOS5cvar->zone = cfgrid->zone;
2307 EOS5cvar->sphere = cfgrid->sphere;
2310 this->cvars.push_back(EOS5cvar);
2314 tempvardimnamelist.erase(its++);
2318 else if (
"XDim" == HDF5CFUtil::obtain_string_after_lastslash(*its)) {
2322 EOS5cvar->name =
"lon";
2323 Create_Added_Var_NewName_FullPath(GRID, cfgrid->name, EOS5cvar->name, EOS5cvar->newname,
2324 EOS5cvar->fullpath);
2329 if (cfgrid->eos5_projcode != HE5_GCTP_GEO) {
2331 EOS5cvar->dtype = H5FLOAT64;
2335 EOS5cvar->dtype = H5FLOAT32;
2339 if (EOS5cvar->rank == 2) {
2340 eos5cvar_dim =
new Dimension((hsize_t) cfgrid->ydimsize);
2344 eos5cvar_dim->name = ydim_full_path;
2345 eos5cvar_dim->newname = (this->eos5cfgrids.size() == 1) ?
"YDim" : ydim_full_path;
2346 EOS5cvar->dims.push_back(eos5cvar_dim);
2349 eos5cvar_dim =
new Dimension((hsize_t) cfgrid->xdimsize);
2353 eos5cvar_dim->name = *its;
2354 eos5cvar_dim->newname = (this->eos5cfgrids.size() == 1) ?
"XDim" : *its;
2355 EOS5cvar->dims.push_back(eos5cvar_dim);
2356 EOS5cvar->cfdimname = eos5cvar_dim->name;
2358 EOS5cvar->cvartype = CV_LON_MISS;
2359 EOS5cvar->eos_type = GRID;
2360 EOS5cvar->xdimsize = cfgrid->xdimsize;
2361 EOS5cvar->ydimsize = cfgrid->ydimsize;
2364 EOS5cvar->point_lower = cfgrid->point_lower;
2365 EOS5cvar->point_upper = cfgrid->point_upper;
2366 EOS5cvar->point_left = cfgrid->point_left;
2367 EOS5cvar->point_right = cfgrid->point_right;
2368 EOS5cvar->eos5_pixelreg = cfgrid->eos5_pixelreg;
2369 EOS5cvar->eos5_origin = cfgrid->eos5_origin;
2370 EOS5cvar->eos5_projcode = cfgrid->eos5_projcode;
2371 for (
unsigned int k = 0; k < 13; k++)
2372 EOS5cvar->param[k] = cfgrid->param[k];
2373 EOS5cvar->zone = cfgrid->zone;
2374 EOS5cvar->sphere = cfgrid->sphere;
2377 this->cvars.push_back(EOS5cvar);
2380 tempvardimnamelist.erase(its++);
2386 if (
true == find_xdim &&
true == find_ydim)
break;
2389 return (
true == find_xdim &&
true == find_ydim);
2393 void EOS5File::Handle_NonLatLon_Grid_CVar(
EOS5CFGrid *cfgrid, set<string>& tempvardimnamelist)
2397 set<string>::iterator its;
2398 int num_dimnames = tempvardimnamelist.size();
2399 bool has_dimnames =
true;
2401 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its) {
2402 if (cfgrid->dnames_to_1dvnames.find(*its) != cfgrid->dnames_to_1dvnames.end()) {
2403 for (vector<Var *>::iterator irv = this->vars.begin(); has_dimnames && (irv != this->vars.end());) {
2407 if (GRID == Get_Var_EOS5_Type(*irv) && (*irv)->newname == (cfgrid->dnames_to_1dvnames)[*its]) {
2414 EOS5cvar->cfdimname = *its;
2415 EOS5cvar->cvartype = CV_EXIST;
2416 EOS5cvar->eos_type = GRID;
2419 this->cvars.push_back(EOS5cvar);
2423 irv = this->vars.erase(irv);
2425 if (0 == num_dimnames) has_dimnames =
false;
2435 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
2436 its = tempvardimnamelist.find((*irv)->cfdimname);
2437 if (its != tempvardimnamelist.end()) tempvardimnamelist.erase(its);
2441 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its) {
2444 Create_Missing_CV(cfgrid, EOS5cvar, *its, GRID, this->eos5cfgrids.size());
2445 this->cvars.push_back(EOS5cvar);
2451 void EOS5File::Handle_Multi_Nonaugment_Grid_CVar()
2454 BESDEBUG(
"h5",
"Coming to Handle_Multi_nonaugment_Grid_CVar()"<<endl);
2458 if (
true == this->grids_multi_latloncvs) {
2459 for (vector<EOS5CFGrid *>::iterator irv = this->eos5cfgrids.begin(); irv != this->eos5cfgrids.end(); ++irv)
2460 Handle_Single_Nonaugment_Grid_CVar(*irv);
2471 int num_1dlatlon_pairs = 0;
2472 for (vector<EOS5CFGrid *>::iterator irv = this->eos5cfgrids.begin(); irv != this->eos5cfgrids.end(); ++irv)
2473 if (
true == (*irv)->has_1dlatlon) num_1dlatlon_pairs++;
2475 bool use_eos5_latlon =
false;
2476 if ((0 == num_1dlatlon_pairs)
2477 || ((num_1dlatlon_pairs == (
int) (this->eos5cfgrids.size())) && (
true == this->isaura))) {
2478 set<string> tempvardimnamelist = ((this->eos5cfgrids)[0])->vardimnames;
2479 if (0 == num_1dlatlon_pairs) {
2480 use_eos5_latlon = Handle_Single_Nonaugment_Grid_CVar_EOS5LatLon((this->eos5cfgrids)[0],
2481 tempvardimnamelist);
2483 if (
false == use_eos5_latlon)
return;
2488 bool use_own_latlon =
false;
2489 use_own_latlon = Handle_Single_Nonaugment_Grid_CVar_OwnLatLon((this->eos5cfgrids)[0],
2490 tempvardimnamelist);
2491 if (
false == use_own_latlon) {
2492 use_eos5_latlon = Handle_Single_Nonaugment_Grid_CVar_EOS5LatLon((this->eos5cfgrids)[0],
2493 tempvardimnamelist);
2494 if (
false == use_eos5_latlon)
return;
2499 Handle_NonLatLon_Grid_CVar((this->eos5cfgrids)[0], tempvardimnamelist);
2502 for (
unsigned j = 1; j < this->eos5cfgrids.size(); j++)
2503 (this->eos5cfgrids)[j]->Update_Dimnamelist();
2506 Adjust_EOS5GridDimNames((this->eos5cfgrids)[0]);
2509 for (
unsigned j = 1; j < this->eos5cfgrids.size(); j++) {
2510 tempvardimnamelist = (this->eos5cfgrids)[j]->vardimnames;
2511 Handle_NonLatLon_Grid_CVar((this->eos5cfgrids)[j], tempvardimnamelist);
2512 tempvardimnamelist.clear();
2518 this->grids_multi_latloncvs =
true;
2519 for (vector<EOS5CFGrid *>::iterator irv = this->eos5cfgrids.begin(); irv != this->eos5cfgrids.end(); ++irv)
2520 Handle_Single_Nonaugment_Grid_CVar(*irv);
2528 void EOS5File::Adjust_EOS5GridDimNames(
EOS5CFGrid *cfgrid)
2531 BESDEBUG(
"h5",
"Coming to Adjust_EOS5GridDimNames()"<<endl);
2534 bool find_xdim =
false;
2535 bool find_ydim =
false;
2537 for (set<string>::iterator it = cfgrid->vardimnames.begin(); it != cfgrid->vardimnames.end(); ++it) {
2538 string xydimname_candidate = HDF5CFUtil::obtain_string_after_lastslash(*it);
2539 if (
"XDim" == xydimname_candidate) {
2543 else if (
"YDim" == xydimname_candidate) {
2547 if (find_xdim && find_ydim)
break;
2550 if (
false == find_xdim ||
false == find_ydim)
2551 throw2(
"Cannot find Dimension name that includes XDim or YDim in the grid ", cfgrid->name);
2553 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
2554 if (GRID == Get_Var_EOS5_Type(*irv)) {
2555 for (vector<Dimension *>::iterator
id = (*irv)->dims.begin();
id != (*irv)->dims.end(); ++
id) {
2556 string xydimname_candidate = HDF5CFUtil::obtain_string_after_lastslash((*id)->name);
2557 if (
"XDim" == xydimname_candidate)
2558 (*id)->name = xdimname;
2559 else if (
"YDim" == xydimname_candidate) (*id)->name = ydimname;
2566 void EOS5File::Handle_Swath_CVar(
bool isaugmented)
2569 BESDEBUG(
"h5",
"Coming to Handle_Swath_CVar()"<<endl);
2573 for (vector<EOS5CFSwath *>::iterator irs = this->eos5cfswaths.begin(); irs != this->eos5cfswaths.end();) {
2574 if ((*irs)->has_1dlatlon) {
2575 Handle_Single_1DLatLon_Swath_CVar(*irs, isaugmented);
2578 else if ((*irs)->has_2dlatlon) {
2579 Handle_Single_2DLatLon_Swath_CVar(*irs, isaugmented);
2589 irs = this->eos5cfswaths.erase(irs);
2595 void EOS5File::Handle_Single_1DLatLon_Swath_CVar(
EOS5CFSwath *cfswath,
bool is_augmented)
2598 BESDEBUG(
"h5",
"Coming to Handle_Single_1DLatLon_Swath_CVar"<<endl);
2600 set<string>::iterator its;
2601 set<string> tempvardimnamelist = cfswath->vardimnames;
2602 string EOS5SWATHPATH =
"/HDFEOS/SWATHS/";
2603 string fslash_str =
"/";
2604 string THIS_EOS5SWATHPATH = EOS5SWATHPATH + cfswath->name + fslash_str;
2606 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its)
2607 cerr<<
"Dimension name befor latitude " << *its << endl;
2612 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
2613 if (SWATH == Get_Var_EOS5_Type(*irv) && ((*irv)->fullpath.size() > THIS_EOS5SWATHPATH.size())) {
2615 string var_swath_name = Obtain_Var_EOS5Type_GroupName(*irv, SWATH);
2616 if ((var_swath_name == cfswath->name) && ((*irv)->name ==
"Latitude")) {
2623 EOS5cvar->cfdimname = ((*irv)->dims)[0]->name;
2624 EOS5cvar->cvartype = CV_EXIST;
2625 EOS5cvar->eos_type = SWATH;
2628 this->cvars.push_back(EOS5cvar);
2632 this->vars.erase(irv);
2642 bool find_lat_dim =
false;
2643 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its) {
2645 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
2646 if (((*irv)->name ==
"Latitude") && (*irv)->cfdimname == (*its)) {
2647 tempvardimnamelist.erase(its);
2648 find_lat_dim =
true;
2653 if (
true == find_lat_dim)
break;
2657 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its)
2658 cerr<<
"Dimension name afte latitude " << *its << endl;
2661 Handle_NonLatLon_Swath_CVar(cfswath, tempvardimnamelist);
2664 if (
true == is_augmented) {
2665 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end();) {
2667 if (SWATH == Get_Var_EOS5_Type(*irv)) {
2669 string my_swath_short_path = (*irv)->fullpath.substr(EOS5SWATHPATH.size());
2670 size_t first_fslash_pos = my_swath_short_path.find_first_of(
"/");
2671 string my_swath_name = my_swath_short_path.substr(0,first_fslash_pos);
2674 string my_swath_name = Obtain_Var_EOS5Type_GroupName(*irv, SWATH);
2676 if (my_swath_name == cfswath->name) {
2677 string var_path_after_swathname = (*irv)->fullpath.substr(THIS_EOS5SWATHPATH.size());
2678 if (var_path_after_swathname == (*irv)->name) {
2680 irv = this->vars.erase(irv);
2698 void EOS5File::Handle_Single_2DLatLon_Swath_CVar(
EOS5CFSwath *cfswath,
bool is_augmented)
2701 BESDEBUG(
"h5",
"Coming to Handle_Single_2DLatLon_Swath_CVar()"<<endl);
2703 set<string>::iterator its;
2704 set<string> tempvardimnamelist = cfswath->vardimnames;
2705 string EOS5SWATHPATH =
"/HDFEOS/SWATHS/";
2706 string fslash_str =
"/";
2707 string THIS_EOS5SWATHPATH = EOS5SWATHPATH + cfswath->name + fslash_str;
2708 bool find_lat =
false;
2709 bool find_lon =
false;
2712 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its)
2713 cerr<<
"Dimension name befor latitude " << *its << endl;
2717 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end();) {
2718 if (SWATH == Get_Var_EOS5_Type(*irv) && ((*irv)->fullpath.size() > THIS_EOS5SWATHPATH.size())) {
2719 string var_swath_name = Obtain_Var_EOS5Type_GroupName(*irv, SWATH);
2720 if ((var_swath_name == cfswath->name) && ((*irv)->name ==
"Latitude")) {
2727 EOS5cvar->cfdimname = ((*irv)->dims)[0]->name;
2728 EOS5cvar->cvartype = CV_EXIST;
2729 EOS5cvar->eos_type = SWATH;
2730 EOS5cvar->is_2dlatlon =
true;
2733 this->cvars.push_back(EOS5cvar);
2737 irv = this->vars.erase(irv);
2740 else if ((var_swath_name == cfswath->name) && ((*irv)->name ==
"Longitude")) {
2747 EOS5cvar->cfdimname = ((*irv)->dims)[1]->name;
2748 EOS5cvar->cvartype = CV_EXIST;
2749 EOS5cvar->eos_type = SWATH;
2750 EOS5cvar->is_2dlatlon =
true;
2753 this->cvars.push_back(EOS5cvar);
2757 irv = this->vars.erase(irv);
2769 if (
true == find_lat &&
true == find_lon)
break;
2774 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its) {
2775 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
2776 if (((*irv)->name ==
"Latitude") && (*irv)->cfdimname == (*its)) {
2777 tempvardimnamelist.erase(its);
2783 if (
true == find_lat)
break;
2788 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its) {
2790 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
2792 if (((*irv)->name ==
"Longitude") && (*irv)->cfdimname == (*its)) {
2793 tempvardimnamelist.erase(its);
2799 if (
true == find_lon)
break;
2803 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its)
2804 cerr<<
"Dimension name afte latitude " << *its << endl;
2807 Handle_NonLatLon_Swath_CVar(cfswath, tempvardimnamelist);
2814 if (
true == is_augmented) {
2815 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end();) {
2817 if (SWATH == Get_Var_EOS5_Type(*irv)) {
2819 string my_swath_name = Obtain_Var_EOS5Type_GroupName(*irv, SWATH);
2820 if (my_swath_name == cfswath->name) {
2821 string var_path_after_swathname = (*irv)->fullpath.substr(THIS_EOS5SWATHPATH.size());
2822 if (var_path_after_swathname == (*irv)->name) {
2824 irv = this->vars.erase(irv);
2842 void EOS5File::Handle_NonLatLon_Swath_CVar(
EOS5CFSwath *cfswath, set<string>& tempvardimnamelist)
2845 BESDEBUG(
"h5",
"Coming to Handle_NonLatLon_Swath_CVar()"<<endl);
2847 set<string>::iterator its;
2848 int num_dimnames = tempvardimnamelist.size();
2849 bool has_dimnames =
true;
2850 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its) {
2851 if (cfswath->dnames_to_geo1dvnames.find(*its) != cfswath->dnames_to_geo1dvnames.end()) {
2852 for (vector<Var *>::iterator irv = this->vars.begin(); has_dimnames && (irv != this->vars.end());) {
2857 if (SWATH == Get_Var_EOS5_Type(*irv) && (*irv)->newname == (cfswath->dnames_to_geo1dvnames)[*its]) {
2864 EOS5cvar->cfdimname = *its;
2865 EOS5cvar->cvartype = CV_EXIST;
2866 EOS5cvar->eos_type = SWATH;
2869 this->cvars.push_back(EOS5cvar);
2873 irv = this->vars.erase(irv);
2876 if (0 == num_dimnames) has_dimnames =
false;
2886 for (vector<EOS5CVar *>::iterator 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 (vector<EOS5CVar *>::iterator 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);
2912 void 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 = NULL;
2932 for (vector<Group *>::iterator irg = this->groups.begin(); irg != this->groups.end(); ++irg) {
2933 if (eos5_swath_group_name == (*irg)->path) {
2934 for (vector<Attribute *>::iterator 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 set<string>::iterator it;
2966 for (it = tempvardimnamelist.begin(); it != tempvardimnamelist.end(); ++it) {
2967 if ((*it).find(dimname_candidate) != string::npos) {
2968 hsize_t dimsize_candidate = 0;
2969 if ((cfswath->dimnames_to_dimsizes).find(*it) != (cfswath->dimnames_to_dimsizes).end())
2970 dimsize_candidate = cfswath->dimnames_to_dimsizes[*it];
2972 throw2(
"Cannot find the dimension size of the dimension name ", *it);
2979 for (vector<Attribute *>::iterator ira = vc_group->attrs.begin(); ira != vc_group->attrs.end();
2981 if ((eos5_pre_attr_name == (*ira)->name) && ((*ira)->count == (dimsize_candidate - 1))) {
2986 string reduced_dimname = HDF5CFUtil::obtain_string_after_lastslash(*it);
2987 string orig_dimname =
"nLevels";
2988 if (
"nLevels" == reduced_dimname)
2989 EOS5cvar->name = eos5_pre_attr_name +
"_CV";
2992 EOS5cvar->name = eos5_pre_attr_name +
"_CV"
2993 + reduced_dimname.substr(orig_dimname.size());
2994 Create_Added_Var_NewName_FullPath(SWATH, cfswath->name, EOS5cvar->name, EOS5cvar->newname,
2995 EOS5cvar->fullpath);
2997 EOS5cvar->dtype = (*ira)->dtype;
2999 eos5cvar_dim->name = *it;
3000 if (1 == this->eos5cfswaths.size())
3001 eos5cvar_dim->newname = reduced_dimname;
3003 eos5cvar_dim->newname = eos5cvar_dim->name;
3005 EOS5cvar->dims.push_back(eos5cvar_dim);
3006 EOS5cvar->cvartype = CV_SPECIAL;
3007 EOS5cvar->cfdimname = eos5cvar_dim->name;
3008 EOS5cvar->eos_type = SWATH;
3011 this->cvars.push_back(EOS5cvar);
3021 void EOS5File::Handle_Za_CVar(
bool isaugmented)
3024 BESDEBUG(
"h5",
"Coming to Handle_Za_CVar()"<<endl);
3026 if (
false == isaugmented)
return;
3028 for (vector<EOS5CFZa *>::iterator irv = this->eos5cfzas.begin(); irv != this->eos5cfzas.end(); ++irv)
3029 Handle_Single_Augment_CVar(*irv, ZA);
3034 void EOS5File::Adjust_Var_Dim_NewName_Before_Flattening()
3037 BESDEBUG(
"h5",
"Coming to Adjust_Var_Dim_NewName_Before_Flattening()"<<endl);
3038 int num_grids = this->eos5cfgrids.size();
3039 int num_swaths = this->eos5cfswaths.size();
3040 int num_zas = this->eos5cfzas.size();
3042 bool mixed_eos5typefile =
false;
3045 if (((num_grids > 0) && (num_swaths > 0)) || ((num_grids > 0) && (num_zas > 0))
3046 || ((num_swaths > 0) && (num_zas > 0))) mixed_eos5typefile =
true;
3049 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv)
3050 Adjust_Per_Var_Dim_NewName_Before_Flattening(*irv, mixed_eos5typefile, num_grids, num_swaths, num_zas);
3052 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv)
3053 Adjust_Per_Var_Dim_NewName_Before_Flattening(*irv, mixed_eos5typefile, num_grids, num_swaths, num_zas);
3055 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin();
3056 irv != this->cvars.end(); ++irv) {
3057 cerr<<
"eos5svar var new name "<<(*irv)->newname <<endl;
3058 for (vector<Dimension *>::iterator ird = (*irv)->dims.begin();
3059 ird !=(*irv)->dims.end(); ++ird) {
3060 cerr<<
"eos5svar dimension new name "<<(*ird)->newname <<endl;
3065 Adjust_SharedLatLon_Grid_Var_Dim_Name();
3071 void EOS5File::Adjust_Per_Var_Dim_NewName_Before_Flattening(T* var,
bool mixed_eos5type,
int num_grids,
int num_swaths,
3075 BESDEBUG(
"h5",
"Coming to Adjust_Per_Var_Dim_NewName_Before_Flattening()"<<endl);
3078 EOS5Type vartype = Get_Var_EOS5_Type(var);
3082 eos5typestr =
"/GRIDS/";
3083 if (
false == mixed_eos5type) {
3085 var->newname = ((1 == this->orig_num_grids) ? var->name : var->newname.substr(eos5typestr.size()));
3087 var->newname = ((1 == num_grids) ? var->name : var->newname.substr(eos5typestr.size()));
3102 if (num_grids > 1) {
3103 for (vector<Dimension *>::iterator ird = var->dims.begin(); ird != var->dims.end(); ird++) {
3104 if ((*ird)->newname.size() <= eos5typestr.size())
3105 throw5(
"The size of the dimension new name ", (*ird)->newname,
"of variable ", var->newname,
3107 (*ird)->newname = (*ird)->newname.substr(eos5typestr.size());
3113 var->newname = ((1 == num_grids) ? (eos5typestr + var->name) : var->newname);
3119 eos5typestr =
"/SWATHS/";
3120 if (
false == mixed_eos5type) {
3121 var->newname = ((1 == num_swaths) ? var->name : var->newname.substr(eos5typestr.size()));
3122 if (num_swaths > 1) {
3123 for (vector<Dimension *>::iterator ird = var->dims.begin(); ird != var->dims.end(); ird++) {
3124 if ((*ird)->newname.size() <= eos5typestr.size())
3125 throw5(
"The size of the dimension new name ", (*ird)->newname,
"of variable ", var->newname,
3127 (*ird)->newname = (*ird)->newname.substr(eos5typestr.size());
3132 var->newname = ((1 == num_swaths) ? (eos5typestr + var->name) : var->newname);
3138 eos5typestr =
"/ZAS/";
3139 if (
false == mixed_eos5type) {
3140 var->newname = ((1 == num_zas) ? var->name : var->newname.substr(eos5typestr.size()));
3142 for (vector<Dimension *>::iterator ird = var->dims.begin(); ird != var->dims.end(); ird++) {
3143 if ((*ird)->newname.size() <= eos5typestr.size())
3144 throw5(
"The size of the dimension new name ", (*ird)->newname,
"of variable ", var->newname,
3146 (*ird)->newname = (*ird)->newname.substr(eos5typestr.size());
3151 var->newname = ((1 == num_zas) ? (eos5typestr + var->name) : var->newname);
3158 throw1(
"Non-supported EOS type");
3164 void EOS5File::Adjust_SharedLatLon_Grid_Var_Dim_Name()
3167 BESDEBUG(
"h5",
"Adjust_SharedLatLon_Grid_Var_Dim_Name()"<<endl);
3172 if ((this->eos5cfgrids.size() > 1) && (0 == this->eos5cfswaths.size()) && (0 == this->eos5cfzas.size())
3173 && (
false == this->grids_multi_latloncvs)) {
3177 string lat_dimnewname;
3179 string lon_dimnewname;
3180 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
3181 if (
"lat" == (*irv)->name ||
"Latitude" == (*irv)->name) {
3182 (*irv)->newname = (*irv)->name;
3183 lat_dimnewname = (((*irv)->dims)[0])->newname;
3184 lat_dimnewname = HDF5CFUtil::obtain_string_after_lastslash(lat_dimnewname);
3185 if (
"" == lat_dimnewname)
3186 throw2(
"/ is not included in the dimension new name ", (((*irv)->dims)[0])->newname);
3187 (((*irv)->dims)[0])->newname = lat_dimnewname;
3188 lat_dimname = (*irv)->cfdimname;
3190 else if (
"lon" == (*irv)->name ||
"Longitude" == (*irv)->name) {
3191 (*irv)->newname = (*irv)->name;
3192 lon_dimnewname = (((*irv)->dims)[0])->newname;
3193 lon_dimnewname = HDF5CFUtil::obtain_string_after_lastslash(lon_dimnewname);
3194 if (
"" == lon_dimnewname)
3195 throw2(
"/ is not included in the dimension new name ", (((*irv)->dims)[0])->newname);
3196 (((*irv)->dims)[0])->newname = lon_dimnewname;
3197 lon_dimname = (*irv)->cfdimname;
3201 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
3202 for (vector<Dimension *>::iterator ird = (*irv)->dims.begin(); ird != (*irv)->dims.end(); ++ird) {
3203 if ((*ird)->name == lat_dimname)
3204 (*ird)->newname = lat_dimnewname;
3205 else if ((*ird)->name == lon_dimname) (*ird)->newname = lon_dimnewname;
3212 void EOS5File::Flatten_Obj_Name(
bool include_attr)
3215 BESDEBUG(
"h5",
"Coming to Flatten_Obj_Name()"<<endl);
3216 File::Flatten_Obj_Name(include_attr);
3218 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
3219 (*irv)->newname = get_CF_string((*irv)->newname);
3221 for (vector<Dimension *>::iterator ird = (*irv)->dims.begin(); ird != (*irv)->dims.end(); ++ird) {
3222 (*ird)->newname = get_CF_string((*ird)->newname);
3225 if (
true == include_attr) {
3226 for (vector<Attribute *>::iterator ira = (*irv)->attrs.begin(); ira != (*irv)->attrs.end(); ++ira) {
3227 (*ira)->newname = File::get_CF_string((*ira)->newname);
3234 void EOS5File::Handle_Obj_NameClashing(
bool include_attr)
3237 BESDEBUG(
"h5",
"Coming to Handle_Obj_NameClashing()"<<endl);
3241 set<string> objnameset;
3242 Handle_EOS5CVar_NameClashing(objnameset);
3243 File::Handle_GeneralObj_NameClashing(include_attr, objnameset);
3244 if (
true == include_attr) {
3245 Handle_EOS5CVar_AttrNameClashing();
3254 void EOS5File::Handle_EOS5CVar_NameClashing(set<string> &objnameset)
3257 BESDEBUG(
"h5",
"Coming to Handle_EOS5CVar_NameClashing()"<<endl);
3258 EOS5Handle_General_NameClashing(objnameset, this->cvars);
3262 void EOS5File::Handle_EOS5CVar_AttrNameClashing()
3265 BESDEBUG(
"h5",
"Coming to Handle_EOS5CVar_AttrNameClashing()"<<endl);
3266 set<string> objnameset;
3268 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
3269 Handle_General_NameClashing(objnameset, (*irv)->attrs);
3275 template<
class T>
void EOS5File::EOS5Handle_General_NameClashing(set<string>&objnameset, vector<T*>& objvec)
3279 BESDEBUG(
"h5",
"Coming to EOS5Handle_General_NameClashing()"<<endl);
3280 pair<set<string>::iterator,
bool> setret;
3281 set<string>::iterator iss;
3283 vector<string> clashnamelist;
3284 vector<string>::iterator ivs;
3286 map<int, int> cl_to_ol;
3290 typename vector<T*>::iterator irv;
3292 for (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 (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];
3319 void EOS5File::Handle_DimNameClashing()
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 (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
3332 for (vector<Dimension *>::iterator 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 (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
3346 for (vector<Dimension *>::iterator 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 (vector<Dimension*>::iterator ird=vdims.begin();ird!=vdims.end();++ird)
3357 cerr<<
"dimension name "<<(*ird)->name <<endl;
3362 EOS5Handle_General_NameClashing(dimnewnameset, vdims);
3365 for (vector<Dimension*>::iterator 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 (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv)
3373 for (vector<Dimension *>::iterator ird = (*irv)->dims.begin(); ird != (*irv)->dims.end(); ++ird)
3374 (*ird)->newname = dimname_to_dimnewname[(*ird)->name];
3376 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv)
3377 for (vector<Dimension *>::iterator ird = (*irv)->dims.begin(); ird != (*irv)->dims.end(); ++ird)
3378 (*ird)->newname = dimname_to_dimnewname[(*ird)->name];
3384 void EOS5File::Set_COARDS_Status()
3387 BESDEBUG(
"h5",
"Coming to Set_COARDS_Status()"<<endl);
3389 for (vector<EOS5CFGrid *>::iterator 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 (vector<EOS5CFSwath *>::iterator irg = this->eos5cfswaths.begin(); irg != this->eos5cfswaths.end(); ++irg) {
3398 if (
false == (*irg)->has_1dlatlon) {
3407 void EOS5File::Adjust_Attr_Info()
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();
3422 void EOS5File::Adjust_Aura_Attr_Name()
3425 BESDEBUG(
"h5",
"Coming to Adjust_Attr_Name() for Aura"<<endl);
3426 for (vector<Var*>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
3427 for (vector<Attribute*>::iterator 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 (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
3435 for (vector<Attribute*>::iterator 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];
3443 void 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 (vector<Var*>::iterator irv = this->vars.begin(); irv != this->vars.end(); irv++) {
3456 if (((*irv)->name ==
"Time") || ((*irv)->name ==
"nTimes")) {
3457 for (vector<Attribute*>::iterator 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());
3480 void 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 (vector<Group*>::iterator it_g = this->groups.begin(); it_g != this->groups.end(); ++it_g) {
3492 if (File_attr_group_path == (*it_g)->path) {
3494 for (vector<Attribute *>::iterator 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;
3517 void 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 (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
3528 switch ((*irv)->cvartype) {
3531 for (vector<Attribute*>::iterator 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.size() > 0) && ((*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.");
3599 void 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 (vector<EOS5CVar *>::iterator 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);
3631 this->root_attrs.push_back(attr);
3640 void EOS5File::Adjust_Dim_Name()
3643 BESDEBUG(
"h5",
"Coming to Adjust_Dim_Name()"<<endl);
3645 if (
false == this->iscoard)
3648 for (vector<EOS5CVar *>::iterator 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 (vector<Var*>::iterator irv2 = this->vars.begin(); irv2 != this->vars.end(); irv2++) {
3656 for (vector<Dimension *>::iterator ird = (*irv2)->dims.begin(); ird != (*irv2)->dims.end(); ird++) {
3661 if ((*ird)->name == ((*irv)->dims)[0]->name) (*ird)->newname = ((*irv)->dims)[0]->newname;
3670 void EOS5File::Add_Supplement_Attrs(
bool add_path)
3673 BESDEBUG(
"h5",
"Coming to Add_Supplement_Attrs()"<<endl);
3674 if (
true == add_path) {
3676 File::Add_Supplement_Attrs(add_path);
3679 for (vector<EOS5CVar *>::iterator 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 (vector<EOS5CVar *>::iterator 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 (vector<EOS5CVar *>::iterator 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 (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
3723 if ((*irv)->dims.size() > 0) {
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 (vector<Dimension *>::iterator 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;
3751 Add_Str_Attr(attr, attrname, orig_dimname_list);
3753 (*irv)->attrs.push_back(attr);
3761 void EOS5File::Handle_Coor_Attr()
3764 BESDEBUG(
"h5",
"Coming to Handle_Coor_Attr()"<<endl);
3765 string co_attrname =
"coordinates";
3766 string co_attrvalue =
"";
3768 if (iscoard)
return;
3770 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
3772 for (vector<Dimension *>::iterator ird = (*irv)->dims.begin(); ird != (*irv)->dims.end(); ++ird) {
3773 for (vector<EOS5CVar *>::iterator ircv = this->cvars.begin(); ircv != this->cvars.end(); ++ircv) {
3774 if ((*ird)->name == (*ircv)->cfdimname)
3775 co_attrvalue = (co_attrvalue.empty()) ? (*ircv)->newname : co_attrvalue +
" " + (*ircv)->newname;
3778 if (
false == co_attrvalue.empty()) {
3780 Add_Str_Attr(attr, co_attrname, co_attrvalue);
3781 (*irv)->attrs.push_back(attr);
3783 co_attrvalue.clear();
3787 bool has_2dlatlon_cv =
false;
3788 for (vector<EOS5CVar *>::iterator ircv = this->cvars.begin(); ircv != this->cvars.end(); ++ircv) {
3789 if (
true == (*ircv)->is_2dlatlon) {
3790 has_2dlatlon_cv =
true;
3795 if (
true == has_2dlatlon_cv) {
3799 for (vector<EOS5CVar *>::iterator ircv = this->cvars.begin(); ircv != this->cvars.end(); ++ircv) {
3800 if (
true == (*ircv)->is_2dlatlon) {
3801 dimname1 = (((*ircv)->dims)[0])->name;
3802 dimname2 = (((*ircv)->dims)[1])->name;
3807 int num_latlondims = 0;
3809 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
3810 for (vector<Dimension *>::iterator ird = (*irv)->dims.begin(); ird != (*irv)->dims.end(); ++ird) {
3811 if (dimname1 == (*ird)->name) num_latlondims++;
3812 if (dimname2 == (*ird)->name) num_latlondims++;
3814 if ((num_latlondims != 0) && (num_latlondims != 2)) {
3816 for (vector<Attribute *>::iterator ira = (*irv)->attrs.begin(); ira != (*irv)->attrs.end(); ++ira) {
3817 if (co_attrname == (*ira)->name) {
3819 (*irv)->attrs.erase(ira);
3832 void EOS5File::Adjust_Special_EOS5CVar_Name() {
3834 int num_grids =this->eos5cfgrids.size();
3835 int num_swaths = this->eos5cfswaths.size();
3836 int num_zas = this->eos5cfzas.size();
3838 bool mixed_eos5typefile =
false;
3841 if (((num_grids > 0) && (num_swaths > 0)) ||
3842 ((num_grids > 0) && (num_zas > 0)) ||
3843 ((num_swaths >0) && (num_zas > 0)))
3844 mixed_eos5typefile =
true;
3846 if (
false == mixed_eos5typefile) {
3851 if ((1 == num_swaths) || ( 1 == num_zas) ||
3852 (1 == num_grids) || ((num_grids >1) && (this->grids_multi_latloncvs))) {
3854 string unit_attrname =
"units";
3855 string nonll_cf_level_attralue =
"level";
3856 string lat_cf_unit_attrvalue =
"degrees_north";
3857 string lon_cf_unit_attrvalue =
"degrees_east";
3859 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin();
3860 irv != this->cvars.end(); irv++) {
3861 switch((*irv)->eos_type) {
3867 for(vector <Attribute*>::iterator ira = (*irv)->attrs.begin();
3868 ira != (*irv)->attrs.end(); ira++) {
3869 if ((*ira)->name ==unit_attrname) {
3870 if ((*ira)->value.size() > 0) {
3871 string units_value((*ira)->value.begin(),(*ira)->value.end());
3872 if (lat_cf_unit_attrvalue ==units_value) (*irv)->newname =
"lat";
3873 if (lon_cf_unit_attrvalue ==units_value) (*irv)->newname =
"lon";
3879 case CV_NONLATLON_MISS:
3881 for(vector <Attribute*>::iterator ira = (*irv)->attrs.begin();
3882 ira != (*irv)->attrs.end(); ira++) {
3883 if ((*ira)->name ==unit_attrname) {
3884 if ((*ira)->value.size() > 0) {
3885 string units_value((*ira)->value.begin(),(*ira)->value.end());
3886 if (nonll_cf_level_attralue ==units_value) {
3887 (*irv)->newname =
"lev";
3896 throw1(
"Non-supported coordinate variable type");
3909 void EOS5File::Create_Missing_CV(T* eos5data,
EOS5CVar *EOS5cvar,
const string& dimname, EOS5Type eos5type,
3913 BESDEBUG(
"h5",
"Coming to Create_Missing_CV()"<<endl);
3914 string reduced_dimname = HDF5CFUtil::obtain_string_after_lastslash(dimname);
3915 if (
"" == reduced_dimname) throw2(
"wrong dimension name ", dimname);
3916 EOS5cvar->name = reduced_dimname;
3917 Create_Added_Var_NewName_FullPath(eos5type, eos5data->name, EOS5cvar->name, EOS5cvar->newname, EOS5cvar->fullpath);
3919 EOS5cvar->dtype = H5INT32;
3920 hsize_t eos5cvar_dimsize = (eos5data->dimnames_to_dimsizes)[dimname];
3922 eos5cvar_dim->name = dimname;
3923 eos5cvar_dim->unlimited_dim = (eos5data->dimnames_to_unlimited)[dimname];
3924 if (1 == num_eos5data)
3925 eos5cvar_dim->newname = reduced_dimname;
3927 eos5cvar_dim->newname = dimname;
3929 EOS5cvar->dims.push_back(eos5cvar_dim);
3930 EOS5cvar->cfdimname = dimname;
3931 EOS5cvar->cvartype = CV_NONLATLON_MISS;
3932 EOS5cvar->eos_type = eos5type;
3936 void EOS5File::Create_Added_Var_NewName_FullPath(EOS5Type eos5type,
const string& eos5_groupname,
const string& varname,
3937 string &var_newname,
string &var_fullpath)
3940 BESDEBUG(
"h5",
"Coming to Create_Added_Var_NewName_FullPath()"<<endl);
3941 string fslash_str =
"/";
3942 string eos5typestr =
"";
3943 string top_eos5_groupname =
"/HDFEOS";
3947 eos5typestr =
"/GRIDS/";
3948 var_newname = eos5typestr + eos5_groupname + fslash_str + varname;
3949 var_fullpath = top_eos5_groupname + eos5typestr + eos5_groupname + fslash_str + varname;
3954 eos5typestr =
"/SWATHS/";
3955 var_newname = eos5typestr + eos5_groupname + fslash_str + varname;
3956 var_fullpath = top_eos5_groupname + eos5typestr + eos5_groupname + fslash_str + varname;
3962 eos5typestr =
"/ZAS/";
3963 var_newname = eos5typestr + eos5_groupname + fslash_str + varname;
3964 var_fullpath = top_eos5_groupname + eos5typestr + eos5_groupname + fslash_str + varname;
3970 throw1(
"Non-supported EOS type");
3975 void EOS5File::Handle_SpVar()
3978 BESDEBUG(
"h5",
"Coming to Handle_SpVar()"<<endl);
3979 if (
true == this->isaura && TES == this->aura_name) {
3980 const string ProHist_full_path =
"/HDFEOS/ADDITIONAL/FILE_ATTRIBUTES/ProductionHistory";
3981 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
3982 if (ProHist_full_path == (*irv)->fullpath) {
3984 this->vars.erase(irv);
3991 if (dimname_to_dupdimnamelist.size() > 0) {
3992 for (vector<EOS5CVar *>::iterator ircv = this->cvars.begin(); ircv != this->cvars.end(); ircv++) {
3993 if ((*ircv)->cvartype == CV_EXIST) {
3994 pair<multimap<string, string>::iterator, multimap<string, string>::iterator> mm_er_ret;
3995 multimap<string, string>::iterator itmm;
3996 for (itmm = dimname_to_dupdimnamelist.begin(); itmm != dimname_to_dupdimnamelist.end(); ++itmm) {
3999 if ((*ircv)->cfdimname == (*itmm).first) {
4002 for (vector<EOS5CVar *>::iterator irv2 = this->cvars.begin(); irv2 != this->cvars.end();
4004 if ((*irv2)->cvartype == CV_NONLATLON_MISS) {
4008 if ((*irv2)->cfdimname == (*itmm).second) {
4011 string dup_var_name = (*irv2)->newname;
4012 Replace_Var_Info((*ircv), (*irv2));
4015 (*irv2)->newname = dup_var_name;
4016 (*irv2)->getDimensions()[0]->newname = dup_var_name;
4029 for (vector<Var *>::iterator irv = this->vars.begin();
4030 irv != this->vars.end(); ++irv) {
4033 if((*irv)->rank >=2) {
4035 for (vector<Dimension *>::iterator ird = (*irv)->dims.begin();
4036 ird != (*irv)->dims.end(); ++ ird) {
4037 pair<multimap<string,string>::iterator,multimap<string,string>::iterator> mm_er_ret;
4038 multimap<string,string>::iterator itmm;
4039 for (itmm = dimname_to_dupdimnamelist.begin(); itmm!=dimname_to_dupdimnamelist.end();++itmm) {
4043 cerr<<
"duplicate dimension name of a variable is "<<(*ird)->name <<endl;
4053 if((*itmm).second == (*ird)->name) {
4054 cerr<<
"coming to find the duplicate dim. name "<<endl;
4055 for (vector<EOS5CVar *>::iterator ircv = this->cvars.begin();
4056 ircv != this->cvars.end(); ircv++) {
4057 if((*ircv)->cvartype == CV_EXIST) {
4058 cerr<<
"cf dim. name is "<<(*ircv)->cfdimname <<endl;
4060 if((*ircv)->cfdimname == (*itmm).first) {
4062 for (vector<EOS5CVar *>::iterator irv2 = this->cvars.begin();
4063 irv2 != this->cvars.end(); irv2++) {
4064 if((*irv2)->cvartype == CV_NONLATLON_MISS) {
4066 if((*irv2)->cfdimname == (*itmm).second) {
4067 string dup_var_name = (*irv2)->newname;
4068 Replace_Var_Info((*ircv),(*irv2));
4069 (*irv2)->newname = dup_var_name;
4070 (*irv2)->getDimensions()[0]->newname = dup_var_name;
4096 void EOS5File::Handle_SpVar_Attr()
4099 BESDEBUG(
"h5",
"Coming to Handle_SpVar_Attr()"<<endl);
4102 if (dimname_to_dupdimnamelist.size() > 0) {
4104 pair<multimap<string, string>::iterator, multimap<string, string>::iterator> mm_er_ret;
4105 multimap<string, string>::iterator itmm;
4106 for (itmm = dimname_to_dupdimnamelist.begin(); itmm != dimname_to_dupdimnamelist.end(); ++itmm) {
4107 for (vector<EOS5CVar *>::iterator ircv = this->cvars.begin(); ircv != this->cvars.end(); ircv++) {
4109 if ((*ircv)->cvartype == CV_EXIST) {
4112 if ((*ircv)->cfdimname == (*itmm).first) {
4116 for (vector<EOS5CVar *>::iterator irv2 = this->cvars.begin(); irv2 != this->cvars.end();
4118 if ((*irv2)->cvartype == CV_NONLATLON_MISS) {
4122 if ((*irv2)->cfdimname == (*itmm).second) Replace_Var_Attrs((*ircv), (*irv2));
4134 void EOS5File::Handle_SpVar_DMR()
4137 BESDEBUG(
"h5",
"Coming to Handle_SpVar_DMR()"<<endl);
4138 if (
true == this->isaura && TES == this->aura_name) {
4139 const string ProHist_full_path =
"/HDFEOS/ADDITIONAL/FILE_ATTRIBUTES/ProductionHistory";
4140 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
4141 if (ProHist_full_path == (*irv)->fullpath) {
4143 this->vars.erase(irv);
4150 if (dimname_to_dupdimnamelist.size() > 0) {
4151 for (vector<EOS5CVar *>::iterator ircv = this->cvars.begin(); ircv != this->cvars.end(); ircv++) {
4152 if ((*ircv)->cvartype == CV_EXIST) {
4153 pair<multimap<string, string>::iterator, multimap<string, string>::iterator> mm_er_ret;
4154 multimap<string, string>::iterator itmm;
4155 for (itmm = dimname_to_dupdimnamelist.begin(); itmm != dimname_to_dupdimnamelist.end(); ++itmm) {
4158 if ((*ircv)->cfdimname == (*itmm).first) {
4161 for (vector<EOS5CVar *>::iterator irv2 = this->cvars.begin(); irv2 != this->cvars.end();
4163 if ((*irv2)->cvartype == CV_NONLATLON_MISS) {
4167 if ((*irv2)->cfdimname == (*itmm).second) {
4169 Replace_Var_Attrs((*ircv), (*irv2));
4171 string dup_var_name = (*irv2)->newname;
4172 Replace_Var_Info((*ircv), (*irv2));
4176 (*irv2)->newname = dup_var_name;
4177 (*irv2)->getDimensions()[0]->newname = dup_var_name;
4190 void EOS5File::Adjust_Obj_Name()
4195 bool EOS5File::Have_Grid_Mapping_Attrs() {
4196 return File::Have_Grid_Mapping_Attrs();
4198 void EOS5File::Handle_Grid_Mapping_Vars() {
4199 File:: Handle_Grid_Mapping_Vars();
4207 BESDEBUG(
"h5",
"Coming to Replace_Var_Info()"<<endl);
4208 File::Replace_Var_Info(src, target);
4209 target->cfdimname = src->cfdimname;
4210 target->cvartype = src->cvartype;
4211 target->eos_type = src->eos_type;
4212 target->total_elems = src->total_elems;
4220 BESDEBUG(
"h5",
"Coming to Replace_Var_Attrs()"<<endl);
4221 File::Replace_Var_Attrs(src, target);
4227 EOS5File:: add_ignored_info_attrs(
bool is_grp,
bool is_first) {
4231 EOS5File:: 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.
#define throw1(a1)
The followings are convenient functions to throw exceptions with different.
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.
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.