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)) {
228 ira = (*ircv)->attrs.erase(ira);
237 H5DataType temp_dtype = (*ircv)->getType();
238 if (!HDF5CFUtil::cf_strict_support_type(temp_dtype)) {
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();
285 if (
false == HDF5CFUtil::cf_strict_support_type(temp_dtype) || (temp_dtype == H5INT64) ||(temp_dtype == H5UINT64)) {
289 if ((
"DIMENSION_LIST" != (*ira)->name)
290 && (
"REFERENCE_LIST" != (*ira)->name ||
true == is_ignored))
291 this->add_ignored_info_attrs(
false, (*irv)->fullpath, (*ira)->name);
300 void EOS5File::Handle_Unsupported_Dspace(
bool include_attr)
304 if (
true == check_ignored) {
305 Gen_Unsupported_Dspace_Info();
308 File::Handle_Unsupported_Dspace(include_attr);
309 Handle_EOS5_Unsupported_Dspace(include_attr);
314 void EOS5File::Handle_EOS5_Unsupported_Dspace(
bool include_attr)
317 if (
true == this->unsupported_var_dspace) {
318 for (vector<EOS5CVar *>::iterator ircv = this->cvars.begin(); ircv != this->cvars.end();) {
319 if (
true == (*ircv)->unsupported_dspace) {
321 ircv = this->cvars.erase(ircv);
329 if (
true == include_attr) {
330 if (
true == this->unsupported_var_attr_dspace) {
331 for (vector<EOS5CVar *>::iterator ircv = this->cvars.begin(); ircv != this->cvars.end(); ++ircv) {
332 if (
false == (*ircv)->attrs.empty()) {
333 if (
true == (*ircv)->unsupported_attr_dspace) {
334 for (vector<Attribute *>::iterator ira = (*ircv)->attrs.begin(); ira != (*ircv)->attrs.end();) {
335 if (0 == (*ira)->count) {
337 ira = (*ircv)->attrs.erase(ira);
351 void EOS5File::Gen_Unsupported_Dspace_Info()
354 File::Gen_Unsupported_Dspace_Info();
359 void EOS5File::Handle_Unsupported_Others(
bool include_attr)
362 remove_netCDF_internal_attributes(include_attr);
364 if(
true == include_attr) {
365 for (vector<Var *>::iterator irv = this->vars.begin();
366 irv != this->vars.end(); ++irv) {
367 for(vector<Attribute *>::iterator ira = (*irv)->attrs.begin();
368 ira != (*irv)->attrs.end();) {
369 if((*ira)->name ==
"CLASS") {
370 string class_value = Retrieve_Str_Attr_Value(*ira,(*irv)->fullpath);
374 if (0 == class_value.compare(0,15,
"DIMENSION_SCALE")) {
376 ira = (*irv)->attrs.erase(ira);
388 else if((*ira)->name ==
"NAME") {
389 string name_value = Retrieve_Str_Attr_Value(*ira,(*irv)->fullpath);
390 if( 0 == name_value.compare(0,(*irv)->name.size(),(*irv)->name)) {
392 ira =(*irv)->attrs.erase(ira);
395 string netcdf_dim_mark=
"This is a netCDF dimension but not a netCDF variable";
396 if( 0 == name_value.compare(0,netcdf_dim_mark.size(),netcdf_dim_mark)) {
398 ira =(*irv)->attrs.erase(ira);
406 else if((*ira)->name ==
"_Netcdf4Dimid") {
408 ira =(*irv)->attrs.erase(ira);
417 if(
true == include_attr) {
418 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin();
419 irv != this->cvars.end(); ++irv) {
420 for(vector<Attribute *>::iterator ira = (*irv)->attrs.begin();
421 ira != (*irv)->attrs.end();) {
422 if((*ira)->name ==
"CLASS") {
423 string class_value = Retrieve_Str_Attr_Value(*ira,(*irv)->fullpath);
427 if (0 == class_value.compare(0,15,
"DIMENSION_SCALE")) {
429 ira = (*irv)->attrs.erase(ira);
436 else if((*ira)->name ==
"NAME") {
438 ira=(*irv)->attrs.erase(ira);
441 string name_value = Retrieve_Str_Attr_Value(*ira,(*irv)->fullpath);
442 if( 0 == name_value.compare(0,(*irv)->name.size(),(*irv)->name)) {
444 ira =(*irv)->attrs.erase(ira);
447 string netcdf_dim_mark=
"This is a netCDF dimension but not a netCDF variable";
448 if( 0 == name_value.compare(0,netcdf_dim_mark.size(),netcdf_dim_mark)) {
450 ira =(*irv)->attrs.erase(ira);
458 else if((*ira)->name ==
"_Netcdf4Dimid") {
460 ira =(*irv)->attrs.erase(ira);
475 if (
true == this->check_ignored &&
true == include_attr) {
478 if (
true == HDF5RequestHandler::get_drop_long_string()) {
480 for (vector<Attribute *>::iterator ira = this->root_attrs.begin(); ira != this->root_attrs.end(); ++ira) {
481 if (H5FSTRING == (*ira)->dtype || H5VSTRING == (*ira)->dtype) {
482 if ((*ira)->getBufSize() > NC_JAVA_STR_SIZE_LIMIT) {
483 this->add_ignored_droplongstr_hdr();
484 this->add_ignored_grp_longstr_info(
"/", (*ira)->name);
489 for (vector<Group *>::iterator irg = this->groups.begin(); irg != this->groups.end(); ++irg) {
490 for (vector<Attribute *>::iterator ira = (*irg)->attrs.begin(); ira != (*irg)->attrs.end(); ++ira) {
491 if (H5FSTRING == (*ira)->dtype || H5VSTRING == (*ira)->dtype) {
492 if ((*ira)->getBufSize() > NC_JAVA_STR_SIZE_LIMIT) {
493 this->add_ignored_droplongstr_hdr();
494 this->add_ignored_grp_longstr_info((*irg)->path, (*ira)->name);
501 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
502 if (
true == Check_DropLongStr((*irv), NULL)) {
503 string ecsmeta_grp =
"/HDFEOS INFORMATION";
505 if ((*irv)->fullpath.find(ecsmeta_grp) != 0
506 || ((*irv)->fullpath.rfind(
"/") != ecsmeta_grp.size())) {
507 this->add_ignored_droplongstr_hdr();
508 this->add_ignored_var_longstr_info((*irv), NULL);
512 for (vector<Attribute *>::iterator ira = (*irv)->attrs.begin(); ira != (*irv)->attrs.end(); ++ira) {
513 if (
true == Check_DropLongStr((*irv), (*ira))) {
514 this->add_ignored_droplongstr_hdr();
515 this->add_ignored_var_longstr_info((*irv), (*ira));
521 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
522 for (vector<Attribute *>::iterator ira = (*irv)->attrs.begin(); ira != (*irv)->attrs.end(); ++ira) {
523 if (
true == Check_DropLongStr((*irv), (*ira))) {
524 this->add_ignored_droplongstr_hdr();
525 this->add_ignored_var_longstr_info((*irv), (*ira));
533 if (
false == this->have_ignored) this->add_no_ignored_info();
538 void EOS5File::Adjust_EOS5Dim_Info(
HE5Parser*strmeta_info)
541 BESDEBUG(
"h5",
"coming to Adjust_EOS5Dim_Info" <<endl);
544 for (
unsigned int i = 0; i < strmeta_info->swath_list.size(); ++i) {
545 HE5Swath& he5s = strmeta_info->swath_list.at(i);
547 Adjust_EOS5Dim_List(he5s.dim_list);
557 if(this->have_udim ==
true) {
558 vector<HE5Var> svlist = he5s.geo_var_list;
559 svlist.insert(svlist.end(),he5s.data_var_list.begin(),he5s.data_var_list.end());
561 Adjust_EOS5DimSize_List(he5s.dim_list,svlist,SWATH,he5s.name);
564 for (
unsigned int j = 0; j < he5s.geo_var_list.size(); ++j) {
565 Adjust_EOS5VarDim_Info((he5s.geo_var_list)[j].dim_list, he5s.dim_list, he5s.name, SWATH);
567 for (
unsigned int j = 0; j < he5s.data_var_list.size(); ++j) {
568 Adjust_EOS5VarDim_Info((he5s.data_var_list)[j].dim_list, he5s.dim_list, he5s.name, SWATH);
572 for (
unsigned int i = 0; i < strmeta_info->grid_list.size(); ++i) {
574 HE5Grid& he5g = strmeta_info->grid_list.at(i);
576 Adjust_EOS5Dim_List(he5g.dim_list);
579 if(this->have_udim ==
true) {
581 Adjust_EOS5DimSize_List(he5g.dim_list,he5g.data_var_list,GRID,he5g.name);
584 for (
unsigned int j = 0; j < he5g.data_var_list.size(); ++j) {
585 Adjust_EOS5VarDim_Info((he5g.data_var_list)[j].dim_list, he5g.dim_list, he5g.name, GRID);
589 for (
unsigned int i = 0; i < strmeta_info->za_list.size(); ++i) {
590 HE5Za& he5z = strmeta_info->za_list.at(i);
592 Adjust_EOS5Dim_List(he5z.dim_list);
595 if(this->have_udim ==
true) {
597 Adjust_EOS5DimSize_List(he5z.dim_list,he5z.data_var_list,ZA,he5z.name);
600 for (
unsigned int j = 0; j < he5z.data_var_list.size(); ++j) {
601 Adjust_EOS5VarDim_Info((he5z.data_var_list)[j].dim_list, he5z.dim_list, he5z.name, ZA);
607 void EOS5File::Adjust_EOS5Dim_List(vector<HE5Dim>& groupdimlist)
610 BESDEBUG(
"h5",
"Coming to Adjust_EOS5Dim_List"<<endl);
614 Remove_NegativeSizeDims(groupdimlist);
617 Condense_EOS5Dim_List(groupdimlist);
623 void EOS5File::Remove_NegativeSizeDims(vector<HE5Dim>& groupdimlist)
626 BESDEBUG(
"h5",
"Coming to Remove_NegativeSizeDims" <<endl);
627 vector<HE5Dim>::iterator id;
636 for (
id = groupdimlist.begin();
id != groupdimlist.end();) {
637 if ((*id).size <= 0) {
638 id = groupdimlist.erase(
id);
650 void EOS5File::Condense_EOS5Dim_List(vector<HE5Dim>& groupdimlist)
653 BESDEBUG(
"h5",
"Coming to Condense_EOS5Dim_List"<<endl);
656 pair<set<int>::iterator,
bool> setret;
657 vector<HE5Dim>::iterator id;
659 for (
id = groupdimlist.begin();
id != groupdimlist.end();) {
660 if (
"XDim" == (*id).name ||
"Xdim" == (*id).name) {
661 setret = xdimsizes.insert((*id).size);
662 if (
false == setret.second) {
663 id = groupdimlist.erase(
id);
665 else if (
"Xdim" == (*id).name) {
679 for (
id = groupdimlist.begin();
id != groupdimlist.end();) {
680 if (
"YDim" == (*id).name ||
"Ydim" == (*id).name) {
681 setret = ydimsizes.insert((*id).size);
682 if (
false == setret.second) {
683 id = groupdimlist.erase(
id);
685 else if (
"Ydim" == (*id).name) {
699 void EOS5File:: Adjust_EOS5DimSize_List(vector<HE5Dim>& eos5objdimlist,
const vector<HE5Var> & eos5objvarlist,
700 const EOS5Type eos5type,
const string & eos5objname)
703 set<string>updated_dimlist;
704 pair<set<string>::iterator,
bool> set_insert_ret;
706 for(
unsigned int i = 0; i<eos5objvarlist.size();i++) {
707 HE5Var he5v = eos5objvarlist.at(i);
708 for(
unsigned int j = 0; j<he5v.dim_list.size();j++) {
709 HE5Dim he5d = he5v.dim_list.at(j);
710 set_insert_ret = updated_dimlist.insert(he5d.name);
711 if(set_insert_ret.second ==
true) {
713 unsigned int objdimlist_index = 9999;
714 bool has_objdimlist_index =
false;
715 for(
unsigned int k = 0; k <eos5objdimlist.size();k++) {
716 if(eos5objdimlist[k].name == he5d.name) {
717 objdimlist_index = k;
718 has_objdimlist_index =
true;
722 if(has_objdimlist_index ==
false)
723 throw2(
"Cannot find the dimension in the EOS5 object dimension list for the dimension ", he5d.name);
724 for (vector<Var *>::const_iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
726 EOS5Type vartype = Get_Var_EOS5_Type((*irv));
729 if(vartype == eos5type) {
730 string var_eos5gname = Obtain_Var_EOS5Type_GroupName((*irv),vartype);
733 if(var_eos5gname == eos5objname) {
734 if((*irv)->name == he5v.name) {
735 if (he5v.dim_list.size() != (*irv)->dims.size())
736 throw2(
"Number of dimensions don't match with the structmetadata for variable ", (*irv)->name);
738 (eos5objdimlist[objdimlist_index]).size = ((*irv)->dims[j])->size;
749 if(updated_dimlist.size() == eos5objdimlist.size())
753 for(
unsigned int k = 0; k <eos5objdimlist.size();k++) {
754 cerr<<
"eos5 obj dim name is "<<eos5objdimlist[k].name <<
" Size is "<< eos5objdimlist[k].size << endl;
761 void EOS5File::Adjust_EOS5VarDim_Info(vector<HE5Dim>& vardimlist, vector<HE5Dim>& groupdimlist,
762 const string & eos5_obj_name, EOS5Type eos5type)
765 BESDEBUG(
"h5",
"Coming to Adjust_EOS5VarDim_Info"<<endl);
766 set<string> dimnamelist;
767 pair<set<string>::iterator,
bool> setret;
774 for (
unsigned int i = 0; i < vardimlist.size(); ++i) {
776 HE5Dim& he5d = vardimlist.at(i);
777 bool dim_in_groupdimlist =
false;
778 for (
unsigned int j = 0; j < groupdimlist.size(); ++j) {
779 HE5Dim he5gd = groupdimlist.at(j);
780 if (he5gd.name == he5d.name) {
781 he5d.size = he5gd.size;
782 dim_in_groupdimlist =
true;
787 if (
false == dim_in_groupdimlist)
788 throw2(
"The EOS5 group dimension name list doesn't include the dimension ", he5d.name);
793 setret = dimnamelist.insert(he5d.name);
794 if (
false == setret.second) {
796 string temp_clashname = he5d.name +
'_';
797 HDF5CFUtil::gen_unique_name(temp_clashname, dimnamelist, clash_index);
799 string ori_dimname = he5d.name;
801 he5d.name = temp_clashname;
804 bool dim_exist =
false;
805 for (
unsigned int j = 0; j < groupdimlist.size(); ++j) {
806 if (he5d.name == groupdimlist[j].name && he5d.size == groupdimlist[j].size) {
813 if (
false == dim_exist) {
814 ori_dimname = eos5_obj_name +
"/" + ori_dimname;
815 string dup_dimname = eos5_obj_name +
"/" + he5d.name;
816 if (GRID == eos5type) {
817 ori_dimname =
"/GRIDS/" + ori_dimname;
818 dup_dimname =
"/GRIDS/" + dup_dimname;
820 else if (SWATH == eos5type) {
821 ori_dimname =
"/SWATHS/" + ori_dimname;
822 dup_dimname =
"/SWATHS/" + dup_dimname;
824 else if (ZA == eos5type) {
825 ori_dimname =
"/ZAS/" + ori_dimname;
826 dup_dimname =
"/ZAS/" + dup_dimname;
830 dimname_to_dupdimnamelist.insert(pair<string, string>(ori_dimname, dup_dimname));
831 groupdimlist.push_back(he5d);
840 void EOS5File::Add_EOS5File_Info(
HE5Parser * strmeta_info,
bool grids_mllcv)
843 BESDEBUG(
"h5",
"Coming to Add_EOS5File_Info"<<endl);
844 string fslash_str =
"/";
845 string grid_str =
"/GRIDS/";
846 string swath_str =
"/SWATHS/";
847 string za_str =
"/ZAS/";
855 this->orig_num_grids = strmeta_info->grid_list.size();
858 for (
unsigned int i = 0; i < strmeta_info->grid_list.size(); i++) {
859 HE5Grid he5g = strmeta_info->grid_list.at(i);
861 eos5grid->name = he5g.name;
862 eos5grid->dimnames.resize(he5g.dim_list.size());
864 for (
unsigned int j = 0; j < he5g.dim_list.size(); j++) {
866 HE5Dim he5d = he5g.dim_list.at(j);
867 if (
"XDim" == he5d.name) eos5grid->xdimsize = he5d.size;
868 if (
"YDim" == he5d.name) eos5grid->ydimsize = he5d.size;
878 string unique_dimname = grid_str + he5g.name + fslash_str + he5d.name;
880 (eos5grid->dimnames)[j] = unique_dimname;
882 pair<map<hsize_t, string>::iterator,
bool> mapret1;
883 mapret1 = eos5grid->dimsizes_to_dimnames.insert(pair<hsize_t, string>((hsize_t) he5d.size, unique_dimname));
888 pair<map<string, hsize_t>::iterator,
bool> mapret2;
889 mapret2 = eos5grid->dimnames_to_dimsizes.insert(pair<string, hsize_t>(unique_dimname, (hsize_t) he5d.size));
890 if (
false == mapret2.second)
891 throw5(
"The dimension name ", unique_dimname,
" with the dimension size ", he5d.size,
"is not unique");
896 EOS5SwathGrid_Set_LatLon_Flags(eos5grid, he5g.data_var_list);
899 map<string, string> dnames_to_1dvnames;
900 EOS5Handle_nonlatlon_dimcvars(he5g.data_var_list, GRID, he5g.name, dnames_to_1dvnames);
901 eos5grid->dnames_to_1dvnames = dnames_to_1dvnames;
907 eos5grid->eos5_pixelreg = he5g.pixelregistration;
908 eos5grid->eos5_origin = he5g.gridorigin;
909 eos5grid->eos5_projcode = he5g.projection;
911 for (
unsigned int k = 0; k < 13; k++)
912 eos5grid->param[k] = he5g.param[k];
913 eos5grid->zone = he5g.zone;
914 eos5grid->sphere = he5g.sphere;
916 this->eos5cfgrids.push_back(eos5grid);
921 this->grids_multi_latloncvs = grids_mllcv;
924 for (
unsigned int i = 0; i < strmeta_info->swath_list.size(); i++) {
926 HE5Swath he5s = strmeta_info->swath_list.at(i);
928 eos5swath->name = he5s.name;
929 eos5swath->dimnames.resize(he5s.dim_list.size());
931 for (
unsigned int j = 0; j < he5s.dim_list.size(); j++) {
933 HE5Dim he5d = he5s.dim_list.at(j);
943 string unique_dimname = swath_str + he5s.name + fslash_str + he5d.name;
944 (eos5swath->dimnames)[j] = unique_dimname;
948 pair<map<hsize_t, string>::iterator,
bool> mapret1;
949 mapret1 = eos5swath->dimsizes_to_dimnames.insert(
950 pair<hsize_t, string>((hsize_t) he5d.size, unique_dimname));
955 pair<map<string, hsize_t>::iterator,
bool> mapret2;
956 mapret2 = eos5swath->dimnames_to_dimsizes.insert(
957 pair<string, hsize_t>(unique_dimname, (hsize_t) he5d.size));
958 if (
false == mapret2.second)
959 throw5(
"The dimension name ", unique_dimname,
" with the dimension size ", he5d.size,
"is not unique");
964 EOS5SwathGrid_Set_LatLon_Flags(eos5swath, he5s.geo_var_list);
967 map<string, string> dnames_to_geo1dvnames;
968 EOS5Handle_nonlatlon_dimcvars(he5s.geo_var_list, SWATH, he5s.name, dnames_to_geo1dvnames);
969 eos5swath->dnames_to_geo1dvnames = dnames_to_geo1dvnames;
970 this->eos5cfswaths.push_back(eos5swath);
974 for (
unsigned int i = 0; i < strmeta_info->za_list.size(); i++) {
976 HE5Za he5z = strmeta_info->za_list.at(i);
979 eos5za->name = he5z.name;
980 eos5za->dimnames.resize(he5z.dim_list.size());
982 for (
unsigned int j = 0; j < he5z.dim_list.size(); j++) {
984 HE5Dim he5d = he5z.dim_list.at(j);
990 string unique_dimname = za_str + he5z.name + fslash_str + he5d.name;
991 (eos5za->dimnames)[j] = unique_dimname;
992 pair<map<hsize_t, string>::iterator,
bool> mapret1;
993 mapret1 = eos5za->dimsizes_to_dimnames.insert(pair<hsize_t, string>((hsize_t) he5d.size, unique_dimname));
998 pair<map<string, hsize_t>::iterator,
bool> mapret2;
999 mapret2 = eos5za->dimnames_to_dimsizes.insert(pair<string, hsize_t>(unique_dimname, (hsize_t) he5d.size));
1000 if (
false == mapret2.second)
1001 throw5(
"The dimension name ", unique_dimname,
" with the dimension size ", he5d.size,
"is not unique");
1006 map<string, string> dnames_to_1dvnames;
1007 EOS5Handle_nonlatlon_dimcvars(he5z.data_var_list, ZA, he5z.name, dnames_to_1dvnames);
1008 eos5za->dnames_to_1dvnames = dnames_to_1dvnames;
1009 this->eos5cfzas.push_back(eos5za);
1014 for (vector<EOS5CFGrid *>::iterator irg = this->eos5cfgrids.begin();
1015 irg != this->eos5cfgrids.end(); ++irg) {
1017 cerr<<
"grid name "<<(*irg)->name <<endl;
1018 cerr<<
"eos5_pixelreg"<<(*irg)->eos5_pixelreg <<endl;
1019 cerr<<
"eos5_origin"<<(*irg)->eos5_pixelreg <<endl;
1020 cerr<<
"point_lower "<<(*irg)->point_lower <<endl;
1021 cerr<<
"xdimsize "<<(*irg)->xdimsize <<endl;
1023 if((*irg)->has_g2dlatlon) cerr<<
"has g2dlatlon"<<endl;
1024 if((*irg)->has_2dlatlon) cerr<<
"has 2dlatlon"<<endl;
1025 if((*irg)->has_1dlatlon) cerr<<
"has 1dlatlon"<<endl;
1026 if((*irg)->has_nolatlon) cerr<<
"has no latlon" <<endl;
1027 if(this->grids_multi_latloncvs) cerr<<
"having multiple lat/lon from structmeta" <<endl;
1028 else cerr<<
"no multiple lat/lon from structmeta" <<endl;
1031 "h5",
"number of dimensions "<<(*irg)->dimnames.size() <<endl;
1032 for (vector<string>::iterator irv = (*irg)->dimnames.begin();
1033 irv != (*irg)->dimnames.end(); ++irv)
1034 cerr<<
"dim names" <<*irv <<endl;
1037 for (map<hsize_t,string>::iterator im1 = (*irg)->dimsizes_to_dimnames.begin();
1038 im1 !=(*irg)->dimsizes_to_dimnames.end();++im1) {
1039 cerr<<
"size to name "<< (
int)((*im1).first) <<
"=> "<<(*im1).second <<endl;
1043 for (map<string,string>::iterator im2 = (*irg)->dnames_to_1dvnames.begin();
1044 im2 !=(*irg)->dnames_to_1dvnames.end();++im2) {
1045 cerr<<
"dimanme to 1d var name "<< (*im2).first <<
"=> "<<(*im2).second <<endl;
1050 for (vector<EOS5CFSwath *>::iterator irg = this->eos5cfswaths.begin();
1051 irg != this->eos5cfswaths.end(); ++irg) {
1053 cerr<<
"swath name "<<(*irg)->name <<endl;
1054 if((*irg)->has_nolatlon) cerr<<
"has no latlon" <<endl;
1055 if((*irg)->has_1dlatlon) cerr<<
"has 1dlatlon"<<endl;
1056 if((*irg)->has_2dlatlon) cerr<<
"has 2dlatlon"<<endl;
1059 for (vector<string>::iterator irv = (*irg)->dimnames.begin();
1060 irv != (*irg)->dimnames.end(); ++irv)
1061 cerr<<
"dim names" <<*irv <<endl;
1064 for (map<hsize_t,string>::iterator im1 = (*irg)->dimsizes_to_dimnames.begin();
1065 im1 !=(*irg)->dimsizes_to_dimnames.end();++im1) {
1066 cerr<<
"size to name "<< (
int)((*im1).first) <<
"=> "<<(*im1).second <<endl;
1070 for (map<string,string>::iterator im2 = (*irg)->dnames_to_geo1dvnames.begin();
1071 im2 !=(*irg)->dnames_to_geo1dvnames.end();++im2) {
1072 cerr<<
"dimname to 1d varname "<< (*im2).first <<
"=> "<<(*im2).second <<endl;
1076 for (vector<EOS5CFZa *>::iterator irg = this->eos5cfzas.begin();
1077 irg != this->eos5cfzas.end(); ++irg) {
1079 cerr<<
"za name now"<<(*irg)->name <<endl;
1082 for (vector<string>::iterator irv = (*irg)->dimnames.begin();
1083 irv != (*irg)->dimnames.end(); ++irv)
1084 cerr<<
"dim names" <<*irv <<endl;
1087 for (map<hsize_t,string>::iterator im1 = (*irg)->dimsizes_to_dimnames.begin();
1088 im1 !=(*irg)->dimsizes_to_dimnames.end();++im1) {
1089 cerr<<
"size to name "<< (
int)((*im1).first) <<
"=> "<<(*im1).second <<endl;
1093 for (map<string,string>::iterator im2 = (*irg)->dnames_to_1dvnames.begin();
1094 im2 !=(*irg)->dnames_to_1dvnames.end();++im2) {
1095 cerr<<
"dimname to 1d varname "<< (*im2).first <<
"=> "<<(*im2).second <<endl;
1104 void EOS5File::EOS5SwathGrid_Set_LatLon_Flags(T* eos5gridswath, vector<HE5Var> &eos5varlist)
1107 BESDEBUG(
"h5",
"Coming to EOS5SwathGrid_Set_LatLon_Flags"<<endl);
1108 bool find_lat =
false;
1109 bool find_lon =
false;
1110 bool has_1dlat =
false;
1111 bool has_1dlon =
false;
1112 bool has_2dlat =
false;
1113 string lat_xdimname;
1114 string lat_ydimname;
1115 string lon_xdimname;
1116 string lon_ydimname;
1117 bool has_2dlon =
false;
1118 bool has_g2dlat =
false;
1119 bool has_g2dlon =
false;
1121 for (
unsigned int i = 0; i < eos5varlist.size(); ++i) {
1122 HE5Var he5v = eos5varlist.at(i);
1123 if (
"Latitude" == he5v.name) {
1125 int num_dims = he5v.dim_list.size();
1128 else if (2 == num_dims) {
1129 lat_ydimname = (he5v.dim_list)[0].name;
1130 lat_xdimname = (he5v.dim_list)[1].name;
1133 else if (num_dims > 2)
1136 throw1(
"The number of dimension should not be 0 for grids or swaths");
1139 if (
"Longitude" == he5v.name) {
1141 int num_dims = he5v.dim_list.size();
1144 else if (2 == num_dims) {
1145 lon_ydimname = (he5v.dim_list)[0].name;
1146 lon_xdimname = (he5v.dim_list)[1].name;
1149 else if (num_dims > 2)
1152 throw1(
"The number of dimension should not be 0 for grids or swaths");
1155 if (
true == find_lat &&
true == find_lon) {
1156 if (
true == has_1dlat &&
true == has_1dlon) eos5gridswath->has_1dlatlon =
true;
1159 if (
true == has_2dlat &&
true == has_2dlon && lat_ydimname == lon_ydimname && lat_xdimname == lon_xdimname)
1160 eos5gridswath->has_2dlatlon =
true;
1162 if (
true == has_g2dlat &&
true == has_g2dlon) eos5gridswath->has_g2dlatlon =
true;
1164 eos5gridswath->has_nolatlon =
false;
1172 void EOS5File::EOS5Handle_nonlatlon_dimcvars(vector<HE5Var> & eos5varlist, EOS5Type eos5type,
string groupname,
1173 map<string, string>& dnamesgeo1dvnames)
1176 BESDEBUG(
"h5",
"Coming to EOS5Handle_nonlatlon_dimcvars"<<endl);
1178 set<string> nocvdimnames;
1179 string grid_str =
"/GRIDS/";
1180 string xdim_str =
"XDim";
1181 string ydim_str =
"YDim";
1182 string fslash_str =
"/";
1185 if (GRID == eos5type) {
1186 string xdimname = grid_str + groupname + fslash_str + xdim_str;
1187 nocvdimnames.insert(xdimname);
1188 string ydimname = grid_str + groupname + fslash_str + ydim_str;
1189 nocvdimnames.insert(ydimname);
1190 eos5typestr =
"/GRIDS/";
1192 else if (SWATH == eos5type)
1193 eos5typestr =
"/SWATHS/";
1194 else if (ZA == eos5type)
1195 eos5typestr =
"/ZAS/";
1197 throw1(
"Unsupported HDF-EOS5 type, this type is not swath, grid or zonal average");
1201 pair<map<string, string>::iterator,
bool> mapret;
1202 for (
unsigned int i = 0; i < eos5varlist.size(); ++i) {
1203 HE5Var he5v = eos5varlist.at(i);
1204 if (1 == he5v.dim_list.size()) {
1205 HE5Dim he5d = he5v.dim_list.at(0);
1207 dimname = eos5typestr + groupname + fslash_str + he5d.name;
1209 varname = eos5typestr + groupname + fslash_str + he5v.name;
1210 mapret = dnamesgeo1dvnames.insert(pair<string, string>(dimname, varname));
1215 if (
false == mapret.second) nocvdimnames.insert(dimname);
1221 set<string>::iterator itset;
1222 for (itset = nocvdimnames.begin(); itset != nocvdimnames.end(); ++itset)
1223 dnamesgeo1dvnames.erase(*itset);
1227 void EOS5File::Adjust_Var_NewName_After_Parsing()
1230 BESDEBUG(
"h5",
"Coming to Adjust_Var_NewName_After_Parsing"<<endl);
1231 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
1232 Obtain_Var_NewName(*irv);
1236 void EOS5File::Obtain_Var_NewName(
Var *var)
1239 BESDEBUG(
"h5",
"Coming to Obtain_Var_NewName"<<endl);
1240 string fslash_str =
"/";
1241 string eos5typestr =
"";
1243 EOS5Type vartype = Get_Var_EOS5_Type(var);
1251 eos5typestr =
"/GRIDS/";
1252 string eos5_groupname = Obtain_Var_EOS5Type_GroupName(var, vartype);
1257 var->newname = eos5typestr + eos5_groupname + fslash_str + var->name;
1262 eos5typestr =
"/SWATHS/";
1263 string eos5_groupname = Obtain_Var_EOS5Type_GroupName(var, vartype);
1268 var->newname = eos5typestr + eos5_groupname + fslash_str + var->name;
1272 eos5typestr =
"/ZAS/";
1273 string eos5_groupname = Obtain_Var_EOS5Type_GroupName(var, vartype);
1278 var->newname = eos5typestr + eos5_groupname + fslash_str + var->name;
1282 string eos5infopath =
"/HDFEOS INFORMATION";
1283 if (var->fullpath.size() > eos5infopath.size()) {
1284 if (eos5infopath == var->fullpath.substr(0, eos5infopath.size())) var->newname = var->name;
1287 var->newname = var->fullpath;
1291 throw1(
"Non-supported EOS type");
1296 EOS5Type EOS5File::Get_Var_EOS5_Type(
Var* var)
1299 BESDEBUG(
"h5",
"Coming to Get_Var_EOS5_Type"<<endl);
1301 string EOS5GRIDPATH =
"/HDFEOS/GRIDS";
1302 string EOS5SWATHPATH =
"/HDFEOS/SWATHS";
1303 string EOS5ZAPATH =
"/HDFEOS/ZAS";
1305 if (var->fullpath.size() >= EOS5GRIDPATH.size()) {
1306 if (EOS5GRIDPATH == var->fullpath.substr(0, EOS5GRIDPATH.size()))
return GRID;
1308 if (var->fullpath.size() >= EOS5SWATHPATH.size()) {
1309 if (EOS5SWATHPATH == var->fullpath.substr(0, EOS5SWATHPATH.size()))
return SWATH;
1311 if (var->fullpath.size() >= EOS5ZAPATH.size()) {
1312 if (EOS5ZAPATH == var->fullpath.substr(0, EOS5ZAPATH.size()))
return ZA;
1322 BESDEBUG(
"h5",
"Coming to Add_Dim_Name"<<endl);
1323 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
1324 Obtain_Var_Dims(*irv, strmeta_info);
1326 for (vector<Dimension *>::iterator ird = (*irv)->dims.begin();
1327 ird != (*irv)->dims.end();++ird) {
1328 cerr<<
"dim name right after change "<<(*ird)->newname <<endl;
1336 bool EOS5File::Obtain_Var_Dims(
Var *var,
HE5Parser * strmeta_info)
1339 BESDEBUG(
"h5",
"Coming to Obtain_Var_Dims"<<endl);
1340 string varname_from_parser =
"";
1341 EOS5Type vartype = Get_Var_EOS5_Type(var);
1343 if (GRID == vartype) {
1344 int num_grids = strmeta_info->grid_list.size();
1345 for (
int i = 0; i < num_grids; ++i) {
1346 HE5Grid he5g = strmeta_info->grid_list.at(i);
1347 if (he5g.name == Obtain_Var_EOS5Type_GroupName(var, vartype)) {
1348 EOS5CFGrid *eos5cfgrid = (this->eos5cfgrids)[i];
1349 bool var_is_parsed = Set_Var_Dims(eos5cfgrid, var, he5g.data_var_list, he5g.name, num_grids, GRID);
1350 if (
false == var_is_parsed) {
1351 map<hsize_t, string> dimsizes_to_dimnames = eos5cfgrid->dimsizes_to_dimnames;
1356 Set_NonParse_Var_Dims(eos5cfgrid, var, dimsizes_to_dimnames, num_grids, vartype);
1361 else if (SWATH == vartype) {
1362 int num_swaths = strmeta_info->swath_list.size();
1363 for (
int i = 0; i < num_swaths; ++i) {
1365 HE5Swath he5s = strmeta_info->swath_list.at(i);
1367 if (he5s.name == Obtain_Var_EOS5Type_GroupName(var, vartype)) {
1369 EOS5CFSwath *eos5cfswath = (this->eos5cfswaths)[i];
1371 bool var_is_parsed =
true;
1372 int swath_fieldtype_flag = Check_EOS5Swath_FieldType(var);
1373 if (1 == swath_fieldtype_flag)
1374 var_is_parsed = Set_Var_Dims(eos5cfswath, var, he5s.geo_var_list, he5s.name, num_swaths, SWATH);
1375 else if (0 == swath_fieldtype_flag)
1376 var_is_parsed = Set_Var_Dims(eos5cfswath, var, he5s.data_var_list, he5s.name, num_swaths, SWATH);
1379 var_is_parsed =
false;
1381 if (
false == var_is_parsed) {
1382 map<hsize_t, string> dimsizes_to_dimnames = eos5cfswath->dimsizes_to_dimnames;
1383 Set_NonParse_Var_Dims(eos5cfswath, var, dimsizes_to_dimnames, num_swaths, vartype);
1389 else if (ZA == vartype) {
1391 int num_zas = strmeta_info->za_list.size();
1392 for (
int i = 0; i < num_zas; ++i) {
1393 HE5Za he5z = strmeta_info->za_list.at(i);
1394 if (he5z.name == Obtain_Var_EOS5Type_GroupName(var, vartype)) {
1395 EOS5CFZa *eos5cfza = (this->eos5cfzas)[i];
1396 bool var_is_parsed = Set_Var_Dims(eos5cfza, var, he5z.data_var_list, he5z.name, num_zas, ZA);
1397 if (
false == var_is_parsed) {
1398 map<hsize_t, string> dimsizes_to_dimnames = eos5cfza->dimsizes_to_dimnames;
1399 Set_NonParse_Var_Dims(eos5cfza, var, dimsizes_to_dimnames, num_zas, vartype);
1409 bool EOS5File::Set_Var_Dims(T* eos5data,
Var *var, vector<HE5Var> &he5var,
const string& groupname,
int num_groups,
1413 BESDEBUG(
"h5",
"Coming to Set_Var_Dims"<<endl);
1415 bool is_parsed =
false;
1416 string eos5typestr =
"";
1417 string fslash_str =
"/";
1419 if (GRID == eos5type)
1420 eos5typestr =
"/GRIDS/";
1421 else if (SWATH == eos5type)
1422 eos5typestr =
"/SWATHS/";
1423 else if (ZA == eos5type)
1424 eos5typestr =
"/ZAS/";
1426 throw1(
"Unsupported HDF-EOS5 type, this type is not swath, grid or zonal average");
1428 for (
unsigned int i = 0; i < he5var.size(); i++) {
1430 HE5Var he5v = he5var.at(i);
1432 if (he5v.name == var->name) {
1433 if (he5v.dim_list.size() != var->dims.size())
1434 throw2(
"Number of dimensions don't match with the structmetadata for variable ", var->name);
1464 set<hsize_t> dimsize_have_name_set;
1465 pair<set<hsize_t>::iterator,
bool> setret1;
1466 set<string> thisvar_dimname_set;
1467 pair<set<string>::iterator,
bool> setret2;
1469 for (
unsigned int j = 0; j < he5v.dim_list.size(); j++) {
1470 HE5Dim he5d = he5v.dim_list.at(j);
1471 for (vector<Dimension *>::iterator ird = var->dims.begin(); ird != var->dims.end(); ++ird) {
1473 if ((hsize_t) (he5d.size) == (*ird)->size) {
1475 if (
"" == (*ird)->name) {
1476 string dimname_candidate = eos5typestr + groupname + fslash_str + he5d.name;
1477 setret2 = thisvar_dimname_set.insert(dimname_candidate);
1478 if (
true == setret2.second) {
1479 (*ird)->name = dimname_candidate;
1481 (*ird)->newname = (num_groups == 1) ? he5d.name : (*ird)->name;
1482 eos5data->vardimnames.insert((*ird)->name);
1486 eos5data->dimnames_to_unlimited[(*ird)->name] = (*ird)->unlimited_dim;
1495 for (vector<Dimension *>::iterator ird = var->dims.begin(); ird != var->dims.end(); ++ird) {
1496 if (
"" == (*ird)->name)
1497 Create_Unique_DimName(eos5data, thisvar_dimname_set, *ird, num_groups, eos5type);
1506 void EOS5File::Create_Unique_DimName(T*eos5data, set<string>& thisvar_dimname_set,
Dimension *dim,
int num_groups,
1510 BESDEBUG(
"h5",
"Coming to Create_Unique_DimName"<<endl);
1511 map<hsize_t, string>::iterator itmap1;
1512 map<string, hsize_t>::iterator itmap2;
1513 pair<set<string>::iterator,
bool> setret2;
1514 itmap1 = (eos5data->dimsizes_to_dimnames).find(dim->size);
1521 if (itmap1 != (eos5data->dimsizes_to_dimnames).end()) {
1522 string dimname_candidate = (eos5data->dimsizes_to_dimnames)[dim->size];
1525 setret2 = thisvar_dimname_set.insert(dimname_candidate);
1527 if (
false == setret2.second) {
1530 bool match_some_dimname = Check_All_DimNames(eos5data, dimname_candidate, dim->size);
1532 if (
false == match_some_dimname) {
1535 Get_Unique_Name(eos5data->vardimnames, dimname_candidate);
1536 thisvar_dimname_set.insert(dimname_candidate);
1539 Insert_One_NameSizeMap_Element2(eos5data->dimnames_to_dimsizes, eos5data->dimnames_to_unlimited,
1540 dimname_candidate, dim->size, dim->unlimited_dim);
1541 eos5data->dimsizes_to_dimnames.insert(pair<hsize_t, string>(dim->size, dimname_candidate));
1542 eos5data->dimnames.push_back(dimname_candidate);
1547 dim->name = dimname_candidate;
1549 dim->newname = dim->name;
1551 string dname = HDF5CFUtil::obtain_string_after_lastslash(dim->name);
1553 throw3(
"The dimension name ", dim->name,
" of the variable is not right");
1555 dim->newname = dname;
1561 string Fakedimname = Create_Unique_FakeDimName(eos5data, eos5type);
1562 thisvar_dimname_set.insert(Fakedimname);
1565 Insert_One_NameSizeMap_Element2(eos5data->dimnames_to_dimsizes, eos5data->dimnames_to_unlimited, Fakedimname,
1566 dim->size, dim->unlimited_dim);
1567 eos5data->dimsizes_to_dimnames.insert(pair<hsize_t, string>(dim->size, Fakedimname));
1568 eos5data->dimnames.push_back(Fakedimname);
1569 dim->name = Fakedimname;
1571 dim->newname = dim->name;
1573 string dname = HDF5CFUtil::obtain_string_after_lastslash(dim->name);
1575 throw3(
"The dimension name ", dim->name,
" of the variable is not right");
1577 dim->newname = dname;
1584 bool EOS5File::Check_All_DimNames(T* eos5data,
string& dimname, hsize_t dimsize)
1587 BESDEBUG(
"h5",
"Coming to Check_All_DimNames"<<endl);
1588 bool ret_flag =
false;
1589 for (map<string, hsize_t>::iterator im = eos5data->dimnames_to_dimsizes.begin();
1590 im != eos5data->dimnames_to_dimsizes.end(); ++im) {
1592 if (dimsize == (*im).second && dimname != (*im).first) {
1593 dimname = (*im).first;
1602 void EOS5File::Get_Unique_Name(set<string> & nameset,
string& dimname_candidate)
1605 BESDEBUG(
"h5",
"Coming to Get_Unique_Name"<<endl);
1606 int clash_index = 1;
1607 string temp_clashname = dimname_candidate +
'_';
1608 HDF5CFUtil::gen_unique_name(temp_clashname, nameset, clash_index);
1609 dimname_candidate = temp_clashname;
1614 string EOS5File::Create_Unique_FakeDimName(T*eos5data, EOS5Type eos5type)
1617 BESDEBUG(
"h5",
"Coming to Create_Unique_FakeDimName"<<endl);
1618 string fslash_str =
"/";
1620 if (GRID == eos5type)
1621 eos5typestr =
"/GRIDS/";
1622 else if (SWATH == eos5type)
1623 eos5typestr =
"/SWATHS/";
1624 else if (ZA == eos5type)
1625 eos5typestr =
"/ZAS/";
1627 throw1(
"Unsupported HDF-EOS5 type, this type is not swath, grid or zonal average");
1629 stringstream sfakedimindex;
1630 sfakedimindex << eos5data->addeddimindex;
1631 string fakedimstr =
"FakeDim";
1632 string added_dimname = eos5typestr + eos5data->name + fslash_str + fakedimstr + sfakedimindex.str();
1634 pair<set<string>::iterator,
bool> setret;
1635 setret = eos5data->vardimnames.insert(added_dimname);
1636 if (
false == setret.second) Get_Unique_Name(eos5data->vardimnames, added_dimname);
1637 eos5data->addeddimindex = eos5data->addeddimindex + 1;
1638 return added_dimname;
1642 string EOS5File::Obtain_Var_EOS5Type_GroupName(
Var*var, EOS5Type eos5type)
1645 BESDEBUG(
"h5",
"Coming to Obtain_Var_EOS5Type_GroupName"<<endl);
1646 string EOS5GRIDPATH =
"/HDFEOS/GRIDS";
1647 string EOS5SWATHPATH =
"/HDFEOS/SWATHS";
1648 string EOS5ZAPATH =
"/HDFEOS/ZAS";
1649 size_t eostypename_start_pos = 0;
1650 size_t eostypename_end_pos;
1657 if (GRID == eos5type)
1658 eostypename_start_pos = EOS5GRIDPATH.size() + 1;
1659 else if (SWATH == eos5type)
1660 eostypename_start_pos = EOS5SWATHPATH.size() + 1;
1661 else if (ZA == eos5type)
1662 eostypename_start_pos = EOS5ZAPATH.size() + 1;
1664 throw2(
"Non supported eos5 type for var ", var->fullpath);
1666 eostypename_end_pos = var->fullpath.find(
'/', eostypename_start_pos) - 1;
1667 groupname = var->fullpath.substr(eostypename_start_pos, eostypename_end_pos - eostypename_start_pos + 1);
1669 BESDEBUG(
"h5",
"In Obtain_Var_EOS5Type_GroupName(), the groupname is "<<groupname << endl);
1675 int EOS5File::Check_EOS5Swath_FieldType(
Var*var)
1678 string geofield_relative_path =
"/Geolocation Fields/" + var->name;
1679 string datafield_relative_path =
"/Data Fields/" + var->name;
1683 if (var->fullpath.size() > datafield_relative_path.size()) {
1684 size_t field_pos_in_full_path = var->fullpath.size() - datafield_relative_path.size();
1685 if (var->fullpath.rfind(datafield_relative_path, field_pos_in_full_path) != string::npos) tempflag = 0;
1688 if (tempflag != 0 && (var->fullpath.size() > geofield_relative_path.size())) {
1689 size_t field_pos_in_full_path = var->fullpath.size() - geofield_relative_path.size();
1690 if (var->fullpath.rfind(geofield_relative_path, field_pos_in_full_path) != string::npos) tempflag = 1;
1698 void EOS5File::Set_NonParse_Var_Dims(T*eos5data,
Var* var, map<hsize_t, string>& ,
1699 int num_groups, EOS5Type eos5type)
1702 BESDEBUG(
"h5",
"Coming to Set_NonParse_Var_Dims"<<endl);
1703 map<hsize_t, string>::iterator itmap;
1704 set<string> thisvar_dimname_set;
1706 for (vector<Dimension *>::iterator ird = var->dims.begin(); ird != var->dims.end(); ++ird) {
1707 if (
"" == (*ird)->name)
1708 Create_Unique_DimName(eos5data, thisvar_dimname_set, *ird, num_groups, eos5type);
1710 throw5(
"The dimension name ", (*ird)->name,
" of the variable ", var->name,
" is not right");
1715 void EOS5File::Check_Aura_Product_Status()
1718 BESDEBUG(
"h5",
"Coming to Check_Aura_Product_Status"<<endl);
1721 string eos5_fattr_group_name =
"/HDFEOS/ADDITIONAL/FILE_ATTRIBUTES";
1722 string instrument_attr_name =
"InstrumentName";
1725 for (vector<Group *>::iterator irg = this->groups.begin(); irg != this->groups.end(); ++irg) {
1726 if (eos5_fattr_group_name == (*irg)->path) {
1727 for (vector<Attribute *>::iterator ira = (*irg)->attrs.begin(); ira != (*irg)->attrs.end(); ++ira) {
1728 if (instrument_attr_name == (*ira)->name) {
1729 Retrieve_H5_Attr_Value(*ira, (*irg)->path);
1730 string attr_value((*ira)->value.begin(), (*ira)->value.end());
1731 if (
"OMI" == attr_value) {
1732 this->isaura =
true;
1733 this->aura_name = OMI;
1735 else if (
"MLS Aura" == attr_value) {
1736 this->isaura =
true;
1737 this->aura_name = MLS;
1739 else if (
"TES" == attr_value) {
1740 this->isaura =
true;
1741 this->aura_name = TES;
1743 else if (
"HIRDLS" == attr_value) {
1744 this->isaura =
true;
1745 this->aura_name = HIRDLS;
1754 if (
true == this->isaura) {
1755 eos5_to_cf_attr_map[
"FillValue"] =
"_FillValue";
1756 eos5_to_cf_attr_map[
"MissingValue"] =
"missing_value";
1757 eos5_to_cf_attr_map[
"Units"] =
"units";
1758 eos5_to_cf_attr_map[
"Offset"] =
"add_offset";
1759 eos5_to_cf_attr_map[
"ScaleFactor"] =
"scale_factor";
1760 eos5_to_cf_attr_map[
"ValidRange"] =
"valid_range";
1761 eos5_to_cf_attr_map[
"Title"] =
"title";
1767 void EOS5File::Handle_CVar()
1770 BESDEBUG(
"h5",
"Coming to Handle_CVar()"<<endl);
1773 bool is_augmented = Check_Augmentation_Status();
1776 if(is_augmented) cerr<<
"The file is augmented "<<endl;
1777 else cerr<<
"The file is not augmented "<<endl;
1781 if (this->eos5cfgrids.size() > 0)
1782 Handle_Grid_CVar(is_augmented);
1783 if (this->eos5cfswaths.size() > 0)
1784 Handle_Swath_CVar(is_augmented);
1785 if (this->eos5cfzas.size() > 0)
1786 Handle_Za_CVar(is_augmented);
1789 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin();
1790 irv != this->cvars.end(); irv++) {
1791 cerr<<
"EOS5CVar name "<<(*irv)->name <<endl;
1792 cerr<<
"EOS5CVar dimension name "<< (*irv)->cfdimname <<endl;
1793 cerr<<
"EOS5CVar new name "<<(*irv)->newname <<endl;
1794 cerr<<
"EOS5CVar type is "<<(*irv)->cvartype <<endl;
1802 void EOS5File::Handle_Grid_CVar(
bool is_augmented)
1805 BESDEBUG(
"h5",
"Coming to Handle_Grid_CVar"<<endl);
1806 if (
true == is_augmented) {
1808 Handle_Augmented_Grid_CVar();
1811 Remove_MultiDim_LatLon_EOS5CFGrid();
1814 if (0 == this->eos5cfgrids.size())
return;
1815 if (1 == this->eos5cfgrids.size())
1816 Handle_Single_Nonaugment_Grid_CVar((this->eos5cfgrids)[0]);
1818 Handle_Multi_Nonaugment_Grid_CVar();
1825 bool EOS5File::Check_Augmentation_Status()
1828 BESDEBUG(
"h5",
"Coming to Check_Augmentation_Status()"<<endl);
1829 bool aug_status =
false;
1830 int num_aug_eos5grp = 0;
1832 for (vector<EOS5CFGrid *>::iterator irg = this->eos5cfgrids.begin(); irg != this->eos5cfgrids.end(); ++irg) {
1833 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
1834 bool is_augmented = Check_Augmented_Var_Candidate(*irg, *irv, GRID);
1835 if (
true == is_augmented) {
1842 for (vector<EOS5CFSwath *>::iterator irg = this->eos5cfswaths.begin(); irg != this->eos5cfswaths.end(); ++irg) {
1843 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
1844 bool is_augmented = Check_Augmented_Var_Candidate(*irg, *irv, SWATH);
1845 if (
true == is_augmented) {
1853 for (vector<EOS5CFZa *>::iterator irg = this->eos5cfzas.begin(); irg != this->eos5cfzas.end(); ++irg) {
1854 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
1855 bool is_augmented = Check_Augmented_Var_Candidate(*irg, *irv, ZA);
1856 if (
true == is_augmented) {
1863 int total_num_eos5grp = this->eos5cfgrids.size() + this->eos5cfswaths.size() + this->eos5cfzas.size();
1867 if (num_aug_eos5grp == total_num_eos5grp) aug_status =
true;
1875 bool EOS5File::Check_Augmented_Var_Attrs(
Var *var) {
1879 bool has_dimscale_class =
false;
1880 bool has_reflist =
false;
1881 for (vector<Attribute *>::iterator ira = var->attrs.begin();
1882 ira != var->attrs.end(); ++ira) {
1883 if (
"CLASS" == (*ira)->name) {
1884 Retrieve_H5_Attr_Value(*ira,var->fullpath);
1885 string class_value((*ira)->value.begin(),(*ira)->value.end());
1886 if (
"DIMENSION_SCALE"==class_value)
1887 has_dimscale_class =
true;
1890 if (
"REFERENCE_LIST" == (*ira)->name)
1892 if (
true == has_reflist &&
true == has_dimscale_class)
1896 if (
true == has_reflist &&
true == has_dimscale_class)
1911 bool EOS5File::Check_Augmented_Var_Candidate(T *eos5data,
Var *var, EOS5Type eos5type)
1914 BESDEBUG(
"h5",
"Coming to Check_Augmented_Var_Candidate"<<endl);
1915 bool augmented_var =
false;
1917 string EOS5DATAPATH =
"";
1918 if (GRID == eos5type)
1919 EOS5DATAPATH =
"/HDFEOS/GRIDS/";
1920 else if (ZA == eos5type)
1921 EOS5DATAPATH =
"/HDFEOS/ZAS/";
1922 else if (SWATH == eos5type)
1923 EOS5DATAPATH =
"/HDFEOS/SWATHS/";
1925 throw1(
"Non supported EOS5 type");
1927 string fslash_str =
"/";
1928 string THIS_EOS5DATAPATH = EOS5DATAPATH + eos5data->name + fslash_str;
1931 if (eos5type == Get_Var_EOS5_Type(var)) {
1932 string var_eos5data_name = Obtain_Var_EOS5Type_GroupName(var, eos5type);
1934 if (var_eos5data_name == eos5data->name) {
1935 if (var->fullpath.size() > THIS_EOS5DATAPATH.size()) {
1937 string var_path_after_eos5dataname = var->fullpath.substr(THIS_EOS5DATAPATH.size());
1939 if (var_path_after_eos5dataname == var->name) augmented_var =
true;
1944 return augmented_var;
1949 void EOS5File::Handle_Augmented_Grid_CVar()
1951 BESDEBUG(
"h5",
"Coming to Handle_Augmented_Grid_CVar()"<<endl);
1952 for (vector<EOS5CFGrid *>::iterator irv = this->eos5cfgrids.begin(); irv != this->eos5cfgrids.end(); ++irv)
1953 Handle_Single_Augment_CVar(*irv, GRID);
1958 void EOS5File::Handle_Single_Augment_CVar(T* cfeos5data, EOS5Type eos5type)
1961 BESDEBUG(
"h5",
"Coming to Handle_Single_Augment_CVar()"<<endl);
1962 set<string> tempvardimnamelist;
1963 tempvardimnamelist = cfeos5data->vardimnames;
1964 set<string>::iterator its;
1965 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its) {
1966 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end();) {
1968 bool is_augmented = Check_Augmented_Var_Candidate(cfeos5data, *irv, eos5type);
1970 if (
true == is_augmented) {
1974 string tempdimname = HDF5CFUtil::obtain_string_after_lastslash(*its);
1977 if (tempdimname == (*irv)->name) {
1984 EOS5cvar->cfdimname = *its;
1985 EOS5cvar->cvartype = CV_EXIST;
1986 EOS5cvar->eos_type = eos5type;
1989 this->cvars.push_back(EOS5cvar);
1993 irv = this->vars.erase(irv);
2005 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
2006 its = tempvardimnamelist.find((*irv)->cfdimname);
2007 if (its != tempvardimnamelist.end()) tempvardimnamelist.erase(its);
2010 if (
false == tempvardimnamelist.empty())
2011 throw1(
"Augmented files still need to provide more coordinate variables");
2017 void EOS5File::Remove_MultiDim_LatLon_EOS5CFGrid()
2020 BESDEBUG(
"h5",
"Coming to Remove_MultiDim_LatLon_EOS5CFGrid()"<<endl);
2021 for (vector<EOS5CFGrid *>::iterator irg = this->eos5cfgrids.begin(); irg != this->eos5cfgrids.end();) {
2032 bool irg_erase =
false;
2034 if (
true == (*irg)->has_2dlatlon) {
2036 if ((
true == this->isaura) && (OMI == this->aura_name) && (HE5_GCTP_GEO == (*irg)->eos5_projcode))
2040 string EOS5GRIDPATH =
"/HDFEOS/GRIDS/";
2041 string fslash_str =
"/";
2042 string THIS_EOS5GRIDPATH = EOS5GRIDPATH + (*irg)->name + fslash_str;
2043 int catch_latlon = 0;
2045 for (vector<Var *>::iterator irv = this->vars.begin(); (irv != this->vars.end()) && (catch_latlon != 2);
2047 if (GRID == Get_Var_EOS5_Type(*irv) && ((*irv)->fullpath.size() > THIS_EOS5GRIDPATH.size())) {
2049 string var_grid_name = Obtain_Var_EOS5Type_GroupName(*irv, GRID);
2050 if (var_grid_name == (*irg)->name) {
2051 if ((
"Longitude" == (*irv)->name) || (
"Latitude" == (*irv)->name)) {
2055 irv = this->vars.erase(irv);
2069 if (2 == catch_latlon) {
2070 (*irg)->has_nolatlon =
true;
2071 (*irg)->has_2dlatlon =
false;
2077 irg = this->eos5cfgrids.erase(irg);
2082 if (
false == irg_erase) {
2089 for (vector<EOS5CFGrid *>::iterator irg = this->eos5cfgrids.begin(); irg != this->eos5cfgrids.end();) {
2091 if (
true == (*irg)->has_g2dlatlon) {
2093 irg = this->eos5cfgrids.erase(irg);
2102 void EOS5File::Handle_Single_Nonaugment_Grid_CVar(
EOS5CFGrid* cfgrid)
2105 BESDEBUG(
"h5",
"Coming to Handle_Single_Nonaugment_Grid_CVar()"<<endl);
2106 set<string> tempvardimnamelist;
2107 tempvardimnamelist = cfgrid->vardimnames;
2110 bool use_own_latlon =
false;
2111 if (
true == cfgrid->has_1dlatlon)
2112 use_own_latlon = Handle_Single_Nonaugment_Grid_CVar_OwnLatLon(cfgrid, tempvardimnamelist);
2114 if(use_own_latlon)
"h5",
"using 1D latlon"<<endl;
2115 else "h5",
"use_own_latlon is false "<<endl;
2118 if (
false == use_own_latlon) {
2119 bool use_eos5_latlon =
false;
2120 use_eos5_latlon = Handle_Single_Nonaugment_Grid_CVar_EOS5LatLon(cfgrid, tempvardimnamelist);
2123 if (
false == use_eos5_latlon)
return;
2127 Handle_NonLatLon_Grid_CVar(cfgrid, tempvardimnamelist);
2132 bool EOS5File::Handle_Single_Nonaugment_Grid_CVar_OwnLatLon(
EOS5CFGrid *cfgrid, set<string>& tempvardimnamelist)
2136 BESDEBUG(
"h5",
"Coming to Handle_Single_Nonaugment_Grid_CVar_OwnLatLon()"<<endl);
2137 set<string>::iterator its;
2138 string EOS5GRIDPATH =
"/HDFEOS/GRIDS/";
2139 string fslash_str =
"/";
2140 string THIS_EOS5GRIDPATH = EOS5GRIDPATH + cfgrid->name + fslash_str;
2143 bool find_latydim =
false;
2144 bool find_lonxdim =
false;
2146 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
2147 if (GRID == Get_Var_EOS5_Type(*irv) && ((*irv)->fullpath.size() > THIS_EOS5GRIDPATH.size())) {
2149 string var_grid_name = Obtain_Var_EOS5Type_GroupName(*irv, GRID);
2150 if ((var_grid_name == cfgrid->name) && ((*irv)->name ==
"Latitude")) {
2152 string tempdimname = (((*irv)->dims)[0])->name;
2154 if (
"YDim" == HDF5CFUtil::obtain_string_after_lastslash(tempdimname)) {
2160 EOS5cvar->cfdimname = tempdimname;
2161 EOS5cvar->cvartype = CV_EXIST;
2162 EOS5cvar->eos_type = GRID;
2165 this->cvars.push_back(EOS5cvar);
2169 this->vars.erase(irv);
2172 find_latydim =
true;
2179 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
2181 if (GRID == Get_Var_EOS5_Type(*irv) && ((*irv)->fullpath.size() > THIS_EOS5GRIDPATH.size())) {
2183 string var_grid_name = Obtain_Var_EOS5Type_GroupName(*irv, GRID);
2185 if ((var_grid_name == cfgrid->name) && ((*irv)->name ==
"Longitude")) {
2187 string tempdimname = (((*irv)->dims)[0])->name;
2189 if (
"XDim" == HDF5CFUtil::obtain_string_after_lastslash(tempdimname)) {
2195 EOS5cvar->cfdimname = tempdimname;
2196 EOS5cvar->cvartype = CV_EXIST;
2197 EOS5cvar->eos_type = GRID;
2200 this->cvars.push_back(EOS5cvar);
2204 this->vars.erase(irv);
2205 find_lonxdim =
true;
2212 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
2213 its = tempvardimnamelist.find((*irv)->cfdimname);
2214 if (its != tempvardimnamelist.end()) tempvardimnamelist.erase(its);
2219 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its)
2220 "h5",
"tempvardim "<<*its <<endl;
2223 return (find_latydim ==
true && find_lonxdim ==
true);
2227 bool EOS5File::Handle_Single_Nonaugment_Grid_CVar_EOS5LatLon(
EOS5CFGrid *cfgrid, set<string>& tempvardimnamelist)
2231 BESDEBUG(
"h5",
"Coming to Handle_Single_Nonaugment_Grid_CVar_EOS5LatLon()"<<endl);
2234 bool find_ydim =
false;
2235 bool find_xdim =
false;
2236 set<string>::iterator its;
2239 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its)
2240 cerr<<
"dim names "<<(*its) <<endl;
2243 string ydim_full_path;
2244 string xdim_full_path;
2246 if (cfgrid->eos5_projcode != HE5_GCTP_GEO) {
2248 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its) {
2249 if (
"YDim" == HDF5CFUtil::obtain_string_after_lastslash(*its))
2250 ydim_full_path = *its;
2251 else if (
"XDim" == HDF5CFUtil::obtain_string_after_lastslash(*its)) xdim_full_path = *its;
2256 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end();) {
2257 if (
"YDim" == HDF5CFUtil::obtain_string_after_lastslash(*its)) {
2261 EOS5cvar->name =
"lat";
2262 Create_Added_Var_NewName_FullPath(GRID, cfgrid->name, EOS5cvar->name, EOS5cvar->newname,
2263 EOS5cvar->fullpath);
2265 if (cfgrid->eos5_projcode != HE5_GCTP_GEO) {
2267 EOS5cvar->dtype = H5FLOAT64;
2271 EOS5cvar->dtype = H5FLOAT32;
2275 eos5cvar_dim->name = *its;
2276 eos5cvar_dim->newname = (this->eos5cfgrids.size() == 1) ?
"YDim" : *its;
2277 EOS5cvar->dims.push_back(eos5cvar_dim);
2278 EOS5cvar->cfdimname = eos5cvar_dim->name;
2280 if (EOS5cvar->rank == 2) {
2282 eos5cvar_dim =
new Dimension((hsize_t) cfgrid->xdimsize);
2283 eos5cvar_dim->name = xdim_full_path;
2284 eos5cvar_dim->newname = (this->eos5cfgrids.size() == 1) ?
"XDim" : xdim_full_path;
2285 EOS5cvar->dims.push_back(eos5cvar_dim);
2288 EOS5cvar->cvartype = CV_LAT_MISS;
2289 EOS5cvar->eos_type = GRID;
2290 EOS5cvar->xdimsize = cfgrid->xdimsize;
2291 EOS5cvar->ydimsize = cfgrid->ydimsize;
2294 EOS5cvar->point_lower = cfgrid->point_lower;
2295 EOS5cvar->point_upper = cfgrid->point_upper;
2296 EOS5cvar->point_left = cfgrid->point_left;
2297 EOS5cvar->point_right = cfgrid->point_right;
2298 EOS5cvar->eos5_pixelreg = cfgrid->eos5_pixelreg;
2299 EOS5cvar->eos5_origin = cfgrid->eos5_origin;
2300 EOS5cvar->eos5_projcode = cfgrid->eos5_projcode;
2302 for (
unsigned int k = 0; k < 13; k++)
2303 EOS5cvar->param[k] = cfgrid->param[k];
2305 EOS5cvar->zone = cfgrid->zone;
2306 EOS5cvar->sphere = cfgrid->sphere;
2309 this->cvars.push_back(EOS5cvar);
2313 tempvardimnamelist.erase(its++);
2317 else if (
"XDim" == HDF5CFUtil::obtain_string_after_lastslash(*its)) {
2321 EOS5cvar->name =
"lon";
2322 Create_Added_Var_NewName_FullPath(GRID, cfgrid->name, EOS5cvar->name, EOS5cvar->newname,
2323 EOS5cvar->fullpath);
2328 if (cfgrid->eos5_projcode != HE5_GCTP_GEO) {
2330 EOS5cvar->dtype = H5FLOAT64;
2334 EOS5cvar->dtype = H5FLOAT32;
2338 if (EOS5cvar->rank == 2) {
2339 eos5cvar_dim =
new Dimension((hsize_t) cfgrid->ydimsize);
2343 eos5cvar_dim->name = ydim_full_path;
2344 eos5cvar_dim->newname = (this->eos5cfgrids.size() == 1) ?
"YDim" : ydim_full_path;
2345 EOS5cvar->dims.push_back(eos5cvar_dim);
2348 eos5cvar_dim =
new Dimension((hsize_t) cfgrid->xdimsize);
2352 eos5cvar_dim->name = *its;
2353 eos5cvar_dim->newname = (this->eos5cfgrids.size() == 1) ?
"XDim" : *its;
2354 EOS5cvar->dims.push_back(eos5cvar_dim);
2355 EOS5cvar->cfdimname = eos5cvar_dim->name;
2357 EOS5cvar->cvartype = CV_LON_MISS;
2358 EOS5cvar->eos_type = GRID;
2359 EOS5cvar->xdimsize = cfgrid->xdimsize;
2360 EOS5cvar->ydimsize = cfgrid->ydimsize;
2363 EOS5cvar->point_lower = cfgrid->point_lower;
2364 EOS5cvar->point_upper = cfgrid->point_upper;
2365 EOS5cvar->point_left = cfgrid->point_left;
2366 EOS5cvar->point_right = cfgrid->point_right;
2367 EOS5cvar->eos5_pixelreg = cfgrid->eos5_pixelreg;
2368 EOS5cvar->eos5_origin = cfgrid->eos5_origin;
2369 EOS5cvar->eos5_projcode = cfgrid->eos5_projcode;
2370 for (
unsigned int k = 0; k < 13; k++)
2371 EOS5cvar->param[k] = cfgrid->param[k];
2372 EOS5cvar->zone = cfgrid->zone;
2373 EOS5cvar->sphere = cfgrid->sphere;
2376 this->cvars.push_back(EOS5cvar);
2379 tempvardimnamelist.erase(its++);
2385 if (
true == find_xdim &&
true == find_ydim)
break;
2388 return (
true == find_xdim &&
true == find_ydim);
2392 void EOS5File::Handle_NonLatLon_Grid_CVar(
EOS5CFGrid *cfgrid, set<string>& tempvardimnamelist)
2396 set<string>::iterator its;
2397 int num_dimnames = tempvardimnamelist.size();
2398 bool has_dimnames =
true;
2400 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its) {
2401 if (cfgrid->dnames_to_1dvnames.find(*its) != cfgrid->dnames_to_1dvnames.end()) {
2402 for (vector<Var *>::iterator irv = this->vars.begin(); has_dimnames && (irv != this->vars.end());) {
2406 if (GRID == Get_Var_EOS5_Type(*irv) && (*irv)->newname == (cfgrid->dnames_to_1dvnames)[*its]) {
2413 EOS5cvar->cfdimname = *its;
2414 EOS5cvar->cvartype = CV_EXIST;
2415 EOS5cvar->eos_type = GRID;
2418 this->cvars.push_back(EOS5cvar);
2422 irv = this->vars.erase(irv);
2424 if (0 == num_dimnames) has_dimnames =
false;
2434 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
2435 its = tempvardimnamelist.find((*irv)->cfdimname);
2436 if (its != tempvardimnamelist.end()) tempvardimnamelist.erase(its);
2440 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its) {
2443 Create_Missing_CV(cfgrid, EOS5cvar, *its, GRID, this->eos5cfgrids.size());
2444 this->cvars.push_back(EOS5cvar);
2450 void EOS5File::Handle_Multi_Nonaugment_Grid_CVar()
2453 BESDEBUG(
"h5",
"Coming to Handle_Multi_nonaugment_Grid_CVar()"<<endl);
2457 if (
true == this->grids_multi_latloncvs) {
2458 for (vector<EOS5CFGrid *>::iterator irv = this->eos5cfgrids.begin(); irv != this->eos5cfgrids.end(); ++irv)
2459 Handle_Single_Nonaugment_Grid_CVar(*irv);
2470 int num_1dlatlon_pairs = 0;
2471 for (vector<EOS5CFGrid *>::iterator irv = this->eos5cfgrids.begin(); irv != this->eos5cfgrids.end(); ++irv)
2472 if (
true == (*irv)->has_1dlatlon) num_1dlatlon_pairs++;
2474 bool use_eos5_latlon =
false;
2475 if ((0 == num_1dlatlon_pairs)
2476 || ((num_1dlatlon_pairs == (
int) (this->eos5cfgrids.size())) && (
true == this->isaura))) {
2477 set<string> tempvardimnamelist = ((this->eos5cfgrids)[0])->vardimnames;
2478 if (0 == num_1dlatlon_pairs) {
2479 use_eos5_latlon = Handle_Single_Nonaugment_Grid_CVar_EOS5LatLon((this->eos5cfgrids)[0],
2480 tempvardimnamelist);
2482 if (
false == use_eos5_latlon)
return;
2487 bool use_own_latlon =
false;
2488 use_own_latlon = Handle_Single_Nonaugment_Grid_CVar_OwnLatLon((this->eos5cfgrids)[0],
2489 tempvardimnamelist);
2490 if (
false == use_own_latlon) {
2491 use_eos5_latlon = Handle_Single_Nonaugment_Grid_CVar_EOS5LatLon((this->eos5cfgrids)[0],
2492 tempvardimnamelist);
2493 if (
false == use_eos5_latlon)
return;
2498 Handle_NonLatLon_Grid_CVar((this->eos5cfgrids)[0], tempvardimnamelist);
2501 for (
unsigned j = 1; j < this->eos5cfgrids.size(); j++)
2502 (this->eos5cfgrids)[j]->Update_Dimnamelist();
2505 Adjust_EOS5GridDimNames((this->eos5cfgrids)[0]);
2508 for (
unsigned j = 1; j < this->eos5cfgrids.size(); j++) {
2509 tempvardimnamelist = (this->eos5cfgrids)[j]->vardimnames;
2510 Handle_NonLatLon_Grid_CVar((this->eos5cfgrids)[j], tempvardimnamelist);
2511 tempvardimnamelist.clear();
2517 this->grids_multi_latloncvs =
true;
2518 for (vector<EOS5CFGrid *>::iterator irv = this->eos5cfgrids.begin(); irv != this->eos5cfgrids.end(); ++irv)
2519 Handle_Single_Nonaugment_Grid_CVar(*irv);
2527 void EOS5File::Adjust_EOS5GridDimNames(
EOS5CFGrid *cfgrid)
2530 BESDEBUG(
"h5",
"Coming to Adjust_EOS5GridDimNames()"<<endl);
2533 bool find_xdim =
false;
2534 bool find_ydim =
false;
2536 for (set<string>::iterator it = cfgrid->vardimnames.begin(); it != cfgrid->vardimnames.end(); ++it) {
2537 string xydimname_candidate = HDF5CFUtil::obtain_string_after_lastslash(*it);
2538 if (
"XDim" == xydimname_candidate) {
2542 else if (
"YDim" == xydimname_candidate) {
2546 if (find_xdim && find_ydim)
break;
2549 if (
false == find_xdim ||
false == find_ydim)
2550 throw2(
"Cannot find Dimension name that includes XDim or YDim in the grid ", cfgrid->name);
2552 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
2553 if (GRID == Get_Var_EOS5_Type(*irv)) {
2554 for (vector<Dimension *>::iterator
id = (*irv)->dims.begin();
id != (*irv)->dims.end(); ++
id) {
2555 string xydimname_candidate = HDF5CFUtil::obtain_string_after_lastslash((*id)->name);
2556 if (
"XDim" == xydimname_candidate)
2557 (*id)->name = xdimname;
2558 else if (
"YDim" == xydimname_candidate) (*id)->name = ydimname;
2565 void EOS5File::Handle_Swath_CVar(
bool isaugmented)
2568 BESDEBUG(
"h5",
"Coming to Handle_Swath_CVar()"<<endl);
2572 for (vector<EOS5CFSwath *>::iterator irs = this->eos5cfswaths.begin(); irs != this->eos5cfswaths.end();) {
2573 if ((*irs)->has_1dlatlon) {
2574 Handle_Single_1DLatLon_Swath_CVar(*irs, isaugmented);
2577 else if ((*irs)->has_2dlatlon) {
2578 Handle_Single_2DLatLon_Swath_CVar(*irs, isaugmented);
2588 irs = this->eos5cfswaths.erase(irs);
2594 void EOS5File::Handle_Single_1DLatLon_Swath_CVar(
EOS5CFSwath *cfswath,
bool is_augmented)
2597 BESDEBUG(
"h5",
"Coming to Handle_Single_1DLatLon_Swath_CVar"<<endl);
2599 set<string>::iterator its;
2600 set<string> tempvardimnamelist = cfswath->vardimnames;
2601 string EOS5SWATHPATH =
"/HDFEOS/SWATHS/";
2602 string fslash_str =
"/";
2603 string THIS_EOS5SWATHPATH = EOS5SWATHPATH + cfswath->name + fslash_str;
2605 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its)
2606 cerr<<
"Dimension name befor latitude " << *its << endl;
2611 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
2612 if (SWATH == Get_Var_EOS5_Type(*irv) && ((*irv)->fullpath.size() > THIS_EOS5SWATHPATH.size())) {
2614 string var_swath_name = Obtain_Var_EOS5Type_GroupName(*irv, SWATH);
2615 if ((var_swath_name == cfswath->name) && ((*irv)->name ==
"Latitude")) {
2622 EOS5cvar->cfdimname = ((*irv)->dims)[0]->name;
2623 EOS5cvar->cvartype = CV_EXIST;
2624 EOS5cvar->eos_type = SWATH;
2627 this->cvars.push_back(EOS5cvar);
2631 this->vars.erase(irv);
2641 bool find_lat_dim =
false;
2642 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its) {
2644 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
2645 if (((*irv)->name ==
"Latitude") && (*irv)->cfdimname == (*its)) {
2646 tempvardimnamelist.erase(its);
2647 find_lat_dim =
true;
2652 if (
true == find_lat_dim)
break;
2656 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its)
2657 cerr<<
"Dimension name afte latitude " << *its << endl;
2660 Handle_NonLatLon_Swath_CVar(cfswath, tempvardimnamelist);
2663 if (
true == is_augmented) {
2664 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end();) {
2666 if (SWATH == Get_Var_EOS5_Type(*irv)) {
2668 string my_swath_short_path = (*irv)->fullpath.substr(EOS5SWATHPATH.size());
2669 size_t first_fslash_pos = my_swath_short_path.find_first_of(
"/");
2670 string my_swath_name = my_swath_short_path.substr(0,first_fslash_pos);
2673 string my_swath_name = Obtain_Var_EOS5Type_GroupName(*irv, SWATH);
2675 if (my_swath_name == cfswath->name) {
2676 string var_path_after_swathname = (*irv)->fullpath.substr(THIS_EOS5SWATHPATH.size());
2677 if (var_path_after_swathname == (*irv)->name) {
2679 irv = this->vars.erase(irv);
2697 void EOS5File::Handle_Single_2DLatLon_Swath_CVar(
EOS5CFSwath *cfswath,
bool is_augmented)
2700 BESDEBUG(
"h5",
"Coming to Handle_Single_2DLatLon_Swath_CVar()"<<endl);
2702 set<string>::iterator its;
2703 set<string> tempvardimnamelist = cfswath->vardimnames;
2704 string EOS5SWATHPATH =
"/HDFEOS/SWATHS/";
2705 string fslash_str =
"/";
2706 string THIS_EOS5SWATHPATH = EOS5SWATHPATH + cfswath->name + fslash_str;
2707 bool find_lat =
false;
2708 bool find_lon =
false;
2711 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its)
2712 cerr<<
"Dimension name befor latitude " << *its << endl;
2716 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end();) {
2717 if (SWATH == Get_Var_EOS5_Type(*irv) && ((*irv)->fullpath.size() > THIS_EOS5SWATHPATH.size())) {
2718 string var_swath_name = Obtain_Var_EOS5Type_GroupName(*irv, SWATH);
2719 if ((var_swath_name == cfswath->name) && ((*irv)->name ==
"Latitude")) {
2726 EOS5cvar->cfdimname = ((*irv)->dims)[0]->name;
2727 EOS5cvar->cvartype = CV_EXIST;
2728 EOS5cvar->eos_type = SWATH;
2729 EOS5cvar->is_2dlatlon =
true;
2732 this->cvars.push_back(EOS5cvar);
2736 irv = this->vars.erase(irv);
2739 else if ((var_swath_name == cfswath->name) && ((*irv)->name ==
"Longitude")) {
2746 EOS5cvar->cfdimname = ((*irv)->dims)[1]->name;
2747 EOS5cvar->cvartype = CV_EXIST;
2748 EOS5cvar->eos_type = SWATH;
2749 EOS5cvar->is_2dlatlon =
true;
2752 this->cvars.push_back(EOS5cvar);
2756 irv = this->vars.erase(irv);
2768 if (
true == find_lat &&
true == find_lon)
break;
2773 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its) {
2774 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
2775 if (((*irv)->name ==
"Latitude") && (*irv)->cfdimname == (*its)) {
2776 tempvardimnamelist.erase(its);
2782 if (
true == find_lat)
break;
2787 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its) {
2789 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
2791 if (((*irv)->name ==
"Longitude") && (*irv)->cfdimname == (*its)) {
2792 tempvardimnamelist.erase(its);
2798 if (
true == find_lon)
break;
2802 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its)
2803 cerr<<
"Dimension name afte latitude " << *its << endl;
2806 Handle_NonLatLon_Swath_CVar(cfswath, tempvardimnamelist);
2813 if (
true == is_augmented) {
2814 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end();) {
2816 if (SWATH == Get_Var_EOS5_Type(*irv)) {
2818 string my_swath_name = Obtain_Var_EOS5Type_GroupName(*irv, SWATH);
2819 if (my_swath_name == cfswath->name) {
2820 string var_path_after_swathname = (*irv)->fullpath.substr(THIS_EOS5SWATHPATH.size());
2821 if (var_path_after_swathname == (*irv)->name) {
2823 irv = this->vars.erase(irv);
2841 void EOS5File::Handle_NonLatLon_Swath_CVar(
EOS5CFSwath *cfswath, set<string>& tempvardimnamelist)
2844 BESDEBUG(
"h5",
"Coming to Handle_NonLatLon_Swath_CVar()"<<endl);
2846 set<string>::iterator its;
2847 int num_dimnames = tempvardimnamelist.size();
2848 bool has_dimnames =
true;
2849 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its) {
2850 if (cfswath->dnames_to_geo1dvnames.find(*its) != cfswath->dnames_to_geo1dvnames.end()) {
2851 for (vector<Var *>::iterator irv = this->vars.begin(); has_dimnames && (irv != this->vars.end());) {
2856 if (SWATH == Get_Var_EOS5_Type(*irv) && (*irv)->newname == (cfswath->dnames_to_geo1dvnames)[*its]) {
2863 EOS5cvar->cfdimname = *its;
2864 EOS5cvar->cvartype = CV_EXIST;
2865 EOS5cvar->eos_type = SWATH;
2868 this->cvars.push_back(EOS5cvar);
2872 irv = this->vars.erase(irv);
2875 if (0 == num_dimnames) has_dimnames =
false;
2885 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
2886 its = tempvardimnamelist.find((*irv)->cfdimname);
2887 if (its != tempvardimnamelist.end()) tempvardimnamelist.erase(its);
2892 Handle_Special_NonLatLon_Swath_CVar(cfswath, tempvardimnamelist);
2895 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
2896 its = tempvardimnamelist.find((*irv)->cfdimname);
2897 if (its != tempvardimnamelist.end()) tempvardimnamelist.erase(its);
2901 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its) {
2904 Create_Missing_CV(cfswath, EOS5cvar, *its, SWATH, this->eos5cfswaths.size());
2905 this->cvars.push_back(EOS5cvar);
2911 void EOS5File::Handle_Special_NonLatLon_Swath_CVar(
EOS5CFSwath *cfswath, set<string>& tempvardimnamelist)
2915 BESDEBUG(
"h5",
"Handle_Special_NonLatLon_Swath_CVar()"<<endl);
2922 if (
true == this->isaura && TES == this->aura_name) {
2924 string eos5_swath_group_name =
"/HDFEOS/SWATHS/" + cfswath->name;
2925 string eos5_vc_attr_name =
"VerticalCoordinate";
2926 string eos5_pre_attr_name =
"Pressure";
2927 bool has_vc_attr =
false;
2928 Group *vc_group = NULL;
2931 for (vector<Group *>::iterator irg = this->groups.begin(); irg != this->groups.end(); ++irg) {
2932 if (eos5_swath_group_name == (*irg)->path) {
2933 for (vector<Attribute *>::iterator ira = (*irg)->attrs.begin(); ira != (*irg)->attrs.end(); ++ira) {
2934 if (eos5_vc_attr_name == (*ira)->name) {
2935 Retrieve_H5_Attr_Value(*ira, (*irg)->path);
2936 string attr_value((*ira)->value.begin(), (*ira)->value.end());
2937 if (eos5_pre_attr_name == attr_value) {
2944 if (
true == has_vc_attr)
break;
2962 if (
true == has_vc_attr) {
2963 string dimname_candidate =
"/SWATHS/" + cfswath->name +
"/nLevels";
2964 set<string>::iterator it;
2965 for (it = tempvardimnamelist.begin(); it != tempvardimnamelist.end(); ++it) {
2966 if ((*it).find(dimname_candidate) != string::npos) {
2967 hsize_t dimsize_candidate = 0;
2968 if ((cfswath->dimnames_to_dimsizes).find(*it) != (cfswath->dimnames_to_dimsizes).end())
2969 dimsize_candidate = cfswath->dimnames_to_dimsizes[*it];
2971 throw2(
"Cannot find the dimension size of the dimension name ", *it);
2978 for (vector<Attribute *>::iterator ira = vc_group->attrs.begin(); ira != vc_group->attrs.end();
2980 if ((eos5_pre_attr_name == (*ira)->name) && ((*ira)->count == (dimsize_candidate - 1))) {
2985 string reduced_dimname = HDF5CFUtil::obtain_string_after_lastslash(*it);
2986 string orig_dimname =
"nLevels";
2987 if (
"nLevels" == reduced_dimname)
2988 EOS5cvar->name = eos5_pre_attr_name +
"_CV";
2991 EOS5cvar->name = eos5_pre_attr_name +
"_CV"
2992 + reduced_dimname.substr(orig_dimname.size());
2993 Create_Added_Var_NewName_FullPath(SWATH, cfswath->name, EOS5cvar->name, EOS5cvar->newname,
2994 EOS5cvar->fullpath);
2996 EOS5cvar->dtype = (*ira)->dtype;
2998 eos5cvar_dim->name = *it;
2999 if (1 == this->eos5cfswaths.size())
3000 eos5cvar_dim->newname = reduced_dimname;
3002 eos5cvar_dim->newname = eos5cvar_dim->name;
3004 EOS5cvar->dims.push_back(eos5cvar_dim);
3005 EOS5cvar->cvartype = CV_SPECIAL;
3006 EOS5cvar->cfdimname = eos5cvar_dim->name;
3007 EOS5cvar->eos_type = SWATH;
3010 this->cvars.push_back(EOS5cvar);
3020 void EOS5File::Handle_Za_CVar(
bool isaugmented)
3023 BESDEBUG(
"h5",
"Coming to Handle_Za_CVar()"<<endl);
3025 if (
false == isaugmented)
return;
3027 for (vector<EOS5CFZa *>::iterator irv = this->eos5cfzas.begin(); irv != this->eos5cfzas.end(); ++irv)
3028 Handle_Single_Augment_CVar(*irv, ZA);
3033 void EOS5File::Adjust_Var_Dim_NewName_Before_Flattening()
3036 BESDEBUG(
"h5",
"Coming to Adjust_Var_Dim_NewName_Before_Flattening()"<<endl);
3037 int num_grids = this->eos5cfgrids.size();
3038 int num_swaths = this->eos5cfswaths.size();
3039 int num_zas = this->eos5cfzas.size();
3041 bool mixed_eos5typefile =
false;
3044 if (((num_grids > 0) && (num_swaths > 0)) || ((num_grids > 0) && (num_zas > 0))
3045 || ((num_swaths > 0) && (num_zas > 0))) mixed_eos5typefile =
true;
3048 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv)
3049 Adjust_Per_Var_Dim_NewName_Before_Flattening(*irv, mixed_eos5typefile, num_grids, num_swaths, num_zas);
3051 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv)
3052 Adjust_Per_Var_Dim_NewName_Before_Flattening(*irv, mixed_eos5typefile, num_grids, num_swaths, num_zas);
3054 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin();
3055 irv != this->cvars.end(); ++irv) {
3056 cerr<<
"eos5svar var new name "<<(*irv)->newname <<endl;
3057 for (vector<Dimension *>::iterator ird = (*irv)->dims.begin();
3058 ird !=(*irv)->dims.end(); ++ird) {
3059 cerr<<
"eos5svar dimension new name "<<(*ird)->newname <<endl;
3064 Adjust_SharedLatLon_Grid_Var_Dim_Name();
3070 void EOS5File::Adjust_Per_Var_Dim_NewName_Before_Flattening(T* var,
bool mixed_eos5type,
int num_grids,
int num_swaths,
3074 BESDEBUG(
"h5",
"Coming to Adjust_Per_Var_Dim_NewName_Before_Flattening()"<<endl);
3077 EOS5Type vartype = Get_Var_EOS5_Type(var);
3081 eos5typestr =
"/GRIDS/";
3082 if (
false == mixed_eos5type) {
3084 var->newname = ((1 == this->orig_num_grids) ? var->name : var->newname.substr(eos5typestr.size()));
3086 var->newname = ((1 == num_grids) ? var->name : var->newname.substr(eos5typestr.size()));
3101 if (num_grids > 1) {
3102 for (vector<Dimension *>::iterator ird = var->dims.begin(); ird != var->dims.end(); ird++) {
3103 if ((*ird)->newname.size() <= eos5typestr.size())
3104 throw5(
"The size of the dimension new name ", (*ird)->newname,
"of variable ", var->newname,
3106 (*ird)->newname = (*ird)->newname.substr(eos5typestr.size());
3112 var->newname = ((1 == num_grids) ? (eos5typestr + var->name) : var->newname);
3118 eos5typestr =
"/SWATHS/";
3119 if (
false == mixed_eos5type) {
3120 var->newname = ((1 == num_swaths) ? var->name : var->newname.substr(eos5typestr.size()));
3121 if (num_swaths > 1) {
3122 for (vector<Dimension *>::iterator ird = var->dims.begin(); ird != var->dims.end(); ird++) {
3123 if ((*ird)->newname.size() <= eos5typestr.size())
3124 throw5(
"The size of the dimension new name ", (*ird)->newname,
"of variable ", var->newname,
3126 (*ird)->newname = (*ird)->newname.substr(eos5typestr.size());
3131 var->newname = ((1 == num_swaths) ? (eos5typestr + var->name) : var->newname);
3137 eos5typestr =
"/ZAS/";
3138 if (
false == mixed_eos5type) {
3139 var->newname = ((1 == num_zas) ? var->name : var->newname.substr(eos5typestr.size()));
3141 for (vector<Dimension *>::iterator ird = var->dims.begin(); ird != var->dims.end(); ird++) {
3142 if ((*ird)->newname.size() <= eos5typestr.size())
3143 throw5(
"The size of the dimension new name ", (*ird)->newname,
"of variable ", var->newname,
3145 (*ird)->newname = (*ird)->newname.substr(eos5typestr.size());
3150 var->newname = ((1 == num_zas) ? (eos5typestr + var->name) : var->newname);
3157 throw1(
"Non-supported EOS type");
3163 void EOS5File::Adjust_SharedLatLon_Grid_Var_Dim_Name()
3166 BESDEBUG(
"h5",
"Adjust_SharedLatLon_Grid_Var_Dim_Name()"<<endl);
3171 if ((this->eos5cfgrids.size() > 1) && (0 == this->eos5cfswaths.size()) && (0 == this->eos5cfzas.size())
3172 && (
false == this->grids_multi_latloncvs)) {
3176 string lat_dimnewname;
3178 string lon_dimnewname;
3179 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
3180 if (
"lat" == (*irv)->name ||
"Latitude" == (*irv)->name) {
3181 (*irv)->newname = (*irv)->name;
3182 lat_dimnewname = (((*irv)->dims)[0])->newname;
3183 lat_dimnewname = HDF5CFUtil::obtain_string_after_lastslash(lat_dimnewname);
3184 if (
"" == lat_dimnewname)
3185 throw2(
"/ is not included in the dimension new name ", (((*irv)->dims)[0])->newname);
3186 (((*irv)->dims)[0])->newname = lat_dimnewname;
3187 lat_dimname = (*irv)->cfdimname;
3189 else if (
"lon" == (*irv)->name ||
"Longitude" == (*irv)->name) {
3190 (*irv)->newname = (*irv)->name;
3191 lon_dimnewname = (((*irv)->dims)[0])->newname;
3192 lon_dimnewname = HDF5CFUtil::obtain_string_after_lastslash(lon_dimnewname);
3193 if (
"" == lon_dimnewname)
3194 throw2(
"/ is not included in the dimension new name ", (((*irv)->dims)[0])->newname);
3195 (((*irv)->dims)[0])->newname = lon_dimnewname;
3196 lon_dimname = (*irv)->cfdimname;
3200 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
3201 for (vector<Dimension *>::iterator ird = (*irv)->dims.begin(); ird != (*irv)->dims.end(); ++ird) {
3202 if ((*ird)->name == lat_dimname)
3203 (*ird)->newname = lat_dimnewname;
3204 else if ((*ird)->name == lon_dimname) (*ird)->newname = lon_dimnewname;
3211 void EOS5File::Flatten_Obj_Name(
bool include_attr)
3214 BESDEBUG(
"h5",
"Coming to Flatten_Obj_Name()"<<endl);
3215 File::Flatten_Obj_Name(include_attr);
3217 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
3218 (*irv)->newname = get_CF_string((*irv)->newname);
3220 for (vector<Dimension *>::iterator ird = (*irv)->dims.begin(); ird != (*irv)->dims.end(); ++ird) {
3221 (*ird)->newname = get_CF_string((*ird)->newname);
3224 if (
true == include_attr) {
3225 for (vector<Attribute *>::iterator ira = (*irv)->attrs.begin(); ira != (*irv)->attrs.end(); ++ira) {
3226 (*ira)->newname = File::get_CF_string((*ira)->newname);
3233 void EOS5File::Handle_Obj_NameClashing(
bool include_attr)
3236 BESDEBUG(
"h5",
"Coming to Handle_Obj_NameClashing()"<<endl);
3240 set<string> objnameset;
3241 Handle_EOS5CVar_NameClashing(objnameset);
3242 File::Handle_GeneralObj_NameClashing(include_attr, objnameset);
3243 if (
true == include_attr) {
3244 Handle_EOS5CVar_AttrNameClashing();
3253 void EOS5File::Handle_EOS5CVar_NameClashing(set<string> &objnameset)
3256 BESDEBUG(
"h5",
"Coming to Handle_EOS5CVar_NameClashing()"<<endl);
3257 EOS5Handle_General_NameClashing(objnameset, this->cvars);
3261 void EOS5File::Handle_EOS5CVar_AttrNameClashing()
3264 BESDEBUG(
"h5",
"Coming to Handle_EOS5CVar_AttrNameClashing()"<<endl);
3265 set<string> objnameset;
3267 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
3268 Handle_General_NameClashing(objnameset, (*irv)->attrs);
3274 template<
class T>
void EOS5File::EOS5Handle_General_NameClashing(set<string>&objnameset, vector<T*>& objvec)
3278 BESDEBUG(
"h5",
"Coming to EOS5Handle_General_NameClashing()"<<endl);
3279 pair<set<string>::iterator,
bool> setret;
3280 set<string>::iterator iss;
3282 vector<string> clashnamelist;
3283 vector<string>::iterator ivs;
3285 map<int, int> cl_to_ol;
3289 typename vector<T*>::iterator irv;
3291 for (irv = objvec.begin(); irv != objvec.end(); ++irv) {
3293 setret = objnameset.insert((*irv)->newname);
3294 if (!setret.second) {
3295 clashnamelist.insert(clashnamelist.end(), (*irv)->newname);
3296 cl_to_ol[cl_index] = ol_index;
3304 for (ivs = clashnamelist.begin(); ivs != clashnamelist.end(); ++ivs) {
3305 int clash_index = 1;
3306 string temp_clashname = *ivs +
'_';
3307 HDF5CFUtil::gen_unique_name(temp_clashname, objnameset, clash_index);
3308 *ivs = temp_clashname;
3312 for (
unsigned int i = 0; i < clashnamelist.size(); i++)
3313 objvec[cl_to_ol[i]]->newname = clashnamelist[i];
3318 void EOS5File::Handle_DimNameClashing()
3321 BESDEBUG(
"h5",
"Coming to Handle_DimNameClashing()"<<endl);
3322 map<string, string> dimname_to_dimnewname;
3323 pair<map<string, string>::iterator,
bool> mapret;
3324 set<string> dimnameset;
3325 vector<Dimension*> vdims;
3326 set<string> dimnewnameset;
3327 pair<set<string>::iterator,
bool> setret;
3330 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
3331 for (vector<Dimension *>::iterator ird = (*irv)->dims.begin(); ird != (*irv)->dims.end(); ++ird) {
3335 setret = dimnameset.insert((*ird)->name);
3336 if (setret.second) vdims.push_back(*ird);
3344 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
3345 for (vector<Dimension *>::iterator ird = (*irv)->dims.begin(); ird != (*irv)->dims.end(); ++ird) {
3349 setret = dimnameset.insert((*ird)->name);
3350 if (setret.second) vdims.push_back(*ird);
3355 for (vector<Dimension*>::iterator ird=vdims.begin();ird!=vdims.end();++ird)
3356 cerr<<
"dimension name "<<(*ird)->name <<endl;
3361 EOS5Handle_General_NameClashing(dimnewnameset, vdims);
3364 for (vector<Dimension*>::iterator ird = vdims.begin(); ird != vdims.end(); ++ird) {
3365 mapret = dimname_to_dimnewname.insert(pair<string, string>((*ird)->name, (*ird)->newname));
3366 if (
false == mapret.second)
3367 throw4(
"The dimension name ", (*ird)->name,
" should map to ", (*ird)->newname);
3371 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv)
3372 for (vector<Dimension *>::iterator ird = (*irv)->dims.begin(); ird != (*irv)->dims.end(); ++ird)
3373 (*ird)->newname = dimname_to_dimnewname[(*ird)->name];
3375 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv)
3376 for (vector<Dimension *>::iterator ird = (*irv)->dims.begin(); ird != (*irv)->dims.end(); ++ird)
3377 (*ird)->newname = dimname_to_dimnewname[(*ird)->name];
3383 void EOS5File::Set_COARDS_Status()
3386 BESDEBUG(
"h5",
"Coming to Set_COARDS_Status()"<<endl);
3388 for (vector<EOS5CFGrid *>::iterator irg = this->eos5cfgrids.begin(); irg != this->eos5cfgrids.end(); ++irg) {
3389 if (
false == (*irg)->has_1dlatlon) {
3390 if (
false == (*irg)->has_nolatlon || (HE5_GCTP_GEO != (*irg)->eos5_projcode)) iscoard =
false;
3395 if (
true == iscoard) {
3396 for (vector<EOS5CFSwath *>::iterator irg = this->eos5cfswaths.begin(); irg != this->eos5cfswaths.end(); ++irg) {
3397 if (
false == (*irg)->has_1dlatlon) {
3406 void EOS5File::Adjust_Attr_Info()
3409 BESDEBUG(
"h5",
"Coming to Adjust_Attr_Info()"<<endl);
3410 if (
true == this->isaura) {
3411 Adjust_Aura_Attr_Name();
3412 Adjust_Aura_Attr_Value();
3415 Handle_EOS5CVar_Unit_Attr();
3416 Add_EOS5_Grid_CF_Attr();
3421 void EOS5File::Adjust_Aura_Attr_Name()
3424 BESDEBUG(
"h5",
"Coming to Adjust_Attr_Name() for Aura"<<endl);
3425 for (vector<Var*>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
3426 for (vector<Attribute*>::iterator ira = (*irv)->attrs.begin(); ira != (*irv)->attrs.end(); ++ira) {
3427 if (eos5_to_cf_attr_map.find((*ira)->name) != eos5_to_cf_attr_map.end()) (*ira)->newname =
3428 eos5_to_cf_attr_map[(*ira)->name];
3433 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
3434 for (vector<Attribute*>::iterator ira = (*irv)->attrs.begin(); ira != (*irv)->attrs.end(); ++ira) {
3435 if (eos5_to_cf_attr_map.find((*ira)->name) != eos5_to_cf_attr_map.end()) (*ira)->newname =
3436 eos5_to_cf_attr_map[(*ira)->name];
3442 void EOS5File::Adjust_Aura_Attr_Value()
3445 BESDEBUG(
"h5",
"Coming to Adjust_Attr_Value() for Aura"<<endl);
3447 Handle_EOS5CVar_Unit_Attr();
3448 Handle_Aura_Special_Attr();
3453 string time_cf_units_value =
"seconds since 1993-01-01";
3454 for (vector<Var*>::iterator irv = this->vars.begin(); irv != this->vars.end(); irv++) {
3455 if (((*irv)->name ==
"Time") || ((*irv)->name ==
"nTimes")) {
3456 for (vector<Attribute*>::iterator ira = (*irv)->attrs.begin(); ira != (*irv)->attrs.end(); ira++) {
3457 if (
"units" == (*ira)->name) {
3458 Retrieve_H5_Attr_Value(*ira, (*irv)->fullpath);
3459 string units_value((*ira)->value.begin(), (*ira)->value.end());
3460 if (time_cf_units_value != units_value) {
3462 units_value = time_cf_units_value;
3463 (*ira)->value.resize(units_value.size());
3464 if (H5FSTRING == (*ira)->dtype) (*ira)->fstrsize = units_value.size();
3466 (*ira)->strsize.resize(1);
3467 (*ira)->strsize[0] = units_value.size();
3469 copy(units_value.begin(), units_value.end(), (*ira)->value.begin());
3479 void EOS5File::Handle_Aura_Special_Attr()
3482 BESDEBUG(
"h5",
"Coming to Handle_Aura_Special_Attr()"<<endl);
3484 if (
true == this->isaura && MLS == this->aura_name) {
3486 const string File_attr_group_path =
"/HDFEOS/ADDITIONAL/FILE_ATTRIBUTES";
3487 const string PCF1_attr_name =
"PCF1";
3488 bool find_group =
false;
3489 bool find_attr =
false;
3490 for (vector<Group*>::iterator it_g = this->groups.begin(); it_g != this->groups.end(); ++it_g) {
3491 if (File_attr_group_path == (*it_g)->path) {
3493 for (vector<Attribute *>::iterator ira = (*it_g)->attrs.begin(); ira != (*it_g)->attrs.end(); ++ira) {
3494 if (PCF1_attr_name == (*ira)->name) {
3495 Retrieve_H5_Attr_Value(*ira, (*it_g)->path);
3496 string pcf_value((*ira)->value.begin(), (*ira)->value.end());
3497 HDF5CFDAPUtil::replace_double_quote(pcf_value);
3498 (*ira)->value.resize(pcf_value.size());
3499 if (H5FSTRING == (*ira)->dtype) (*ira)->fstrsize = pcf_value.size();
3501 (*ira)->strsize.resize(1);
3502 (*ira)->strsize[0] = pcf_value.size();
3504 copy(pcf_value.begin(), pcf_value.end(), (*ira)->value.begin());
3510 if (
true == find_group &&
true == find_attr)
break;
3516 void EOS5File::Handle_EOS5CVar_Unit_Attr()
3519 BESDEBUG(
"h5",
"Coming to Handle_EOS5CVar_Unit_Attr()"<<endl);
3520 string unit_attrname =
"units";
3521 string nonll_cf_level_attrvalue =
"level";
3522 string lat_cf_unit_attrvalue =
"degrees_north";
3523 string lon_cf_unit_attrvalue =
"degrees_east";
3524 string tes_cf_pre_attrvalue =
"hPa";
3526 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
3527 switch ((*irv)->cvartype) {
3530 for (vector<Attribute*>::iterator ira = (*irv)->attrs.begin(); ira != (*irv)->attrs.end(); ++ira) {
3531 if ((*ira)->newname == unit_attrname) {
3532 Retrieve_H5_Attr_Value(*ira, (*irv)->fullpath);
3533 string units_value((*ira)->value.begin(), (*ira)->value.end());
3534 if ((lat_cf_unit_attrvalue != units_value)
3535 && (((*irv)->name ==
"Latitude") || ((this->eos5cfzas.size() > 0) && ((*irv)->name ==
"nLats")))) {
3536 units_value = lat_cf_unit_attrvalue;
3541 (*ira)->value.resize(units_value.size());
3542 if (H5FSTRING == (*ira)->dtype) (*ira)->fstrsize = units_value.size();
3544 (*ira)->strsize.resize(1);
3545 (*ira)->strsize[0] = units_value.size();
3546 copy(units_value.begin(), units_value.end(), (*ira)->value.begin());
3548 else if ((lon_cf_unit_attrvalue != units_value) && (*irv)->name ==
"Longitude") {
3549 units_value = lon_cf_unit_attrvalue;
3550 (*ira)->value.resize(units_value.size());
3551 if (H5FSTRING == (*ira)->dtype) (*ira)->fstrsize = units_value.size();
3553 (*ira)->strsize.resize(1);
3554 (*ira)->strsize[0] = units_value.size();
3556 copy(units_value.begin(), units_value.end(), (*ira)->value.begin());
3566 Add_Str_Attr(attr, unit_attrname, lat_cf_unit_attrvalue);
3567 (*irv)->attrs.push_back(attr);
3573 Add_Str_Attr(attr, unit_attrname, lon_cf_unit_attrvalue);
3574 (*irv)->attrs.push_back(attr);
3578 case CV_NONLATLON_MISS: {
3580 Add_Str_Attr(attr, unit_attrname, nonll_cf_level_attrvalue);
3581 (*irv)->attrs.push_back(attr);
3585 if (
true == this->isaura && TES == this->aura_name) {
3587 Add_Str_Attr(attr, unit_attrname, tes_cf_pre_attrvalue);
3588 (*irv)->attrs.push_back(attr);
3593 throw1(
"Non-supported Coordinate Variable Type.");
3598 void EOS5File::Add_EOS5_Grid_CF_Attr()
3600 BESDEBUG(
"h5",
"Coming to Add_EOS5_Grid_CF_Attr()"<<endl);
3602 bool has_eos5_grid_nongeo_proj =
false;
3605 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
3606 if ((*irv)->cvartype == CV_LAT_MISS) {
3607 if((*irv)->eos5_projcode !=HE5_GCTP_GEO) {
3608 has_eos5_grid_nongeo_proj =
true;
3615 if(
true == has_eos5_grid_nongeo_proj) {
3616 string conventions_attrname =
"Conventions";
3617 string conventions_attrvalue =
"CF-1.7";
3618 bool has_conventions_attr=
false;
3619 for(vector<HDF5CF::Attribute *>::const_iterator it_ra=this->root_attrs.begin();
3620 it_ra!=this->root_attrs.end();it_ra++) {
3621 if((*it_ra)->name==conventions_attrname){
3622 has_conventions_attr =
true;
3627 if(
false==has_conventions_attr) {
3629 Add_Str_Attr(attr,conventions_attrname,conventions_attrvalue);
3630 this->root_attrs.push_back(attr);
3639 void EOS5File::Adjust_Dim_Name()
3642 BESDEBUG(
"h5",
"Coming to Adjust_Dim_Name()"<<endl);
3644 if (
false == this->iscoard)
3647 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); irv++) {
3648 if ((*irv)->dims.size() != 1)
3649 throw3(
"Coard coordinate variable ", (*irv)->name,
"is not 1D");
3650 if ((*irv)->newname != (((*irv)->dims)[0]->newname)) {
3651 ((*irv)->dims)[0]->newname = (*irv)->newname;
3654 for (vector<Var*>::iterator irv2 = this->vars.begin(); irv2 != this->vars.end(); irv2++) {
3655 for (vector<Dimension *>::iterator ird = (*irv2)->dims.begin(); ird != (*irv2)->dims.end(); ird++) {
3660 if ((*ird)->name == ((*irv)->dims)[0]->name) (*ird)->newname = ((*irv)->dims)[0]->newname;
3669 void EOS5File::Add_Supplement_Attrs(
bool add_path)
3672 BESDEBUG(
"h5",
"Coming to Add_Supplement_Attrs()"<<endl);
3673 if (
true == add_path) {
3675 File::Add_Supplement_Attrs(add_path);
3678 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
3679 if (((*irv)->cvartype == CV_EXIST) || ((*irv)->cvartype == CV_MODIFY)) {
3681 const string varname = (*irv)->name;
3682 const string attrname =
"origname";
3683 Add_Str_Attr(attr, attrname, varname);
3684 (*irv)->attrs.push_back(attr);
3688 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
3689 if (((*irv)->cvartype == CV_EXIST) || ((*irv)->cvartype == CV_MODIFY)) {
3693 if((*irv)->zero_storage_size==
false
3694 || HDF5RequestHandler::get_no_zero_size_fullnameattr() ==
false) {
3696 const string varname = (*irv)->fullpath;
3697 const string attrname =
"fullnamepath";
3698 Add_Str_Attr(attr, attrname, varname);
3699 (*irv)->attrs.push_back(attr);
3705 if (
true == this->iscoard) {
3706 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
3707 if (((*irv)->cvartype == CV_EXIST) || ((*irv)->cvartype == CV_MODIFY)) {
3709 const string attrname =
"orig_dimname";
3710 string orig_dimname = (((*irv)->dims)[0])->name;
3711 orig_dimname = HDF5CFUtil::obtain_string_after_lastslash(orig_dimname);
3712 if (
"" == orig_dimname)
3713 throw2(
"wrong dimension name ", orig_dimname);
3714 if (orig_dimname.find(
"FakeDim") != string::npos) orig_dimname =
"";
3715 Add_Str_Attr(attr, attrname, orig_dimname);
3716 (*irv)->attrs.push_back(attr);
3720 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
3722 if ((*irv)->dims.size() > 0) {
3724 if (1 == (*irv)->dims.size()) {
3725 const string attrname =
"orig_dimname";
3726 string orig_dimname = (((*irv)->dims)[0])->name;
3727 if (
"" == orig_dimname)
3728 orig_dimname =
"NoDimName";
3730 orig_dimname = HDF5CFUtil::obtain_string_after_lastslash(orig_dimname);
3731 if (orig_dimname.find(
"FakeDim") != string::npos) orig_dimname =
"NoDimName";
3732 Add_Str_Attr(attr, attrname, orig_dimname);
3735 const string attrname =
"orig_dimname_list";
3736 string orig_dimname_list;
3737 for (vector<Dimension *>::iterator ird = (*irv)->dims.begin(); ird != (*irv)->dims.end(); ++ird) {
3738 string orig_dimname = (*ird)->name;
3739 if (
"" == orig_dimname)
3740 orig_dimname =
"NoDimName";
3742 orig_dimname = HDF5CFUtil::obtain_string_after_lastslash((*ird)->name);
3743 if (orig_dimname.find(
"FakeDim") != string::npos) orig_dimname =
"NoDimName";
3744 if (
"" == orig_dimname_list)
3745 orig_dimname_list = orig_dimname;
3747 orig_dimname_list = orig_dimname_list +
" " + orig_dimname;
3750 Add_Str_Attr(attr, attrname, orig_dimname_list);
3752 (*irv)->attrs.push_back(attr);
3760 void EOS5File::Handle_Coor_Attr()
3763 BESDEBUG(
"h5",
"Coming to Handle_Coor_Attr()"<<endl);
3764 string co_attrname =
"coordinates";
3765 string co_attrvalue =
"";
3767 if (iscoard)
return;
3769 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
3771 for (vector<Dimension *>::iterator ird = (*irv)->dims.begin(); ird != (*irv)->dims.end(); ++ird) {
3772 for (vector<EOS5CVar *>::iterator ircv = this->cvars.begin(); ircv != this->cvars.end(); ++ircv) {
3773 if ((*ird)->name == (*ircv)->cfdimname)
3774 co_attrvalue = (co_attrvalue.empty()) ? (*ircv)->newname : co_attrvalue +
" " + (*ircv)->newname;
3777 if (
false == co_attrvalue.empty()) {
3779 Add_Str_Attr(attr, co_attrname, co_attrvalue);
3780 (*irv)->attrs.push_back(attr);
3782 co_attrvalue.clear();
3786 bool has_2dlatlon_cv =
false;
3787 for (vector<EOS5CVar *>::iterator ircv = this->cvars.begin(); ircv != this->cvars.end(); ++ircv) {
3788 if (
true == (*ircv)->is_2dlatlon) {
3789 has_2dlatlon_cv =
true;
3794 if (
true == has_2dlatlon_cv) {
3798 for (vector<EOS5CVar *>::iterator ircv = this->cvars.begin(); ircv != this->cvars.end(); ++ircv) {
3799 if (
true == (*ircv)->is_2dlatlon) {
3800 dimname1 = (((*ircv)->dims)[0])->name;
3801 dimname2 = (((*ircv)->dims)[1])->name;
3806 int num_latlondims = 0;
3808 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
3809 for (vector<Dimension *>::iterator ird = (*irv)->dims.begin(); ird != (*irv)->dims.end(); ++ird) {
3810 if (dimname1 == (*ird)->name) num_latlondims++;
3811 if (dimname2 == (*ird)->name) num_latlondims++;
3813 if ((num_latlondims != 0) && (num_latlondims != 2)) {
3815 for (vector<Attribute *>::iterator ira = (*irv)->attrs.begin(); ira != (*irv)->attrs.end(); ++ira) {
3816 if (co_attrname == (*ira)->name) {
3818 (*irv)->attrs.erase(ira);
3831 void EOS5File::Adjust_Special_EOS5CVar_Name() {
3833 int num_grids =this->eos5cfgrids.size();
3834 int num_swaths = this->eos5cfswaths.size();
3835 int num_zas = this->eos5cfzas.size();
3837 bool mixed_eos5typefile =
false;
3840 if (((num_grids > 0) && (num_swaths > 0)) ||
3841 ((num_grids > 0) && (num_zas > 0)) ||
3842 ((num_swaths >0) && (num_zas > 0)))
3843 mixed_eos5typefile =
true;
3845 if (
false == mixed_eos5typefile) {
3850 if ((1 == num_swaths) || ( 1 == num_zas) ||
3851 (1 == num_grids) || ((num_grids >1) && (this->grids_multi_latloncvs))) {
3853 string unit_attrname =
"units";
3854 string nonll_cf_level_attralue =
"level";
3855 string lat_cf_unit_attrvalue =
"degrees_north";
3856 string lon_cf_unit_attrvalue =
"degrees_east";
3858 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin();
3859 irv != this->cvars.end(); irv++) {
3860 switch((*irv)->eos_type) {
3866 for(vector <Attribute*>::iterator ira = (*irv)->attrs.begin();
3867 ira != (*irv)->attrs.end(); ira++) {
3868 if ((*ira)->name ==unit_attrname) {
3869 if ((*ira)->value.size() > 0) {
3870 string units_value((*ira)->value.begin(),(*ira)->value.end());
3871 if (lat_cf_unit_attrvalue ==units_value) (*irv)->newname =
"lat";
3872 if (lon_cf_unit_attrvalue ==units_value) (*irv)->newname =
"lon";
3878 case CV_NONLATLON_MISS:
3880 for(vector <Attribute*>::iterator ira = (*irv)->attrs.begin();
3881 ira != (*irv)->attrs.end(); ira++) {
3882 if ((*ira)->name ==unit_attrname) {
3883 if ((*ira)->value.size() > 0) {
3884 string units_value((*ira)->value.begin(),(*ira)->value.end());
3885 if (nonll_cf_level_attralue ==units_value) {
3886 (*irv)->newname =
"lev";
3895 throw1(
"Non-supported coordinate variable type");
3908 void EOS5File::Create_Missing_CV(T* eos5data,
EOS5CVar *EOS5cvar,
const string& dimname, EOS5Type eos5type,
3912 BESDEBUG(
"h5",
"Coming to Create_Missing_CV()"<<endl);
3913 string reduced_dimname = HDF5CFUtil::obtain_string_after_lastslash(dimname);
3914 if (
"" == reduced_dimname) throw2(
"wrong dimension name ", dimname);
3915 EOS5cvar->name = reduced_dimname;
3916 Create_Added_Var_NewName_FullPath(eos5type, eos5data->name, EOS5cvar->name, EOS5cvar->newname, EOS5cvar->fullpath);
3918 EOS5cvar->dtype = H5INT32;
3919 hsize_t eos5cvar_dimsize = (eos5data->dimnames_to_dimsizes)[dimname];
3921 eos5cvar_dim->name = dimname;
3922 eos5cvar_dim->unlimited_dim = (eos5data->dimnames_to_unlimited)[dimname];
3923 if (1 == num_eos5data)
3924 eos5cvar_dim->newname = reduced_dimname;
3926 eos5cvar_dim->newname = dimname;
3928 EOS5cvar->dims.push_back(eos5cvar_dim);
3929 EOS5cvar->cfdimname = dimname;
3930 EOS5cvar->cvartype = CV_NONLATLON_MISS;
3931 EOS5cvar->eos_type = eos5type;
3935 void EOS5File::Create_Added_Var_NewName_FullPath(EOS5Type eos5type,
const string& eos5_groupname,
const string& varname,
3936 string &var_newname,
string &var_fullpath)
3939 BESDEBUG(
"h5",
"Coming to Create_Added_Var_NewName_FullPath()"<<endl);
3940 string fslash_str =
"/";
3941 string eos5typestr =
"";
3942 string top_eos5_groupname =
"/HDFEOS";
3946 eos5typestr =
"/GRIDS/";
3947 var_newname = eos5typestr + eos5_groupname + fslash_str + varname;
3948 var_fullpath = top_eos5_groupname + eos5typestr + eos5_groupname + fslash_str + varname;
3953 eos5typestr =
"/SWATHS/";
3954 var_newname = eos5typestr + eos5_groupname + fslash_str + varname;
3955 var_fullpath = top_eos5_groupname + eos5typestr + eos5_groupname + fslash_str + varname;
3961 eos5typestr =
"/ZAS/";
3962 var_newname = eos5typestr + eos5_groupname + fslash_str + varname;
3963 var_fullpath = top_eos5_groupname + eos5typestr + eos5_groupname + fslash_str + varname;
3969 throw1(
"Non-supported EOS type");
3974 void EOS5File::Handle_SpVar()
3977 BESDEBUG(
"h5",
"Coming to Handle_SpVar()"<<endl);
3978 if (
true == this->isaura && TES == this->aura_name) {
3979 const string ProHist_full_path =
"/HDFEOS/ADDITIONAL/FILE_ATTRIBUTES/ProductionHistory";
3980 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
3981 if (ProHist_full_path == (*irv)->fullpath) {
3983 this->vars.erase(irv);
3990 if (dimname_to_dupdimnamelist.size() > 0) {
3991 for (vector<EOS5CVar *>::iterator ircv = this->cvars.begin(); ircv != this->cvars.end(); ircv++) {
3992 if ((*ircv)->cvartype == CV_EXIST) {
3993 pair<multimap<string, string>::iterator, multimap<string, string>::iterator> mm_er_ret;
3994 multimap<string, string>::iterator itmm;
3995 for (itmm = dimname_to_dupdimnamelist.begin(); itmm != dimname_to_dupdimnamelist.end(); ++itmm) {
3998 if ((*ircv)->cfdimname == (*itmm).first) {
4001 for (vector<EOS5CVar *>::iterator irv2 = this->cvars.begin(); irv2 != this->cvars.end();
4003 if ((*irv2)->cvartype == CV_NONLATLON_MISS) {
4007 if ((*irv2)->cfdimname == (*itmm).second) {
4010 string dup_var_name = (*irv2)->newname;
4011 Replace_Var_Info((*ircv), (*irv2));
4014 (*irv2)->newname = dup_var_name;
4015 (*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));
4132 void EOS5File::Adjust_Obj_Name()
4137 bool EOS5File::Have_Grid_Mapping_Attrs() {
4138 return File::Have_Grid_Mapping_Attrs();
4140 void EOS5File::Handle_Grid_Mapping_Vars() {
4141 File:: Handle_Grid_Mapping_Vars();
4149 BESDEBUG(
"h5",
"Coming to Replace_Var_Info()"<<endl);
4150 File::Replace_Var_Info(src, target);
4151 target->cfdimname = src->cfdimname;
4152 target->cvartype = src->cvartype;
4153 target->eos_type = src->eos_type;
4154 target->total_elems = src->total_elems;
4162 BESDEBUG(
"h5",
"Coming to Replace_Var_Attrs()"<<endl);
4163 File::Replace_Var_Attrs(src, target);
4169 EOS5File:: add_ignored_info_attrs(
bool is_grp,
bool is_first) {
4173 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.