Source code for nectarchain.dqm.camera_monitoring

import logging
import os
import sqlite3

import numpy as np
from astropy import time as astropytime
from ctapipe.coordinates import EngineeringCameraFrame
from ctapipe.visualization import CameraDisplay
from matplotlib import pyplot as plt

from .dqm_summary_processor import DQMSummary

__all__ = ["CameraMonitoring"]

logging.basicConfig(format="%(asctime)s %(name)s %(levelname)s %(message)s")
log = logging.getLogger(__name__)
log.handlers = logging.getLogger("__main__").handlers


[docs] class CameraMonitoring(DQMSummary): def __init__(self, gaink, r0=False): self.k = gaink self.Pix = None self.Samp = None self.camera = None self.cmap = None self.subarray = None self.tel_id = None self.event_id = [] self.event_times = [] self.DrawerTemp = None self.run_start = None self.run_end = None self.DrawerTimes = None self.DrawerTemp11 = None self.DrawerTemp21 = None self.DrawerNum1 = None self.DrawerTimes_new = None self.DrawerTemp12 = None self.DrawerTemp22 = None self.DrawerNum2 = None self.DrawerTemp1_mean = [] self.DrawerTemp2_mean = [] self.CameraMonitoring_Results_Dict = {} self.ChargeInt_Figures_Dict = {} self.ChargeInt_Figures_Names_Dict = {} super().__init__(r0) def configure_for_run(self, path, Pix, Samp, Reader1, **kwargs): # define number of pixels and samples self.Pix = Pix self.Samp = Samp self.tel_id = Reader1.subarray.tel_ids[0] self.camera = Reader1.subarray.tel[self.tel_id].camera.geometry.transform_to( EngineeringCameraFrame() ) self.cmap = "gnuplot2" self.subarray = Reader1.subarray for i, evt1 in enumerate(Reader1): self.run_start1 = evt1.nectarcam.tel[self.tel_id].svc.date SqlFileDate = astropytime.Time(self.run_start1, format="unix").iso.split(" ")[0] log.debug(f"SqlFileDate is {SqlFileDate}") SqlFilePath = os.path.split(path)[0] SqlFileName = ( SqlFilePath + "/nectarcam_monitoring_db_" + SqlFileDate + ".sqlite" ) log.info(f"SqlFileName: {SqlFileName}") con = sqlite3.connect(SqlFileName) cursor = con.cursor() try: # print(cursor.fetchall()) # cursor.execute("SELECT name FROM sqlite_master WHERE type='table';") cursor.execute("SELECT * FROM monitoring_drawer_temperatures;") # TempData = cursor.execute( # """SELECT * FROM monitoring_drawer_temperatures""" # ) # print(TempData.description) self.DrawerTemp = cursor.fetchall() cursor.close() except sqlite3.Error as err: log.error( f"Drawer temperature could not be retrieved. Received error " f"code: {err}" ) def process_event(self, evt, noped): trigger_time = evt.trigger.time.value trigger_id = evt.index.event_id self.event_times.append(trigger_time) self.event_id.append(trigger_id) def finish_run(self): try: self.event_id = np.array(self.event_id) self.event_times = np.array(self.event_times) self.run_start = ( self.event_times[self.event_id == np.min(self.event_id)] - 100 ) self.run_end = np.max(self.event_times) + 100 self.DrawerTemp = np.array(self.DrawerTemp) self.DrawerTimes = np.array(self.DrawerTemp[:, 3]) for i in range(len(self.DrawerTimes)): self.DrawerTimes[i] = astropytime.Time( self.DrawerTimes[i], format="iso" ).unix self.DrawerTemp11 = self.DrawerTemp[:, 4][self.DrawerTimes > self.run_start] self.DrawerTemp21 = self.DrawerTemp[:, 5][self.DrawerTimes > self.run_start] self.DrawerNum1 = self.DrawerTemp[:, 2][self.DrawerTimes > self.run_start] self.DrawerTimes_new = self.DrawerTimes[self.DrawerTimes > self.run_start] self.DrawerTemp12 = self.DrawerTemp11[self.DrawerTimes_new < self.run_end] self.DrawerTemp22 = self.DrawerTemp21[self.DrawerTimes_new < self.run_end] self.DrawerNum2 = self.DrawerNum1[self.DrawerTimes_new < self.run_end] TotalDrawers = np.max(self.DrawerNum2) for i in range(TotalDrawers + 1): for j in range(7): self.DrawerTemp1_mean.append( np.mean(self.DrawerTemp12[self.DrawerNum2 == i]) ) self.DrawerTemp2_mean.append( np.mean(self.DrawerTemp22[self.DrawerNum2 == i]) ) self.DrawerTemp1_mean = np.array(self.DrawerTemp1_mean) self.DrawerTemp2_mean = np.array(self.DrawerTemp2_mean) self.DrawerTemp_mean = (self.DrawerTemp1_mean + self.DrawerTemp2_mean) / 2 except Exception as err: log.error( f"Drawer temperature could not be retrieved. Received error " f"code: {err}" ) def get_results(self): try: self.CameraMonitoring_Results_Dict[ "CAMERA-TEMPERATURE-AVERAGE" ] = self.DrawerTemp_mean except Exception as err: log.error( f"Drawer temperature could not be retrieved. Received error " f"code: {err}" ) return self.CameraMonitoring_Results_Dict def plot_results(self, name, fig_path): try: fig, _ = plt.subplots() disp = CameraDisplay(self.camera) disp.image = self.DrawerTemp_mean disp.cmap = plt.cm.coolwarm disp.axes.text(1.8, -0.3, "Temperature", fontsize=12, rotation=90) disp.add_colorbar() plt.title("Camera temperature average") full_name = name + "_CameraTemperature_Mean.png" full_path = os.path.join(fig_path, full_name) self.ChargeInt_Figures_Dict["CAMERA-TEMPERATURE-IMAGE-AVERAGE"] = fig self.ChargeInt_Figures_Names_Dict[ "CAMERA-TEMPERATURE-IMAGE-AVERAGE" ] = full_path plt.close() fig1, disp = plt.subplots() disp = CameraDisplay(self.camera) disp.image = self.DrawerTemp1_mean disp.cmap = plt.cm.coolwarm disp.axes.text(1.8, -0.3, "Temperature 1", fontsize=12, rotation=90) disp.add_colorbar() plt.title("Camera temperature average 1") full_name = name + "_CameraTemperature_average1.png" full_path = os.path.join(fig_path, full_name) self.ChargeInt_Figures_Dict["CAMERA-TEMPERATURE-IMAGE-AVERAGE-1"] = fig1 self.ChargeInt_Figures_Names_Dict[ "CAMERA-TEMPERATURE-IMAGE-AVERAGE-1" ] = full_path plt.close() fig2, disp = plt.subplots() disp = CameraDisplay(self.camera) disp.image = self.DrawerTemp2_mean disp.cmap = plt.cm.coolwarm disp.axes.text(1.8, -0.3, "Temperature 2", fontsize=12, rotation=90) disp.add_colorbar() plt.title("Camera temperature average 2") full_name = name + "_CameraTemperature_average2.png" full_path = os.path.join(fig_path, full_name) self.ChargeInt_Figures_Dict["CAMERA-TEMPERATURE-IMAGE-AVERAGE-2"] = fig2 self.ChargeInt_Figures_Names_Dict[ "CAMERA-TEMPERATURE-IMAGE-AVERAGE-2" ] = full_path except Exception as err: log.error(f"Received error code: {err}") return self.ChargeInt_Figures_Dict, self.ChargeInt_Figures_Names_Dict