Exemple #1
0
 def make_E_widgets(self):
     self.E_widget = QtWidgets.QWidget()
     self._layout = QtWidgets.QVBoxLayout()
     self._parameter_layout = QtWidgets.QGridLayout()
     self.E_low_sb = DoubleSpinBoxAlignRight()
     self.E_high_sb = DoubleSpinBoxAlignRight()
     self.E_low_sb.setMinimumWidth(100)
     self.E_high_sb.setMinimumWidth(100)
     self.E_low_sb.setMaximum(1000)
     self.E_low_sb.setMinimum(1)
     self.E_low_sb.setValue(34)
     self.E_low_sb.setMaximum(1000)
     self.E_low_sb.setMinimum(1)
     self.E_high_sb.setValue(68)
     self._parameter_layout.addWidget(QtWidgets.QLabel('E'), 1, 0)
     self._parameter_layout.addWidget(QtWidgets.QLabel('Low'), 0, 1)
     self._parameter_layout.addWidget(QtWidgets.QLabel('High'), 0, 2)
     self._parameter_layout.addWidget(QtWidgets.QLabel('KeV'), 1, 3)
     self._parameter_layout.addWidget(self.E_low_sb, 1, 1)
     self._parameter_layout.addWidget(self.E_high_sb, 1, 2)
     self._layout.addLayout(self._parameter_layout)
     self._layout.addSpacerItem(VerticalSpacerItem())
     self.E_widget.setLayout(self._layout)
     self.E_low_sb.valueChanged.connect(self.update)
     self.E_high_sb.valueChanged.connect(self.update)
Exemple #2
0
 def add_row_number_field(self, parent, option, text, value):
     button_widget = QtWidgets.QWidget(parent)
     button_widget.setObjectName(option)
     _button_layout = QtWidgets.QHBoxLayout()
     _button_layout.setContentsMargins(5, 5, 5, 5)
     #_button_layout.setSpacing(5)
     option_lbl = QtWidgets.QLabel(text)
     _button_layout.addSpacerItem(HorizontalSpacerItem())
     value_control = DoubleSpinBoxAlignRight()
     value_control.setMinimumWidth(120)
     value_control.setMaximum(10000)
     value_control.setDecimals(0)
     value_control.setValue(value)
     _button_layout.addWidget(option_lbl)
     _button_layout.addWidget(value_control)
     button_widget.setLayout(_button_layout)
     return [button_widget, value_control]
Exemple #3
0
    def make_beam_parameter_widget(self):

        self.beam_parameter_widget = QtWidgets.QWidget()
        self._beam_layout = QtWidgets.QVBoxLayout()
        self._beam_parameter_layout = QtWidgets.QGridLayout()

        self.tip_size_sb = DoubleSpinBoxAlignRight()
        self.tip_size_sb.setMinimumWidth(100)
        self.tip_size_sb.setMaximum(1000)
        self.tip_size_sb.setMinimum(5e-3)
        self.tip_size_sb.setValue(0.05)
        self.tip_size_sb.setDecimals(3)
        self.tip_size_sb.setSingleStep(0.005)

        self.tip_distance_sb = DoubleSpinBoxAlignRight()
        self.tip_distance_sb.setMinimumWidth(100)
        self.tip_distance_sb.setMaximum(10000)
        self.tip_distance_sb.setMinimum(1e-3)
        self.tip_distance_sb.setValue(60)

        self.det_distance_sb = DoubleSpinBoxAlignRight()
        self.det_distance_sb.setMinimumWidth(100)
        self.det_distance_sb.setMaximum(10000)
        self.det_distance_sb.setMinimum(1e-3)
        self.det_distance_sb.setValue(600)

        self._beam_parameter_layout.addWidget(
            QtWidgets.QLabel('Beam alignment parameters'), 0, 0, 1, 2)
        self._beam_parameter_layout.addWidget(QtWidgets.QLabel('Tip size'), 1,
                                              0)
        self._beam_parameter_layout.addWidget(QtWidgets.QLabel('Tip distance'),
                                              2, 0)
        self._beam_parameter_layout.addWidget(
            QtWidgets.QLabel('Detector distance'), 3, 0)
        #self._beam_parameter_layout.addWidget(QtWidgets.QLabel('mm'), 1, 3)
        self._beam_parameter_layout.addWidget(self.tip_size_sb, 1, 1)
        self._beam_parameter_layout.addWidget(self.tip_distance_sb, 2, 1)
        self._beam_parameter_layout.addWidget(self.det_distance_sb, 3, 1)
        self._beam_parameter_layout.addWidget(
            QtWidgets.QLabel(
                'D0: Collimation depth at the sample center (mm)'), 5, 0, 1, 2)
        self._beam_parameter_layout.addWidget(
            QtWidgets.QLabel('D1: Maximum collimation depth (mm)'), 6, 0, 1, 2)
        self._beam_layout.addLayout(self._beam_parameter_layout)
        self._beam_layout.addSpacerItem(VerticalSpacerItem())
        self.beam_parameter_widget.setLayout(self._beam_layout)
 def setupUi(self):
     
     self._layout = QtWidgets.QVBoxLayout()
     self.setWindowTitle(self.title)
     self.button_widget = QtWidgets.QWidget(self)
     self.button_widget.setObjectName('options_control_button_widget')
     self._button_layout = QtWidgets.QHBoxLayout()
     self._button_layout.setContentsMargins(0, 0, 0, 0)
     self._button_layout.setSpacing(15)
     self.apply_btn = FlatButton('Apply')
     self.apply_btn.clicked.connect(self.apply)
     self._button_layout.addWidget(self.apply_btn,0)
     #self._button_layout.addWidget(VerticalLine())
     self._button_layout.addSpacerItem(HorizontalSpacerItem())
     #self._button_layout.addWidget(VerticalLine())
     self.button_widget.setLayout(self._button_layout)
     
     self.parameter_widget = QtWidgets.QWidget()
     self._parameter_layout = QtWidgets.QGridLayout()
     self._parameter_layout.addWidget(QtWidgets.QLabel('Parameter'), 0, 1)
     self._parameter_layout.addWidget(QtWidgets.QLabel('Step'), 0, 3)
     self.opt_controls = {}
     
     i = 1
     for opt in self.opts_fields:
         self._parameter_layout.addWidget(QtWidgets.QLabel(self.opts_fields[opt]['label']), i, 0)
         self._parameter_layout.addWidget(QtWidgets.QLabel(self.opts_fields[opt]['unit']), i, 2)
         val=self.opts_fields[opt]['val']
         e = is_e(val)
         if e:
             o = NumberTextField()
         else:
             o = DoubleSpinBoxAlignRight()
         o.setObjectName(opt+"_control")
         o.setValue(val)
         o.setToolTip(self.opts_fields[opt]['desc'])
         o.setMinimum (self.opts_fields[opt]['step']) 
         o.setMinimumWidth(100)
         if not e:
             o.setSingleStep (self.opts_fields[opt]['step'])
             o_step = DoubleMultiplySpinBoxAlignRight()
             o_step.setObjectName(opt+"_control_step")
             o_step.setMinimum (0)
             step = self.opts_fields[opt]['step']
             o_step.setValue(self.opts_fields[opt]['step']) 
         if isinstance( self.opts_fields[opt]['val'], int):
             o.setDecimals(0)
             o.setMinimum(1)
             if not e:
                 o_step.setMinimum(1)
                 o_step.setDecimals(0)
         o_step.valueChanged.connect(partial(self.update_step, opt))
         self.opt_controls[opt]= {'val':o,'step':o_step}
         self._parameter_layout.addWidget(o, i, 1)
         self._parameter_layout.addWidget(o_step, i, 3)
         self._parameter_layout.addItem(HorizontalSpacerItem(), i, 4)
         i += 1
     self._parameter_layout.addItem(VerticalSpacerItem(), i, 0)
     self.parameter_widget.setLayout(self._parameter_layout)
     self._body_layout = QtWidgets.QHBoxLayout()
     self._body_layout.addWidget(self.parameter_widget, 0)
     self._layout.addLayout(self._body_layout)
     self._layout.addWidget(HorizontalLine())
     self._layout.addWidget(self.button_widget)
     self.setLayout(self._layout)
     self.retranslateUi(self)
     self.style_widgets()
Exemple #5
0
    def __init__(self):
        super(PhaseWidget, self).__init__()

        self._layout = QtWidgets.QVBoxLayout()
        self.setWindowTitle('Phase control')
        self.button_widget = QtWidgets.QWidget(self)
        self.button_widget.setObjectName('phase_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')
        self.edit_btn = QtWidgets.QPushButton('Edit')
        self.delete_btn = QtWidgets.QPushButton('Delete')
        self.clear_btn = QtWidgets.QPushButton('Clear')
        self.rois_btn = QtWidgets.QPushButton('Add ROIs')
        self.save_list_btn = QtWidgets.QPushButton('Save List')
        self.load_list_btn = QtWidgets.QPushButton('Load List')

        self._button_layout.addWidget(self.add_btn, 0)
        self._button_layout.addWidget(self.edit_btn, 0)
        self._button_layout.addWidget(self.delete_btn, 0)
        self._button_layout.addWidget(self.clear_btn, 0)
        self._button_layout.addWidget(self.rois_btn, 0)
        self._button_layout.addWidget(VerticalLine())
        self._button_layout.addSpacerItem(HorizontalSpacerItem())
        self._button_layout.addWidget(VerticalLine())
        self._button_layout.addWidget(self.save_list_btn, 0)
        self._button_layout.addWidget(self.load_list_btn, 0)
        self.button_widget.setLayout(self._button_layout)
        self._layout.addWidget(self.button_widget)

        self.parameter_widget = QtWidgets.QWidget()

        self._parameter_layout = QtWidgets.QGridLayout()
        self.pressure_sb = DoubleSpinBoxAlignRight()
        self.temperature_sb = DoubleSpinBoxAlignRight()
        self.pressure_step_msb = DoubleMultiplySpinBoxAlignRight()
        self.temperature_step_msb = DoubleMultiplySpinBoxAlignRight()
        self.apply_to_all_cb = QtWidgets.QCheckBox('Apply to all phases')
        self.show_in_pattern_cb = QtWidgets.QCheckBox('Show in Pattern')
        self.tth_lbl = DoubleSpinBoxAlignRight()

        self.tth_step = DoubleMultiplySpinBoxAlignRight()

        self.get_tth_btn = QtWidgets.QPushButton('Get')

        self._parameter_layout.addWidget(QtWidgets.QLabel('Parameter'), 0, 1)
        self._parameter_layout.addWidget(QtWidgets.QLabel('Step'), 0, 3)
        self._parameter_layout.addWidget(QtWidgets.QLabel('P:'), 1, 0)
        self._parameter_layout.addWidget(QtWidgets.QLabel('T:'), 2, 0)
        self._parameter_layout.addWidget(QtWidgets.QLabel('GPa'), 1, 2)
        self._parameter_layout.addWidget(QtWidgets.QLabel('K'), 2, 2)

        self._parameter_layout.addWidget(self.pressure_sb, 1, 1)
        self._parameter_layout.addWidget(self.pressure_step_msb, 1, 3)
        self._parameter_layout.addWidget(self.temperature_sb, 2, 1)
        self._parameter_layout.addWidget(self.temperature_step_msb, 2, 3)

        self._parameter_layout.addWidget(self.apply_to_all_cb, 3, 0, 1, 5)
        #self._parameter_layout.addWidget(self.show_in_pattern_cb, 4, 0, 1, 5)
        self._parameter_layout.addWidget(HorizontalLine(), 5, 0, 1, 5)
        self._parameter_layout.addItem(VerticalSpacerItem(), 6, 0)
        self._parameter_layout.addWidget(HorizontalLine(), 7, 0, 1, 5)
        self._parameter_layout.addWidget(QtWidgets.QLabel(u'2θ:'), 8, 0)
        self._parameter_layout.addWidget(self.tth_lbl, 8, 1)
        self._parameter_layout.addWidget(QtWidgets.QLabel('deg'), 8, 2)
        self._parameter_layout.addWidget(self.tth_step, 8, 3)
        self._parameter_layout.addWidget(self.get_tth_btn, 8, 4)

        self.parameter_widget.setLayout(self._parameter_layout)

        self._body_layout = QtWidgets.QHBoxLayout()
        self.phase_tw = ListTableWidget(columns=5)
        self._body_layout.addWidget(self.phase_tw)
        self._body_layout.addWidget(self.parameter_widget, 0)

        self._layout.addLayout(self._body_layout)

        self.setLayout(self._layout)

        self.style_widgets()

        self.phase_show_cbs = []
        self.phase_color_btns = []
        #self.phase_roi_btns = [] #add ROIs (RH)
        self.show_parameter_in_pattern = True
        header_view = QtWidgets.QHeaderView(QtCore.Qt.Horizontal,
                                            self.phase_tw)
        self.phase_tw.setHorizontalHeader(header_view)

        #header_view.setResizeMode(1, QtWidgets.QHeaderView.ResizeToContents)
        header_view.setResizeMode(2, QtWidgets.QHeaderView.Stretch)
        header_view.setResizeMode(3, QtWidgets.QHeaderView.ResizeToContents)
        header_view.setResizeMode(4, QtWidgets.QHeaderView.ResizeToContents)
        header_view.hide()
        self.phase_tw.setItemDelegate(NoRectDelegate())

        self.pressure_sb.valueChanged.connect(self.pressure_sb_changed)
        self.temperature_sb.valueChanged.connect(self.temperature_sb_changed)

        self.setAcceptDrops(True)
