Skip to content

Commit

Permalink
Add quality flag filtering to nucaps reader
Browse files Browse the repository at this point in the history
  • Loading branch information
djhoese committed Mar 22, 2016
1 parent 1956673 commit 31fd78b
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 2 deletions.
9 changes: 9 additions & 0 deletions etc/readers/nucaps.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ description=NUCAPS Reader
reader=satpy.readers.nucaps.NUCAPSReader
sensor=cris,atms
mask_surface=True
mask_quality=True

[navigation:nucaps_geo]
description=NUCAPS Geolocation
Expand Down Expand Up @@ -45,6 +46,11 @@ file_type=DATASET
file_key=surface_pressure
join_method=append

[metadata:quality_flag]
file_type=DATASET
file_key=quality_flag
join_method=append

[file_key:coverage_start]
variable_name=/attr/time_coverage_start

Expand Down Expand Up @@ -85,3 +91,6 @@ index=0

[file_key:surface_pressure]
variable_name=Surface_Pressure

[file_key:quality_flag]
variable_name=Quality_Flag
19 changes: 17 additions & 2 deletions satpy/readers/nucaps.py
Original file line number Diff line number Diff line change
Expand Up @@ -291,10 +291,11 @@ class NUCAPSReader(ConfigBasedReader):
"""Reader for NUCAPS NetCDF4 files.
"""
def __init__(self, default_file_reader=NUCAPSFileReader, default_config_filename="readers/nucaps.cfg",
mask_surface=None, surface_pressure=None, **kwargs):
mask_surface=None, mask_quality=None, **kwargs):
"""Configure reader behavior.
:param mask_surface: mask anything below the surface pressure (surface_pressure metadata required)
:param mask_quality: mask anything where the `quality_flag` metadata is ``!= 1``.
"""
self.pressure_dataset_names = defaultdict(list)
Expand All @@ -304,6 +305,7 @@ def __init__(self, default_file_reader=NUCAPSFileReader, default_config_filename
)
self.default_file_reader = self.config_options.get("default_file_reader") if default_file_reader is None else default_file_reader
self.mask_surface = self.config_options.get("mask_surface") if mask_surface is None else mask_surface
self.mask_quality = self.config_options.get("mask_quality") if mask_quality is None else mask_quality

def load_section_file_key(self, section_name, section_options):
super(NUCAPSReader, self).load_section_file_key(section_name, section_options.copy())
Expand Down Expand Up @@ -355,6 +357,9 @@ def load(self, datasets_to_load, metadata=None, pressure_levels=None, **dataset_
if "surface_pressure" not in metadata:
LOG.debug("Adding 'pressure_levels' to metadata for surface pressure filtering")
metadata.add("surface_pressure")
if self.mask_quality and "quality_flag" not in metadata:
LOG.debug("Adding 'quality_flag' to metadata for quality flag filtering")
metadata.add("quality_flag")

if pressure_levels is not None:
# Filter out datasets that don't fit in the correct pressure level
Expand Down Expand Up @@ -387,7 +392,7 @@ def load(self, datasets_to_load, metadata=None, pressure_levels=None, **dataset_
LOG.debug("No 'pressure_levels' metadata included in dataset")
continue
if ds_levels.shape[0] != ds_obj.shape[-1]:
LOG.debug("Dataset '{}' doesn't contain multiple pressure levels".format(ds_id))
# LOG.debug("Dataset '{}' doesn't contain multiple pressure levels".format(ds_id))
continue

if pressure_levels is True:
Expand Down Expand Up @@ -428,6 +433,16 @@ def load(self, datasets_to_load, metadata=None, pressure_levels=None, **dataset_
else:
LOG.warning("Not sure how to handle shape of 'surface_pressure' metadata")

if self.mask_quality:
LOG.debug("Filtering data based on quality flags")
for ds_id in datasets_to_load:
ds = datasets_loaded[ds_id]
if "quality_flag" not in ds.info:
continue
quality_flag = ds.info["quality_flag"]
LOG.debug("Masking %s where quality flag doesn't equal 1", ds_id)
ds.mask[quality_flag != 1, ...] = True

return datasets_loaded


0 comments on commit 31fd78b

Please sign in to comment.