"""
pyart.aux_io.metranet_cartesian_reader
======================================
Routines for putting METRANET Cartesian data files into grid object.
(Used by ELDES www.eldesradar.it)
.. autosummary::
:toctree: generated/
read_cartesian_metranet
"""
import datetime
import platform
from warnings import warn
import numpy as np
from ..config import FileMetadata
from ..io.common import _test_arguments
from ..core.grid import Grid
from .metranet_c import get_library
from .metranet_python import read_product as read_product_python
from .metranet_c import read_product as read_product_c
# check existence of METRANET library
try:
METRANET_LIB = get_library(momentms=False)
if platform.system() == 'Linux':
METRANET_LIB = get_library(momentms=True)
_METRANETLIB_AVAILABLE = True
except SystemExit:
_METRANETLIB_AVAILABLE = False
METRANET_FIELD_NAMES = {
'NWP_HZEROCL': 'iso0_height',
'Rain_Rate': 'radar_estimated_rain_rate', # RZC, R1F, rZC, RZF, dRZC
'Rainfall_accumulation': 'rainfall_accumulation', # AZC, aZC, nowpal
# 'CPC': 'rainfall_accumulation', # Check product name
# 'CPCH': 'rainfall_accumulation', # Check product name
# 'dACC': 'rainfall_accumulation', # Check product name
# 'dACCH': 'rainfall_accumulation', # Check product name
'POH': 'probability_of_hail', # BZC, dBZC
'Hail': 'probability_of_hail', # GZC, dGZC
'MESH': 'maximum_expected_severe_hail_size', # MZC, dMZC
'Column_Max@swp_1_to_20': 'maximum_echo', # CZC, dCZC
'MAXECHO_HEIGHT': 'maximum_echo_height',
'ECHOTOP_15': 'echo_top_15dBZ', # EZC, dEZC
'ECHOTOP_20': 'echo_top_20dBZ', # EZC
'ECHOTOP_45': 'echo_top_45dBZ', # EZC, dEZC
'ECHOTOP_50': 'echo_top_50dBZ', # EZC
'VIL': 'vertically_integrated_liquid', # LZC, dLZC
'CAPPI_Zh_1.0km': 'reflectivity', # OZC
'CAPPI_Zh_2.0km': 'reflectivity', # OZC
'CAPPI_Zh_3.0km': 'reflectivity', # OZC
'CAPPI_Zh_4.0km': 'reflectivity', # OZC
'CAPPI_Zh_5.0km': 'reflectivity', # OZC
'CAPPI_Zh_6.0km': 'reflectivity', # OZC
'CAPPI_Zh_7.0km': 'reflectivity', # OZC
'CAPPI_Zh_8.0km': 'reflectivity', # OZC
'CAPPI_Zh_9.0km': 'reflectivity', # OZC
'CAPPI_Zh_10.0km': 'reflectivity', # OZC
'CAPPI_Zh_11.0km': 'reflectivity', # OZC
'CAPPI_Zh_12.0km': 'reflectivity', # OZC
'CAPPI_Zh_13.0km': 'reflectivity', # OZC
'CAPPI_Zh_14.0km': 'reflectivity', # OZC
'CAPPI_Zh_15.0km': 'reflectivity', # OZC
'CAPPI_Zh_16.0km': 'reflectivity', # OZC
'CAPPI_Zh_17.0km': 'reflectivity', # OZC
'CAPPI_Zh_18.0km': 'reflectivity' # OZC
}
[docs]def read_cartesian_metranet(filename, additional_metadata=None, chy0=255.,
chx0=-160., reader='C', **kwargs):
"""
Read a METRANET product file.
Parameters
----------
filename : str
Name of the METRANET file to read.
additional_metadata : dict of dicts, optional
Dictionary of dictionaries to retrieve metadata during this read.
This metadata is not used during any successive file reads unless
explicitly included. A value of None, the default, will not
introduct any addition metadata and the file specific or default
metadata as specified by the Py-ART configuration file will be used.
chy0, chx0 : float
Swiss coordinates position of the south-western point in the grid
reader : str
The reader library to use. Can be either 'C' or 'python'
Returns
-------
grid : Grid
Grid object containing data from METRANET file.
"""
# test for non empty kwargs
_test_arguments(kwargs)
if reader == 'C' and _METRANETLIB_AVAILABLE:
ret = read_product_c(filename, physic_value=True, masked_array=True)
elif reader == 'python':
ret = read_product_python(
filename, physic_value=True, masked_array=True)
else:
warn('Invalid reader name or C library not available,' +
' using python (default) instead')
ret = read_product_python(
filename, physic_value=True, masked_array=True)
if ret is None:
warn('Unable to read file '+filename)
return None
# reserved_variables = [
# 'time', 'x', 'y', 'z',
# 'origin_latitude', 'origin_longitude', 'origin_altitude',
# 'point_x', 'point_y', 'point_z', 'projection',
# 'point_latitude', 'point_longitude', 'point_altitude',
# 'radar_latitude', 'radar_longitude', 'radar_altitude',
# 'radar_name', 'radar_time', 'base_time', 'time_offset',
# 'ProjectionCoordinateSystem']
# metadata
metadata = ret.header
filemetadata = FileMetadata(
'METRANET', METRANET_FIELD_NAMES, additional_metadata)
nx = int(ret.header['column'])
ny = int(ret.header['row'])
nz = 1
# required reserved variables
time = filemetadata('grid_time')
origin_latitude = filemetadata('origin_latitude')
origin_longitude = filemetadata('origin_longitude')
origin_altitude = filemetadata('origin_altitude')
x = filemetadata('x')
y = filemetadata('y')
z = filemetadata('z')
x['data'] = 1000.*(
np.arange(nx)*float(ret.header['rect_xres'])+chy0 +
float(ret.header['rect_xres'])/2.-600.)
y['data'] = 1000.*(
np.arange(ny)*float(ret.header['rect_yres'])+chx0 +
float(ret.header['rect_yres'])/2.-200.)
if ret.header['product'].startswith('CAPPI_Zh_'):
alt = ret.header['product'].split('_')[2]
alt = float(alt.replace('km', ''))*1000.
z['data'] = np.array([alt])
else:
z['data'] = np.array([0.])
# Origin of LV03 Swiss coordinates
origin_latitude['data'] = np.array([46.951082877])
origin_longitude['data'] = np.array([7.438632495])
origin_altitude['data'] = np.array([0.])
prod_time = datetime.datetime.strptime(
ret.header['time'][0:9], '%y%j%H%M')
time['units'] = 'seconds since '+prod_time.strftime('%Y-%m-%d %H:%M:%S')
if 'usr_forecast_hour' in ret.header:
time['data'] = np.array(
[float(ret.header['usr_forecast_hour'])*3600.])
else:
time['data'] = np.array([0])
# projection (Swiss Oblique Mercator)
projection = {
'proj': 'somerc',
'_include_lon_0_lat_0': True
}
# read in the fields
fields = {}
field = filemetadata.get_field_name(ret.header['product'])
field_dict = filemetadata(field)
data = np.broadcast_to(ret.data[::-1, :], (nz, ny, nx))
mask = np.broadcast_to(ret.data.mask[::-1, :], (nz, ny, nx))
field_dict['data'] = np.ma.array(data, mask=mask)
fields[field] = field_dict
# radar variables
radar_latitude = None
radar_longitude = None
radar_altitude = None
radar_name = None
radar_time = None
return Grid(
time, fields, metadata,
origin_latitude, origin_longitude, origin_altitude, x, y, z,
projection=projection,
radar_latitude=radar_latitude, radar_longitude=radar_longitude,
radar_altitude=radar_altitude, radar_name=radar_name,
radar_time=radar_time)