#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Copyright (c) 2023 Satpy developers
#
# This file is part of satpy.
#
# satpy is free software: you can redistribute it and/or modify it under the
# terms of the GNU General Public License as published by the Free Software
# Foundation, either version 3 of the License, or (at your option) any later
# version.
#
# satpy is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
# A PARTICULAR PURPOSE. See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along with
# satpy. If not, see <http://www.gnu.org/licenses/>.
"""The epic_l1b_h5 reader tests package."""
import os
import tempfile
import h5py
import numpy as np
import pytest
from satpy.readers.epic_l1b_h5 import CALIB_COEFS
from satpy.tests.utils import RANDOM_GEN
b317_data = RANDOM_GEN.uniform(low=0, high=5200, size=(100, 100))
b688_data = RANDOM_GEN.uniform(low=0, high=5200, size=(100, 100))
sza_data = RANDOM_GEN.uniform(low=0, high=100, size=(100, 100))
vaa_data = RANDOM_GEN.uniform(low=-180, high=180, size=(100, 100))
lon_data = RANDOM_GEN.uniform(low=-90, high=90, size=(100, 100))
lat_data = RANDOM_GEN.uniform(low=-180, high=180, size=(100, 100))
mas_data = RANDOM_GEN.choice([0, 1], size=(100, 100))
[docs]
@pytest.fixture
def setup_hdf5_file(tmp_path):
"""Create temp hdf5 files."""
fn = tmp_path / "epic_1b_20150613120251_03.h5"
make_fake_hdf_epic(fn)
return fn
[docs]
def make_fake_hdf_epic(fname):
"""Make a fake HDF5 file for EPIC data testing."""
fid = h5py.File(fname, "w")
g1 = fid.create_group("Band317nm")
g1.create_dataset("Image", shape=(100, 100), dtype=np.float32, data=b317_data)
g2 = fid.create_group("Band688nm")
g2.create_dataset("Image", shape=(100, 100), dtype=np.float32, data=b688_data)
g3 = g2.create_group("Geolocation")
g4 = g3.create_group("Earth")
g4.create_dataset("SunAngleZenith", shape=(100, 100), dtype=np.float32, data=sza_data)
g4.create_dataset("ViewAngleAzimuth", shape=(100, 100), dtype=np.float32, data=vaa_data)
g4.create_dataset("Mask", shape=(100, 100), dtype=int, data=mas_data)
g4.create_dataset("Latitude", shape=(100, 100), dtype=np.float32, data=lat_data)
g4.create_dataset("Longitude", shape=(100, 100), dtype=np.float32, data=lon_data)
fid.attrs.create("begin_time", "2015-06-13 12:00:37")
fid.attrs.create("end_time", "2015-06-13 12:05:01")
fid.close()
[docs]
class TestEPICL1bReader:
"""Test the EPIC L1b HDF5 reader."""
[docs]
def _setup_h5(self, setup_hdf5_file):
"""Initialise reader for the tests."""
from satpy.readers import load_reader
test_reader = load_reader(self.reader_configs)
loadables = test_reader.select_files_from_pathnames([setup_hdf5_file])
test_reader.create_filehandlers(loadables)
return test_reader
[docs]
def setup_method(self):
"""Set up the tests."""
from satpy._config import config_search_paths
self.yaml_file = "epic_l1b_h5.yaml"
self.filename_test = os.path.join(
tempfile.gettempdir(),
"epic_1b_20150613120251_03.h5",
)
self.reader_configs = config_search_paths(os.path.join("readers", self.yaml_file))
[docs]
def test_times(self, setup_hdf5_file):
"""Test start and end times load properly."""
import datetime as dt
test_reader = self._setup_h5(setup_hdf5_file)
assert test_reader.start_time == dt.datetime(2015, 6, 13, 12, 0, 37)
assert test_reader.end_time == dt.datetime(2015, 6, 13, 12, 5, 1)
[docs]
def test_counts_calibration(self, setup_hdf5_file):
"""Test that data is correctly calibrated."""
from satpy.tests.utils import make_dsq
test_reader = self._setup_h5(setup_hdf5_file)
# Test counts calibration
ds = test_reader.load([make_dsq(name="B317", calibration="counts")])
np.testing.assert_allclose(ds["B317"].data, b317_data)
[docs]
def test_refl_calibration(self, setup_hdf5_file):
"""Test that data is correctly calibrated into reflectances."""
from satpy.tests.utils import make_dsq
test_reader = self._setup_h5(setup_hdf5_file)
# Test conversion to reflectance
ds = test_reader.load([make_dsq(name="B317", calibration="reflectance")])
np.testing.assert_allclose(ds["B317"].data, b317_data * CALIB_COEFS["B317"] * 100., rtol=1e-5)
[docs]
def test_bad_calibration(self, setup_hdf5_file):
"""Test that error is raised if a bad calibration is used."""
from satpy.tests.utils import make_dsq
test_reader = self._setup_h5(setup_hdf5_file)
# Test nonsense calibration
with pytest.raises(KeyError):
test_reader.load([make_dsq(name="B317", calibration="potatoes")])
[docs]
def test_load_ancillary(self, setup_hdf5_file):
"""Test that ancillary datasets load correctly."""
from satpy.tests.utils import make_dsq
test_reader = self._setup_h5(setup_hdf5_file)
# Load sza
ds = test_reader.load([make_dsq(name="solar_zenith_angle"),
make_dsq(name="satellite_azimuth_angle"),
make_dsq(name="latitude"),
make_dsq(name="longitude"),
make_dsq(name="earth_mask")])
np.testing.assert_allclose(ds["solar_zenith_angle"].data, sza_data)
np.testing.assert_allclose(ds["satellite_azimuth_angle"].data, vaa_data)
np.testing.assert_allclose(ds["latitude"].data, lat_data)
np.testing.assert_allclose(ds["longitude"].data, lon_data)
np.testing.assert_allclose(ds["earth_mask"].data, mas_data)