From d837757a8f1944b53a91bcbb9bd5d4cebb344023 Mon Sep 17 00:00:00 2001 From: Robert Jackson Date: Wed, 1 Jul 2026 15:23:53 +0000 Subject: [PATCH 1/3] ADD: XSAPR --- src/radclss/config/default_config.py | 18 ++++++++++++ src/radclss/core/radclss_core.py | 7 +++-- src/radclss/util/column_utils.py | 42 ++++++++++++++-------------- 3 files changed, 44 insertions(+), 23 deletions(-) diff --git a/src/radclss/config/default_config.py b/src/radclss/config/default_config.py index 9a7603a..c159046 100644 --- a/src/radclss/config/default_config.py +++ b/src/radclss/config/default_config.py @@ -76,6 +76,24 @@ "signal_to_noise_ratio_copolar_v", "normalized_coherent_power", "normalized_coherent_power_v", + ], + "radar_xsapr": [ + "classification_mask", + "censor_mask", + "uncorrected_copol_correlation_coeff", + "uncorrected_differential_phase", + "uncorrected_differential_reflectivity", + "uncorrected_differential_reflectivity_lag_1", + "uncorrected_mean_doppler_velocity_h", + "uncorrected_mean_doppler_velocity_v", + "uncorrected_reflectivity_h", + "uncorrected_reflectivity_v", + "uncorrected_spectral_width_h", + "uncorrected_spectral_width_v", + "signal_to_noise_ratio_copolar_v", + "normalized_coherent_power", + "normalized_coherent_power_v", + "radar_echo_classification" ], "met": [ "base_time", diff --git a/src/radclss/core/radclss_core.py b/src/radclss/core/radclss_core.py index 808eaf0..66338c5 100644 --- a/src/radclss/core/radclss_core.py +++ b/src/radclss/core/radclss_core.py @@ -4,6 +4,7 @@ import act import numpy as np import pandas as pd +import traceback from ..util.column_utils import ( @@ -201,8 +202,10 @@ def radclss( ) columns[k].append(result) - except Exception: + except Exception as e: result = None + if verbose: + traceback.print_exc() if verbose: if result is not None: print( @@ -710,7 +713,7 @@ def _get_nexrad_wrapper(time_str): site = base_station site = site.upper() - if instrument == "kazr2": + if instrument == "kazr2" or instrument == "kazr": _instrument_tasks.append( ( k, diff --git a/src/radclss/util/column_utils.py b/src/radclss/util/column_utils.py index 36cbe83..aee75bc 100644 --- a/src/radclss/util/column_utils.py +++ b/src/radclss/util/column_utils.py @@ -150,6 +150,7 @@ def _vpt_to_column_timeseries(radar, height_bins): ] data_vars = {} for key in radar.fields: + print(key, radar.fields[key]["data"].dtype) arr = np.ma.filled(radar.fields[key]["data"], np.nan).astype(float) attrs = { tag: radar.fields[key][tag] for tag in da_meta if tag in radar.fields[key] @@ -518,7 +519,6 @@ def subset_points( for lat, lon, site in zip(lats, lons, sites): # Make sure we are interpolating from the radar's location above sea level # NOTE: interpolating throughout Troposphere to match sonde to in the future - if "vpt" in radar.metadata["scan_mode"]: if radar.metadata.get("facility_id", "") == site: da = _vpt_to_column_timeseries(radar, height_bins) @@ -563,27 +563,27 @@ def subset_points( da = da.sortby("height") valid = np.isfinite(da["height"]) n_valid = int(valid.sum()) + interpolated = False + dvars = da.data_vars + for v in dvars: + if np.all(np.isnan(da[v].values)): + da = da.drop(v) if n_valid > 0: - try: - # Drop all NaNs - da = ( - da.dropna("height") - .sortby("height") - .interp(height=height_bins) - ) - except pd.errors.InvalidIndexError: - da = da.drop_duplicates("height", keep="first") - - valid = np.isfinite(da["height"]) - da = ( - da.dropna("height") - .sortby("height") - .interp(height=height_bins) - ) - time_offset = time_offset.drop_duplicates( - "height", keep="first" - ) - else: + da_clean = da.dropna("height").sortby("height") + if da_clean.sizes.get("height", 0) > 0: + try: + da = da_clean.interp(height=height_bins) + except pd.errors.InvalidIndexError: + da_clean = da_clean.drop_duplicates( + "height", keep="first" + ) + da = da_clean.interp(height=height_bins) + time_offset = time_offset.drop_duplicates( + "height", keep="first" + ) + interpolated = True + + if not interpolated: target_height = xr.DataArray( height_bins, dims="height", name="height" ) From d84f67b07d5f1b5e272ae10a6103d69aec482d7a Mon Sep 17 00:00:00 2001 From: Robert Jackson Date: Wed, 1 Jul 2026 11:10:32 -0500 Subject: [PATCH 2/3] STY: Linting fixes. --- src/radclss/core/radclss_core.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/radclss/core/radclss_core.py b/src/radclss/core/radclss_core.py index 66338c5..0b039c6 100644 --- a/src/radclss/core/radclss_core.py +++ b/src/radclss/core/radclss_core.py @@ -202,7 +202,7 @@ def radclss( ) columns[k].append(result) - except Exception as e: + except Exception: result = None if verbose: traceback.print_exc() @@ -306,7 +306,7 @@ def _get_nexrad_wrapper(time_str): output_config["site"], input_site_dict, nexrad_radar=nexrad_site, - height_bins=height_bins + height_bins=height_bins, ) results = current_client.map(_get_nexrad_wrapper, time_list) @@ -343,7 +343,7 @@ def _get_nexrad_wrapper(time_str): output_config["site"], input_site_dict, nexrad_radar=nexrad_site, - height_bins=height_bins + height_bins=height_bins, ) successful_count = 0 @@ -439,7 +439,7 @@ def _get_nexrad_wrapper(time_str): print("=" * 80) print(f" Time coordinate method: {time_coords}") - ds_concat[k] = ds_concat[k].drop_duplicates('time') + ds_concat[k] = ds_concat[k].drop_duplicates("time") if "radar" in time_coords: if verbose: print(f" Reindexing all datasets to {time_coords} time coordinates") From 14168339748f71743e7daed05ad91354b283f62a Mon Sep 17 00:00:00 2001 From: Robert Jackson Date: Wed, 1 Jul 2026 11:15:58 -0500 Subject: [PATCH 3/3] VER: 2026.7.1 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 79bdecd..9d15fd9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "radclss" -version = "2026.5.20" +version = "2026.7.1" description = "Extracted Radar Columns and In Situ Sensors" readme = "README.md" requires-python = ">=3.10"