Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add CSPP Geo (geocat) AHI reading support #239

Merged
merged 7 commits into from
Mar 27, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
141 changes: 7 additions & 134 deletions satpy/composites/ahi.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,149 +24,22 @@

import logging

import numpy as np
from pyresample.geometry import AreaDefinition
from satpy.composites import CompositeBase
from satpy.dataset import Dataset
from satpy.composites import GenericCompositor

LOG = logging.getLogger(__name__)


class GreenCorrector(CompositeBase):
class GreenCorrector(GenericCompositor):
"""Corrector of the AHI green band to compensate for the deficit of
chlorophyl signal.
"""

def __call__(self, projectables, optional_datasets=None, **info):
def __call__(self, projectables, optional_datasets=None, **attrs):
"""Boost vegetation effect thanks to NIR (0.8µm) band."""

(green, nir) = projectables

green, nir = self.check_areas(projectables)
LOG.info('Boosting vegetation on green band')

proj = Dataset(green * 0.85 + nir * 0.15,
copy=False,
**green.info)
self.apply_modifier_info(green, proj)

return proj


class Expander(CompositeBase):
"""Expand the size of the composite.

Keyword Args:
factor (int): Repeat both dimensions by this number

"""
def __call__(self, projectables, optional_datasets=None, **info):
factor = self.attrs.get('factor', 2)

(band,) = projectables

LOG.info('Expanding datasize by a factor %d.', factor)

proj = Dataset(
np.repeat(np.repeat(band, factor, axis=0), factor, axis=1),
copy=False, **band.info)

old_area = proj.info['area']
proj.info['area'] = AreaDefinition(old_area.area_id,
old_area.name,
old_area.proj_id,
old_area.proj_dict,
old_area.x_size * factor,
old_area.y_size * factor,
old_area.area_extent)
proj.info['resolution'] *= factor
self.apply_modifier_info(band, proj)
return proj


class Reducer2(CompositeBase):
"""Reduce the size of the composite."""

def __call__(self, projectables, optional_datasets=None, **info):
(band,) = projectables

factor = 2

LOG.info('Reducing datasize by a factor %d.', factor)

proj = band[::factor, ::factor]
# newshape = (band.shape[0] / factor, factor,
# band.shape[1] / factor, factor)
# proj = Dataset(band.reshape(newshape).mean(axis=3).mean(axis=1),
# copy=False, **band.info)

old_area = proj.attrs['area']
proj.attrs['area'] = AreaDefinition(old_area.area_id,
old_area.name,
old_area.proj_id,
old_area.proj_dict,
old_area.x_size / factor,
old_area.y_size / factor,
old_area.area_extent)
proj.attrs['resolution'] *= factor
self.apply_modifier_info(band, proj)
return proj


class Reducer4(CompositeBase):
"""Reduce the size of the composite."""

def __call__(self, projectables, optional_datasets=None, **info):
(band,) = projectables

factor = 4

LOG.info('Reducing datasize by a factor %d.', factor)

proj = band[::factor, ::factor]

# newshape = (band.shape[0] / factor, factor,
# band.shape[1] / factor, factor)
# proj = Dataset(band.reshape(newshape).mean(axis=3).mean(axis=1),
# copy=False, **band.info)

old_area = proj.attrs['area']
proj.attrs['area'] = AreaDefinition(old_area.area_id,
old_area.name,
old_area.proj_id,
old_area.proj_dict,
old_area.x_size / factor,
old_area.y_size / factor,
old_area.area_extent)
proj.attrs['resolution'] *= factor
self.apply_modifier_info(band, proj)
return proj


class Reducer8(CompositeBase):
"""Reduce the size of the composite."""

def __call__(self, projectables, optional_datasets=None, **info):
(band,) = projectables

factor = 8

LOG.info('Reducing datasize by a factor %d.', factor)

proj = band[::factor, ::factor]

# newshape = (band.shape[0] / factor, factor,
# band.shape[1] / factor, factor)
# proj = Dataset(band.reshape(newshape).mean(axis=3).mean(axis=1),
# copy=False, **band.info)

old_area = proj.attrs['area']
proj.attrs['area'] = AreaDefinition(old_area.area_id,
old_area.name,
old_area.proj_id,
old_area.proj_dict,
old_area.x_size / factor,
old_area.y_size / factor,
old_area.area_extent)
proj.attrs['resolution'] *= factor
self.apply_modifier_info(band, proj)
return proj
new_green = green * 0.85 + nir * 0.15
new_green.attrs = green.attrs.copy()
return super(GreenCorrector, self).__call__((new_green,), **attrs)
179 changes: 58 additions & 121 deletions satpy/etc/composites/ahi.yaml
Original file line number Diff line number Diff line change
@@ -1,76 +1,33 @@
sensor_name: visir/ahi

