Source code for eradiate.radprops._absorption

from __future__ import annotations

import logging
from typing import Literal

from axsdb import (
    AbsorptionDatabase,
    AbsorptionDatabaseFactory,
    CKDAbsorptionDatabase,
    ErrorHandlingConfiguration,
    MonoAbsorptionDatabase,
)

import eradiate

from .._mode import Mode
from ..data import fresolver
from ..exceptions import UnsupportedModeError

logger = logging.getLogger(__name__)


def get_error_handling_config():
    from ..config import settings

    return ErrorHandlingConfiguration.convert(
        settings.get("ABSORPTION_DATABASE.ERROR_HANDLING")
    )


KNOWN_DATABASES = {
    "gecko": {
        "cls": MonoAbsorptionDatabase,
        "path": "absorption_mono/gecko",
        "kwargs": {"lazy": True},
    },
    "komodo": {
        "cls": MonoAbsorptionDatabase,
        "path": "absorption_mono/komodo",
        "kwargs": {"lazy": True},
    },
    "monotropa": {
        "cls": CKDAbsorptionDatabase,
        "path": "absorption_ckd/monotropa",
    },
    "mycena": {
        "cls": CKDAbsorptionDatabase,
        "path": "absorption_ckd/mycena",
    },
    "panellus": {
        "cls": CKDAbsorptionDatabase,
        "path": "absorption_ckd/panellus",
    },
    "tuber": {
        "cls": CKDAbsorptionDatabase,
        "path": "absorption_ckd/tuber",
    },
}

DEFAULT_DATABASES = {"mono": "komodo", "ckd": "monotropa"}


def _init_absdb_factory(
    error_handling_config: ErrorHandlingConfiguration | None = None,
) -> AbsorptionDatabaseFactory:
    """
    Initialize ``absdb_factory`` according to configuration defaults.
    """
    absdb_factory = AbsorptionDatabaseFactory()
    error_handling_config = error_handling_config or get_error_handling_config()

    for k, v in KNOWN_DATABASES.items():

        def resolve_path(path=str(v["path"])):
            return fresolver.resolve(path)

        kwargs = {"error_handling_config": error_handling_config}
        if "kwargs" in v:
            kwargs.update(v["kwargs"])

        absdb_factory.register(name=k, cls=v["cls"], path=resolve_path, kwargs=kwargs)

    return absdb_factory


#: Absorption database factory
absdb_factory: AbsorptionDatabaseFactory = _init_absdb_factory()


[docs] def get_default_absdb( mode: Literal["mono", "ckd"] | Mode | None = None, ) -> AbsorptionDatabase: """ Return a default absorption database, depending on the active mode. Defaults are as follows: * Monochromatic: ``"komodo"`` * CKD: ``"monotropa"`` Parameters ---------- mode : {"mono", "ckd"} or Mode, optional The spectral mode for which the default database is returned. If unset, the current active mode is used. Returns ------- AbsorptionDatabase """ mode_error = UnsupportedModeError(supported=["mono", "ckd"]) if mode is None: mode = eradiate.get_mode() if isinstance(mode, Mode): if mode.is_mono: mode = "mono" elif mode.is_ckd: mode = "ckd" else: raise mode_error if mode == "mono": default = "komodo" elif mode == "ckd": default = "monotropa" else: raise mode_error return absdb_factory.create(default)