From b45aba9324c8c621615d3c07e9b24009a23f47f4 Mon Sep 17 00:00:00 2001
From: Lan <ldam@passcal.nmt.edu>
Date: Tue, 9 May 2023 11:09:42 -0600
Subject: [PATCH] use rt130_waveform_data_req to decite to /not to create
 rt130's waveform_data; fix bug to create Event DS when select All Waveform
 Channels

---
 sohstationviewer/model/data_loader.py         |  8 ++-
 sohstationviewer/model/data_type_model.py     |  3 ++
 .../model/handling_data_reftek.py             |  5 +-
 sohstationviewer/model/reftek/log_info.py     | 51 ++++++++++---------
 sohstationviewer/model/reftek/reftek.py       | 14 ++++-
 5 files changed, 51 insertions(+), 30 deletions(-)

diff --git a/sohstationviewer/model/data_loader.py b/sohstationviewer/model/data_loader.py
index f6a5e0db3..63320fe6b 100644
--- a/sohstationviewer/model/data_loader.py
+++ b/sohstationviewer/model/data_loader.py
@@ -31,7 +31,7 @@ class DataLoaderWorker(QtCore.QObject):
                  req_soh_chans: List[str] = [], read_start: float = 0,
                  read_end: float = constants.HIGHEST_INT,
                  include_mp123: bool = False, include_mp456: bool = False,
-                 parent_thread=None):
+                 rt130_waveform_data_req: bool = False, parent_thread=None):
         super().__init__()
         self.data_type = data_type
         self.tracking_box = tracking_box
@@ -43,6 +43,7 @@ class DataLoaderWorker(QtCore.QObject):
         self.read_end = read_end
         self.include_mp123 = include_mp123
         self.include_mp456 = include_mp456
+        self. rt130_waveform_data_req = rt130_waveform_data_req
         self.parent_thread = parent_thread
         # display_tracking_info updates a QtWidget, which can only be done in
         # the read. Since self.run runs in a background thread, we need to use
@@ -71,6 +72,7 @@ class DataLoaderWorker(QtCore.QObject):
                 read_start=self.read_start, read_end=self.read_end,
                 include_mp123zne=self.include_mp123,
                 include_mp456uvw=self.include_mp456,
+                rt130_waveform_data_req=self.rt130_waveform_data_req,
                 creator_thread=self.parent_thread,
                 notification_signal=self.notification,
                 pause_signal=self.button_dialog
@@ -114,7 +116,8 @@ class DataLoader(QtCore.QObject):
                     req_soh_chans: List[str] = [], read_start: float = 0,
                     read_end: float = constants.HIGHEST_INT,
                     include_mp123: bool = False,
