def setup2nd_385_test():
    fw = FitWidget.instance
    pw = PlotWidget.instance

    _path = r"C:\Users\dominik\Documents\RealTimeSync\Projects\2020-Bilirubin - 2nd half\UV-VIS\QY\new setup final\385 nm"
    # _path = r"C:\Users\Dominik\Documents\MUNI\Organic Photochemistry\RealTimeSync\Projects\2020-Bilirubin - 2nd half\UV-VIS\QY\Test 2ZE new setup\better one"

    fnames = [
        '2Z high conc 01/2Z high conc 01.txt',
        '2E high conc 01/2E high conc 01.txt'
    ]

    paths = []

    for fname in fnames:
        paths.append(os.path.join(_path, fname))

    au = AugmentedMatrix(len(paths), 1)

    for i in range(len(paths)):
        au.load_matrix(i, 0, paths[i])
        # au[i, 0].reduce(t_dim=2)

    # au[1, 0].crop_data(t1=3000)

    m = au.get_aug_LFP_matrix()

    pw.plot_matrix(m)
    SVDWidget.instance.set_data(m)
    fw.matrix = m
    fw._au = au
    Console.push_variables({'matrix': m})

    return au
def setup_test():
    fw = FitWidget.instance
    pw = PlotWidget.instance

    paths = []

    path_reactors = r"C:\Users\Dominik\Documents\MUNI\Organic Photochemistry\Projects\Python scripts\Photoreaction kinetics"

    paths.append(path_reactors + r"\Z_cut355.txt")
    paths.append(path_reactors + r"\E_cut355.txt")
    paths.append(path_reactors + r"\Z_cut470.txt")

    au = AugmentedMatrix(len(paths), 1)

    for i in range(len(paths)):
        au.load_matrix(i, 0, paths[i])
        au[i, 0].reduce(t_dim=2)

    m = au.get_aug_LFP_matrix()

    pw.plot_matrix(m)
    fw.matrix = m
    fw._au = au
    Console.push_variables({'matrix': m})

    return au
def setup2nd():
    fw = FitWidget.instance
    pw = PlotWidget.instance

    _path = r"C:\Users\dominik\Documents\RealTimeSync\Projects\2020-Bilirubin - 2nd half\UV-VIS\QY\Test 2ZE"
    # _path = r"C:\Users\dominik\Documents\RealTimeSync\Projects\2020-Bilirubin - 2nd half\UV-VIS\QY\Test 2ZE"

    fnames = ['low conc 1Z.txt', 'high conc 1E.txt']

    paths = []

    for fname in fnames:
        paths.append(os.path.join(_path, fname))

    au = AugmentedMatrix(len(paths), 1)

    for i in range(len(paths)):
        au.load_matrix(i, 0, paths[i])
        # au[i, 0].reduce(t_dim=2)

    # au[1, 0].crop_data(t1=3000)

    m = au.get_aug_LFP_matrix()

    pw.plot_matrix(m)
    SVDWidget.instance.set_data(m)
    fw.matrix = m
    fw._au = au
    Console.push_variables({'matrix': m})

    return au
def settup_baseline_test():
    fw = FitWidget.instance
    pw = PlotWidget.instance

    _path = r"C:\Users\dominik\Documents\GitHub Repositories\Jupyter-Tutorials\Photoreaction kinetics"

    fnames = ['D_test.txt', 'D_baseline_test.txt']

    paths = []

    for fname in fnames:
        paths.append(os.path.join(_path, fname))

    au = AugmentedMatrix(len(paths), 1)

    for i in range(len(paths)):
        au.load_matrix(i, 0, paths[i])
        # au[i, 0].reduce(t_dim=2)

    # au[1, 0].crop_data(t1=3000)

    m = au.get_aug_LFP_matrix()

    pw.plot_matrix(m)
    SVDWidget.instance.set_data(m)
    fw.matrix = m
    fw._au = au
    Console.push_variables({'matrix': m})

    return au
