From 16ae46021885b43914932278b6c662ba2adf601c Mon Sep 17 00:00:00 2001
From: kienle <kienle@passcal.nmt.edu>
Date: Tue, 25 Jul 2023 11:27:26 -0600
Subject: [PATCH] Fix reading waveform data for RT130 data

---
 .../model/reftek/from_rt2ms/core.py           | 50 ++++++++++++++++++-
 sohstationviewer/model/reftek/reftek.py       |  5 +-
 .../reftek/rt130_experiment/eh_et_packet.py   |  4 +-
 .../model/reftek/rt130_experiment/reftek.py   |  6 ++-
 4 files changed, 58 insertions(+), 7 deletions(-)

diff --git a/sohstationviewer/model/reftek/from_rt2ms/core.py b/sohstationviewer/model/reftek/from_rt2ms/core.py
index 899026a77..cb612498f 100644
--- a/sohstationviewer/model/reftek/from_rt2ms/core.py
+++ b/sohstationviewer/model/reftek/from_rt2ms/core.py
@@ -27,7 +27,9 @@ from sohstationviewer.model.reftek.from_rt2ms.soh_packet import Packet
 eh_et_payload_last_field_start = 88
 eh_et_payload_last_field_size = 16
 
-eh_et_payload_end = eh_et_payload_last_field_start + eh_et_payload_last_field_size
+# 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),
@@ -47,6 +49,52 @@ class EHPacket(packet.EHPacket):
                 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):
     pass
diff --git a/sohstationviewer/model/reftek/reftek.py b/sohstationviewer/model/reftek/reftek.py
index 083cfe794..3dfe5be2b 100755
--- a/sohstationviewer/model/reftek/reftek.py
+++ b/sohstationviewer/model/reftek/reftek.py
@@ -7,6 +7,7 @@ from typing import Tuple, List, Union
 import traceback
 import numpy as np
 
+from sohstationviewer.model.reftek.rt130_experiment.reftek import Reftek130
 from sohstationviewer.model.reftek.from_rt2ms import (
     core, soh_packet, packet)
 from sohstationviewer.model.reftek.log_info import LogInfo
@@ -146,7 +147,7 @@ class RT130(DataTypeModel):
         :param path2file: absolute path to file
         """
         try:
-            rt130 = core.Reftek130.from_file(path2file)
+            rt130 = Reftek130.from_file(path2file)
         except Exception:
             fmt = traceback.format_exc()
             self.track_info(f"Skip file {path2file} can't be read "
@@ -230,7 +231,7 @@ class RT130(DataTypeModel):
 
         for index in ind_ehet:
             d = rt130._data[index]
-            logs = packet.EHPacket(d).eh_et_info(nbr_dt_samples)
+            logs = core.EHPacket(d).eh_et_info(nbr_dt_samples)
             if 'EHET' not in self.log_data[cur_key]:
                 self.log_data[cur_key]['EHET'] = []
             self.log_data[cur_key]['EHET'].append((d['time'], logs))
diff --git a/sohstationviewer/model/reftek/rt130_experiment/eh_et_packet.py b/sohstationviewer/model/reftek/rt130_experiment/eh_et_packet.py
index 1d03b32f9..fa397432f 100644
--- a/sohstationviewer/model/reftek/rt130_experiment/eh_et_packet.py
+++ b/sohstationviewer/model/reftek/rt130_experiment/eh_et_packet.py
@@ -2,7 +2,7 @@ import dataclasses
 
 from sohstationviewer.model.mseed.read_mseed_experiment.mseed_helper import \
     Unpacker
-from sohstationviewer.model.reftek.from_rt2ms.core import eh_et_payload_end
+from sohstationviewer.model.reftek.from_rt2ms.core import eh_et_payload_end_in_packet
 from sohstationviewer.model.reftek.rt130_experiment.reftek_helper import \
     PacketHeader
 
@@ -15,7 +15,7 @@ def read_eh_et_packet(packet: bytes, unpacker: Unpacker):
 
     extended_header = EHETExtendedHeader(event_number, data_stream_number,
                                          flags, data_format)
-    payload = packet[24:eh_et_payload_end]
+    payload = packet[24:eh_et_payload_end_in_packet]
     return extended_header, payload
 
 
diff --git a/sohstationviewer/model/reftek/rt130_experiment/reftek.py b/sohstationviewer/model/reftek/rt130_experiment/reftek.py
index a7b353457..02e9ba639 100644
--- a/sohstationviewer/model/reftek/rt130_experiment/reftek.py
+++ b/sohstationviewer/model/reftek/rt130_experiment/reftek.py
@@ -4,9 +4,11 @@ from typing import Callable, Dict, Union
 
 import numpy
 import numpy as np
+from matplotlib import pyplot as plt
 from obspy import UTCDateTime
 from obspy.io.reftek.packet import PACKET_FINAL_DTYPE
 
+from sohstationviewer.controller.util import validate_file
 from sohstationviewer.model.mseed.read_mseed_experiment.mseed_helper import \
     Unpacker
 from sohstationviewer.model.reftek.rt130_experiment.dt_packet import \
@@ -15,7 +17,7 @@ from sohstationviewer.model.reftek.rt130_experiment.dt_packet import \
 )
 from sohstationviewer.model.reftek.rt130_experiment.eh_et_packet import \
     (
-    EHETPacket, read_eh_et_packet, eh_et_payload_end,
+    EHETPacket, read_eh_et_packet, eh_et_payload_end_in_packet,
 )
 from sohstationviewer.model.reftek.rt130_experiment.reftek_helper import (
     print_error, packet_reader_placeholder, RT130ParseError, PacketHeader,
@@ -177,7 +179,7 @@ def convert_packet_to_obspy_format(packet: Union[EHETPacket, DTPacket],
         ))
         converted_packet['payload'][:4] = packet_data
     elif converted_packet['packet_type'] in ['EH', 'ET']:
-        eh_et_payload_size = eh_et_payload_end - 24
+        eh_et_payload_size = eh_et_payload_end_in_packet - 24
         converted_packet['payload'] = numpy.empty(1000, np.uint8)
         packet_data = numpy.frombuffer(packet.data, np.uint8)
         converted_packet['payload'][:eh_et_payload_size] = packet_data
-- 
GitLab