From 28ffdea493a3ba2fadc42cfb49706ea9cfb8067b Mon Sep 17 00:00:00 2001 From: kienle <kienle@passcal.nmt.edu> Date: Mon, 7 Aug 2023 16:19:36 -0600 Subject: [PATCH] Move things around --- .../model/reftek/from_rt2ms/core.py | 124 +++++++++--------- .../model/reftek/from_rt2ms/packet.py | 56 ++++---- .../reftek/rt130_experiment/eh_et_packet.py | 3 +- .../model/reftek/rt130_experiment/header.py | 26 ++-- .../reftek/rt130_experiment/reftek_helper.py | 2 +- 5 files changed, 98 insertions(+), 113 deletions(-) diff --git a/sohstationviewer/model/reftek/from_rt2ms/core.py b/sohstationviewer/model/reftek/from_rt2ms/core.py index b94b84536..221b1d05b 100644 --- a/sohstationviewer/model/reftek/from_rt2ms/core.py +++ b/sohstationviewer/model/reftek/from_rt2ms/core.py @@ -22,8 +22,10 @@ from obspy.io.reftek.packet import PACKET_FINAL_DTYPE from obspy.io.reftek.util import _decode_ascii, _parse_long_time from sohstationviewer.model.mseed_data.record_reader_helper import Unpacker -from sohstationviewer.model.reftek.from_rt2ms import packet -from sohstationviewer.model.reftek.from_rt2ms.soh_packet import Packet +from sohstationviewer.model.reftek.from_rt2ms.packet import \ + ( + eh_et_payload_last_field_start, eh_et_payload_last_field_size, EHPacket, +) from sohstationviewer.model.reftek.rt130_experiment.reftek_helper import \ ( read_rt130_file, convert_packet_to_obspy_format, @@ -36,76 +38,72 @@ class DiscontinuousTrace(Trace): self.times = times -eh_et_payload_last_field_start = 88 -eh_et_payload_last_field_size = 16 -# The payload start is based on the start of the payload, so we have to add 24 -# to compensate for the size of the header and extended header. -eh_et_payload_end_in_packet = eh_et_payload_last_field_start + eh_et_payload_last_field_size + 24 EH_PAYLOAD = { "station_name_extension": (35, 1, _decode_ascii), "station_name": (36, 4, _decode_ascii), "sampling_rate": (64, 4, float), "trigger_time": (72, 16, _parse_long_time), - "first_sample_time": (eh_et_payload_last_field_start, eh_et_payload_last_field_size, _parse_long_time), + "first_sample_time": ( + eh_et_payload_last_field_start, eh_et_payload_last_field_size, _parse_long_time), } -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) - - def eh_et_info(self, nbr_DT_samples): - """ - Compile EH and ET info to write to log file. - Returns list of strings. - Formatting of strings is based on earlier version of rt2ms. - """ - info = [] - # packet_tagline1 = ("\n\n{:s} exp {:02d} bytes {:04d} {:s} ID: {:s} " - # "seq {:04d}".format(self.type.decode(), - # self.experiment_number, - # self.byte_count, - # Packet.time_tag(self.time), - # self.unit_id.decode(), - # self.packet_sequence)) - # info.append(packet_tagline1) - # if self.type.decode('ASCII') == 'EH': - # nbr_DT_samples = 0 - # info.append("\nEvent Header") - # else: - # info.append("\nEvent Trailer") - # info.append("\n event = " + str(self.event_number)) - # info.append("\n stream = " + str(self.data_stream_number + 1)) - # info.append("\n format = " + self.data_format.decode('ASCII')) - # info.append("\n stream name = " + self.stream_name) - # info.append("\n sample rate = " + str(self.sampling_rate)) - # info.append("\n trigger type = " + self.trigger_type) - trigger_time = Packet.time_tag(UTCDateTime(ns=self.trigger_time)) - # info.append("\n trigger time = " + trigger_time) - first_sample_time = Packet.time_tag(UTCDateTime(ns=self.first_sample_time)) # noqa: E501 - # info.append("\n first sample = " + first_sample_time) - # if self.last_sample_time: - # info.append("\n last sample = " + Packet.time_tag(UTCDateTime(ns=self.last_sample_time))) # noqa: E501 - # info.append("\n bit weights = " + " ".join([val for val in self.channel_adjusted_nominal_bit_weights if val])) # noqa: E501 - # info.append("\n true weights = " + " ".join([val for val in self.channel_true_bit_weights if val])) # noqa: E501 - packet_tagline2 = ("\nDAS: {:s} EV: {:04d} DS: {:d} FST = {:s} TT = " - "{:s} NS: {:d} SPS: {:.1f} ETO: 0" - .format(self.unit_id.decode(), - self.event_number, - self.data_stream_number + 1, - first_sample_time, - trigger_time, - nbr_DT_samples, - self.sampling_rate)) - info.append(packet_tagline2) - return info +# 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) +# +# def eh_et_info(self, nbr_DT_samples): +# """ +# Compile EH and ET info to write to log file. +# Returns list of strings. +# Formatting of strings is based on earlier version of rt2ms. +# """ +# info = [] +# # packet_tagline1 = ("\n\n{:s} exp {:02d} bytes {:04d} {:s} ID: {:s} " +# # "seq {:04d}".format(self.type.decode(), +# # self.experiment_number, +# # self.byte_count, +# # Packet.time_tag(self.time), +# # self.unit_id.decode(), +# # self.packet_sequence)) +# # info.append(packet_tagline1) +# # if self.type.decode('ASCII') == 'EH': +# # nbr_DT_samples = 0 +# # info.append("\nEvent Header") +# # else: +# # info.append("\nEvent Trailer") +# # info.append("\n event = " + str(self.event_number)) +# # info.append("\n stream = " + str(self.data_stream_number + 1)) +# # info.append("\n format = " + self.data_format.decode('ASCII')) +# # info.append("\n stream name = " + self.stream_name) +# # info.append("\n sample rate = " + str(self.sampling_rate)) +# # info.append("\n trigger type = " + self.trigger_type) +# trigger_time = Packet.time_tag(UTCDateTime(ns=self.trigger_time)) +# # info.append("\n trigger time = " + trigger_time) +# first_sample_time = Packet.time_tag(UTCDateTime(ns=self.first_sample_time)) # noqa: E501 +# # info.append("\n first sample = " + first_sample_time) +# # if self.last_sample_time: +# # info.append("\n last sample = " + Packet.time_tag(UTCDateTime(ns=self.last_sample_time))) # noqa: E501 +# # info.append("\n bit weights = " + " ".join([val for val in self.channel_adjusted_nominal_bit_weights if val])) # noqa: E501 +# # info.append("\n true weights = " + " ".join([val for val in self.channel_true_bit_weights if val])) # noqa: E501 +# packet_tagline2 = ("\nDAS: {:s} EV: {:04d} DS: {:d} FST = {:s} TT = " +# "{:s} NS: {:d} SPS: {:.1f} ETO: 0" +# .format(self.unit_id.decode(), +# self.event_number, +# self.data_stream_number + 1, +# first_sample_time, +# trigger_time, +# nbr_DT_samples, +# self.sampling_rate)) +# info.append(packet_tagline2) +# return info class Reftek130Exception(ObsPyException): diff --git a/sohstationviewer/model/reftek/from_rt2ms/packet.py b/sohstationviewer/model/reftek/from_rt2ms/packet.py index c3ddb8865..b712edf23 100644 --- a/sohstationviewer/model/reftek/from_rt2ms/packet.py +++ b/sohstationviewer/model/reftek/from_rt2ms/packet.py @@ -25,53 +25,45 @@ class Reftek130UnpackPacketError(ValueError): pass +eh_et_payload_last_field_start = 88 +eh_et_payload_last_field_size = 16 + +# The payload start is based on the start of the payload, so we have to add 24 +# to compensate for the size of the header and extended header. +eh_et_payload_end_in_packet = eh_et_payload_last_field_start + eh_et_payload_last_field_size + 24 + # name, offset, length (bytes) and converter routine for EH/ET packet payload EH_PAYLOAD = { - "trigger_time_message": (0, 33, _decode_ascii), - "time_source": (33, 1, _decode_ascii), - "time_quality": (34, 1, _decode_ascii), "station_name_extension": (35, 1, _decode_ascii), "station_name": (36, 4, _decode_ascii), - "stream_name": (40, 16, _decode_ascii), - "_reserved_2": (56, 8, _decode_ascii), "sampling_rate": (64, 4, float), - "trigger_type": (68, 4, _decode_ascii), "trigger_time": (72, 16, _parse_long_time), - "first_sample_time": (88, 16, _parse_long_time), - "detrigger_time": (104, 16, _parse_long_time), - "last_sample_time": (120, 16, _parse_long_time), - "channel_adjusted_nominal_bit_weights": (136, 128, _16_tuple_ascii), - "channel_true_bit_weights": (264, 128, _16_tuple_ascii), - "channel_gain_code": (392, 16, _16_tuple_ascii), - "channel_ad_resolution_code": (408, 16, _16_tuple_ascii), - "channel_fsa_code": (424, 16, _16_tuple_ascii), - "channel_code": (440, 64, _16_tuple_ascii), - "channel_sensor_fsa_code": (504, 16, _16_tuple_ascii), - "channel_sensor_vpu": (520, 96, _16_tuple_float), - "channel_sensor_units_code": (616, 16, _16_tuple_ascii), - "station_channel_number": (632, 48, _16_tuple_int), - "_reserved_3": (680, 156, _decode_ascii), - "total_installed_channels": (836, 2, int), - "station_comment": (838, 40, _decode_ascii), - "digital_filter_list": (878, 16, _decode_ascii), - "position": (894, 26, _decode_ascii), - "reftek_120": (920, 80, None)} - + "first_sample_time": (eh_et_payload_last_field_start, eh_et_payload_last_field_size, _parse_long_time), +} obspy_rt130_packet.EH_PAYLOAD = EH_PAYLOAD class EHPacket(obspy_rt130_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) + def __str__(self, compact=False): if compact: sta = (self.station_name.strip() + self.station_name_extension.strip()) info = ("{:04d} {:2s} {:4s} {:2d} {:4d} {:4d} {:2d} {:2s} " "{:5s} {:4s} {!s}").format( - self.packet_sequence, self.type.decode(), - self.unit_id.decode(), self.experiment_number, - self.byte_count, self.event_number, - self.data_stream_number, self.data_format.decode(), - sta, str(self.sampling_rate)[:4], self.time) + self.packet_sequence, self.type.decode(), + self.unit_id.decode(), self.experiment_number, + self.byte_count, self.event_number, + self.data_stream_number, self.data_format.decode(), + sta, str(self.sampling_rate)[:4], self.time) else: info = [] for key in self._headers: @@ -136,3 +128,5 @@ class EHPacket(obspy_rt130_packet.EHPacket): self.sampling_rate)) info.append(packet_tagline2) return info + + diff --git a/sohstationviewer/model/reftek/rt130_experiment/eh_et_packet.py b/sohstationviewer/model/reftek/rt130_experiment/eh_et_packet.py index 6e043bfec..7324eee71 100644 --- a/sohstationviewer/model/reftek/rt130_experiment/eh_et_packet.py +++ b/sohstationviewer/model/reftek/rt130_experiment/eh_et_packet.py @@ -2,7 +2,8 @@ import dataclasses from sohstationviewer.model.mseed_data.record_reader_helper import \ Unpacker -from sohstationviewer.model.reftek.from_rt2ms.core import eh_et_payload_end_in_packet +from sohstationviewer.model.reftek.from_rt2ms.packet import \ + eh_et_payload_end_in_packet from sohstationviewer.model.reftek.rt130_experiment.header import PacketHeader diff --git a/sohstationviewer/model/reftek/rt130_experiment/header.py b/sohstationviewer/model/reftek/rt130_experiment/header.py index 2bd346897..f0c26d9d0 100644 --- a/sohstationviewer/model/reftek/rt130_experiment/header.py +++ b/sohstationviewer/model/reftek/rt130_experiment/header.py @@ -4,11 +4,7 @@ from obspy import UTCDateTime from sohstationviewer.model.mseed_data.record_reader_helper import \ Unpacker -from sohstationviewer.model.reftek.rt130_experiment.reftek_helper import ( - RT130ParseError, -) - -from sohstationviewer.model.reftek.from_rt2ms import core +from sohstationviewer.model.reftek.rt130_experiment import reftek_helper @dataclasses.dataclass @@ -59,13 +55,13 @@ def get_rt130_packet_header(rt130_packet: bytes, except UnicodeError: print(f'Cannot decode packet type.') print('The given file does not appear to be a valid RT130 file.') - raise RT130ParseError + raise reftek_helper.RT130ParseError valid_packet_types = ['AD', 'CD', 'DS', 'DT', 'EH', 'ET', 'OM', 'SH', 'SC', 'FD'] if packet_type not in valid_packet_types: print(f'Invalid packet type found: {packet_type}') print('The given file does not appear to be a valid RT130 file.') - raise RT130ParseError + raise reftek_helper.RT130ParseError experiment_number = int(rt130_packet[2:3].hex()) year = int(rt130_packet[3:4].hex()) @@ -82,13 +78,9 @@ def get_rt130_packet_header(rt130_packet: bytes, byte_count, packet_sequence) -class Reftek130(core.Reftek130): - pass - - -waveform_file = '/Users/kle/PycharmProjects/sohstationviewer/tests/test_data/RT130-sample/2017149.92EB/2017150/92EB/1/000000015_0036EE80' -soh_file = '/Users/kle/PycharmProjects/sohstationviewer/tests/test_data/RT130-sample/2017149.92EB/2017150/92EB/0/000000000_00000000' -import time -start = time.perf_counter() -(Reftek130.from_file(waveform_file).to_stream()) -# print('Time taken:', time.perf_counter() - start) +# waveform_file = '/Users/kle/PycharmProjects/sohstationviewer/tests/test_data/RT130-sample/2017149.92EB/2017150/92EB/1/000000015_0036EE80' +# soh_file = '/Users/kle/PycharmProjects/sohstationviewer/tests/test_data/RT130-sample/2017149.92EB/2017150/92EB/0/000000000_00000000' +# import time +# start = time.perf_counter() +# (Reftek130.from_file(waveform_file).to_stream()) +# # print('Time taken:', time.perf_counter() - start) diff --git a/sohstationviewer/model/reftek/rt130_experiment/reftek_helper.py b/sohstationviewer/model/reftek/rt130_experiment/reftek_helper.py index fa19960ca..2803fe09a 100644 --- a/sohstationviewer/model/reftek/rt130_experiment/reftek_helper.py +++ b/sohstationviewer/model/reftek/rt130_experiment/reftek_helper.py @@ -5,7 +5,7 @@ import numpy import numpy as np from sohstationviewer.model.mseed_data.record_reader_helper import Unpacker -from sohstationviewer.model.reftek.from_rt2ms.core import \ +from sohstationviewer.model.reftek.from_rt2ms.packet import \ eh_et_payload_end_in_packet from sohstationviewer.model.reftek.rt130_experiment.dt_packet import \ ( -- GitLab