def setup4():
    fw = FitWidget.instance
    pw = PlotWidget.instance

    # path = r"C:\Users\Dominik\Documents\MUNI\Organic Photochemistry\Projects\2019-Bilirubin project\UV-VIS\QY measurement\Photodiode\new setup"

    paths = []

    path_reactors = r"C:\Users\dominik\Documents\Projects\Bilirubin\UV-Vis data\Kinetics Z degassed"

    paths.append(path_reactors + r"\355 nm (both modules)\cut.txt")
    paths.append(path_reactors + r"\355 nm (both modules)\cut.txt")
    paths.append(path_reactors + r"\405 nm (both modules)\cut.txt")
    paths.append(path_reactors + r"\450 nm (one module)\cut.txt")
    paths.append(path_reactors + r"\470 nm (one module)\cut.txt")
    paths.append(path_reactors +
                 r"\490 nm, then switched 355 nm (both modules)\cut490.txt")
    paths.append(path_reactors +
                 r"\490 nm, then switched 355 nm (both modules)\cut355.txt")

    au = AugmentedMatrix(len(paths), 1)

    for i in range(len(paths)):
        au.load_matrix(i, 0, paths[i])
        au[i, 0].reduce(t_dim=2)

    m = au.get_aug_LFP_matrix()

    pw.plot_matrix(m)
    fw.matrix = m
    fw._au = au
    Console.push_variables({'matrix': m})

    return au
    def change_to_fitted_data(self):
        fw = FitWidget.instance
        pw = PlotWidget.instance

        for i in range(self.r):
            C = self._C_indiv(i)
            self[i, 0].Y = C @ self.ST_aug

        self.construct_aug_matrix(True)
        m = self.get_aug_LFP_matrix()

        pw.plot_matrix(m)
        fw.matrix = m
        fw._au = self
        Console.push_variables({'matrix': m})
    def update_model_par_count(self, update_after_fit=False):
        """Updates text boxes from current model params and 'adds' or removes fields if necessary."""

        params_count = self.current_model.params.__len__()

        if not update_after_fit:
            species_count = self.current_model.n
            cb_fill_list = ['Unknown (MCR-ALS)'] + [
                self.current_model.species_names[i]
                for i in range(species_count)
            ]

            for i in range(self.max_species):
                cur_idx = self.C_conc_profile_list[i].currentIndex()
                self.C_conc_profile_list[i].clear()
                self.C_conc_profile_list[i].addItems(cb_fill_list)
                self.C_conc_profile_list[i].setCurrentIndex(
                    cur_idx if cur_idx >= 0 else 0)

            for i in range(self.max_params):
                visible = params_count > i

                self.params_list[i].setVisible(visible)
                self.lower_bound_list[i].setVisible(visible)
                self.value_list[i].setVisible(visible)
                self.upper_bound_list[i].setVisible(visible)
                self.fixed_list[i].setVisible(visible)
                self.error_list[i].setVisible(visible)

        values_errors = np.zeros((params_count, 2), dtype=np.float32)

        for i, p in enumerate(self.current_model.params.values()):
            self.params_list[i].setText(p.name)
            self.lower_bound_list[i].setText(f'{p.min:.3g}')
            self.upper_bound_list[i].setText(f'{p.max:.3g}')
            self.value_list[i].setText(f'{p.value:.6g}')
            self.fixed_list[i].setChecked(not p.vary)
            self.error_list[i].setText(
                f'{p.stderr:.2g}' if p.stderr is not None else '')

            values_errors[i, 0] = p.value
            values_errors[i, 1] = p.stderr if p.stderr is not None else 0

        if self.fitter.minimizer is not None and update_after_fit:
            self.fit_result = FitResult(self.fitter.last_result,
                                        self.fitter.minimizer, values_errors,
                                        self.current_model)
            Console.push_variables({'fit': self.fit_result})
Beispiel #8
0
    def setup_matrix(self, matrix, *args, **kwargs):

        if matrix is None or not isinstance(matrix, (LFP_matrix, str)):
            raise ValueError(
                f"matrix cannot be None or have to be type of {type(LFP_matrix)}"
            )

        if isinstance(matrix, str):
            matrix = lfp_parser.parse_file(matrix)

        self.matrix = matrix

        self.plot_widget.plot_matrix(self.matrix, **kwargs)
        self.SVD_widget.set_data(self.matrix)

        Console.push_variables({'matrix': self.matrix})
        self.fit_widget.matrix = self.matrix
        self.fit_widget.init_matrices()

        tail = os.path.split(matrix.filename)[1]
        name_of_file = os.path.splitext(tail)[0]  # without extension

        self.setWindowTitle(name_of_file + ' - Transient Spectra Analyzer')
