def __change_element(self):
        """Shows dialog to change selection element.
        """
        dialog = ElementSelectionDialog()
        # Only disable these once, not if you cancel after selecting once.
        if self.element_button.text() == "Select":
            self.isotope_radio.setEnabled(False)
            self.standard_mass_radio.setEnabled(False)
            self.standard_mass_label.setEnabled(False)
        # If element was selected, proceed to enable appropriate fields.
        if dialog.element:
            self.element_button.setText(dialog.element)
            self.__enable_element_fields(dialog.element)
            self.__set_color_button_color(dialog.element)
            self.tmp_element = dialog.element

            if self.isotope_combobox.count() == 0:
                self.isotopeInfoLabel.setVisible(True)
                iv.set_input_field_red(self.isotope_combobox)
                self.setMinimumHeight(243)
            else:
                self.isotopeInfoLabel.setVisible(False)
                self.isotope_combobox.setStyleSheet("background-color: %s" %
                                                    "None")
                self.setMinimumHeight(200)

            self.__check_if_settings_ok()
Exemple #2
0
    def __change_type_to_erd(self):
        """Change sample settings to ERD mode.
        """
        # Put RBS information to sample settings.
        self.sample_isotope_combobox.clear()
        self.sample_element_button.setText(self.rbs_element_button.text())
        self.sample_isotope_radio.setChecked(
            self.rbs_isotope_radio.isChecked())
        self.sample_isotope_combobox.setEnabled(
            self.rbs_isotope_radio.isChecked())
        self.sample_standard_mass_radio.setChecked(
            self.rbs_standard_mass_radio.isChecked())
        self.sample_standard_mass_label.setText(
            self.rbs_standard_mass_label.text())
        current_isotope = None
        if self.rbs_element_button.text() != "Select":
            if self.sample_isotope_radio.isChecked():
                data = self.rbs_isotope_combobox.currentData()
                if data:
                    current_isotope = data["element"].isotope
                    self.sampleIsotopeInfoLabel.setVisible(False)
                    self.sample_isotope_combobox.setStyleSheet(
                        "background-color: %s" % "None")
                else:
                    iv.set_input_field_red(self.sample_isotope_combobox)
                    self.sampleIsotopeInfoLabel.setVisible(True)
            else:
                if self.rbsIsotopeInfoLabel.isVisible():
                    iv.set_input_field_red(self.sample_isotope_combobox)
                    self.sampleIsotopeInfoLabel.setVisible(True)
                else:
                    self.sample_isotope_combobox.setStyleSheet(
                        "background-color: %s" % "None")
                    self.sampleIsotopeInfoLabel.setVisible(False)
            self.__enable_element_fields(self.rbs_element_button.text(),
                                         self.sample_isotope_combobox,
                                         self.sample_isotope_radio,
                                         self.sample_standard_mass_radio,
                                         self.sample_standard_mass_label,
                                         current_isotope=current_isotope)
        if self.sample_element_button.text() == "Select":
            self.sample_standard_mass_label.setEnabled(False)
            self.sample_standard_mass_radio.setEnabled(False)
            self.sample_isotope_radio.setEnabled(False)
            self.colorButton.setStyleSheet("")  # Clear style
            self.colorButton.setText("Automatic")

        # Clear RBS area.
        self.rbs_element_button.setText("Select")
        self.rbs_standard_mass_label.setText("0")
        self.rbs_isotope_combobox.clear()
        # Switch to this by default.
        self.rbs_standard_mass_radio.setChecked(True)
        if current_isotope:
            self.__set_isotope_weight_factor(self.sample_isotope_combobox)

        self.groupBox_rbs.setEnabled(False)
        self.groupBox_rbs.setVisible(False)
        self.groupBox_sample.setEnabled(True)
        self.groupBox_sample.setVisible(True)
Exemple #3
0
    def __init__(self, target):
        """
        Initialize the dialog.

        Args:
            target: Target object.
        """
        super().__init__()
        uic.loadUi(gutils.get_ui_dir() / "ui_target_info.ui", self)

        self.target = target

        self.okPushButton.clicked.connect(self.__accept_settings)
        self.cancelPushButton.clicked.connect(self.close)

        self.fields_are_valid = False
        iv.set_input_field_red(self.nameLineEdit)
        self.nameLineEdit.textChanged.connect(
            lambda: iv.check_text(self.nameLineEdit, qwidget=self))
        self.nameLineEdit.textEdited.connect(
            lambda: iv.sanitize_file_name(self.nameLineEdit))
        self.nameLineEdit.setEnabled(False)

        self.name = ""
        self.nameLineEdit.setText(target.name)
        self.descriptionLineEdit.setPlainText(target.description)
        self.description = ""
        self.isOk = False

        self.dateLabel.setText(time.strftime("%c %z %Z", time.localtime(
            target.modification_time)))

        self.__close = True

        self.exec_()
