The Py-ART Radar object and indexing#

# The Py-ART radar object has functions and attributes that allow for a more
# in depth look of the data and the radar object.
# Import needed modules
import numpy as np
import pyart
## You are using the Python ARM Radar Toolkit (Py-ART), an open source
## library for working with weather radar data. Py-ART is partly
## supported by the U.S. Department of Energy as part of the Atmospheric
## Radiation Measurement (ARM) Climate Research Facility, an Office of
## Science user facility.
##
## If you use this software to prepare a publication, please cite:
##
##     JJ Helmus and SM Collis, JORS 2016, doi: 10.5334/jors.119
# Load the radar file
radar = pyart.io.read("KATX20130717_195021_V06")
# For a detailed print of the Py-ART radar object, use radar.info()
radar.info()
altitude:
	data: <ndarray of type: float64 and shape: (1,)>
	long_name: Altitude
	standard_name: Altitude
	units: meters
	positive: up
altitude_agl: None
antenna_transition: None
azimuth:
	data: <ndarray of type: float64 and shape: (7200,)>
	units: degrees
	standard_name: beam_azimuth_angle
	long_name: azimuth_angle_from_true_north
	axis: radial_azimuth_coordinate
	comment: Azimuth of antenna relative to true north
elevation:
	data: <ndarray of type: float32 and shape: (7200,)>
	units: degrees
	standard_name: beam_elevation_angle
	long_name: elevation_angle_from_horizontal_plane
	axis: radial_elevation_coordinate
	comment: Elevation of antenna relative to the horizontal plane
fields:
	differential_reflectivity:
		data: <ndarray of type: float32 and shape: (7200, 1832)>
		units: dB
		standard_name: log_differential_reflectivity_hv
		long_name: log_differential_reflectivity_hv
		valid_max: 7.9375
		valid_min: -7.875
		coordinates: elevation azimuth range
		_FillValue: -9999.0
	differential_phase:
		data: <ndarray of type: float32 and shape: (7200, 1832)>
		units: degrees
		standard_name: differential_phase_hv
		long_name: differential_phase_hv
		valid_max: 360.0
		valid_min: 0.0
		coordinates: elevation azimuth range
		_FillValue: -9999.0
	reflectivity:
		data: <ndarray of type: float32 and shape: (7200, 1832)>
		units: dBZ
		standard_name: equivalent_reflectivity_factor
		long_name: Reflectivity
		valid_max: 94.5
		valid_min: -32.0
		coordinates: elevation azimuth range
		_FillValue: -9999.0
	cross_correlation_ratio:
		data: <ndarray of type: float32 and shape: (7200, 1832)>
		units: ratio
		standard_name: cross_correlation_ratio_hv
		long_name: Cross correlation_ratio (RHOHV)
		valid_max: 1.0
		valid_min: 0.0
		coordinates: elevation azimuth range
		_FillValue: -9999.0
	spectrum_width:
		data: <ndarray of type: float32 and shape: (7200, 1832)>
		units: meters_per_second
		standard_name: doppler_spectrum_width
		long_name: Spectrum Width
		valid_max: 63.0
		valid_min: -63.5
		coordinates: elevation azimuth range
		_FillValue: -9999.0
	velocity:
		data: <ndarray of type: float32 and shape: (7200, 1832)>
		units: meters_per_second
		standard_name: radial_velocity_of_scatterers_away_from_instrument
		long_name: Mean doppler Velocity
		valid_max: 95.0
		valid_min: -95.0
		coordinates: elevation azimuth range
		_FillValue: -9999.0
fixed_angle:
	data: <ndarray of type: float32 and shape: (16,)>
	long_name: Target angle for sweep
	units: degrees
	standard_name: target_fixed_angle
instrument_parameters:
	unambiguous_range:
		data: <ndarray of type: float32 and shape: (7200,)>
		units: meters
		comments: Unambiguous range
		meta_group: instrument_parameters
		long_name: Unambiguous range
	nyquist_velocity:
		data: <ndarray of type: float32 and shape: (7200,)>
		units: meters_per_second
		comments: Unambiguous velocity
		meta_group: instrument_parameters
		long_name: Nyquist velocity
latitude:
	data: <ndarray of type: float64 and shape: (1,)>
	long_name: Latitude
	standard_name: Latitude
	units: degrees_north
longitude:
	data: <ndarray of type: float64 and shape: (1,)>
	long_name: Longitude
	standard_name: Longitude
	units: degrees_east
nsweeps: 16
ngates: 1832
nrays: 7200
radar_calibration: None
range:
	data: <ndarray of type: float32 and shape: (1832,)>
	units: meters
	standard_name: projection_range_coordinate
	long_name: range_to_measurement_volume
	axis: radial_range_coordinate
	spacing_is_constant: true
	comment: Coordinate variable for range. Range to center of each bin.
	meters_to_center_of_first_gate: 2125.0
	meters_between_gates: 250.0
scan_rate: None
scan_type: ppi
sweep_end_ray_index:
	data: <ndarray of type: int32 and shape: (16,)>
	long_name: Index of last ray in sweep, 0-based
	units: count
sweep_mode:
	data: <ndarray of type: |S20 and shape: (16,)>
	units: unitless
	standard_name: sweep_mode
	long_name: Sweep mode
	comment: Options are: "sector", "coplane", "rhi", "vertical_pointing", "idle", "azimuth_surveillance", "elevation_surveillance", "sunscan", "pointing", "manual_ppi", "manual_rhi"
sweep_number:
	data: <ndarray of type: int32 and shape: (16,)>
	units: count
	standard_name: sweep_number
	long_name: Sweep number
