Skip to content
Snippets Groups Projects
test_spectral_tests.py 9.02 KiB
"""Spectral tests."""
import os

import numpy as np
import pytest
import xarray as xr
import yaml

# from typing import Dict
# from attrs import define, field, Factory
import mvcm.spectral_tests as tst


# CREATE PATHS
@pytest.fixture
def fixturepath():
    """Get fixture path."""
    return os.path.join(os.path.dirname(__file__), "fixtures")


@pytest.fixture
def data_path():
    """Get data path."""
    return "/ships19/hercules/pveglio/mvcm_cleanup"


# SET FILENAME FIXTURES
@pytest.fixture
def thresholds_file(fixturepath):
    """Set thresholds file name."""
    return os.path.join(fixturepath, "thresholds.mvcm.snpp.v0.0.1.yaml")


@pytest.fixture
def ref_confidence_file(data_path):
    """Set reference confidence file name."""
    return os.path.join(data_path, "ref_confidence.nc")


@pytest.fixture
def data_file(data_path):
    """Set data file name."""
    return os.path.join(data_path, "viirs_data_A2022173.1312.nc")


# SET DATA FIXTURES
@pytest.fixture
def thresholds(thresholds_file):
    """Load thresholds file."""
    return yaml.safe_load(open(thresholds_file))


@pytest.fixture
def data(data_file):
    """Load data."""
    return xr.open_dataset(data_file)


@pytest.fixture
def ref_confidence(ref_confidence_file):
    """Load reference data."""
    return xr.open_dataset(ref_confidence_file)


def test_11um_test(data, thresholds, ref_confidence):
    """Test 11um_test function."""
    cmin = np.ones(data.latitude.shape)

    for scene_name in [
        "Ocean_Day",
        "Ocean_Night",
        "Polar_Day_Ocean",
        "Polar_Night_Ocean",
    ]:
        SceneType = tst.CloudTests(data=data, scene_name=scene_name, thresholds=thresholds)

        cmin, bit = SceneType.test_11um("M15", cmin)

    assert np.allclose(cmin, ref_confidence.bt11um_confidence.values)


def test_surface_temperature_test(data, thresholds, ref_confidence):
    """Test surface_temperature_test function."""
    cmin = np.ones(data.latitude.shape)

    for scene_name in ["Land_Night", "Polar_Night_Land"]:
        SceneType = tst.CloudTests(data=data, scene_name=scene_name, thresholds=thresholds)

        cmin, bit = SceneType.surface_temperature_test("M15", data, cmin)

    assert np.allclose(cmin, ref_confidence.surface_temperature_confidence.values)


def test_sst_test(data, thresholds, ref_confidence):
    """Test sst_test function."""
    cmin = np.ones(data.latitude.shape)
    for scene_name in [
        "Ocean_Day",
        "Ocean_Night",
        "Polar_Day_Ocean",
        "Polar_Night_Ocean",
    ]:
        SceneType = tst.CloudTests(data=data, scene_name=scene_name, thresholds=thresholds)

        cmin, bit = SceneType.sst_test("M15", "M16", cmin)

    assert np.allclose(cmin, ref_confidence.sst_confidence.values)


def test_bt_diff_86_11um(data, thresholds, ref_confidence):
    """Tet bt_diff_86_11um function."""
    cmin = np.ones(data.latitude.shape)
    for scene_name in [
        "Ocean_Day",
        "Ocean_Night",
        "Polar_Day_Ocean",
        "Polar_Night_Ocean",
    ]:
        SceneType = tst.CloudTests(data=data, scene_name=scene_name, thresholds=thresholds)

        cmin, bit = SceneType.bt_diff_86_11um("M14-M15", cmin)

    assert np.allclose(cmin, ref_confidence.diff86_11um_confidence.values)


def test_11_12um_diff(data, thresholds, ref_confidence):
    """Test 11_12um_diff function."""
    cmin = np.ones(data.latitude.shape)
    for scene_name in [
        "Land_Day",
        "Land_Day_Coast",
        "Land_Day_Desert",
        "Land_Day_Desert_Coast",
        "Ocean_Day",
        "Ocean_Night",
        "Polar_Day_Ocean",
        "Polar_Night_Ocean",
        "Polar_Day_Land",
        "Polar_Day_Coast",
        "Polar_Day_Desert",
        "Polar_Day_Desert_Coast",
        "Polar_Day_Snow",
        "Land_Night",
        "Polar_Night_Land",
        "Polar_Night_Snow",
        "Day_Snow",
        "Night_Snow",
    ]:
        SceneType = tst.CloudTests(data=data, scene_name=scene_name, thresholds=thresholds)

        cmin, bit = SceneType.test_11_12um_diff("M15-M16", cmin)

    assert np.allclose(cmin, ref_confidence.diff11_12um_confidence.values)


def test_bt_difference_11_4um_test_ocean():
    """Test bt_difference_11_4um_test_ocean function."""
    pass


def test_bt_difference_11_4um_test_land():
    """Test bt_difference_11_4um_test_land function."""
    pass


def test_variability_11um_test(data, thresholds, ref_confidence):
    """Test variability_11um_test function."""
    cmin = np.ones(data.latitude.shape)
    for scene_name in ["Polar_Day_Ocean", "Polar_Night_Ocean"]:
        SceneType = tst.CloudTests(data=data, scene_name=scene_name, thresholds=thresholds)

        cmin, bit = SceneType.variability_11um_test("M15", cmin)

    assert np.allclose(cmin, ref_confidence.var11um_confidence.values)