Exemple #4
0
    def __check_if_settings_ok(self):
        """Check that all the settings are okay.

        Return:
             True if the settings are okay and false if some required fields
             are empty.
        """
        settings_ok = True
        help_sum = 0
        elem_widgets = self.get_element_widgets()

        # Check if 'scrollArea' is empty (no elements).
        if not elem_widgets:
            iv.set_input_field_red(self.scrollArea)
            settings_ok = False

        # Check that the element specific settings are okay.
        for widget in elem_widgets:
            elem = widget.get_selected_element()
            if elem is None:
                settings_ok = False
            else:
                help_sum += elem.amount

        if isclose(help_sum, 1.0, rel_tol=1e-6) or isclose(help_sum, 100.0, rel_tol=1e-6):
            for widget in elem_widgets:
                iv.set_input_field_white(widget.amount_spinbox)
            self.amount_mismatch = False
        else:
            for widget in elem_widgets:
                iv.set_input_field_red(widget.amount_spinbox)
            settings_ok = False
            self.amount_mismatch = True
        self.fields_are_valid = settings_ok
Exemple #5
0
    def __init__(self, tmp_foils, tmp_index, icon_manager):
        """ Initializes the Foil Dialog.
        Args:
            tmp_foils: Foil object list.
            tmp_index: Index of the Foil object in tmp_foils.
            icon_manager: Icon manager for TargetCompositionWidget.
        """
        super().__init__()
        uic.loadUi(gutils.get_ui_dir() / "ui_composition_dialog.ui", self)

        self.icon_manager = icon_manager
        self.foils = tmp_foils
        self.index = tmp_index
        self.tmp_foil = copy.deepcopy(tmp_foils[tmp_index])
        self.foil_type = None
        self.foil_type_changed = False

        # Add foil types to combobox.
        self.typeComboBox.addItem("circular")
        self.typeComboBox.addItem("rectangular")

        self.dimension_edits = []
        self.first_dimension_edit = QtWidgets.QDoubleSpinBox()
        self.first_dimension_edit.setMinimum(0.01)
        self.first_dimension_edit.setMaximumWidth(9999.99)
        self.first_dimension_edit.setMaximumWidth(70)
        self.locale = QLocale.c()
        self.first_dimension_edit.setLocale(self.locale)
        self.second_dimension_edit = None
        self.dimension_label = QtWidgets.QLabel("Diameter (mm):")

        self.transmissionEdit.setLocale(self.locale)

        self.dimension_edits.append(self.first_dimension_edit)
        self.dimensionLayout.addWidget(self.dimension_label)
        self.dimensionLayout.addWidget(self.dimension_edits[0])

        self.fields_are_valid = False
        iv.set_input_field_red(self.nameEdit)
        self.nameEdit.textChanged.connect(
            lambda: iv.check_text(self.nameEdit, qwidget=self))
        self.nameEdit.textEdited.connect(
            lambda: iv.sanitize_file_name(self.nameEdit))

        self.show_parameters()

        # This widget adds itself into the matplotlib_layout
        self.composition = FoilCompositionWidget(self, self.tmp_foil,
                                                 self.icon_manager)

        self.typeComboBox.currentIndexChanged.connect(self._change_dimensions)

        self.cancelButton.clicked.connect(self.close)
        self.okButton.clicked.connect(self._save_foil_info_and_close)

        self.__close = True

        self.exec_()
