From 4dec9871e4c7c72b6b49f63700c044d9d43a0c26 Mon Sep 17 00:00:00 2001
From: kienle <kienle@passcal.nmt.edu>
Date: Tue, 26 Sep 2023 18:37:38 -0600
Subject: [PATCH] Get station code and network code from packet

---
 .../reftek_reader/log_file_reader.py          | 37 +++++++++++++++++--
 1 file changed, 34 insertions(+), 3 deletions(-)

diff --git a/sohstationviewer/model/reftek_data/reftek_reader/log_file_reader.py b/sohstationviewer/model/reftek_data/reftek_reader/log_file_reader.py
index 7de44806c..a669cc805 100644
--- a/sohstationviewer/model/reftek_data/reftek_reader/log_file_reader.py
+++ b/sohstationviewer/model/reftek_data/reftek_reader/log_file_reader.py
@@ -115,7 +115,8 @@ class LogFile:
         self.file.close()
 
 
-PACKET_PARSERS: Dict[Optional[LogFileFormat], Callable] = {
+Parser = Callable[[List[str]], Tuple[List[str], List[str]]]
+PACKET_PARSERS: Dict[Optional[LogFileFormat], Parser] = {
     None: parse_soh_packet_no_type,
     'sohstationviewer': parse_soh_packet_sohstationviewer,
     'rt2ms': parse_soh_packet_rt2ms,
@@ -123,29 +124,59 @@ PACKET_PARSERS: Dict[Optional[LogFileFormat], Callable] = {
 }
 
 
+def get_experiment_number(soh_lines: List[str]):
+    if not soh_lines[0].startswith('Station Channel Definition'):
+        return None
+
+    # The experiment number can be in either the first or second line after
+    # the header. These lines are indented, so we have to strip them of
+    # whitespace.
+    if soh_lines[1].strip().startswith('Experiment Number ='):
+        experiment_number_line = soh_lines[1].split()
+    elif soh_lines[2].strip().startswith('Experiment Number ='):
+        experiment_number_line = soh_lines[2].split()
+    else:
+        return None
+
+    # If the experiment number is not recorded, we know that it will be 0. In
+    # order to not have too many return statements, we add 0 to the experiment
+    # line instead of returning it immediately.
+    if len(experiment_number_line) < 4:
+        experiment_number_line.append('0')
+
+    return experiment_number_line[-1]
+
+
 class LogFileReader:
     """
     Class that reads a log file.
     """
     def __init__(self, file_path: Path):
         self.file_path = file_path
-        self.packet_reader = None
         self.log_file_type: Optional[LogFileFormat] = None
         self.eh_et_lines = []
         self.soh_lines = []
+        self.station_code: Optional[str] = None
+        self.experiment_number: Optional[str] = None
 
     def read(self):
         log_file = LogFile(self.file_path)
         for packet in log_file:
             if self.log_file_type is None:
                 self.log_file_type = detect_log_file_packet_format(packet)
+
             parser = PACKET_PARSERS[self.log_file_type]
             eh_et_lines, soh_lines = parser(packet)
+            if self.station_code is None and soh_lines:
+                self.station_code = soh_lines[0].split(' ')[-1].strip()
+            if self.experiment_number is None and soh_lines:
+                found_experiment_number = get_experiment_number(soh_lines)
+                self.experiment_number = found_experiment_number
             self.eh_et_lines.extend(eh_et_lines)
             self.soh_lines.extend(soh_lines)
 
 
 if __name__ == '__main__':
     pass
-a = LogFileReader(Path('/Users/kle/PycharmProjects/sohstationviewer/RT130_9BB3_2016326_2016365.log'))
+a = LogFileReader(Path('/Users/kle/PycharmProjects/sohstationviewer/tests/test_data/potato.sdr/LOGS/RT130_92EB_2017150_2017150.log'))
 a.read()
-- 
GitLab