1
1
from abc import ABC , abstractmethod
2
+ from unittest import result
2
3
import segyio
3
4
import numpy as np
4
5
import random
@@ -47,19 +48,21 @@ def get_sample_rate(self):
47
48
48
49
@abstractmethod
49
50
def get_vm (self ):
50
- return self .vm
51
-
52
-
51
+ pass
53
52
54
53
class SegyIO3D (SeismicData ):
55
54
56
55
def __init__ (self , file_name , iline_byte = 189 , xline_byte = 193 ):
56
+ super ().__init__ ()
57
57
self ._segyfile = segyio .open (file_name , iline = int (iline_byte ), xline = int (xline_byte ))
58
58
59
59
# get statistics for visualization
60
60
n_slices = 10
61
61
seis = [self .get_iline (random .randint (0 , self .get_n_ilines ()- 1 )) for i in range (n_slices )]
62
62
self .vm = np .percentile (seis , 95 )
63
+ self .file_name = file_name
64
+ self .iline_byte = iline_byte
65
+ self .xline_byte = xline_byte
63
66
64
67
def __del__ (self ):
65
68
self ._segyfile .close ()
@@ -93,9 +96,43 @@ def get_sample_rate(self):
93
96
def get_vm (self ):
94
97
return self .vm
95
98
99
+ def get_file_name (self ):
100
+ return self .file_name
101
+
102
+ def cropped_numpy (self , min_il , max_il , min_xl , max_xl , min_z , max_z ):
103
+ """ Reads cropped seismic and returns numpy array
104
+
105
+ Args:
106
+ min_il (_type_): min inline
107
+ max_il (_type_): max inline
108
+ min_xl (_type_): min crossline
109
+ max_xl (_type_): max crossline
110
+ min_z (_type_): min timeslice
111
+ max_z (_type_): max timeslice
112
+ """
113
+ assert max_il > min_il , f"max_il must be greater than { min_il } , got: { max_il } "
114
+ assert max_xl > min_xl , f"max_il must be greater than { min_xl } , got: { max_xl } "
115
+ assert max_z > min_z , f"max_il must be greater than { min_z } , got: { max_z } "
116
+
117
+ return np .array ([self .get_iline (i )[min_xl :max_xl , min_z :max_z ] for i in range (min_il , max_il )])
118
+
119
+ def get_xline_byte (self ):
120
+ return self .xline_byte
121
+
122
+ def get_iline_byte (self ):
123
+ return self .iline_byte
124
+
125
+ def get_str_format (self ):
126
+ return "SEGY"
127
+
128
+ def get_str_dim (self ):
129
+ return "2D"
130
+
131
+
96
132
class SegyIO2D (SeismicData ):
97
133
98
134
def __init__ (self , file_name ):
135
+ super ().__init__ ()
99
136
seismic_type = "2D"
100
137
try :
101
138
with segyio .open (file_name , strict = True ) as segyfile :
@@ -108,10 +145,15 @@ def __init__(self, file_name):
108
145
self ._data = np .stack (list ((_ .copy () for _ in segyfile .trace [:])))
109
146
self ._dt = segyio .tools .dt (segyfile )
110
147
self .vm = np .percentile (self ._data , 95 )
148
+ self .file_name = file_name
149
+
111
150
112
151
def __del__ (self ):
113
152
pass
114
153
154
+ def get_file_name (self ):
155
+ return self .file_name
156
+
115
157
def get_iline (self ):
116
158
return self ._data .T
117
159
@@ -124,11 +166,11 @@ def get_zslice(self,):
124
166
125
167
# get total number of ilines
126
168
def get_n_ilines (self ):
127
- return self . _data . shape [ 0 ]
169
+ pass
128
170
129
171
# get total number of xlines
130
172
def get_n_xlines (self ):
131
- pass
173
+ return self . _data . shape [ 0 ]
132
174
133
175
# get total number of zslices
134
176
def get_n_zslices (self ):
@@ -144,10 +186,24 @@ def make_axis_devisable_by(self, factor):
144
186
xlim = self ._data .shape [0 ]// int (factor )* int (factor )
145
187
ylim = self ._data .shape [1 ]// int (factor )* int (factor )
146
188
self ._data = self ._data [:xlim , :ylim ]
189
+
190
+ def get_xline_byte (self ):
191
+ return self .xline_byte
192
+
193
+ def get_iline_byte (self ):
194
+ return self .iline_byte
195
+
196
+ def get_str_format (self ):
197
+ return "SEGY"
198
+
199
+ def get_str_dim (self ):
200
+ return "2D"
201
+
147
202
148
203
class Numpy2D (SeismicData ):
149
204
150
205
def __init__ (self , file_name ):
206
+ super ().__init__ ()
151
207
self ._data = np .load (file_name )
152
208
153
209
# get statistics for visualization
@@ -167,11 +223,11 @@ def get_zslice(self):
167
223
pass
168
224
169
225
def get_n_ilines (self ):
170
- return self . _data . shape [ 0 ]
226
+ pass
171
227
172
228
# get total number of xlines
173
229
def get_n_xlines (self ):
174
- pass
230
+ return self . _data . shape [ 0 ]
175
231
176
232
def get_n_zslices (self ):
177
233
return self ._data .shape [1 ]
@@ -185,4 +241,67 @@ def get_vm(self):
185
241
def make_axis_devisable_by (self , factor ):
186
242
xlim = self ._data .shape [0 ]// int (factor )* int (factor )
187
243
ylim = self ._data .shape [1 ]// int (factor )* int (factor )
188
- self ._data = self ._data [:xlim , :ylim ]
244
+ self ._data = self ._data [:xlim , :ylim ]
245
+
246
+ def get_str_format (self ):
247
+ return "NUMPY"
248
+
249
+ def get_str_dim (self ):
250
+ return "2D"
251
+
252
+ class Numpy3D (SeismicData ):
253
+
254
+ def __init__ (self , data ):
255
+ super ().__init__ ()
256
+ if isinstance (data , str ):
257
+ self ._data = np .load (data )
258
+ elif isinstance (data , np .ndarray ):
259
+ self ._data = data
260
+
261
+ # get statistics for visualization
262
+ if self ._data is not None :
263
+ n_slices = 10
264
+ seis = [self .get_iline (random .randint (0 , self .get_n_ilines ()- 1 )) for i in range (n_slices )]
265
+ self .vm = np .percentile (seis , 95 )
266
+
267
+ def __del__ (self ):
268
+ pass
269
+
270
+ def get_iline (self , indx ):
271
+ return self ._data [indx ,:,:]
272
+
273
+ def get_xline (self , indx ):
274
+ return self ._data [:,indx ,:]
275
+
276
+ def get_zslice (self , indx ):
277
+ return self ._data [:,:,indx ]
278
+
279
+ def get_n_ilines (self ):
280
+ return self ._data .shape [0 ]
281
+
282
+ # get total number of xlines
283
+ def get_n_xlines (self ):
284
+ return self ._data .shape [1 ]
285
+
286
+ def get_n_zslices (self ):
287
+ return self ._data .shape [2 ]
288
+
289
+ def get_sample_rate (self ):
290
+ return 1000
291
+
292
+ def get_vm (self ):
293
+ return self .vm
294
+
295
+ def get_cube (self ):
296
+ return self ._data
297
+
298
+ def make_axis_devisable_by (self , factor ):
299
+ xlim = self ._data .shape [0 ]// int (factor )* int (factor )
300
+ ylim = self ._data .shape [1 ]// int (factor )* int (factor )
301
+ self ._data = self ._data [:xlim , :ylim , :]
302
+
303
+ def get_str_format (self ):
304
+ return "NUMPY"
305
+
306
+ def get_str_dim (self ):
307
+ return "3D"
0 commit comments