Exemple #6
0
    def __init__(self, recoil_element: RecoilElement, colormap,
                 element_simulation: ElementSimulation):
        """Inits a recoil info dialog.

        Args:
            recoil_element: A RecoilElement object.
            colormap: Colormap for elements.
            element_simulation: Element simulation that has the recoil element.
        """
        super().__init__()
        self.recoil_element = recoil_element
        self.element_simulation = element_simulation

        self.tmp_color = QColor(self.recoil_element.color)
        self.colormap = colormap

        value = self.recoil_element.reference_density
        self.scientific_spinbox = ScientificSpinBox(value=value,
                                                    minimum=0.01,
                                                    maximum=9.99e23)

        uic.loadUi(gutils.get_ui_dir() / "ui_recoil_info_dialog.ui", self)

        self.okPushButton.clicked.connect(self.__accept_settings)
        self.cancelPushButton.clicked.connect(self.close)
        self.colorPushButton.clicked.connect(self.__change_color)

        self.fields_are_valid = True
        iv.set_input_field_red(self.nameLineEdit)
        self.nameLineEdit.textChanged.connect(
            lambda: iv.check_text(self.nameLineEdit, qwidget=self))
        self.nameLineEdit.textEdited.connect(self.__validate)

        self.name = recoil_element.name
        self.description = recoil_element.description
        self.formLayout.insertRow(
            4, QtWidgets.QLabel(r"Reference density [at./cm<sup>3</sup>]:"),
            self.scientific_spinbox)
        self.formLayout.removeRow(self.widget)

        self.description = recoil_element.description
        self.isOk = False

        self.dateLabel.setText(
            time.strftime(
                "%c %z %Z",
                time.localtime(self.recoil_element.modification_time)))

        title = f"Recoil element: " \
                f"{self.recoil_element.element.get_prefix()}"

        self.infoGroupBox.setTitle(title)

        self.__set_color_button_color(self.recoil_element.element.symbol)

        self.exec_()
Exemple #7
0
    def __init__(self,
                 element_simulation: ElementSimulation,
                 preset_folder=None):
        """
        Initializes the widget.

        Args:
            element_simulation: Element simulation object.
        """
        super().__init__()
        uic.loadUi(gutils.get_ui_dir() / "ui_request_simulation_settings.ui",
                   self)

        # By default, disable the widget, so caller has to enable it. Without
        # this, name and description fields would always be enabled when the
        # widget loads.
        self.setEnabled(False)
        self.element_simulation = element_simulation
        self.set_spinbox_maximums()
        gutils.fill_combobox(self.modeComboBox, SimulationMode)
        gutils.fill_combobox(self.typeOfSimulationComboBox, SimulationType)

        self.fields_are_valid = False
        iv.set_input_field_red(self.nameLineEdit)
        self.nameLineEdit.textChanged.connect(
            lambda: iv.check_text(self.nameLineEdit, qwidget=self))
        self.nameLineEdit.textEdited.connect(
            lambda: iv.sanitize_file_name(self.nameLineEdit))
        self.nameLineEdit.setEnabled(False)

        locale = QLocale.c()
        self.minimumScatterAngleDoubleSpinBox.setLocale(locale)
        self.minimumMainScatterAngleDoubleSpinBox.setLocale(locale)
        self.minimumEnergyDoubleSpinBox.setLocale(locale)

        self.__original_property_values = {}

        self.set_properties(
            name=self.element_simulation.name,
            description=self.element_simulation.description,
            modification_time=self.element_simulation.modification_time,
            **self.element_simulation.get_settings())

        if preset_folder is not None:
            self.preset_widget = PresetWidget.add_preset_widget(
                preset_folder / "simulation",
                "sim",
                lambda w: self.layout().insertWidget(0, w),
                save_callback=self.save_properties_to_file,
                load_callback=self.load_properties_from_file)
        else:
            self.preset_widget = None
Exemple #8
0
    def validate(self):
        """Validates the contents of the Widget, setting background colors
        and error messages if necessary.
        """
        valid_selection = bool(self.get_element())
        self._isotope_input.setEnabled(valid_selection)

        if valid_selection:
            self._isotope_input.setStyleSheet("background-color: %s" % "None")
            if self._info_label is not None:
                self._info_label.setText("")
        else:
            iv.set_input_field_red(self._isotope_input)
            self._symbol_input.setText("Select")
            if self._info_label is not None:
                self._info_label.setText(
                    IsotopeSelectionWidget.MISSING_ISOTOPE_TXT)
            if self._parent is not None:
                self._parent.fields_are_valid = False
