Source code for nectarchain.dqm.mean_camera_display

import os

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

from .dqm_summary_processor import DQMSummary

__all__ = ["MeanCameraDisplayHighLowGain"]


[docs] class MeanCameraDisplayHighLowGain(DQMSummary): def __init__(self, gaink, r0=False): self.k = gaink self.Pix = None self.Samp = None self.tel_id = None self.CameraAverage = None self.CameraAverage_ped = None self.counter_evt = None self.counter_ped = None self.camera = None self.cmap = None self.CameraAverage = [] self.CameraAverage1 = [] self.CameraAverage_ped = [] self.CameraAverage_ped1 = [] self.CameraAverage_overEvents = None self.CameraAverage_overEvents_overSamp = None self.CameraAverage_ped_overEvents = None self.CameraAverage_ped_overEvents_overSamp = None self.MeanCameraDisplay_Results_Dict = {} self.MeanCameraDisplay_Figures_Dict = {} self.MeanCameraDisplay_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.counter_evt = 0 self.counter_ped = 0 self.camera = Reader1.subarray.tel[self.tel_id].camera.geometry.transform_to( EngineeringCameraFrame() ) self.cmap = "gnuplot2" def process_event(self, evt, noped): self.pixelBAD = evt.mon.tel[self.tel_id].pixel_status.hardware_failing_pixels pixel = evt.nectarcam.tel[self.tel_id].svc.pixel_ids if len(pixel) < self.Pix: pixel21 = list(np.arange(0, self.Pix - len(pixel), 1, dtype=int)) pixel = list(pixel) pixels = np.concatenate([pixel21, pixel]) else: pixels = pixel if self.r0: waveforms = evt.r0.tel[self.tel_id].waveform[self.k] else: # This should accommodate cases were the shape of waveforms is 2D # (1855,60), or 3D (2, 1855, 60) for 2-gain channels or # (1, 1855, 60) for single-gain channel waveforms = evt.r1.tel[self.tel_id].waveform if evt.trigger.event_type.value == 32: # count peds self.counter_ped += 1 self.CameraAverage_ped1 = waveforms.sum(axis=-1) self.CameraAverage_ped.append(self.CameraAverage_ped1[pixels]) else: self.counter_evt += 1 self.CameraAverage1 = waveforms.sum(axis=-1) self.CameraAverage.append(self.CameraAverage1[pixels]) return None def finish_run(self): if self.counter_evt > 0: self.CameraAverage = np.array(self.CameraAverage) self.CameraAverage = self.CameraAverage.sum(axis=0) self.CameraAverage_overEvents = self.CameraAverage / self.counter_evt self.CameraAverage_overEvents_overSamp = ( self.CameraAverage_overEvents / self.Samp ) if self.counter_ped > 0: self.CameraAverage_ped = np.array(self.CameraAverage_ped) self.CameraAverage_ped = self.CameraAverage_ped.sum(axis=0) self.CameraAverage_ped_overEvents = ( self.CameraAverage_ped / self.counter_ped ) self.CameraAverage_ped_overEvents_overSamp = ( self.CameraAverage_ped_overEvents / self.Samp ) def get_results(self): # ASSIGN RESUTLS TO DICT if self.k == 0: if self.counter_evt > 0: # self.MeanCameraDisplay_Results_Dict[ # "CAMERA-AVERAGE-OverEVENTS-HIGH-GAIN" # ] = self.CameraAverage_overEvents self.MeanCameraDisplay_Results_Dict[ "CAMERA-AVERAGE-PHY-OverEVENTS-OverSamp-HIGH-GAIN" ] = self.CameraAverage_overEvents_overSamp if self.counter_ped > 0: # self.MeanCameraDisplay_Results_Dict[ # "CAMERA-AVERAGE-PED-OverEVENTS-HIGH-GAIN" # ]= self.CameraAverage_ped_overEvents self.MeanCameraDisplay_Results_Dict[ "CAMERA-AVERAGE-PED-OverEVENTS-OverSamp-HIGH-GAIN" ] = self.CameraAverage_ped_overEvents_overSamp if self.k == 1: if self.counter_evt > 0: # self.MeanCameraDisplay_Results_Dict[ # "CAMERA-AVERAGE-OverEVENTS-LOW-GAIN" # ] = self.CameraAverage_overEvents self.MeanCameraDisplay_Results_Dict[ "CAMERA-AVERAGE-PHY-OverEVENTS-OverSamp-LOW-GAIN" ] = self.CameraAverage_overEvents_overSamp if self.counter_ped > 0: # self.MeanCameraDisplay_Results_Dict[ # "CAMERA-AVERAGE-PED-OverEVENTS-LOW-GAIN" # ]= self.CameraAverage_ped_overEvents self.MeanCameraDisplay_Results_Dict[ "CAMERA-AVERAGE-PED-OverEVENTS-OverSamp-LOW-GAIN" ] = self.CameraAverage_ped_overEvents_overSamp return self.MeanCameraDisplay_Results_Dict def plot_results(self, name, fig_path): # titles = ['All', 'Pedestals'] if self.k == 0: gain_c = "High" if self.k == 1: gain_c = "Low" if self.counter_evt > 0: fig1, disp1 = plt.subplots() disp1 = CameraDisplay( geometry=self.camera[~self.pixelBAD[0]], image=self.CameraAverage_overEvents_overSamp[~self.pixelBAD[0]], cmap=plt.cm.coolwarm, ) disp1.add_colorbar() disp1.axes.text(2.0, 0, "Charge (DC)", rotation=90) plt.title("Camera average %s gain (ALL)" % gain_c) self.MeanCameraDisplay_Figures_Dict[ "CAMERA-AVERAGE-PHY-DISPLAY-%s-GAIN" % gain_c ] = fig1 full_name = name + "_Camera_Mean_%sGain.png" % gain_c FullPath = os.path.join(fig_path, full_name) self.MeanCameraDisplay_Figures_Names_Dict[ "CAMERA-AVERAGE-PHY-DISPLAY-%s-GAIN" % gain_c ] = FullPath plt.close() if self.counter_ped > 0: fig2, disp2 = plt.subplots() disp2 = CameraDisplay( geometry=self.camera[~self.pixelBAD[0]], image=self.CameraAverage_ped_overEvents_overSamp[~self.pixelBAD[0]], cmap=plt.cm.coolwarm, ) disp2.add_colorbar() disp2.axes.text(2.0, 0, "Charge (DC)", rotation=90) plt.title("Camera average %s gain (PED)" % gain_c) self.MeanCameraDisplay_Figures_Dict[ "CAMERA-AVERAGE-PED-DISPLAY-%s-GAIN" % gain_c ] = fig2 full_name = name + "_Pedestal_Mean_%sGain.png" % gain_c FullPath = os.path.join(fig_path, full_name) self.MeanCameraDisplay_Figures_Names_Dict[ "CAMERA-AVERAGE-PED-DISPLAY-%s-GAIN" % gain_c ] = FullPath plt.close() return ( self.MeanCameraDisplay_Figures_Dict, self.MeanCameraDisplay_Figures_Names_Dict, )