modifiers:
reducer2:
compositor: !!python/name:satpy.composites.ahi.Reducer2

reducer4:
compositor: !!python/name:satpy.composites.ahi.Reducer4

vegetation_corrected:
compositor: !!python/name:satpy.composites.ahi.GreenCorrector
prerequisites:
- wavelength: 0.85

vegetation_corrected_reduced:
compositor: !!python/name:satpy.composites.ahi.GreenCorrector
prerequisites:
- wavelength: 0.85
modifiers: [reducer2,]

rayleigh_corrected:
compositor: !!python/name:satpy.composites.PSPRayleighReflectance
atmosphere: us-standard
aerosol_type: marine_clean_aerosol
prerequisites:
- wavelength: 0.65
modifiers: [reducer2, sunz_corrected]
optional_prerequisites:
- satellite_azimuth_angle
- satellite_zenith_angle
- solar_azimuth_angle
- solar_zenith_angle

rayleigh_corrected_reducedsize:
compositor: !!python/name:satpy.composites.PSPRayleighReflectance
atmosphere: us-standard
aerosol_type: marine_clean_aerosol
prerequisites:
- wavelength: 0.65
modifiers: [reducer4, sunz_corrected]
modifiers: [sunz_corrected]
optional_prerequisites:
- satellite_azimuth_angle
- satellite_zenith_angle
- solar_azimuth_angle
- solar_zenith_angle

rayleigh_corrected_reducedsize_land:
compositor: !!python/name:satpy.composites.PSPRayleighReflectance
atmosphere: us-standard
aerosol_type: continental_average_aerosol
prerequisites:
- wavelength: 0.65
modifiers: [reducer4, sunz_corrected]
optional_prerequisites:
- satellite_azimuth_angle
- satellite_zenith_angle
- solar_azimuth_angle
- solar_zenith_angle

rayleigh_corrected_reducedsize_marine_tropical:
compositor: !!python/name:satpy.composites.PSPRayleighReflectance
atmosphere: us-standard
aerosol_type: marine_tropical_aerosol
composites:
green:
compositor: !!python/name:satpy.composites.ahi.GreenCorrector
# FUTURE: Set a wavelength...see what happens. Dependency finding
# probably wouldn't work.
prerequisites:
- wavelength: 0.65
modifiers: [reducer4, sunz_corrected]
optional_prerequisites:
- satellite_azimuth_angle
- satellite_zenith_angle
- solar_azimuth_angle
- solar_zenith_angle
# should we be using the most corrected or least corrected inputs?
# what happens if something requests more modifiers on top of this?
- wavelength: 0.51
modifiers: [sunz_corrected]
- wavelength: 0.85
modifiers: [sunz_corrected]
standard_name: toa_bidirection_reflectance

composites:
overview:
compositor: !!python/name:satpy.composites.GenericCompositor
prerequisites:
Expand All @@ -79,98 +36,79 @@ composites:
- 10.4
standard_name: overview

true_color:
compositor: !!python/name:satpy.composites.GenericCompositor
prerequisites:
- wavelength: 0.65
modifiers: [reducer2, effective_solar_pathlength_corrected, rayleigh_corrected]
- wavelength: 0.51
modifiers: [vegetation_corrected, effective_solar_pathlength_corrected, rayleigh_corrected]
- wavelength: 0.46
modifiers: [effective_solar_pathlength_corrected, rayleigh_corrected]
standard_name: true_color

true_color_reducedsize:
compositor: !!python/name:satpy.composites.GenericCompositor
prerequisites:
- wavelength: 0.65
modifiers: [reducer4, effective_solar_pathlength_corrected,
rayleigh_corrected_reducedsize]
- wavelength: 0.51
modifiers: [reducer2, vegetation_corrected_reduced, effective_solar_pathlength_corrected,
rayleigh_corrected_reducedsize]
- wavelength: 0.46
modifiers: [reducer2, effective_solar_pathlength_corrected,
rayleigh_corrected_reducedsize]
standard_name: true_color