Exemple #9
0
    def __change_element(self,
                         button,
                         isotope_combobox,
                         standard_mass_label,
                         standard_mass_radio,
                         isotope_radio,
                         isotope_info_label,
                         sample=True):
        """Shows dialog to change selection element.
        
        Args:
            button: QtWidgets.QPushButton (button to select element)
            isotope_combobox: QtWidgets.QComboBox
            isotope_radio: QtGui.QRadioButton
            standard_mass_radio: QtGui.QRadioButton
            standard_mass_label: QtWidgets.QLabel
            isotope_info_label: Label that shows if element doesn't have any
            natural isotopes.
            sample: Whether the element is from sample or rbs.
        """
        # TODO implement or remove sample parameter
        dialog = ElementSelectionDialog()
        # Only disable these once, not if you cancel after selecting once.
        if button.text() == "Select":
            isotope_radio.setEnabled(False)
            standard_mass_radio.setEnabled(False)
            standard_mass_label.setEnabled(False)
        # If element was selected, proceed to enable appropriate fields.
        if dialog.element:
            button.setText(dialog.element)
            self.__enable_element_fields(dialog.element, isotope_combobox,
                                         isotope_radio, standard_mass_radio,
                                         standard_mass_label)

            if isotope_combobox.count() == 0:
                isotope_info_label.setVisible(True)
                iv.set_input_field_red(isotope_combobox)
            else:
                isotope_info_label.setVisible(False)
                isotope_combobox.setStyleSheet("background-color: %s" % "None")
Exemple #10
0
    def __init__(self,
                 value=0.0,
                 minimum=0.0,
                 maximum=math.inf,
                 decimal_places=17,
                 show_btns=True):
        """
        Initializes the spinbox.

        Args:
            value: value of spinbox
            minimum: minimum allowed value
            maximum: maximum allowed value
            decimal_places: maximum number of decimals to show
            show_btns: Whether buttons that increase or decrease the value
                are shown.
        """
        super().__init__()
        uic.loadUi(gutils.get_ui_dir() / "ui_scientific_spinbox_widget.ui",
                   self)
        self._value = Decimal(str(value))
        self.minimum = minimum
        self.maximum = maximum
        if decimal_places < 1:
            self._decimal_places = 1
        elif decimal_places > 17:
            self._decimal_places = 17
        else:
            self._decimal_places = decimal_places

        self.scientificLineEdit: QtWidgets.QLineEdit
        self._validator = ScientificValidator(
            self.minimum,
            self.maximum,
            self._decimal_places,
            self,
            accepted=lambda: iv.set_input_field_white(self.scientificLineEdit),
            intermediate=lambda: iv.set_input_field_yellow(self.
                                                           scientificLineEdit),
            invalid=lambda: iv.set_input_field_red(self.scientificLineEdit))
        self.scientificLineEdit.setValidator(self._validator)

        self.set_value(self._value)

        if show_btns:
            self.upButton.clicked.connect(
                lambda *_: self._step_adjustment(self._up_step))
            self.downButton.clicked.connect(
                lambda *_: self._step_adjustment(self._down_step))
        else:
            self.upButton.hide()
            self.downButton.hide()
Exemple #11
0
    def __init__(self, samples):
        """Inits a new sample dialog.

        Args:
            samples: List of samples.
        """
        super().__init__()
        uic.loadUi(gutils.get_ui_dir() / "ui_new_sample.ui", self)

        self.createButton.clicked.connect(self.__create_sample)
        self.cancelButton.clicked.connect(self.close)
        self.name = ""
        self.description = ""
        self.samples = samples
        self.__close = True

        iv.set_input_field_red(self.nameLineEdit)
        self.nameLineEdit.textChanged.connect(
            lambda: iv.check_text(self.nameLineEdit))
        self.nameLineEdit.textEdited.connect(
            lambda: iv.sanitize_file_name(self.nameLineEdit))

        self.exec_()