sweep_start_ray_index:
	data: <ndarray of type: int32 and shape: (16,)>
	long_name: Index of first ray in sweep, 0-based
	units: count
target_scan_rate: None
time:
	data: <ndarray of type: float64 and shape: (7200,)>
	units: seconds since 2013-07-17T19:50:21Z
	standard_name: time
	long_name: time_in_seconds_since_volume_start
	calendar: gregorian
	comment: Coordinate variable for time. Time at the center of each ray, in fractional seconds since the global variable time_coverage_start
metadata:
	Conventions: CF/Radial instrument_parameters
	version: 1.3
	title: 
	institution: 
	references: 
	source: 
	history: 
	comment: 
	instrument_name: KATX
	original_container: NEXRAD Level II
	vcp_pattern: 11
# Let's view the elevation parameter. Py-ART stores all fields as 2D masked arrays
# of dimensions (number of rays) x (number of gates). Therefore, as the elevation can change with
# each ray, the data in the elevation array is a 1D array of dimension (number of rays)
radar.elevation
{'units': 'degrees',
 'standard_name': 'beam_elevation_angle',
 'long_name': 'elevation_angle_from_horizontal_plane',
 'axis': 'radial_elevation_coordinate',
 'comment': 'Elevation of antenna relative to the horizontal plane',
 'data': array([ 0.7470703,  0.7196045,  0.6893921, ..., 19.511719 , 19.511719 ,
        19.511719 ], dtype=float32)}
# If we just want the elevations of one sweep, we can use the get_slice() function
# of the Radar object to just get the elevations from one slice.
sweep_1 = radar.get_slice(1)
print(radar.elevation["data"][sweep_1])
[0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375
 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375 0.52734375]
# All of the radar fields are stored in a dictionary called radar.fields. This dictionary
# contains entries that correspond to the field names in the file.
radar.fields["reflectivity"]
{'units': 'dBZ',
 'standard_name': 'equivalent_reflectivity_factor',
 'long_name': 'Reflectivity',
 'valid_max': 94.5,
 'valid_min': -32.0,
 'coordinates': 'elevation azimuth range',
 '_FillValue': -9999.0,
 'data': masked_array(
   data=[[10.5, 7.5, --, ..., --, --, --],
         [--, --, --, ..., --, --, --],
         [9.5, --, --, ..., --, --, --],
         ...,
         [-10.5, -15.0, -9.5, ..., --, --, --],
         [-14.0, -13.5, -13.5, ..., --, --, --],
         [-11.0, -15.0, 0.5, ..., --, --, --]],
   mask=[[False, False,  True, ...,  True,  True,  True],
         [ True,  True,  True, ...,  True,  True,  True],
         [False,  True,  True, ...,  True,  True,  True],
         ...,
         [False, False, False, ...,  True,  True,  True],
         [False, False, False, ...,  True,  True,  True],
         [False, False, False, ...,  True,  True,  True]],
   fill_value=1e+20,
   dtype=float32)}
# This shows entries such as the data itself, coordinates, long name, and units. You can
# access the array with the reflectivity data itself using radar.fields['reflectivity']['data'].
# This is stored as a 2D masked array with dimensions (number of rays) x (number of gates)
radar.fields["reflectivity"]["data"]
masked_array(
  data=[[10.5, 7.5, --, ..., --, --, --],
        [--, --, --, ..., --, --, --],
        [9.5, --, --, ..., --, --, --],
        ...,
        [-10.5, -15.0, -9.5, ..., --, --, --],
        [-14.0, -13.5, -13.5, ..., --, --, --],
        [-11.0, -15.0, 0.5, ..., --, --, --]],
  mask=[[False, False,  True, ...,  True,  True,  True],
        [ True,  True,  True, ...,  True,  True,  True],
        [False,  True,  True, ...,  True,  True,  True],
        ...,
        [False, False, False, ...,  True,  True,  True],
        [False, False, False, ...,  True,  True,  True],
        [False, False, False, ...,  True,  True,  True]],
  fill_value=1e+20,
  dtype=float32)
# If you just want the data from one slice, you can get the indicies for the
# slice using radar.get_slice()
slice_indices = radar.get_slice(0)
print(radar.fields["reflectivity"]["data"][slice_indices])
[[10.5 7.5 -- ... -- -- --]
 [-- -- -- ... -- -- --]
 [9.5 -- -- ... -- -- --]
 ...
 [-- 6.0 11.0 ... -- -- --]
 [-- -- -- ... -- -- --]
 [-- -- -- ... -- -- --]]
# You can also iterate over each slice by using radar.iter_slice() This example
# returns the mean reflectivity of each sweep.
reflectivity = [
    radar.fields["reflectivity"]["data"][x].mean() for x in radar.iter_slice()
]
print(reflectivity)
[-2.9066728410400056, -3.478547577741713, -6.587792083929423, -6.871031288639269, -10.971692217963673, -11.830616390843327, -12.108188248095756, -12.483419908190385, -12.88976917057903, -11.852766685681688, -12.410455582269897, -12.66444787446138, -12.997862391449566, -13.172098402018502, -13.489752513534416, -13.712565619531706]
# You can also view the important radar instrument parameters. One commonly used parameter
# is the nyquist velocity, which is the maximum magnitude of the velocity the radar is
# capable of recording before a phenomena known as aliasing occurs.
radar.instrument_parameters["nyquist_velocity"]["data"]
array([ 8.81,  8.81,  8.81, ..., 32.33, 32.33, 32.33], dtype=float32)