def test_oceanic_stratus_11_4um_test(data, thresholds, ref_confidence):
    """Test oceanic_stratus_11_4um_test function."""
    cmin = np.ones(data.latitude.shape)
    for scene_name in [
        "Land_Day",
        "Land_Day_Coast",
        "Land_Day_Desert",
        "Land_Day_Desert_Coast",
        "Ocean_Day",
        "Ocean_Night",
        "Polar_Day_Land",
        "Polar_Day_Coast",
        "Polar_Day_Desert",
        "Polar_Day_Desert_Coast",
        "Polar_Day_Ocean",
        "Polar_Night_Ocean",
    ]:
        SceneType = tst.CloudTests(data=data, scene_name=scene_name, thresholds=thresholds)

        cmin, bit = SceneType.oceanic_stratus_11_4um_test("M15-M12", cmin)

    assert np.allclose(cmin, ref_confidence.oceanic_stratus_11_4um_confidence.values)


def test_nir_reflectance_test(data, thresholds, ref_confidence):
    """Test nir_reflectance_test function."""
    cmin = np.ones(data.latitude.shape)
    for scene_name in ["Ocean_Day", "Polar_Day_Ocean"]:
        SceneType = tst.CloudTests(data=data, scene_name=scene_name, thresholds=thresholds)

        cmin, bit = SceneType.nir_reflectance_test("M07", cmin)

    assert np.allclose(cmin, ref_confidence.NIR_reflectance_confidence.values)


def test_vis_nir_ratio_test(data, thresholds, ref_confidence):
    """Test vis_nir_ratio_test function."""
    cmin = np.ones(data.latitude.shape)
    for scene_name in ["Ocean_Day", "Polar_Day_Ocean"]:
        SceneType = tst.CloudTests(data=data, scene_name=scene_name, thresholds=thresholds)

        cmin, bit = SceneType.vis_nir_ratio_test("M07-M05ratio", cmin)

    assert np.allclose(cmin, ref_confidence.Vis_NIR_ratio_confidence.values)


def test_16_21um_reflectance_test(data, thresholds, ref_confidence):
    """Test 16_21um_reflectance_test function."""
    cmin = np.ones(data.latitude.shape)
    for scene_name in ["Ocean_Day", "Polar_Day_Ocean"]:
        SceneType = tst.CloudTests(data=data, scene_name=scene_name, thresholds=thresholds)

        cmin, bit = SceneType.test_16_21um_reflectance("M10", cmin)

    assert np.allclose(cmin, ref_confidence.refl_16_21um_confidence.values)


def test_visible_reflectance_test(data, thresholds, ref_confidence):
    """Test visible_reflectance_test function."""
    cmin = np.ones(data.latitude.shape)
    for scene_name in [
        "Land_Day",
        "Land_Day_Coast",
        "Land_Day_Desert",
        "Land_Day_Desert_Coast",
        "Polar_Day_Land",
        "Polar_Day_Coast",
        "Polar_Day_Desert",
        "Polar_Day_Desert_Coast",
    ]:
        SceneType = tst.CloudTests(data=data, scene_name=scene_name, thresholds=thresholds)

        cmin, bit = SceneType.visible_reflectance_test("M128", cmin)

    assert np.allclose(cmin, ref_confidence.vis_reflectance_confidence.values)


def test_GEMI_test(data, thresholds, ref_confidence):
    """Test GEMI_test function."""
    cmin = np.ones(data.latitude.shape)
    for scene_name in ["Land_Day_Desert", "Polar_Day_Desert"]:
        SceneType = tst.CloudTests(data=data, scene_name=scene_name, thresholds=thresholds)

        cmin, bit = SceneType.gemi_test("GEMI", cmin)

    assert np.allclose(cmin, ref_confidence.gemi_confidence.values)


def test_1_38um_high_clouds_test(data, thresholds, ref_confidence):
    """Test 1_38um_high_clouds_test function."""
    cmin = np.ones(data.latitude.shape)
    for scene_name in [
        "Land_Day",
        "Land_Day_Coast",
        "Land_Day_Desert",
        "Land_Day_Desert_Coast",
        "Polar_Day_Land",
        "Polar_Day_Coast",
        "Polar_Day_Desert",
        "Polar_Day_Desert_Coast",
        "Day_Snow",
        "Ocean_Day",
        "Polar_Day_Ocean",
    ]:
        SceneType = tst.CloudTests(data=data, scene_name=scene_name, thresholds=thresholds)

        cmin, bit = SceneType.test_1_38um_high_clouds("M09", cmin)

    assert np.allclose(cmin, ref_confidence.hi_clouds_confidence.values)


def test_4_12um_thin_cirrus_btd(data, thresholds, ref_confidence):
    """Test 4_12um_thin_cirrus_btd function."""
    cmin = np.ones(data.latitude.shape)
    for scene_name in [
        "Land_Night",
        "Polar_Night_Land",
        "Polar_Night_Snow",
        "Night_Snow",
    ]:
        SceneType = tst.CloudTests(data=data, scene_name=scene_name, thresholds=thresholds)

        cmin, bit = SceneType.thin_cirrus_4_12um_BTD_test("M13-M16", cmin)

    assert np.allclose(cmin, ref_confidence.thin_cirrus_confidence.values)