Exemple #12
0
    def __init__(self, parent):
        """Inits energy spectrum dialog.
        
        Args:
            parent: Ibasoft class object.
        """
        super().__init__()
        uic.loadUi(gutils.get_ui_dir() / "ui_new_request.ui", self)

        self.parent = parent
        self.folder = None  # Temporary for browsing folder
        self.directory = None

        self.requestDirectoryLineEdit.setText(
            str(self.parent.settings.get_request_directory()))

        # Connect buttons
        self.pushOk.clicked.connect(self.__create_request)
        self.pushCancel.clicked.connect(self.close)
        self.browseFolderButton.clicked.connect(self.__browser_folder)

        iv.set_input_field_red(self.requestNameLineEdit)
        self.requestNameLineEdit.textChanged.connect(
            lambda: iv.check_text(self.requestNameLineEdit))
        self.requestNameLineEdit.textEdited.connect(
            lambda: iv.sanitize_file_name(self.requestNameLineEdit))

        self.requestDirectoryLineEdit.textChanged.connect(
            lambda: iv.check_text(self.requestDirectoryLineEdit))

        self.__close = True

        if platform.system() == "Darwin":
            self.requestNameLineEdit.setMinimumWidth(310)
            self.requestDirectoryLineEdit.setMinimumWidth(234)

        self.exec_()
Exemple #13
0
    def __init__(self, samples):
        """Inits a new simulation dialog.

        Args:
            samples: Samples of request.
        """
        super().__init__()
        uic.loadUi(gutils.get_ui_dir() / "ui_new_simulation.ui", self)

        # Add existing samples to view.
        self.samples = samples
        for sample in samples:
            self.samplesComboBox.addItem("Sample " +
                                         "%02d" % sample.serial_number + " " +
                                         sample.name)

        if not samples:
            iv.set_input_field_red(self.samplesComboBox)

        self.addSampleButton.clicked.connect(self.__add_sample)
        self.pushCreate.clicked.connect(self.__create_simulation)
        self.pushCancel.clicked.connect(self.close)
        self.name = None
        self.sample = None
        self.__close = True

        iv.set_input_field_red(self.simulationNameLineEdit)
        self.simulationNameLineEdit.textChanged.connect(
            lambda: iv.check_text(self.simulationNameLineEdit))
        self.simulationNameLineEdit.textEdited.connect(
            lambda: iv.sanitize_file_name(self.simulationNameLineEdit))

        if platform.system() == "Darwin":
            self.samplesComboBox.setMinimumWidth(157)

        self.exec_()
Exemple #14
0
    def change_element(self):
        """Opens element selection dialog and loads selected element's isotopes
        to the combobox.
        """
        dialog = ElementSelectionDialog()
        if dialog.element:
            self.beamIonButton.setText(dialog.element)
            # TODO use IsotopeSelectionWidget
            gutils.load_isotopes(dialog.element, self.isotopeComboBox)

            # Check if no isotopes
            if self.isotopeComboBox.count() == 0:
                self.isotopeInfoLabel.setVisible(True)
                self.fields_are_valid = False
                iv.set_input_field_red(self.isotopeComboBox)
                self.beam_selection_ok.emit(False)
            else:
                self.isotopeInfoLabel.setVisible(False)
                iv.check_text(self.nameLineEdit, qwidget=self)
                self.isotopeComboBox.setStyleSheet(
                    "background-color: %s" % "None")
                self.beam_selection_ok.emit(True)
        else:
            self.beam_selection_ok.emit(False)
Exemple #15
0
    def __init__(self, samples, directory):
        """Inits a load measurement dialog.

        Args:
            samples: Samples of request.
            directory: Directory where to open the file browser.
        """
        super().__init__()
        uic.loadUi(gutils.get_ui_dir() / "ui_new_measurement.ui", self)

        self.browseButton.clicked.connect(self.__browse_files)
        self.addSampleButton.clicked.connect(self.__add_sample)
        self.loadButton.clicked.connect(self.__load_measurement)
        self.cancelButton.clicked.connect(self.close)
        self.name = ""
        self.sample = None
        self.directory = directory
        self.filename = ""
        self.samples = samples

        self.__close = True
        for sample in samples:
            self.samplesComboBox.addItem("Sample " +
                                         "%02d" % sample.serial_number + " " +
                                         sample.name)

        if not samples:
            iv.set_input_field_red(self.samplesComboBox)

        iv.set_input_field_red(self.pathLineEdit)
        self.pathLineEdit.textChanged.connect(
            lambda: iv.check_text(self.pathLineEdit))

        iv.set_input_field_red(self.nameLineEdit)
        self.nameLineEdit.textChanged.connect(
            lambda: iv.check_text(self.nameLineEdit))
        self.nameLineEdit.textEdited.connect(
            lambda: iv.sanitize_file_name(self.nameLineEdit))

        self.exec_()
