From 3517623b30fd8e47f8e6be54076d5f52691e3b4f Mon Sep 17 00:00:00 2001 From: kienle <kienle@passcal.nmt.edu> Date: Thu, 20 Jul 2023 17:11:23 -0600 Subject: [PATCH] Modify the way EH/ET packets are stored Modify EH/ET packets are stored to include necessary information that was truncated before --- .../model/reftek/from_rt2ms/core.py | 24 +++++++++-- .../reftek/rt130_experiment/eh_et_packet.py | 6 +-- .../model/reftek/rt130_experiment/reftek.py | 43 ++++++++++++------- 3 files changed, 51 insertions(+), 22 deletions(-) diff --git a/sohstationviewer/model/reftek/from_rt2ms/core.py b/sohstationviewer/model/reftek/from_rt2ms/core.py index c9e299d57..c752f30e4 100644 --- a/sohstationviewer/model/reftek/from_rt2ms/core.py +++ b/sohstationviewer/model/reftek/from_rt2ms/core.py @@ -10,7 +10,6 @@ Suggested updates to obspy.io.reftek.core: Maeva Pourpoint IRIS/PASSCAL """ - import copy import obspy.io.reftek.core as obspy_rt130_core import warnings @@ -19,8 +18,27 @@ import numpy as np from obspy import Trace, Stream, UTCDateTime from obspy.core.util.obspy_types import ObsPyException -from obspy.io.reftek.packet import _unpack_C0_C2_data -from sohstationviewer.model.reftek.from_rt2ms.packet import EHPacket +from obspy.io.reftek.util import _decode_ascii + +from sohstationviewer.model.reftek.from_rt2ms import packet + + +EH_PAYLOAD = { + "station_name_extension": (35, 1, _decode_ascii), + "station_name": (36, 4, _decode_ascii), + "sampling_rate": (64, 4, float), +} + + +class EHPacket(packet.EHPacket): + def __init__(self, data): + self._data = data + payload = self._data["payload"].tobytes() + for name, (start, length, converter) in EH_PAYLOAD.items(): + data = payload[start:start + length] + if converter is not None: + data = converter(data) + setattr(self, name, data) class Reftek130Exception(ObsPyException): diff --git a/sohstationviewer/model/reftek/rt130_experiment/eh_et_packet.py b/sohstationviewer/model/reftek/rt130_experiment/eh_et_packet.py index 74ae28a9f..b0355262e 100644 --- a/sohstationviewer/model/reftek/rt130_experiment/eh_et_packet.py +++ b/sohstationviewer/model/reftek/rt130_experiment/eh_et_packet.py @@ -14,8 +14,8 @@ def read_eh_et_packet(packet: bytes, unpacker: Unpacker): extended_header = EHETExtendedHeader(event_number, data_stream_number, flags, data_format) - first_data_point = 9999 - return extended_header, first_data_point + payload = packet[24:92] + return extended_header, payload @dataclasses.dataclass @@ -34,4 +34,4 @@ class EHETExtendedHeader: class EHETPacket: header: PacketHeader extended_header: EHETExtendedHeader - data: int + data: bytes diff --git a/sohstationviewer/model/reftek/rt130_experiment/reftek.py b/sohstationviewer/model/reftek/rt130_experiment/reftek.py index 5de77e643..cb2d045e0 100644 --- a/sohstationviewer/model/reftek/rt130_experiment/reftek.py +++ b/sohstationviewer/model/reftek/rt130_experiment/reftek.py @@ -5,6 +5,7 @@ from typing import Callable, Dict, Union import numpy import numpy as np from obspy import UTCDateTime +from obspy.io.reftek.packet import PACKET_FINAL_DTYPE from obspy.io.reftek.util import ( bcd, bcd_hex, bcd_julian_day_string_to_nanoseconds_of_year, bcd_16bit_int, bcd_8bit_hex, @@ -27,6 +28,12 @@ from sohstationviewer.model.reftek.rt130_experiment.reftek_helper import ( from sohstationviewer.model.reftek.from_rt2ms import core +# This is the minimum size of the payload we can use while keeping the +# necessary information from the EH/ET packets. +payload_size = 68 +dt_payload_padding = [0] * (payload_size - 4) + + PACKET = [ ("packet_type", "|S2", None, "S2"), ("experiment_number", np.uint8, bcd, np.uint8), @@ -43,7 +50,7 @@ PACKET = [ ("flags", np.uint8, None, np.uint8), ("data_format", np.uint8, bcd_8bit_hex, "S2"), # Temporarily store the payload here. - ("payload", (np.uint8, 4), None, (np.uint8, 4))] + ("payload", (np.uint8, payload_size), None, (np.uint8, payload_size))] PACKET_FINAL_DTYPE = np.dtype([ (name, dtype_final) @@ -170,21 +177,25 @@ def convert_packet_to_obspy_format(packet: Union[EHETPacket, DTPacket], unpacker converted_packet['flags'] = packet.extended_header.flags converted_packet['data_format'] = packet.extended_header.data_format - # Obspy stores the data as list of 1-byte integers. We store the data as an - # arbitrary length integer, so we need to do some conversion. - # To make converting the resulting tuple to an element of a structured - # array of type PACKET_FINAL_DTYPE easier, we set the size of the payload - # to be 4. This only affect data with format 16, and as long as we are - # careful in self.to_stream, we don't even have to make a special case when - # decoding (note: this is possible because the affected data will be - # prepended with 0s when encoded. Then, during decoding, we will get the - # original data prepended with 0s, which is the original data.) - data_size = 4 - format_char = 'B' - converted_packet['payload'] = list(unpacker.unpack( - f'{data_size}{format_char}', - packet.data.to_bytes(data_size, 'big', signed=True) - )) + if converted_packet['packet_type'] == 'DT': + # Obspy stores the data as list of 1-byte integers. We store the + # data as an arbitrary length integer, so we need to do some + # conversion. To make converting the resulting tuple to an element + # of a structured array of type PACKET_FINAL_DTYPE easier, we set + # the size of the payload to be 4. This only affect data with format + # 16, and as long as we are careful in self.to_stream, we don't even + # have to make a special case when decoding (note: this is possible + # because of a peculiarity of the 2's complement encoding). + data_size = 4 + format_char = 'B' + converted_packet['payload'] = list(unpacker.unpack( + f'{data_size}{format_char}', + packet.data.to_bytes(data_size, 'big', signed=True) + )) + dt_payload_padding + elif converted_packet['packet_type'] in ['EH', 'ET']: + converted_packet['payload'] = list(unpacker.unpack( + f'{payload_size}B', packet.data + )) return tuple(converted_packet.values()) -- GitLab