Source code for polar2grid.tests.test_filters.test_day_night

#!/usr/bin/env python
# encoding: utf-8
# Copyright (C) 2022 Space Science and Engineering Center (SSEC),
#  University of Wisconsin-Madison.
#
#     This program is free software: you can redistribute it and/or modify
#     it under the terms of the GNU General Public License as published by
#     the Free Software Foundation, either version 3 of the License, or
#     (at your option) any later version.
#
#     This program is distributed in the hope that it will be useful,
#     but WITHOUT ANY WARRANTY; without even the implied warranty of
#     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#     GNU General Public License for more details.
#
#     You should have received a copy of the GNU General Public License
#     along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
# This file is part of the polar2grid software package. Polar2grid takes
# satellite observation data, remaps it, and writes it to a file format for
# input into another program.
# Documentation: http://www.ssec.wisc.edu/software/polar2grid/
"""Tests day/night filtering."""
import dask.array as da
import numpy as np
import pytest
import xarray as xr
from pyresample import SwathDefinition
from satpy import Scene

from polar2grid.filters.day_night import DayCoverageFilter, NightCoverageFilter


[docs]@pytest.mark.parametrize( "filter_cls", [DayCoverageFilter, NightCoverageFilter], ) @pytest.mark.parametrize( "criteria", ["default", None, {}], ) def test_daynight_filter_no_filter_check_cases(filter_cls, criteria, viirs_sdr_i01_data_array): scn = Scene() scn["I01"] = viirs_sdr_i01_data_array if criteria == "default": filter = filter_cls() else: filter = filter_cls(criteria) new_scn = filter.filter_scene(scn) assert new_scn is not None assert new_scn is not scn assert "I01" in new_scn
[docs]@pytest.mark.parametrize( ("filter_cls", "kwargs"), [ (DayCoverageFilter, {"day_fraction": 0.95}), (NightCoverageFilter, {"night_fraction": 0.5}), ], ) @pytest.mark.parametrize("add_nans", [False, True]) def test_daynight_filter_filter_cases(filter_cls, add_nans, kwargs, viirs_sdr_i01_data_array): scn = Scene() scn["I01"] = viirs_sdr_i01_data_array # calculates to ~0.8 day if add_nans: _replace_swath_def_with_some_bounding_nans(scn["I01"]) criteria = {"standard_name": ["toa_bidirectional_reflectance"]} filter = filter_cls(criteria, **kwargs) new_scn = filter.filter_scene(scn) assert new_scn is None # all filtered assert "I01" in scn
[docs]def _replace_swath_def_with_some_bounding_nans(data_arr: xr.DataArray) -> None: swath_def = data_arr.attrs["area"] lons = swath_def.lons lats = swath_def.lats lons_np = lons.compute() lons_np.data[: lons_np.shape[0], -1] = np.nan new_lons = xr.DataArray( da.from_array(lons_np.data, chunks=lons.chunks), attrs=lons.attrs.copy(), ) new_swath_def = SwathDefinition(new_lons, lats) data_arr.attrs["swath_def"] = new_swath_def
[docs]def test_daynight_filter_basic_composite_case(viirs_sdr_i04_data_array): """Test that composites are removed from the wishlist and not recomputed after resampling. See https://github.com/ssec/polar2grid/issues/544. """ from polar2grid.utils.config import add_polar2grid_config_paths add_polar2grid_config_paths() scn = Scene() scn["I04"] = viirs_sdr_i04_data_array i05_data_arr = viirs_sdr_i04_data_array.copy(deep=True) i05_data_arr.attrs["name"] = "I05" scn["I05"] = i05_data_arr scn.load(["ifog"]) filter = NightCoverageFilter({"standard_name": "temperature_difference"}, night_fraction=0.2) new_scn = filter.filter_scene(scn) assert new_scn is not None assert "ifog" not in new_scn resampled_scn = new_scn.resample(resampler="native") assert "ifog" not in resampled_scn