Skip to content

aimbat.io

I/O interface for AIMBAT data sources.

Data source modules register their read/write and creation capabilities using the register_* functions exported from this package. Not all data sources need to support all capabilities — a source providing waveform data only would register a reader and writer but not the creator functions.

The SAC data source (aimbat.io._sac) is included and registers its capabilities automatically.

Functions:

Name Description
clear_seismogram_cache

Clear the in-memory seismogram data cache.

create_event

Create an AimbatEvent from a data source.

create_event_from_sacfile

Create an AimbatEvent instance from a SAC file.

create_seismogram

Create an AimbatSeismogram from a data source.

create_seismogram_from_sacfile_and_pick_header

Create an AimbatSeismogram instance from a SAC file.

create_station

Create an AimbatStation from a data source.

create_station_from_sacfile

Create an AimbatStation instance from a SAC file.

read_seismogram_data

Read seismogram waveform data from a data source.

read_seismogram_data_from_sacfile

Read seismogram data from a SAC file.

register_event_creator

Register a function that creates an AimbatEvent from a data source.

register_seismogram_creator

Register a function that creates an AimbatSeismogram from a data source.

register_seismogram_data_reader

Register a function that reads seismogram waveform data from a data source.

register_seismogram_data_writer

Register a function that writes seismogram waveform data to a data source.

register_station_creator

Register a function that creates an AimbatStation from a data source.

supports_event_creation

Return whether datatype has a registered event creator.

supports_seismogram_creation

Return whether datatype has a registered seismogram creator.

supports_seismogram_data_reading

Return whether datatype has a registered seismogram data reader.

supports_seismogram_data_writing

Return whether datatype has a registered seismogram data writer.

supports_station_creation

Return whether datatype has a registered station creator.

write_seismogram_data

Write seismogram waveform data to a data source.

write_seismogram_data_to_sacfile

Write seismogram data to a SAC file.

clear_seismogram_cache

clear_seismogram_cache() -> None

Clear the in-memory seismogram data cache.

Source code in src/aimbat/io/_base.py
def clear_seismogram_cache() -> None:
    """Clear the in-memory seismogram data cache."""
    _cache.clear()

create_event

create_event(
    datasource: str | PathLike, datatype: DataType
) -> AimbatEvent

Create an AimbatEvent from a data source.

Parameters:

Name Type Description Default
datasource str | PathLike

Data source path or name.

required
datatype DataType

Data type of the source.

required

Returns:

Type Description
AimbatEvent

A new AimbatEvent instance.

Raises:

Type Description
NotImplementedError

If datatype has no registered event creator.

Source code in src/aimbat/io/_base.py
def create_event(datasource: str | PathLike, datatype: DataType) -> AimbatEvent:
    """Create an `AimbatEvent` from a data source.

    Args:
        datasource: Data source path or name.
        datatype: Data type of the source.

    Returns:
        A new `AimbatEvent` instance.

    Raises:
        NotImplementedError: If `datatype` has no registered event creator.
    """
    logger.debug(f"Creating AimbatEvent from {datasource}.")
    creator = _event_creators.get(datatype)
    if creator is None:
        raise NotImplementedError(f"{datatype} does not support event creation.")
    return creator(datasource)

create_event_from_sacfile

create_event_from_sacfile(
    sacfile: str | PathLike,
) -> AimbatEvent

Create an AimbatEvent instance from a SAC file.

Parameters:

Name Type Description Default
sacfile str | PathLike

Name of the SAC file.

required

Returns:

Type Description
AimbatEvent

A new AimbatEvent instance.

Source code in src/aimbat/io/_sac.py
def create_event_from_sacfile(sacfile: str | PathLike) -> AimbatEvent:
    """Create an `AimbatEvent` instance from a SAC file.

    Args:
        sacfile: Name of the SAC file.

    Returns:
        A new `AimbatEvent` instance.
    """

    from aimbat.models import AimbatEvent, AimbatEventParameters

    logger.debug(f"Reading event data from {sacfile}.")

    event = SAC.from_file(sacfile).event
    aimbat_event = AimbatEvent.model_validate(
        event, update={"parameters": AimbatEventParameters()}
    )
    return aimbat_event

create_seismogram

create_seismogram(
    datasource: str | PathLike, datatype: DataType
) -> AimbatSeismogram

Create an AimbatSeismogram from a data source.

Parameters:

Name Type Description Default
datasource str | PathLike

Data source path or name.

required
datatype DataType

Data type of the source.

required

Returns:

Type Description
AimbatSeismogram

A new AimbatSeismogram instance.

Raises:

Type Description
NotImplementedError

If datatype has no registered seismogram creator.

