From ab04c16e31757bfe0ebc2b05b5957bf9d0dac859 Mon Sep 17 00:00:00 2001 From: turtlebasket Date: Wed, 11 Aug 2021 18:10:02 -0700 Subject: [PATCH] Residuals support & slight changes to (broken) persistence system --- app.py | 29 ++++++++++++++++++++++++----- ui/mainwin.ui | 17 +++++++++++++++-- widgets.py | 8 +++++++- 3 files changed, 46 insertions(+), 8 deletions(-) diff --git a/app.py b/app.py index f689183..102b3cb 100644 --- a/app.py +++ b/app.py @@ -90,17 +90,21 @@ class AppWindow(QtWidgets.QMainWindow, Ui_MainWindow): # path_hash = md5(filename.encode('utf-8')).hexdigest() # def set_value(name, val): - # with SqliteDict(f"./db/{path_hash}.sqlite", autocommit=True) as storage: + # with SqliteDict(f"{getcwd()}/db/{path_hash}.sqlite", autocommit=True) as storage: # print(f"Change {name} to {val}.") # storage[name] = val + # storage.commit() # print(f"Check: {storage[name]}") - # with SqliteDict(f"./db/{path_hash}.sqlite", autocommit=True) as storage: + # with SqliteDict(f"{getcwd()}/db/{path_hash}.sqlite", autocommit=True) as storage: + # print(f"Check: {storage[name]}") + + # with SqliteDict(f"{getcwd()}/db/{path_hash}.sqlite", autocommit=True) as storage: # for w in synced_value_widgets: # name = w.objectName() # try: - # w.setValue(bool(storage[name])) + # w.setValue(storage[name]) # print(f"Loaded {name}.") # except KeyError: # print(f"Failed to load object {name}.") @@ -110,8 +114,8 @@ class AppWindow(QtWidgets.QMainWindow, Ui_MainWindow): # for w in synced_check_widgets: # name = w.objectName() # try: - # w.setChecked(storage[name]) - # print(f"Loaded {name}.") + # w.setChecked(bool(storage[name])) + # print(f"Loaded {name} as {storage[name]}.") # except KeyError: # print(f"Failed to load object {name}.") # pass @@ -308,6 +312,21 @@ Tau Average: {tau_avg} pass self.export_csv_button.pressed.connect(export_csv) + def export_csv_residuals(): + try: + mem['residuals'] + except KeyError: + display_error("No residual data to export.") + return + filename, _ = QtWidgets.QFileDialog.getSaveFileName(self, "Export Residuals CSV", "residuals.csv") + df = DataFrame(mem['residuals']) + # df.index = arange(1, len(df)+1) + try: + df.to_csv(filename, index=False) + except: + pass + self.export_csv_button_resid.pressed.connect(export_csv_residuals) + # Show self self.show() diff --git a/ui/mainwin.ui b/ui/mainwin.ui index 05d9134..8a5a852 100644 --- a/ui/mainwin.ui +++ b/ui/mainwin.ui @@ -810,7 +810,7 @@ 10 10 261 - 351 + 381 @@ -868,7 +868,20 @@ p, li { white-space: pre-wrap; } - Export CSV + Export Tau CSV + + + + + + 20 + 350 + 221 + 21 + + + + Export Residuals CSV diff --git a/widgets.py b/widgets.py index cc36b2c..fdd6617 100644 --- a/widgets.py +++ b/widgets.py @@ -102,13 +102,19 @@ class FitGraph(BaseGraph): self.peak_index = i def plot_data(self): + resid = [] for g_i in range(len(mem['isolated_peaks'])): peak = mem['isolated_peaks'][g_i][self.peak_index] x_data = np.arange(len(peak)) x_data_target = x_data[mem['overlayed_peak_indices'][g_i][self.peak_index]+mem['shift_over_fit']:] + peak_target = peak[mem['overlayed_peak_indices'][g_i][self.peak_index]+mem['shift_over_fit']:] popt = mem['fit_equations'][g_i][self.peak_index]['popt'] self.canv.axes.plot(peak) self.canv.axes.plot(x_data_target, exp_func(x_data_target, *popt), color='red') + + resid.append(peak_target - exp_func(x_data_target, *popt)), + self.canv.axes.plot(x_data_target, peak_target - exp_func(x_data_target, *popt), c='green') + mem['residuals'] = resid class FitsGraphViewer(QtWidgets.QTabWidget): def __init__(self, x): @@ -187,7 +193,7 @@ class TimeConstantGraphsViewer(QtWidgets.QTabWidget): self.clear() for p_i in range(len(mem['time_constants'][0])): - tab_name = str(p_i) + tab_name = str(p_i+1) tau_graph = TimeConstantGraph(self) tau_graph.set_peak_index(p_i) self.addTab(tau_graph, tab_name)