Source code for pyart.aux_io.rxm25
"""
Routines for Ridgeline Instruments RXM-25 formatted NetCDF files.
"""
import datetime
try:
import pytz
_PYTZ_AVAILABLE = True
except ImportError:
_PYTZ_AVAILABLE = False
import netCDF4
import numpy as np
import pyart
from ..config import get_metadata
from ..exceptions import MissingOptionalDependency
from ..testing import make_empty_ppi_radar
[docs]def read_rxm25(filename, cfradial_outfile=None, heading=None):
"""
Read in Ridgeline Instruments RXM-25 formatted NetCDF data.
Parameters
----------
filename : str
Name of Ridgeline Instruments (RLI) RXM-25 formatted NetCDF file
from which to read data.
cfradial_outfile : str, optional
If file is to be converted to CF-Radial format, specify the output
filename here.
heading : float, optional
If a heading offset exists, enter it here (in degrees).
Returns
-------
radar : Radar
Radar object.
"""
if not _PYTZ_AVAILABLE:
raise MissingOptionalDependency(
"Pytz is required to use read_rxm25 but is " + "not installed"
)
data = netCDF4.Dataset(filename, "r")
ngates = data.dimensions["Gate"].size
rays_per_sweep = data.dimensions["Radial"].size
radar = make_empty_ppi_radar(ngates, rays_per_sweep, 1)
# Time needs to be converted from nss1970 to nss1989 and added to
# Radar object.
nineteen89 = datetime.datetime(1989, 1, 1, 0, 0, 1, tzinfo=pytz.utc)
baseTime = np.array(
[
datetime.datetime.fromtimestamp(t, tz=pytz.UTC)
for t in data.variables["Time"][:]
]
)
radar.time["data"] = np.array([t.total_seconds() for t in baseTime - nineteen89])
if heading is not None:
radar.heading = heading
radar.azimuth["data"] = np.mod(data["Azimuth"][:] - radar.heading, 360.0)
else:
radar.azimuth["data"] = data["Azimuth"][:]
radar.longitude["data"] = np.array([data.Longitude], dtype="float64")
radar.latitude["data"] = np.array([data.Latitude], dtype="float64")
radar.elevation["data"] = data["Elevation"][:]
radar.altitude["data"] = np.array([data.Height], dtype="float64")
fixed_agl_data = np.empty((1,), dtype="float32")
fixed_agl_data[:] = np.mean(radar.elevation["data"][:rays_per_sweep])
radar.fixed_angle["data"] = fixed_agl_data
radar.range["data"] = np.linspace(
data["StartRange"][0] / 1000,
(ngates - 1) * data["GateWidth"][0] / 1000 + data["StartRange"][0] / 1000,
ngates,
)
ref = data["Reflectivity"][:]
norm_pow = data["NormalizedCoherentPower"][:]
spec_w = data["SpectralWidth"][:]
vel = data["Velocity"][:]
corr_ref = data["CorrectedReflectivity"][:]
diff_ref = data["DifferentialReflectivity"][:]
diff_phase = data["DifferentialPhase"][:]
spec_phase = data["SpecificPhase"][:]
corr_diff_ref = data["CorrectedDifferentialReflectivity"][:]
sig_noise = data["SignalToNoiseRatio"][:]
rain_rate = data["RainfallRate"][:]
cross_ra = data["CrossPolCorrelation"][:]
fields = {
"reflectivity": get_metadata("reflectivity"),
"normalized_coherent_power": get_metadata("normalized_coherent_power"),
"spectral_width": get_metadata("spectral_width"),
"velocity": get_metadata("velocity"),
"corrected_reflectivity": get_metadata("correct_reflectivity"),
"differential_reflectivity": get_metadata("differential_reflectivity"),
"differential_phase": get_metadata("differential_phase"),
"specific_differential_phase": get_metadata("specific_differential_phase"),
"corrected_differential_reflectivity": get_metadata(
"corrected_differential_reflectivity"
),
"signal_to_noise_ratio": get_metadata("signal_to_noise_ratio"),
"rain_rate": get_metadata("rain_rate"),
"cross_correlation_ratio": get_metadata("cross_correlation_ratio"),
}
radar.fields = fields
radar.fields["reflectivity"]["data"] = ref
radar.fields["normalized_coherent_power"]["data"] = norm_pow
radar.fields["spectral_width"]["data"] = spec_w
radar.fields["velocity"]["data"] = vel
radar.fields["corrected_reflectivity"]["data"] = corr_ref
radar.fields["differential_reflectivity"]["data"] = diff_ref
radar.fields["differential_phase"]["data"] = diff_phase
radar.fields["specific_differential_phase"]["data"] = spec_phase
radar.fields["corrected_differential_reflectivity"]["data"] = corr_diff_ref
radar.fields["signal_to_noise_ratio"]["data"] = sig_noise
radar.fields["rain_rate"]["data"] = rain_rate
radar.fields["cross_correlation_ratio"]["data"] = cross_ra
radar.metadata["instrument_name"] = "RXM-25"
if cfradial_outfile is not None:
pyart.io.write_cfradial(cfradial_outfile, radar, arm_time_variables=True)
return radar