From 6dbdc9795730742ecbdc0b7b7cd2ec6f753fa63a Mon Sep 17 00:00:00 2001 From: Anders Sandstrom Date: Tue, 13 Oct 2020 09:36:01 +0200 Subject: [PATCH] Move tools to ecmccomgui. Update readmes --- README.md | 2 + tools/README.md | 8 + tools/ecmcArrayGui.py | 131 ---------- tools/ecmcFFTGui.py | 157 ------------ tools/ecmcFFTMainGui.py | 528 ---------------------------------------- tools/testdata.npz | Bin 100972 -> 0 bytes 6 files changed, 10 insertions(+), 816 deletions(-) create mode 100644 tools/README.md delete mode 100644 tools/ecmcArrayGui.py delete mode 100644 tools/ecmcFFTGui.py delete mode 100644 tools/ecmcFFTMainGui.py delete mode 100644 tools/testdata.npz diff --git a/README.md b/README.md index e411cc4..f6a6221 100644 --- a/README.md +++ b/README.md @@ -273,6 +273,8 @@ static.sineval:=sin(2*pi*${FREQ=5}*static.time); ### FFT GUI (FFT and rawdata plots + controls) A simple tool, [ecmcFFTMainGui.py](tools/ecmcFFTMainGui.py), to visualize the calculated spectrum, rawdata and also plugin controls can be found in the tools directory. The GUI connects to the plugin records over pypics framwork. +The gui are included in the ecmccomgui repo: +https://github.com/anderssandstrom/ecmccomgui Example: ecmcFFTMainGui.py help printout ``` diff --git a/tools/README.md b/tools/README.md new file mode 100644 index 0000000..9d714a3 --- /dev/null +++ b/tools/README.md @@ -0,0 +1,8 @@ +# FFT tools + +## GUI + +A python gui for vizualization and control of the FFT plugin can be found in the ecmccomgui repo: +https://github.com/anderssandstrom/ecmccomgui + +![ecmcFFTMainGui.py](docs/gui/ecmcFFTMainGui.png) diff --git a/tools/ecmcArrayGui.py b/tools/ecmcArrayGui.py deleted file mode 100644 index d4afa57..0000000 --- a/tools/ecmcArrayGui.py +++ /dev/null @@ -1,131 +0,0 @@ -#************************************************************************* -# Copyright (c) 2020 European Spallation Source ERIC -# ecmc is distributed subject to a Software License Agreement found -# in file LICENSE that is included with this distribution. -# -# ecmcArrayGui.py -# -# Created on: October 8, 2020 -# Author: Anders Sandström -# -# Plots two waveforms (y vs time) updates for each callback on the y-pv -# -#************************************************************************* - -import sys -import epics -from PyQt5.QtWidgets import * -from PyQt5 import QtWidgets -from PyQt5.QtCore import * -from PyQt5.QtGui import * -import numpy as np -import matplotlib -matplotlib.use("Qt5Agg") -from matplotlib.figure import Figure -from matplotlib.animation import TimedAnimation -from matplotlib.lines import Line2D -from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas -from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar -import matplotlib.pyplot as plt -import threading - -class comSignal(QObject): - data_signal = pyqtSignal(object) - -class ecmcArrayGui(QtWidgets.QDialog): - def __init__(self,yname=None): - super(ecmcArrayGui, self).__init__() - self.comSignalY = comSignal() - self.comSignalY.data_signal.connect(self.callbackFuncY) - self.pause = 0 - self.spectY = None - self.figure = plt.figure() - self.plotted_line = None - self.ax = None - self.canvas = FigureCanvas(self.figure) - self.toolbar = NavigationToolbar(self.canvas, self) - self.pauseBtn = QPushButton(text = 'pause') - self.pauseBtn.setFixedSize(100, 50) - self.pauseBtn.clicked.connect(self.pauseBtnAction) - self.pauseBtn.setStyleSheet("background-color: green") - self.pvNameY = yname # "IOC_TEST:Plugin-FFT0-Raw-Data-Act" - self.connectPvs() # Epics - self.setGeometry(300, 300, 900, 700) - self.setWindowTitle("ecmc Array plot: " + self.pvNameY) - layout = QVBoxLayout() - layout.addWidget(self.toolbar) - layout.addWidget(self.canvas) - layout.addWidget(self.pauseBtn) - self.setLayout(layout) - return - - def connectPvs(self): - if self.pvNameY is None: - raise RuntimeError("pvname y must not be 'None'") - if len(self.pvNameY)==0: - raise RuntimeError("pvname y must not be ''") - - self.pvY = epics.PV(self.pvNameY) - #print('self.pvY: ' + self.pvY.info) - - self.pvY.add_callback(self.onChangePvY) - QCoreApplication.processEvents() - - def onChangePvY(self,pvname=None, value=None, char_value=None,timestamp=None, **kw): - self.comSignalY.data_signal.emit(value) - - def pauseBtnAction(self): - self.pause = not self.pause - if self.pause: - self.pauseBtn.setStyleSheet("background-color: red"); - else: - self.pauseBtn.setStyleSheet("background-color: green"); - self.comSignalY.data_signal.emit(self.spectY) - return - - def callbackFuncY(self, value): - if(np.size(value)) > 0: - self.spectY = value - self.plotSpect() - return - - def plotSpect(self): - if self.pause: - return - - if self.spectY is None: - return - - # create an axis - if self.ax is None: - self.ax = self.figure.add_subplot(111) - - # plot data - if self.plotted_line is not None: - self.plotted_line.remove() - - self.plotted_line, = self.ax.plot(self.spectY, 'b*-') - self.ax.grid(True) - - plt.xlabel('Time []') - plt.ylabel(self.pvNameY +' [' + self.pvY.units + ']') - # refresh canvas - self.canvas.draw() - - self.ax.autoscale(enable=True) - -def printOutHelp(): - print("ecmcArrayGui: Plots waveforms data (updates on data callback). ") - print("python ecmcArrayGui.py ") - print("example: python ecmcArrayGui.py IOC_TEST:Plugin-FFT0-Raw-Data-Act") - -if __name__ == "__main__": - import sys - if len(sys.argv)!=2: - printOutHelp() - sys.exit() - yname=sys.argv[1] - app = QtWidgets.QApplication(sys.argv) - window=ecmcArrayGui(yname=yname) - window.show() - sys.exit(app.exec_()) diff --git a/tools/ecmcFFTGui.py b/tools/ecmcFFTGui.py deleted file mode 100644 index 195e4ef..0000000 --- a/tools/ecmcFFTGui.py +++ /dev/null @@ -1,157 +0,0 @@ -#************************************************************************* -# Copyright (c) 2020 European Spallation Source ERIC -# ecmc is distributed subject to a Software License Agreement found -# in file LICENSE that is included with this distribution. -# -# ecmcFFTGui.py -# -# Created on: October 6, 2020 -# Author: Anders Sandström -# -# Plots two waveforms (x vs y) updates for each callback on the y-pv -# -#************************************************************************* - -import sys -import epics -from PyQt5.QtWidgets import * -from PyQt5 import QtWidgets -from PyQt5.QtCore import * -from PyQt5.QtGui import * -import numpy as np -import matplotlib -matplotlib.use("Qt5Agg") -from matplotlib.figure import Figure -from matplotlib.animation import TimedAnimation -from matplotlib.lines import Line2D -from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas -from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar -import matplotlib.pyplot as plt -import threading - -class comSignal(QObject): - data_signal = pyqtSignal(object) - -class ecmcFFTGui(QtWidgets.QDialog): - def __init__(self,xname=None,yname=None): - super(ecmcFFTGui, self).__init__() - self.comSignalX = comSignal() - self.comSignalX.data_signal.connect(self.callbackFuncX) - self.comSignalY = comSignal() - self.comSignalY.data_signal.connect(self.callbackFuncY) - self.pause = 0 - self.spectX = None - self.spectY = None - self.figure = plt.figure() - self.plotted_line = None - self.ax = None - self.canvas = FigureCanvas(self.figure) - self.toolbar = NavigationToolbar(self.canvas, self) - self.pauseBtn = QPushButton(text = 'pause') - self.pauseBtn.setFixedSize(100, 50) - self.pauseBtn.clicked.connect(self.pauseBtnAction) - self.pauseBtn.setStyleSheet("background-color: green"); - self.pvNameY = yname # "IOC_TEST:Plugin-FFT1-Spectrum-Amp-Act" - self.pvNameX = xname # "IOC_TEST:Plugin-FFT1-Spectrum-X-Axis-Act" - self.connectPvs() # Epics - self.setGeometry(300, 300, 900, 700) - self.setWindowTitle("ecmc FFT plot: " + self.pvNameY + ' vs ' + self.pvNameX) - layout = QVBoxLayout() - layout.addWidget(self.toolbar) - layout.addWidget(self.canvas) - layout.addWidget(self.pauseBtn) - self.setLayout(layout) - return - - def connectPvs(self): - - if self.pvNameX is None: - raise RuntimeError("pvname X must not be 'None'") - if len(self.pvNameX)==0: - raise RuntimeError("pvname X must not be ''") - - if self.pvNameY is None: - raise RuntimeError("pvname y must not be 'None'") - if len(self.pvNameY)==0: - raise RuntimeError("pvname y must not be ''") - - self.pvX = epics.PV(self.pvNameX) - #print('self.pvX: ' + self.pvX.info) - - self.pvY = epics.PV(self.pvNameY) - #print('self.pvY: ' + self.pvY.info) - - self.pvX.add_callback(self.onChangePvX) - self.pvY.add_callback(self.onChangePvY) - QCoreApplication.processEvents() - - def onChangePvX(self,pvname=None, value=None, char_value=None,timestamp=None, **kw): - self.comSignalX.data_signal.emit(value) - - def onChangePvY(self,pvname=None, value=None, char_value=None,timestamp=None, **kw): - self.comSignalY.data_signal.emit(value) - - def pauseBtnAction(self): - self.pause = not self.pause - if self.pause: - self.pauseBtn.setStyleSheet("background-color: red"); - else: - self.pauseBtn.setStyleSheet("background-color: green"); - self.comSignalY.data_signal.emit(self.spectY) - return - - - def callbackFuncX(self, value): - if(np.size(value)) > 0: - self.spectX = value - self.xDataValid = 1 - return - - def callbackFuncY(self, value): - if(np.size(value)) > 0: - self.spectY = value - self.plotSpect() - return - - def plotSpect(self): - if self.pause: - return - if self.spectX is None: - return - if self.spectY is None: - return - - # create an axis - if self.ax is None: - self.ax = self.figure.add_subplot(111) - - # plot data - if self.plotted_line is not None: - self.plotted_line.remove() - - self.plotted_line, = self.ax.plot(self.spectX,self.spectY, 'b*-') - self.ax.grid(True) - - plt.xlabel(self.pvNameX +' [' + self.pvX.units + ']') - plt.ylabel(self.pvNameY +' [' + self.pvY.units + ']') - # refresh canvas - self.canvas.draw() - - self.ax.autoscale(enable=False) - -def printOutHelp(): - print("ecmcFFTGui: Plots waveforms of FFT data (updates on Y data callback). ") - print("python ecmcFFTGui.py ") - print("example: python ecmcFFTGui.py IOC_TEST:Plugin-FFT1-Spectrum-X-Axis-Act IOC_TEST:Plugin-FFT1-Spectrum-Amp-Act") - -if __name__ == "__main__": - import sys - if len(sys.argv)!=3: - printOutHelp() - sys.exit() - xname=sys.argv[1] - yname=sys.argv[2] - app = QtWidgets.QApplication(sys.argv) - window=ecmcFFTGui(xname=xname,yname=yname) - window.show() - sys.exit(app.exec_()) diff --git a/tools/ecmcFFTMainGui.py b/tools/ecmcFFTMainGui.py deleted file mode 100644 index ac991a3..0000000 --- a/tools/ecmcFFTMainGui.py +++ /dev/null @@ -1,528 +0,0 @@ -#************************************************************************* -# Copyright (c) 2020 European Spallation Source ERIC -# ecmc is distributed subject to a Software License Agreement found -# in file LICENSE that is included with this distribution. -# -# ecmcFFTMainGui.py -# -# Created on: October 6, 2020 -# Author: Anders Sandström -# -# Plots two waveforms (x vs y) updates for each callback on the y-pv -# -#************************************************************************* - -import sys -import epics -from PyQt5.QtWidgets import * -from PyQt5 import QtWidgets -from PyQt5.QtCore import * -from PyQt5.QtGui import * -import numpy as np -import matplotlib -matplotlib.use("Qt5Agg") -from matplotlib.figure import Figure -from matplotlib.animation import TimedAnimation -from matplotlib.lines import Line2D -from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas -from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar -import matplotlib.pyplot as plt -import threading - -# FFT object pvs Plugin-FFT- -# IOC_TEST:Plugin-FFT0-stat -# IOC_TEST:Plugin-FFT0-NFFT x -# IOC_TEST:Plugin-FFT0-Mode-RB x -# IOC_TEST:Plugin-FFT0-SampleRate-Act x -# IOC_TEST:Plugin-FFT0-Enable x -# IOC_TEST:Plugin-FFT0-Trigg x -# IOC_TEST:Plugin-FFT0-Source x -# IOC_TEST:Plugin-FFT0-Raw-Data-Act x -# IOC_TEST:Plugin-FFT0-PreProc-Data-Act -# IOC_TEST:Plugin-FFT0-Spectrum-Amp-Act x -# IOC_TEST:Plugin-FFT0-Spectrum-X-Axis-Act x - - -class comSignal(QObject): - data_signal = pyqtSignal(object) - -class ecmcFFTMainGui(QtWidgets.QDialog): - def __init__(self,prefix=None,fftPluginId=None): - super(ecmcFFTMainGui, self).__init__() - self.offline = False - self.pvPrefixStr = prefix - self.pvPrefixOrigStr = prefix # save for restore after open datafile - self.fftPluginId = fftPluginId - self.fftPluginOrigId = fftPluginId - self.allowSave = False - if prefix is None or fftPluginId is None: - self.offline = True - self.pause = True - self.enable = False - else: - self.buildPvNames() - self.offline = False - self.pause = False - - # Callbacks through signals - self.comSignalSpectX = comSignal() - self.comSignalSpectX.data_signal.connect(self.callbackFuncSpectX) - self.comSignalSpectY = comSignal() - self.comSignalSpectY.data_signal.connect(self.callbackFuncSpectY) - self.comSignalRawData = comSignal() - self.comSignalRawData.data_signal.connect(self.callbackFuncrawData) - self.comSignalEnable = comSignal() - self.comSignalEnable.data_signal.connect(self.callbackFuncEnable) - self.comSignalMode = comSignal() - self.comSignalMode.data_signal.connect(self.callbackFuncMode) - - self.pause = 0 - - # Data - self.spectX = None - self.spectY = None - self.rawdataY = None - self.rawdataX = None - self.enable = None - - self.pvMode = None - - self.createWidgets() - self.connectPvs() - self.setStatusOfWidgets() - - return - - def createWidgets(self): - - self.figure = plt.figure() - self.plottedLineSpect = None - self.plottedLineRaw = None - self.axSpect = None - self.axRaw = None - self.canvas = FigureCanvas(self.figure) - self.toolbar = NavigationToolbar(self.canvas, self) - self.pauseBtn = QPushButton(text = 'pause') - self.pauseBtn.setFixedSize(100, 50) - self.pauseBtn.clicked.connect(self.pauseBtnAction) - self.pauseBtn.setStyleSheet("background-color: green") - self.openBtn = QPushButton(text = 'open data') - self.openBtn.setFixedSize(100, 50) - self.openBtn.clicked.connect(self.openBtnAction) - self.saveBtn = QPushButton(text = 'save data') - self.saveBtn.setFixedSize(100, 50) - self.saveBtn.clicked.connect(self.saveBtnAction) - self.enableBtn = QPushButton(text = 'enable FFT') - self.enableBtn.setFixedSize(100, 50) - self.enableBtn.clicked.connect(self.enableBtnAction) - self.triggBtn = QPushButton(text = 'trigg FFT') - self.triggBtn.setFixedSize(100, 50) - self.triggBtn.clicked.connect(self.triggBtnAction) - self.modeCombo = QComboBox() - self.modeCombo.setFixedSize(100, 50) - self.modeCombo.currentIndexChanged.connect(self.newModeIndexChanged) - self.modeCombo.addItem("CONT") - self.modeCombo.addItem("TRIGG") - - # Fix layout - self.setGeometry(300, 300, 900, 700) - - layoutVert = QVBoxLayout() - layoutVert.addWidget(self.toolbar) - layoutVert.addWidget(self.canvas) - - layoutControl = QHBoxLayout() - layoutControl.addWidget(self.pauseBtn) - layoutControl.addWidget(self.enableBtn) - layoutControl.addWidget(self.triggBtn) - layoutControl.addWidget(self.modeCombo) - layoutControl.addWidget(self.saveBtn) - layoutControl.addWidget(self.openBtn) - - frameControl = QFrame(self) - frameControl.setFixedHeight(70) - frameControl.setLayout(layoutControl) - - - layoutVert.addWidget(frameControl) - self.setLayout(layoutVert) - - def setStatusOfWidgets(self): - self.saveBtn.setEnabled(self.allowSave) - if self.offline: - self.enableBtn.setStyleSheet("background-color: grey") - self.enableBtn.setEnabled(False) - self.pauseBtn.setStyleSheet("background-color: grey") - self.pauseBtn.setEnabled(False) - self.modeCombo.setEnabled(False) - self.triggBtn.setEnabled(False) - self.setWindowTitle("ecmc FFT Main plot: Offline") - else: - self.modeCombo.setEnabled(True) - # Check actual value of pvs - if(self.pvEnable.get()>0): - self.enableBtn.setStyleSheet("background-color: green") - self.enable = True - else: - self.enableBtn.setStyleSheet("background-color: red") - self.enable = False - - self.sourceStr = self.pvSource.get(as_string=True) - self.sampleRate = self.pvSampleRate.get() - self.NFFT = self.pvNFFT.get() - self.mode = self.pvMode.get() - self.modeStr = "NO_MODE" - self.triggBtn.setEnabled(False) # Only enable if mode = TRIGG = 2 - if self.mode == 1: - self.modeStr = "CONT" - self.modeCombo.setCurrentIndex(self.mode-1) # Index starta t zero - - if self.mode == 2: - self.modeStr = "TRIGG" - self.triggBtn.setEnabled(True) - self.modeCombo.setCurrentIndex(self.mode-1) # Index starta t zero - - self.setWindowTitle("ecmc FFT Main plot: prefix=" + self.pvPrefixStr + " , fftId=" + str(self.fftPluginId) + - ", source=" + self.sourceStr + ", rate=" + str(self.sampleRate) + - ", nfft=" + str(self.NFFT)) - - def buildPvNames(self): - # Pv names based on structure: Plugin-FFT- - self.pvNameSpectY = self.buildPvName('Spectrum-Amp-Act') # "IOC_TEST:Plugin-FFT1-Spectrum-Amp-Act" - self.pvNameSpectX = self.buildPvName('Spectrum-X-Axis-Act') # "IOC_TEST:Plugin-FFT1-Spectrum-X-Axis-Act" - self.pvNameRawDataY = self.buildPvName('Raw-Data-Act') # IOC_TEST:Plugin-FFT0-Raw-Data-Act - self.pvnNameEnable = self.buildPvName('Enable') # IOC_TEST:Plugin-FFT0-Enable - self.pvnNameTrigg = self.buildPvName('Trigg') # IOC_TEST:Plugin-FFT0-Trigg - self.pvnNameSource = self.buildPvName('Source') # IOC_TEST:Plugin-FFT0-Source - self.pvnNameSampleRate = self.buildPvName('SampleRate-Act') # IOC_TEST:Plugin-FFT0-SampleRate-Act - self.pvnNameNFFT = self.buildPvName('NFFT') # IOC_TEST:Plugin-FFT0-NFFT - self.pvnNameMode = self.buildPvName('Mode-RB') # IOC_TEST:Plugin-FFT0-Mode-RB - - def buildPvName(self, suffixname): - return self.pvPrefixStr + 'Plugin-FFT' + str(self.fftPluginId) + '-' + suffixname - - def connectPvs(self): - if self.offline: - return - - if self.pvNameSpectX is None: - raise RuntimeError("pvname X spect must not be 'None'") - if len(self.pvNameSpectX)==0: - raise RuntimeError("pvname X spect must not be ''") - - if self.pvNameSpectY is None: - raise RuntimeError("pvname y spect must not be 'None'") - if len(self.pvNameSpectY)==0: - raise RuntimeError("pvname y spect must not be ''") - - if self.pvNameRawDataY is None: - raise RuntimeError("pvname raw data must not be 'None'") - if len(self.pvNameRawDataY)==0: - raise RuntimeError("pvname raw data must not be ''") - - if self.pvnNameEnable is None: - raise RuntimeError("pvname enable must not be 'None'") - if len(self.pvnNameEnable)==0: - raise RuntimeError("pvname enable must not be ''") - - if self.pvnNameTrigg is None: - raise RuntimeError("pvname trigg must not be 'None'") - if len(self.pvnNameTrigg)==0: - raise RuntimeError("pvname trigg must not be ''") - - if self.pvnNameSource is None: - raise RuntimeError("pvname source must not be 'None'") - if len(self.pvnNameSource)==0: - raise RuntimeError("pvname source must not be ''") - - if self.pvnNameSampleRate is None: - raise RuntimeError("pvname sample rate must not be 'None'") - if len(self.pvnNameSampleRate)==0: - raise RuntimeError("pvname sample rate must not be ''") - - if self.pvnNameNFFT is None: - raise RuntimeError("pvname NFFT must not be 'None'") - if len(self.pvnNameNFFT)==0: - raise RuntimeError("pvname NFFT must not be ''") - - if self.pvnNameMode is None: - raise RuntimeError("pvname mode must not be 'None'") - if len(self.pvnNameMode)==0: - raise RuntimeError("pvname mode must not be ''") - - self.pvSpectX = epics.PV(self.pvNameSpectX) - self.pvSpectY = epics.PV(self.pvNameSpectY) - self.pvRawData = epics.PV(self.pvNameRawDataY) - self.pvEnable = epics.PV(self.pvnNameEnable) - self.pvTrigg = epics.PV(self.pvnNameTrigg) - self.pvSource = epics.PV(self.pvnNameSource) - self.pvSampleRate = epics.PV(self.pvnNameSampleRate) - self.pvNFFT = epics.PV(self.pvnNameNFFT) - self.pvMode = epics.PV(self.pvnNameMode) - self.pvSpectX.add_callback(self.onChangePvSpectX) - self.pvSpectY.add_callback(self.onChangePvSpectY) - self.pvRawData.add_callback(self.onChangePvrawData) - self.pvEnable.add_callback(self.onChangePvEnable) - self.pvMode.add_callback(self.onChangePvMode) - QCoreApplication.processEvents() - - ###### Pv monitor callbacks - def onChangePvMode(self,pvname=None, value=None, char_value=None,timestamp=None, **kw): - if self.pause: - return - self.comSignalMode.data_signal.emit(value) - - def onChangePvEnable(self,pvname=None, value=None, char_value=None,timestamp=None, **kw): - if self.pause: - return - self.comSignalEnable.data_signal.emit(value) - - def onChangePvSpectX(self,pvname=None, value=None, char_value=None,timestamp=None, **kw): - if self.pause: - return - self.comSignalSpectX.data_signal.emit(value) - - def onChangePvSpectY(self,pvname=None, value=None, char_value=None,timestamp=None, **kw): - if self.pause: - return - self.comSignalSpectY.data_signal.emit(value) - - def onChangePvrawData(self,pvname=None, value=None, char_value=None,timestamp=None, **kw): - if self.pause: - return - self.comSignalRawData.data_signal.emit(value) - - ###### Signal callbacks - def callbackFuncMode(self, value): - if value < 1 or value> 2: - self.modeStr = "NO_MODE" - print('callbackFuncMode: Error Invalid mode.') - return - - self.mode = value - self.modeCombo.setCurrentIndex(self.mode-1) # Index starta t zero - - if self.mode == 1: - self.modeStr = "CONT" - self.triggBtn.setEnabled(False) # Only enable if mode = TRIGG = 2 - - if self.mode == 2: - self.modeStr = "TRIGG" - self.triggBtn.setEnabled(True) - - return - - def callbackFuncEnable(self, value): - self.enable = value - if self.enable: - self.enableBtn.setStyleSheet("background-color: green") - else: - self.enableBtn.setStyleSheet("background-color: red") - return - - def callbackFuncSpectX(self, value): - if(np.size(value)) > 0: - self.spectX = value - self.xDataValid = 1 - return - - def callbackFuncSpectY(self, value): - if(np.size(value)) > 0: - self.spectY = value - self.plotSpect() - return - - def callbackFuncrawData(self, value): - if(np.size(value)) > 0: - if self.rawdataX is None or np.size(value) != np.size(self.rawdataY): - self.rawdataX = np.arange(-np.size(value)/self.sampleRate, 0, 1/self.sampleRate) - - self.rawdataY = value - self.plotRaw() - return - - ###### Widget callbacks - def pauseBtnAction(self): - self.pause = not self.pause - if self.pause: - self.pauseBtn.setStyleSheet("background-color: red") - else: - self.pvPrefixStr = self.pvPrefixOrigStr # Restore if dataset was opened - self.fftPluginId = self.fftPluginOrigId # Restore if dataset was opened - self.buildPvNames() - - self.pauseBtn.setStyleSheet("background-color: green") - # Retrigger plots with newest values - self.comSignalSpectY.data_signal.emit(self.spectY) - self.comSignalRawData.data_signal.emit(self.rawdataY) - return - - def enableBtnAction(self): - self.enable = not self.enable - self.pvEnable.put(self.enable) - if self.enable: - self.enableBtn.setStyleSheet("background-color: green") - else: - self.enableBtn.setStyleSheet("background-color: red") - return - - def triggBtnAction(self): - self.pvTrigg.put(True) - return - - def newModeIndexChanged(self,index): - if index==0 or index==1: - if not self.offline and self.pvMode is not None: - self.pvMode.put(index+1) - return - - def openBtnAction(self): - if not self.offline: - self.pause = 1 # pause while open if online - self.pauseBtn.setStyleSheet("background-color: red") - QCoreApplication.processEvents() - - fname = QFileDialog.getOpenFileName(self, 'Open file', '.', "Data files (*.npz)") - if fname is None: - return - if np.size(fname) != 2: - return - if len(fname[0])<=0: - return - - npzfile = np.load(fname[0]) - - # verify scope plugin - if npzfile['plugin'] != "FFT": - print ("Invalid data type (wrong plugin type)") - return - - # File valid - self.rawdataX = npzfile['rawdataX'] - self.rawdataY = npzfile['rawdataY'] - self.spectX = npzfile['spectX'] - self.spectY = npzfile['spectY'] - self.sourceStr = str(npzfile['sourceStr']) - self.sampleRate = npzfile['sampleRate'] - self.NFFT = npzfile['NFFT'] - self.mode = npzfile['mode'] - self.pvPrefixStr = str(npzfile['pvPrefixStr']) - self.fftPluginId = npzfile['fftPluginId'] - - self.buildPvNames() - - # trigg draw - self.comSignalMode.data_signal.emit(self.mode) - self.comSignalSpectX.data_signal.emit(self.spectX) - self.comSignalSpectY.data_signal.emit(self.spectY) - self.comSignalRawData.data_signal.emit(self.rawdataY) - - self.setStatusOfWidgets() - return - - def saveBtnAction(self): - fname = QFileDialog.getSaveFileName(self, 'Save file', '.', "Data files (*.npz)") - if fname is None: - return - if np.size(fname) != 2: - return - if len(fname[0])<=0: - return - # Save all relevant data - np.savez(fname[0], - plugin = "FFT", - rawdataX = self.rawdataX, - rawdataY = self.rawdataY, - spectX = self.spectX, - spectY = self.spectY, - sourceStr = self.sourceStr, - sampleRate = self.sampleRate, - NFFT = self.NFFT, - mode = self.mode, - pvPrefixStr = self.pvPrefixStr, - fftPluginId = self.fftPluginId - ) - - - return - - ###### Plotting - def plotSpect(self): - if self.spectX is None: - return - if self.spectY is None: - return - - # create an axis for spectrum - if self.axSpect is None: - self.axSpect = self.figure.add_subplot(212) - - # plot data - if self.plottedLineSpect is not None: - self.plottedLineSpect.remove() - - self.plottedLineSpect, = self.axSpect.plot(self.spectX,self.spectY, 'b*-') - self.axSpect.grid(True) - - if self.offline: # No units offline - self.axSpect.set_xlabel(self.pvNameSpectX) - self.axSpect.set_ylabel(self.pvNameSpectY) - else: - self.axSpect.set_xlabel(self.pvNameSpectX +' [' + self.pvSpectX.units + ']') - self.axSpect.set_ylabel(self.pvNameSpectY +' [' + self.pvSpectY.units + ']') - - # refresh canvas - self.canvas.draw() - self.axSpect.autoscale(enable=False) - - def plotRaw(self): - if self.rawdataY is None: - return - - # create an axis for spectrum - if self.axRaw is None: - self.axRaw = self.figure.add_subplot(211) - - # plot data - if self.plottedLineRaw is not None: - self.plottedLineRaw.remove() - - self.plottedLineRaw, = self.axRaw.plot(self.rawdataX,self.rawdataY, 'b*-') - self.axRaw.grid(True) - - self.axRaw.set_xlabel('Time [s]') - if self.offline: # No units offline - self.axRaw.set_ylabel(self.pvNameRawDataY) - else: - self.axRaw.set_ylabel(self.pvNameRawDataY +' [' + self.pvRawData.units + ']') - - # refresh canvas - self.canvas.draw() - self.allowSave = True - self.axRaw.autoscale(enable=True) - -def printOutHelp(): - print("ecmcFFTMainGui: Plots waveforms of FFT data (updates on Y data callback). ") - print("python ecmcFFTMainGui.py ") - print(": Ioc prefix ('IOC_TEST:')") - print(" : Id of fft plugin ('0')") - print("example : python ecmcFFTMainGui.py 'IOC_TEST:' '0'") - print("Will connect to Pvs: Plugin-FFT-*") - -if __name__ == "__main__": - import sys - prefix = None - fftid = None - if len(sys.argv) == 1: - prefix = None - fftid = None - elif len(sys.argv) == 3: - prefix = sys.argv[1] - fftid = int(sys.argv[2]) - else: - printOutHelp() - sys.exit() - app = QtWidgets.QApplication(sys.argv) - window=ecmcFFTMainGui(prefix=prefix,fftPluginId=fftid) - window.show() - sys.exit(app.exec_()) diff --git a/tools/testdata.npz b/tools/testdata.npz deleted file mode 100644 index 3ae997e44e5122774bc6bc8175410c7696d52ea2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 100972 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