# Author: LKouadio <etanoyau@gmail.com>
# License: LGPL-3.0
"""pycsamt.interp — geophysical-geological interpretation for EM methods.
This package converts 2-D EM resistivity models (from any inversion code
— Occam2D, ModEM, AI-based, or generic arrays) into geological
deliverables: pseudo-stratigraphic logs, borehole-calibrated models, and
industry-standard exports.
It supersedes the ``geodrill`` module from pyCSAMT v1, extending its
scope beyond OCCAM2D and CSAMT to cover MT, AMT, CSAMT, and CSEM.
Quickstart
----------
>>> from pycsamt.interp import ResistivityModel, ModelCalibrator
>>> from pycsamt.interp import export, plot as iplot
>>>
>>> # Adapt any inversion result
>>> model = ResistivityModel.from_occam2d(result) # doctest: +SKIP
>>>
>>> # Optional: calibrate with borehole data
>>> from pycsamt.interp import Borehole
>>> bh = Borehole.from_csv("boreholes/Bo.csv", x=1050.0) # doctest: +SKIP
>>> cal = ModelCalibrator(ptol=0.10).fit(model, [bh]) # doctest: +SKIP
>>>
>>> # Build stratigraphic logs
>>> logs = cal.stratigraphic_logs() # doctest: +SKIP
>>>
>>> # Export
>>> export.to_oasis_montaj_xyz(logs, "profile.xyz") # doctest: +SKIP
>>> export.to_las(logs[0], "S17.las") # doctest: +SKIP
>>> export.to_csv(logs, "all_stations.csv") # doctest: +SKIP
>>>
>>> # Plot
>>> fig = iplot.PlotStratigraphicLog(logs[0]).plot() # doctest: +SKIP
>>> fig = iplot.PlotFenceDiagram(logs).plot() # doctest: +SKIP
>>> fig = iplot.PlotCalibratedModel(model, cal.calibrated_model(),
... cal.misfit_map()).plot() # doctest: +SKIP
Package layout
--------------
``_base``
:class:`ResistivityModel` — unified model container; adapters for
Occam2D, ModEM, AI outputs, and raw numpy arrays.
``borehole``
:class:`Borehole`, :class:`Interval` — ground-truth depth-interval
data; readers for CSV and LAS 2.0.
``calibrate``
:class:`ModelCalibrator` — generalised NM construction (Kouadio
et al. 2022), borehole-constrained or database-only.
``lithology``
:class:`RockDatabase`, :class:`StratigraphicLog`, :class:`Layer` —
resistivity-to-lithology classification; built-in 25-rock EM
database.
``export``
:func:`~export.to_oasis_montaj_xyz`,
:func:`~export.to_las`,
:func:`~export.to_csv`,
:func:`~export.to_vtk` — industry-format writers.
``plot``
:class:`~plot.PlotStratigraphicLog`,
:class:`~plot.PlotFenceDiagram`,
:class:`~plot.PlotCalibratedModel` — matplotlib-based visuals.
References
----------
.. [1] Kouadio, K.L. et al. (2022). pyCSAMT: An alternative Python
toolbox for groundwater exploration using controlled source
audio-frequency magnetotelluric. *Journal of Applied Geophysics*,
201, 104647. https://doi.org/10.1016/j.jappgeo.2022.104647
"""
from . import export, plot
from ._base import ResistivityModel
from .borehole import Borehole, Interval
from .calibrate import ModelCalibrator
from .constraints import (
ConstrainedCalibrator,
ECConstraint,
PumpingTestConstraint,
SlugTestConstraint,
WaterLevelConstraint,
)
from .fusion import FusionDiagnostics, MultiMethodEMModel
from .hydro import (
AquiferZone,
HydroGeophysicalModel,
HydroInterpreter,
HydroUnit,
)
from .hydromodel import (
EMHydroModel,
EMHydroResult,
PetrophysicalConfig,
)
from .lithology import (
Layer,
RockDatabase,
RockEntry,
StratigraphicLog,
)
from .timelapse import TimeLapseEM, assert_compatible_grids
from .uncertainty import (
MonteCarloHydro,
UncertaintyBounds,
UncertaintyResult,
)
__all__ = [
# core model
"ResistivityModel",
# borehole
"Borehole",
"Interval",
# calibration (geological)
"ModelCalibrator",
# qualitative hydrogeology
"AquiferZone",
"HydroGeophysicalModel",
"HydroInterpreter",
"HydroUnit",
# quantitative hydro-geophysics
"PetrophysicalConfig",
"EMHydroModel",
"EMHydroResult",
# field-measurement constraints
"ConstrainedCalibrator",
"WaterLevelConstraint",
"PumpingTestConstraint",
"SlugTestConstraint",
"ECConstraint",
# time-lapse monitoring
"TimeLapseEM",
"assert_compatible_grids",
# multi-method fusion
"MultiMethodEMModel",
"FusionDiagnostics",
# uncertainty quantification
"UncertaintyBounds",
"UncertaintyResult",
"MonteCarloHydro",
# lithology
"RockDatabase",
"RockEntry",
"Layer",
"StratigraphicLog",
# sub-modules
"export",
"plot",
]