Skip to content

Commit

Permalink
Merge pull request #239 from pytroll/feature-geocat-ahi-xarray
Browse files Browse the repository at this point in the history
Add CSPP Geo (geocat) AHI reading support
  • Loading branch information
djhoese authored Mar 27, 2018
2 parents 422c02f + c0be224 commit a56ef28
Show file tree
Hide file tree
Showing 11 changed files with 431 additions and 268 deletions.
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

0 comments on commit a56ef28

Please sign in to comment.