Skip to content
Snippets Groups Projects
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()