def test_field_name_orig_to_new_mrms(self):
        """Ensures correct output from field_name_orig_to_new.

        In this case, original field name is from MRMS.
        """

        this_field_name = radar_utils.field_name_orig_to_new(
            LL_SHEAR_NAME_MRMS, data_source=radar_utils.MRMS_SOURCE_ID)
        self.assertTrue(this_field_name == LL_SHEAR_NAME_NEW)
    def test_field_name_orig_to_new_gridrad(self):
        """Ensures correct output from field_name_orig_to_new.

        In this case, original field name is from GridRad.
        """

        this_field_name = radar_utils.field_name_orig_to_new(
            radar_utils.DIFFERENTIAL_REFL_NAME_GRIDRAD,
            data_source=radar_utils.GRIDRAD_SOURCE_ID)
        self.assertTrue(this_field_name == radar_utils.DIFFERENTIAL_REFL_NAME)
Example #3
0
    def test_field_name_orig_to_new_myrorss(self):
        """Ensures correct output from field_name_orig_to_new.

        In this case, original field name is from MYRORSS.
        """

        this_field_name = radar_utils.field_name_orig_to_new(
            field_name_orig=LL_SHEAR_NAME_MYRORSS,
            data_source_name=radar_utils.MYRORSS_SOURCE_ID)

        self.assertTrue(this_field_name == LL_SHEAR_NAME)
Example #4
0
def read_data_from_sparse_grid_file(netcdf_file_name,
                                    field_name_orig,
                                    data_source,
                                    sentinel_values,
                                    raise_error_if_fails=True):
    """Reads sparse radar grid from raw (either MYRORSS or MRMS) file.

    This file should contain one radar field at one height and valid time.

    :param netcdf_file_name: Path to input file.
    :param field_name_orig: Name of radar field in original (either MYRORSS or
        MRMS) format.
    :param data_source: Data source (string).
    :param sentinel_values: 1-D numpy array of sentinel values.
    :param raise_error_if_fails: Boolean flag.  If True and file cannot be read,
        this method will raise an error.  If False and file cannot be read, will
        return None.
    :return: sparse_grid_table: pandas DataFrame with the following columns.
        Each row corresponds to one grid point.
    sparse_grid_table.grid_row: Row index.
    sparse_grid_table.grid_column: Column index.
    sparse_grid_table.<field_name>: Radar measurement (column name is produced
        by _field_name_orig_to_new).
    sparse_grid_table.num_grid_cells: Number of consecutive grid points with the
        same radar measurement.  Counting is row-major (to the right along the
        row, then down to the next column if necessary).
    """

    error_checking.assert_file_exists(netcdf_file_name)
    error_checking.assert_is_numpy_array_without_nan(sentinel_values)
    error_checking.assert_is_numpy_array(sentinel_values, num_dimensions=1)

    netcdf_dataset = netcdf_io.open_netcdf(netcdf_file_name,
                                           raise_error_if_fails)
    if netcdf_dataset is None:
        return None

    field_name = radar_utils.field_name_orig_to_new(
        field_name_orig=field_name_orig, data_source_name=data_source)
    num_values = len(netcdf_dataset.variables[GRID_ROW_COLUMN_ORIG])

    if num_values == 0:
        sparse_grid_dict = {
            GRID_ROW_COLUMN: numpy.array([], dtype=int),
            GRID_COLUMN_COLUMN: numpy.array([], dtype=int),
            NUM_GRID_CELL_COLUMN: numpy.array([], dtype=int),
            field_name: numpy.array([])
        }
    else:
        sparse_grid_dict = {
            GRID_ROW_COLUMN:
            netcdf_dataset.variables[GRID_ROW_COLUMN_ORIG][:],
            GRID_COLUMN_COLUMN:
            netcdf_dataset.variables[GRID_COLUMN_COLUMN_ORIG][:],
            NUM_GRID_CELL_COLUMN:
            netcdf_dataset.variables[NUM_GRID_CELL_COLUMN_ORIG][:],
            field_name:
            netcdf_dataset.variables[field_name_orig][:]
        }

    netcdf_dataset.close()
    sparse_grid_table = pandas.DataFrame.from_dict(sparse_grid_dict)
    return _remove_sentinels_from_sparse_grid(sparse_grid_table,
                                              field_name=field_name,
                                              sentinel_values=sentinel_values)
