def __init__(self, symbol): self.symbol = symbol self.Z = Xrf.atomic_number(self.symbol) self.show = False k_lines = { 'Ka': False, 'Ka1': True, 'Ka2': True, 'Kb': False, 'Kb1': True, 'Kb2': True } l_lines = { 'La1': False, 'Lb1': False, 'Lb2': False, 'Lg1': False, 'Lg2': False, 'Lg3': False, 'Lg4': False, 'Ll': False } g_lines = {'G1': True, 'G2': True, 'G3': True} self.toggles = { 'Ka': ['Ka1', 'Ka2'], 'Kb': ['Kb1', 'Kb2'], 'Ka1': ['Ka'], 'Kb1': ['Kb'], 'Ka2': ['Ka'], 'Kb2': ['Kb'] } # dict = {key: [e, selected]} self.k_selection = dict() for k in k_lines: e = Xrf.lookup_xrf_line(self.symbol + ' ' + k) #if (e != 0.): self.k_selection.update({k: [e, k_lines[k]]}) self.l_selection = dict() for l in l_lines: e = Xrf.lookup_xrf_line(self.symbol + ' ' + l) #if (e != 0.): show = False self.l_selection.update({l: [e, l_lines[l] or show]}) self.g_selection = dict() for g in g_lines: e = Xrf.lookup_xrf_line(self.symbol + ' ' + g) #if (e != 0.): self.g_selection.update({g: [e, g_lines[g]]}) self.all_lines = dict() self.all_lines.update(self.k_selection) self.all_lines.update(self.l_selection) self.all_lines.update(self.g_selection)
def menu_line(self, roi): """ Private method """ line = self.widgets.line[roi].text() energy = Xrf.lookup_xrf_line(line) if (energy == None): energy = Xrf.lookup_gamma_line(line) if (energy != None): self.roi[roi].energy = energy self.widgets.energy[roi].setText('%.3f' % energy) print('line: ' + line)
def search_by_symbol(self, symbol): ind = Xrf.atomic_index(symbol) if ind is not None: self.show_state_changed(0,True) self.xrf_tw.selectRow(ind-1) else: self.clear_xrf()
def cbs_changed(self, cb): curr_row = self.xrf_tw.currentRow() symbol = Xrf.atomic_symbol(curr_row+1) cur_atom = self.get_stored_atom(symbol) line = cb.text() cb_item = self.kl_cbs[line] checked = cb.isChecked() cur_atom.set_line_checked(line,checked) self.update_row(curr_row)
def xrf_roi_btn_clicked(self, index): symbol = Xrf.atomic_symbol( index+1) my_atom = self.get_stored_atom(symbol) xrf = dict() for cb in self.kl_cbs: line = self.kl_cbs[cb].text() e = my_atom.get_e(line) checked = my_atom.is_line_checked(line) if e != 0 and checked: xrf[symbol+' '+line] = e rois = [] for line in xrf: lbl = line E = xrf[line] fwhm = int(round(0.07936 * E + 4.95677)) rois.append([xrf[line],fwhm, lbl]) self.roi_controller.addROISbyE(rois)
def update_row(self,row): symbol = Xrf.atomic_symbol( row+1) if symbol is not None: my_atom = self.get_stored_atom(symbol) for cb in self.kl_cbs: line = self.kl_cbs[cb].text() e = my_atom.get_e(line) if e != 0: self.kl_cbs[cb].setEnabled(True) checked = my_atom.is_line_checked(line) self.kl_cbs[cb].setChecked(checked) self.kl_cbs[cb].setStyleSheet("") else: self.kl_cbs[cb].setEnabled(False) self.kl_cbs[cb].setChecked(False) self.kl_cbs[cb].setStyleSheet("color: rgb(100, 100, 100); ") self.show_state_changed(0,True) self.update_xrf_lines(symbol) self.xrf_selection_updated_signal.emit(symbol) self.blockSignals(True) self.search_item.setText(symbol) self.blockSignals(False)
def __init__(self, plotWidget, plotContoller, roiController, mca): super().__init__() self.set_mca(mca) # in future change to get cal. from plot model self.x_scale = 'E' self.pattern_widget = plotWidget self.roi_controller = roiController self.plotController = plotContoller self.log_scale = self.plotController.logMode self._layout = QtWidgets.QVBoxLayout() self.setWindowTitle('XRF control') self.button_widget = QtWidgets.QWidget(self) self.button_widget.setObjectName('xrfs_control_button_widget') self._button_layout = QtWidgets.QHBoxLayout() self._button_layout.setContentsMargins(0, 0, 0, 0) self._button_layout.setSpacing(6) self.add_btn = QtWidgets.QPushButton('Add ROIs') self.add_btn.clicked.connect(self.rois_btn_click_callback) self.clear_btn = QtWidgets.QPushButton('Clear') self.clear_btn.clicked.connect(self.clear_xrf) self._button_layout.addWidget(QtWidgets.QLabel('Search:'),0) self.search_item = s = QtWidgets.QLineEdit('') s.textChanged.connect(lambda:self.search_by_symbol(s.text())) self._button_layout.addWidget(self.search_item, 0) self._button_layout.addSpacerItem(HorizontalSpacerItem()) self._button_layout.addWidget(self.add_btn,0) self._button_layout.addWidget(self.clear_btn,0) self.button_widget.setLayout(self._button_layout) self._layout.addWidget(self.button_widget) self._body_layout = QtWidgets.QHBoxLayout() self.header = ['Z', 'Symbol'] self.cols = len(self.header) self.xrf_tw = ListTableWidget(columns=self.cols) self._body_layout.addWidget(self.xrf_tw) self.k_lines_tags = ['Ka','Ka1', 'Ka2','Kb', 'Kb1', 'Kb2'] self.l_lines_tags = ['La1', 'Lb1', 'Lb2', 'Lg1', 'Lg2', 'Lg3', 'Lg4', 'Ll'] self.g_lines_tags = ['G1','G2', 'G3'] self.parameter_widget = QtWidgets.QWidget() self._parameter_layout = QtWidgets.QGridLayout() self.k_cbs = dict() for k in self.k_lines_tags: k_line = QtWidgets.QCheckBox(k) k_line.setEnabled(False) k_line.toggled.connect(partial(self.cbs_changed, k_line)) self._parameter_layout.addWidget(k_line, 0, self.k_lines_tags.index(k)+2) self.k_cbs[k]=k_line self.l_cbs = dict() for l in self.l_lines_tags: l_line = QtWidgets.QCheckBox(l) l_line.setEnabled(False) l_line.toggled.connect(partial(self.cbs_changed, l_line)) self._parameter_layout.addWidget(l_line,1, self.l_lines_tags.index(l)+2) self.l_cbs[l]=l_line self.g_cbs = dict() for g in self.g_lines_tags: g_line = QtWidgets.QCheckBox(g) g_line.setEnabled(False) g_line.toggled.connect(partial(self.cbs_changed, g_line)) self._parameter_layout.addWidget(g_line,2, self.g_lines_tags.index(g)+2) self.g_cbs[g]=g_line self.parameter_widget.setLayout(self._parameter_layout) self._body_layout.addWidget(self.parameter_widget, 0) self._layout.addLayout(self._body_layout) self.setLayout(self._layout) self.style_widgets() self.xrf_show_cbs = [] self.name_items = [] self.index_items = [] self.kl_cbs = dict() self.kl_cbs.update(self.k_cbs) self.kl_cbs.update(self.l_cbs) self.kl_cbs.update(self.g_cbs) self.xrf = [] self.atoms = dict() #self.show_parameter_in_pattern = True header_view = QtWidgets.QHeaderView(QtCore.Qt.Horizontal, self.xrf_tw) self.xrf_tw.setHorizontalHeader(header_view) header_view.setResizeMode(0, QtWidgets.QHeaderView.Stretch) header_view.setResizeMode(1, QtWidgets.QHeaderView.Stretch) self.xrf_tw.setHorizontalHeaderLabels(self.header) #header_view.hide() self.xrf_tw.setItemDelegate(NoRectDelegate()) #self.xrf_tw.itemChanged.connect(self.xrf_name_item_changed) for atom in Xrf.atomic_symbols: self.add_xrf_row(Xrf.atomic_number(atom),atom) #self.xrf_tw.selectRow(Xrf.atomic_symbols.index(None)) color = self.add_xrf_plot() self.xrf_tw.currentCellChanged.connect(self.selection_changed) #self.xrf_tw.setColumnWidth(0, 35) self.plotController.unitUpdated.connect(self.update_x_scale) self.plotController.dataPlotUpdated.connect(self.update_all_xrf_lines)
def get_current_symbol (self): curr_row = self.xrf_tw.currentRow() if curr_row >=0: symbol = Xrf.atomic_symbol(curr_row+1) return symbol return None
def xrf_show_cb_changed(self, checkbox): #self.show_cb_state_changed.emit(self.xrf_show_cbs.index(checkbox), checkbox.isChecked()) symbol = Xrf.atomic_symbol(self.xrf_show_cbs.index(checkbox)+1) cur_atom = self.get_stored_atom(symbol) cur_atom.show = checkbox.isChecked()
def initUI(self): self.verticalLayout_4 = QtWidgets.QVBoxLayout(self) self.groupBox = QtWidgets.QGroupBox(self) self.container = self.groupBox self.gridLayout = QtWidgets.QGridLayout(self.container) self.gridLayout.setContentsMargins(7, 15, 7, 7) self.gridLayout.setSpacing(5) header = { 'ROI': 0, 'Use?': 1, 'Centroid': 2, 'FWHM': 3, 'Energy': 4, 'Fluor. line': 5, 'Energy error': 6 } row = 0 for key, col in header.items(): t = QtWidgets.QLabel(self.groupBox) t.setText(key) t.setAlignment(QtCore.Qt.AlignHCenter) #t.setMinimumSize(QtCore.QSize(60, 0)) self.gridLayout.addWidget(t, row, col, QtCore.Qt.AlignHCenter) for i in range(self.nrois): row = i + 1 t = QtWidgets.QLabel(self.groupBox) t.setText(str(i)) t.setAlignment(QtCore.Qt.AlignHCenter) self.gridLayout.addWidget(t, row, 0, QtCore.Qt.AlignHCenter) self.widgets.use_flag[i] = t = QtWidgets.QCheckBox(self.groupBox) t.setChecked(self.roi[i].use == 1) t.toggled.connect( functools.partial(self.menu_use, i) ) # lambda expression didn't work so using functools.partial instead self.gridLayout.addWidget(t, row, 1, QtCore.Qt.AlignHCenter) self.widgets.centroid[i] = t = QtWidgets.QLineEdit(self.groupBox) t.setText('%.3f' % self.roi[i].centroid) t.setFixedWidth(70) t.setAlignment(QtCore.Qt.AlignHCenter) t.returnPressed.connect(functools.partial(self.menu_centroid, i)) self.gridLayout.addWidget(t, row, 2, QtCore.Qt.AlignHCenter) self.widgets.fwhm[i] = t = QtWidgets.QLineEdit(self.groupBox) t.setText('%.3f' % self.roi[i].fwhm) t.setFixedWidth(70) t.setAlignment(QtCore.Qt.AlignHCenter) self.gridLayout.addWidget(t, row, 3, QtCore.Qt.AlignHCenter) # If the ROI energy is zero, then try to use the label to lookup an # XRF line energy self.roi[i].energy = 0 if (self.roi[i].energy == 0.0): self.roi[i].energy = Xrf.lookup_xrf_line(self.roi[i].label) if (self.roi[i].energy == None): self.roi[i].energy = Xrf.lookup_gamma_line( self.roi[i].label) if (self.roi[i].energy == None): self.roi[i].energy = 0.0 self.widgets.energy[i] = t = QtWidgets.QLineEdit(self.groupBox) t.setText('%.3f' % self.roi[i].energy) t.setFixedWidth(70) t.setAlignment(QtCore.Qt.AlignHCenter) t.returnPressed.connect(functools.partial(self.menu_energy, i)) self.gridLayout.addWidget(t, row, 4, QtCore.Qt.AlignHCenter) self.widgets.line[i] = t = QtWidgets.QLineEdit(self.groupBox) t.setText(self.roi[i].label) t.setFixedWidth(70) t.setAlignment(QtCore.Qt.AlignHCenter) self.widgets.line[i].returnPressed.connect( functools.partial(self.menu_line, i)) self.gridLayout.addWidget(t, row, 5, QtCore.Qt.AlignHCenter) self.widgets.energy_diff[i] = t = QtWidgets.QLineEdit( self.groupBox) t.setText('%.3f' % 0.0) t.setFixedWidth(70) t.setAlignment(QtCore.Qt.AlignHCenter) self.gridLayout.addWidget(t, row, 6, QtCore.Qt.AlignHCenter) self.verticalLayout_4.addWidget(self.groupBox) self.groupBox_2 = QtWidgets.QGroupBox(self) self.groupBox_2.setTitle("") self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.groupBox_2) self.horizontalLayout = QtWidgets.QHBoxLayout() self.lblCalibrationType = QtWidgets.QLabel(self.groupBox_2) self.lblCalibrationType.setText("Calibration type:") self.lblCalibrationType.setAlignment(QtCore.Qt.AlignRight) self.horizontalLayout.addWidget(self.lblCalibrationType) self.fit_type = QtWidgets.QComboBox(self.groupBox_2) self.fit_type.addItem('Linear') self.fit_type.addItem('Quadratic') self.horizontalLayout.addWidget(self.fit_type) # in QtDialong, setting default=False, autoDefault=False prevents button from default trigger by Enter key self.do_fit = QtWidgets.QPushButton(self.groupBox_2, default=False, autoDefault=False) self.do_fit.setText("Compute calibration") self.do_fit.clicked.connect(self.menu_do_fit) self.horizontalLayout.addWidget(self.do_fit) self.plot_cal = QtWidgets.QPushButton(self.groupBox_2, default=False, autoDefault=False) self.plot_cal.setText("Plot calibration error") self.plot_cal.clicked.connect(self.menu_plot_calibration) self.horizontalLayout.addWidget(self.plot_cal) self.plot_fwhm = QtWidgets.QPushButton(self.groupBox_2, default=False, autoDefault=False) self.plot_fwhm.setText("Plot FWHM") self.plot_fwhm.clicked.connect(self.menu_plot_fwhm) self.horizontalLayout.addWidget(self.plot_fwhm) self.verticalLayout_3.addLayout(self.horizontalLayout) self.verticalLayout_4.addWidget(self.groupBox_2) self.groupBox_3 = QtWidgets.QGroupBox(self) self.groupBox_3.setTitle("") self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.groupBox_3) self.gridLayout_2 = QtWidgets.QGridLayout() self.label_12 = QtWidgets.QLabel(self.groupBox_3) self.label_12.setText("Units") self.gridLayout_2.addWidget(self.label_12, 0, 1, 1, 1) self.label_13 = QtWidgets.QLabel(self.groupBox_3) self.label_13.setText("Offset") self.gridLayout_2.addWidget(self.label_13, 0, 2, 1, 1) self.label_14 = QtWidgets.QLabel(self.groupBox_3) self.label_14.setText("Slope") self.gridLayout_2.addWidget(self.label_14, 0, 3, 1, 1) self.label_15 = QtWidgets.QLabel(self.groupBox_3) self.label_15.setText("Quadratic") self.gridLayout_2.addWidget(self.label_15, 0, 4, 1, 1) self.label_11 = QtWidgets.QLabel(self.groupBox_3) self.label_11.setText("Calibration coefficients:") self.label_11.setAlignment(QtCore.Qt.AlignRight) self.gridLayout_2.addWidget(self.label_11, 1, 0, 1, 1) self.cal_units = t = QtWidgets.QLineEdit(self.groupBox_3) t.setText(self.calibration.units) t.setFixedWidth(90) self.gridLayout_2.addWidget(t, 1, 1, 1, 1) self.cal_offset = t = QtWidgets.QLineEdit(self.groupBox_3) t.setText('%.7f' % (self.calibration.offset)) t.setFixedWidth(90) self.gridLayout_2.addWidget(t, 1, 2, 1, 1) self.cal_slope = t = QtWidgets.QLineEdit(self.groupBox_3) t.setText('%.7f' % (self.calibration.slope)) t.setFixedWidth(90) self.gridLayout_2.addWidget(t, 1, 3, 1, 1) self.cal_quad = t = QtWidgets.QLineEdit(self.groupBox_3) t.setText('%.7f' % (self.calibration.quad)) t.setFixedWidth(90) self.gridLayout_2.addWidget(t, 1, 4, 1, 1) self.verticalLayout_2.addLayout(self.gridLayout_2) self.verticalLayout_4.addWidget(self.groupBox_3) self.groupBox_4 = QtWidgets.QGroupBox(self) self.groupBox_4.setTitle("") self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.groupBox_4) self.btnOK = QtWidgets.QPushButton(self.groupBox_4, default=False, autoDefault=False) self.btnOK.clicked.connect(functools.partial(self.menu_ok_cancel, 'OK')) self.btnOK.setText("OK") self.horizontalLayout_2.addWidget(self.btnOK) self.btnCancel = QtWidgets.QPushButton(self.groupBox_4, default=False, autoDefault=False) self.btnCancel.clicked.connect( functools.partial(self.menu_ok_cancel, 'Cancel')) self.btnCancel.setText("Cancel") self.horizontalLayout_2.addWidget(self.btnCancel) self.verticalLayout_4.addWidget(self.groupBox_4) self.setWindowTitle("Energy Calibration") self.groupBox.setTitle("Defined regions") self.setFixedSize(self.verticalLayout_4.sizeHint())