Exemple #16
0
    def __init__(self, tab, layer=None, modify=False, simulation=None,
                 first_layer=False):
        """Inits a layer dialog.

        Args:
            tab: A SimulationTabWidget
            layer: Layer object to be modified. None if creating a new layer.
            modify: If dialog is used to modify a layer.
            simulation: A Simulation object.
            first_layer: Whether the dialog is used to add the first layer.
        """
        super().__init__()
        uic.loadUi(gutils.get_ui_dir() / "ui_layer_dialog.ui", self)

        self.tab = tab
        self.layer = layer
        self.ok_pressed = False
        self.simulation = simulation
        self.amount_mismatch = True

        self.fields_are_valid = True
        iv.set_input_field_red(self.nameEdit)
        self.nameEdit.textChanged.connect(
            lambda: iv.check_text(self.nameEdit, self))
        self.nameEdit.textEdited.connect(
            lambda: iv.sanitize_file_name(self.nameEdit))

        # Connect buttons to events
        self.addElementButton.clicked.connect(self.__add_element_layout)
        self.okButton.clicked.connect(self.__save_layer)
        self.cancelButton.clicked.connect(self.close)

        self.thicknessEdit.setMinimum(0.01)
        self.densityEdit.setMinimum(0.01)

        self.__original_properties = {}

        if self.layer:
            self.__show_layer_info()
        else:
            self.__add_element_layout()

        if first_layer:
            self.groupBox_2.hide()

        self.__close = True

        self.thicknessEdit.setLocale(QLocale.c())
        self.densityEdit.setLocale(QLocale.c())

        if modify:
            self.groupBox_2.hide()

        self.placement_under = True

        if platform.system() == "Darwin":
            self.setMinimumWidth(450)

        if platform.system() == "Linux":
            self.setMinimumWidth(470)

        self.exec_()
Exemple #17
0
    def __change_type_to_rbs(self):
        """Change sample settings to RBS mode.
        """
        self.rbs_isotope_combobox.clear()
        current_isotope = None
        # Put current sample settings to RBS
        if self.sample_element_button.text() != "Select":
            self.rbs_element_button.setText(self.sample_element_button.text())
            self.rbs_isotope_radio.setChecked(
                self.sample_isotope_radio.isChecked())
            self.rbs_isotope_combobox.setEnabled(
                self.sample_isotope_radio.isChecked())
            self.rbs_standard_mass_radio.setChecked(
                self.sample_standard_mass_radio.isChecked())

            if self.sample_isotope_radio.isChecked():
                data = self.sample_isotope_combobox.currentData()

                if data:
                    current_isotope = data["element"].isotope
                    self.rbsIsotopeInfoLabel.setVisible(False)
                    self.rbs_isotope_combobox.setStyleSheet(
                        "background-color: %s" % "None")
                else:
                    current_isotope = None
                    iv.set_input_field_red(self.rbs_isotope_combobox)
                    self.rbsIsotopeInfoLabel.setVisible(True)
            else:
                if self.sampleIsotopeInfoLabel.isVisible():
                    current_isotope = None
                    iv.set_input_field_red(self.rbs_isotope_combobox)
                    self.rbsIsotopeInfoLabel.setVisible(True)
                else:
                    self.rbsIsotopeInfoLabel.setVisible(False)
                    self.rbs_isotope_combobox.setStyleSheet(
                        "background-color: %s" % "None")
            self.__enable_element_fields(self.sample_element_button.text(),
                                         self.rbs_isotope_combobox,
                                         self.rbs_isotope_radio,
                                         self.rbs_standard_mass_radio,
                                         self.rbs_standard_mass_label,
                                         current_isotope=current_isotope)
        # Put Scatter Element settings to dialog
        else:
            if self.selection.element_scatter != "":
                self.rbs_element_button.setText(
                    self.selection.element_scatter.symbol)
            else:
                self.rbs_element_button.setText("Select")
            if self.selection.element_scatter and \
                    self.selection.element_scatter.isotope:
                self.rbs_isotope_radio.setChecked(True)
                self.rbs_isotope_combobox.setEnabled(True)
                self.rbs_standard_mass_radio.setChecked(False)

                current_isotope = self.selection.element_scatter.isotope
            else:
                self.rbs_isotope_radio.setChecked(False)
                self.rbs_isotope_combobox.setEnabled(False)
                if self.selection.element_scatter:
                    self.rbs_standard_mass_radio.setChecked(True)
                else:
                    self.rbs_standard_mass_radio.setChecked(False)

            self.__enable_element_fields(self.rbs_element_button.text(),
                                         self.rbs_isotope_combobox,
                                         self.rbs_isotope_radio,
                                         self.rbs_standard_mass_radio,
                                         self.rbs_standard_mass_label,
                                         current_isotope=current_isotope)

        self.sample_standard_mass_radio.setEnabled(False)
        self.sample_standard_mass_label.setEnabled(False)

        self.sample_isotope_radio.setChecked(True)
        self.sample_isotope_radio.setEnabled(False)
        self.sample_isotope_combobox.setEnabled(False)

        self.__set_color_button_color(self.rbs_element_button.text())
        if current_isotope:
            self.__set_isotope_weight_factor(self.rbs_isotope_combobox)

        self.groupBox_sample.setEnabled(False)
        self.groupBox_sample.setVisible(False)
        self.groupBox_rbs.setEnabled(True)
        self.groupBox_rbs.setVisible(True)
