def _add_available_aux_coords(self, cube, filenames): """ Add any altitude or pressure Auxiliary coordinates that IRIS does not load by default. :type cube: data_io.gridded_data.GriddedData :type filenames: list :return: """ from iris.coords import AuxCoord def _make_aux_coord_and_dims_from_geopotential(g_cube): from scipy.constants import g points = g_cube.data / g dims = list(range(len(g_cube.shape))) coord = AuxCoord( points=points, standard_name='altitude', long_name='Geopotential height at layer midpoints', var_name='altitude', units='meter', attributes={'positive': 'up'}) return coord, dims def _make_aux_coord_and_dims_from_geopotential_height(g_ht_cube): dims = list(range(len(g_ht_cube.shape))) coord = AuxCoord( points=g_ht_cube.data, standard_name='altitude', long_name='Geopotential height at layer midpoints', var_name='altitude', units='meter', attributes={'positive': 'up'}) return coord, dims def _make_aux_coord_and_dims_from_air_pressure(aps_cube): dims = list(range(len(aps_cube.shape))) coord = AuxCoord(points=aps_cube.data, standard_name='air_pressure', long_name='Air Pressure', var_name='air_pressure', units='Pa') return coord, dims aux_coord_creation_functions = { 'geopotential': _make_aux_coord_and_dims_from_geopotential, 'geopotential_height': _make_aux_coord_and_dims_from_geopotential_height, 'air_pressure': _make_aux_coord_and_dims_from_air_pressure } for standard_name, make_aux_coord in list( aux_coord_creation_functions.items()): constraint = DisplayConstraint( cube_func=lambda c: c.standard_name == standard_name, display=standard_name) try: aux_cube = gridded_data.load_cube(filenames, constraint) aux_coord, dims = make_aux_coord(aux_cube) cube.add_aux_coord(aux_coord, dims) except ValueError: pass # The field doesn't exist; that's OK we just won't add it.
def _create_cube(self, filenames, variable): """Creates a cube for the specified variable. :param filenames: List of filenames to read coordinates from :param variable: Optional variable to read while we're reading the coordinates, can be a string or a VariableConstraint object :return: If variable was specified this will return an UngriddedData object, otherwise a CoordList """ import six from cis.exceptions import InvalidVariableError from cis.data_io.products.gridded_NetCDF import DisplayConstraint from cis.data_io.gridded_data import load_cube from iris.exceptions import CoordinateNotFoundError # Check if the files given actually exist. for filename in filenames: with open(filename) as f: pass variable_constraint = variable if isinstance(variable, six.string_types): # noinspection PyPep8 variable_constraint = DisplayConstraint( cube_func=(lambda c: c.var_name == variable or c.standard_name == variable or c.long_name == variable), display=variable) if len(filenames) == 1: callback_function = self.load_single_file_callback else: callback_function = self.load_multiple_files_callback try: cube = load_cube(filenames, variable_constraint, callback=callback_function) except ValueError as e: if variable is None: message = "File contains more than one cube variable name must be specified" elif e.args[0] == "No cubes found": message = "Variable not found: {} \nTo see a list of variables run: cis info {}" \ .format(str(variable), filenames[0]) else: message = e.args[0] raise InvalidVariableError(message) try: hybrid_ht = cube.coord(name_or_coord='Hybrid height') hybrid_ht.attributes[ 'formula'] = 'z(k,j,i) = a(k) + b(k)*orog(j,i)' hybrid_ht.convert_units('m') except CoordinateNotFoundError as e: pass try: cube.coord(long_name='t').standard_name = 'time' except CoordinateNotFoundError as e: pass self._add_available_aux_coords(cube, filenames) return cube
def _create_cube(self, filenames, variable): """Creates a cube for the specified variable. :param filenames: List of filenames to read coordinates from :param variable: Optional variable to read while we're reading the coordinates, can be a string or a VariableConstraint object :return: If variable was specified this will return an UngriddedData object, otherwise a CoordList """ from cis.exceptions import InvalidVariableError from cis.data_io.products.gridded_NetCDF import DisplayConstraint from cis.data_io.gridded_data import load_cube from iris.exceptions import ConstraintMismatchError, CoordinateNotFoundError # Check if the files given actually exist. for filename in filenames: with open(filename) as f: pass variable_constraint = variable if isinstance(variable, basestring): # noinspection PyPep8 variable_constraint = DisplayConstraint(cube_func=(lambda c: c.var_name == variable or c.standard_name == variable or c.long_name == variable), display=variable) if len(filenames) == 1: callback_function = self.load_single_file_callback else: callback_function = self.load_multiple_files_callback try: cube = load_cube(filenames, variable_constraint, callback=callback_function) except ConstraintMismatchError as e: if variable is None: message = "File contains more than one cube variable name must be specified" elif e.message == "no cubes found": message = "Variable not found: {} \nTo see a list of variables run: cis info {}" \ .format(str(variable), filenames[0]) else: message = e.message raise InvalidVariableError(message) except ValueError as e: raise IOError(str(e)) try: hybrid_ht = cube.coord(name_or_coord='Hybrid height') hybrid_ht.attributes['formula'] = 'z(k,j,i) = a(k) + b(k)*orog(j,i)' hybrid_ht.convert_units('m') except CoordinateNotFoundError as e: pass try: cube.coord(long_name='t').standard_name = 'time' except CoordinateNotFoundError as e: pass self._add_available_aux_coords(cube, filenames) return cube
def _add_available_aux_coords(self, cube, filenames): """ Add any altitude or pressure Auxiliary coordinates that IRIS does not load by default. :type cube: data_io.gridded_data.GriddedData :type filenames: list :return: """ from iris.coords import AuxCoord def _make_aux_coord_and_dims_from_geopotential(g_cube): from scipy.constants import g points = g_cube.data / g dims = list(range(len(g_cube.shape))) coord = AuxCoord(points=points, standard_name='altitude', long_name='Geopotential height at layer midpoints', var_name='altitude', units='meter', attributes={'positive': 'up'}) return coord, dims def _make_aux_coord_and_dims_from_geopotential_height(g_ht_cube): dims = list(range(len(g_ht_cube.shape))) coord = AuxCoord(points=g_ht_cube.data, standard_name='altitude', long_name='Geopotential height at layer midpoints', var_name='altitude', units='meter', attributes={'positive': 'up'}) return coord, dims def _make_aux_coord_and_dims_from_air_pressure(aps_cube): dims = list(range(len(aps_cube.shape))) coord = AuxCoord(points=aps_cube.data, standard_name='air_pressure', long_name='Air Pressure', var_name='air_pressure', units='Pa') return coord, dims aux_coord_creation_functions = {'geopotential': _make_aux_coord_and_dims_from_geopotential, 'geopotential_height': _make_aux_coord_and_dims_from_geopotential_height, 'air_pressure': _make_aux_coord_and_dims_from_air_pressure} for standard_name, make_aux_coord in list(aux_coord_creation_functions.items()): constraint = DisplayConstraint(cube_func=lambda c: c.standard_name == standard_name, display=standard_name) try: aux_cube = gridded_data.load_cube(filenames, constraint) aux_coord, dims = make_aux_coord(aux_cube) cube.add_aux_coord(aux_coord, dims) except iris.exceptions.ConstraintMismatchError: pass # The field doesn't exist; that's OK we just won't add it.
def _create_cube(self, filenames, variable): """Creates a cube for the specified variable. :param filenames: List of filenames to read coordinates from :param variable: Optional variable to read while we're reading the coordinates, can be a string or a VariableConstraint object :return: If variable was specified this will return an UngriddedData object, otherwise a CoordList """ from cis.exceptions import InvalidVariableError from cis.data_io import gridded_data import iris # Check if the files given actually exist. for filename in filenames: with open(filename) as f: pass variable_constraint = variable if isinstance(variable, str): variable_constraint = DisplayConstraint(cube_func=(lambda c: c.var_name == variable or c.standard_name == variable or c.long_name == variable), display=variable, coord_values={'hybrid level at layer midpoints': (lambda lev: lev == 31)}) if len(filenames) == 1: callback_function = self.load_single_file_callback else: callback_function = self.load_multiple_files_callback try: cube = gridded_data.load_cube(filenames, variable_constraint, callback=callback_function) except iris.exceptions.ConstraintMismatchError as e: if variable is None: message = "File contains more than one cube variable name must be specified" elif e.message == "no cubes found": message = "Variable not found: {} \nTo see a list of variables run: cis info {}" \ .format(str(variable), filenames[0]) else: message = e.message raise InvalidVariableError(message) except ValueError as e: raise IOError(str(e)) self._add_available_aux_coords(cube, filenames) return cube