forked from SwissFEL/c365
164 lines
5.2 KiB
Python
Executable File
164 lines
5.2 KiB
Python
Executable File
from collections import deque
|
|
import random
|
|
import wx
|
|
import numpy as np
|
|
import epics
|
|
|
|
from datetime import datetime
|
|
|
|
#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
|
|
from scipy.stats.stats import pearsonr
|
|
|
|
# config
|
|
nshots = 200
|
|
ttThreshold = 10
|
|
iZeroThreshold = 0.3
|
|
|
|
# channels
|
|
chname_jitter = "SARES11-SPEC125-M1.edge_position"
|
|
chname_jitter2 = "SARES11-SPEC125-M1.edge_position2"
|
|
chname_events = "SAR-CVME-TIFALL4:EvtSet"
|
|
chname_iZero = "SAROP11-PBPS122:INTENSITY"
|
|
|
|
# create channels
|
|
ch_jitter = BS(chname_jitter)
|
|
ch_jitter2 = BS(chname_jitter2)
|
|
ch_events = BS(chname_events)
|
|
ch_iZero = BS(chname_iZero)
|
|
|
|
iso_format = "%Y-%m-%d %H:%M:%S"
|
|
|
|
def goodshots(events, iZero, *arrays):
|
|
fel = events[:, 13]
|
|
laser = events[:, 18]
|
|
darkShot = events[:, 21]
|
|
pulsePicking = events[:,200]
|
|
iZero = iZero
|
|
pumped_shots = np.logical_and.reduce((fel, laser, np.logical_not(darkShot), iZero > iZeroThreshold))
|
|
return [a[pumped_shots] for a in arrays]
|
|
|
|
|
|
class MainPanel(wx.Panel):
|
|
|
|
def __init__(self, parent):
|
|
super().__init__(parent)
|
|
|
|
self.evts = np.empty((nshots,256))
|
|
self.jitter = np.empty(nshots)
|
|
self.jitter2 = np.empty(nshots)
|
|
self.iZero = np.empty(nshots)
|
|
|
|
self.jitters = deque(maxlen=1)
|
|
self.jitters2 = deque(maxlen=1)
|
|
self.corrs = deque(maxlen=1000)
|
|
self.diffs = deque(maxlen=10000)
|
|
|
|
self.plot_jitters_corr = plot_jitters_corr = PlotPanel(self, figsize=(5,5))
|
|
self.plot_corrs_time = plot_corrs_time = PlotPanel(self, figsize=(5,2))
|
|
self.plot_diffs_time = plot_diffs_time = PlotPanel(self, figsize=(5,2))
|
|
|
|
plots1 = (plot_jitters_corr,)
|
|
hb_plot1 = make_filled_hbox(plots1)
|
|
|
|
plots2 = (plot_corrs_time,)
|
|
hb_plot2 = make_filled_hbox(plots2)
|
|
|
|
plots3 = (plot_diffs_time,)
|
|
hb_plot3 = make_filled_hbox(plots3)
|
|
|
|
btn_clearQ = wx.Button(self, label="Clear plots")
|
|
btns = (btn_clearQ,)
|
|
hb_btns = make_filled_hbox(btns)
|
|
|
|
btn_clearQ.Bind(wx.EVT_BUTTON, self.on_click_clearQ)
|
|
|
|
widgets = (hb_plot1, hb_plot2, hb_plot3, hb_btns)
|
|
box = make_filled_vbox(widgets, border=1)
|
|
self.SetSizerAndFit(box)
|
|
|
|
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.jitter = np.empty(nshots)
|
|
self.jitter2 = np.empty(nshots)
|
|
self.iZero = np.empty(nshots)
|
|
|
|
for i in range(nshots):
|
|
tempa = ch_events.get()
|
|
self.evts[i] = tempa
|
|
tempb = ch_jitter.get()
|
|
self.jitter[i] = tempb
|
|
tempc = ch_jitter2.get()
|
|
self.jitter2[i] = tempc
|
|
tempd = ch_iZero.get()
|
|
self.iZero[i] = tempd
|
|
next(bsstream)
|
|
wx.GetApp().Yield()
|
|
|
|
self.jitter, self.jitter2 = goodshots(self.evts, self.iZero, self.jitter, self.jitter2)
|
|
|
|
if (len(np.asarray(self.jitter)) > 1):
|
|
self.jitters.append(self.jitter)
|
|
self.jitters2.append(np.roll(self.jitter2, 0))
|
|
|
|
self.pearscoeff1, _ = pearsonr(np.ravel(self.jitters), np.ravel(self.jitters2))
|
|
self.corrs.append(self.pearscoeff1)
|
|
self.diffs.append(np.mean(np.ravel(self.jitters)) - np.mean(np.ravel(self.jitters2)))
|
|
|
|
else:
|
|
print("{} Where are my X-rays?".format(self.time))
|
|
self.jitters.append(np.nan)
|
|
self.jitters2.append(np.nan)
|
|
self.corrs.append(np.nan)
|
|
self.diffs.append(np.nan)
|
|
|
|
self.draw_plot()
|
|
|
|
|
|
def draw_plot(self):
|
|
self.plot_jitters_corr.clear()
|
|
self.plot_corrs_time.clear()
|
|
self.plot_diffs_time.clear()
|
|
|
|
self.plot_jitters_corr.set_xlabel(chname_jitter)
|
|
self.plot_jitters_corr.set_ylabel(chname_jitter2)
|
|
self.plot_jitters_corr.grid(True, linestyle='--')
|
|
self.plot_jitters_corr.axline((np.mean(np.ravel(self.jitters)),np.mean(np.ravel(self.jitters2))), slope=1, linestyle='--', color='black')
|
|
self.plot_jitters_corr.set_title('Correlation: {:.4f}'.format(pearsonr(np.ravel(self.jitters), np.ravel(self.jitters2))[0]))
|
|
|
|
self.plot_corrs_time.set_xlabel('time ago, a.u.')
|
|
self.plot_corrs_time.set_ylabel('correlation')
|
|
self.plot_corrs_time.grid(True, linestyle='--')
|
|
|
|
self.plot_diffs_time.set_xlabel('')
|
|
self.plot_diffs_time.set_ylabel('')
|
|
self.plot_diffs_time.grid(True, linestyle='--')
|
|
|
|
self.plot_jitters_corr.scatter(np.ravel(self.jitters), np.ravel(self.jitters2), color='orangered')
|
|
self.plot_corrs_time.plot(self.corrs, 'o-', color='orangered')
|
|
self.plot_diffs_time.plot(self.diffs)
|
|
|
|
self.plot_jitters_corr.draw()
|
|
self.plot_corrs_time.draw()
|
|
self.plot_diffs_time.draw()
|
|
|
|
|
|
def on_click_clearQ(self, _event):
|
|
self.jitters.clear()
|
|
self.jitters2.clear()
|
|
self.corrs.clear()
|
|
self.diffs.clear()
|