diff --git a/scripts/dom_activity.py b/scripts/dom_activity.py new file mode 100755 index 0000000000000000000000000000000000000000..fbb766531182b1234187a6e9cec4dcc812abb477 --- /dev/null +++ b/scripts/dom_activity.py @@ -0,0 +1,119 @@ +#!/usr/bin/env python +# coding=utf-8 +# Filename: dom_activity.py +# Author: Tamas Gal <tgal@km3net.de> +# vim: ts=4 sw=4 et +""" +Monitors the DOM activity. + +Usage: + dom_activity.py [options] + dom_activity.py (-h | --help) + +Options: + -l LIGIER_IP The IP of the ligier [default: 127.0.0.1]. + -p LIGIER_PORT The port of the ligier [default: 5553]. + -d DET_ID Detector ID [default: 29]. + -o PLOT_DIR The directory to save the plot [default: www/plots]. + -h --help Show this screen. + +""" +from __future__ import division + +from collections import deque, defaultdict +from functools import partial +from io import BytesIO +import os +import time + +import km3pipe as kp +import km3pipe.style +from km3modules.plot import plot_dom_parameters + + +VERSION = "1.0" + +km3pipe.style.use('km3pipe') +log = kp.logger.get("DOMActivity") +log.warn("Starting DOM Activity monitor") + + +class DOMActivityPlotter(kp.Module): + def configure(self): + self.plots_path = self.require('plots_path') + det_id = self.require('det_id') + self.detector = kp.hardware.Detector(det_id=det_id) + self.index = 0 + self.last_activity = defaultdict(partial(deque, maxlen=4000)) + self.cuckoo = kp.time.Cuckoo(60, self.create_plot) + + def process(self, blob): + self.index += 1 + if self.index % 30: + return blob + + tag = str(blob['CHPrefix'].tag) + + if not tag == 'IO_SUM': + return blob + + data = blob['CHData'] + data_io = BytesIO(data) + preamble = kp.io.daq.DAQPreamble(file_obj=data_io) # noqa + summaryslice = kp.io.daq.DAQSummaryslice(file_obj=data_io) + timestamp = summaryslice.header.time_stamp + + for dom_id, _ in summaryslice.summary_frames.items(): + du, dom, _ = self.detector.doms[dom_id] + self.last_activity[(du, dom)] = timestamp + + self.cuckoo.msg() + + return blob + + def create_plot(self): + print(self.__class__.__name__ + ": updating plot.") + filename = os.path.join(self.plots_path, 'dom_activity.png') + now = kp.time.tai_timestamp() + now = time.time() + delta_ts = {} + inactive_doms = {} + for key, timestamp in self.last_activity.items(): + delta_t = now - timestamp + delta_ts[key] = delta_t + if delta_t > 300: + inactive_doms[key] = delta_t + if inactive_doms: + msg = "WARNING: the following DOM(s) has been inactive:\n" + for key, delta_t in inactive_doms.items(): + msg += " DU{}-DOM{} for {:.1f}s\n" \ + .format(key[0], key[1], delta_t) + log.warn(msg) + plot_dom_parameters(delta_ts, self.detector, filename, + 'last activity [s]', + "DOM Activity - via Summary Slices", + vmin=0.0, vmax=15*60) + + +def main(): + from docopt import docopt + args = docopt(__doc__, version=VERSION) + + det_id = int(args['-d']) + plots_path = args['-o'] + ligier_ip = args['-l'] + ligier_port = int(args['-p']) + + pipe = kp.Pipeline() + pipe.attach(kp.io.ch.CHPump, host=ligier_ip, + port=ligier_port, + tags='IO_SUM', + timeout=60*60*24*7, + max_queue=2000) + pipe.attach(kp.io.daq.DAQProcessor) + pipe.attach(DOMActivityPlotter, det_id=det_id, plots_path=plots_path) + pipe.drain() + + +if __name__ == '__main__': + main()