Die offizielle Dokumentation wird auf readthedocs gehostet.
Segyio ist eine kleine LGPL-lizenzierte C-Bibliothek für die einfache Interaktion mit seismischen Daten im SEG-Y- und Seismic Unix-Format, mit Sprachbindungen für Python und Matlab. Segyio ist ein Versuch, eine benutzerfreundliche, einbettbare, gemeinschaftsorientierte Bibliothek für seismische Anwendungen zu erstellen. Funktionen werden nach Bedarf hinzugefügt; Anregungen und Beiträge aller Art sind herzlich willkommen.
Informationen zu den neuesten Entwicklungen und Funktionen finden Sie im Änderungsprotokoll. Um zukunftssicheren Code zu schreiben, konsultieren Sie die geplanten Breaking Changes.
Wenn segyio erstellt und installiert ist, können Sie mit der Programmierung beginnen! Schauen Sie sich das Tutorial, Beispiele, Beispielprogramme und Beispielnotizbücher an. Eine technische Referenz mit Beispielen und kleinen Rezepten finden Sie in den Dokumenten. API-Dokumente sind auch mit pydoc verfügbar – starten Sie Ihren bevorzugten Python-Interpreter und geben Sie help(segyio)
ein, der sich gut in IDLE, pycharm und andere Python-Tools integrieren lässt.
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 )]
Weitere Informationen finden Sie in den Beispielen.
Eine Kopie von segyio ist sowohl als vorgefertigte Binärdateien als auch als Quellcode verfügbar:
apt install python3-segyio
pip install segyio
git clone https://github.com/statoil/segyio
Um Segyio zu bauen, benötigen Sie:
Um die Dokumentation zu erstellen, benötigen Sie außerdem Sphinx
Um segyio zu erstellen und zu installieren, führen Sie die folgenden Aktionen in Ihrer Konsole aus:
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
muss für eine Systeminstallation als Root ausgeführt werden; Wenn Sie in Ihrem Home-Verzeichnis installieren möchten, fügen Sie -DCMAKE_INSTALL_PREFIX=~/
oder ein anderes geeignetes Verzeichnis hinzu oder make DESTDIR=~/ install
. Bitte stellen Sie sicher, dass Ihre Umgebung nicht standardmäßige Installationsorte (PYTHONPATH, LD_LIBRARY_PATH und PATH) berücksichtigt.
Wenn Sie mehrere Python-Installationen haben oder einen alternativen Interpreter verwenden möchten, können Sie cmake dabei helfen, den richtigen zu finden, indem Sie -DPYTHON_EXECUTABLE=/opt/python/binary
zusammen mit dem Installationspräfix und dem Build-Typ übergeben.
Um die Matlab-Bindungen zu erstellen, rufen Sie CMake mit der Option -DBUILD_MEX=ON
auf. In einigen Umgebungen befinden sich die Matlab-Binärdateien an einem nicht standardmäßigen Speicherort. In diesem Fall müssen Sie CMake dabei helfen, die Matlab-Binärdateien zu finden, indem Sie -DMATLAB_ROOT=/path/to/matlab
übergeben.
Es wird empfohlen, den Build im Debug-Modus durchzuführen, um mehr Warnungen zu erhalten und Debug-Symbole in die Objekte einzubetten. Es ist ausreichend, Debug
durch Release
im CMAKE_BUILD_TYPE
zu ersetzen.
Tests befinden sich in den Verzeichnissen „Sprache/Tests“. Es wird dringend empfohlen, die Richtigkeit und Gültigkeit neu hinzugefügter Funktionen durch Hinzufügen eines Tests zu überprüfen. Alle Tests können durch Aufrufen von ctest
ausgeführt werden. Nutzen Sie gerne die bereits geschriebenen Tests als Leitfaden.
Nachdem Sie Segyio erstellt haben, können Sie die Tests mit ctest
ausführen, die im Build-Verzeichnis ausgeführt werden.
Bitte beachten Sie, dass Sie zum Ausführen der Python-Beispiele Ihrer Umgebung mitteilen müssen, wo sich die Python-Bibliothek befindet. Es kann als Benutzer oder durch Hinzufügen der segyio/build/python-Bibliothek zu Ihrem Python-Pfad installiert werden.
Der gesamte Code in diesem Tutorial geht davon aus, dass segyio importiert ist und dass numpy als np verfügbar ist.
import segyio
import numpy as np
In diesem Tutorial wird davon ausgegangen, dass Sie mit Python und Numpy vertraut sind. Schauen Sie sich für eine Auffrischung das Python-Tutorial und den Numpy-Schnellstart an
Das Öffnen einer Datei zum Lesen erfolgt mit der Funktion segyio.open
und wird üblicherweise mit Kontextmanagern verwendet. Mit der with
-Anweisung werden Dateien auch bei Ausnahmen ordnungsgemäß geschlossen. Standardmäßig werden Dateien schreibgeschützt geöffnet.
with segyio . open ( filename ) as f :
...
Open akzeptiert mehrere Optionen (für eine umfassendere Referenz überprüfen Sie die Dokumentzeichenfolge der Open-Funktion mit help(segyio.open)
. Die wichtigste Option ist das zweite (optionale) Positionsargument. Um eine Datei zum Schreiben zu öffnen, führen Sie segyio.open(filename, 'r+')
, aus der C fopen
Funktion.
Dateien können im unstrukturierten Modus geöffnet werden, entweder durch Übergabe der optionalen Argumente strict=False
segyio.open
. In diesem Fall stellt das Nichteinrichten der Struktur (Inline-Nummern, Crossline-Nummern usw.) keinen Fehler dar, oder ignore_geometry=True
, in diesem Fall segyio Ich werde nicht einmal versuchen, diese internen Attribute festzulegen.
Das Segy-Dateiobjekt verfügt über mehrere öffentliche Attribute, die diese Struktur beschreiben:
f.ilines
Abgeleitete Inline-Zahlenf.xlines
Abgeleitete Crossline-Zahlenf.offsets
Abgeleitete Offsetzahlenf.samples
Abgeleitete Sample-Offsets (Frequenz und Aufzeichnungszeitverzögerung)f.unstructured
True, wenn unstrukturiert, False, wenn strukturiertf.ext_headers
Die Anzahl der erweiterten Textkopfzeilen Wenn die Datei unstrukturiert geöffnet wird, sind alle Zeileneigenschaften None
.
In Segyio werden Daten über sogenannte Modi abgerufen und geschrieben. Modi sind abstrakte Arrays oder Adressierungsschemata und ändern die Bedeutung von Namen und Indizes. Alle Modi sind Eigenschaften des Dateihandle-Objekts, unterstützen die len
Funktion und Lese- und Schreibvorgänge erfolgen über f.mode[]
. Die Schreibvorgänge erfolgen mit Zuweisung. Die Modi unterstützen das von Numpy inspirierte Array-Slicing. Folgende Modi stehen zur Verfügung:
trace
Der Trace-Modus ermöglicht die Rohadressierung von Traces, wie sie in der Datei angeordnet sind. Dies ist zusammen mit header
der einzige verfügbare Modus für unstrukturierte Dateien. Traces werden mit 0..len(f.trace)
aufgezählt.
Das Lesen einer Ablaufverfolgung ergibt ein Numpy ndarray
und das Lesen mehrerer Ablaufverfolgungen einen Generator von ndarray
s. Es wird Generatorsemantik verwendet und dasselbe Objekt wird wiederverwendet. Wenn Sie also Trace-Daten später zwischenspeichern oder adressieren möchten, müssen Sie sie explizit kopieren.
> >> f . trace [ 10 ]
> >> f . trace [ - 2 ]
> >> f . trace [ 15 : 45 ]
> >> f . trace [: 45 : 3 ]
header
Mit einem Adressierungsverhalten, das dem von trace
ähnelt, führt der Zugriff auf Elemente zu Header-Objekten anstelle von numpy ndarray
s. Header sind dict-ähnliche Objekte, wobei Schlüssel ganze Zahlen, seismische Schlüssel im Unix-Stil (im segyio.su-Modul) und segyio-Enums (segyio.TraceField) sind.
Header-Werte können durch Zuweisen eines Diktats aktualisiert werden, und Schlüssel, die auf der rechten Seite der Zuweisung nicht vorhanden sind, bleiben unverändert .
> >> f . header [ 5 ] = { segyio . su . tracl : 10 }
> >> f . header [ 5 ]. items ()
> >> f . header [ 5 ][ 25 , 37 ] # read multiple values at once
iline
, xline
Diese Modi lösen einen Fehler aus, wenn die Datei unstrukturiert ist. Sie betrachten Argumente für []
als Schlüssel der jeweiligen Zeilen. Die Zeilenanzahl nimmt ständig zu, kann jedoch beliebige, ungleichmäßige Abstände aufweisen. Die gültigen Namen finden Sie in den Eigenschaften ilines
und xlines
.
Wie bei Traces ergibt das Erhalten einer Zeile ein ndarray
und ein Zeilenausschnitt einen Generator von ndarray
s. Bei der Verwendung von Slices mit einem Schritt werden möglicherweise einige Zwischenelemente übersprungen, wenn sie nicht mit dem Schritt übereinstimmen, z. B. wenn f.line[1:10:3]
für eine Datei mit den Zeilen [1,2,3,4,5]
ausgeführt wird. entspricht dem Nachschlagen von 1, 4, 7
und dem Finden von [1,4]
.
Beim Arbeiten mit einer 4D-Pre-Stack-Datei wird der erste Offset implizit gelesen. Um auf einen anderen Offset oder einen Bereich von Offsets zuzugreifen, verwenden Sie durch Kommas getrennte Indizes oder Bereiche wie folgt: f.iline[120, 4]
.
fast
, slow
Dies sind Aliase für iline
und xline
, die durch die Anordnung der Spuren bestimmt werden. Bei inline-sortierten Dateien würde fast
iline
ergeben.
depth_slice
Der Tiefenschnitt ist ein horizontaler, feilenbreiter Schnitt in einer Tiefe. Die ausgegebenen Werte sind ndarray
und Generatoren von Arrays.
gather
Der gather
ist der Schnittpunkt einer Inline- und Crossline, einer vertikalen Spalte der Umfrage, und gibt, sofern kein einzelner Offset angegeben ist, einen Offset x Samples ndarray
zurück. Wenn Bereiche vorhanden sind, wird ein Generator für solche ndarray
zurückgegeben.
text
Der text
ist ein Array der Textkopfzeilen, wobei text[0]
der standardmäßig vorgeschriebene Textkopf und 1..n
die optionalen erweiterten Kopfzeilen sind.
Die Textkopfzeilen werden wie in der Datei enthalten als byteähnliche 3200-Byte-Blobs zurückgegeben. Die Funktion segyio.tools.wrap
kann eine zeilenorientierte Version dieser Zeichenfolge erstellen.
bin
Die Werte des dateiweiten Binärheaders mit einer dict-ähnlichen Schnittstelle. Verhält sich wie der header
-Modus, jedoch ohne Indizierung.
> >> 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 ))
Weitere Beispiele und Rezepte finden Sie in der Docstrings help(segyio)
und im Abschnitt „Beispiele“.
Segyio versucht nicht unbedingt, das A und O aller SEG-Y-Interaktionen zu sein; Unser Ziel ist vielmehr, die Hürde für die Interaktion mit SEG-Y-Dateien zur Einbettung, für neue Anwendungen oder für eigenständige Programme zu senken.
Darüber hinaus besteht das Ziel nicht darin, den vollständigen Standard oder alle exotisch (aber standardkonform) formatierten Dateien zu unterstützen. Es werden einige Annahmen getroffen, wie zum Beispiel:
Derzeit unterstützt segyio:
Die Schreibfunktionalität in Segyio dient hauptsächlich dazu, Dateien zu ändern oder anzupassen. Eine von Grund auf neu erstellte Datei ist nicht unbedingt eine spezifikationsgerechte SEG-Y-Datei, da wir nur die Header-Felder schreiben, die Segyio benötigt, um die Geometrie zu verstehen. Es wird weiterhin dringend empfohlen, SEG-Y-Dateien gemäß der Spezifikation zu verwalten und zu schreiben, Segyio erzwingt dies jedoch nicht .
Segyio kann viele Dateien verarbeiten, die SEG-Y-ähnlich sind, dh Segyio verarbeitet Dateien, die nicht strikt dem SEG-Y-Standard entsprechen. Segyio macht auch keinen Unterschied zwischen den Revisionen, sondern versucht stattdessen, die in der Datei verfügbaren Informationen zu nutzen. Eine aktuelle Standardreferenz finden Sie in den Veröffentlichungen von SEG:
Wir freuen uns über alle Arten von Beiträgen; Weitere Informationen finden Sie unter CONTRIBUTING.md.
xarray
IntegrationAlan Richardson hat ein großartiges kleines Tool für die Verwendung von xarray mit Segy-Dateien geschrieben, das er in diesem Notizbuch vorführt
Zu Testzwecken sind kleine SEG-Y-formatierte Dateien im Repository enthalten. Die Daten sind unsinnig und vorhersehbar gemacht und durch die Verwendung von Segyio reproduzierbar. Die Testdatei befindet sich im Testdatenverzeichnis. Um die Datendatei zu reproduzieren, erstellen Sie segyio und führen Sie die Testprogramme make-file.py
, make-ps-file.py
und make-rotated-copies.py
als solche aus:
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
Die Datei small-lsb.sgy wurde durch Ausführen des Flip-Endianness-Programms erstellt. Dieses Programm ist im Segyio-Quellbaum enthalten, aber nicht Teil des Pakets und nicht zur Verteilung und Installation gedacht, sondern nur zum Reproduzieren von Testdateien.
Die seismischen Unix-Dateien small.su und small-lsb.su wurden mit den folgenden Befehlen erstellt:
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
Wenn Sie über kleine Datendateien mit einer kostenlosen Lizenz verfügen, können Sie diese gerne an das Projekt senden!
Nützliche Bibliotheken importieren:
import segyio
import numpy as np
from shutil import copyfile
Öffnen Sie die Segy-Datei und überprüfen Sie sie:
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 )
Post-Stack-Datenwürfel lesen, der in der Segy-Datei enthalten ist:
# 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 )
In der Segy-Datei enthaltenen Pre-Stack-Datenwürfel lesen:
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 , :]])
Lesen und verstehen Sie ziemlich „unstrukturierte“ Daten (z. B. Daten, die in gemeinsamen Shot-Sammlungen sortiert sind):
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' )
Schreiben Sie eine Segy-Datei mit demselben Header einer anderen Datei, multiplizieren Sie die Daten jedoch mit *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 ]
Erstellen Sie eine Segy-Datei aus 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);
Sehr oft treten Probleme auf, wenn jemand mit der Leistung von Segyio zu kämpfen hat, insbesondere beim Erstellen neuer Dateien. Der Übeltäter ist oft dieser Code:
with segyio.create('new.sgy', spec) as dst:
dst.header = headers
Der Code selbst ist völlig in Ordnung, weist jedoch auf einigen Systemen ein subtiles Verhalten auf, wenn die Datei neu erstellt wird: Er führt viele vereinzelte Schreibvorgänge in eine Datei mit geringer Dichte aus. Dies kann schnell oder langsam sein, abhängig vom Dateisystem.
Schreiben Sie die Schleife neu, um zusammenhängend in die Datei zu schreiben:
with segyio.create('new.sgy', spec) as dst:
for i in range(spec.tracecount):
dst.header[i] = headers[i]
dst.trace[i] = traces[i]
Wenn die Datei eine geänderte Kopie einer anderen Datei ist, ohne die Trace-Längen zu ändern, ist es oft schneller (und einfacher!), die Datei zuerst ohne Segyio zu kopieren und dann Segyio zu verwenden, um die Kopie direkt zu ändern:
shutil.copyfile(srcfile, dstfile)
with segyio.open(dstfile) as f:
f.header = headers
Dieser Fehler wird angezeigt, wenn der Loader die Segyio-Kernbibliothek nicht finden kann. Wenn Sie das Installationspräfix explizit festgelegt haben (mit -DCMAKE_INSTALL_PREFIX
), müssen Sie Ihren Loader so konfigurieren, dass er auch in diesem Präfix sucht, entweder mit einer ld.conf.d
Datei oder der Variablen LD_LIBRARY_PATH
.
Wenn Sie CMAKE_INSTALL_PREFIX
nicht festgelegt haben, wird cmake standardmäßig in /usr/local
installiert, was Ihrem Loader normalerweise bekannt ist. Auf Debian-basierten Systemen wird die Bibliothek häufig unter /usr/local/lib
installiert, wovon der Loader möglicherweise nichts weiß. Siehe Ausgabe Nr. 239.
sudo ldconfig
reicht oft aus)-DCMAKE_INSTALL_LIBDIR=lib64
Diese Ausnahme wird ausgelöst, wenn Segyio versucht, die Datei im strikten Modus zu öffnen, unter der Annahme, dass es sich bei der Datei um ein reguläres, sortiertes 3D-Volumen handelt. Wenn die Datei nur eine Sammlung von Spuren in willkürlicher Reihenfolge ist, würde dies fehlschlagen.
Überprüfen Sie, ob iline
und xline
-Eingabeparameter von segyio.open für die aktuelle Datei korrekt sind. Segyio unterstützt auch Dateien, die nur eine Sammlung von Spuren sind, muss jedoch darüber informiert werden, dass dies in Ordnung ist. Übergeben Sie strict = False
ignore_geometry = True
an segyio.open
um den unstrukturierten Modus zuzulassen bzw. zu erzwingen. Bitte beachten Sie, dass f.iline
und ähnliche Funktionen jetzt deaktiviert sind und Fehler verursachen.
Segyio wurde ursprünglich von Equinor ASA geschrieben und wird von Equinor ASA als kostenlose, einfache und benutzerfreundliche Möglichkeit zur Interaktion mit seismischen Daten, die auf unsere Bedürfnisse zugeschnitten werden kann, und als Beitrag zur Gemeinschaft freier Software geschrieben.