def setup2(t1=1000):
    fw = FitWidget.instance
    pw = PlotWidget.instance

    path = r"C:\Users\Dominik\Documents\MUNI\Organic Photochemistry\Projects\2019-Bilirubin project\UV-VIS\Irradiation kinetics\for MCR\Kinetics Z"
    paths = []

    paths.append(path + r"\355 nm MeOH aerated 2 LED modules\cut.txt")
    paths.append(path + r"\375 nm MeOH aerated 2 LED modules\cut.txt")
    paths.append(
        r'C:\Users\Dominik\Documents\MUNI\Organic Photochemistry\Projects\2019-Bilirubin project\UV-VIS\QY measurement\Z start\365 nm LED irr, pinhole 3\kin.txt'
    )

    # paths.append(path + r"\375 nm MeOH aerated\cut.txt")
    paths.append(path + r"\400 nm MeOH aerated\cut.txt")
    paths.append(path + r"\450 nm MeOH aerated\cut.txt")
    paths.append(path + r"\490 nm MeOH aerated\cut.txt")
    # paths.append(path + r"\01_1000 uL MeOH\1000 uL bc cut.txt")

    au = AugmentedMatrix(len(paths), 1)

    for i in range(len(paths)):
        au.load_matrix(i, 0, paths[i])
        au[i, 0].crop_data(0, t1)

    # au[0, 0].crop_data(0, t1)
    # au[1, 0].crop_data(0, t1)
    # au[2, 0].crop_data(0, t1)

    m = au.get_aug_LFP_matrix()

    pw.plot_matrix(m)
    fw.matrix = m
    fw._au = au
    Console.push_variables({'matrix': m})

    return au
def setup3_half():
    fw = FitWidget.instance
    pw = PlotWidget.instance

    path = r"C:\Users\Dominik\Documents\MUNI\Organic Photochemistry\Projects\2019-Bilirubin project\UV-VIS\QY measurement\Photodiode\new setup"
    # path = r"C:\Users\dominik\Documents\Projects\Bilirubin\new setup"

    paths = []

    # paths.append(path + r"\Z 330 nm\cut.txt")
    # paths.append(path + r"\E 330 nm\cut.txt")
    #
    # paths.append(path + r"\Z 375 nm\cut.txt")
    #
    # paths.append(path + r"\Z 400 nm\cut.txt")
    # paths.append(path + r"\E 400 nm\cut.txt")
    #
    # paths.append(path + r"\Z 450 nm\cut.txt")
    #
    # paths.append(path + r"\Z 480 nm\cut.txt")
    # paths.append(path + r"\E 480 nm\cut.txt")

    paths.append(path + r"\Z 350p\cut.txt")
    paths.append(path + r"\E 350p\cut.txt")

    paths.append(path + r"\Z 410p\cut.txt")
    paths.append(path + r"\E 410p\cut.txt")

    paths.append(path + r"\Z 500p\cut.txt")
    paths.append(path + r"\E 500p\cut.txt")

    path += r"\reactor LEDs"
    #

    paths.append(path + r"\Z 355\cut.txt")
    paths.append(path + r"\Z 400\cut.txt")

    # paths.append(path + r"\450 nm (one module)\cut.txt")
    # paths.append(path + r"\470 nm (one module)\cut.txt")

    # paths.append(path + r"\Z 490\cut.txt")
    #
    paths.append(path + r"\HL 355\cut.txt")
    paths.append(path + r"\HL 400\cut.txt")

    au = AugmentedMatrix(len(paths), 1)

    for i in range(len(paths)):
        au.load_matrix(i, 0, paths[i])
        # au[i, 0].reduce(t_dim=2)

    au[-4, 0].crop_data(t1=3000)
    au[-3, 0].crop_data(t1=3000)

    m = au.get_aug_LFP_matrix()

    m.wavelengths += 230

    pw.plot_matrix(m)
    fw.matrix = m
    fw._au = au
    Console.push_variables({'matrix': m})

    return au
