From d2b2fa328dab7b90fbe11acf9786f593d9fba167 Mon Sep 17 00:00:00 2001 From: Bobby Jackson Date: Tue, 16 Sep 2025 13:13:07 -0500 Subject: [PATCH 01/14] Revert "MNT: Update codeowners list. (#958)" This reverts commit 876763e00659fd8f99f84da09d3a5c74b3e5bcfb. --- CODEOWNERS | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CODEOWNERS b/CODEOWNERS index e5235130e3..a68ea45af3 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -3,7 +3,7 @@ # These owners will be the default owners for everything in # the repo. Unless a later match takes precedence, -* @AdamTheisen @zssherman +* @AdamTheisen @zssherman @mgrover1 -# any files in the act directory at the root of the +# any files in the intake_esm directory at the root of the # repository and any of its subdirectories. From de2787f6663c463d4b37b05b74480961d71294ca Mon Sep 17 00:00:00 2001 From: Robert Jackson Date: Fri, 10 Oct 2025 15:53:30 -0500 Subject: [PATCH 02/14] ADD: Newest files --- act/plotting/timeseriesdisplay.py | 11 +- act/qc/qcfilter.py | 152 +++++++++++++++++++++-- act/tests/__init__.py | 1 + act/tests/sample_files.py | 2 + tests/plotting/test_timeseriesdisplay.py | 25 ++++ 5 files changed, 179 insertions(+), 12 deletions(-) diff --git a/act/plotting/timeseriesdisplay.py b/act/plotting/timeseriesdisplay.py index 12d5c0bafe..2b04d16bdf 100644 --- a/act/plotting/timeseriesdisplay.py +++ b/act/plotting/timeseriesdisplay.py @@ -1756,12 +1756,15 @@ def qc_flag_block_plot( xdata = self._ds[dsname][dim[0]] # Get data and attributes - qc_data_field = self._ds[dsname].qcfilter.check_for_ancillary_qc( - data_field, add_if_missing=False, cleanup=False - ) + if f'qc_{data_field}_dummy' not in self._ds[dsname].variables: + qc_data_field = self._ds[dsname].qcfilter.check_for_ancillary_qc( + data_field, add_if_missing=False, cleanup=False + ) + else: + qc_data_field = f'qc_{data_field}_dummy' if qc_data_field is None: raise ValueError(f'No quality control ancillary variable in Dataset for {data_field}') - + flag_masks = self._ds[dsname][qc_data_field].attrs['flag_masks'] flag_meanings = self._ds[dsname][qc_data_field].attrs['flag_meanings'] flag_assessments = self._ds[dsname][qc_data_field].attrs['flag_assessments'] diff --git a/act/qc/qcfilter.py b/act/qc/qcfilter.py index eb70dc2041..65609cb985 100644 --- a/act/qc/qcfilter.py +++ b/act/qc/qcfilter.py @@ -8,6 +8,7 @@ import dask import numpy as np import xarray as xr +import warnings from act.qc import comparison_tests, qctests, bsrn_tests, qc_summary from act.utils.data_utils import get_missing_value @@ -42,7 +43,7 @@ def check_for_ancillary_qc(self, var_name, add_if_missing=True, cleanup=False, f var_name : str Data variable name. add_if_missing : boolean - Add quality control variable if missing from teh dataset. Will raise + Add quality control variable if missing from the dataset. Will raise and exception if the var_name does not exist in Dataset. Set to False to not raise exception. cleanup : boolean @@ -92,7 +93,7 @@ def check_for_ancillary_qc(self, var_name, add_if_missing=True, cleanup=False, f except KeyError: # Since no ancillary_variables exist look for ARM style of QC # variable name. If it exists use it else create new - # QC varaible. + # QC variable. if add_if_missing: try: self._ds['qc_' + var_name] @@ -761,11 +762,21 @@ def get_qc_test_mask( 'You need to provide a value for test_number ' 'keyword when calling the get_qc_test_mask() method' ) - + + if var_name is not None and qc_var_name is None: + if f'qc_{var_name}_dummy' in self._ds.data_vars: + qc_var_name = f'qc_{var_name}_dummy' + else: + qc_var_name = self._ds.qcfilter.check_for_ancillary_qc(var_name) + + qc_variable = self._ds[qc_var_name] if var_name is not None: - qc_var_name = self._ds.qcfilter.check_for_ancillary_qc(var_name) + # Ensure that the qc_variable matches the data variable shape + if qc_variable.dims != self._ds[var_name].dims: + # Tile the qc_variable to match the data variable shape + qc_variable = qc_variable.broadcast_like(self._ds[var_name]) - qc_variable = self._ds[qc_var_name].values + qc_variable = qc_variable.values # Ensure the qc_variable data type is integer. This ensures bitwise comparison # will not cause an error. if qc_variable.dtype.kind not in np.typecodes['AllInteger']: @@ -861,7 +872,10 @@ def get_masked_data( ) """ - qc_var_name = self._ds.qcfilter.check_for_ancillary_qc(var_name, add_if_missing=False) + if f'qc_{var_name}_dummy' in self._ds.data_vars: + qc_var_name = f'qc_{var_name}_dummy' + else: + qc_var_name = self._ds.qcfilter.check_for_ancillary_qc(var_name, add_if_missing=False) flag_value = False flag_values = None @@ -1032,7 +1046,10 @@ def datafilter( variables = list(self._ds.data_vars) for var_name in variables: - qc_var_name = self.check_for_ancillary_qc(var_name, add_if_missing=False, cleanup=False) + if f'qc_{var_name}_dummy' in self._ds: + qc_var_name = f'qc_{var_name}_dummy' + else: + qc_var_name = self.check_for_ancillary_qc(var_name, add_if_missing=False, cleanup=False) if qc_var_name is None: if verbose: if var_name in ['base_time', 'time_offset']: @@ -1127,7 +1144,126 @@ def datafilter( if verbose: print(f'Deleting {qc_var_name} from dataset') + def create_dummy_qc_variable(self, + var_name, + rm_assessments=None, + rm_tests=None, + qc_var_names=None): + """ + Function to create a dummy quality control variable for a data variable + that has more than one ancillary qc variable. The dummy quality control + variable will be set to the logical OR of the ancillary variables. If the + dummy variable already exists it will be cleared and recreated. + + Parameters + ---------- + ds : xarray Dataset + The xarray Dataset to add the dummy quality control variable to. + var_name : str + The data variable name to add the dummy quality control variable for. + rm_assessments : str or list of str or None + Assessment names listed under quality control varible flag_assessments + to exclude from returned data. Examples include + ['Bad', 'Incorrect', 'Indeterminate', 'Suspect'] + rm_tests : int or list of int or None + Test numbers listed under quality control variable to exclude from + returned data. This is the test + number (or bit position number) not the mask number. + qc_var_names : list of str or None + List of quality control variable names to use to create the dummy + quality control variable. If None will look for ancillary variables + attribute on data variable and use those variables. + + Returns + ------- + qc_var_name : str + The name of the created quality control variable. + + + """ + if rm_assessments is None and rm_tests is None: + raise ValueError('Need to set rm_assessments or rm_tests option') + + ancillary_variables = self._ds[var_name].attrs['ancillary_variables'] + ancillary_variables = ancillary_variables.split() + if len(ancillary_variables) < 2: + raise ValueError('Data variable must have more than one ancillary variable.') + + if qc_var_names is None: + qc_var_names = ancillary_variables + + qc_var_name = 'qc_' + var_name + '_dummy' + if qc_var_name in self._ds.variables: + # Clear the dummy variable if it already exists + warnings.warn(f'Dummy quality control variable {qc_var_name} already exists. It will be cleared and recreated.') + del self._ds[qc_var_name] + + # Create the quality control variable with same dimensions as data variable. + qc_data = np.zeros(self._ds[var_name].shape, dtype=bool) + for qc_var in qc_var_names: + flag_value = False + flag_values = None + flag_masks = None + flag_assessments = None + try: + flag_assessments = self._ds[qc_var].attrs['flag_assessments'] + flag_masks = self._ds[qc_var].attrs['flag_masks'] + except KeyError: + pass + + try: + flag_values = self._ds[qc_var].attrs['flag_values'] + flag_value = True + except KeyError: + pass + + test_numbers = [] + if rm_tests is not None: + if isinstance(rm_tests, (int, float, str)): + rm_tests = [int(rm_tests)] + test_numbers.extend(rm_tests) + + if rm_assessments is not None: + if isinstance(rm_assessments, str): + rm_assessments = [rm_assessments] + + if flag_masks is not None: + test_nums = [parse_bit(mask)[0] for mask in flag_masks] + + if flag_values is not None: + test_nums = flag_values + + rm_assessments = [x.lower() for x in rm_assessments] + if flag_assessments is not None: + for ii, assessment in enumerate(flag_assessments): + if assessment.lower() in rm_assessments: + test_numbers.append(test_nums[ii]) + + + # Make the list of test numbers to mask unique + test_numbers = list(set(test_numbers)) + for test in test_numbers: + qc_test_mask = self._ds.qcfilter.get_qc_test_mask( + var_name, test, qc_var_name=qc_var, flag_value=flag_value) + qc_data = qc_data | qc_test_mask + # If data was orginally stored as Dask array return values to Dataset as Dask array + # else set as Numpy array. + try: + self._ds[qc_var_name] = (self._ds[var_name].dims, dask.array.from_array(qc_data)) + except AttributeError: + self._ds[qc_var_name] = (self._ds[var_name].dims, qc_data) + + # Add attributes to the quality control variable. + self._ds[qc_var_name].attrs['long_name'] = f'Quality control for {var_name}' + self._ds[qc_var_name].attrs['standard_name'] = 'quality_flag' + self._ds[qc_var_name].attrs['flag_values'] = [1] + self._ds[qc_var_name].attrs['flag_masks'] = [1] + self._ds[qc_var_name].attrs['flag_meanings'] = ["Bad"] + self._ds[qc_var_name].attrs['flag_assessments'] = ["Bad"] + self._ds[qc_var_name].attrs['ancillary_variables'] = var_name + return qc_var_name + def set_bit(array, bit_number): """ Function to set a quality control bit given a scalar or @@ -1299,4 +1435,4 @@ def parse_bit(qc_bit): # Convert data type into expected type bit_number = np.asarray(bit_number, dtype=np.int32) - return bit_number + return bit_number \ No newline at end of file diff --git a/act/tests/__init__.py b/act/tests/__init__.py index d5cd9cd17c..c9fddb93b4 100644 --- a/act/tests/__init__.py +++ b/act/tests/__init__.py @@ -65,6 +65,7 @@ 'EXAMPLE_SWATS', 'EXAMPLE_AMERIFLUX_BASE', 'EXAMPLE_AMERIFLUX_META', + 'EXAMPLE_SMPS', ] }, ) diff --git a/act/tests/sample_files.py b/act/tests/sample_files.py index 49e5168242..b0b42d38fe 100644 --- a/act/tests/sample_files.py +++ b/act/tests/sample_files.py @@ -159,3 +159,5 @@ EXAMPLE_GML_AEROSOL_NAS = DATASETS.fetch( 'US1200R.20200101000000.20210214053818.nephelometer.aerosol_light_scattering_coefficient.pm10.1y.1h.US06L_TSI_3563_MLO.US06L_scat_coef.lev2.nas' ) + +EXAMPLE_SMPS = DATASETS.fetch('houmergedsmpsapsmlM1.c1.20220801.000000.nc') diff --git a/tests/plotting/test_timeseriesdisplay.py b/tests/plotting/test_timeseriesdisplay.py index 69f3ddb504..04be4de598 100644 --- a/tests/plotting/test_timeseriesdisplay.py +++ b/tests/plotting/test_timeseriesdisplay.py @@ -7,6 +7,8 @@ import xarray as xr import act + +from matplotlib import colors from act.plotting import TimeSeriesDisplay, WindRoseDisplay from act.tests import sample_files from act.utils.data_utils import accumulate_precip @@ -270,6 +272,29 @@ def test_qc_bar_plot(): finally: matplotlib.pyplot.close(display.fig) +@pytest.mark.mpl_image_compare(tolerance=10) +def test_qc_bar_plot_dummy_qc(): + ds = act.io.arm.read_arm_netcdf(sample_files.EXAMPLE_SMPS, + cleanup_qc=True) + var_name = 'merged_dN_dlogDp' + expected_qc_var_name = 'qc_' + var_name + title = 'Merged Number Size Distribution' + cbar_title = 'dN/dlogD$_p$ (1/cm$^{3}$)' + ds.qcfilter.create_dummy_qc_variable(var_name, + rm_assessments=['Bad', 'Incorrect', 'Indeterminate', 'Suspect']) + display = act.plotting.TimeSeriesDisplay(ds, subplot_shape=(2,)) + + display.plot('merged_dN_dlogDp', cvd_friendly=True, + norm=colors.LogNorm(vmin=100., vmax=10000.), set_title=title, cbar_label=cbar_title, + ylabel='Pariticle Diameter (nm)', subplot_index=(0,)) + display.axes[0].set_yscale('log') + display.qc_flag_block_plot('merged_dN_dlogDp', subplot_index=(1,)) + display.axes[1].set_ylim([0, 21000]) + + try: + return display.fig + finally: + matplotlib.pyplot.close(display.fig) @pytest.mark.mpl_image_compare(tolerance=10) def test_2d_as_1d(): From c4edbeea029cee7f486f11a85630d5385f90b631 Mon Sep 17 00:00:00 2001 From: Robert Jackson Date: Wed, 15 Oct 2025 15:46:27 -0500 Subject: [PATCH 03/14] FIX: Old changes from CODEOWNERS --- CODEOWNERS | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CODEOWNERS b/CODEOWNERS index a68ea45af3..e5235130e3 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -3,7 +3,7 @@ # These owners will be the default owners for everything in # the repo. Unless a later match takes precedence, -* @AdamTheisen @zssherman @mgrover1 +* @AdamTheisen @zssherman -# any files in the intake_esm directory at the root of the +# any files in the act directory at the root of the # repository and any of its subdirectories. From d61f9d9f77936675fdacdaf5de569125dc1560ed Mon Sep 17 00:00:00 2001 From: Robert Jackson Date: Wed, 15 Oct 2025 15:50:34 -0500 Subject: [PATCH 04/14] FIX: Run pre-commit hooks, ruff ruff. --- act/plotting/timeseriesdisplay.py | 2 +- act/qc/qcfilter.py | 40 +++++++++++++----------- tests/plotting/test_timeseriesdisplay.py | 25 +++++++++------ 3 files changed, 38 insertions(+), 29 deletions(-) diff --git a/act/plotting/timeseriesdisplay.py b/act/plotting/timeseriesdisplay.py index 2b04d16bdf..f8a618a90a 100644 --- a/act/plotting/timeseriesdisplay.py +++ b/act/plotting/timeseriesdisplay.py @@ -1764,7 +1764,7 @@ def qc_flag_block_plot( qc_data_field = f'qc_{data_field}_dummy' if qc_data_field is None: raise ValueError(f'No quality control ancillary variable in Dataset for {data_field}') - + flag_masks = self._ds[dsname][qc_data_field].attrs['flag_masks'] flag_meanings = self._ds[dsname][qc_data_field].attrs['flag_meanings'] flag_assessments = self._ds[dsname][qc_data_field].attrs['flag_assessments'] diff --git a/act/qc/qcfilter.py b/act/qc/qcfilter.py index 65609cb985..6f76444f4e 100644 --- a/act/qc/qcfilter.py +++ b/act/qc/qcfilter.py @@ -762,13 +762,13 @@ def get_qc_test_mask( 'You need to provide a value for test_number ' 'keyword when calling the get_qc_test_mask() method' ) - + if var_name is not None and qc_var_name is None: if f'qc_{var_name}_dummy' in self._ds.data_vars: qc_var_name = f'qc_{var_name}_dummy' else: qc_var_name = self._ds.qcfilter.check_for_ancillary_qc(var_name) - + qc_variable = self._ds[qc_var_name] if var_name is not None: # Ensure that the qc_variable matches the data variable shape @@ -1049,7 +1049,9 @@ def datafilter( if f'qc_{var_name}_dummy' in self._ds: qc_var_name = f'qc_{var_name}_dummy' else: - qc_var_name = self.check_for_ancillary_qc(var_name, add_if_missing=False, cleanup=False) + qc_var_name = self.check_for_ancillary_qc( + var_name, add_if_missing=False, cleanup=False + ) if qc_var_name is None: if verbose: if var_name in ['base_time', 'time_offset']: @@ -1144,11 +1146,9 @@ def datafilter( if verbose: print(f'Deleting {qc_var_name} from dataset') - def create_dummy_qc_variable(self, - var_name, - rm_assessments=None, - rm_tests=None, - qc_var_names=None): + def create_dummy_qc_variable( + self, var_name, rm_assessments=None, rm_tests=None, qc_var_names=None + ): """ Function to create a dummy quality control variable for a data variable that has more than one ancillary qc variable. The dummy quality control @@ -1173,31 +1173,33 @@ def create_dummy_qc_variable(self, List of quality control variable names to use to create the dummy quality control variable. If None will look for ancillary variables attribute on data variable and use those variables. - + Returns ------- qc_var_name : str The name of the created quality control variable. - + """ if rm_assessments is None and rm_tests is None: raise ValueError('Need to set rm_assessments or rm_tests option') - + ancillary_variables = self._ds[var_name].attrs['ancillary_variables'] ancillary_variables = ancillary_variables.split() if len(ancillary_variables) < 2: raise ValueError('Data variable must have more than one ancillary variable.') - + if qc_var_names is None: qc_var_names = ancillary_variables qc_var_name = 'qc_' + var_name + '_dummy' if qc_var_name in self._ds.variables: # Clear the dummy variable if it already exists - warnings.warn(f'Dummy quality control variable {qc_var_name} already exists. It will be cleared and recreated.') - del self._ds[qc_var_name] - + warnings.warn( + f'Dummy quality control variable {qc_var_name} already exists. It will be cleared and recreated.' + ) + del self._ds[qc_var_name] + # Create the quality control variable with same dimensions as data variable. qc_data = np.zeros(self._ds[var_name].shape, dtype=bool) for qc_var in qc_var_names: @@ -1238,13 +1240,13 @@ def create_dummy_qc_variable(self, for ii, assessment in enumerate(flag_assessments): if assessment.lower() in rm_assessments: test_numbers.append(test_nums[ii]) - # Make the list of test numbers to mask unique test_numbers = list(set(test_numbers)) for test in test_numbers: qc_test_mask = self._ds.qcfilter.get_qc_test_mask( - var_name, test, qc_var_name=qc_var, flag_value=flag_value) + var_name, test, qc_var_name=qc_var, flag_value=flag_value + ) qc_data = qc_data | qc_test_mask # If data was orginally stored as Dask array return values to Dataset as Dask array # else set as Numpy array. @@ -1263,7 +1265,7 @@ def create_dummy_qc_variable(self, self._ds[qc_var_name].attrs['ancillary_variables'] = var_name return qc_var_name - + def set_bit(array, bit_number): """ Function to set a quality control bit given a scalar or @@ -1435,4 +1437,4 @@ def parse_bit(qc_bit): # Convert data type into expected type bit_number = np.asarray(bit_number, dtype=np.int32) - return bit_number \ No newline at end of file + return bit_number diff --git a/tests/plotting/test_timeseriesdisplay.py b/tests/plotting/test_timeseriesdisplay.py index 04be4de598..762c9fd4f2 100644 --- a/tests/plotting/test_timeseriesdisplay.py +++ b/tests/plotting/test_timeseriesdisplay.py @@ -8,7 +8,7 @@ import act -from matplotlib import colors +from matplotlib import colors from act.plotting import TimeSeriesDisplay, WindRoseDisplay from act.tests import sample_files from act.utils.data_utils import accumulate_precip @@ -272,21 +272,27 @@ def test_qc_bar_plot(): finally: matplotlib.pyplot.close(display.fig) + @pytest.mark.mpl_image_compare(tolerance=10) def test_qc_bar_plot_dummy_qc(): - ds = act.io.arm.read_arm_netcdf(sample_files.EXAMPLE_SMPS, - cleanup_qc=True) + ds = act.io.arm.read_arm_netcdf(sample_files.EXAMPLE_SMPS, cleanup_qc=True) var_name = 'merged_dN_dlogDp' - expected_qc_var_name = 'qc_' + var_name title = 'Merged Number Size Distribution' cbar_title = 'dN/dlogD$_p$ (1/cm$^{3}$)' - ds.qcfilter.create_dummy_qc_variable(var_name, - rm_assessments=['Bad', 'Incorrect', 'Indeterminate', 'Suspect']) + ds.qcfilter.create_dummy_qc_variable( + var_name, rm_assessments=['Bad', 'Incorrect', 'Indeterminate', 'Suspect'] + ) display = act.plotting.TimeSeriesDisplay(ds, subplot_shape=(2,)) - display.plot('merged_dN_dlogDp', cvd_friendly=True, - norm=colors.LogNorm(vmin=100., vmax=10000.), set_title=title, cbar_label=cbar_title, - ylabel='Pariticle Diameter (nm)', subplot_index=(0,)) + display.plot( + 'merged_dN_dlogDp', + cvd_friendly=True, + norm=colors.LogNorm(vmin=100.0, vmax=10000.0), + set_title=title, + cbar_label=cbar_title, + ylabel='Pariticle Diameter (nm)', + subplot_index=(0,), + ) display.axes[0].set_yscale('log') display.qc_flag_block_plot('merged_dN_dlogDp', subplot_index=(1,)) display.axes[1].set_ylim([0, 21000]) @@ -296,6 +302,7 @@ def test_qc_bar_plot_dummy_qc(): finally: matplotlib.pyplot.close(display.fig) + @pytest.mark.mpl_image_compare(tolerance=10) def test_2d_as_1d(): ds = act.io.arm.read_arm_netcdf(sample_files.EXAMPLE_CEIL1) From 18c5cbe0928fcdb3289fab1f47d9f314934144e4 Mon Sep 17 00:00:00 2001 From: Robert Jackson Date: Thu, 16 Oct 2025 14:00:18 -0500 Subject: [PATCH 05/14] ADD: Baseline image for comparison. --- .../baseline/test_qc_bar_plot_dummy_qc.png | Bin 0 -> 53406 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/plotting/baseline/test_qc_bar_plot_dummy_qc.png diff --git a/tests/plotting/baseline/test_qc_bar_plot_dummy_qc.png b/tests/plotting/baseline/test_qc_bar_plot_dummy_qc.png new file mode 100644 index 0000000000000000000000000000000000000000..79b3b148755606b476725e23b2e1645fd97723dd GIT binary patch literal 53406 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 literal 0 HcmV?d00001 From f7fca52eaaf1a8c2c51590440424b6be00a6fd7f Mon Sep 17 00:00:00 2001 From: AdamTheisen Date: Fri, 19 Dec 2025 13:44:10 -0600 Subject: [PATCH 06/14] ENH: Updating to use built in functions --- act/qc/qcfilter.py | 175 +++++++++++++-------------------------------- 1 file changed, 51 insertions(+), 124 deletions(-) diff --git a/act/qc/qcfilter.py b/act/qc/qcfilter.py index 6f76444f4e..99e8d8fdc7 100644 --- a/act/qc/qcfilter.py +++ b/act/qc/qcfilter.py @@ -28,7 +28,7 @@ def __init__(self, ds): """initialize""" self._ds = ds - def check_for_ancillary_qc(self, var_name, add_if_missing=True, cleanup=False, flag_type=False): + def check_for_ancillary_qc(self, var_name, add_if_missing=True, cleanup=False, flag_type=False, ignore_dims=False): """ Method to check if a quality control variable exist in the dataset and return the quality control varible name. @@ -50,9 +50,11 @@ def check_for_ancillary_qc(self, var_name, add_if_missing=True, cleanup=False, f Option to run qc.clean.cleanup() method on the dataset to ensure the dataset was updated from ARM QC to the correct standardized QC. - flag_type : boolean + flag_type : booleany Indicating the QC variable uses flag_values instead of flag_masks. + ignore_dims : booleany + Boolean to ignore ancillary variables that match dimensionally Returns ------- @@ -75,7 +77,7 @@ def check_for_ancillary_qc(self, var_name, add_if_missing=True, cleanup=False, f print(f'qc_var_name: {qc_var_name}') """ - qc_var_name = None + qc_var_name = [] try: ancillary_variables = self._ds[var_name].attrs['ancillary_variables'] var_dims = self._ds[var_name].dims @@ -84,9 +86,10 @@ def check_for_ancillary_qc(self, var_name, add_if_missing=True, cleanup=False, f for var in ancillary_variables: for attr, value in self._ds[var].attrs.items(): if attr == 'standard_name' and 'quality_flag' in value: - if var_dims == self._ds[var].dims: - qc_var_name = var - + if ignore_dims == True: + qc_var_name.append(var) + elif var_dims == self._ds[var].dims: + qc_var_name.append(var) if add_if_missing and qc_var_name is None: qc_var_name = self._ds.qcfilter.create_qc_variable(var_name, flag_type=flag_type) @@ -103,6 +106,8 @@ def check_for_ancillary_qc(self, var_name, add_if_missing=True, cleanup=False, f var_name, flag_type=flag_type ) + if len(qc_var_name) == 1: + qc_var_name = qc_var_name[0] # Make sure data varaible has a variable attribute linking # data variable to QC variable. if add_if_missing: @@ -251,8 +256,9 @@ def update_ancillary_variable(self, var_name, qc_var_name=None): try: ancillary_variables = self._ds[var_name].attrs['ancillary_variables'] - if qc_var_name not in ancillary_variables: - ancillary_variables = ' '.join([ancillary_variables, qc_var_name]) + for qc_var in qc_var_name: + if qc_var not in ancillary_variables: + ancillary_variables = ' '.join([ancillary_variables, qc_var]) except KeyError: ancillary_variables = qc_var_name @@ -331,7 +337,6 @@ def add_test( test_assessment = test_assessment.capitalize() qc_var_name = self._ds.qcfilter.check_for_ancillary_qc(var_name, flag_type=flag_value) - if test_number is None: test_number = self._ds.qcfilter.available_bit(qc_var_name, recycle=recycle) @@ -764,10 +769,7 @@ def get_qc_test_mask( ) if var_name is not None and qc_var_name is None: - if f'qc_{var_name}_dummy' in self._ds.data_vars: - qc_var_name = f'qc_{var_name}_dummy' - else: - qc_var_name = self._ds.qcfilter.check_for_ancillary_qc(var_name) + qc_var_name = self._ds.qcfilter.check_for_ancillary_qc(var_name) qc_variable = self._ds[qc_var_name] if var_name is not None: @@ -872,10 +874,7 @@ def get_masked_data( ) """ - if f'qc_{var_name}_dummy' in self._ds.data_vars: - qc_var_name = f'qc_{var_name}_dummy' - else: - qc_var_name = self._ds.qcfilter.check_for_ancillary_qc(var_name, add_if_missing=False) + qc_var_name = self._ds.qcfilter.check_for_ancillary_qc(var_name, add_if_missing=False) flag_value = False flag_values = None @@ -1046,12 +1045,9 @@ def datafilter( variables = list(self._ds.data_vars) for var_name in variables: - if f'qc_{var_name}_dummy' in self._ds: - qc_var_name = f'qc_{var_name}_dummy' - else: - qc_var_name = self.check_for_ancillary_qc( - var_name, add_if_missing=False, cleanup=False - ) + qc_var_name = self.check_for_ancillary_qc( + var_name, add_if_missing=False, cleanup=False + ) if qc_var_name is None: if verbose: if var_name in ['base_time', 'time_offset']: @@ -1146,124 +1142,55 @@ def datafilter( if verbose: print(f'Deleting {qc_var_name} from dataset') - def create_dummy_qc_variable( - self, var_name, rm_assessments=None, rm_tests=None, qc_var_names=None + def merge_qc_variables( + self, var_name, qc_var_names=None ): """ - Function to create a dummy quality control variable for a data variable - that has more than one ancillary qc variable. The dummy quality control - variable will be set to the logical OR of the ancillary variables. If the - dummy variable already exists it will be cleared and recreated. + Function to merge QC variables together based on what's defined in as + ancillary variables. Behaviour is to merge the qc into the first + qc variable listed in the ancillary_variables attribute unless otherwise + passed in as a keyword argument. Parameters ---------- - ds : xarray Dataset - The xarray Dataset to add the dummy quality control variable to. var_name : str - The data variable name to add the dummy quality control variable for. - rm_assessments : str or list of str or None - Assessment names listed under quality control varible flag_assessments - to exclude from returned data. Examples include - ['Bad', 'Incorrect', 'Indeterminate', 'Suspect'] - rm_tests : int or list of int or None - Test numbers listed under quality control variable to exclude from - returned data. This is the test - number (or bit position number) not the mask number. + The data variable name to merge QC for qc_var_names : list of str or None - List of quality control variable names to use to create the dummy - quality control variable. If None will look for ancillary variables + List of quality control variable names merge together. + If None will look for ancillary variables attribute on data variable and use those variables. Returns ------- - qc_var_name : str - The name of the created quality control variable. + merge_qc_var_name : str + The name of the quality control variable the other variables were + merged in to. """ - if rm_assessments is None and rm_tests is None: - raise ValueError('Need to set rm_assessments or rm_tests option') - - ancillary_variables = self._ds[var_name].attrs['ancillary_variables'] - ancillary_variables = ancillary_variables.split() - if len(ancillary_variables) < 2: - raise ValueError('Data variable must have more than one ancillary variable.') - if qc_var_names is None: - qc_var_names = ancillary_variables - - qc_var_name = 'qc_' + var_name + '_dummy' - if qc_var_name in self._ds.variables: - # Clear the dummy variable if it already exists - warnings.warn( - f'Dummy quality control variable {qc_var_name} already exists. It will be cleared and recreated.' - ) - del self._ds[qc_var_name] - - # Create the quality control variable with same dimensions as data variable. - qc_data = np.zeros(self._ds[var_name].shape, dtype=bool) - for qc_var in qc_var_names: - flag_value = False - flag_values = None - flag_masks = None - flag_assessments = None - try: - flag_assessments = self._ds[qc_var].attrs['flag_assessments'] - flag_masks = self._ds[qc_var].attrs['flag_masks'] - except KeyError: - pass - - try: - flag_values = self._ds[qc_var].attrs['flag_values'] - flag_value = True - except KeyError: - pass - - test_numbers = [] - if rm_tests is not None: - if isinstance(rm_tests, (int, float, str)): - rm_tests = [int(rm_tests)] - test_numbers.extend(rm_tests) - - if rm_assessments is not None: - if isinstance(rm_assessments, str): - rm_assessments = [rm_assessments] - - if flag_masks is not None: - test_nums = [parse_bit(mask)[0] for mask in flag_masks] - - if flag_values is not None: - test_nums = flag_values - - rm_assessments = [x.lower() for x in rm_assessments] - if flag_assessments is not None: - for ii, assessment in enumerate(flag_assessments): - if assessment.lower() in rm_assessments: - test_numbers.append(test_nums[ii]) - - # Make the list of test numbers to mask unique - test_numbers = list(set(test_numbers)) - for test in test_numbers: - qc_test_mask = self._ds.qcfilter.get_qc_test_mask( - var_name, test, qc_var_name=qc_var, flag_value=flag_value + qc_var_names = self._ds.qcfilter.check_for_ancillary_qc(var_name, ignore_dims=True) + if len(qc_var_names) < 2: + raise ValueError('Data variable must have more than one ancillary variable.') + + merge_qc_var_name = qc_var_names[0] + for i in range(len(qc_var_names) - 1): + qc_var = self._ds[qc_var_names[i + 1]] + flag_masks = qc_var.attrs['flag_masks'] + for j, flag in enumerate(flag_masks): + flag_index = self._ds.qcfilter.get_qc_test_mask( + qc_var_name=qc_var_names[i + 1], + test_number=flag, + return_index=True, + ) + result = self._ds.qcfilter.add_test( + var_name, + index=flag_index, + test_meaning=qc_var.attrs['flag_meanings'][j], + test_assessment=qc_var.attrs['flag_assessments'][j], ) - qc_data = qc_data | qc_test_mask - # If data was orginally stored as Dask array return values to Dataset as Dask array - # else set as Numpy array. - try: - self._ds[qc_var_name] = (self._ds[var_name].dims, dask.array.from_array(qc_data)) - except AttributeError: - self._ds[qc_var_name] = (self._ds[var_name].dims, qc_data) - # Add attributes to the quality control variable. - self._ds[qc_var_name].attrs['long_name'] = f'Quality control for {var_name}' - self._ds[qc_var_name].attrs['standard_name'] = 'quality_flag' - self._ds[qc_var_name].attrs['flag_values'] = [1] - self._ds[qc_var_name].attrs['flag_masks'] = [1] - self._ds[qc_var_name].attrs['flag_meanings'] = ["Bad"] - self._ds[qc_var_name].attrs['flag_assessments'] = ["Bad"] - self._ds[qc_var_name].attrs['ancillary_variables'] = var_name - return qc_var_name + return merge_qc_var_name def set_bit(array, bit_number): From 4c4edd5a88ff4fae0062e81d12b0c2361cad86c4 Mon Sep 17 00:00:00 2001 From: AdamTheisen Date: Fri, 19 Dec 2025 13:44:37 -0600 Subject: [PATCH 07/14] ENH: No longer need to check for dummy --- act/plotting/timeseriesdisplay.py | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/act/plotting/timeseriesdisplay.py b/act/plotting/timeseriesdisplay.py index f8a618a90a..595e53442b 100644 --- a/act/plotting/timeseriesdisplay.py +++ b/act/plotting/timeseriesdisplay.py @@ -1756,15 +1756,11 @@ def qc_flag_block_plot( xdata = self._ds[dsname][dim[0]] # Get data and attributes - if f'qc_{data_field}_dummy' not in self._ds[dsname].variables: - qc_data_field = self._ds[dsname].qcfilter.check_for_ancillary_qc( - data_field, add_if_missing=False, cleanup=False - ) - else: - qc_data_field = f'qc_{data_field}_dummy' + qc_data_field = self._ds[dsname].qcfilter.check_for_ancillary_qc( + data_field, add_if_missing=False, cleanup=False + ) if qc_data_field is None: raise ValueError(f'No quality control ancillary variable in Dataset for {data_field}') - flag_masks = self._ds[dsname][qc_data_field].attrs['flag_masks'] flag_meanings = self._ds[dsname][qc_data_field].attrs['flag_meanings'] flag_assessments = self._ds[dsname][qc_data_field].attrs['flag_assessments'] From 38995c7968770dca48e4131566d93093b32e609e Mon Sep 17 00:00:00 2001 From: AdamTheisen Date: Fri, 19 Dec 2025 13:45:23 -0600 Subject: [PATCH 08/14] ENH: Updating test --- tests/plotting/test_timeseriesdisplay.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/tests/plotting/test_timeseriesdisplay.py b/tests/plotting/test_timeseriesdisplay.py index 762c9fd4f2..1d278d6624 100644 --- a/tests/plotting/test_timeseriesdisplay.py +++ b/tests/plotting/test_timeseriesdisplay.py @@ -6,6 +6,9 @@ import pytest import xarray as xr +import sys +sys.path.insert(0,'/Users/atheisen/Code/sandbox/ACT') + import act from matplotlib import colors @@ -274,14 +277,12 @@ def test_qc_bar_plot(): @pytest.mark.mpl_image_compare(tolerance=10) -def test_qc_bar_plot_dummy_qc(): +def test_qc_bar_plot_merge_qc(): ds = act.io.arm.read_arm_netcdf(sample_files.EXAMPLE_SMPS, cleanup_qc=True) var_name = 'merged_dN_dlogDp' title = 'Merged Number Size Distribution' cbar_title = 'dN/dlogD$_p$ (1/cm$^{3}$)' - ds.qcfilter.create_dummy_qc_variable( - var_name, rm_assessments=['Bad', 'Incorrect', 'Indeterminate', 'Suspect'] - ) + ds.qcfilter.merge_qc_variables(var_name) display = act.plotting.TimeSeriesDisplay(ds, subplot_shape=(2,)) display.plot( @@ -339,7 +340,7 @@ def test_fill_between(): @pytest.mark.mpl_image_compare(tolerance=10) def test_qc_flag_block_plot(): - ds = act.io.arm.read_arm_netcdf(sample_files.EXAMPLE_SURFSPECALB1MLAWER) + ds = act.io.arm.read_arm_netcdf(sample_files.EXAMPLE_SURFSPECALB1MLAWER, cleanup_qc=True) display = TimeSeriesDisplay(ds, subplot_shape=(2,), figsize=(10, 8)) From 15d3b360de4399b09aa226d71d8c53f2fa6a219d Mon Sep 17 00:00:00 2001 From: AdamTheisen Date: Fri, 19 Dec 2025 13:53:20 -0600 Subject: [PATCH 09/14] ADD: New updated plot --- .../baseline/test_qc_bar_plot_merge_qc.png | Bin 0 -> 56068 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/plotting/baseline/test_qc_bar_plot_merge_qc.png diff --git a/tests/plotting/baseline/test_qc_bar_plot_merge_qc.png b/tests/plotting/baseline/test_qc_bar_plot_merge_qc.png new file mode 100644 index 0000000000000000000000000000000000000000..7cd1c877223c69d566ed955e70e84c3d56215d58 GIT binary patch literal 56068 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%0A|J}KWy%lwSs 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 Date: Fri, 19 Dec 2025 13:54:11 -0600 Subject: [PATCH 10/14] DEL: Renaming file --- .../baseline/test_qc_bar_plot_dummy_qc.png | Bin 53406 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 tests/plotting/baseline/test_qc_bar_plot_dummy_qc.png diff --git a/tests/plotting/baseline/test_qc_bar_plot_dummy_qc.png b/tests/plotting/baseline/test_qc_bar_plot_dummy_qc.png deleted file mode 100644 index 79b3b148755606b476725e23b2e1645fd97723dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53406 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 From 25e1e2f250a7db9f150a9caf12910d65ea6b3567 Mon Sep 17 00:00:00 2001 From: AdamTheisen Date: Mon, 22 Dec 2025 11:04:22 -0600 Subject: [PATCH 11/14] ENH: Removing sys imports --- tests/plotting/test_timeseriesdisplay.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/tests/plotting/test_timeseriesdisplay.py b/tests/plotting/test_timeseriesdisplay.py index 1d278d6624..6d7d9ac13a 100644 --- a/tests/plotting/test_timeseriesdisplay.py +++ b/tests/plotting/test_timeseriesdisplay.py @@ -6,9 +6,6 @@ import pytest import xarray as xr -import sys -sys.path.insert(0,'/Users/atheisen/Code/sandbox/ACT') - import act from matplotlib import colors From 2cf0598afdf40427c07f16bfc0d6be4e2b999851 Mon Sep 17 00:00:00 2001 From: AdamTheisen Date: Mon, 22 Dec 2025 11:07:09 -0600 Subject: [PATCH 12/14] ENH:" Precommits --- act/qc/qcfilter.py | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/act/qc/qcfilter.py b/act/qc/qcfilter.py index 99e8d8fdc7..32e93a2400 100644 --- a/act/qc/qcfilter.py +++ b/act/qc/qcfilter.py @@ -8,7 +8,6 @@ import dask import numpy as np import xarray as xr -import warnings from act.qc import comparison_tests, qctests, bsrn_tests, qc_summary from act.utils.data_utils import get_missing_value @@ -28,7 +27,9 @@ def __init__(self, ds): """initialize""" self._ds = ds - def check_for_ancillary_qc(self, var_name, add_if_missing=True, cleanup=False, flag_type=False, ignore_dims=False): + def check_for_ancillary_qc( + self, var_name, add_if_missing=True, cleanup=False, flag_type=False, ignore_dims=False + ): """ Method to check if a quality control variable exist in the dataset and return the quality control varible name. @@ -86,7 +87,7 @@ def check_for_ancillary_qc(self, var_name, add_if_missing=True, cleanup=False, f for var in ancillary_variables: for attr, value in self._ds[var].attrs.items(): if attr == 'standard_name' and 'quality_flag' in value: - if ignore_dims == True: + if ignore_dims is True: qc_var_name.append(var) elif var_dims == self._ds[var].dims: qc_var_name.append(var) @@ -1045,9 +1046,7 @@ def datafilter( variables = list(self._ds.data_vars) for var_name in variables: - qc_var_name = self.check_for_ancillary_qc( - var_name, add_if_missing=False, cleanup=False - ) + qc_var_name = self.check_for_ancillary_qc(var_name, add_if_missing=False, cleanup=False) if qc_var_name is None: if verbose: if var_name in ['base_time', 'time_offset']: @@ -1142,9 +1141,7 @@ def datafilter( if verbose: print(f'Deleting {qc_var_name} from dataset') - def merge_qc_variables( - self, var_name, qc_var_names=None - ): + def merge_qc_variables(self, var_name, qc_var_names=None): """ Function to merge QC variables together based on what's defined in as ancillary variables. Behaviour is to merge the qc into the first @@ -1183,7 +1180,7 @@ def merge_qc_variables( test_number=flag, return_index=True, ) - result = self._ds.qcfilter.add_test( + self._ds.qcfilter.add_test( var_name, index=flag_index, test_meaning=qc_var.attrs['flag_meanings'][j], From 432bce65932edf0b3364d6e784ef12ff348a03b9 Mon Sep 17 00:00:00 2001 From: AdamTheisen Date: Mon, 22 Dec 2025 11:36:11 -0600 Subject: [PATCH 13/14] ENH: lint changes --- tests/plotting/test_timeseriesdisplay.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/plotting/test_timeseriesdisplay.py b/tests/plotting/test_timeseriesdisplay.py index 6d7d9ac13a..1b77be656c 100644 --- a/tests/plotting/test_timeseriesdisplay.py +++ b/tests/plotting/test_timeseriesdisplay.py @@ -5,10 +5,9 @@ import pandas as pd import pytest import xarray as xr +from matplotlib import colors import act - -from matplotlib import colors from act.plotting import TimeSeriesDisplay, WindRoseDisplay from act.tests import sample_files from act.utils.data_utils import accumulate_precip From d95c8a0e7199fac1fbf92fef929eed0f1ae15c54 Mon Sep 17 00:00:00 2001 From: AdamTheisen Date: Mon, 22 Dec 2025 16:28:47 -0600 Subject: [PATCH 14/14] ENH: Updates for multiple qc ancillary variables --- act/qc/qcfilter.py | 66 +++++++++++++++++++++++++++++++++++++++------- 1 file changed, 56 insertions(+), 10 deletions(-) diff --git a/act/qc/qcfilter.py b/act/qc/qcfilter.py index 32e93a2400..9f3b2d9aa3 100644 --- a/act/qc/qcfilter.py +++ b/act/qc/qcfilter.py @@ -109,6 +109,9 @@ def check_for_ancillary_qc( if len(qc_var_name) == 1: qc_var_name = qc_var_name[0] + if len(qc_var_name) == 0: + qc_var_name = None + # Make sure data varaible has a variable attribute linking # data variable to QC variable. if add_if_missing: @@ -233,7 +236,7 @@ def update_ancillary_variable(self, var_name, qc_var_name=None): qc_var_name : str quality control variable name. If not given will attempt to get the name from data variable ancillary_variables - attribute. + attribute. Defaults to first ancillary variable. Examples -------- @@ -251,13 +254,22 @@ def update_ancillary_variable(self, var_name, qc_var_name=None): """ if qc_var_name is None: qc_var_name = self._ds.qcfilter.check_for_ancillary_qc(var_name, add_if_missing=False) + if isinstance(qc_var_name, list): + qc_var_name = qc_var_name[0] if qc_var_name is None: return + if isinstance(qc_var_name, str): + qc_var_name_list = [qc_var_name] + else: + qc_var_name_list = qc_var_name + try: ancillary_variables = self._ds[var_name].attrs['ancillary_variables'] - for qc_var in qc_var_name: + if isinstance(ancillary_variables, list): + ancillary_variables = ' '.join(ancillary_variables) + for qc_var in qc_var_name_list: if qc_var not in ancillary_variables: ancillary_variables = ' '.join([ancillary_variables, qc_var]) except KeyError: @@ -274,6 +286,7 @@ def add_test( test_assessment='Bad', flag_value=False, recycle=False, + qc_var_name=None, ): """ Method to add a new test/filter to a quality control variable. @@ -304,6 +317,8 @@ def add_test( Option to use number less than next highest test if available. For example tests 1, 2, 4, 5 are set. Set to true the next test chosen will be 3, else will be 6. + qc_var_name : str + QC variable to add test to. Defaults to first ancillary QC variable Returns ------- @@ -337,7 +352,10 @@ def add_test( # Ensure assessment is capitalized to be consistent test_assessment = test_assessment.capitalize() - qc_var_name = self._ds.qcfilter.check_for_ancillary_qc(var_name, flag_type=flag_value) + if qc_var_name is None: + qc_var_name = self._ds.qcfilter.check_for_ancillary_qc(var_name, flag_type=flag_value) + if isinstance(qc_var_name, list): + qc_var_name = qc_var_name[0] if test_number is None: test_number = self._ds.qcfilter.available_bit(qc_var_name, recycle=recycle) @@ -432,6 +450,8 @@ def remove_test( if var_name is not None: qc_var_name = self._ds.qcfilter.check_for_ancillary_qc(var_name) + if isinstance(qc_var_name, list): + qc_var_name = qc_var_name[0] # Determine which index is using the test number index = None @@ -499,7 +519,7 @@ def remove_test( del flag_assessments[index] self._ds[qc_var_name].attrs['flag_assessments'] = flag_assessments - def set_test(self, var_name, index=None, test_number=None, flag_value=False): + def set_test(self, var_name, index=None, test_number=None, flag_value=False, qc_var_name=None): """ Method to set a test/filter in a quality control variable. @@ -514,6 +534,8 @@ def set_test(self, var_name, index=None, test_number=None, flag_value=False): Test number to set. flag_value : boolean Switch to use flag_values integer quality control. + qc_var_name : str + QC data variable name. If None, will default to first ancillary QC variable. Examples -------- @@ -524,7 +546,10 @@ def set_test(self, var_name, index=None, test_number=None, flag_value=False): """ - qc_var_name = self._ds.qcfilter.check_for_ancillary_qc(var_name) + if qc_var_name is None: + qc_var_name = self._ds.qcfilter.check_for_ancillary_qc(var_name) + if isinstance(qc_var_name, list): + qc_var_name = qc_var_name[0] qc_variable = np.array(self._ds[qc_var_name].values) @@ -563,11 +588,11 @@ def set_test(self, var_name, index=None, test_number=None, flag_value=False): def unset_test( self, var_name=None, - qc_var_name=None, index=None, test_number=None, flag_value=False, flag_values_reset_value=0, + qc_var_name=None, ): """ Method to unset a test/filter from a quality control variable. @@ -576,8 +601,6 @@ def unset_test( ---------- var_name : str or None Data variable name. - qc_var_name : str or None - Quality control variable name. Ignored if var_name is set. index : int or list or numpy array Index to unset test in quality control array. If want to unset all values will need to pass in index of all values. @@ -587,6 +610,9 @@ def unset_test( Switch to use flag_values integer quality control. flag_values_reset_value : int Value to use when resetting a flag_values value to not be set. + qc_var_name : str or None + Quality control variable name. Ignored if var_name is set. + Will default to first ancillary QC variable Examples -------- @@ -606,6 +632,8 @@ def unset_test( if var_name is not None: qc_var_name = self._ds.qcfilter.check_for_ancillary_qc(var_name) + if isinstance(qc_var_name, list): + qc_var_name = qc_var_name[0] # Get QC variable qc_variable = self._ds[qc_var_name].values @@ -654,9 +682,15 @@ def available_bit(self, qc_var_name, recycle=False): """ + try: flag_masks = self._ds[qc_var_name].attrs['flag_masks'] flag_value = False + if len(flag_masks) == 0: + if 'flag_values' in self._ds[qc_var_name].attrs: + flag_masks = self._ds[qc_var_name].attrs['flag_values'] + if len(flag_masks) > 0: + flag_value = True except KeyError: try: flag_masks = self._ds[qc_var_name].attrs['flag_values'] @@ -672,7 +706,6 @@ def available_bit(self, qc_var_name, recycle=False): 'available_bit(). flag_values and ' 'flag_masks not set as expected' ) - if flag_masks == []: next_bit = 1 else: @@ -711,6 +744,7 @@ def get_qc_test_mask( Test number to return array where test is set. qc_var_name : str or None Quality control variable name. Ignored if var_name is set. + Defaults to first ancillary QC variable flag_value : boolean Switch to use flag_values integer quality control. return_index : boolean @@ -771,6 +805,8 @@ def get_qc_test_mask( if var_name is not None and qc_var_name is None: qc_var_name = self._ds.qcfilter.check_for_ancillary_qc(var_name) + if isinstance(qc_var_name, list): + qc_var_name = qc_var_name[0] qc_variable = self._ds[qc_var_name] if var_name is not None: @@ -812,6 +848,7 @@ def get_masked_data( ma_fill_value=None, return_inverse=False, return_mask_only=False, + qc_var_name=None, ): """ Returns a numpy masked array containing data and mask or @@ -840,6 +877,8 @@ def get_masked_data( where failing. return_mask_only : boolean Return the boolean mask only as a numpy array. + qc_var_name : str + Variable name for QC data to use. Defaults to first ancillary QC variable. Returns ------- @@ -875,7 +914,10 @@ def get_masked_data( ) """ - qc_var_name = self._ds.qcfilter.check_for_ancillary_qc(var_name, add_if_missing=False) + if qc_var_name is None: + qc_var_name = self._ds.qcfilter.check_for_ancillary_qc(var_name, add_if_missing=False) + if isinstance(qc_var_name, list): + qc_var_name = qc_var_name[0] flag_value = False flag_values = None @@ -1047,6 +1089,8 @@ def datafilter( for var_name in variables: qc_var_name = self.check_for_ancillary_qc(var_name, add_if_missing=False, cleanup=False) + if isinstance(qc_var_name, list): + qc_var_name = qc_var_name[0] if qc_var_name is None: if verbose: if var_name in ['base_time', 'time_offset']: @@ -1167,6 +1211,8 @@ def merge_qc_variables(self, var_name, qc_var_names=None): """ if qc_var_names is None: qc_var_names = self._ds.qcfilter.check_for_ancillary_qc(var_name, ignore_dims=True) + if isinstance(qc_var_names, list): + qc_var_names[0] if len(qc_var_names) < 2: raise ValueError('Data variable must have more than one ancillary variable.')