From c21f3f1ece68f1febca251bba7128fc839e8fc58 Mon Sep 17 00:00:00 2001
From: jrobrien91 <obrienj@anl.gov>
Date: Thu, 21 Jul 2022 18:38:26 -0500
Subject: [PATCH 1/3] ENH: Corrected Height Gates to be height above sea level

---
 pyart/util/columnsect.py | 72 ++++++++++++++++++++++++++++------------
 1 file changed, 50 insertions(+), 22 deletions(-)

diff --git a/pyart/util/columnsect.py b/pyart/util/columnsect.py
index 896153cbda..cd6daa6d4e 100755
--- a/pyart/util/columnsect.py
+++ b/pyart/util/columnsect.py
@@ -179,13 +179,13 @@ def get_field_location(radar, latitude, longitude):
     # call the get_column_ray function
     ray = get_column_rays(radar, azim)
 
-    # Determine the gates for the rays
+    # Determine the center of each gate for the subsetted rays.
     (rhi_x,
      rhi_y,
      rhi_z) = antenna_vectors_to_cartesian(radar.range['data'],
                                            radar.azimuth['data'][ray],
                                            radar.elevation['data'][ray],
-                                           edges=True)
+                                           edges=False)
     # Calculate distance from the x,y coordinates to target
     rhidis = np.sqrt((rhi_x**2) + (rhi_y**2)) * np.sign(rhi_z)
     for i in range(len(ray)):
@@ -196,7 +196,9 @@ def get_field_location(radar, latitude, longitude):
             else:
                 moment[key].append(radar.fields[key]
                                    ['data'][ray[i], tar_gate])
-        zgate.append(rhi_z[i, tar_gate])
+        # Add radar elevation to height gates
+        # to define height as center of each gate above sea level
+        zgate.append(rhi_z[i, tar_gate] + radar.altitude['data'][0])
 
     # Determine the time at the center of each ray within the column
     # Define the start of the radar volume as a numpy datetime object for xr
@@ -211,34 +213,60 @@ def get_field_location(radar, latitude, longitude):
         total_time = base_time + delta
         combined_time.append(total_time.to_numpy())
 
-    # Create a blank list to hold the xarray DataArrays
+    # Create a blank list to hold the^ xarray DataArrays
     ds_container = []
     da_meta = ['units', 'standard_name', 'long_name', 'valid_max',
-               'valid_min']
+               'valid_min', 'coordinates']
     # Convert the moment dictionary to xarray DataArray.
     # Apply radar object meta data to DataArray attribute
     for key in moment:
-        da = xr.DataArray(moment[key],
-                          coords=dict(height=zgate),
-                          name=key, dims=['height'])
-        for tag in da_meta:
-            if tag in radar.fields[key]:
-                da.attrs[tag] = radar.fields[key][tag]
-        # Append to ds container
-        ds_container.append(da.to_dataset(name=key))
+        if key != 'height':
+            da = xr.DataArray(moment[key],
+                              coords=dict(height=zgate),
+                              name=key, dims=['height'])
+            for tag in da_meta:
+                if tag in radar.fields[key]:
+                    da.attrs[tag] = radar.fields[key][tag]
+            # Append to ds container
+            ds_container.append(da.to_dataset(name=key))
+
+    # Add additional DataArrays 'base_time' and 'time_offset'
+    # if not present within the radar object.
+    da_base = xr.DataArray(base_time, name='base_time')
+    da_offset = xr.DataArray(combined_time,
+                             coords=dict(height=zgate),
+                             name='time_offset', dims=['height'])
+    ds_container.append(da_base.to_dataset(name='base_time'))
+    ds_container.append(da_offset.to_dataset(name='time_offset'))
 
     # Create a xarray DataSet from the DataArrays
     column = xr.merge(ds_container)
-    # Add the time as an additional coordinate
-    column = column.assign_coords(coords=dict(time=combined_time))
-    if len(radar.time['units'].split(' ')) > 3:
-        column.attrs['scan_start_time'] = base_time
-    else:
-        column.attrs['scan_start_time'] = base_time
-    column.attrs['distance'] = (str(np.around(dis / 1000., 3)) + ' km')
+
+    # Assign Attributes for the Height and Times
+    height_des = ('Height Above Sea Level [in meters] for the Center of Each'
+                  + ' Radar Gate Above the Target Location')
+    column.height.attrs.update(long_name='Height of Radar Beam',
+                               units='m',
+                               standard_name='height',
+                               description=height_des)
+
+    column.base_time.attrs.update(long_name='UTC Reference Time',
+                                  units='seconds')
+
+    time_long = 'Time in Seconds Since Volume Start'
+    time_des = ("Time in Seconds Since Volume Start that Cooresponds"
+               + " to the Center of Each Height Gate"
+               + " Above the Target Location")
+    column.time_offset.attrs.update(long_name=time_long,
+                                    units='seconds',
+                                    description=time_des)
+
+    # Assign Global Attributes to the DataSet
+    column.attrs['distance_from_radar'] = (str(np.around(dis / 1000., 3))
+                                          + ' km')
     column.attrs['azimuth'] = (str(np.around(azim, 3)) + ' degrees')
-    column.attrs['latitude'] = (str(latitude) + ' degrees')
-    column.attrs['longitude'] = (str(longitude) + ' degrees')
+    column.attrs['latitude_of_location'] = (str(latitude) + ' degrees')
+    column.attrs['longitude_of_location'] = (str(longitude) + ' degrees')
     return column
 
 

From a2e21cb323d4e6c42308f0ed738c0cd6e79c9d76 Mon Sep 17 00:00:00 2001
From: jrobrien91 <obrienj@anl.gov>
Date: Thu, 21 Jul 2022 18:40:48 -0500
Subject: [PATCH 2/3] FIX: Removed character within comment line

---
 pyart/util/columnsect.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pyart/util/columnsect.py b/pyart/util/columnsect.py
index cd6daa6d4e..04e29688d2 100755
--- a/pyart/util/columnsect.py
+++ b/pyart/util/columnsect.py
@@ -213,7 +213,7 @@ def get_field_location(radar, latitude, longitude):
         total_time = base_time + delta
         combined_time.append(total_time.to_numpy())
 
-    # Create a blank list to hold the^ xarray DataArrays
+    # Create a blank list to hold the xarray DataArrays
     ds_container = []
     da_meta = ['units', 'standard_name', 'long_name', 'valid_max',
                'valid_min', 'coordinates']

From c7b7cb338fe24f8cb78824e164f7a364577c37fe Mon Sep 17 00:00:00 2001
From: jrobrien91 <obrienj@anl.gov>
Date: Thu, 21 Jul 2022 19:29:55 -0500
Subject: [PATCH 3/3] ENH: Updated Height Test to include altitude of radar.

---
 tests/util/test_columnsect.py | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/tests/util/test_columnsect.py b/tests/util/test_columnsect.py
index ba80f2e1ec..7a5b203ec3 100644
--- a/tests/util/test_columnsect.py
+++ b/tests/util/test_columnsect.py
@@ -31,8 +31,9 @@ def test_sphere_distance():
 def test_get_field_location():
     # test to make sure column above location is pulled correctly
     column = pyart.util.columnsect.get_field_location(radar, 47.97, -122.20)
+    
     # check to make sure z-gate is pulled correctly.
-    test_height = abs(column.height[0] - 367)
+    test_height = abs(column.height[0] - 564)
     assert (test_height < 0.001)
 
     # check to make sure reflectivity value is minimum