Example #5
0
def read_metadata_from_raw_file(netcdf_file_name,
                                data_source,
                                raise_error_if_fails=True):
    """Reads metadata from raw (either MYRORSS or MRMS) file.

    This file should contain one radar field at one height and valid time.

    :param netcdf_file_name: Path to input file.
    :param data_source: Data source (string).
    :param raise_error_if_fails: Boolean flag.  If True and file cannot be read,
        this method will raise an error.  If False and file cannot be read, will
        return None.
    :return: metadata_dict: Dictionary with the following keys.
    metadata_dict['nw_grid_point_lat_deg']: Latitude (deg N) of northwesternmost
        grid point.
    metadata_dict['nw_grid_point_lng_deg']: Longitude (deg E) of
        northwesternmost grid point.
    metadata_dict['lat_spacing_deg']: Spacing (deg N) between meridionally
        adjacent grid points.
    metadata_dict['lng_spacing_deg']: Spacing (deg E) between zonally adjacent
        grid points.
    metadata_dict['num_lat_in_grid']: Number of rows (unique grid-point
        latitudes).
    metadata_dict['num_lng_in_grid']: Number of columns (unique grid-point
        longitudes).
    metadata_dict['height_m_asl']: Radar height (metres above ground level).
    metadata_dict['unix_time_sec']: Valid time.
    metadata_dict['field_name']: Name of radar field in GewitterGefahr format.
    metadata_dict['field_name_orig']: Name of radar field in original (either
        MYRORSS or MRMS) format.
    metadata_dict['sentinel_values']: 1-D numpy array of sentinel values.
    """

    error_checking.assert_file_exists(netcdf_file_name)
    netcdf_dataset = netcdf_io.open_netcdf(netcdf_file_name,
                                           raise_error_if_fails)
    if netcdf_dataset is None:
        return None

    field_name_orig = str(getattr(netcdf_dataset, FIELD_NAME_COLUMN_ORIG))

    metadata_dict = {
        radar_utils.NW_GRID_POINT_LAT_COLUMN:
        getattr(netcdf_dataset, NW_GRID_POINT_LAT_COLUMN_ORIG),
        radar_utils.NW_GRID_POINT_LNG_COLUMN:
        lng_conversion.convert_lng_positive_in_west(getattr(
            netcdf_dataset, NW_GRID_POINT_LNG_COLUMN_ORIG),
                                                    allow_nan=False),
        radar_utils.LAT_SPACING_COLUMN:
        getattr(netcdf_dataset, LAT_SPACING_COLUMN_ORIG),
        radar_utils.LNG_SPACING_COLUMN:
        getattr(netcdf_dataset, LNG_SPACING_COLUMN_ORIG),
        radar_utils.NUM_LAT_COLUMN:
        netcdf_dataset.dimensions[NUM_LAT_COLUMN_ORIG].size + 1,
        radar_utils.NUM_LNG_COLUMN:
        netcdf_dataset.dimensions[NUM_LNG_COLUMN_ORIG].size + 1,
        radar_utils.HEIGHT_COLUMN:
        getattr(netcdf_dataset, HEIGHT_COLUMN_ORIG),
        radar_utils.UNIX_TIME_COLUMN:
        getattr(netcdf_dataset, UNIX_TIME_COLUMN_ORIG),
        FIELD_NAME_COLUMN_ORIG:
        field_name_orig,
        radar_utils.FIELD_NAME_COLUMN:
        radar_utils.field_name_orig_to_new(field_name_orig=field_name_orig,
                                           data_source_name=data_source)
    }

    latitude_spacing_deg = metadata_dict[radar_utils.LAT_SPACING_COLUMN]
    longitude_spacing_deg = metadata_dict[radar_utils.LNG_SPACING_COLUMN]

    # TODO(thunderhoser): The following "if" condition is a hack.  The purpose
    # is to change grid corners only for actual MYRORSS data, not GridRad data
    # in MYRORSS format.
    if latitude_spacing_deg < 0.011 and longitude_spacing_deg < 0.011:
        metadata_dict[radar_utils.NW_GRID_POINT_LAT_COLUMN] = (
            rounder.floor_to_nearest(
                metadata_dict[radar_utils.NW_GRID_POINT_LAT_COLUMN],
                metadata_dict[radar_utils.LAT_SPACING_COLUMN]))
        metadata_dict[radar_utils.NW_GRID_POINT_LNG_COLUMN] = (
            rounder.ceiling_to_nearest(
                metadata_dict[radar_utils.NW_GRID_POINT_LNG_COLUMN],
                metadata_dict[radar_utils.LNG_SPACING_COLUMN]))

    sentinel_values = []
    for this_column in SENTINEL_VALUE_COLUMNS_ORIG:
        sentinel_values.append(getattr(netcdf_dataset, this_column))

    metadata_dict.update(
        {radar_utils.SENTINEL_VALUE_COLUMN: numpy.array(sentinel_values)})
    netcdf_dataset.close()
    return metadata_dict