Source code in src/aimbat/io/_base.py
def create_seismogram(
    datasource: str | PathLike, datatype: DataType
) -> AimbatSeismogram:
    """Create an `AimbatSeismogram` from a data source.

    Args:
        datasource: Data source path or name.
        datatype: Data type of the source.

    Returns:
        A new `AimbatSeismogram` instance.

    Raises:
        NotImplementedError: If `datatype` has no registered seismogram creator.
    """
    logger.debug(f"Creating AimbatSeismogram from {datasource}.")
    creator = _seismogram_creators.get(datatype)
    if creator is None:
        raise NotImplementedError(f"{datatype} does not support seismogram creation.")
    return creator(datasource)

create_seismogram_from_sacfile_and_pick_header

create_seismogram_from_sacfile_and_pick_header(
    sacfile: str | PathLike, sac_pick_header: str
) -> AimbatSeismogram

Create an AimbatSeismogram instance from a SAC file.

Parameters:

Name Type Description Default
sacfile str | PathLike

Name of the SAC file.

required
sac_pick_header str

SAC header to use as t0 in AIMBAT.

required
Source code in src/aimbat/io/_sac.py
def create_seismogram_from_sacfile_and_pick_header(
    sacfile: str | PathLike, sac_pick_header: str
) -> AimbatSeismogram:
    """Create an AimbatSeismogram instance from a SAC file.

    Args:
        sacfile: Name of the SAC file.
        sac_pick_header: SAC header to use as t0 in AIMBAT.
    """

    from aimbat.models import AimbatSeismogram, AimbatSeismogramParameters

    logger.debug(f"Reading seismogram metadata from {sacfile}.")

    sac = SAC.from_file(sacfile)
    t0 = getattr(sac.timestamps, sac_pick_header)
    seismogram = sac.seismogram
    aimbat_seismogram = AimbatSeismogram.model_validate(
        seismogram, update={"t0": t0, "parameters": AimbatSeismogramParameters()}
    )
    return aimbat_seismogram

create_station

create_station(
    datasource: str | PathLike, datatype: DataType
) -> AimbatStation

Create an AimbatStation from a data source.

Parameters:

Name Type Description Default
datasource str | PathLike

Data source path or name.

required
datatype DataType

Data type of the source.

required

Returns:

Type Description
AimbatStation

A new AimbatStation instance.

Raises:

Type Description
NotImplementedError

If datatype has no registered station creator.

Source code in src/aimbat/io/_base.py
def create_station(datasource: str | PathLike, datatype: DataType) -> AimbatStation:
    """Create an `AimbatStation` from a data source.

    Args:
        datasource: Data source path or name.
        datatype: Data type of the source.

    Returns:
        A new `AimbatStation` instance.

    Raises:
        NotImplementedError: If `datatype` has no registered station creator.
    """
    logger.debug(f"Creating AimbatStation from {datasource}.")
    creator = _station_creators.get(datatype)
    if creator is None:
        raise NotImplementedError(f"{datatype} does not support station creation.")
    return creator(datasource)

create_station_from_sacfile

create_station_from_sacfile(
    sacfile: str | PathLike,
) -> AimbatStation

Create an AimbatStation instance from a SAC file.

Parameters:

Name Type Description Default
sacfile str | PathLike

Name of the SAC file.

required

Returns:

Type Description
AimbatStation

A new AimbatStation instance.

Source code in src/aimbat/io/_sac.py
def create_station_from_sacfile(sacfile: str | PathLike) -> AimbatStation:
    """Create an AimbatStation instance from a SAC file.

    Args:
        sacfile: Name of the SAC file.

    Returns:
        A new AimbatStation instance.
    """

    from aimbat.models import AimbatStation

    logger.debug(f"Reading station data from {sacfile}.")

    station = SAC.from_file(sacfile).station
    aimbat_station = AimbatStation.model_validate(station)
    return aimbat_station

read_seismogram_data

read_seismogram_data(
    datasource: str | PathLike, datatype: DataType
) -> NDArray[float64]

Read seismogram waveform data from a data source.

Results are cached in memory by (datasource, datatype) key. The cache entry is invalidated when write_seismogram_data is called for the same key, and can be cleared manually with clear_seismogram_cache.

Parameters:

Name Type Description Default
datasource str | PathLike

Data source path or name.

required
datatype DataType

Data type of the source.

required

Returns:

Type Description
NDArray[float64]

Seismogram waveform data as a NumPy array.

Raises:

Type Description
NotImplementedError

If datatype has no registered data reader.

