Source code for pyart.aux_io.pattern

"""
Routines for reading files from the X-band radar from the PATTERN_ project.

.. _PATTERN: http://www.mi.uni-hamburg.de/PATTERN-Pre.6763.0.html

"""

import datetime

import netCDF4
import numpy as np

from ..config import FileMetadata
from ..core.radar import Radar
from ..io.common import _test_arguments, make_time_unit_str


[docs]def read_pattern(filename, **kwargs): """ Read a netCDF file from a PATTERN project X-band radar. Parameters ---------- filename : str Name of netCDF file to read data from. Returns ------- radar : Radar Radar object. """ # test for non empty kwargs _test_arguments(kwargs) # create metadata retrieval object filemetadata = FileMetadata("pattern") # read the data ncobj = netCDF4.Dataset(filename) ncvars = ncobj.variables # general parameters nrays = ncvars["Azimuth"].shape[0] scan_type = "ppi" # time # interpolate between the first and last timestamps in the Time variable time = filemetadata("time") nctime = ncvars["Time"] time["units"] = make_time_unit_str(datetime.datetime.utcfromtimestamp(nctime[0])) time["data"] = np.linspace(0, nctime[-1] - nctime[0], nrays) # range _range = filemetadata("range") _range["data"] = ncvars["Distance"][:] _range["meters_to_center_of_first_gate"] = _range["data"][0] # assuming the distance between all gates is constant, may not # always be true. _range["meters_between_gates"] = _range["data"][1] - _range["data"][0] # fields # files contain a single corrected reflectivity field fields = {} field_name = filemetadata.get_field_name("corrected_reflectivity") field_dic = filemetadata(field_name) field_dic["_FillValue"] = ncvars["Corrected_Reflectivity"]._FillValue field_dic["data"] = ncvars["Corrected_Reflectivity"][:] fields[field_name] = field_dic # metadata metadata = filemetadata("metadata") for k in ["institution", "title", "used_algorithms"]: if k in ncobj.ncattrs(): metadata[k] = ncobj.getncattr(k) # latitude, longitude, altitude latitude = filemetadata("latitude") longitude = filemetadata("longitude") altitude = filemetadata("altitude") latitude["data"] = np.array([ncobj.latitude[:-1]], dtype="float64") longitude["data"] = np.array([ncobj.longitude[:-1]], dtype="float64") altitude["data"] = np.array([ncobj.elevation], dtype="float64") # sweep parameters # sweep_number, sweep_mode, fixed_angle, sweep_start_ray_index, # sweep_end_ray_index sweep_number = filemetadata("sweep_number") sweep_mode = filemetadata("sweep_mode") fixed_angle = filemetadata("fixed_angle") sweep_start_ray_index = filemetadata("sweep_start_ray_index") sweep_end_ray_index = filemetadata("sweep_end_ray_index") sweep_number["data"] = np.arange(1, dtype="int32") sweep_mode["data"] = np.array(1 * ["azimuth_surveillance"]) fixed_angle["data"] = np.array([0], dtype="float32") sweep_start_ray_index["data"] = np.array([0], dtype="int32") sweep_end_ray_index["data"] = np.array([nrays - 1], dtype="int32") # azimuth, elevation azimuth = filemetadata("azimuth") elevation = filemetadata("elevation") azimuth["data"] = ncvars["Azimuth"][:] elevation["data"] = np.array([0.0], dtype="float32") # instrument parameters instrument_parameters = None return Radar( time, _range, fields, metadata, scan_type, latitude, longitude, altitude, sweep_number, sweep_mode, fixed_angle, sweep_start_ray_index, sweep_end_ray_index, azimuth, elevation, instrument_parameters=instrument_parameters, )