diff --git a/src/fmu/dataio/providers/objectdata/_faultroom.py b/src/fmu/dataio/providers/objectdata/_faultroom.py index 5d9381383..36085b588 100644 --- a/src/fmu/dataio/providers/objectdata/_faultroom.py +++ b/src/fmu/dataio/providers/objectdata/_faultroom.py @@ -7,8 +7,11 @@ from fmu.dataio._logging import null_logger from fmu.dataio._model.data import BoundingBox3D from fmu.dataio._model.enums import FMUClass, Layout +from fmu.dataio._model.global_configuration import ( + GlobalConfiguration, +) from fmu.dataio._model.specification import FaultRoomSurfaceSpecification -from fmu.dataio.readers import FaultRoomSurface +from fmu.dataio.providers.objectdata._utils import Utils from ._base import ( ObjectDataProvider, @@ -66,11 +69,31 @@ def get_bbox(self) -> BoundingBox3D: def get_spec(self) -> FaultRoomSurfaceSpecification: """Derive data.spec for FaultRoomSurface""" logger.info("Get spec for FaultRoomSurface") + + # Juxtapositions are already ordered according to the strat. column + # in global config + + juxtaposition_hw = [] + juxtaposition_fw = [] + if isinstance(self.dataio.config, GlobalConfiguration) and ( + strat := self.dataio.config.stratigraphy + ): + # Use the name in the juxtaposition list if it doesn't exist + # in the strat. column + juxtaposition_hw = [ + Utils.get_stratigraphic_name(strat, juxt) or juxt + for juxt in self.obj.juxtaposition_hw + ] + juxtaposition_fw = [ + Utils.get_stratigraphic_name(strat, juxt) or juxt + for juxt in self.obj.juxtaposition_fw + ] + return FaultRoomSurfaceSpecification( horizons=self.obj.horizons, faults=self.obj.faults, - juxtaposition_hw=self.obj.juxtaposition_hw, - juxtaposition_fw=self.obj.juxtaposition_fw, + juxtaposition_hw=juxtaposition_hw, + juxtaposition_fw=juxtaposition_fw, properties=self.obj.properties, name=self.obj.name, ) diff --git a/src/fmu/dataio/providers/objectdata/_utils.py b/src/fmu/dataio/providers/objectdata/_utils.py new file mode 100644 index 000000000..6a51a7061 --- /dev/null +++ b/src/fmu/dataio/providers/objectdata/_utils.py @@ -0,0 +1,22 @@ +from __future__ import annotations + +import warnings + +from fmu.dataio._model.global_configuration import Stratigraphy + + +class Utils: + @staticmethod + def get_stratigraphic_name(stratigraphy: Stratigraphy, name: str) -> str: + """ + Get the name of a stratigraphic element from the stratigraphy. + name: name of stratigraphic element + """ + if name in stratigraphy: + return stratigraphy[name].name + + warnings.warn( + f"Stratigraphic element '{name}' not found in the stratigraphic column " + "in global config" + ) + return "" diff --git a/tests/conftest.py b/tests/conftest.py index 978942523..6b83890b2 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -5,6 +5,7 @@ import logging import os import shutil +from copy import deepcopy from pathlib import Path import numpy as np @@ -18,6 +19,7 @@ from fmu.dataio._model import Root, fields, global_configuration from fmu.dataio.dataio import ExportData, read_metadata from fmu.dataio.providers._fmu import FmuEnv +from fmu.dataio.readers import FaultRoomSurface from .utils import _get_nested_pydantic_models, _metadata_examples @@ -460,6 +462,35 @@ def fixture_regsurf(): return xtgeo.RegularSurface(ncol=12, nrow=10, xinc=20, yinc=20, values=1234.0) +@pytest.fixture(name="faultroom_object", scope="module") +def fixture_faultroom_object(globalconfig2): + """Create a faultroom object.""" + logger.debug("Ran %s", _current_function_name()) + cfg = deepcopy(globalconfig2) + + horizons = cfg["rms"]["horizons"]["TOP_RES"] + faults = ["F1", "F2", "F3", "F4", "F5", "F6"] + juxtaposition_hw = cfg["rms"]["zones"]["ZONE_RES"] + juxtaposition_fw = cfg["rms"]["zones"]["ZONE_RES"] + juxtaposition = {"fw": juxtaposition_fw, "hw": juxtaposition_hw} + properties = [ + "Juxtaposition", + ] + coordinates = [[[1.1, 1.2, 1.3], [2.1, 2.2, 2.3]]] + features = [{"geometry": {"coordinates": coordinates}}] + name = cfg["access"]["asset"]["name"] + + faultroom_data = { + "horizons": horizons, + "faults": {"default": faults}, + "juxtaposition": juxtaposition, + "properties": properties, + "name": name, + } + + return FaultRoomSurface({"metadata": faultroom_data, "features": features}) + + @pytest.fixture(name="polygons", scope="module") def fixture_polygons(): """Create an xtgeo polygons.""" diff --git a/tests/test_units/test_checksum_md5.py b/tests/test_units/test_checksum_md5.py index f06fdf27c..ee0831705 100644 --- a/tests/test_units/test_checksum_md5.py +++ b/tests/test_units/test_checksum_md5.py @@ -180,7 +180,7 @@ def test_checksum_md5_for_dictionary(monkeypatch, tmp_path, globalconfig1): assert meta["file"]["checksum_md5"] == md5sum(export_path) -def test_checksum_md5_for_faultroom(monkeypatch, tmp_path, globalconfig1, rootpath): +def test_checksum_md5_for_faultroom(monkeypatch, tmp_path, globalconfig2, rootpath): """ Test that the MD5 hash in the metadata is equal to one computed for the exported file for a FaultRoomSurface @@ -194,7 +194,7 @@ def test_checksum_md5_for_faultroom(monkeypatch, tmp_path, globalconfig1, rootpa export_path = Path( ExportData( - config=globalconfig1, + config=globalconfig2, content="depth", name="myname", ).export(fault_room_surface) diff --git a/tests/test_units/test_objectdataprovider_class.py b/tests/test_units/test_objectdataprovider_class.py index cbfd5a1a9..a02a21994 100644 --- a/tests/test_units/test_objectdataprovider_class.py +++ b/tests/test_units/test_objectdataprovider_class.py @@ -8,6 +8,8 @@ import fmu.dataio as dataio from fmu.dataio._definitions import ConfigurationError, ValidFormats +from fmu.dataio._model.specification import FaultRoomSurfaceSpecification +from fmu.dataio.providers.objectdata._faultroom import FaultRoomSurfaceProvider from fmu.dataio.providers.objectdata._provider import ( objectdata_provider_factory, ) @@ -23,7 +25,7 @@ def test_objectdata_regularsurface_derive_named_stratigraphy(regsurf, edataobj1): """Get name and some stratigaphic keys for a valid RegularSurface object .""" - # mimic the stripped parts of configuations for testing here + # mimic the stripped parts of configurations for testing here objdata = objectdata_provider_factory(regsurf, edataobj1) res = objdata._get_stratigraphy_element() @@ -35,7 +37,7 @@ def test_objectdata_regularsurface_derive_named_stratigraphy(regsurf, edataobj1) def test_objectdata_regularsurface_get_stratigraphy_element_differ(regsurf, edataobj2): """Get name and some stratigaphic keys for a valid RegularSurface object .""" - # mimic the stripped parts of configuations for testing here + # mimic the stripped parts of configurations for testing here objdata = objectdata_provider_factory(regsurf, edataobj2) res = objdata._get_stratigraphy_element() @@ -45,6 +47,24 @@ def test_objectdata_regularsurface_get_stratigraphy_element_differ(regsurf, edat assert res.stratigraphic is True +def test_objectdata_faultroom_fault_juxtaposition_get_stratigraphy_differ( + faultroom_object, edataobj2 +): + """ + Fault juxtaposition is a list of formations on the footwall and hangingwall sides. + Ensure that each name is converted to the names given in the stratigraphic column + in the global config. + """ + objdata = objectdata_provider_factory(faultroom_object, edataobj2) + assert isinstance(objdata, FaultRoomSurfaceProvider) + + frss = objdata.get_spec() + assert isinstance(frss, FaultRoomSurfaceSpecification) + + assert frss.juxtaposition_fw == ["Valysar Fm.", "Therys Fm.", "Volon Fm."] + assert frss.juxtaposition_hw == ["Valysar Fm.", "Therys Fm.", "Volon Fm."] + + def test_objectdata_regularsurface_validate_extension(regsurf, edataobj1): """Test a valid extension for RegularSurface object.""" diff --git a/tests/test_units/test_providers_utils_class.py b/tests/test_units/test_providers_utils_class.py new file mode 100644 index 000000000..2dc66c94a --- /dev/null +++ b/tests/test_units/test_providers_utils_class.py @@ -0,0 +1,22 @@ +import pytest + +from fmu.dataio.providers.objectdata._utils import Utils + + +def test_stratigraphy(edataobj2): + """Test the stratigraphy.""" + + strat = edataobj2.config.stratigraphy + + ###### Test get stratigraphic name ###### + + # Correct name + assert Utils.get_stratigraphic_name(strat, "Valysar") == "Valysar Fm." + + # Incorrect name + with pytest.warns(UserWarning, match="not found in the stratigraphic column"): + assert Utils.get_stratigraphic_name(strat, "Ile") == "" + + # Empty name + with pytest.warns(UserWarning, match="not found in the stratigraphic column"): + assert Utils.get_stratigraphic_name(strat, "") == ""