dom_activity.py 3.39 KiB
#!/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: 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 matplotlib
matplotlib.use("Agg")
import km3pipe as kp
import km3pipe.style
from km3modules.plot import plot_dom_parameters
VERSION = "1.0"
km3pipe.style.use('km3pipe')
class DOMActivityPlotter(kp.Module):
"Creates a plot with dots for each DOM, coloured based in their activity"
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)
self.log.warning("Starting DOM Activity monitor")
def process(self, blob):
self.index += 1
if self.index % 30:
return blob
if 'RawSummaryslice' in blob:
summaryslice = blob['RawSummaryslice']
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)
self.log.warning(msg)
plot_dom_parameters(
delta_ts,
self.detector,
filename,
'last activity [s]',
"DOM Activity for DetID-{} - via Summary Slices".format(
self.detector.det_id),
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()