Source code for obspy.css.core

# -*- coding: utf-8 -*-
"""
CSS bindings to ObsPy core module.
"""

import os
import struct
import numpy as np
from obspy import UTCDateTime, Trace, Stream


DTYPE = {'s4': "i", 't4': "f", 's2': "h"}


[docs]def isCSS(filename): """ Checks whether a file is CSS waveform data (header) or not. :type filename: string :param filename: CSS file to be checked. :rtype: bool :return: ``True`` if a CSS waveform header file. """ # Fixed file format. # Tests: # - the length of each line (283 chars) # - two epochal time fields # (for position of dot and if they convert to UTCDateTime) # - supported data type descriptor try: with open(filename, "rb") as fh: lines = fh.readlines() # check for empty file if not lines: return False # check every line for line in lines: assert(len(line.rstrip("\n\r")) == 283) assert(line[26] == ".") UTCDateTime(float(line[16:33])) assert(line[71] == ".") UTCDateTime(float(line[61:78])) assert(line[143:145] in DTYPE) except: return False return True
[docs]def readCSS(filename, **kwargs): """ Reads a CSS waveform file and returns a Stream object. .. warning:: This function should NOT be called directly, it registers via the ObsPy :func:`~obspy.core.stream.read` function, call this instead. :type filename: string :param filename: CSS file to be read. :rtype: :class:`~obspy.core.stream.Stream` :returns: Stream with Traces specified by given file. """ # read metafile with info on single traces with open(filename, "rb") as fh: lines = fh.readlines() basedir = os.path.dirname(filename) traces = [] # read single traces for line in lines: npts = int(line[79:87]) dirname = line[148:212].strip() filename = line[213:245].strip() filename = os.path.join(basedir, dirname, filename) offset = int(line[246:256]) dtype = DTYPE[line[143:145]] fmt = ">" + dtype * npts with open(filename, "rb") as fh: fh.seek(offset) size = struct.calcsize(fmt) data = fh.read(size) data = struct.unpack(fmt, data) data = np.array(data) header = {} header['station'] = line[0:6].strip() header['channel'] = line[7:15].strip() header['starttime'] = UTCDateTime(float(line[16:33])) header['sampling_rate'] = float(line[88:99]) header['calib'] = float(line[100:116]) header['calper'] = float(line[117:133]) tr = Trace(data, header=header) traces.append(tr) return Stream(traces=traces)