Source code in src/aimbat/io/_base.py
def read_seismogram_data(
    datasource: str | PathLike, datatype: DataType
) -> npt.NDArray[np.float64]:
    """Read seismogram waveform data from a data source.

    Results are cached in memory by `(datasource, datatype)` key. The cache
    entry is invalidated when `write_seismogram_data` is called for the same
    key, and can be cleared manually with `clear_seismogram_cache`.

    Args:
        datasource: Data source path or name.
        datatype: Data type of the source.

    Returns:
        Seismogram waveform data as a NumPy array.

    Raises:
        NotImplementedError: If `datatype` has no registered data reader.
    """
    logger.debug(f"Reading seismogram data from {datasource}.")
    reader = _seismogram_data_readers.get(datatype)
    if reader is None:
        raise NotImplementedError(
            f"{datatype} does not support reading seismogram data."
        )
    key = (str(datasource), datatype)
    if key not in _cache:
        _cache[key] = reader(datasource)
    return _cache[key]

read_seismogram_data_from_sacfile

read_seismogram_data_from_sacfile(
    sacfile: str | PathLike,
) -> NDArray[float64]

Read seismogram data from a SAC file.

Parameters:

Name Type Description Default
sacfile str | PathLike

Name of the SAC file.

required

Returns:

Type Description
NDArray[float64]

Seismogram data.

Source code in src/aimbat/io/_sac.py
def read_seismogram_data_from_sacfile(
    sacfile: str | PathLike,
) -> npt.NDArray[np.float64]:
    """Read seismogram data from a SAC file.

    Args:
        sacfile: Name of the SAC file.

    Returns:
        Seismogram data.
    """

    logger.debug(f"Reading seismogram data from {sacfile}.")

    return SAC.from_file(sacfile).seismogram.data

register_event_creator

register_event_creator(
    datatype: DataType,
    fn: Callable[[str | PathLike], AimbatEvent],
) -> None

Register a function that creates an AimbatEvent from a data source.

Parameters:

Name Type Description Default
datatype DataType

The data type this creator handles.

required
fn Callable[[str | PathLike], AimbatEvent]

Callable that accepts a datasource path or name and returns an AimbatEvent instance.

required
Source code in src/aimbat/io/_base.py
def register_event_creator(
    datatype: DataType,
    fn: Callable[[str | PathLike], AimbatEvent],
) -> None:
    """Register a function that creates an `AimbatEvent` from a data source.

    Args:
        datatype: The data type this creator handles.
        fn: Callable that accepts a datasource path or name and returns an
            `AimbatEvent` instance.
    """
    _event_creators[datatype] = fn

register_seismogram_creator

register_seismogram_creator(
    datatype: DataType,
    fn: Callable[[str | PathLike], AimbatSeismogram],
) -> None

Register a function that creates an AimbatSeismogram from a data source.

Parameters:

Name Type Description Default
datatype DataType

The data type this creator handles.

required
fn Callable[[str | PathLike], AimbatSeismogram]

Callable that accepts a datasource path or name and returns an AimbatSeismogram instance.

required
Source code in src/aimbat/io/_base.py
def register_seismogram_creator(
    datatype: DataType,
    fn: Callable[[str | PathLike], AimbatSeismogram],
) -> None:
    """Register a function that creates an `AimbatSeismogram` from a data source.

    Args:
        datatype: The data type this creator handles.
        fn: Callable that accepts a datasource path or name and returns an
            `AimbatSeismogram` instance.
    """
    _seismogram_creators[datatype] = fn

register_seismogram_data_reader

register_seismogram_data_reader(
    datatype: DataType,
    fn: Callable[[str | PathLike], NDArray[float64]],
) -> None

Register a function that reads seismogram waveform data from a data source.

Parameters:

Name Type Description Default
datatype DataType

The data type this reader handles.

required
fn Callable[[str | PathLike], NDArray[float64]]

Callable that accepts a datasource path or name and returns the waveform data as a NumPy array.

required
Source code in src/aimbat/io/_base.py
def register_seismogram_data_reader(
    datatype: DataType,
    fn: Callable[[str | PathLike], npt.NDArray[np.float64]],
) -> None:
    """Register a function that reads seismogram waveform data from a data source.

    Args:
        datatype: The data type this reader handles.
        fn: Callable that accepts a datasource path or name and returns the
            waveform data as a NumPy array.
    """
    _seismogram_data_readers[datatype] = fn

register_seismogram_data_writer

register_seismogram_data_writer(
    datatype: DataType,
    fn: Callable[[str | PathLike, NDArray[float64]], None],
) -> None

Register a function that writes seismogram waveform data to a data source.

Parameters:

Name Type Description Default
datatype DataType

The data type this writer handles.

required
fn Callable[[str | PathLike, NDArray[float64]], None]

Callable that accepts a datasource path or name and a NumPy array, and writes the data to the source.

required
Source code in src/aimbat/io/_base.py
def register_seismogram_data_writer(
    datatype: DataType,
    fn: Callable[[str | PathLike, npt.NDArray[np.float64]], None],
) -> None:
    """Register a function that writes seismogram waveform data to a data source.

    Args:
        datatype: The data type this writer handles.
        fn: Callable that accepts a datasource path or name and a NumPy array,
            and writes the data to the source.
    """
    _seismogram_data_writers[datatype] = fn

