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") {
434 string name_value = Retrieve_Str_Attr_Value(*ira,(*irv)->fullpath);
435 if( 0 == name_value.compare(0,(*irv)->name.size(),(*irv)->name)) {
437 ira =(*irv)->attrs.erase(ira);
440 string netcdf_dim_mark=
"This is a netCDF dimension but not a netCDF variable";
441 if( 0 == name_value.compare(0,netcdf_dim_mark.size(),netcdf_dim_mark)) {
443 ira =(*irv)->attrs.erase(ira);
450 else if((*ira)->name ==
"_Netcdf4Dimid") {
452 ira =(*irv)->attrs.erase(ira);
467 if (
true == this->check_ignored &&
true == include_attr) {
470 if (
true == HDF5RequestHandler::get_drop_long_string()) {
472 for (vector<Attribute *>::iterator ira = this->root_attrs.begin(); ira != this->root_attrs.end(); ++ira) {
473 if (H5FSTRING == (*ira)->dtype || H5VSTRING == (*ira)->dtype) {
474 if ((*ira)->getBufSize() > NC_JAVA_STR_SIZE_LIMIT) {
475 this->add_ignored_droplongstr_hdr();
476 this->add_ignored_grp_longstr_info(
"/", (*ira)->name);
481 for (vector<Group *>::iterator irg = this->groups.begin(); irg != this->groups.end(); ++irg) {
482 for (vector<Attribute *>::iterator ira = (*irg)->attrs.begin(); ira != (*irg)->attrs.end(); ++ira) {
483 if (H5FSTRING == (*ira)->dtype || H5VSTRING == (*ira)->dtype) {
484 if ((*ira)->getBufSize() > NC_JAVA_STR_SIZE_LIMIT) {
485 this->add_ignored_droplongstr_hdr();
486 this->add_ignored_grp_longstr_info((*irg)->path, (*ira)->name);
493 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
494 if (
true == Check_DropLongStr((*irv), NULL)) {
495 string ecsmeta_grp =
"/HDFEOS INFORMATION";
497 if ((*irv)->fullpath.find(ecsmeta_grp) != 0
498 || ((*irv)->fullpath.rfind(
"/") != ecsmeta_grp.size())) {
499 this->add_ignored_droplongstr_hdr();
500 this->add_ignored_var_longstr_info((*irv), NULL);
504 for (vector<Attribute *>::iterator ira = (*irv)->attrs.begin(); ira != (*irv)->attrs.end(); ++ira) {
505 if (
true == Check_DropLongStr((*irv), (*ira))) {
506 this->add_ignored_droplongstr_hdr();
507 this->add_ignored_var_longstr_info((*irv), (*ira));
513 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
514 for (vector<Attribute *>::iterator ira = (*irv)->attrs.begin(); ira != (*irv)->attrs.end(); ++ira) {
515 if (
true == Check_DropLongStr((*irv), (*ira))) {
516 this->add_ignored_droplongstr_hdr();
517 this->add_ignored_var_longstr_info((*irv), (*ira));
525 if (
false == this->have_ignored) this->add_no_ignored_info();
530 void EOS5File::Adjust_EOS5Dim_Info(
HE5Parser*strmeta_info)
533 BESDEBUG(
"h5",
"coming to Adjust_EOS5Dim_Info" <<endl);
536 for (
unsigned int i = 0; i < strmeta_info->swath_list.size(); ++i) {
537 HE5Swath& he5s = strmeta_info->swath_list.at(i);
539 Adjust_EOS5Dim_List(he5s.dim_list);
549 if(this->have_udim ==
true) {
550 vector<HE5Var> svlist = he5s.geo_var_list;
551 svlist.insert(svlist.end(),he5s.data_var_list.begin(),he5s.data_var_list.end());
553 Adjust_EOS5DimSize_List(he5s.dim_list,svlist,SWATH,he5s.name);
556 for (
unsigned int j = 0; j < he5s.geo_var_list.size(); ++j) {
557 Adjust_EOS5VarDim_Info((he5s.geo_var_list)[j].dim_list, he5s.dim_list, he5s.name, SWATH);
559 for (
unsigned int j = 0; j < he5s.data_var_list.size(); ++j) {
560 Adjust_EOS5VarDim_Info((he5s.data_var_list)[j].dim_list, he5s.dim_list, he5s.name, SWATH);
564 for (
unsigned int i = 0; i < strmeta_info->grid_list.size(); ++i) {
566 HE5Grid& he5g = strmeta_info->grid_list.at(i);
568 Adjust_EOS5Dim_List(he5g.dim_list);
571 if(this->have_udim ==
true) {
573 Adjust_EOS5DimSize_List(he5g.dim_list,he5g.data_var_list,GRID,he5g.name);
576 for (
unsigned int j = 0; j < he5g.data_var_list.size(); ++j) {
577 Adjust_EOS5VarDim_Info((he5g.data_var_list)[j].dim_list, he5g.dim_list, he5g.name, GRID);
581 for (
unsigned int i = 0; i < strmeta_info->za_list.size(); ++i) {
582 HE5Za& he5z = strmeta_info->za_list.at(i);
584 Adjust_EOS5Dim_List(he5z.dim_list);
587 if(this->have_udim ==
true) {
589 Adjust_EOS5DimSize_List(he5z.dim_list,he5z.data_var_list,ZA,he5z.name);
592 for (
unsigned int j = 0; j < he5z.data_var_list.size(); ++j) {
593 Adjust_EOS5VarDim_Info((he5z.data_var_list)[j].dim_list, he5z.dim_list, he5z.name, ZA);
599 void EOS5File::Adjust_EOS5Dim_List(vector<HE5Dim>& groupdimlist)
602 BESDEBUG(
"h5",
"Coming to Adjust_EOS5Dim_List"<<endl);
606 Remove_NegativeSizeDims(groupdimlist);
609 Condense_EOS5Dim_List(groupdimlist);
615 void EOS5File::Remove_NegativeSizeDims(vector<HE5Dim>& groupdimlist)
618 BESDEBUG(
"h5",
"Coming to Remove_NegativeSizeDims" <<endl);
619 vector<HE5Dim>::iterator id;
628 for (
id = groupdimlist.begin();
id != groupdimlist.end();) {
629 if ((*id).size <= 0) {
630 id = groupdimlist.erase(
id);
642 void EOS5File::Condense_EOS5Dim_List(vector<HE5Dim>& groupdimlist)
645 BESDEBUG(
"h5",
"Coming to Condense_EOS5Dim_List"<<endl);
648 pair<set<int>::iterator,
bool> setret;
649 vector<HE5Dim>::iterator id;
651 for (
id = groupdimlist.begin();
id != groupdimlist.end();) {
652 if (
"XDim" == (*id).name ||
"Xdim" == (*id).name) {
653 setret = xdimsizes.insert((*id).size);
654 if (
false == setret.second) {
655 id = groupdimlist.erase(
id);
657 else if (
"Xdim" == (*id).name) {
671 for (
id = groupdimlist.begin();
id != groupdimlist.end();) {
672 if (
"YDim" == (*id).name ||
"Ydim" == (*id).name) {
673 setret = ydimsizes.insert((*id).size);
674 if (
false == setret.second) {
675 id = groupdimlist.erase(
id);
677 else if (
"Ydim" == (*id).name) {
691 void EOS5File:: Adjust_EOS5DimSize_List(vector<HE5Dim>& eos5objdimlist,
const vector<HE5Var> & eos5objvarlist,
692 const EOS5Type eos5type,
const string & eos5objname)
695 set<string>updated_dimlist;
696 pair<set<string>::iterator,
bool> set_insert_ret;
698 for(
unsigned int i = 0; i<eos5objvarlist.size();i++) {
699 HE5Var he5v = eos5objvarlist.at(i);
700 for(
unsigned int j = 0; j<he5v.dim_list.size();j++) {
701 HE5Dim he5d = he5v.dim_list.at(j);
702 set_insert_ret = updated_dimlist.insert(he5d.name);
703 if(set_insert_ret.second ==
true) {
705 unsigned int objdimlist_index = 9999;
706 bool has_objdimlist_index =
false;
707 for(
unsigned int k = 0; k <eos5objdimlist.size();k++) {
708 if(eos5objdimlist[k].name == he5d.name) {
709 objdimlist_index = k;
710 has_objdimlist_index =
true;
714 if(has_objdimlist_index ==
false)
715 throw2(
"Cannot find the dimension in the EOS5 object dimension list for the dimension ", he5d.name);
716 for (vector<Var *>::const_iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
718 EOS5Type vartype = Get_Var_EOS5_Type((*irv));
721 if(vartype == eos5type) {
722 string var_eos5gname = Obtain_Var_EOS5Type_GroupName((*irv),vartype);
725 if(var_eos5gname == eos5objname) {
726 if((*irv)->name == he5v.name) {
727 if (he5v.dim_list.size() != (*irv)->dims.size())
728 throw2(
"Number of dimensions don't match with the structmetadata for variable ", (*irv)->name);
730 (eos5objdimlist[objdimlist_index]).size = ((*irv)->dims[j])->size;
741 if(updated_dimlist.size() == eos5objdimlist.size())
745 for(
unsigned int k = 0; k <eos5objdimlist.size();k++) {
746 cerr<<
"eos5 obj dim name is "<<eos5objdimlist[k].name <<
" Size is "<< eos5objdimlist[k].size << endl;
753 void EOS5File::Adjust_EOS5VarDim_Info(vector<HE5Dim>& vardimlist, vector<HE5Dim>& groupdimlist,
754 const string & eos5_obj_name, EOS5Type eos5type)
757 BESDEBUG(
"h5",
"Coming to Adjust_EOS5VarDim_Info"<<endl);
758 set<string> dimnamelist;
759 pair<set<string>::iterator,
bool> setret;
766 for (
unsigned int i = 0; i < vardimlist.size(); ++i) {
768 HE5Dim& he5d = vardimlist.at(i);
769 bool dim_in_groupdimlist =
false;
770 for (
unsigned int j = 0; j < groupdimlist.size(); ++j) {
771 HE5Dim he5gd = groupdimlist.at(j);
772 if (he5gd.name == he5d.name) {
773 he5d.size = he5gd.size;
774 dim_in_groupdimlist =
true;
779 if (
false == dim_in_groupdimlist)
780 throw2(
"The EOS5 group dimension name list doesn't include the dimension ", he5d.name);
785 setret = dimnamelist.insert(he5d.name);
786 if (
false == setret.second) {
788 string temp_clashname = he5d.name +
'_';
789 HDF5CFUtil::gen_unique_name(temp_clashname, dimnamelist, clash_index);
791 string ori_dimname = he5d.name;
793 he5d.name = temp_clashname;
796 bool dim_exist =
false;
797 for (
unsigned int j = 0; j < groupdimlist.size(); ++j) {
798 if (he5d.name == groupdimlist[j].name && he5d.size == groupdimlist[j].size) {
805 if (
false == dim_exist) {
806 ori_dimname = eos5_obj_name +
"/" + ori_dimname;
807 string dup_dimname = eos5_obj_name +
"/" + he5d.name;
808 if (GRID == eos5type) {
809 ori_dimname =
"/GRIDS/" + ori_dimname;
810 dup_dimname =
"/GRIDS/" + dup_dimname;
812 else if (SWATH == eos5type) {
813 ori_dimname =
"/SWATHS/" + ori_dimname;
814 dup_dimname =
"/SWATHS/" + dup_dimname;
816 else if (ZA == eos5type) {
817 ori_dimname =
"/ZAS/" + ori_dimname;
818 dup_dimname =
"/ZAS/" + dup_dimname;
822 dimname_to_dupdimnamelist.insert(pair<string, string>(ori_dimname, dup_dimname));
823 groupdimlist.push_back(he5d);
832 void EOS5File::Add_EOS5File_Info(
HE5Parser * strmeta_info,
bool grids_mllcv)
835 BESDEBUG(
"h5",
"Coming to Add_EOS5File_Info"<<endl);
836 string fslash_str =
"/";
837 string grid_str =
"/GRIDS/";
838 string swath_str =
"/SWATHS/";
839 string za_str =
"/ZAS/";
847 this->orig_num_grids = strmeta_info->grid_list.size();
850 for (
unsigned int i = 0; i < strmeta_info->grid_list.size(); i++) {
851 HE5Grid he5g = strmeta_info->grid_list.at(i);
853 eos5grid->name = he5g.name;
854 eos5grid->dimnames.resize(he5g.dim_list.size());
856 for (
unsigned int j = 0; j < he5g.dim_list.size(); j++) {
858 HE5Dim he5d = he5g.dim_list.at(j);
859 if (
"XDim" == he5d.name) eos5grid->xdimsize = he5d.size;
860 if (
"YDim" == he5d.name) eos5grid->ydimsize = he5d.size;
870 string unique_dimname = grid_str + he5g.name + fslash_str + he5d.name;
872 (eos5grid->dimnames)[j] = unique_dimname;
874 pair<map<hsize_t, string>::iterator,
bool> mapret1;
875 mapret1 = eos5grid->dimsizes_to_dimnames.insert(pair<hsize_t, string>((hsize_t) he5d.size, unique_dimname));
880 pair<map<string, hsize_t>::iterator,
bool> mapret2;
881 mapret2 = eos5grid->dimnames_to_dimsizes.insert(pair<string, hsize_t>(unique_dimname, (hsize_t) he5d.size));
882 if (
false == mapret2.second)
883 throw5(
"The dimension name ", unique_dimname,
" with the dimension size ", he5d.size,
"is not unique");
888 EOS5SwathGrid_Set_LatLon_Flags(eos5grid, he5g.data_var_list);
891 map<string, string> dnames_to_1dvnames;
892 EOS5Handle_nonlatlon_dimcvars(he5g.data_var_list, GRID, he5g.name, dnames_to_1dvnames);
893 eos5grid->dnames_to_1dvnames = dnames_to_1dvnames;
899 eos5grid->eos5_pixelreg = he5g.pixelregistration;
900 eos5grid->eos5_origin = he5g.gridorigin;
901 eos5grid->eos5_projcode = he5g.projection;
903 for (
unsigned int k = 0; k < 13; k++)
904 eos5grid->param[k] = he5g.param[k];
905 eos5grid->zone = he5g.zone;
906 eos5grid->sphere = he5g.sphere;
908 this->eos5cfgrids.push_back(eos5grid);
913 this->grids_multi_latloncvs = grids_mllcv;
916 for (
unsigned int i = 0; i < strmeta_info->swath_list.size(); i++) {
918 HE5Swath he5s = strmeta_info->swath_list.at(i);
920 eos5swath->name = he5s.name;
921 eos5swath->dimnames.resize(he5s.dim_list.size());
923 for (
unsigned int j = 0; j < he5s.dim_list.size(); j++) {
925 HE5Dim he5d = he5s.dim_list.at(j);
935 string unique_dimname = swath_str + he5s.name + fslash_str + he5d.name;
936 (eos5swath->dimnames)[j] = unique_dimname;
940 pair<map<hsize_t, string>::iterator,
bool> mapret1;
941 mapret1 = eos5swath->dimsizes_to_dimnames.insert(
942 pair<hsize_t, string>((hsize_t) he5d.size, unique_dimname));
947 pair<map<string, hsize_t>::iterator,
bool> mapret2;
948 mapret2 = eos5swath->dimnames_to_dimsizes.insert(
949 pair<string, hsize_t>(unique_dimname, (hsize_t) he5d.size));
950 if (
false == mapret2.second)
951 throw5(
"The dimension name ", unique_dimname,
" with the dimension size ", he5d.size,
"is not unique");
956 EOS5SwathGrid_Set_LatLon_Flags(eos5swath, he5s.geo_var_list);
959 map<string, string> dnames_to_geo1dvnames;
960 EOS5Handle_nonlatlon_dimcvars(he5s.geo_var_list, SWATH, he5s.name, dnames_to_geo1dvnames);
961 eos5swath->dnames_to_geo1dvnames = dnames_to_geo1dvnames;
962 this->eos5cfswaths.push_back(eos5swath);
966 for (
unsigned int i = 0; i < strmeta_info->za_list.size(); i++) {
968 HE5Za he5z = strmeta_info->za_list.at(i);
971 eos5za->name = he5z.name;
972 eos5za->dimnames.resize(he5z.dim_list.size());
974 for (
unsigned int j = 0; j < he5z.dim_list.size(); j++) {
976 HE5Dim he5d = he5z.dim_list.at(j);
982 string unique_dimname = za_str + he5z.name + fslash_str + he5d.name;
983 (eos5za->dimnames)[j] = unique_dimname;
984 pair<map<hsize_t, string>::iterator,
bool> mapret1;
985 mapret1 = eos5za->dimsizes_to_dimnames.insert(pair<hsize_t, string>((hsize_t) he5d.size, unique_dimname));
990 pair<map<string, hsize_t>::iterator,
bool> mapret2;
991 mapret2 = eos5za->dimnames_to_dimsizes.insert(pair<string, hsize_t>(unique_dimname, (hsize_t) he5d.size));
992 if (
false == mapret2.second)
993 throw5(
"The dimension name ", unique_dimname,
" with the dimension size ", he5d.size,
"is not unique");
998 map<string, string> dnames_to_1dvnames;
999 EOS5Handle_nonlatlon_dimcvars(he5z.data_var_list, ZA, he5z.name, dnames_to_1dvnames);
1000 eos5za->dnames_to_1dvnames = dnames_to_1dvnames;
1001 this->eos5cfzas.push_back(eos5za);
1006 for (vector<EOS5CFGrid *>::iterator irg = this->eos5cfgrids.begin();
1007 irg != this->eos5cfgrids.end(); ++irg) {
1009 cerr<<
"grid name "<<(*irg)->name <<endl;
1010 cerr<<
"eos5_pixelreg"<<(*irg)->eos5_pixelreg <<endl;
1011 cerr<<
"eos5_origin"<<(*irg)->eos5_pixelreg <<endl;
1012 cerr<<
"point_lower "<<(*irg)->point_lower <<endl;
1013 cerr<<
"xdimsize "<<(*irg)->xdimsize <<endl;
1015 if((*irg)->has_g2dlatlon) cerr<<
"has g2dlatlon"<<endl;
1016 if((*irg)->has_2dlatlon) cerr<<
"has 2dlatlon"<<endl;
1017 if((*irg)->has_1dlatlon) cerr<<
"has 1dlatlon"<<endl;
1018 if((*irg)->has_nolatlon) cerr<<
"has no latlon" <<endl;
1019 if(this->grids_multi_latloncvs) cerr<<
"having multiple lat/lon from structmeta" <<endl;
1020 else cerr<<
"no multiple lat/lon from structmeta" <<endl;
1023 "h5",
"number of dimensions "<<(*irg)->dimnames.size() <<endl;
1024 for (vector<string>::iterator irv = (*irg)->dimnames.begin();
1025 irv != (*irg)->dimnames.end(); ++irv)
1026 cerr<<
"dim names" <<*irv <<endl;
1029 for (map<hsize_t,string>::iterator im1 = (*irg)->dimsizes_to_dimnames.begin();
1030 im1 !=(*irg)->dimsizes_to_dimnames.end();++im1) {
1031 cerr<<
"size to name "<< (int)((*im1).first) <<
"=> "<<(*im1).second <<endl;
1035 for (map<string,string>::iterator im2 = (*irg)->dnames_to_1dvnames.begin();
1036 im2 !=(*irg)->dnames_to_1dvnames.end();++im2) {
1037 cerr<<
"dimanme to 1d var name "<< (*im2).first <<
"=> "<<(*im2).second <<endl;
1042 for (vector<EOS5CFSwath *>::iterator irg = this->eos5cfswaths.begin();
1043 irg != this->eos5cfswaths.end(); ++irg) {
1045 cerr<<
"swath name "<<(*irg)->name <<endl;
1046 if((*irg)->has_nolatlon) cerr<<
"has no latlon" <<endl;
1047 if((*irg)->has_1dlatlon) cerr<<
"has 1dlatlon"<<endl;
1048 if((*irg)->has_2dlatlon) cerr<<
"has 2dlatlon"<<endl;
1051 for (vector<string>::iterator irv = (*irg)->dimnames.begin();
1052 irv != (*irg)->dimnames.end(); ++irv)
1053 cerr<<
"dim names" <<*irv <<endl;
1056 for (map<hsize_t,string>::iterator im1 = (*irg)->dimsizes_to_dimnames.begin();
1057 im1 !=(*irg)->dimsizes_to_dimnames.end();++im1) {
1058 cerr<<
"size to name "<< (int)((*im1).first) <<
"=> "<<(*im1).second <<endl;
1062 for (map<string,string>::iterator im2 = (*irg)->dnames_to_geo1dvnames.begin();
1063 im2 !=(*irg)->dnames_to_geo1dvnames.end();++im2) {
1064 cerr<<
"dimname to 1d varname "<< (*im2).first <<
"=> "<<(*im2).second <<endl;
1068 for (vector<EOS5CFZa *>::iterator irg = this->eos5cfzas.begin();
1069 irg != this->eos5cfzas.end(); ++irg) {
1071 cerr<<
"za name now"<<(*irg)->name <<endl;
1074 for (vector<string>::iterator irv = (*irg)->dimnames.begin();
1075 irv != (*irg)->dimnames.end(); ++irv)
1076 cerr<<
"dim names" <<*irv <<endl;
1079 for (map<hsize_t,string>::iterator im1 = (*irg)->dimsizes_to_dimnames.begin();
1080 im1 !=(*irg)->dimsizes_to_dimnames.end();++im1) {
1081 cerr<<
"size to name "<< (int)((*im1).first) <<
"=> "<<(*im1).second <<endl;
1085 for (map<string,string>::iterator im2 = (*irg)->dnames_to_1dvnames.begin();
1086 im2 !=(*irg)->dnames_to_1dvnames.end();++im2) {
1087 cerr<<
"dimname to 1d varname "<< (*im2).first <<
"=> "<<(*im2).second <<endl;
1096 void EOS5File::EOS5SwathGrid_Set_LatLon_Flags(T* eos5gridswath, vector<HE5Var> &eos5varlist)
1099 BESDEBUG(
"h5",
"Coming to EOS5SwathGrid_Set_LatLon_Flags"<<endl);
1100 bool find_lat =
false;
1101 bool find_lon =
false;
1102 bool has_1dlat =
false;
1103 bool has_1dlon =
false;
1104 bool has_2dlat =
false;
1105 string lat_xdimname;
1106 string lat_ydimname;
1107 string lon_xdimname;
1108 string lon_ydimname;
1109 bool has_2dlon =
false;
1110 bool has_g2dlat =
false;
1111 bool has_g2dlon =
false;
1113 for (
unsigned int i = 0; i < eos5varlist.size(); ++i) {
1114 HE5Var he5v = eos5varlist.at(i);
1115 if (
"Latitude" == he5v.name) {
1117 int num_dims = he5v.dim_list.size();
1120 else if (2 == num_dims) {
1121 lat_ydimname = (he5v.dim_list)[0].name;
1122 lat_xdimname = (he5v.dim_list)[1].name;
1125 else if (num_dims > 2)
1128 throw1(
"The number of dimension should not be 0 for grids or swaths");
1131 if (
"Longitude" == he5v.name) {
1133 int num_dims = he5v.dim_list.size();
1136 else if (2 == num_dims) {
1137 lon_ydimname = (he5v.dim_list)[0].name;
1138 lon_xdimname = (he5v.dim_list)[1].name;
1141 else if (num_dims > 2)
1144 throw1(
"The number of dimension should not be 0 for grids or swaths");
1147 if (
true == find_lat &&
true == find_lon) {
1148 if (
true == has_1dlat &&
true == has_1dlon) eos5gridswath->has_1dlatlon =
true;
1151 if (
true == has_2dlat &&
true == has_2dlon && lat_ydimname == lon_ydimname && lat_xdimname == lon_xdimname)
1152 eos5gridswath->has_2dlatlon =
true;
1154 if (
true == has_g2dlat &&
true == has_g2dlon) eos5gridswath->has_g2dlatlon =
true;
1156 eos5gridswath->has_nolatlon =
false;
1164 void EOS5File::EOS5Handle_nonlatlon_dimcvars(vector<HE5Var> & eos5varlist, EOS5Type eos5type,
string groupname,
1165 map<string, string>& dnamesgeo1dvnames)
1168 BESDEBUG(
"h5",
"Coming to EOS5Handle_nonlatlon_dimcvars"<<endl);
1170 set<string> nocvdimnames;
1171 string grid_str =
"/GRIDS/";
1172 string xdim_str =
"XDim";
1173 string ydim_str =
"YDim";
1174 string fslash_str =
"/";
1177 if (GRID == eos5type) {
1178 string xdimname = grid_str + groupname + fslash_str + xdim_str;
1179 nocvdimnames.insert(xdimname);
1180 string ydimname = grid_str + groupname + fslash_str + ydim_str;
1181 nocvdimnames.insert(ydimname);
1182 eos5typestr =
"/GRIDS/";
1184 else if (SWATH == eos5type)
1185 eos5typestr =
"/SWATHS/";
1186 else if (ZA == eos5type)
1187 eos5typestr =
"/ZAS/";
1189 throw1(
"Unsupported HDF-EOS5 type, this type is not swath, grid or zonal average");
1193 pair<map<string, string>::iterator,
bool> mapret;
1194 for (
unsigned int i = 0; i < eos5varlist.size(); ++i) {
1195 HE5Var he5v = eos5varlist.at(i);
1196 if (1 == he5v.dim_list.size()) {
1197 HE5Dim he5d = he5v.dim_list.at(0);
1199 dimname = eos5typestr + groupname + fslash_str + he5d.name;
1201 varname = eos5typestr + groupname + fslash_str + he5v.name;
1202 mapret = dnamesgeo1dvnames.insert(pair<string, string>(dimname, varname));
1207 if (
false == mapret.second) nocvdimnames.insert(dimname);
1213 set<string>::iterator itset;
1214 for (itset = nocvdimnames.begin(); itset != nocvdimnames.end(); ++itset)
1215 dnamesgeo1dvnames.erase(*itset);
1219 void EOS5File::Adjust_Var_NewName_After_Parsing()
1222 BESDEBUG(
"h5",
"Coming to Adjust_Var_NewName_After_Parsing"<<endl);
1223 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
1224 Obtain_Var_NewName(*irv);
1228 void EOS5File::Obtain_Var_NewName(
Var *var)
1231 BESDEBUG(
"h5",
"Coming to Obtain_Var_NewName"<<endl);
1232 string fslash_str =
"/";
1233 string eos5typestr =
"";
1235 EOS5Type vartype = Get_Var_EOS5_Type(var);
1243 eos5typestr =
"/GRIDS/";
1244 string eos5_groupname = Obtain_Var_EOS5Type_GroupName(var, vartype);
1249 var->newname = eos5typestr + eos5_groupname + fslash_str + var->name;
1254 eos5typestr =
"/SWATHS/";
1255 string eos5_groupname = Obtain_Var_EOS5Type_GroupName(var, vartype);
1260 var->newname = eos5typestr + eos5_groupname + fslash_str + var->name;
1264 eos5typestr =
"/ZAS/";
1265 string eos5_groupname = Obtain_Var_EOS5Type_GroupName(var, vartype);
1270 var->newname = eos5typestr + eos5_groupname + fslash_str + var->name;
1274 string eos5infopath =
"/HDFEOS INFORMATION";
1275 if (var->fullpath.size() > eos5infopath.size()) {
1276 if (eos5infopath == var->fullpath.substr(0, eos5infopath.size())) var->newname = var->name;
1279 var->newname = var->fullpath;
1283 throw1(
"Non-supported EOS type");
1288 EOS5Type EOS5File::Get_Var_EOS5_Type(
Var* var)
1291 BESDEBUG(
"h5",
"Coming to Get_Var_EOS5_Type"<<endl);
1293 string EOS5GRIDPATH =
"/HDFEOS/GRIDS";
1294 string EOS5SWATHPATH =
"/HDFEOS/SWATHS";
1295 string EOS5ZAPATH =
"/HDFEOS/ZAS";
1297 if (var->fullpath.size() >= EOS5GRIDPATH.size()) {
1298 if (EOS5GRIDPATH == var->fullpath.substr(0, EOS5GRIDPATH.size()))
return GRID;
1300 if (var->fullpath.size() >= EOS5SWATHPATH.size()) {
1301 if (EOS5SWATHPATH == var->fullpath.substr(0, EOS5SWATHPATH.size()))
return SWATH;
1303 if (var->fullpath.size() >= EOS5ZAPATH.size()) {
1304 if (EOS5ZAPATH == var->fullpath.substr(0, EOS5ZAPATH.size()))
return ZA;
1314 BESDEBUG(
"h5",
"Coming to Add_Dim_Name"<<endl);
1315 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
1316 Obtain_Var_Dims(*irv, strmeta_info);
1318 for (vector<Dimension *>::iterator ird = (*irv)->dims.begin();
1319 ird != (*irv)->dims.end();++ird) {
1320 cerr<<
"dim name right after change "<<(*ird)->newname <<endl;
1328 bool EOS5File::Obtain_Var_Dims(
Var *var,
HE5Parser * strmeta_info)
1331 BESDEBUG(
"h5",
"Coming to Obtain_Var_Dims"<<endl);
1332 string varname_from_parser =
"";
1333 EOS5Type vartype = Get_Var_EOS5_Type(var);
1335 if (GRID == vartype) {
1336 int num_grids = strmeta_info->grid_list.size();
1337 for (
int i = 0; i < num_grids; ++i) {
1338 HE5Grid he5g = strmeta_info->grid_list.at(i);
1339 if (he5g.name == Obtain_Var_EOS5Type_GroupName(var, vartype)) {
1340 EOS5CFGrid *eos5cfgrid = (this->eos5cfgrids)[i];
1341 bool var_is_parsed = Set_Var_Dims(eos5cfgrid, var, he5g.data_var_list, he5g.name, num_grids, GRID);
1342 if (
false == var_is_parsed) {
1343 map<hsize_t, string> dimsizes_to_dimnames = eos5cfgrid->dimsizes_to_dimnames;
1348 Set_NonParse_Var_Dims(eos5cfgrid, var, dimsizes_to_dimnames, num_grids, vartype);
1353 else if (SWATH == vartype) {
1354 int num_swaths = strmeta_info->swath_list.size();
1355 for (
int i = 0; i < num_swaths; ++i) {
1357 HE5Swath he5s = strmeta_info->swath_list.at(i);
1359 if (he5s.name == Obtain_Var_EOS5Type_GroupName(var, vartype)) {
1361 EOS5CFSwath *eos5cfswath = (this->eos5cfswaths)[i];
1363 bool var_is_parsed =
true;
1364 int swath_fieldtype_flag = Check_EOS5Swath_FieldType(var);
1365 if (1 == swath_fieldtype_flag)
1366 var_is_parsed = Set_Var_Dims(eos5cfswath, var, he5s.geo_var_list, he5s.name, num_swaths, SWATH);
1367 else if (0 == swath_fieldtype_flag)
1368 var_is_parsed = Set_Var_Dims(eos5cfswath, var, he5s.data_var_list, he5s.name, num_swaths, SWATH);
1371 var_is_parsed =
false;
1373 if (
false == var_is_parsed) {
1374 map<hsize_t, string> dimsizes_to_dimnames = eos5cfswath->dimsizes_to_dimnames;
1375 Set_NonParse_Var_Dims(eos5cfswath, var, dimsizes_to_dimnames, num_swaths, vartype);
1381 else if (ZA == vartype) {
1383 int num_zas = strmeta_info->za_list.size();
1384 for (
int i = 0; i < num_zas; ++i) {
1385 HE5Za he5z = strmeta_info->za_list.at(i);
1386 if (he5z.name == Obtain_Var_EOS5Type_GroupName(var, vartype)) {
1387 EOS5CFZa *eos5cfza = (this->eos5cfzas)[i];
1388 bool var_is_parsed = Set_Var_Dims(eos5cfza, var, he5z.data_var_list, he5z.name, num_zas, ZA);
1389 if (
false == var_is_parsed) {
1390 map<hsize_t, string> dimsizes_to_dimnames = eos5cfza->dimsizes_to_dimnames;
1391 Set_NonParse_Var_Dims(eos5cfza, var, dimsizes_to_dimnames, num_zas, vartype);
1401 bool EOS5File::Set_Var_Dims(T* eos5data,
Var *var, vector<HE5Var> &he5var,
const string& groupname,
int num_groups,
1405 BESDEBUG(
"h5",
"Coming to Set_Var_Dims"<<endl);
1407 bool is_parsed =
false;
1408 string eos5typestr =
"";
1409 string fslash_str =
"/";
1411 if (GRID == eos5type)
1412 eos5typestr =
"/GRIDS/";
1413 else if (SWATH == eos5type)
1414 eos5typestr =
"/SWATHS/";
1415 else if (ZA == eos5type)
1416 eos5typestr =
"/ZAS/";
1418 throw1(
"Unsupported HDF-EOS5 type, this type is not swath, grid or zonal average");
1420 for (
unsigned int i = 0; i < he5var.size(); i++) {
1422 HE5Var he5v = he5var.at(i);
1424 if (he5v.name == var->name) {
1425 if (he5v.dim_list.size() != var->dims.size())
1426 throw2(
"Number of dimensions don't match with the structmetadata for variable ", var->name);
1456 set<hsize_t> dimsize_have_name_set;
1457 pair<set<hsize_t>::iterator,
bool> setret1;
1458 set<string> thisvar_dimname_set;
1459 pair<set<string>::iterator,
bool> setret2;
1461 for (
unsigned int j = 0; j < he5v.dim_list.size(); j++) {
1462 HE5Dim he5d = he5v.dim_list.at(j);
1463 for (vector<Dimension *>::iterator ird = var->dims.begin(); ird != var->dims.end(); ++ird) {
1465 if ((hsize_t) (he5d.size) == (*ird)->size) {
1467 if (
"" == (*ird)->name) {
1468 string dimname_candidate = eos5typestr + groupname + fslash_str + he5d.name;
1469 setret2 = thisvar_dimname_set.insert(dimname_candidate);
1470 if (
true == setret2.second) {
1471 (*ird)->name = dimname_candidate;
1473 (*ird)->newname = (num_groups == 1) ? he5d.name : (*ird)->name;
1474 eos5data->vardimnames.insert((*ird)->name);
1478 eos5data->dimnames_to_unlimited[(*ird)->name] = (*ird)->unlimited_dim;
1487 for (vector<Dimension *>::iterator ird = var->dims.begin(); ird != var->dims.end(); ++ird) {
1488 if (
"" == (*ird)->name)
1489 Create_Unique_DimName(eos5data, thisvar_dimname_set, *ird, num_groups, eos5type);
1498 void EOS5File::Create_Unique_DimName(T*eos5data, set<string>& thisvar_dimname_set,
Dimension *dim,
int num_groups,
1502 BESDEBUG(
"h5",
"Coming to Create_Unique_DimName"<<endl);
1503 map<hsize_t, string>::iterator itmap1;
1504 map<string, hsize_t>::iterator itmap2;
1505 pair<set<string>::iterator,
bool> setret2;
1506 itmap1 = (eos5data->dimsizes_to_dimnames).find(dim->size);
1513 if (itmap1 != (eos5data->dimsizes_to_dimnames).end()) {
1514 string dimname_candidate = (eos5data->dimsizes_to_dimnames)[dim->size];
1517 setret2 = thisvar_dimname_set.insert(dimname_candidate);
1519 if (
false == setret2.second) {
1522 bool match_some_dimname = Check_All_DimNames(eos5data, dimname_candidate, dim->size);
1524 if (
false == match_some_dimname) {
1527 Get_Unique_Name(eos5data->vardimnames, dimname_candidate);
1528 thisvar_dimname_set.insert(dimname_candidate);
1531 Insert_One_NameSizeMap_Element2(eos5data->dimnames_to_dimsizes, eos5data->dimnames_to_unlimited,
1532 dimname_candidate, dim->size, dim->unlimited_dim);
1533 eos5data->dimsizes_to_dimnames.insert(pair<hsize_t, string>(dim->size, dimname_candidate));
1534 eos5data->dimnames.push_back(dimname_candidate);
1539 dim->name = dimname_candidate;
1541 dim->newname = dim->name;
1543 string dname = HDF5CFUtil::obtain_string_after_lastslash(dim->name);
1545 throw3(
"The dimension name ", dim->name,
" of the variable is not right");
1547 dim->newname = dname;
1553 string Fakedimname = Create_Unique_FakeDimName(eos5data, eos5type);
1554 thisvar_dimname_set.insert(Fakedimname);
1557 Insert_One_NameSizeMap_Element2(eos5data->dimnames_to_dimsizes, eos5data->dimnames_to_unlimited, Fakedimname,
1558 dim->size, dim->unlimited_dim);
1559 eos5data->dimsizes_to_dimnames.insert(pair<hsize_t, string>(dim->size, Fakedimname));
1560 eos5data->dimnames.push_back(Fakedimname);
1561 dim->name = Fakedimname;
1563 dim->newname = dim->name;
1565 string dname = HDF5CFUtil::obtain_string_after_lastslash(dim->name);
1567 throw3(
"The dimension name ", dim->name,
" of the variable is not right");
1569 dim->newname = dname;
1576 bool EOS5File::Check_All_DimNames(T* eos5data,
string& dimname, hsize_t dimsize)
1579 BESDEBUG(
"h5",
"Coming to Check_All_DimNames"<<endl);
1580 bool ret_flag =
false;
1581 for (map<string, hsize_t>::iterator im = eos5data->dimnames_to_dimsizes.begin();
1582 im != eos5data->dimnames_to_dimsizes.end(); ++im) {
1584 if (dimsize == (*im).second && dimname != (*im).first) {
1585 dimname = (*im).first;
1594 void EOS5File::Get_Unique_Name(set<string> & nameset,
string& dimname_candidate)
1597 BESDEBUG(
"h5",
"Coming to Get_Unique_Name"<<endl);
1598 int clash_index = 1;
1599 string temp_clashname = dimname_candidate +
'_';
1600 HDF5CFUtil::gen_unique_name(temp_clashname, nameset, clash_index);
1601 dimname_candidate = temp_clashname;
1606 string EOS5File::Create_Unique_FakeDimName(T*eos5data, EOS5Type eos5type)
1609 BESDEBUG(
"h5",
"Coming to Create_Unique_FakeDimName"<<endl);
1610 string fslash_str =
"/";
1612 if (GRID == eos5type)
1613 eos5typestr =
"/GRIDS/";
1614 else if (SWATH == eos5type)
1615 eos5typestr =
"/SWATHS/";
1616 else if (ZA == eos5type)
1617 eos5typestr =
"/ZAS/";
1619 throw1(
"Unsupported HDF-EOS5 type, this type is not swath, grid or zonal average");
1621 stringstream sfakedimindex;
1622 sfakedimindex << eos5data->addeddimindex;
1623 string fakedimstr =
"FakeDim";
1624 string added_dimname = eos5typestr + eos5data->name + fslash_str + fakedimstr + sfakedimindex.str();
1626 pair<set<string>::iterator,
bool> setret;
1627 setret = eos5data->vardimnames.insert(added_dimname);
1628 if (
false == setret.second) Get_Unique_Name(eos5data->vardimnames, added_dimname);
1629 eos5data->addeddimindex = eos5data->addeddimindex + 1;
1630 return added_dimname;
1634 string EOS5File::Obtain_Var_EOS5Type_GroupName(
Var*var, EOS5Type eos5type)
1637 BESDEBUG(
"h5",
"Coming to Obtain_Var_EOS5Type_GroupName"<<endl);
1638 string EOS5GRIDPATH =
"/HDFEOS/GRIDS";
1639 string EOS5SWATHPATH =
"/HDFEOS/SWATHS";
1640 string EOS5ZAPATH =
"/HDFEOS/ZAS";
1641 size_t eostypename_start_pos = 0;
1642 size_t eostypename_end_pos;
1649 if (GRID == eos5type)
1650 eostypename_start_pos = EOS5GRIDPATH.size() + 1;
1651 else if (SWATH == eos5type)
1652 eostypename_start_pos = EOS5SWATHPATH.size() + 1;
1653 else if (ZA == eos5type)
1654 eostypename_start_pos = EOS5ZAPATH.size() + 1;
1656 throw2(
"Non supported eos5 type for var ", var->fullpath);
1658 eostypename_end_pos = var->fullpath.find(
'/', eostypename_start_pos) - 1;
1659 groupname = var->fullpath.substr(eostypename_start_pos, eostypename_end_pos - eostypename_start_pos + 1);
1661 BESDEBUG(
"h5",
"In Obtain_Var_EOS5Type_GroupName(), the groupname is "<<groupname << endl);
1667 int EOS5File::Check_EOS5Swath_FieldType(
Var*var)
1670 string geofield_relative_path =
"/Geolocation Fields/" + var->name;
1671 string datafield_relative_path =
"/Data Fields/" + var->name;
1675 if (var->fullpath.size() > datafield_relative_path.size()) {
1676 size_t field_pos_in_full_path = var->fullpath.size() - datafield_relative_path.size();
1677 if (var->fullpath.rfind(datafield_relative_path, field_pos_in_full_path) != string::npos) tempflag = 0;
1680 if (tempflag != 0 && (var->fullpath.size() > geofield_relative_path.size())) {
1681 size_t field_pos_in_full_path = var->fullpath.size() - geofield_relative_path.size();
1682 if (var->fullpath.rfind(geofield_relative_path, field_pos_in_full_path) != string::npos) tempflag = 1;
1690 void EOS5File::Set_NonParse_Var_Dims(T*eos5data,
Var* var, map<hsize_t, string>& ,
1691 int num_groups, EOS5Type eos5type)
1694 BESDEBUG(
"h5",
"Coming to Set_NonParse_Var_Dims"<<endl);
1695 map<hsize_t, string>::iterator itmap;
1696 set<string> thisvar_dimname_set;
1698 for (vector<Dimension *>::iterator ird = var->dims.begin(); ird != var->dims.end(); ++ird) {
1699 if (
"" == (*ird)->name)
1700 Create_Unique_DimName(eos5data, thisvar_dimname_set, *ird, num_groups, eos5type);
1702 throw5(
"The dimension name ", (*ird)->name,
" of the variable ", var->name,
" is not right");
1707 void EOS5File::Check_Aura_Product_Status()
1710 BESDEBUG(
"h5",
"Coming to Check_Aura_Product_Status"<<endl);
1713 string eos5_fattr_group_name =
"/HDFEOS/ADDITIONAL/FILE_ATTRIBUTES";
1714 string instrument_attr_name =
"InstrumentName";
1717 for (vector<Group *>::iterator irg = this->groups.begin(); irg != this->groups.end(); ++irg) {
1718 if (eos5_fattr_group_name == (*irg)->path) {
1719 for (vector<Attribute *>::iterator ira = (*irg)->attrs.begin(); ira != (*irg)->attrs.end(); ++ira) {
1720 if (instrument_attr_name == (*ira)->name) {
1721 Retrieve_H5_Attr_Value(*ira, (*irg)->path);
1722 string attr_value((*ira)->value.begin(), (*ira)->value.end());
1723 if (
"OMI" == attr_value) {
1724 this->isaura =
true;
1725 this->aura_name = OMI;
1727 else if (
"MLS Aura" == attr_value) {
1728 this->isaura =
true;
1729 this->aura_name = MLS;
1731 else if (
"TES" == attr_value) {
1732 this->isaura =
true;
1733 this->aura_name = TES;
1735 else if (
"HIRDLS" == attr_value) {
1736 this->isaura =
true;
1737 this->aura_name = HIRDLS;
1746 if (
true == this->isaura) {
1747 eos5_to_cf_attr_map[
"FillValue"] =
"_FillValue";
1748 eos5_to_cf_attr_map[
"MissingValue"] =
"missing_value";
1749 eos5_to_cf_attr_map[
"Units"] =
"units";
1750 eos5_to_cf_attr_map[
"Offset"] =
"add_offset";
1751 eos5_to_cf_attr_map[
"ScaleFactor"] =
"scale_factor";
1752 eos5_to_cf_attr_map[
"ValidRange"] =
"valid_range";
1753 eos5_to_cf_attr_map[
"Title"] =
"title";
1759 void EOS5File::Handle_CVar()
1762 BESDEBUG(
"h5",
"Coming to Handle_CVar()"<<endl);
1765 bool is_augmented = Check_Augmentation_Status();
1768 if(is_augmented) cerr<<
"The file is augmented "<<endl;
1769 else cerr<<
"The file is not augmented "<<endl;
1773 if (this->eos5cfgrids.size() > 0)
1774 Handle_Grid_CVar(is_augmented);
1775 if (this->eos5cfswaths.size() > 0)
1776 Handle_Swath_CVar(is_augmented);
1777 if (this->eos5cfzas.size() > 0)
1778 Handle_Za_CVar(is_augmented);
1781 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin();
1782 irv != this->cvars.end(); irv++) {
1783 cerr<<
"EOS5CVar name "<<(*irv)->name <<endl;
1784 cerr<<
"EOS5CVar dimension name "<< (*irv)->cfdimname <<endl;
1785 cerr<<
"EOS5CVar new name "<<(*irv)->newname <<endl;
1786 cerr<<
"EOS5CVar type is "<<(*irv)->cvartype <<endl;
1794 void EOS5File::Handle_Grid_CVar(
bool is_augmented)
1797 BESDEBUG(
"h5",
"Coming to Handle_Grid_CVar"<<endl);
1798 if (
true == is_augmented) {
1800 Handle_Augmented_Grid_CVar();
1803 Remove_MultiDim_LatLon_EOS5CFGrid();
1806 if (0 == this->eos5cfgrids.size())
return;
1807 if (1 == this->eos5cfgrids.size())
1808 Handle_Single_Nonaugment_Grid_CVar((this->eos5cfgrids)[0]);
1810 Handle_Multi_Nonaugment_Grid_CVar();
1817 bool EOS5File::Check_Augmentation_Status()
1820 BESDEBUG(
"h5",
"Coming to Check_Augmentation_Status()"<<endl);
1821 bool aug_status =
false;
1822 int num_aug_eos5grp = 0;
1824 for (vector<EOS5CFGrid *>::iterator irg = this->eos5cfgrids.begin(); irg != this->eos5cfgrids.end(); ++irg) {
1825 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
1826 bool is_augmented = Check_Augmented_Var_Candidate(*irg, *irv, GRID);
1827 if (
true == is_augmented) {
1834 for (vector<EOS5CFSwath *>::iterator irg = this->eos5cfswaths.begin(); irg != this->eos5cfswaths.end(); ++irg) {
1835 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
1836 bool is_augmented = Check_Augmented_Var_Candidate(*irg, *irv, SWATH);
1837 if (
true == is_augmented) {
1845 for (vector<EOS5CFZa *>::iterator irg = this->eos5cfzas.begin(); irg != this->eos5cfzas.end(); ++irg) {
1846 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
1847 bool is_augmented = Check_Augmented_Var_Candidate(*irg, *irv, ZA);
1848 if (
true == is_augmented) {
1855 int total_num_eos5grp = this->eos5cfgrids.size() + this->eos5cfswaths.size() + this->eos5cfzas.size();
1859 if (num_aug_eos5grp == total_num_eos5grp) aug_status =
true;
1867 bool EOS5File::Check_Augmented_Var_Attrs(
Var *var) {
1871 bool has_dimscale_class =
false;
1872 bool has_reflist =
false;
1873 for (vector<Attribute *>::iterator ira = var->attrs.begin();
1874 ira != var->attrs.end(); ++ira) {
1875 if (
"CLASS" == (*ira)->name) {
1876 Retrieve_H5_Attr_Value(*ira,var->fullpath);
1877 string class_value((*ira)->value.begin(),(*ira)->value.end());
1878 if (
"DIMENSION_SCALE"==class_value)
1879 has_dimscale_class =
true;
1882 if (
"REFERENCE_LIST" == (*ira)->name)
1884 if (
true == has_reflist &&
true == has_dimscale_class)
1888 if (
true == has_reflist &&
true == has_dimscale_class)
1903 bool EOS5File::Check_Augmented_Var_Candidate(T *eos5data,
Var *var, EOS5Type eos5type)
1906 BESDEBUG(
"h5",
"Coming to Check_Augmented_Var_Candidate"<<endl);
1907 bool augmented_var =
false;
1909 string EOS5DATAPATH =
"";
1910 if (GRID == eos5type)
1911 EOS5DATAPATH =
"/HDFEOS/GRIDS/";
1912 else if (ZA == eos5type)
1913 EOS5DATAPATH =
"/HDFEOS/ZAS/";
1914 else if (SWATH == eos5type)
1915 EOS5DATAPATH =
"/HDFEOS/SWATHS/";
1917 throw1(
"Non supported EOS5 type");
1919 string fslash_str =
"/";
1920 string THIS_EOS5DATAPATH = EOS5DATAPATH + eos5data->name + fslash_str;
1923 if (eos5type == Get_Var_EOS5_Type(var)) {
1924 string var_eos5data_name = Obtain_Var_EOS5Type_GroupName(var, eos5type);
1926 if (var_eos5data_name == eos5data->name) {
1927 if (var->fullpath.size() > THIS_EOS5DATAPATH.size()) {
1929 string var_path_after_eos5dataname = var->fullpath.substr(THIS_EOS5DATAPATH.size());
1931 if (var_path_after_eos5dataname == var->name) augmented_var =
true;
1936 return augmented_var;
1941 void EOS5File::Handle_Augmented_Grid_CVar()
1943 BESDEBUG(
"h5",
"Coming to Handle_Augmented_Grid_CVar()"<<endl);
1944 for (vector<EOS5CFGrid *>::iterator irv = this->eos5cfgrids.begin(); irv != this->eos5cfgrids.end(); ++irv)
1945 Handle_Single_Augment_CVar(*irv, GRID);
1950 void EOS5File::Handle_Single_Augment_CVar(T* cfeos5data, EOS5Type eos5type)
1953 BESDEBUG(
"h5",
"Coming to Handle_Single_Augment_CVar()"<<endl);
1954 set<string> tempvardimnamelist;
1955 tempvardimnamelist = cfeos5data->vardimnames;
1956 set<string>::iterator its;
1957 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its) {
1958 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end();) {
1960 bool is_augmented = Check_Augmented_Var_Candidate(cfeos5data, *irv, eos5type);
1962 if (
true == is_augmented) {
1966 string tempdimname = HDF5CFUtil::obtain_string_after_lastslash(*its);
1969 if (tempdimname == (*irv)->name) {
1976 EOS5cvar->cfdimname = *its;
1977 EOS5cvar->cvartype = CV_EXIST;
1978 EOS5cvar->eos_type = eos5type;
1981 this->cvars.push_back(EOS5cvar);
1985 irv = this->vars.erase(irv);
1997 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
1998 its = tempvardimnamelist.find((*irv)->cfdimname);
1999 if (its != tempvardimnamelist.end()) tempvardimnamelist.erase(its);
2002 if (
false == tempvardimnamelist.empty())
2003 throw1(
"Augmented files still need to provide more coordinate variables");
2009 void EOS5File::Remove_MultiDim_LatLon_EOS5CFGrid()
2012 BESDEBUG(
"h5",
"Coming to Remove_MultiDim_LatLon_EOS5CFGrid()"<<endl);
2013 for (vector<EOS5CFGrid *>::iterator irg = this->eos5cfgrids.begin(); irg != this->eos5cfgrids.end();) {
2024 bool irg_erase =
false;
2026 if (
true == (*irg)->has_2dlatlon) {
2028 if ((
true == this->isaura) && (OMI == this->aura_name) && (HE5_GCTP_GEO == (*irg)->eos5_projcode))
2032 string EOS5GRIDPATH =
"/HDFEOS/GRIDS/";
2033 string fslash_str =
"/";
2034 string THIS_EOS5GRIDPATH = EOS5GRIDPATH + (*irg)->name + fslash_str;
2035 int catch_latlon = 0;
2037 for (vector<Var *>::iterator irv = this->vars.begin(); (irv != this->vars.end()) && (catch_latlon != 2);
2039 if (GRID == Get_Var_EOS5_Type(*irv) && ((*irv)->fullpath.size() > THIS_EOS5GRIDPATH.size())) {
2041 string var_grid_name = Obtain_Var_EOS5Type_GroupName(*irv, GRID);
2042 if (var_grid_name == (*irg)->name) {
2043 if ((
"Longitude" == (*irv)->name) || (
"Latitude" == (*irv)->name)) {
2047 irv = this->vars.erase(irv);
2061 if (2 == catch_latlon) {
2062 (*irg)->has_nolatlon =
true;
2063 (*irg)->has_2dlatlon =
false;
2069 irg = this->eos5cfgrids.erase(irg);
2074 if (
false == irg_erase) {
2081 for (vector<EOS5CFGrid *>::iterator irg = this->eos5cfgrids.begin(); irg != this->eos5cfgrids.end();) {
2083 if (
true == (*irg)->has_g2dlatlon) {
2085 irg = this->eos5cfgrids.erase(irg);
2094 void EOS5File::Handle_Single_Nonaugment_Grid_CVar(
EOS5CFGrid* cfgrid)
2097 BESDEBUG(
"h5",
"Coming to Handle_Single_Nonaugment_Grid_CVar()"<<endl);
2098 set<string> tempvardimnamelist;
2099 tempvardimnamelist = cfgrid->vardimnames;
2102 bool use_own_latlon =
false;
2103 if (
true == cfgrid->has_1dlatlon)
2104 use_own_latlon = Handle_Single_Nonaugment_Grid_CVar_OwnLatLon(cfgrid, tempvardimnamelist);
2106 if(use_own_latlon)
"h5",
"using 1D latlon"<<endl;
2107 else "h5",
"use_own_latlon is false "<<endl;
2110 if (
false == use_own_latlon) {
2111 bool use_eos5_latlon =
false;
2112 use_eos5_latlon = Handle_Single_Nonaugment_Grid_CVar_EOS5LatLon(cfgrid, tempvardimnamelist);
2115 if (
false == use_eos5_latlon)
return;
2119 Handle_NonLatLon_Grid_CVar(cfgrid, tempvardimnamelist);
2124 bool EOS5File::Handle_Single_Nonaugment_Grid_CVar_OwnLatLon(
EOS5CFGrid *cfgrid, set<string>& tempvardimnamelist)
2128 BESDEBUG(
"h5",
"Coming to Handle_Single_Nonaugment_Grid_CVar_OwnLatLon()"<<endl);
2129 set<string>::iterator its;
2130 string EOS5GRIDPATH =
"/HDFEOS/GRIDS/";
2131 string fslash_str =
"/";
2132 string THIS_EOS5GRIDPATH = EOS5GRIDPATH + cfgrid->name + fslash_str;
2135 bool find_latydim =
false;
2136 bool find_lonxdim =
false;
2138 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
2139 if (GRID == Get_Var_EOS5_Type(*irv) && ((*irv)->fullpath.size() > THIS_EOS5GRIDPATH.size())) {
2141 string var_grid_name = Obtain_Var_EOS5Type_GroupName(*irv, GRID);
2142 if ((var_grid_name == cfgrid->name) && ((*irv)->name ==
"Latitude")) {
2144 string tempdimname = (((*irv)->dims)[0])->name;
2146 if (
"YDim" == HDF5CFUtil::obtain_string_after_lastslash(tempdimname)) {
2152 EOS5cvar->cfdimname = tempdimname;
2153 EOS5cvar->cvartype = CV_EXIST;
2154 EOS5cvar->eos_type = GRID;
2157 this->cvars.push_back(EOS5cvar);
2161 this->vars.erase(irv);
2164 find_latydim =
true;
2171 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
2173 if (GRID == Get_Var_EOS5_Type(*irv) && ((*irv)->fullpath.size() > THIS_EOS5GRIDPATH.size())) {
2175 string var_grid_name = Obtain_Var_EOS5Type_GroupName(*irv, GRID);
2177 if ((var_grid_name == cfgrid->name) && ((*irv)->name ==
"Longitude")) {
2179 string tempdimname = (((*irv)->dims)[0])->name;
2181 if (
"XDim" == HDF5CFUtil::obtain_string_after_lastslash(tempdimname)) {
2187 EOS5cvar->cfdimname = tempdimname;
2188 EOS5cvar->cvartype = CV_EXIST;
2189 EOS5cvar->eos_type = GRID;
2192 this->cvars.push_back(EOS5cvar);
2196 this->vars.erase(irv);
2197 find_lonxdim =
true;
2204 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
2205 its = tempvardimnamelist.find((*irv)->cfdimname);
2206 if (its != tempvardimnamelist.end()) tempvardimnamelist.erase(its);
2211 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its)
2212 "h5",
"tempvardim "<<*its <<endl;
2215 return (find_latydim ==
true && find_lonxdim ==
true);
2219 bool EOS5File::Handle_Single_Nonaugment_Grid_CVar_EOS5LatLon(
EOS5CFGrid *cfgrid, set<string>& tempvardimnamelist)
2223 BESDEBUG(
"h5",
"Coming to Handle_Single_Nonaugment_Grid_CVar_EOS5LatLon()"<<endl);
2226 bool find_ydim =
false;
2227 bool find_xdim =
false;
2228 set<string>::iterator its;
2231 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its)
2232 cerr<<
"dim names "<<(*its) <<endl;
2235 string ydim_full_path;
2236 string xdim_full_path;
2238 if (cfgrid->eos5_projcode != HE5_GCTP_GEO) {
2240 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its) {
2241 if (
"YDim" == HDF5CFUtil::obtain_string_after_lastslash(*its))
2242 ydim_full_path = *its;
2243 else if (
"XDim" == HDF5CFUtil::obtain_string_after_lastslash(*its)) xdim_full_path = *its;
2248 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end();) {
2249 if (
"YDim" == HDF5CFUtil::obtain_string_after_lastslash(*its)) {
2253 EOS5cvar->name =
"lat";
2254 Create_Added_Var_NewName_FullPath(GRID, cfgrid->name, EOS5cvar->name, EOS5cvar->newname,
2255 EOS5cvar->fullpath);
2257 if (cfgrid->eos5_projcode != HE5_GCTP_GEO) {
2259 EOS5cvar->dtype = H5FLOAT64;
2263 EOS5cvar->dtype = H5FLOAT32;
2267 eos5cvar_dim->name = *its;
2268 eos5cvar_dim->newname = (this->eos5cfgrids.size() == 1) ?
"YDim" : *its;
2269 EOS5cvar->dims.push_back(eos5cvar_dim);
2270 EOS5cvar->cfdimname = eos5cvar_dim->name;
2272 if (EOS5cvar->rank == 2) {
2274 eos5cvar_dim =
new Dimension((hsize_t) cfgrid->xdimsize);
2275 eos5cvar_dim->name = xdim_full_path;
2276 eos5cvar_dim->newname = (this->eos5cfgrids.size() == 1) ?
"XDim" : xdim_full_path;
2277 EOS5cvar->dims.push_back(eos5cvar_dim);
2280 EOS5cvar->cvartype = CV_LAT_MISS;
2281 EOS5cvar->eos_type = GRID;
2282 EOS5cvar->xdimsize = cfgrid->xdimsize;
2283 EOS5cvar->ydimsize = cfgrid->ydimsize;
2286 EOS5cvar->point_lower = cfgrid->point_lower;
2287 EOS5cvar->point_upper = cfgrid->point_upper;
2288 EOS5cvar->point_left = cfgrid->point_left;
2289 EOS5cvar->point_right = cfgrid->point_right;
2290 EOS5cvar->eos5_pixelreg = cfgrid->eos5_pixelreg;
2291 EOS5cvar->eos5_origin = cfgrid->eos5_origin;
2292 EOS5cvar->eos5_projcode = cfgrid->eos5_projcode;
2294 for (
unsigned int k = 0; k < 13; k++)
2295 EOS5cvar->param[k] = cfgrid->param[k];
2297 EOS5cvar->zone = cfgrid->zone;
2298 EOS5cvar->sphere = cfgrid->sphere;
2301 this->cvars.push_back(EOS5cvar);
2305 tempvardimnamelist.erase(its++);
2309 else if (
"XDim" == HDF5CFUtil::obtain_string_after_lastslash(*its)) {
2313 EOS5cvar->name =
"lon";
2314 Create_Added_Var_NewName_FullPath(GRID, cfgrid->name, EOS5cvar->name, EOS5cvar->newname,
2315 EOS5cvar->fullpath);
2320 if (cfgrid->eos5_projcode != HE5_GCTP_GEO) {
2322 EOS5cvar->dtype = H5FLOAT64;
2326 EOS5cvar->dtype = H5FLOAT32;
2330 if (EOS5cvar->rank == 2) {
2331 eos5cvar_dim =
new Dimension((hsize_t) cfgrid->ydimsize);
2335 eos5cvar_dim->name = ydim_full_path;
2336 eos5cvar_dim->newname = (this->eos5cfgrids.size() == 1) ?
"YDim" : ydim_full_path;
2337 EOS5cvar->dims.push_back(eos5cvar_dim);
2340 eos5cvar_dim =
new Dimension((hsize_t) cfgrid->xdimsize);
2344 eos5cvar_dim->name = *its;
2345 eos5cvar_dim->newname = (this->eos5cfgrids.size() == 1) ?
"XDim" : *its;
2346 EOS5cvar->dims.push_back(eos5cvar_dim);
2347 EOS5cvar->cfdimname = eos5cvar_dim->name;
2349 EOS5cvar->cvartype = CV_LON_MISS;
2350 EOS5cvar->eos_type = GRID;
2351 EOS5cvar->xdimsize = cfgrid->xdimsize;
2352 EOS5cvar->ydimsize = cfgrid->ydimsize;
2355 EOS5cvar->point_lower = cfgrid->point_lower;
2356 EOS5cvar->point_upper = cfgrid->point_upper;
2357 EOS5cvar->point_left = cfgrid->point_left;
2358 EOS5cvar->point_right = cfgrid->point_right;
2359 EOS5cvar->eos5_pixelreg = cfgrid->eos5_pixelreg;
2360 EOS5cvar->eos5_origin = cfgrid->eos5_origin;
2361 EOS5cvar->eos5_projcode = cfgrid->eos5_projcode;
2362 for (
unsigned int k = 0; k < 13; k++)
2363 EOS5cvar->param[k] = cfgrid->param[k];
2364 EOS5cvar->zone = cfgrid->zone;
2365 EOS5cvar->sphere = cfgrid->sphere;
2368 this->cvars.push_back(EOS5cvar);
2371 tempvardimnamelist.erase(its++);
2377 if (
true == find_xdim &&
true == find_ydim)
break;
2380 return (
true == find_xdim &&
true == find_ydim);
2384 void EOS5File::Handle_NonLatLon_Grid_CVar(
EOS5CFGrid *cfgrid, set<string>& tempvardimnamelist)
2388 set<string>::iterator its;
2389 int num_dimnames = tempvardimnamelist.size();
2390 bool has_dimnames =
true;
2392 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its) {
2393 if (cfgrid->dnames_to_1dvnames.find(*its) != cfgrid->dnames_to_1dvnames.end()) {
2394 for (vector<Var *>::iterator irv = this->vars.begin(); has_dimnames && (irv != this->vars.end());) {
2398 if (GRID == Get_Var_EOS5_Type(*irv) && (*irv)->newname == (cfgrid->dnames_to_1dvnames)[*its]) {
2405 EOS5cvar->cfdimname = *its;
2406 EOS5cvar->cvartype = CV_EXIST;
2407 EOS5cvar->eos_type = GRID;
2410 this->cvars.push_back(EOS5cvar);
2414 irv = this->vars.erase(irv);
2416 if (0 == num_dimnames) has_dimnames =
false;
2426 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
2427 its = tempvardimnamelist.find((*irv)->cfdimname);
2428 if (its != tempvardimnamelist.end()) tempvardimnamelist.erase(its);
2432 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its) {
2435 Create_Missing_CV(cfgrid, EOS5cvar, *its, GRID, this->eos5cfgrids.size());
2436 this->cvars.push_back(EOS5cvar);
2442 void EOS5File::Handle_Multi_Nonaugment_Grid_CVar()
2445 BESDEBUG(
"h5",
"Coming to Handle_Multi_nonaugment_Grid_CVar()"<<endl);
2449 if (
true == this->grids_multi_latloncvs) {
2450 for (vector<EOS5CFGrid *>::iterator irv = this->eos5cfgrids.begin(); irv != this->eos5cfgrids.end(); ++irv)
2451 Handle_Single_Nonaugment_Grid_CVar(*irv);
2462 int num_1dlatlon_pairs = 0;
2463 for (vector<EOS5CFGrid *>::iterator irv = this->eos5cfgrids.begin(); irv != this->eos5cfgrids.end(); ++irv)
2464 if (
true == (*irv)->has_1dlatlon) num_1dlatlon_pairs++;
2466 bool use_eos5_latlon =
false;
2467 if ((0 == num_1dlatlon_pairs)
2468 || ((num_1dlatlon_pairs == (int) (this->eos5cfgrids.size())) && (
true == this->isaura))) {
2469 set<string> tempvardimnamelist = ((this->eos5cfgrids)[0])->vardimnames;
2470 if (0 == num_1dlatlon_pairs) {
2471 use_eos5_latlon = Handle_Single_Nonaugment_Grid_CVar_EOS5LatLon((this->eos5cfgrids)[0],
2472 tempvardimnamelist);
2474 if (
false == use_eos5_latlon)
return;
2479 bool use_own_latlon =
false;
2480 use_own_latlon = Handle_Single_Nonaugment_Grid_CVar_OwnLatLon((this->eos5cfgrids)[0],
2481 tempvardimnamelist);
2482 if (
false == use_own_latlon) {
2483 use_eos5_latlon = Handle_Single_Nonaugment_Grid_CVar_EOS5LatLon((this->eos5cfgrids)[0],
2484 tempvardimnamelist);
2485 if (
false == use_eos5_latlon)
return;
2490 Handle_NonLatLon_Grid_CVar((this->eos5cfgrids)[0], tempvardimnamelist);
2493 for (
unsigned j = 1; j < this->eos5cfgrids.size(); j++)
2494 (this->eos5cfgrids)[j]->Update_Dimnamelist();
2497 Adjust_EOS5GridDimNames((this->eos5cfgrids)[0]);
2500 for (
unsigned j = 1; j < this->eos5cfgrids.size(); j++) {
2501 tempvardimnamelist = (this->eos5cfgrids)[j]->vardimnames;
2502 Handle_NonLatLon_Grid_CVar((this->eos5cfgrids)[j], tempvardimnamelist);
2503 tempvardimnamelist.clear();
2509 this->grids_multi_latloncvs =
true;
2510 for (vector<EOS5CFGrid *>::iterator irv = this->eos5cfgrids.begin(); irv != this->eos5cfgrids.end(); ++irv)
2511 Handle_Single_Nonaugment_Grid_CVar(*irv);
2519 void EOS5File::Adjust_EOS5GridDimNames(
EOS5CFGrid *cfgrid)
2522 BESDEBUG(
"h5",
"Coming to Adjust_EOS5GridDimNames()"<<endl);
2525 bool find_xdim =
false;
2526 bool find_ydim =
false;
2528 for (set<string>::iterator it = cfgrid->vardimnames.begin(); it != cfgrid->vardimnames.end(); ++it) {
2529 string xydimname_candidate = HDF5CFUtil::obtain_string_after_lastslash(*it);
2530 if (
"XDim" == xydimname_candidate) {
2534 else if (
"YDim" == xydimname_candidate) {
2538 if (find_xdim && find_ydim)
break;
2541 if (
false == find_xdim ||
false == find_ydim)
2542 throw2(
"Cannot find Dimension name that includes XDim or YDim in the grid ", cfgrid->name);
2544 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
2545 if (GRID == Get_Var_EOS5_Type(*irv)) {
2546 for (vector<Dimension *>::iterator
id = (*irv)->dims.begin();
id != (*irv)->dims.end(); ++id) {
2547 string xydimname_candidate = HDF5CFUtil::obtain_string_after_lastslash((*id)->name);
2548 if (
"XDim" == xydimname_candidate)
2549 (*id)->name = xdimname;
2550 else if (
"YDim" == xydimname_candidate) (*id)->name = ydimname;
2557 void EOS5File::Handle_Swath_CVar(
bool isaugmented)
2560 BESDEBUG(
"h5",
"Coming to Handle_Swath_CVar()"<<endl);
2564 for (vector<EOS5CFSwath *>::iterator irs = this->eos5cfswaths.begin(); irs != this->eos5cfswaths.end();) {
2565 if ((*irs)->has_1dlatlon) {
2566 Handle_Single_1DLatLon_Swath_CVar(*irs, isaugmented);
2569 else if ((*irs)->has_2dlatlon) {
2570 Handle_Single_2DLatLon_Swath_CVar(*irs, isaugmented);
2580 irs = this->eos5cfswaths.erase(irs);
2586 void EOS5File::Handle_Single_1DLatLon_Swath_CVar(
EOS5CFSwath *cfswath,
bool is_augmented)
2589 BESDEBUG(
"h5",
"Coming to Handle_Single_1DLatLon_Swath_CVar"<<endl);
2591 set<string>::iterator its;
2592 set<string> tempvardimnamelist = cfswath->vardimnames;
2593 string EOS5SWATHPATH =
"/HDFEOS/SWATHS/";
2594 string fslash_str =
"/";
2595 string THIS_EOS5SWATHPATH = EOS5SWATHPATH + cfswath->name + fslash_str;
2597 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its)
2598 cerr<<
"Dimension name befor latitude " << *its << endl;
2603 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
2604 if (SWATH == Get_Var_EOS5_Type(*irv) && ((*irv)->fullpath.size() > THIS_EOS5SWATHPATH.size())) {
2606 string var_swath_name = Obtain_Var_EOS5Type_GroupName(*irv, SWATH);
2607 if ((var_swath_name == cfswath->name) && ((*irv)->name ==
"Latitude")) {
2614 EOS5cvar->cfdimname = ((*irv)->dims)[0]->name;
2615 EOS5cvar->cvartype = CV_EXIST;
2616 EOS5cvar->eos_type = SWATH;
2619 this->cvars.push_back(EOS5cvar);
2623 this->vars.erase(irv);
2633 bool find_lat_dim =
false;
2634 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its) {
2636 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
2637 if (((*irv)->name ==
"Latitude") && (*irv)->cfdimname == (*its)) {
2638 tempvardimnamelist.erase(its);
2639 find_lat_dim =
true;
2644 if (
true == find_lat_dim)
break;
2648 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its)
2649 cerr<<
"Dimension name afte latitude " << *its << endl;
2652 Handle_NonLatLon_Swath_CVar(cfswath, tempvardimnamelist);
2655 if (
true == is_augmented) {
2656 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end();) {
2658 if (SWATH == Get_Var_EOS5_Type(*irv)) {
2660 string my_swath_short_path = (*irv)->fullpath.substr(EOS5SWATHPATH.size());
2661 size_t first_fslash_pos = my_swath_short_path.find_first_of(
"/");
2662 string my_swath_name = my_swath_short_path.substr(0,first_fslash_pos);
2665 string my_swath_name = Obtain_Var_EOS5Type_GroupName(*irv, SWATH);
2667 if (my_swath_name == cfswath->name) {
2668 string var_path_after_swathname = (*irv)->fullpath.substr(THIS_EOS5SWATHPATH.size());
2669 if (var_path_after_swathname == (*irv)->name) {
2671 irv = this->vars.erase(irv);
2689 void EOS5File::Handle_Single_2DLatLon_Swath_CVar(
EOS5CFSwath *cfswath,
bool is_augmented)
2692 BESDEBUG(
"h5",
"Coming to Handle_Single_2DLatLon_Swath_CVar()"<<endl);
2694 set<string>::iterator its;
2695 set<string> tempvardimnamelist = cfswath->vardimnames;
2696 string EOS5SWATHPATH =
"/HDFEOS/SWATHS/";
2697 string fslash_str =
"/";
2698 string THIS_EOS5SWATHPATH = EOS5SWATHPATH + cfswath->name + fslash_str;
2699 bool find_lat =
false;
2700 bool find_lon =
false;
2703 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its)
2704 cerr<<
"Dimension name befor latitude " << *its << endl;
2708 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end();) {
2709 if (SWATH == Get_Var_EOS5_Type(*irv) && ((*irv)->fullpath.size() > THIS_EOS5SWATHPATH.size())) {
2710 string var_swath_name = Obtain_Var_EOS5Type_GroupName(*irv, SWATH);
2711 if ((var_swath_name == cfswath->name) && ((*irv)->name ==
"Latitude")) {
2718 EOS5cvar->cfdimname = ((*irv)->dims)[0]->name;
2719 EOS5cvar->cvartype = CV_EXIST;
2720 EOS5cvar->eos_type = SWATH;
2721 EOS5cvar->is_2dlatlon =
true;
2724 this->cvars.push_back(EOS5cvar);
2728 irv = this->vars.erase(irv);
2731 else if ((var_swath_name == cfswath->name) && ((*irv)->name ==
"Longitude")) {
2738 EOS5cvar->cfdimname = ((*irv)->dims)[1]->name;
2739 EOS5cvar->cvartype = CV_EXIST;
2740 EOS5cvar->eos_type = SWATH;
2741 EOS5cvar->is_2dlatlon =
true;
2744 this->cvars.push_back(EOS5cvar);
2748 irv = this->vars.erase(irv);
2760 if (
true == find_lat &&
true == find_lon)
break;
2765 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its) {
2766 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
2767 if (((*irv)->name ==
"Latitude") && (*irv)->cfdimname == (*its)) {
2768 tempvardimnamelist.erase(its);
2774 if (
true == find_lat)
break;
2779 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its) {
2781 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
2783 if (((*irv)->name ==
"Longitude") && (*irv)->cfdimname == (*its)) {
2784 tempvardimnamelist.erase(its);
2790 if (
true == find_lon)
break;
2794 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its)
2795 cerr<<
"Dimension name afte latitude " << *its << endl;
2798 Handle_NonLatLon_Swath_CVar(cfswath, tempvardimnamelist);
2805 if (
true == is_augmented) {
2806 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end();) {
2808 if (SWATH == Get_Var_EOS5_Type(*irv)) {
2810 string my_swath_name = Obtain_Var_EOS5Type_GroupName(*irv, SWATH);
2811 if (my_swath_name == cfswath->name) {
2812 string var_path_after_swathname = (*irv)->fullpath.substr(THIS_EOS5SWATHPATH.size());
2813 if (var_path_after_swathname == (*irv)->name) {
2815 irv = this->vars.erase(irv);
2833 void EOS5File::Handle_NonLatLon_Swath_CVar(
EOS5CFSwath *cfswath, set<string>& tempvardimnamelist)
2836 BESDEBUG(
"h5",
"Coming to Handle_NonLatLon_Swath_CVar()"<<endl);
2838 set<string>::iterator its;
2839 int num_dimnames = tempvardimnamelist.size();
2840 bool has_dimnames =
true;
2841 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its) {
2842 if (cfswath->dnames_to_geo1dvnames.find(*its) != cfswath->dnames_to_geo1dvnames.end()) {
2843 for (vector<Var *>::iterator irv = this->vars.begin(); has_dimnames && (irv != this->vars.end());) {
2848 if (SWATH == Get_Var_EOS5_Type(*irv) && (*irv)->newname == (cfswath->dnames_to_geo1dvnames)[*its]) {
2855 EOS5cvar->cfdimname = *its;
2856 EOS5cvar->cvartype = CV_EXIST;
2857 EOS5cvar->eos_type = SWATH;
2860 this->cvars.push_back(EOS5cvar);
2864 irv = this->vars.erase(irv);
2867 if (0 == num_dimnames) has_dimnames =
false;
2877 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
2878 its = tempvardimnamelist.find((*irv)->cfdimname);
2879 if (its != tempvardimnamelist.end()) tempvardimnamelist.erase(its);
2884 Handle_Special_NonLatLon_Swath_CVar(cfswath, tempvardimnamelist);
2887 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
2888 its = tempvardimnamelist.find((*irv)->cfdimname);
2889 if (its != tempvardimnamelist.end()) tempvardimnamelist.erase(its);
2893 for (its = tempvardimnamelist.begin(); its != tempvardimnamelist.end(); ++its) {
2896 Create_Missing_CV(cfswath, EOS5cvar, *its, SWATH, this->eos5cfswaths.size());
2897 this->cvars.push_back(EOS5cvar);
2903 void EOS5File::Handle_Special_NonLatLon_Swath_CVar(
EOS5CFSwath *cfswath, set<string>& tempvardimnamelist)
2907 BESDEBUG(
"h5",
"Handle_Special_NonLatLon_Swath_CVar()"<<endl);
2914 if (
true == this->isaura && TES == this->aura_name) {
2916 string eos5_swath_group_name =
"/HDFEOS/SWATHS/" + cfswath->name;
2917 string eos5_vc_attr_name =
"VerticalCoordinate";
2918 string eos5_pre_attr_name =
"Pressure";
2919 bool has_vc_attr =
false;
2920 Group *vc_group = NULL;
2923 for (vector<Group *>::iterator irg = this->groups.begin(); irg != this->groups.end(); ++irg) {
2924 if (eos5_swath_group_name == (*irg)->path) {
2925 for (vector<Attribute *>::iterator ira = (*irg)->attrs.begin(); ira != (*irg)->attrs.end(); ++ira) {
2926 if (eos5_vc_attr_name == (*ira)->name) {
2927 Retrieve_H5_Attr_Value(*ira, (*irg)->path);
2928 string attr_value((*ira)->value.begin(), (*ira)->value.end());
2929 if (eos5_pre_attr_name == attr_value) {
2936 if (
true == has_vc_attr)
break;
2954 if (
true == has_vc_attr) {
2955 string dimname_candidate =
"/SWATHS/" + cfswath->name +
"/nLevels";
2956 set<string>::iterator it;
2957 for (it = tempvardimnamelist.begin(); it != tempvardimnamelist.end(); ++it) {
2958 if ((*it).find(dimname_candidate) != string::npos) {
2959 hsize_t dimsize_candidate = 0;
2960 if ((cfswath->dimnames_to_dimsizes).find(*it) != (cfswath->dimnames_to_dimsizes).end())
2961 dimsize_candidate = cfswath->dimnames_to_dimsizes[*it];
2963 throw2(
"Cannot find the dimension size of the dimension name ", *it);
2970 for (vector<Attribute *>::iterator ira = vc_group->attrs.begin(); ira != vc_group->attrs.end();
2972 if ((eos5_pre_attr_name == (*ira)->name) && ((*ira)->count == (dimsize_candidate - 1))) {
2977 string reduced_dimname = HDF5CFUtil::obtain_string_after_lastslash(*it);
2978 string orig_dimname =
"nLevels";
2979 if (
"nLevels" == reduced_dimname)
2980 EOS5cvar->name = eos5_pre_attr_name +
"_CV";
2983 EOS5cvar->name = eos5_pre_attr_name +
"_CV" 2984 + reduced_dimname.substr(orig_dimname.size());
2985 Create_Added_Var_NewName_FullPath(SWATH, cfswath->name, EOS5cvar->name, EOS5cvar->newname,
2986 EOS5cvar->fullpath);
2988 EOS5cvar->dtype = (*ira)->dtype;
2990 eos5cvar_dim->name = *it;
2991 if (1 == this->eos5cfswaths.size())
2992 eos5cvar_dim->newname = reduced_dimname;
2994 eos5cvar_dim->newname = eos5cvar_dim->name;
2996 EOS5cvar->dims.push_back(eos5cvar_dim);
2997 EOS5cvar->cvartype = CV_SPECIAL;
2998 EOS5cvar->cfdimname = eos5cvar_dim->name;
2999 EOS5cvar->eos_type = SWATH;
3002 this->cvars.push_back(EOS5cvar);
3012 void EOS5File::Handle_Za_CVar(
bool isaugmented)
3015 BESDEBUG(
"h5",
"Coming to Handle_Za_CVar()"<<endl);
3017 if (
false == isaugmented)
return;
3019 for (vector<EOS5CFZa *>::iterator irv = this->eos5cfzas.begin(); irv != this->eos5cfzas.end(); ++irv)
3020 Handle_Single_Augment_CVar(*irv, ZA);
3025 void EOS5File::Adjust_Var_Dim_NewName_Before_Flattening()
3028 BESDEBUG(
"h5",
"Coming to Adjust_Var_Dim_NewName_Before_Flattening()"<<endl);
3029 int num_grids = this->eos5cfgrids.size();
3030 int num_swaths = this->eos5cfswaths.size();
3031 int num_zas = this->eos5cfzas.size();
3033 bool mixed_eos5typefile =
false;
3036 if (((num_grids > 0) && (num_swaths > 0)) || ((num_grids > 0) && (num_zas > 0))
3037 || ((num_swaths > 0) && (num_zas > 0))) mixed_eos5typefile =
true;
3040 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv)
3041 Adjust_Per_Var_Dim_NewName_Before_Flattening(*irv, mixed_eos5typefile, num_grids, num_swaths, num_zas);
3043 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv)
3044 Adjust_Per_Var_Dim_NewName_Before_Flattening(*irv, mixed_eos5typefile, num_grids, num_swaths, num_zas);
3046 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin();
3047 irv != this->cvars.end(); ++irv) {
3048 cerr<<
"eos5svar var new name "<<(*irv)->newname <<endl;
3049 for (vector<Dimension *>::iterator ird = (*irv)->dims.begin();
3050 ird !=(*irv)->dims.end(); ++ird) {
3051 cerr<<
"eos5svar dimension new name "<<(*ird)->newname <<endl;
3056 Adjust_SharedLatLon_Grid_Var_Dim_Name();
3062 void EOS5File::Adjust_Per_Var_Dim_NewName_Before_Flattening(T* var,
bool mixed_eos5type,
int num_grids,
int num_swaths,
3066 BESDEBUG(
"h5",
"Coming to Adjust_Per_Var_Dim_NewName_Before_Flattening()"<<endl);
3069 EOS5Type vartype = Get_Var_EOS5_Type(var);
3073 eos5typestr =
"/GRIDS/";
3074 if (
false == mixed_eos5type) {
3076 var->newname = ((1 == this->orig_num_grids) ? var->name : var->newname.substr(eos5typestr.size()));
3078 var->newname = ((1 == num_grids) ? var->name : var->newname.substr(eos5typestr.size()));
3093 if (num_grids > 1) {
3094 for (vector<Dimension *>::iterator ird = var->dims.begin(); ird != var->dims.end(); ird++) {
3095 if ((*ird)->newname.size() <= eos5typestr.size())
3096 throw5(
"The size of the dimension new name ", (*ird)->newname,
"of variable ", var->newname,
3098 (*ird)->newname = (*ird)->newname.substr(eos5typestr.size());
3104 var->newname = ((1 == num_grids) ? (eos5typestr + var->name) : var->newname);
3110 eos5typestr =
"/SWATHS/";
3111 if (
false == mixed_eos5type) {
3112 var->newname = ((1 == num_swaths) ? var->name : var->newname.substr(eos5typestr.size()));
3113 if (num_swaths > 1) {
3114 for (vector<Dimension *>::iterator ird = var->dims.begin(); ird != var->dims.end(); ird++) {
3115 if ((*ird)->newname.size() <= eos5typestr.size())
3116 throw5(
"The size of the dimension new name ", (*ird)->newname,
"of variable ", var->newname,
3118 (*ird)->newname = (*ird)->newname.substr(eos5typestr.size());
3123 var->newname = ((1 == num_swaths) ? (eos5typestr + var->name) : var->newname);
3129 eos5typestr =
"/ZAS/";
3130 if (
false == mixed_eos5type) {
3131 var->newname = ((1 == num_zas) ? var->name : var->newname.substr(eos5typestr.size()));
3133 for (vector<Dimension *>::iterator ird = var->dims.begin(); ird != var->dims.end(); ird++) {
3134 if ((*ird)->newname.size() <= eos5typestr.size())
3135 throw5(
"The size of the dimension new name ", (*ird)->newname,
"of variable ", var->newname,
3137 (*ird)->newname = (*ird)->newname.substr(eos5typestr.size());
3142 var->newname = ((1 == num_zas) ? (eos5typestr + var->name) : var->newname);
3149 throw1(
"Non-supported EOS type");
3155 void EOS5File::Adjust_SharedLatLon_Grid_Var_Dim_Name()
3158 BESDEBUG(
"h5",
"Adjust_SharedLatLon_Grid_Var_Dim_Name()"<<endl);
3163 if ((this->eos5cfgrids.size() > 1) && (0 == this->eos5cfswaths.size()) && (0 == this->eos5cfzas.size())
3164 && (
false == this->grids_multi_latloncvs)) {
3168 string lat_dimnewname;
3170 string lon_dimnewname;
3171 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
3172 if (
"lat" == (*irv)->name ||
"Latitude" == (*irv)->name) {
3173 (*irv)->newname = (*irv)->name;
3174 lat_dimnewname = (((*irv)->dims)[0])->newname;
3175 lat_dimnewname = HDF5CFUtil::obtain_string_after_lastslash(lat_dimnewname);
3176 if (
"" == lat_dimnewname)
3177 throw2(
"/ is not included in the dimension new name ", (((*irv)->dims)[0])->newname);
3178 (((*irv)->dims)[0])->newname = lat_dimnewname;
3179 lat_dimname = (*irv)->cfdimname;
3181 else if (
"lon" == (*irv)->name ||
"Longitude" == (*irv)->name) {
3182 (*irv)->newname = (*irv)->name;
3183 lon_dimnewname = (((*irv)->dims)[0])->newname;
3184 lon_dimnewname = HDF5CFUtil::obtain_string_after_lastslash(lon_dimnewname);
3185 if (
"" == lon_dimnewname)
3186 throw2(
"/ is not included in the dimension new name ", (((*irv)->dims)[0])->newname);
3187 (((*irv)->dims)[0])->newname = lon_dimnewname;
3188 lon_dimname = (*irv)->cfdimname;
3192 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
3193 for (vector<Dimension *>::iterator ird = (*irv)->dims.begin(); ird != (*irv)->dims.end(); ++ird) {
3194 if ((*ird)->name == lat_dimname)
3195 (*ird)->newname = lat_dimnewname;
3196 else if ((*ird)->name == lon_dimname) (*ird)->newname = lon_dimnewname;
3203 void EOS5File::Flatten_Obj_Name(
bool include_attr)
3206 BESDEBUG(
"h5",
"Coming to Flatten_Obj_Name()"<<endl);
3207 File::Flatten_Obj_Name(include_attr);
3209 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
3210 (*irv)->newname = get_CF_string((*irv)->newname);
3212 for (vector<Dimension *>::iterator ird = (*irv)->dims.begin(); ird != (*irv)->dims.end(); ++ird) {
3213 (*ird)->newname = get_CF_string((*ird)->newname);
3216 if (
true == include_attr) {
3217 for (vector<Attribute *>::iterator ira = (*irv)->attrs.begin(); ira != (*irv)->attrs.end(); ++ira) {
3218 (*ira)->newname = File::get_CF_string((*ira)->newname);
3225 void EOS5File::Handle_Obj_NameClashing(
bool include_attr)
3228 BESDEBUG(
"h5",
"Coming to Handle_Obj_NameClashing()"<<endl);
3232 set<string> objnameset;
3233 Handle_EOS5CVar_NameClashing(objnameset);
3234 File::Handle_GeneralObj_NameClashing(include_attr, objnameset);
3235 if (
true == include_attr) {
3236 Handle_EOS5CVar_AttrNameClashing();
3245 void EOS5File::Handle_EOS5CVar_NameClashing(set<string> &objnameset)
3248 BESDEBUG(
"h5",
"Coming to Handle_EOS5CVar_NameClashing()"<<endl);
3249 EOS5Handle_General_NameClashing(objnameset, this->cvars);
3253 void EOS5File::Handle_EOS5CVar_AttrNameClashing()
3256 BESDEBUG(
"h5",
"Coming to Handle_EOS5CVar_AttrNameClashing()"<<endl);
3257 set<string> objnameset;
3259 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
3260 Handle_General_NameClashing(objnameset, (*irv)->attrs);
3266 template<
class T>
void EOS5File::EOS5Handle_General_NameClashing(set<string>&objnameset, vector<T*>& objvec)
3270 BESDEBUG(
"h5",
"Coming to EOS5Handle_General_NameClashing()"<<endl);
3271 pair<set<string>::iterator,
bool> setret;
3272 set<string>::iterator iss;
3274 vector<string> clashnamelist;
3275 vector<string>::iterator ivs;
3277 map<int, int> cl_to_ol;
3281 typename vector<T*>::iterator irv;
3283 for (irv = objvec.begin(); irv != objvec.end(); ++irv) {
3285 setret = objnameset.insert((*irv)->newname);
3286 if (!setret.second) {
3287 clashnamelist.insert(clashnamelist.end(), (*irv)->newname);
3288 cl_to_ol[cl_index] = ol_index;
3296 for (ivs = clashnamelist.begin(); ivs != clashnamelist.end(); ++ivs) {
3297 int clash_index = 1;
3298 string temp_clashname = *ivs +
'_';
3299 HDF5CFUtil::gen_unique_name(temp_clashname, objnameset, clash_index);
3300 *ivs = temp_clashname;
3304 for (
unsigned int i = 0; i < clashnamelist.size(); i++)
3305 objvec[cl_to_ol[i]]->newname = clashnamelist[i];
3310 void EOS5File::Handle_DimNameClashing()
3313 BESDEBUG(
"h5",
"Coming to Handle_DimNameClashing()"<<endl);
3314 map<string, string> dimname_to_dimnewname;
3315 pair<map<string, string>::iterator,
bool> mapret;
3316 set<string> dimnameset;
3317 vector<Dimension*> vdims;
3318 set<string> dimnewnameset;
3319 pair<set<string>::iterator,
bool> setret;
3322 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
3323 for (vector<Dimension *>::iterator ird = (*irv)->dims.begin(); ird != (*irv)->dims.end(); ++ird) {
3327 setret = dimnameset.insert((*ird)->name);
3328 if (setret.second) vdims.push_back(*ird);
3336 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
3337 for (vector<Dimension *>::iterator ird = (*irv)->dims.begin(); ird != (*irv)->dims.end(); ++ird) {
3341 setret = dimnameset.insert((*ird)->name);
3342 if (setret.second) vdims.push_back(*ird);
3347 for (vector<Dimension*>::iterator ird=vdims.begin();ird!=vdims.end();++ird)
3348 cerr<<
"dimension name "<<(*ird)->name <<endl;
3353 EOS5Handle_General_NameClashing(dimnewnameset, vdims);
3356 for (vector<Dimension*>::iterator ird = vdims.begin(); ird != vdims.end(); ++ird) {
3357 mapret = dimname_to_dimnewname.insert(pair<string, string>((*ird)->name, (*ird)->newname));
3358 if (
false == mapret.second)
3359 throw4(
"The dimension name ", (*ird)->name,
" should map to ", (*ird)->newname);
3363 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv)
3364 for (vector<Dimension *>::iterator ird = (*irv)->dims.begin(); ird != (*irv)->dims.end(); ++ird)
3365 (*ird)->newname = dimname_to_dimnewname[(*ird)->name];
3367 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv)
3368 for (vector<Dimension *>::iterator ird = (*irv)->dims.begin(); ird != (*irv)->dims.end(); ++ird)
3369 (*ird)->newname = dimname_to_dimnewname[(*ird)->name];
3375 void EOS5File::Set_COARDS_Status()
3378 BESDEBUG(
"h5",
"Coming to Set_COARDS_Status()"<<endl);
3380 for (vector<EOS5CFGrid *>::iterator irg = this->eos5cfgrids.begin(); irg != this->eos5cfgrids.end(); ++irg) {
3381 if (
false == (*irg)->has_1dlatlon) {
3382 if (
false == (*irg)->has_nolatlon || (HE5_GCTP_GEO != (*irg)->eos5_projcode)) iscoard =
false;
3387 if (
true == iscoard) {
3388 for (vector<EOS5CFSwath *>::iterator irg = this->eos5cfswaths.begin(); irg != this->eos5cfswaths.end(); ++irg) {
3389 if (
false == (*irg)->has_1dlatlon) {
3398 void EOS5File::Adjust_Attr_Info()
3401 BESDEBUG(
"h5",
"Coming to Adjust_Attr_Info()"<<endl);
3402 if (
true == this->isaura) {
3403 Adjust_Aura_Attr_Name();
3404 Adjust_Aura_Attr_Value();
3407 Handle_EOS5CVar_Unit_Attr();
3408 Add_EOS5_Grid_CF_Attr();
3413 void EOS5File::Adjust_Aura_Attr_Name()
3416 BESDEBUG(
"h5",
"Coming to Adjust_Attr_Name() for Aura"<<endl);
3417 for (vector<Var*>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
3418 for (vector<Attribute*>::iterator ira = (*irv)->attrs.begin(); ira != (*irv)->attrs.end(); ++ira) {
3419 if (eos5_to_cf_attr_map.find((*ira)->name) != eos5_to_cf_attr_map.end()) (*ira)->newname =
3420 eos5_to_cf_attr_map[(*ira)->name];
3425 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
3426 for (vector<Attribute*>::iterator ira = (*irv)->attrs.begin(); ira != (*irv)->attrs.end(); ++ira) {
3427 if (eos5_to_cf_attr_map.find((*ira)->name) != eos5_to_cf_attr_map.end()) (*ira)->newname =
3428 eos5_to_cf_attr_map[(*ira)->name];
3434 void EOS5File::Adjust_Aura_Attr_Value()
3437 BESDEBUG(
"h5",
"Coming to Adjust_Attr_Value() for Aura"<<endl);
3439 Handle_EOS5CVar_Unit_Attr();
3440 Handle_Aura_Special_Attr();
3445 string time_cf_units_value =
"seconds since 1993-01-01";
3446 for (vector<Var*>::iterator irv = this->vars.begin(); irv != this->vars.end(); irv++) {
3447 if (((*irv)->name ==
"Time") || ((*irv)->name ==
"nTimes")) {
3448 for (vector<Attribute*>::iterator ira = (*irv)->attrs.begin(); ira != (*irv)->attrs.end(); ira++) {
3449 if (
"units" == (*ira)->name) {
3450 Retrieve_H5_Attr_Value(*ira, (*irv)->fullpath);
3451 string units_value((*ira)->value.begin(), (*ira)->value.end());
3452 if (time_cf_units_value != units_value) {
3454 units_value = time_cf_units_value;
3455 (*ira)->value.resize(units_value.size());
3456 if (H5FSTRING == (*ira)->dtype) (*ira)->fstrsize = units_value.size();
3458 (*ira)->strsize.resize(1);
3459 (*ira)->strsize[0] = units_value.size();
3461 copy(units_value.begin(), units_value.end(), (*ira)->value.begin());
3471 void EOS5File::Handle_Aura_Special_Attr()
3474 BESDEBUG(
"h5",
"Coming to Handle_Aura_Special_Attr()"<<endl);
3476 if (
true == this->isaura && MLS == this->aura_name) {
3478 const string File_attr_group_path =
"/HDFEOS/ADDITIONAL/FILE_ATTRIBUTES";
3479 const string PCF1_attr_name =
"PCF1";
3480 bool find_group =
false;
3481 bool find_attr =
false;
3482 for (vector<Group*>::iterator it_g = this->groups.begin(); it_g != this->groups.end(); ++it_g) {
3483 if (File_attr_group_path == (*it_g)->path) {
3485 for (vector<Attribute *>::iterator ira = (*it_g)->attrs.begin(); ira != (*it_g)->attrs.end(); ++ira) {
3486 if (PCF1_attr_name == (*ira)->name) {
3487 Retrieve_H5_Attr_Value(*ira, (*it_g)->path);
3488 string pcf_value((*ira)->value.begin(), (*ira)->value.end());
3489 HDF5CFDAPUtil::replace_double_quote(pcf_value);
3490 (*ira)->value.resize(pcf_value.size());
3491 if (H5FSTRING == (*ira)->dtype) (*ira)->fstrsize = pcf_value.size();
3493 (*ira)->strsize.resize(1);
3494 (*ira)->strsize[0] = pcf_value.size();
3496 copy(pcf_value.begin(), pcf_value.end(), (*ira)->value.begin());
3502 if (
true == find_group &&
true == find_attr)
break;
3508 void EOS5File::Handle_EOS5CVar_Unit_Attr()
3511 BESDEBUG(
"h5",
"Coming to Handle_EOS5CVar_Unit_Attr()"<<endl);
3512 string unit_attrname =
"units";
3513 string nonll_cf_level_attrvalue =
"level";
3514 string lat_cf_unit_attrvalue =
"degrees_north";
3515 string lon_cf_unit_attrvalue =
"degrees_east";
3516 string tes_cf_pre_attrvalue =
"hPa";
3518 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
3519 switch ((*irv)->cvartype) {
3522 for (vector<Attribute*>::iterator ira = (*irv)->attrs.begin(); ira != (*irv)->attrs.end(); ++ira) {
3523 if ((*ira)->newname == unit_attrname) {
3524 Retrieve_H5_Attr_Value(*ira, (*irv)->fullpath);
3525 string units_value((*ira)->value.begin(), (*ira)->value.end());
3526 if ((lat_cf_unit_attrvalue != units_value)
3527 && (((*irv)->name ==
"Latitude") || ((this->eos5cfzas.size() > 0) && ((*irv)->name ==
"nLats")))) {
3528 units_value = lat_cf_unit_attrvalue;
3533 (*ira)->value.resize(units_value.size());
3534 if (H5FSTRING == (*ira)->dtype) (*ira)->fstrsize = units_value.size();
3536 (*ira)->strsize.resize(1);
3537 (*ira)->strsize[0] = units_value.size();
3538 copy(units_value.begin(), units_value.end(), (*ira)->value.begin());
3540 else if ((lon_cf_unit_attrvalue != units_value) && (*irv)->name ==
"Longitude") {
3541 units_value = lon_cf_unit_attrvalue;
3542 (*ira)->value.resize(units_value.size());
3543 if (H5FSTRING == (*ira)->dtype) (*ira)->fstrsize = units_value.size();
3545 (*ira)->strsize.resize(1);
3546 (*ira)->strsize[0] = units_value.size();
3548 copy(units_value.begin(), units_value.end(), (*ira)->value.begin());
3558 Add_Str_Attr(attr, unit_attrname, lat_cf_unit_attrvalue);
3559 (*irv)->attrs.push_back(attr);
3565 Add_Str_Attr(attr, unit_attrname, lon_cf_unit_attrvalue);
3566 (*irv)->attrs.push_back(attr);
3570 case CV_NONLATLON_MISS: {
3572 Add_Str_Attr(attr, unit_attrname, nonll_cf_level_attrvalue);
3573 (*irv)->attrs.push_back(attr);
3577 if (
true == this->isaura && TES == this->aura_name) {
3579 Add_Str_Attr(attr, unit_attrname, tes_cf_pre_attrvalue);
3580 (*irv)->attrs.push_back(attr);
3585 throw1(
"Non-supported Coordinate Variable Type.");
3590 void EOS5File::Add_EOS5_Grid_CF_Attr()
3592 BESDEBUG(
"h5",
"Coming to Add_EOS5_Grid_CF_Attr()"<<endl);
3594 bool has_eos5_grid_nongeo_proj =
false;
3597 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
3598 if ((*irv)->cvartype == CV_LAT_MISS) {
3599 if((*irv)->eos5_projcode !=HE5_GCTP_GEO) {
3600 has_eos5_grid_nongeo_proj =
true;
3607 if(
true == has_eos5_grid_nongeo_proj) {
3608 string conventions_attrname =
"Conventions";
3609 string conventions_attrvalue =
"CF-1.7";
3610 bool has_conventions_attr=
false;
3611 for(vector<HDF5CF::Attribute *>::const_iterator it_ra=this->root_attrs.begin();
3612 it_ra!=this->root_attrs.end();it_ra++) {
3613 if((*it_ra)->name==conventions_attrname){
3614 has_conventions_attr =
true;
3619 if(
false==has_conventions_attr) {
3621 Add_Str_Attr(attr,conventions_attrname,conventions_attrvalue);
3622 this->root_attrs.push_back(attr);
3631 void EOS5File::Adjust_Dim_Name()
3634 BESDEBUG(
"h5",
"Coming to Adjust_Dim_Name()"<<endl);
3636 if (
false == this->iscoard)
3639 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); irv++) {
3640 if ((*irv)->dims.size() != 1)
3641 throw3(
"Coard coordinate variable ", (*irv)->name,
"is not 1D");
3642 if ((*irv)->newname != (((*irv)->dims)[0]->newname)) {
3643 ((*irv)->dims)[0]->newname = (*irv)->newname;
3646 for (vector<Var*>::iterator irv2 = this->vars.begin(); irv2 != this->vars.end(); irv2++) {
3647 for (vector<Dimension *>::iterator ird = (*irv2)->dims.begin(); ird != (*irv2)->dims.end(); ird++) {
3652 if ((*ird)->name == ((*irv)->dims)[0]->name) (*ird)->newname = ((*irv)->dims)[0]->newname;
3661 void EOS5File::Add_Supplement_Attrs(
bool add_path)
3664 BESDEBUG(
"h5",
"Coming to Add_Supplement_Attrs()"<<endl);
3665 if (
true == add_path) {
3667 File::Add_Supplement_Attrs(add_path);
3670 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
3671 if (((*irv)->cvartype == CV_EXIST) || ((*irv)->cvartype == CV_MODIFY)) {
3673 const string varname = (*irv)->name;
3674 const string attrname =
"origname";
3675 Add_Str_Attr(attr, attrname, varname);
3676 (*irv)->attrs.push_back(attr);
3680 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
3681 if (((*irv)->cvartype == CV_EXIST) || ((*irv)->cvartype == CV_MODIFY)) {
3683 const string varname = (*irv)->fullpath;
3684 const string attrname =
"fullnamepath";
3685 Add_Str_Attr(attr, attrname, varname);
3686 (*irv)->attrs.push_back(attr);
3691 if (
true == this->iscoard) {
3692 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin(); irv != this->cvars.end(); ++irv) {
3693 if (((*irv)->cvartype == CV_EXIST) || ((*irv)->cvartype == CV_MODIFY)) {
3695 const string attrname =
"orig_dimname";
3696 string orig_dimname = (((*irv)->dims)[0])->name;
3697 orig_dimname = HDF5CFUtil::obtain_string_after_lastslash(orig_dimname);
3698 if (
"" == orig_dimname)
3699 throw2(
"wrong dimension name ", orig_dimname);
3700 if (orig_dimname.find(
"FakeDim") != string::npos) orig_dimname =
"";
3701 Add_Str_Attr(attr, attrname, orig_dimname);
3702 (*irv)->attrs.push_back(attr);
3706 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
3708 if ((*irv)->dims.size() > 0) {
3710 if (1 == (*irv)->dims.size()) {
3711 const string attrname =
"orig_dimname";
3712 string orig_dimname = (((*irv)->dims)[0])->name;
3713 if (
"" == orig_dimname)
3714 orig_dimname =
"NoDimName";
3716 orig_dimname = HDF5CFUtil::obtain_string_after_lastslash(orig_dimname);
3717 if (orig_dimname.find(
"FakeDim") != string::npos) orig_dimname =
"NoDimName";
3718 Add_Str_Attr(attr, attrname, orig_dimname);
3721 const string attrname =
"orig_dimname_list";
3722 string orig_dimname_list;
3723 for (vector<Dimension *>::iterator ird = (*irv)->dims.begin(); ird != (*irv)->dims.end(); ++ird) {
3724 string orig_dimname = (*ird)->name;
3725 if (
"" == orig_dimname)
3726 orig_dimname =
"NoDimName";
3728 orig_dimname = HDF5CFUtil::obtain_string_after_lastslash((*ird)->name);
3729 if (orig_dimname.find(
"FakeDim") != string::npos) orig_dimname =
"NoDimName";
3730 if (
"" == orig_dimname_list)
3731 orig_dimname_list = orig_dimname;
3733 orig_dimname_list = orig_dimname_list +
" " + orig_dimname;
3736 Add_Str_Attr(attr, attrname, orig_dimname_list);
3738 (*irv)->attrs.push_back(attr);
3746 void EOS5File::Handle_Coor_Attr()
3749 BESDEBUG(
"h5",
"Coming to Handle_Coor_Attr()"<<endl);
3750 string co_attrname =
"coordinates";
3751 string co_attrvalue =
"";
3753 if (iscoard)
return;
3755 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
3757 for (vector<Dimension *>::iterator ird = (*irv)->dims.begin(); ird != (*irv)->dims.end(); ++ird) {
3758 for (vector<EOS5CVar *>::iterator ircv = this->cvars.begin(); ircv != this->cvars.end(); ++ircv) {
3759 if ((*ird)->name == (*ircv)->cfdimname)
3760 co_attrvalue = (co_attrvalue.empty()) ? (*ircv)->newname : co_attrvalue +
" " + (*ircv)->newname;
3763 if (
false == co_attrvalue.empty()) {
3765 Add_Str_Attr(attr, co_attrname, co_attrvalue);
3766 (*irv)->attrs.push_back(attr);
3768 co_attrvalue.clear();
3772 bool has_2dlatlon_cv =
false;
3773 for (vector<EOS5CVar *>::iterator ircv = this->cvars.begin(); ircv != this->cvars.end(); ++ircv) {
3774 if (
true == (*ircv)->is_2dlatlon) {
3775 has_2dlatlon_cv =
true;
3780 if (
true == has_2dlatlon_cv) {
3784 for (vector<EOS5CVar *>::iterator ircv = this->cvars.begin(); ircv != this->cvars.end(); ++ircv) {
3785 if (
true == (*ircv)->is_2dlatlon) {
3786 dimname1 = (((*ircv)->dims)[0])->name;
3787 dimname2 = (((*ircv)->dims)[1])->name;
3792 int num_latlondims = 0;
3794 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
3795 for (vector<Dimension *>::iterator ird = (*irv)->dims.begin(); ird != (*irv)->dims.end(); ++ird) {
3796 if (dimname1 == (*ird)->name) num_latlondims++;
3797 if (dimname2 == (*ird)->name) num_latlondims++;
3799 if ((num_latlondims != 0) && (num_latlondims != 2)) {
3801 for (vector<Attribute *>::iterator ira = (*irv)->attrs.begin(); ira != (*irv)->attrs.end(); ++ira) {
3802 if (co_attrname == (*ira)->name) {
3804 (*irv)->attrs.erase(ira);
3817 void EOS5File::Adjust_Special_EOS5CVar_Name() {
3819 int num_grids =this->eos5cfgrids.size();
3820 int num_swaths = this->eos5cfswaths.size();
3821 int num_zas = this->eos5cfzas.size();
3823 bool mixed_eos5typefile =
false;
3826 if (((num_grids > 0) && (num_swaths > 0)) ||
3827 ((num_grids > 0) && (num_zas > 0)) ||
3828 ((num_swaths >0) && (num_zas > 0)))
3829 mixed_eos5typefile =
true;
3831 if (
false == mixed_eos5typefile) {
3836 if ((1 == num_swaths) || ( 1 == num_zas) ||
3837 (1 == num_grids) || ((num_grids >1) && (this->grids_multi_latloncvs))) {
3839 string unit_attrname =
"units";
3840 string nonll_cf_level_attralue =
"level";
3841 string lat_cf_unit_attrvalue =
"degrees_north";
3842 string lon_cf_unit_attrvalue =
"degrees_east";
3844 for (vector<EOS5CVar *>::iterator irv = this->cvars.begin();
3845 irv != this->cvars.end(); irv++) {
3846 switch((*irv)->eos_type) {
3852 for(vector <Attribute*>::iterator ira = (*irv)->attrs.begin();
3853 ira != (*irv)->attrs.end(); ira++) {
3854 if ((*ira)->name ==unit_attrname) {
3855 if ((*ira)->value.size() > 0) {
3856 string units_value((*ira)->value.begin(),(*ira)->value.end());
3857 if (lat_cf_unit_attrvalue ==units_value) (*irv)->newname =
"lat";
3858 if (lon_cf_unit_attrvalue ==units_value) (*irv)->newname =
"lon";
3864 case CV_NONLATLON_MISS:
3866 for(vector <Attribute*>::iterator ira = (*irv)->attrs.begin();
3867 ira != (*irv)->attrs.end(); ira++) {
3868 if ((*ira)->name ==unit_attrname) {
3869 if ((*ira)->value.size() > 0) {
3870 string units_value((*ira)->value.begin(),(*ira)->value.end());
3871 if (nonll_cf_level_attralue ==units_value) {
3872 (*irv)->newname =
"lev";
3881 throw1(
"Non-supported coordinate variable type");
3894 void EOS5File::Create_Missing_CV(T* eos5data,
EOS5CVar *EOS5cvar,
const string& dimname, EOS5Type eos5type,
3898 BESDEBUG(
"h5",
"Coming to Create_Missing_CV()"<<endl);
3899 string reduced_dimname = HDF5CFUtil::obtain_string_after_lastslash(dimname);
3900 if (
"" == reduced_dimname) throw2(
"wrong dimension name ", dimname);
3901 EOS5cvar->name = reduced_dimname;
3902 Create_Added_Var_NewName_FullPath(eos5type, eos5data->name, EOS5cvar->name, EOS5cvar->newname, EOS5cvar->fullpath);
3904 EOS5cvar->dtype = H5INT32;
3905 hsize_t eos5cvar_dimsize = (eos5data->dimnames_to_dimsizes)[dimname];
3907 eos5cvar_dim->name = dimname;
3908 eos5cvar_dim->unlimited_dim = (eos5data->dimnames_to_unlimited)[dimname];
3909 if (1 == num_eos5data)
3910 eos5cvar_dim->newname = reduced_dimname;
3912 eos5cvar_dim->newname = dimname;
3914 EOS5cvar->dims.push_back(eos5cvar_dim);
3915 EOS5cvar->cfdimname = dimname;
3916 EOS5cvar->cvartype = CV_NONLATLON_MISS;
3917 EOS5cvar->eos_type = eos5type;
3921 void EOS5File::Create_Added_Var_NewName_FullPath(EOS5Type eos5type,
const string& eos5_groupname,
const string& varname,
3922 string &var_newname,
string &var_fullpath)
3925 BESDEBUG(
"h5",
"Coming to Create_Added_Var_NewName_FullPath()"<<endl);
3926 string fslash_str =
"/";
3927 string eos5typestr =
"";
3928 string top_eos5_groupname =
"/HDFEOS";
3932 eos5typestr =
"/GRIDS/";
3933 var_newname = eos5typestr + eos5_groupname + fslash_str + varname;
3934 var_fullpath = top_eos5_groupname + eos5typestr + eos5_groupname + fslash_str + varname;
3939 eos5typestr =
"/SWATHS/";
3940 var_newname = eos5typestr + eos5_groupname + fslash_str + varname;
3941 var_fullpath = top_eos5_groupname + eos5typestr + eos5_groupname + fslash_str + varname;
3947 eos5typestr =
"/ZAS/";
3948 var_newname = eos5typestr + eos5_groupname + fslash_str + varname;
3949 var_fullpath = top_eos5_groupname + eos5typestr + eos5_groupname + fslash_str + varname;
3955 throw1(
"Non-supported EOS type");
3960 void EOS5File::Handle_SpVar()
3963 BESDEBUG(
"h5",
"Coming to Handle_SpVar()"<<endl);
3964 if (
true == this->isaura && TES == this->aura_name) {
3965 const string ProHist_full_path =
"/HDFEOS/ADDITIONAL/FILE_ATTRIBUTES/ProductionHistory";
3966 for (vector<Var *>::iterator irv = this->vars.begin(); irv != this->vars.end(); ++irv) {
3967 if (ProHist_full_path == (*irv)->fullpath) {
3969 this->vars.erase(irv);
3976 if (dimname_to_dupdimnamelist.size() > 0) {
3977 for (vector<EOS5CVar *>::iterator ircv = this->cvars.begin(); ircv != this->cvars.end(); ircv++) {
3978 if ((*ircv)->cvartype == CV_EXIST) {
3979 pair<multimap<string, string>::iterator, multimap<string, string>::iterator> mm_er_ret;
3980 multimap<string, string>::iterator itmm;
3981 for (itmm = dimname_to_dupdimnamelist.begin(); itmm != dimname_to_dupdimnamelist.end(); ++itmm) {
3984 if ((*ircv)->cfdimname == (*itmm).first) {
3987 for (vector<EOS5CVar *>::iterator irv2 = this->cvars.begin(); irv2 != this->cvars.end();
3989 if ((*irv2)->cvartype == CV_NONLATLON_MISS) {
3993 if ((*irv2)->cfdimname == (*itmm).second) {
3996 string dup_var_name = (*irv2)->newname;
3997 Replace_Var_Info((*ircv), (*irv2));
4000 (*irv2)->newname = dup_var_name;
4001 (*irv2)->getDimensions()[0]->newname = dup_var_name;
4015 for (vector<Var *>::iterator irv = this->vars.begin();
4016 irv != this->vars.end(); ++irv) {
4019 if((*irv)->rank >=2) {
4021 for (vector<Dimension *>::iterator ird = (*irv)->dims.begin();
4022 ird != (*irv)->dims.end(); ++ ird) {
4023 pair<multimap<string,string>::iterator,multimap<string,string>::iterator> mm_er_ret;
4024 multimap<string,string>::iterator itmm;
4025 for (itmm = dimname_to_dupdimnamelist.begin(); itmm!=dimname_to_dupdimnamelist.end();++itmm) {
4029 cerr<<
"duplicate dimension name of a variable is "<<(*ird)->name <<endl;
4039 if((*itmm).second == (*ird)->name) {
4040 cerr<<
"coming to find the duplicate dim. name "<<endl;
4041 for (vector<EOS5CVar *>::iterator ircv = this->cvars.begin();
4042 ircv != this->cvars.end(); ircv++) {
4043 if((*ircv)->cvartype == CV_EXIST) {
4044 cerr<<
"cf dim. name is "<<(*ircv)->cfdimname <<endl;
4046 if((*ircv)->cfdimname == (*itmm).first) {
4048 for (vector<EOS5CVar *>::iterator irv2 = this->cvars.begin();
4049 irv2 != this->cvars.end(); irv2++) {
4050 if((*irv2)->cvartype == CV_NONLATLON_MISS) {
4052 if((*irv2)->cfdimname == (*itmm).second) {
4053 string dup_var_name = (*irv2)->newname;
4054 Replace_Var_Info((*ircv),(*irv2));
4055 (*irv2)->newname = dup_var_name;
4056 (*irv2)->getDimensions()[0]->newname = dup_var_name;
4082 void EOS5File::Handle_SpVar_Attr()
4085 BESDEBUG(
"h5",
"Coming to Handle_SpVar_Attr()"<<endl);
4088 if (dimname_to_dupdimnamelist.size() > 0) {
4090 pair<multimap<string, string>::iterator, multimap<string, string>::iterator> mm_er_ret;
4091 multimap<string, string>::iterator itmm;
4092 for (itmm = dimname_to_dupdimnamelist.begin(); itmm != dimname_to_dupdimnamelist.end(); ++itmm) {
4093 for (vector<EOS5CVar *>::iterator ircv = this->cvars.begin(); ircv != this->cvars.end(); ircv++) {
4095 if ((*ircv)->cvartype == CV_EXIST) {
4098 if ((*ircv)->cfdimname == (*itmm).first) {
4102 for (vector<EOS5CVar *>::iterator irv2 = this->cvars.begin(); irv2 != this->cvars.end();
4104 if ((*irv2)->cvartype == CV_NONLATLON_MISS) {
4108 if ((*irv2)->cfdimname == (*itmm).second) Replace_Var_Attrs((*ircv), (*irv2));
4118 void EOS5File::Adjust_Obj_Name()
4123 bool EOS5File::Have_Grid_Mapping_Attrs() {
4124 return File::Have_Grid_Mapping_Attrs();
4126 void EOS5File::Handle_Grid_Mapping_Vars() {
4127 File:: Handle_Grid_Mapping_Vars();
4135 BESDEBUG(
"h5",
"Coming to Replace_Var_Info()"<<endl);
4136 File::Replace_Var_Info(src, target);
4137 target->cfdimname = src->cfdimname;
4138 target->cvartype = src->cvartype;
4139 target->eos_type = src->eos_type;
4140 target->total_elems = src->total_elems;
4148 BESDEBUG(
"h5",
"Coming to Replace_Var_Attrs()"<<endl);
4149 File::Replace_Var_Attrs(src, target);
4155 EOS5File:: add_ignored_info_attrs(
bool is_grp,
bool is_first) {
4159 EOS5File:: add_ignored_info_objs(
bool is_dim_related,
bool is_first) {
This class represents one HDF5 dataset(CF variable)
#define throw1(a1)
The followings are convenient functions to throw exceptions with different.
This class simulates an HDF-EOS5 Swath.
double point_lower
The bottom coordinate value of a Grid.
double point_right
The rightmost coordinate value of a Grid.
double point_left
The leftmost coordinate value of a Grid.
This class is a derived class of CVar. It represents a coordinate variable for HDF-EOS5 files.
double point_upper
The top coordinate value of a Grid.
include the entry functions to execute the handlers
This class simulates an HDF-EOS5 Zonal average object.
This class represents one attribute.
Helper functions for generating DAS attributes and a function to check BES Key.
This class simulates an HDF-EOS5 Grid. Currently only geographic projection is supported.
This class repersents one dimension of an HDF5 dataset(variable).
This class represents an HDF5 group. The group will be flattened according to the CF conventions.
This class specifies the core engineering of mapping HDF5 to DAP by following CF.