1313from mdio import segy_to_mdio
1414
1515
16+ # Constants
1617MDIO_VERSIONS = ["0.7.4" , "0.8.3" ]
1718SEGY_REVISIONS = [0.0 , 0.1 , 1.0 , 1.1 ]
1819INLINES = (10 , 10 , 11 , 11 )
1920CROSSLINES = (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