register_station_creator

register_station_creator(
    datatype: DataType,
    fn: Callable[[str | PathLike], AimbatStation],
) -> None

Register a function that creates an AimbatStation from a data source.

Parameters:

Name Type Description Default
datatype DataType

The data type this creator handles.

required
fn Callable[[str | PathLike], AimbatStation]

Callable that accepts a datasource path or name and returns an AimbatStation instance.

required
Source code in src/aimbat/io/_base.py
def register_station_creator(
    datatype: DataType,
    fn: Callable[[str | PathLike], AimbatStation],
) -> None:
    """Register a function that creates an `AimbatStation` from a data source.

    Args:
        datatype: The data type this creator handles.
        fn: Callable that accepts a datasource path or name and returns an
            `AimbatStation` instance.
    """
    _station_creators[datatype] = fn

supports_event_creation

supports_event_creation(datatype: DataType) -> bool

Return whether datatype has a registered event creator.

Source code in src/aimbat/io/_base.py
def supports_event_creation(datatype: DataType) -> bool:
    """Return whether `datatype` has a registered event creator."""
    return datatype in _event_creators

supports_seismogram_creation

supports_seismogram_creation(datatype: DataType) -> bool

Return whether datatype has a registered seismogram creator.

Source code in src/aimbat/io/_base.py
def supports_seismogram_creation(datatype: DataType) -> bool:
    """Return whether `datatype` has a registered seismogram creator."""
    return datatype in _seismogram_creators

supports_seismogram_data_reading

supports_seismogram_data_reading(
    datatype: DataType,
) -> bool

Return whether datatype has a registered seismogram data reader.

Source code in src/aimbat/io/_base.py
def supports_seismogram_data_reading(datatype: DataType) -> bool:
    """Return whether `datatype` has a registered seismogram data reader."""
    return datatype in _seismogram_data_readers

supports_seismogram_data_writing

supports_seismogram_data_writing(
    datatype: DataType,
) -> bool

Return whether datatype has a registered seismogram data writer.

Source code in src/aimbat/io/_base.py
def supports_seismogram_data_writing(datatype: DataType) -> bool:
    """Return whether `datatype` has a registered seismogram data writer."""
    return datatype in _seismogram_data_writers

supports_station_creation

supports_station_creation(datatype: DataType) -> bool

Return whether datatype has a registered station creator.

Source code in src/aimbat/io/_base.py
def supports_station_creation(datatype: DataType) -> bool:
    """Return whether `datatype` has a registered station creator."""
    return datatype in _station_creators

write_seismogram_data

write_seismogram_data(
    datasource: str | PathLike,
    datatype: DataType,
    data: NDArray[float64],
) -> None

Write seismogram waveform data to a data source.

Invalidates the cache entry for (datasource, datatype) after writing.

Parameters:

Name Type Description Default
datasource str | PathLike

Data source path or name.

required
datatype DataType

Data type of the source.

required
data NDArray[float64]

Seismogram waveform data to write.

required

Raises:

Type Description
NotImplementedError

If datatype has no registered data writer.

Source code in src/aimbat/io/_base.py
def write_seismogram_data(
    datasource: str | PathLike,
    datatype: DataType,
    data: npt.NDArray[np.float64],
) -> None:
    """Write seismogram waveform data to a data source.

    Invalidates the cache entry for `(datasource, datatype)` after writing.

    Args:
        datasource: Data source path or name.
        datatype: Data type of the source.
        data: Seismogram waveform data to write.

    Raises:
        NotImplementedError: If `datatype` has no registered data writer.
    """
    logger.debug(f"Writing seismogram data to {datasource}.")
    writer = _seismogram_data_writers.get(datatype)
    if writer is None:
        raise NotImplementedError(
            f"{datatype} does not support writing seismogram data."
        )
    writer(datasource, data)
    _cache.pop((str(datasource), datatype), None)

write_seismogram_data_to_sacfile

write_seismogram_data_to_sacfile(
    sacfile: str | PathLike, data: NDArray[float64]
) -> None

Write seismogram data to a SAC file.

Parameters:

Name Type Description Default
sacfile str | PathLike

Name of the SAC file.

required
data NDArray[float64]

Seismogram data.

required
Source code in src/aimbat/io/_sac.py
def write_seismogram_data_to_sacfile(
    sacfile: str | PathLike, data: npt.NDArray[np.float64]
) -> None:
    """Write seismogram data to a SAC file.

    Args:
        sacfile: Name of the SAC file.
        data: Seismogram data.
    """

    logger.debug(f"Writing seismogram data to {sacfile}.")

    sac = SAC.from_file(sacfile)
    sac.seismogram.data = data
    sac.write(sacfile)