This commit is contained in:
2021-07-16 09:19:00 -07:00
parent 0e4423209e
commit 9a926dafb2
9 changed files with 1105 additions and 313 deletions

620
archive/app.ui Normal file
View File

@@ -0,0 +1,620 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1091</width>
<height>611</height>
</rect>
</property>
<property name="windowTitle">
<string>CRDS Scanalyzer</string>
</property>
<property name="styleSheet">
<string notr="true">QGroupBox: {font-style: bold; font-size: 8px }</string>
</property>
<widget class="QWidget" name="centralwidget">
<widget class="graph_tab" name="tabWidget">
<property name="geometry">
<rect>
<x>260</x>
<y>0</y>
<width>821</width>
<height>561</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>8</pointsize>
</font>
</property>
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="raw_data">
<attribute name="title">
<string>Raw Data</string>
</attribute>
<widget class="rawdata_graph" name="widget" native="true">
<property name="geometry">
<rect>
<x>-1</x>
<y>-1</y>
<width>811</width>
<height>531</height>
</rect>
</property>
</widget>
</widget>
<widget class="QWidget" name="groups">
<attribute name="title">
<string>Groups</string>
</attribute>
<widget class="peaks_graph" name="widget_2" native="true">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>651</width>
<height>531</height>
</rect>
</property>
</widget>
</widget>
<widget class="QWidget" name="time_constant">
<attribute name="title">
<string>Time Constant</string>
</attribute>
<widget class="timeconstant_graph" name="widget_3" native="true">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>651</width>
<height>531</height>
</rect>
</property>
</widget>
</widget>
</widget>
<widget class="QGroupBox" name="groupBox">
<property name="geometry">
<rect>
<x>10</x>
<y>120</y>
<width>241</width>
<height>111</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>8</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="title">
<string>Grouping Config</string>
</property>
<widget class="config_area" name="stackedWidget">
<property name="geometry">
<rect>
<x>10</x>
<y>50</y>
<width>221</width>
<height>31</height>
</rect>
</property>
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="page">
<widget class="QWidget" name="formLayoutWidget_4">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>221</width>
<height>21</height>
</rect>
</property>
<layout class="QFormLayout" name="formLayout_4">
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Minimum voltage out</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="spin_min_voltage" name="doubleSpinBox_5">
<property name="decimals">
<number>6</number>
</property>
<property name="value">
<double>0.001000000000000</double>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
<widget class="QWidget" name="page_2">
<widget class="QWidget" name="formLayoutWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>211</width>
<height>21</height>
</rect>
</property>
<layout class="QFormLayout" name="formLayout">
<item row="0" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Estimated pass time</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="spin_group_len" name="spin_group_len">
<property name="decimals">
<number>6</number>
</property>
<property name="value">
<double>0.000600000000000</double>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
</widget>
<widget class="combo_grouping_algo" name="comboBox">
<property name="geometry">
<rect>
<x>10</x>
<y>20</y>
<width>221</width>
<height>19</height>
</rect>
</property>
<item>
<property name="text">
<string>VThreshold (Voltage column required)</string>
</property>
</item>
<item>
<property name="text">
<string>SpacedGroups</string>
</property>
</item>
</widget>
<widget class="QCheckBox" name="checkBox">
<property name="geometry">
<rect>
<x>10</x>
<y>80</y>
<width>221</width>
<height>20</height>
</rect>
</property>
<property name="text">
<string>Every other group (MIRRORED)</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</widget>
<widget class="correlate_button" name="compute_button">
<property name="geometry">
<rect>
<x>60</x>
<y>250</y>
<width>151</width>
<height>28</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>-1</pointsize>
</font>
</property>
<property name="styleSheet">
<string notr="true">* {font-size: 13px}</string>
</property>
<property name="text">
<string>Correlate</string>
</property>
</widget>
<widget class="QGroupBox" name="groupBox_2">
<property name="geometry">
<rect>
<x>10</x>
<y>350</y>
<width>241</width>
<height>181</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>8</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="title">
<string>Initial Fit Config</string>
</property>
<widget class="QWidget" name="formLayoutWidget_3">
<property name="geometry">
<rect>
<x>10</x>
<y>90</y>
<width>221</width>
<height>81</height>
</rect>
</property>
<layout class="QFormLayout" name="formLayout_3">
<item row="2" column="0">
<widget class="QLabel" name="label_14">
<property name="text">
<string>τ value</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QDoubleSpinBox" name="doubleSpinBox_2">
<property name="decimals">
<number>6</number>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_13">
<property name="text">
<string>y0 value</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QDoubleSpinBox" name="doubleSpinBox">
<property name="decimals">
<number>6</number>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_15">
<property name="text">
<string>a value</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QDoubleSpinBox" name="doubleSpinBox_3">
<property name="decimals">
<number>6</number>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="equation_view" name="graphicsView">
<property name="geometry">
<rect>
<x>10</x>
<y>20</y>
<width>221</width>
<height>61</height>
</rect>
</property>
</widget>
</widget>
<widget class="fit_button" name="compute_button_2">
<property name="geometry">
<rect>
<x>60</x>
<y>540</y>
<width>151</width>
<height>28</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>-1</pointsize>
</font>
</property>
<property name="styleSheet">
<string notr="true">* {font-size: 13px}</string>
</property>
<property name="text">
<string>Fit</string>
</property>
</widget>
<widget class="QGroupBox" name="groupBox_4">
<property name="geometry">
<rect>
<x>10</x>
<y>290</y>
<width>241</width>
<height>51</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>8</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="title">
<string>Peak Isolation Config (timescale: ticks)</string>
</property>
<property name="checkable">
<bool>false</bool>
</property>
<widget class="QWidget" name="formLayoutWidget_2">
<property name="geometry">
<rect>
<x>9</x>
<y>20</y>
<width>221</width>
<height>25</height>
</rect>
</property>
<layout class="QFormLayout" name="formLayout_2">
<item row="0" column="0">
<widget class="QLabel" name="label_7">
<property name="text">
<string>Overlapped Peak Range</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QSpinBox" name="spinBox_4">
<property name="maximum">
<number>100000</number>
</property>
<property name="singleStep">
<number>100</number>
</property>
<property name="value">
<number>5000</number>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
<widget class="QGroupBox" name="groupBox_5">
<property name="geometry">
<rect>
<x>10</x>
<y>10</y>
<width>241</width>
<height>101</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>8</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="title">
<string>Peak Detection Config</string>
</property>
<widget class="QWidget" name="formLayoutWidget_5">
<property name="geometry">
<rect>
<x>10</x>
<y>20</y>
<width>221</width>
<height>74</height>
</rect>
</property>
<layout class="QFormLayout" name="formLayout_5">
<item row="0" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Min peak height</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="spin_min_peakheight" name="spin_min_peakheight">
<property name="decimals">
<number>6</number>
</property>
<property name="value">
<double>0.000400000000000</double>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_6">
<property name="text">
<string>Min peak prominence</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="spin_min_peakprominence" name="spin_min_peakprominence">
<property name="decimals">
<number>6</number>
</property>
<property name="value">
<double>0.001200000000000</double>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Moving average size</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="spin_moving_average_denom" name="spin_moving_average_denom">
<property name="value">
<number>20</number>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1091</width>
<height>21</height>
</rect>
</property>
<widget class="file_menu" name="menuFile">
<property name="title">
<string>File</string>
</property>
</widget>
<widget class="help_menu" name="menuhelp">
<property name="title">
<string>Help</string>
</property>
</widget>
<addaction name="menuFile"/>
<addaction name="menuhelp"/>
</widget>
<widget class="QStatusBar" name="statusbar"/>
<action name="actionOpen_CSV">
<property name="text">
<string>Open CSV File</string>
</property>
<property name="shortcut">
<string>Ctrl+O</string>
</property>
</action>
<action name="actionQuit">
<property name="text">
<string>Quit</string>
</property>
</action>
<action name="actionExport">
<property name="text">
<string>Export</string>
</property>
<property name="shortcut">
<string>Ctrl+E</string>
</property>
</action>
<action name="actionGithub_repository">
<property name="text">
<string>GitHub Repo</string>
</property>
</action>
<action name="actionOpen_LabView_Binary">
<property name="text">
<string>Open LabView File</string>
</property>
</action>
</widget>
<customwidgets>
<customwidget>
<class>spin_group_len</class>
<extends>QDoubleSpinBox</extends>
<header>widgets</header>
</customwidget>
<customwidget>
<class>spin_min_peakheight</class>
<extends>QDoubleSpinBox</extends>
<header>widgets</header>
</customwidget>
<customwidget>
<class>spin_min_peakprominence</class>
<extends>QDoubleSpinBox</extends>
<header>widgets</header>
</customwidget>
<customwidget>
<class>spin_moving_average_denom</class>
<extends>QSpinBox</extends>
<header>widgets</header>
</customwidget>
<customwidget>
<class>correlate_button</class>
<extends>QPushButton</extends>
<header>widgets</header>
</customwidget>
<customwidget>
<class>equation_view</class>
<extends>QGraphicsView</extends>
<header>widgets</header>
</customwidget>
<customwidget>
<class>fit_button</class>
<extends>QPushButton</extends>
<header>widgets</header>
</customwidget>
<customwidget>
<class>rawdata_graph</class>
<extends>QWidget</extends>
<header>widgets</header>
<container>1</container>
</customwidget>
<customwidget>
<class>peaks_graph</class>
<extends>QWidget</extends>
<header>widgets</header>
<container>1</container>
</customwidget>
<customwidget>
<class>timeconstant_graph</class>
<extends>QWidget</extends>
<header>widgets</header>
<container>1</container>
</customwidget>
<customwidget>
<class>combo_grouping_algo</class>
<extends>QComboBox</extends>
<header>widgets</header>
</customwidget>
<customwidget>
<class>file_menu</class>
<extends>QMenu</extends>
<header>widgets</header>
</customwidget>
<customwidget>
<class>help_menu</class>
<extends>QMenu</extends>
<header>widgets</header>
</customwidget>
<customwidget>
<class>graph_tab</class>
<extends>QTabWidget</extends>
<header>widgets</header>
<container>1</container>
</customwidget>
<customwidget>
<class>config_area</class>
<extends>QStackedWidget</extends>
<header>widgets</header>
<container>1</container>
</customwidget>
<customwidget>
<class>spin_min_voltage</class>
<extends>QDoubleSpinBox</extends>
<header>widgets</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>

235
archive/widgets.py Normal file
View File

@@ -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