Skip to content

aimbat.io

File I/O for AIMBAT.

Data source modules plug in by decorating their functions with the decorator factories from this package (station_creator, event_creator, seismogram_creator, seismogram_data_reader, seismogram_data_writer). Not every source needs to implement everything — a source that only provides waveform data would register a reader and writer but skip the creator functions.

SAC (aimbat.io.sac) and JSON (aimbat.io.json) data sources are loaded automatically and their capabilities registered on import of this package.

Modules:

Name Description
json

JSON data source support for AIMBAT.

sac

SAC file I/O for AIMBAT.

Classes:

Name Description
DataType

Valid AIMBAT data types.

Functions:

Name Description
create_event

Create an AimbatEvent from a data source.

create_seismogram

Create an AimbatSeismogram from a data source.

create_station

Create an AimbatStation from a data source.

event_creator

Decorator that registers a function as an event creator for datatype.

read_seismogram_data

Read seismogram waveform data from a data source.

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.

seismogram_creator

Decorator that registers a function as a seismogram creator for datatype.

seismogram_data_reader

Decorator that registers a function as a seismogram data reader for datatype.

seismogram_data_writer

Decorator that registers a function as a seismogram data writer for datatype.

station_creator

Decorator that registers a function as a station creator for datatype.

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.

DataType

Bases: StrEnum

Valid AIMBAT data types.

Attributes:

Name Type Description
JSON_EVENT

JSON file containing a single seismic event record.

JSON_STATION

JSON file containing a single seismic station record.

SAC

SAC (Seismic Analysis Code) waveform file. Provides station, event, and seismogram data.

Source code in src/aimbat/io/_data.py
class DataType(StrEnum):
    """Valid AIMBAT data types."""

    SAC = auto()
    """SAC (Seismic Analysis Code) waveform file. Provides station, event, and seismogram data."""

    JSON_EVENT = auto()
    """JSON file containing a single seismic event record."""

    JSON_STATION = auto()
    """JSON file containing a single seismic station record."""

JSON_EVENT class-attribute instance-attribute

JSON_EVENT = auto()

JSON file containing a single seismic event record.

JSON_STATION class-attribute instance-attribute

JSON_STATION = auto()

JSON file containing a single seismic station record.

SAC class-attribute instance-attribute

SAC = auto()

SAC (Seismic Analysis Code) waveform file. Provides station, event, and seismogram data.

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_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_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)

event_creator

event_creator(
    datatype: DataType,
) -> Callable[
    [Callable[[str | PathLike], AimbatEvent]],
    Callable[[str | PathLike], AimbatEvent],
]

Decorator that registers a function as an event creator for datatype.

Example
@event_creator(DataType.SAC)
def create_event_from_sacfile(sacfile: str | PathLike) -> AimbatEvent:
    ...
Source code in src/aimbat/io/_base.py
def event_creator(
    datatype: DataType,
) -> Callable[
    [Callable[[str | PathLike], AimbatEvent]], Callable[[str | PathLike], AimbatEvent]
]:
    """Decorator that registers a function as an event creator for `datatype`.

    Example:
        ```python
        @event_creator(DataType.SAC)
        def create_event_from_sacfile(sacfile: str | PathLike) -> AimbatEvent:
            ...
        ```
    """

    def decorator(
        fn: Callable[[str | PathLike], AimbatEvent],
    ) -> Callable[[str | PathLike], AimbatEvent]:
        register_event_creator(datatype, fn)
        return fn

    return decorator

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 returned array is read-only; to write new data use write_seismogram_data. The cache entry is invalidated when write_seismogram_data is called for the same key.

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]

