"""
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 numpy as np
import netCDF4
from ..config import FileMetadata
from ..io.common import make_time_unit_str, _test_arguments
from ..core.radar import Radar
[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.], 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)