def setup3():
    fw = FitWidget.instance
    pw = PlotWidget.instance

    path = r"C:\Users\Dominik\Documents\MUNI\Organic Photochemistry\Projects\2019-Bilirubin project\UV-VIS\QY measurement\Photodiode\new setup"
    # path = r"C:\Users\dominik\Documents\Projects\Bilirubin\UV-Vis data"

    paths = []

    paths.append(path + r"\Z 330 nm\cut.txt")
    paths.append(path + r"\E 330 nm\cut.txt")

    paths.append(path + r"\Z 375 nm\cut.txt")

    paths.append(path + r"\Z 400 nm\cut.txt")
    paths.append(path + r"\E 400 nm\cut.txt")

    paths.append(path + r"\Z 450 nm\cut.txt")

    paths.append(path + r"\Z 480 nm\cut.txt")
    paths.append(path + r"\E 480 nm\cut.txt")

    # path_reactors = r"C:\Users\dominik\Documents\Projects\Bilirubin\UV-Vis data\Kinetics Z degassed"
    path += r"\reactor LEDs"

    path_reactors = r"C:\Users\Dominik\Documents\MUNI\Organic Photochemistry\Projects\2019-Bilirubin project\UV-VIS\Irradiation kinetics\for MCR\Kinetics Z degassed"
    #     #
    #     #
    #     # paths.append(path_reactors + r"\355 nm (both modules)\cut.txt")
    #     # paths.append(path_reactors + r"\375 nm (both modules)\cut.txt")
    #     # paths.append(path_reactors + r"\405 nm (both modules)\cut.txt")
    #     # paths.append(path_reactors + r"\450 nm (one module)\cut.txt")
    #     # paths.append(path_reactors + r"\470 nm (one module)\cut.txt")
    #     #
    #     # paths.append(path_reactors + r"\490 nm, then switched 355 nm (both modules)\cut490.txt")
    #     # paths.append(path_reactors + r"\490 nm, then switched 355 nm (both modules)\cut355.txt")

    paths.append(path + r"\Z 355\cut.txt")
    paths.append(path + r"\Z 400\cut.txt")

    paths.append(path_reactors + r"\450 nm (one module)\cut.txt")
    paths.append(path_reactors + r"\470 nm (one module)\cut.txt")

    paths.append(path + r"\Z 490\cut.txt")
    #
    paths.append(path + r"\HL 355\cut.txt")
    paths.append(path + r"\HL 400\cut.txt")

    # paths.append(path_reactors + r"\450 nm (one module)\cut.txt")
    # paths.append(path_reactors + r"\470 nm (one module)\cut.txt")

    au = AugmentedMatrix(len(paths), 1)

    for i in range(len(paths)):
        au.load_matrix(i, 0, paths[i])
        # au[i, 0].reduce(t_dim=2)

    au[-7, 0].crop_data(t1=3000)

    m = au.get_aug_LFP_matrix()

    m.wavelengths += 230

    pw.plot_matrix(m)
    fw.matrix = m
    fw._au = au
    Console.push_variables({'matrix': m})

    return au
