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

140 lines
4.4 KiB
Python
Executable File

from collections import deque
import random
import wx
import numpy as np
import epics
from datetime import datetime
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
# config
nshots = 1000
x_axis=np.arange(0,100,0.05)
quantile = 0.9
# channels
ch_xpos = 'SAROP11-PBPS122:XPOS'
ch_ypos = 'SAROP11-PBPS122:YPOS'
ch_intensity = 'SAROP11-PBPS122:INTENSITY'
bs_xpos = BS(ch_xpos)
bs_ypos = BS(ch_ypos)
bs_intensity = BS(ch_intensity)
iso_format = "%Y-%m-%d %H:%M:%S"
def filter_outliers(quantile, a):
low = np.nanquantile(a, 0.5 - quantile/2)
high = np.nanquantile(a, 0.5 + quantile/2)
cond_low = a > low
cond_high = a < high
cond = cond_low & cond_high
return a[cond]
class MainPanel(wx.Panel):
def __init__(self, parent):
super().__init__(parent)
self.x = np.empty(nshots)
self.y = np.empty(nshots)
self.powerx50Hztimeseries = deque(maxlen=1000)
self.powerxlowfreqtimeseries = deque(maxlen=1000)
self.powerxtrainfrequencies = deque(maxlen=1000)
self.powerx33hz = deque(maxlen=1000)
self.plot_xy = plot_xy = PlotPanel(self, figsize=(6,2))
self.plot_fft = plot_fft = PlotPanel(self, figsize=(6,2))
self.plot_timeseries = plot_timeseries = PlotPanel(self, figsize=(6,2))
plots1 = (plot_xy, plot_fft, plot_timeseries)
vb_plots1 = make_filled_vbox(plots1)
widgets = (vb_plots1,)
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.x = np.empty(nshots)
self.y = np.empty(nshots)
for i in range(nshots):
tempa = bs_xpos.get()
self.x[i] = tempa
tempb = bs_ypos.get()
self.y[i] = tempb
next(bsstream)
wx.GetApp().Yield()
self.x = filter_outliers(quantile, self.x)
self.y = filter_outliers(quantile, self.y)
if (len(np.asarray(self.x)) > 1):
self.valsdiode = np.hstack((self.x-np.mean(self.x), np.zeros_like(self.x)))
self.vals2diode = np.hstack((self.y - np.mean(self.y), np.zeros_like(self.y)))
self.powerx = np.abs(np.fft.fft(self.valsdiode))**2
self.powery = np.abs(np.fft.fft(self.vals2diode))**2
self.powerxlowfreqtimeseries.append(np.sum(self.powerx[0:200]))
self.powerx50Hztimeseries.append(np.sum(self.powerx[900:1100]))
self.powerxtrainfrequencies.append(np.sum(self.powerx[250:400]))
else:
print("{} Where are my X-rays?".format(self.time))
self.draw_plot()
def draw_plot(self):
self.plot_xy.clear()
self.plot_fft.clear()
self.plot_timeseries.clear()
self.plot_xy.set_xlabel('shots at 100 Hz')
self.plot_xy.set_ylabel('position in mm')
self.plot_xy.set_xlim(0,min(len(self.x),len(self.y)))
self.plot_xy.grid(True, linestyle='--')
self.plot_xy.plot(self.valsdiode + 0.05)
self.plot_xy.plot(self.vals2diode - 0.05)
self.plot_fft.set_xlabel('frequency, Hz')
self.plot_fft.set_ylabel('power, a.u.')
self.plot_fft.set_xlim(0,55)
self.plot_fft.grid(True, linestyle='--')
self.plot_fft.axhline(y=-5, xmin=0, xmax=0.175, color='r')
self.plot_fft.axhline(y=-5, xmin=0.8, xmax=1, color='k')
self.plot_fft.axhline(y=-5, xmin=0.25, xmax=0.35, color='g')
x_axis1=np.linspace(0,100,len(self.powerx))
x_axis2=np.linspace(0,100,len(self.powery))
self.plot_fft.plot(x_axis1, self.powerx)
self.plot_fft.plot(x_axis2, self.powery)
self.plot_timeseries.set_xlabel('time ago, a.u.')
self.plot_timeseries.set_ylabel('power, a.u.')
self.plot_timeseries.set_ylim(0, 2000)
self.plot_timeseries.grid(True, linestyle='--')
self.plot_timeseries.plot(self.powerxlowfreqtimeseries, color='r')
self.plot_timeseries.plot(self.powerx50Hztimeseries, color='k')
self.plot_timeseries.plot(self.powerxtrainfrequencies, color='g')
self.plot_xy.draw()
self.plot_fft.draw()
self.plot_timeseries.draw()