From af249aa2ff08456699ab3117337bb6bf066cb9f7 Mon Sep 17 00:00:00 2001 From: benjamink Date: Wed, 3 Dec 2025 14:38:13 -0800 Subject: [PATCH 1/2] Change base classes to .base Driver and Options --- grid_apps/block_model_to_octree/driver.py | 15 ++++++++++-- grid_apps/block_model_to_octree/options.py | 4 ++-- grid_apps/block_models/driver.py | 27 +++++++++++----------- grid_apps/block_models/options.py | 4 ++-- grid_apps/octree_creation/driver.py | 21 +++++++++++++---- grid_apps/octree_creation/options.py | 4 ++-- 6 files changed, 49 insertions(+), 26 deletions(-) diff --git a/grid_apps/block_model_to_octree/driver.py b/grid_apps/block_model_to_octree/driver.py index eb05bee..99a5386 100644 --- a/grid_apps/block_model_to_octree/driver.py +++ b/grid_apps/block_model_to_octree/driver.py @@ -15,13 +15,13 @@ import numpy as np from discretize import TreeMesh +from geoapps_utils.base import Driver as BaseDriver from geoh5py.data import FloatData, ReferencedData from geoh5py.objects import BlockModel, Octree from geoh5py.ui_json.utils import fetch_active_workspace from scipy.spatial import cKDTree from grid_apps.block_model_to_octree.options import BlockModel2OctreeOptions -from grid_apps.driver import BaseGridDriver from grid_apps.utils import ( block_model_to_discretize, boundary_value_indices, @@ -33,13 +33,24 @@ logger = logging.getLogger(__name__) -class Driver(BaseGridDriver): +class Driver(BaseDriver): """ Convert a BlockModel object to Octree with various refinement strategies. """ _params_class = BlockModel2OctreeOptions + def run(self): + """Create an octree mesh from input values.""" + with fetch_active_workspace(self.params.geoh5, mode="r+"): + logger.info("Converting BlockModel to Octree mesh . . .") + octree = self.make_grid() + output = self.params.out_group or octree + self.update_monitoring_directory(output) + logger.info("Done.") + + return octree + @staticmethod def block_model_to_treemesh( entity: BlockModel, diagonal_balance=True, finalize=True diff --git a/grid_apps/block_model_to_octree/options.py b/grid_apps/block_model_to_octree/options.py index f38c534..3e4fe3d 100644 --- a/grid_apps/block_model_to_octree/options.py +++ b/grid_apps/block_model_to_octree/options.py @@ -12,7 +12,7 @@ from pathlib import Path from typing import ClassVar -from geoapps_utils.driver.data import BaseData +from geoapps_utils.base import Options from geoh5py.data import FloatData, ReferencedData from geoh5py.groups import UIJsonGroup from geoh5py.objects import BlockModel @@ -35,7 +35,7 @@ class OutputOptions(BaseModel): out_group: UIJsonGroup | None = None -class BlockModel2OctreeOptions(BaseData): +class BlockModel2OctreeOptions(Options): """ Block model parameters for use with `block_models.driver`. diff --git a/grid_apps/block_models/driver.py b/grid_apps/block_models/driver.py index 66f51f2..8153d97 100644 --- a/grid_apps/block_models/driver.py +++ b/grid_apps/block_models/driver.py @@ -15,20 +15,19 @@ import numpy as np from discretize.utils import mesh_utils -from geoapps_utils.driver.data import BaseData +from geoapps_utils.base import Driver as BaseDriver from geoh5py.objects import BlockModel from geoh5py.shared.utils import fetch_active_workspace from geoh5py.workspace import Workspace from scipy.spatial import cKDTree from grid_apps.block_models.options import BlockModelOptions -from grid_apps.driver import BaseGridDriver logger = logging.getLogger(__name__) -class Driver(BaseGridDriver): +class Driver(BaseDriver): """ Create BlockModel from parameters. @@ -37,6 +36,17 @@ class Driver(BaseGridDriver): _params_class = BlockModelOptions + def run(self): + """Create an octree mesh from input values.""" + with fetch_active_workspace(self.params.geoh5, mode="r+"): + logger.info("Creating BlockModel mesh from parameters . . .") + block = self.make_grid() + output = self.params.out_group or block + self.update_monitoring_directory(output) + logger.info("Done.") + + return block + def make_grid(self): """ Make block model object from input data. @@ -190,17 +200,6 @@ def get_block_model( # pylint: disable=too-many-arguments, too-many-positional- return object_out - @property - def params(self) -> BaseData: - """Application parameters.""" - return self._params - - @params.setter - def params(self, val: BaseData): - if not isinstance(val, BaseData): - raise TypeError("Parameters must be a BaseData subclass.") - self._params = val - if __name__ == "__main__": file = Path(sys.argv[1]).resolve() diff --git a/grid_apps/block_models/options.py b/grid_apps/block_models/options.py index 61cbe6a..0a0ccc5 100644 --- a/grid_apps/block_models/options.py +++ b/grid_apps/block_models/options.py @@ -12,7 +12,7 @@ from pathlib import Path from typing import ClassVar -from geoapps_utils.driver.data import BaseData +from geoapps_utils.base import Options from geoh5py.groups import UIJsonGroup from geoh5py.objects import CellObject, Points from geoh5py.objects.grid_object import GridObject @@ -84,7 +84,7 @@ class BlockModelOutputOptions(BaseModel): out_group: UIJsonGroup | None = None -class BlockModelOptions(BaseData): +class BlockModelOptions(Options): """ Block model parameters for use with `block_models.driver`. diff --git a/grid_apps/octree_creation/driver.py b/grid_apps/octree_creation/driver.py index 55e52e8..99119a3 100644 --- a/grid_apps/octree_creation/driver.py +++ b/grid_apps/octree_creation/driver.py @@ -16,7 +16,7 @@ import numpy as np from discretize import TreeMesh from discretize.utils import mesh_builder_xyz -from geoapps_utils.driver.driver import BaseDriver +from geoapps_utils.base import Driver as BaseDriver from geoapps_utils.utils.locations import get_locations from geoh5py.objects import Curve, ObjectBase, Octree, Points, Surface from geoh5py.objects.surveys.direct_current import BaseElectrode @@ -46,14 +46,21 @@ def run(self) -> Octree: with fetch_active_workspace(self.params.geoh5, mode="r+"): logger.info("Creating octree mesh from params . . .") octree = self.octree_from_params(self.params) - self.update_monitoring_directory(octree) + output = self.params.out_group or octree + self.update_monitoring_directory(output) logger.info("Done.") return octree @staticmethod def octree_from_params(params: OctreeOptions) -> Octree: - """Create an Octree object from input parameters.""" + """ + Create an Octree object from input parameters. + + :param params: OctreeOptions containing the parameters for octree creation. + + :return: Octree object. + """ treemesh = OctreeDriver.treemesh_from_params(params) octree = treemesh_2_octree( params.geoh5, treemesh, name=params.ga_group_name, parent=params.out_group @@ -62,7 +69,13 @@ def octree_from_params(params: OctreeOptions) -> Octree: @staticmethod def treemesh_from_params(params: OctreeOptions) -> TreeMesh: - """Create a TreeMesh object from input parameters.""" + """ + Create a TreeMesh object from input parameters. + + :param params: OctreeOptions containing the parameters for mesh creation. + + :return: TreeMesh object. + """ logger.info("Setting the mesh extent . . .") mesh = OctreeDriver.base_treemesh(params) diff --git a/grid_apps/octree_creation/options.py b/grid_apps/octree_creation/options.py index 3b5a008..d4c5e3b 100644 --- a/grid_apps/octree_creation/options.py +++ b/grid_apps/octree_creation/options.py @@ -14,7 +14,7 @@ from typing import Any, ClassVar import numpy as np -from geoapps_utils.driver.data import BaseData +from geoapps_utils.base import Options from geoh5py.groups import UIJsonGroup from geoh5py.objects import Points from pydantic import ( @@ -29,7 +29,7 @@ from grid_apps import assets_path -class OctreeOptions(BaseData): +class OctreeOptions(Options): """ Octree creation parameters. From b196726555e551644614c4c263042d56034cb1f9 Mon Sep 17 00:00:00 2001 From: benjamink Date: Thu, 4 Dec 2025 11:44:12 -0800 Subject: [PATCH 2/2] REmove unused base class --- grid_apps/driver.py | 91 --------------------------------------------- 1 file changed, 91 deletions(-) delete mode 100644 grid_apps/driver.py diff --git a/grid_apps/driver.py b/grid_apps/driver.py deleted file mode 100644 index 543ef25..0000000 --- a/grid_apps/driver.py +++ /dev/null @@ -1,91 +0,0 @@ -# ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -# Copyright (c) 2024-2025 Mira Geoscience Ltd. ' -# ' -# This file is part of grid-apps package. ' -# ' -# grid-apps is distributed under the terms and conditions of the MIT License ' -# (see LICENSE file at the root of this source code package). ' -# ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' - -from __future__ import annotations - -import logging -import sys -import tempfile -from abc import abstractmethod -from pathlib import Path - -from geoapps_utils.driver.data import BaseData -from geoapps_utils.driver.driver import BaseDriver -from geoh5py.groups import UIJsonGroup -from geoh5py.objects import BlockModel, ObjectBase -from geoh5py.shared.utils import fetch_active_workspace - - -logger = logging.getLogger(__name__) - - -class BaseGridDriver(BaseDriver): - """ - Driver for the block model application. - - :param parameters: Application parameters. - """ - - _params_class: type[BaseData] - - def store(self, block_model: BlockModel): - """ - Update container group and monitoring directory. - - :param surface: Surface to store. - """ - with fetch_active_workspace(self.workspace, mode="r+") as workspace: - self.update_monitoring_directory( - block_model if self.out_group is None else self.out_group - ) - logger.info( - "Curve object '%s' saved to '%s'.", - self.params.output.export_as, - str(workspace.h5file), - ) - - @abstractmethod - def make_grid(self): - pass - - def run(self): - """Run the surface application driver.""" - logging.info("Begin Process ...") - block_model = self.make_grid() - logging.info("Process Complete.") - self.store(block_model) - - @property - def params(self) -> BaseData: - """Application parameters.""" - return self._params - - @params.setter - def params(self, val: BaseData): - if not isinstance(val, BaseData): - raise TypeError("Parameters must be a BaseData subclass.") - self._params = val - - def add_ui_json(self, entity: ObjectBase | UIJsonGroup) -> None: - """ - Add ui.json file to entity. - - :param entity: Object to add ui.json file to. - """ - - with tempfile.TemporaryDirectory() as temp_dir: - filepath = Path(temp_dir) / f"{self.params.name}.ui.json" - self.params.write_ui_json(filepath) - - entity.add_file(str(filepath)) - - -if __name__ == "__main__": - file = Path(sys.argv[1]).resolve() - BaseGridDriver.start(file)