Exemple #6
0
class PhaseWidget(QtWidgets.QWidget):

    color_btn_clicked = QtCore.pyqtSignal(int, QtWidgets.QWidget)

    show_cb_state_changed = QtCore.pyqtSignal(int, bool)
    file_dragged_in = QtCore.pyqtSignal(list)

    pressure_sb_value_changed = QtCore.Signal(int, float)
    temperature_sb_value_changed = QtCore.Signal(int, float)

    def __init__(self):
        super(PhaseWidget, self).__init__()

        self._layout = QtWidgets.QVBoxLayout()
        self.setWindowTitle('Phase control')
        self.button_widget = QtWidgets.QWidget(self)
        self.button_widget.setObjectName('phase_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')
        self.edit_btn = QtWidgets.QPushButton('Edit')
        self.delete_btn = QtWidgets.QPushButton('Delete')
        self.clear_btn = QtWidgets.QPushButton('Clear')
        self.rois_btn = QtWidgets.QPushButton('Add ROIs')
        self.save_list_btn = QtWidgets.QPushButton('Save List')
        self.load_list_btn = QtWidgets.QPushButton('Load List')

        self._button_layout.addWidget(self.add_btn, 0)
        self._button_layout.addWidget(self.edit_btn, 0)
        self._button_layout.addWidget(self.delete_btn, 0)
        self._button_layout.addWidget(self.clear_btn, 0)
        self._button_layout.addWidget(self.rois_btn, 0)
        self._button_layout.addWidget(VerticalLine())
        self._button_layout.addSpacerItem(HorizontalSpacerItem())
        self._button_layout.addWidget(VerticalLine())
        self._button_layout.addWidget(self.save_list_btn, 0)
        self._button_layout.addWidget(self.load_list_btn, 0)
        self.button_widget.setLayout(self._button_layout)
        self._layout.addWidget(self.button_widget)

        self.parameter_widget = QtWidgets.QWidget()

        self._parameter_layout = QtWidgets.QGridLayout()
        self.pressure_sb = DoubleSpinBoxAlignRight()
        self.temperature_sb = DoubleSpinBoxAlignRight()
        self.pressure_step_msb = DoubleMultiplySpinBoxAlignRight()
        self.temperature_step_msb = DoubleMultiplySpinBoxAlignRight()
        self.apply_to_all_cb = QtWidgets.QCheckBox('Apply to all phases')
        self.show_in_pattern_cb = QtWidgets.QCheckBox('Show in Pattern')
        self.tth_lbl = DoubleSpinBoxAlignRight()

        self.tth_step = DoubleMultiplySpinBoxAlignRight()

        self.get_tth_btn = QtWidgets.QPushButton('Get')

        self._parameter_layout.addWidget(QtWidgets.QLabel('Parameter'), 0, 1)
        self._parameter_layout.addWidget(QtWidgets.QLabel('Step'), 0, 3)
        self._parameter_layout.addWidget(QtWidgets.QLabel('P:'), 1, 0)
        self._parameter_layout.addWidget(QtWidgets.QLabel('T:'), 2, 0)
        self._parameter_layout.addWidget(QtWidgets.QLabel('GPa'), 1, 2)
        self._parameter_layout.addWidget(QtWidgets.QLabel('K'), 2, 2)

        self._parameter_layout.addWidget(self.pressure_sb, 1, 1)
        self._parameter_layout.addWidget(self.pressure_step_msb, 1, 3)
        self._parameter_layout.addWidget(self.temperature_sb, 2, 1)
        self._parameter_layout.addWidget(self.temperature_step_msb, 2, 3)

        self._parameter_layout.addWidget(self.apply_to_all_cb, 3, 0, 1, 5)
        #self._parameter_layout.addWidget(self.show_in_pattern_cb, 4, 0, 1, 5)
        self._parameter_layout.addWidget(HorizontalLine(), 5, 0, 1, 5)
        self._parameter_layout.addItem(VerticalSpacerItem(), 6, 0)
        self._parameter_layout.addWidget(HorizontalLine(), 7, 0, 1, 5)
        self._parameter_layout.addWidget(QtWidgets.QLabel(u'2θ:'), 8, 0)
        self._parameter_layout.addWidget(self.tth_lbl, 8, 1)
        self._parameter_layout.addWidget(QtWidgets.QLabel('deg'), 8, 2)
        self._parameter_layout.addWidget(self.tth_step, 8, 3)
        self._parameter_layout.addWidget(self.get_tth_btn, 8, 4)

        self.parameter_widget.setLayout(self._parameter_layout)

        self._body_layout = QtWidgets.QHBoxLayout()
        self.phase_tw = ListTableWidget(columns=5)
        self._body_layout.addWidget(self.phase_tw)
        self._body_layout.addWidget(self.parameter_widget, 0)

        self._layout.addLayout(self._body_layout)

        self.setLayout(self._layout)

        self.style_widgets()

        self.phase_show_cbs = []
        self.phase_color_btns = []
        #self.phase_roi_btns = [] #add ROIs (RH)
        self.show_parameter_in_pattern = True
        header_view = QtWidgets.QHeaderView(QtCore.Qt.Horizontal,
                                            self.phase_tw)
        self.phase_tw.setHorizontalHeader(header_view)

        #header_view.setResizeMode(1, QtWidgets.QHeaderView.ResizeToContents)
        header_view.setResizeMode(2, QtWidgets.QHeaderView.Stretch)
        header_view.setResizeMode(3, QtWidgets.QHeaderView.ResizeToContents)
        header_view.setResizeMode(4, QtWidgets.QHeaderView.ResizeToContents)
        header_view.hide()
        self.phase_tw.setItemDelegate(NoRectDelegate())

        self.pressure_sb.valueChanged.connect(self.pressure_sb_changed)
        self.temperature_sb.valueChanged.connect(self.temperature_sb_changed)

        self.setAcceptDrops(True)

    def pressure_sb_changed(self):
        cur_ind = self.get_selected_phase_row()
        pressure = self.pressure_sb.value()
        self.pressure_sb_value_changed.emit(cur_ind, pressure)

    def temperature_sb_changed(self):
        cur_ind = self.get_selected_phase_row()
        temperature = self.temperature_sb.value()
        self.temperature_sb_value_changed.emit(cur_ind, temperature)

    def style_widgets(self):
        self.phase_tw.setSizePolicy(QtWidgets.QSizePolicy.Expanding,
                                    QtWidgets.QSizePolicy.MinimumExpanding)
        self.parameter_widget.setSizePolicy(QtWidgets.QSizePolicy.Minimum,
                                            QtWidgets.QSizePolicy.Minimum)
        self.phase_tw.setMinimumHeight(120)

        self.temperature_step_msb.setMaximumWidth(75)
        self.pressure_step_msb.setMaximumWidth(75)
        self.tth_step.setMaximumWidth(75)
        self.get_tth_btn.setMaximumWidth(75)

        self.pressure_sb.setMinimumWidth(100)

        self.pressure_sb.setMaximum(9999999)
        self.pressure_sb.setMinimum(-9999999)
        self.pressure_sb.setValue(0)

        self.pressure_step_msb.setMaximum(1000.0)
        self.pressure_step_msb.setMinimum(0.01)
        self.pressure_step_msb.setValue(0.2)

        self.temperature_sb.setMaximum(99999999)
        self.temperature_sb.setMinimum(0)
        self.temperature_sb.setValue(298)

        self.temperature_step_msb.setMaximum(1000.0)
        self.temperature_step_msb.setMinimum(1.0)
        self.temperature_step_msb.setValue(50.0)

        self.tth_lbl.setMaximum(179.0)
        self.tth_lbl.setMinimum(1)
        self.tth_lbl.setDecimals(5)
        self.tth_step.setMaximum(180)
        self.tth_step.setMinimum(0.001)
        self.tth_step.setValue(1)
        self.tth_step.setDecimals(3)

        self.setStyleSheet("""
            #phase_control_button_widget QPushButton {
                min-width: 70;
            }
        """)

        self.apply_to_all_cb.setChecked(True)
        self.show_in_pattern_cb.setChecked(True)

    # ###############################################################################################
    # Now comes all the phase tw stuff
    ################################################################################################

    def add_phase(self, name, color):
        self.phase_tw.blockSignals(True)
        current_rows = self.phase_tw.rowCount()
        self.phase_tw.setRowCount(current_rows + 1)

        show_cb = QtWidgets.QCheckBox()
        show_cb.setChecked(True)
        show_cb.stateChanged.connect(
            partial(self.phase_show_cb_changed, show_cb))
        show_cb.setStyleSheet("background-color: transparent")
        self.phase_tw.setCellWidget(current_rows, 0, show_cb)
        self.phase_show_cbs.append(show_cb)

        color_button = FlatButton()
        color_button.setStyleSheet("background-color: " + color)
        color_button.clicked.connect(
            partial(self.phase_color_btn_click, color_button))
        self.phase_tw.setCellWidget(current_rows, 1, color_button)
        self.phase_color_btns.append(color_button)

        name_item = QtWidgets.QTableWidgetItem(name)
        name_item.setFlags(name_item.flags() & ~QtCore.Qt.ItemIsEditable)
        name_item.setTextAlignment(QtCore.Qt.AlignLeft
                                   | QtCore.Qt.AlignVCenter)
        self.phase_tw.setItem(current_rows, 2, name_item)

        pressure_item = QtWidgets.QTableWidgetItem('0 GPa')
        pressure_item.setFlags(pressure_item.flags()
                               & ~QtCore.Qt.ItemIsEditable)
        pressure_item.setTextAlignment(QtCore.Qt.AlignRight
                                       | QtCore.Qt.AlignVCenter)
        self.phase_tw.setItem(current_rows, 3, pressure_item)

        temperature_item = QtWidgets.QTableWidgetItem('298 K')
        temperature_item.setFlags(temperature_item.flags()
                                  & ~QtCore.Qt.ItemIsEditable)
        temperature_item.setTextAlignment(QtCore.Qt.AlignRight
                                          | QtCore.Qt.AlignVCenter)
        self.phase_tw.setItem(current_rows, 4, temperature_item)

        self.phase_tw.setColumnWidth(0, 35)
        self.phase_tw.setColumnWidth(1, 25)
        self.phase_tw.setRowHeight(current_rows, 25)
        self.select_phase(current_rows)
        self.phase_tw.blockSignals(False)

    def select_phase(self, ind):
        self.phase_tw.selectRow(ind)

    def get_selected_phase_row(self):
        selected = self.phase_tw.selectionModel().selectedRows()
        try:
            row = selected[0].row()
        except IndexError:
            row = -1
        return row

    def get_phase(self):
        pass

    def del_phase(self, ind):
        self.phase_tw.blockSignals(True)
        self.phase_tw.removeRow(ind)
        self.phase_tw.blockSignals(False)
        del self.phase_show_cbs[ind]
        del self.phase_color_btns[ind]

        if self.phase_tw.rowCount() > ind:
            self.select_phase(ind)
        else:
            self.select_phase(self.phase_tw.rowCount() - 1)

    def rename_phase(self, ind, name):
        name_item = self.phase_tw.item(ind, 2)
        name_item.setText(name)

    def set_phase_temperature(self, ind, T):
        temperature_item = self.phase_tw.item(ind, 4)
        try:
            temperature_item.setText("{0:.2f} K".format(T))
        except ValueError:
            temperature_item.setText("{0} K".format(T))

    def get_phase_temperature(self, ind):
        temperature_item = self.phase_tw.item(ind, 4)
        try:
            temperature = float(str(temperature_item.text()).split()[0])
        except:
            temperature = None
        return temperature

    def set_phase_pressure(self, ind, P):
        pressure_item = self.phase_tw.item(ind, 3)
        try:
            pressure_item.setText("{0:.2f} GPa".format(P))
        except ValueError:
            pressure_item.setText("{0} GPa".format(P))

    def get_phase_pressure(self, ind):
        pressure_item = self.phase_tw.item(ind, 3)
        pressure = float(str(pressure_item.text()).split()[0])
        return pressure

    def phase_color_btn_click(self, button):
        self.color_btn_clicked.emit(self.phase_color_btns.index(button),
                                    button)

    def phase_show_cb_changed(self, checkbox):
        self.show_cb_state_changed.emit(self.phase_show_cbs.index(checkbox),
                                        checkbox.isChecked())

    def phase_show_cb_set_checked(self, ind, state):
        checkbox = self.phase_show_cbs[ind]
        checkbox.setChecked(state)

    def phase_show_cb_is_checked(self, ind):
        checkbox = self.phase_show_cbs[ind]
        return checkbox.isChecked()

    def raise_widget(self):
        self.show()
        self.setWindowState(self.windowState() & ~QtCore.Qt.WindowMinimized
                            | QtCore.Qt.WindowActive)
        self.activateWindow()
        self.raise_()

        ########################################################################################

    def dragEnterEvent(self, e):
        if e.mimeData().hasUrls:
            e.accept()
        else:
            e.ignore()

    def dragMoveEvent(self, e):
        if e.mimeData().hasUrls:
            e.accept()
        else:
            e.ignore()

    def dropEvent(self, e):
        """
        Drop files directly onto the widget

        File locations are stored in fname
        :param e:
        :return:
        """
        if e.mimeData().hasUrls:
            e.setDropAction(QtCore.Qt.CopyAction)
            e.accept()
            fnames = list()
            for url in e.mimeData().urls():
                fname = str(url.toLocalFile())
                fnames.append(fname)
            self.file_dragged_in.emit(fnames)
        else:
            e.ignore()

    def show_error_msg(self, msg):
        msg_box = QtWidgets.QMessageBox(self)
        msg_box.setWindowFlags(QtCore.Qt.Tool)
        msg_box.setText(msg)
        msg_box.setIcon(QtWidgets.QMessageBox.Critical)
        msg_box.setWindowTitle('Error')
        msg_box.setStandardButtons(QtWidgets.QMessageBox.Ok)
        msg_box.setDefaultButton(QtWidgets.QMessageBox.Ok)
        msg_box.exec_()
