Example #1
0
 def test_orthogonal_with_realization(self):
     # => fp: 2; rt: 2; t: 2; realization: 2
     triples = ((0, 10, 1), (0, 10, 2), (0, 11, 1), (0, 11, 2), (1, 10, 1),
                (1, 10, 2), (1, 11, 1), (1, 11, 2))
     en1_cubes = [
         self._make_cube(*triple, realization=1) for triple in triples
     ]
     en2_cubes = [
         self._make_cube(*triple, realization=2) for triple in triples
     ]
     cubes = CubeList(en1_cubes) + CubeList(en2_cubes)
     cube, = cubes.merge()
     self.assertCML(cube, checksum=False)
Example #2
0
 def test_combination_with_extra_triple(self):
     # => fp, rt, t, realization: 17
     triples = ((0, 10, 1), (0, 10, 2), (0, 11, 1), (0, 11, 2), (1, 10, 1),
                (1, 10, 2), (1, 11, 1), (1, 11, 2))
     en1_cubes = [
         self._make_cube(*triple, realization=1) for triple in triples
     ]
     # Add extra time triple on the end.
     en2_cubes = [
         self._make_cube(*triple, realization=2)
         for triple in triples + ((1, 11, 3), )
     ]
     cubes = CubeList(en1_cubes) + CubeList(en2_cubes)
     cube, = cubes.merge()
     self.assertCML(cube, checksum=False)
Example #3
0
 def test_combination_with_extra_realization(self):
     # => fp, rt, t, realization: 17
     triples = ((0, 10, 1), (0, 10, 2), (0, 11, 1), (0, 11, 2), (1, 10, 1),
                (1, 10, 2), (1, 11, 1), (1, 11, 2))
     en1_cubes = [
         self._make_cube(*triple, realization=1) for triple in triples
     ]
     en2_cubes = [
         self._make_cube(*triple, realization=2) for triple in triples
     ]
     # Add extra that is a duplicate of one of the time triples
     # but with a different realisation.
     en3_cubes = [self._make_cube(0, 10, 2, realization=3)]
     cubes = CubeList(en1_cubes) + CubeList(en2_cubes) + CubeList(en3_cubes)
     cube, = cubes.merge()
     self.assertCML(cube, checksum=False)
Example #4
0
 def test_combination_with_realization(self):
     # => fp, rt, t: 8; realization: 2
     triples = ((0, 10, 1),
                (0, 10, 2),
                (0, 11, 1),
                (0, 11, 3),  # This '3' breaks the pattern.
                (1, 10, 1),
                (1, 10, 2),
                (1, 11, 1),
                (1, 11, 2))
     en1_cubes = [self._make_cube(*triple, realization=1) for
                  triple in triples]
     en2_cubes = [self._make_cube(*triple, realization=2) for
                  triple in triples]
     cubes = CubeList(en1_cubes) + CubeList(en2_cubes)
     cube, = cubes.merge()
     self.assertCML(cube, checksum=False)
Example #5
0
 def test_orthogonal_with_realization(self):
     # => fp: 2; rt: 2; t: 2; realization: 2
     triples = ((0, 10, 1),
                (0, 10, 2),
                (0, 11, 1),
                (0, 11, 2),
                (1, 10, 1),
                (1, 10, 2),
                (1, 11, 1),
                (1, 11, 2))
     en1_cubes = [self._make_cube(*triple, realization=1) for
                  triple in triples]
     en2_cubes = [self._make_cube(*triple, realization=2) for
                  triple in triples]
     cubes = CubeList(en1_cubes) + CubeList(en2_cubes)
     cube, = cubes.merge()
     self.assertCML(cube, checksum=False)
Example #6
0
 def test_combination_with_extra_triple(self):
     # => fp, rt, t, realization: 17
     triples = ((0, 10, 1),
                (0, 10, 2),
                (0, 11, 1),
                (0, 11, 2),
                (1, 10, 1),
                (1, 10, 2),
                (1, 11, 1),
                (1, 11, 2))
     en1_cubes = [self._make_cube(*triple, realization=1) for
                  triple in triples]
     # Add extra time triple on the end.
     en2_cubes = [self._make_cube(*triple, realization=2) for
                  triple in triples + ((1, 11, 3),)]
     cubes = CubeList(en1_cubes) + CubeList(en2_cubes)
     cube, = cubes.merge()
     self.assertCML(cube, checksum=False)
