Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions src/mdio/builder/template_registry.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,9 @@
from mdio.builder.templates.seismic_3d_cdp import Seismic3DCdpGathersTemplate
from mdio.builder.templates.seismic_3d_coca import Seismic3DCocaGathersTemplate
from mdio.builder.templates.seismic_3d_obn import Seismic3DObnReceiverGathersTemplate
from mdio.builder.templates.seismic_3d_offset_tiles import Seismic3DOffsetTilesTemplate
from mdio.builder.templates.seismic_3d_poststack import Seismic3DPostStackTemplate
from mdio.builder.templates.seismic_3d_receiver_gathers import Seismic3DReceiverGathersTemplate
from mdio.builder.templates.seismic_3d_shot_receiver_line import Seismic3DShotReceiverLineGathersTemplate
from mdio.builder.templates.seismic_3d_streamer_field import Seismic3DStreamerFieldRecordsTemplate
from mdio.builder.templates.seismic_3d_streamer_shot import Seismic3DStreamerShotGathersTemplate
Expand Down Expand Up @@ -135,6 +137,13 @@ def _register_default_templates(self) -> None:
self.register(Seismic3DCocaGathersTemplate("time"))
self.register(Seismic3DCocaGathersTemplate("depth"))

# Receiver Gathers (OBN, OBC, land fixed-spread) - time domain only
self.register(Seismic3DReceiverGathersTemplate())

# Offset Tiles
self.register(Seismic3DOffsetTilesTemplate("time"))
self.register(Seismic3DOffsetTilesTemplate("depth"))

# Field (shot) data
self.register(Seismic2DStreamerShotGathersTemplate())
self.register(Seismic3DStreamerShotGathersTemplate())
Expand Down
86 changes: 86 additions & 0 deletions src/mdio/builder/templates/seismic_3d_offset_tiles.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
"""Seismic3DOffsetTilesTemplate MDIO v1 dataset templates."""

from typing import Any

from mdio.builder.schemas import compressors
from mdio.builder.schemas.dtype import ScalarType
from mdio.builder.schemas.v1.variable import CoordinateMetadata
from mdio.builder.templates.base import AbstractDatasetTemplate
from mdio.builder.templates.types import SeismicDataDomain


class Seismic3DOffsetTilesTemplate(AbstractDatasetTemplate):
"""Seismic 3D template for rectangular offset tile gathers."""

def __init__(self, data_domain: SeismicDataDomain = "time"):
super().__init__(data_domain=data_domain)

self._dim_names = (
"inline",
"crossline",
"inline_offset_tile",
"crossline_offset_tile",
self._data_domain,
)
self._physical_coord_names = ("cdp_x", "cdp_y")
self._logical_coord_names = ()
self._var_chunk_shape = (4, 4, 6, 6, 4096)

@property
def _name(self) -> str:
return f"OffsetTiles3D{self._data_domain.capitalize()}"

def _load_dataset_attributes(self) -> dict[str, Any]:
return {"surveyType": "3D", "gatherType": "offset_tiles"}

def _add_coordinates(self) -> None:
# Add dimension coordinates
self._builder.add_coordinate(
"inline",
dimensions=("inline",),
data_type=ScalarType.INT32,
metadata=CoordinateMetadata(units_v1=self.get_unit_by_key("inline")),
)
self._builder.add_coordinate(
"crossline",
dimensions=("crossline",),
data_type=ScalarType.INT32,
metadata=CoordinateMetadata(units_v1=self.get_unit_by_key("crossline")),
)
self._builder.add_coordinate(
"inline_offset_tile",
dimensions=("inline_offset_tile",),
data_type=ScalarType.INT16,
metadata=CoordinateMetadata(units_v1=self.get_unit_by_key("inline_offset_tile")),
)
self._builder.add_coordinate(
"crossline_offset_tile",
dimensions=("crossline_offset_tile",),
data_type=ScalarType.INT16,
metadata=CoordinateMetadata(units_v1=self.get_unit_by_key("crossline_offset_tile")),
)
self._builder.add_coordinate(
self.trace_domain,
dimensions=(self.trace_domain,),
data_type=ScalarType.INT32,
metadata=CoordinateMetadata(units_v1=self.get_unit_by_key(self.trace_domain)),
)

