44 using namespace HDF5CF;
47 EOS5CVar::EOS5CVar(
Var*var)
50 newname = var->newname;
52 fullpath = var->fullpath;
54 total_elems = var->total_elems;
56 unsupported_attr_dtype = var->unsupported_attr_dtype;
57 unsupported_dspace = var->unsupported_dspace;
59 for (vector<Attribute*>::iterator ira = var->attrs.begin(); ira != var->attrs.end(); ++ira) {
61 attr->name = (*ira)->name;
62 attr->newname = (*ira)->newname;
63 attr->dtype = (*ira)->dtype;
64 attr->count = (*ira)->count;
65 attr->strsize = (*ira)->strsize;
66 attr->fstrsize = (*ira)->fstrsize;
67 attr->value = (*ira)->value;
68 attrs.push_back(attr);
71 for (vector<Dimension*>::iterator ird = var->dims.begin(); ird != var->dims.end(); ++ird) {
73 dim->name = (*ird)->name;
74 dim->newname = (*ird)->newname;
75 dim->unlimited_dim = (*ird)->unlimited_dim;
89 eos5_pixelreg = HE5_HDFE_CENTER;
90 eos5_origin = HE5_HDFE_GD_UL;
91 eos5_projcode = HE5_GCTP_GEO;
94 std::fill_n(param, 13, 0);
101 void EOS5CFGrid::Update_Dimnamelist()
104 BESDEBUG(
"h5",
"coming to Update_Dimnamelist" <<endl);
110 for (set<string>::iterator it = this->vardimnames.begin(); it != this->vardimnames.end(); ++it) {
111 string xydimname_candidate = HDF5CFUtil::obtain_string_after_lastslash(*it);
112 if (
"XDim" == xydimname_candidate) {
113 this->vardimnames.erase(*it);
118 for (set<string>::iterator it = this->vardimnames.begin(); it != this->vardimnames.end(); ++it) {
119 string xydimname_candidate = HDF5CFUtil::obtain_string_after_lastslash(*it);
120 if (
"YDim" == xydimname_candidate) {
121 this->vardimnames.erase(*it);
129 EOS5File::~EOS5File()
131 for (vector<EOS5CVar *>::const_iterator i = this->cvars.begin(); i != this->cvars.end(); ++i)
134 for (vector<EOS5CFGrid *>::const_iterator i = this->eos5cfgrids.begin(); i != this->eos5cfgrids.end(); ++i)
137 for (vector<EOS5CFSwath *>::const_iterator i = this->eos5cfswaths.begin(); i != this->eos5cfswaths.end(); ++i)
140 for (vector<EOS5CFZa *>::const_iterator i = this->eos5cfzas.begin(); i != this->eos5cfzas.end(); ++i)
146 string EOS5File::get_CF_string(
string s)
151 return File::get_CF_string(s);
154 return File::get_CF_string(s);
159 void EOS5File::Retrieve_H5_Info(
const char *file_fullpath, hid_t file_id,
bool )
163 File::Retrieve_H5_Info(file_fullpath, file_id,
true);
166 void EOS5File::Retrieve_H5_CVar_Supported_Attr_Values()
169 for (vector<EOS5CVar *>::iterator ircv = this->cvars.begin(); ircv != this->cvars.end(); ++ircv) {
172 if ((CV_EXIST == (*ircv)->cvartype) || (CV_MODIFY == (*ircv)->cvartype)) {
173 for (vector<Attribute *>::iterator ira = (*ircv)->attrs.begin(); ira != (*ircv)->attrs.end(); ++ira)
174 Retrieve_H5_Attr_Value(*ira, (*ircv)->fullpath);
182 void EOS5File::Retrieve_H5_Supported_Attr_Values()
185 File::Retrieve_H5_Supported_Attr_Values();
186 for (vector<EOS5CVar *>::iterator ircv = this->cvars.begin(); ircv != this->cvars.end(); ++ircv) {
189 if ((CV_EXIST == (*ircv)->cvartype) || (CV_MODIFY == (*ircv)->cvartype)) {
190 for (vector<Attribute *>::iterator ira = (*ircv)->attrs.begin(); ira != (*ircv)->attrs.end(); ++ira)
191 Retrieve_H5_Attr_Value(*ira, (*ircv)->fullpath);
198 void EOS5File::Adjust_H5_Attr_Value(
Attribute *attr)
204 void EOS5File::Handle_Unsupported_Dtype(
bool include_attr)
207 if (
true == check_ignored) {
208 Gen_Unsupported_Dtype_Info(include_attr);
211 File::Handle_Unsupported_Dtype(include_attr);
212 Handle_EOS5_Unsupported_Dtype(include_attr);
216 void EOS5File::Handle_EOS5_Unsupported_Dtype(
bool include_attr)
219 for (vector<EOS5CVar *>::iterator ircv = this->cvars.begin(); ircv != this->cvars.end();) {
220 if (
true == include_attr) {
221 for (vector<Attribute *>::iterator ira = (*ircv)->attrs.begin(); ira != (*ircv)->attrs.end();) {
222 H5DataType temp_dtype = (*ira)->getType();
223 if (
false == HDF5CFUtil::cf_strict_support_type(temp_dtype)) {
225 ira = (*ircv)->attrs.erase(ira);
234 H5DataType temp_dtype = (*ircv)->getType();
235 if (!HDF5CFUtil::cf_strict_support_type(temp_dtype)) {
237 ircv = this->cvars.erase(ircv);
246 void EOS5File::Gen_Unsupported_Dtype_Info(
bool include_attr)
249 if (
true == include_attr) {
251 File::Gen_Group_Unsupported_Dtype_Info();
252 File::Gen_Var_Unsupported_Dtype_Info();
253 Gen_VarAttr_Unsupported_Dtype_Info();
260 void EOS5File::Gen_VarAttr_Unsupported_Dtype_Info()
264 Gen_DimScale_VarAttr_Unsupported_Dtype_Info();
267 Gen_EOS5_VarAttr_Unsupported_Dtype_Info();
271 void EOS5File::Gen_EOS5_VarAttr_Unsupported_Dtype_Info()
274 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
277 bool is_ignored = ignored_dimscale_ref_list((*irv));
278 if (
false == (*irv)->attrs.empty()) {
280 for (vector<Attribute *>::iterator ira = (*irv)->attrs.begin(); ira != (*irv)->attrs.end(); ++ira) {
281 H5DataType temp_dtype = (*ira)->getType();
282 if (
false == HDF5CFUtil::cf_strict_support_type(temp_dtype) || (temp_dtype == H5INT64) ||(temp_dtype == H5UINT64)) {
286 if ((
"DIMENSION_LIST" != (*ira)->name)
287 && ((
"REFERENCE_LIST" != (*ira)->name ||
true == is_ignored)))
288 this->add_ignored_info_attrs(
false, (*irv)->fullpath, (*ira)->name);
297 void EOS5File::Handle_Unsupported_Dspace(
bool include_attr)
301 if (
true == check_ignored) {
302 Gen_Unsupported_Dspace_Info();
305 File::Handle_Unsupported_Dspace(include_attr);
306 Handle_EOS5_Unsupported_Dspace(include_attr);
311 void EOS5File::Handle_EOS5_Unsupported_Dspace(
bool include_attr)
314 if (
true == this->unsupported_var_dspace) {
315 for (vector<EOS5CVar *>::iterator ircv = this->cvars.begin(); ircv != this->cvars.end();) {
316 if (
true == (*ircv)->unsupported_dspace) {
318 ircv = this->cvars.erase(ircv);
326 if (
true == include_attr) {
327 if (
true == this->unsupported_var_attr_dspace) {
328 for (vector<EOS5CVar *>::iterator ircv = this->cvars.begin(); ircv != this->cvars.end(); ++ircv) {
329 if (
false == (*ircv)->attrs.empty()) {
330 if (
true == (*ircv)->unsupported_attr_dspace) {
331 for (vector<Attribute *>::iterator ira = (*ircv)->attrs.begin(); ira != (*ircv)->attrs.end();) {
332 if (0 == (*ira)->count) {
334 ira = (*ircv)->attrs.erase(ira);
348 void EOS5File::Gen_Unsupported_Dspace_Info()
351 File::Gen_Unsupported_Dspace_Info();
356 void EOS5File::Handle_Unsupported_Others(
bool include_attr)
359 remove_netCDF_internal_attributes(include_attr);
361 if(
true == include_attr) {
362 for (vector<Var *>::iterator irv = this->vars.begin();
363 irv != this->vars.end(); ++irv) {
364 for(vector<Attribute *>::iterator ira = (*irv)->attrs.begin();
365 ira != (*irv)->attrs.end();) {
366 if((*ira)->name ==
"CLASS") {
367 string class_value = Retrieve_Str_Attr_Value(*ira,(*irv)->fullpath);
371 if (0 == class_value.compare(0,15,
"DIMENSION_SCALE")) {
373 ira = (*irv)->attrs.erase(ira);
385 else if((*ira)->name ==
"NAME") {
386 string name_value = Retrieve_Str_Attr_Value(*ira,(*irv)->fullpath);
387 if( 0 == name_value.compare(0,(*irv)->name.size(),(*irv)->name)) {
389 ira =(*irv)->attrs.erase(ira);
392 string netcdf_dim_mark=
"This is a netCDF dimension but not a netCDF variable";
393 if( 0 == name_value.compare(0,netcdf_dim_mark.size(),netcdf_dim_mark)) {
395 ira =(*irv)->attrs.erase(ira);
403 else if((*ira)->name ==
"_Netcdf4Dimid") {
405 ira =(*irv)->attrs.erase(ira);
414 if(
true == include_attr) {
415 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin();
416 irv != this->cvars.end(); ++irv) {
417 for(vector<Attribute *>::iterator ira = (*irv)->attrs.begin();
418 ira != (*irv)->attrs.end();) {
419 if((*ira)->name ==
"CLASS") {
420 string class_value = Retrieve_Str_Attr_Value(*ira,(*irv)->fullpath);
424 if (0 == class_value.compare(0,15,
"DIMENSION_SCALE")) {
426 ira = (*irv)->attrs.erase(ira);
433 else if((*ira)->name ==
"NAME") {
435 ira=(*irv)->attrs.erase(ira);
438 string name_value = Retrieve_Str_Attr_Value(*ira,(*irv)->fullpath);
439 if( 0 == name_value.compare(0,(*irv)->name.size(),(*irv)->name)) {
441 ira =(*irv)->attrs.erase(ira);
444 string netcdf_dim_mark=
"This is a netCDF dimension but not a netCDF variable";
445 if( 0 == name_value.compare(0,netcdf_dim_mark.size(),netcdf_dim_mark)) {
447 ira =(*irv)->attrs.erase(ira);
455 else if((*ira)->name ==
"_Netcdf4Dimid") {
457 ira =(*irv)->attrs.erase(ira);
472 if (
true == this->check_ignored &&
true == include_attr) {
475 if (
true == HDF5RequestHandler::get_drop_long_string()) {
477 for (vector<Attribute *>::iterator ira = this->root_attrs.begin(); ira != this->root_attrs.end(); ++ira) {
478 if (H5FSTRING == (*ira)->dtype || H5VSTRING == (*ira)->dtype) {
479 if ((*ira)->getBufSize() > NC_JAVA_STR_SIZE_LIMIT) {
480 this->add_ignored_droplongstr_hdr();
481 this->add_ignored_grp_longstr_info(
"/", (*ira)->name);
486 for (vector<Group *>::iterator irg = this->groups.begin(); irg != this->groups.end(); ++irg) {
487 for (vector<Attribute *>::iterator ira = (*irg)->attrs.begin(); ira != (*irg)->attrs.end(); ++ira) {
488 if (H5FSTRING == (*ira)->dtype || H5VSTRING == (*ira)->dtype) {
489 if ((*ira)->getBufSize() > NC_JAVA_STR_SIZE_LIMIT) {
490 this->add_ignored_droplongstr_hdr();
491 this->add_ignored_grp_longstr_info((*irg)->path, (*ira)->name);
498 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
499 if (
true == Check_DropLongStr((*irv), NULL)) {
500 string ecsmeta_grp =
"/HDFEOS INFORMATION";
502 if ((*irv)->fullpath.find(ecsmeta_grp) != 0
503 || ((*irv)->fullpath.rfind(
"/") != ecsmeta_grp.size())) {
504 this->add_ignored_droplongstr_hdr();
505 this->add_ignored_var_longstr_info((*irv), NULL);
509 for (vector<Attribute *>::iterator ira = (*irv)->attrs.begin(); ira != (*irv)->attrs.end(); ++ira) {
510 if (
true == Check_DropLongStr((*irv), (*ira))) {
511 this->add_ignored_droplongstr_hdr();
512 this->add_ignored_var_longstr_info((*irv), (*ira));
518 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
519 for (vector<Attribute *>::iterator ira = (*irv)->attrs.begin(); ira != (*irv)->attrs.end(); ++ira) {
520 if (
true == Check_DropLongStr((*irv), (*ira))) {
521 this->add_ignored_droplongstr_hdr();
522 this->add_ignored_var_longstr_info((*irv), (*ira));
530 if (
false == this->have_ignored) this->add_no_ignored_info();
535 void EOS5File::Adjust_EOS5Dim_Info(
HE5Parser*strmeta_info)
538 BESDEBUG(
"h5",
"coming to Adjust_EOS5Dim_Info" <<endl);
541 for (
unsigned int i = 0; i < strmeta_info->swath_list.size(); ++i) {
542 HE5Swath& he5s = strmeta_info->swath_list.at(i);
544 Adjust_EOS5Dim_List(he5s.dim_list);
554 if(this->have_udim ==
true) {
555 vector<HE5Var> svlist = he5s.geo_var_list;
556 svlist.insert(svlist.end(),he5s.data_var_list.begin(),he5s.data_var_list.end());
558 Adjust_EOS5DimSize_List(he5s.dim_list,svlist,SWATH,he5s.name);
561 for (
unsigned int j = 0; j < he5s.geo_var_list.size(); ++j) {
562 Adjust_EOS5VarDim_Info((he5s.geo_var_list)[j].dim_list, he5s.dim_list, he5s.name, SWATH);
564 for (
unsigned int j = 0; j < he5s.data_var_list.size(); ++j) {
565 Adjust_EOS5VarDim_Info((he5s.data_var_list)[j].dim_list, he5s.dim_list, he5s.name, SWATH);
569 for (
unsigned int i = 0; i < strmeta_info->grid_list.size(); ++i) {
571 HE5Grid& he5g = strmeta_info->grid_list.at(i);
573 Adjust_EOS5Dim_List(he5g.dim_list);
576 if(this->have_udim ==
true) {
578 Adjust_EOS5DimSize_List(he5g.dim_list,he5g.data_var_list,GRID,he5g.name);
581 for (
unsigned int j = 0; j < he5g.data_var_list.size(); ++j) {
582 Adjust_EOS5VarDim_Info((he5g.data_var_list)[j].dim_list, he5g.dim_list, he5g.name, GRID);
586 for (
unsigned int i = 0; i < strmeta_info->za_list.size(); ++i) {
587 HE5Za& he5z = strmeta_info->za_list.at(i);
589 Adjust_EOS5Dim_List(he5z.dim_list);
592 if(this->have_udim ==
true) {
594 Adjust_EOS5DimSize_List(he5z.dim_list,he5z.data_var_list,ZA,he5z.name);
597 for (
unsigned int j = 0; j < he5z.data_var_list.size(); ++j) {
598 Adjust_EOS5VarDim_Info((he5z.data_var_list)[j].dim_list, he5z.dim_list, he5z.name, ZA);
604 void EOS5File::Adjust_EOS5Dim_List(vector<HE5Dim>& groupdimlist)
607 BESDEBUG(
"h5",
"Coming to Adjust_EOS5Dim_List"<<endl);
611 Remove_NegativeSizeDims(groupdimlist);
614 Condense_EOS5Dim_List(groupdimlist);
620 void EOS5File::Remove_NegativeSizeDims(vector<HE5Dim>& groupdimlist)
623 BESDEBUG(
"h5",
"Coming to Remove_NegativeSizeDims" <<endl);
624 vector<HE5Dim>::iterator id;
633 for (
id = groupdimlist.begin();
id != groupdimlist.end();) {
634 if ((*id).size <= 0) {
635 id = groupdimlist.erase(
id);
647 void EOS5File::Condense_EOS5Dim_List(vector<HE5Dim>& groupdimlist)
650 BESDEBUG(
"h5",
"Coming to Condense_EOS5Dim_List"<<endl);
653 pair<set<int>::iterator,
bool> setret;
654 vector<HE5Dim>::iterator id;
656 for (
id = groupdimlist.begin();
id != groupdimlist.end();) {
657 if (
"XDim" == (*id).name ||
"Xdim" == (*id).name) {
658 setret = xdimsizes.insert((*id).size);
659 if (
false == setret.second) {
660 id = groupdimlist.erase(
id);
662 else if (
"Xdim" == (*id).name) {
676 for (
id = groupdimlist.begin();
id != groupdimlist.end();) {
677 if (
"YDim" == (*id).name ||
"Ydim" == (*id).name) {
678 setret = ydimsizes.insert((*id).size);
679 if (
false == setret.second) {
680 id = groupdimlist.erase(
id);
682 else if (
"Ydim" == (*id).name) {
696 void EOS5File:: Adjust_EOS5DimSize_List(vector<HE5Dim>& eos5objdimlist,
const vector<HE5Var> & eos5objvarlist,
697 const EOS5Type eos5type,
const string & eos5objname)
700 set<string>updated_dimlist;
701 pair<set<string>::iterator,
bool> set_insert_ret;
703 for(
unsigned int i = 0; i<eos5objvarlist.size();i++) {
704 HE5Var he5v = eos5objvarlist.at(i);
705 for(
unsigned int j = 0; j<he5v.dim_list.size();j++) {
706 HE5Dim he5d = he5v.dim_list.at(j);
707 set_insert_ret = updated_dimlist.insert(he5d.name);
708 if(set_insert_ret.second ==
true) {
710 unsigned int objdimlist_index = 9999;
711 bool has_objdimlist_index =
false;
712 for(
unsigned int k = 0; k <eos5objdimlist.size();k++) {
713 if(eos5objdimlist[k].name == he5d.name) {
714 objdimlist_index = k;
715 has_objdimlist_index =
true;
719 if(has_objdimlist_index ==
false)
720 throw2(
"Cannot find the dimension in the EOS5 object dimension list for the dimension ", he5d.name);
721 for (vector<Var *>::const_iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
723 EOS5Type vartype = Get_Var_EOS5_Type((*irv));
726 if(vartype == eos5type) {
727 string var_eos5gname = Obtain_Var_EOS5Type_GroupName((*irv),vartype);
730 if(var_eos5gname == eos5objname) {
731 if((*irv)->name == he5v.name) {
732 if (he5v.dim_list.size() != (*irv)->dims.size())
733 throw2(
"Number of dimensions don't match with the structmetadata for variable ", (*irv)->name);
735 (eos5objdimlist[objdimlist_index]).size = ((*irv)->dims[j])->size;
746 if(updated_dimlist.size() == eos5objdimlist.size())
750 for(
unsigned int k = 0; k <eos5objdimlist.size();k++) {
751 cerr<<
"eos5 obj dim name is "<<eos5objdimlist[k].name <<
" Size is "<< eos5objdimlist[k].size << endl;
758 void EOS5File::Adjust_EOS5VarDim_Info(vector<HE5Dim>& vardimlist, vector<HE5Dim>& groupdimlist,
759 const string & eos5_obj_name, EOS5Type eos5type)
762 BESDEBUG(
"h5",
"Coming to Adjust_EOS5VarDim_Info"<<endl);
763 set<string> dimnamelist;
764 pair<set<string>::iterator,
bool> setret;
771 for (
unsigned int i = 0; i < vardimlist.size(); ++i) {
773 HE5Dim& he5d = vardimlist.at(i);
774 bool dim_in_groupdimlist =
false;
775 for (
unsigned int j = 0; j < groupdimlist.size(); ++j) {
776 HE5Dim he5gd = groupdimlist.at(j);
777 if (he5gd.name == he5d.name) {
778 he5d.size = he5gd.size;
779 dim_in_groupdimlist =
true;
784 if (
false == dim_in_groupdimlist)
785 throw2(
"The EOS5 group dimension name list doesn't include the dimension ", he5d.name);
790 setret = dimnamelist.insert(he5d.name);
791 if (
false == setret.second) {
793 string temp_clashname = he5d.name +
'_';
794 HDF5CFUtil::gen_unique_name(temp_clashname, dimnamelist, clash_index);
796 string ori_dimname = he5d.name;
798 he5d.name = temp_clashname;
801 bool dim_exist =
false;
802 for (
unsigned int j = 0; j < groupdimlist.size(); ++j) {
803 if (he5d.name == groupdimlist[j].name && he5d.size == groupdimlist[j].size) {
810 if (
false == dim_exist) {
811 ori_dimname = eos5_obj_name +
"/" + ori_dimname;
812 string dup_dimname = eos5_obj_name +
"/" + he5d.name;
813 if (GRID == eos5type) {
814 ori_dimname =
"/GRIDS/" + ori_dimname;
815 dup_dimname =
"/GRIDS/" + dup_dimname;
817 else if (SWATH == eos5type) {
818 ori_dimname =
"/SWATHS/" + ori_dimname;
819 dup_dimname =
"/SWATHS/" + dup_dimname;
821 else if (ZA == eos5type) {
822 ori_dimname =
"/ZAS/" + ori_dimname;
823 dup_dimname =
"/ZAS/" + dup_dimname;
827 dimname_to_dupdimnamelist.insert(pair<string, string>(ori_dimname, dup_dimname));
828 groupdimlist.push_back(he5d);
837 void EOS5File::Add_EOS5File_Info(
HE5Parser * strmeta_info,
bool grids_mllcv)
840 BESDEBUG(
"h5",
"Coming to Add_EOS5File_Info"<<endl);
841 string fslash_str =
"/";
842 string grid_str =
"/GRIDS/";
843 string swath_str =
"/SWATHS/";
844 string za_str =
"/ZAS/";
852 this->orig_num_grids = strmeta_info->grid_list.size();
855 for (
unsigned int i = 0; i < strmeta_info->grid_list.size(); i++) {
856 HE5Grid he5g = strmeta_info->grid_list.at(i);
858 eos5grid->name = he5g.name;
859 eos5grid->dimnames.resize(he5g.dim_list.size());
861 for (
unsigned int j = 0; j < he5g.dim_list.size(); j++) {
863 HE5Dim he5d = he5g.dim_list.at(j);
864 if (
"XDim" == he5d.name) eos5grid->xdimsize = he5d.size;
865 if (
"YDim" == he5d.name) eos5grid->ydimsize = he5d.size;
875 string unique_dimname = grid_str + he5g.name + fslash_str + he5d.name;
877 (eos5grid->dimnames)[j] = unique_dimname;
879 pair<map<hsize_t, string>::iterator,
bool> mapret1;
880 mapret1 = eos5grid->dimsizes_to_dimnames.insert(pair<hsize_t, string>((hsize_t) he5d.size, unique_dimname));
885 pair<map<string, hsize_t>::iterator,
bool> mapret2;
886 mapret2 = eos5grid->dimnames_to_dimsizes.insert(pair<string, hsize_t>(unique_dimname, (hsize_t) he5d.size));
887 if (
false == mapret2.second)
888 throw5(
"The dimension name ", unique_dimname,
" with the dimension size ", he5d.size,
"is not unique");
893 EOS5SwathGrid_Set_LatLon_Flags(eos5grid, he5g.data_var_list);
896 map<string, string> dnames_to_1dvnames;
897 EOS5Handle_nonlatlon_dimcvars(he5g.data_var_list, GRID, he5g.name, dnames_to_1dvnames);
898 eos5grid->dnames_to_1dvnames = dnames_to_1dvnames;
904 eos5grid->eos5_pixelreg = he5g.pixelregistration;
905 eos5grid->eos5_origin = he5g.gridorigin;
906 eos5grid->eos5_projcode = he5g.projection;
908 for (
unsigned int k = 0; k < 13; k++)
909 eos5grid->param[k] = he5g.param[k];
910 eos5grid->zone = he5g.zone;
911 eos5grid->sphere = he5g.sphere;
913 this->eos5cfgrids.push_back(eos5grid);
918 this->grids_multi_latloncvs = grids_mllcv;
921 for (
unsigned int i = 0; i < strmeta_info->swath_list.size(); i++) {
923 HE5Swath he5s = strmeta_info->swath_list.at(i);
925 eos5swath->name = he5s.name;
926 eos5swath->dimnames.resize(he5s.dim_list.size());
928 for (
unsigned int j = 0; j < he5s.dim_list.size(); j++) {
930 HE5Dim he5d = he5s.dim_list.at(j);
940 string unique_dimname = swath_str + he5s.name + fslash_str + he5d.name;
941 (eos5swath->dimnames)[j] = unique_dimname;
945 pair<map<hsize_t, string>::iterator,
bool> mapret1;
946 mapret1 = eos5swath->dimsizes_to_dimnames.insert(
947 pair<hsize_t, string>((hsize_t) he5d.size, unique_dimname));
952 pair<map<string, hsize_t>::iterator,
bool> mapret2;
953 mapret2 = eos5swath->dimnames_to_dimsizes.insert(
954 pair<string, hsize_t>(unique_dimname, (hsize_t) he5d.size));
955 if (
false == mapret2.second)
956 throw5(
"The dimension name ", unique_dimname,
" with the dimension size ", he5d.size,
"is not unique");
961 EOS5SwathGrid_Set_LatLon_Flags(eos5swath, he5s.geo_var_list);
964 map<string, string> dnames_to_geo1dvnames;
965 EOS5Handle_nonlatlon_dimcvars(he5s.geo_var_list, SWATH, he5s.name, dnames_to_geo1dvnames);
966 eos5swath->dnames_to_geo1dvnames = dnames_to_geo1dvnames;
967 this->eos5cfswaths.push_back(eos5swath);
971 for (
unsigned int i = 0; i < strmeta_info->za_list.size(); i++) {
973 HE5Za he5z = strmeta_info->za_list.at(i);
976 eos5za->name = he5z.name;
977 eos5za->dimnames.resize(he5z.dim_list.size());
979 for (
unsigned int j = 0; j < he5z.dim_list.size(); j++) {
981 HE5Dim he5d = he5z.dim_list.at(j);
987 string unique_dimname = za_str + he5z.name + fslash_str + he5d.name;
988 (eos5za->dimnames)[j] = unique_dimname;
989 pair<map<hsize_t, string>::iterator,
bool> mapret1;
990 mapret1 = eos5za->dimsizes_to_dimnames.insert(pair<hsize_t, string>((hsize_t) he5d.size, unique_dimname));
995 pair<map<string, hsize_t>::iterator,
bool> mapret2;
996 mapret2 = eos5za->dimnames_to_dimsizes.insert(pair<string, hsize_t>(unique_dimname, (hsize_t) he5d.size));
997 if (
false == mapret2.second)
998 throw5(
"The dimension name ", unique_dimname,
" with the dimension size ", he5d.size,
"is not unique");
1003 map<string, string> dnames_to_1dvnames;
1004 EOS5Handle_nonlatlon_dimcvars(he5z.data_var_list, ZA, he5z.name, dnames_to_1dvnames);
1005 eos5za->dnames_to_1dvnames = dnames_to_1dvnames;
1006 this->eos5cfzas.push_back(eos5za);
1011 for (vector<EOS5CFGrid *>::iterator irg = this->eos5cfgrids.begin();
1012 irg != this->eos5cfgrids.end(); ++irg) {
1014 cerr<<
"grid name "<<(*irg)->name <<endl;
1015 cerr<<
"eos5_pixelreg"<<(*irg)->eos5_pixelreg <<endl;
1016 cerr<<
"eos5_origin"<<(*irg)->eos5_pixelreg <<endl;
1017 cerr<<
"point_lower "<<(*irg)->point_lower <<endl;
1018 cerr<<
"xdimsize "<<(*irg)->xdimsize <<endl;
1020 if((*irg)->has_g2dlatlon) cerr<<
"has g2dlatlon"<<endl;
1021 if((*irg)->has_2dlatlon) cerr<<
"has 2dlatlon"<<endl;
1022 if((*irg)->has_1dlatlon) cerr<<
"has 1dlatlon"<<endl;
1023 if((*irg)->has_nolatlon) cerr<<
"has no latlon" <<endl;
1024 if(this->grids_multi_latloncvs) cerr<<
"having multiple lat/lon from structmeta" <<endl;
1025 else cerr<<
"no multiple lat/lon from structmeta" <<endl;
1028 "h5",
"number of dimensions "<<(*irg)->dimnames.size() <<endl;
1029 for (vector<string>::iterator irv = (*irg)->dimnames.begin();
1030 irv != (*irg)->dimnames.end(); ++irv)
1031 cerr<<
"dim names" <<*irv <<endl;
1034 for (map<hsize_t,string>::iterator im1 = (*irg)->dimsizes_to_dimnames.begin();
1035 im1 !=(*irg)->dimsizes_to_dimnames.end();++im1) {
1036 cerr<<
"size to name "<< (int)((*im1).first) <<
"=> "<<(*im1).second <<endl;
1040 for (map<string,string>::iterator im2 = (*irg)->dnames_to_1dvnames.begin();
1041 im2 !=(*irg)->dnames_to_1dvnames.end();++im2) {
1042 cerr<<
"dimanme to 1d var name "<< (*im2).first <<
"=> "<<(*im2).second <<endl;
1047 for (vector<EOS5CFSwath *>::iterator irg = this->eos5cfswaths.begin();
1048 irg != this->eos5cfswaths.end(); ++irg) {
1050 cerr<<
"swath name "<<(*irg)->name <<endl;
1051 if((*irg)->has_nolatlon) cerr<<
"has no latlon" <<endl;
1052 if((*irg)->has_1dlatlon) cerr<<
"has 1dlatlon"<<endl;
1053 if((*irg)->has_2dlatlon) cerr<<
"has 2dlatlon"<<endl;
1056 for (vector<string>::iterator irv = (*irg)->dimnames.begin();
1057 irv != (*irg)->dimnames.end(); ++irv)
1058 cerr<<
"dim names" <<*irv <<endl;
1061 for (map<hsize_t,string>::iterator im1 = (*irg)->dimsizes_to_dimnames.begin();
1062 im1 !=(*irg)->dimsizes_to_dimnames.end();++im1) {
1063 cerr<<
"size to name "<< (int)((*im1).first) <<
"=> "<<(*im1).second <<endl;
1067 for (map<string,string>::iterator im2 = (*irg)->dnames_to_geo1dvnames.begin();
1068 im2 !=(*irg)->dnames_to_geo1dvnames.end();++im2) {
1069 cerr<<
"dimname to 1d varname "<< (*im2).first <<
"=> "<<(*im2).second <<endl;
1073 for (vector<EOS5CFZa *>::iterator irg = this->eos5cfzas.begin();
1074 irg != this->eos5cfzas.end(); ++irg) {
1076 cerr<<
"za name now"<<(*irg)->name <<endl;
1079 for (vector<string>::iterator irv = (*irg)->dimnames.begin();
1080 irv != (*irg)->dimnames.end(); ++irv)
1081 cerr<<
"dim names" <<*irv <<endl;
1084 for (map<hsize_t,string>::iterator im1 = (*irg)->dimsizes_to_dimnames.begin();
1085 im1 !=(*irg)->dimsizes_to_dimnames.end();++im1) {
1086 cerr<<
"size to name "<< (int)((*im1).first) <<
"=> "<<(*im1).second <<endl;
1090 for (map<string,string>::iterator im2 = (*irg)->dnames_to_1dvnames.begin();
1091 im2 !=(*irg)->dnames_to_1dvnames.end();++im2) {
1092 cerr<<
"dimname to 1d varname "<< (*im2).first <<
"=> "<<(*im2).second <<endl;
1101 void EOS5File::EOS5SwathGrid_Set_LatLon_Flags(T* eos5gridswath, vector<HE5Var> &eos5varlist)
1104 BESDEBUG(
"h5",
"Coming to EOS5SwathGrid_Set_LatLon_Flags"<<endl);
1105 bool find_lat =
false;
1106 bool find_lon =
false;
1107 bool has_1dlat =
false;
1108 bool has_1dlon =
false;
1109 bool has_2dlat =
false;
1110 string lat_xdimname;
1111 string lat_ydimname;
1112 string lon_xdimname;
1113 string lon_ydimname;
1114 bool has_2dlon =
false;
1115 bool has_g2dlat =
false;
1116 bool has_g2dlon =
false;
1118 for (
unsigned int i = 0; i < eos5varlist.size(); ++i) {
1119 HE5Var he5v = eos5varlist.at(i);
1120 if (
"Latitude" == he5v.name) {
1122 int num_dims = he5v.dim_list.size();
1125 else if (2 == num_dims) {
1126 lat_ydimname = (he5v.dim_list)[0].name;
1127 lat_xdimname = (he5v.dim_list)[1].name;
1130 else if (num_dims > 2)
1133 throw1(
"The number of dimension should not be 0 for grids or swaths");
1136 if (
"Longitude" == he5v.name) {
1138 int num_dims = he5v.dim_list.size();
1141 else if (2 == num_dims) {
1142 lon_ydimname = (he5v.dim_list)[0].name;
1143 lon_xdimname = (he5v.dim_list)[1].name;
1146 else if (num_dims > 2)
1149 throw1(
"The number of dimension should not be 0 for grids or swaths");
1152 if (
true == find_lat &&
true == find_lon) {
1153 if (
true == has_1dlat &&
true == has_1dlon) eos5gridswath->has_1dlatlon =
true;
1156 if (
true == has_2dlat &&
true == has_2dlon && lat_ydimname == lon_ydimname && lat_xdimname == lon_xdimname)
1157 eos5gridswath->has_2dlatlon =
true;
1159 if (
true == has_g2dlat &&
true == has_g2dlon) eos5gridswath->has_g2dlatlon =
true;
1161 eos5gridswath->has_nolatlon =
false;
1169 void EOS5File::EOS5Handle_nonlatlon_dimcvars(vector<HE5Var> & eos5varlist, EOS5Type eos5type,
string groupname,
1170 map<string, string>& dnamesgeo1dvnames)
1173 BESDEBUG(
"h5",
"Coming to EOS5Handle_nonlatlon_dimcvars"<<endl);
1175 set<string> nocvdimnames;
1176 string grid_str =
"/GRIDS/";
1177 string xdim_str =
"XDim";
1178 string ydim_str =
"YDim";
1179 string fslash_str =
"/";
1182 if (GRID == eos5type) {
1183 string xdimname = grid_str + groupname + fslash_str + xdim_str;
1184 nocvdimnames.insert(xdimname);
1185 string ydimname = grid_str + groupname + fslash_str + ydim_str;
1186 nocvdimnames.insert(ydimname);
1187 eos5typestr =
"/GRIDS/";
1189 else if (SWATH == eos5type)
1190 eos5typestr =
"/SWATHS/";
1191 else if (ZA == eos5type)
1192 eos5typestr =
"/ZAS/";
1194 throw1(
"Unsupported HDF-EOS5 type, this type is not swath, grid or zonal average");
1198 pair<map<string, string>::iterator,
bool> mapret;
1199 for (
unsigned int i = 0; i < eos5varlist.size(); ++i) {
1200 HE5Var he5v = eos5varlist.at(i);
1201 if (1 == he5v.dim_list.size()) {
1202 HE5Dim he5d = he5v.dim_list.at(0);
1204 dimname = eos5typestr + groupname + fslash_str + he5d.name;
1206 varname = eos5typestr + groupname + fslash_str + he5v.name;
1207 mapret = dnamesgeo1dvnames.insert(pair<string, string>(dimname, varname));
1212 if (
false == mapret.second) nocvdimnames.insert(dimname);
1218 set<string>::iterator itset;
1219 for (itset = nocvdimnames.begin(); itset != nocvdimnames.end(); ++itset)
1220 dnamesgeo1dvnames.erase(*itset);
1224 void EOS5File::Adjust_Var_NewName_After_Parsing()
1227 BESDEBUG(
"h5",
"Coming to Adjust_Var_NewName_After_Parsing"<<endl);
1228 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
1229 Obtain_Var_NewName(*irv);
1233 void EOS5File::Obtain_Var_NewName(
Var *var)
1236 BESDEBUG(
"h5",
"Coming to Obtain_Var_NewName"<<endl);
1237 string fslash_str =
"/";
1238 string eos5typestr =
"";
1240 EOS5Type vartype = Get_Var_EOS5_Type(var);
1248 eos5typestr =
"/GRIDS/";
1249 string eos5_groupname = Obtain_Var_EOS5Type_GroupName(var, vartype);
1254 var->newname = eos5typestr + eos5_groupname + fslash_str + var->name;
1259 eos5typestr =
"/SWATHS/";
1260 string eos5_groupname = Obtain_Var_EOS5Type_GroupName(var, vartype);
1265 var->newname = eos5typestr + eos5_groupname + fslash_str + var->name;
1269 eos5typestr =
"/ZAS/";
1270 string eos5_groupname = Obtain_Var_EOS5Type_GroupName(var, vartype);
1275 var->newname = eos5typestr + eos5_groupname + fslash_str + var->name;
1279 string eos5infopath =
"/HDFEOS INFORMATION";
1280 if (var->fullpath.size() > eos5infopath.size()) {
1281 if (eos5infopath == var->fullpath.substr(0, eos5infopath.size())) var->newname = var->name;
1284 var->newname = var->fullpath;
1288 throw1(
"Non-supported EOS type");
1293 EOS5Type EOS5File::Get_Var_EOS5_Type(
Var* var)
1296 BESDEBUG(
"h5",
"Coming to Get_Var_EOS5_Type"<<endl);
1298 string EOS5GRIDPATH =
"/HDFEOS/GRIDS";
1299 string EOS5SWATHPATH =
"/HDFEOS/SWATHS";
1300 string EOS5ZAPATH =
"/HDFEOS/ZAS";
1302 if (var->fullpath.size() >= EOS5GRIDPATH.size()) {
1303 if (EOS5GRIDPATH == var->fullpath.substr(0, EOS5GRIDPATH.size()))
return GRID;
1305 if (var->fullpath.size() >= EOS5SWATHPATH.size()) {
1306 if (EOS5SWATHPATH == var->fullpath.substr(0, EOS5SWATHPATH.size()))
return SWATH;
1308 if (var->fullpath.size() >= EOS5ZAPATH.size()) {
1309 if (EOS5ZAPATH == var->fullpath.substr(0, EOS5ZAPATH.size()))
return ZA;
1319 BESDEBUG(
"h5",
"Coming to Add_Dim_Name"<<endl);
1320 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
1321 Obtain_Var_Dims(*irv, strmeta_info);
1323 for (vector<Dimension *>::iterator ird = (*irv)->dims.begin();
1324 ird != (*irv)->dims.end();++ird) {
1325 cerr<<
"dim name right after change "<<(*ird)->newname <<endl;
1333 bool EOS5File::Obtain_Var_Dims(
Var *var,
HE5Parser * strmeta_info)
1336 BESDEBUG(
"h5",
"Coming to Obtain_Var_Dims"<<endl);
1337 string varname_from_parser =
"";
1338 EOS5Type vartype = Get_Var_EOS5_Type(var);
1340 if (GRID == vartype) {
1341 int num_grids = strmeta_info->grid_list.size();
1342 for (
int i = 0; i < num_grids; ++i) {
1343 HE5Grid he5g = strmeta_info->grid_list.at(i);
1344 if (he5g.name == Obtain_Var_EOS5Type_GroupName(var, vartype)) {
1345 EOS5CFGrid *eos5cfgrid = (this->eos5cfgrids)[i];
1346 bool var_is_parsed = Set_Var_Dims(eos5cfgrid, var, he5g.data_var_list, he5g.name, num_grids, GRID);
1347 if (
false == var_is_parsed) {
1348 map<hsize_t, string> dimsizes_to_dimnames = eos5cfgrid->dimsizes_to_dimnames;
1353 Set_NonParse_Var_Dims(eos5cfgrid, var, dimsizes_to_dimnames, num_grids, vartype);
1358 else if (SWATH == vartype) {
1359 int num_swaths = strmeta_info->swath_list.size();
1360 for (
int i = 0; i < num_swaths; ++i) {
1362 HE5Swath he5s = strmeta_info->swath_list.at(i);
1364 if (he5s.name == Obtain_Var_EOS5Type_GroupName(var, vartype)) {
1366 EOS5CFSwath *eos5cfswath = (this->eos5cfswaths)[i];
1368 bool var_is_parsed =
true;
1369 int swath_fieldtype_flag = Check_EOS5Swath_FieldType(var);
1370 if (1 == swath_fieldtype_flag)
1371 var_is_parsed = Set_Var_Dims(eos5cfswath, var, he5s.geo_var_list, he5s.name, num_swaths, SWATH);
1372 else if (0 == swath_fieldtype_flag)
1373 var_is_parsed = Set_Var_Dims(eos5cfswath, var, he5s.data_var_list, he5s.name, num_swaths, SWATH);
1376 var_is_parsed =
false;
1378 if (
false == var_is_parsed) {
1379 map<hsize_t, string> dimsizes_to_dimnames = eos5cfswath->dimsizes_to_dimnames;
1380 Set_NonParse_Var_Dims(eos5cfswath, var, dimsizes_to_dimnames, num_swaths, vartype);
1386 else if (ZA == vartype) {
1388 int num_zas = strmeta_info->za_list.size();
1389 for (
int i = 0; i < num_zas; ++i) {
1390 HE5Za he5z = strmeta_info->za_list.at(i);
1391 if (he5z.name == Obtain_Var_EOS5Type_GroupName(var, vartype)) {
1392 EOS5CFZa *eos5cfza = (this->eos5cfzas)[i];
1393 bool var_is_parsed = Set_Var_Dims(eos5cfza, var, he5z.data_var_list, he5z.name, num_zas, ZA);
1394 if (
false == var_is_parsed) {
1395 map<hsize_t, string> dimsizes_to_dimnames = eos5cfza->dimsizes_to_dimnames;
1396 Set_NonParse_Var_Dims(eos5cfza, var, dimsizes_to_dimnames, num_zas, vartype);
1406 bool EOS5File::Set_Var_Dims(T* eos5data,
Var *var, vector<HE5Var> &he5var,
const string& groupname,
int num_groups,
1410 BESDEBUG(
"h5",
"Coming to Set_Var_Dims"<<endl);
1412 bool is_parsed =
false;
1413 string eos5typestr =
"";
1414 string fslash_str =
"/";
1416 if (GRID == eos5type)
1417 eos5typestr =
"/GRIDS/";
1418 else if (SWATH == eos5type)
1419 eos5typestr =
"/SWATHS/";
1420 else if (ZA == eos5type)
1421 eos5typestr =
"/ZAS/";
1423 throw1(
"Unsupported HDF-EOS5 type, this type is not swath, grid or zonal average");
1425 for (
unsigned int i = 0; i < he5var.size(); i++) {
1427 HE5Var he5v = he5var.at(i);
1429 if (he5v.name == var->name) {
1430 if (he5v.dim_list.size() != var->dims.size())
1431 throw2(
"Number of dimensions don't match with the structmetadata for variable ", var->name);
1461 set<hsize_t> dimsize_have_name_set;
1462 pair<set<hsize_t>::iterator,
bool> setret1;
1463 set<string> thisvar_dimname_set;
1464 pair<set<string>::iterator,
bool> setret2;
1466 for (
unsigned int j = 0; j < he5v.dim_list.size(); j++) {
1467 HE5Dim he5d = he5v.dim_list.at(j);
1468 for (vector<Dimension *>::iterator ird = var->dims.begin(); ird != var->dims.end(); ++ird) {
1470 if ((hsize_t) (he5d.size) == (*ird)->size) {
1472 if (
"" == (*ird)->name) {
1473 string dimname_candidate = eos5typestr + groupname + fslash_str + he5d.name;
1474 setret2 = thisvar_dimname_set.insert(dimname_candidate);
1475 if (
true == setret2.second) {
1476 (*ird)->name = dimname_candidate;
1478 (*ird)->newname = (num_groups == 1) ? he5d.name : (*ird)->name;
1479 eos5data->vardimnames.insert((*ird)->name);
1483 eos5data->dimnames_to_unlimited[(*ird)->name] = (*ird)->unlimited_dim;
1492 for (vector<Dimension *>::iterator ird = var->dims.begin(); ird != var->dims.end(); ++ird) {
1493 if (
"" == (*ird)->name)
1494 Create_Unique_DimName(eos5data, thisvar_dimname_set, *ird, num_groups, eos5type);
1503 void EOS5File::Create_Unique_DimName(T*eos5data, set<string>& thisvar_dimname_set,
Dimension *dim,
int num_groups,
1507 BESDEBUG(
"h5",
"Coming to Create_Unique_DimName"<<endl);
1508 map<hsize_t, string>::iterator itmap1;
1509 map<string, hsize_t>::iterator itmap2;
1510 pair<set<string>::iterator,
bool> setret2;
1511 itmap1 = (eos5data->dimsizes_to_dimnames).find(dim->size);
1518 if (itmap1 != (eos5data->dimsizes_to_dimnames).end()) {
1519 string dimname_candidate = (eos5data->dimsizes_to_dimnames)[dim->size];
1522 setret2 = thisvar_dimname_set.insert(dimname_candidate);
1524 if (
false == setret2.second) {
1527 bool match_some_dimname = Check_All_DimNames(eos5data, dimname_candidate, dim->size);
1529 if (
false == match_some_dimname) {
1532 Get_Unique_Name(eos5data->vardimnames, dimname_candidate);
1533 thisvar_dimname_set.insert(dimname_candidate);
1536 Insert_One_NameSizeMap_Element2(eos5data->dimnames_to_dimsizes, eos5data->dimnames_to_unlimited,
1537 dimname_candidate, dim->size, dim->unlimited_dim);
1538 eos5data->dimsizes_to_dimnames.insert(pair<hsize_t, string>(dim->size, dimname_candidate));
1539 eos5data->dimnames.push_back(dimname_candidate);
1544 dim->name = dimname_candidate;
1546 dim->newname = dim->name;
1548 string dname = HDF5CFUtil::obtain_string_after_lastslash(dim->name);
1550 throw3(
"The dimension name ", dim->name,
" of the variable is not right");
1552 dim->newname = dname;
1558 string Fakedimname = Create_Unique_FakeDimName(eos5data, eos5type);
1559 thisvar_dimname_set.insert(Fakedimname);
1562 Insert_One_NameSizeMap_Element2(eos5data->dimnames_to_dimsizes, eos5data->dimnames_to_unlimited, Fakedimname,
1563 dim->size, dim->unlimited_dim);
1564 eos5data->dimsizes_to_dimnames.insert(pair<hsize_t, string>(dim->size, Fakedimname));
1565 eos5data->dimnames.push_back(Fakedimname);
1566 dim->name = Fakedimname;
1568 dim->newname = dim->name;
1570 string dname = HDF5CFUtil::obtain_string_after_lastslash(dim->name);
1572 throw3(
"The dimension name ", dim->name,
" of the variable is not right");
1574 dim->newname = dname;
1581 bool EOS5File::Check_All_DimNames(T* eos5data,
string& dimname, hsize_t dimsize)
1584 BESDEBUG(
"h5",
"Coming to Check_All_DimNames"<<endl);
1585 bool ret_flag =
false;
1586 for (map<string, hsize_t>::iterator im = eos5data->dimnames_to_dimsizes.begin();
1587 im != eos5data->dimnames_to_dimsizes.end(); ++im) {
1589 if (dimsize == (*im).second && dimname != (*im).first) {
1590 dimname = (*im).first;
1599 void EOS5File::Get_Unique_Name(set<string> & nameset,
string& dimname_candidate)
1602 BESDEBUG(
"h5",
"Coming to Get_Unique_Name"<<endl);
1603 int clash_index = 1;
1604 string temp_clashname = dimname_candidate +
'_';
1605 HDF5CFUtil::gen_unique_name(temp_clashname, nameset, clash_index);
1606 dimname_candidate = temp_clashname;
1611 string EOS5File::Create_Unique_FakeDimName(T*eos5data, EOS5Type eos5type)
1614 BESDEBUG(
"h5",
"Coming to Create_Unique_FakeDimName"<<endl);
1615 string fslash_str =
"/";
1617 if (GRID == eos5type)
1618 eos5typestr =
"/GRIDS/";
1619 else if (SWATH == eos5type)
1620 eos5typestr =
"/SWATHS/";
1621 else if (ZA == eos5type)
1622 eos5typestr =
"/ZAS/";
1624 throw1(
"Unsupported HDF-EOS5 type, this type is not swath, grid or zonal average");
1626 stringstream sfakedimindex;
1627 sfakedimindex << eos5data->addeddimindex;
1628 string fakedimstr =
"FakeDim";
1629 string added_dimname = eos5typestr + eos5data->name + fslash_str + fakedimstr + sfakedimindex.str();
1631 pair<set<string>::iterator,
bool> setret;
1632 setret = eos5data->vardimnames.insert(added_dimname);
1633 if (
false == setret.second) Get_Unique_Name(eos5data->vardimnames, added_dimname);
1634 eos5data->addeddimindex = eos5data->addeddimindex + 1;
1635 return added_dimname;
1639 string EOS5File::Obtain_Var_EOS5Type_GroupName(
Var*var, EOS5Type eos5type)
1642 BESDEBUG(
"h5",
"Coming to Obtain_Var_EOS5Type_GroupName"<<endl);
1643 string EOS5GRIDPATH =
"/HDFEOS/GRIDS";
1644 string EOS5SWATHPATH =
"/HDFEOS/SWATHS";
1645 string EOS5ZAPATH =
"/HDFEOS/ZAS";
1646 size_t eostypename_start_pos = 0;
1647 size_t eostypename_end_pos;
1654 if (GRID == eos5type)
1655 eostypename_start_pos = EOS5GRIDPATH.size() + 1;
1656 else if (SWATH == eos5type)
1657 eostypename_start_pos = EOS5SWATHPATH.size() + 1;
1658 else if (ZA == eos5type)
1659 eostypename_start_pos = EOS5ZAPATH.size() + 1;
1661 throw2(
"Non supported eos5 type for var ", var->fullpath);
1663 eostypename_end_pos = var->fullpath.find(
'/', eostypename_start_pos) - 1;
1664 groupname = var->fullpath.substr(eostypename_start_pos, eostypename_end_pos - eostypename_start_pos + 1);
1666 BESDEBUG(
"h5",
"In Obtain_Var_EOS5Type_GroupName(), the groupname is "<<groupname << endl);
1672 int EOS5File::Check_EOS5Swath_FieldType(
Var*var)
1675 string geofield_relative_path =
"/Geolocation Fields/" + var->name;
1676 string datafield_relative_path =
"/Data Fields/" + var->name;
1680 if (var->fullpath.size() > datafield_relative_path.size()) {
1681 size_t field_pos_in_full_path = var->fullpath.size() - datafield_relative_path.size();
1682 if (var->fullpath.rfind(datafield_relative_path, field_pos_in_full_path) != string::npos) tempflag = 0;
1685 if (tempflag != 0 && (var->fullpath.size() > geofield_relative_path.size())) {
1686 size_t field_pos_in_full_path = var->fullpath.size() - geofield_relative_path.size();
1687 if (var->fullpath.rfind(geofield_relative_path, field_pos_in_full_path) != string::npos) tempflag = 1;
1695 void EOS5File::Set_NonParse_Var_Dims(T*eos5data,
Var* var, map<hsize_t, string>& ,
1696 int num_groups, EOS5Type eos5type)
1699 BESDEBUG(
"h5",
"Coming to Set_NonParse_Var_Dims"<<endl);
1700 map<hsize_t, string>::iterator itmap;
1701 set<string> thisvar_dimname_set;
1703 for (vector<Dimension *>::iterator ird = var->dims.begin(); ird != var->dims.end(); ++ird) {
1704 if (
"" == (*ird)->name)
1705 Create_Unique_DimName(eos5data, thisvar_dimname_set, *ird, num_groups, eos5type);
1707 throw5(
"The dimension name ", (*ird)->name,
" of the variable ", var->name,
" is not right");
1712 void EOS5File::Check_Aura_Product_Status()
1715 BESDEBUG(
"h5",
"Coming to Check_Aura_Product_Status"<<endl);
1718 string eos5_fattr_group_name =
"/HDFEOS/ADDITIONAL/FILE_ATTRIBUTES";
1719 string instrument_attr_name =
"InstrumentName";
1722 for (vector<Group *>::iterator irg = this->groups.begin(); irg != this->groups.end(); ++irg) {
1723 if (eos5_fattr_group_name == (*irg)->path) {
1724 for (vector<Attribute *>::iterator ira = (*irg)->attrs.begin(); ira != (*irg)->attrs.end(); ++ira) {
1725 if (instrument_attr_name == (*ira)->name) {
1726 Retrieve_H5_Attr_Value(*ira, (*irg)->path);
1727 string attr_value((*ira)->value.begin(), (*ira)->value.end());
1728 if (
"OMI" == attr_value) {
1729 this->isaura =
true;
1730 this->aura_name = OMI;
1732 else if (
"MLS Aura" == attr_value) {
1733 this->isaura =
true;
1734 this->aura_name = MLS;
1736 else if (
"TES" == attr_value) {
1737 this->isaura =
true;
1738 this->aura_name = TES;
1740 else if (
"HIRDLS" == attr_value) {
1741 this->isaura =
true;
1742 this->aura_name = HIRDLS;
1751 if (
true == this->isaura) {
1752 eos5_to_cf_attr_map[
"FillValue"] =
"_FillValue";
1753 eos5_to_cf_attr_map[
"MissingValue"] =
"missing_value";
1754 eos5_to_cf_attr_map[
"Units"] =
"units";
1755 eos5_to_cf_attr_map[
"Offset"] =
"add_offset";
1756 eos5_to_cf_attr_map[
"ScaleFactor"] =
"scale_factor";
1757 eos5_to_cf_attr_map[
"ValidRange"] =
"valid_range";
1758 eos5_to_cf_attr_map[
"Title"] =
"title";
1764 void EOS5File::Handle_CVar()
1767 BESDEBUG(
"h5",
"Coming to Handle_CVar()"<<endl);
1770 bool is_augmented = Check_Augmentation_Status();
1773 if(is_augmented) cerr<<
"The file is augmented "<<endl;
1774 else cerr<<
"The file is not augmented "<<endl;
1778 if (this->eos5cfgrids.size() > 0)
1779 Handle_Grid_CVar(is_augmented);
1780 if (this->eos5cfswaths.size() > 0)
1781 Handle_Swath_CVar(is_augmented);
1782 if (this->eos5cfzas.size() > 0)
1783 Handle_Za_CVar(is_augmented);
1786 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin();
1787 irv != this->cvars.end(); irv++) {
1788 cerr<<
"EOS5CVar name "<<(*irv)->name <<endl;
1789 cerr<<
"EOS5CVar dimension name "<< (*irv)->cfdimname <<endl;
1790 cerr<<
"EOS5CVar new name "<<(*irv)->newname <<endl;
1791 cerr<<
"EOS5CVar type is "<<(*irv)->cvartype <<endl;
1799 void EOS5File::Handle_Grid_CVar(
bool is_augmented)
1802 BESDEBUG(
"h5",
"Coming to Handle_Grid_CVar"<<endl);
1803 if (
true == is_augmented) {
1805 Handle_Augmented_Grid_CVar();
1808 Remove_MultiDim_LatLon_EOS5CFGrid();
1811 if (0 == this->eos5cfgrids.size())
return;
1812 if (1 == this->eos5cfgrids.size())
1813 Handle_Single_Nonaugment_Grid_CVar((this->eos5cfgrids)[0]);
1815 Handle_Multi_Nonaugment_Grid_CVar();
1822 bool EOS5File::Check_Augmentation_Status()
1825 BESDEBUG(
"h5",
"Coming to Check_Augmentation_Status()"<<endl);
1826 bool aug_status =
false;
1827 int num_aug_eos5grp = 0;
1829 for (vector<EOS5CFGrid *>::iterator irg = this->eos5cfgrids.begin(); irg != this->eos5cfgrids.end(); ++irg) {
1830 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
1831 bool is_augmented = Check_Augmented_Var_Candidate(*irg, *irv, GRID);
1832 if (
true == is_augmented) {
1839 for (vector<EOS5CFSwath *>::iterator irg = this->eos5cfswaths.begin(); irg != this->eos5cfswaths.end(); ++irg) {
1840 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
1841 bool is_augmented = Check_Augmented_Var_Candidate(*irg, *irv, SWATH);
1842 if (
true == is_augmented) {
1850 for (vector<EOS5CFZa *>::iterator irg = this->eos5cfzas.begin(); irg != this->eos5cfzas.end(); ++irg) {
1851 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
1852 bool is_augmented = Check_Augmented_Var_Candidate(*irg, *irv, ZA);
1853 if (
true == is_augmented) {
1860 int total_num_eos5grp = this->eos5cfgrids.size() + this->eos5cfswaths.size() + this->eos5cfzas.size();
1864 if (num_aug_eos5grp == total_num_eos5grp) aug_status =
true;
1872 bool EOS5File::Check_Augmented_Var_Attrs(
Var *var) {
1876 bool has_dimscale_class =
false;
1877 bool has_reflist =
false;
1878 for (vector<Attribute *>::iterator ira = var->attrs.begin();
1879 ira != var->attrs.end(); ++ira) {
1880 if (
"CLASS" == (*ira)->name) {
1881 Retrieve_H5_Attr_Value(*ira,var->fullpath);
1882 string class_value((*ira)->value.begin(),(*ira)->value.end());
1883 if (
"DIMENSION_SCALE"==class_value)
1884 has_dimscale_class =
true;
1887 if (
"REFERENCE_LIST" == (*ira)->name)
1889 if (
true == has_reflist &&
true == has_dimscale_class)
1893 if (
true == has_reflist &&
true == has_dimscale_class)
1908 bool EOS5File::Check_Augmented_Var_Candidate(T *eos5data,
Var *var, EOS5Type eos5type)
1911 BESDEBUG(
"h5",
"Coming to Check_Augmented_Var_Candidate"<<endl);
1912 bool augmented_var =
false;
1914 string EOS5DATAPATH =
"";
1915 if (GRID == eos5type)
1916 EOS5DATAPATH =
"/HDFEOS/GRIDS/";
1917 else if (ZA == eos5type)
1918 EOS5DATAPATH =
"/HDFEOS/ZAS/";
1919 else if (SWATH == eos5type)
1920 EOS5DATAPATH =
"/HDFEOS/SWATHS/";
1922 throw1(
"Non supported EOS5 type");
1924 string fslash_str =
"/";
1925 string THIS_EOS5DATAPATH = EOS5DATAPATH + eos5data->name + fslash_str;
1928 if (eos5type == Get_Var_EOS5_Type(var)) {
1929 string var_eos5data_name = Obtain_Var_EOS5Type_GroupName(var, eos5type);
1931 if (var_eos5data_name == eos5data->name) {
1932 if (var->fullpath.size() > THIS_EOS5DATAPATH.size()) {
1934 string var_path_after_eos5dataname = var->fullpath.substr(THIS_EOS5DATAPATH.size());
1936 if (var_path_after_eos5dataname == var->name) augmented_var =
true;
1941 return augmented_var;
1946 void EOS5File::Handle_Augmented_Grid_CVar()
1948 BESDEBUG(
"h5",
"Coming to Handle_Augmented_Grid_CVar()"<<endl);
1949 for (vector<EOS5CFGrid *>::iterator irv = this->eos5cfgrids.begin(); irv != this->eos5cfgrids.end(); ++irv)
1950 Handle_Single_Augment_CVar(*irv, GRID);
1955 void EOS5File::Handle_Single_Augment_CVar(T* cfeos5data, EOS5Type eos5type)
1958 BESDEBUG(
"h5",
"Coming to Handle_Single_Augment_CVar()"<<endl);
1959 set<string> tempvardimnamelist;
1960 tempvardimnamelist = cfeos5data->vardimnames;
1961 set<string>::iterator its;
1962 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its) {
1963 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end();) {
1965 bool is_augmented = Check_Augmented_Var_Candidate(cfeos5data, *irv, eos5type);
1967 if (
true == is_augmented) {
1971 string tempdimname = HDF5CFUtil::obtain_string_after_lastslash(*its);
1974 if (tempdimname == (*irv)->name) {
1981 EOS5cvar->cfdimname = *its;
1982 EOS5cvar->cvartype = CV_EXIST;
1983 EOS5cvar->eos_type = eos5type;
1986 this->cvars.push_back(EOS5cvar);
1990 irv = this->vars.erase(irv);
2002 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
2003 its = tempvardimnamelist.find((*irv)->cfdimname);
2004 if (its != tempvardimnamelist.end()) tempvardimnamelist.erase(its);
2007 if (
false == tempvardimnamelist.empty())
2008 throw1(
"Augmented files still need to provide more coordinate variables");
2014 void EOS5File::Remove_MultiDim_LatLon_EOS5CFGrid()
2017 BESDEBUG(
"h5",
"Coming to Remove_MultiDim_LatLon_EOS5CFGrid()"<<endl);
2018 for (vector<EOS5CFGrid *>::iterator irg = this->eos5cfgrids.begin(); irg != this->eos5cfgrids.end();) {
2029 bool irg_erase =
false;
2031 if (
true == (*irg)->has_2dlatlon) {
2033 if ((
true == this->isaura) && (OMI == this->aura_name) && (HE5_GCTP_GEO == (*irg)->eos5_projcode))
2037 string EOS5GRIDPATH =
"/HDFEOS/GRIDS/";
2038 string fslash_str =
"/";
2039 string THIS_EOS5GRIDPATH = EOS5GRIDPATH + (*irg)->name + fslash_str;
2040 int catch_latlon = 0;
2042 for (vector<Var *>::iterator irv = this->vars.begin(); (irv != this->vars.end()) && (catch_latlon != 2);
2044 if (GRID == Get_Var_EOS5_Type(*irv) && ((*irv)->fullpath.size() > THIS_EOS5GRIDPATH.size())) {
2046 string var_grid_name = Obtain_Var_EOS5Type_GroupName(*irv, GRID);
2047 if (var_grid_name == (*irg)->name) {
2048 if ((
"Longitude" == (*irv)->name) || (
"Latitude" == (*irv)->name)) {
2052 irv = this->vars.erase(irv);
2066 if (2 == catch_latlon) {
2067 (*irg)->has_nolatlon =
true;
2068 (*irg)->has_2dlatlon =
false;
2074 irg = this->eos5cfgrids.erase(irg);
2079 if (
false == irg_erase) {
2086 for (vector<EOS5CFGrid *>::iterator irg = this->eos5cfgrids.begin(); irg != this->eos5cfgrids.end();) {
2088 if (
true == (*irg)->has_g2dlatlon) {
2090 irg = this->eos5cfgrids.erase(irg);
2099 void EOS5File::Handle_Single_Nonaugment_Grid_CVar(
EOS5CFGrid* cfgrid)
2102 BESDEBUG(
"h5",
"Coming to Handle_Single_Nonaugment_Grid_CVar()"<<endl);
2103 set<string> tempvardimnamelist;
2104 tempvardimnamelist = cfgrid->vardimnames;
2107 bool use_own_latlon =
false;
2108 if (
true == cfgrid->has_1dlatlon)
2109 use_own_latlon = Handle_Single_Nonaugment_Grid_CVar_OwnLatLon(cfgrid, tempvardimnamelist);
2111 if(use_own_latlon)
"h5",
"using 1D latlon"<<endl;
2112 else "h5",
"use_own_latlon is false "<<endl;
2115 if (
false == use_own_latlon) {
2116 bool use_eos5_latlon =
false;
2117 use_eos5_latlon = Handle_Single_Nonaugment_Grid_CVar_EOS5LatLon(cfgrid, tempvardimnamelist);
2120 if (
false == use_eos5_latlon)
return;
2124 Handle_NonLatLon_Grid_CVar(cfgrid, tempvardimnamelist);
2129 bool EOS5File::Handle_Single_Nonaugment_Grid_CVar_OwnLatLon(
EOS5CFGrid *cfgrid, set<string>& tempvardimnamelist)
2133 BESDEBUG(
"h5",
"Coming to Handle_Single_Nonaugment_Grid_CVar_OwnLatLon()"<<endl);
2134 set<string>::iterator its;
2135 string EOS5GRIDPATH =
"/HDFEOS/GRIDS/";
2136 string fslash_str =
"/";
2137 string THIS_EOS5GRIDPATH = EOS5GRIDPATH + cfgrid->name + fslash_str;
2140 bool find_latydim =
false;
2141 bool find_lonxdim =
false;
2143 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
2144 if (GRID == Get_Var_EOS5_Type(*irv) && ((*irv)->fullpath.size() > THIS_EOS5GRIDPATH.size())) {
2146 string var_grid_name = Obtain_Var_EOS5Type_GroupName(*irv, GRID);
2147 if ((var_grid_name == cfgrid->name) && ((*irv)->name ==
"Latitude")) {
2149 string tempdimname = (((*irv)->dims)[0])->name;
2151 if (
"YDim" == HDF5CFUtil::obtain_string_after_lastslash(tempdimname)) {
2157 EOS5cvar->cfdimname = tempdimname;
2158 EOS5cvar->cvartype = CV_EXIST;
2159 EOS5cvar->eos_type = GRID;
2162 this->cvars.push_back(EOS5cvar);
2166 this->vars.erase(irv);
2169 find_latydim =
true;
2176 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
2178 if (GRID == Get_Var_EOS5_Type(*irv) && ((*irv)->fullpath.size() > THIS_EOS5GRIDPATH.size())) {
2180 string var_grid_name = Obtain_Var_EOS5Type_GroupName(*irv, GRID);
2182 if ((var_grid_name == cfgrid->name) && ((*irv)->name ==
"Longitude")) {
2184 string tempdimname = (((*irv)->dims)[0])->name;
2186 if (
"XDim" == HDF5CFUtil::obtain_string_after_lastslash(tempdimname)) {
2192 EOS5cvar->cfdimname = tempdimname;
2193 EOS5cvar->cvartype = CV_EXIST;
2194 EOS5cvar->eos_type = GRID;
2197 this->cvars.push_back(EOS5cvar);
2201 this->vars.erase(irv);
2202 find_lonxdim =
true;
2209 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
2210 its = tempvardimnamelist.find((*irv)->cfdimname);
2211 if (its != tempvardimnamelist.end()) tempvardimnamelist.erase(its);
2216 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its)
2217 "h5",
"tempvardim "<<*its <<endl;
2220 return (find_latydim ==
true && find_lonxdim ==
true);
2224 bool EOS5File::Handle_Single_Nonaugment_Grid_CVar_EOS5LatLon(
EOS5CFGrid *cfgrid, set<string>& tempvardimnamelist)
2228 BESDEBUG(
"h5",
"Coming to Handle_Single_Nonaugment_Grid_CVar_EOS5LatLon()"<<endl);
2231 bool find_ydim =
false;
2232 bool find_xdim =
false;
2233 set<string>::iterator its;
2236 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its)
2237 cerr<<
"dim names "<<(*its) <<endl;
2240 string ydim_full_path;
2241 string xdim_full_path;
2243 if (cfgrid->eos5_projcode != HE5_GCTP_GEO) {
2245 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its) {
2246 if (
"YDim" == HDF5CFUtil::obtain_string_after_lastslash(*its))
2247 ydim_full_path = *its;
2248 else if (
"XDim" == HDF5CFUtil::obtain_string_after_lastslash(*its)) xdim_full_path = *its;
2253 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end();) {
2254 if (
"YDim" == HDF5CFUtil::obtain_string_after_lastslash(*its)) {
2258 EOS5cvar->name =
"lat";
2259 Create_Added_Var_NewName_FullPath(GRID, cfgrid->name, EOS5cvar->name, EOS5cvar->newname,
2260 EOS5cvar->fullpath);
2262 if (cfgrid->eos5_projcode != HE5_GCTP_GEO) {
2264 EOS5cvar->dtype = H5FLOAT64;
2268 EOS5cvar->dtype = H5FLOAT32;
2272 eos5cvar_dim->name = *its;
2273 eos5cvar_dim->newname = (this->eos5cfgrids.size() == 1) ?
"YDim" : *its;
2274 EOS5cvar->dims.push_back(eos5cvar_dim);
2275 EOS5cvar->cfdimname = eos5cvar_dim->name;
2277 if (EOS5cvar->rank == 2) {
2279 eos5cvar_dim =
new Dimension((hsize_t) cfgrid->xdimsize);
2280 eos5cvar_dim->name = xdim_full_path;
2281 eos5cvar_dim->newname = (this->eos5cfgrids.size() == 1) ?
"XDim" : xdim_full_path;
2282 EOS5cvar->dims.push_back(eos5cvar_dim);
2285 EOS5cvar->cvartype = CV_LAT_MISS;
2286 EOS5cvar->eos_type = GRID;
2287 EOS5cvar->xdimsize = cfgrid->xdimsize;
2288 EOS5cvar->ydimsize = cfgrid->ydimsize;
2291 EOS5cvar->point_lower = cfgrid->point_lower;
2292 EOS5cvar->point_upper = cfgrid->point_upper;
2293 EOS5cvar->point_left = cfgrid->point_left;
2294 EOS5cvar->point_right = cfgrid->point_right;
2295 EOS5cvar->eos5_pixelreg = cfgrid->eos5_pixelreg;
2296 EOS5cvar->eos5_origin = cfgrid->eos5_origin;
2297 EOS5cvar->eos5_projcode = cfgrid->eos5_projcode;
2299 for (
unsigned int k = 0; k < 13; k++)
2300 EOS5cvar->param[k] = cfgrid->param[k];
2302 EOS5cvar->zone = cfgrid->zone;
2303 EOS5cvar->sphere = cfgrid->sphere;
2306 this->cvars.push_back(EOS5cvar);
2310 tempvardimnamelist.erase(its++);
2314 else if (
"XDim" == HDF5CFUtil::obtain_string_after_lastslash(*its)) {
2318 EOS5cvar->name =
"lon";
2319 Create_Added_Var_NewName_FullPath(GRID, cfgrid->name, EOS5cvar->name, EOS5cvar->newname,
2320 EOS5cvar->fullpath);
2325 if (cfgrid->eos5_projcode != HE5_GCTP_GEO) {
2327 EOS5cvar->dtype = H5FLOAT64;
2331 EOS5cvar->dtype = H5FLOAT32;
2335 if (EOS5cvar->rank == 2) {
2336 eos5cvar_dim =
new Dimension((hsize_t) cfgrid->ydimsize);
2340 eos5cvar_dim->name = ydim_full_path;
2341 eos5cvar_dim->newname = (this->eos5cfgrids.size() == 1) ?
"YDim" : ydim_full_path;
2342 EOS5cvar->dims.push_back(eos5cvar_dim);
2345 eos5cvar_dim =
new Dimension((hsize_t) cfgrid->xdimsize);
2349 eos5cvar_dim->name = *its;
2350 eos5cvar_dim->newname = (this->eos5cfgrids.size() == 1) ?
"XDim" : *its;
2351 EOS5cvar->dims.push_back(eos5cvar_dim);
2352 EOS5cvar->cfdimname = eos5cvar_dim->name;
2354 EOS5cvar->cvartype = CV_LON_MISS;
2355 EOS5cvar->eos_type = GRID;
2356 EOS5cvar->xdimsize = cfgrid->xdimsize;
2357 EOS5cvar->ydimsize = cfgrid->ydimsize;
2360 EOS5cvar->point_lower = cfgrid->point_lower;
2361 EOS5cvar->point_upper = cfgrid->point_upper;
2362 EOS5cvar->point_left = cfgrid->point_left;
2363 EOS5cvar->point_right = cfgrid->point_right;
2364 EOS5cvar->eos5_pixelreg = cfgrid->eos5_pixelreg;
2365 EOS5cvar->eos5_origin = cfgrid->eos5_origin;
2366 EOS5cvar->eos5_projcode = cfgrid->eos5_projcode;
2367 for (
unsigned int k = 0; k < 13; k++)
2368 EOS5cvar->param[k] = cfgrid->param[k];
2369 EOS5cvar->zone = cfgrid->zone;
2370 EOS5cvar->sphere = cfgrid->sphere;
2373 this->cvars.push_back(EOS5cvar);
2376 tempvardimnamelist.erase(its++);
2382 if (
true == find_xdim &&
true == find_ydim)
break;
2385 return (
true == find_xdim &&
true == find_ydim);
2389 void EOS5File::Handle_NonLatLon_Grid_CVar(
EOS5CFGrid *cfgrid, set<string>& tempvardimnamelist)
2393 set<string>::iterator its;
2394 int num_dimnames = tempvardimnamelist.size();
2395 bool has_dimnames =
true;
2397 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its) {
2398 if (cfgrid->dnames_to_1dvnames.find(*its) != cfgrid->dnames_to_1dvnames.end()) {
2399 for (vector<Var *>::iterator irv = this->vars.begin(); has_dimnames && (irv != this->vars.end());) {
2403 if (GRID == Get_Var_EOS5_Type(*irv) && (*irv)->newname == (cfgrid->dnames_to_1dvnames)[*its]) {
2410 EOS5cvar->cfdimname = *its;
2411 EOS5cvar->cvartype = CV_EXIST;
2412 EOS5cvar->eos_type = GRID;
2415 this->cvars.push_back(EOS5cvar);
2419 irv = this->vars.erase(irv);
2421 if (0 == num_dimnames) has_dimnames =
false;
2431 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
2432 its = tempvardimnamelist.find((*irv)->cfdimname);
2433 if (its != tempvardimnamelist.end()) tempvardimnamelist.erase(its);
2437 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its) {
2440 Create_Missing_CV(cfgrid, EOS5cvar, *its, GRID, this->eos5cfgrids.size());
2441 this->cvars.push_back(EOS5cvar);
2447 void EOS5File::Handle_Multi_Nonaugment_Grid_CVar()
2450 BESDEBUG(
"h5",
"Coming to Handle_Multi_nonaugment_Grid_CVar()"<<endl);
2454 if (
true == this->grids_multi_latloncvs) {
2455 for (vector<EOS5CFGrid *>::iterator irv = this->eos5cfgrids.begin(); irv != this->eos5cfgrids.end(); ++irv)
2456 Handle_Single_Nonaugment_Grid_CVar(*irv);
2467 int num_1dlatlon_pairs = 0;
2468 for (vector<EOS5CFGrid *>::iterator irv = this->eos5cfgrids.begin(); irv != this->eos5cfgrids.end(); ++irv)
2469 if (
true == (*irv)->has_1dlatlon) num_1dlatlon_pairs++;
2471 bool use_eos5_latlon =
false;
2472 if ((0 == num_1dlatlon_pairs)
2473 || ((num_1dlatlon_pairs == (
int) (this->eos5cfgrids.size())) && (
true == this->isaura))) {
2474 set<string> tempvardimnamelist = ((this->eos5cfgrids)[0])->vardimnames;
2475 if (0 == num_1dlatlon_pairs) {
2476 use_eos5_latlon = Handle_Single_Nonaugment_Grid_CVar_EOS5LatLon((this->eos5cfgrids)[0],
2477 tempvardimnamelist);
2479 if (
false == use_eos5_latlon)
return;
2484 bool use_own_latlon =
false;
2485 use_own_latlon = Handle_Single_Nonaugment_Grid_CVar_OwnLatLon((this->eos5cfgrids)[0],
2486 tempvardimnamelist);
2487 if (
false == use_own_latlon) {
2488 use_eos5_latlon = Handle_Single_Nonaugment_Grid_CVar_EOS5LatLon((this->eos5cfgrids)[0],
2489 tempvardimnamelist);
2490 if (
false == use_eos5_latlon)
return;
2495 Handle_NonLatLon_Grid_CVar((this->eos5cfgrids)[0], tempvardimnamelist);
2498 for (
unsigned j = 1; j < this->eos5cfgrids.size(); j++)
2499 (this->eos5cfgrids)[j]->Update_Dimnamelist();
2502 Adjust_EOS5GridDimNames((this->eos5cfgrids)[0]);
2505 for (
unsigned j = 1; j < this->eos5cfgrids.size(); j++) {
2506 tempvardimnamelist = (this->eos5cfgrids)[j]->vardimnames;
2507 Handle_NonLatLon_Grid_CVar((this->eos5cfgrids)[j], tempvardimnamelist);
2508 tempvardimnamelist.clear();
2514 this->grids_multi_latloncvs =
true;
2515 for (vector<EOS5CFGrid *>::iterator irv = this->eos5cfgrids.begin(); irv != this->eos5cfgrids.end(); ++irv)
2516 Handle_Single_Nonaugment_Grid_CVar(*irv);
2524 void EOS5File::Adjust_EOS5GridDimNames(
EOS5CFGrid *cfgrid)
2527 BESDEBUG(
"h5",
"Coming to Adjust_EOS5GridDimNames()"<<endl);
2530 bool find_xdim =
false;
2531 bool find_ydim =
false;
2533 for (set<string>::iterator it = cfgrid->vardimnames.begin(); it != cfgrid->vardimnames.end(); ++it) {
2534 string xydimname_candidate = HDF5CFUtil::obtain_string_after_lastslash(*it);
2535 if (
"XDim" == xydimname_candidate) {
2539 else if (
"YDim" == xydimname_candidate) {
2543 if (find_xdim && find_ydim)
break;
2546 if (
false == find_xdim ||
false == find_ydim)
2547 throw2(
"Cannot find Dimension name that includes XDim or YDim in the grid ", cfgrid->name);
2549 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
2550 if (GRID == Get_Var_EOS5_Type(*irv)) {
2551 for (vector<Dimension *>::iterator
id = (*irv)->dims.begin();
id != (*irv)->dims.end(); ++
id) {
2552 string xydimname_candidate = HDF5CFUtil::obtain_string_after_lastslash((*id)->name);
2553 if (
"XDim" == xydimname_candidate)
2554 (*id)->name = xdimname;
2555 else if (
"YDim" == xydimname_candidate) (*id)->name = ydimname;
2562 void EOS5File::Handle_Swath_CVar(
bool isaugmented)
2565 BESDEBUG(
"h5",
"Coming to Handle_Swath_CVar()"<<endl);
2569 for (vector<EOS5CFSwath *>::iterator irs = this->eos5cfswaths.begin(); irs != this->eos5cfswaths.end();) {
2570 if ((*irs)->has_1dlatlon) {
2571 Handle_Single_1DLatLon_Swath_CVar(*irs, isaugmented);
2574 else if ((*irs)->has_2dlatlon) {
2575 Handle_Single_2DLatLon_Swath_CVar(*irs, isaugmented);
2585 irs = this->eos5cfswaths.erase(irs);
2591 void EOS5File::Handle_Single_1DLatLon_Swath_CVar(
EOS5CFSwath *cfswath,
bool is_augmented)
2594 BESDEBUG(
"h5",
"Coming to Handle_Single_1DLatLon_Swath_CVar"<<endl);
2596 set<string>::iterator its;
2597 set<string> tempvardimnamelist = cfswath->vardimnames;
2598 string EOS5SWATHPATH =
"/HDFEOS/SWATHS/";
2599 string fslash_str =
"/";
2600 string THIS_EOS5SWATHPATH = EOS5SWATHPATH + cfswath->name + fslash_str;
2602 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its)
2603 cerr<<
"Dimension name befor latitude " << *its << endl;
2608 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
2609 if (SWATH == Get_Var_EOS5_Type(*irv) && ((*irv)->fullpath.size() > THIS_EOS5SWATHPATH.size())) {
2611 string var_swath_name = Obtain_Var_EOS5Type_GroupName(*irv, SWATH);
2612 if ((var_swath_name == cfswath->name) && ((*irv)->name ==
"Latitude")) {
2619 EOS5cvar->cfdimname = ((*irv)->dims)[0]->name;
2620 EOS5cvar->cvartype = CV_EXIST;
2621 EOS5cvar->eos_type = SWATH;
2624 this->cvars.push_back(EOS5cvar);
2628 this->vars.erase(irv);
2638 bool find_lat_dim =
false;
2639 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its) {
2641 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
2642 if (((*irv)->name ==
"Latitude") && (*irv)->cfdimname == (*its)) {
2643 tempvardimnamelist.erase(its);
2644 find_lat_dim =
true;
2649 if (
true == find_lat_dim)
break;
2653 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its)
2654 cerr<<
"Dimension name afte latitude " << *its << endl;
2657 Handle_NonLatLon_Swath_CVar(cfswath, tempvardimnamelist);
2660 if (
true == is_augmented) {
2661 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end();) {
2663 if (SWATH == Get_Var_EOS5_Type(*irv)) {
2665 string my_swath_short_path = (*irv)->fullpath.substr(EOS5SWATHPATH.size());
2666 size_t first_fslash_pos = my_swath_short_path.find_first_of(
"/");
2667 string my_swath_name = my_swath_short_path.substr(0,first_fslash_pos);
2670 string my_swath_name = Obtain_Var_EOS5Type_GroupName(*irv, SWATH);
2672 if (my_swath_name == cfswath->name) {
2673 string var_path_after_swathname = (*irv)->fullpath.substr(THIS_EOS5SWATHPATH.size());
2674 if (var_path_after_swathname == (*irv)->name) {
2676 irv = this->vars.erase(irv);
2694 void EOS5File::Handle_Single_2DLatLon_Swath_CVar(
EOS5CFSwath *cfswath,
bool is_augmented)
2697 BESDEBUG(
"h5",
"Coming to Handle_Single_2DLatLon_Swath_CVar()"<<endl);
2699 set<string>::iterator its;
2700 set<string> tempvardimnamelist = cfswath->vardimnames;
2701 string EOS5SWATHPATH =
"/HDFEOS/SWATHS/";
2702 string fslash_str =
"/";
2703 string THIS_EOS5SWATHPATH = EOS5SWATHPATH + cfswath->name + fslash_str;
2704 bool find_lat =
false;
2705 bool find_lon =
false;
2708 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its)
2709 cerr<<
"Dimension name befor latitude " << *its << endl;
2713 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end();) {
2714 if (SWATH == Get_Var_EOS5_Type(*irv) && ((*irv)->fullpath.size() > THIS_EOS5SWATHPATH.size())) {
2715 string var_swath_name = Obtain_Var_EOS5Type_GroupName(*irv, SWATH);
2716 if ((var_swath_name == cfswath->name) && ((*irv)->name ==
"Latitude")) {
2723 EOS5cvar->cfdimname = ((*irv)->dims)[0]->name;
2724 EOS5cvar->cvartype = CV_EXIST;
2725 EOS5cvar->eos_type = SWATH;
2726 EOS5cvar->is_2dlatlon =
true;
2729 this->cvars.push_back(EOS5cvar);
2733 irv = this->vars.erase(irv);
2736 else if ((var_swath_name == cfswath->name) && ((*irv)->name ==
"Longitude")) {
2743 EOS5cvar->cfdimname = ((*irv)->dims)[1]->name;
2744 EOS5cvar->cvartype = CV_EXIST;
2745 EOS5cvar->eos_type = SWATH;
2746 EOS5cvar->is_2dlatlon =
true;
2749 this->cvars.push_back(EOS5cvar);
2753 irv = this->vars.erase(irv);
2765 if (
true == find_lat &&
true == find_lon)
break;
2770 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its) {
2771 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
2772 if (((*irv)->name ==
"Latitude") && (*irv)->cfdimname == (*its)) {
2773 tempvardimnamelist.erase(its);
2779 if (
true == find_lat)
break;
2784 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its) {
2786 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
2788 if (((*irv)->name ==
"Longitude") && (*irv)->cfdimname == (*its)) {
2789 tempvardimnamelist.erase(its);
2795 if (
true == find_lon)
break;
2799 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its)
2800 cerr<<
"Dimension name afte latitude " << *its << endl;
2803 Handle_NonLatLon_Swath_CVar(cfswath, tempvardimnamelist);
2810 if (
true == is_augmented) {
2811 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end();) {
2813 if (SWATH == Get_Var_EOS5_Type(*irv)) {
2815 string my_swath_name = Obtain_Var_EOS5Type_GroupName(*irv, SWATH);
2816 if (my_swath_name == cfswath->name) {
2817 string var_path_after_swathname = (*irv)->fullpath.substr(THIS_EOS5SWATHPATH.size());
2818 if (var_path_after_swathname == (*irv)->name) {
2820 irv = this->vars.erase(irv);
2838 void EOS5File::Handle_NonLatLon_Swath_CVar(
EOS5CFSwath *cfswath, set<string>& tempvardimnamelist)
2841 BESDEBUG(
"h5",
"Coming to Handle_NonLatLon_Swath_CVar()"<<endl);
2843 set<string>::iterator its;
2844 int num_dimnames = tempvardimnamelist.size();
2845 bool has_dimnames =
true;
2846 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its) {
2847 if (cfswath->dnames_to_geo1dvnames.find(*its) != cfswath->dnames_to_geo1dvnames.end()) {
2848 for (vector<Var *>::iterator irv = this->vars.begin(); has_dimnames && (irv != this->vars.end());) {
2853 if (SWATH == Get_Var_EOS5_Type(*irv) && (*irv)->newname == (cfswath->dnames_to_geo1dvnames)[*its]) {
2860 EOS5cvar->cfdimname = *its;
2861 EOS5cvar->cvartype = CV_EXIST;
2862 EOS5cvar->eos_type = SWATH;
2865 this->cvars.push_back(EOS5cvar);
2869 irv = this->vars.erase(irv);
2872 if (0 == num_dimnames) has_dimnames =
false;
2882 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
2883 its = tempvardimnamelist.find((*irv)->cfdimname);
2884 if (its != tempvardimnamelist.end()) tempvardimnamelist.erase(its);
2889 Handle_Special_NonLatLon_Swath_CVar(cfswath, tempvardimnamelist);
2892 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
2893 its = tempvardimnamelist.find((*irv)->cfdimname);
2894 if (its != tempvardimnamelist.end()) tempvardimnamelist.erase(its);
2898 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its) {
2901 Create_Missing_CV(cfswath, EOS5cvar, *its, SWATH, this->eos5cfswaths.size());
2902 this->cvars.push_back(EOS5cvar);
2908 void EOS5File::Handle_Special_NonLatLon_Swath_CVar(
EOS5CFSwath *cfswath, set<string>& tempvardimnamelist)
2912 BESDEBUG(
"h5",
"Handle_Special_NonLatLon_Swath_CVar()"<<endl);
2919 if (
true == this->isaura && TES == this->aura_name) {
2921 string eos5_swath_group_name =
"/HDFEOS/SWATHS/" + cfswath->name;
2922 string eos5_vc_attr_name =
"VerticalCoordinate";
2923 string eos5_pre_attr_name =
"Pressure";
2924 bool has_vc_attr =
false;
2925 Group *vc_group = NULL;
2928 for (vector<Group *>::iterator irg = this->groups.begin(); irg != this->groups.end(); ++irg) {
2929 if (eos5_swath_group_name == (*irg)->path) {
2930 for (vector<Attribute *>::iterator ira = (*irg)->attrs.begin(); ira != (*irg)->attrs.end(); ++ira) {
2931 if (eos5_vc_attr_name == (*ira)->name) {
2932 Retrieve_H5_Attr_Value(*ira, (*irg)->path);
2933 string attr_value((*ira)->value.begin(), (*ira)->value.end());
2934 if (eos5_pre_attr_name == attr_value) {
2941 if (
true == has_vc_attr)
break;
2959 if (
true == has_vc_attr) {
2960 string dimname_candidate =
"/SWATHS/" + cfswath->name +
"/nLevels";
2961 set<string>::iterator it;
2962 for (it = tempvardimnamelist.begin(); it != tempvardimnamelist.end(); ++it) {
2963 if ((*it).find(dimname_candidate) != string::npos) {
2964 hsize_t dimsize_candidate = 0;
2965 if ((cfswath->dimnames_to_dimsizes).find(*it) != (cfswath->dimnames_to_dimsizes).end())
2966 dimsize_candidate = cfswath->dimnames_to_dimsizes[*it];
2968 throw2(
"Cannot find the dimension size of the dimension name ", *it);
2975 for (vector<Attribute *>::iterator ira = vc_group->attrs.begin(); ira != vc_group->attrs.end();
2977 if ((eos5_pre_attr_name == (*ira)->name) && ((*ira)->count == (dimsize_candidate - 1))) {
2982 string reduced_dimname = HDF5CFUtil::obtain_string_after_lastslash(*it);
2983 string orig_dimname =
"nLevels";
2984 if (
"nLevels" == reduced_dimname)
2985 EOS5cvar->name = eos5_pre_attr_name +
"_CV";
2988 EOS5cvar->name = eos5_pre_attr_name +
"_CV"
2989 + reduced_dimname.substr(orig_dimname.size());
2990 Create_Added_Var_NewName_FullPath(SWATH, cfswath->name, EOS5cvar->name, EOS5cvar->newname,
2991 EOS5cvar->fullpath);
2993 EOS5cvar->dtype = (*ira)->dtype;
2995 eos5cvar_dim->name = *it;
2996 if (1 == this->eos5cfswaths.size())
2997 eos5cvar_dim->newname = reduced_dimname;
2999 eos5cvar_dim->newname = eos5cvar_dim->name;
3001 EOS5cvar->dims.push_back(eos5cvar_dim);
3002 EOS5cvar->cvartype = CV_SPECIAL;
3003 EOS5cvar->cfdimname = eos5cvar_dim->name;
3004 EOS5cvar->eos_type = SWATH;
3007 this->cvars.push_back(EOS5cvar);
3017 void EOS5File::Handle_Za_CVar(
bool isaugmented)
3020 BESDEBUG(
"h5",
"Coming to Handle_Za_CVar()"<<endl);
3022 if (
false == isaugmented)
return;
3024 for (vector<EOS5CFZa *>::iterator irv = this->eos5cfzas.begin(); irv != this->eos5cfzas.end(); ++irv)
3025 Handle_Single_Augment_CVar(*irv, ZA);
3030 void EOS5File::Adjust_Var_Dim_NewName_Before_Flattening()
3033 BESDEBUG(
"h5",
"Coming to Adjust_Var_Dim_NewName_Before_Flattening()"<<endl);
3034 int num_grids = this->eos5cfgrids.size();
3035 int num_swaths = this->eos5cfswaths.size();
3036 int num_zas = this->eos5cfzas.size();
3038 bool mixed_eos5typefile =
false;
3041 if (((num_grids > 0) && (num_swaths > 0)) || ((num_grids > 0) && (num_zas > 0))
3042 || ((num_swaths > 0) && (num_zas > 0))) mixed_eos5typefile =
true;
3045 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv)
3046 Adjust_Per_Var_Dim_NewName_Before_Flattening(*irv, mixed_eos5typefile, num_grids, num_swaths, num_zas);
3048 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.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();
3052 irv != this->cvars.end(); ++irv) {
3053 cerr<<
"eos5svar var new name "<<(*irv)->newname <<endl;
3054 for (vector<Dimension *>::iterator ird = (*irv)->dims.begin();
3055 ird !=(*irv)->dims.end(); ++ird) {
3056 cerr<<
"eos5svar dimension new name "<<(*ird)->newname <<endl;
3061 Adjust_SharedLatLon_Grid_Var_Dim_Name();
3067 void EOS5File::Adjust_Per_Var_Dim_NewName_Before_Flattening(T* var,
bool mixed_eos5type,
int num_grids,
int num_swaths,
3071 BESDEBUG(
"h5",
"Coming to Adjust_Per_Var_Dim_NewName_Before_Flattening()"<<endl);
3074 EOS5Type vartype = Get_Var_EOS5_Type(var);
3078 eos5typestr =
"/GRIDS/";
3079 if (
false == mixed_eos5type) {
3081 var->newname = ((1 == this->orig_num_grids) ? var->name : var->newname.substr(eos5typestr.size()));
3083 var->newname = ((1 == num_grids) ? var->name : var->newname.substr(eos5typestr.size()));
3098 if (num_grids > 1) {
3099 for (vector<Dimension *>::iterator ird = var->dims.begin(); ird != var->dims.end(); ird++) {
3100 if ((*ird)->newname.size() <= eos5typestr.size())
3101 throw5(
"The size of the dimension new name ", (*ird)->newname,
"of variable ", var->newname,
3103 (*ird)->newname = (*ird)->newname.substr(eos5typestr.size());
3109 var->newname = ((1 == num_grids) ? (eos5typestr + var->name) : var->newname);
3115 eos5typestr =
"/SWATHS/";
3116 if (
false == mixed_eos5type) {
3117 var->newname = ((1 == num_swaths) ? var->name : var->newname.substr(eos5typestr.size()));
3118 if (num_swaths > 1) {
3119 for (vector<Dimension *>::iterator ird = var->dims.begin(); ird != var->dims.end(); ird++) {
3120 if ((*ird)->newname.size() <= eos5typestr.size())
3121 throw5(
"The size of the dimension new name ", (*ird)->newname,
"of variable ", var->newname,
3123 (*ird)->newname = (*ird)->newname.substr(eos5typestr.size());
3128 var->newname = ((1 == num_swaths) ? (eos5typestr + var->name) : var->newname);
3134 eos5typestr =
"/ZAS/";
3135 if (
false == mixed_eos5type) {
3136 var->newname = ((1 == num_zas) ? var->name : var->newname.substr(eos5typestr.size()));
3138 for (vector<Dimension *>::iterator ird = var->dims.begin(); ird != var->dims.end(); ird++) {
3139 if ((*ird)->newname.size() <= eos5typestr.size())
3140 throw5(
"The size of the dimension new name ", (*ird)->newname,
"of variable ", var->newname,
3142 (*ird)->newname = (*ird)->newname.substr(eos5typestr.size());
3147 var->newname = ((1 == num_zas) ? (eos5typestr + var->name) : var->newname);
3154 throw1(
"Non-supported EOS type");
3160 void EOS5File::Adjust_SharedLatLon_Grid_Var_Dim_Name()
3163 BESDEBUG(
"h5",
"Adjust_SharedLatLon_Grid_Var_Dim_Name()"<<endl);
3168 if ((this->eos5cfgrids.size() > 1) && (0 == this->eos5cfswaths.size()) && (0 == this->eos5cfzas.size())
3169 && (
false == this->grids_multi_latloncvs)) {
3173 string lat_dimnewname;
3175 string lon_dimnewname;
3176 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
3177 if (
"lat" == (*irv)->name ||
"Latitude" == (*irv)->name) {
3178 (*irv)->newname = (*irv)->name;
3179 lat_dimnewname = (((*irv)->dims)[0])->newname;
3180 lat_dimnewname = HDF5CFUtil::obtain_string_after_lastslash(lat_dimnewname);
3181 if (
"" == lat_dimnewname)
3182 throw2(
"/ is not included in the dimension new name ", (((*irv)->dims)[0])->newname);
3183 (((*irv)->dims)[0])->newname = lat_dimnewname;
3184 lat_dimname = (*irv)->cfdimname;
3186 else if (
"lon" == (*irv)->name ||
"Longitude" == (*irv)->name) {
3187 (*irv)->newname = (*irv)->name;
3188 lon_dimnewname = (((*irv)->dims)[0])->newname;
3189 lon_dimnewname = HDF5CFUtil::obtain_string_after_lastslash(lon_dimnewname);
3190 if (
"" == lon_dimnewname)
3191 throw2(
"/ is not included in the dimension new name ", (((*irv)->dims)[0])->newname);
3192 (((*irv)->dims)[0])->newname = lon_dimnewname;
3193 lon_dimname = (*irv)->cfdimname;
3197 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
3198 for (vector<Dimension *>::iterator ird = (*irv)->dims.begin(); ird != (*irv)->dims.end(); ++ird) {
3199 if ((*ird)->name == lat_dimname)
3200 (*ird)->newname = lat_dimnewname;
3201 else if ((*ird)->name == lon_dimname) (*ird)->newname = lon_dimnewname;
3208 void EOS5File::Flatten_Obj_Name(
bool include_attr)
3211 BESDEBUG(
"h5",
"Coming to Flatten_Obj_Name()"<<endl);
3212 File::Flatten_Obj_Name(include_attr);
3214 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
3215 (*irv)->newname = get_CF_string((*irv)->newname);
3217 for (vector<Dimension *>::iterator ird = (*irv)->dims.begin(); ird != (*irv)->dims.end(); ++ird) {
3218 (*ird)->newname = get_CF_string((*ird)->newname);
3221 if (
true == include_attr) {
3222 for (vector<Attribute *>::iterator ira = (*irv)->attrs.begin(); ira != (*irv)->attrs.end(); ++ira) {
3223 (*ira)->newname = File::get_CF_string((*ira)->newname);
3230 void EOS5File::Handle_Obj_NameClashing(
bool include_attr)
3233 BESDEBUG(
"h5",
"Coming to Handle_Obj_NameClashing()"<<endl);
3237 set<string> objnameset;
3238 Handle_EOS5CVar_NameClashing(objnameset);
3239 File::Handle_GeneralObj_NameClashing(include_attr, objnameset);
3240 if (
true == include_attr) {
3241 Handle_EOS5CVar_AttrNameClashing();
3250 void EOS5File::Handle_EOS5CVar_NameClashing(set<string> &objnameset)
3253 BESDEBUG(
"h5",
"Coming to Handle_EOS5CVar_NameClashing()"<<endl);
3254 EOS5Handle_General_NameClashing(objnameset, this->cvars);
3258 void EOS5File::Handle_EOS5CVar_AttrNameClashing()
3261 BESDEBUG(
"h5",
"Coming to Handle_EOS5CVar_AttrNameClashing()"<<endl);
3262 set<string> objnameset;
3264 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
3265 Handle_General_NameClashing(objnameset, (*irv)->attrs);
3271 template<
class T>
void EOS5File::EOS5Handle_General_NameClashing(set<string>&objnameset, vector<T*>& objvec)
3275 BESDEBUG(
"h5",
"Coming to EOS5Handle_General_NameClashing()"<<endl);
3276 pair<set<string>::iterator,
bool> setret;
3277 set<string>::iterator iss;
3279 vector<string> clashnamelist;
3280 vector<string>::iterator ivs;
3282 map<int, int> cl_to_ol;
3286 typename vector<T*>::iterator irv;
3288 for (irv = objvec.begin(); irv != objvec.end(); ++irv) {
3290 setret = objnameset.insert((*irv)->newname);
3291 if (!setret.second) {
3292 clashnamelist.insert(clashnamelist.end(), (*irv)->newname);
3293 cl_to_ol[cl_index] = ol_index;
3301 for (ivs = clashnamelist.begin(); ivs != clashnamelist.end(); ++ivs) {
3302 int clash_index = 1;
3303 string temp_clashname = *ivs +
'_';
3304 HDF5CFUtil::gen_unique_name(temp_clashname, objnameset, clash_index);
3305 *ivs = temp_clashname;
3309 for (
unsigned int i = 0; i < clashnamelist.size(); i++)
3310 objvec[cl_to_ol[i]]->newname = clashnamelist[i];
3315 void EOS5File::Handle_DimNameClashing()
3318 BESDEBUG(
"h5",
"Coming to Handle_DimNameClashing()"<<endl);
3319 map<string, string> dimname_to_dimnewname;
3320 pair<map<string, string>::iterator,
bool> mapret;
3321 set<string> dimnameset;
3322 vector<Dimension*> vdims;
3323 set<string> dimnewnameset;
3324 pair<set<string>::iterator,
bool> setret;
3327 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
3328 for (vector<Dimension *>::iterator ird = (*irv)->dims.begin(); ird != (*irv)->dims.end(); ++ird) {
3332 setret = dimnameset.insert((*ird)->name);
3333 if (setret.second) vdims.push_back(*ird);
3341 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
3342 for (vector<Dimension *>::iterator ird = (*irv)->dims.begin(); ird != (*irv)->dims.end(); ++ird) {
3346 setret = dimnameset.insert((*ird)->name);
3347 if (setret.second) vdims.push_back(*ird);
3352 for (vector<Dimension*>::iterator ird=vdims.begin();ird!=vdims.end();++ird)
3353 cerr<<
"dimension name "<<(*ird)->name <<endl;
3358 EOS5Handle_General_NameClashing(dimnewnameset, vdims);
3361 for (vector<Dimension*>::iterator ird = vdims.begin(); ird != vdims.end(); ++ird) {
3362 mapret = dimname_to_dimnewname.insert(pair<string, string>((*ird)->name, (*ird)->newname));
3363 if (
false == mapret.second)
3364 throw4(
"The dimension name ", (*ird)->name,
" should map to ", (*ird)->newname);
3368 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv)
3369 for (vector<Dimension *>::iterator ird = (*irv)->dims.begin(); ird != (*irv)->dims.end(); ++ird)
3370 (*ird)->newname = dimname_to_dimnewname[(*ird)->name];
3372 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv)
3373 for (vector<Dimension *>::iterator ird = (*irv)->dims.begin(); ird != (*irv)->dims.end(); ++ird)
3374 (*ird)->newname = dimname_to_dimnewname[(*ird)->name];
3380 void EOS5File::Set_COARDS_Status()
3383 BESDEBUG(
"h5",
"Coming to Set_COARDS_Status()"<<endl);
3385 for (vector<EOS5CFGrid *>::iterator irg = this->eos5cfgrids.begin(); irg != this->eos5cfgrids.end(); ++irg) {
3386 if (
false == (*irg)->has_1dlatlon) {
3387 if (
false == (*irg)->has_nolatlon || (HE5_GCTP_GEO != (*irg)->eos5_projcode)) iscoard =
false;
3392 if (
true == iscoard) {
3393 for (vector<EOS5CFSwath *>::iterator irg = this->eos5cfswaths.begin(); irg != this->eos5cfswaths.end(); ++irg) {
3394 if (
false == (*irg)->has_1dlatlon) {
3403 void EOS5File::Adjust_Attr_Info()
3406 BESDEBUG(
"h5",
"Coming to Adjust_Attr_Info()"<<endl);
3407 if (
true == this->isaura) {
3408 Adjust_Aura_Attr_Name();
3409 Adjust_Aura_Attr_Value();
3412 Handle_EOS5CVar_Unit_Attr();
3413 Add_EOS5_Grid_CF_Attr();
3418 void EOS5File::Adjust_Aura_Attr_Name()
3421 BESDEBUG(
"h5",
"Coming to Adjust_Attr_Name() for Aura"<<endl);
3422 for (vector<Var*>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
3423 for (vector<Attribute*>::iterator ira = (*irv)->attrs.begin(); ira != (*irv)->attrs.end(); ++ira) {
3424 if (eos5_to_cf_attr_map.find((*ira)->name) != eos5_to_cf_attr_map.end()) (*ira)->newname =
3425 eos5_to_cf_attr_map[(*ira)->name];
3430 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
3431 for (vector<Attribute*>::iterator ira = (*irv)->attrs.begin(); ira != (*irv)->attrs.end(); ++ira) {
3432 if (eos5_to_cf_attr_map.find((*ira)->name) != eos5_to_cf_attr_map.end()) (*ira)->newname =
3433 eos5_to_cf_attr_map[(*ira)->name];
3439 void EOS5File::Adjust_Aura_Attr_Value()
3442 BESDEBUG(
"h5",
"Coming to Adjust_Attr_Value() for Aura"<<endl);
3444 Handle_EOS5CVar_Unit_Attr();
3445 Handle_Aura_Special_Attr();
3450 string time_cf_units_value =
"seconds since 1993-01-01";
3451 for (vector<Var*>::iterator irv = this->vars.begin(); irv != this->vars.end(); irv++) {
3452 if (((*irv)->name ==
"Time") || ((*irv)->name ==
"nTimes")) {
3453 for (vector<Attribute*>::iterator ira = (*irv)->attrs.begin(); ira != (*irv)->attrs.end(); ira++) {
3454 if (
"units" == (*ira)->name) {
3455 Retrieve_H5_Attr_Value(*ira, (*irv)->fullpath);
3456 string units_value((*ira)->value.begin(), (*ira)->value.end());
3457 if (time_cf_units_value != units_value) {
3459 units_value = time_cf_units_value;
3460 (*ira)->value.resize(units_value.size());
3461 if (H5FSTRING == (*ira)->dtype) (*ira)->fstrsize = units_value.size();
3463 (*ira)->strsize.resize(1);
3464 (*ira)->strsize[0] = units_value.size();
3466 copy(units_value.begin(), units_value.end(), (*ira)->value.begin());
3476 void EOS5File::Handle_Aura_Special_Attr()
3479 BESDEBUG(
"h5",
"Coming to Handle_Aura_Special_Attr()"<<endl);
3481 if (
true == this->isaura && MLS == this->aura_name) {
3483 const string File_attr_group_path =
"/HDFEOS/ADDITIONAL/FILE_ATTRIBUTES";
3484 const string PCF1_attr_name =
"PCF1";
3485 bool find_group =
false;
3486 bool find_attr =
false;
3487 for (vector<Group*>::iterator it_g = this->groups.begin(); it_g != this->groups.end(); ++it_g) {
3488 if (File_attr_group_path == (*it_g)->path) {
3490 for (vector<Attribute *>::iterator ira = (*it_g)->attrs.begin(); ira != (*it_g)->attrs.end(); ++ira) {
3491 if (PCF1_attr_name == (*ira)->name) {
3492 Retrieve_H5_Attr_Value(*ira, (*it_g)->path);
3493 string pcf_value((*ira)->value.begin(), (*ira)->value.end());
3494 HDF5CFDAPUtil::replace_double_quote(pcf_value);
3495 (*ira)->value.resize(pcf_value.size());
3496 if (H5FSTRING == (*ira)->dtype) (*ira)->fstrsize = pcf_value.size();
3498 (*ira)->strsize.resize(1);
3499 (*ira)->strsize[0] = pcf_value.size();
3501 copy(pcf_value.begin(), pcf_value.end(), (*ira)->value.begin());
3507 if (
true == find_group &&
true == find_attr)
break;
3513 void EOS5File::Handle_EOS5CVar_Unit_Attr()
3516 BESDEBUG(
"h5",
"Coming to Handle_EOS5CVar_Unit_Attr()"<<endl);
3517 string unit_attrname =
"units";
3518 string nonll_cf_level_attrvalue =
"level";
3519 string lat_cf_unit_attrvalue =
"degrees_north";
3520 string lon_cf_unit_attrvalue =
"degrees_east";
3521 string tes_cf_pre_attrvalue =
"hPa";
3523 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
3524 switch ((*irv)->cvartype) {
3527 for (vector<Attribute*>::iterator ira = (*irv)->attrs.begin(); ira != (*irv)->attrs.end(); ++ira) {
3528 if ((*ira)->newname == unit_attrname) {
3529 Retrieve_H5_Attr_Value(*ira, (*irv)->fullpath);
3530 string units_value((*ira)->value.begin(), (*ira)->value.end());
3531 if ((lat_cf_unit_attrvalue != units_value)
3532 && (((*irv)->name ==
"Latitude") || ((this->eos5cfzas.size() > 0) && ((*irv)->name ==
"nLats")))) {
3533 units_value = lat_cf_unit_attrvalue;
3538 (*ira)->value.resize(units_value.size());
3539 if (H5FSTRING == (*ira)->dtype) (*ira)->fstrsize = units_value.size();
3541 (*ira)->strsize.resize(1);
3542 (*ira)->strsize[0] = units_value.size();
3543 copy(units_value.begin(), units_value.end(), (*ira)->value.begin());
3545 else if ((lon_cf_unit_attrvalue != units_value) && (*irv)->name ==
"Longitude") {
3546 units_value = lon_cf_unit_attrvalue;
3547 (*ira)->value.resize(units_value.size());
3548 if (H5FSTRING == (*ira)->dtype) (*ira)->fstrsize = units_value.size();
3550 (*ira)->strsize.resize(1);
3551 (*ira)->strsize[0] = units_value.size();
3553 copy(units_value.begin(), units_value.end(), (*ira)->value.begin());
3563 Add_Str_Attr(attr, unit_attrname, lat_cf_unit_attrvalue);
3564 (*irv)->attrs.push_back(attr);
3570 Add_Str_Attr(attr, unit_attrname, lon_cf_unit_attrvalue);
3571 (*irv)->attrs.push_back(attr);
3575 case CV_NONLATLON_MISS: {
3577 Add_Str_Attr(attr, unit_attrname, nonll_cf_level_attrvalue);
3578 (*irv)->attrs.push_back(attr);
3582 if (
true == this->isaura && TES == this->aura_name) {
3584 Add_Str_Attr(attr, unit_attrname, tes_cf_pre_attrvalue);
3585 (*irv)->attrs.push_back(attr);
3590 throw1(
"Non-supported Coordinate Variable Type.");
3595 void EOS5File::Add_EOS5_Grid_CF_Attr()
3597 BESDEBUG(
"h5",
"Coming to Add_EOS5_Grid_CF_Attr()"<<endl);
3599 bool has_eos5_grid_nongeo_proj =
false;
3602 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
3603 if ((*irv)->cvartype == CV_LAT_MISS) {
3604 if((*irv)->eos5_projcode !=HE5_GCTP_GEO) {
3605 has_eos5_grid_nongeo_proj =
true;
3612 if(
true == has_eos5_grid_nongeo_proj) {
3613 string conventions_attrname =
"Conventions";
3614 string conventions_attrvalue =
"CF-1.7";
3615 bool has_conventions_attr=
false;
3616 for(vector<HDF5CF::Attribute *>::const_iterator it_ra=this->root_attrs.begin();
3617 it_ra!=this->root_attrs.end();it_ra++) {
3618 if((*it_ra)->name==conventions_attrname){
3619 has_conventions_attr =
true;
3624 if(
false==has_conventions_attr) {
3626 Add_Str_Attr(attr,conventions_attrname,conventions_attrvalue);
3627 this->root_attrs.push_back(attr);
3636 void EOS5File::Adjust_Dim_Name()
3639 BESDEBUG(
"h5",
"Coming to Adjust_Dim_Name()"<<endl);
3641 if (
false == this->iscoard)
3644 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); irv++) {
3645 if ((*irv)->dims.size() != 1)
3646 throw3(
"Coard coordinate variable ", (*irv)->name,
"is not 1D");
3647 if ((*irv)->newname != (((*irv)->dims)[0]->newname)) {
3648 ((*irv)->dims)[0]->newname = (*irv)->newname;
3651 for (vector<Var*>::iterator irv2 = this->vars.begin(); irv2 != this->vars.end(); irv2++) {
3652 for (vector<Dimension *>::iterator ird = (*irv2)->dims.begin(); ird != (*irv2)->dims.end(); ird++) {
3657 if ((*ird)->name == ((*irv)->dims)[0]->name) (*ird)->newname = ((*irv)->dims)[0]->newname;
3666 void EOS5File::Add_Supplement_Attrs(
bool add_path)
3669 BESDEBUG(
"h5",
"Coming to Add_Supplement_Attrs()"<<endl);
3670 if (
true == add_path) {
3672 File::Add_Supplement_Attrs(add_path);
3675 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
3676 if (((*irv)->cvartype == CV_EXIST) || ((*irv)->cvartype == CV_MODIFY)) {
3678 const string varname = (*irv)->name;
3679 const string attrname =
"origname";
3680 Add_Str_Attr(attr, attrname, varname);
3681 (*irv)->attrs.push_back(attr);
3685 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
3686 if (((*irv)->cvartype == CV_EXIST) || ((*irv)->cvartype == CV_MODIFY)) {
3688 const string varname = (*irv)->fullpath;
3689 const string attrname =
"fullnamepath";
3690 Add_Str_Attr(attr, attrname, varname);
3691 (*irv)->attrs.push_back(attr);
3696 if (
true == this->iscoard) {
3697 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
3698 if (((*irv)->cvartype == CV_EXIST) || ((*irv)->cvartype == CV_MODIFY)) {
3700 const string attrname =
"orig_dimname";
3701 string orig_dimname = (((*irv)->dims)[0])->name;
3702 orig_dimname = HDF5CFUtil::obtain_string_after_lastslash(orig_dimname);
3703 if (
"" == orig_dimname)
3704 throw2(
"wrong dimension name ", orig_dimname);
3705 if (orig_dimname.find(
"FakeDim") != string::npos) orig_dimname =
"";
3706 Add_Str_Attr(attr, attrname, orig_dimname);
3707 (*irv)->attrs.push_back(attr);
3711 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
3713 if ((*irv)->dims.size() > 0) {
3715 if (1 == (*irv)->dims.size()) {
3716 const string attrname =
"orig_dimname";
3717 string orig_dimname = (((*irv)->dims)[0])->name;
3718 if (
"" == orig_dimname)
3719 orig_dimname =
"NoDimName";
3721 orig_dimname = HDF5CFUtil::obtain_string_after_lastslash(orig_dimname);
3722 if (orig_dimname.find(
"FakeDim") != string::npos) orig_dimname =
"NoDimName";
3723 Add_Str_Attr(attr, attrname, orig_dimname);
3726 const string attrname =
"orig_dimname_list";
3727 string orig_dimname_list;
3728 for (vector<Dimension *>::iterator ird = (*irv)->dims.begin(); ird != (*irv)->dims.end(); ++ird) {
3729 string orig_dimname = (*ird)->name;
3730 if (
"" == orig_dimname)
3731 orig_dimname =
"NoDimName";
3733 orig_dimname = HDF5CFUtil::obtain_string_after_lastslash((*ird)->name);
3734 if (orig_dimname.find(
"FakeDim") != string::npos) orig_dimname =
"NoDimName";
3735 if (
"" == orig_dimname_list)
3736 orig_dimname_list = orig_dimname;
3738 orig_dimname_list = orig_dimname_list +
" " + orig_dimname;
3741 Add_Str_Attr(attr, attrname, orig_dimname_list);
3743 (*irv)->attrs.push_back(attr);
3751 void EOS5File::Handle_Coor_Attr()
3754 BESDEBUG(
"h5",
"Coming to Handle_Coor_Attr()"<<endl);
3755 string co_attrname =
"coordinates";
3756 string co_attrvalue =
"";
3758 if (iscoard)
return;
3760 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
3762 for (vector<Dimension *>::iterator ird = (*irv)->dims.begin(); ird != (*irv)->dims.end(); ++ird) {
3763 for (vector<EOS5CVar *>::iterator ircv = this->cvars.begin(); ircv != this->cvars.end(); ++ircv) {
3764 if ((*ird)->name == (*ircv)->cfdimname)
3765 co_attrvalue = (co_attrvalue.empty()) ? (*ircv)->newname : co_attrvalue +
" " + (*ircv)->newname;
3768 if (
false == co_attrvalue.empty()) {
3770 Add_Str_Attr(attr, co_attrname, co_attrvalue);
3771 (*irv)->attrs.push_back(attr);
3773 co_attrvalue.clear();
3777 bool has_2dlatlon_cv =
false;
3778 for (vector<EOS5CVar *>::iterator ircv = this->cvars.begin(); ircv != this->cvars.end(); ++ircv) {
3779 if (
true == (*ircv)->is_2dlatlon) {
3780 has_2dlatlon_cv =
true;
3785 if (
true == has_2dlatlon_cv) {
3789 for (vector<EOS5CVar *>::iterator ircv = this->cvars.begin(); ircv != this->cvars.end(); ++ircv) {
3790 if (
true == (*ircv)->is_2dlatlon) {
3791 dimname1 = (((*ircv)->dims)[0])->name;
3792 dimname2 = (((*ircv)->dims)[1])->name;
3797 int num_latlondims = 0;
3799 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
3800 for (vector<Dimension *>::iterator ird = (*irv)->dims.begin(); ird != (*irv)->dims.end(); ++ird) {
3801 if (dimname1 == (*ird)->name) num_latlondims++;
3802 if (dimname2 == (*ird)->name) num_latlondims++;
3804 if ((num_latlondims != 0) && (num_latlondims != 2)) {
3806 for (vector<Attribute *>::iterator ira = (*irv)->attrs.begin(); ira != (*irv)->attrs.end(); ++ira) {
3807 if (co_attrname == (*ira)->name) {
3809 (*irv)->attrs.erase(ira);
3822 void EOS5File::Adjust_Special_EOS5CVar_Name() {
3824 int num_grids =this->eos5cfgrids.size();
3825 int num_swaths = this->eos5cfswaths.size();
3826 int num_zas = this->eos5cfzas.size();
3828 bool mixed_eos5typefile =
false;
3831 if (((num_grids > 0) && (num_swaths > 0)) ||
3832 ((num_grids > 0) && (num_zas > 0)) ||
3833 ((num_swaths >0) && (num_zas > 0)))
3834 mixed_eos5typefile =
true;
3836 if (
false == mixed_eos5typefile) {
3841 if ((1 == num_swaths) || ( 1 == num_zas) ||
3842 (1 == num_grids) || ((num_grids >1) && (this->grids_multi_latloncvs))) {
3844 string unit_attrname =
"units";
3845 string nonll_cf_level_attralue =
"level";
3846 string lat_cf_unit_attrvalue =
"degrees_north";
3847 string lon_cf_unit_attrvalue =
"degrees_east";
3849 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin();
3850 irv != this->cvars.end(); irv++) {
3851 switch((*irv)->eos_type) {
3857 for(vector <Attribute*>::iterator ira = (*irv)->attrs.begin();
3858 ira != (*irv)->attrs.end(); ira++) {
3859 if ((*ira)->name ==unit_attrname) {
3860 if ((*ira)->value.size() > 0) {
3861 string units_value((*ira)->value.begin(),(*ira)->value.end());
3862 if (lat_cf_unit_attrvalue ==units_value) (*irv)->newname =
"lat";
3863 if (lon_cf_unit_attrvalue ==units_value) (*irv)->newname =
"lon";
3869 case CV_NONLATLON_MISS:
3871 for(vector <Attribute*>::iterator ira = (*irv)->attrs.begin();
3872 ira != (*irv)->attrs.end(); ira++) {
3873 if ((*ira)->name ==unit_attrname) {
3874 if ((*ira)->value.size() > 0) {
3875 string units_value((*ira)->value.begin(),(*ira)->value.end());
3876 if (nonll_cf_level_attralue ==units_value) {
3877 (*irv)->newname =
"lev";
3886 throw1(
"Non-supported coordinate variable type");
3899 void EOS5File::Create_Missing_CV(T* eos5data,
EOS5CVar *EOS5cvar,
const string& dimname, EOS5Type eos5type,
3903 BESDEBUG(
"h5",
"Coming to Create_Missing_CV()"<<endl);
3904 string reduced_dimname = HDF5CFUtil::obtain_string_after_lastslash(dimname);
3905 if (
"" == reduced_dimname) throw2(
"wrong dimension name ", dimname);
3906 EOS5cvar->name = reduced_dimname;
3907 Create_Added_Var_NewName_FullPath(eos5type, eos5data->name, EOS5cvar->name, EOS5cvar->newname, EOS5cvar->fullpath);
3909 EOS5cvar->dtype = H5INT32;
3910 hsize_t eos5cvar_dimsize = (eos5data->dimnames_to_dimsizes)[dimname];
3912 eos5cvar_dim->name = dimname;
3913 eos5cvar_dim->unlimited_dim = (eos5data->dimnames_to_unlimited)[dimname];
3914 if (1 == num_eos5data)
3915 eos5cvar_dim->newname = reduced_dimname;
3917 eos5cvar_dim->newname = dimname;
3919 EOS5cvar->dims.push_back(eos5cvar_dim);
3920 EOS5cvar->cfdimname = dimname;
3921 EOS5cvar->cvartype = CV_NONLATLON_MISS;
3922 EOS5cvar->eos_type = eos5type;
3926 void EOS5File::Create_Added_Var_NewName_FullPath(EOS5Type eos5type,
const string& eos5_groupname,
const string& varname,
3927 string &var_newname,
string &var_fullpath)
3930 BESDEBUG(
"h5",
"Coming to Create_Added_Var_NewName_FullPath()"<<endl);
3931 string fslash_str =
"/";
3932 string eos5typestr =
"";
3933 string top_eos5_groupname =
"/HDFEOS";
3937 eos5typestr =
"/GRIDS/";
3938 var_newname = eos5typestr + eos5_groupname + fslash_str + varname;
3939 var_fullpath = top_eos5_groupname + eos5typestr + eos5_groupname + fslash_str + varname;
3944 eos5typestr =
"/SWATHS/";
3945 var_newname = eos5typestr + eos5_groupname + fslash_str + varname;
3946 var_fullpath = top_eos5_groupname + eos5typestr + eos5_groupname + fslash_str + varname;
3952 eos5typestr =
"/ZAS/";
3953 var_newname = eos5typestr + eos5_groupname + fslash_str + varname;
3954 var_fullpath = top_eos5_groupname + eos5typestr + eos5_groupname + fslash_str + varname;
3960 throw1(
"Non-supported EOS type");
3965 void EOS5File::Handle_SpVar()
3968 BESDEBUG(
"h5",
"Coming to Handle_SpVar()"<<endl);
3969 if (
true == this->isaura && TES == this->aura_name) {
3970 const string ProHist_full_path =
"/HDFEOS/ADDITIONAL/FILE_ATTRIBUTES/ProductionHistory";
3971 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
3972 if (ProHist_full_path == (*irv)->fullpath) {
3974 this->vars.erase(irv);
3981 if (dimname_to_dupdimnamelist.size() > 0) {
3982 for (vector<EOS5CVar *>::iterator ircv = this->cvars.begin(); ircv != this->cvars.end(); ircv++) {
3983 if ((*ircv)->cvartype == CV_EXIST) {
3984 pair<multimap<string, string>::iterator, multimap<string, string>::iterator> mm_er_ret;
3985 multimap<string, string>::iterator itmm;
3986 for (itmm = dimname_to_dupdimnamelist.begin(); itmm != dimname_to_dupdimnamelist.end(); ++itmm) {
3989 if ((*ircv)->cfdimname == (*itmm).first) {
3992 for (vector<EOS5CVar *>::iterator irv2 = this->cvars.begin(); irv2 != this->cvars.end();
3994 if ((*irv2)->cvartype == CV_NONLATLON_MISS) {
3998 if ((*irv2)->cfdimname == (*itmm).second) {
4001 string dup_var_name = (*irv2)->newname;
4002 Replace_Var_Info((*ircv), (*irv2));
4005 (*irv2)->newname = dup_var_name;
4006 (*irv2)->getDimensions()[0]->newname = dup_var_name;
4020 for (vector<Var *>::iterator irv = this->vars.begin();
4021 irv != this->vars.end(); ++irv) {
4024 if((*irv)->rank >=2) {
4026 for (vector<Dimension *>::iterator ird = (*irv)->dims.begin();
4027 ird != (*irv)->dims.end(); ++ ird) {
4028 pair<multimap<string,string>::iterator,multimap<string,string>::iterator> mm_er_ret;
4029 multimap<string,string>::iterator itmm;
4030 for (itmm = dimname_to_dupdimnamelist.begin(); itmm!=dimname_to_dupdimnamelist.end();++itmm) {
4034 cerr<<
"duplicate dimension name of a variable is "<<(*ird)->name <<endl;
4044 if((*itmm).second == (*ird)->name) {
4045 cerr<<
"coming to find the duplicate dim. name "<<endl;
4046 for (vector<EOS5CVar *>::iterator ircv = this->cvars.begin();
4047 ircv != this->cvars.end(); ircv++) {
4048 if((*ircv)->cvartype == CV_EXIST) {
4049 cerr<<
"cf dim. name is "<<(*ircv)->cfdimname <<endl;
4051 if((*ircv)->cfdimname == (*itmm).first) {
4053 for (vector<EOS5CVar *>::iterator irv2 = this->cvars.begin();
4054 irv2 != this->cvars.end(); irv2++) {
4055 if((*irv2)->cvartype == CV_NONLATLON_MISS) {
4057 if((*irv2)->cfdimname == (*itmm).second) {
4058 string dup_var_name = (*irv2)->newname;
4059 Replace_Var_Info((*ircv),(*irv2));
4060 (*irv2)->newname = dup_var_name;
4061 (*irv2)->getDimensions()[0]->newname = dup_var_name;
4087 void EOS5File::Handle_SpVar_Attr()
4090 BESDEBUG(
"h5",
"Coming to Handle_SpVar_Attr()"<<endl);
4093 if (dimname_to_dupdimnamelist.size() > 0) {
4095 pair<multimap<string, string>::iterator, multimap<string, string>::iterator> mm_er_ret;
4096 multimap<string, string>::iterator itmm;
4097 for (itmm = dimname_to_dupdimnamelist.begin(); itmm != dimname_to_dupdimnamelist.end(); ++itmm) {
4098 for (vector<EOS5CVar *>::iterator ircv = this->cvars.begin(); ircv != this->cvars.end(); ircv++) {
4100 if ((*ircv)->cvartype == CV_EXIST) {
4103 if ((*ircv)->cfdimname == (*itmm).first) {
4107 for (vector<EOS5CVar *>::iterator irv2 = this->cvars.begin(); irv2 != this->cvars.end();
4109 if ((*irv2)->cvartype == CV_NONLATLON_MISS) {
4113 if ((*irv2)->cfdimname == (*itmm).second) Replace_Var_Attrs((*ircv), (*irv2));
4123 void EOS5File::Adjust_Obj_Name()
4128 bool EOS5File::Have_Grid_Mapping_Attrs() {
4129 return File::Have_Grid_Mapping_Attrs();
4131 void EOS5File::Handle_Grid_Mapping_Vars() {
4132 File:: Handle_Grid_Mapping_Vars();
4140 BESDEBUG(
"h5",
"Coming to Replace_Var_Info()"<<endl);
4141 File::Replace_Var_Info(src, target);
4142 target->cfdimname = src->cfdimname;
4143 target->cvartype = src->cvartype;
4144 target->eos_type = src->eos_type;
4145 target->total_elems = src->total_elems;
4153 BESDEBUG(
"h5",
"Coming to Replace_Var_Attrs()"<<endl);
4154 File::Replace_Var_Attrs(src, target);
4160 EOS5File:: add_ignored_info_attrs(
bool is_grp,
bool is_first) {
4164 EOS5File:: add_ignored_info_objs(
bool is_dim_related,
bool is_first) {