Repository: openradar/xradar

Issue:
BUG: Expand Sweep Fixed Mode Variables in NEXRAD Reader
### Description

As of now, the elevation angle, variable thresholds, etc. are condensed into an ordered dictionary in the `sweep_fixed_mode` data variable in the individual sweep dataset.

For example,

```python
import xradar as xd
from open_radar_data import DATASETS

filename = "../../../../Downloads/KDMX20200810_154746_V06"
ds = xr.open_dataset(filename, group="sweep_0", engine="nexradlevel2")
print(ds.sweep_fixed_angle.values)
```

```python
array(OrderedDict([('elevation_angle', 0.4833984375), ('channel_config', 2),
('waveform_type', 1), ('super_resolution', 11), ('prf_number', 1), ('prf_pulse_count', 15),
('azimuth_rate', 15400), ('ref_thresh', 16), ('vel_thresh', 16), ('sw_thresh', 16),
('zdr_thres', 16), ('phi_thres', 16), ('rho_thres', 16), ('edge_angle_1', 0),
('dop_prf_num_1', 0), ('dop_prf_pulse_count_1', 0), ('edge_angle_2', 0),
('dop_prf_num_2', 0), ('dop_prf_pulse_count_2', 0), ('edge_angle_3', 0),
('dop_prf_num_3', 0), ('dop_prf_pulse_count_3', 0)]), dtype=object)
```

### What we should do

We should expand this dictionary, and add these as additional variables in the `xr.Variable` fields in the given `xr.Dataset`.

What are your thoughts here @kmuehlbauer ? I think this would make it easier to then aggregate given an elevation angle, instead of opening an ordered dictionary in numpy array


Discussion:
codecov[bot]: ## [Codecov](https://app.codecov.io/gh/openradar/xradar/pull/162?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=openradar) Report
All modified and coverable lines are covered by tests :white_check_mark:
> Project coverage is 89.61%. Comparing base [(`56a9ca1`)](https://app.codecov.io/gh/openradar/xradar/commit/56a9ca1f42ca23074dc0b1d2a86d51e1bd4eafa2?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=openradar) to head [(`73f83c4`)](https://app.codecov.io/gh/openradar/xradar/pull/162?dropdown=coverage&src=pr&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=openradar).

> :exclamation: Current head 73f83c4 differs from pull request most recent head f354054. Consider uploading reports for the commit f354054 to get more accurate results


<details><summary>Additional details and impacted files</summary>


```diff
@@            Coverage Diff             @@
##             main     #162      +/-   ##
==========================================
- Coverage   91.30%   89.61%   -1.70%     
==========================================
  Files          21       21              
  Lines        3956     3956              
==========================================
- Hits         3612     3545      -67     
- Misses        344      411      +67     
```

| [Flag](https://app.codecov.io/gh/openradar/xradar/pull/162/flags?src=pr&el=flags&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=openradar) | Coverage Δ | |
|---|---|---|
| [notebooktests](https://app.codecov.io/gh/openradar/xradar/pull/162/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=openradar) | `?` | |
| [unittests](https://app.codecov.io/gh/openradar/xradar/pull/162/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=openradar) | `89.61% <100.00%> (ø)` | |

Flags with carried forward coverage won't be shown. [Click here](https://docs.codecov.io/docs/carryforward-flags?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=openradar#carryforward-flags-in-the-pull-request-comment) to find out more.


</details>

[:umbrella: View full report in Codecov by Sentry](https://app.codecov.io/gh/openradar/xradar/pull/162?dropdown=coverage&src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=openradar).   
:loudspeaker: Have feedback on the report? [Share it here](https://about.codecov.io/codecov-pr-comment-feedback/?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=openradar).

mgrover1: @kmuehlbauer - I am not sure why it mentions we are taking a 1.7% hit in test coverage?
kmuehlbauer: @mgrover1 No, no idea. Let's just move on here. Maybe it's just intermittent? 
kmuehlbauer: Seems ok now, no?
mgrover1: yep! good to merge @kmuehlbauer ?

Patch:
diff --git a/docs/history.md b/docs/history.md
index c45f272..bff2bfd 100644
--- a/docs/history.md
+++ b/docs/history.md
@@ -7,6 +7,7 @@
 * MNT: use CODECOV token ({pull}`155`) by [@kmuehlbauer](https://github.com/kmuehlbauer).
 * MNT: fix path for notebook coverage ({pull}`157`) by [@kmuehlbauer](https://github.com/kmuehlbauer).
 * ADD: NEXRAD Level2 structured reader ({pull}`158`) by [@kmuehlbauer](https://github.com/kmuehlbauer) and [@mgrover1](https://github.com/mgrover1).
+* FIX: Add the proper elevation angle to fixed angle ({pull}`162`) by [@mgrover1](https://github.com/mgrover1).
 
 ## 0.4.3 (2024-02-24)
 
diff --git a/xradar/io/backends/nexrad_level2.py b/xradar/io/backends/nexrad_level2.py
index a2a0e4d..74bb8a0 100644
--- a/xradar/io/backends/nexrad_level2.py
+++ b/xradar/io/backends/nexrad_level2.py
@@ -1359,7 +1359,7 @@ class NexradLevel2Store(AbstractDataStore):
         prt_mode = "not_set"
         follow_mode = "not_set"
 
-        fixed_angle = self.root.msg_5["elevation_data"][self._group]
+        fixed_angle = self.root.msg_5["elevation_data"][self._group]["elevation_angle"]
 
         coords = {
             "azimuth": Variable((dim,), azimuth, get_azimuth_attrs(), encoding),


Test patch:
diff --git a/tests/io/test_nexrad_level2.py b/tests/io/test_nexrad_level2.py
index ce3f8ee..54307be 100644
--- a/tests/io/test_nexrad_level2.py
+++ b/tests/io/test_nexrad_level2.py
@@ -6,6 +6,7 @@
 
 from collections import OrderedDict
 
+import numpy as np
 import pytest
 import xarray
 
@@ -26,6 +27,7 @@ def test_open_nexradlevel2_datatree(nexradlevel2_files):
     assert ds["DBZH"].shape == (720, 1832)
     assert ds["DBZH"].dims == ("azimuth", "range")
     assert int(ds.sweep_number.values) == 0
+    np.testing.assert_almost_equal(ds.sweep_fixed_angle.values, 0.4833984)
 
 
 @pytest.mark.parametrize(