Example #7
0
 def test_combination_with_extra_realization(self):
     # => fp, rt, t, realization: 17
     triples = ((0, 10, 1),
                (0, 10, 2),
                (0, 11, 1),
                (0, 11, 2),
                (1, 10, 1),
                (1, 10, 2),
                (1, 11, 1),
                (1, 11, 2))
     en1_cubes = [self._make_cube(*triple, realization=1) for
                  triple in triples]
     en2_cubes = [self._make_cube(*triple, realization=2) for
                  triple in triples]
     # Add extra that is a duplicate of one of the time triples
     # but with a different realisation.
     en3_cubes = [self._make_cube(0, 10, 2, realization=3)]
     cubes = CubeList(en1_cubes) + CubeList(en2_cubes) + CubeList(en3_cubes)
     cube, = cubes.merge()
     self.assertCML(cube, checksum=False)
Example #8
0
def extract_cell_cubes_subset_2D(cubelist_in,
                                 mask,
                                 track,
                                 cell,
                                 z_coord='model_level_number'):
    import iris
    from iris import Constraint
    from iris.cube import CubeList
    import numpy as np
    from tobac import mask_cell_surface, get_bounding_box
    from copy import deepcopy

    track_i = track[track['cell'] == cell]

    cubelist_cell_sum = CubeList()

    for time_i in track_i['time'].values:

        logging.debug('start extracting cubes for cell ' + str(cell) +
                      ' and time ' + str(time_i))

        constraint_time = Constraint(time=time_i)
        mask_i = mask.extract(constraint_time)
        mask_cell_surface_i = mask_cell_surface(mask_i,
                                                cell,
                                                track_i,
                                                masked=False,
                                                z_coord=z_coord)

        x_dim = mask_cell_surface_i.coord_dims('projection_x_coordinate')[0]
        y_dim = mask_cell_surface_i.coord_dims('projection_y_coordinate')[0]
        x_coord = mask_cell_surface_i.coord('projection_x_coordinate')
        y_coord = mask_cell_surface_i.coord('projection_y_coordinate')

        if (mask_cell_surface_i.core_data() > 0).any():
            box_mask_i = get_bounding_box(mask_cell_surface_i.core_data(),
                                          buffer=1)

            box_mask = [[
                x_coord.points[box_mask_i[x_dim][0]],
                x_coord.points[box_mask_i[x_dim][1]]
            ],
                        [
                            y_coord.points[box_mask_i[y_dim][0]],
                            y_coord.points[box_mask_i[y_dim][1]]
                        ]]
        else:
            box_mask = [[np.nan, np.nan], [np.nan, np.nan]]

        width = 20
        dx = 500
        x = track_i[track_i['time'].values ==
                    time_i]['projection_x_coordinate'].values[0]
        y = track_i[track_i['time'].values ==
                    time_i]['projection_y_coordinate'].values[0]

        n_add_width = 2

        box_slice = [[
            x - (width + n_add_width) * dx, x + (width + n_add_width) * dx
        ], [y - (width + n_add_width) * dx, y + (width + n_add_width) * dx]]

        x_min = np.nanmin([box_mask[0][0], box_slice[0][0]])
        x_max = np.nanmax([box_mask[0][1], box_slice[0][1]])
        y_min = np.nanmin([box_mask[1][0], box_slice[1][0]])
        y_max = np.nanmax([box_mask[1][1], box_slice[1][1]])

        constraint_x = Constraint(projection_x_coordinate=lambda cell: int(
            x_min) < cell < int(x_max))
        constraint_y = Constraint(projection_y_coordinate=lambda cell: int(
            y_min) < cell < int(y_max))

        constraint = constraint_time & constraint_x & constraint_y

        mask_cell_surface_i = mask_cell_surface_i.extract(constraint_x
                                                          & constraint_y)
        cubelist_i = cubelist_in.extract(constraint)

        cubelist_cell_sum.extend(
            sum_mask_surface(cubelist_i, mask_cell_surface_i))
    logging.debug(str(cubelist_cell_sum))
    cubelist_cell_sum_out = cubelist_cell_sum.merge()
    logging.debug(str(cubelist_cell_sum_out))
    for cube in cubelist_cell_sum_out:
        logging.debug(str(cube))
        logging.debug(str(cube.attributes))
        logging.debug(str(cube.coords()))

    if len(cubelist_cell_sum_out) == 6:
        logging.debug(
            str(
                iris.util.describe_diff(cubelist_cell_sum_out[0],
                                        cubelist_cell_sum_out[3])))
        logging.debug(
            str(
                iris.util.describe_diff(cubelist_cell_sum_out[1],
                                        cubelist_cell_sum_out[4])))
        logging.debug(
            str(
                iris.util.describe_diff(cubelist_cell_sum_out[2],
                                        cubelist_cell_sum_out[5])))

    track_cell = deepcopy(track_i)
    for cube in cubelist_cell_sum_out:
        logging.debug(f'cube.shape: {cube.shape}')
        logging.debug(f'len(track_cell): {len(track_cell)}')
        logging.debug(f'cube.coord("time"): {cube.coord("time")}')
        logging.debug(f'track_cell[time]: {track_cell["time"]}')

        track_cell[cube.name()] = cube.core_data()

    return cubelist_cell_sum_out, track_cell
