more accurate timestep
parent
3239ac2a2c
commit
22e438963b
|
@ -140,3 +140,4 @@ cython_debug/
|
||||||
# Local stuff to exclude
|
# Local stuff to exclude
|
||||||
.vscode/
|
.vscode/
|
||||||
mainwin.py
|
mainwin.py
|
||||||
|
*.sqlite
|
49
app.py
49
app.py
|
@ -6,6 +6,10 @@ from db import mem
|
||||||
from mainwin import Ui_MainWindow
|
from mainwin import Ui_MainWindow
|
||||||
from widgets import BaseGraph
|
from widgets import BaseGraph
|
||||||
import pathlib
|
import pathlib
|
||||||
|
from re import search as re_search
|
||||||
|
from varname.core import nameof
|
||||||
|
from hashlib import md5
|
||||||
|
from sqlitedict import SqliteDict
|
||||||
|
|
||||||
class AppWindow(QtWidgets.QMainWindow, Ui_MainWindow):
|
class AppWindow(QtWidgets.QMainWindow, Ui_MainWindow):
|
||||||
|
|
||||||
|
@ -13,6 +17,16 @@ class AppWindow(QtWidgets.QMainWindow, Ui_MainWindow):
|
||||||
super(AppWindow, self).__init__()
|
super(AppWindow, self).__init__()
|
||||||
self.setupUi(self)
|
self.setupUi(self)
|
||||||
|
|
||||||
|
# Define syncables
|
||||||
|
synced_value_widgets = []
|
||||||
|
synced_check_widgets = []
|
||||||
|
for wname in vars(self):
|
||||||
|
w = vars(self).get(wname)
|
||||||
|
if re_search(r"^spin\_(.*)$", wname) != None:
|
||||||
|
synced_value_widgets.append(w)
|
||||||
|
elif re_search(r"^check\_(.*)$", wname) != None:
|
||||||
|
synced_check_widgets.append(w)
|
||||||
|
|
||||||
# Helpers
|
# Helpers
|
||||||
|
|
||||||
def display_warning(message: str):
|
def display_warning(message: str):
|
||||||
|
@ -40,9 +54,11 @@ class AppWindow(QtWidgets.QMainWindow, Ui_MainWindow):
|
||||||
return
|
return
|
||||||
mem['x_data'] = data.transpose()[0]
|
mem['x_data'] = data.transpose()[0]
|
||||||
mem['y_data'] = data.transpose()[1]
|
mem['y_data'] = data.transpose()[1]
|
||||||
timestep = mem['x_data'][1] - mem['x_data'][0]
|
# timestep = mem['x_data'][1] - mem['x_data'][0]
|
||||||
|
timestep = (mem['x_data'][-1] - mem['x_data'][0]) / len(mem['x_data'])
|
||||||
mem['timestep'] = timestep
|
mem['timestep'] = timestep
|
||||||
self.spin_timestep.setValue(timestep)
|
self.spin_timestep.setValue(timestep)
|
||||||
|
print(timestep)
|
||||||
self.raw_data_graph.plot() # Graph new stuff
|
self.raw_data_graph.plot() # Graph new stuff
|
||||||
|
|
||||||
# self.groups_graph.clear() # Clear old stuff
|
# self.groups_graph.clear() # Clear old stuff
|
||||||
|
@ -61,6 +77,37 @@ class AppWindow(QtWidgets.QMainWindow, Ui_MainWindow):
|
||||||
self.voltage.setVisible(False)
|
self.voltage.setVisible(False)
|
||||||
self.graph_tabs.setCurrentIndex(0)
|
self.graph_tabs.setCurrentIndex(0)
|
||||||
|
|
||||||
|
# Load from persistent storage & bind write actions
|
||||||
|
|
||||||
|
# path_hash = md5(filename.encode('utf-8')).hexdigest()
|
||||||
|
|
||||||
|
# def set_value(name, val):
|
||||||
|
# with SqliteDict(f"./db/{path_hash}.sqlite", autocommit=True) as storage:
|
||||||
|
# print(f"Change {name} to {val}.")
|
||||||
|
# storage[name] = val
|
||||||
|
# print(f"Check: {storage[name]}")
|
||||||
|
|
||||||
|
# with SqliteDict(f"./db/{path_hash}.sqlite", autocommit=True) as storage:
|
||||||
|
|
||||||
|
# for w in synced_value_widgets:
|
||||||
|
# name = w.objectName()
|
||||||
|
# try:
|
||||||
|
# w.setValue(bool(storage[name]))
|
||||||
|
# print(f"Loaded {name}.")
|
||||||
|
# except KeyError:
|
||||||
|
# print(f"Failed to load object {name}.")
|
||||||
|
# pass
|
||||||
|
# w.valueChanged.connect(lambda x: set_value(name, x))
|
||||||
|
|
||||||
|
# for w in synced_check_widgets:
|
||||||
|
# name = w.objectName()
|
||||||
|
# try:
|
||||||
|
# w.setChecked(storage[name])
|
||||||
|
# print(f"Loaded {name}.")
|
||||||
|
# except KeyError:
|
||||||
|
# print(f"Failed to load object {name}.")
|
||||||
|
# pass
|
||||||
|
# w.stateChanged.connect(lambda: set_value(name, w.isChecked()))
|
||||||
|
|
||||||
# Universal Actions stuff
|
# Universal Actions stuff
|
||||||
|
|
||||||
|
|
12
crds_calc.py
12
crds_calc.py
|
@ -1,7 +1,7 @@
|
||||||
import numpy as np
|
import numpy as np
|
||||||
from scipy.signal import find_peaks, correlate
|
from scipy.signal import find_peaks, correlate
|
||||||
from scipy.optimize import curve_fit
|
from scipy.optimize import curve_fit
|
||||||
from memdb import mem
|
from db import mem
|
||||||
|
|
||||||
def minmax(data):
|
def minmax(data):
|
||||||
return np.min(data), np.max(data)
|
return np.min(data), np.max(data)
|
||||||
|
@ -281,6 +281,7 @@ def fit_peaks(
|
||||||
overlayed_peak_row = []
|
overlayed_peak_row = []
|
||||||
for peak_data in peaks_cut:
|
for peak_data in peaks_cut:
|
||||||
x_data = np.arange(len(peak_data)) # just placeholder indices
|
x_data = np.arange(len(peak_data)) # just placeholder indices
|
||||||
|
# x_data = np.arange(0, len(peak_data)*mem['timestep'], mem['timestep'])
|
||||||
if not use_advanced:
|
if not use_advanced:
|
||||||
peak_index = np.argmax(peak_data, axis=0)
|
peak_index = np.argmax(peak_data, axis=0)
|
||||||
else:
|
else:
|
||||||
|
@ -289,7 +290,6 @@ def fit_peaks(
|
||||||
params_guess = (peak_index+shift_over, a, y0, tau)
|
params_guess = (peak_index+shift_over, a, y0, tau)
|
||||||
x_data_target = x_data[peak_index+shift_over:]
|
x_data_target = x_data[peak_index+shift_over:]
|
||||||
peak_data_target = peak_data[peak_index+shift_over:]
|
peak_data_target = peak_data[peak_index+shift_over:]
|
||||||
# popt, pcov = curve_fit(exp_func, x_data_target, peak_data_target, bounds=([-np.inf, 0.0, -np.inf, 0.0], np.inf))
|
|
||||||
popt, pcov = curve_fit(exp_func, x_data_target, peak_data_target, bounds=([-np.inf, 0.0, -np.inf, 0.0], np.inf), p0=params_guess, maxfev=10000000)
|
popt, pcov = curve_fit(exp_func, x_data_target, peak_data_target, bounds=([-np.inf, 0.0, -np.inf, 0.0], np.inf), p0=params_guess, maxfev=10000000)
|
||||||
equation_row.append({'popt': popt, 'pcov': pcov})
|
equation_row.append({'popt': popt, 'pcov': pcov})
|
||||||
overlayed_peak_row.append(peak_index)
|
overlayed_peak_row.append(peak_index)
|
||||||
|
@ -300,9 +300,9 @@ def fit_peaks(
|
||||||
return equations # list linked with isolated_peaks
|
return equations # list linked with isolated_peaks
|
||||||
|
|
||||||
|
|
||||||
def get_tau_data(equation_data):
|
def get_time_constants(equation_data):
|
||||||
"""
|
"""
|
||||||
Extracts time constant from all equations (2d array)
|
Extracts time constant from all fit-output equations (2d array)
|
||||||
|
|
||||||
Returns
|
Returns
|
||||||
-------
|
-------
|
||||||
|
@ -316,6 +316,8 @@ def get_tau_data(equation_data):
|
||||||
for e in r:
|
for e in r:
|
||||||
tau = e['popt'][3]
|
tau = e['popt'][3]
|
||||||
row.append(tau)
|
row.append(tau)
|
||||||
equation_data.append(row)
|
tau_data.append(row)
|
||||||
|
|
||||||
|
print(tau_data)
|
||||||
|
|
||||||
return tau_data
|
return tau_data
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
PyQt5
|
PyQt5
|
||||||
pandas
|
pandas
|
||||||
|
matplotlib
|
||||||
numpy
|
numpy
|
||||||
pyinstaller==4.4
|
pyinstaller==4.4
|
||||||
sqlitedict
|
sqlitedict
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 227 KiB |
|
@ -78,7 +78,7 @@
|
||||||
<number>6</number>
|
<number>6</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="minimum">
|
<property name="minimum">
|
||||||
<double>-99.989999999999995</double>
|
<double>0.000000000000000</double>
|
||||||
</property>
|
</property>
|
||||||
<property name="singleStep">
|
<property name="singleStep">
|
||||||
<double>0.010000000000000</double>
|
<double>0.010000000000000</double>
|
||||||
|
|
Loading…
Reference in New Issue