0
0
forked from SwissFEL/c365
Files
c365/panel_diff_2TT.py
Claudio Cirelli 57c5012e45 change permissions
2026-02-20 15:16:38 +01:00

193 lines
6.0 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 pumped(events, i0, *arrays):
fel = events[:, 13]
laser = events[:, 18]
darkShot = events[:, 21]
pumped_shots = np.logical_and.reduce((laser, np.logical_not(darkShot), i0 > i0thres))
return [a[pumped_shots] for a in arrays]
# config
nshots = 100
qlength = 10000
histlength = 1
i0thres = 0.2
# channels
chname_tt1 = "SARES11-SPEC125-M1.edge_position"
chname_tt2 = "SARES11-SPEC125-M1.edge_position2"
chname_i0 = "SAROP11-PBPS122:INTENSITY"
chname_events = "SAR-CVME-TIFALL4:EvtSet"
# create channels
ch_tt1 = BS(chname_tt1)
ch_tt2 = BS(chname_tt2)
ch_int = BS(chname_i0)
ch_i0 = BS(chname_i0)
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.tt1 = np.empty(nshots)
self.tt2 = np.empty(nshots)
self.i0 = np.empty(nshots)
self.tt1hist = deque(maxlen=histlength)
self.tt2hist = deque(maxlen=histlength)
self.tt1s = deque(maxlen=qlength)
self.tt2s = deque(maxlen=qlength)
self.ttdiff = deque(maxlen=qlength)
self.plot_hist_tt1 = plot_hist_tt1 = PlotPanel(self, figsize=(2,3))
self.plot_hist_tt2 = plot_hist_tt2 = PlotPanel(self, figsize=(2,3))
self.plot_corr = plot_corr = PlotPanel(self, figsize=(2,3))
self.plot_diff = plot_diff = PlotPanel(self, figsize=(2,3))
plots1 = (plot_hist_tt1, plot_hist_tt2)
plots2 = (plot_corr,)
plots3 = (plot_diff,)
hb_plot1 = make_filled_hbox(plots1)
hb_plot2 = make_filled_hbox(plots2)
hb_plot3 = make_filled_hbox(plots3)
btn_clearQ = wx.Button(self, label="Clear plots")
btns = (btn_clearQ,)
hb_btns = make_filled_hbox(btns)
widgets = (hb_plot1, hb_plot2, hb_plot3, 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.tt1 = np.empty(nshots)
self.tt2 = np.empty(nshots)
self.int = np.empty(nshots)
for i in range(nshots):
tempa = ch_events.get()
self.evts[i] = tempa
tempb = ch_i0.get()
self.i0[i] = tempb
tempc = ch_tt1.get()
self.tt1[i] = tempc
tempd = ch_tt2.get()
self.tt2[i] = tempd
next(bsstream)
wx.GetApp().Yield()
self.tt1p = np.ravel(pumped(self.evts, self.i0, self.tt1))
self.tt2p = np.ravel(pumped(self.evts, self.i0, self.tt2))
if (len(self.tt1p) > 1):
print ('{} -- {} = {:.2f} a.u.'.format(self.time, chname_i0, np.nanmean(self.i0)))
self.tt1hist.append(self.tt1p)
self.tt2hist.append(self.tt2p)
self.tt1s.append(np.mean(self.tt1p))
self.tt2s.append(np.mean(self.tt2p))
#self.ttdiff.append(np.array(self.tt1s) - np.array(self.tt2s))
self.ttdiff.append(np.nanmean(np.array(self.tt1p) - np.array(self.tt2p)))
else:
print ('{} -- {} = {:.2f} a.u. --> No Xrays'.format(self.time, chname_i0, np.nanmean(self.int)))
self.tt1hist.append(np.nan)
self.tt2hist.append(np.nan)
self.tt1s.append(np.nan)
self.tt2s.append(np.nan)
self.ttdiff.append(np.nan)
self.draw_plot()
def draw_plot(self):
self.plot_hist_tt1.clear()
self.plot_hist_tt2.clear()
self.plot_corr.clear()
self.plot_diff.clear()
self.plot_hist_tt1.set_xlabel('Arr time tt (fs)')
self.plot_hist_tt2.set_xlabel('Arr time tt2 (fs)')
self.plot_corr.set_xlabel('Arr time tt1 (fs)')
self.plot_corr.set_ylabel('Arr time tt2 (fs)')
self.plot_diff.set_xlabel('time ago, a.u.')
self.plot_diff.set_ylabel('Difference (fs)')
if (len(self.tt1p) > 1):
self.plot_hist_tt1.set_title('tt1: {:.2f} fs, jitter: {:.2f}'.format(np.nanmean(self.tt1p), np.nanstd(self.tt1p)))
self.plot_hist_tt2.set_title('tt2: {:.2f} fs, jitter: {:.2f}'.format(np.nanmean(self.tt2p), np.nanstd(self.tt2p)))
self.plot_hist_tt1.hist(np.ravel(self.tt1hist), facecolor='dodgerblue', edgecolor='black')
self.plot_hist_tt2.hist(np.ravel(self.tt2hist), facecolor='green', edgecolor='black')
self.plot_corr.set_title('Corr: {:.4f}'.format(pearsonr(np.ravel(self.tt1p), np.ravel(self.tt2p))[0]))
self.plot_corr.plot(np.ravel(self.tt1p), np.ravel(self.tt2p), '.', color='purple')
self.plot_corr.grid()
#self.plot_diff.plot(np.arange(0, len(self.tt1s)), np.array(self.tt1p) - np.array(self.tt2p), '.', color='orangered')
#self.plot_diff.plot(np.array(self.tt1p) - np.array(self.tt2p), '.', color='orangered')
self.plot_diff.set_title('Diff: {:.2f} fs'.format(self.ttdiff[-1]))
self.plot_diff.plot(np.arange(0, len(self.ttdiff)), np.array(self.ttdiff), '.', color='orangered')
self.plot_hist_tt1.draw()
self.plot_hist_tt2.draw()
self.plot_corr.draw()
self.plot_diff.draw()
def on_click_clearQ(self, _event):
self.tt1s.clear()
self.tt2s.clear()
self.ttdiff.clear()