true_color_reducedsize_land:
compositor: !!python/name:satpy.composites.GenericCompositor
natural:
compositor: !!python/name:satpy.composites.SelfSharpenedRGB
prerequisites:
- wavelength: 0.65
modifiers: [reducer4, effective_solar_pathlength_corrected,
rayleigh_corrected_reducedsize_land]
- wavelength: 0.51
modifiers: [reducer2, vegetation_corrected_reduced, effective_solar_pathlength_corrected,
rayleigh_corrected_reducedsize_land]
- wavelength: 0.46
modifiers: [reducer2, effective_solar_pathlength_corrected,
rayleigh_corrected_reducedsize_land]
standard_name: true_color
- wavelength: 1.63
modifiers: [sunz_corrected] #, rayleigh_corrected]
- wavelength: 0.85
modifiers: [sunz_corrected] #, rayleigh_corrected]
- wavelength: 0.635
modifiers: [sunz_corrected] #, rayleigh_corrected]
high_resolution_band: blue
standard_name: natural

true_color_reducedsize_marine_tropical:
compositor: !!python/name:satpy.composites.GenericCompositor
true_color:
compositor: !!python/name:satpy.composites.SelfSharpenedRGB
prerequisites:
- wavelength: 0.65
modifiers: [reducer4, effective_solar_pathlength_corrected,
rayleigh_corrected_reducedsize_marine_tropical]
- wavelength: 0.51
modifiers: [reducer2, vegetation_corrected_reduced, effective_solar_pathlength_corrected,
rayleigh_corrected_reducedsize_marine_tropical]
modifiers: [sunz_corrected] #, rayleigh_corrected]
- name: green
- wavelength: 0.46
modifiers: [reducer2, effective_solar_pathlength_corrected,
rayleigh_corrected_reducedsize_marine_tropical]
modifiers: [sunz_corrected] #, rayleigh_corrected]
high_resolution_band: red
standard_name: true_color

true_color_norayleigh:
compositor: !!python/name:satpy.composites.GenericCompositor
prerequisites:
- wavelength: 0.65
modifiers: [reducer2, effective_solar_pathlength_corrected]
- wavelength: 0.51
modifiers: [vegetation_corrected, effective_solar_pathlength_corrected]
- wavelength: 0.46
modifiers: [effective_solar_pathlength_corrected]
standard_name: true_color
# true_color_reducedsize_land:
# compositor: !!python/name:satpy.composites.GenericCompositor
# prerequisites:
# - wavelength: 0.65
# modifiers: [reducer4, effective_solar_pathlength_corrected,
# rayleigh_corrected_reducedsize_land]
# - wavelength: 0.51
# modifiers: [reducer2, vegetation_corrected_reduced, effective_solar_pathlength_corrected,
# rayleigh_corrected_reducedsize_land]
# - wavelength: 0.46
# modifiers: [reducer2, effective_solar_pathlength_corrected,
# rayleigh_corrected_reducedsize_land]
# standard_name: true_color
#
# true_color_reducedsize_marine_tropical:
# compositor: !!python/name:satpy.composites.GenericCompositor
# prerequisites:
# - wavelength: 0.65
# modifiers: [reducer4, effective_solar_pathlength_corrected,
# rayleigh_corrected_reducedsize_marine_tropical]
# - wavelength: 0.51
# modifiers: [reducer2, vegetation_corrected_reduced, effective_solar_pathlength_corrected,
# rayleigh_corrected_reducedsize_marine_tropical]
# - wavelength: 0.46
# modifiers: [reducer2, effective_solar_pathlength_corrected,
# rayleigh_corrected_reducedsize_marine_tropical]
# standard_name: true_color

day_microphysics_eum:
compositor: !!python/name:satpy.composites.GenericCompositor
prerequisites:
- wavelength: 0.86
modifiers: [reducer4, ]
- wavelength: 3.9
modifiers: [nir_reflectance, reducer2]
modifiers: [nir_reflectance]
- wavelength: 10.4
modifiers: [reducer2, ]
standard_name: day_microphysics

day_microphysics_ahi:
compositor: !!python/name:satpy.composites.GenericCompositor
prerequisites:
- wavelength: 0.86
modifiers: [reducer4, ]
- wavelength: 2.3
modifiers: [reducer2]
- wavelength: 10.4
modifiers: [reducer2, ]
standard_name: day_microphysics

cloud_phase_distinction:
compositor: !!python/name:satpy.composites.GenericCompositor
prerequisites:
- wavelength: 10.4
- wavelength: 0.64
modifiers: [reducer4]
- wavelength: 1.6
standard_name: cloud_phase_distinction

Expand Down Expand Up @@ -200,8 +138,7 @@ composites:
convection:
compositor: !!python/name:satpy.composites.Convection
prerequisites:
- wavelength: 0.635
modifiers: [reducer4]
- 0.635
- 1.63
- 3.75
- 6.7
Expand Down
Loading