diff --git a/continuous-integration/environment-actions.yml b/continuous-integration/environment-actions.yml index 3bbbe40..22a96db 100644 --- a/continuous-integration/environment-actions.yml +++ b/continuous-integration/environment-actions.yml @@ -1,7 +1,6 @@ name: testenv channels: - conda-forge - - defaults dependencies: - arm_pyart - pip @@ -13,4 +12,4 @@ dependencies: - matplotlib - dask - distributed - - xarray + - xarray==2025.6.1 diff --git a/pyproject.toml b/pyproject.toml index 395b434..d6d60e2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,10 +1,11 @@ [build-system] requires = ["setuptools>=61", "wheel"] build-backend = "setuptools.build_meta" +package-dir = {"" = "src"} [project] name = "radclss" -version = "2026.1.30" +version = "2026.2.6" description = "Extracted Radar Columns and In Situ Sensors" readme = "README.md" requires-python = ">=3.9" diff --git a/radclss/config/default_config.py b/radclss/config/default_config.py deleted file mode 100644 index 67f5c95..0000000 --- a/radclss/config/default_config.py +++ /dev/null @@ -1,181 +0,0 @@ -""" -Default configuration file for RadCLss - -This file contains default parameters and variables used throughout RadCLss. - -""" -# Define variables to drop from RadCLss from the respective datastreams -DEFAULT_DISCARD_VAR = {'radar' : ['classification_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', - 'clutter_masked_velocity', - 'gate_id', - 'ground_clutter', - 'partial_beam_blockage', - 'cumulative_beam_blockage', - 'unfolded_differential_phase', - 'path_integrated_attenuation', - 'path_integrated_differential_attenuation', - 'unthresholded_power_copolar_v', - 'unthresholded_power_copolar_h', - 'specific_differential_phase', - 'specific_differential_attenuation', - 'reflectivity_v', - 'reflectivity', - 'mean_doppler_velocity_v', - 'mean_doppler_velocity', - 'differential_reflectivity_lag_1', - 'differential_reflectivity', - 'differential_phase', - 'normalized_coherent_power', - 'normalized_coherent_power_v', - 'signal_to_noise_ratio_copolar_h', - 'signal_to_noise_ratio_copolar_v', - 'specific_attenuation', - 'spectral_width', - 'spectral_width_v', - 'sounding_temperature', - 'signal_to_noise_ratio', - 'velocity_texture', - 'simulated_velocity', - 'height_over_iso0' - ], - 'met' : ['base_time', 'time_offset', 'time_bounds', 'logger_volt', - 'logger_temp', 'qc_logger_temp', 'lat', 'lon', 'alt', 'qc_temp_mean', - 'qc_rh_mean', 'qc_vapor_pressure_mean', 'qc_wspd_arith_mean', 'qc_wspd_vec_mean', - 'qc_wdir_vec_mean', 'qc_pwd_mean_vis_1min', 'qc_pwd_mean_vis_10min', 'qc_pwd_pw_code_inst', - 'qc_pwd_pw_code_15min', 'qc_pwd_pw_code_1hr', 'qc_pwd_precip_rate_mean_1min', - 'qc_pwd_cumul_rain', 'qc_pwd_cumul_snow', 'qc_org_precip_rate_mean', 'qc_tbrg_precip_total', - 'qc_tbrg_precip_total_corr', 'qc_logger_volt', 'qc_logger_temp', 'qc_atmos_pressure', - 'pwd_pw_code_inst', 'pwd_pw_code_15min', 'pwd_pw_code_1hr', 'temp_std', 'rh_std', - 'vapor_pressure_std', 'wdir_vec_std', 'tbrg_precip_total', 'org_precip_rate_mean', - 'pwd_mean_vis_1min', 'pwd_mean_vis_10min', 'pwd_precip_rate_mean_1min', 'pwd_cumul_rain', - 'pwd_cumul_snow', 'pwd_err_code' - ], - 'sonde' : ['base_time', 'time_offset', 'lat', 'lon', 'qc_pres', - 'qc_tdry', 'qc_dp', 'qc_wspd', 'qc_deg', 'qc_rh', - 'qc_u_wind', 'qc_v_wind', 'qc_asc', "wstat", "asc" - ], - 'pluvio' : ['base_time', 'time_offset', 'load_cell_temp', 'heater_status', - 'elec_unit_temp', 'supply_volts', 'orifice_temp', 'volt_min', - 'ptemp', 'lat', 'lon', 'alt', 'maintenance_flag', 'reset_flag', - 'qc_rh_mean', 'pluvio_status', 'bucket_rt', 'accum_total_nrt' - ], - 'ldquants' : ['specific_differential_attenuation_xband20c', - 'specific_differential_attenuation_kaband20c', - 'specific_differential_attenuation_sband20c', - 'bringi_conv_stra_flag', - 'exppsd_slope', - 'norm_num_concen', - 'num_concen', - 'gammapsd_shape', - 'gammapsd_slope', - 'mean_doppler_vel_wband20c', - 'mean_doppler_vel_kaband20c', - 'mean_doppler_vel_xband20c', - 'mean_doppler_vel_sband20c', - 'specific_attenuation_kaband20c', - 'specific_attenuation_xband20c', - 'specific_attenuation_sband20c', - 'specific_differential_phase_kaband20c', - 'specific_differential_phase_xband20c', - 'specific_differential_phase_sband20c', - 'differential_reflectivity_kaband20c', - 'differential_reflectivity_xband20c', - 'differential_reflectivity_sband20c', - 'reflectivity_factor_wband20c', - 'reflectivity_factor_kaband20c', - 'reflectivity_factor_xband20c', - 'reflectivity_factor_sband20c', - 'bringi_conv_stra_flag', - 'time_offset', - 'base_time', - 'lat', - 'lon', - 'alt' - ], - 'vdisquants' : ['specific_differential_attenuation_xband20c', - 'specific_differential_attenuation_kaband20c', - 'specific_differential_attenuation_sband20c', - 'bringi_conv_stra_flag', - 'exppsd_slope', - 'norm_num_concen', - 'num_concen', - 'gammapsd_shape', - 'gammapsd_slope', - 'mean_doppler_vel_wband20c', - 'mean_doppler_vel_kaband20c', - 'mean_doppler_vel_xband20c', - 'mean_doppler_vel_sband20c', - 'specific_attenuation_kaband20c', - 'specific_attenuation_xband20c', - 'specific_attenuation_sband20c', - 'specific_differential_phase_kaband20c', - 'specific_differential_phase_xband20c', - 'specific_differential_phase_sband20c', - 'differential_reflectivity_kaband20c', - 'differential_reflectivity_xband20c', - 'differential_reflectivity_sband20c', - 'reflectivity_factor_wband20c', - 'reflectivity_factor_kaband20c', - 'reflectivity_factor_xband20c', - 'reflectivity_factor_sband20c', - 'bringi_conv_stra_flag', - 'time_offset', - 'base_time', - 'lat', - 'lon', - 'alt' - ], - 'wxt' : ['base_time', - 'time_offset', - 'time_bounds', - 'qc_temp_mean', - 'temp_std', - 'rh_mean', - 'qc_rh_mean', - 'rh_std', - 'atmos_pressure', - 'qc_atmos_pressure', - 'wspd_arith_mean', - 'qc_wspd_arith_mean', - 'wspd_vec_mean', - 'qc_wspd_vec_mean', - 'wdir_vec_mean', - 'qc_wdir_vec_mean', - 'wdir_vec_std', - 'qc_wxt_precip_rate_mean', - 'qc_wxt_cumul_precip', - 'logger_volt', - 'qc_logger_volt', - 'logger_temp', - 'qc_logger_temp', - 'lat', - 'lon', - 'alt' - ] - } - - - -def set_discarded_variables(instrument, var_list): - """ - Set the variables to be discarded from a given instrument datastream. - - Parameters - ---------- - instrument : str - The instrument name (e.g., 'radar', 'met', 'sonde', etc.). - var_list : list - List of variable names to discard. - """ - global DEFAULT_DISCARD_VAR - DEFAULT_DISCARD_VAR[instrument] = var_list \ No newline at end of file diff --git a/radclss/__init__.py b/src/radclss/__init__.py similarity index 100% rename from radclss/__init__.py rename to src/radclss/__init__.py diff --git a/radclss/config/__init__.py b/src/radclss/config/__init__.py similarity index 100% rename from radclss/config/__init__.py rename to src/radclss/config/__init__.py diff --git a/src/radclss/config/default_config.py b/src/radclss/config/default_config.py new file mode 100644 index 0000000..1b7d79d --- /dev/null +++ b/src/radclss/config/default_config.py @@ -0,0 +1,248 @@ +""" +Default configuration file for RadCLss + +This file contains default parameters and variables used throughout RadCLss. + +""" + +# Define variables to drop from RadCLss from the respective datastreams +DEFAULT_DISCARD_VAR = { + "radar": [ + "classification_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", + "clutter_masked_velocity", + "gate_id", + "ground_clutter", + "partial_beam_blockage", + "cumulative_beam_blockage", + "unfolded_differential_phase", + "path_integrated_attenuation", + "path_integrated_differential_attenuation", + "unthresholded_power_copolar_v", + "unthresholded_power_copolar_h", + "specific_differential_phase", + "specific_differential_attenuation", + "reflectivity_v", + "reflectivity", + "mean_doppler_velocity_v", + "mean_doppler_velocity", + "differential_reflectivity_lag_1", + "differential_reflectivity", + "differential_phase", + "normalized_coherent_power", + "normalized_coherent_power_v", + "signal_to_noise_ratio_copolar_h", + "signal_to_noise_ratio_copolar_v", + "specific_attenuation", + "spectral_width", + "spectral_width_v", + "sounding_temperature", + "signal_to_noise_ratio", + "velocity_texture", + "simulated_velocity", + "height_over_iso0", + ], + "met": [ + "base_time", + "time_offset", + "time_bounds", + "logger_volt", + "logger_temp", + "qc_logger_temp", + "lat", + "lon", + "alt", + "qc_temp_mean", + "qc_rh_mean", + "qc_vapor_pressure_mean", + "qc_wspd_arith_mean", + "qc_wspd_vec_mean", + "qc_wdir_vec_mean", + "qc_pwd_mean_vis_1min", + "qc_pwd_mean_vis_10min", + "qc_pwd_pw_code_inst", + "qc_pwd_pw_code_15min", + "qc_pwd_pw_code_1hr", + "qc_pwd_precip_rate_mean_1min", + "qc_pwd_cumul_rain", + "qc_pwd_cumul_snow", + "qc_org_precip_rate_mean", + "qc_tbrg_precip_total", + "qc_tbrg_precip_total_corr", + "qc_logger_volt", + "qc_logger_temp", + "qc_atmos_pressure", + "pwd_pw_code_inst", + "pwd_pw_code_15min", + "pwd_pw_code_1hr", + "temp_std", + "rh_std", + "vapor_pressure_std", + "wdir_vec_std", + "tbrg_precip_total", + "org_precip_rate_mean", + "pwd_mean_vis_1min", + "pwd_mean_vis_10min", + "pwd_precip_rate_mean_1min", + "pwd_cumul_rain", + "pwd_cumul_snow", + "pwd_err_code", + ], + "sonde": [ + "base_time", + "time_offset", + "lat", + "lon", + "qc_pres", + "qc_tdry", + "qc_dp", + "qc_wspd", + "qc_deg", + "qc_rh", + "qc_u_wind", + "qc_v_wind", + "qc_asc", + "wstat", + "asc", + ], + "pluvio": [ + "base_time", + "time_offset", + "load_cell_temp", + "heater_status", + "elec_unit_temp", + "supply_volts", + "orifice_temp", + "volt_min", + "ptemp", + "lat", + "lon", + "alt", + "maintenance_flag", + "reset_flag", + "qc_rh_mean", + "pluvio_status", + "bucket_rt", + "accum_total_nrt", + ], + "ldquants": [ + "specific_differential_attenuation_xband20c", + "specific_differential_attenuation_kaband20c", + "specific_differential_attenuation_sband20c", + "bringi_conv_stra_flag", + "exppsd_slope", + "norm_num_concen", + "num_concen", + "gammapsd_shape", + "gammapsd_slope", + "mean_doppler_vel_wband20c", + "mean_doppler_vel_kaband20c", + "mean_doppler_vel_xband20c", + "mean_doppler_vel_sband20c", + "specific_attenuation_kaband20c", + "specific_attenuation_xband20c", + "specific_attenuation_sband20c", + "specific_differential_phase_kaband20c", + "specific_differential_phase_xband20c", + "specific_differential_phase_sband20c", + "differential_reflectivity_kaband20c", + "differential_reflectivity_xband20c", + "differential_reflectivity_sband20c", + "reflectivity_factor_wband20c", + "reflectivity_factor_kaband20c", + "reflectivity_factor_xband20c", + "reflectivity_factor_sband20c", + "bringi_conv_stra_flag", + "time_offset", + "base_time", + "lat", + "lon", + "alt", + ], + "vdisquants": [ + "specific_differential_attenuation_xband20c", + "specific_differential_attenuation_kaband20c", + "specific_differential_attenuation_sband20c", + "bringi_conv_stra_flag", + "exppsd_slope", + "norm_num_concen", + "num_concen", + "gammapsd_shape", + "gammapsd_slope", + "mean_doppler_vel_wband20c", + "mean_doppler_vel_kaband20c", + "mean_doppler_vel_xband20c", + "mean_doppler_vel_sband20c", + "specific_attenuation_kaband20c", + "specific_attenuation_xband20c", + "specific_attenuation_sband20c", + "specific_differential_phase_kaband20c", + "specific_differential_phase_xband20c", + "specific_differential_phase_sband20c", + "differential_reflectivity_kaband20c", + "differential_reflectivity_xband20c", + "differential_reflectivity_sband20c", + "reflectivity_factor_wband20c", + "reflectivity_factor_kaband20c", + "reflectivity_factor_xband20c", + "reflectivity_factor_sband20c", + "bringi_conv_stra_flag", + "time_offset", + "base_time", + "lat", + "lon", + "alt", + ], + "wxt": [ + "base_time", + "time_offset", + "time_bounds", + "qc_temp_mean", + "temp_std", + "rh_mean", + "qc_rh_mean", + "rh_std", + "atmos_pressure", + "qc_atmos_pressure", + "wspd_arith_mean", + "qc_wspd_arith_mean", + "wspd_vec_mean", + "qc_wspd_vec_mean", + "wdir_vec_mean", + "qc_wdir_vec_mean", + "wdir_vec_std", + "qc_wxt_precip_rate_mean", + "qc_wxt_cumul_precip", + "logger_volt", + "qc_logger_volt", + "logger_temp", + "qc_logger_temp", + "lat", + "lon", + "alt", + ], +} + + +def set_discarded_variables(instrument, var_list): + """ + Set the variables to be discarded from a given instrument datastream. + + Parameters + ---------- + instrument : str + The instrument name (e.g., 'radar', 'met', 'sonde', etc.). + var_list : list + List of variable names to discard. + """ + global DEFAULT_DISCARD_VAR + DEFAULT_DISCARD_VAR[instrument] = var_list diff --git a/radclss/config/output_config.py b/src/radclss/config/output_config.py similarity index 100% rename from radclss/config/output_config.py rename to src/radclss/config/output_config.py diff --git a/radclss/core/__init__.py b/src/radclss/core/__init__.py similarity index 74% rename from radclss/core/__init__.py rename to src/radclss/core/__init__.py index a0d8769..782e7d9 100644 --- a/radclss/core/__init__.py +++ b/src/radclss/core/__init__.py @@ -10,4 +10,7 @@ radclss_core """ -from .radclss_core import radclss # noqa: F401 + +from .radclss_core import radclss # noqa: F401 + +__all__ = ["radclss"] diff --git a/radclss/core/radclss_core.py b/src/radclss/core/radclss_core.py similarity index 99% rename from radclss/core/radclss_core.py rename to src/radclss/core/radclss_core.py index 04c428e..22a41a9 100644 --- a/radclss/core/radclss_core.py +++ b/src/radclss/core/radclss_core.py @@ -236,6 +236,7 @@ def radclss( ds, volumes[k], site.upper(), + resample="sum", discard=discard_var["pluvio"], verbose=verbose, ) diff --git a/radclss/io/__init__.py b/src/radclss/io/__init__.py similarity index 57% rename from radclss/io/__init__.py rename to src/radclss/io/__init__.py index fbf366f..4a42069 100644 --- a/radclss/io/__init__.py +++ b/src/radclss/io/__init__.py @@ -1 +1,3 @@ from .write import write_radclss_output # noqa + +__all__ = ["write_radclss_output"] diff --git a/radclss/io/write.py b/src/radclss/io/write.py similarity index 100% rename from radclss/io/write.py rename to src/radclss/io/write.py diff --git a/radclss/util/__init__py b/src/radclss/util/__init__.py similarity index 51% rename from radclss/util/__init__py rename to src/radclss/util/__init__.py index 213cba3..0f12181 100644 --- a/radclss/util/__init__py +++ b/src/radclss/util/__init__.py @@ -1 +1,3 @@ -from .column_utils import subset_points, match_datasets_act # noqa +from .column_utils import subset_points, match_datasets_act # noqa: F401 + +__all__ = ["subset_points", "match_datasets_act"] diff --git a/radclss/util/column_utils.py b/src/radclss/util/column_utils.py similarity index 93% rename from radclss/util/column_utils.py rename to src/radclss/util/column_utils.py index 6d9b2c5..986b939 100644 --- a/radclss/util/column_utils.py +++ b/src/radclss/util/column_utils.py @@ -172,6 +172,7 @@ def match_datasets_act( site, discard, resample="sum", + resample_time="5Min", DataSet=False, prefix=None, verbose=False, @@ -200,8 +201,14 @@ def match_datasets_act( resample : str Mathematical operational for resampling ground instrumentation to the radar time. - Default is to sum the data across the resampling period. Checks for 'mean' or - to 'skip' altogether. + 'sum' will sum the ground data within the resample_time window, + 'mean' will average the ground data within the resample_time window, + and 'skip' will not resample the data and will only interpolate to the radar time. + Default is 'sum'. + + resample_time : str + Time resolution for resampling ground instrumentation data before mapping to radar time. + Default is "5Min". DataSet : boolean Boolean flag to determine if ground input is an Xarray Dataset. @@ -241,24 +248,28 @@ def match_datasets_act( if "height" in grd_ds.dims: grd_ds = grd_ds.interp(height=np.arange(3150, 10050, 50), method="linear") - # Resample the ground data to 5 min and interpolate to the CSU X-Band time. + # Resample the ground data to 5 min and interpolate to the radar time. # Keep data variable attributes to help distingish between instruments/locations - if resample.split("=")[-1] == "mean": + if resample == "mean": matched = ( - grd_ds.resample(time="5Min", closed="right") + grd_ds.resample(time=resample_time, closed="right") .mean(keep_attrs=True) .interp(time=column.time, method="linear") ) - elif resample.split("=")[-1] == "skip": + elif resample == "skip": matched = grd_ds.interp(time=column.time, method="linear") - else: + elif resample == "sum": matched = ( - grd_ds.resample(time="5Min", closed="right") + grd_ds.resample(time=resample_time, closed="right") .sum(keep_attrs=True) .interp(time=column.time, method="linear") ) + else: + raise ValueError( + "Invalid resample method. Please choose 'mean', 'sum', or 'skip'." + ) - # Add SAIL site location as a dimension for the Pluvio data + # Add site location as a dimension for the Pluvio data matched = matched.assign_coords(coords=dict(station=site)) matched = matched.expand_dims("station") diff --git a/radclss/vis/__init__.py b/src/radclss/vis/__init__.py similarity index 57% rename from radclss/vis/__init__.py rename to src/radclss/vis/__init__.py index 94b1b72..3ac8641 100644 --- a/radclss/vis/__init__.py +++ b/src/radclss/vis/__init__.py @@ -2,3 +2,8 @@ create_radclss_columns, # noqa create_radclss_rainfall_timeseries, # noqa ) # noqa + +__all__ = [ + "create_radclss_columns", + "create_radclss_rainfall_timeseries", +] diff --git a/radclss/vis/quicklooks.py b/src/radclss/vis/quicklooks.py similarity index 100% rename from radclss/vis/quicklooks.py rename to src/radclss/vis/quicklooks.py diff --git a/tests/test_output.nc b/tests/test_output.nc new file mode 100644 index 0000000..6ffb3a7 Binary files /dev/null and b/tests/test_output.nc differ diff --git a/tests/test_radclss.py b/tests/test_radclss.py index adebe6c..3721264 100644 --- a/tests/test_radclss.py +++ b/tests/test_radclss.py @@ -393,3 +393,118 @@ def test_radclss_parallel(): assert not ( my_columns["ldquants_med_diameter"].sel(station=site) == missing_value ).all() + + +def test_subset_points(): + test_data_path = arm_test_data.DATASETS.abspath + # Before testing, ensure that ARM credentials are set in environment variables + username = os.getenv("ARM_USERNAME") + token = os.getenv("ARM_PASSWORD") + if not username or not token: + return # Skip test if credentials are not set + + act.discovery.download_arm_data( + username, + token, + "bnfcsapr2cmacS3.c1", + "2025-06-19T12:00:00", + "2025-06-19T12:30:00", + output=test_data_path, + ) + + act.discovery.download_arm_data( + username, + token, + "bnfsondewnpnM1.b1", + "2025-06-18T00:00:00", + "2025-06-20T00:00:00", + output=test_data_path, + ) + + rad_path = os.path.join(test_data_path, "*bnfcsapr2cmacS3.c1*.nc") + radar_files = sorted(glob.glob(rad_path)) + input_site_dict = { + "M1": (34.34525, -87.33842, 293), + "S30": (34.38501, -86.92757, 183), + } + subset_ds = radclss.util.subset_points(radar_files[0], input_site_dict, sonde=None) + assert set(subset_ds["station"].values) == {"M1", "S30"} + assert "corrected_reflectivity" in subset_ds.data_vars + assert subset_ds.dims["station"] == 2 + assert np.array_equal(subset_ds["height"].values, np.arange(500, 8500, 250)) + assert "sonde_u_wind" not in subset_ds.data_vars + assert "sonde_v_wind" not in subset_ds.data_vars + assert "sonde_tdry" not in subset_ds.data_vars + assert "sonde_rh" not in subset_ds.data_vars + + # Test with rawinsonde input instead of sonde=False + sonde_files = sorted( + glob.glob(os.path.join(test_data_path, "*bnfsondewnpnM1.b1*cdf")) + ) + + subset_ds = radclss.util.subset_points( + radar_files[0], input_site_dict, sonde=sonde_files + ) + assert set(subset_ds["station"].values) == {"M1", "S30"} + assert np.array_equal(subset_ds["height"].values, np.arange(500, 8500, 250)) + assert "corrected_reflectivity" in subset_ds.data_vars + assert "sonde_u_wind" in subset_ds.data_vars + assert "sonde_v_wind" in subset_ds.data_vars + assert "sonde_tdry" in subset_ds.data_vars + assert "sonde_rh" in subset_ds.data_vars + assert "sonde_u_wind" in subset_ds.data_vars + assert "sonde_v_wind" in subset_ds.data_vars + assert "sonde_tdry" in subset_ds.data_vars + assert "sonde_rh" in subset_ds.data_vars + + +def test_match_datasets_act(): + test_data_path = arm_test_data.DATASETS.abspath + radclss_file = arm_test_data.DATASETS.fetch( + "bnfcsapr2radclss.c2.20250619.000000.nc" + ) + for files in arm_test_data.DATASETS.registry.keys(): + if "bnf" in files: + if not os.path.exists(os.path.join(test_data_path, files)): + arm_test_data.DATASETS.fetch(files) + + met_M1_files = glob.glob(os.path.join(test_data_path, "*bnfmetM1.b1*")) + print(met_M1_files) + radclss_ds = xr.open_dataset(radclss_file) + radclss_ds = radclss_ds.drop_vars( + [var for var in radclss_ds.data_vars if "temp" in var] + ) # Remove temp variables for testing + matched_ds_mean = radclss.util.match_datasets_act( + radclss_ds, + met_M1_files, + "M1", + resample="mean", + discard=radclss.config.DEFAULT_DISCARD_VAR["met"], + ) + matched_ds_skip = radclss.util.match_datasets_act( + radclss_ds, + met_M1_files, + "M1", + resample="skip", + discard=radclss.config.DEFAULT_DISCARD_VAR["met"], + ) + matched_ds_sum = radclss.util.match_datasets_act( + radclss_ds, + met_M1_files, + "M1", + resample="sum", + discard=radclss.config.DEFAULT_DISCARD_VAR["met"], + ) + + assert not np.array_equal( + matched_ds_mean["rh_mean"].values, matched_ds_skip["rh_mean"].values + ) + assert not np.array_equal( + matched_ds_mean["rh_mean"].values, matched_ds_sum["rh_mean"].values + ) + assert not np.array_equal( + matched_ds_skip["rh_mean"].values, matched_ds_sum["rh_mean"].values + ) + assert matched_ds_mean.dims["time"] == radclss_ds.dims["time"] + assert matched_ds_skip.dims["time"] == radclss_ds.dims["time"] + assert matched_ds_sum.dims["time"] == radclss_ds.dims["time"]