def wrapped_callback(*args, **kwargs): try: return callback(args[0]) except: # catch all errors error_string = traceback.format_exc() alert("Error!", error_string) return None
def predict_signals(self): def _compute_signals(μ, σ): μ_rad, σ_rad = np.deg2rad(μ), np.deg2rad(σ) return np.array( [ nP_SHG(μ_rad, σ_rad), nS_SHG(μ_rad, σ_rad), nP_TPF(μ_rad, σ_rad), nS_TPF(μ_rad, σ_rad), ] ) ref_angle = self.referenceTiltSpinBox.value() ref_dist = self.referenceDistributionSpinBox.value() arg_angle = self.targetTiltSpinBox.value() arg_dist = self.targetDistributionSpinBox.value() if (ref_angle, ref_dist) == (arg_angle, arg_dist): alert("Warning", "Reference and final values are the same") else: ref_intensities = _compute_signals(ref_angle, ref_dist) arg_intensities = _compute_signals(arg_angle, arg_dist) # compute relative signal changes as a percentage signal_changes = 100.0 * ( (arg_intensities - ref_intensities) / ref_intensities ) bar_labels = ["P-SHG", "S-SHG", "P-FL", "S-FL"] xpos = np.arange(1, 5) # clear the axis self.predictedSignalWidget.canvas.axes.clear() # do the actual plotting bars1 = self.predictedSignalWidget.canvas.axes.bar(xpos, signal_changes) autolabel(bars1, self.predictedSignalWidget.canvas.axes) self.predictedSignalWidget.canvas.axes.grid(b=False, axis="x") self.predictedSignalWidget.canvas.axes.set_xticks(xpos) self.predictedSignalWidget.canvas.axes.set_xticklabels(bar_labels) self.predictedSignalWidget.canvas.axes.set_xlabel("Channels") self.predictedSignalWidget.canvas.axes.set_ylabel(r"% signal change") self.predictedSignalWidget.canvas.refresh()
def visualize_4ch(self): # self.visualchecksWidget # get raw data data = self.tableWidget.getVisibleData() if data.empty: alert("Warning!", "No data is loaded") return False else: columnsOK, missing = checkcolumns(data.columns) fraclabeled = data["frac_labeled"].unique().tolist() if not columnsOK: alert("Warning!", f"Columns {missing} are missing") return False if len(fraclabeled) < 3: alert("Warning!", f"You need at least 2 frac_labeled") return False # do checks on columns if columnsOK: # create a shorthand for the internal axes ax = self.visualchecksWidget.canvas.axes # last axis for linearity check self.visualchecksWidget.lasttwinax.clear() # clear previous plots (if any) for axes in ax.flat: axes.cla() overview( data, fighandles=(self.visualchecksWidget.canvas.figure, ax), twin_ax=self.visualchecksWidget.lasttwinax, ) self.visualchecksWidget.canvas.refresh() else: warnstr = f"Columns : {missing} missing from data table." alert("Warning!", warnstr)
def savefile(self): data = self.tableWidget._data_model.df if data.empty: alert("Warning", "Data table is empty") else: options = QFileDialog.Options() options |= QFileDialog.DontUseNativeDialog fileName, fileType = QFileDialog.getSaveFileName( self, "Save data table", "", "CSV files (*.csv);;Excel file (*.xlsx)", options=options, ) extension = ".csv" if "CSV" in fileType else ".xlsx" targetfile = Path(fileName).with_suffix(extension) if extension == ".csv": data.to_csv(targetfile, index=False) elif extension == ".xlsx": data.to_excel(targetfile, index=False)
def fit_phase_difference(self): data = self.tableWidget.getVisibleData() if self.currentfilepath is not None: exptname = self.currentfilepath.stem else: exptname = "DataNotLoaded" if data.empty: alert("Warning!", "No data is loaded") return False else: columnsOK, missing = checkcolumns(data.columns) fraclabeled = data["frac_labeled"].unique().tolist() if not columnsOK: alert("Warning!", f"Columns {missing} are missing") return False if len(fraclabeled) < 3: alert("Warning!", f"You need at least 2 frac_labeled") return False if columnsOK: self.experiment = AMPSexperiment(data, name=exptname) self.experiment.fit_phases() fitmsg = "P-polarization:\n" fitmsg += self.experiment.Pphases.optres.message fitmsg += "\nS-Polarization:\n" fitmsg += self.experiment.Sphases.optres.message alert("Phase determination", fitmsg) # extract parameters and put into GUI Pphase = self.experiment.pshg_phase Pphase_sigma = self.experiment.Pphases.optres.params["delphi"].stderr Pphase_error = ( np.rad2deg(Pphase_sigma) if Pphase_sigma is not None else np.nan ) self.Pphase_sigma_label.setText(f"±{Pphase_error:.2f}") Sphase = self.experiment.sshg_phase Sphase_sigma = self.experiment.Sphases.optres.params["delphi"].stderr Sphase_error = ( np.rad2deg(Sphase_sigma) if Sphase_sigma is not None else np.nan ) self.Sphase_sigma_label.setText(f"±{Sphase_error:.2f}") if Pphase > np.pi / 2.0: # destructive interference self.PinflectionSpinBox.setValue(self.experiment.p_inflection) else: # constructive has no inflection point self.PinflectionSpinBox.setValue(0.0) if Sphase > np.pi / 2.0: # destructive intereference self.SinflectionSpinBox.setValue(self.experiment.s_inflection) else: self.SinflectionSpinBox.setValue(0.0) Pbg = self.experiment.pshg_bg Sbg = self.experiment.sshg_bg self.phasePspinBox.setValue(np.rad2deg(Pphase)) self.backgroundPspinBox.setValue(Pbg) self.phaseSspinBox.setValue(np.rad2deg(Sphase)) self.backgroundSspinBox.setValue(Sbg) # create a shorthand for the internal axes ax = self.visualchecksWidget.canvas.axes # last axis for linearity check self.visualchecksWidget.lasttwinax.clear() # clear previous plots (if any) for axes in ax.flat: axes.cla() overview( data, fighandles=(self.visualchecksWidget.canvas.figure, ax), twin_ax=self.visualchecksWidget.lasttwinax, experiment=self.experiment, ) self.visualchecksWidget.canvas.refresh()