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})
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
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()