forked from SwissFEL/c365
242 lines
9.7 KiB
Python
Executable File
242 lines
9.7 KiB
Python
Executable File
from collections import deque
|
|
import random
|
|
import wx
|
|
import numpy as np
|
|
import epics
|
|
|
|
from datetime import datetime
|
|
from scipy.stats.stats import pearsonr
|
|
|
|
#from epics.wx import MotorPanel
|
|
|
|
from slic.gui.widgets import LabeledMathEntry
|
|
from slic.gui.widgets import make_filled_hbox, make_filled_vbox, EXPANDING
|
|
from slic.gui.widgets.plotting import PlotPanel
|
|
|
|
from bstrd import BS, bsstream
|
|
|
|
def unpumped(events, *arrays):
|
|
laser = events[:, 18]
|
|
darkShot = events[:, 21]
|
|
background_shots = np.logical_and.reduce((laser, darkShot))
|
|
return [a[background_shots] for a in arrays]
|
|
|
|
def pumped(events, *arrays):
|
|
fel = events[:, 13]
|
|
laser = events[:, 18]
|
|
darkShot = events[:, 21]
|
|
pumped_shots = np.logical_and.reduce((laser, np.logical_not(darkShot)))
|
|
return [a[pumped_shots] for a in arrays]
|
|
|
|
|
|
# config
|
|
nshots = 50
|
|
qlength = 100
|
|
histlength = 1
|
|
|
|
# channels
|
|
chname_pbpsint = "SAROP11-PBPS122:INTENSITY"
|
|
#chname_pbpsint = "SARES11-SPEC125-M1.edge_amplitude"
|
|
#chname_pbpsint = "SARES30-LSCP1-FNS:CH0:VAL_GET"
|
|
|
|
###--- FLEX Keysight ---###
|
|
#chname_fluo1 = "SARES12-GES1:PR1_CH1_VAL_GET"
|
|
#chname_fluo2 = "SARES12-GES1:PR1_CH2_VAL_GET"
|
|
|
|
###--- PRIME Keysight ---###
|
|
chname_fluo1 = "SARES11-GES1:PR1_CH1_VAL_GET"
|
|
chname_fluo2 = "SARES11-GES1:PR1_CH2_VAL_GET"
|
|
|
|
###--- PALM Keysight ---###
|
|
#chname_fluo1 = "SAROP11-GES1:PR1_CH1_VAL_GET"
|
|
#chname_fluo2 = "SAROP11-GES1:PR1_CH2_VAL_GET"
|
|
|
|
chname_events = "SAR-CVME-TIFALL4:EvtSet"
|
|
|
|
# create channels
|
|
ch_int = BS(chname_pbpsint)
|
|
ch_fluo1 = BS(chname_fluo1)
|
|
ch_fluo2 = BS(chname_fluo2)
|
|
ch_events = BS(chname_events)
|
|
|
|
iso_format = "%Y-%m-%d %H:%M:%S"
|
|
|
|
|
|
class MainPanel(wx.Panel):
|
|
|
|
def __init__(self, parent):
|
|
super().__init__(parent)
|
|
|
|
self.evts = np.empty((nshots,256))
|
|
self.iZero = np.empty(nshots)
|
|
self.fluo1 = np.empty(nshots)
|
|
self.fluo2 = np.empty(nshots)
|
|
|
|
self.iZerosP = deque(maxlen=qlength)
|
|
self.iZerosU = deque(maxlen=qlength)
|
|
self.fluo1s = deque(maxlen=qlength)
|
|
self.fluo2s = deque(maxlen=qlength)
|
|
#self.fluo1sU = deque(maxlen=qlength)
|
|
#self.fluo2sU = deque(maxlen=qlength)
|
|
|
|
self.corrTime1sP = deque(maxlen=qlength)
|
|
self.corrTime1sU = deque(maxlen=qlength)
|
|
self.corrTime2sP = deque(maxlen=qlength)
|
|
self.corrTime2sU = deque(maxlen=qlength)
|
|
|
|
self.fluo1stds = deque(maxlen=qlength)
|
|
self.fluo2stds = deque(maxlen=qlength)
|
|
|
|
self.iZerocorrsP = deque(maxlen=histlength)
|
|
self.fluocorr1sP = deque(maxlen=histlength)
|
|
self.fluocorr2sP = deque(maxlen=histlength)
|
|
self.iZerocorrsU = deque(maxlen=histlength)
|
|
self.fluocorr1sU = deque(maxlen=histlength)
|
|
self.fluocorr2sU = deque(maxlen=histlength)
|
|
|
|
self.plot_fluo1s = plot_fluo1s = PlotPanel(self, figsize=(4,3))
|
|
self.plot_corr1 = plot_corr1 = PlotPanel(self, figsize=(3,3))
|
|
self.plot_timecorr1 = plot_timecorr1 = PlotPanel(self, figsize=(4,3))
|
|
self.plot_fluo2s = plot_fluo2s = PlotPanel(self, figsize=(4,3))
|
|
self.plot_corr2 = plot_corr2 = PlotPanel(self, figsize=(3,3))
|
|
self.plot_timecorr2 = plot_timecorr2 = PlotPanel(self, figsize=(4,3))
|
|
|
|
plots1 = (plot_fluo1s, plot_corr1, plot_timecorr1)
|
|
plots2 = (plot_fluo2s, plot_corr2, plot_timecorr2)
|
|
|
|
hb_plot1 = make_filled_hbox(plots1)
|
|
hb_plot2 = make_filled_hbox(plots2)
|
|
|
|
btn_clearQ = wx.Button(self, label="Clear plots")
|
|
btns = (btn_clearQ,)
|
|
hb_btns = make_filled_hbox(btns)
|
|
|
|
widgets = (hb_plot1, hb_plot2, hb_btns)
|
|
box = make_filled_vbox(widgets, border=1)
|
|
self.SetSizerAndFit(box)
|
|
|
|
btn_clearQ.Bind(wx.EVT_BUTTON, self.on_click_clearQ)
|
|
|
|
self.timer = wx.Timer(self)
|
|
self.Bind(wx.EVT_TIMER, self.on_update, self.timer)
|
|
self.timer.Start(100)
|
|
|
|
|
|
def on_update(self, _event):
|
|
|
|
self.time = datetime.now().strftime(iso_format)
|
|
|
|
self.evts = np.empty((nshots,256))
|
|
self.iZero = np.empty(nshots)
|
|
self.fluo1 = np.empty(nshots)
|
|
self.fluo2 = np.empty(nshots)
|
|
|
|
for i in range(nshots):
|
|
tempa = ch_events.get()
|
|
self.evts[i] = tempa
|
|
tempb = ch_int.get()
|
|
self.iZero[i] = tempb
|
|
tempc = ch_fluo1.get()
|
|
self.fluo1[i] = tempc
|
|
tempd = ch_fluo2.get()
|
|
self.fluo2[i] = tempd
|
|
next(bsstream)
|
|
wx.GetApp().Yield()
|
|
|
|
#self.iZeroP = pumped(self.evts, self.iZero)
|
|
#self.fluo1P = pumped(self.evts, self.fluo1)
|
|
#self.fluo2P = pumped(self.evts, self.fluo2)
|
|
|
|
self.iZeroU = unpumped(self.evts, self.iZero)
|
|
self.fluo1U = unpumped(self.evts, self.fluo1)
|
|
self.fluo2U = unpumped(self.evts, self.fluo2)
|
|
|
|
#self.iZerosP.append(np.mean(self.iZeroP))
|
|
self.iZerosU.append(np.mean(self.iZeroU))
|
|
|
|
#self.iZerocorrsP.append(self.iZeroP)
|
|
#self.fluocorr1sP.append(self.fluo1P)
|
|
#self.fluocorr2sP.append(self.fluo2P)
|
|
self.iZerocorrsU.append(self.iZeroU)
|
|
self.fluocorr1sU.append(self.fluo1U)
|
|
self.fluocorr2sU.append(self.fluo2U)
|
|
|
|
self.fluo1s.append(np.mean(self.fluo1U))
|
|
self.fluo1stds.append(np.std(self.fluo1U))
|
|
self.fluo2s.append(np.mean(self.fluo2U))
|
|
self.fluo2stds.append(np.std(self.fluo2U))
|
|
|
|
#self.corrTime1sP.append(pearsonr(np.ravel(self.iZerocorrsP), np.ravel(self.fluocorr1sP))[0])
|
|
#self.corrTime2sP.append(pearsonr(np.ravel(self.iZerocorrsP), np.ravel(self.fluocorr2sP))[0])
|
|
self.corrTime1sU.append(pearsonr(np.ravel(self.iZerocorrsU), np.ravel(self.fluocorr1sU))[0])
|
|
self.corrTime2sU.append(pearsonr(np.ravel(self.iZerocorrsU), np.ravel(self.fluocorr2sU))[0])
|
|
|
|
self.draw_plot()
|
|
|
|
|
|
def draw_plot(self):
|
|
|
|
self.plot_fluo1s.clear()
|
|
self.plot_corr1.clear()
|
|
self.plot_timecorr1.clear()
|
|
self.plot_fluo2s.clear()
|
|
self.plot_corr2.clear()
|
|
self.plot_timecorr2.clear()
|
|
|
|
self.plot_fluo1s.set_xlabel('time ago, a.u.')
|
|
self.plot_fluo1s.set_ylabel('Diode 1 OFF, a.u.')
|
|
self.plot_corr1.set_xlabel('Izero, a.u.')
|
|
self.plot_corr1.set_ylabel('Diode 1, a.u.')
|
|
self.plot_timecorr1.set_xlabel('time ago, a.u.')
|
|
self.plot_timecorr1.set_ylabel('Correlation 1')
|
|
self.plot_fluo2s.set_xlabel('time ago, a.u.')
|
|
self.plot_fluo2s.set_ylabel('Diode 2 OFF, a.u.')
|
|
self.plot_corr2.set_xlabel('Izero, a.u.')
|
|
self.plot_corr2.set_ylabel('Diode 2, a.u.')
|
|
self.plot_timecorr2.set_xlabel('time ago, a.u.')
|
|
self.plot_timecorr2.set_ylabel('Correlation 2')
|
|
|
|
self.plot_fluo1s.fill_between(np.arange(0, len(self.fluo1s)), np.asarray(self.fluo1stds)+np.asarray(self.fluo1s), -np.asarray(self.fluo1stds)+np.asarray(self.fluo1s), color='lightgreen')
|
|
self.plot_fluo1s.set_title('Intensity: {:.4f} a.u.'.format(np.nanmean(self.fluo1U)))
|
|
self.plot_fluo1s.plot(np.arange(0, len(self.fluo1s)), self.fluo1s, '-', color='green')
|
|
|
|
|
|
self.plot_fluo2s.fill_between(np.arange(0, len(self.fluo2s)), np.asarray(self.fluo2stds)+np.asarray(self.fluo2s), -np.asarray(self.fluo2stds)+np.asarray(self.fluo2s), color='lavender')
|
|
self.plot_fluo2s.set_title('Intensity: {:.4f} a.u.'.format(np.nanmean(self.fluo2U)))
|
|
self.plot_fluo2s.plot(np.arange(0, len(self.fluo2s)), self.fluo2s, '-', color='purple')
|
|
|
|
if (len(self.corrTime1sP) > histlength):
|
|
#self.plot_timecorr1.plot(np.arange(0, len(self.corrTime1sP)), np.asarray(self.corrTime1sP), color='limegreen')
|
|
self.plot_timecorr1.plot(np.arange(0, len(self.corrTime1sU)), np.asarray(self.corrTime1sU), color='green')
|
|
#self.plot_timecorr2.plot(np.arange(0, len(self.corrTime2sP)), np.asarray(self.corrTime2sP), color='violet')
|
|
self.plot_timecorr2.plot(np.arange(0, len(self.corrTime2sU)), np.asarray(self.corrTime2sU), color='purple')
|
|
|
|
self.plot_corr1.plot(np.ravel(self.iZerocorrsU), np.ravel(self.fluocorr1sU), '.', color='green', label='OFF')
|
|
#self.plot_corr1.plot(np.ravel(self.iZerocorrsP), np.ravel(self.fluocorr1sP), '.', color='limegreen', label='ON')
|
|
#self.plot_corr1.set_title('Corr 1 on: {:.4f} - Corr 1 off: {:.4f}'.format(pearsonr(np.ravel(self.iZerocorrsP), np.ravel(self.fluocorr1sP))[0], pearsonr(np.ravel(self.iZerocorrsU), np.ravel(self.fluocorr1sU))[0]))
|
|
self.plot_corr1.set_title('Corr 1: {:.4f}'.format(pearsonr(np.ravel(self.iZerocorrsU), np.ravel(self.fluocorr1sU))[0]))
|
|
self.plot_corr1.legend(loc='lower right')
|
|
|
|
self.plot_corr2.plot(np.ravel(self.iZerocorrsU), np.ravel(self.fluocorr2sU), '.', color='purple', label='OFF')
|
|
#self.plot_corr2.plot(np.ravel(self.iZerocorrsP), np.ravel(self.fluocorr2sP), '.', color='violet', label='ON')
|
|
#self.plot_corr2.set_title('Corr 2 on: {:.4f} - Corr 1 off: {:.4f}'.format(pearsonr(np.ravel(self.iZerocorrsP), np.ravel(self.fluocorr2sP))[0], pearsonr(np.ravel(self.iZerocorrsU), np.ravel(self.fluocorr2sU))[0]))
|
|
self.plot_corr2.set_title('Corr 2: {:.4f}'.format(pearsonr(np.ravel(self.iZerocorrsU), np.ravel(self.fluocorr2sU))[0]))
|
|
self.plot_corr2.legend(loc='lower right')
|
|
|
|
self.plot_fluo1s.draw()
|
|
self.plot_corr1.draw()
|
|
self.plot_timecorr1.draw()
|
|
self.plot_fluo2s.draw()
|
|
self.plot_corr2.draw()
|
|
self.plot_timecorr2.draw()
|
|
|
|
|
|
def on_click_clearQ(self, _event):
|
|
|
|
self.plot_fluo1s.clear()
|
|
self.plot_corr1.clear()
|
|
self.plot_timecorr1.clear()
|
|
self.plot_fluo2s.clear()
|
|
self.plot_corr2.clear()
|
|
self.plot_timecorr2.clear()
|