Exemple #18
0
    def __init__(self, obj: Union[Measurement, Simulation], preset_folder=None):
        """Initializes the widget.

        Args:
            obj: object that uses these settings, either a Measurement or a
                Simulation.
        """
        super().__init__()
        uic.loadUi(gutils.get_ui_dir() / "ui_measurement_settings_tab.ui", self)
        self.fluenceDoubleSpinBox = ScientificSpinBox()
        image = gf.get_root_dir() / "images" / "measurement_setup_angles.png"
        pixmap = QtGui.QPixmap(str(image))
        self.picture.setScaledContents(True)
        self.picture.setPixmap(pixmap)

        self.obj = obj
        self.__original_property_values = {}

        locale = QLocale.c()

        self.energyDoubleSpinBox.setLocale(locale)
        self.energyDistDoubleSpinBox.setLocale(locale)
        self.spotSizeXdoubleSpinBox.setLocale(locale)
        self.spotSizeYdoubleSpinBox.setLocale(locale)
        self.divergenceDoubleSpinBox.setLocale(locale)
        self.currentDoubleSpinBox.setLocale(locale)
        self.timeDoubleSpinBox.setLocale(locale)
        self.runChargeDoubleSpinBox.setLocale(locale)

        self.targetThetaDoubleSpinBox.setLocale(locale)
        self.detectorThetaDoubleSpinBox.setLocale(locale)
        self.detectorFiiDoubleSpinBox.setLocale(locale)
        self.targetFiiDoubleSpinBox.setLocale(locale)

        # Fii angles are currently not used so disable their spin boxes
        self.detectorFiiDoubleSpinBox.setEnabled(False)
        self.targetFiiDoubleSpinBox.setEnabled(False)
        gutils.fill_combobox(self.profileComboBox, Profile)

        # Copy of measurement's/simulation's run or default run
        # TODO should default run also be copied?
        if not self.obj.run:
            self.tmp_run = self.obj.request.default_run
        else:
            self.tmp_run = copy.deepcopy(self.obj.run)

        self.isotopeInfoLabel.setVisible(False)

        self.beamIonButton.clicked.connect(self.change_element)

        self.fields_are_valid = False
        iv.set_input_field_red(self.nameLineEdit)
        self.nameLineEdit.textChanged.connect(
            lambda: iv.check_text(self.nameLineEdit, qwidget=self))
        self.nameLineEdit.textEdited.connect(self.__validate)
        self.nameLineEdit.setEnabled(False)

        self.run_form_layout: QtWidgets.QFormLayout
        self.run_form_layout.insertRow(3, "Fluence", self.fluenceDoubleSpinBox)
        self.fluenceDoubleSpinBox.scientificLineEdit.setContextMenuPolicy(
            Qt.ActionsContextMenu)
        self.actionMultiply = QtWidgets.QAction(
            self.fluenceDoubleSpinBox.scientificLineEdit)
        self.actionMultiply.triggered.connect(self.__multiply_fluence)
        self.fluenceDoubleSpinBox.scientificLineEdit.addAction(
            self.actionMultiply)

        self.actionUndo = QtWidgets.QAction(
            self.fluenceDoubleSpinBox.scientificLineEdit)
        self.actionUndo.setText("Undo multiply")
        self.actionUndo.triggered.connect(self.__undo_fluence)

        self.actionUndo.setEnabled(bool(self.tmp_run.previous_fluence))
        self.fluenceDoubleSpinBox.scientificLineEdit.addAction(self.actionUndo)

        self.clipboard = QGuiApplication.clipboard()
        self._ratio = None
        self.clipboard.changed.connect(self.__update_multiply_action)
        self.__update_multiply_action()

        self.energyDoubleSpinBox.setToolTip("Energy set in MeV with.")

        if preset_folder is not None:
            self.preset_widget = PresetWidget.add_preset_widget(
                preset_folder / "measurement", "mea",
                lambda w: self.layout().insertWidget(0, w),
                save_callback=self.save_properties_to_file,
                load_callback=self.load_properties_from_file
            )
        else:
            self.preset_widget = None

        self.show_settings()
