Пример #1
0
 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
Пример #2
0
    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()
Пример #3
0
    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)
Пример #4
0
    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)
Пример #5
0
    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()