# Add non-dimension coordinates
compressor = compressors.Blosc(cname=compressors.BloscCname.zstd)

# CDP coordinates (vary by inline, crossline)
self._builder.add_coordinate(
"cdp_x",
dimensions=("inline", "crossline"),
data_type=ScalarType.FLOAT64,
compressor=compressor,
metadata=CoordinateMetadata(units_v1=self.get_unit_by_key("cdp_x")),
)
self._builder.add_coordinate(
"cdp_y",
dimensions=("inline", "crossline"),
data_type=ScalarType.FLOAT64,
compressor=compressor,
metadata=CoordinateMetadata(units_v1=self.get_unit_by_key("cdp_y")),
)
99 changes: 99 additions & 0 deletions src/mdio/builder/templates/seismic_3d_receiver_gathers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
"""Seismic3DReceiverGathersTemplate MDIO v1 dataset templates."""

from typing import Any

from mdio.builder.schemas import compressors
from mdio.builder.schemas.dtype import ScalarType
from mdio.builder.schemas.v1.variable import CoordinateMetadata
from mdio.builder.templates.base import AbstractDatasetTemplate


class Seismic3DReceiverGathersTemplate(AbstractDatasetTemplate):
"""Seismic 3D receiver gathers template with calculated shot index."""

def __init__(self) -> None:
super().__init__(data_domain="time")

self._dim_names = ("receiver", "shot_line", "shot_index", "time")
self._calculated_dims = ("shot_index",)
self._physical_coord_names = (
"receiver_x",
"receiver_y",
"source_coord_x",
"source_coord_y",
)
self._logical_coord_names = ("shot_point",)
self._var_chunk_shape = (1, 1, 512, 4096)

@property
def _name(self) -> str:
return "ReceiverGathers3D"

def _load_dataset_attributes(self) -> dict[str, Any]:
return {"surveyType": "3D", "gatherType": "receiver_gathers"}

def _add_coordinates(self) -> None:
# Add dimension coordinates
# Note: shot_index is calculated (0-N), so we don't add a coordinate for it
self._builder.add_coordinate(
"receiver",
dimensions=("receiver",),
data_type=ScalarType.UINT32,
metadata=CoordinateMetadata(units_v1=self.get_unit_by_key("receiver")),
)
self._builder.add_coordinate(
"shot_line",
dimensions=("shot_line",),
data_type=ScalarType.UINT32,
metadata=CoordinateMetadata(units_v1=self.get_unit_by_key("shot_line")),
)
self._builder.add_coordinate(
self.trace_domain,
dimensions=(self.trace_domain,),
data_type=ScalarType.INT32,
metadata=CoordinateMetadata(units_v1=self.get_unit_by_key(self.trace_domain)),
)

# Add non-dimension coordinates
compressor = compressors.Blosc(cname=compressors.BloscCname.zstd)

# Receiver coordinates (fixed per receiver)
self._builder.add_coordinate(
"receiver_x",
dimensions=("receiver",),
data_type=ScalarType.FLOAT64,
compressor=compressor,
metadata=CoordinateMetadata(units_v1=self.get_unit_by_key("receiver_x")),
)
self._builder.add_coordinate(
"receiver_y",
dimensions=("receiver",),
data_type=ScalarType.FLOAT64,
compressor=compressor,
metadata=CoordinateMetadata(units_v1=self.get_unit_by_key("receiver_y")),
)

# Shot point coordinate (actual shot point numbers, varies by shot_line and shot_index)
self._builder.add_coordinate(
"shot_point",
dimensions=("shot_line", "shot_index"),
data_type=ScalarType.UINT32,
compressor=compressor,
metadata=CoordinateMetadata(units_v1=self.get_unit_by_key("shot_point")),
)

# Source coordinates (vary by shot_line and shot_index)
self._builder.add_coordinate(
"source_coord_x",
dimensions=("shot_line", "shot_index"),
data_type=ScalarType.FLOAT64,
compressor=compressor,
metadata=CoordinateMetadata(units_v1=self.get_unit_by_key("source_coord_x")),
)
self._builder.add_coordinate(
"source_coord_y",
dimensions=("shot_line", "shot_index"),
data_type=ScalarType.FLOAT64,
compressor=compressor,
metadata=CoordinateMetadata(units_v1=self.get_unit_by_key("source_coord_y")),
)
Loading