def test_invalid_bytes_per_sample_field_raises_value_error(self, bad_dsf): assume(all(bad_dsf != f for f in DataSampleFormat) ) # IntEnum doesn't support the in operator for integers fake_header = SimpleNamespace() fake_header.data_sample_format = bad_dsf with raises(ValueError): toolkit.bytes_per_sample(fake_header)
def _make_reader(fh, encoding, trace_header_format, endian, progress, dimensionality): if encoding is None: encoding = guess_textual_header_encoding(fh) if encoding is None: encoding = ASCII textual_reel_header = read_textual_reel_header(fh, encoding) binary_reel_header = read_binary_reel_header(fh, endian) extended_textual_header = read_extended_textual_headers(fh, binary_reel_header, encoding) bps = bytes_per_sample(binary_reel_header) trace_offset_catalog, trace_length_catalog, cdp_catalog, line_catalog = catalog_traces(fh, bps, trace_header_format, endian, progress) if dimensionality is None: if cdp_catalog is not None and line_catalog is None: dimensionality = 2 elif line_catalog is not None: dimensionality = 3 else: dimensionality = 1 assert 1 <= dimensionality <= 3 if dimensionality == 1: return SegYReader(fh, textual_reel_header, binary_reel_header, extended_textual_header, trace_offset_catalog, trace_length_catalog, trace_header_format, encoding, endian) elif dimensionality == 2: return SegYReader2D(fh, textual_reel_header, binary_reel_header, extended_textual_header, trace_offset_catalog, trace_length_catalog, cdp_catalog, trace_header_format, encoding, endian) elif dimensionality == 3: return SegYReader3D(fh, textual_reel_header, binary_reel_header, extended_textual_header, trace_offset_catalog, trace_length_catalog, line_catalog, trace_header_format, encoding, endian) else: assert False, "dimensionality out of range 1-3 inclusive."
def _make_reader(fh, encoding, trace_header_format, endian, progress, dim): if encoding is None: encoding = guess_textual_header_encoding(fh) if encoding is None: encoding = ASCII textual_reel_header = read_textual_reel_header(fh, encoding) binary_reel_header = read_binary_reel_header(fh, endian) extended_textual_header = read_extended_textual_headers(fh, binary_reel_header, encoding) bps = bytes_per_sample(binary_reel_header) trace_offset_catalog, trace_length_catalog, cdp_catalog, line_catalog = catalog_traces(fh, bps, trace_header_format, endian, progress) if dim is None: # original segpy logic. if cdp_catalog is not None and line_catalog is None: return SegYReader2D(fh, textual_reel_header, binary_reel_header, extended_textual_header, trace_offset_catalog, trace_length_catalog, cdp_catalog, trace_header_format, encoding, endian) if cdp_catalog is None and line_catalog is not None: return SegYReader3D(fh, textual_reel_header, binary_reel_header, extended_textual_header, trace_offset_catalog, trace_length_catalog, line_catalog, trace_header_format, encoding, endian) return SegYReader(fh, textual_reel_header, binary_reel_header, extended_textual_header, trace_offset_catalog, trace_length_catalog, trace_header_format, encoding, endian) else: if dim == 2: return SegYReader2D(fh, textual_reel_header, binary_reel_header, extended_textual_header, trace_offset_catalog, trace_length_catalog, cdp_catalog, trace_header_format, encoding, endian) if dim == 3: return SegYReader3D(fh, textual_reel_header, binary_reel_header, extended_textual_header, trace_offset_catalog, trace_length_catalog, line_catalog, trace_header_format, encoding, endian) else: print('_make_reader(), dim must be 2 or 3') return None
def _make_reader(fh, encoding, trace_header_format, endian, progress): if encoding is None: encoding = guess_textual_header_encoding(fh) if encoding is None: encoding = ASCII textual_reel_header = read_textual_reel_header(fh, encoding) binary_reel_header = read_binary_reel_header(fh, endian) extended_textual_header = read_extended_textual_headers( fh, binary_reel_header, encoding) bps = bytes_per_sample(binary_reel_header) trace_offset_catalog, trace_length_catalog, cdp_catalog, line_catalog = catalog_traces( fh, bps, trace_header_format, endian, progress) if cdp_catalog is not None and line_catalog is None: return SegYReader2D(fh, textual_reel_header, binary_reel_header, extended_textual_header, trace_offset_catalog, trace_length_catalog, cdp_catalog, trace_header_format, encoding, endian) if cdp_catalog is None and line_catalog is not None: return SegYReader3D(fh, textual_reel_header, binary_reel_header, extended_textual_header, trace_offset_catalog, trace_length_catalog, line_catalog, trace_header_format, encoding, endian) return SegYReader(fh, textual_reel_header, binary_reel_header, extended_textual_header, trace_offset_catalog, trace_length_catalog, trace_header_format, encoding, endian)
def test_SegYReader_bytes_per_sample_is_correct(dset): fh = io.BytesIO() write_segy(fh, dset) fh.seek(0) reader = create_reader(fh) assert reader.bytes_per_sample == bytes_per_sample(dset.binary_reel_header)
def _make_reader(fh, encoding, trace_header_format, endian, progress, fast=False): if encoding is None: encoding = guess_textual_header_encoding(fh) if encoding is None: encoding = ASCII textual_reel_header = read_textual_reel_header(fh, encoding) binary_reel_header = read_binary_reel_header(fh, endian) extended_textual_header = read_extended_textual_headers(fh, binary_reel_header, encoding) revision = extract_revision(binary_reel_header) bps = bytes_per_sample(binary_reel_header, revision) if fast: try: trace_offset_catalog, trace_length_catalog, cdp_catalog, line_catalog = catalog_fixed_length_traces(fh, binary_reel_header, trace_header_format,endian, progress) except: trace_offset_catalog, trace_length_catalog, cdp_catalog, line_catalog = catalog_traces(fh, bps, trace_header_format,endian, progress) else: try: trace_offset_catalog, trace_length_catalog, cdp_catalog, line_catalog = catalog_traces(fh, bps, trace_header_format,endian, progress) except: fh.seek(REEL_HEADER_NUM_BYTES) trace_offset_catalog, trace_length_catalog, cdp_catalog, line_catalog = catalog_fixed_length_traces(fh, binary_reel_header, trace_header_format,endian, progress) if line_catalog is not None: return SegYReader3D(fh, textual_reel_header, binary_reel_header, extended_textual_header, trace_offset_catalog, trace_length_catalog, line_catalog, trace_header_format, encoding, endian) if cdp_catalog is not None: return SegYReader2D(fh, textual_reel_header, binary_reel_header, extended_textual_header, trace_offset_catalog, trace_length_catalog, cdp_catalog, trace_header_format, encoding, endian) return SegYReader(fh, textual_reel_header, binary_reel_header, extended_textual_header, trace_offset_catalog, trace_length_catalog, trace_header_format, encoding, endian)
def _make_writer(fh, encoding, trace_header_format, endian, progress, fast=False): if encoding is None: encoding = guess_textual_header_encoding(fh) if encoding is None: encoding = ASCII textual_reel_header = read_textual_reel_header(fh, encoding) binary_reel_header = read_binary_reel_header(fh, endian) extended_textual_header = read_extended_textual_headers(fh, binary_reel_header, encoding) revision = extract_revision(binary_reel_header) bps = bytes_per_sample(binary_reel_header, revision) if fast: try: trace_offset_catalog, trace_length_catalog, cdp_catalog, line_catalog = catalog_fixed_length_traces(fh, binary_reel_header, trace_header_format,endian, progress) except: trace_offset_catalog, trace_length_catalog, cdp_catalog, line_catalog = catalog_traces(fh, bps, trace_header_format,endian, progress) else: try: trace_offset_catalog, trace_length_catalog, cdp_catalog, line_catalog = catalog_traces(fh, bps, trace_header_format,endian, progress) except: fh.seek(REEL_HEADER_NUM_BYTES) trace_offset_catalog, trace_length_catalog, cdp_catalog, line_catalog = catalog_fixed_length_traces(fh, binary_reel_header, trace_header_format,endian, progress) if line_catalog is not None: return SegYWriter3D(fh, textual_reel_header, binary_reel_header, extended_textual_header, trace_offset_catalog, trace_length_catalog, line_catalog, trace_header_format, encoding, endian) if cdp_catalog is not None: return SegYWriter2D(fh, textual_reel_header, binary_reel_header, extended_textual_header, trace_offset_catalog, trace_length_catalog, cdp_catalog, trace_header_format, encoding, endian) return SegYWriter(fh, textual_reel_header, binary_reel_header, extended_textual_header, trace_offset_catalog, trace_length_catalog, trace_header_format, encoding, endian)
def __init__(self, fh, textual_reel_header, binary_reel_header, extended_textual_headers, trace_offset_catalog, trace_length_catalog, trace_header_format, encoding, endian='>'): """Initialize a SegYReader around a file-like-object. Note: Usually a SegYReader is most easily constructed using the create_reader() function. Args: fh: A file-like object, which must support seeking and support binary reading. textual_reel_header: A sequence of forty 80-character Unicode strings containing header data. binary_reel_header: A Header object containing reel header data. extended_textual_headers: A sequence of sequences of Unicode strings. trace_offset_catalog: A mapping from zero-based trace_samples index to the byte-offset to individual traces within the file. trace_length_catalog: A mapping from zero-based trace_samples index to the number of samples in that trace_samples. trace_header_format: The class defining the layout of the trace header. encoding: Either ASCII or EBCDIC. endian: '>' for big-endian data (the standard and default), '<' for little-endian (non-standard) """ self._fh = fh self._endian = endian self._encoding = encoding self._textual_reel_header = textual_reel_header self._binary_reel_header = binary_reel_header self._extended_textual_headers = extended_textual_headers self._trace_header_packer = make_header_packer(trace_header_format, endian) self._trace_offset_catalog = trace_offset_catalog self._trace_length_catalog = trace_length_catalog self._revision = extract_revision(self._binary_reel_header) self._bytes_per_sample = bytes_per_sample(self._binary_reel_header, self.revision) self._max_num_trace_samples = None
def __init__(self, fh, textual_reel_header, binary_reel_header, extended_textual_headers, trace_offset_catalog, trace_length_catalog, trace_header_format, encoding, endian='>'): """Initialize a SegYReader around a file-like-object. Note: Usually a SegYReader is most easily constructed using the create_reader() function. Args: fh: A file-like object, which must support seeking and support binary reading. textual_reel_header: A sequence of forty 80-character Unicode strings containing header data. binary_reel_header: A Header object containing reel header data. extended_textual_headers: A sequence of sequences of Unicode strings. trace_offset_catalog: A mapping from zero-based trace_samples index to the byte-offset to individual traces within the file. trace_length_catalog: A mapping from zero-based trace_samples index to the number of samples in that trace_samples. trace_header_format: The class defining the layout of the trace header. encoding: Either ASCII or EBCDIC. endian: '>' for big-endian data (the standard and default), '<' for little-endian (non-standard) """ self._fh = fh self._endian = endian self._encoding = encoding self._textual_reel_header = textual_reel_header self._binary_reel_header = binary_reel_header self._extended_textual_headers = extended_textual_headers self._trace_header_packer = make_header_packer(trace_header_format, endian) self._trace_offset_catalog = trace_offset_catalog self._trace_length_catalog = trace_length_catalog self._revision = extract_revision(self._binary_reel_header) self._bytes_per_sample = bytes_per_sample( self._binary_reel_header, self.revision) self._max_num_trace_samples = None
def _make_reader(fh, encoding, trace_header_format, endian, progress): if encoding is None: encoding = guess_textual_header_encoding(fh) if encoding is None: encoding = ASCII textual_reel_header = read_textual_reel_header(fh, encoding) binary_reel_header = read_binary_reel_header(fh, endian) extended_textual_header = read_extended_textual_headers(fh, binary_reel_header, encoding) bps = bytes_per_sample(binary_reel_header) trace_offset_catalog, trace_length_catalog, cdp_catalog, line_catalog = catalog_traces(fh, bps, trace_header_format, endian, progress) if cdp_catalog is not None and line_catalog is None: return SegYReader2D(fh, textual_reel_header, binary_reel_header, extended_textual_header, trace_offset_catalog, trace_length_catalog, cdp_catalog, trace_header_format, encoding, endian) if cdp_catalog is None and line_catalog is not None: return SegYReader3D(fh, textual_reel_header, binary_reel_header, extended_textual_header, trace_offset_catalog, trace_length_catalog, line_catalog, trace_header_format, encoding, endian) return SegYReader(fh, textual_reel_header, binary_reel_header, extended_textual_header, trace_offset_catalog, trace_length_catalog, trace_header_format, encoding, endian)
def test_valid_bytes_per_sample(self, binary_reel_header): bps = toolkit.bytes_per_sample(binary_reel_header) assert bps in {1, 2, 4}
def create_reader(fh, encoding=None, endian='>', progress=None): """Create a SegYReader (or one of its subclasses) based on performing a scan of SEG Y data. This function is the preferred method for creating SegYReader objects. It reads basic header information and attempts to build indexes for traces, CDP numbers (for 2D surveys), and inline and cross line co-ordinates (for 3D surveys) to facilitate subsequent random-access to traces. Args: fh: A file-like-object open in binary mode positioned such that the beginning of the reel header will be the next byte to be read. For disk-based SEG Y files, this is the beginning of the file. encoding: An optional text encoding for the textual headers. If None (the default) a heuristic will be used to guess the header encoding. endian: '>' for big-endian data (the standard and default), '<' for little-endian (non-standard) progress: A unary callable which will be passed a number between zero and one indicating the progress made. If provided, this callback will be invoked at least once with an argument equal to one. Raises: ValueError: ``fh`` is unsuitable for some reason, such as not being open, not being seekable, not being in binary mode, or being too short. Returns: A SegYReader object. Depending on the exact type of the SegYReader returned different capabilities may be available. Inspect the returned object to determine these capabilities, or be prepared for capabilities not defined in the SegYReader base class to be unavailable. The underlying file-like object must remain open for the duration of use of the returned reader object. It is the caller's responsibility to close the underlying file. Example: with open('my_seismic_data.sgy', 'rb') as fh: reader = create_reader(fh) print(reader.num_traces()) """ if hasattr(fh, 'encoding') and fh.encoding is not None: raise TypeError( "SegYReader must be provided with a binary mode file object") if not seekable(fh): raise TypeError( "SegYReader must be provided with a seekable file object") if fh.closed: raise ValueError( "SegYReader must be provided with an open file object") num_file_bytes = file_length(fh) if num_file_bytes < REEL_HEADER_NUM_BYTES: raise ValueError( "SEG Y file {!r} of {} bytes is too short".format( filename_from_handle(fh), num_file_bytes)) if endian not in ('<', '>'): raise ValueError("Unrecognised endian value {!r}".format(endian)) if encoding is None: encoding = guess_textual_header_encoding(fh) if encoding is None: encoding = ASCII textual_reel_header = read_textual_reel_header(fh, encoding) binary_reel_header = read_binary_reel_header(fh, endian) extended_textual_header = read_extended_textual_headers(fh, binary_reel_header, encoding) revision = extract_revision(binary_reel_header) bps = bytes_per_sample(binary_reel_header, revision) trace_offset_catalog, trace_length_catalog, cdp_catalog, line_catalog = catalog_traces(fh, bps, endian, progress) if cdp_catalog is not None and line_catalog is None: return SegYReader2D(fh, textual_reel_header, binary_reel_header, extended_textual_header, trace_offset_catalog, trace_length_catalog, cdp_catalog, encoding, endian) if cdp_catalog is None and line_catalog is not None: return SegYReader3D(fh, textual_reel_header, binary_reel_header, extended_textual_header, trace_offset_catalog, trace_length_catalog, line_catalog, encoding, endian) return SegYReader(fh, textual_reel_header, binary_reel_header, extended_textual_header, trace_offset_catalog, trace_length_catalog, encoding, endian)
def create_reader(fh, encoding=None, trace_header_format=TraceHeaderRev1, endian='>', progress=None): """Create a SegYReader (or one of its subclasses) based on performing a scan of SEG Y data. This function is the preferred method for creating SegYReader objects. It reads basic header information and attempts to build indexes for traces, CDP numbers (for 2D surveys), and inline and cross line co-ordinates (for 3D surveys) to facilitate subsequent random-access to traces. Args: fh: A file-like-object open in binary mode positioned such that the beginning of the reel header will be the next byte to be read. For disk-based SEG Y files, this is the beginning of the file. encoding: An optional text encoding for the textual headers. If None (the default) a heuristic will be used to guess the header encoding. trace_header_format: The class defining the layout of the trace header. endian: '>' for big-endian data (the standard and default), '<' for little-endian (non-standard) progress: A unary callable which will be passed a number between zero and one indicating the progress made. If provided, this callback will be invoked at least once with an argument equal to one. Raises: ValueError: ``fh`` is unsuitable for some reason, such as not being open, not being seekable, not being in binary mode, or being too short. Returns: A SegYReader object. Depending on the exact type of the SegYReader returned different capabilities may be available. Inspect the returned object to determine these capabilities, or be prepared for capabilities not defined in the SegYReader base class to be unavailable. The underlying file-like object must remain open for the duration of use of the returned reader object. It is the caller's responsibility to close the underlying file. Example: with open('my_seismic_data.sgy', 'rb') as fh: reader = create_reader(fh) print(reader.num_traces()) """ if hasattr(fh, 'encoding') and fh.encoding is not None: raise TypeError( "SegYReader must be provided with a binary mode file object") if not fh.seekable(): raise TypeError( "SegYReader must be provided with a seekable file object") if fh.closed: raise ValueError( "SegYReader must be provided with an open file object") num_file_bytes = file_length(fh) if num_file_bytes < REEL_HEADER_NUM_BYTES: raise ValueError("SEG Y file {!r} of {} bytes is too short".format( filename_from_handle(fh), num_file_bytes)) if endian not in ('<', '>'): raise ValueError("Unrecognised endian value {!r}".format(endian)) if encoding is None: encoding = guess_textual_header_encoding(fh) if encoding is None: encoding = ASCII textual_reel_header = read_textual_reel_header(fh, encoding) binary_reel_header = read_binary_reel_header(fh, endian) extended_textual_header = read_extended_textual_headers( fh, binary_reel_header, encoding) revision = extract_revision(binary_reel_header) bps = bytes_per_sample(binary_reel_header, revision) trace_offset_catalog, trace_length_catalog, cdp_catalog, line_catalog = catalog_traces( fh, bps, trace_header_format, endian, progress) if cdp_catalog is not None and line_catalog is None: return SegYReader2D(fh, textual_reel_header, binary_reel_header, extended_textual_header, trace_offset_catalog, trace_length_catalog, cdp_catalog, trace_header_format, encoding, endian) if cdp_catalog is None and line_catalog is not None: return SegYReader3D(fh, textual_reel_header, binary_reel_header, extended_textual_header, trace_offset_catalog, trace_length_catalog, line_catalog, trace_header_format, encoding, endian) return SegYReader(fh, textual_reel_header, binary_reel_header, extended_textual_header, trace_offset_catalog, trace_length_catalog, trace_header_format, encoding, endian)
def test_invalid_bytes_per_sample_field_raises_value_error(self, bad_dsf): assume(all(bad_dsf != f for f in DataSampleFormat)) # IntEnum doesn't support the in operator for integers fake_header = SimpleNamespace() fake_header.data_sample_format = bad_dsf with raises(ValueError): toolkit.bytes_per_sample(fake_header)