def _create_variables(rootgrp, vname_map): """ Create all variables Params : rootgrp : netcdf filehandle vname_map : list of BUFR info objects Output : nc_vars : dict netcdf variable name and variable object """ logger.debug("Creating variables") nc_vars = {} for key, ncvar_params in vname_map.iteritems(): # only try to convert variables that define a netcdf_name parameter try: # don't try to write to netcdf file if name is not defined ncvar_name = ncvar_params['netcdf_name'] except KeyError: continue # Guard ... dimension names cannot also be used at variable names if ncvar_name in rootgrp.dimensions: raise ValueError("Variable name %s also used as dimension name" %\ ncvar_name) try: var_type = ncvar_params['var_type'] if var_type not in ['int', 'float', 'str', 'double', 'long']: raise BUFR2NetCDFError("Not a valid type %s" % var_type) except KeyError: raise BUFR2NetCDFError("Not a valid type %s" % var_type) #FIXME VARIABLE DIM CONFLICT try: fillvalue = ncvar_params['netcdf__FillValue'] except KeyError: fillvalue = None record = 'record' try: record = ncvar_params['netcdf_dimension_name_unlim'] except KeyError: pass try: # variable can be packed into a scalar if ncvar_params['packable_1dim'] and ncvar_params['packable_2dim']: nc_vars[key] = rootgrp.createVariable( ncvar_name, netcdf_datatype(ncvar_params['var_type']), ('scalar', ), fill_value=eval(var_type)(fillvalue), zlib=True, least_significant_digit=3) # variable can be packed into a scanline vector elif ncvar_params['packable_1dim']: nc_vars[key] = rootgrp.createVariable( ncvar_name, netcdf_datatype(ncvar_params['var_type']), (ncvar_params['netcdf_dimension_name'], ), fill_value=eval(var_type)(fillvalue), zlib=True, least_significant_digit=3) # variable can be packed into a per scanline vector elif ncvar_params['packable_2dim']: nc_vars[key] = rootgrp.createVariable( ncvar_name, netcdf_datatype(ncvar_params['var_type']), (record, ), fill_value=eval(var_type)(fillvalue), zlib=True, least_significant_digit=3) # variable can't be packed else: nc_vars[key] = rootgrp.createVariable( ncvar_name, netcdf_datatype(ncvar_params['var_type']), (record, ncvar_params['netcdf_dimension_name']), fill_value=eval(var_type)(fillvalue), zlib=True, least_significant_digit=3) setattr(nc_vars[key], 'unit', ncvar_params['netcdf_unit']) if 'netcdf_long_name' in ncvar_params: setattr(nc_vars[key], 'long_name', ncvar_params['netcdf_long_name']) # append attribute to track bufr replication if 'bufr_replication' in ncvar_params: setattr(nc_vars[key], 'bufr_replication_factor', ncvar_params['bufr_replication']) except KeyError, key_exception: logger.exception("Unable to find netcdf conversion, parameters")
def _create_variables(rootgrp, vname_map): """ Create all variables Params : rootgrp : netcdf filehandle vname_map : list of BUFR info objects Output : nc_vars : dict netcdf variable name and variable object """ nc_vars = {} for key, ncvar_params in vname_map.iteritems(): # only try to convert variables that define a netcdf_name parameter try: # don't try to write to netcdf file if name is not defined ncvar_name = ncvar_params['netcdf_name'] except KeyError: continue # Guard ... dimension names cannot also be used at variable names if ncvar_name in rootgrp.dimensions: raise ValueError("Variable name %s also used as dimension name" %\ ncvar_name) try: var_type = ncvar_params['var_type'] if var_type not in ['int', 'float', 'str', 'double', 'long']: raise BUFR2NetCDFError("Not a valid type %s" % var_type ) except KeyError: raise BUFR2NetCDFError("Not a valid type %s" % var_type ) #FIXME VARIABLE DIM CONFLICT try: fillvalue = ncvar_params['netcdf__FillValue'] except KeyError: fillvalue = None record = 'record' try: record = ncvar_params['netcdf_dimension_name_unlim'] except KeyError: pass try: # variable can be packed into a scalar if ncvar_params['packable_1dim'] and ncvar_params['packable_2dim']: nc_vars[key] = rootgrp.createVariable( ncvar_name, netcdf_datatype(ncvar_params['var_type']) , ('scalar',), fill_value=eval(var_type)(fillvalue), zlib=False,least_significant_digit=3 ) # variable can be packed into a scanline vector elif ncvar_params['packable_1dim']: nc_vars[key] = rootgrp.createVariable( ncvar_name, netcdf_datatype(ncvar_params['var_type']) , (ncvar_params['netcdf_dimension_name'] ,), fill_value=eval(var_type)(fillvalue), zlib=False,least_significant_digit=3 ) # variable can be packed into a per scanline vector elif ncvar_params['packable_2dim']: nc_vars[key] = rootgrp.createVariable( ncvar_name, netcdf_datatype(ncvar_params['var_type']) , ('record',), fill_value=eval(var_type)(fillvalue), zlib=False,least_significant_digit=3 ) # variable can't be packed else: nc_vars[key] = rootgrp.createVariable( ncvar_name, netcdf_datatype(ncvar_params['var_type']) , ('record', ncvar_params['netcdf_dimension_name'] ), fill_value=eval(var_type)(fillvalue), zlib=False,least_significant_digit=3 ) setattr(nc_vars[key], 'unit', ncvar_params['netcdf_unit'] ) if 'netcdf_long_name' in ncvar_params: setattr(nc_vars[key], 'long_name', ncvar_params['netcdf_long_name']) # append attribute to track bufr replication if 'bufr_replication' in ncvar_params: setattr(nc_vars[key], 'bufr_replication_factor', ncvar_params['bufr_replication']) except KeyError, key_exception: logger.exception("Unable to find netcdf conversion, parameters")
def _create_variables(ncf, vname_map): """ Create all variables Params : ncf : netcdf filehandle vname_map : list of BUFR info objects Output : nc_vars : dict netcdf variable name and variable object """ nc_vars = {} for key, ncvar_params in vname_map.iteritems(): # only try to convert variables that define a netcdf_name parameter try: # don't try to write to netcdf file if name is not defined ncvar_name = ncvar_params['netcdf_name'] except KeyError: continue try: # variable can be packed into a scalar if ncvar_params['packable_1dim'] and ncvar_params['packable_2dim']: nc_vars[key] = ncf.createVariable( ncvar_name, netcdf_datatype(ncvar_params['var_type']) , ('scalar',)) # variable can be packed into a scanline vector elif ncvar_params['packable_1dim']: nc_vars[key] = ncf.createVariable( ncvar_name, netcdf_datatype(ncvar_params['var_type']) , (ncvar_params['netcdf_dimension_name'] ,)) # variable can be packed into a per scanline vector elif ncvar_params['packable_2dim']: nc_vars[key] = ncf.createVariable( ncvar_name, netcdf_datatype(ncvar_params['var_type']) , ('record',)) # variable can't be packed else: nc_vars[key] = ncf.createVariable( ncvar_name, netcdf_datatype(ncvar_params['var_type']) , ('record', ncvar_params['netcdf_dimension_name'] )) setattr(nc_vars[key], 'unit', ncvar_params['netcdf_unit'] ) var_type = ncvar_params['var_type'] if var_type not in ['int', 'float', 'str', 'double', 'long']: print "no valid type defined" return fillvalue = ncvar_params['netcdf__FillValue'] setattr(nc_vars[key], '_FillValue', eval(var_type)(fillvalue)) if 'netcdf_long_name' in ncvar_params: setattr(nc_vars[key], 'long_name', ncvar_params['netcdf_long_name']) except KeyError, key_exception: traceback.print_exc(file=sys.stdout) print key_exception