-                    include_mp456: bool = False):
+                    include_mp456: bool = False,
+                    rt130_waveform_data_req: bool = False):
         """
         Initialize the data loader. Construct the thread and worker and connect
         them together. Separated from the actual loading of the data to allow
@@ -150,6 +153,7 @@ class DataLoader(QtCore.QObject):
             read_end=read_end,
             include_mp123=include_mp123,
             include_mp456=include_mp456,
+            rt130_waveform_data_req=rt130_waveform_data_req,
             parent_thread=self.thread
         )
 
diff --git a/sohstationviewer/model/data_type_model.py b/sohstationviewer/model/data_type_model.py
index df4ccf37f..9eddc4a0d 100644
--- a/sohstationviewer/model/data_type_model.py
+++ b/sohstationviewer/model/data_type_model.py
@@ -43,6 +43,7 @@ class DataTypeModel():
                  read_end: Optional[float] = UTCDateTime().timestamp,
                  include_mp123zne: bool = False,
                  include_mp456uvw: bool = False,
+                 rt130_waveform_data_req: bool = False,
                  creator_thread: Optional[QtCore.QThread] = None,
                  notification_signal: Optional[QtCore.Signal] = None,
                  pause_signal: Optional[QtCore.Signal] = None,
@@ -60,6 +61,7 @@ class DataTypeModel():
         :param read_end: requested end time to read
         :param include_mp123zne: if mass position channels 1,2,3 are requested
         :param include_mp456uvw: if mass position channels 4,5,6 are requested
+        :param rt130_waveform_data_req: flag for RT130 to read waveform data
         :param creator_thread: the thread the current DataTypeModel instance is
             being created in. If None, the DataTypeModel instance is being
             created in the main thread
@@ -78,6 +80,7 @@ class DataTypeModel():
         self.read_end = read_end
         self.include_mp123zne = include_mp123zne
         self.include_mp456uvw = include_mp456uvw
+        self.rt130_waveform_data_req = rt130_waveform_data_req
         if creator_thread is None:
             err_msg = (
                 'A signal is not None while running in main thread'
diff --git a/sohstationviewer/model/handling_data_reftek.py b/sohstationviewer/model/handling_data_reftek.py
index f7312c86d..33016a02a 100644
--- a/sohstationviewer/model/handling_data_reftek.py
+++ b/sohstationviewer/model/handling_data_reftek.py
@@ -47,7 +47,10 @@ def check_reftek_header(
         if chan_id not in cur_data_dict:
             cur_data_dict[chan_id] = {'tracesInfo': [],
                                       'samplerate': samplerate}
-
+        if trace.stats.npts == 0:
+            #  this trace isn't available to prevent bug when creating memmap
+            #  with no data
+            continue
         if (starttime <= trace.stats['starttime'] <= endtime or
                 starttime <= trace.stats['endtime'] <= endtime):
             avail_trace_indexes.append(index)
diff --git a/sohstationviewer/model/reftek/log_info.py b/sohstationviewer/model/reftek/log_info.py
index c242f822a..6520c695d 100644
--- a/sohstationviewer/model/reftek/log_info.py
+++ b/sohstationviewer/model/reftek/log_info.py
@@ -68,21 +68,23 @@ class LogInfo():
         #       TT =2001:253:15:13:59:768 NS: 144005 SPS: 40 ETO: 0
         parts = line.split()
         data_stream = int(parts[5])
-        if data_stream not in self.parent.req_data_streams:
-            return (0, 0)
-        try:
-            if parts[8].startswith("00:000"):
-                if parts[11].startswith("00:000"):
-                    return -1, 0
-                epoch, _ = get_time_6(parts[11])
+        if (self.req_data_streams == ['*'] or
+                data_stream in self.req_data_streams):
+            try:
+                if parts[8].startswith("00:000"):
+                    if parts[11].startswith("00:000"):
+                        return -1, 0
+                    epoch, _ = get_time_6(parts[11])
+                else:
+                    epoch, _ = get_time_6(parts[8])
+            except AttributeError:
+                self.parent.processing_log.append((line, LogType.ERROR))
+                return False
+            if epoch > 0:
+                self.min_epoch = min(epoch, self.min_epoch)
+                self.max_epoch = max(epoch, self.max_epoch)
             else:
-                epoch, _ = get_time_6(parts[8])
-        except AttributeError:
-            self.parent.processing_log.append(line, LogType.ERROR)
-            return False
-        if epoch > 0:
-            self.min_epoch = min(epoch, self.min_epoch)
-            self.max_epoch = max(epoch, self.max_epoch)
+                return 0, 0
         else:
             return 0, 0
         return epoch, data_stream
@@ -347,18 +349,17 @@ class LogInfo():
             line = line.upper()
             if 'FST' in line:
                 ret = self.read_evt(line)
-                if ret:
+                if ret is not False:
                     epoch, data_stream = ret
-                    if data_stream in self.req_data_streams:
-                        if epoch > 0:
-                            chan_name = 'Event DS%s' % data_stream
-                            self.add_chan_info(chan_name, epoch, 1, idx)
-                        elif epoch == 0:
-                            self.parent.processing_log.append(
-                                line, LogType.WARNING)
-                        else:
-                            self.parent.processing_log.append(
-                                line, LogType.ERROR)
+                    if epoch > 0:
+                        chan_name = 'Event DS%s' % data_stream
+                        self.add_chan_info(chan_name, epoch, 1, idx)
+                    elif epoch == 0:
+                        self.parent.processing_log.append(
+                            (line, LogType.WARNING))
+                    else:
+                        self.parent.processing_log.append(
+                            (line, LogType.ERROR))
 
             elif line.startswith("STATE OF HEALTH"):
                 epoch = self.read_sh_header(line)
diff --git a/sohstationviewer/model/reftek/reftek.py b/sohstationviewer/model/reftek/reftek.py
index f7fa193d4..d55d5fd09 100755
--- a/sohstationviewer/model/reftek/reftek.py
+++ b/sohstationviewer/model/reftek/reftek.py
@@ -35,6 +35,11 @@ class RT130(DataTypeModel):
         """
         self.req_data_streams: List[Union[int, str]] = self.req_wf_chans
         """
+        rt130_waveform_data_req: flag to create waveform data according to
+            req_data_stream
+        """
+        self.rt130_waveform_data_req: bool = kwarg['rt130_waveform_data_req']
+        """
         found_data_streams: list of data streams found to help inform user
             why the selected data streams don't show up
         """
@@ -189,7 +194,10 @@ class RT130(DataTypeModel):
         cur_key = (rt130._data[0]['unit_id'].decode(),
                    f"{rt130._data[0]['experiment_number']}")
         self.populate_cur_key_for_all_data(cur_key)
-        self.get_ehet_in_log_data(rt130, cur_key)
+        if data_stream != 9:
+            # don't get event info for mass position
+            self.populate_data_stream(cur_key, str(data_stream))
+            self.get_ehet_in_log_data(rt130, cur_key)
         self.get_mass_pos_data_and_waveform_data(rt130, data_stream, cur_key)
 
     def get_ehet_in_log_data(self, rt130: core.Reftek130,
@@ -230,8 +238,10 @@ class RT130(DataTypeModel):
         """
         if data_stream == 9:
             cur_data_dict = self.mass_pos_data[cur_key]
-        else:
+        elif self.rt130_waveform_data_req:
             cur_data_dict = self.waveform_data[cur_key]
+        else:
+            return
 
         avail_trace_indexes = check_reftek_header(
             rt130, cur_key, self.read_start, self.read_end,
-- 
GitLab