Skip to content

Commit

Permalink
Add stratigraphic feature
Browse files Browse the repository at this point in the history
  • Loading branch information
HansKallekleiv committed Sep 12, 2023
1 parent 015b5a9 commit 2b5171d
Show file tree
Hide file tree
Showing 6 changed files with 33 additions and 26 deletions.
13 changes: 7 additions & 6 deletions backend/src/backend/primary/routers/surface/converters.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import orjson
import xtgeo
from src.services.sumo_access.surface_types import SurfaceMeta as SumoSurfaceMeta
from src.services.smda_access.types import StratigraphicUnit
from src.services.smda_access.types import StratigraphicSurface
from src.services.utils.surface_to_float32 import surface_to_float32_array
from . import schemas

Expand Down Expand Up @@ -46,7 +46,7 @@ def to_api_surface_data(xtgeo_surf: xtgeo.RegularSurface) -> schemas.SurfaceData


def to_api_surface_directory(
sumo_surface_dir: List[SumoSurfaceMeta], straigraphic_names: List[str]
sumo_surface_dir: List[SumoSurfaceMeta], stratigraphical_names: List[StratigraphicSurface]
) -> List[schemas.SurfaceMeta]:
"""
Convert Sumo surface directory to API surface directory
Expand All @@ -55,7 +55,7 @@ def to_api_surface_directory(
for sumo_meta in sumo_surface_dir:
surface_metas.append(_sumo_surface_meta_to_api(sumo_meta))

surface_metas = _sort_by_stratigraphical_order(surface_metas, straigraphic_names)
surface_metas = _sort_by_stratigraphical_order(surface_metas, stratigraphical_names)
return surface_metas


Expand All @@ -73,18 +73,19 @@ def _sumo_surface_meta_to_api(sumo_meta: SumoSurfaceMeta) -> schemas.SurfaceMeta


def _sort_by_stratigraphical_order(
surface_metas: List[schemas.SurfaceMeta], stratigraphic_names: List[str]
surface_metas: List[schemas.SurfaceMeta], stratigraphic_surfaces: List[StratigraphicSurface]
) -> List[schemas.SurfaceMeta]:
"""Sort the surface meta list by the order they appear in the stratigraphic column.
Non-stratigraphical surfaces are appended at the end of the list."""

surface_metas_with_official_strat_name = []
surface_metas_with_custom_names = []

for strat_name in stratigraphic_names:
for strat_surface in stratigraphic_surfaces:
for surface_meta in surface_metas:
if surface_meta.stratigraphic_name == strat_name:
if surface_meta.stratigraphic_name == strat_surface.name:
surface_meta.stratigraphic_name_is_official = True
surface_meta.stratigraphic_feature = strat_surface.feature
surface_metas_with_official_strat_name.append(surface_meta)

# Append non-official strat names
Expand Down
2 changes: 1 addition & 1 deletion backend/src/backend/primary/routers/surface/router.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ def get_surface_directory(
else:
strat_access = StratigraphyAccess(authenticated_user.get_smda_access_token())

stratigraphic_names = strat_access.get_stratigraphic_names(strat_column_identifier)
stratigraphic_names = strat_access.get_stratigraphic_surfaces(strat_column_identifier)

return converters.to_api_surface_directory(sumo_surf_dir, stratigraphic_names)

Expand Down
12 changes: 2 additions & 10 deletions backend/src/backend/primary/routers/surface/schemas.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from enum import Enum
from typing import Optional

from src.services.smda_access.types import StratigraphicFeature
from pydantic import BaseModel


Expand Down Expand Up @@ -35,18 +35,10 @@ class SurfaceAttributeType(str, Enum):
FLUID_CONTACT = "fluid_contact" # Values are fluid contacts (oil-water, gas-water, etc.)


class StratigraphicPosition(str, Enum):
"""The stratigraphic type of a surface"""

UNIT = "unit"
TOP = "top"
BASE = "base"


class SurfaceMeta(BaseModel):
stratigraphic_name: str
stratigraphic_name_is_official: bool
stratigraphic_position: Optional[StratigraphicPosition]
stratigraphic_feature: Optional[StratigraphicFeature]
attribute_name: str
attribute_type: SurfaceAttributeType
iso_date_or_interval: Optional[str]
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from typing import List


from ..types import StratigraphicUnit
from ..types import StratigraphicUnit, StratigraphicSurface
from ..stratigraphy_access import sort_stratigraphic_names_by_hierarchy, sort_stratigraphic_units_by_hierarchy

STRAT_UNITS = [
Expand Down Expand Up @@ -63,6 +63,5 @@ def get_stratigraphic_units(self, stratigraphic_column_identifier: str) -> List[

# type: ignore
# pylint: disable=unused-argument
def get_stratigraphic_names(self, stratigraphic_column_identifier: str) -> List[StratigraphicUnit]:
print(sort_stratigraphic_names_by_hierarchy(STRAT_UNITS))
def get_stratigraphic_surfaces(self, stratigraphic_column_identifier: str) -> List[StratigraphicSurface]:
return sort_stratigraphic_names_by_hierarchy(STRAT_UNITS)
14 changes: 8 additions & 6 deletions backend/src/services/smda_access/stratigraphy_access.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from typing import List, Dict

from .queries.get_stratigraphic_units import get_stratigraphic_units
from .types import StratigraphicUnit
from .types import StratigraphicUnit, StratigraphicSurface, StratigraphicFeature


class StratigraphyAccess:
Expand All @@ -15,7 +15,7 @@ def get_stratigraphic_units(self, stratigraphic_column_identifier: str) -> List[
sorted_units = sort_stratigraphic_units_by_hierarchy(stratigraphic_units)
return sorted_units

def get_stratigraphic_names(self, stratigraphic_column_identifier: str) -> List[str]:
def get_stratigraphic_surfaces(self, stratigraphic_column_identifier: str) -> List[StratigraphicSurface]:
"""Get a flatten list of top/unit/base surface names in lithostratigraphical order"""
stratigraphic_units = get_stratigraphic_units(self._smda_token, stratigraphic_column_identifier)

Expand Down Expand Up @@ -50,18 +50,20 @@ def flatten_hierarchical_structure(units: List[StratigraphicUnit], unit_by_id: D
return flattened_list


def flatten_hierarchical_structure_to_surface_name(units: List[StratigraphicUnit], unit_by_id: Dict) -> List[str]:
def flatten_hierarchical_structure_to_surface_name(
units: List[StratigraphicUnit], unit_by_id: Dict
) -> List[StratigraphicSurface]:
"""Flatten the hierarchical structure into a single list of stratigraphical top/unit/base names, preserving the order."""
flattened_list = []

for unit in units:
flattened_list.append(unit.top)
flattened_list.append(unit.identifier)
flattened_list.append(StratigraphicSurface(name=unit.top, feature=StratigraphicFeature.HORIZON))
flattened_list.append(StratigraphicSurface(name=unit.identifier, feature=StratigraphicFeature.ZONE))
if unit.identifier in unit_by_id:
flattened_list.extend(
flatten_hierarchical_structure_to_surface_name(unit_by_id[unit.identifier]["children"], unit_by_id)
)
flattened_list.append(unit.base)
flattened_list.append(StratigraphicSurface(name=unit.base, feature=StratigraphicFeature.HORIZON))
return flattened_list


Expand Down
13 changes: 13 additions & 0 deletions backend/src/services/smda_access/types.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from enum import Enum
from typing import List, Optional
from pydantic import BaseModel

Expand Down Expand Up @@ -46,3 +47,15 @@ class StratigraphicUnit(BaseModel):
color_r: int
color_g: int
color_b: int


class StratigraphicFeature(str, Enum):
"""The stratigraphic feature of a surface"""

ZONE = "unit"
HORIZON = "horizon"


class StratigraphicSurface(BaseModel):
name: str
feature: StratigraphicFeature

0 comments on commit 2b5171d

Please sign in to comment.