Skip to content

Commit

Permalink
Merge pull request #2639 from fwfichtner/avhrr-cloud-flags
Browse files Browse the repository at this point in the history
Update AVHRR EPS reader to read cloud flags information
  • Loading branch information
djhoese committed Nov 17, 2023
2 parents c09c147 + 4181504 commit ace3999
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 23 deletions.
8 changes: 8 additions & 0 deletions satpy/etc/readers/avhrr_l1b_eps.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ datasets:
- latitude
file_type: avhrr_eps


latitude:
name: latitude
resolution: 1050
Expand Down Expand Up @@ -131,6 +132,13 @@ datasets:
coordinates: [longitude, latitude]
file_type: avhrr_eps

cloud_flags:
name: cloud_flags
sensor: avhrr-3
resolution: 1050
coordinates: [longitude, latitude]
file_type: avhrr_eps

file_types:
avhrr_eps:
file_reader: !!python/name:satpy.readers.eps_l1b.EPSAVHRRFile
Expand Down
50 changes: 27 additions & 23 deletions satpy/readers/eps_l1b.py
Original file line number Diff line number Diff line change
Expand Up @@ -287,19 +287,9 @@ def get_dataset(self, key, info):
if self.sections is None:
self._read_all()

if key["name"] in ["longitude", "latitude"]:
lons, lats = self.get_full_lonlats()
if key["name"] == "longitude":
dataset = create_xarray(lons)
else:
dataset = create_xarray(lats)

elif key["name"] in ["solar_zenith_angle", "solar_azimuth_angle",
"satellite_zenith_angle", "satellite_azimuth_angle"]:
dataset = self._get_angle_dataarray(key)
elif key["name"] in ["1", "2", "3a", "3A", "3b", "3B", "4", "5"]:
dataset = self._get_calibrated_dataarray(key)
else:
try:
dataset = self._get_data_array(key)
except KeyError:
logger.info("Can't load channel in eps_l1b: " + str(key["name"]))
return

Expand All @@ -311,18 +301,32 @@ def get_dataset(self, key, info):
dataset.attrs.update(key.to_dict())
return dataset

def _get_data_array(self, key):
name = key["name"]
if name in ["longitude", "latitude"]:
data = self.get_full_lonlats()[int(name == "latitude")]
dataset = create_xarray(data)
elif name in ["solar_zenith_angle", "solar_azimuth_angle", "satellite_zenith_angle", "satellite_azimuth_angle"]:
dataset = self._get_angle_dataarray(key)
elif name in ["1", "2", "3a", "3A", "3b", "3B", "4", "5"]:
dataset = self._get_calibrated_dataarray(key)
elif name == "cloud_flags":
array = self["CLOUD_INFORMATION"]
dataset = create_xarray(array)
else:
raise KeyError(f"Unknown channel: {name}")
return dataset

def _get_angle_dataarray(self, key):
"""Get an angle dataarray."""
sun_azi, sun_zen, sat_azi, sat_zen = self.get_full_angles()
if key["name"] == "solar_zenith_angle":
dataset = create_xarray(sun_zen)
elif key["name"] == "solar_azimuth_angle":
dataset = create_xarray(sun_azi)
if key["name"] == "satellite_zenith_angle":
dataset = create_xarray(sat_zen)
elif key["name"] == "satellite_azimuth_angle":
dataset = create_xarray(sat_azi)
return dataset
arr_index = {
"solar_azimuth_angle": 0,
"solar_zenith_angle": 1,
"satellite_azimuth_angle": 2,
"satellite_zenith_angle": 3,
}[key["name"]]
data = self.get_full_angles()[arr_index]
return create_xarray(data)

@cached_property
def three_a_mask(self):
Expand Down
9 changes: 9 additions & 0 deletions satpy/tests/reader_tests/test_eps_l1b.py
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,15 @@ def test_angles(self):
assert res.attrs["sensor"] == "avhrr-3"
assert res.attrs["name"] == "solar_zenith_angle"

def test_clould_flags(self):
"""Test getting the cloud flags."""
did = make_dataid(name="cloud_flags")
res = self.fh.get_dataset(did, {})
assert isinstance(res, xr.DataArray)
assert res.attrs["platform_name"] == "Metop-C"
assert res.attrs["sensor"] == "avhrr-3"
assert res.attrs["name"] == "cloud_flags"

@mock.patch("satpy.readers.eps_l1b.EPSAVHRRFile.__getitem__")
def test_get_full_angles_twice(self, mock__getitem__):
"""Test get full angles twice."""
Expand Down

0 comments on commit ace3999

Please sign in to comment.