Source code for polar2grid.filters._filter_scene

#!/usr/bin/env python3
# encoding: utf-8
# Copyright (C) 2021 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/
"""Helper functions for filtering certain products."""

import logging
from typing import Dict, List, Optional, Union

from satpy import Scene

from ..utils.dynamic_imports import get_reader_attr
from .day_night import DayCoverageFilter, NightCoverageFilter

logger = logging.getLogger(__name__)


[docs]def _merge_filter_critera(*readers_criteria: Dict[str, Union[List[str], None]]): result = {} for reader_criteria in readers_criteria: if reader_criteria is None: continue for criteria_key, criteria_value in reader_criteria.items(): if criteria_value is not None: result.setdefault(criteria_key, []).extend(criteria_value) if not result: # no criteria were provided/found return None return result
[docs]def _get_single_reader_filter_criteria(reader: str, filter_name: str): filter_criteria = get_reader_attr(reader, "FILTERS", {}) return filter_criteria.get(filter_name)
[docs]def get_reader_filter_criteria(reader_names: List[str], filter_name: str): """Get reader configured filter information.""" readers_criteria = [_get_single_reader_filter_criteria(reader, filter_name) for reader in reader_names] criteria = _merge_filter_critera(*readers_criteria) return criteria
[docs]def _filter_scene_day_only_products( input_scene: Scene, filter_criteria: dict, sza_threshold: float = 100.0, day_fraction: Optional[float] = None ): """Run filtering for products that need a certain amount of day data.""" if day_fraction is None: day_fraction = 0.1 logger.info("Running day coverage filtering...") day_filter = DayCoverageFilter(filter_criteria, sza_threshold=sza_threshold, day_fraction=day_fraction) return day_filter.filter_scene(input_scene)
[docs]def _filter_scene_night_only_products( input_scene: Scene, filter_criteria: dict, sza_threshold: float = 100.0, night_fraction: Optional[float] = None ): """Run filtering for products that need a certain amount of day data.""" if night_fraction is None: night_fraction = 0.1 logger.info("Running night coverage filtering...") night_filter = NightCoverageFilter(filter_criteria, sza_threshold=sza_threshold, night_fraction=night_fraction) return night_filter.filter_scene(input_scene)
[docs]def filter_scene( input_scene: Scene, reader_names: List[str], sza_threshold: float = 100.0, day_fraction: Optional[float] = None, night_fraction: Optional[float] = None, ): if input_scene is not None and day_fraction is not False: criteria = get_reader_filter_criteria(reader_names, "day_only") input_scene = _filter_scene_day_only_products( input_scene, criteria, sza_threshold=sza_threshold, day_fraction=day_fraction, ) if input_scene is not None and night_fraction is not False: criteria = get_reader_filter_criteria(reader_names, "night_only") input_scene = _filter_scene_night_only_products( input_scene, criteria, sza_threshold=sza_threshold, night_fraction=night_fraction, ) return input_scene