[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