Skip to content

Commit

Permalink
Merge pull request #1101 from ninahakansson/bugfix_eps_l1b_angles
Browse files Browse the repository at this point in the history
Fix eps l1b angles computation returning non deterministic results
  • Loading branch information
mraspaud committed Mar 4, 2020
2 parents 3d911b1 + dd55807 commit bbfb44f
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 8 deletions.
9 changes: 3 additions & 6 deletions satpy/readers/eps_l1b.py
Expand Up @@ -225,13 +225,10 @@ def _get_full_angles(self, solar_zenith, sat_zenith, solar_azimuth, sat_azimuth)
from geotiepoints import metop20kmto1km
# Note: interpolation asumes lat values values between -90 and 90
# Solar and satellite zenith is between 0 and 180.
solar_zenith -= 90
sun_azi, sun_zen = metop20kmto1km(
solar_azimuth, solar_zenith)
# Note: delayed will cast input dask-arrays to numpy arrays (needed by metop20kmto1km).
sun_azi, sun_zen = metop20kmto1km(solar_azimuth, solar_zenith - 90)
sun_zen += 90
sat_zenith -= 90
sat_azi, sat_zen = metop20kmto1km(
sat_azimuth, sat_zenith)
sat_azi, sat_zen = metop20kmto1km(sat_azimuth, sat_zenith - 90)
sat_zen += 90
return sun_azi, sun_zen, sat_azi, sat_zen
else:
Expand Down
37 changes: 35 additions & 2 deletions satpy/tests/reader_tests/test_eps_l1b.py
Expand Up @@ -21,13 +21,13 @@
from contextlib import suppress
from tempfile import mkstemp
from unittest import TestCase, TestLoader, TestSuite
from unittest import mock

import numpy as np
import xarray as xr

import satpy
from satpy import DatasetID
from satpy.readers import eps_l1b as eps

grh_dtype = np.dtype([("record_class", "|i1"),
("INSTRUMENT_GROUP", "|i1"),
("RECORD_SUBCLASS", "|i1"),
Expand Down Expand Up @@ -127,6 +127,39 @@ def test_angles(self):
assert(res.attrs['sensor'] == 'avhrr-3')
assert(res.attrs['name'] == 'solar_zenith_angle')

@mock.patch('satpy.readers.eps_l1b.EPSAVHRRFile.__getitem__')
@mock.patch('satpy.readers.eps_l1b.EPSAVHRRFile.__init__')
def test_get_full_angles_twice(self, mock__init__, mock__getitem__):
"""Test get full angles twice."""
geotiemock = mock.Mock()
metop20kmto1km = geotiemock.metop20kmto1km
metop20kmto1km.side_effect = lambda x, y: (x.copy(), y.copy())

def mock_getitem(key):
data = {"ANGULAR_RELATIONS_FIRST": np.zeros((7, 4)),
"ANGULAR_RELATIONS": np.zeros((7, 103, 4)),
"ANGULAR_RELATIONS_LAST": np.zeros((7, 4)),
"NAV_SAMPLE_RATE": 20}
return data[key]
mock__init__.return_value = None
mock__getitem__.side_effect = mock_getitem
avhrr_reader = satpy.readers.eps_l1b.EPSAVHRRFile()
avhrr_reader.sun_azi = None
avhrr_reader.sat_azi = None
avhrr_reader.sun_zen = None
avhrr_reader.sat_zen = None
avhrr_reader.scanlines = 7
avhrr_reader.pixels = 2048

with mock.patch.dict("sys.modules", geotiepoints=geotiemock):
# Get dask arrays
sun_azi, sun_zen, sat_azi, sat_zen = avhrr_reader.get_full_angles()
# Convert to numpy array
sun_zen_np1 = np.array(avhrr_reader.sun_zen)
# Convert to numpy array again
sun_zen_np2 = np.array(avhrr_reader.sun_zen)
assert np.allclose(sun_zen_np1, sun_zen_np2)

def tearDown(self):
"""Tear down the tests."""
with suppress(OSError):
Expand Down

0 comments on commit bbfb44f

Please sign in to comment.