コード例 #1
0
ファイル: rules.py プロジェクト: cdr30/iris
def load_cubes(filenames, user_callback, loader, filter_function=None):
    concrete_reference_targets = {}
    results_needing_reference = []

    if isinstance(filenames, six.string_types):
        filenames = [filenames]

    for filename in filenames:
        for field in loader.field_generator(filename,
                                            **loader.field_generator_kwargs):
            # evaluate field against format specific desired attributes
            # load if no format specific desired attributes are violated
            if filter_function is not None and not filter_function(field):
                continue
            # Convert the field to a Cube.
            cube, factories, references = _make_cube(field, loader.converter)

            # Run any custom user-provided rules.
            if loader.legacy_custom_rules:
                warnings.warn('The `legacy_custom_rules` attribute of '
                              'the `loader` is deprecated.')
                loader.legacy_custom_rules.verify(cube, field)

            cube = iris.io.run_callback(user_callback, cube, field, filename)

            if cube is None:
                continue
            # Cross referencing
            for reference in references:
                name = reference.name
                # Register this cube as a source cube for the named
                # reference.
                target = concrete_reference_targets.get(name)
                if target is None:
                    target = ConcreteReferenceTarget(name, reference.transform)
                    concrete_reference_targets[name] = target
                target.add_cube(cube)

            if factories:
                results_needing_reference.append((cube, factories))
            else:
                yield cube

    regrid_cache = {}
    for cube, factories in results_needing_reference:
        for factory in factories:
            try:
                args = _dereference_args(factory, concrete_reference_targets,
                                         regrid_cache, cube)
            except _ReferenceError as e:
                msg = 'Unable to create instance of {factory}. ' + str(e)
                factory_name = factory.factory_class.__name__
                warnings.warn(
                    msg.format(filenames=filenames, factory=factory_name))
            else:
                aux_factory = factory.factory_class(*args)
                cube.add_aux_factory(aux_factory)
        yield cube
コード例 #2
0
ファイル: rules.py プロジェクト: carlocafaro89/iris
def load_cubes(filenames, user_callback, loader, filter_function=None):
    concrete_reference_targets = {}
    results_needing_reference = []

    if isinstance(filenames, six.string_types):
        filenames = [filenames]

    for filename in filenames:
        for field in loader.field_generator(filename, **loader.field_generator_kwargs):
            # evaluate field against format specific desired attributes
            # load if no format specific desired attributes are violated
            if filter_function is not None and not filter_function(field):
                continue
            # Convert the field to a Cube.
            cube, factories, references = _make_cube(field, loader.converter)

            # Run any custom user-provided rules.
            if loader.legacy_custom_rules:
                warnings.warn('The `legacy_custom_rules` attribute of '
                              'the `loader` is deprecated.')
                loader.legacy_custom_rules.verify(cube, field)

            cube = iris.io.run_callback(user_callback, cube, field, filename)

            if cube is None:
                continue
            # Cross referencing
            for reference in references:
                name = reference.name
                # Register this cube as a source cube for the named
                # reference.
                target = concrete_reference_targets.get(name)
                if target is None:
                    target = ConcreteReferenceTarget(name, reference.transform)
                    concrete_reference_targets[name] = target
                target.add_cube(cube)

            if factories:
                results_needing_reference.append((cube, factories))
            else:
                yield cube

    regrid_cache = {}
    for cube, factories in results_needing_reference:
        for factory in factories:
            try:
                args = _dereference_args(factory, concrete_reference_targets,
                                         regrid_cache, cube)
            except _ReferenceError as e:
                msg = 'Unable to create instance of {factory}. ' + str(e)
                factory_name = factory.factory_class.__name__
                warnings.warn(msg.format(filenames=filenames,
                                         factory=factory_name))
            else:
                aux_factory = factory.factory_class(*args)
                cube.add_aux_factory(aux_factory)
        yield cube
コード例 #3
0
ファイル: rules.py プロジェクト: nleush/iris
def load_cubes(filenames, user_callback, loader):
    concrete_reference_targets = {}
    results_needing_reference = []

    if isinstance(filenames, basestring):
        filenames = [filenames]

    for filename in filenames:
        for field in loader.field_generator(filename,
                                            **loader.field_generator_kwargs):
            # Convert the field to a Cube, logging the rules that were used
            rules_result = loader.load_rules.result(field)
            cube = rules_result.cube
            log(loader.log_name, filename, rules_result.matching_rules)

            cube = iris.io.run_callback(user_callback, cube, field, filename)

            if cube is None:
                continue

            # Cross referencing
            rules = loader.cross_ref_rules.matching_rules(field)
            for rule in rules:
                reference, = rule.run_actions(cube, field)
                name = reference.name
                # Register this cube as a source cube for the named
                # reference.
                target = concrete_reference_targets.get(name)
                if target is None:
                    target = ConcreteReferenceTarget(name, reference.transform)
                    concrete_reference_targets[name] = target
                target.add_cube(cube)

            if rules_result.factories:
                results_needing_reference.append(rules_result)
            else:
                yield cube

    regrid_cache = {}
    for result in results_needing_reference:
        cube = result.cube
        for factory in result.factories:
            try:
                args = _dereference_args(factory, concrete_reference_targets,
                                         regrid_cache, cube)
            except _ReferenceError as e:
                msg = 'Unable to create instance of {factory}. ' + e.message
                factory_name = factory.factory_class.__name__
                warnings.warn(
                    msg.format(filenames=filenames, factory=factory_name))
            else:
                aux_factory = factory.factory_class(*args)
                cube.add_aux_factory(aux_factory)
        yield cube
