diff --git a/.gitignore b/.gitignore index c53e277..cb7d96b 100644 --- a/.gitignore +++ b/.gitignore @@ -139,3 +139,4 @@ cython_debug/ # Local stuff to exclude .vscode/ +mainwin.py \ No newline at end of file diff --git a/app.py b/app.py index f470645..0394d58 100644 --- a/app.py +++ b/app.py @@ -1,14 +1,112 @@ import sys -from PyQt5 import QtGui, QtWidgets, uic +import crds_calc +from pandas import read_csv +from PyQt5 import QtGui, QtWidgets, QtCore from memdb import mem +from mainwin import Ui_MainWindow +from widgets import BaseGraph +import pathlib + +class AppWindow(QtWidgets.QMainWindow, Ui_MainWindow): + + csv_selected = QtCore.pyqtSignal() + correlation_complete = QtCore.pyqtSignal() + fitting_complete = QtCore.pyqtSignal() -class AppWindow(QtWidgets.QMainWindow): def __init__(self): super(AppWindow, self).__init__() - uic.loadUi('app.ui', self) + self.setupUi(self) + + # Signals + + # Graphing actions + + self.csv_selected.connect(self.raw_data_graph.plot) + def corr_act(): + self.groups_graph.plot() + self.graph_tabs.setCurrentIndex(1) + self.correlation_complete.connect(corr_act) + + # Helpers + + def display_warning(message: str): + msg = QtWidgets.QMessageBox() + msg.setIcon(QtWidgets.QMessageBox.Warning) + msg.setText("Warning") + msg.setInformativeText(message) + msg.setWindowTitle("Warning") + msg.exec_() + + def display_error(message: str): + msg = QtWidgets.QMessageBox() + msg.setIcon(QtWidgets.QMessageBox.Critical) + msg.setText("Error") + msg.setInformativeText(message) + msg.setWindowTitle("Error") + msg.exec_() + + def select_csv(): + filename, _ = QtWidgets.QFileDialog.getOpenFileName(self) + data = None + try: + data = read_csv(filename, comment="%", delimiter=";").to_numpy() + except: + return + mem['x_data'] = data.transpose()[0] + mem['y_data'] = data.transpose()[1] + try: + mem['v_data'] = data.transpose()[2] + except IndexError: + display_warning('No voltage column detected. VThreshold algo will not work.') + self.csv_selected.emit() + + + # Universal Actions stuff + + self.actionOpen_CSV_File.triggered.connect(select_csv) + self.actionGithub_Repository.triggered.connect(lambda: QtGui.QDesktopServices.openUrl(QtCore.QUrl('https://github.com/turtlebasket/crds_analyze'))) + + # Inputs + + def init_correlate(): + groups_raw = None + algo = self.combo_grouping_algo.currentIndex() + try: + if algo == 0: + display_error('VThreshold not yet implemented.') + return + elif algo == 1: + groups_raw = crds_calc.spaced_groups( + mem['x_data'], + mem['y_data'], + self.spin_group_len.value(), + self.spin_min_peakheight.value(), + self.spin_min_peakprominence.value(), + self.spin_moving_average_denom.value() + ) + + mem['groups_correlated'] = crds_calc.correlate_groups(groups_raw) + self.correlation_complete.emit() + + except KeyError: + display_error('Failed to correlate. Did you import a data file & set parameters?') + self.correlate_button.pressed.connect(init_correlate) + + # Show equation + + pix = QtGui.QPixmap(f"{pathlib.Path(__file__).parent.resolve()}/assets/eq3.png") + item = QtWidgets.QGraphicsPixmapItem(pix) + item.setScale(0.38) + scene = QtWidgets.QGraphicsScene() + scene.addItem(item) + self.equation_view.setScene(scene) + + # Show self + self.show() if __name__ == '__main__': app = QtWidgets.QApplication(sys.argv) window = AppWindow() + window.show() sys.exit(app.exec_()) \ No newline at end of file diff --git a/app.ui b/archive/app.ui similarity index 80% rename from app.ui rename to archive/app.ui index ad17675..f8799bb 100644 --- a/app.ui +++ b/archive/app.ui @@ -7,7 +7,7 @@ 0 0 1091 - 580 + 611 @@ -84,9 +84,9 @@ 10 - 70 + 120 241 - 141 + 111 @@ -103,9 +103,9 @@ 10 - 20 + 50 221 - 111 + 31 @@ -118,7 +118,7 @@ 0 0 221 - 71 + 21 @@ -148,8 +148,8 @@ 0 0 - 221 - 103 + 211 + 21 @@ -170,64 +170,52 @@ - - - - Min peak height - - - - - - - 6 - - - 0.000400000000000 - - - - - - - Min peak prominence - - - - - - - 6 - - - 0.001200000000000 - - - - - - - Moving average size - - - - - - - 20 - - - + + + + 10 + 20 + 221 + 19 + + + + + VThreshold (Voltage column required) + + + + + SpacedGroups + + + + + + + 10 + 80 + 221 + 20 + + + + Every other group (MIRRORED) + + + true + + 60 - 220 + 250 151 28 @@ -248,9 +236,9 @@ 10 - 320 + 350 241 - 171 + 181 @@ -267,9 +255,9 @@ 10 - 80 + 90 221 - 89 + 81 @@ -323,7 +311,7 @@ 10 20 221 - 51 + 61 @@ -332,7 +320,7 @@ 60 - 500 + 540 151 28 @@ -349,51 +337,11 @@ Fit - - - - 10 - 10 - 241 - 51 - - - - - 8 - 75 - true - - - - Grouping Algorithm - - - - - 10 - 20 - 221 - 21 - - - - - VThreshold (V column required) - - - - - SpacedGroups - - - - 10 - 260 + 290 241 51 @@ -406,7 +354,7 @@ - Peak Isolation Config + Peak Isolation Config (timescale: ticks) false @@ -424,15 +372,101 @@ - Individual Peak Range + Overlapped Peak Range - + + + 100000 + + + 100 + + + 5000 + + + + + + + + + + 10 + 10 + 241 + 101 + + + + + 8 + 75 + true + + + + Peak Detection Config + + + + + 10 + 20 + 221 + 74 + + + + + + + Min peak height + + + + + 6 + + 0.000400000000000 + + + + + + + Min peak prominence + + + + + + + 6 + + + 0.001200000000000 + + + + + + + Moving average size + + + + + + + 20 + @@ -445,7 +479,7 @@ 0 0 1091 - 26 + 21 diff --git a/archive/widgets.py b/archive/widgets.py new file mode 100644 index 0000000..ae87e39 --- /dev/null +++ b/archive/widgets.py @@ -0,0 +1,235 @@ +import numpy as np +from pandas import read_csv +import matplotlib +matplotlib.use('Qt5Agg') +from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg, NavigationToolbar2QT as NavigationToolbar +from matplotlib.figure import Figure +import crds_calc +import PyQt5 +from PyQt5 import QtWidgets, QtCore +from memdb import mem +import pathlib + +# Helper functions + +class Global(QtWidgets.QWidget): + csv_selected = QtCore.pyqtSignal() + correlation_complete = QtCore.pyqtSignal() + fitting_complete = QtCore.pyqtSignal() +globj = Global() + +def display_warning(message: str): + msg = QtWidgets.QMessageBox() + msg.setIcon(QtWidgets.QMessageBox.warning) + msg.setText("Warning") + msg.setInformativeText(message) + msg.setWindowTitle("Warning") + msg.exec_() + +def display_error(message: str): + msg = QtWidgets.QMessageBox() + msg.setIcon(QtWidgets.QMessageBox.Critical) + msg.setText("Error") + msg.setInformativeText(message) + msg.setWindowTitle("Error") + msg.exec_() + + +# Menu definitions + +class file_menu(QtWidgets.QMenu): + def __init__(self, x): + super().__init__(x) + open_csv = QtWidgets.QAction("Open CSV File", self) + open_csv.setShortcut("Ctrl+O") + open_csv.triggered.connect(self.select_csv) + self.addAction(open_csv) + + def select_csv(self): + filename, _ = QtWidgets.QFileDialog.getOpenFileName(self) + data = read_csv(filename, comment="%", delimiter=";").to_numpy() + mem['x_data'] = data.transpose()[0] + mem['y_data'] = data.transpose()[1] + try: + mem['v_data'] = data[2].transpose() + except IndexError: + display_error('No voltage column detected. Functionality will be limited.') + + globj.csv_selected.emit() + +class help_menu(QtWidgets.QMenu): + def __init__(self, x): + super().__init__(x) + visit_repo = QtWidgets.QAction("Go to GitHub Repo", self) + visit_repo.triggered.connect(self.go_to_repo) + self.addAction(visit_repo) + + def go_to_repo(self): + PyQt5.QtGui.QDesktopServices.openUrl(QtCore.QUrl('https://github.com/turtlebasket/crds_analyze')) + +# Inputs / Parameter boxes + +class combo_grouping_algo(QtWidgets.QComboBox): + def change(self): + mem['grouping_algo'] = self.currentIndex() + globj.grouping_algo_changed.emit() + def __init__(self, x): + super().__init__(x) + self.currentIndexChanged.connect(self.change) + +class config_area(QtWidgets.QStackedWidget): + def __init__(self, x): + super().__init__(x) + self.setCurrentIndex(0) + globj.grouping_algo_changed.connect(lambda: self.setCurrentIndex(mem['grouping_algo'])) + +class spin_min_voltage(QtWidgets.QDoubleSpinBox): + def changeVal(self, val): + mem['min_voltage'] = float(val) + def __init__(self, x): + super().__init__(x) + mem['min_voltage'] = float(self.value()) + self.textChanged.connect(self.changeVal) + +class spin_group_len(QtWidgets.QDoubleSpinBox): + def changeVal(self, val): + mem['group_len'] = float(val) + def __init__(self, x): + super().__init__(x) + mem['group_len'] = float(self.value()) + self.textChanged.connect(self.changeVal) + +class spin_peak_len(QtWidgets.QDoubleSpinBox): + def changeVal(self, val): + mem['peak_len'] = float(val) + def __init__(self, x): + super().__init__(x) + mem['peak_len'] = float(self.value()) + self.textChanged.connect(self.changeVal) + +class spin_min_peakheight(QtWidgets.QDoubleSpinBox): + def changeVal(self, val): + mem['peak_minheight'] = float(val) + def __init__(self, x): + super().__init__(x) + mem['peak_minheight'] = float(self.value()) + self.textChanged.connect(self.changeVal) + +class spin_min_peakprominence(QtWidgets.QDoubleSpinBox): + def changeVal(self, val): + mem['peak_prominence'] = float(val) + def __init__(self, x): + super().__init__(x) + mem['peak_prominence'] = float(self.value()) + self.textChanged.connect(self.changeVal) + +class spin_moving_average_denom(QtWidgets.QSpinBox): + def changeVal(self, val): + mem['moving_avg_denom'] = int(val) + print(isinstance(val, str)) + def __init__(self, x): + super().__init__(x) + mem['moving_avg_denom'] = float(self.value()) + self.textChanged.connect(self.changeVal) + +class equation_view(QtWidgets.QGraphicsView): + def __init__(self, x): + super().__init__(x) + pix = PyQt5.QtGui.QPixmap(f"{pathlib.Path(__file__).parent.resolve()}/assets/eq3.png") + item = QtWidgets.QGraphicsPixmapItem(pix) + item.setScale(0.38) + scene = QtWidgets.QGraphicsScene() + scene.addItem(item) + self.setScene(scene) + +class correlate_button(QtWidgets.QPushButton): + def calc(self): + groups_raw = None + try: + if (mem['grouping_algo'] == 0): + display_error('VThreshold not yet implemented.') + return + elif (mem['grouping_algo'] == 1): + groups_raw = crds_calc.spaced_groups() + + mem['groups_correlated'] = crds_calc.correlate_groups(groups_raw) + globj.correlation_complete.emit() + + except KeyError: + display_error('Failed to correlate. Did you import a data file & set parameters?') + + + def __init__(self, x): + super().__init__(x) + self.pressed.connect(self.calc) + +class fit_button(QtWidgets.QPushButton): + def fit(self): + print("hi") + def __init__(self, x): + super().__init__(x) + self.pressed.connect(self.fit) + + +# Graph stuff + +class graph_tab(QtWidgets.QTabWidget): + def __init__(self, x): + super().__init__(x) + globj.csv_selected.connect(lambda: self.setCurrentIndex(0)) + globj.correlation_complete.connect(lambda: self.setCurrentIndex(1)) + globj.fitting_complete.connect(lambda: self.setCurrentIndex(2)) + +class MplCanvas(FigureCanvasQTAgg): + def __init__(self, parent=None, width=5, height=4, dpi=100): + fig = Figure(figsize=(width, height), dpi=dpi) + self.axes = fig.add_subplot(111) + fig.tight_layout() + super(MplCanvas, self).__init__(fig) + +class base_graph(QtWidgets.QWidget): + """ + Widget with embedded matplotlib graph & navigation toolbar + + Reference: https://www.mfitzp.com/tutorials/plotting-matplotlib/ + """ + + canv = None + + def __init__(self, x): + super().__init__(x) + self.canv = MplCanvas(self) + # Example + # canv.axes.plot([0,1,2,3,4], [10,1,20,3,40]) + toolbar = NavigationToolbar(self.canv, self) + layout = QtWidgets.QVBoxLayout() + layout.addWidget(toolbar) + layout.addWidget(self.canv) + self.setLayout(layout) + + def plot(self): + self.canv.axes.plot(mem['x_data'], mem['y_data']) + + def plot_full(self): + self.canv.axes.clear() + self.plot() + self.canv.draw() + print("attempted plot") + +class rawdata_graph(base_graph): + def __init__(self, x): + super().__init__(x) + globj.csv_selected.connect(self.plot_full) + +class peaks_graph(base_graph): + def __init__(self, x): + super().__init__(x) + globj.correlation_complete.connect(self.plot_full) + + def plot(self): + for i in mem['groups_correlated']: + self.canv.axes.plot(i) + + +class timeconstant_graph(base_graph): + pass \ No newline at end of file diff --git a/assets/eq3.png b/assets/eq3.png new file mode 100644 index 0000000..177264f Binary files /dev/null and b/assets/eq3.png differ diff --git a/crds_calc.py b/crds_calc.py index f2b66af..bafcd0f 100644 --- a/crds_calc.py +++ b/crds_calc.py @@ -1,5 +1,6 @@ import numpy as np from scipy.signal import find_peaks, correlate +from memdb import mem def spaced_groups( x_data: np.array, @@ -109,4 +110,21 @@ def correlate_groups(groups_raw): groups_adjusted.append(x) - return groups_adjusted \ No newline at end of file + return groups_adjusted + +def isolate_peaks( + peak_width: int, + groups_adjusted: list, + peak_minheight: int, + peak_prominence: int, + sma_denom: int +): + + def moving_average(x, w): + return np.convolve(x, np.ones(w), 'valid') / w + + group_peaks = [] + for g in groups_adjusted: + y_data_av = moving_average(g, sma_denom) + peak_indices = find_peaks(y_data_av, height=peak_minheight, prominence=peak_prominence) # Get indices of all peaks + group_peaks.append(peak_indices) diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..e5a8f6e --- /dev/null +++ b/requirements.txt @@ -0,0 +1,5 @@ +PyQt5 +pandas +numpy +pyinstaller==4.4 +sqlitedict diff --git a/ui/mainwin.ui b/ui/mainwin.ui new file mode 100644 index 0000000..65708e3 --- /dev/null +++ b/ui/mainwin.ui @@ -0,0 +1,591 @@ + + + MainWindow + + + + 0 + 0 + 1091 + 611 + + + + CRDS Scanalyzer + + + QGroupBox: {font-style: bold; font-size: 8px } + + + + + + 260 + 0 + 821 + 561 + + + + + 8 + + + + 0 + + + + Raw Data + + + + + -1 + -1 + 811 + 531 + + + + + + + Groups + + + + + 0 + 0 + 651 + 531 + + + + + + + Time Constant + + + + + 0 + 0 + 651 + 531 + + + + + + + + + 10 + 120 + 241 + 111 + + + + + 8 + 75 + true + + + + Grouping Config + + + + + 10 + 50 + 221 + 31 + + + + 0 + + + + + + 0 + 0 + 221 + 22 + + + + + + + Minimum voltage out + + + + + + + 6 + + + 0.001000000000000 + + + + + + + + + + + 0 + 0 + 211 + 22 + + + + + + + Estimated pass time + + + + + + + 6 + + + 0.000600000000000 + + + + + + + + + + + 10 + 20 + 221 + 19 + + + + + VThreshold (Voltage column required) + + + + + SpacedGroups + + + + + + + 10 + 80 + 221 + 20 + + + + Every other group (MIRRORED) + + + true + + + + + + + 60 + 240 + 151 + 28 + + + + + -1 + + + + * {font-size: 13px} + + + Correlate + + + + + + 10 + 340 + 241 + 181 + + + + + 8 + 75 + true + + + + Initial Fit Config + + + + + 10 + 90 + 221 + 83 + + + + + + + τ value + + + + + + + 6 + + + + + + + y0 value + + + + + + + 6 + + + + + + + a value + + + + + + + 6 + + + + + + + + + 10 + 20 + 221 + 61 + + + + + + + + 60 + 530 + 151 + 28 + + + + + -1 + + + + * {font-size: 13px} + + + Fit + + + + + + 10 + 280 + 241 + 51 + + + + + 8 + 75 + true + + + + Peak Isolation Config (timescale: ticks) + + + false + + + + + 9 + 20 + 221 + 25 + + + + + + + Overlapped Peak Range + + + + + + + 100000 + + + 100 + + + 5000 + + + + + + + + + + 10 + 10 + 241 + 101 + + + + + 8 + 75 + true + + + + Peak Detection Config + + + + + 10 + 20 + 221 + 76 + + + + + + + Min peak height + + + + + + + 6 + + + 0.000400000000000 + + + + + + + Min peak prominence + + + + + + + 6 + + + 0.001200000000000 + + + + + + + Moving average size + + + + + + + 20 + + + + + + + + + + + 0 + 0 + 1091 + 26 + + + + + File + + + + + + + + + + + Help + + + + + + + + + + Open CSV File + + + Ctrl+O + + + + + Quit + + + + + Export + + + Ctrl+E + + + + + GitHub Repo + + + + + Open LabView File + + + + + Open CSV File + + + Ctrl+O + + + + + Quit + + + + + Export Binary + + + + + Open LabView Data + + + + + Github Repository + + + F1 + + + + + + RawDataGraph + QWidget +
widgets
+ 1 +
+ + PeaksGraph + QWidget +
widgets
+ 1 +
+ + TimeConstantGraph + QWidget +
widgets
+ 1 +
+
+ + +
diff --git a/widgets.py b/widgets.py index 8f71872..107c49a 100644 --- a/widgets.py +++ b/widgets.py @@ -1,192 +1,9 @@ -import numpy as np -from pandas import read_csv +from PyQt5 import QtWidgets import matplotlib matplotlib.use('Qt5Agg') from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg, NavigationToolbar2QT as NavigationToolbar from matplotlib.figure import Figure -import crds_calc -import PyQt5 -from PyQt5 import QtWidgets, QtCore from memdb import mem -import pathlib - -# Helper functions - -def display_warning(message: str): - msg = QtWidgets.QMessageBox() - msg.setIcon(QtWidgets.QMessageBox.warning) - msg.setText("Warning") - msg.setInformativeText(message) - msg.setWindowTitle("Warning") - msg.exec_() - -def display_error(message: str): - msg = QtWidgets.QMessageBox() - msg.setIcon(QtWidgets.QMessageBox.Critical) - msg.setText("Error") - msg.setInformativeText(message) - msg.setWindowTitle("Error") - msg.exec_() - -# Create global object to send signals - -class Global(QtWidgets.QWidget): - grouping_algo_changed = QtCore.pyqtSignal() - csv_selected = QtCore.pyqtSignal() - correlation_complete = QtCore.pyqtSignal() - fitting_complete = QtCore.pyqtSignal() -globj = Global() - -# Menu definitions - -class file_menu(QtWidgets.QMenu): - def __init__(self, x): - super().__init__(x) - open_csv = QtWidgets.QAction("Open CSV File", self) - open_csv.setShortcut("Ctrl+O") - open_csv.triggered.connect(self.select_csv) - self.addAction(open_csv) - - def select_csv(self): - filename, _ = QtWidgets.QFileDialog.getOpenFileName(self) - data = read_csv(filename, comment="%", delimiter=";").to_numpy() - mem['x_data'] = data.transpose()[0] - mem['y_data'] = data.transpose()[1] - try: - mem['v_data'] = data[2].transpose() - except IndexError: - display_error('No voltage column detected. Functionality will be limited.') - - globj.csv_selected.emit() - -class help_menu(QtWidgets.QMenu): - def __init__(self, x): - super().__init__(x) - visit_repo = QtWidgets.QAction("Go to GitHub Repo", self) - visit_repo.triggered.connect(self.go_to_repo) - self.addAction(visit_repo) - - def go_to_repo(self): - PyQt5.QtGui.QDesktopServices.openUrl(QtCore.QUrl('https://github.com/turtlebasket/crds_analyze')) - -# Inputs / Parameter boxes - -class combo_grouping_algo(QtWidgets.QComboBox): - def change(self): - mem['grouping_algo'] = self.currentIndex() - globj.grouping_algo_changed.emit() - def __init__(self, x): - super().__init__(x) - self.currentIndexChanged.connect(self.change) - -class config_area(QtWidgets.QStackedWidget): - def __init__(self, x): - super().__init__(x) - self.setCurrentIndex(0) - globj.grouping_algo_changed.connect(lambda: self.setCurrentIndex(mem['grouping_algo'])) - -class spin_min_voltage(QtWidgets.QDoubleSpinBox): - def changeVal(self, val): - mem['min_voltage'] = float(val) - def __init__(self, x): - super().__init__(x) - mem['min_voltage'] = float(self.value()) - self.textChanged.connect(self.changeVal) - -class spin_group_len(QtWidgets.QDoubleSpinBox): - def changeVal(self, val): - mem['group_len'] = float(val) - def __init__(self, x): - super().__init__(x) - mem['group_len'] = float(self.value()) - self.textChanged.connect(self.changeVal) - -class spin_peak_len(QtWidgets.QDoubleSpinBox): - def changeVal(self, val): - mem['peak_len'] = float(val) - def __init__(self, x): - super().__init__(x) - mem['peak_len'] = float(self.value()) - self.textChanged.connect(self.changeVal) - -class spin_min_peakheight(QtWidgets.QDoubleSpinBox): - def changeVal(self, val): - mem['peak_minheight'] = float(val) - def __init__(self, x): - super().__init__(x) - mem['peak_minheight'] = float(self.value()) - self.textChanged.connect(self.changeVal) - -class spin_min_peakprominence(QtWidgets.QDoubleSpinBox): - def changeVal(self, val): - mem['peak_prominence'] = float(val) - def __init__(self, x): - super().__init__(x) - mem['peak_prominence'] = float(self.value()) - self.textChanged.connect(self.changeVal) - -class spin_moving_average_denom(QtWidgets.QSpinBox): - def changeVal(self, val): - mem['moving_avg_denom'] = int(val) - print(isinstance(val, str)) - def __init__(self, x): - super().__init__(x) - mem['moving_avg_denom'] = float(self.value()) - self.textChanged.connect(self.changeVal) - -class equation_view(QtWidgets.QGraphicsView): - def __init__(self, x): - super().__init__(x) - pix = PyQt5.QtGui.QPixmap(f"{pathlib.Path(__file__).parent.resolve()}/assets/eq2.png") - item = QtWidgets.QGraphicsPixmapItem(pix) - item.setScale(0.15) - scene = QtWidgets.QGraphicsScene() - scene.addItem(item) - self.setScene(scene) - -class correlate_button(QtWidgets.QPushButton): - def calc(self): - groups_raw = None - try: - if (mem['grouping_algo'] == 0): - display_error('VThreshold not yet implemented.') - elif (mem['grouping_algo'] == 1): - groups_raw = crds_calc.spaced_groups( - mem['x_data'], - mem['y_data'], - mem['group_len'], - mem['peak_minheight'], - mem['peak_prominence'], - mem['moving_avg_denom'] - ) - - mem['groups_correlated'] = crds_calc.correlate_groups(groups_raw) - globj.correlation_complete.emit() - - except KeyError: - display_error('Failed to correlate. Did you import a data file & set parameters?') - - - def __init__(self, x): - super().__init__(x) - self.pressed.connect(self.calc) - -class fit_button(QtWidgets.QPushButton): - def fit(self): - print("hi") - def __init__(self, x): - super().__init__(x) - self.pressed.connect(self.fit) - - -# Graph stuff - -class graph_tab(QtWidgets.QTabWidget): - def __init__(self, x): - super().__init__(x) - globj.csv_selected.connect(lambda: self.setCurrentIndex(0)) - globj.correlation_complete.connect(lambda: self.setCurrentIndex(1)) - globj.fitting_complete.connect(lambda: self.setCurrentIndex(2)) class MplCanvas(FigureCanvasQTAgg): def __init__(self, parent=None, width=5, height=4, dpi=100): @@ -195,7 +12,7 @@ class MplCanvas(FigureCanvasQTAgg): fig.tight_layout() super(MplCanvas, self).__init__(fig) -class base_graph(QtWidgets.QWidget): +class BaseGraph(QtWidgets.QWidget): """ Widget with embedded matplotlib graph & navigation toolbar @@ -215,29 +32,22 @@ class base_graph(QtWidgets.QWidget): layout.addWidget(self.canv) self.setLayout(layout) - def plot(self): + def plot_data(self): self.canv.axes.plot(mem['x_data'], mem['y_data']) - def plot_full(self): + def plot(self): self.canv.axes.clear() - self.plot() + self.plot_data() self.canv.draw() print("attempted plot") -class rawdata_graph(base_graph): - def __init__(self, x): - super().__init__(x) - globj.csv_selected.connect(self.plot_full) +class RawDataGraph(BaseGraph): + pass -class peaks_graph(base_graph): - def __init__(self, x): - super().__init__(x) - globj.correlation_complete.connect(self.plot_full) - - def plot(self): +class PeaksGraph(BaseGraph): + def plot_data(self): for i in mem['groups_correlated']: self.canv.axes.plot(i) - -class timeconstant_graph(base_graph): - pass \ No newline at end of file +class TimeConstantGraph(BaseGraph): + pass # no modifications thus far \ No newline at end of file