some intermediate state

This commit is contained in:
gac-alvra
2023-03-10 20:47:43 +01:00
parent 2e7f053d68
commit 8883cc8855

View File

@ -1,18 +1,46 @@
from collections import deque
from random import random from random import random
import wx import wx
import numpy as np
from slic.gui.widgets import LabeledMathEntry from slic.gui.widgets import LabeledMathEntry
from slic.gui.widgets import make_filled_hbox, make_filled_vbox from slic.gui.widgets import make_filled_hbox, make_filled_vbox, EXPANDING
from slic.gui.widgets.plotting import PlotPanel from slic.gui.widgets.plotting import PlotPanel
from bstrd import BS, bsstream
# config
#STAGEpv = epics.PV('SLAAR11-LMOT-M452:MOTOR_1.VAL') # global globi
chname_amplitude = "SARES11-SPEC125-M1.edge_amplitude"
chname_jitter = "SARES11-SPEC125-M1.edge_position"
chname_deriv = "SARES11-SPEC125-M1.edge_derivative"
chname_events = "SAR-CVME-TIFALL4:EvtSet"
chname_iZero = "SAROP11-PBPS110:INTENSITY"
length = 500
mm2fs = 6671.2 # lightspeed and delay stages
threshold = 7
# create channel
ch_amp = BS(chname_amplitude)
ch_jitter = BS(chname_jitter)
ch_events = BS(chname_events)
ch_iZero = BS(chname_iZero)
ch_deriv = BS(chname_deriv)
class MainPanel(wx.Panel): class MainPanel(wx.Panel):
def __init__(self, parent): def __init__(self, parent):
super().__init__(parent) super().__init__(parent)
self.beans = [] self.evts = np.empty((1000,256))
self.spilled = [] self.jitter = np.empty(1000)
self.amp = np.empty(1000)
self.iZero = np.empty(1000)
self.deriv = np.empty((1000,2048))
self.beans = deque(maxlen=10)
self.spilled = deque(maxlen=10)
btn_minus = wx.Button(self, label="-") btn_minus = wx.Button(self, label="-")
btn_plus = wx.Button(self, label="+") btn_plus = wx.Button(self, label="+")
@ -31,7 +59,7 @@ class MainPanel(wx.Panel):
plots = (plot_beans, plot_spilled) plots = (plot_beans, plot_spilled)
hb_plots = make_filled_hbox(plots) hb_plots = make_filled_hbox(plots)
widgets = (hb_btns, le_beans, le_spilled, hb_plots) widgets = (hb_btns, le_beans, le_spilled, EXPANDING, hb_plots)
box = make_filled_vbox(widgets, border=10) box = make_filled_vbox(widgets, border=10)
self.SetSizerAndFit(box) self.SetSizerAndFit(box)
@ -40,13 +68,13 @@ class MainPanel(wx.Panel):
btn_check.Bind(wx.EVT_BUTTON, self.on_click_check) btn_check.Bind(wx.EVT_BUTTON, self.on_click_check)
def on_click_minus(self, _event): def on_click_minus(self, _event):
le = self.le_beans le = self.le_beans
current = le.GetValue() current = le.GetValue()
le.SetValue(current - 1) le.SetValue(current - 1)
self.update_plot() self.update_plot()
def on_click_plus(self, _event): def on_click_plus(self, _event):
if random() < 0.9: if random() < 0.9:
le = self.le_beans le = self.le_beans
@ -56,12 +84,40 @@ class MainPanel(wx.Panel):
le.SetValue(current + 1) le.SetValue(current + 1)
self.update_plot() self.update_plot()
def on_click_check(self, _event): def on_click_check(self, _event):
percent = self.get_percentage()
msg = f"You spilled {percent:.2}% of the beans." self.evts = np.empty((1000,256))
self.le_beans.SetValue(0) self.jitter = np.empty(1000)
self.le_spilled.SetValue(0) self.amp = np.empty(1000)
wx.MessageBox(msg, "Spillage Stats", wx.OK|wx.ICON_WARNING) self.iZero = np.empty(1000)
self.deriv = np.empty((1000,2048))
def goodshots(events, *arrays):
fel = events[:, 13]
laser = events[:, 18]
darkShot = events[:, 21]
pumped_shots = np.logical_and.reduce((fel, laser, np.logical_not(darkShot)))
return [a[pumped_shots] for a in arrays]
# percent = self.get_percentage()
# msg = f"You spilled {percent:.2}% of the beans."
# self.le_beans.SetValue(0)
# self.le_spilled.SetValue(0)
# wx.MessageBox(msg, "Spillage Stats", wx.OK|wx.ICON_WARNING)
for i in range(1000):
self.evts[i] = ch_events.get()
self.jitter[i] = ch_jitter.get()
self.amp[i] = ch_amp.get()
self.iZero[i] = ch_iZero.get()
self.deriv[i] = ch_deriv.get()
next(bsstream)
self.deriv, self.amp, self.jitter, self.iZero = goodshots(self.evts, self.deriv, self.amp, self.jitter, self.iZero)
self.update_plot()
def get_percentage(self): def get_percentage(self):
b = self.le_beans.GetValue() or 0 b = self.le_beans.GetValue() or 0
@ -82,10 +138,20 @@ class MainPanel(wx.Panel):
def draw_plot(self): def draw_plot(self):
self.plot_beans.clear() self.plot_beans.clear()
self.plot_spilled.clear() self.plot_spilled.clear()
self.plot_beans.plot(self.beans) self.plot_beans.plot(self.deriv[0], color='grey')
self.plot_spilled.plot(self.spilled) self.plot_beans.plot(self.deriv[-1], color='grey')
self.plot_beans.plot(self.deriv[10], color='grey')
self.plot_beans.plot(self.deriv[-10], color='grey')
self.plot_beans.plot(np.mean(self.deriv, axis=0), color='orangered')
self.plot_spilled.plot(self.jitter)
self.plot_beans.draw() self.plot_beans.draw()
self.plot_spilled.draw() self.plot_spilled.draw()
def goodshots(events, *arrays):
fel = events[:, 13]
laser = events[:, 18]
darkShot = events[:, 21]
pumped_shots = np.logical_and.reduce((fel, laser, np.logical_not(darkShot)))
return [a[pumped_shots] for a in arrays]