コード例 #4
0
ファイル: rules.py プロジェクト: asascience-open/iris
def load_cubes(filenames, user_callback, loader):
    concrete_reference_targets = {}
    results_needing_reference = []

    if isinstance(filenames, basestring):
        filenames = [filenames]

    for filename in filenames:
        for field in loader.field_generator(filename):
            # Convert the field to a Cube, logging the rules that were used
            rules_result = loader.load_rules.result(field)
            cube = rules_result.cube
            log(loader.log_name, filename, rules_result.matching_rules)

            cube = iris.io.run_callback(user_callback, cube, field, filename)

            if cube is None:
                continue

            # Cross referencing
            rules = loader.cross_ref_rules.matching_rules(field)
            for rule in rules:
                reference, = rule.run_actions(cube, field)
                name = reference.name
                # Register this cube as a source cube for the named
                # reference.
                target = concrete_reference_targets.get(name)
                if target is None:
                    target = ConcreteReferenceTarget(name, reference.transform)
                    concrete_reference_targets[name] = target
                target.add_cube(cube)

            if rules_result.factories:
                results_needing_reference.append(rules_result)
            else:
                yield cube

    regrid_cache = {}
    for result in results_needing_reference:
        cube = result.cube
        for factory in result.factories:
            try:
                args = _dereference_args(factory, concrete_reference_targets,
                                         regrid_cache, cube)
            except _ReferenceError as e:
                msg = 'Unable to create instance of {factory}. ' + e.message
                factory_name = factory.factory_class.__name__
                warnings.warn(msg.format(filenames=filenames,
                                         factory=factory_name))
            else:
                aux_factory = factory.factory_class(*args)
                cube.add_aux_factory(aux_factory)
        yield cube
コード例 #5
0
def load_cubes(filenames, user_callback, loader):
    concrete_reference_targets = {}
    results_needing_reference = []

    if isinstance(filenames, basestring):
        filenames = [filenames]

    for filename in filenames:
        for field in loader.field_generator(filename,
                                            **loader.field_generator_kwargs):
            # Convert the field to a Cube.
            cube, factories, references = _make_cube(field, loader.converter)

            # Run any custom user-provided rules.
            if loader.legacy_custom_rules:
                loader.legacy_custom_rules.verify(cube, field)

            cube = iris.io.run_callback(user_callback, cube, field, filename)

            if cube is None:
                continue
            # Cross referencing
            for reference in references:
                name = reference.name
                # Register this cube as a source cube for the named
                # reference.
                target = concrete_reference_targets.get(name)
                if target is None:
                    target = ConcreteReferenceTarget(name, reference.transform)
                    concrete_reference_targets[name] = target
                target.add_cube(cube)

            if factories:
                results_needing_reference.append((cube, factories))
            else:
                yield cube

    regrid_cache = {}
    for cube, factories in results_needing_reference:
        for factory in factories:
            try:
                args = _dereference_args(factory, concrete_reference_targets,
                                         regrid_cache, cube)
            except _ReferenceError as e:
                msg = 'Unable to create instance of {factory}. ' + e.message
                factory_name = factory.factory_class.__name__
                warnings.warn(
                    msg.format(filenames=filenames, factory=factory_name))
            else:
                aux_factory = factory.factory_class(*args)
                cube.add_aux_factory(aux_factory)
        yield cube
