Source code for daplis_rtp.gui.single_pixel_histogram

"""Module for plotting single pixel histograms.

The main usage is checking the homogeneity of the LinoSPAD2 output. The
output graph should be flat top.

"""

import sys

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg
from matplotlib.backends.backend_qt5agg import (
    NavigationToolbar2QT as NavigationToolbar,
)
from matplotlib.figure import Figure
from PyQt5.QtWidgets import QVBoxLayout, QWidget

from daplis_rtp.functions.unpack import unpack_bin


[docs] class HistCanvas(QWidget):
[docs] def __init__(self, parent=None, width=7, height=4, dpi=100): """Figure widget initialization. The figure is initialized with the matplotlib navigation panel for more control over the plot. Parameters ---------- width : int, optional Figure widget width, by default 7. height : int, optional Figure widget height, by default 4. dpi : int, optional Figure widget dpi, by default 100. """ super(HistCanvas, self).__init__(parent) # figure initialization self.figure = Figure(figsize=(width, height), dpi=100) self.canvas = FigureCanvasQTAgg(self.figure) self.toolbar = NavigationToolbar(self.canvas, self) self.ax = self.figure.add_subplot(111) self.figure.subplots_adjust( left=0.15, right=0.97, top=0.945, bottom=0.12 ) # creating a Vertical Box layout self.layout = QVBoxLayout(self) self.layout.addWidget(self.canvas) self.layout.addWidget(self.toolbar) self.setLayout(self.layout) self._setplotparameters()
def _setplotparameters(self, fontsize: int = 16): """Figure parameters manipulation. Set font size, axes labels. Set the width and orientation of the axes ticks. """ plt.rcParams.update({"font.size": fontsize}) self.ax.set_xlabel("Pixel (-)", fontsize=fontsize) self.ax.set_ylabel("# of timestamps (-)", fontsize=fontsize) self.ax.tick_params(which="both", width=2, direction="in") self.ax.tick_params( which="major", length=7, direction="in", labelsize=fontsize ) self.ax.tick_params( which="minor", length=4, direction="in", labelsize=fontsize ) self.ax.yaxis.set_ticks_position("both") self.ax.xaxis.set_ticks_position("both") for axis in ["top", "bottom", "left", "right"]: self.ax.spines[axis].set_linewidth(2)
[docs] def plot_hist( self, file: str, pixel: int, timestamps: int, board_number: str, fw_ver: str, cycle_length: float, ): """Plot histogram. Plots a histogram of timestamps for a single pixel. Bin size is set to 17.867 us. Parameters ---------- file : str Data file address. pixel : int Pixel number to plot a histogram for. timestamps : int Number of timestamps per pixel/TDC per acquisition cycle. board_number : str LinoSPAD2 daughterboard number. fw_ver : str LinoSPAD2 firmware version. """ data = unpack_bin(file, board_number, fw_ver, timestamps) bin_rounder = cycle_length / (2500 / 140) / 250 bins = np.arange(0, cycle_length, 2500 / 140 * bin_rounder) self.ax.cla() if fw_ver == "2208": self.ax.hist(data[pixel], bins=bins, color="teal") elif fw_ver[:-1] == "2212": if fw_ver == "2212s": pix_coor = np.arange(256).reshape(4, 64).T elif fw_ver == "2212b": pix_coor = np.arange(256).reshape(64, 4) tdc, pix = np.argwhere(pix_coor == pixel)[0] ind = np.where(data[tdc].T[0] == pix)[0] ind1 = np.where(data[tdc].T[1][ind] > 0)[0] data_to_plot = data[tdc].T[1][ind[ind1]] self.ax.hist(data_to_plot, bins=bins, color="teal") else: print("\nFirmware version is not recognized, exiting.") sys.exit() self.ax.set_xlabel("Time (ps)") self.ax.set_ylabel("# of timestamps (-)") # self.ax.set_title("Pixel {}, 17.867 us bin".format(pixel)) self.ax.set_xlim(0, cycle_length + 100) # self.ax.ticklabel_format(axis="y", style="sci", scilimits=(0, 0)) self.canvas.draw() self.canvas.flush_events()