Skip to content

Commit d0c32b0

Browse files
committed
Working end-to-end examples
1 parent 93292d1 commit d0c32b0

File tree

3 files changed

+47
-23
lines changed

3 files changed

+47
-23
lines changed

src/mdio/converters/segy.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
from segy.config import SegySettings
1313
from segy.standards.codes import MeasurementSystem as segy_MeasurementSystem
1414
from segy.standards.fields.trace import Rev0 as TraceHeaderFieldsRev0
15+
from segy.schema import HeaderField
16+
from segy.schema import ScalarType as ScalarType2
1517

1618
from mdio.api.io import _normalize_path
1719
from mdio.api.io import to_mdio
@@ -340,6 +342,45 @@ def _add_grid_override_to_metadata(dataset: Dataset, grid_overrides: dict[str, A
340342
if grid_overrides is not None:
341343
dataset.metadata.attributes["gridOverrides"] = grid_overrides
342344

345+
def _scalar_to_size(scalar: ScalarType2) -> int:
346+
if scalar == ScalarType2.UINT8:
347+
return 1
348+
elif scalar == ScalarType2.UINT16:
349+
return 2
350+
elif scalar == ScalarType2.UINT32:
351+
return 4
352+
elif scalar == ScalarType2.UINT64:
353+
return 8
354+
elif scalar == ScalarType2.INT8:
355+
return 1
356+
elif scalar == ScalarType2.INT16:
357+
return 2
358+
elif scalar == ScalarType2.INT32:
359+
return 4
360+
elif scalar == ScalarType2.INT64:
361+
return 8
362+
elif scalar == ScalarType2.FLOAT32:
363+
return 4
364+
elif scalar == ScalarType2.FLOAT64:
365+
return 8
366+
elif scalar == ScalarType2.FLOAT16:
367+
return 2
368+
elif scalar == ScalarType2.STRING8:
369+
return 8
370+
else:
371+
raise ValueError(f"Invalid scalar type: {scalar}")
372+
373+
def _customize_segy_spec(segy_spec: SegySpec) -> SegySpec:
374+
assigned_bytes = []
375+
for field in segy_spec.trace.header.fields:
376+
byte = field.byte-1
377+
for i in range(byte, byte + _scalar_to_size(field.format)):
378+
assigned_bytes.append(i)
379+
unassigned_bytes = [i for i in range(240) if i not in assigned_bytes]
380+
field_to_customize = [HeaderField(name=f"Field_{i}", format=ScalarType.UINT8, byte=i+1) for i in unassigned_bytes]
381+
segy_spec = segy_spec.customize(trace_header_fields=field_to_customize)
382+
return segy_spec
383+
343384

344385
def _add_raw_headers_to_template(mdio_template: AbstractDatasetTemplate) -> AbstractDatasetTemplate:
345386
"""Add raw headers capability to the MDIO template by monkey-patching its _add_variables method.
@@ -421,6 +462,9 @@ def segy_to_mdio( # noqa PLR0913
421462
input_path = _normalize_path(input_path)
422463
output_path = _normalize_path(output_path)
423464

465+
if os.getenv("MDIO__DO_RAW_HEADERS") == "1":
466+
segy_spec = _customize_segy_spec(segy_spec)
467+
424468
if not overwrite and output_path.exists():
425469
err = f"Output location '{output_path.as_posix()}' exists. Set `overwrite=True` if intended."
426470
raise FileExistsError(err)

src/mdio/segy/_workers.py

Lines changed: 3 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -148,25 +148,8 @@ def trace_worker( # noqa: PLR0913
148148
ds_to_write = dataset[worker_variables]
149149

150150
if raw_header_key in worker_variables:
151-
# from segy.schema import HeaderField, ScalarType
152-
from segy.schema import HeaderField
153-
from segy.schema import ScalarType as ScalarType2
154-
155-
new_spec = deepcopy(segy_file.spec)
156-
new_spec.trace.header.fields = []
157-
new_fields = []
158-
159-
for i in range(240):
160-
new_fields.append(HeaderField(name=f"Field_{i}", format=ScalarType.UINT8, byte=i+1))
161-
162-
# # new_spec.trace.header.fields = new_fields
163-
new_spec = new_spec.customize(trace_header_fields=new_fields)
164-
updated_segy_file = SegyFile(segy_file.url, spec=new_spec)
165-
updated_traces = updated_segy_file.trace[live_trace_indexes]
166-
167151
tmp_raw_headers = np.zeros_like(dataset[raw_header_key])
168152

169-
170153
# _foo = traces.tobytes()[:240]
171154

172155
# _asContiguousCopy = np.ascontiguousarray(traces.header.copy()).view("|V240")
@@ -185,8 +168,6 @@ def trace_worker( # noqa: PLR0913
185168

186169
# _aahhhhhhh = segy_file.header[0]
187170

188-
189-
190171
# _asBytes = traces.header.tobytes()
191172
# _are_equal = _foo == _asBytes[:240]
192173
# _asBytesLen = len(_asBytes)
@@ -195,18 +176,18 @@ def trace_worker( # noqa: PLR0913
195176
# _asContiguousBytesView = np.ascontiguousarray(traces.header[0]).tobytes().view("|V240")
196177
# _asBuffer = memoryview(traces.header)
197178

198-
199179
# _type = traces.header.dtype
200180

201181
# tmp_raw_headers[not_null] = traces.raw_header
202-
# tmp_raw_headers[not_null] = np.ascontiguousarray(traces.header.copy()).view("|V240")
182+
# tmp_raw_headers[not_null] = np.ascontiguousarray(traces.header.copy(order="C")).view("|V240")
183+
tmp_raw_headers[not_null] = np.ascontiguousarray(traces.header.copy()).view("|V240")
203184
# tmp_raw_headers[not_null] = _asContiguousBytes
204185
# tmp_raw_headers[not_null] = _asBytes
205186
# tmp_raw_headers[not_null] = traces.header.view("|V240")
206187
# tmp_raw_headers[not_null] = np.ascontiguousarray(traces.header.copy()).view("|V240") # Leaks numpy metadata
207188

208189

209-
tmp_raw_headers[not_null] = updated_traces.header.view("|V240")
190+
# tmp_raw_headers[not_null] = updated_traces.header.view("|V240")
210191

211192
ds_to_write[raw_header_key] = Variable(
212193
ds_to_write[raw_header_key].dims,

tests/integration/test_segy_import_export_masked.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -547,7 +547,6 @@ def read_segy_trace_header(trace_index: int) -> bytes:
547547
segy_trace_idx = 0
548548
flat_mask = trace_mask.ravel()
549549
flat_raw_headers = raw_headers_data.ravel() # Flatten to 1D array of 240-byte header records
550-
print(f"Flat mask shape: {flat_mask.shape}")
551550

552551
operation = 'w'
553552

0 commit comments

Comments
 (0)