Source code for satpy.tests.reader_tests.test_ahi_l2_nc

"""Tests for the Himawari L2 netCDF reader."""

from datetime import datetime

import numpy as np
import pytest
import xarray as xr

from satpy.readers.ahi_l2_nc import HIML2NCFileHandler
from satpy.tests.utils import make_dataid

rng = np.random.default_rng()
clmk_data = rng.integers(0, 3, (5500, 5500), dtype=np.uint16)
cprob_data = rng.uniform(0, 1, (5500, 5500))
lat_data = rng.uniform(-90, 90, (5500, 5500))
lon_data = rng.uniform(-180, 180, (5500, 5500))

start_time = datetime(2023, 8, 24, 5, 40, 21)
end_time = datetime(2023, 8, 24, 5, 49, 40)

dimensions = {"Columns": 5500, "Rows": 5500}

exp_ext = (-5499999.9012, -5499999.9012, 5499999.9012, 5499999.9012)

global_attrs = {"time_coverage_start": start_time.strftime("%Y-%m-%dT%H:%M:%SZ"),
                "time_coverage_end": end_time.strftime("%Y-%m-%dT%H:%M:%SZ"),
                "instrument_name": "AHI",
                "satellite_name": "Himawari-9",
                "cdm_data_type": "Full Disk",
                }

badarea_attrs = global_attrs.copy()
badarea_attrs["cdm_data_type"] = "bad_area"


[docs] def ahil2_filehandler(fname, platform="h09"): """Instantiate a Filehandler.""" fileinfo = {"platform": platform} filetype = None fh = HIML2NCFileHandler(fname, fileinfo, filetype) return fh
[docs] @pytest.fixture(scope="session") def himl2_filename(tmp_path_factory): """Create a fake himawari l2 file.""" fname = f'{tmp_path_factory.mktemp("data")}/AHI-CMSK_v1r1_h09_s202308240540213_e202308240549407_c202308240557548.nc' ds = xr.Dataset({"CloudMask": (["Rows", "Columns"], clmk_data)}, coords={"Latitude": (["Rows", "Columns"], lat_data), "Longitude": (["Rows", "Columns"], lon_data)}, attrs=global_attrs) ds.to_netcdf(fname) return fname
[docs] @pytest.fixture(scope="session") def himl2_filename_bad(tmp_path_factory): """Create a fake himawari l2 file.""" fname = f'{tmp_path_factory.mktemp("data")}/AHI-CMSK_v1r1_h09_s202308240540213_e202308240549407_c202308240557548.nc' ds = xr.Dataset({"CloudMask": (["Rows", "Columns"], clmk_data)}, coords={"Latitude": (["Rows", "Columns"], lat_data), "Longitude": (["Rows", "Columns"], lon_data)}, attrs=badarea_attrs) ds.to_netcdf(fname) return fname
[docs] def test_startend(himl2_filename): """Test start and end times are set correctly.""" fh = ahil2_filehandler(himl2_filename) assert fh.start_time == start_time assert fh.end_time == end_time
[docs] def test_ahi_l2_area_def(himl2_filename, caplog): """Test reader handles area definition correctly.""" from pyproj import CRS ps = "+a=6378137 +h=35785863 +lon_0=140.7 +no_defs +proj=geos +rf=298.257024882273 +type=crs +units=m +x_0=0 +y_0=0" # Check case where input data is correct size. fh = ahil2_filehandler(himl2_filename) clmk_id = make_dataid(name="cloudmask") area_def = fh.get_area_def(clmk_id) assert area_def.width == dimensions["Columns"] assert area_def.height == dimensions["Rows"] assert np.allclose(area_def.area_extent, exp_ext) expected_crs = CRS(ps) assert area_def.crs == expected_crs # Check case where input data is incorrect size. fh = ahil2_filehandler(himl2_filename) fh.nlines = 3000 with pytest.raises(ValueError, match="Input L2 file is not a full disk Himawari scene..*"): fh.get_area_def(clmk_id)
[docs] def test_bad_area_name(himl2_filename_bad): """Check case where area name is not correct.""" global_attrs["cdm_data_type"] = "bad_area" with pytest.raises(ValueError, match="File is not a full disk scene"): ahil2_filehandler(himl2_filename_bad) global_attrs["cdm_data_type"] = "Full Disk"
[docs] def test_load_data(himl2_filename): """Test that data is loaded successfully.""" fh = ahil2_filehandler(himl2_filename) clmk_id = make_dataid(name="cloudmask") clmk = fh.get_dataset(clmk_id, {"file_key": "CloudMask"}) assert np.allclose(clmk.data, clmk_data)