[segyio] 114/376: Store offset indices/numbers, not cardinality
Jørgen Kvalsvik
jokva-guest at moszumanska.debian.org
Wed Sep 20 08:04:17 UTC 2017
This is an automated email from the git hooks/post-receive script.
jokva-guest pushed a commit to branch debian
in repository segyio.
commit a0fd41d0e4a8491c83483cf7ff7f06a93ca2496a
Author: Jørgen Kvalsvik <jokva at statoil.com>
Date: Wed Nov 9 15:11:33 2016 +0100
Store offset indices/numbers, not cardinality
Extends the offsets support to not only store cardinality, but also the
actual offset numbers. Cardinality can be obtained with len()
---
python/segyio/_line.py | 4 ++--
python/segyio/_segyio.c | 32 +++++++++++++++++++++++++++-----
python/segyio/create.py | 9 +++++----
python/segyio/open.py | 12 +++++++-----
python/segyio/segy.py | 6 +++---
tests/test_segyio_c.py | 35 +++++++++++++++++++++--------------
6 files changed, 65 insertions(+), 33 deletions(-)
diff --git a/python/segyio/_line.py b/python/segyio/_line.py
index c5341ed..902b9ee 100644
--- a/python/segyio/_line.py
+++ b/python/segyio/_line.py
@@ -62,7 +62,7 @@ class Line:
except TypeError:
raise TypeError("Must be int or slice")
else:
- t0 = self.trace0fn(lineno, self.segy.offsets)
+ t0 = self.trace0fn(lineno, len(self.segy.offsets))
return self.readfn(t0, self.len, self.stride, buf)
def trace0fn(self, lineno, offsets):
@@ -81,7 +81,7 @@ class Line:
return
- t0 = self.trace0fn(lineno, self.segy.offsets)
+ t0 = self.trace0fn(lineno, len(self.segy.offsets))
self.writefn(t0, self.len, self.stride, val)
def __len__(self):
diff --git a/python/segyio/_segyio.c b/python/segyio/_segyio.c
index 3854087..10a676a 100644
--- a/python/segyio/_segyio.c
+++ b/python/segyio/_segyio.c
@@ -582,6 +582,7 @@ static PyObject *py_init_metrics(PyObject *self, PyObject *args) {
PyObject *dict = PyDict_New();
PyDict_SetItemString(dict, "iline_field", Py_BuildValue("i", il_field));
PyDict_SetItemString(dict, "xline_field", Py_BuildValue("i", xl_field));
+ PyDict_SetItemString(dict, "offset_field", Py_BuildValue("i", 37));
PyDict_SetItemString(dict, "trace0", Py_BuildValue("l", trace0));
PyDict_SetItemString(dict, "sample_count", Py_BuildValue("I", sample_count));
PyDict_SetItemString(dict, "format", Py_BuildValue("i", format));
@@ -621,14 +622,16 @@ static Py_buffer check_and_get_buffer(PyObject *object, const char *name, unsign
}
-static PyObject *py_init_line_indices(PyObject *self, PyObject *args) {
+static PyObject *py_init_indices(PyObject *self, PyObject *args) {
errno = 0;
PyObject *file_capsule = NULL;
PyObject *metrics = NULL;
PyObject *iline_out = NULL;
PyObject *xline_out = NULL;
+ PyObject *offset_out = NULL;
- PyArg_ParseTuple(args, "OOOO", &file_capsule, &metrics, &iline_out, &xline_out);
+ PyArg_ParseTuple(args, "OOOOO", &file_capsule, &metrics,
+ &iline_out, &xline_out, &offset_out);
segy_file *p_FILE = get_FILE_pointer_from_capsule(file_capsule);
@@ -641,8 +644,10 @@ static PyObject *py_init_line_indices(PyObject *self, PyObject *args) {
unsigned int iline_count;
unsigned int xline_count;
+ unsigned int offset_count;
PyArg_Parse(PyDict_GetItemString(metrics, "iline_count"), "I", &iline_count);
PyArg_Parse(PyDict_GetItemString(metrics, "xline_count"), "I", &xline_count);
+ PyArg_Parse(PyDict_GetItemString(metrics, "offset_count"), "I", &offset_count);
if (PyErr_Occurred()) { return NULL; }
@@ -657,17 +662,25 @@ static PyObject *py_init_line_indices(PyObject *self, PyObject *args) {
return NULL;
}
+ Py_buffer offsets_buffer = check_and_get_buffer(offset_out, "offsets", offset_count);
+
+ if (PyErr_Occurred()) {
+ PyBuffer_Release(&iline_buffer);
+ PyBuffer_Release(&xline_buffer);
+ return NULL;
+ }
+
int il_field;
int xl_field;
+ int offset_field;
int sorting;
- unsigned int offset_count;
long trace0;
unsigned int trace_bsize;
PyArg_Parse(PyDict_GetItemString(metrics, "iline_field"), "i", &il_field);
PyArg_Parse(PyDict_GetItemString(metrics, "xline_field"), "i", &xl_field);
+ PyArg_Parse(PyDict_GetItemString(metrics, "offset_field"), "i", &offset_field);
PyArg_Parse(PyDict_GetItemString(metrics, "sorting"), "i", &sorting);
- PyArg_Parse(PyDict_GetItemString(metrics, "offset_count"), "I", &offset_count);
PyArg_Parse(PyDict_GetItemString(metrics, "trace0"), "l", &trace0);
PyArg_Parse(PyDict_GetItemString(metrics, "trace_bsize"), "I", &trace_bsize);
@@ -685,6 +698,15 @@ static PyObject *py_init_line_indices(PyObject *self, PyObject *args) {
py_handle_segy_error_with_fields(error, errno, il_field, xl_field, 2);
}
+ error = segy_offset_indices( p_FILE, offset_field, offset_count,
+ offsets_buffer.buf,
+ trace0, trace_bsize );
+
+ if (error != 0) {
+ py_handle_segy_error_with_fields(error, errno, il_field, xl_field, 2);
+ }
+
+ PyBuffer_Release(&offsets_buffer);
PyBuffer_Release(&xline_buffer);
PyBuffer_Release(&iline_buffer);
return Py_BuildValue("");
@@ -920,7 +942,7 @@ static PyMethodDef SegyMethods[] = {
{"init_line_metrics", (PyCFunction) py_init_line_metrics, METH_VARARGS, "Find the length and stride of inline and crossline."},
{"init_metrics", (PyCFunction) py_init_metrics, METH_VARARGS, "Find most metrics for a segy file."},
- {"init_line_indices", (PyCFunction) py_init_line_indices, METH_VARARGS, "Find the indices for inline and crossline."},
+ {"init_indices", (PyCFunction) py_init_indices, METH_VARARGS, "Find the indices for inline, crossline and offsets."},
{"fread_trace0", (PyCFunction) py_fread_trace0, METH_VARARGS, "Find trace0 of a line."},
{"read_trace", (PyCFunction) py_read_trace, METH_VARARGS, "Read trace data."},
{"write_trace", (PyCFunction) py_write_trace, METH_VARARGS, "Write trace data."},
diff --git a/python/segyio/create.py b/python/segyio/create.py
index 5f65ba5..8f07ef8 100644
--- a/python/segyio/create.py
+++ b/python/segyio/create.py
@@ -102,10 +102,10 @@ def create(filename, spec):
txt_hdr_sz = segyio._segyio.textheader_size()
bin_hdr_sz = segyio._segyio.binheader_size()
f._tr0 = txt_hdr_sz + bin_hdr_sz + (spec.ext_headers * txt_hdr_sz)
- f._sorting = spec.sorting
+ f._sorting = spec.sorting
f._fmt = int(spec.format)
- f._offsets = spec.offsets
- f._tracecount = len(spec.ilines) * len(spec.xlines) * spec.offsets
+ f._offsets = numpy.copy(numpy.asarray(spec.offsets, dtype = numpy.intc))
+ f._tracecount = len(spec.ilines) * len(spec.xlines) * len(spec.offsets)
f._il = int(spec.iline)
f._ilines = numpy.copy(numpy.asarray(spec.ilines, dtype=numpy.uintc))
@@ -113,7 +113,8 @@ def create(filename, spec):
f._xl = int(spec.xline)
f._xlines = numpy.copy(numpy.asarray(spec.xlines, dtype=numpy.uintc))
- line_metrics = segyio._segyio.init_line_metrics(f.sorting, f.tracecount, len(f.ilines), len(f.xlines), f.offsets)
+ line_metrics = segyio._segyio.init_line_metrics(f.sorting, f.tracecount,
+ len(f.ilines), len(f.xlines), len(f.offsets))
f._iline_length = line_metrics['iline_length']
f._iline_stride = line_metrics['iline_stride']
diff --git a/python/segyio/open.py b/python/segyio/open.py
index c0fb384..527a36b 100644
--- a/python/segyio/open.py
+++ b/python/segyio/open.py
@@ -60,15 +60,17 @@ def open(filename, mode="r", iline=189, xline=193):
f._tracecount = metrics['trace_count']
f._sorting = metrics['sorting']
- f._offsets = metrics['offset_count']
iline_count, xline_count = metrics['iline_count'], metrics['xline_count']
+ offset_count = metrics['offset_count']
- line_metrics = segyio._segyio.init_line_metrics(f.sorting, f.tracecount, iline_count, xline_count, f.offsets)
+ line_metrics = segyio._segyio.init_line_metrics(f.sorting, f.tracecount,
+ iline_count, xline_count, offset_count)
- f._ilines = numpy.zeros(iline_count, dtype=numpy.uintc)
- f._xlines = numpy.zeros(xline_count, dtype=numpy.uintc)
- segyio._segyio.init_line_indices(f.xfd, metrics, f.ilines, f.xlines)
+ f._ilines = numpy.zeros(iline_count, dtype=numpy.uintc)
+ f._xlines = numpy.zeros(xline_count, dtype=numpy.uintc)
+ f._offsets = numpy.zeros(offset_count, dtype = numpy.uintc)
+ segyio._segyio.init_indices(f.xfd, metrics, f.ilines, f.xlines, f.offsets)
f._iline_length = line_metrics['iline_length']
f._iline_stride = line_metrics['iline_stride']
diff --git a/python/segyio/segy.py b/python/segyio/segy.py
index adbed7f..e7b8dec 100644
--- a/python/segyio/segy.py
+++ b/python/segyio/segy.py
@@ -143,7 +143,7 @@ class SegyFile(object):
@property
def offsets(self):
- """ :rtype: int """
+ """ :rtype: numpy.ndarray"""
return self._offsets
@property
@@ -373,7 +373,7 @@ class SegyFile(object):
return self._shape_buffer(shape, buf)
def _fread_line(self, trace0, length, stride, buf):
- offsets = self.offsets
+ offsets = len(self.offsets)
return _segyio.read_line(self.xfd, trace0, length, stride, offsets, buf, self._tr0, self._bsz, self._fmt, self.samples)
@property
@@ -760,7 +760,7 @@ class spec:
self.ilines = None
self.xline = 193
self.xlines = None
- self.offsets = 1
+ self.offsets = [1]
self.samples = None
self.tracecount = None
self.ext_headers = 0
diff --git a/tests/test_segyio_c.py b/tests/test_segyio_c.py
index 35b500e..8f33382 100644
--- a/tests/test_segyio_c.py
+++ b/tests/test_segyio_c.py
@@ -212,7 +212,7 @@ class _segyioTests(TestCase):
with self.assertRaises(IOError):
metrics = _segyio.init_metrics(f, binary_header, ilb, xlb)
- def test_line_indices(self):
+ def test_indices(self):
f = _segyio.open(self.filename, "r")
binary_header = _segyio.read_binaryheader(f)
@@ -221,45 +221,50 @@ class _segyioTests(TestCase):
metrics = _segyio.init_metrics(f, binary_header, ilb, xlb)
dmy = numpy.zeros(2, dtype=numpy.uintc)
- dummy_metrics = {'xline_count': 2, 'iline_count': 2}
+ dummy_metrics = {'xline_count': 2,
+ 'iline_count': 2,
+ 'offset_count': 1}
with self.assertRaises(TypeError):
- _segyio.init_line_indices(".", {}, dmy, dmy)
+ _segyio.init_indices(".", {}, dmy, dmy, dmy)
with self.assertRaises(TypeError):
- _segyio.init_line_indices(f, "-", dmy, dmy)
+ _segyio.init_indices(f, "-", dmy, dmy, dmy)
# with self.assertRaises(KeyError):
- # _segyio.init_line_indices(f, {}, dmy, dmy)
+ # _segyio.init_indices(f, {}, dmy, dmy, dmy)
with self.assertRaises(TypeError):
- _segyio.init_line_indices(f, dummy_metrics, 1, dmy)
+ _segyio.init_indices(f, dummy_metrics, 1, dmy, dmy)
with self.assertRaises(TypeError):
- _segyio.init_line_indices(f, dummy_metrics, dmy, 2)
+ _segyio.init_indices(f, dummy_metrics, dmy, 2, dmy)
with self.assertRaises(TypeError):
- _segyio.init_line_indices(f, dummy_metrics, dmy, 2)
+ _segyio.init_indices(f, dummy_metrics, dmy, dmy, 2)
with self.assertRaises(TypeError):
fdmy = numpy.zeros(1, dtype=numpy.single)
- _segyio.init_line_indices(f, dummy_metrics, fdmy, dmy)
+ _segyio.init_indices(f, dummy_metrics, fdmy, dmy, dmy)
one = numpy.zeros(1, dtype=numpy.uintc)
two = numpy.zeros(2, dtype=numpy.uintc)
+ off = numpy.zeros(1, dtype=numpy.uintc)
with self.assertRaises(ValueError):
- _segyio.init_line_indices(f, dummy_metrics, one, two)
+ _segyio.init_indices(f, dummy_metrics, one, two, off)
with self.assertRaises(ValueError):
- _segyio.init_line_indices(f, dummy_metrics, two, one)
+ _segyio.init_indices(f, dummy_metrics, two, one, off)
# Happy Path
iline_indexes = numpy.zeros(metrics['iline_count'], dtype=numpy.uintc)
xline_indexes = numpy.zeros(metrics['xline_count'], dtype=numpy.uintc)
- _segyio.init_line_indices(f, metrics, iline_indexes, xline_indexes)
+ offsets = numpy.zeros(metrics['offset_count'], dtype=numpy.uintc)
+ _segyio.init_indices(f, metrics, iline_indexes, xline_indexes, offsets)
self.assertListEqual([1, 2, 3, 4, 5], list(iline_indexes))
self.assertListEqual([20, 21, 22, 23, 24], list(xline_indexes))
+ self.assertListEqual([1], list(offsets))
_segyio.close(f)
@@ -282,7 +287,8 @@ class _segyioTests(TestCase):
iline_indexes = numpy.zeros(metrics['iline_count'], dtype=numpy.uintc)
xline_indexes = numpy.zeros(metrics['xline_count'], dtype=numpy.uintc)
- _segyio.init_line_indices(f, metrics, iline_indexes, xline_indexes)
+ offsets = numpy.zeros(metrics['offset_count'], dtype=numpy.uintc)
+ _segyio.init_indices(f, metrics, iline_indexes, xline_indexes, offsets)
with self.assertRaises(KeyError):
_segyio.fread_trace0(0, len(xline_indexes), line_metrics['iline_stride'], offset_count, iline_indexes, "inline")
@@ -413,7 +419,8 @@ class _segyioTests(TestCase):
iline_indexes = numpy.zeros(metrics['iline_count'], dtype=numpy.uintc)
xline_indexes = numpy.zeros(metrics['xline_count'], dtype=numpy.uintc)
- _segyio.init_line_indices(f, metrics, iline_indexes, xline_indexes)
+ offsets = numpy.zeros(metrics['offset_count'], dtype=numpy.uintc)
+ _segyio.init_indices(f, metrics, iline_indexes, xline_indexes, offsets)
return f, metrics, iline_indexes, xline_indexes
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/segyio.git
More information about the debian-science-commits
mailing list