Skip to content

Commit 5a041a4

Browse files
committed
Bandaid fix
1 parent 065280b commit 5a041a4

File tree

2 files changed

+46
-5
lines changed

2 files changed

+46
-5
lines changed

src/mdio/converters/segy.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -371,15 +371,19 @@ def _scalar_to_size(scalar: ScalarType2) -> int:
371371
raise ValueError(f"Invalid scalar type: {scalar}")
372372

373373
def _customize_segy_spec(segy_spec: SegySpec) -> SegySpec:
374+
from copy import deepcopy
374375
assigned_bytes = []
376+
377+
ret = deepcopy(segy_spec)
378+
375379
for field in segy_spec.trace.header.fields:
376380
byte = field.byte-1
377381
for i in range(byte, byte + _scalar_to_size(field.format)):
378382
assigned_bytes.append(i)
379383
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
384+
field_to_customize = [HeaderField(name=f"__MDIO_RAW_UNSPECIFIED_Field_{i}", format=ScalarType.UINT8, byte=i+1) for i in unassigned_bytes]
385+
ret = ret.customize(trace_header_fields=field_to_customize)
386+
return ret
383387

384388

385389
def _add_raw_headers_to_template(mdio_template: AbstractDatasetTemplate) -> AbstractDatasetTemplate:

src/mdio/segy/creation.py

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,39 @@
2828
logger = logging.getLogger(__name__)
2929

3030

31+
def _filter_raw_unspecified_fields(headers: NDArray) -> NDArray:
32+
"""Filter out __MDIO_RAW_UNSPECIFIED_Field_* fields from headers array.
33+
34+
These fields are added during SEGY import to preserve raw header bytes,
35+
but they cause dtype mismatches during export. This function removes them.
36+
37+
Args:
38+
headers: Header array that may contain raw unspecified fields.
39+
40+
Returns:
41+
Header array with raw unspecified fields removed.
42+
"""
43+
if headers.dtype.names is None:
44+
return headers
45+
46+
# Find field names that don't start with __MDIO_RAW_UNSPECIFIED_
47+
field_names = [name for name in headers.dtype.names
48+
if not name.startswith("__MDIO_RAW_UNSPECIFIED_")]
49+
50+
if len(field_names) == len(headers.dtype.names):
51+
# No raw unspecified fields found, return as-is
52+
return headers
53+
54+
# Create new structured array with only the non-raw fields
55+
new_dtype = [(name, headers.dtype.fields[name][0]) for name in field_names]
56+
filtered_headers = np.empty(headers.shape, dtype=new_dtype)
57+
58+
for name in field_names:
59+
filtered_headers[name] = headers[name]
60+
61+
return filtered_headers
62+
63+
3164
def make_segy_factory(spec: SegySpec, binary_header: dict[str, int]) -> SegyFactory:
3265
"""Generate SEG-Y factory from MDIO metadata."""
3366
sample_interval = binary_header["sample_interval"]
@@ -167,7 +200,9 @@ def serialize_to_segy_stack( # noqa: PLR0913
167200
samples = samples[live_mask]
168201
headers = headers[live_mask]
169202

170-
buffer = segy_factory.create_traces(headers, samples)
203+
# Filter out raw unspecified fields that cause dtype mismatches
204+
filtered_headers = _filter_raw_unspecified_fields(headers)
205+
buffer = segy_factory.create_traces(filtered_headers, samples)
171206

172207
global_index = block_start[0]
173208
record_id_str = str(global_index)
@@ -199,7 +234,9 @@ def serialize_to_segy_stack( # noqa: PLR0913
199234
rec_samples = samples[rec_index][rec_live_mask]
200235
rec_headers = headers[rec_index][rec_live_mask]
201236

202-
buffer = segy_factory.create_traces(rec_headers, rec_samples)
237+
# Filter out raw unspecified fields that cause dtype mismatches
238+
filtered_headers = _filter_raw_unspecified_fields(rec_headers)
239+
buffer = segy_factory.create_traces(filtered_headers, rec_samples)
203240

204241
global_index = tuple(block_start[i] + rec_index[i] for i in range(record_ndim))
205242
record_id_str = "/".join(map(str, global_index))

0 commit comments

Comments
 (0)