Skip to content

Commit f23280a

Browse files
authored
Merge pull request #633 from achaikou/inc_dec_test_files_creation
Python tests on increment.sgy and decrement.sgy
2 parents 2b3be75 + 5811b03 commit f23280a

7 files changed

Lines changed: 509 additions & 12 deletions

File tree

applications/CMakeLists.txt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,8 @@ add_custom_command(
130130
COMMAND segyio-catb ${long} > catb-long.out
131131
COMMAND segyio-catr -r 4 9 -t 12 ${small} > catr.out
132132
COMMAND segyio-catr -t 1 ${small} -n -d > catrnd.out
133+
COMMAND segyio-catr -t 2 ${increment} > catr-inc.out
134+
COMMAND segyio-catr -t 2 ${decrement} > catr-dec.out
133135
)
134136
add_custom_command(
135137
OUTPUT crop-ns.out crop-ns.sgy
@@ -165,6 +167,14 @@ add_test(NAME cath.output
165167
add_test(NAME catr.output
166168
COMMAND ${CMAKE_COMMAND} -E compare_files ${test}/catr.output catr.out
167169
)
170+
add_test(NAME catr-inc.output
171+
COMMAND ${CMAKE_COMMAND} -E compare_files ${test}/catr-inc.output
172+
catr-inc.out
173+
)
174+
add_test(NAME catr-dec.output
175+
COMMAND ${CMAKE_COMMAND} -E compare_files ${test}/catr-dec.output
176+
catr-dec.out
177+
)
168178
add_test(NAME catr.output.nd
169179
COMMAND ${CMAKE_COMMAND} -E compare_files ${test}/catrnd.output
170180
catrnd.out

applications/test/catr-dec.output

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
tracl 2147483647
2+
tracr 2147483645
3+
fldr 2147483643
4+
tracf 2147483641
5+
ep 2147483639
6+
cdp 2147483637
7+
cdpt 2147483635
8+
trid 32753
9+
nvs 32751
10+
nhs 32749
11+
duse 32747
12+
offset 2147483625
13+
gelev 2147483623
14+
selev 2147483621
15+
sdepth 2147483619
16+
gdel 2147483617
17+
sdel 2147483615
18+
swdep 2147483613
19+
gwdep 2147483611
20+
scalel 32729
21+
scalco 32727
22+
sx 2147483605
23+
sy 2147483603
24+
gx 2147483601
25+
gy 2147483599
26+
counit 32717
27+
wevel 32715
28+
swevel 32713
29+
sut 32711
30+
gut 32709
31+
sstat 32707
32+
gstat 32705
33+
tstat 32703
34+
laga 32701
35+
lagb 32699
36+
delrt 32697
37+
muts 32695
38+
mute 32693
39+
ns 65458
40+
dt 32689
41+
gain 32687
42+
igc 32685
43+
igi 32683
44+
corr 32681
45+
sfs 32679
46+
sfe 32677
47+
slen 32675
48+
styp 32673
49+
stat 32671
50+
stae 32669
51+
tatyp 32667
52+
afilf 32665
53+
afils 32663
54+
nofilf 32661
55+
nofils 32659
56+
lcf 32657
57+
hcf 32655
58+
lcs 32653
59+
hcs 32651
60+
year 32649
61+
day 32647
62+
hour 32645
63+
minute 32643
64+
sec 32641
65+
timbas 32639
66+
trwf 32637
67+
grnors 32635
68+
grnofr 32633
69+
grnlof 32631
70+
gaps 32629
71+
otrav 32627
72+
cdpx 2147483505
73+
cdpy 2147483503
74+
iline 2147483501
75+
xline 2147483499
76+
sp 2147483497
77+
scalsp 32615
78+
trunit 32613
79+
tdcm 2147483491
80+
tdcp 32609
81+
tdunit 32607
82+
triden 32605
83+
sctrh 32603
84+
stype 32601
85+
sedv 32599
86+
sedxl 32597
87+
sedil 32595
88+
smm 2147483473
89+
sme 32591
90+
smunit 32589
91+
uint1 2147483467
92+
uint2 2147483465

applications/test/catr-inc.output

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
tracl -2147483648
2+
tracr -2147483646
3+
fldr -2147483644
4+
tracf -2147483642
5+
ep -2147483640
6+
cdp -2147483638
7+
cdpt -2147483636
8+
trid -32754
9+
nvs -32752
10+
nhs -32750
11+
duse -32748
12+
offset -2147483626
13+
gelev -2147483624
14+
selev -2147483622
15+
sdepth -2147483620
16+
gdel -2147483618
17+
sdel -2147483616
18+
swdep -2147483614
19+
gwdep -2147483612
20+
scalel -32730
21+
scalco -32728
22+
sx -2147483606
23+
sy -2147483604
24+
gx -2147483602
25+
gy -2147483600
26+
counit -32718
27+
wevel -32716
28+
swevel -32714
29+
sut -32712
30+
gut -32710
31+
sstat -32708
32+
gstat -32706
33+
tstat -32704
34+
laga -32702
35+
lagb -32700
36+
delrt -32698
37+
muts -32696
38+
mute -32694
39+
ns 76
40+
dt -32690
41+
gain -32688
42+
igc -32686
43+
igi -32684
44+
corr -32682
45+
sfs -32680
46+
sfe -32678
47+
slen -32676
48+
styp -32674
49+
stat -32672
50+
stae -32670
51+
tatyp -32668
52+
afilf -32666
53+
afils -32664
54+
nofilf -32662
55+
nofils -32660
56+
lcf -32658
57+
hcf -32656
58+
lcs -32654
59+
hcs -32652
60+
year -32650
61+
day -32648
62+
hour -32646
63+
minute -32644
64+
sec -32642
65+
timbas -32640
66+
trwf -32638
67+
grnors -32636
68+
grnofr -32634
69+
grnlof -32632
70+
gaps -32630
71+
otrav -32628
72+
cdpx -2147483506
73+
cdpy -2147483504
74+
iline -2147483502
75+
xline -2147483500
76+
sp -2147483498
77+
scalsp -32616
78+
trunit -32614
79+
tdcm -2147483492
80+
tdcp -32610
81+
tdunit -32608
82+
triden -32606
83+
sctrh -32604
84+
stype -32602
85+
sedv -32600
86+
sedxl -32598
87+
sedil -32596
88+
smm -2147483474
89+
sme -32592
90+
smunit -32590
91+
uint1 -2147483468
92+
uint2 -2147483466
Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
import sys
2+
import numpy as np
3+
import segyio
4+
5+
# Purpose is to check that all fields behave correctly if set to values from the
6+
# range of largest, positive values (sign bit is 0) or of smallest, negative for
7+
# signed types values (sign bit is 1).
8+
#
9+
# Values in all integer fields are set using increasing or decreasing numbers
10+
# respecting the bounds of the field type (32-bit signed integer, 64-bit
11+
# unsigned integer, etc.). The first field is using the smallest allowed value
12+
# of its type, if numbers are increased, or the largest allowed value, if
13+
# numbers are decreased. See actual code for the details.
14+
15+
16+
def main():
17+
if len(sys.argv) < 3:
18+
sys.exit("Usage: {} [file] [type]".format(sys.argv[0]))
19+
20+
filename = sys.argv[1]
21+
type = sys.argv[2]
22+
23+
if type == 'inc':
24+
# negative values are increasing
25+
value_sign = -1
26+
diff_sign = 1
27+
elif type == 'dec':
28+
# positive values are decreasing
29+
value_sign = 1
30+
diff_sign = -1
31+
else:
32+
sys.exit("Type must be 'inc' for increase, 'dec' for decrease")
33+
34+
spec = segyio.spec()
35+
samples = 4
36+
spec.sorting = 2
37+
spec.format = segyio.SegySampleFormat.IBM_FLOAT_4_BYTE
38+
spec.samples = range(samples)
39+
spec.ilines = range(1)
40+
spec.xlines = range(5)
41+
42+
def calculate_value(field, field_size, diff):
43+
defaulted = [
44+
segyio.BinField.Unassigned1,
45+
segyio.BinField.Unassigned2,
46+
segyio.BinField.Format,
47+
]
48+
if field in defaulted:
49+
return None
50+
if field == segyio.BinField.ExtEnsembleTraces:
51+
return 5
52+
if field == segyio.BinField.ExtSamples:
53+
return samples
54+
if field == segyio.BinField.ExtendedHeaders:
55+
return 0
56+
57+
if field == segyio.BinField.ExtInterval:
58+
return 1125899906842594.0 * value_sign
59+
if field == segyio.BinField.ExtIntervalOriginal:
60+
return 1125899906842593.0 * value_sign
61+
62+
sizes = [1, 2, 4, 8]
63+
if field_size not in sizes:
64+
raise ValueError(
65+
"Unsupported field {} / field size {}".format(field, field_size))
66+
67+
unsigned = [
68+
segyio.BinField.Samples,
69+
segyio.BinField.SamplesOriginal,
70+
segyio.BinField.SEGYRevision,
71+
segyio.BinField.SEGYRevisionMinor,
72+
segyio.BinField.FirstTraceOffset,
73+
segyio.BinField.NrTracesInStream,
74+
segyio.TraceField.TRACE_SAMPLE_COUNT
75+
]
76+
if value_sign < 0:
77+
if field in unsigned:
78+
# negative values can't happen, calculations go from 0 and up
79+
base = 0
80+
else:
81+
# in 2-complements notation lowest value is binary 1000...0000 = 0x8000...0000
82+
base = 2 ** (field_size * 8 - 1)
83+
else:
84+
if field in unsigned:
85+
# all bits can be used to represent number
86+
base = 2 ** (field_size * 8) - 1
87+
88+
# note: logic slip in the current implementation
89+
inconsistent = [
90+
segyio.BinField.Samples,
91+
segyio.BinField.SamplesOriginal,
92+
segyio.BinField.SEGYRevision,
93+
segyio.BinField.SEGYRevisionMinor,
94+
segyio.TraceField.TRACE_SAMPLE_COUNT,
95+
]
96+
if field in inconsistent:
97+
base = base - 1
98+
else:
99+
# highest bit is reserved for sign
100+
base = 2 ** (field_size * 8 - 1) - 1
101+
102+
return base * value_sign + diff * diff_sign
103+
104+
def calculate_header(header_dict, header_field_offsets, value_diff_step):
105+
prev_field = None
106+
value_diff = 0
107+
for field in header_field_offsets:
108+
if prev_field:
109+
field_size = field - prev_field
110+
value = calculate_value(prev_field, field_size, value_diff)
111+
if value is not None:
112+
header_dict.update({prev_field: value})
113+
value_diff += value_diff_step
114+
prev_field = field
115+
116+
binheader = {}
117+
binvalues = [int(field) for field in segyio.BinField.enums()]
118+
binvalues.append(3601)
119+
calculate_header(binheader, binvalues, 1)
120+
121+
with segyio.create(filename, spec) as f:
122+
tracevalues = [int(field) for field in segyio.TraceField.enums()]
123+
tracevalues.append(241)
124+
tr = 0
125+
for _ in spec.ilines:
126+
for _ in spec.xlines:
127+
traceheader = {}
128+
calculate_header(traceheader, tracevalues, tr + 1)
129+
130+
f.header[tr] = traceheader
131+
f.trace[tr] = np.zeros(samples, dtype=np.single)
132+
tr += 1
133+
134+
f.bin = binheader
135+
f.text[0] = ""
136+
137+
138+
if __name__ == '__main__':
139+
main()

0 commit comments

Comments
 (0)