Dokumentasi resmi dihosting di readthedocs.
Segyio adalah pustaka C kecil berlisensi LGPL untuk memudahkan interaksi dengan data seismik berformat SEG-Y dan Seismic Unix, dengan pengikatan bahasa untuk Python dan Matlab. Segyio adalah upaya untuk menciptakan perpustakaan yang mudah digunakan, dapat disematkan, dan berorientasi komunitas untuk aplikasi seismik. Fitur ditambahkan sesuai kebutuhan; segala bentuk saran dan kontribusi sangat kami harapkan.
Untuk mengetahui perkembangan dan fitur terkini, lihat log perubahan. Untuk menulis kode bukti di masa mendatang, lihat perubahan yang direncanakan.
Saat segyio sudah dibuat dan diinstal, Anda siap untuk memulai pemrograman! Simak tutorial, contoh, contoh program, dan contoh buku catatan. Untuk referensi teknis dengan contoh dan resep kecil, baca dokumen. Dokumen API juga tersedia dengan pydoc - mulai juru bahasa Python favorit Anda dan ketik help(segyio)
, yang seharusnya terintegrasi dengan baik dengan IDLE, pycharm, dan alat Python lainnya.
import segyio
import numpy as np
with segyio . open ( 'file.sgy' ) as f :
for trace in f . trace :
filtered = trace [ np . where ( trace < 1e-2 )]
Lihat contoh untuk informasi lebih lanjut.
Salinan segyio tersedia sebagai biner siap pakai dan kode sumber:
apt install python3-segyio
pip install segyio
git clone https://github.com/statoil/segyio
Untuk membangun segyio, Anda memerlukan:
Untuk membuat dokumentasi, Anda juga memerlukan sphinx
Untuk membangun dan menginstal segyio, lakukan tindakan berikut di konsol Anda:
git clone https://github.com/equinor/segyio
mkdir segyio/build
cd segyio/build
cmake .. -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON
make
make install
make install
harus dilakukan sebagai root untuk instalasi sistem; jika Anda ingin menginstal di direktori home Anda, tambahkan -DCMAKE_INSTALL_PREFIX=~/
atau direktori lain yang sesuai, atau make DESTDIR=~/ install
. Harap pastikan lingkungan Anda mengambil lokasi pemasangan non-standar (PYTHONPATH, LD_LIBRARY_PATH dan PATH).
Jika Anda memiliki beberapa instalasi Python, atau ingin menggunakan penerjemah alternatif, Anda dapat membantu cmake menemukan yang tepat dengan meneruskan -DPYTHON_EXECUTABLE=/opt/python/binary
bersama dengan awalan instalasi dan tipe build.
Untuk membuat pengikatan matlab, aktifkan CMake dengan opsi -DBUILD_MEX=ON
. Di beberapa lingkungan, biner Matlab berada di lokasi non-standar, dalam hal ini Anda perlu membantu CMake menemukan biner matlab dengan meneruskan -DMATLAB_ROOT=/path/to/matlab
.
Disarankan untuk membangun dalam mode debug untuk mendapatkan lebih banyak peringatan dan menyematkan simbol debug pada objek. Mengganti Debug
untuk Release
di CMAKE_BUILD_TYPE
sudah banyak.
Tes terletak di direktori bahasa/tes, dan sangat disarankan agar fitur baru yang ditambahkan ditunjukkan untuk kebenaran dan kontrak dengan menambahkan tes. Semua tes dapat dijalankan dengan menjalankan ctest
. Jangan ragu untuk menggunakan tes yang sudah ditulis sebagai panduan.
Setelah membangun segyio Anda dapat menjalankan pengujian dengan ctest
, yang dijalankan dari direktori build.
Harap perhatikan bahwa untuk menjalankan contoh Python, Anda perlu memberi tahu lingkungan Anda di mana menemukan perpustakaan Python. Itu dapat diinstal sebagai pengguna, atau dengan menambahkan perpustakaan segyio/build/python ke pythonpath Anda.
Semua kode dalam tutorial ini mengasumsikan segyio diimpor, dan numpy tersedia sebagai np.
import segyio
import numpy as np
Tutorial ini mengasumsikan Anda sudah familiar dengan Python dan numpy. Untuk penyegaran, lihat tutorial python dan panduan mulai numpy
Membuka file untuk dibaca dilakukan dengan fungsi segyio.open
, dan secara idiomatis digunakan dengan pengelola konteks. Menggunakan pernyataan with
, file ditutup dengan benar meskipun ada pengecualian. Secara default, file dibuka hanya-baca.
with segyio . open ( filename ) as f :
...
Open menerima beberapa opsi (untuk referensi lebih komprehensif, periksa docstring fungsi terbuka dengan help(segyio.open)
. Opsi paling penting adalah argumen posisi kedua (opsional). Untuk membuka file untuk ditulis, lakukan segyio.open(filename, 'r+')
, dari fungsi C fopen
.
File dapat dibuka dalam mode tidak terstruktur , baik dengan meneruskan segyio.open
argumen opsional strict=False
, dalam hal ini tidak membuat struktur (nomor sebaris, nomor garis silang, dll.) bukan merupakan kesalahan, dan ignore_geometry=True
, dalam hal ini segyio bahkan tidak akan mencoba mengatur atribut internal ini.
Objek file segy memiliki beberapa atribut publik yang menjelaskan struktur ini:
f.ilines
Menyimpulkan nomor inlinef.xlines
Menyimpulkan bilangan garis silangf.offsets
Angka offset yang disimpulkanf.samples
Inferensi sampel offset (frekuensi dan waktu tunda perekaman)f.unstructured
Benar jika tidak terstruktur, Salah jika terstrukturf.ext_headers
Jumlah header tekstual yang diperluas Jika file dibuka tidak terstruktur , semua properti baris akan menjadi None
.
Di segyio, data diambil dan ditulis melalui apa yang disebut mode . Mode adalah array abstrak, atau skema pengalamatan, dan mengubah arti nama dan indeks. Semua mode adalah properti pada objek pegangan file, mendukung fungsi len
, dan membaca serta menulis dilakukan melalui f.mode[]
. Penulisan selesai dengan tugas. Mode mendukung pemotongan array yang terinspirasi oleh numpy. Mode berikut tersedia:
trace
Mode penelusuran menawarkan pengalamatan mentah atas jejak yang diletakkan di dalam file. Ini, bersama dengan header
, adalah satu-satunya mode yang tersedia untuk file tidak terstruktur. Jejak dihitung 0..len(f.trace)
.
Membaca jejak menghasilkan ndarray
numpy, dan membaca beberapa jejak menghasilkan generator ndarray
s. Semantik generator digunakan dan objek yang sama digunakan kembali, jadi jika Anda ingin menyimpan data pelacakan dalam cache atau alamat nanti, Anda harus menyalinnya secara eksplisit.
> >> f . trace [ 10 ]
> >> f . trace [ - 2 ]
> >> f . trace [ 15 : 45 ]
> >> f . trace [: 45 : 3 ]
header
Dengan perilaku pengalamatan yang mirip dengan trace
, mengakses item akan menghasilkan objek header, bukan numpy ndarray
s. Header adalah objek seperti dict, dengan kunci berupa bilangan bulat, kunci gaya unix seismik (dalam modul segyio.su) dan segyio enum (segyio.TraceField).
Nilai header dapat diperbarui dengan menetapkan dict-like padanya, dan kunci yang tidak ada di sisi kanan tugas adalah unmodified .
> >> f . header [ 5 ] = { segyio . su . tracl : 10 }
> >> f . header [ 5 ]. items ()
> >> f . header [ 5 ][ 25 , 37 ] # read multiple values at once
iline
, xline
Mode ini akan menimbulkan kesalahan jika file tidak terstruktur. Mereka menganggap argumen []
sebagai kunci dari masing-masing baris. Nomor baris selalu bertambah, tetapi jaraknya dapat berubah-ubah dan tidak merata. Nama yang valid dapat ditemukan di properti ilines
dan xlines
.
Seperti halnya jejak, mendapatkan satu baris menghasilkan ndarray
, dan sepotong garis menghasilkan generator ndarray
s. Saat menggunakan irisan dengan langkah, beberapa item perantara mungkin dilewati jika tidak cocok dengan langkah tersebut, yaitu melakukan f.line[1:10:3]
pada file dengan baris [1,2,3,4,5]
setara dengan mencari 1, 4, 7
, dan menemukan [1,4]
.
Saat bekerja dengan file pra-tumpukan 4D, offset pertama dibaca secara implisit. Untuk mengakses offset yang berbeda atau rentang tertentu, gunakan indeks atau rentang yang dipisahkan koma, seperti: f.iline[120, 4]
.
fast
, slow
Ini adalah alias untuk iline
dan xline
, ditentukan oleh bagaimana jejaknya ditata. Untuk file yang diurutkan sebaris, fast
akan menghasilkan iline
.
depth_slice
Irisan kedalaman adalah potongan horizontal selebar file pada kedalaman. Nilai yang dihasilkan adalah ndarray
s dan generator-of-arrays.
gather
gather
adalah perpotongan garis sejajar dan garis silang, kolom vertikal survei, dan kecuali jika satu offset ditentukan, akan menghasilkan offset x sampel ndarray
. Di hadapan rentang, ia mengembalikan generator ndarray
tersebut.
text
Mode text
adalah larik header tekstual, di mana text[0]
adalah header tekstual yang diamanatkan standar, dan 1..n
adalah header tambahan opsional.
Header teks dikembalikan sebagai gumpalan seperti byte 3200 byte seperti yang ada di file. Fungsi segyio.tools.wrap
dapat membuat versi string ini yang berorientasi garis.
bin
Nilai header biner seluruh file dengan antarmuka seperti dict. Berperilaku seperti mode header
, tetapi tanpa pengindeksan.
> >> for line in f . iline [: 2430 ]:
... print ( np . average ( line ))
> >> for line in f . xline [ 2 : 10 ]:
... print ( line )
> >> for line in f . fast [:: 2 ]:
... print ( np . min ( line ))
> >> for factor , offset in enumerate ( f . iline [ 10 , :]):
... offset *= factor
print ( offset )
> >> f . gather [ 200 , 241 , :]. shape
> >> text = f . text [ 0 ]
> >> type( text )
< type 'bytes' >
> >> f . trace [ 10 ] = np . zeros ( len ( f . samples ))
Contoh dan resep lainnya dapat ditemukan di help(segyio)
dan bagian contoh.
Segyio tidak serta merta berusaha menjadi akhir dari semua interaksi SEG-Y; sebaliknya, kami bertujuan untuk menurunkan hambatan dalam berinteraksi dengan file SEG-Y untuk penyematan, aplikasi baru, atau program yang berdiri sendiri.
Selain itu, tujuannya bukan untuk mendukung file berformat standar penuh atau semua file berformat eksotik (tetapi sesuai standar) di luar sana. Beberapa asumsi dibuat, seperti:
Saat ini, segyio mendukung:
Fungsionalitas penulisan di segyio sebagian besar dimaksudkan untuk memodifikasi atau mengadaptasi file. File yang dibuat dari awal belum tentu merupakan file SEG-Y sesuai spesifikasi, karena kita hanya perlu menulis kolom header yang diperlukan segyio untuk memahami geometrinya. Masih sangat disarankan agar file SEG-Y dipelihara dan ditulis sesuai spesifikasi, tetapi segyio tidak menerapkan hal ini.
Segyio dapat menangani banyak file yang mirip SEG-Y, yaitu segyio menangani file yang tidak sesuai dengan standar SEG-Y. Segyio juga tidak membeda-bedakan revisi, melainkan mencoba menggunakan informasi yang tersedia di file. Untuk referensi standar sebenarnya , silakan lihat publikasi SEG:
Kami menyambut segala jenis kontribusi; silakan lihat KONTRIBUSI.md.
xarray
Alan Richardson telah menulis alat kecil yang hebat untuk menggunakan xarray dengan file segy, yang dia demokan di notebook ini
File kecil berformat SEG-Y disertakan dalam repositori untuk tujuan pengujian. Data tersebut tidak masuk akal dan dibuat agar dapat diprediksi, serta dapat direproduksi dengan menggunakan segyio. File pengujian terletak di direktori data pengujian. Untuk mereproduksi file data, buat segyio dan jalankan program pengujian make-file.py
, make-ps-file.py
, dan make-rotated-copies.py
seperti:
python examples / make - file . py small . sgy 50 1 6 20 25
python examples / make - ps - file . py small - ps . sgy 10 1 5 1 4 1 3
python examples / make - rotated - copies . py small . sgy
File small-lsb.sgy dibuat dengan menjalankan program flip-endianness. Program ini disertakan dalam pohon sumber segyio, tetapi bukan bagian dari paket, dan tidak dimaksudkan untuk distribusi dan instalasi, hanya untuk mereproduksi file pengujian.
File unix seismik small.su dan small-lsb.su dibuat dengan perintah berikut:
segyread tape=small.sgy ns=50 remap=tracr,cdp byte=189l,193l conv=1 format=1
> small-lsb.su
suswapbytes < small.su > small-lsb.su
Jika Anda memiliki file data kecil dengan lisensi gratis, silakan kirimkan ke proyek!
Impor perpustakaan yang berguna:
import segyio
import numpy as np
from shutil import copyfile
Buka file segy dan periksa:
filename = 'name_of_your_file.sgy'
with segyio . open ( filename ) as segyfile :
# Memory map file for faster reading (especially if file is big...)
segyfile . mmap ()
# Print binary header info
print ( segyfile . bin )
print ( segyfile . bin [ segyio . BinField . Traces ])
# Read headerword inline for trace 10
print ( segyfile . header [ 10 ][ segyio . TraceField . INLINE_3D ])
# Print inline and crossline axis
print ( segyfile . xlines )
print ( segyfile . ilines )
Baca kubus data pasca-tumpukan yang terdapat dalam file segy:
# Read data along first xline
data = segyfile . xline [ segyfile . xlines [ 1 ]]
# Read data along last iline
data = segyfile . iline [ segyfile . ilines [ - 1 ]]
# Read data along 100th time slice
data = segyfile . depth_slice [ 100 ]
# Read data cube
data = segyio . tools . cube ( filename )
Baca kubus data pra-tumpukan yang terdapat dalam file segy:
filename = 'name_of_your_prestack_file.sgy'
with segyio . open ( filename ) as segyfile :
# Print offsets
print ( segyfile . offset )
# Read data along first iline and offset 100: data [nxl x nt]
data = segyfile . iline [ 0 , 100 ]
# Read data along first iline and all offsets gath: data [noff x nxl x nt]
data = np . asarray ([ np . copy ( x ) for x in segyfile . iline [ 0 : 1 , :]])
# Read data along first 5 ilines and all offsets gath: data [noff nil x nxl x nt]
data = np . asarray ([ np . copy ( x ) for x in segyfile . iline [ 0 : 5 , :]])
# Read data along first xline and all offsets gath: data [noff x nil x nt]
data = np . asarray ([ np . copy ( x ) for x in segyfile . xline [ 0 : 1 , :]])
Membaca dan memahami data yang cukup 'tidak terstruktur' (misalnya, data yang diurutkan berdasarkan kumpulan gambar umum):
filename = 'name_of_your_prestack_file.sgy'
with segyio . open ( filename , ignore_geometry = True ) as segyfile :
segyfile . mmap ()
# Extract header word for all traces
sourceX = segyfile . attributes ( segyio . TraceField . SourceX )[:]
# Scatter plot sources and receivers color-coded on their number
plt . figure ()
sourceY = segyfile . attributes ( segyio . TraceField . SourceY )[:]
nsum = segyfile . attributes ( segyio . TraceField . NSummedTraces )[:]
plt . scatter ( sourceX , sourceY , c = nsum , edgecolor = 'none' )
groupX = segyfile . attributes ( segyio . TraceField . GroupX )[:]
groupY = segyfile . attributes ( segyio . TraceField . GroupY )[:]
nstack = segyfile . attributes ( segyio . TraceField . NStackedTraces )[:]
plt . scatter ( groupX , groupY , c = nstack , edgecolor = 'none' )
Tulis file segy menggunakan header yang sama dengan file lain tetapi kalikan data dengan *2
input_file = 'name_of_your_input_file.sgy'
output_file = 'name_of_your_output_file.sgy'
copyfile ( input_file , output_file )
with segyio . open ( output_file , "r+" ) as src :
# multiply data by 2
for i in src . ilines :
src . iline [ i ] = 2 * src . iline [ i ]
Buat file segy dari sctrach
filename='name_of_your_file.sgy'
% Inspect segy
Segy_struct=SegySpec(filename,189,193,1);
% Read headerword inline for each trace
Segy.get_header(filename,'Inline3D')
%Read data along first xline
data= Segy.readCrossLine(Segy_struct,Segy_struct.crossline_indexes(1));
%Read cube
data=Segy.get_cube(Segy_struct);
%Write segy, use same header but multiply data by *2
input_file='input_file.sgy';
output_file='output_file.sgy';
copyfile(input_file,output_file)
data = Segy.get_traces(input_file);
data1 = 2*data;
Segy.put_traces(output_file, data1);
Seringkali masalah muncul ketika seseorang mengalami kesulitan dengan kinerja segyio, khususnya saat membuat file baru. Pelakunya sering kali adalah kode ini:
with segyio.create('new.sgy', spec) as dst:
dst.header = headers
Kode itu sendiri baik-baik saja, tetapi memiliki perilaku halus pada beberapa sistem ketika file baru dibuat: ia melakukan banyak penulisan tersebar ke file yang jarang. Ini bisa cepat atau lambat, sebagian besar bergantung pada sistem file.
Tulis ulang loop untuk menulis ke file secara berurutan:
with segyio.create('new.sgy', spec) as dst:
for i in range(spec.tracecount):
dst.header[i] = headers[i]
dst.trace[i] = traces[i]
Jika file merupakan salinan modifikasi dari file lain, tanpa mengubah panjang jejak, seringkali lebih cepat (dan lebih mudah!) untuk menyalin file terlebih dahulu tanpa segyio, lalu menggunakan segyio untuk memodifikasi salinan di tempatnya:
shutil.copyfile(srcfile, dstfile)
with segyio.open(dstfile) as f:
f.header = headers
Kesalahan ini muncul ketika pemuat tidak dapat menemukan pustaka inti segyio. Jika Anda telah menyetel awalan pemasangan secara eksplisit (dengan -DCMAKE_INSTALL_PREFIX
), Anda harus mengonfigurasi pemuat agar juga melihat awalan ini, baik dengan file ld.conf.d
atau variabel LD_LIBRARY_PATH
.
Jika Anda belum menyetel CMAKE_INSTALL_PREFIX
, cmake secara default akan diinstal ke /usr/local
, yang biasanya diketahui oleh pemuat Anda. Pada sistem berbasis Debian, perpustakaan sering kali diinstal ke /usr/local/lib
, yang mungkin tidak diketahui oleh pemuat. Lihat edisi #239.
sudo ldconfig
sering kali berhasil)-DCMAKE_INSTALL_LIBDIR=lib64
Pengecualian ini muncul ketika segyio mencoba membuka dalam mode ketat, dengan asumsi bahwa file tersebut adalah volume 3D biasa yang diurutkan. Jika file tersebut hanya kumpulan jejak dalam urutan acak, ini akan gagal.
Periksa apakah parameter input segyio.open iline
dan xline
sudah benar untuk file saat ini. Segyio juga mendukung file yang hanya merupakan kumpulan jejak, tetapi harus diberitahu bahwa tidak masalah untuk melakukannya. Teruskan strict = False
atau ignore_geometry = True
ke segyio.open
untuk mengizinkan atau memaksa mode tidak terstruktur. Harap dicatat bahwa fitur f.iline
dan sejenisnya sekarang dinonaktifkan dan akan menimbulkan kesalahan.
Segyio awalnya ditulis dan dikelola oleh Equinor ASA sebagai cara berinteraksi yang gratis, sederhana, dan mudah digunakan dengan data seismik yang dapat disesuaikan dengan kebutuhan kita, dan sebagai kontribusi terhadap komunitas perangkat lunak bebas.