Example #9
0
def extract_cell_cubes_subset(cubelist_in,
                              mask,
                              track,
                              cell,
                              z_coord='model_level_number',
                              height_levels=None):

    from iris.analysis import SUM
    from iris import Constraint
    from iris.cube import CubeList
    from iris.coords import AuxCoord
    import numpy as np
    from tobac import mask_cell, mask_cell_surface, get_bounding_box
    from copy import deepcopy

    track_i = track[track['cell'] == cell]

    cubelist_cell_integrated_out = CubeList()
    cubelist_cell_sum = CubeList()

    for time_i in track_i['time'].values:

        logging.debug('start extracting cubes for cell ' + str(cell) +
                      ' and time ' + str(time_i))

        constraint_time = Constraint(time=time_i)
        mask_i = mask.extract(constraint_time)
        mask_cell_i = mask_cell(mask_i, cell, track_i, masked=False)
        mask_cell_surface_i = mask_cell_surface(mask_i,
                                                cell,
                                                track_i,
                                                masked=False,
                                                z_coord=z_coord)

        x_dim = mask_cell_surface_i.coord_dims('projection_x_coordinate')[0]
        y_dim = mask_cell_surface_i.coord_dims('projection_y_coordinate')[0]
        x_coord = mask_cell_surface_i.coord('projection_x_coordinate')
        y_coord = mask_cell_surface_i.coord('projection_y_coordinate')

        if (mask_cell_surface_i.core_data() > 0).any():
            box_mask_i = get_bounding_box(mask_cell_surface_i.core_data(),
                                          buffer=1)

            box_mask = [[
                x_coord.points[box_mask_i[x_dim][0]],
                x_coord.points[box_mask_i[x_dim][1]]
            ],
                        [
                            y_coord.points[box_mask_i[y_dim][0]],
                            y_coord.points[box_mask_i[y_dim][1]]
                        ]]
        else:
            box_mask = [[np.nan, np.nan], [np.nan, np.nan]]

        width = 20
        dx = 500
        x = track_i[track_i['time'].values ==
                    time_i]['projection_x_coordinate'].values[0]
        y = track_i[track_i['time'].values ==
                    time_i]['projection_y_coordinate'].values[0]

        n_add_width = 2

        box_slice = [[
            x - (width + n_add_width) * dx, x + (width + n_add_width) * dx
        ], [y - (width + n_add_width) * dx, y + (width + n_add_width) * dx]]

        x_min = np.nanmin([box_mask[0][0], box_slice[0][0]])
        x_max = np.nanmax([box_mask[0][1], box_slice[0][1]])
        y_min = np.nanmin([box_mask[1][0], box_slice[1][0]])
        y_max = np.nanmax([box_mask[1][1], box_slice[1][1]])

        constraint_x = Constraint(projection_x_coordinate=lambda cell: int(
            x_min) < cell < int(x_max))
        constraint_y = Constraint(projection_y_coordinate=lambda cell: int(
            y_min) < cell < int(y_max))

        constraint = constraint_time & constraint_x & constraint_y

        mask_cell_i = mask_cell_i.extract(constraint_x & constraint_y)
        mask_cell_surface_i = mask_cell_surface_i.extract(constraint_x
                                                          & constraint_y)

        cubelist_i = cubelist_in.extract(constraint)

        cubelist_cell_sum.extend(
            sum_profile_mask(cubelist_i, height_levels, mask_cell_i))
    cubelist_cell_sum_out = cubelist_cell_sum.merge()
    for cube in cubelist_cell_sum_out:
        cell_time_coord = AuxCoord(
            track_i['time_cell'].dt.total_seconds().values,
            units='s',
            long_name='time_cell')
        cube.add_aux_coord(cell_time_coord, cube.coord_dims('time')[0])

    for cube in cubelist_cell_sum_out:
        cubelist_cell_integrated_out.append(
            cube.collapsed(('geopotential_height'), SUM))

    track_cell_integrated = deepcopy(track_i)
    #
    for cube in cubelist_cell_integrated_out:
        track_cell_integrated[cube.name()] = cube.core_data()

    return cubelist_cell_sum_out, cubelist_cell_integrated_out, track_cell_integrated