NEXRAD Level 2#

import cmweather  # noqa
import xarray as xr
from open_radar_data import DATASETS

import xradar as xd

Download#

Fetching NEXRAD Level2 radar data file from open-radar-data repository.

filename = DATASETS.fetch("KATX20130717_195021_V06")
Downloading file 'KATX20130717_195021_V06' from 'https://github.com/openradar/open-radar-data/raw/main/data/KATX20130717_195021_V06' to '/home/docs/.cache/open-radar-data'.

xr.open_dataset#

Making use of the xarray nexradlevel2 backend. We also need to provide the group. Note, that we are using CfRadial2 group access pattern.

ds = xr.open_dataset(filename, group="sweep_0", engine="nexradlevel2")
display(ds)
<xarray.Dataset> Size: 42MB
Dimensions:            (azimuth: 720, range: 1832)
Coordinates:
  * azimuth            (azimuth) float64 6kB 0.2582 0.7526 1.272 ... 359.3 359.8
    elevation          (azimuth) float64 6kB ...
    time               (azimuth) datetime64[ns] 6kB ...
  * range              (range) float32 7kB 2.125e+03 2.375e+03 ... 4.599e+05
    longitude          float64 8B ...
    latitude           float64 8B ...
    altitude           int64 8B ...
Data variables:
    DBZH               (azimuth, range) float64 11MB ...
    ZDR                (azimuth, range) float64 11MB ...
    PHIDP              (azimuth, range) float64 11MB ...
    RHOHV              (azimuth, range) float64 11MB ...
    sweep_mode         <U20 80B ...
    sweep_number       int64 8B ...
    prt_mode           <U7 28B ...
    follow_mode        <U7 28B ...
    sweep_fixed_angle  float64 8B ...
Attributes: (12/16)
    instrument_name:              KATX
    scan_name:                    VCP-11
    dynamic_scan_type:            standard
    mpda_vcp:                     False
    base_tilt_vcp:                False
    num_base_tilts:               0
    ...                           ...
    vcp_pulse_width:              short
    avset_enabled:                False
    ebc_enabled:                  False
    super_res_status:             2
    rda_build_number:             1320
    operational_mode:             4
ds
<xarray.Dataset> Size: 42MB
Dimensions:            (azimuth: 720, range: 1832)
Coordinates:
  * azimuth            (azimuth) float64 6kB 0.2582 0.7526 1.272 ... 359.3 359.8
    elevation          (azimuth) float64 6kB ...
    time               (azimuth) datetime64[ns] 6kB ...
  * range              (range) float32 7kB 2.125e+03 2.375e+03 ... 4.599e+05
    longitude          float64 8B ...
    latitude           float64 8B ...
    altitude           int64 8B ...
Data variables:
    DBZH               (azimuth, range) float64 11MB ...
    ZDR                (azimuth, range) float64 11MB ...
    PHIDP              (azimuth, range) float64 11MB ...
    RHOHV              (azimuth, range) float64 11MB ...
    sweep_mode         <U20 80B ...
    sweep_number       int64 8B ...
    prt_mode           <U7 28B ...
    follow_mode        <U7 28B ...
    sweep_fixed_angle  float64 8B ...
Attributes: (12/16)
    instrument_name:              KATX
    scan_name:                    VCP-11
    dynamic_scan_type:            standard
    mpda_vcp:                     False
    base_tilt_vcp:                False
    num_base_tilts:               0
    ...                           ...
    vcp_pulse_width:              short
    avset_enabled:                False
    ebc_enabled:                  False
    super_res_status:             2
    rda_build_number:             1320
    operational_mode:             4
import numpy as np

np.testing.assert_almost_equal(ds.sweep_fixed_angle.values, 0.4833984)

Plot Time vs. Azimuth#

ds.azimuth.plot()
[<matplotlib.lines.Line2D at 0x78dff6486490>]
../_images/e1db9c7b412a90d64312ae75457ac800e938f60b0f5bfa2d42083349ddab91fa.png

Plot Range vs. Time#

We need to sort by time and specify the y-coordinate.

ds.DBZH.sortby("time").plot(y="time", cmap="HomeyerRainbow")
<matplotlib.collections.QuadMesh at 0x78dff6339d30>
../_images/15d472a3091d9c615d51fb2259b925156626de8be8691339fad923ea37f16f06.png

Plot Range vs. Azimuth#

ds.DBZH.plot(cmap="HomeyerRainbow")
<matplotlib.collections.QuadMesh at 0x78dfee082710>
../_images/3d28a5ebb137bbe8f16f882a0b38641b2cd2a67ff07b54208c55cc68c62185bd.png

backend_kwargs#

Beside first_dim there are several additional backend_kwargs for the nexradlevel2 backend, which handle different aspects of angle alignment. This comes into play, when azimuth and/or elevation arrays are not evenly spacend and other issues.

help(xd.io.NexradLevel2BackendEntrypoint)
Help on class NexradLevel2BackendEntrypoint in module xradar.io.backends.nexrad_level2:

class NexradLevel2BackendEntrypoint(xarray.backends.common.BackendEntrypoint)
 |  Xarray BackendEntrypoint for NEXRAD Level2 Data
 |
 |  Method resolution order:
 |      NexradLevel2BackendEntrypoint
 |      xarray.backends.common.BackendEntrypoint
 |      builtins.object
 |
 |  Methods defined here:
 |
 |  open_dataset(
 |      self,
 |      filename_or_obj,
 |      *,
 |      mask_and_scale=True,
 |      decode_times=True,
 |      concat_characters=True,
 |      decode_coords=True,
 |      drop_variables=None,
 |      use_cftime=None,
 |      decode_timedelta=None,
 |      group=None,
 |      lock=None,
 |      first_dim='auto',
 |      reindex_angle=False,
 |      fix_second_angle=False,
 |      site_as_coords=True,
 |      optional=True
 |  )
 |      Backend open_dataset method used by Xarray in :py:func:`~xarray.open_dataset`.
 |
 |  ----------------------------------------------------------------------
 |  Data and other attributes defined here:
 |
 |  __annotations__ = {}
 |
 |  description = 'Open NEXRAD Level2 files in Xarray'
 |
 |  open_dataset_parameters = ('filename_or_obj', 'mask_and_scale', 'decod...
 |
 |  url = 'tbd'
 |
 |  ----------------------------------------------------------------------
 |  Methods inherited from xarray.backends.common.BackendEntrypoint:
 |
 |  __repr__(self) -> 'str'
 |      Return repr(self).
 |
 |  guess_can_open(self, filename_or_obj: 'T_PathFileOrDataStore') -> 'bool'
 |      Backend open_dataset method used by Xarray in :py:func:`~xarray.open_dataset`.
 |
 |  open_datatree(
 |      self,
 |      filename_or_obj: 'T_PathFileOrDataStore',
 |      *,
 |      drop_variables: 'str | Iterable[str] | None' = None
 |  ) -> 'DataTree'
 |      Backend open_datatree method used by Xarray in :py:func:`~xarray.open_datatree`.
 |
 |      If implemented, set the class variable supports_groups to True.
 |
 |  open_groups_as_dict(
 |      self,
 |      filename_or_obj: 'T_PathFileOrDataStore',
 |      *,
 |      drop_variables: 'str | Iterable[str] | None' = None
 |  ) -> 'dict[str, Dataset]'
 |      Opens a dictionary mapping from group names to Datasets.
 |
 |      Called by :py:func:`~xarray.open_groups`.
 |      This function exists to provide a universal way to open all groups in a file,
 |      before applying any additional consistency checks or requirements necessary
 |      to create a `DataTree` object (typically done using :py:meth:`~xarray.DataTree.from_dict`).
 |
 |      If implemented, set the class variable supports_groups to True.
 |
 |  ----------------------------------------------------------------------
 |  Data descriptors inherited from xarray.backends.common.BackendEntrypoint:
 |
 |  __dict__
 |      dictionary for instance variables
 |
 |  __weakref__
 |      list of weak references to the object
 |
 |  ----------------------------------------------------------------------
 |  Data and other attributes inherited from xarray.backends.common.BackendEntrypoint:
 |
 |  supports_groups = False
ds = xr.open_dataset(filename, group="sweep_0", engine="nexradlevel2", first_dim="time")
display(ds)
<xarray.Dataset> Size: 42MB
Dimensions:            (time: 720, range: 1832)
Coordinates:
  * time               (time) datetime64[ns] 6kB 2013-07-17T19:50:21.652000 ....
    azimuth            (time) float64 6kB ...
    elevation          (time) float64 6kB ...
  * range              (range) float32 7kB 2.125e+03 2.375e+03 ... 4.599e+05
    longitude          float64 8B ...
    latitude           float64 8B ...
    altitude           int64 8B ...
Data variables:
    DBZH               (time, range) float64 11MB ...
    ZDR                (time, range) float64 11MB ...
    PHIDP              (time, range) float64 11MB ...
    RHOHV              (time, range) float64 11MB ...
    sweep_mode         <U20 80B ...
    sweep_number       int64 8B ...
    prt_mode           <U7 28B ...
    follow_mode        <U7 28B ...
    sweep_fixed_angle  float64 8B ...
Attributes: (12/16)
    instrument_name:              KATX
    scan_name:                    VCP-11
    dynamic_scan_type:            standard
    mpda_vcp:                     False
    base_tilt_vcp:                False
    num_base_tilts:               0
    ...                           ...
    vcp_pulse_width:              short
    avset_enabled:                False
    ebc_enabled:                  False
    super_res_status:             2
    rda_build_number:             1320
    operational_mode:             4

open_nexradlevel2_datatree#

The same works analoguous with the datatree loader. But additionally we can provide a sweep string, number or list.

help(xd.io.open_nexradlevel2_datatree)
Help on function open_nexradlevel2_datatree in module xradar.io.backends.nexrad_level2:

open_nexradlevel2_datatree(
    filename_or_obj,
    mask_and_scale=True,
    decode_times=True,
    concat_characters=True,
    decode_coords=True,
    drop_variables=None,
    use_cftime=None,
    decode_timedelta=None,
    sweep=None,
    first_dim='auto',
    reindex_angle=False,
    fix_second_angle=False,
    site_as_coords=True,
    optional=True,
    optional_groups=False,
    incomplete_sweep='drop',
    lock=None,
    **kwargs
)
    Open a NEXRAD Level2 dataset as :py:class:`xarray.DataTree`.

    This function loads NEXRAD Level2 radar data into a DataTree structure, which
    organizes radar sweeps as separate nodes. Provides options for decoding time
    and applying various transformations to the data.

    Parameters
    ----------
    filename_or_obj : str, Path, file-like, bytes, list, or DataStore
        The path or file-like object representing the radar file.
        Path-like objects are interpreted as local or remote paths.
        A list or tuple of chunk sources (bytes, file-like, or paths)
        will be concatenated before reading.  When passing chunks, the
        S file (volume header) **must** be the first element and I/E
        chunks **must** follow in sequence order (``.001``, ``.002``, …).
        Out-of-order chunks produce corrupted data or decompression errors.

    mask_and_scale : bool, optional
        If True, replaces values in the dataset that match `_FillValue` with NaN
        and applies scale and offset adjustments. Default is True.

    decode_times : bool, optional
        If True, decodes time variables according to CF conventions. Default is True.

    concat_characters : bool, optional
        If True, concatenates character arrays along the last dimension, forming
        string arrays. Default is True.

    decode_coords : bool, optional
        If True, decodes the "coordinates" attribute to identify coordinates in the
        resulting dataset. Default is True.

    drop_variables : str or list of str, optional
        Specifies variables to exclude from the dataset. Useful for removing problematic
        or inconsistent variables. Default is None.

    use_cftime : bool, optional
        If True, uses cftime objects to represent time variables; if False, uses
        `np.datetime64` objects. If None, chooses the best format automatically.
        Default is None.

    decode_timedelta : bool, optional
        If True, decodes variables with units of time (e.g., seconds, minutes) into
        timedelta objects. If False, leaves them as numeric values. Default is None.

    sweep : int or list of int, optional
        Sweep numbers to extract from the dataset. If None, extracts all sweeps into
        a list. Default is the first sweep.

    first_dim : {"time", "auto"}, optional
        Defines the first dimension for each sweep. If "time," uses time as the
        first dimension. If "auto," determines the first dimension based on the sweep
        type (azimuth or elevation). Default is "auto."

    reindex_angle : bool or dict, optional
        Controls angle reindexing. If True or a dictionary, applies reindexing with
        specified settings (if given). Only used if `decode_coords=True`. Default is False.

    fix_second_angle : bool, optional
        If True, corrects errors in the second angle data, such as misaligned
        elevation or azimuth values. Default is False.

    site_as_coords : bool, optional
        Attaches radar site coordinates to the dataset if True. Default is True.

    optional : bool, optional
        If True, suppresses errors for optional dataset attributes, making them
        optional instead of required. Default is True.

    optional_groups : bool, optional
        If True, includes ``/radar_parameters``, ``/georeferencing_correction``
        and ``/radar_calibration`` metadata subgroups in the DataTree. These
        groups are often empty or sparsely populated. Default is False.

    incomplete_sweep : {"drop", "pad"}, optional
        How to handle incomplete sweeps (sweeps that were force-closed because
        the data ended mid-sweep, e.g. chunk files).
        ``"drop"`` (default) excludes incomplete sweeps and emits a warning.
        ``"pad"`` includes them, reindexing to a full azimuth grid with
        NaN-filled rays for missing positions.

    kwargs : dict
        Additional keyword arguments passed to `xarray.open_dataset`.

    Returns
    -------
    dtree : xarray.DataTree
        An `xarray.DataTree` representing the radar data organized by sweeps.
dtree = xd.io.open_nexradlevel2_datatree(filename, sweep=4)
display(dtree)
<xarray.DataTree>
Group: /
│   Dimensions:              ()
│   Coordinates:
│       latitude             float64 8B 48.19
│       longitude            float64 8B -122.5
│       altitude             int64 8B 195
│   Data variables:
│       volume_number        int64 8B 0
│       platform_type        <U5 20B 'fixed'
│       instrument_type      <U5 20B 'radar'
│       time_coverage_start  <U20 80B '2013-07-17T19:51:38Z'
│       time_coverage_end    <U20 80B '2013-07-17T19:52:00Z'
│   Attributes: (12/25)
│       Conventions:                  None
│       instrument_name:              KATX
│       version:                      None
│       title:                        None
│       institution:                  None
│       references:                   None
│       ...                           ...
│       avset_enabled:                False
│       ebc_enabled:                  False
│       super_res_status:             2
│       rda_build_number:             1320
│       operational_mode:             4
│       actual_elevation_cuts:        16
└── Group: /sweep_4
        Dimensions:            (azimuth: 360, range: 1352)
        Coordinates:
          * azimuth            (azimuth) float64 3kB 0.563 1.533 2.469 ... 358.5 359.6
            elevation          (azimuth) float64 3kB 2.461 2.461 2.461 ... 2.461 2.461
            time               (azimuth) datetime64[ns] 3kB ...
            range              (range) float32 5kB 2.125e+03 2.375e+03 ... 3.399e+05
        Data variables:
            DBZH               (azimuth, range) float64 4MB ...
            VRADH              (azimuth, range) float64 4MB ...
            WRADH              (azimuth, range) float64 4MB ...
            ZDR                (azimuth, range) float64 4MB ...
            PHIDP              (azimuth, range) float64 4MB ...
            RHOHV              (azimuth, range) float64 4MB ...
            sweep_mode         <U20 80B 'azimuth_surveillance'
            sweep_number       int64 8B 4
            prt_mode           <U7 28B 'not_set'
            follow_mode        <U7 28B 'not_set'
            sweep_fixed_angle  float64 8B 2.417
        Attributes:
            waveform_type:          staggered_pulse_pair
            channel_config:         constant_phase
            super_resolution:       14
            sails_cut:              False
            sails_sequence_number:  0
            mrle_cut:               False
            mrle_sequence_number:   0
            mpda_cut:               False
            base_tilt_cut:          False

Plot Sweep Range vs. Time#

dtree["sweep_4"].ds.DBZH.sortby("time").plot(y="time", cmap="HomeyerRainbow")
<matplotlib.collections.QuadMesh at 0x78dfdd80aad0>
../_images/ff7bdac5ef3acb7b09dbd698839cbd7db5a3652103e3aa689a35b29fadd95eb6.png

Plot Sweep Range vs. Azimuth#

dtree["sweep_4"].ds.DBZH.plot(cmap="HomeyerRainbow")
<matplotlib.collections.QuadMesh at 0x78dfd6a3a5d0>
../_images/4ec2f0f69b2b435662fbeae70b02c2259440637e98c6b0fc56cf26692fb3f04b.png
dtree = xd.io.open_nexradlevel2_datatree(filename, sweep="sweep_8")
display(dtree)
<xarray.DataTree>
Group: /
│   Dimensions:              ()
│   Coordinates:
│       latitude             float64 8B 48.19
│       longitude            float64 8B -122.5
│       altitude             int64 8B 195
│   Data variables:
│       volume_number        int64 8B 0
│       platform_type        <U5 20B 'fixed'
│       instrument_type      <U5 20B 'radar'
│       time_coverage_start  <U20 80B '2013-07-17T19:53:05Z'
│       time_coverage_end    <U20 80B '2013-07-17T19:53:25Z'
│   Attributes: (12/25)
│       Conventions:                  None
│       instrument_name:              KATX
│       version:                      None
│       title:                        None
│       institution:                  None
│       references:                   None
│       ...                           ...
│       avset_enabled:                False
│       ebc_enabled:                  False
│       super_res_status:             2
│       rda_build_number:             1320
│       operational_mode:             4
│       actual_elevation_cuts:        16
└── Group: /sweep_8
        Dimensions:            (azimuth: 360, range: 704)
        Coordinates:
          * azimuth            (azimuth) float64 3kB 0.4999 1.513 2.521 ... 358.5 359.5
            elevation          (azimuth) float64 3kB 6.24 6.24 6.24 ... 6.24 6.24 6.24
            time               (azimuth) datetime64[ns] 3kB ...
            range              (range) float32 3kB 2.125e+03 2.375e+03 ... 1.779e+05
        Data variables:
            DBZH               (azimuth, range) float64 2MB ...
            VRADH              (azimuth, range) float64 2MB ...
            WRADH              (azimuth, range) float64 2MB ...
            ZDR                (azimuth, range) float64 2MB ...
            PHIDP              (azimuth, range) float64 2MB ...
            RHOHV              (azimuth, range) float64 2MB ...
            sweep_mode         <U20 80B 'azimuth_surveillance'
            sweep_number       int64 8B 8
            prt_mode           <U7 28B 'not_set'
            follow_mode        <U7 28B 'not_set'
            sweep_fixed_angle  float64 8B 6.196
        Attributes:
            waveform_type:          staggered_pulse_pair
            channel_config:         constant_phase
            super_resolution:       14
            sails_cut:              False
            sails_sequence_number:  0
            mrle_cut:               False
            mrle_sequence_number:   0
            mpda_cut:               False
            base_tilt_cut:          False
dtree = xd.io.open_nexradlevel2_datatree(filename, sweep=[0, 1, 8])
display(dtree)
<xarray.DataTree>
Group: /
│   Dimensions:              ()
│   Coordinates:
│       latitude             float64 8B 48.19
│       longitude            float64 8B -122.5
│       altitude             int64 8B 195
│   Data variables:
│       volume_number        int64 8B 0
│       platform_type        <U5 20B 'fixed'
│       instrument_type      <U5 20B 'radar'
│       time_coverage_start  <U20 80B '2013-07-17T19:50:21Z'
│       time_coverage_end    <U20 80B '2013-07-17T19:53:25Z'
│   Attributes: (12/25)
│       Conventions:                  None
│       instrument_name:              KATX
│       version:                      None
│       title:                        None
│       institution:                  None
│       references:                   None
│       ...                           ...
│       avset_enabled:                False
│       ebc_enabled:                  False
│       super_res_status:             2
│       rda_build_number:             1320
│       operational_mode:             4
│       actual_elevation_cuts:        16
├── Group: /sweep_0
│       Dimensions:            (azimuth: 720, range: 1832)
│       Coordinates:
│         * azimuth            (azimuth) float64 6kB 0.2582 0.7526 1.272 ... 359.3 359.8
│           elevation          (azimuth) float64 6kB 0.6592 0.6592 ... 0.6592 0.6592
│           time               (azimuth) datetime64[ns] 6kB ...
│           range              (range) float32 7kB 2.125e+03 2.375e+03 ... 4.599e+05
│       Data variables:
│           DBZH               (azimuth, range) float64 11MB ...
│           ZDR                (azimuth, range) float64 11MB ...
│           PHIDP              (azimuth, range) float64 11MB ...
│           RHOHV              (azimuth, range) float64 11MB ...
│           sweep_mode         <U20 80B 'azimuth_surveillance'
│           sweep_number       int64 8B 0
│           prt_mode           <U7 28B 'not_set'
│           follow_mode        <U7 28B 'not_set'
│           sweep_fixed_angle  float64 8B 0.4834
│       Attributes:
│           waveform_type:          contiguous_surveillance
│           channel_config:         constant_phase
│           super_resolution:       11
│           sails_cut:              False
│           sails_sequence_number:  0
│           mrle_cut:               False
│           mrle_sequence_number:   0
│           mpda_cut:               False
│           base_tilt_cut:          False
├── Group: /sweep_1
│       Dimensions:            (azimuth: 720, range: 1192)
│       Coordinates:
│         * azimuth            (azimuth) float64 6kB 0.2499 0.7938 1.252 ... 359.2 359.8
│           elevation          (azimuth) float64 6kB 0.5273 0.5273 ... 0.5273 0.5273
│           time               (azimuth) datetime64[ns] 6kB ...
│           range              (range) float32 5kB 2.125e+03 2.375e+03 ... 2.999e+05
│       Data variables:
│           DBZH               (azimuth, range) float64 7MB ...
│           VRADH              (azimuth, range) float64 7MB ...
│           WRADH              (azimuth, range) float64 7MB ...
│           sweep_mode         <U20 80B 'azimuth_surveillance'
│           sweep_number       int64 8B 1
│           prt_mode           <U7 28B 'not_set'
│           follow_mode        <U7 28B 'not_set'
│           sweep_fixed_angle  float64 8B 0.4834
│       Attributes:
│           waveform_type:          contiguous_doppler
│           channel_config:         constant_phase
│           super_resolution:       7
│           sails_cut:              False
│           sails_sequence_number:  0
│           mrle_cut:               False
│           mrle_sequence_number:   0
│           mpda_cut:               False
│           base_tilt_cut:          False
└── Group: /sweep_8
        Dimensions:            (azimuth: 360, range: 704)
        Coordinates:
          * azimuth            (azimuth) float64 3kB 0.4999 1.513 2.521 ... 358.5 359.5
            elevation          (azimuth) float64 3kB 6.24 6.24 6.24 ... 6.24 6.24 6.24
            time               (azimuth) datetime64[ns] 3kB ...
            range              (range) float32 3kB 2.125e+03 2.375e+03 ... 1.779e+05
        Data variables:
            DBZH               (azimuth, range) float64 2MB ...
            VRADH              (azimuth, range) float64 2MB ...
            WRADH              (azimuth, range) float64 2MB ...
            ZDR                (azimuth, range) float64 2MB ...
            PHIDP              (azimuth, range) float64 2MB ...
            RHOHV              (azimuth, range) float64 2MB ...
            sweep_mode         <U20 80B 'azimuth_surveillance'
            sweep_number       int64 8B 8
            prt_mode           <U7 28B 'not_set'
            follow_mode        <U7 28B 'not_set'
            sweep_fixed_angle  float64 8B 6.196
        Attributes:
            waveform_type:          staggered_pulse_pair
            channel_config:         constant_phase
            super_resolution:       14
            sails_cut:              False
            sails_sequence_number:  0
            mrle_cut:               False
            mrle_sequence_number:   0
            mpda_cut:               False
            base_tilt_cut:          False
dtree["sweep_0"]["sweep_fixed_angle"].values
array(0.48339844)
dtree["sweep_8"]["sweep_fixed_angle"].values
array(6.19628906)
dtree = xd.io.open_nexradlevel2_datatree(
    filename,
)
display(dtree)
<xarray.DataTree>
Group: /
│   Dimensions:              ()
│   Coordinates:
│       latitude             float64 8B 48.19
│       longitude            float64 8B -122.5
│       altitude             int64 8B 195
│   Data variables:
│       volume_number        int64 8B 0
│       platform_type        <U5 20B 'fixed'
│       instrument_type      <U5 20B 'radar'
│       time_coverage_start  <U20 80B '2013-07-17T19:50:21Z'
│       time_coverage_end    <U20 80B '2013-07-17T19:55:11Z'
│   Attributes: (12/25)
│       Conventions:                  None
│       instrument_name:              KATX
│       version:                      None
│       title:                        None
│       institution:                  None
│       references:                   None
│       ...                           ...
│       avset_enabled:                False
│       ebc_enabled:                  False
│       super_res_status:             2
│       rda_build_number:             1320
│       operational_mode:             4
│       actual_elevation_cuts:        16
├── Group: /sweep_0
│       Dimensions:            (azimuth: 720, range: 1832)
│       Coordinates:
│         * azimuth            (azimuth) float64 6kB 0.2582 0.7526 1.272 ... 359.3 359.8
│           elevation          (azimuth) float64 6kB 0.6592 0.6592 ... 0.6592 0.6592
│           time               (azimuth) datetime64[ns] 6kB ...
│           range              (range) float32 7kB 2.125e+03 2.375e+03 ... 4.599e+05
│       Data variables:
│           DBZH               (azimuth, range) float64 11MB ...
│           ZDR                (azimuth, range) float64 11MB ...
│           PHIDP              (azimuth, range) float64 11MB ...
│           RHOHV              (azimuth, range) float64 11MB ...
│           sweep_mode         <U20 80B 'azimuth_surveillance'
│           sweep_number       int64 8B 0
│           prt_mode           <U7 28B 'not_set'
│           follow_mode        <U7 28B 'not_set'
│           sweep_fixed_angle  float64 8B 0.4834
│       Attributes:
│           waveform_type:          contiguous_surveillance
│           channel_config:         constant_phase
│           super_resolution:       11
│           sails_cut:              False
│           sails_sequence_number:  0
│           mrle_cut:               False
│           mrle_sequence_number:   0
│           mpda_cut:               False
│           base_tilt_cut:          False
├── Group: /sweep_1
│       Dimensions:            (azimuth: 720, range: 1192)
│       Coordinates:
│         * azimuth            (azimuth) float64 6kB 0.2499 0.7938 1.252 ... 359.2 359.8
│           elevation          (azimuth) float64 6kB 0.5273 0.5273 ... 0.5273 0.5273
│           time               (azimuth) datetime64[ns] 6kB ...
│           range              (range) float32 5kB 2.125e+03 2.375e+03 ... 2.999e+05
│       Data variables:
│           DBZH               (azimuth, range) float64 7MB ...
│           VRADH              (azimuth, range) float64 7MB ...
│           WRADH              (azimuth, range) float64 7MB ...
│           sweep_mode         <U20 80B 'azimuth_surveillance'
│           sweep_number       int64 8B 1
│           prt_mode           <U7 28B 'not_set'
│           follow_mode        <U7 28B 'not_set'
│           sweep_fixed_angle  float64 8B 0.4834
│       Attributes:
│           waveform_type:          contiguous_doppler
│           channel_config:         constant_phase
│           super_resolution:       7
│           sails_cut:              False
│           sails_sequence_number:  0
│           mrle_cut:               False
│           mrle_sequence_number:   0
│           mpda_cut:               False
│           base_tilt_cut:          False
├── Group: /sweep_2
│       Dimensions:            (azimuth: 720, range: 1676)
│       Coordinates:
│         * azimuth            (azimuth) float64 6kB 0.2554 0.7553 1.241 ... 359.3 359.8
│           elevation          (azimuth) float64 6kB 1.494 1.494 1.494 ... 1.494 1.494
│           time               (azimuth) datetime64[ns] 6kB ...
│           range              (range) float32 7kB 2.125e+03 2.375e+03 ... 4.209e+05
│       Data variables:
│           DBZH               (azimuth, range) float64 10MB ...
│           ZDR                (azimuth, range) float64 10MB ...
│           PHIDP              (azimuth, range) float64 10MB ...
│           RHOHV              (azimuth, range) float64 10MB ...
│           sweep_mode         <U20 80B 'azimuth_surveillance'
│           sweep_number       int64 8B 2
│           prt_mode           <U7 28B 'not_set'
│           follow_mode        <U7 28B 'not_set'
│           sweep_fixed_angle  float64 8B 1.45
│       Attributes:
│           waveform_type:          contiguous_surveillance
│           channel_config:         constant_phase
│           super_resolution:       11
│           sails_cut:              False
│           sails_sequence_number:  0
│           mrle_cut:               False
│           mrle_sequence_number:   0
│           mpda_cut:               False
│           base_tilt_cut:          False
├── Group: /sweep_3
│       Dimensions:            (azimuth: 720, range: 1192)
│       Coordinates:
│         * azimuth            (azimuth) float64 6kB 0.2527 0.7526 1.247 ... 359.2 359.8
│           elevation          (azimuth) float64 6kB 1.494 1.494 1.494 ... 1.494 1.494
│           time               (azimuth) datetime64[ns] 6kB ...
│           range              (range) float32 5kB 2.125e+03 2.375e+03 ... 2.999e+05
│       Data variables:
│           DBZH               (azimuth, range) float64 7MB ...
│           VRADH              (azimuth, range) float64 7MB ...
│           WRADH              (azimuth, range) float64 7MB ...
│           sweep_mode         <U20 80B 'azimuth_surveillance'
│           sweep_number       int64 8B 3
│           prt_mode           <U7 28B 'not_set'
│           follow_mode        <U7 28B 'not_set'
│           sweep_fixed_angle  float64 8B 1.45
│       Attributes:
│           waveform_type:          contiguous_doppler
│           channel_config:         constant_phase
│           super_resolution:       7
│           sails_cut:              False
│           sails_sequence_number:  0
│           mrle_cut:               False
│           mrle_sequence_number:   0
│           mpda_cut:               False
│           base_tilt_cut:          False
├── Group: /sweep_4
│       Dimensions:            (azimuth: 360, range: 1352)
│       Coordinates:
│         * azimuth            (azimuth) float64 3kB 0.563 1.533 2.469 ... 358.5 359.6
│           elevation          (azimuth) float64 3kB 2.461 2.461 2.461 ... 2.461 2.461
│           time               (azimuth) datetime64[ns] 3kB ...
│           range              (range) float32 5kB 2.125e+03 2.375e+03 ... 3.399e+05
│       Data variables:
│           DBZH               (azimuth, range) float64 4MB ...
│           VRADH              (azimuth, range) float64 4MB ...
│           WRADH              (azimuth, range) float64 4MB ...
│           ZDR                (azimuth, range) float64 4MB ...
│           PHIDP              (azimuth, range) float64 4MB ...
│           RHOHV              (azimuth, range) float64 4MB ...
│           sweep_mode         <U20 80B 'azimuth_surveillance'
│           sweep_number       int64 8B 4
│           prt_mode           <U7 28B 'not_set'
│           follow_mode        <U7 28B 'not_set'
│           sweep_fixed_angle  float64 8B 2.417
│       Attributes:
│           waveform_type:          staggered_pulse_pair
│           channel_config:         constant_phase
│           super_resolution:       14
│           sails_cut:              False
│           sails_sequence_number:  0
│           mrle_cut:               False
│           mrle_sequence_number:   0
│           mpda_cut:               False
│           base_tilt_cut:          False
├── Group: /sweep_5
│       Dimensions:            (azimuth: 360, range: 1112)
│       Coordinates:
│         * azimuth            (azimuth) float64 3kB 0.5273 1.522 2.527 ... 358.5 359.5
│           elevation          (azimuth) float64 3kB 3.384 3.384 3.384 ... 3.384 3.384
│           time               (azimuth) datetime64[ns] 3kB ...
│           range              (range) float32 4kB 2.125e+03 2.375e+03 ... 2.799e+05
│       Data variables:
│           DBZH               (azimuth, range) float64 3MB ...
│           VRADH              (azimuth, range) float64 3MB ...
│           WRADH              (azimuth, range) float64 3MB ...
│           ZDR                (azimuth, range) float64 3MB ...
│           PHIDP              (azimuth, range) float64 3MB ...
│           RHOHV              (azimuth, range) float64 3MB ...
│           sweep_mode         <U20 80B 'azimuth_surveillance'
│           sweep_number       int64 8B 5
│           prt_mode           <U7 28B 'not_set'
│           follow_mode        <U7 28B 'not_set'
│           sweep_fixed_angle  float64 8B 3.384
│       Attributes:
│           waveform_type:          staggered_pulse_pair
│           channel_config:         constant_phase
│           super_resolution:       14
│           sails_cut:              False
│           sails_sequence_number:  0
│           mrle_cut:               False
│           mrle_sequence_number:   0
│           mpda_cut:               False
│           base_tilt_cut:          False
...
├── Group: /sweep_10
│       Dimensions:            (azimuth: 360, range: 500)
│       Coordinates:
│         * azimuth            (azimuth) float64 3kB 0.4944 1.502 2.527 ... 358.5 359.5
│           elevation          (azimuth) float64 3kB 8.701 8.701 8.701 ... 8.701 8.701
│           time               (azimuth) datetime64[ns] 3kB ...
│           range              (range) float32 2kB 2.125e+03 2.375e+03 ... 1.269e+05
│       Data variables:
│           DBZH               (azimuth, range) float64 1MB ...
│           VRADH              (azimuth, range) float64 1MB ...
│           WRADH              (azimuth, range) float64 1MB ...
│           ZDR                (azimuth, range) float64 1MB ...
│           PHIDP              (azimuth, range) float64 1MB ...
│           RHOHV              (azimuth, range) float64 1MB ...
│           sweep_mode         <U20 80B 'azimuth_surveillance'
│           sweep_number       int64 8B 10
│           prt_mode           <U7 28B 'not_set'
│           follow_mode        <U7 28B 'not_set'
│           sweep_fixed_angle  float64 8B 8.701
│       Attributes:
│           waveform_type:          batch
│           channel_config:         constant_phase
│           super_resolution:       10
│           sails_cut:              False
│           sails_sequence_number:  0
│           mrle_cut:               False
│           mrle_sequence_number:   0
│           mpda_cut:               False
│           base_tilt_cut:          False
├── Group: /sweep_11
│       Dimensions:            (azimuth: 360, range: 460)
│       Coordinates:
│         * azimuth            (azimuth) float64 3kB 0.5246 1.497 2.499 ... 358.5 359.5
│           elevation          (azimuth) float64 3kB 10.02 10.02 10.02 ... 10.02 10.02
│           time               (azimuth) datetime64[ns] 3kB ...
│           range              (range) float32 2kB 2.125e+03 2.375e+03 ... 1.169e+05
│       Data variables:
│           DBZH               (azimuth, range) float64 1MB ...
│           VRADH              (azimuth, range) float64 1MB ...
│           WRADH              (azimuth, range) float64 1MB ...
│           ZDR                (azimuth, range) float64 1MB ...
│           PHIDP              (azimuth, range) float64 1MB ...
│           RHOHV              (azimuth, range) float64 1MB ...
│           sweep_mode         <U20 80B 'azimuth_surveillance'
│           sweep_number       int64 8B 11
│           prt_mode           <U7 28B 'not_set'
│           follow_mode        <U7 28B 'not_set'
│           sweep_fixed_angle  float64 8B 10.02
│       Attributes:
│           waveform_type:          batch
│           channel_config:         constant_phase
│           super_resolution:       10
│           sails_cut:              False
│           sails_sequence_number:  0
│           mrle_cut:               False
│           mrle_sequence_number:   0
│           mpda_cut:               False
│           base_tilt_cut:          False
├── Group: /sweep_12
│       Dimensions:            (azimuth: 360, range: 388)
│       Coordinates:
│         * azimuth            (azimuth) float64 3kB 0.5081 1.494 2.508 ... 358.5 359.5
│           elevation          (azimuth) float64 3kB 12.0 12.0 12.0 ... 12.0 12.0 12.0
│           time               (azimuth) datetime64[ns] 3kB ...
│           range              (range) float32 2kB 2.125e+03 2.375e+03 ... 9.888e+04
│       Data variables:
│           DBZH               (azimuth, range) float64 1MB ...
│           VRADH              (azimuth, range) float64 1MB ...
│           WRADH              (azimuth, range) float64 1MB ...
│           ZDR                (azimuth, range) float64 1MB ...
│           PHIDP              (azimuth, range) float64 1MB ...
│           RHOHV              (azimuth, range) float64 1MB ...
│           sweep_mode         <U20 80B 'azimuth_surveillance'
│           sweep_number       int64 8B 12
│           prt_mode           <U7 28B 'not_set'
│           follow_mode        <U7 28B 'not_set'
│           sweep_fixed_angle  float64 8B 12.0
│       Attributes:
│           waveform_type:          batch
│           channel_config:         constant_phase
│           super_resolution:       10
│           sails_cut:              False
│           sails_sequence_number:  0
│           mrle_cut:               False
│           mrle_sequence_number:   0
│           mpda_cut:               False
│           base_tilt_cut:          False
├── Group: /sweep_13
│       Dimensions:            (azimuth: 360, range: 332)
│       Coordinates:
│         * azimuth            (azimuth) float64 3kB 0.5026 1.502 2.502 ... 358.5 359.5
│           elevation          (azimuth) float64 3kB 14.02 14.02 14.02 ... 14.02 14.02
│           time               (azimuth) datetime64[ns] 3kB ...
│           range              (range) float32 1kB 2.125e+03 2.375e+03 ... 8.488e+04
│       Data variables:
│           DBZH               (azimuth, range) float64 956kB ...
│           VRADH              (azimuth, range) float64 956kB ...
│           WRADH              (azimuth, range) float64 956kB ...
│           ZDR                (azimuth, range) float64 956kB ...
│           PHIDP              (azimuth, range) float64 956kB ...
│           RHOHV              (azimuth, range) float64 956kB ...
│           sweep_mode         <U20 80B 'azimuth_surveillance'
│           sweep_number       int64 8B 13
│           prt_mode           <U7 28B 'not_set'
│           follow_mode        <U7 28B 'not_set'
│           sweep_fixed_angle  float64 8B 14.02
│       Attributes:
│           waveform_type:          batch
│           channel_config:         constant_phase
│           super_resolution:       10
│           sails_cut:              False
│           sails_sequence_number:  0
│           mrle_cut:               False
│           mrle_sequence_number:   0
│           mpda_cut:               False
│           base_tilt_cut:          False
├── Group: /sweep_14
│       Dimensions:            (azimuth: 360, range: 280)
│       Coordinates:
│         * azimuth            (azimuth) float64 3kB 0.4916 1.491 2.494 ... 358.5 359.5
│           elevation          (azimuth) float64 3kB 16.7 16.7 16.7 ... 16.72 16.7 16.7
│           time               (azimuth) datetime64[ns] 3kB ...
│           range              (range) float32 1kB 2.125e+03 2.375e+03 ... 7.188e+04
│       Data variables:
│           DBZH               (azimuth, range) float64 806kB ...
│           VRADH              (azimuth, range) float64 806kB ...
│           WRADH              (azimuth, range) float64 806kB ...
│           ZDR                (azimuth, range) float64 806kB ...
│           PHIDP              (azimuth, range) float64 806kB ...
│           RHOHV              (azimuth, range) float64 806kB ...
│           sweep_mode         <U20 80B 'azimuth_surveillance'
│           sweep_number       int64 8B 14
│           prt_mode           <U7 28B 'not_set'
│           follow_mode        <U7 28B 'not_set'
│           sweep_fixed_angle  float64 8B 16.7
│       Attributes:
│           waveform_type:          batch
│           channel_config:         constant_phase
│           super_resolution:       10
│           sails_cut:              False
│           sails_sequence_number:  0
│           mrle_cut:               False
│           mrle_sequence_number:   0
│           mpda_cut:               False
│           base_tilt_cut:          False
└── Group: /sweep_15
        Dimensions:            (azimuth: 360, range: 240)
        Coordinates:
          * azimuth            (azimuth) float64 3kB 0.5054 1.5 2.505 ... 358.5 359.5
            elevation          (azimuth) float64 3kB 19.47 19.47 19.47 ... 19.47 19.47
            time               (azimuth) datetime64[ns] 3kB ...
            range              (range) float32 960B 2.125e+03 2.375e+03 ... 6.188e+04
        Data variables:
            DBZH               (azimuth, range) float64 691kB ...
            VRADH              (azimuth, range) float64 691kB ...
            WRADH              (azimuth, range) float64 691kB ...
            ZDR                (azimuth, range) float64 691kB ...
            PHIDP              (azimuth, range) float64 691kB ...
            RHOHV              (azimuth, range) float64 691kB ...
            sweep_mode         <U20 80B 'azimuth_surveillance'
            sweep_number       int64 8B 15
            prt_mode           <U7 28B 'not_set'
            follow_mode        <U7 28B 'not_set'
            sweep_fixed_angle  float64 8B 19.51
        Attributes:
            waveform_type:          batch
            channel_config:         constant_phase
            super_resolution:       10
            sails_cut:              False
            sails_sequence_number:  0
            mrle_cut:               False
            mrle_sequence_number:   0
            mpda_cut:               False
            base_tilt_cut:          False
dtree["sweep_1"]
<xarray.DataTree 'sweep_1'>
Group: /sweep_1
    Dimensions:            (azimuth: 720, range: 1192)
    Coordinates:
      * azimuth            (azimuth) float64 6kB 0.2499 0.7938 1.252 ... 359.2 359.8
        elevation          (azimuth) float64 6kB 0.5273 0.5273 ... 0.5273 0.5273
        time               (azimuth) datetime64[ns] 6kB ...
        range              (range) float32 5kB 2.125e+03 2.375e+03 ... 2.999e+05
    Data variables:
        DBZH               (azimuth, range) float64 7MB ...
        VRADH              (azimuth, range) float64 7MB ...
        WRADH              (azimuth, range) float64 7MB ...
        sweep_mode         <U20 80B 'azimuth_surveillance'
        sweep_number       int64 8B 1
        prt_mode           <U7 28B 'not_set'
        follow_mode        <U7 28B 'not_set'
        sweep_fixed_angle  float64 8B 0.4834
    Attributes:
        waveform_type:          contiguous_doppler
        channel_config:         constant_phase
        super_resolution:       7
        sails_cut:              False
        sails_sequence_number:  0
        mrle_cut:               False
        mrle_sequence_number:   0
        mpda_cut:               False
        base_tilt_cut:          False