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) {
This class specifies the core engineering of mapping HDF5 to DAP by following CF.
#define throw1(a1)
The followings are convenient functions to throw exceptions with different.
include the entry functions to execute the handlers
This class represents one attribute.
This class repersents one dimension of an HDF5 dataset(variable).
This class simulates an HDF-EOS5 Grid. Currently only geographic projection is supported.
This class simulates an HDF-EOS5 Swath.
This class simulates an HDF-EOS5 Zonal average object.
This class is a derived class of CVar. It represents a coordinate variable for HDF-EOS5 files.
This class represents an HDF5 group. The group will be flattened according to the CF conventions.
This class represents one HDF5 dataset(CF variable)
Helper functions for generating DAS attributes and a function to check BES Key.
double point_right
The rightmost coordinate value of a Grid.
double point_upper
The top coordinate value of a Grid.
double point_left
The leftmost coordinate value of a Grid.
double point_lower
The bottom coordinate value of a Grid.