From 64f5d47ed5e91fca46a67924aebc246c034892eb Mon Sep 17 00:00:00 2001
From: Tamas Gal <tgal@km3net.de>
Date: Mon, 10 Jun 2019 10:04:07 +0200
Subject: [PATCH] Log trigger rates to file

---
 scripts/trigger_rates.py | 42 ++++++++++++++++++++++++++++++++--------
 1 file changed, 34 insertions(+), 8 deletions(-)

diff --git a/scripts/trigger_rates.py b/scripts/trigger_rates.py
index bb53770..46032d1 100755
--- a/scripts/trigger_rates.py
+++ b/scripts/trigger_rates.py
@@ -24,7 +24,7 @@ from collections import defaultdict, deque, OrderedDict
 from itertools import chain
 import sys
 from io import BytesIO
-from os.path import join
+from os.path import join, exists
 import shutil
 import time
 import threading
@@ -47,13 +47,19 @@ km3pipe.style.use('km3pipe')
 class TriggerRate(kp.Module):
     def configure(self):
         self.plots_path = self.require('plots_path')
+        self.data_path = self.get('data_path', default='data')
         self.interval = self.get("interval",
                                  default=self.trigger_rate_sampling_period())
         self.filename = self.get("filename", default="trigger_rates")
         self.with_minor_ticks = self.get("with_minor_ticks", default=False)
+
         print("Update interval: {}s".format(self.interval))
         self.trigger_counts = defaultdict(int)
         self.trigger_rates = OrderedDict()
+        self._trigger_types = ["Overall", "3DMuon", "MXShower", "3DShower"]
+        self.trigger_rates_fobj = None
+
+        self.initialise_data_logging()
 
         self.styles = {
             "xfmt": md.DateFormatter('%Y-%m-%d %H:%M'),
@@ -65,17 +71,25 @@ class TriggerRate(kp.Module):
         }
 
         queue_len = int(60 * 24 / (self.interval / 60))
-        for trigger in ["Overall", "3DMuon", "MXShower", "3DShower"]:
+        for trigger in self._trigger_types:
             self.trigger_rates[trigger] = deque(maxlen=queue_len)
 
         self.run = True
-        self.thread = threading.Thread(target=self.plot).start()
+        threading.Thread(target=self.plot).start()
         self.lock = threading.Lock()
 
         self.run_changes = []
         self.current_run_id = 0
         self.det_id = 0
 
+    def initialise_data_logging(self):
+        filename = join(self.data_path, "trigger_rates.csv")
+        if not exists(filename):
+            self.trigger_rates_fobj = open(filename, "w")
+            self.trigger_rates_fobj.write(','.join(self._trigger_types) + '\n')
+        else:
+            self.trigger_rates_fobj = open(filename, "a")
+
     def process(self, blob):
         if not str(blob['CHPrefix'].tag) == 'IO_EVT':
             return blob
@@ -125,18 +139,31 @@ class TriggerRate(kp.Module):
     def plot(self):
         while self.run:
             time.sleep(self.interval)
+            timestamp, trigger_rates = self.calculate_trigger_rates()
+            self.write_trigger_rates(timestamp, trigger_rates)
             self.create_plot()
 
-    def create_plot(self):
-        print('\n' + self.__class__.__name__ + ": updating plot.")
+    def write_trigger_rates(self, timestamp, trigger_rates):
+        entry = f"{timestamp}"
+        for trigger_type in self._trigger_types:
+            entry += f",{trigger_rates[trigger_type]}"
+        entry += '\n'
+        self.trigger_rates_fobj.write(entry)
+        self.trigger_rates_fobj.flush()
 
+    def calculate_trigger_rates(self):
         timestamp = datetime.utcnow()
-
+        trigger_rates = {}
         with self.lock:
             for trigger, n_events in self.trigger_counts.items():
                 trigger_rate = n_events / self.interval
                 self.trigger_rates[trigger].append((timestamp, trigger_rate))
+                trigger_rates[trigger] = trigger_rate
             self.trigger_counts = defaultdict(int)
+        return timestamp, trigger_rates
+
+    def create_plot(self):
+        print('\n' + self.__class__.__name__ + ": updating plot.")
 
         fig, ax = plt.subplots(figsize=(16, 4))
 
@@ -208,9 +235,8 @@ class TriggerRate(kp.Module):
             return 180
 
     def finish(self):
+        self.trigger_rates_fobj.close()
         self.run = False
-        if self.thread is not None:
-            self.thread.stop()
 
 
 def main():
-- 
GitLab