コード例 #6
0
ファイル: rules.py プロジェクト: aashish24/iris
def load_cubes(filenames, user_callback, loader):
    concrete_reference_targets = {}
    results_needing_reference = []

    if isinstance(filenames, basestring):
        filenames = [filenames]

    for filename in filenames:
        for field in loader.field_generator(filename, **loader.field_generator_kwargs):
            # Convert the field to a Cube.
            cube, factories, references = _make_cube(field, loader.converter)

            # Run any custom user-provided rules.
            if loader.legacy_custom_rules:
                loader.legacy_custom_rules.verify(cube, field)

            cube = iris.io.run_callback(user_callback, cube, field, filename)

            if cube is None:
                continue
            # Cross referencing
            for reference in references:
                name = reference.name
                # Register this cube as a source cube for the named
                # reference.
                target = concrete_reference_targets.get(name)
                if target is None:
                    target = ConcreteReferenceTarget(name, reference.transform)
                    concrete_reference_targets[name] = target
                target.add_cube(cube)

            if factories:
                results_needing_reference.append((cube, factories))
            else:
                yield cube

    regrid_cache = {}
    for cube, factories in results_needing_reference:
        for factory in factories:
            try:
                args = _dereference_args(factory, concrete_reference_targets,
                                         regrid_cache, cube)
            except _ReferenceError as e:
                msg = 'Unable to create instance of {factory}. ' + e.message
                factory_name = factory.factory_class.__name__
                warnings.warn(msg.format(filenames=filenames,
                                         factory=factory_name))
            else:
                aux_factory = factory.factory_class(*args)
                cube.add_aux_factory(aux_factory)
        yield cube
コード例 #7
0
ファイル: rules.py プロジェクト: lauradomar/iris
def _resolve_factory_references(cube, factories, concrete_reference_targets,
                                regrid_cache={}):
    # Attach the factories for a cube, building them from references.
    # Note: the regrid_cache argument lets us share and reuse regridded data
    # across multiple result cubes.
    for factory in factories:
        try:
            args = _dereference_args(factory, concrete_reference_targets,
                                     regrid_cache, cube)
        except _ReferenceError as e:
            msg = 'Unable to create instance of {factory}. ' + str(e)
            factory_name = factory.factory_class.__name__
            warnings.warn(msg.format(factory=factory_name))
        else:
            aux_factory = factory.factory_class(*args)
            cube.add_aux_factory(aux_factory)
コード例 #8
0
ファイル: rules.py プロジェクト: QuLogic/iris
def _resolve_factory_references(cube, factories, concrete_reference_targets,
                                regrid_cache={}):
    # Attach the factories for a cube, building them from references.
    # Note: the regrid_cache argument lets us share and reuse regridded data
    # across multiple result cubes.
    for factory in factories:
        try:
            args = _dereference_args(factory, concrete_reference_targets,
                                     regrid_cache, cube)
        except _ReferenceError as e:
            msg = 'Unable to create instance of {factory}. ' + str(e)
            factory_name = factory.factory_class.__name__
            warnings.warn(msg.format(factory=factory_name))
        else:
            aux_factory = factory.factory_class(*args)
            cube.add_aux_factory(aux_factory)
コード例 #9
0
ファイル: netcdf.py プロジェクト: omarjamil/iris
def _load_aux_factory(engine, cf, filename, cube):
    """
    Convert any CF-netCDF dimensionless coordinate to an AuxCoordFactory.
    
    """
    formula_type = engine.requires.get('formula_type')
    
    if formula_type == 'atmosphere_hybrid_height_coordinate':
        def coord_from_var_name(name):
            mapping = engine.provides['coordinates']
            for coord, cf_var_name in engine.provides['coordinates']:
                if cf_var_name == name:
                    return coord
            raise ValueError('Unable to find coordinate for variable {!r}'.format(name))
        # Convert term names to coordinates (via netCDF variable names).
        terms_to_var_names = engine.requires['formula_terms']
        delta = coord_from_var_name(terms_to_var_names['a'])
        sigma = coord_from_var_name(terms_to_var_names['b'])
        orography = coord_from_var_name(terms_to_var_names['orog'])
        factory = iris.aux_factory.HybridHeightFactory(delta, sigma, orography)
        cube.add_aux_factory(factory)
コード例 #10
0
ファイル: _merge.py プロジェクト: asascience-open/iris
    def _get_cube(self):
        """
        Returns a cube containing all its coordinates and appropriately shaped
        data that corresponds to this ProtoCube.

        All the values in the cube's data array are masked.

        """
        signature = self._cube_signature
        dim_coords_and_dims = [(deepcopy(coord), dim) for coord, dim in self._dim_coords_and_dims]
        aux_coords_and_dims = [(deepcopy(coord), dims) for coord, dims in self._aux_coords_and_dims]
        kwargs = dict(zip(iris.cube.CubeMetadata._fields, signature.defn))

        # Create fully masked data, i.e. all missing.
        # (The CubeML checksum doesn't respect the mask, so we zero the
        # underlying data to ensure repeatable checksums.)
        if signature.data_manager is None:
            data = ma.MaskedArray(np.zeros(self._shape,
                                           signature.data_type),
                                  mask=np.ones(self._shape, 'bool'),
                                  fill_value=signature.mdi)
        else:
            data = ma.MaskedArray(np.zeros(self._shape, 'object'),
                                  mask=np.ones(self._shape, 'bool'))

        cube = iris.cube.Cube(data,
                              dim_coords_and_dims=dim_coords_and_dims,
                              aux_coords_and_dims=aux_coords_and_dims,
                              data_manager=signature.data_manager, **kwargs)

        # Add on any aux coord factories.
        for factory_defn in self._coord_signature.factory_defns:
            args = {}
            for key, defn in factory_defn.dependency_defns:
                coord = cube.coord(coord=defn)
                args[key] = coord
            factory = factory_defn.class_(**args)
            cube.add_aux_factory(factory)

        return cube
