1
|
|
|
import os, sys; sys.path.insert(0, os.path.dirname(os.path.dirname(__file__))) |
2
|
|
|
|
3
|
|
|
import pytest |
4
|
|
|
|
5
|
|
|
from lasio import read, ExcelConverter |
6
|
|
|
from lasio.las import StringIO |
7
|
|
|
|
8
|
|
|
test_dir = os.path.dirname(__file__) |
9
|
|
|
|
10
|
|
|
egfn = lambda fn: os.path.join(os.path.dirname(__file__), "examples", fn) |
11
|
|
|
|
12
|
|
|
|
13
|
|
|
def test_write_sect_widths_12(): |
14
|
|
|
l = read(egfn("sample_write_sect_widths_12.las")) |
15
|
|
|
s = StringIO() |
16
|
|
|
l.write(s, version=1.2) |
17
|
|
|
s.seek(0) |
18
|
|
|
assert s.read() == """~Version --------------------------------------------------- |
19
|
|
|
VERS. 1.2 : CWLS LOG ASCII STANDARD - VERSION 1.2 |
20
|
|
|
WRAP. NO : ONE LINE PER DEPTH STEP |
21
|
|
|
~Well ------------------------------------------------------ |
22
|
|
|
STRT .M 1670.0 : |
23
|
|
|
STOP .M 1669.75 : |
24
|
|
|
STEP .M -0.125 : |
25
|
|
|
NULL . -999.25 : |
26
|
|
|
COMPANY. COMPANY : # ANY OIL COMPANY LTD. |
27
|
|
|
WELL . WELL : ANY ET AL OIL WELL #12 |
28
|
|
|
FLD . FIELD : EDAM |
29
|
|
|
LOC . LOCATION : A9-16-49-20W3M |
30
|
|
|
PROV . PROVINCE : SASKATCHEWAN |
31
|
|
|
SRVC . SERVICE : The company that did this logging has a very very long name.... |
32
|
|
|
DATE . LOG DATE : 25-DEC-1988 |
33
|
|
|
UWI . WELL ID : 100091604920W300 |
34
|
|
|
~Curves ---------------------------------------------------- |
35
|
|
|
D.M : 1 DEPTH |
36
|
|
|
A.US/M : 2 SONIC TRANSIT TIME |
37
|
|
|
B.K/M3 : 3 BULK DENSITY |
38
|
|
|
C.V/V : 4 NEUTRON POROSITY |
39
|
|
|
~Params ---------------------------------------------------- |
40
|
|
|
BHT .DEGC 35.5 : BOTTOM HOLE TEMPERATURE |
41
|
|
|
BS .MM 200.0 : BIT SIZE |
42
|
|
|
FD .K/M3 1000.0 : FLUID DENSITY |
43
|
|
|
MATR. 0.0 : NEUTRON MATRIX(0=LIME,1=SAND,2=DOLO) |
44
|
|
|
MDEN. 2710.0 : LOGGING MATRIX DENSITY |
45
|
|
|
RMF .OHMM 0.216 : MUD FILTRATE RESISTIVITY |
46
|
|
|
DFD .K/M3 1525.0 : DRILL FLUID DENSITY |
47
|
|
|
~Other ----------------------------------------------------- |
48
|
|
|
Note: The logging tools became stuck at 625 meters causing the data |
49
|
|
|
between 625 meters and 615 meters to be invalid. |
50
|
|
|
~ASCII ----------------------------------------------------- |
51
|
|
|
1670 123.45 2550 0.45 |
52
|
|
|
1669.9 123.45 2550 0.45 |
53
|
|
|
1669.8 123.45 2550 0.45 |
54
|
|
|
""" |
55
|
|
|
|
56
|
|
|
|
57
|
|
|
def test_write_sect_widths_12_curves(): |
58
|
|
|
l = read(egfn("sample_write_sect_widths_12.las")) |
59
|
|
|
s = StringIO() |
60
|
|
|
l.write(s, version=1.2) |
61
|
|
|
for start in ("D.M ", "A.US/M ", "B.K/M3 ", "C.V/V "): |
62
|
|
|
s.seek(0) |
63
|
|
|
assert "\n" + start in s.read() |
64
|
|
|
|
65
|
|
|
|
66
|
|
|
def test_write_sect_widths_20_narrow(): |
67
|
|
|
l = read(egfn("sample_write_sect_widths_20_narrow.las")) |
68
|
|
|
s = StringIO() |
69
|
|
|
l.write(s, version=2) |
70
|
|
|
s.seek(0) |
71
|
|
|
assert s.read() == """~Version --------------------------------------------------- |
72
|
|
|
VERS. 2.0 : CWLS log ASCII Standard -VERSION 2.0 |
73
|
|
|
WRAP. NO : ONE LINE PER DEPTH STEP |
74
|
|
|
~Well ------------------------------------------------------ |
75
|
|
|
STRT.M 1670.0 : START DEPTH |
76
|
|
|
STOP.M 1669.75 : STOP DEPTH |
77
|
|
|
STEP.M -0.125 : STEP |
78
|
|
|
NULL. -999.25 : NULL VALUE |
79
|
|
|
COMP. ANY : COMPANY |
80
|
|
|
WELL. AAAAA_2 : WELL |
81
|
|
|
FLD . WILDCAT : FIELD |
82
|
|
|
LOC . 12 : LOCATION |
83
|
|
|
PROV. ALBERTA : PROVINCE |
84
|
|
|
SRVC. LOGGING : SERVICE COMPANY ARE YOU KIDDING THIS IS A REALLY REALLY LONG STRING |
85
|
|
|
DATE. 13-DEC-86 : LOG DATE |
86
|
|
|
UWI . 10012340 : UNIQUE WELL ID |
87
|
|
|
~Curves ---------------------------------------------------- |
88
|
|
|
DEPT.M : 1 DEPTH |
89
|
|
|
DT .US/M 60 520 32 00 : 2 SONIC TRANSIT TIME |
90
|
|
|
RHOB.K/M3 45 350 01 00 : 3 BULK DENSITY |
91
|
|
|
NPHI.V/V 42 890 00 00 : 4 NEUTRON POROSITY |
92
|
|
|
SFLU.OHMM 07 220 04 00 : 5 SHALLOW RESISTIVITY |
93
|
|
|
SFLA.OHMM 07 222 01 00 : 6 SHALLOW RESISTIVITY |
94
|
|
|
ILM .OHMM 07 120 44 00 : 7 MEDIUM RESISTIVITY |
95
|
|
|
ILD .OHMM 07 120 46 00 : 8 DEEP RESISTIVITY |
96
|
|
|
~Params ---------------------------------------------------- |
97
|
|
|
MUD . GEL CHEM : MUD TYPE |
98
|
|
|
BHT .DEGC 35.5 : BOTTOM HOLE TEMPERATURE |
99
|
|
|
BS .MM 200.0 : BIT SIZE |
100
|
|
|
FD .K/M3 1000.0 : FLUID DENSITY |
101
|
|
|
MATR. SAND : NEUTRON MATRIX |
102
|
|
|
MDEN. 2710.0 : LOGGING MATRIX DENSITY |
103
|
|
|
RMF .OHMM 0.216 : MUD FILTRATE RESISTIVITY |
104
|
|
|
DFD .K/M3 1525.0 : DRILL FLUID DENSITY |
105
|
|
|
~Other ----------------------------------------------------- |
106
|
|
|
Note: The logging tools became stuck at 625 metres causing the data |
107
|
|
|
between 625 metres and 615 metres to be invalid. |
108
|
|
|
~ASCII ----------------------------------------------------- |
109
|
|
|
1670 123.45 2550 0.45 123.45 123.45 110.2 105.6 |
110
|
|
|
1669.9 123.45 2550 0.45 123.45 123.45 110.2 105.6 |
111
|
|
|
1669.8 123.45 2550 0.45 123.45 123.45 110.2 105.6 |
112
|
|
|
""" |
113
|
|
|
|
114
|
|
|
|
115
|
|
|
def test_write_sect_widths_20_wide(): |
116
|
|
|
l = read(egfn("sample_write_sect_widths_20_wide.las")) |
117
|
|
|
s = StringIO() |
118
|
|
|
l.write(s, version=2) |
119
|
|
|
s.seek(0) |
120
|
|
|
assert s.read() == """~Version --------------------------------------------------- |
121
|
|
|
VERS. 2.0 : CWLS log ASCII Standard -VERSION 2.0 |
122
|
|
|
WRAP. NO : ONE LINE PER DEPTH STEP |
123
|
|
|
~Well ------------------------------------------------------ |
124
|
|
|
STRT.M 1670.0 : START DEPTH |
125
|
|
|
STOP.M 1669.75 : STOP DEPTH |
126
|
|
|
STEP.M -0.125 : STEP |
127
|
|
|
NULL. -999.25 : NULL VALUE |
128
|
|
|
COMP. ANY OIL COMPANY INC. : COMPANY |
129
|
|
|
WELL. AAAAA_2 : WELL |
130
|
|
|
FLD . WILDCAT : FIELD |
131
|
|
|
LOC . 12-34-12-34W5M : LOCATION |
132
|
|
|
PROV. ALBERTA : PROVINCE |
133
|
|
|
SRVC. The company that did this logging has a very very long name.... : SERVICE COMPANY |
134
|
|
|
DATE. 13-DEC-86 : LOG DATE |
135
|
|
|
UWI . 100123401234W500 : UNIQUE WELL ID |
136
|
|
|
~Curves ---------------------------------------------------- |
137
|
|
|
DEPT.M : 1 DEPTH |
138
|
|
|
DT .US/M 60 520 32 00 : 2 SONIC TRANSIT TIME |
139
|
|
|
RHOB.K/M3 45 350 01 00 : 3 BULK DENSITY |
140
|
|
|
NPHI.V/V 42 890 00 00 : 4 NEUTRON POROSITY |
141
|
|
|
SFLU.OHMM 07 220 04 00 : 5 SHALLOW RESISTIVITY |
142
|
|
|
SFLA.OHMM 07 222 01 00 : 6 SHALLOW RESISTIVITY |
143
|
|
|
ILM .OHMM 07 120 44 00 : 7 MEDIUM RESISTIVITY |
144
|
|
|
ILD .OHMM 07 120 46 00 : 8 DEEP RESISTIVITY |
145
|
|
|
~Params ---------------------------------------------------- |
146
|
|
|
MUD . GEL CHEM : MUD TYPE |
147
|
|
|
BHT .DEGC 35.5 : BOTTOM HOLE TEMPERATURE |
148
|
|
|
BS .MM 200.0 : BIT SIZE |
149
|
|
|
FD .K/M3 1000.0 : FLUID DENSITY |
150
|
|
|
MATR. SAND : NEUTRON MATRIX |
151
|
|
|
MDEN. 2710.0 : LOGGING MATRIX DENSITY |
152
|
|
|
RMF .OHMM 0.216 : MUD FILTRATE RESISTIVITY |
153
|
|
|
DFD .K/M3 1525.0 : DRILL FLUID DENSITY |
154
|
|
|
~Other ----------------------------------------------------- |
155
|
|
|
Note: The logging tools became stuck at 625 metres causing the data |
156
|
|
|
between 625 metres and 615 metres to be invalid. |
157
|
|
|
~ASCII ----------------------------------------------------- |
158
|
|
|
1670 123.45 2550 0.45 123.45 123.45 110.2 105.6 |
159
|
|
|
1669.9 123.45 2550 0.45 123.45 123.45 110.2 105.6 |
160
|
|
|
1669.8 123.45 2550 0.45 123.45 123.45 110.2 105.6 |
161
|
|
|
""" |
162
|
|
|
|
163
|
|
|
def test_write_sample_empty_params(): |
164
|
|
|
l = read(egfn("sample_write_empty_params.las")) |
165
|
|
|
l.write(StringIO(), version=2) |
166
|
|
|
|
167
|
|
|
def test_df_curve_addition_on_export(): |
168
|
|
|
l = read(egfn("sample.las"), use_pandas=True) |
169
|
|
|
l.df["ILD_COND"] = 1000 / l.df.ILD |
170
|
|
|
s = StringIO() |
171
|
|
|
l.write(s, version=2, wrap=False, fmt="%.5f") |
172
|
|
|
s.seek(0) |
173
|
|
|
assert s.read() == """~Version --------------------------------------------------- |
174
|
|
|
VERS. 2.0 : CWLS log ASCII Standard -VERSION 2.0 |
175
|
|
|
WRAP. NO : One line per depth step |
176
|
|
|
~Well ------------------------------------------------------ |
177
|
|
|
STRT.M 1670.0 : |
178
|
|
|
STOP.M 1669.75 : |
179
|
|
|
STEP.M -0.125 : |
180
|
|
|
NULL. -999.25 : |
181
|
|
|
COMP. # ANY OIL COMPANY LTD. : COMPANY |
182
|
|
|
WELL. ANY ET AL OIL WELL #12 : WELL |
183
|
|
|
FLD . EDAM : FIELD |
184
|
|
|
LOC . A9-16-49-20W3M : LOCATION |
185
|
|
|
PROV. SASKATCHEWAN : PROVINCE |
186
|
|
|
SRVC. ANY LOGGING COMPANY LTD. : SERVICE COMPANY |
187
|
|
|
DATE. 25-DEC-1988 : LOG DATE |
188
|
|
|
UWI . 100091604920W300 : UNIQUE WELL ID |
189
|
|
|
~Curves ---------------------------------------------------- |
190
|
|
|
DEPT .M : 1 DEPTH |
191
|
|
|
DT .US/M : 2 SONIC TRANSIT TIME |
192
|
|
|
RHOB .K/M3 : 3 BULK DENSITY |
193
|
|
|
NPHI .V/V : 4 NEUTRON POROSITY |
194
|
|
|
SFLU .OHMM : 5 RXO RESISTIVITY |
195
|
|
|
SFLA .OHMM : 6 SHALLOW RESISTIVITY |
196
|
|
|
ILM .OHMM : 7 MEDIUM RESISTIVITY |
197
|
|
|
ILD .OHMM : 8 DEEP RESISTIVITY |
198
|
|
|
ILD_COND. : |
199
|
|
|
~Params ---------------------------------------------------- |
200
|
|
|
BHT .DEGC 35.5 : BOTTOM HOLE TEMPERATURE |
201
|
|
|
BS .MM 200.0 : BIT SIZE |
202
|
|
|
FD .K/M3 1000.0 : FLUID DENSITY |
203
|
|
|
MATR. 0.0 : NEUTRON MATRIX(0=LIME,1=SAND,2=DOLO) |
204
|
|
|
MDEN. 2710.0 : LOGGING MATRIX DENSITY |
205
|
|
|
RMF .OHMM 0.216 : MUD FILTRATE RESISTIVITY |
206
|
|
|
DFD .K/M3 1525.0 : DRILL FLUID DENSITY |
207
|
|
|
~Other ----------------------------------------------------- |
208
|
|
|
Note: The logging tools became stuck at 625 meters causing the data |
209
|
|
|
between 625 meters and 615 meters to be invalid. |
210
|
|
|
~ASCII ----------------------------------------------------- |
211
|
|
|
1670.00000 123.45000 2550.00000 0.45000 123.45000 123.45000 110.20000 105.60000 9.46970 |
212
|
|
|
1669.87500 123.45000 2550.00000 0.45000 123.45000 123.45000 110.20000 105.60000 9.46970 |
213
|
|
|
1669.75000 123.45000 2550.00000 0.45000 123.45000 123.45000 110.20000 105.60000 9.46970 |
214
|
|
|
""" |
215
|
|
|
|
216
|
|
|
def test_write_xlsx(): |
217
|
|
|
l = read(egfn("sample.las")) |
218
|
|
|
e = ExcelConverter(l) |
219
|
|
|
xlsxfn = "test.xlsx" |
220
|
|
|
e.write(xlsxfn) |
221
|
|
|
os.remove(xlsxfn) |
222
|
|
|
|
223
|
|
|
def test_multi_curve_mnemonics_rewrite(): |
224
|
|
|
l = read(egfn('sample_issue105_a.las')) |
225
|
|
|
s = StringIO() |
226
|
|
|
l.write(s, version=2, wrap=False, fmt="%.5f") |
227
|
|
|
s.seek(0) |
228
|
|
|
assert s.read() == '''~Version --------------------------------------------------- |
229
|
|
|
VERS. 2.0 : CWLS log ASCII Standard -VERSION 2.0 |
230
|
|
|
WRAP. NO : One line per depth step |
231
|
|
|
~Well ------------------------------------------------------ |
232
|
|
|
STRT.M 1670.0 : |
233
|
|
|
STOP.M 1669.75 : |
234
|
|
|
STEP.M -0.125 : |
235
|
|
|
NULL. -999.25 : |
236
|
|
|
COMP. # ANY OIL COMPANY LTD. : COMPANY |
237
|
|
|
WELL. ANY ET AL OIL WELL #12 : WELL |
238
|
|
|
FLD . EDAM : FIELD |
239
|
|
|
LOC . A9-16-49-20W3M : LOCATION |
240
|
|
|
PROV. SASKATCHEWAN : PROVINCE |
241
|
|
|
SRVC. ANY LOGGING COMPANY LTD. : SERVICE COMPANY |
242
|
|
|
DATE. 25-DEC-1988 : LOG DATE |
243
|
|
|
UWI . 100091604920W300 : UNIQUE WELL ID |
244
|
|
|
~Curves ---------------------------------------------------- |
245
|
|
|
DEPT.M : 1 DEPTH |
246
|
|
|
RHO .ohmm : curve 1,2,3 |
247
|
|
|
RHO .ohmm : curve 10,20,30 |
248
|
|
|
RHO .ohmm : curve 100,200,300 |
249
|
|
|
PHI . : porosity |
250
|
|
|
~Params ---------------------------------------------------- |
251
|
|
|
BHT .DEGC 35.5 : BOTTOM HOLE TEMPERATURE |
252
|
|
|
BS .MM 200.0 : BIT SIZE |
253
|
|
|
FD .K/M3 1000.0 : FLUID DENSITY |
254
|
|
|
MATR. 0.0 : NEUTRON MATRIX(0=LIME,1=SAND,2=DOLO) |
255
|
|
|
MDEN. 2710.0 : LOGGING MATRIX DENSITY |
256
|
|
|
RMF .OHMM 0.216 : MUD FILTRATE RESISTIVITY |
257
|
|
|
DFD .K/M3 1525.0 : DRILL FLUID DENSITY |
258
|
|
|
~Other ----------------------------------------------------- |
259
|
|
|
Note: The logging tools became stuck at 625 meters causing the data |
260
|
|
|
between 625 meters and 615 meters to be invalid. |
261
|
|
|
~ASCII ----------------------------------------------------- |
262
|
|
|
1670.00000 1.00000 10.00000 100.00000 0.10000 |
263
|
|
|
1669.87500 2.00000 20.00000 200.00000 0.20000 |
264
|
|
|
1669.75000 3.00000 30.00000 300.00000 0.30000 |
265
|
|
|
''' |
266
|
|
|
|
267
|
|
|
def test_multi_curve_missing_mnemonics_rewrite(): |
268
|
|
|
l = read(egfn('sample_issue105_b.las')) |
269
|
|
|
s = StringIO() |
270
|
|
|
l.write(s, version=2, wrap=False, fmt="%.5f") |
271
|
|
|
s.seek(0) |
272
|
|
|
assert s.read() == '''~Version --------------------------------------------------- |
273
|
|
|
VERS. 2.0 : CWLS log ASCII Standard -VERSION 2.0 |
274
|
|
|
WRAP. NO : One line per depth step |
275
|
|
|
~Well ------------------------------------------------------ |
276
|
|
|
STRT.M 1670.0 : |
277
|
|
|
STOP.M 1669.75 : |
278
|
|
|
STEP.M -0.125 : |
279
|
|
|
NULL. -999.25 : |
280
|
|
|
COMP. # ANY OIL COMPANY LTD. : COMPANY |
281
|
|
|
WELL. ANY ET AL OIL WELL #12 : WELL |
282
|
|
|
FLD . EDAM : FIELD |
283
|
|
|
LOC . A9-16-49-20W3M : LOCATION |
284
|
|
|
PROV. SASKATCHEWAN : PROVINCE |
285
|
|
|
SRVC. ANY LOGGING COMPANY LTD. : SERVICE COMPANY |
286
|
|
|
DATE. 25-DEC-1988 : LOG DATE |
287
|
|
|
UWI . 100091604920W300 : UNIQUE WELL ID |
288
|
|
|
~Curves ---------------------------------------------------- |
289
|
|
|
DEPT.M : 1 DEPTH |
290
|
|
|
.ohmm : curve 1,2,3 |
291
|
|
|
.ohmm : curve 10,20,30 |
292
|
|
|
.ohmm : curve 100,200,300 |
293
|
|
|
PHI . : porosity |
294
|
|
|
~Params ---------------------------------------------------- |
295
|
|
|
BHT .DEGC 35.5 : BOTTOM HOLE TEMPERATURE |
296
|
|
|
BS .MM 200.0 : BIT SIZE |
297
|
|
|
FD .K/M3 1000.0 : FLUID DENSITY |
298
|
|
|
MATR. 0.0 : NEUTRON MATRIX(0=LIME,1=SAND,2=DOLO) |
299
|
|
|
MDEN. 2710.0 : LOGGING MATRIX DENSITY |
300
|
|
|
RMF .OHMM 0.216 : MUD FILTRATE RESISTIVITY |
301
|
|
|
DFD .K/M3 1525.0 : DRILL FLUID DENSITY |
302
|
|
|
~Other ----------------------------------------------------- |
303
|
|
|
Note: The logging tools became stuck at 625 meters causing the data |
304
|
|
|
between 625 meters and 615 meters to be invalid. |
305
|
|
|
~ASCII ----------------------------------------------------- |
306
|
|
|
1670.00000 1.00000 10.00000 100.00000 0.10000 |
307
|
|
|
1669.87500 2.00000 20.00000 200.00000 0.20000 |
308
|
|
|
1669.75000 3.00000 30.00000 300.00000 0.30000 |
309
|
|
|
''' |