Skip to content

Commit

Permalink
Merge pull request #1706 from simonrp84/slstr
Browse files Browse the repository at this point in the history
Update SLSTR reader to choose correct file for interpolated angles
  • Loading branch information
mraspaud committed Jun 4, 2021
2 parents 1289aa3 + 72e0ac4 commit fbcf859
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 25 deletions.
39 changes: 23 additions & 16 deletions satpy/readers/slstr_l1b.py
Expand Up @@ -231,6 +231,15 @@ def end_time(self):
class NCSLSTRAngles(BaseFileHandler):
"""Filehandler for angles."""

def _loadcart(self, fname):
"""Load a cartesian file of appropriate type."""
cartf = xr.open_dataset(fname,
decode_cf=True,
mask_and_scale=True,
chunks={'columns': CHUNK_SIZE,
'rows': CHUNK_SIZE})
return cartf

def __init__(self, filename, filename_info, filetype_info):
"""Initialize the angles reader."""
super(NCSLSTRAngles, self).__init__(filename, filename_info,
Expand All @@ -245,29 +254,23 @@ def __init__(self, filename, filename_info, filetype_info):
# TODO: get metadata from the manifest file (xfdumanifest.xml)
self.platform_name = PLATFORM_NAMES[filename_info['mission_id']]
self.sensor = 'slstr'

self.view = filename_info['view']
self._start_time = filename_info['start_time']
self._end_time = filename_info['end_time']

cart_file = os.path.join(
carta_file = os.path.join(
os.path.dirname(self.filename), 'cartesian_a{}.nc'.format(self.view[0]))
carti_file = os.path.join(
os.path.dirname(self.filename), 'cartesian_i{}.nc'.format(self.view[0]))
self.cart = xr.open_dataset(cart_file,
decode_cf=True,
mask_and_scale=True,
chunks={'columns': CHUNK_SIZE,
'rows': CHUNK_SIZE})
cartx_file = os.path.join(
os.path.dirname(self.filename), 'cartesian_tx.nc')
self.cartx = xr.open_dataset(cartx_file,
decode_cf=True,
mask_and_scale=True,
chunks={'columns': CHUNK_SIZE,
'rows': CHUNK_SIZE})
self.carta = self._loadcart(carta_file)
self.carti = self._loadcart(carti_file)
self.cartx = self._loadcart(cartx_file)

def get_dataset(self, key, info):
"""Load a dataset."""
if not info['view'].name.startswith(self.view):
if not key['view'].name.startswith(self.view[0]):
return
logger.debug('Reading %s.', key['name'])
# Check if file_key is specified in the yaml
Expand All @@ -283,15 +286,19 @@ def get_dataset(self, key, info):

if c_step != 1 or l_step != 1:
logger.debug('Interpolating %s.', key['name'])

# TODO: do it in cartesian coordinates ! pbs at date line and
# possible
tie_x = self.cartx['x_tx'].data[0, :][::-1]
tie_y = self.cartx['y_tx'].data[:, 0]
full_x = self.cart['x_i' + self.view[0]].data
full_y = self.cart['y_i' + self.view[0]].data
if key.get('resolution', 1000) == 500:
full_x = self.carta['x_a' + self.view[0]].data
full_y = self.carta['y_a' + self.view[0]].data
else:
full_x = self.carti['x_i' + self.view[0]].data
full_y = self.carti['y_i' + self.view[0]].data

variable = variable.fillna(0)
variable.attrs['resolution'] = key.get('resolution', 1000)

from scipy.interpolate import RectBivariateSpline
spl = RectBivariateSpline(
Expand Down
40 changes: 31 additions & 9 deletions satpy/tests/reader_tests/test_slstr_l1b.py
Expand Up @@ -93,6 +93,15 @@ def setUp(self, xr_):
'S9_BT_ao': self.rad,
'foo_radiance_an': self.rad,
'S5_solar_irradiances': self.rad,
'geometry_tn': self.rad,
'latitude_an': self.rad,
'x_tx': self.rad,
'y_tx': self.rad,
'x_in': self.rad,
'y_in': self.rad,
'x_an': self.rad,
'y_an': self.rad,
'flags_an': self.rad,
'detector_an': det,
},
attrs={
Expand All @@ -110,9 +119,19 @@ def make_dataid(**items):
class TestSLSTRReader(TestSLSTRL1B):
"""Test various nc_slstr file handlers."""

class FakeSpl:
"""Fake return function for SPL interpolation."""

@staticmethod
def ev(foo_x, foo_y):
"""Fake function to return interpolated data."""
return np.zeros((3, 2))

@mock.patch('satpy.readers.slstr_l1b.xr')
def test_instantiate(self, xr_):
@mock.patch('scipy.interpolate.RectBivariateSpline')
def test_instantiate(self, bvs_, xr_):
"""Test initialization of file handlers."""
bvs_.return_value = self.FakeSpl
xr_.open_dataset.return_value = self.fake_dataset

good_start = datetime.strptime(self.start_time,
Expand All @@ -122,6 +141,8 @@ def test_instantiate(self, xr_):

ds_id = make_dataid(name='foo', calibration='radiance',
stripe='a', view='nadir')
ds_id_500 = make_dataid(name='foo', calibration='radiance',
stripe='a', view='nadir', resolution=500)
filename_info = {'mission_id': 'S3A', 'dataset_name': 'foo',
'start_time': 0, 'end_time': 0,
'stripe': 'a', 'view': 'n'}
Expand Down Expand Up @@ -149,28 +170,29 @@ def test_instantiate(self, xr_):
filename_info = {'mission_id': 'S3A', 'dataset_name': 'foo',
'start_time': 0, 'end_time': 0,
'stripe': 'a', 'view': 'n'}
test = NCSLSTRGeo('somedir/S1_radiance_an.nc', filename_info, 'c')
test.get_dataset(ds_id, dict(filename_info, **{'file_key': 'foo'}))
test = NCSLSTRGeo('somedir/geometry_an.nc', filename_info, 'c')
test.get_dataset(ds_id, dict(filename_info, **{'file_key': 'latitude_{stripe:1s}{view:1s}'}))
self.assertEqual(test.start_time, good_start)
self.assertEqual(test.end_time, good_end)
xr_.open_dataset.assert_called()
xr_.open_dataset.reset_mock()

test = NCSLSTRAngles('somedir/S1_radiance_an.nc', filename_info, 'c')
# TODO: Make this test work
# test.get_dataset(ds_id, filename_info)
test = NCSLSTRFlag('somedir/S1_radiance_an.nc', filename_info, 'c')
test.get_dataset(ds_id, dict(filename_info, **{'file_key': 'flags_{stripe:1s}{view:1s}'}))
assert test.view == 'nadir'
assert test.stripe == 'a'
self.assertEqual(test.start_time, good_start)
self.assertEqual(test.end_time, good_end)
xr_.open_dataset.assert_called()
xr_.open_dataset.reset_mock()

test = NCSLSTRFlag('somedir/S1_radiance_an.nc', filename_info, 'c')
assert test.view == 'nadir'
assert test.stripe == 'a'
test = NCSLSTRAngles('somedir/S1_radiance_an.nc', filename_info, 'c')
test.get_dataset(ds_id, dict(filename_info, **{'file_key': 'geometry_t{view:1s}'}))
self.assertEqual(test.start_time, good_start)
self.assertEqual(test.end_time, good_end)
xr_.open_dataset.assert_called()
xr_.open_dataset.reset_mock()
test.get_dataset(ds_id_500, dict(filename_info, **{'file_key': 'geometry_t{view:1s}'}))


class TestSLSTRCalibration(TestSLSTRL1B):
Expand Down

0 comments on commit fbcf859

Please sign in to comment.