コード例 #11
0
ファイル: _merge.py プロジェクト: nleush/iris
    def _get_cube(self):
        """
        Returns a cube containing all its coordinates and appropriately shaped
        data that corresponds to this ProtoCube.

        All the values in the cube's data array are masked.

        """
        signature = self._cube_signature
        dim_coords_and_dims = [(deepcopy(coord), dim) for coord, dim in self._dim_coords_and_dims]
        aux_coords_and_dims = [(deepcopy(coord), dims) for coord, dims in self._aux_coords_and_dims]
        kwargs = dict(zip(iris.cube.CubeMetadata._fields, signature.defn))

        # Create fully masked data, i.e. all missing.
        # (The CubeML checksum doesn't respect the mask, so we zero the
        # underlying data to ensure repeatable checksums.)
        if signature.data_manager is None:
            data = ma.MaskedArray(np.zeros(self._shape,
                                           signature.data_type),
                                  mask=np.ones(self._shape, 'bool'),
                                  fill_value=signature.mdi)
        else:
            data = ma.MaskedArray(np.zeros(self._shape, 'object'),
                                  mask=np.ones(self._shape, 'bool'))

        cube = iris.cube.Cube(data,
                              dim_coords_and_dims=dim_coords_and_dims,
                              aux_coords_and_dims=aux_coords_and_dims,
                              data_manager=signature.data_manager, **kwargs)

        # Add on any aux coord factories.
        for factory_defn in self._coord_signature.factory_defns:
            args = {}
            for key, defn in factory_defn.dependency_defns:
                coord = cube.coord(coord=defn)
                args[key] = coord
            factory = factory_defn.class_(**args)
            cube.add_aux_factory(factory)

        return cube
コード例 #12
0
ファイル: netcdf.py プロジェクト: nleush/iris
def _load_aux_factory(engine, cf, filename, cube):
    """
    Convert any CF-netCDF dimensionless coordinate to an AuxCoordFactory.

    """
    formula_type = engine.requires.get('formula_type')

    if formula_type == 'atmosphere_hybrid_height_coordinate':
        def coord_from_var_name(name):
            mapping = engine.provides['coordinates']
            for coord, cf_var_name in engine.provides['coordinates']:
                if cf_var_name == name:
                    return coord
            raise ValueError('Unable to find coordinate for variable '
                             '{!r}'.format(name))
        # Convert term names to coordinates (via netCDF variable names).
        terms_to_var_names = engine.requires['formula_terms']
        delta = coord_from_var_name(terms_to_var_names['a'])
        sigma = coord_from_var_name(terms_to_var_names['b'])
        orography = coord_from_var_name(terms_to_var_names['orog'])
        factory = iris.aux_factory.HybridHeightFactory(delta, sigma, orography)
        cube.add_aux_factory(factory)
コード例 #13
0
ファイル: _merge.py プロジェクト: omarjamil/iris
    def _get_cube(self):
        """
        Returns a cube containing all its coordinates and appropriately shaped
        data that corresponds to this ProtoCube.

        All the values in the cube's data array are masked.

        """
        signature = self._cube_signature
        dim_coords_and_dims = [(deepcopy(coord), dim) for coord, dim in self._dim_coords_and_dims]
        aux_coords_and_dims = [(deepcopy(coord), dims) for coord, dims in self._aux_coords_and_dims]
        kwargs = dict(zip(iris.cube.CubeMetadata._fields, signature.defn))

        # Create fully masked data i.e. all missing.
        if signature.data_manager is None:
            # Must zero the data in order to avoid random checksums.
            data = numpy.ma.zeros(self._shape, dtype=signature.data_type)
            data.fill_value = signature.mdi
        else:
            # With dtype=object, ma.empty DOES initialise the memory (all None).
            data = numpy.ma.empty(self._shape, dtype=object)

        data.mask = True
        cube = iris.cube.Cube(data,
                              dim_coords_and_dims=dim_coords_and_dims,
                              aux_coords_and_dims=aux_coords_and_dims,
                              data_manager=signature.data_manager, **kwargs)

        # Add on any aux coord factories.
        for factory_defn in self._coord_signature.factory_defns:
            args = {}
            for key, defn in factory_defn.dependency_defns:
                coord = cube.coord(coord=defn)
                args[key] = coord
            factory = factory_defn.class_(**args)
            cube.add_aux_factory(factory)

        return cube