Exemple #7
0
    def __init__(self, model):
        super(hklGenWidget, self).__init__()
        self.model = model
        self._layout = QtWidgets.QVBoxLayout()  
        self.setWindowTitle('Space Group control')
        self.button_widget = QtWidgets.QWidget(self)
        self.button_widget.setObjectName('cell_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('New')
        self.edit_btn = QtWidgets.QPushButton('Edit')
        self.delete_btn = QtWidgets.QPushButton('Delete')
        self.clear_btn = QtWidgets.QPushButton('Clear')
        self.rois_btn = QtWidgets.QPushButton('Add ROIs')
        self.save_list_btn = QtWidgets.QPushButton('Save List')
        self.load_list_btn = QtWidgets.QPushButton('Load List')

        # 2th
        self.tth_lbl = DoubleSpinBoxAlignRight()
        self.tth_step = DoubleMultiplySpinBoxAlignRight()
        self.get_tth_btn = QtWidgets.QPushButton('Get')

        self._button_layout.addWidget(self.add_btn,0)
        #self._button_layout.addWidget(self.edit_btn,0)
        self._button_layout.addWidget(self.delete_btn,0)
        self._button_layout.addWidget(self.clear_btn,0)
        self._button_layout.addWidget(self.rois_btn,0)
        #self._button_layout.addWidget(VerticalLine())
        self._button_layout.addSpacerItem(HorizontalSpacerItem())
        #self._button_layout.addWidget(VerticalLine())
        #self._button_layout.addWidget(self.save_list_btn,0)
        #self._button_layout.addWidget(self.load_list_btn,0)
        self.button_widget.setLayout(self._button_layout)
        self._layout.addWidget(self.button_widget)


        self.symmetry_widget = QtWidgets.QWidget()
        self._symmetry_layout = QtWidgets.QVBoxLayout()
        self._symmetry_layout.setContentsMargins(0, 0, 0, 0)
        self.symmetry_opts = {}
        self.symmetry_parameters = ('CUBIC',
                                'TETRAGONAL',
                                'ORTHORHOMBIC',
                                'HEXAGONAL',
                                "TRIGONAL",
                                'RHOMBOHEDRAL',
                                'MONOCLINIC',
                                'TRICLINIC')
        for s in self.symmetry_parameters:
            o = s[0]+s[1:].lower()
            opt = QtWidgets.QRadioButton(o)
            opt.clicked.connect(partial(self.symmetry_edited_callback,o))
            self.symmetry_opts[s] = opt
            self._symmetry_layout.addWidget(opt)
        self.symmetry_widget.setLayout(self._symmetry_layout)

        self.lattice_widget = QtWidgets.QWidget()
        self._lattice_layout = QtWidgets.QVBoxLayout()
        self.spgrp_widget = QtWidgets.QWidget()
        self._spgrp_layout = QtWidgets.QHBoxLayout()
        self._spgrp_layout.setContentsMargins(0, 0, 0, 0)
        self.spgrp_lbl = QtWidgets.QLabel('Space Group:')
        self.spgrp_tb = QtWidgets.QLineEdit('P 2 3')
        self.spgrp_tb.setMaximumWidth(80)
        self.spgrp_tb.setMinimumWidth(80)
        self._spgrp_layout.addWidget(self.spgrp_lbl)
        self._spgrp_layout.addWidget(self.spgrp_tb)
        self._spgrp_layout.addSpacerItem(HorizontalSpacerItem())
        self.spgrp_widget.setLayout(self._spgrp_layout)
        self._lattice_layout.addWidget(self.spgrp_widget)
        self.lattice_opts = {}
        self.lattice_opts_steps = {}
        self.lattice_parameters = ('a','b','c',
                                'alpha',"beta",'gamma')
        default_step = 0.1
        default_decimals = 4
        for s in self.lattice_parameters:
            lattice_opt = QtWidgets.QWidget()
            _lattice_opt_layout = QtWidgets.QHBoxLayout()
            _lattice_opt_layout.setContentsMargins(0, 0, 0, 0)
            opt_lbl = QtWidgets.QLabel(s)
            opt = DoubleSpinBoxAlignRight()
            opt.setDecimals(default_decimals)
            opt.setValue(0.)
            opt.setSingleStep(default_step)
            opt.setMinimumWidth(90)
            opt.setMaximum(1000)
            opt.valueChanged.connect(partial(self.lattice_parameter_edited_callback, s))
            opt_step = DoubleMultiplySpinBoxAlignRight()
            opt_step.setDecimals(default_decimals)
            opt_step.setMinimumWidth(60)
            opt_step.setValue(default_step)
            opt_step.editingFinished.connect(partial(self.update_lattice_param_step, s))
            _lattice_opt_layout.addWidget(opt_lbl)
            _lattice_opt_layout.addWidget(opt)
            _lattice_opt_layout.addWidget(opt_step)
            lattice_opt.setLayout(_lattice_opt_layout)
            self.lattice_opts[s] = opt
            self.lattice_opts_steps[s] = opt_step
            self._lattice_layout.addWidget(lattice_opt)


        self.tth_widget = QtWidgets.QWidget()
        self._tth_layout = QtWidgets.QGridLayout()
        self._tth_layout.addWidget(QtWidgets.QLabel(u'2θ:'), 0, 0)
        self._tth_layout.addWidget(self.tth_lbl, 0, 1)
        self._tth_layout.addWidget(QtWidgets.QLabel('deg'), 0, 2)
        self._tth_layout.addWidget(self.tth_step, 0, 3)
        self._tth_layout.addWidget(self.get_tth_btn, 0, 4)
        self.tth_widget.setLayout(self._tth_layout)
        self._lattice_layout.addWidget(self.tth_widget)

        self.lattice_widget.setLayout(self._lattice_layout)

        



        self._body_layout = QtWidgets.QHBoxLayout()


        self.cell_tw = TreeView()
        #self._tm=self.model

        #self.cell_tw.setSortingEnabled(True)
        self.cell_tw.setModel(self.model)

        #self.setSelectionMode(QAbstractItemView.ExtendedSelection)  # <- optional
        selection_model = self.cell_tw.selectionModel()
        selection_model.selectionChanged.connect(self.cell_selection_changed)

        self.cell_tw.setColumnWidth(0, 50)
        self.cell_tw.setColumnWidth(1, 25)
        self.cell_tw.setColumnWidth(2, 50)
        self.cell_tw.header().hide()
        
        self.cell_tw.setMaximumWidth(175)

        self._body_layout.addWidget(self.cell_tw )


        self._body_layout.addWidget(self.symmetry_widget)
        self._body_layout.addWidget(self.lattice_widget)

        self.hkl_widget = QtWidgets.QTextEdit()
        self.hkl_widget.setMaximumWidth(175)
        self._body_layout.addWidget(self.hkl_widget)

        self._layout.addLayout(self._body_layout)

        self.setLayout(self._layout)
        
        self.style_widgets()

        self.cell_show_cbs = []
        self.cell_color_btns = []
        self.cell_roi_btns = [] #add ROIs 
        self.show_parameter_in_pattern = True
        #header_view = QtWidgets.QHeaderView(QtCore.Qt.Horizontal, self.cell_tw)
        #self.cell_tw.setHorizontalHeader(header_view)
        
        
        #header_view.hide()
        s#elf.cell_tw.setItemDelegate(NoRectDelegate())

        
     
        self.setAcceptDrops(True) 
Exemple #8
0
class hklGenWidget(QtWidgets.QWidget):

    color_btn_clicked = QtCore.pyqtSignal(int, QtWidgets.QWidget)
    
    show_cb_state_changed = QtCore.pyqtSignal(int, bool)
    file_dragged_in = QtCore.pyqtSignal(list)
    symmetry_edited_signal = QtCore.pyqtSignal(str)
    lattice_parameter_edited_signal = QtCore.pyqtSignal(dict)

    cell_selection_edited_signal = QtCore.pyqtSignal(int)

    def __init__(self, model):
        super(hklGenWidget, self).__init__()
        self.model = model
        self._layout = QtWidgets.QVBoxLayout()  
        self.setWindowTitle('Space Group control')
        self.button_widget = QtWidgets.QWidget(self)
        self.button_widget.setObjectName('cell_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('New')
        self.edit_btn = QtWidgets.QPushButton('Edit')
        self.delete_btn = QtWidgets.QPushButton('Delete')
        self.clear_btn = QtWidgets.QPushButton('Clear')
        self.rois_btn = QtWidgets.QPushButton('Add ROIs')
        self.save_list_btn = QtWidgets.QPushButton('Save List')
        self.load_list_btn = QtWidgets.QPushButton('Load List')

        # 2th
        self.tth_lbl = DoubleSpinBoxAlignRight()
        self.tth_step = DoubleMultiplySpinBoxAlignRight()
        self.get_tth_btn = QtWidgets.QPushButton('Get')

        self._button_layout.addWidget(self.add_btn,0)
        #self._button_layout.addWidget(self.edit_btn,0)
        self._button_layout.addWidget(self.delete_btn,0)
        self._button_layout.addWidget(self.clear_btn,0)
        self._button_layout.addWidget(self.rois_btn,0)
        #self._button_layout.addWidget(VerticalLine())
        self._button_layout.addSpacerItem(HorizontalSpacerItem())
        #self._button_layout.addWidget(VerticalLine())
        #self._button_layout.addWidget(self.save_list_btn,0)
        #self._button_layout.addWidget(self.load_list_btn,0)
        self.button_widget.setLayout(self._button_layout)
        self._layout.addWidget(self.button_widget)


        self.symmetry_widget = QtWidgets.QWidget()
        self._symmetry_layout = QtWidgets.QVBoxLayout()
        self._symmetry_layout.setContentsMargins(0, 0, 0, 0)
        self.symmetry_opts = {}
        self.symmetry_parameters = ('CUBIC',
                                'TETRAGONAL',
                                'ORTHORHOMBIC',
                                'HEXAGONAL',
                                "TRIGONAL",
                                'RHOMBOHEDRAL',
                                'MONOCLINIC',
                                'TRICLINIC')
        for s in self.symmetry_parameters:
            o = s[0]+s[1:].lower()
            opt = QtWidgets.QRadioButton(o)
            opt.clicked.connect(partial(self.symmetry_edited_callback,o))
            self.symmetry_opts[s] = opt
            self._symmetry_layout.addWidget(opt)
        self.symmetry_widget.setLayout(self._symmetry_layout)

        self.lattice_widget = QtWidgets.QWidget()
        self._lattice_layout = QtWidgets.QVBoxLayout()
        self.spgrp_widget = QtWidgets.QWidget()
        self._spgrp_layout = QtWidgets.QHBoxLayout()
        self._spgrp_layout.setContentsMargins(0, 0, 0, 0)
        self.spgrp_lbl = QtWidgets.QLabel('Space Group:')
        self.spgrp_tb = QtWidgets.QLineEdit('P 2 3')
        self.spgrp_tb.setMaximumWidth(80)
        self.spgrp_tb.setMinimumWidth(80)
        self._spgrp_layout.addWidget(self.spgrp_lbl)
        self._spgrp_layout.addWidget(self.spgrp_tb)
        self._spgrp_layout.addSpacerItem(HorizontalSpacerItem())
        self.spgrp_widget.setLayout(self._spgrp_layout)
        self._lattice_layout.addWidget(self.spgrp_widget)
        self.lattice_opts = {}
        self.lattice_opts_steps = {}
        self.lattice_parameters = ('a','b','c',
                                'alpha',"beta",'gamma')
        default_step = 0.1
        default_decimals = 4
        for s in self.lattice_parameters:
            lattice_opt = QtWidgets.QWidget()
            _lattice_opt_layout = QtWidgets.QHBoxLayout()
            _lattice_opt_layout.setContentsMargins(0, 0, 0, 0)
            opt_lbl = QtWidgets.QLabel(s)
            opt = DoubleSpinBoxAlignRight()
            opt.setDecimals(default_decimals)
            opt.setValue(0.)
            opt.setSingleStep(default_step)
            opt.setMinimumWidth(90)
            opt.setMaximum(1000)
            opt.valueChanged.connect(partial(self.lattice_parameter_edited_callback, s))
            opt_step = DoubleMultiplySpinBoxAlignRight()
            opt_step.setDecimals(default_decimals)
            opt_step.setMinimumWidth(60)
            opt_step.setValue(default_step)
            opt_step.editingFinished.connect(partial(self.update_lattice_param_step, s))
            _lattice_opt_layout.addWidget(opt_lbl)
            _lattice_opt_layout.addWidget(opt)
            _lattice_opt_layout.addWidget(opt_step)
            lattice_opt.setLayout(_lattice_opt_layout)
            self.lattice_opts[s] = opt
            self.lattice_opts_steps[s] = opt_step
            self._lattice_layout.addWidget(lattice_opt)


        self.tth_widget = QtWidgets.QWidget()
        self._tth_layout = QtWidgets.QGridLayout()
        self._tth_layout.addWidget(QtWidgets.QLabel(u'2θ:'), 0, 0)
        self._tth_layout.addWidget(self.tth_lbl, 0, 1)
        self._tth_layout.addWidget(QtWidgets.QLabel('deg'), 0, 2)
        self._tth_layout.addWidget(self.tth_step, 0, 3)
        self._tth_layout.addWidget(self.get_tth_btn, 0, 4)
        self.tth_widget.setLayout(self._tth_layout)
        self._lattice_layout.addWidget(self.tth_widget)

        self.lattice_widget.setLayout(self._lattice_layout)

        



        self._body_layout = QtWidgets.QHBoxLayout()


        self.cell_tw = TreeView()
        #self._tm=self.model

        #self.cell_tw.setSortingEnabled(True)
        self.cell_tw.setModel(self.model)

        #self.setSelectionMode(QAbstractItemView.ExtendedSelection)  # <- optional
        selection_model = self.cell_tw.selectionModel()
        selection_model.selectionChanged.connect(self.cell_selection_changed)

        self.cell_tw.setColumnWidth(0, 50)
        self.cell_tw.setColumnWidth(1, 25)
        self.cell_tw.setColumnWidth(2, 50)
        self.cell_tw.header().hide()
        
        self.cell_tw.setMaximumWidth(175)

        self._body_layout.addWidget(self.cell_tw )


        self._body_layout.addWidget(self.symmetry_widget)
        self._body_layout.addWidget(self.lattice_widget)

        self.hkl_widget = QtWidgets.QTextEdit()
        self.hkl_widget.setMaximumWidth(175)
        self._body_layout.addWidget(self.hkl_widget)

        self._layout.addLayout(self._body_layout)

        self.setLayout(self._layout)
        
        self.style_widgets()

        self.cell_show_cbs = []
        self.cell_color_btns = []
        self.cell_roi_btns = [] #add ROIs 
        self.show_parameter_in_pattern = True
        #header_view = QtWidgets.QHeaderView(QtCore.Qt.Horizontal, self.cell_tw)
        #self.cell_tw.setHorizontalHeader(header_view)
        
        
        #header_view.hide()
        s#elf.cell_tw.setItemDelegate(NoRectDelegate())

        
     
        self.setAcceptDrops(True) 

    def style_widgets(self):

      
        self.tth_step.setMaximumWidth(75)
        self.get_tth_btn.setMaximumWidth(75)

        self.tth_lbl.setMaximum(179.0)
        self.tth_lbl.setMinimum(1)
        self.tth_lbl.setDecimals(5)
        self.tth_step.setMaximum(180)
        self.tth_step.setMinimum(0.001)
        self.tth_step.setValue(1)
        self.tth_step.setDecimals(3)

        
        
        self.setStyleSheet("""
            #cell_control_button_widget QPushButton {
                min-width: 70;
            }
        """)

    def update_lattice_param_step(self, lattice_parameter):
        opt_step = self.lattice_opts_steps[lattice_parameter]
        value = round(opt_step.value(), 4)
        self.lattice_opts[lattice_parameter].setSingleStep(value)
        
    # ###############################################################################################
    # Now comes all the cell tw stuff
    ################################################################################################

    def cell_selection_changed(self):
        selected = self.get_selected_row()
        self.cell_selection_edited_signal.emit(selected)
    
    def get_selected_row(self):
        selected = self.cell_tw.selectionModel().selectedRows()
        try:
            row = selected[0].row()
        except IndexError:
            row = -1
        return row

    def lattice_parameter_edited_callback(self, key):
        opt = self.lattice_opts[key]
        new_val = round(opt.value(), 6)
        param = {key:new_val}
        self.lattice_parameter_edited_signal.emit(param)

    def symmetry_edited_callback(self, symmetry):
        opt = self.symmetry_opts[symmetry.upper()]
        checked = opt.isChecked()
        if checked:
            self.symmetry_edited_signal.emit(symmetry)

    def set_cell(self, params, params_enabled):
        for key in params:
            if key in self.lattice_opts:
                param = params[key]
                opt = self.lattice_opts[key]
                opt.blockSignals(True)
                opt.setValue(float(param))
                opt.blockSignals(False)
        spgrp = params['spacegroup']
        symm = params['symmetry']

        self.spgrp_tb.blockSignals(True)
        self.spgrp_tb.setText(spgrp)
        self.spgrp_tb.blockSignals(False)

        sym_opt = self.symmetry_opts[symm.upper()]
        sym_opt.blockSignals(True)
        sym_opt.setChecked(True)
        sym_opt.blockSignals(False)

        self.set_params_enabled(params_enabled)

        # this makes the button show, QTreeView quirk when using a QItemDelegate
        for row in range(0, self.model.rowCount()):
            self.cell_tw.openPersistentEditor(self.model.index(row, 1))

    def set_params_enabled(self, params):
        for key in params:
            if key in self.lattice_opts:
                param_enabled = params[key]
                self.lattice_opts[key].setEnabled(param_enabled)

    def select_cell(self, ind):
        self.cell_tw.selectRow(ind)

    def del_cell(self, ind):
        self.cell_tw.blockSignals(True)
        self.cell_tw.removeRow(ind)
        self.cell_tw.blockSignals(False)
        del self.cell_show_cbs[ind]
        del self.cell_color_btns[ind]

        if self.cell_tw.rowCount() > ind:
            self.select_cell(ind)
        else:
            self.select_cell(self.cell_tw.rowCount() - 1)
    
    def rename_cell(self, ind, name):
        name_item = self.cell_tw.item(ind, 2)
        name_item.setText(name)


    def raise_widget(self):
        self.show()
        #self.setWindowState(self.windowState() & ~QtCore.Qt.WindowMinimized | QtCore.Qt.WindowActive)
        self.activateWindow()
        self.raise_()
Exemple #9
0
    def __init__(self):
        super().__init__()
        self._layout = QtWidgets.QVBoxLayout()  
        self.setWindowTitle('Cut regions control')
        self.button_widget = QtWidgets.QWidget(self)
        self.button_widget.setObjectName('rois_control_button_widget')
        self._button_layout = QtWidgets.QHBoxLayout()
        self._button_layout.setContentsMargins(0, 0, 0, 0)
        self._button_layout.setSpacing(15)
        #self.add_btn = FlatButton('Add')
        #self.edit_btn = FlatButton('Edit')
        self.delete_btn = FlatButton('Delete')
        self.clear_btn = FlatButton('Clear')
        #self.show_fit_btn = FlatButton('Show')
        self.edit_btn = FlatButton('Edit')
        self.filter_btn = FlatButton(f'Filter 2\N{GREEK SMALL LETTER THETA}')
        self.filter_btn.setCheckable(True)
        self.filter_btn.setChecked(True)

        
        self._button_layout.addWidget(self.edit_btn)
        self._button_layout.addWidget(self.delete_btn)
        self._button_layout.addWidget(self.clear_btn)
        self._button_layout.addWidget(self.filter_btn)
        self._button_layout.addSpacerItem(HorizontalSpacerItem())

        self.button_widget.setLayout(self._button_layout)
        self._layout.addWidget(self.button_widget)
        self._body_layout = QtWidgets.QHBoxLayout()
        self.roi_tw = ListTableWidget(columns=3)
        self._body_layout.addWidget(self.roi_tw, 10)


####  Start peak parameters widget

        self.baseline_params = QtWidgets.QWidget()
        self.baseline_params_layout = QtWidgets.QGridLayout()

        self.baseline_params_V_layout = QtWidgets.QVBoxLayout()

        self.cut_peak_Wn = DoubleSpinBoxAlignRight()
        self.cut_peak_Wn.setMinimumWidth(90)
        self.cut_peak_Wn.setMinimum(0.001)
        self.cut_peak_Wn.setMaximum(1)
        self.cut_peak_Wn.setValue(0.2)
        self.cut_peak_Wn.setDecimals(3)
        #self.cut_peak_Wn.setSingleStep(0.1)

        
        self.cut_peak_iter = DoubleSpinBoxAlignRight()
        self.cut_peak_iter.setMinimumWidth(90)
        self.cut_peak_iter.setMinimum(1)
        self.cut_peak_iter.setMaximum(50)
        self.cut_peak_iter.setValue(50)
        self.cut_peak_iter.setDecimals(0)
        #self.cut_peak_iter.setSingleStep(5)

        self.cut_peak_Wn_step = DoubleMultiplySpinBoxAlignRight()
        self.cut_peak_Wn_step.setDecimals(3)
        self.cut_peak_Wn_step.setMinimumWidth(70)
        self.cut_peak_iter_step = DoubleMultiplySpinBoxAlignRight()
        self.cut_peak_iter_step.setDecimals(0)
        self.cut_peak_iter_step.setMinimumWidth(70)

        self.cut_peak_Wn_step.valueChanged.connect(partial(self.update_step, \
                                                    self.cut_peak_Wn,self.cut_peak_Wn_step))

        self.cut_peak_iter_step.valueChanged.connect(partial(self.update_step, \
                                                    self.cut_peak_iter,self.cut_peak_iter_step))

        self.cut_peak_Wn_step.setValue(0.1)
        self.cut_peak_iter_step.setValue(5)

        self.cut_peak_method_spline_choice = QtWidgets.QRadioButton(text="Spline")
        self.cut_peak_method_baseline_choice = QtWidgets.QRadioButton(text="Baseline")
        self.cut_peak_method_baseline_choice.setChecked(True)
        

        self.cut_peak_label = QtWidgets.QLabel("Peak cutting parameters")
        self.cut_peak_Wn_label = QtWidgets.QLabel("W<sub>n</sub>")
        self.cut_peak_iter_label = QtWidgets.QLabel("Iterations")
        self.cut_peak_method_label = QtWidgets.QLabel("Method")

        
        self.baseline_params_layout.addWidget(self.cut_peak_label,0,0,1,2)
        self.baseline_params_layout.addWidget(self.cut_peak_method_label,1,0)
        self.baseline_params_layout.addWidget(self.cut_peak_method_baseline_choice,1,1)
        self.baseline_params_layout.addWidget(self.cut_peak_method_spline_choice,1,2)

        self.baseline_params_layout.addWidget(self.cut_peak_Wn_label,2,0)
        self.baseline_params_layout.addWidget(self.cut_peak_iter_label,3,0)
        self.baseline_params_layout.addWidget(self.cut_peak_Wn,2,1)
        self.baseline_params_layout.addWidget(self.cut_peak_iter,3,1)
        self.baseline_params_layout.addWidget(self.cut_peak_Wn_step,2,2)
        self.baseline_params_layout.addWidget(self.cut_peak_iter_step,3,2)

        self.baseline_params_apply_all = QtWidgets.QCheckBox('Apply to all')
        self.baseline_params_apply_all.setChecked(False)
        #self.baseline_params_layout.addWidget(self.baseline_params_apply_all,3,0,1,2)
        

        self.baseline_params.setLayout(self.baseline_params_layout)
        self.baseline_params_V_layout.addWidget(self.baseline_params)
        self.baseline_params_V_layout.addSpacerItem(VerticalSpacerItem())

        # End peak parameters widget

        self._body_layout.addLayout(self.baseline_params_V_layout)



        self._layout.addLayout(self._body_layout)

        
        self.button_2_widget = QtWidgets.QWidget(self)
        self.button_2_widget.setObjectName('rois_control_button_2_widget')
        self._button_2_layout = QtWidgets.QHBoxLayout()
        self._button_2_layout.setContentsMargins(0, 0, 0, 0)
        self._button_2_layout.setSpacing(6)
        self.apply_btn = FlatButton('Apply')
        self._button_2_layout.addWidget(self.apply_btn,0)
        #self._button_2_layout.addWidget(VerticalLine())
        self._button_2_layout.addSpacerItem(HorizontalSpacerItem())
        #self._button_2_layout.addWidget(VerticalLine())
        self.button_2_widget.setLayout(self._button_2_layout)
        self._layout.addWidget(HorizontalLine())
        self._layout.addWidget(self.button_2_widget)
        

        


        self.setLayout(self._layout)

        self.style_widgets()
        self.roi_show_cbs = []
        self.name_items = []
        self.tth_items = []
       
        self.show_parameter_in_pattern = True
        header_view = QtWidgets.QHeaderView(QtCore.Qt.Horizontal, self.roi_tw)
        self.roi_tw.setHorizontalHeader(header_view)
        header_view.setResizeMode(0, QtWidgets.QHeaderView.ResizeToContents)
        header_view.setResizeMode(1, QtWidgets.QHeaderView.Stretch)
        
        self.default_header = [' Cut ', 'E range', f'2\N{GREEK SMALL LETTER THETA}']
        self.header = copy.deepcopy(self.default_header)
        self.roi_tw.setHorizontalHeaderLabels(self.header)
        #header_view.hide()
        self.roi_tw.setItemDelegate(NoRectDelegate())
        self.create_connections()
Exemple #10
0
class aEDXDRoiWidget(QtWidgets.QWidget):

    color_btn_clicked = QtCore.pyqtSignal(int, QtWidgets.QWidget)
    
    show_cb_state_changed = QtCore.pyqtSignal(dict)
    name_item_changed = QtCore.pyqtSignal(int, str)
    widget_closed = QtCore.pyqtSignal()
    roi_selection_changed_signal = QtCore.pyqtSignal(dict)

    def __init__(self):
        super().__init__()
        self._layout = QtWidgets.QVBoxLayout()  
        self.setWindowTitle('Cut regions control')
        self.button_widget = QtWidgets.QWidget(self)
        self.button_widget.setObjectName('rois_control_button_widget')
        self._button_layout = QtWidgets.QHBoxLayout()
        self._button_layout.setContentsMargins(0, 0, 0, 0)
        self._button_layout.setSpacing(15)
        #self.add_btn = FlatButton('Add')
        #self.edit_btn = FlatButton('Edit')
        self.delete_btn = FlatButton('Delete')
        self.clear_btn = FlatButton('Clear')
        #self.show_fit_btn = FlatButton('Show')
        self.edit_btn = FlatButton('Edit')
        self.filter_btn = FlatButton(f'Filter 2\N{GREEK SMALL LETTER THETA}')
        self.filter_btn.setCheckable(True)
        self.filter_btn.setChecked(True)

        
        self._button_layout.addWidget(self.edit_btn)
        self._button_layout.addWidget(self.delete_btn)
        self._button_layout.addWidget(self.clear_btn)
        self._button_layout.addWidget(self.filter_btn)
        self._button_layout.addSpacerItem(HorizontalSpacerItem())

        self.button_widget.setLayout(self._button_layout)
        self._layout.addWidget(self.button_widget)
        self._body_layout = QtWidgets.QHBoxLayout()
        self.roi_tw = ListTableWidget(columns=3)
        self._body_layout.addWidget(self.roi_tw, 10)


####  Start peak parameters widget

        self.baseline_params = QtWidgets.QWidget()
        self.baseline_params_layout = QtWidgets.QGridLayout()

        self.baseline_params_V_layout = QtWidgets.QVBoxLayout()

        self.cut_peak_Wn = DoubleSpinBoxAlignRight()
        self.cut_peak_Wn.setMinimumWidth(90)
        self.cut_peak_Wn.setMinimum(0.001)
        self.cut_peak_Wn.setMaximum(1)
        self.cut_peak_Wn.setValue(0.2)
        self.cut_peak_Wn.setDecimals(3)
        #self.cut_peak_Wn.setSingleStep(0.1)

        
        self.cut_peak_iter = DoubleSpinBoxAlignRight()
        self.cut_peak_iter.setMinimumWidth(90)
        self.cut_peak_iter.setMinimum(1)
        self.cut_peak_iter.setMaximum(50)
        self.cut_peak_iter.setValue(50)
        self.cut_peak_iter.setDecimals(0)
        #self.cut_peak_iter.setSingleStep(5)

        self.cut_peak_Wn_step = DoubleMultiplySpinBoxAlignRight()
        self.cut_peak_Wn_step.setDecimals(3)
        self.cut_peak_Wn_step.setMinimumWidth(70)
        self.cut_peak_iter_step = DoubleMultiplySpinBoxAlignRight()
        self.cut_peak_iter_step.setDecimals(0)
        self.cut_peak_iter_step.setMinimumWidth(70)

        self.cut_peak_Wn_step.valueChanged.connect(partial(self.update_step, \
                                                    self.cut_peak_Wn,self.cut_peak_Wn_step))

        self.cut_peak_iter_step.valueChanged.connect(partial(self.update_step, \
                                                    self.cut_peak_iter,self.cut_peak_iter_step))

        self.cut_peak_Wn_step.setValue(0.1)
        self.cut_peak_iter_step.setValue(5)

        self.cut_peak_method_spline_choice = QtWidgets.QRadioButton(text="Spline")
        self.cut_peak_method_baseline_choice = QtWidgets.QRadioButton(text="Baseline")
        self.cut_peak_method_baseline_choice.setChecked(True)
        

        self.cut_peak_label = QtWidgets.QLabel("Peak cutting parameters")
        self.cut_peak_Wn_label = QtWidgets.QLabel("W<sub>n</sub>")
        self.cut_peak_iter_label = QtWidgets.QLabel("Iterations")
        self.cut_peak_method_label = QtWidgets.QLabel("Method")

        
        self.baseline_params_layout.addWidget(self.cut_peak_label,0,0,1,2)
        self.baseline_params_layout.addWidget(self.cut_peak_method_label,1,0)
        self.baseline_params_layout.addWidget(self.cut_peak_method_baseline_choice,1,1)
        self.baseline_params_layout.addWidget(self.cut_peak_method_spline_choice,1,2)

        self.baseline_params_layout.addWidget(self.cut_peak_Wn_label,2,0)
        self.baseline_params_layout.addWidget(self.cut_peak_iter_label,3,0)
        self.baseline_params_layout.addWidget(self.cut_peak_Wn,2,1)
        self.baseline_params_layout.addWidget(self.cut_peak_iter,3,1)
        self.baseline_params_layout.addWidget(self.cut_peak_Wn_step,2,2)
        self.baseline_params_layout.addWidget(self.cut_peak_iter_step,3,2)

        self.baseline_params_apply_all = QtWidgets.QCheckBox('Apply to all')
        self.baseline_params_apply_all.setChecked(False)
        #self.baseline_params_layout.addWidget(self.baseline_params_apply_all,3,0,1,2)
        

        self.baseline_params.setLayout(self.baseline_params_layout)
        self.baseline_params_V_layout.addWidget(self.baseline_params)
        self.baseline_params_V_layout.addSpacerItem(VerticalSpacerItem())

        # End peak parameters widget

        self._body_layout.addLayout(self.baseline_params_V_layout)



        self._layout.addLayout(self._body_layout)

        
        self.button_2_widget = QtWidgets.QWidget(self)
        self.button_2_widget.setObjectName('rois_control_button_2_widget')
        self._button_2_layout = QtWidgets.QHBoxLayout()
        self._button_2_layout.setContentsMargins(0, 0, 0, 0)
        self._button_2_layout.setSpacing(6)
        self.apply_btn = FlatButton('Apply')
        self._button_2_layout.addWidget(self.apply_btn,0)
        #self._button_2_layout.addWidget(VerticalLine())
        self._button_2_layout.addSpacerItem(HorizontalSpacerItem())
        #self._button_2_layout.addWidget(VerticalLine())
        self.button_2_widget.setLayout(self._button_2_layout)
        self._layout.addWidget(HorizontalLine())
        self._layout.addWidget(self.button_2_widget)
        

        


        self.setLayout(self._layout)

        self.style_widgets()
        self.roi_show_cbs = []
        self.name_items = []
        self.tth_items = []
       
        self.show_parameter_in_pattern = True
        header_view = QtWidgets.QHeaderView(QtCore.Qt.Horizontal, self.roi_tw)
        self.roi_tw.setHorizontalHeader(header_view)
        header_view.setResizeMode(0, QtWidgets.QHeaderView.ResizeToContents)
        header_view.setResizeMode(1, QtWidgets.QHeaderView.Stretch)
        
        self.default_header = [' Cut ', 'E range', f'2\N{GREEK SMALL LETTER THETA}']
        self.header = copy.deepcopy(self.default_header)
        self.roi_tw.setHorizontalHeaderLabels(self.header)
        #header_view.hide()
        self.roi_tw.setItemDelegate(NoRectDelegate())
        self.create_connections()


    def update_step(self, control, step_control):
        
        value = step_control.value()
        control.setSingleStep(value)


    def create_connections(self):
        self.roi_tw.currentCellChanged.connect(self.roi_selection_changed)

    

    def style_widgets(self):
        self.roi_tw.setSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.MinimumExpanding)
        self.roi_tw.setMinimumWidth(370)
        self.roi_tw.setMinimumHeight(110)
        self.setStyleSheet("""
            #rois_control_button_widget FlatButton {
                max-width: 70;
                min-width: 70;
            }
            #rois_control_button_2_widget FlatButton {
                max-width: 70;
                min-width: 70;
            }
        """)

    def closeEvent(self, event):
        # Overrides close event to let controller know that widget was closed by user
        self.widget_closed.emit()

    


    ################################################################################################
    # Now comes all the roi tw stuff
    ################################################################################################

    def roi_selection_changed(self, row, **kwargs):
        tth = None
        name = None
        if len(self.tth_items):
            tth = float(self.tth_items[row].text())
            name = self.name_items[row].text()
            
        self.roi_selection_changed_signal.emit({'tth':tth,'name' :name})

    def set_tw_header_unit(self, unit, unit_=''):
        if unit_ !='':
            unit_=' ('+unit_+')'
        self.header[2] = self.default_header[2] + ', '+unit+unit_
        self.roi_tw.setHorizontalHeaderLabels(self.header)
    
    def filter_tth(self, fltr_tth):
        print(fltr_tth)

    def add_roi(self, use, name,tth):
        self.roi_tw.blockSignals(True)
        current_rows = self.roi_tw.rowCount()
        self.roi_tw.setRowCount(current_rows + 1)


        show_cb = QtWidgets.QCheckBox()
        show_cb.setChecked(use)
        show_cb.stateChanged.connect(partial(self.roi_show_cb_changed, show_cb))
        show_cb.setStyleSheet("background-color: transparent")
        self.roi_tw.setCellWidget(current_rows, 0, show_cb)
        self.roi_show_cbs.append(show_cb)
        

        name_item = QtWidgets.QTableWidgetItem(name)
        name_item.setText(name)
        #name_item.setFlags(name_item.flags() & ~QtCore.Qt.ItemIsEditable)
        name_item.setTextAlignment(QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter)
        self.roi_tw.setItem(current_rows, 1, name_item)
        self.name_items.append(name_item)

        tth_item = QtWidgets.QTableWidgetItem(tth)
        tth_item.setText(tth)
        #tth_item.setFlags(tth_item.flags() & ~QtCore.Qt.ItemIsEditable)
        tth_item.setTextAlignment(QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter)
        self.roi_tw.setItem(current_rows, 2, tth_item)
        self.tth_items.append(tth_item)

        self.roi_tw.setColumnWidth(0, 50)
        self.roi_tw.setRowHeight(current_rows, 25)
        self.roi_tw.blockSignals(False)

    
    
        
    def select_roi(self, ind):
        self.roi_tw.selectRow(ind)
        
    def get_selected_roi_row(self):
        tth = None
        name = None
        row = -1
        selected = self.roi_tw.selectionModel().selectedRows()
        if len(selected):
            row = selected[0].row()
            if len(self.tth_items):
                tth = float(self.tth_items[row].text())
                name = self.name_items[row].text()
                
        return {'tth':tth,'name' :name,'row':row}

    def get_selected_roi_name(self):
        selected = self.roi_tw.selectionModel().selectedRows()
        try:
            row = selected[0].row()
            name = self.name_items[row].text()
        except IndexError:
            row = -1
            name = ''
        return name

    def get_selected_roi_tth(self):
        selected = self.roi_tw.selectionModel().selectedRows()
        try:
            row = selected[0].row()
            tth_str = self.tth_items[row].text()
            tth = float(tth_str)
        except IndexError:
            row = -1
            tth = -1
        return tth

    

    def raise_widget(self):
        self.show()
        self.setWindowState(self.windowState() & ~QtCore.Qt.WindowMinimized | QtCore.Qt.WindowActive)
        self.activateWindow()
        self.raise_()

    def del_roi(self, ind):
        self.roi_tw.blockSignals(True)
        self.roi_tw.removeRow(ind)
        
        self.roi_tw.blockSignals(False)
        del self.roi_show_cbs[ind]
        del self.name_items[ind]
        del self.tth_items[ind]

    def rename_roi(self, ind, name):
        self.roi_tw.blockSignals(True)
        name_item = self.roi_tw.item(ind, 1)
        name_item.setText(name)
        self.roi_tw.blockSignals(False)

    def roi_show_cb_changed(self, checkbox):
        checked = checkbox.isChecked()
        ind = self.roi_show_cbs.index(checkbox)
        name=self.name_items[ind].text()
        tth=self.tth_items[ind].text()
        state = {'tth':tth, 'name':name, 'checked':checked}

        self.show_cb_state_changed.emit(state)
Exemple #11
0
    def __init__(self, parent=None):
        super(JcpdsEditorWidget, self).__init__(parent)

        self.setWindowTitle('JCPDS Editor')

        self._layout = QtWidgets.QVBoxLayout()

        self._file_layout = QtWidgets.QGridLayout()
        self._file_layout.addWidget(LabelAlignRight('Filename:'), 0, 0)
        self._file_layout.addWidget(LabelAlignRight('Comment:'), 1, 0)

        self.filename_txt = QtWidgets.QLineEdit('')
        self.comments_txt = QtWidgets.QLineEdit('')
        self._file_layout.addWidget(self.filename_txt, 0, 1)
        self._file_layout.addWidget(self.comments_txt, 1, 1)
        self._layout.addLayout((self._file_layout))

        self.lattice_parameters_gb = QtWidgets.QGroupBox('Lattice Parameters')
        self._lattice_parameters_layout = QtWidgets.QVBoxLayout()

        self._symmetry_layout = QtWidgets.QHBoxLayout()
        self._symmetry_layout.addWidget(LabelAlignRight('Symmetry'))
        self.symmetry_cb = CleanLooksComboBox()
        self.symmetries = [
            'cubic', 'tetragonal', 'hexagonal', 'trigonal', 'rhombohedral',
            'orthorhombic', 'monoclinic', 'triclinic'
        ]
        self.symmetry_cb.addItems(self.symmetries)
        self._symmetry_layout.addWidget(self.symmetry_cb)
        self._symmetry_layout.addSpacerItem(HorizontalSpacerItem())
        self._lattice_parameters_layout.addLayout(self._symmetry_layout)

        self._parameters_layout = QtWidgets.QGridLayout()

        self.lattice_a_sb = DoubleSpinBoxAlignRight()
        self.lattice_a_sb.setSingleStep(0.01)
        self.lattice_a_sb.setMinimum(0)
        self.lattice_a_sb.setMaximum(99999)
        self.lattice_a_sb.setDecimals(4)
        self.lattice_b_sb = DoubleSpinBoxAlignRight()
        self.lattice_b_sb.setMinimum(0)
        self.lattice_b_sb.setMaximum(99999)
        self.lattice_b_sb.setDecimals(4)
        self.lattice_b_sb.setSingleStep(0.01)
        self.lattice_c_sb = DoubleSpinBoxAlignRight()
        self.lattice_c_sb.setMinimum(0)
        self.lattice_c_sb.setMaximum(99999)
        self.lattice_c_sb.setDecimals(4)
        self.lattice_c_sb.setSingleStep(0.01)
        self.lattice_length_step_txt = NumberTextField('0.01')

        self.add_field(self._parameters_layout, self.lattice_a_sb,
                       'a<sub>0</sub>:', u"Å", 0, 0)
        self.add_field(self._parameters_layout, self.lattice_b_sb,
                       'b<sub>0</sub>:', u"Å", 0, 3)
        self.add_field(self._parameters_layout, self.lattice_c_sb,
                       'c<sub>0</sub>:', u"Å", 0, 6)
        self.add_field(self._parameters_layout, self.lattice_length_step_txt,
                       'st:', u"Å", 0, 9)

        self.lattice_eos_a_txt = NumberTextField()
        self.lattice_eos_b_txt = NumberTextField()
        self.lattice_eos_c_txt = NumberTextField()

        self.add_field(self._parameters_layout, self.lattice_eos_a_txt, 'a:',
                       u"Å", 1, 0)
        self.add_field(self._parameters_layout, self.lattice_eos_b_txt, 'b:',
                       u"Å", 1, 3)
        self.add_field(self._parameters_layout, self.lattice_eos_c_txt, 'c:',
                       u"Å", 1, 6)

        self.lattice_alpha_sb = DoubleSpinBoxAlignRight()
        self.lattice_alpha_sb.setMaximum(180)
        self.lattice_beta_sb = DoubleSpinBoxAlignRight()
        self.lattice_beta_sb.setMaximum(180)
        self.lattice_gamma_sb = DoubleSpinBoxAlignRight()
        self.lattice_gamma_sb.setMaximum(180)
        self.lattice_angle_step_txt = NumberTextField('1')

        self.add_field(self._parameters_layout, self.lattice_alpha_sb, u'α:',
                       u"°", 2, 0)
        self.add_field(self._parameters_layout, self.lattice_beta_sb, u'β:',
                       u"°", 2, 3)
        self.add_field(self._parameters_layout, self.lattice_gamma_sb, u'γ:',
                       u"°", 2, 6)
        self.add_field(self._parameters_layout, self.lattice_angle_step_txt,
                       u'st:', u"°", 2, 9)

        self.lattice_ab_sb = DoubleSpinBoxAlignRight()
        self.lattice_ab_sb.setDecimals(4)
        self.lattice_ca_sb = DoubleSpinBoxAlignRight()
        self.lattice_ca_sb.setDecimals(4)
        self.lattice_cb_sb = DoubleSpinBoxAlignRight()
        self.lattice_cb_sb.setDecimals(4)
        self.lattice_ratio_step_txt = NumberTextField('0.01')

        self.add_field(self._parameters_layout, self.lattice_ab_sb, 'a/b:',
                       None, 3, 0)
        self.add_field(self._parameters_layout, self.lattice_ca_sb, 'c/a:',
                       None, 3, 3)
        self.add_field(self._parameters_layout, self.lattice_cb_sb, 'c/b:',
                       None, 3, 6)
        self.add_field(self._parameters_layout, self.lattice_ratio_step_txt,
                       'st:', None, 3, 9)

        self.lattice_volume_txt = NumberTextField()
        self.lattice_eos_volume_txt = NumberTextField()
        self.lattice_eos_molar_volume_txt = NumberTextField()
        self.lattice_eos_z_txt = NumberTextField()

        self.add_field(self._parameters_layout, self.lattice_volume_txt,
                       'V<sub>0</sub>:', u'ų', 4, 0)
        self.add_field(self._parameters_layout, self.lattice_eos_volume_txt,
                       'V:', u'ų', 4, 3)

        self.add_field(self._parameters_layout,
                       self.lattice_eos_molar_volume_txt, 'V<sub>m</sub>:',
                       u'm³/mol', 5, 3)
        self.add_field(self._parameters_layout, self.lattice_eos_z_txt, 'Z:',
                       u'', 5, 0)

        self._lattice_parameters_layout.addLayout(self._parameters_layout)
        self.lattice_parameters_gb.setLayout(self._lattice_parameters_layout)

        self.eos_widget = EosGroupbox()

        self.reflections_gb = QtWidgets.QGroupBox('Reflections')
        self._reflection_layout = QtWidgets.QGridLayout()
        self.reflection_table_view = QtWidgets.QTableView()
        self.reflection_table_model = ReflectionTableModel()
        self.reflection_table_view.setModel(self.reflection_table_model)
        #self.reflection_table.setColumnCount(8)
        self.reflections_add_btn = FlatButton('Add')
        self.reflections_delete_btn = FlatButton('Delete')
        self.reflections_clear_btn = FlatButton('Clear')

        self._reflection_layout.addWidget(self.reflection_table_view, 0, 0, 1,
                                          3)
        self._reflection_layout.addWidget(self.reflections_add_btn, 1, 0)
        self._reflection_layout.addWidget(self.reflections_delete_btn, 1, 1)
        self._reflection_layout.addWidget(self.reflections_clear_btn, 1, 2)

        self.reflections_gb.setLayout(self._reflection_layout)

        self._body_layout = QtWidgets.QGridLayout()
        self._body_layout.addWidget(self.eos_widget, 0, 0)
        self._body_layout.addItem(VerticalSpacerItem(), 1, 0)
        self._body_layout.addWidget(self.reflections_gb, 0, 1, 2, 1)

        self._button_layout = QtWidgets.QHBoxLayout()
        self.save_as_btn = FlatButton('Save As')
        self.reload_file_btn = FlatButton('Reload File')

        self._button_layout.addWidget(self.save_as_btn)
        self._button_layout.addWidget(self.reload_file_btn)
        self._button_layout.addSpacerItem(HorizontalSpacerItem())

        self._layout.addWidget(self.lattice_parameters_gb)
        self._layout.addLayout(self._body_layout)
        self._layout.addLayout(self._button_layout)
        self.setLayout(self._layout)

        self.style_widgets()
Exemple #12
0
class JcpdsEditorWidget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(JcpdsEditorWidget, self).__init__(parent)

        self.setWindowTitle('JCPDS Editor')

        self._layout = QtWidgets.QVBoxLayout()

        self._file_layout = QtWidgets.QGridLayout()
        self._file_layout.addWidget(LabelAlignRight('Filename:'), 0, 0)
        self._file_layout.addWidget(LabelAlignRight('Comment:'), 1, 0)

        self.filename_txt = QtWidgets.QLineEdit('')
        self.comments_txt = QtWidgets.QLineEdit('')
        self._file_layout.addWidget(self.filename_txt, 0, 1)
        self._file_layout.addWidget(self.comments_txt, 1, 1)
        self._layout.addLayout((self._file_layout))

        self.lattice_parameters_gb = QtWidgets.QGroupBox('Lattice Parameters')
        self._lattice_parameters_layout = QtWidgets.QVBoxLayout()

        self._symmetry_layout = QtWidgets.QHBoxLayout()
        self._symmetry_layout.addWidget(LabelAlignRight('Symmetry'))
        self.symmetry_cb = CleanLooksComboBox()
        self.symmetries = [
            'cubic', 'tetragonal', 'hexagonal', 'trigonal', 'rhombohedral',
            'orthorhombic', 'monoclinic', 'triclinic'
        ]
        self.symmetry_cb.addItems(self.symmetries)
        self._symmetry_layout.addWidget(self.symmetry_cb)
        self._symmetry_layout.addSpacerItem(HorizontalSpacerItem())
        self._lattice_parameters_layout.addLayout(self._symmetry_layout)

        self._parameters_layout = QtWidgets.QGridLayout()

        self.lattice_a_sb = DoubleSpinBoxAlignRight()
        self.lattice_a_sb.setSingleStep(0.01)
        self.lattice_a_sb.setMinimum(0)
        self.lattice_a_sb.setMaximum(99999)
        self.lattice_a_sb.setDecimals(4)
        self.lattice_b_sb = DoubleSpinBoxAlignRight()
        self.lattice_b_sb.setMinimum(0)
        self.lattice_b_sb.setMaximum(99999)
        self.lattice_b_sb.setDecimals(4)
        self.lattice_b_sb.setSingleStep(0.01)
        self.lattice_c_sb = DoubleSpinBoxAlignRight()
        self.lattice_c_sb.setMinimum(0)
        self.lattice_c_sb.setMaximum(99999)
        self.lattice_c_sb.setDecimals(4)
        self.lattice_c_sb.setSingleStep(0.01)
        self.lattice_length_step_txt = NumberTextField('0.01')

        self.add_field(self._parameters_layout, self.lattice_a_sb,
                       'a<sub>0</sub>:', u"Å", 0, 0)
        self.add_field(self._parameters_layout, self.lattice_b_sb,
                       'b<sub>0</sub>:', u"Å", 0, 3)
        self.add_field(self._parameters_layout, self.lattice_c_sb,
                       'c<sub>0</sub>:', u"Å", 0, 6)
        self.add_field(self._parameters_layout, self.lattice_length_step_txt,
                       'st:', u"Å", 0, 9)

        self.lattice_eos_a_txt = NumberTextField()
        self.lattice_eos_b_txt = NumberTextField()
        self.lattice_eos_c_txt = NumberTextField()

        self.add_field(self._parameters_layout, self.lattice_eos_a_txt, 'a:',
                       u"Å", 1, 0)
        self.add_field(self._parameters_layout, self.lattice_eos_b_txt, 'b:',
                       u"Å", 1, 3)
        self.add_field(self._parameters_layout, self.lattice_eos_c_txt, 'c:',
                       u"Å", 1, 6)

        self.lattice_alpha_sb = DoubleSpinBoxAlignRight()
        self.lattice_alpha_sb.setMaximum(180)
        self.lattice_beta_sb = DoubleSpinBoxAlignRight()
        self.lattice_beta_sb.setMaximum(180)
        self.lattice_gamma_sb = DoubleSpinBoxAlignRight()
        self.lattice_gamma_sb.setMaximum(180)
        self.lattice_angle_step_txt = NumberTextField('1')

        self.add_field(self._parameters_layout, self.lattice_alpha_sb, u'α:',
                       u"°", 2, 0)
        self.add_field(self._parameters_layout, self.lattice_beta_sb, u'β:',
                       u"°", 2, 3)
        self.add_field(self._parameters_layout, self.lattice_gamma_sb, u'γ:',
                       u"°", 2, 6)
        self.add_field(self._parameters_layout, self.lattice_angle_step_txt,
                       u'st:', u"°", 2, 9)

        self.lattice_ab_sb = DoubleSpinBoxAlignRight()
        self.lattice_ab_sb.setDecimals(4)
        self.lattice_ca_sb = DoubleSpinBoxAlignRight()
        self.lattice_ca_sb.setDecimals(4)
        self.lattice_cb_sb = DoubleSpinBoxAlignRight()
        self.lattice_cb_sb.setDecimals(4)
        self.lattice_ratio_step_txt = NumberTextField('0.01')

        self.add_field(self._parameters_layout, self.lattice_ab_sb, 'a/b:',
                       None, 3, 0)
        self.add_field(self._parameters_layout, self.lattice_ca_sb, 'c/a:',
                       None, 3, 3)
        self.add_field(self._parameters_layout, self.lattice_cb_sb, 'c/b:',
                       None, 3, 6)
        self.add_field(self._parameters_layout, self.lattice_ratio_step_txt,
                       'st:', None, 3, 9)

        self.lattice_volume_txt = NumberTextField()
        self.lattice_eos_volume_txt = NumberTextField()
        self.lattice_eos_molar_volume_txt = NumberTextField()
        self.lattice_eos_z_txt = NumberTextField()

        self.add_field(self._parameters_layout, self.lattice_volume_txt,
                       'V<sub>0</sub>:', u'ų', 4, 0)
        self.add_field(self._parameters_layout, self.lattice_eos_volume_txt,
                       'V:', u'ų', 4, 3)

        self.add_field(self._parameters_layout,
                       self.lattice_eos_molar_volume_txt, 'V<sub>m</sub>:',
                       u'm³/mol', 5, 3)
        self.add_field(self._parameters_layout, self.lattice_eos_z_txt, 'Z:',
                       u'', 5, 0)

        self._lattice_parameters_layout.addLayout(self._parameters_layout)
        self.lattice_parameters_gb.setLayout(self._lattice_parameters_layout)

        self.eos_widget = EosGroupbox()

        self.reflections_gb = QtWidgets.QGroupBox('Reflections')
        self._reflection_layout = QtWidgets.QGridLayout()
        self.reflection_table_view = QtWidgets.QTableView()
        self.reflection_table_model = ReflectionTableModel()
        self.reflection_table_view.setModel(self.reflection_table_model)
        #self.reflection_table.setColumnCount(8)
        self.reflections_add_btn = FlatButton('Add')
        self.reflections_delete_btn = FlatButton('Delete')
        self.reflections_clear_btn = FlatButton('Clear')

        self._reflection_layout.addWidget(self.reflection_table_view, 0, 0, 1,
                                          3)
        self._reflection_layout.addWidget(self.reflections_add_btn, 1, 0)
        self._reflection_layout.addWidget(self.reflections_delete_btn, 1, 1)
        self._reflection_layout.addWidget(self.reflections_clear_btn, 1, 2)

        self.reflections_gb.setLayout(self._reflection_layout)

        self._body_layout = QtWidgets.QGridLayout()
        self._body_layout.addWidget(self.eos_widget, 0, 0)
        self._body_layout.addItem(VerticalSpacerItem(), 1, 0)
        self._body_layout.addWidget(self.reflections_gb, 0, 1, 2, 1)

        self._button_layout = QtWidgets.QHBoxLayout()
        self.save_as_btn = FlatButton('Save As')
        self.reload_file_btn = FlatButton('Reload File')

        self._button_layout.addWidget(self.save_as_btn)
        self._button_layout.addWidget(self.reload_file_btn)
        self._button_layout.addSpacerItem(HorizontalSpacerItem())

        self._layout.addWidget(self.lattice_parameters_gb)
        self._layout.addLayout(self._body_layout)
        self._layout.addLayout(self._button_layout)
        self.setLayout(self._layout)

        self.style_widgets()

    def style_widgets(self):
        self.lattice_angle_step_txt.setMaximumWidth(60)
        self.lattice_length_step_txt.setMaximumWidth(60)
        self.lattice_ratio_step_txt.setMaximumWidth(60)
        self.lattice_eos_z_txt.setMaximumWidth(40)

        self.reflection_table_view.setShowGrid(False)
        self.reflection_table_view.setSelectionBehavior(
            QtWidgets.QAbstractItemView.SelectRows)
        self.reflection_table_view.setItemDelegate(TextDoubleDelegate())
        self.reflection_table_view.horizontalHeader().setResizeMode(
            QtWidgets.QHeaderView.ResizeToContents)

        self.eos_widget.setMaximumWidth(250)
        self.eos_widget.setStyleSheet("""
            QLineEdit {
                max-width: 80;
            }
        """)

        self.reflection_table_view.verticalHeader().setDefaultSectionSize(20)
        self.reflection_table_view.verticalHeader().setResizeMode(
            QtWidgets.QHeaderView.Fixed)

        self.setWindowFlags(QtCore.Qt.Tool)
        #self.setAttribute(QtCore.Qt.WA_MacAlwaysShowToolWindow)

    def close(self, *args, **kwargs):

        super().close()

    def raise_widget(self):
        self.show()
        self.setWindowState(self.windowState() & ~QtCore.Qt.WindowMinimized
                            | QtCore.Qt.WindowActive)
        self.activateWindow()
        self.raise_()

    def add_field(self, layout, widget, label_str, unit, x, y):
        layout.addWidget(LabelAlignRight(label_str), x, y)
        layout.addWidget(widget, x, y + 1)
        if unit:
            layout.addWidget(QtWidgets.QLabel(unit), x, y + 2)

    def show_jcpds(self, jcpds_phase, wavelength=None):
        self.update_name(jcpds_phase)
        self.update_lattice_parameters(jcpds_phase)
        self.update_eos_parameters(jcpds_phase)
        self.reflection_table_model.update_reflection_data(
            jcpds_phase.reflections, wavelength)

    # jcpds V5
    def update_eos_parameters(self, jcpds_phase):
        if 'eos' in jcpds_phase.params and 'z' in jcpds_phase.params:
            self.eos_widget.setEOSparams(jcpds_phase.params['eos'])
            self.lattice_eos_z_txt.setText(str(jcpds_phase.params['z']))

    def update_name(self, jcpds_phase):
        self.filename_txt.setText(jcpds_phase.filename)
        self.comments_txt.setText("/n".join(jcpds_phase.params['comments']))

    def update_lattice_parameters(self, jcpds_phase):
        self.blockAllSignals(True)
        self.symmetry_cb.setCurrentIndex(
            self.symmetries.index(jcpds_phase.params['symmetry'].lower()))
        self.update_spinbox_enable(jcpds_phase.params['symmetry'])

        if not self.lattice_a_sb.hasFocus():
            self.lattice_a_sb.setValue(jcpds_phase.params['a0'])
        if not self.lattice_b_sb.hasFocus():
            self.lattice_b_sb.setValue(jcpds_phase.params['b0'])
        if not self.lattice_c_sb.hasFocus():
            self.lattice_c_sb.setValue(jcpds_phase.params['c0'])

        self.lattice_eos_a_txt.setText('{0:.4f}'.format(
            jcpds_phase.params['a']))
        self.lattice_eos_b_txt.setText('{0:.4f}'.format(
            jcpds_phase.params['b']))
        self.lattice_eos_c_txt.setText('{0:.4f}'.format(
            jcpds_phase.params['c']))

        self.lattice_eos_volume_txt.setText('{0:.4f}'.format(
            jcpds_phase.params['v']))

        # jcpds V5
        if 'vm' in jcpds_phase.params.keys():
            vm = jcpds_phase.params['vm']
            vm_txt = '{0:.4e}'.format(vm)
        else:
            vm_txt = ''
        self.lattice_eos_molar_volume_txt.setText(vm_txt)

        try:
            if not self.lattice_ab_sb.hasFocus():
                self.lattice_ab_sb.setValue(jcpds_phase.params['a0'] /
                                            float(jcpds_phase.params['b0']))
        except ZeroDivisionError:
            self.lattice_ab_sb.setSpecialValueText('Inf')

        try:
            if not self.lattice_ca_sb.hasFocus():
                self.lattice_ca_sb.setValue(jcpds_phase.params['c0'] /
                                            float(jcpds_phase.params['a0']))
        except ZeroDivisionError:
            self.lattice_ca_sb.setSpecialValueText('Inf')

        try:
            if not self.lattice_cb_sb.hasFocus():
                self.lattice_cb_sb.setValue(jcpds_phase.params['c0'] /
                                            float(jcpds_phase.params['b0']))
        except ZeroDivisionError:
            self.lattice_cb_sb.setSpecialValueText('Inf')

        self.lattice_volume_txt.setText(
            str('{0:g}'.format(jcpds_phase.params['v0'])))

        if not self.lattice_alpha_sb.hasFocus():
            self.lattice_alpha_sb.setValue(jcpds_phase.params['alpha0'])
        if not self.lattice_beta_sb.hasFocus():
            self.lattice_beta_sb.setValue(jcpds_phase.params['beta0'])
        if not self.lattice_gamma_sb.hasFocus():
            self.lattice_gamma_sb.setValue(jcpds_phase.params['gamma0'])

        self.blockAllSignals(False)

    def blockAllSignals(self, bool=True):
        self.lattice_a_sb.blockSignals(bool)
        self.lattice_b_sb.blockSignals(bool)
        self.lattice_c_sb.blockSignals(bool)

        self.lattice_alpha_sb.blockSignals(bool)
        self.lattice_beta_sb.blockSignals(bool)
        self.lattice_gamma_sb.blockSignals(bool)

        self.lattice_ab_sb.blockSignals(bool)
        self.lattice_ca_sb.blockSignals(bool)
        self.lattice_cb_sb.blockSignals(bool)

        self.symmetry_cb.blockSignals(bool)

    def update_spinbox_enable(self, symmetry):
        if symmetry == 'CUBIC':
            self.lattice_a_sb.setEnabled(True)
            self.lattice_b_sb.setEnabled(False)
            self.lattice_c_sb.setEnabled(False)

            self.lattice_alpha_sb.setEnabled(False)
            self.lattice_beta_sb.setEnabled(False)
            self.lattice_gamma_sb.setEnabled(False)

            self.lattice_ab_sb.setEnabled(False)
            self.lattice_ca_sb.setEnabled(False)
            self.lattice_cb_sb.setEnabled(False)

        elif symmetry == 'TETRAGONAL':
            self.lattice_a_sb.setEnabled(True)
            self.lattice_b_sb.setEnabled(False)
            self.lattice_c_sb.setEnabled(True)

            self.lattice_alpha_sb.setEnabled(False)
            self.lattice_beta_sb.setEnabled(False)
            self.lattice_gamma_sb.setEnabled(False)

            self.lattice_ab_sb.setEnabled(False)
            self.lattice_ca_sb.setEnabled(True)
            self.lattice_cb_sb.setEnabled(False)

        elif symmetry == 'ORTHORHOMBIC':
            self.lattice_a_sb.setEnabled(True)
            self.lattice_b_sb.setEnabled(True)
            self.lattice_c_sb.setEnabled(True)

            self.lattice_alpha_sb.setEnabled(False)
            self.lattice_beta_sb.setEnabled(False)
            self.lattice_gamma_sb.setEnabled(False)

            self.lattice_ab_sb.setEnabled(True)
            self.lattice_ca_sb.setEnabled(True)
            self.lattice_cb_sb.setEnabled(True)

        elif symmetry == 'HEXAGONAL' or symmetry == 'TRIGONAL':
            self.lattice_a_sb.setEnabled(True)
            self.lattice_b_sb.setEnabled(False)
            self.lattice_c_sb.setEnabled(True)

            self.lattice_alpha_sb.setEnabled(False)
            self.lattice_beta_sb.setEnabled(False)
            self.lattice_gamma_sb.setEnabled(False)

            self.lattice_ab_sb.setEnabled(False)
            self.lattice_ca_sb.setEnabled(True)
            self.lattice_cb_sb.setEnabled(False)

        elif symmetry == 'RHOMBOHEDRAL':
            self.lattice_a_sb.setEnabled(True)
            self.lattice_b_sb.setEnabled(False)
            self.lattice_c_sb.setEnabled(False)

            self.lattice_alpha_sb.setEnabled(True)
            self.lattice_beta_sb.setEnabled(False)
            self.lattice_gamma_sb.setEnabled(False)

            self.lattice_ab_sb.setEnabled(False)
            self.lattice_ca_sb.setEnabled(False)
            self.lattice_cb_sb.setEnabled(False)

        elif symmetry == 'MONOCLINIC':
            self.lattice_a_sb.setEnabled(True)
            self.lattice_b_sb.setEnabled(True)
            self.lattice_c_sb.setEnabled(True)

            self.lattice_alpha_sb.setEnabled(False)
            self.lattice_beta_sb.setEnabled(True)
            self.lattice_gamma_sb.setEnabled(False)

            self.lattice_ab_sb.setEnabled(True)
            self.lattice_ca_sb.setEnabled(True)
            self.lattice_cb_sb.setEnabled(True)

        elif symmetry == 'TRICLINIC':
            self.lattice_a_sb.setEnabled(True)
            self.lattice_b_sb.setEnabled(True)
            self.lattice_c_sb.setEnabled(True)

            self.lattice_alpha_sb.setEnabled(True)
            self.lattice_beta_sb.setEnabled(True)
            self.lattice_gamma_sb.setEnabled(True)

            self.lattice_ab_sb.setEnabled(True)
            self.lattice_ca_sb.setEnabled(True)
            self.lattice_cb_sb.setEnabled(True)

        else:
            print('Unknown symmetry: {0}.'.format(symmetry))

    def get_selected_reflections(self):
        selected = self.reflection_table_view.selectionModel().selectedRows()
        try:
            row = []
            for element in selected:
                row.append(int(element.row()))
        except IndexError:
            row = None
        return row

    def remove_reflection_from_table(self, ind):
        self.reflection_table.blockSignals(True)
        self.reflection_table.removeRow(ind)
        self.reflection_table.blockSignals(False)
Exemple #13
0
    def __init__(self):
        super().__init__()
        self.setWindowTitle('New multiangle setup')
        self._layout = QtWidgets.QVBoxLayout()
        self._parameter_layout = QtWidgets.QGridLayout()
        self.q_low_sb = DoubleSpinBoxAlignRight()
        self.E_low_sb = DoubleSpinBoxAlignRight()
        self.q_high_sb = DoubleSpinBoxAlignRight()
        self.E_high_sb = DoubleSpinBoxAlignRight()
        self.overlap_sb = DoubleSpinBoxAlignRight()
        self.q_low_sb.setMinimumWidth(100)
        self.E_low_sb.setMinimumWidth(100)
        self.q_high_sb.setMinimumWidth(100)
        self.E_high_sb.setMinimumWidth(100)
        self.overlap_sb.setMinimumWidth(100)

        self.q_low_sb.setMaximum(50)
        self.q_low_sb.setMinimum(0.001)
        self.q_low_sb.setValue(1)
        self.E_low_sb.setMaximum(1000)
        self.E_low_sb.setMinimum(1)
        self.E_low_sb.setValue(34)
        self.q_high_sb.setMaximum(50)
        self.q_high_sb.setMinimum(0.001)
        self.q_high_sb.setValue(15)
        self.E_low_sb.setMaximum(1000)
        self.E_low_sb.setMinimum(1)
        self.E_high_sb.setValue(68)
        self.overlap_sb.setMaximum(90)
        self.overlap_sb.setMinimum(10)
        self.overlap_sb.setValue(75)

        self._parameter_layout.addWidget(QtWidgets.QLabel('Low'), 0, 1)
        self._parameter_layout.addWidget(QtWidgets.QLabel('High'), 0, 2)
        self._parameter_layout.addWidget(QtWidgets.QLabel('q:'), 1, 0)
        self._parameter_layout.addWidget(QtWidgets.QLabel('E:'), 2, 0)
        self._parameter_layout.addWidget(QtWidgets.QLabel('Overlap %:'), 3, 0)
        self._parameter_layout.addWidget(
            QtWidgets.QLabel(
                f'\N{LATIN CAPITAL LETTER A WITH RING ABOVE}\N{SUPERSCRIPT MINUS}\N{SUPERSCRIPT ONE}'
            ), 1, 3)
        self._parameter_layout.addWidget(QtWidgets.QLabel('KeV'), 2, 3)

        self._parameter_layout.addWidget(self.q_low_sb, 1, 1)
        self._parameter_layout.addWidget(self.q_high_sb, 1, 2)
        self._parameter_layout.addWidget(self.E_low_sb, 2, 1)
        self._parameter_layout.addWidget(self.E_high_sb, 2, 2)
        self._parameter_layout.addWidget(self.overlap_sb, 3, 1)

        self.apply_btn = FlatButton('Apply')
        self.apply_btn.setMinimumWidth(75)
        self.overlap_lbl = QtWidgets.QLabel('')

        self._parameter_layout.addWidget(self.apply_btn, 4, 1, 1, 1)
        self._parameter_layout.addWidget(self.overlap_lbl, 3, 2, 1, 1)

        self._layout.addLayout(self._parameter_layout)
        self._layout.addSpacerItem(VerticalSpacerItem())

        self.setLayout(self._layout)
        self.apply_btn.clicked.connect(self.compute_2th)
Exemple #14
0
class QCoverageWidget(customWidget):
    def __init__(self, model):
        plot_widget_parameters = 'q space coverage', f'2\N{GREEK SMALL LETTER THETA}', 'q'
        super().__init__(plot_widget_parameters)
        self.model = model
        self.setWindowTitle('q space coverage')
        self.make_E_widgets()
        self.add_button_widget_item(self.E_widget)
        self.add_button_widget_spacer()
        self.model.itemChanged.connect(self.update)

    def update(self, *karg, **kwarg):
        if not self.model.block_update:
            tth = self.model.get_tth()
            self.plot_tth(tth)

    def plot_tth(self, tth):
        self.fig.clear()
        if len(tth):
            for i, t in enumerate(tth):
                color = calculate_color(i)
                x, y = self.make_plot(t)
                self.fig.add_line_plot(x, y, color, 2)
                self.fig.set_plot_label_color(color, i)

    def make_plot(self, tth):
        E = []
        E.append(self.E_low_sb.value())
        E.append(self.E_high_sb.value())
        d = [tth_e_to_d(tth, E[0]), tth_e_to_d(tth, E[1])]
        q = [d_to_q(d[0]), d_to_q(d[1])]
        x = np.asarray(q)
        y = np.asarray([tth, tth])
        return x, y

    def make_E_widgets(self):
        self.E_widget = QtWidgets.QWidget()
        self._layout = QtWidgets.QVBoxLayout()
        self._parameter_layout = QtWidgets.QGridLayout()
        self.E_low_sb = DoubleSpinBoxAlignRight()
        self.E_high_sb = DoubleSpinBoxAlignRight()
        self.E_low_sb.setMinimumWidth(100)
        self.E_high_sb.setMinimumWidth(100)
        self.E_low_sb.setMaximum(1000)
        self.E_low_sb.setMinimum(1)
        self.E_low_sb.setValue(34)
        self.E_low_sb.setMaximum(1000)
        self.E_low_sb.setMinimum(1)
        self.E_high_sb.setValue(68)
        self._parameter_layout.addWidget(QtWidgets.QLabel('E'), 1, 0)
        self._parameter_layout.addWidget(QtWidgets.QLabel('Low'), 0, 1)
        self._parameter_layout.addWidget(QtWidgets.QLabel('High'), 0, 2)
        self._parameter_layout.addWidget(QtWidgets.QLabel('KeV'), 1, 3)
        self._parameter_layout.addWidget(self.E_low_sb, 1, 1)
        self._parameter_layout.addWidget(self.E_high_sb, 1, 2)
        self._layout.addLayout(self._parameter_layout)
        self._layout.addSpacerItem(VerticalSpacerItem())
        self.E_widget.setLayout(self._layout)
        self.E_low_sb.valueChanged.connect(self.update)
        self.E_high_sb.valueChanged.connect(self.update)
Exemple #15
0
class parameterWidget(QtWidgets.QWidget):
    sequence_changed_signal = QtCore.pyqtSignal(dict)
    widget_closed = QtCore.pyqtSignal()

    def __init__(self):
        super().__init__()
        self.setWindowTitle('New multiangle setup')
        self._layout = QtWidgets.QVBoxLayout()
        self._parameter_layout = QtWidgets.QGridLayout()
        self.q_low_sb = DoubleSpinBoxAlignRight()
        self.E_low_sb = DoubleSpinBoxAlignRight()
        self.q_high_sb = DoubleSpinBoxAlignRight()
        self.E_high_sb = DoubleSpinBoxAlignRight()
        self.overlap_sb = DoubleSpinBoxAlignRight()
        self.q_low_sb.setMinimumWidth(100)
        self.E_low_sb.setMinimumWidth(100)
        self.q_high_sb.setMinimumWidth(100)
        self.E_high_sb.setMinimumWidth(100)
        self.overlap_sb.setMinimumWidth(100)

        self.q_low_sb.setMaximum(50)
        self.q_low_sb.setMinimum(0.001)
        self.q_low_sb.setValue(1)
        self.E_low_sb.setMaximum(1000)
        self.E_low_sb.setMinimum(1)
        self.E_low_sb.setValue(34)
        self.q_high_sb.setMaximum(50)
        self.q_high_sb.setMinimum(0.001)
        self.q_high_sb.setValue(15)
        self.E_low_sb.setMaximum(1000)
        self.E_low_sb.setMinimum(1)
        self.E_high_sb.setValue(68)
        self.overlap_sb.setMaximum(90)
        self.overlap_sb.setMinimum(10)
        self.overlap_sb.setValue(75)

        self._parameter_layout.addWidget(QtWidgets.QLabel('Low'), 0, 1)
        self._parameter_layout.addWidget(QtWidgets.QLabel('High'), 0, 2)
        self._parameter_layout.addWidget(QtWidgets.QLabel('q:'), 1, 0)
        self._parameter_layout.addWidget(QtWidgets.QLabel('E:'), 2, 0)
        self._parameter_layout.addWidget(QtWidgets.QLabel('Overlap %:'), 3, 0)
        self._parameter_layout.addWidget(
            QtWidgets.QLabel(
                f'\N{LATIN CAPITAL LETTER A WITH RING ABOVE}\N{SUPERSCRIPT MINUS}\N{SUPERSCRIPT ONE}'
            ), 1, 3)
        self._parameter_layout.addWidget(QtWidgets.QLabel('KeV'), 2, 3)

        self._parameter_layout.addWidget(self.q_low_sb, 1, 1)
        self._parameter_layout.addWidget(self.q_high_sb, 1, 2)
        self._parameter_layout.addWidget(self.E_low_sb, 2, 1)
        self._parameter_layout.addWidget(self.E_high_sb, 2, 2)
        self._parameter_layout.addWidget(self.overlap_sb, 3, 1)

        self.apply_btn = FlatButton('Apply')
        self.apply_btn.setMinimumWidth(75)
        self.overlap_lbl = QtWidgets.QLabel('')

        self._parameter_layout.addWidget(self.apply_btn, 4, 1, 1, 1)
        self._parameter_layout.addWidget(self.overlap_lbl, 3, 2, 1, 1)

        self._layout.addLayout(self._parameter_layout)
        self._layout.addSpacerItem(VerticalSpacerItem())

        self.setLayout(self._layout)
        self.apply_btn.clicked.connect(self.compute_2th)

    def compute_2th(self):
        q_low = self.q_low_sb.value()
        e_low = self.E_low_sb.value()
        q_high = self.q_high_sb.value()
        e_high = self.E_high_sb.value()
        overlap_fract = self.overlap_sb.value() * 0.01

        start_time = time.time()
        n, overlap_fract, seq = optimize_tth(q_low, q_high, e_low, e_high,
                                             overlap_fract)
        timer = time.time() - start_time
        t = []
        for tth in seq:
            t.append(tth['tth'])
        d = {}
        d['n'] = n
        d['overlap_fract'] = overlap_fract
        d['seq'] = seq
        d['tth'] = t
        low_q = seq[0]['q_low']
        high_q = seq[-1]['q_high']
        d['q_low'] = low_q
        d['q_high'] = high_q
        '''
        print(str(t))
        print('n = '+ str(int(n)))
        print('overlap = '+ str(overlap_fract*100))
        print('q start = '+ str(low_q)+ '; q end = '+ str(high_q))
        print("tth optimized --- %s seconds ---" % (timer))
        '''

        self.overlap_lbl.setText('n: ' + str(int(n)) + '\nOverlap %: ' +
                                 str(round(overlap_fract * 100, 3)))
        self.sequence_changed_signal.emit(d)

    def raise_widget(self):
        self.show()
        self.setWindowState(self.windowState() & ~QtCore.Qt.WindowMinimized
                            | QtCore.Qt.WindowActive)
        self.activateWindow()
        self.raise_()
Exemple #16
0
class multiangleWidget(QtWidgets.QWidget):

    widget_closed = QtCore.pyqtSignal()
    fract_item_changed_signal = QtCore.pyqtSignal(int, float)

    def __init__(self, multiangle_model):
        super().__init__()
        self.multiangle_model = multiangle_model
        self.parameter_widget = parameterWidget()
        self._layout = QtWidgets.QVBoxLayout()
        self.setWindowTitle('Multiangle control')
        self.button_widget = QtWidgets.QWidget(self)
        self.button_widget.setObjectName('control_button_widget')
        self._button_layout = QtWidgets.QHBoxLayout()
        self._button_layout.setContentsMargins(0, 0, 0, 0)
        self._button_layout.setSpacing(15)
        self.new_btn = FlatButton('Setup')
        self.load_btn = FlatButton('Load')
        self.save_btn = FlatButton('Save')
        self.delete_btn = FlatButton('Delete')
        self.clear_btn = FlatButton('Clear')
        self.add_btn = FlatButton('Add')
        self.plot_btn = FlatButton('Plot')
        self._button_layout.addWidget(self.new_btn)
        self._button_layout.addWidget(self.load_btn)
        self._button_layout.addWidget(self.save_btn)
        self._button_layout.addWidget(self.add_btn)
        self._button_layout.addWidget(self.delete_btn)
        self._button_layout.addWidget(self.clear_btn)
        self._button_layout.addWidget(self.plot_btn)

        self._button_layout.addSpacerItem(HorizontalSpacerItem())
        '''
        self._button_layout.addWidget(VerticalLine())
        self._button_layout.addWidget(VerticalLine())
        self._button_layout.addWidget(self.save_btn)
        '''
        self.button_widget.setLayout(self._button_layout)
        self._layout.addWidget(self.button_widget)
        self._body_layout = QtWidgets.QHBoxLayout()
        self.tth_tv = QtWidgets.QTreeView()
        self.tth_tv.sortByColumn(0, 0)
        self.tth_tv.setSortingEnabled(True)
        self.tth_tv.setModel(self.multiangle_model)

        self._body_layout.addWidget(self.tth_tv, 10)

        self.make_beam_parameter_widget()

        self._body_layout.addWidget(self.beam_parameter_widget)

        self._layout.addLayout(self._body_layout)
        self.button_2_widget = QtWidgets.QWidget(self)
        self.button_2_widget.setObjectName('options_control_button_2_widget')
        self._button_2_layout = QtWidgets.QHBoxLayout()
        self._button_2_layout.setContentsMargins(0, 0, 0, 0)
        self._button_2_layout.setSpacing(15)
        self.iterations_lbl = QtWidgets.QLabel('Iterations:')
        self._button_2_layout.addWidget(self.iterations_lbl)
        self.iterations_control = QtWidgets.QLineEdit()
        self.iterations_control.setText('1')
        self._button_2_layout.addWidget(self.iterations_control)
        self.run_btn = FlatButton('Run')
        self._button_2_layout.addWidget(self.run_btn, 0)
        self.stop_btn = FlatButton('Stop')
        self._button_2_layout.addWidget(self.stop_btn, 0)
        self.test_btn = FlatButton('Test')
        self._button_2_layout.addWidget(self.test_btn, 0)
        self.setup_btn = FlatButton('Setup')
        self._button_2_layout.addWidget(self.setup_btn, 0)

        #self._button_2_layout.addWidget(VerticalLine())
        self._button_2_layout.addSpacerItem(HorizontalSpacerItem())
        #self._button_2_layout.addWidget(VerticalLine())
        self.button_2_widget.setLayout(self._button_2_layout)
        self._layout.addWidget(HorizontalLine())
        self._layout.addWidget(self.button_2_widget)

        self.setLayout(self._layout)
        self.style_widgets()

        self.show_parameter_in_pattern = True
        #self.tth_tv.setItemDelegate(NoRectDelegate())
        columns = self.multiangle_model.columnCount()
        self.tth_tv.resizeColumnToContents(0)
        header = self.tth_tv.header()
        for ind in range(columns):
            header.setSectionResizeMode(ind, QtWidgets.QHeaderView.Stretch)

        self.make_connections()

    def make_beam_parameter_widget(self):

        self.beam_parameter_widget = QtWidgets.QWidget()
        self._beam_layout = QtWidgets.QVBoxLayout()
        self._beam_parameter_layout = QtWidgets.QGridLayout()

        self.tip_size_sb = DoubleSpinBoxAlignRight()
        self.tip_size_sb.setMinimumWidth(100)
        self.tip_size_sb.setMaximum(1000)
        self.tip_size_sb.setMinimum(5e-3)
        self.tip_size_sb.setValue(0.05)
        self.tip_size_sb.setDecimals(3)
        self.tip_size_sb.setSingleStep(0.005)

        self.tip_distance_sb = DoubleSpinBoxAlignRight()
        self.tip_distance_sb.setMinimumWidth(100)
        self.tip_distance_sb.setMaximum(10000)
        self.tip_distance_sb.setMinimum(1e-3)
        self.tip_distance_sb.setValue(60)

        self.det_distance_sb = DoubleSpinBoxAlignRight()
        self.det_distance_sb.setMinimumWidth(100)
        self.det_distance_sb.setMaximum(10000)
        self.det_distance_sb.setMinimum(1e-3)
        self.det_distance_sb.setValue(600)

        self._beam_parameter_layout.addWidget(
            QtWidgets.QLabel('Beam alignment parameters'), 0, 0, 1, 2)
        self._beam_parameter_layout.addWidget(QtWidgets.QLabel('Tip size'), 1,
                                              0)
        self._beam_parameter_layout.addWidget(QtWidgets.QLabel('Tip distance'),
                                              2, 0)
        self._beam_parameter_layout.addWidget(
            QtWidgets.QLabel('Detector distance'), 3, 0)
        #self._beam_parameter_layout.addWidget(QtWidgets.QLabel('mm'), 1, 3)
        self._beam_parameter_layout.addWidget(self.tip_size_sb, 1, 1)
        self._beam_parameter_layout.addWidget(self.tip_distance_sb, 2, 1)
        self._beam_parameter_layout.addWidget(self.det_distance_sb, 3, 1)
        self._beam_parameter_layout.addWidget(
            QtWidgets.QLabel(
                'D0: Collimation depth at the sample center (mm)'), 5, 0, 1, 2)
        self._beam_parameter_layout.addWidget(
            QtWidgets.QLabel('D1: Maximum collimation depth (mm)'), 6, 0, 1, 2)
        self._beam_layout.addLayout(self._beam_parameter_layout)
        self._beam_layout.addSpacerItem(VerticalSpacerItem())
        self.beam_parameter_widget.setLayout(self._beam_layout)

    def make_connections(self):
        #self.tth_tv.itemChanged.connect(self.fract_item_changed)
        self.new_btn.clicked.connect(self.new_callback)

    def new_callback(self):
        self.parameter_widget.raise_widget()

    def style_widgets(self):
        self.tth_tv.setSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding,
                                  QtWidgets.QSizePolicy.MinimumExpanding)
        self.tth_tv.setMinimumWidth(600)
        self.tth_tv.setMinimumHeight(110)
        self.setStyleSheet("""
            #control_button_widget FlatButton {
                min-width: 70;
                max-width: 70;
            }
            #options_control_button_2_widget FlatButton {
                min-width: 70;
                max-width: 70;
            }
            
        """)

    ################################################################################################
    # Now comes all the tth tw stuff
    ################################################################################################

    def closeEvent(self, QCloseEvent, *event):
        # Overrides close event to let controller know that widget was closed by user
        self.widget_closed.emit()

    def select_tth(self, ind):
        self.tth_tv.selectRow(ind)

    def get_selected_tth_row(self):
        selected = self.tth_tv.selectionModel().selectedRows()
        try:
            row = selected[0].row()
        except IndexError:
            row = -1
        return row

    def raise_widget(self):
        self.show()
        self.setWindowState(self.windowState() & ~QtCore.Qt.WindowMinimized
                            | QtCore.Qt.WindowActive)
        self.activateWindow()
        self.raise_()