Официальная документация размещена на readthedocs.
Segyio — это небольшая библиотека C, лицензированная LGPL, для простого взаимодействия с сейсмическими данными в формате SEG-Y и Seismic Unix, с языковыми привязками для Python и Matlab. Segyio — это попытка создать простую в использовании, встраиваемую, ориентированную на сообщество библиотеку для сейсмических приложений. Функции добавляются по мере необходимости; предложения и вклад любого рода приветствуются.
Чтобы быть в курсе последних разработок и функций, смотрите журнал изменений. Чтобы написать будущий код, ознакомьтесь с запланированными критическими изменениями.
Когда segyio собран и установлен, вы готовы приступить к программированию! Ознакомьтесь с учебным пособием, примерами, примерами программ и примерами блокнотов. Техническую справку с примерами и небольшими рецептами можно найти в документации. Документы API также доступны с pydoc — запустите свой любимый интерпретатор Python и введите help(segyio)
, который должен хорошо интегрироваться с IDLE, pycharm и другими инструментами Python.
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 )]
Подробнее смотрите в примерах.
Копия segyio доступна как в виде готовых двоичных файлов, так и в виде исходного кода:
apt install python3-segyio
pip install segyio
git clone https://github.com/statoil/segyio
Для сборки segyio вам понадобится:
Для сборки документации вам также понадобится sphinx
Чтобы собрать и установить segyio, выполните следующие действия в консоли:
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
необходимо выполнять от имени пользователя root; если вы хотите установить в свой домашний каталог, добавьте -DCMAKE_INSTALL_PREFIX=~/
или другой подходящий каталог или make DESTDIR=~/ install
. Убедитесь, что ваша среда поддерживает нестандартные места установки (PYTHONPATH, LD_LIBRARY_PATH и PATH).
Если у вас есть несколько установок Python или вы хотите использовать какой-либо альтернативный интерпретатор, вы можете помочь cmake найти правильный, передав -DPYTHON_EXECUTABLE=/opt/python/binary
вместе с префиксом установки и типом сборки.
Чтобы создать привязки Matlab, вызовите CMake с опцией -DBUILD_MEX=ON
. В некоторых средах двоичные файлы Matlab находятся в нестандартном расположении, и в этом случае вам нужно помочь CMake найти двоичные файлы Matlab, передав -DMATLAB_ROOT=/path/to/matlab
.
Рекомендуется выполнять сборку в режиме отладки, чтобы получать больше предупреждений и встраивать символы отладки в объекты. Замены Debug
на Release
в CMAKE_BUILD_TYPE
вполне достаточно.
Тесты расположены в каталогах языка/тестов, и настоятельно рекомендуется демонстрировать корректность и контрактность новых добавленных функций путем добавления теста. Все тесты можно запустить, вызвав ctest
. Не стесняйтесь использовать уже написанные тесты в качестве руководства.
После сборки segyio вы можете запустить тесты с помощью ctest
, выполняемого из каталога сборки.
Обратите внимание: для запуска примеров Python вам необходимо сообщить вашей среде, где найти библиотеку Python. Его можно установить как пользователь или добавить библиотеку segyio/build/python в ваш путь к Python.
Весь код в этом руководстве предполагает, что segyio импортирован и что numpy доступен как np.
import segyio
import numpy as np
В этом руководстве предполагается, что вы знакомы с Python и numpy. Для обновления ознакомьтесь с руководством по Python и кратким руководством по numpy.
Открытие файла для чтения осуществляется с помощью функции segyio.open
и идиоматически используется с менеджерами контекста. Используя оператор with
, файлы корректно закрываются даже в случае исключений. По умолчанию файлы открываются только для чтения.
with segyio . open ( filename ) as f :
...
Open принимает несколько опций (более подробную информацию можно найти в документации функции open с помощью help(segyio.open)
. Наиболее важной опцией является второй (необязательный) позиционный аргумент. Чтобы открыть файл для записи, выполните segyio.open(filename, 'r+')
из функции C fopen
.
Файлы можно открыть в неструктурированном режиме, либо передав segyio.open
необязательные аргументы strict=False
, и в этом случае отсутствие установления структуры (встроенные числа, числа перекрестных линий и т. д.) не является ошибкой, либо ignore_geometry=True
, и в этом случае segyio даже не попытается установить эти внутренние атрибуты.
Объект файла segy имеет несколько общедоступных атрибутов, описывающих эту структуру:
f.ilines
Выведенные строчные числаf.xlines
Предполагаемые номера пересеченийf.offsets
Предполагаемые числа смещенийf.samples
Предполагаемые смещения выборки (частота и задержка времени записи)f.unstructured
True, если неструктурировано, False, если структурированоf.ext_headers
Количество расширенных текстовых заголовков. Если файл открыт неструктурированный , все свойства строки будут None
.
В segyio данные извлекаются и записываются через так называемые режимы . Режимы представляют собой абстрактные массивы или схемы адресации и меняют значение имен и индексов. Все режимы являются свойствами объекта дескриптора файла, поддерживают функцию len
, а чтение и запись выполняются через f.mode[]
. Запись осуществляется с присвоением. Режимы поддерживают нарезку массива, вдохновленную numpy. Доступны следующие режимы:
trace
Режим трассировки предлагает необработанную адресацию трассировок в том виде, в котором они расположены в файле. Это, наряду с header
, единственный режим, доступный для неструктурированных файлов. Трассировки нумеруются 0..len(f.trace)
.
Чтение трассировки дает numpy ndarray
, а чтение нескольких трассировок дает генератор ndarray
s. Используется семантика генератора, и один и тот же объект используется повторно, поэтому, если вы хотите кэшировать или адресовать данные трассировки позже, вам необходимо явно скопировать.
> >> f . trace [ 10 ]
> >> f . trace [ - 2 ]
> >> f . trace [ 15 : 45 ]
> >> f . trace [: 45 : 3 ]
header
Благодаря поведению адресации, аналогичному trace
, доступ к элементам дает объекты заголовка вместо numpy ndarray
s. Заголовки — это объекты, похожие на dict, где ключи — целые числа, ключи в стиле сейсмического Unix (в модуле segyio.su) и перечисления segyio (segyio.TraceField).
Значения заголовка можно обновить, назначив ему аналогичный dict, а ключи, отсутствующие в правой части назначения, не изменяются .
> >> f . header [ 5 ] = { segyio . su . tracl : 10 }
> >> f . header [ 5 ]. items ()
> >> f . header [ 5 ][ 25 , 37 ] # read multiple values at once
iline
, xline
Эти режимы вызовут ошибку, если файл неструктурирован. Они рассматривают аргументы []
как ключи соответствующих строк. Номера строк всегда увеличиваются, но интервалы могут быть произвольными и неравномерными. Допустимые имена можно найти в свойствах ilines
и xlines
.
Как и в случае с трассировками, получение одной строки дает ndarray
, а фрагмент строк дает генератор ndarray
. При использовании фрагментов с шагом некоторые промежуточные элементы могут быть пропущены, если они не соответствуют шагу, например, выполнение f.line[1:10:3]
в файле со строками [1,2,3,4,5]
эквивалентно поиску 1, 4, 7
и нахождению [1,4]
.
При работе с 4D-файлом до суммирования первое смещение считывается неявно. Чтобы получить доступ к другому или диапазону смещений, используйте индексы или диапазоны, разделенные запятыми, например: f.iline[120, 4]
.
fast
, slow
Это псевдонимы для iline
и xline
, определяемые тем, как расположены трассировки. Для файлов с встроенной сортировкой fast
даст iline
.
depth_slice
Срез глубины — это горизонтальный разрез шириной в файл на глубине. Полученные значения — это ndarray
и генераторы массивов.
gather
gather
представляет собой пересечение прямой и поперечной линий, вертикального столбца съемки, и, если не указано одно смещение, возвращается смещение x выборок ndarray
. При наличии диапазонов он возвращает генератор таких ndarray
s.
text
text
режим представляет собой массив текстовых заголовков, где text[0]
— это стандартный текстовый заголовок, а 1..n
— необязательные расширенные заголовки.
Текстовые заголовки возвращаются в виде байтовых объектов размером 3200 байт, как и в файле. Функция segyio.tools.wrap
может создать построчно-ориентированную версию этой строки.
bin
Значения двоичного заголовка всего файла с интерфейсом, похожим на dict. Ведёт себя как режим header
, но без индексации.
> >> 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 ))
Дополнительные примеры и рецепты можно найти в документации help(segyio)
и в разделе примеров.
Segyio не обязательно пытается быть конечной точкой взаимодействия SEG-Y; скорее, мы стремимся снизить барьер для взаимодействия с файлами SEG-Y для встраивания, новых приложений или автономных программ.
Кроме того, целью не является поддержка файлов полного стандартного или всех экзотических (но совместимых со стандартами) форматированных файлов. Сделаны некоторые предположения, например:
На данный момент segyio поддерживает:
Функции записи в segyio в основном предназначены для изменения или адаптации файлов. Файл, созданный с нуля, не обязательно является файлом SEG-Y, соответствующим спецификации, поскольку мы обязательно записываем только поля заголовков, необходимые segyio для понимания геометрии. По-прежнему настоятельно рекомендуется поддерживать и записывать файлы SEG-Y в соответствии со спецификацией, но segyio не обеспечивает этого.
Segyio может обрабатывать множество файлов, похожих на SEG-Y, то есть Segyio обрабатывает файлы, которые не соответствуют строго стандарту SEG-Y. Segyio также не делает различий между ревизиями, а вместо этого пытается использовать информацию, имеющуюся в файле. Справочную информацию о действующих стандартах можно найти в публикациях SEG:
Мы приветствуем любые виды вкладов; пожалуйста, смотрите CONTRIBUTING.md.
xarray
Алан Ричардсон написал отличный небольшой инструмент для использования xarray с файлами segy, который он демонстрирует в этом блокноте.
Небольшие файлы в формате SEG-Y включены в репозиторий в целях тестирования. Данные бессмысленны и сделаны предсказуемыми, и их можно воспроизвести с помощью segyio. Файл тестов находится в каталоге test-data. Чтобы воспроизвести файл данных, соберите segyio и запустите тестовую программу make-file.py
, make-ps-file.py
и make-rotated-copies.py
следующим образом:
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
Файл small-lsb.sgy был создан путем запуска программы обратного порядка байтов. Эта программа включена в дерево исходников segyio, но не является частью пакета и не предназначена для распространения и установки, а только для воспроизведения тестовых файлов.
Сейсмические unix-файлы small.su и small-lsb.su были созданы следующими командами:
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
Если у вас есть небольшие файлы данных с бесплатной лицензией, смело отправляйте их в проект!
Импортируйте полезные библиотеки:
import segyio
import numpy as np
from shutil import copyfile
Откройте файл segy и проверьте его:
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 )
Прочитайте куб данных после стека, содержащийся в файле 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 )
Прочитайте куб данных до суммирования, содержащийся в файле 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 , :]])
Прочтите и поймите довольно «неструктурированные» данные (например, данные, отсортированные по обычным снимкам):
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' )
Запишите файл segy, используя тот же заголовок другого файла, но умножьте данные на *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 ]
Сделать segy-файл с нуля
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);
Довольно часто проблемы возникают, когда у кого-то возникают проблемы с производительностью segyio, особенно при создании новых файлов. Виновником часто является этот код:
with segyio.create('new.sgy', spec) as dst:
dst.header = headers
С самим кодом все в порядке, но в некоторых системах он ведет себя тонко, когда файл создается заново: он выполняет множество разрозненных операций записи в разреженный файл. Это может быть быстро или медленно, во многом в зависимости от файловой системы.
Перепишите цикл для непрерывной записи в файл:
with segyio.create('new.sgy', spec) as dst:
for i in range(spec.tracecount):
dst.header[i] = headers[i]
dst.trace[i] = traces[i]
Если файл представляет собой модифицированную копию другого файла, без изменения длины трассировки, часто быстрее (и проще!) сначала скопировать файл без segyio, а затем использовать segyio для изменения копии на месте:
shutil.copyfile(srcfile, dstfile)
with segyio.open(dstfile) as f:
f.header = headers
Эта ошибка появляется, когда загрузчик не может найти основную библиотеку segyio. Если вы явно установили префикс установки (с помощью -DCMAKE_INSTALL_PREFIX
), вы должны настроить свой загрузчик так, чтобы он также просматривал этот префикс либо с помощью файла ld.conf.d
, либо с помощью переменной LD_LIBRARY_PATH
.
Если вы не установили CMAKE_INSTALL_PREFIX
, cmake по умолчанию будет установлен в /usr/local
, о чем обычно знает ваш загрузчик. В системах на базе Debian библиотека часто устанавливается в /usr/local/lib
, о чем загрузчик может не знать. См. выпуск №239.
sudo ldconfig
)-DCMAKE_INSTALL_LIBDIR=lib64
Это исключение возникает, когда segyio пытается открыть файл в строгом режиме, предполагая, что файл представляет собой обычный отсортированный трехмерный объем. Если файл представляет собой просто набор трассировок в произвольном порядке, это не удастся.
Проверьте, верны ли входные параметры segyio.open iline
и xline
для текущего файла. Segyio также поддерживает файлы, которые представляют собой просто набор следов, но нужно сказать, что это нормально. Передайте strict = False
или ignore_geometry = True
в segyio.open
чтобы разрешить или принудительно включить неструктурированный режим соответственно. Обратите внимание, что f.iline
и подобные функции теперь отключены и будут вызывать ошибки.
Segyio изначально был написан и поддерживается Equinor ASA как бесплатный, простой и удобный в использовании способ взаимодействия с сейсмическими данными, который можно адаптировать к нашим потребностям, а также как вклад в сообщество свободного программного обеспечения.