Skip to content

Commit ba487bb

Browse files
committed
Pass 1 of template implementations
1 parent 3d01a6d commit ba487bb

8 files changed

Lines changed: 944 additions & 5 deletions

src/mdio/builder/template_registry.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,10 @@
2525
from mdio.builder.templates.seismic_2d_streamer_shot import Seismic2DStreamerShotGathersTemplate
2626
from mdio.builder.templates.seismic_3d_cdp import Seismic3DCdpGathersTemplate
2727
from mdio.builder.templates.seismic_3d_coca import Seismic3DCocaGathersTemplate
28+
from mdio.builder.templates.seismic_3d_obn import Seismic3DObnReceiverGathersTemplate
29+
from mdio.builder.templates.seismic_3d_obn_single_component import Seismic3DObnSingleComponentGathersTemplate
2830
from mdio.builder.templates.seismic_3d_poststack import Seismic3DPostStackTemplate
31+
from mdio.builder.templates.seismic_3d_shot_receiver_line import Seismic3DShotReceiverLineGathersTemplate
2932
from mdio.builder.templates.seismic_3d_streamer_field import Seismic3DStreamerFieldRecordsTemplate
3033
from mdio.builder.templates.seismic_3d_streamer_shot import Seismic3DStreamerShotGathersTemplate
3134

@@ -138,6 +141,13 @@ def _register_default_templates(self) -> None:
138141
self.register(Seismic3DStreamerShotGathersTemplate())
139142
self.register(Seismic3DStreamerFieldRecordsTemplate())
140143

