Home

Awesome

pyzgy

License Tests SCM Compliance PyPi Version

Convenience wrapper around Schlumberger's OpenZGY Python package which enables reading of ZGY files with a syntax familiar to users of segyio.

The package also includes native support for loading and writing of ZGY data using Xarray.

Installation

Requires openzgy package from Schlumberger, which is (for now) bundled here under Apache v2.0 license


Usage

Use segyio-like interface to read ZGY files

import pyzgy
with pyzgy.open("in.zgy")) as zgyfile:
    il_slice = zgyfile.iline[zgyfile.ilines[LINE_IDX]]
    xl_slice = zgyfile.xline[LINE_NUMBER]
    zslice = zgyfile.depth_slice[SLICE_IDX]
    trace = zgyfile.trace[TRACE_IDX]
    trace_header = zgyfile.header[TRACE_IDX]
    text_file_header = zgyfile.text[0]

Read a ZGY file with underlying functions

from pyzgy.accessors import SeismicReader
with SeismicReader("in.zgy") as reader:
    inline_slice = reader.read_inline_number(LINE_NUMBER)
    crossline_slice = reader.read_crossline(LINE_IDX)
    z_slice = reader.read_zslice_coord(SLICE_COORD)
    sub_vol = reader.read_subvolume(
        min_il=min_il, max_il=max_il,
        min_xl=min_xl, max_xl=max_xl,
        min_z=min_z, max_z=max_z
    )

Write a ZGY file with underlying function

import numpy as np
from pyzgy.accessors import SeismicWriter

# create a dummy 10x10x10 cube
data = np.zeros((10, 10, 10))

with SeismicWriter("out.zgy"
    data.shape,
    0.0, # the first sample
    4.0, # the sample increment
    (100, 100), # the first iline and xline labels
    (1, 2), # the iline and xline increments
    ) as writer:
        writer.write_volume(data)

Native access and writing with Xarray

The Xarray Backend engine provides lazy loading support for the volume only. Opening large datasets should be possible, with sub-volume browsing using the native xarray.Dataset.sel method.

import xarray as xr

# read a zgy file
zgy = xr.open_dataset("int.zgy")
inline_slice = zgy.sel(iline=LINE_NUMBER)
crossline_slice = zgy.sel(xline=XLINE_NUMBER)
z_slice = zgy.sel(sample=SAMPLE_VALUE)

sub_vol = zgy.sel(
    iline=range(LINE_START,LINE_END),
    xline=range(XLINE_START,XLINE_END),
    sample=range(SAMPLE_START,SAMPLE_END)
)

# write out to zgy file
zgy.pyzgy.to_zgy("out.zgy")

Contributing

Contributions welcomed, whether you are reporting or fixing a bug, implementing or requesting a feature. Either make a github issue or fork the project and make a pull request. Please extend the unit tests with relevant passing/failing tests, run these as: python -m pytest