@@ -1079,6 +1079,19 @@ def test_traces_traceheaders(small):
10791079 assert f .traceheader [2 ][i ] == f .traceheader [f .tracecount - 3 ][i ]
10801080
10811081
1082+ def test_traceheader_attributes (small ):
1083+ with segyio .open (small , "r" ) as f :
1084+ attrs = f .attributes (f .tracefield .SEG00000 .xline .offset ())
1085+ assert len (attrs ) == f .tracecount
1086+ assert np .array_equal (list (attrs ), [20 , 21 , 22 , 23 , 24 ] * 5 )
1087+
1088+ assert np .array_equal (f .tracefield .SEG00000 .xline [:], attrs )
1089+ assert np .array_equal (f .tracefield .SEG00000 .xline [0 :5 ], attrs [0 :5 ])
1090+ assert np .array_equal (f .tracefield .SEG00000 .xline [0 , 5 , 11 , 12 ], attrs [0 , 5 , 11 , 12 ])
1091+
1092+ assert f .tracefield .SEG00000 .xline [0 ] == 20
1093+
1094+
10821095def test_depricated_fields (small ):
10831096 with segyio .open (small , "r" ) as f :
10841097 assert f .bin [BinField .EnsembleTraces ] == 25
@@ -2487,7 +2500,7 @@ class HeaderTest:
24872500 opened : numbers .Real
24882501 changed : numbers .Real
24892502
2490- trace0_ext_header1_cases = [
2503+ trace0_proprietary_cases = [
24912504 HeaderTest ("int2" , 1 , - 101 ),
24922505 HeaderTest ("int4" , 2 , - 102 ),
24932506 HeaderTest ("int8" , 3 , - 103 ),
@@ -2512,7 +2525,7 @@ class HeaderTest:
25122525 HeaderTest ("header_name" , b"TYPES\x00 \x00 \x00 " , b"TYPES " ),
25132526 ]
25142527
2515- trace1_ext_header1_cases = [
2528+ trace1_proprietary_cases = [
25162529 HeaderTest ("int2" , - 1001 , 10001 ),
25172530 HeaderTest ("int4" , - 1002 , 2000002 ),
25182531 HeaderTest ("int8" , - 1003 , 3000000003 ),
@@ -2537,65 +2550,35 @@ class HeaderTest:
25372550 ]
25382551
25392552 headers = {
2540- 0 : trace0_ext_header1_cases ,
2541- 1 : trace1_ext_header1_cases ,
2553+ 0 : trace0_proprietary_cases ,
2554+ 1 : trace1_proprietary_cases ,
25422555 }
25432556
25442557 traceheader_index = 1
25452558
2546- # all internal calls are temporary!
2547- # they would be exchanged with proper ones once python interface is in place
25482559 with segyio .open (tmpdir / filename , mode = 'r+' , endian = endianness ) as f :
2549- def mkempty ():
2550- return bytearray (240 )
2551-
2552- types_layout = f ._traceheader_layouts ["TYPES" ]
2560+ types = f .tracefield [traceheader_index ]
25532561 for trace_index , header_cases in headers .items ():
25542562 for case in header_cases :
2555- offset = types_layout . entry_by_name (case .name ).byte
2563+ offset = types . __getattr__ (case .name ).offset ()
25562564
2557- # assert f.traceheader[trace_index][traceheader_index][offset] == case.opened
2558- traceheader = f .segyfd .getth (
2559- trace_index , traceheader_index , mkempty ())
2560- assert f .segyfd .getfield (
2561- traceheader , traceheader_index , offset ) == case .opened
2562-
2563- # f.traceheader[trace_index][traceheader_index][offset] = case.changed
2564- f .segyfd .putfield (
2565- traceheader , traceheader_index , offset , case .changed )
2566- f .segyfd .putth (trace_index , traceheader_index , traceheader )
2567-
2568- # assert f.traceheader[trace_index][traceheader_index][offset] == case.changed
2569- traceheader = f .segyfd .getth (
2570- trace_index , traceheader_index , mkempty ())
2571- assert f .segyfd .getfield (
2572- traceheader , traceheader_index , offset ) == case .changed
2565+ assert f .traceheader [trace_index ][traceheader_index ][offset ] == case .opened
2566+ f .traceheader [trace_index ][traceheader_index ][offset ] = case .changed
2567+ assert f .traceheader [trace_index ][traceheader_index ][offset ] == case .changed
25732568
25742569 with pytest .raises (ValueError , match = r"Value out of range*" ):
2575- offset = types_layout .entry_by_name ("int2" ).byte
2576-
2577- # f.traceheader[trace_index][traceheader_index][offset] = 50000
2578- f .segyfd .putfield (traceheader , traceheader_index , offset , 50000 )
2570+ offset = types .int2 .offset ()
2571+ f .traceheader [trace_index ][traceheader_index ][offset ] = 50000
25792572
2580- from segyio .trace import Attributes
2581- for i , case in enumerate (trace0_ext_header1_cases ):
2573+ for i , case in enumerate (trace0_proprietary_cases ):
25822574 if (case .name == "scale6_mant" ) or (case .name == "scale6_exp" ):
25832575 # scale6 is not properly supported yet
25842576 continue
25852577
2586- if case .name == "header_name" :
2587- type = "string8"
2588- else :
2589- type = case .name
2590-
2591- offset = types_layout .entry_by_name (case .name ).byte
25922578 expected = np .array (
2593- [trace0_ext_header1_cases [i ].changed , trace1_ext_header1_cases [i ].changed ])
2594-
2595- # attrs = f.attributes(offset, traceheader_index)
2596- attrs = np .empty (2 , dtype = Attributes .ENTRY_TYPE_TO_NUMPY [type ])
2597- f .segyfd .field_forall (attrs , traceheader_index , 0 , 2 , 1 , offset )
2579+ [trace0_proprietary_cases [i ].changed , trace1_proprietary_cases [i ].changed ])
25982580
2581+ attrs = types .__getattr__ (case .name )[:]
25992582 np .testing .assert_array_equal (attrs , expected )
26002583
26012584
0 commit comments