Source code for obspy.io.gcf.core

# -*- coding: utf-8 -*-
"""
GCF bindings to ObsPy core module.
"""
from obspy import Stream, Trace, UTCDateTime

from . import libgcf


[docs]def merge_gcf_stream(st): """ Merges GCF stream (replacing Stream.merge(-1) for headonly=True) :type st: :class:`~obspy.core.stream.Stream` :param st: GCF Stream object with no data :rtype: :class:`~obspy.core.stream.Stream` :returns: Stream object containing header and data. """ traces = [] for tr in st: delta = tr.stats.delta starttime = tr.stats.starttime endtime = tr.stats.endtime for trace in traces: if tr.id == trace.id and delta == trace.stats.delta \ and not starttime == trace.stats.starttime: if 0 < starttime - trace.stats.endtime <= delta: trace.stats.npts += tr.stats.npts break elif 0 < trace.stats.starttime - endtime <= delta: trace.stats.starttime = UTCDateTime(starttime) trace.stats.npts += tr.stats.npts break else: traces.append(tr) return Stream(traces=traces)
[docs]def _is_gcf(filename): """ Checks whether a file is GCF or not. :type filename: str :param filename: GCF file to be checked. :rtype: bool :return: ``True`` if a GCF file. """ try: with open(filename, 'rb') as f: libgcf.is_gcf(f) except Exception: return False return True
[docs]def _read_gcf(filename, headonly=False, **kwargs): # @UnusedVariable """ Reads a GCF file and returns a Stream object. only GCF files containing data records are supported. .. warning:: This function should NOT be called directly, it registers via the ObsPy :func:`~obspy.core.stream.read` function, call this instead. :type filename: str :param filename: GCF file to be read. :type headonly: bool, optional :param headonly: If True read only head of GCF file. :type channel_prefix: str, optional :param channel_prefix: Channel band and instrument codes. Defaults to ``HH``. :rtype: :class:`~obspy.core.stream.Stream` :returns: Stream object containing header and data. .. rubric:: Example >>> from obspy import read >>> st = read("/path/to/20160603_1955n.gcf", format="GCF") """ traces = [] with open(filename, 'rb') as f: while True: try: if headonly: header = libgcf.read_header(f, **kwargs) if header: traces.append(Trace(header=header)) else: hd = libgcf.read(f, **kwargs) if hd: traces.append(Trace(header=hd[0], data=hd[1])) except EOFError: break st = Stream(traces=traces) if headonly: st = merge_gcf_stream(st) else: st.merge(-1) return st