Read-only 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 returned
    array is read-only; to write new data use `write_seismogram_data`. The
    cache entry is invalidated when `write_seismogram_data` is called for the
    same key.

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

    Returns:
        Read-only 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:
        arr = reader(datasource)
        arr.flags.writeable = False
        _cache[key] = arr
    else:
        logger.debug(f"Retrieved seismogram data from cache for {datasource}.")
    return _cache[key]

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.
    """
    logger.debug(f"Registering event creator for {datatype}.")
    _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.
    """
    logger.debug(f"Registering seismogram creator for {datatype}.")
    _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.
    """
    logger.debug(f"Registering seismogram data reader for {datatype}.")
    _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.
    """
    logger.debug(f"Registering seismogram data writer for {datatype}.")
    _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.
    """
    logger.debug(f"Registering station creator for {datatype}.")
    _station_creators[datatype] = fn

seismogram_creator

seismogram_creator(
    datatype: DataType,
) -> Callable[
    [Callable[[str | PathLike], AimbatSeismogram]],
    Callable[[str | PathLike], AimbatSeismogram],
]

Decorator that registers a function as a seismogram creator for datatype.

Example
@seismogram_creator(DataType.SAC)
def create_seismogram_from_sacfile(sacfile: str | PathLike) -> AimbatSeismogram:
    ...
Source code in src/aimbat/io/_base.py
def seismogram_creator(
    datatype: DataType,
) -> Callable[
    [Callable[[str | PathLike], AimbatSeismogram]],
    Callable[[str | PathLike], AimbatSeismogram],
]:
    """Decorator that registers a function as a seismogram creator for `datatype`.

    Example:
        ```python
        @seismogram_creator(DataType.SAC)
        def create_seismogram_from_sacfile(sacfile: str | PathLike) -> AimbatSeismogram:
            ...
        ```
    """

    def decorator(
        fn: Callable[[str | PathLike], AimbatSeismogram],
    ) -> Callable[[str | PathLike], AimbatSeismogram]:
        register_seismogram_creator(datatype, fn)
        return fn

    return decorator

seismogram_data_reader

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

Decorator that registers a function as a seismogram data reader for datatype.

Example
@seismogram_data_reader(DataType.SAC)
def read_seismogram_data_from_sacfile(sacfile: str | PathLike) -> npt.NDArray[np.float64]:
    ...
Source code in src/aimbat/io/_base.py
def seismogram_data_reader(
    datatype: DataType,
) -> Callable[
    [Callable[[str | PathLike], npt.NDArray[np.float64]]],
    Callable[[str | PathLike], npt.NDArray[np.float64]],
]:
    """Decorator that registers a function as a seismogram data reader for `datatype`.

    Example:
        ```python
        @seismogram_data_reader(DataType.SAC)
        def read_seismogram_data_from_sacfile(sacfile: str | PathLike) -> npt.NDArray[np.float64]:
            ...
        ```
    """

    def decorator(
        fn: Callable[[str | PathLike], npt.NDArray[np.float64]],
    ) -> Callable[[str | PathLike], npt.NDArray[np.float64]]:
        register_seismogram_data_reader(datatype, fn)
        return fn

    return decorator

seismogram_data_writer

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

Decorator that registers a function as a seismogram data writer for datatype.

Example
@seismogram_data_writer(DataType.SAC)
def write_seismogram_data_to_sacfile(
    sacfile: str | PathLike, data: npt.NDArray[np.float64]
) -> None:
    ...
Source code in src/aimbat/io/_base.py
def seismogram_data_writer(
    datatype: DataType,
) -> Callable[
    [Callable[[str | PathLike, npt.NDArray[np.float64]], None]],
    Callable[[str | PathLike, npt.NDArray[np.float64]], None],
]:
    """Decorator that registers a function as a seismogram data writer for `datatype`.

    Example:
        ```python
        @seismogram_data_writer(DataType.SAC)
        def write_seismogram_data_to_sacfile(
            sacfile: str | PathLike, data: npt.NDArray[np.float64]
        ) -> None:
            ...
        ```
    """

    def decorator(
        fn: Callable[[str | PathLike, npt.NDArray[np.float64]], None],
    ) -> Callable[[str | PathLike, npt.NDArray[np.float64]], None]:
        register_seismogram_data_writer(datatype, fn)
        return fn

    return decorator

station_creator

station_creator(
    datatype: DataType,
) -> Callable[
    [Callable[[str | PathLike], AimbatStation]],
    Callable[[str | PathLike], AimbatStation],
]

Decorator that registers a function as a station creator for datatype.

Example
@station_creator(DataType.SAC)
def create_station_from_sacfile(sacfile: str | PathLike) -> AimbatStation:
    ...
Source code in src/aimbat/io/_base.py
def station_creator(
    datatype: DataType,
) -> Callable[
    [Callable[[str | PathLike], AimbatStation]],
    Callable[[str | PathLike], AimbatStation],
]:
    """Decorator that registers a function as a station creator for `datatype`.

    Example:
        ```python
        @station_creator(DataType.SAC)
        def create_station_from_sacfile(sacfile: str | PathLike) -> AimbatStation:
            ...
        ```
    """

    def decorator(
        fn: Callable[[str | PathLike], AimbatStation],
    ) -> Callable[[str | PathLike], AimbatStation]:
        register_station_creator(datatype, fn)
        return fn

    return decorator

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)

json

JSON data source support for AIMBAT.

Provides station and event creation from JSON files:

  • JSON_STATION (DataType.JSON_STATION): a JSON file containing a single station record. Field names match AimbatStation:

    {
        "name": "ANMO",
        "network": "IU",
        "location": "00",
        "channel": "BHZ",
        "latitude": 34.9459,
        "longitude": -106.4572,
        "elevation": 1820.0
    }
    
  • JSON_EVENT (DataType.JSON_EVENT): a JSON file containing a single event record. Field names match AimbatEvent:

    {
        "time": "2020-01-01T00:00:00Z",
        "latitude": 35.0,
        "longitude": -120.0,
        "depth": 10.0
    }
    

Functions:

Name Description
create_event_from_json

Create an AimbatEvent from a JSON file.

create_station_from_json

Create an AimbatStation from a JSON file.

create_event_from_json

create_event_from_json(path: str | PathLike) -> AimbatEvent

Create an AimbatEvent from a JSON file.

Parameters:

Name Type Description Default
path str | PathLike

Path to the JSON file.

required

Returns:

Type Description
AimbatEvent

A new AimbatEvent instance.

Source code in src/aimbat/io/json.py
@event_creator(DataType.JSON_EVENT)
def create_event_from_json(path: str | PathLike) -> AimbatEvent:
    """Create an `AimbatEvent` from a JSON file.

    Args:
        path: Path to the JSON file.

    Returns:
        A new `AimbatEvent` instance.
    """
    from aimbat.models import AimbatEvent, AimbatEventParameters

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

    with open(path) as f:
        data = json.load(f)
    event = AimbatEvent.model_validate(data)
    event.parameters = AimbatEventParameters()
    return event

create_station_from_json

create_station_from_json(
    path: str | PathLike,
) -> AimbatStation

Create an AimbatStation from a JSON file.

Parameters:

Name Type Description Default
path str | PathLike

Path to the JSON file.

required

Returns:

Type Description
AimbatStation

A new AimbatStation instance.

Source code in src/aimbat/io/json.py
@station_creator(DataType.JSON_STATION)
def create_station_from_json(path: str | PathLike) -> AimbatStation:
    """Create an `AimbatStation` from a JSON file.

    Args:
        path: Path to the JSON file.

    Returns:
        A new `AimbatStation` instance.
    """
    from aimbat.models import AimbatStation

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

    with open(path) as f:
        data = json.load(f)
    return AimbatStation.model_validate(data)

sac

SAC file I/O for AIMBAT.

Reads and writes seismogram data from SAC files via pysmo, and creates AimbatStation, AimbatEvent, and AimbatSeismogram model instances from SAC file metadata.

This module registers its capabilities with the I/O dispatch layer on import, so importing it is sufficient to enable SAC support.

Functions:

Name Description
create_event_from_sacfile

Create an AimbatEvent instance from a SAC file.

create_seismogram_from_sacfile

Create an AimbatSeismogram instance from a SAC file using the configured pick header.

create_seismogram_from_sacfile_and_pick_header

Create an AimbatSeismogram instance from a SAC file.

create_station_from_sacfile

Create an AimbatStation instance from a SAC file.

read_seismogram_data_from_sacfile

Read seismogram data from a SAC file.

write_seismogram_data_to_sacfile

Write seismogram data to a SAC file.

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
@event_creator(DataType.SAC)
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_from_sacfile

create_seismogram_from_sacfile(
    sacfile: str | PathLike,
) -> AimbatSeismogram

Create an AimbatSeismogram instance from a SAC file using the configured pick header.

Parameters:

Name Type Description Default
sacfile str | PathLike

Name of the SAC file.

required

Returns:

Type Description
AimbatSeismogram

A new AimbatSeismogram instance.

Source code in src/aimbat/io/sac.py
@seismogram_creator(DataType.SAC)
def create_seismogram_from_sacfile(sacfile: str | PathLike) -> AimbatSeismogram:
    """Create an AimbatSeismogram instance from a SAC file using the configured pick header.

    Args:
        sacfile: Name of the SAC file.

    Returns:
        A new `AimbatSeismogram` instance.
    """
    return create_seismogram_from_sacfile_and_pick_header(
        sacfile, settings.sac_pick_header
    )

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_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
@station_creator(DataType.SAC)
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_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
@seismogram_data_reader(DataType.SAC)
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

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
@seismogram_data_writer(DataType.SAC)
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)