Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-01-18 10:17:18

0001 #!/usr/bin/python3.6
0002 
0003 # Copyright 2020, Jefferson Science Associates, LLC.
0004 # Subject to the terms in the LICENSE file found in the top-level directory.
0005 
0006 import random
0007 import numpy as np
0008 import matplotlib.pyplot as plt
0009 from IPython.display import display, clear_output, set_matplotlib_close
0010 
0011 # define global variables
0012 numChans = 80
0013 
0014 
0015 class OccupancyFig:
0016     """Class to create figure for occupancy plots"""
0017 
0018     # define figure and plot attributes
0019     def __init__(self):
0020         self.fig = plt.figure()
0021         # self.fig.set_size_inches(18.5, 10.5, forward=True)
0022 
0023 
0024 class OccupancyPlot:
0025     """Class to plot streaming occupancy data"""
0026 
0027     def __init__(self, data_dict, thresh, fig, hit_cntr):
0028         self.thresh = thresh
0029         self.fig = fig
0030         self.hit_cntr = hit_cntr
0031         self.chan_list = np.arange(1, numChans + 1, 1)
0032         for chan in range(1, numChans + 1):
0033             if len(np.where(data_dict['adcSamplesChan_%d' % chan] > self.thresh)[0]) != 0:
0034                 self.hit_cntr[chan-1] += 1
0035             # remove event data after being published
0036             data_dict.pop('adcSamplesChan_%s' % str(chan), None)
0037             data_dict.pop('tdcSamplesChan_%s' % str(chan), None)
0038         plt.bar(self.chan_list, self.hit_cntr, align = 'center', color = 'tab:blue')
0039         plt.xlabel('Channel Number')
0040         plt.ylabel('Number of ADC Hits > %d Channels' % self.thresh)
0041         plt.title('ADC Occupancy')
0042         # display(self.fig)
0043         clear_output(wait = True)
0044         plt.pause(0.005)
0045 
0046     def get_hit_cntr(self):
0047         return self.hit_cntr
0048 
0049 
0050 class WaveformFig:
0051     """Class to create a figure and subplots based on user input for viewing waveforms"""
0052 
0053     # define figure and plot attributes
0054     def __init__(self, nrows, ncols):
0055         self.nrows = nrows
0056         self.ncols = ncols
0057         self.fig, self.axs = plt.subplots(self.nrows, self.ncols)
0058         # self.fig.set_size_inches(18.5, 10.5, forward=True)
0059         # channel list, ascending and non-repeating
0060         self.chans = random.sample(range(1, numChans + 1), self.nrows * self.ncols)
0061         self.chans.sort()
0062 
0063     def get_num_rows(self):
0064         return self.nrows
0065 
0066     def get_num_cols(self):
0067         return self.ncols
0068 
0069     def get_fig_obj(self):
0070         return self.fig
0071 
0072     def get_axs_obj(self):
0073         return self.axs
0074 
0075     def get_chan_list(self):
0076         return self.chans
0077 
0078 
0079 class WaveformPlot:
0080     """Class to plot streaming ADC vs. TDC data"""
0081 
0082     # instance variables unique to each instance
0083     def __init__(self, data_dict, thresh, nrows, ncols, fig, axs, chans):
0084         # figure parameters
0085         self.thresh = thresh
0086         self.nrows = nrows
0087         self.ncols = ncols
0088         self.fig = fig
0089         self.axs = axs
0090         self.chans = chans
0091         # lists for colors and markers
0092         self.cl = ['tab:blue', 'tab:orange', 'tab:green', 'tab:red', 'tab:purple',
0093                    'tab:brown', 'tab:pink', 'tab:gray', 'tab:olive', 'tab:cyan']
0094         self.ml = ['o', '^', 's', 'p', 'P', '*', 'X', 'd']
0095         self.ic = 0  # index counter
0096         if self.nrows == 1 and self.ncols == 1:
0097             self.axs.cla()
0098             self.axs.plot(data_dict['tdcSamplesChan_%d' % self.chans[self.ic]],
0099                           data_dict['adcSamplesChan_%d' % self.chans[self.ic]],
0100                           color = self.cl[self.ic % len(self.cl)],
0101                           marker = self.ml[self.ic % len(self.ml)],
0102                           ls = '', label = 'Channel %d' % self.chans[self.ic])
0103             hit_loc = np.where(data_dict['adcSamplesChan_%d' % self.chans[self.ic]] > self.thresh)[0] + \
0104                       np.min(data_dict['tdcSamplesChan_%d' % self.chans[self.ic]])
0105             if len(hit_loc) != 0: self.axs.set_xlim(np.min(hit_loc) - 10, np.max(hit_loc) + 20)
0106             self.axs.set_ylim(0, 1024)
0107             self.axs.set_ylabel('ADC Value')
0108             self.axs.set_xlabel('TDC Sample Number')
0109             self.axs.legend(loc = 'best', markerscale = 0, handletextpad = 0, handlelength = 0)
0110             self.ic += 1
0111         if (self.nrows == 1 and self.ncols == 2) or (self.nrows == 2 and self.ncols == 1):
0112             for index in range(2):
0113                 self.axs[index].cla()
0114                 self.axs[index].plot(data_dict['tdcSamplesChan_%d' % self.chans[self.ic]],
0115                               data_dict['adcSamplesChan_%d' % self.chans[self.ic]],
0116                               color = self.cl[self.ic % len(self.cl)],
0117                               marker = self.ml[self.ic % len(self.ml)],
0118                               ls = '', label = 'Channel %d' % self.chans[self.ic])
0119                 hit_loc = np.where(data_dict['adcSamplesChan_%d' % self.chans[self.ic]] > self.thresh)[0] + \
0120                           np.min(data_dict['tdcSamplesChan_%d' % self.chans[self.ic]])
0121                 if len(hit_loc) != 0: self.axs[index].set_xlim(np.min(hit_loc) - 10, np.max(hit_loc) + 20)
0122                 self.axs[index].set_ylim(0, 1024)
0123                 self.axs[index].set_ylabel('ADC Value')
0124                 self.axs[index].set_xlabel('TDC Sample Number')
0125                 self.axs[index].legend(loc = 'best', markerscale = 0, handletextpad = 0, handlelength = 0)
0126                 self.ic += 1
0127         if self.nrows >= 2 and self.ncols >=2:
0128             for row in range(self.nrows):
0129                 for column in range(self.ncols):
0130                     self.axs[row, column].cla()
0131                     self.axs[row, column].plot(data_dict['tdcSamplesChan_%d' % self.chans[self.ic]],
0132                                                data_dict['adcSamplesChan_%d' % self.chans[self.ic]],
0133                                                color = self.cl[self.ic % len(self.cl)],
0134                                                marker = self.ml[self.ic % len(self.ml)],
0135                                                ls = '', label = 'Channel %d' % self.chans[self.ic])
0136                     hit_loc = np.where(data_dict['adcSamplesChan_%d' % self.chans[self.ic]] > self.thresh)[0] + \
0137                              np.min(data_dict['tdcSamplesChan_%d' % self.chans[self.ic]])
0138                     if len(hit_loc) != 0: self.axs[row, column].set_xlim(np.min(hit_loc) - 10, np.max(hit_loc) + 20)
0139                     self.axs[row, column].set_ylim(0, 1024)
0140                     if column == 0:
0141                         self.axs[row, column].set_ylabel('ADC Value')
0142                     if row == self.nrows - 1:
0143                         self.axs[row, column].set_xlabel('TDC Sample Number')
0144                     self.axs[row, column].legend(loc = 'best', markerscale = 0, handletextpad = 0, handlelength = 0)
0145                     self.ic += 1
0146         plt.tight_layout()
0147         # plt.savefig('plots/event_%d.png' % ec)
0148         # plt.pause(0.05)
0149         # display(self.fig)
0150         set_matplotlib_close(False)
0151         clear_output(wait = True)
0152         plt.pause(0.005)
0153         # remove event data after being published
0154         for chan in range(1, numChans + 1):
0155             data_dict.pop('adcSamplesChan_%s' % str(chan), None)
0156             data_dict.pop('tdcSamplesChan_%s' % str(chan), None)