Exemple #19
0
    def __init__(self,
                 obj: Detector,
                 request: Request,
                 icon_manager,
                 run=None):
        """Initializes a DetectorSettingsWidget object.

        Args:
              obj: a Detector object.
              request: Which request it belongs to.
              icon_manager: IconManager object.
              run: Run object. None if detector is default detector.
        """
        super().__init__()
        uic.loadUi(gutils.get_ui_dir() / "ui_request_detector_settings.ui",
                   self)

        self.obj = obj
        self.request = request
        self.icon_manager = icon_manager
        self.run = run
        self.__original_properties = {}

        # Temporary foils list which holds all the information given in the
        # foil dialog
        # If user presses ok or apply, these values will be saved into
        # request's default detector
        self.tmp_foil_info = []

        # List of foil indexes that are timing foils
        self.tof_foils = []

        # Add foil widgets and foil objects
        self.detector_structure_widgets = []
        self.foils_layout = self._add_default_foils(self.obj)
        self.detectorScrollAreaContents.layout().addLayout(self.foils_layout)
        self.newFoilButton.clicked.connect(
            lambda: self._add_new_foil(self.foils_layout))

        self.addEfficiencyButton.clicked.connect(self.__add_efficiency)
        self.removeEfficiencyButton.clicked.connect(self.__remove_efficiency)
        self.plotEfficiencyButton.clicked.connect(self.__plot_efficiency)

        self.efficiencyListWidget.itemSelectionChanged.connect(
            self._enable_remove_btn)
        self._enable_remove_btn()

        # Calibration settings
        # TODO: Require saving affected cuts if beam setting has been changed
        self.executeCalibrationButton.clicked.connect(
            self.__open_calibration_dialog)
        self.executeCalibrationButton.setEnabled(
            not self.request.samples.measurements.is_empty())

        gutils.fill_combobox(self.typeComboBox, DetectorType)

        self.fields_are_valid = False
        iv.set_input_field_red(self.nameLineEdit)
        self.nameLineEdit.textChanged.connect(
            lambda: iv.check_text(self.nameLineEdit, qwidget=self))
        self.nameLineEdit.textEdited.connect(
            lambda: iv.sanitize_file_name(self.nameLineEdit))
        self.nameLineEdit.setEnabled(False)

        locale = QLocale.c()
        self.timeResSpinBox.setLocale(locale)
        self.virtualSizeXSpinBox.setLocale(locale)
        self.virtualSizeYSpinBox.setLocale(locale)
        self.angleSlopeLineEdit.setLocale(locale)
        self.angleOffsetLineEdit.setLocale(locale)

        # Create scientific spinboxes for tof slope and tof offset
        self.formLayout_2.removeRow(self.slopeLineEdit)
        self.formLayout_2.removeRow(self.offsetLineEdit)

        self.scientific_tof_slope = ScientificSpinBox(minimum=-math.inf,
                                                      maximum=math.inf)
        self.scientific_tof_offset = ScientificSpinBox(minimum=-math.inf,
                                                       maximum=math.inf)

        self.formLayout_2.insertRow(0, "ToF slope [s/channel]:",
                                    self.scientific_tof_slope)
        self.formLayout_2.insertRow(1, "ToF offset[s]:",
                                    self.scientific_tof_offset)

        if platform.system() == "Darwin":
            self.scientific_tof_offset.scientificLineEdit.setFixedWidth(170)
            self.scientific_tof_slope.scientificLineEdit.setFixedWidth(170)

        # Save as and load
        self.saveButton.clicked.connect(self.__save_file)
        self.loadButton.clicked.connect(self.__load_file)

        self.show_settings()