Beispiel #12
0
    def __init__(self, parent=None):
        super(fMain, self).__init__(parent)

        self.setWindowTitle("Transient Spectra Analyzer")

        self.resize(1800, 1000)

        self.console = Console(self)
        self.matrix = None  # object of LFP matrix

        self.addDockWidget(Qt.RightDockWidgetArea, self.console)
        # fixing the resize bug https://stackoverflow.com/questions/48119969/qdockwidget-splitter-jumps-when-qmainwindow-resized
        # self.resizeDocks([self.dockTreeWidget], [270], Qt.Horizontal)
        self.resizeDocks([self.console], [200], Qt.Horizontal)
        # self.setCorner(Qt.BottomLeftCorner, Qt.LeftDockWidgetArea)

        self.coor_label = QLabel()  # coordinates

        self.plot_widget = PlotWidget(
            set_coordinate_func=self.coor_label.setText, parent=self)
        self.SVD_widget = SVDWidget(self)
        self.fit_widget = FitWidget(None, self)

        self.tabWidget = QtWidgets.QTabWidget(self)
        self.tabWidget.addTab(self.plot_widget, "Data")
        self.tabWidget.addTab(self.SVD_widget, "SVD + EFA")
        self.tabWidget.addTab(self.fit_widget, "Fit")

        self.tabWidget.currentChanged.connect(self.tabChanged)

        self.setCentralWidget(self.tabWidget)

        self.createStatusBar()
        self.logger = Logger(self.console.show_message,
                             self.statusBar().showMessage)
        sys.stdout = Transcript()

        self.user_namespace = UserNamespace(self)

        self.setMenuBar(MenuBar(self))
        Settings.load()

        self.update_recent_files()

        Console.push_variables({'main_widget': self})

        Console.execute_command(
            "from LFP_matrix import LFP_matrix\nimport fitmodels as m\n"
            "import matplotlib.pyplot as plt\nfrom Widgets.fit_widget import FitWidget\n"
            "import augmentedmatrix")

        Console.push_variables({'pw': self.plot_widget})
        Console.push_variables({'fw': self.fit_widget})
        Console.push_variables({'sw': self.SVD_widget})
    def __init__(self, matrix=None, parent=None):
        super(FitWidget, self).__init__(parent)
        self.setupUi(self)

        FitWidget.instance = self

        # reference to matrix in parent - instance of LFP_matrix
        self.matrix = matrix
        # visible ST and C matrices - used as initial estimates for fitter
        self._ST = None
        self._C = None
        self.D_fit = None
        self.fit_result = None
        self.plot_chirp = True
        self.fitter = Fitter()
        self.t_fit = None  # task fit

        self._au = None  # augmented matrix

        self.C_matrix_constraints = []

        Console.push_variables({'f': self.fitter})

        self.fit_plot_layout = FitLayout(None, self)
        self.main_layout.addWidget(self.fit_plot_layout)

        self.current_model = None

        self.classes = []

        # get all models from fitmodels, get classes that inherits from Model base class and sort them by name
        # and number of species
        classes = inspect.getmembers(sys.modules[fitmodels.__name__],
                                     inspect.isclass)
        tuples = list(
            filter(lambda tup: issubclass(tup[1], fitmodels._Model), classes))
        # self.models = sorted(list(map(lambda tup: tup[1], tuples)), key=lambda cls: (cls.name, cls.n))

        _classes = list(map(lambda tup: tup[1]._class, tuples))
        for cls in _classes:
            if cls == '-class-':
                continue
            if cls not in self.classes:
                self.classes.append(cls)
        self.classes.sort()

        # fill the combo box items with model names
        self.cbClass.addItems(self.classes)

        self.methods = [  # minimizing algorithms
            {
                'name': 'Levenberg–Marquardt',
                'abbr': 'leastsq'
            }, {
                'name': 'Trust-Region Reflective method',
                'abbr': 'least_squares'
            }, {
                'name': 'Nelder-Mead, Simplex method',
                'abbr': 'nelder'
            }, {
                'name': 'L-BFGS-B',
                'abbr': 'lbfgsb'
            }, {
                'name': 'Powell',
                'abbr': 'powell'
            }
        ]

        self.regressors = [
            {
                'name': 'OLS (Ordinary Least Squares)',
                'abbr': 'ols'
            },
            {
                'name': 'Ridge (fast OLS with Tikhonov regularization)',
                'abbr': 'ridge'
            },
            {
                'name': 'NNLS (Non-Negative Least Squares)',
                'abbr': 'nnls'
            },
        ]

        # fill the combo box items with method names
        self.cbMethod.addItems(map(lambda m: m['name'], self.methods))
        self.cbMethod.setCurrentIndex(1)
        self.cbRegressorC.addItems(map(lambda m: m['name'], self.regressors))
        self.cbRegressorS.addItems(map(lambda m: m['name'], self.regressors))

        self.btnFit.clicked.connect(self.fit)
        self.cbClass.currentIndexChanged.connect(self.model_class_changed)
        self.cbModel.currentIndexChanged.connect(self.model_changed)
        self.sbN.valueChanged.connect(self.sbN_value_changed)
        self.sbN.setMaximum(self.max_species)
        self.btnC_calc.clicked.connect(self.calc_C)
        self.btnST_calc.clicked.connect(self.calc_ST)
        self.btnOneIt.clicked.connect(self.one_iter_clicked)
        self.btnSimulateModel.clicked.connect(self.simulate_model_clicked)
        self.btnSetNMFSol.clicked.connect(self.set_NMF_solution)

        def _open_model_sett():
            self.update_params()
            self.current_model.open_model_settings()
            self.update_model_par_count()

        self.btnModelSettings.clicked.connect(_open_model_sett)

        # soft modeling

        self.species_label_list = []
        self.S_constrain_list = []
        self.ST_fix_list = []
        self.C_constrain_list = []
        self.C_conc_profile_list = []
        self.C_fix_list = []

        for i in range(self.max_species):
            self.species_label_list.append(QLabel(f'{i + 1}.'))
            self.S_constrain_list.append(ComboBoxCB())
            self.ST_fix_list.append(QCheckBox())
            self.C_constrain_list.append(ComboBoxCB())
            self.C_conc_profile_list.append(QComboBox())
            self.C_fix_list.append(QCheckBox())

            self.S_constrain_list[i].setSizePolicy(QSizePolicy.Ignored,
                                                   QSizePolicy.Preferred)
            self.C_constrain_list[i].setSizePolicy(QSizePolicy.Ignored,
                                                   QSizePolicy.Preferred)
            self.C_conc_profile_list[i].setSizePolicy(QSizePolicy.Ignored,
                                                      QSizePolicy.Preferred)

            self.S_constrain_list[i].setMinimumSize(1, 1)
            self.C_constrain_list[i].setMinimumSize(1, 1)
            self.C_conc_profile_list[i].setMinimumSize(1, 1)

            # self.species_list[i].setAlignment(Qt.AlignLeft)
            # Qt.AlignCenter

            self.glSC_setup.addWidget(self.species_label_list[i], i + 1, 0,
                                      Qt.AlignLeft, 1)
            self.glSC_setup.addWidget(self.S_constrain_list[i], i + 1, 1,
                                      Qt.AlignLeft, 1)
            self.glSC_setup.addWidget(self.ST_fix_list[i], i + 1, 2,
                                      Qt.AlignLeft, 1)
            self.glSC_setup.addWidget(self.C_constrain_list[i], i + 1, 4,
                                      Qt.AlignLeft, 1)
            self.glSC_setup.addWidget(self.C_conc_profile_list[i], i + 1, 5,
                                      Qt.AlignLeft, 1)
            self.glSC_setup.addWidget(self.C_fix_list[i], i + 1, 6,
                                      Qt.AlignLeft, 1)

        # kinetic hard modeling

        self.params_list = []
        self.lower_bound_list = []
        self.value_list = []
        self.upper_bound_list = []
        self.fixed_list = []
        self.error_list = []

        for i in range(self.max_params):
            self.params_list.append(QLabel())
            self.lower_bound_list.append(QLineEdit())
            self.value_list.append(QLineEdit())
            self.upper_bound_list.append(QLineEdit())
            self.fixed_list.append(QCheckBox())
            self.error_list.append(QLineEdit())

            self.glKinetics.addWidget(self.params_list[i], i + 1, 0, 1, 1)
            self.glKinetics.addWidget(self.lower_bound_list[i], i + 1, 1, 1, 1)
            self.glKinetics.addWidget(self.value_list[i], i + 1, 2, 1, 1)
            self.glKinetics.addWidget(self.upper_bound_list[i], i + 1, 3, 1, 1)
            self.glKinetics.addWidget(self.fixed_list[i], i + 1, 4, 1, 1)
            self.glKinetics.addWidget(self.error_list[i], i + 1, 5, 1, 1)

            self.fixed_list[i].stateChanged.connect(self.fixed_checked_changed)

        # setup_size_policy(self)

        self.cbClass.setCurrentIndex(2)
        self.model_class_changed()
        self.cbModel.setCurrentIndex(7)
        self.model_changed()
        self.sbN_value_changed()