Source code for obspy.io.reftek.util

# -*- coding: utf-8 -*-
from __future__ import (absolute_import, division, print_function,
                        unicode_literals)
from future.builtins import *  # NOQA

import calendar
import codecs
import datetime

import numpy as np

from obspy import UTCDateTime


[docs]def bcd(_i): return (_i >> 4 & 0xF).astype(np.uint32) * 10 + (_i & 0xF)
[docs]def bcd_16bit_int(_i): _i = bcd(_i) return _i[::, 0] * 100 + _i[::, 1]
[docs]def bcd_hex(_i): m = _i.shape[1] _bcd = codecs.encode(_i.ravel(), "hex_codec").decode("ASCII").upper() return np.fromstring(_bcd, dtype="|S%d" % (m * 2))
[docs]def bcd_8bit_hex(_i): return np.array(["{:X}".format(int(x)) for x in _i], dtype="|S2")
[docs]def bcd_julian_day_string_to_seconds_of_year(_i): timestrings = bcd_hex(_i) return _timestrings_to_seconds(timestrings)
_timegm_cache = {}
[docs]def _get_timestamp_for_start_of_year(year): # Reftek 130 data format stores only the last two digits of the year. # We currently assume that 00-49 are years 2000-2049 and 50-99 are years # 2050-2099. We deliberately raise an exception in the read routine if the # current year will become 2050 (just in case someone really still uses # this code then.. ;-) if year < 50: year += 2000 else: year += 1900 try: t = _timegm_cache[year] except KeyError: t = calendar.timegm(datetime.datetime(year, 1, 1).utctimetuple()) _timegm_cache[year] = t return t
[docs]def _timestrings_to_seconds(timestrings): """ Helper routine to convert timestrings of form "DDDHHMMSSsss" to array of floating point seconds. :param timestring: numpy.ndarray :rtype: numpy.ndarray """ # split up the time string into tuple of # (day of year, hours, minutes, seconds, milliseconds), still as string seconds = [(string[:3], string[3:5], string[5:7], string[7:9], string[9:]) for string in timestrings] seconds = np.array(seconds, dtype="S3").astype(np.float64) # now scale the columns of the array, so that everything is in seconds seconds[:, 0] -= 1 seconds[:, 0] *= 86400 seconds[:, 1] *= 3600 seconds[:, 2] *= 60 seconds[:, 4] *= 1e-3 # sum up days, hours, minutes etc. for every row of the array seconds = seconds.sum(axis=1) return seconds
[docs]def _decode_ascii(chars): return chars.decode("ASCII")
[docs]def _parse_long_time(time_bytestring, decode=True): if decode: time_string = time_bytestring.decode() else: time_string = time_bytestring if not time_string.strip(): return None time_string, milliseconds = time_string[:-3], int(time_string[-3:]) return (UTCDateTime.strptime(time_string, '%Y%j%H%M%S') + 1e-3 * milliseconds)
[docs]def _16_tuple_ascii(bytestring): item_count = 16 chars = bytestring.decode("ASCII") if len(chars) % item_count != 0: raise NotImplementedError("Should not happen, contact developers.") item_size = int(len(chars) / item_count) result = [] for i in range(item_count): chars_ = chars[i * item_size:(i + 1) * item_size] result.append(chars_.strip() or None) return tuple(result)
[docs]def _16_tuple_int(bytestring): ascii_tuple = _16_tuple_ascii(bytestring) result = [] for chars in ascii_tuple: if chars is None or not chars.strip(): result.append(None) continue result.append(int(chars)) return tuple(result)
[docs]def _16_tuple_float(bytestring): ascii_tuple = _16_tuple_ascii(bytestring) result = [] for chars in ascii_tuple: if chars is None or not chars.strip(): result.append(None) continue result.append(float(chars)) return tuple(result)
if __name__ == '__main__': import doctest doctest.testmod(exclude_empty=True)