Source code for nectarchain.dqm.mean_waveforms
import os
import numpy as np
from matplotlib import pyplot as plt
from .dqm_summary_processor import DQMSummary
__all__ = ["MeanWaveFormsHighLowGain"]
[docs]
class MeanWaveFormsHighLowGain(DQMSummary):
def __init__(self, gaink, r0=False):
self.k = gaink
self.Pix = None
self.Samp = None
self.tel_id = None
self.Mwf = None
self.Mwf_ped = None
self.counter_evt = None
self.counter_ped = None
self.Mwf_average = None
self.Mwf_ped_average = None
self.Mwf_Mean_overPix = []
self.Mwf_ped_Mean_overPix = []
self.MeanWaveForms_Results_Dict = {}
self.MeanWaveForms_Figures_Dict = {}
self.MeanWaveForms_Figures_Names_Dict = {}
self.wf_list_plot = None
gain_c = "High" if self.k == 0 else "Low"
self.gain_c = gain_c
self.figure_keys = {
"physical": f"FIGURE-WF-Physical-{gain_c}-GAIN",
"pedestals": f"FIGURE-WF-Pedestals-{gain_c}-GAIN",
"combined": f"FIGURE-WF-COMBINED-{gain_c}-GAIN",
}
self.figure_filenames = {
"physical": f"_MeanWaveforms_Physical_{gain_c}Gain.png",
"pedestals": f"_MeanWaveforms_Pedestals_{gain_c}Gain.png",
"combined": f"_MeanWaveforms_CombinedPlot_{gain_c}Gain.png",
}
super().__init__(r0)
[docs]
def configure_for_run(self, path, Pix, Samp, Reader1, **kwargs):
"""Initialize waveform buffers and counters for a new run."""
self.Pix = Pix
self.Samp = Samp
self.tel_id = Reader1.subarray.tel_ids[0]
self.Mwf = np.zeros((Pix, Samp))
self.Mwf_ped = np.zeros((Pix, Samp))
self.counter_evt = 0
self.counter_ped = 0
self.Mwf_average = np.zeros((Pix, Samp))
self.Mwf_ped_average = np.zeros((Pix, Samp))
self.wf_list_plot = list(np.arange(1, Samp + 1))
def process_event(self, evt, noped):
if evt.trigger.event_type.value == 32: # only peds now
self.counter_ped += 1
else:
self.counter_evt += 1
for ipix in range(self.Pix):
if self.r0:
waveform = evt.r0.tel[self.tel_id].waveform[self.k][ipix]
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
waveform = evt.r1.tel[self.tel_id].waveform[..., ipix, :]
if evt.trigger.event_type.value == 32: # only peds now
self.Mwf_ped[ipix, :] += waveform
else:
self.Mwf[ipix, :] += waveform
return None
[docs]
def finish_run(self):
"""Compute mean waveforms over events and pixels."""
if self.counter_evt > 0:
self.Mwf_average = self.Mwf / self.counter_evt # get average
# get average over pixels
self.Mwf_Mean_overPix = np.mean(self.Mwf_average, axis=0)
if self.counter_ped > 0:
# get average pedestals
self.Mwf_ped_average = self.Mwf_ped / self.counter_ped
self.Mwf_ped_Mean_overPix = np.mean(self.Mwf_ped_average, axis=0)
return None
[docs]
def get_results(self):
"""Store waveform statistics in results dictionary by gain and type."""
self.MeanWaveForms_Results_Dict[
f"WF-PHY-AVERAGE-PIX-{self.gain_c.upper()}-GAIN"
] = self.Mwf_Mean_overPix
if self.counter_ped > 0:
self.MeanWaveForms_Results_Dict[
f"WF-AVERAGE-PED-PIX-{self.gain_c.upper()}-GAIN"
] = self.Mwf_ped_Mean_overPix
return self.MeanWaveForms_Results_Dict
def plot_results(self, name, fig_path):
wf_list = np.array(self.wf_list_plot)
colors = ["blue", "red"]
titles = ["physical", "pedestals"]
full_fig, full_ax = plt.subplots()
array_plot = [self.Mwf_average]
if self.counter_ped > 0:
array_plot.append(self.Mwf_ped_average)
for i, x in enumerate(array_plot):
key = titles[i]
fig_key = self.figure_keys[key]
full_name = name + self.figure_filenames[key]
fig_name = os.path.join(fig_path, full_name)
part_fig, part_ax = plt.subplots()
for ipix in range(self.Pix):
part_ax.plot(
wf_list, x[ipix, :], color=colors[i], alpha=0.005, linewidth=1
)
full_ax.plot(
wf_list, x[ipix, :], color=colors[i], alpha=0.005, linewidth=1
)
part_ax.set_title(f"Mean Waveforms {key.capitalize()} ({self.gain_c} Gain)")
part_ax.set_xlabel("Samples")
part_ax.set_ylabel("Amplitude (DC)")
part_ax.grid()
self.MeanWaveForms_Figures_Dict[fig_key] = part_fig
self.MeanWaveForms_Figures_Names_Dict[fig_key] = fig_name
plt.close(part_fig)
# Combined figure setup
full_ax.set_title(f"Mean Waveforms Combined Plot ({self.gain_c} Gain)")
full_ax.set_xlabel("Samples")
full_ax.set_ylabel("Amplitude (DC)")
full_ax.grid()
combined_key = self.figure_keys["combined"]
combined_path = os.path.join(fig_path, name + self.figure_filenames["combined"])
self.MeanWaveForms_Figures_Dict[combined_key] = full_fig
self.MeanWaveForms_Figures_Names_Dict[combined_key] = combined_path
plt.close(full_fig)
return self.MeanWaveForms_Figures_Dict, self.MeanWaveForms_Figures_Names_Dict