diff --git a/satpy/readers/mirs.py b/satpy/readers/mirs.py index d1efb42420..789ff4f07d 100644 --- a/satpy/readers/mirs.py +++ b/satpy/readers/mirs.py @@ -356,6 +356,17 @@ def _fill_data(self, data_arr, attrs): data_arr = data_arr.where(data_arr != fill_value, fill_out) return data_arr, attrs + def _apply_valid_range(self, data_arr, attrs): + # handle valid_range + valid_range = attrs.pop('valid_range', None) + if valid_range is not None: + valid_min, valid_max = valid_range + + if valid_min is not None and valid_max is not None: + data_arr = data_arr.where((data_arr >= valid_min) & + (data_arr <= valid_max)) + return data_arr, attrs + def get_dataset(self, ds_id, ds_info): """Get datasets.""" if 'dependencies' in ds_info.keys(): @@ -483,6 +494,7 @@ def __getitem__(self, item): attrs = data.attrs.copy() data, attrs = self._scale_data(data, attrs) data, attrs = self._fill_data(data, attrs) + data, attrs = self._apply_valid_range(data, attrs) # 'Freq' dimension causes issues in other processing if 'Freq' in data.coords: diff --git a/satpy/tests/reader_tests/test_mirs.py b/satpy/tests/reader_tests/test_mirs.py index c995b0b46c..63d48b37fa 100644 --- a/satpy/tests/reader_tests/test_mirs.py +++ b/satpy/tests/reader_tests/test_mirs.py @@ -247,6 +247,13 @@ def _check_fill(data_arr): # we started with float32, it should stay that way assert data_arr.dtype.type == np.float64 + @staticmethod + def _check_valid_range(data_arr, test_valid_range): + # valid_range is popped out of data_arr.attrs when it is applied + assert 'valid_range' not in data_arr.attrs + assert data_arr.data.min() >= test_valid_range[0] + assert data_arr.data.max() <= test_valid_range[1] + @staticmethod def _check_attrs(data_arr, platform_name): attrs = data_arr.attrs @@ -286,12 +293,20 @@ def test_basic_load(self, filenames, loadable_ids, loaded_data_arrs = r.load(loadable_ids) assert loaded_data_arrs - for data_id, data_arr in loaded_data_arrs.items(): - if data_id['name'] not in ['latitude', 'longitude']: + test_data = fake_open_dataset(filenames[0]) + for _data_id, data_arr in loaded_data_arrs.items(): + var_name = data_arr.attrs["name"] + if var_name not in ['latitude', 'longitude']: self._check_area(data_arr) self._check_fill(data_arr) self._check_attrs(data_arr, platform_name) + input_fake_data = test_data['BT'] if "btemp" in var_name \ + else test_data[var_name] + if "valid_range" in input_fake_data.attrs: + valid_range = input_fake_data.attrs["valid_range"] + self._check_valid_range(data_arr, valid_range) + sensor = data_arr.attrs['sensor'] if reader_kw.get('limb_correction', True) and sensor == 'atms': fd.assert_called()