144+
# OBN (Ocean Bottom Node) data
145+
self.register(Seismic3DObnReceiverGathersTemplate())
146+
self.register(Seismic3DObnSingleComponentGathersTemplate())
147+
148+
# Land/OBC shot-receiver data
149+
self.register(Seismic3DShotReceiverLineGathersTemplate())
150+
141151
def get(self, template_name: str) -> AbstractDatasetTemplate:
142152
"""Get an instance of a template from the registry by its name.
143153
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
"""Seismic3DObnReceiverGathersTemplate MDIO v1 dataset templates."""
2+
3+
from typing import Any
4+
5+
from mdio.builder.schemas.dtype import ScalarType
6+
from mdio.builder.schemas.v1.variable import CoordinateMetadata
7+
from mdio.builder.templates.base import AbstractDatasetTemplate
8+
from mdio.builder.templates.types import SeismicDataDomain
9+
10+
11+
class Seismic3DObnReceiverGathersTemplate(AbstractDatasetTemplate):
12+
"""Seismic 3D OBN (Ocean Bottom Node) receiver gathers template.
13+
14+
A generalized template for OBN field records that are optimized for:
15+
- Common-receiver access
16+
- Common-shot access
17+
18+
It can also store all the shot-lines of a survey in one MDIO if needed.
19+
20+
Args:
21+
data_domain: The domain of the dataset.
22+
"""
23+
24+
def __init__(self, data_domain: SeismicDataDomain = "time"):
25+
super().__init__(data_domain=data_domain)
26+
27+
self._spatial_dim_names = ("component", "receiver", "shot_line", "gun", "shot_point")
28+
self._dim_names = (*self._spatial_dim_names, self._data_domain)
29+
self._physical_coord_names = (
30+
"receiver_coord_x",
31+
"receiver_coord_y",
32+
"source_coord_x",
33+
"source_coord_y",
34+
)
35+
self._logical_coord_names = ("orig_field_record_num",)
36+
self._var_chunk_shape = (4, 8, 1, 2, 8, 4096)
37+
38+
@property
39+
def _name(self) -> str:
40+
return "ObnReceiverGathers3D"
41+
42+
def _load_dataset_attributes(self) -> dict[str, Any]:
43+
return {"surveyDimensionality": "3D", "gatherType": "common_receiver"}
44+
45+
def _add_coordinates(self) -> None:
46+
# Add dimension coordinates
47+
self._builder.add_coordinate(
48+
"component",
49+
dimensions=("component",),
50+
data_type=ScalarType.UINT8,
51+
)
52+
self._builder.add_coordinate(
53+
"receiver",
54+
dimensions=("receiver",),
55+
data_type=ScalarType.UINT32,
56+
)
57+
self._builder.add_coordinate(
58+
"shot_line",
59+
dimensions=("shot_line",),
60+
data_type=ScalarType.UINT32,
61+
)
62+
self._builder.add_coordinate(
63+
"gun",
64+
dimensions=("gun",),
65+
data_type=ScalarType.UINT8,
66+
)
67+
self._builder.add_coordinate(
68+
"shot_point",
69+
dimensions=("shot_point",),
70+
data_type=ScalarType.UINT32,
71+
)
72+
self._builder.add_coordinate(
73+
self._data_domain,
74+
dimensions=(self._data_domain,),
75+
data_type=ScalarType.INT32,
76+
metadata=CoordinateMetadata(units_v1=self.get_unit_by_key(self._data_domain)),
77+
)
78+
79+
# Add non-dimension coordinates
80+
self._builder.add_coordinate(
81+
"receiver_coord_x",
82+
dimensions=("receiver",),
83+
data_type=ScalarType.FLOAT64,
84+
metadata=CoordinateMetadata(units_v1=self.get_unit_by_key("receiver_coord_x")),
85+
)
86+
self._builder.add_coordinate(
87+
"receiver_coord_y",
88+
dimensions=("receiver",),
89+
data_type=ScalarType.FLOAT64,
90+
metadata=CoordinateMetadata(units_v1=self.get_unit_by_key("receiver_coord_y")),
91+
)
92+
self._builder.add_coordinate(
93+
"source_coord_x",
94+
dimensions=("shot_line", "gun", "shot_point"),
95+
data_type=ScalarType.FLOAT64,
96+
metadata=CoordinateMetadata(units_v1=self.get_unit_by_key("source_coord_x")),
97+
)
98+
self._builder.add_coordinate(
99+
"source_coord_y",
100+
dimensions=("shot_line", "gun", "shot_point"),
101+
data_type=ScalarType.FLOAT64,
102+
metadata=CoordinateMetadata(units_v1=self.get_unit_by_key("source_coord_y")),
103+
)
104+
self._builder.add_coordinate(
105+
"orig_field_record_num",
106+
dimensions=("shot_line", "gun", "shot_point"),
107+
data_type=ScalarType.UINT32,
108+
)
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
"""Seismic3DObnSingleComponentGathersTemplate MDIO v1 dataset templates."""
2+
3+
from typing import Any
4+
5+
from mdio.builder.schemas.dtype import ScalarType
6+
from mdio.builder.schemas.v1.variable import CoordinateMetadata
7+
from mdio.builder.templates.base import AbstractDatasetTemplate
8+
from mdio.builder.templates.types import SeismicDataDomain
9+
10+
11+
class Seismic3DObnSingleComponentGathersTemplate(AbstractDatasetTemplate):
12+
"""Seismic 3D OBN (Ocean Bottom Node) single-component gathers template.
13+
14+
A generalized template for single-component OBN field records that are optimized for:
15+
- Common-receiver access
16+
- Common-shot access
17+
18+
It can also store all the shot-lines of a survey in one MDIO if needed.
19+
20+
Args:
21+
data_domain: The domain of the dataset.
22+
"""
23+
24+
def __init__(self, data_domain: SeismicDataDomain = "time"):
25+
super().__init__(data_domain=data_domain)
26+
27+
self._spatial_dim_names = ("receiver", "shot_line", "gun", "shot_point")
28+
self._dim_names = (*self._spatial_dim_names, self._data_domain)
29+
self._physical_coord_names = (
30+
"receiver_coord_x",
31+
"receiver_coord_y",
32+
"source_coord_x",
33+
"source_coord_y",
34+
)
35+
self._logical_coord_names = ("orig_field_record_num",)
36+
self._var_chunk_shape = (16, 1, 2, 16, 4096)
37+
38+
@property
39+
def _name(self) -> str:
40+
return "ObnSingleComponentGathers3D"
41+
42+
def _load_dataset_attributes(self) -> dict[str, Any]:
43+
return {"surveyDimensionality": "3D", "gatherType": "common_receiver"}
44+
45+
def _add_coordinates(self) -> None:
46+
# Add dimension coordinates
47+
self._builder.add_coordinate(
48+
"receiver",
49+
dimensions=("receiver",),
50+
data_type=ScalarType.UINT32,
51+
)
52+
self._builder.add_coordinate(
53+
"shot_line",
54+
dimensions=("shot_line",),
55+
data_type=ScalarType.UINT32,
56+
)
57+
self._builder.add_coordinate(
58+
"gun",
59+
dimensions=("gun",),
60+
data_type=ScalarType.UINT8,
61+
)
62+
self._builder.add_coordinate(
63+
"shot_point",
64+
dimensions=("shot_point",),
65+
data_type=ScalarType.UINT32,
66+
)
67+
self._builder.add_coordinate(
68+
self._data_domain,
69+
dimensions=(self._data_domain,),
70+
data_type=ScalarType.INT32,
71+
metadata=CoordinateMetadata(units_v1=self.get_unit_by_key(self._data_domain)),
72+
)
73+
74+
# Add non-dimension coordinates
75+
self._builder.add_coordinate(
76+
"receiver_coord_x",
77+
dimensions=("receiver",),
78+
data_type=ScalarType.FLOAT64,
79+
metadata=CoordinateMetadata(units_v1=self.get_unit_by_key("receiver_coord_x")),
80+
)
81+
self._builder.add_coordinate(
82+
"receiver_coord_y",
83+
dimensions=("receiver",),
84+
data_type=ScalarType.FLOAT64,
85+
metadata=CoordinateMetadata(units_v1=self.get_unit_by_key("receiver_coord_y")),
86+
)
87+
self._builder.add_coordinate(
88+
"source_coord_x",
89+
dimensions=("shot_line", "gun", "shot_point"),
90+
data_type=ScalarType.FLOAT64,
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", "gun", "shot_point"),
96+
data_type=ScalarType.FLOAT64,
97+
metadata=CoordinateMetadata(units_v1=self.get_unit_by_key("source_coord_y")),
98+
)
99+
self._builder.add_coordinate(
100+
"orig_field_record_num",
101+
dimensions=("shot_line", "gun", "shot_point"),
102+
data_type=ScalarType.UINT32,
103+
)
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
"""Seismic3DShotReceiverLineGathersTemplate MDIO v1 dataset templates."""
2+
3+
from typing import Any
4+
5+
from mdio.builder.schemas.dtype import ScalarType
6+
from mdio.builder.schemas.v1.variable import CoordinateMetadata
7+
from mdio.builder.templates.base import AbstractDatasetTemplate
8+
from mdio.builder.templates.types import SeismicDataDomain
9+
10+
11+
class Seismic3DShotReceiverLineGathersTemplate(AbstractDatasetTemplate):
12+
"""Seismic 3D shot-ordered gathers with receiver lines template.
13+
14+
A generalized template for land or OBC field records that are optimized for:
15+
- Common-shot access
16+
- Common-receiver-line access
17+
18+
It can also store all the shot-lines of a survey in one MDIO if needed.
19+
20+
Args:
21+
data_domain: The domain of the dataset.
22+
"""
23+
24+
def __init__(self, data_domain: SeismicDataDomain = "time"):
25+
super().__init__(data_domain=data_domain)
26+
27+
self._spatial_dim_names = ("shot_line", "shot_point", "receiver_line", "receiver")
28+
self._dim_names = (*self._spatial_dim_names, self._data_domain)
29+
self._physical_coord_names = (
30+
"source_coord_x",
31+
"source_coord_y",
32+
"receiver_coord_x",
33+
"receiver_coord_y",
34+
)
35+
self._logical_coord_names = ("orig_field_record_num",)
36+
self._var_chunk_shape = (1, 32, 1, 32, 2048)
37+
38+
@property
39+
def _name(self) -> str:
40+
return "ShotReceiverLineGathers3D"
41+
42+
def _load_dataset_attributes(self) -> dict[str, Any]:
43+
return {"surveyDimensionality": "3D", "gatherType": "common_source"}
44+
45+
def _add_coordinates(self) -> None:
46+
# Add dimension coordinates
47+
self._builder.add_coordinate(
48+
"shot_line",
49+
dimensions=("shot_line",),
50+
data_type=ScalarType.UINT32,
51+
)
52+
self._builder.add_coordinate(
53+
"shot_point",
54+
dimensions=("shot_point",),
55+
data_type=ScalarType.UINT32,
56+
)
57+
self._builder.add_coordinate(
58+
"receiver_line",
59+
dimensions=("receiver_line",),
60+
data_type=ScalarType.UINT32,
61+
)
62+
self._builder.add_coordinate(
63+
"receiver",
64+
dimensions=("receiver",),
65+
data_type=ScalarType.UINT32,
66+
)
67+
self._builder.add_coordinate(
68+
self._data_domain,
69+
dimensions=(self._data_domain,),
70+
data_type=ScalarType.INT32,
71+
metadata=CoordinateMetadata(units_v1=self.get_unit_by_key(self._data_domain)),
72+
)
73+
74+
# Add non-dimension coordinates
75+
self._builder.add_coordinate(
76+
"source_coord_x",
77+
dimensions=("shot_line", "shot_point"),
78+
data_type=ScalarType.FLOAT64,
79+
metadata=CoordinateMetadata(units_v1=self.get_unit_by_key("source_coord_x")),
80+
)
81+
self._builder.add_coordinate(
82+
"source_coord_y",
83+
dimensions=("shot_line", "shot_point"),
84+
data_type=ScalarType.FLOAT64,
85+
metadata=CoordinateMetadata(units_v1=self.get_unit_by_key("source_coord_y")),
86+
)
87+
self._builder.add_coordinate(
88+
"receiver_coord_x",
89+
dimensions=("receiver_line", "receiver"),
90+
data_type=ScalarType.FLOAT64,
91+
metadata=CoordinateMetadata(units_v1=self.get_unit_by_key("receiver_coord_x")),
92+
)
93+
self._builder.add_coordinate(
94+
"receiver_coord_y",
95+
dimensions=("receiver_line", "receiver"),
96+
data_type=ScalarType.FLOAT64,
97+
metadata=CoordinateMetadata(units_v1=self.get_unit_by_key("receiver_coord_y")),
98+
)
99+
self._builder.add_coordinate(
100+
"orig_field_record_num",
101+
dimensions=("shot_line", "shot_point"),
102+
data_type=ScalarType.UINT32,
103+
)

0 commit comments

Comments
 (0)