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

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()