Skip to content

Commit 71e6f5b

Browse files
committed
Refactor MDIO version 0.7.4 metadata update logic.
1 parent feaf07f commit 71e6f5b

File tree

1 file changed

+43
-37
lines changed

1 file changed

+43
-37
lines changed

tests/unit/test_compat.py

Lines changed: 43 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,35 @@
1313
from mdio import segy_to_mdio
1414

1515

16+
# Constants
1617
MDIO_VERSIONS = ["0.7.4", "0.8.3"]
1718
SEGY_REVISIONS = [0.0, 0.1, 1.0, 1.1]
1819
INLINES = (10, 10, 11, 11)
1920
CROSSLINES = (100, 101, 100, 101)
21+
INDEX_BYTES = (189, 193)
22+
API_VERSION_KEY = "api_version"
23+
BINARY_HEADER_KEY = "binary_header"
24+
CHUNKED_TRACE_HEADERS_KEY = "chunked_012_trace_headers"
25+
26+
27+
def update_mdio_for_version_0_7_4(root):
28+
"""Update MDIO metadata to mimic version 0.7.4."""
29+
# Update binary header revision keys
30+
bin_hdr = root.metadata.attrs[BINARY_HEADER_KEY]
31+
bin_hdr["SEGYRevision"] = bin_hdr.pop("segy_revision_major")
32+
bin_hdr["SEGYRevisionMinor"] = bin_hdr.pop("segy_revision_minor")
33+
root.metadata.attrs[BINARY_HEADER_KEY] = bin_hdr
34+
35+
# Remove trace headers past field 232 (pre-0.8 schema)
36+
orig_hdr = root.metadata[CHUNKED_TRACE_HEADERS_KEY]
37+
new_dtype = np.dtype(orig_hdr.dtype.descr[:-1])
38+
new_hdr = zarr.zeros_like(orig_hdr, dtype=new_dtype)
39+
root.metadata.create_dataset(
40+
CHUNKED_TRACE_HEADERS_KEY,
41+
data=new_hdr,
42+
overwrite=True,
43+
)
44+
zarr.consolidate_metadata(root.store)
2045

2146

2247
@pytest.mark.parametrize("mdio_version", MDIO_VERSIONS)
@@ -32,18 +57,17 @@ def test_revision_encode_decode(
3257
(de)serialized correctly.
3358
"""
3459
rev1_spec = get_segy_standard(1.0)
35-
36-
sgy_filename = tmp_path / "sgy"
37-
mdio_filename = tmp_path / "mdio"
38-
sgy_rt_filename = tmp_path / "{rt.sgy"
60+
segy_filename = tmp_path / "segy_input.sgy"
61+
mdio_output_filename = tmp_path / "output.mdio"
62+
roundtrip_sgy_filename = tmp_path / "roundtrip_output.sgy"
3963

4064
# Make a rev1 segy
4165
factory = SegyFactory(rev1_spec, sample_interval=1000, samples_per_trace=5)
4266

4367
# We will replace the values in revision fields with these
4468
minor, major = np.modf(segy_revision)
45-
minor = int(minor * 10)
46-
major = int(major)
69+
major, minor = int(major), int(minor * 10)
70+
revision_code = (major << 8) | minor
4771

4872
# Make fake tiny 3D dataset
4973
txt_buffer = factory.create_textual_header()
@@ -56,47 +80,29 @@ def test_revision_encode_decode(
5680
trace_buffer = factory.create_traces(header, data)
5781

5882
# Update revision during bin hdr creation
59-
revision_code = major << 8 | minor
6083
bin_hdr_buffer = factory.create_binary_header(
6184
update={"segy_revision": revision_code}
6285
)
63-
with open(sgy_filename, mode="wb") as fp:
86+
with open(segy_filename, mode="wb") as fp:
6487
fp.write(txt_buffer)
6588
fp.write(bin_hdr_buffer)
6689
fp.write(trace_buffer)
6790

68-
# Convert
69-
segy_to_mdio(str(sgy_filename), str(mdio_filename), index_bytes=(189, 193))
70-
71-
# Modify MDIO to mimic +/- 0.8
72-
root = zarr.open_group(mdio_filename, mode="r+")
73-
root.attrs["api_version"] = mdio_version
91+
# Convert SEG-Y to MDIO
92+
segy_to_mdio(str(segy_filename), str(mdio_output_filename), index_bytes=INDEX_BYTES)
7493

94+
# Modify MDIO for specific versions
95+
root = zarr.open_group(mdio_output_filename, mode="r+")
96+
root.attrs[API_VERSION_KEY] = mdio_version
7597
if mdio_version == "0.7.4":
76-
# Update bin hdr revision keys
77-
bin_hdr = root.metadata.attrs["binary_header"]
78-
bin_hdr["SEGYRevision"] = bin_hdr.pop("segy_revision_major")
79-
bin_hdr["SEGYRevisionMinor"] = bin_hdr.pop("segy_revision_minor")
80-
root.metadata.attrs["binary_header"] = bin_hdr
81-
82-
# Remove trace headers past 232 (pre 0.8)
83-
orig_hdr = root.metadata.chunked_012_trace_headers
84-
new_dtype = np.dtype(orig_hdr.dtype.descr[:-1])
85-
new_hdr = zarr.zeros_like(orig_hdr, dtype=new_dtype)
86-
root.metadata.create_dataset(
87-
"chunked_012_trace_headers",
88-
data=new_hdr,
89-
overwrite=True,
90-
)
91-
zarr.consolidate_metadata(root.store)
92-
93-
# Back to SEG-Y
94-
mdio_to_segy(str(mdio_filename), str(sgy_rt_filename))
95-
96-
# Assert if binary headers match and revisions are correct
97-
orig = SegyFile(sgy_filename, spec=rev1_spec)
98-
rt = SegyFile(sgy_rt_filename, spec=rev1_spec)
98+
update_mdio_for_version_0_7_4(root)
99+
100+
# Convert MDIO back to SEG-Y
101+
mdio_to_segy(str(mdio_output_filename), str(roundtrip_sgy_filename))
99102

103+
# Assert binary headers and revisions match
104+
orig = SegyFile(segy_filename, spec=rev1_spec)
105+
rt = SegyFile(roundtrip_sgy_filename, spec=rev1_spec)
100106
assert orig.binary_header["segy_revision_major"] == major
101107
assert orig.binary_header["segy_revision_minor"] == minor
102108
assert orig.binary_header == rt.binary_header

0 commit comments

Comments
 (0)