Skip to content

Commit 735d7f7

Browse files
authored
Add templates for 3DOffsetTiles and 3DReceiverGathers (#781)
1 parent cf7280b commit 735d7f7

File tree

6 files changed

+588
-8
lines changed

6 files changed

+588
-8
lines changed

src/mdio/builder/template_registry.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@
2626
from mdio.builder.templates.seismic_3d_cdp import Seismic3DCdpGathersTemplate
2727
from mdio.builder.templates.seismic_3d_coca import Seismic3DCocaGathersTemplate
2828
from mdio.builder.templates.seismic_3d_obn import Seismic3DObnReceiverGathersTemplate
29+
from mdio.builder.templates.seismic_3d_offset_tiles import Seismic3DOffsetTilesTemplate
2930
from mdio.builder.templates.seismic_3d_poststack import Seismic3DPostStackTemplate
31+
from mdio.builder.templates.seismic_3d_receiver_gathers import Seismic3DReceiverGathersTemplate
3032
from mdio.builder.templates.seismic_3d_shot_receiver_line import Seismic3DShotReceiverLineGathersTemplate
3133
from mdio.builder.templates.seismic_3d_streamer_field import Seismic3DStreamerFieldRecordsTemplate
3234
from mdio.builder.templates.seismic_3d_streamer_shot import Seismic3DStreamerShotGathersTemplate
@@ -135,6 +137,13 @@ def _register_default_templates(self) -> None:
135137
self.register(Seismic3DCocaGathersTemplate("time"))
136138
self.register(Seismic3DCocaGathersTemplate("depth"))
137139

140+
# Receiver Gathers (OBN, OBC, land fixed-spread) - time domain only
141+
self.register(Seismic3DReceiverGathersTemplate())
142+
143+
# Offset Tiles
144+
self.register(Seismic3DOffsetTilesTemplate("time"))
145+
self.register(Seismic3DOffsetTilesTemplate("depth"))
146+
138147
# Field (shot) data
139148
self.register(Seismic2DStreamerShotGathersTemplate())
140149
self.register(Seismic3DStreamerShotGathersTemplate())
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
"""Seismic3DOffsetTilesTemplate MDIO v1 dataset templates."""
2+
3+
from typing import Any
4+
5+
from mdio.builder.schemas import compressors
6+
from mdio.builder.schemas.dtype import ScalarType
7+
from mdio.builder.schemas.v1.variable import CoordinateMetadata
8+
from mdio.builder.templates.base import AbstractDatasetTemplate
9+
from mdio.builder.templates.types import SeismicDataDomain
10+
11+
12+
class Seismic3DOffsetTilesTemplate(AbstractDatasetTemplate):
13+
"""Seismic 3D template for rectangular offset tile gathers."""
14+
15+
def __init__(self, data_domain: SeismicDataDomain = "time"):
16+
super().__init__(data_domain=data_domain)
17+
18+
self._dim_names = (
19+
"inline",
20+
"crossline",
21+
"inline_offset_tile",
22+
"crossline_offset_tile",
23+
self._data_domain,
24+
)
25+
self._physical_coord_names = ("cdp_x", "cdp_y")
26+
self._logical_coord_names = ()
27+
self._var_chunk_shape = (4, 4, 6, 6, 4096)
28+
29+
@property
30+
def _name(self) -> str:
31+
return f"OffsetTiles3D{self._data_domain.capitalize()}"
32+
33+
def _load_dataset_attributes(self) -> dict[str, Any]:
34+
return {"surveyType": "3D", "gatherType": "offset_tiles"}
35+
36+
def _add_coordinates(self) -> None:
37+
# Add dimension coordinates
38+
self._builder.add_coordinate(
39+
"inline",
40+
dimensions=("inline",),
41+
data_type=ScalarType.INT32,
42+
metadata=CoordinateMetadata(units_v1=self.get_unit_by_key("inline")),
43+
)
44+
self._builder.add_coordinate(
45+
"crossline",
46+
dimensions=("crossline",),
47+
data_type=ScalarType.INT32,
48+
metadata=CoordinateMetadata(units_v1=self.get_unit_by_key("crossline")),
49+
)
50+
self._builder.add_coordinate(
51+
"inline_offset_tile",
52+
dimensions=("inline_offset_tile",),
53+
data_type=ScalarType.INT16,
54+
metadata=CoordinateMetadata(units_v1=self.get_unit_by_key("inline_offset_tile")),
55+
)
56+
self._builder.add_coordinate(
57+
"crossline_offset_tile",
58+
dimensions=("crossline_offset_tile",),
59+
data_type=ScalarType.INT16,
60+
metadata=CoordinateMetadata(units_v1=self.get_unit_by_key("crossline_offset_tile")),
61+
)
62+
self._builder.add_coordinate(
63+
self.trace_domain,
64+
dimensions=(self.trace_domain,),
65+
data_type=ScalarType.INT32,
66+
metadata=CoordinateMetadata(units_v1=self.get_unit_by_key(self.trace_domain)),
67+
)
68+
69+
# Add non-dimension coordinates
70+
compressor = compressors.Blosc(cname=compressors.BloscCname.zstd)
71+
72+
# CDP coordinates (vary by inline, crossline)
73+
self._builder.add_coordinate(
74+
"cdp_x",
75+
dimensions=("inline", "crossline"),
76+
data_type=ScalarType.FLOAT64,
77+
compressor=compressor,
78+
metadata=CoordinateMetadata(units_v1=self.get_unit_by_key("cdp_x")),
79+
)
80+
self._builder.add_coordinate(
81+
"cdp_y",
82+
dimensions=("inline", "crossline"),
83+
data_type=ScalarType.FLOAT64,
84+
compressor=compressor,
85+
metadata=CoordinateMetadata(units_v1=self.get_unit_by_key("cdp_y")),
86+
)
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
"""Seismic3DReceiverGathersTemplate MDIO v1 dataset templates."""
2+
3+
from typing import Any
4+
5+
from mdio.builder.schemas import compressors
6+
from mdio.builder.schemas.dtype import ScalarType
7+
from mdio.builder.schemas.v1.variable import CoordinateMetadata
8+
from mdio.builder.templates.base import AbstractDatasetTemplate
9+
10+
11+
class Seismic3DReceiverGathersTemplate(AbstractDatasetTemplate):
12+
"""Seismic 3D receiver gathers template with calculated shot index."""
13+
14+
def __init__(self) -> None:
15+
super().__init__(data_domain="time")
16+
17+
self._dim_names = ("receiver", "shot_line", "shot_index", "time")
18+
self._calculated_dims = ("shot_index",)
19+
self._physical_coord_names = (
20+
"receiver_x",
21+
"receiver_y",
22+
"source_coord_x",
23+
"source_coord_y",
24+
)
25+
self._logical_coord_names = ("shot_point",)
26+
self._var_chunk_shape = (1, 1, 512, 4096)
27+
28+
@property
29+
def _name(self) -> str:
30+
return "ReceiverGathers3D"
31+
32+
def _load_dataset_attributes(self) -> dict[str, Any]:
33+
return {"surveyType": "3D", "gatherType": "receiver_gathers"}
34+
35+
def _add_coordinates(self) -> None:
36+
# Add dimension coordinates
37+
# Note: shot_index is calculated (0-N), so we don't add a coordinate for it
38+
self._builder.add_coordinate(
39+
"receiver",
40+
dimensions=("receiver",),
41+
data_type=ScalarType.UINT32,
42+
metadata=CoordinateMetadata(units_v1=self.get_unit_by_key("receiver")),
43+
)
44+
self._builder.add_coordinate(
45+
"shot_line",
46+
dimensions=("shot_line",),
47+
data_type=ScalarType.UINT32,
48+
metadata=CoordinateMetadata(units_v1=self.get_unit_by_key("shot_line")),
49+
)
50+
self._builder.add_coordinate(
51+
self.trace_domain,
52+
dimensions=(self.trace_domain,),
53+
data_type=ScalarType.INT32,
54+
metadata=CoordinateMetadata(units_v1=self.get_unit_by_key(self.trace_domain)),
55+
)
56+
57+
# Add non-dimension coordinates
58+
compressor = compressors.Blosc(cname=compressors.BloscCname.zstd)
59+
60+
# Receiver coordinates (fixed per receiver)
61+
self._builder.add_coordinate(
62+
"receiver_x",
63+
dimensions=("receiver",),
64+
data_type=ScalarType.FLOAT64,
65+
compressor=compressor,
66+
metadata=CoordinateMetadata(units_v1=self.get_unit_by_key("receiver_x")),
67+
)
68+
self._builder.add_coordinate(
69+
"receiver_y",
70+
dimensions=("receiver",),
71+
data_type=ScalarType.FLOAT64,
72+
compressor=compressor,
73+
metadata=CoordinateMetadata(units_v1=self.get_unit_by_key("receiver_y")),
74+
)
75+
76+
# Shot point coordinate (actual shot point numbers, varies by shot_line and shot_index)
77+
self._builder.add_coordinate(
78+
"shot_point",
79+
dimensions=("shot_line", "shot_index"),
80+
data_type=ScalarType.UINT32,
81+
compressor=compressor,
82+
metadata=CoordinateMetadata(units_v1=self.get_unit_by_key("shot_point")),
83+
)
84+
85+
# Source coordinates (vary by shot_line and shot_index)
86+
self._builder.add_coordinate(
87+
"source_coord_x",
88+
dimensions=("shot_line", "shot_index"),
89+
data_type=ScalarType.FLOAT64,
90+
compressor=compressor,
91+
metadata=CoordinateMetadata(units_v1=self.get_unit_by_key("source_coord_x")),
92+
)
93+
self._builder.add_coordinate(
94+
"source_coord_y",
95+
dimensions=("shot_line", "shot_index"),
96+
data_type=ScalarType.FLOAT64,
97+
compressor=compressor,
98+
metadata=CoordinateMetadata(units_v1=self.get_unit_by_key("source_coord_y")),
99+
)

0 commit comments

Comments
 (0)