Beispiel #1
0
    def __init__(self, parent=None, item=None):
        super().__init__(parent)
        self.setWindowModality(Qt.WindowModal)
        self.setWindowTitle(self.tr("Edit…"))

        nameLabel = QLabel(self.tr("Name:"), self)
        self.nameEdit = QLineEdit(self)
        self.nameEdit.setFocus(Qt.OtherFocusReason)

        validator = QDoubleValidator(self)
        validator.setLocale(QLocale.c())
        xLabel = QLabel(self.tr("X:"), self)
        self.xEdit = QLineEdit(self)
        self.xEdit.setValidator(validator)
        yLabel = QLabel(self.tr("Y:"), self)
        self.yEdit = QLineEdit(self)
        self.yEdit.setValidator(validator)

        buttonBox = QDialogButtonBox(QDialogButtonBox.Ok
                                     | QDialogButtonBox.Cancel)
        buttonBox.accepted.connect(self.accept)
        buttonBox.rejected.connect(self.reject)

        layout = QGridLayout(self)
        line = 0
        layout.addWidget(nameLabel, line, 0)
        layout.addWidget(self.nameEdit, line, 1, 1, 3)
        line += 1
        layout.addWidget(xLabel, line, 0)
        layout.addWidget(self.xEdit, line, 1)
        layout.addWidget(yLabel, line, 2)
        layout.addWidget(self.yEdit, line, 3)
        line += 1
        layout.addWidget(buttonBox, line, 3)
        self.setLayout(layout)
Beispiel #2
0
    def __init__(self, clipboard_ratio):
        """
        Initializes the dialog.

        Args:
            clipboard_ratio: Text that is in clipboard.
        """
        super().__init__()
        uic.loadUi(gutils.get_ui_dir() / "ui_multiply_coordinate_dialog.ui",
                   self)

        self.ratio_str = clipboard_ratio
        self.used_multiplier = None

        locale = QLocale.c()
        self.multiplierSpinBox.setLocale(locale)

        try:
            float(self.ratio_str)

            self.ratioLabel.setText(self.ratio_str)
        except ValueError:
            self.ratioLabel.setText("None")
            self.ratioLabel.setEnabled(False)
            self.clipboardButton.setChecked(False)
            self.clipboardButton.setEnabled(False)

            self.customButton.setChecked(True)
            self.multiplierSpinBox.setEnabled(True)

        self.clipboardButton.clicked.connect(self.switch_to_clipboard_value)
        self.customButton.clicked.connect(self.switch_to_custom_value)
        self.okButton.clicked.connect(self.accept_params)
        self.cancelButton.clicked.connect(self.close)
        self.exec_()
Beispiel #3
0
def _main() -> None:
    """
    Execute the main application loop.

    :return: nothing
    :rtype: None
    """

    app = QApplication(sys.argv)
    QLocale.setDefault(QLocale.c())

    # translation
    language = QLocale.system().name()[:2]
    translations_path = QLibraryInfo.location(QLibraryInfo.TranslationsPath)

    base_translator = QTranslator()
    base_translator.load("qtbase_{}".format(language), translations_path)
    app.installTranslator(base_translator)

    custom_translator = QTranslator()
    custom_translator.load("cafog_{}".format(language))
    app.installTranslator(custom_translator)

    # generate main window
    frame = MainWindow()
    frame.show()
    sys.exit(app.exec_())
Beispiel #4
0
    def __init__(self, simulation: Simulation, parent):
        """Initializes an OptimizationDialog that displays various optimization
        parameters.

        Args:
            simulation: a Simulation object
            parent: a SimulationTabWidget
        """
        super().__init__()
        self.simulation = simulation
        self.tab = parent
        self.current_mode = OptimizationType.RECOIL

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

        self.recoil_widget = OptimizationRecoilParameterWidget()
        self.fluence_widget = OptimizationFluenceParameterWidget()

        self.load_properties_from_file()

        locale = QLocale.c()
        self.histogramTicksDoubleSpinBox.setLocale(locale)

        self.pushButton_OK.setEnabled(False)

        self.pushButton_Cancel.clicked.connect(self.close)
        self.pushButton_OK.clicked.connect(self.start_optimization)

        self.radios = QtWidgets.QButtonGroup(self)
        self.radios.buttonToggled[QtWidgets.QAbstractButton, bool].connect(
            self.choose_optimization_mode)
        self.parametersLayout.addWidget(self.recoil_widget)
        self.parametersLayout.addWidget(self.fluence_widget)
        self.fluence_widget.hide()

        self.radios.addButton(self.fluenceRadioButton)
        self.radios.addButton(self.recoilRadioButton)

        gutils.fill_tree(
            self.simulationTreeWidget.invisibleRootItem(),
            simulation.element_simulations,
            text_func=lambda elem_sim: elem_sim.get_full_name())

        self.simulationTreeWidget.itemSelectionChanged.connect(
            self._enable_ok_button)
        self.simulationTreeWidget.itemSelectionChanged.connect(
            self._adjust_x)
        self.auto_adjust_x_box.clicked.connect(self._adjust_x)

        self._fill_measurement_widget()

        self.measurementTreeWidget.itemSelectionChanged.connect(
            self._enable_ok_button)
        self.verbose = False
        self.eff_file_check_box.clicked.connect(self._enable_efficiency_label)
        # self.optimization_verbose_box.clicked.connect(self._verbose)
        self._update_efficiency_label()

        self.exec_()
Beispiel #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_()
Beispiel #6
0
    def __init__(self,
                 parent: BaseTab,
                 measurement: Measurement,
                 global_settings: GlobalSettings,
                 statusbar: Optional[QtWidgets.QStatusBar] = None):
        """Inits depth profile dialog.
        
        Args:
            parent: a MeasurementTabWidget.
            measurement: a Measurement object
            global_settings: a GlobalSettings object
            statusbar: a QStatusBar object
        """
        super().__init__()
        uic.loadUi(gutils.get_ui_dir() / "ui_depth_profile_params.ui", self)

        self.parent = parent
        self.measurement = measurement
        self.statusbar = statusbar

        # Connect buttons
        self.OKButton.clicked.connect(self._accept_params)
        self.cancelButton.clicked.connect(self.close)

        locale = QLocale.c()
        self.spin_systerr.setLocale(locale)
        self.sbox_reference_density.setLocale(locale)

        m_name = self.measurement.name
        if m_name not in DepthProfileDialog.checked_cuts:
            DepthProfileDialog.checked_cuts[m_name] = set()

        gutils.fill_cuts_treewidget(self.measurement,
                                    self.treeWidget.invisibleRootItem(),
                                    use_elemloss=True)
        self.used_cuts = DepthProfileDialog.checked_cuts[m_name]

        gutils.set_btn_group_data(self.group_x_axis_units, DepthProfileUnit)
        self.x_axis_units = DepthProfileDialog.x_unit
        if self.x_axis_units == DepthProfileUnit.NM:
            self._show_reference_density()
        else:
            self._hide_reference_density()

        self.radioButtonNm.clicked.connect(self._show_reference_density)
        self.radioButtonAtPerCm2.clicked.connect(self._hide_reference_density)

        self.systematic_error = DepthProfileDialog.systerr
        self.show_scale_line = DepthProfileDialog.line_scale
        self.show_zero_line = DepthProfileDialog.line_zero

        self.cross_sections = global_settings.get_cross_sections()

        self._show_measurement_settings()
        self._show_efficiency_files()
        self.exec_()
    def __init__(self, parent, element, dialog):
        """Initializes the layout.
        Args:
            parent: A QWidget into which the layout is added.
            element: Element object whose info is shown. None adding a
            default layout.
            dialog: LayerPropertiesDialog.
        """
        parent.parentWidget().setStyleSheet("")

        super().__init__()
        self.dialog = dialog

        self.element_button = QtWidgets.QPushButton("")
        self.element_button.setFixedWidth(60)

        self.isotope_combobox = QtWidgets.QComboBox()
        self.isotope_combobox.setFixedWidth(130)

        if platform.system() == "Darwin" or platform.system() == "Linux":
            self.isotope_combobox.setFixedWidth(150)

        self.amount_spinbox = QtWidgets.QDoubleSpinBox()
        self.amount_spinbox.setMinimum(0.001)
        self.amount_spinbox.setMaximum(9999.00)
        self.amount_spinbox.setDecimals(3)
        self.amount_spinbox.setLocale(QLocale.c())

        self.delete_button = QtWidgets.QPushButton("")
        self.delete_button.setIcon(icons.get_potku_icon("del.png"))
        self.delete_button.setFixedWidth(28)
        self.delete_button.setFixedHeight(28)

        self.delete_button.clicked.connect(self.__delete_element_layout)

        self.isotope_info_label = QtWidgets.QLabel()

        self.horizontal_layout = QtWidgets.QHBoxLayout()
        self.horizontal_layout.addWidget(self.element_button)
        self.horizontal_layout.addWidget(self.isotope_combobox)
        self.horizontal_layout.addWidget(self.amount_spinbox)
        self.horizontal_layout.addWidget(self.delete_button)

        self.isotope_selection_widget = IsotopeSelectionWidget(
            self.element_button,
            self.isotope_combobox,
            info_label=self.isotope_info_label,
            amount_input=self.amount_spinbox,
            parent=self.dialog)
        self.isotope_selection_widget.set_element(element)
        self.selection_changed = self.isotope_selection_widget.selection_changed

        self.addLayout(self.horizontal_layout)
        self.addWidget(self.isotope_info_label)
        self.insertStretch(-1, 0)
Beispiel #8
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
Beispiel #9
0
    def __init__(self, **kwargs):
        """Initialize the widget.

        Args:
            kwargs: property values to be shown in the widget.
        """
        ui_file = gutils.get_ui_dir() / "ui_optimization_recoil_params.ui"
        super().__init__(ui_file, **kwargs)

        locale = QLocale.c()
        self.upperXDoubleSpinBox.setLocale(locale)
        self.lowerXDoubleSpinBox.setLocale(locale)
        self.upperYDoubleSpinBox.setLocale(locale)
        self.lowerYDoubleSpinBox.setLocale(locale)
Beispiel #10
0
    def __init__(self, foil):
        """
        Initializes the foil widget.

        Args:
            foil: foil object
        """
        super().__init__()
        uic.loadUi(gutils.get_ui_dir() / "ui_foil_widget.ui", self)

        locale = QLocale.c()
        self.distanceDoubleSpinBox.setLocale(locale)
        self.deleteButton.clicked.connect(self._delete_foil)

        self.name = foil.name
        self.distance_from_previous = 0
        self.cumulative_distance = foil.distance
Beispiel #11
0
    def __init__(self, ui_file, **kwargs):
        """Initializes a optimization parameter widget.

        Args:
            ui_file: relative path to a ui_file
            kwargs: values to show in the widget
        """
        super().__init__()
        uic.loadUi(ui_file, self)

        locale = QLocale.c()
        self.crossoverProbDoubleSpinBox.setLocale(locale)
        self.mutationProbDoubleSpinBox.setLocale(locale)
        self.percentDoubleSpinBox.setLocale(locale)

        self.skip_sim_chk_box.stateChanged.connect(self.enable_sim_params)
        self.set_properties(**kwargs)
Beispiel #12
0
def main():
    import sys
    from PyQt5.QtWidgets import QApplication
    from PyQt5.QtCore import Qt, QLocale

    from .gui.main import MainWindow

    from silx.resources import register_resource_directory
    register_resource_directory('crispy', 'crispy.resources')

    QLocale.setDefault(QLocale.c())

    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()

    app.setAttribute(Qt.AA_UseHighDpiPixmaps)
    sys.exit(app.exec_())
Beispiel #13
0
    def __init__(self,
                 main_recoil: RecoilElement,
                 low: Optional[float] = None,
                 high: Optional[float] = None):
        """
        Initializes the dialog.

        Args:
            main_recoil: Main RecoilElement object.
        """
        super().__init__()
        uic.loadUi(gutils.get_ui_dir() / "ui_multiply_area_dialog.ui", self)

        self.main_recoil = main_recoil

        locale = QLocale.c()
        self.fractionDoubleSpinBox.setLocale(locale)

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

        self.fractionCheckBox.stateChanged.connect(self.change_custom)
        self.fractionDoubleSpinBox.valueChanged.connect(
            self.calculate_new_area)

        self.main_area = self.main_recoil.calculate_area(start=low, end=high)
        text = str(round(self.main_area, 2))

        self.mainAreaLabel.setText(text)
        self.totalAreaLabel.setText(text)

        self.new_area = self.main_area
        self.reference_area = self.main_area
        self.fraction = None

        self.is_ok = False

        self.exec_()
Beispiel #14
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_()
Beispiel #15
0
def fix_locale():
    """
    Fix for issues with locale-bound number handling, we basically force decimals to use '.' rather than ','
    """
    from PyQt5.QtCore import QLocale
    QLocale.setDefault(QLocale.c())
Beispiel #16
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()
Beispiel #17
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()
Beispiel #18
0
    def showDialog(self):
        # Initialise the setup directory empty toavoid exceptions.
        self.setupDictionary = {}

        # ask for a project directory.
        self.projectDirectory = QFileDialog.getExistingDirectory(
            caption=i18n("Where should the comic project go?"),
            options=QFileDialog.ShowDirsOnly)
        if os.path.exists(self.projectDirectory) is False:
            return
        self.pagesDirectory = os.path.relpath(self.projectDirectory,
                                              self.projectDirectory)
        self.exportDirectory = os.path.relpath(self.projectDirectory,
                                               self.projectDirectory)

        wizard = QWizard()
        wizard.setWindowTitle(i18n("Comic Project Setup"))
        wizard.setOption(QWizard.IndependentPages, True)

        # Set up the UI for the wizard
        basicsPage = QWizardPage()
        basicsPage.setTitle(i18n("Basic Comic Project Settings"))
        formLayout = QFormLayout()
        basicsPage.setLayout(formLayout)
        projectLayout = QHBoxLayout()
        self.lnProjectName = QLineEdit()
        basicsPage.registerField("Project Name*", self.lnProjectName)
        self.lnProjectName.setToolTip(
            i18n(
                "A Project name. This can be different from the eventual title"
            ))
        btnRandom = QPushButton()
        btnRandom.setText(i18n("Generate"))
        btnRandom.setToolTip(
            i18n(
                "If you cannot come up with a project name, our highly sophisticated project name generator will serve to give a classy yet down to earth name."
            ))
        btnRandom.clicked.connect(self.slot_generate)
        projectLayout.addWidget(self.lnProjectName)
        projectLayout.addWidget(btnRandom)
        lnConcept = QLineEdit()
        lnConcept.setToolTip(
            i18n(
                "What is your comic about? This is mostly for your own convenience so don't worry about what it says too much."
            ))
        self.cmbLanguage = comics_metadata_dialog.language_combo_box()
        self.cmbLanguage.setToolTip(i18n("The main language the comic is in"))
        self.cmbLanguage.setEntryToCode(
            str(QLocale.system().name()).split("_")[0])
        self.cmbCountry = comics_metadata_dialog.country_combo_box()
        if QLocale.system() != QLocale.c():
            self.cmbCountry.setEntryToCode(
                str(QLocale.system().name()).split("_")[-1])
        else:
            self.slot_update_countries()
        self.cmbLanguage.currentIndexChanged.connect(
            self.slot_update_countries)
        self.lnProjectDirectory = QLabel(self.projectDirectory)
        self.chkMakeProjectDirectory = QCheckBox()
        labelDirectory = QLabel(
            i18n("Make a new directory with the project name."))
        labelDirectory.setWordWrap(True)
        stringDirectoryTooltip = i18n(
            "This allows you to select a generic comics project directory, in which a new folder will be made for the project using the given project name."
        )
        self.chkMakeProjectDirectory.setToolTip(stringDirectoryTooltip)
        labelDirectory.setToolTip(stringDirectoryTooltip)
        self.chkMakeProjectDirectory.setChecked(True)
        self.lnPagesDirectory = QLineEdit()
        self.lnPagesDirectory.setText(i18n("pages"))
        self.lnPagesDirectory.setToolTip(
            i18n(
                "The name for the folder where the pages are contained. If it doesn't exist, it will be created."
            ))
        self.lnExportDirectory = QLineEdit()
        self.lnExportDirectory.setText(i18n("export"))
        self.lnExportDirectory.setToolTip(
            i18n(
                "The name for the folder where the export is put. If it doesn't exist, it will be created."
            ))
        self.lnTemplateLocation = QLineEdit()
        self.lnTemplateLocation.setText(i18n("templates"))
        self.lnTemplateLocation.setToolTip(
            i18n(
                "The name for the folder where the page templates are sought in."
            ))

        self.lnTranslationLocation = QLineEdit()
        self.lnTranslationLocation.setText(i18n("translations"))
        self.lnTranslationLocation.setToolTip(
            "This is the location that POT files will be stored to and PO files will be read from."
        )
        formLayout.addRow(i18n("Comic Concept:"), lnConcept)
        formLayout.addRow(i18n("Project Name:"), projectLayout)
        formLayout.addRow(i18n("Main Language:"), self.cmbLanguage)
        formLayout.addRow("", self.cmbCountry)

        buttonMetaData = QPushButton(i18n("Meta Data"))
        buttonMetaData.clicked.connect(self.slot_edit_meta_data)

        wizard.addPage(basicsPage)

        foldersPage = QWizardPage()
        foldersPage.setTitle(i18n("Folder names and other."))
        folderFormLayout = QFormLayout()
        foldersPage.setLayout(folderFormLayout)
        folderFormLayout.addRow(i18n("Project Directory:"),
                                self.lnProjectDirectory)
        folderFormLayout.addRow(self.chkMakeProjectDirectory, labelDirectory)
        folderFormLayout.addRow(i18n("Pages Directory"), self.lnPagesDirectory)
        folderFormLayout.addRow(i18n("Export Directory"),
                                self.lnExportDirectory)
        folderFormLayout.addRow(i18n("Template Directory"),
                                self.lnTemplateLocation)
        folderFormLayout.addRow(i18n("Translation Directory"),
                                self.lnTranslationLocation)
        folderFormLayout.addRow("", buttonMetaData)
        wizard.addPage(foldersPage)

        # Execute the wizard, and after wards...
        if (wizard.exec_()):

            # First get the directories, check if the directories exist, and otherwise make them.
            self.pagesDirectory = self.lnPagesDirectory.text()
            self.exportDirectory = self.lnExportDirectory.text()
            self.templateLocation = self.lnTemplateLocation.text()
            self.translationLocation = self.lnTranslationLocation.text()
            projectPath = Path(self.projectDirectory)
            # Only make a project directory if the checkbox for that has been checked.
            if self.chkMakeProjectDirectory.isChecked():
                projectPath = projectPath / self.lnProjectName.text()
                if projectPath.exists() is False:
                    projectPath.mkdir()
                self.projectDirectory = str(projectPath)
            if Path(projectPath / self.pagesDirectory).exists() is False:
                Path(projectPath / self.pagesDirectory).mkdir()
            if Path(projectPath / self.exportDirectory).exists() is False:
                Path(projectPath / self.exportDirectory).mkdir()
            if Path(projectPath / self.templateLocation).exists() is False:
                Path(projectPath / self.templateLocation).mkdir()
            if Path(projectPath / self.translationLocation).exists() is False:
                Path(projectPath / self.translationLocation).mkdir()

            # Then store the information into the setup diactionary.
            self.setupDictionary["projectName"] = self.lnProjectName.text()
            self.setupDictionary["concept"] = lnConcept.text()
            self.setupDictionary["language"] = str(
                self.cmbLanguage.codeForCurrentEntry())
            self.setupDictionary["pagesLocation"] = self.pagesDirectory
            self.setupDictionary["exportLocation"] = self.exportDirectory
            self.setupDictionary["templateLocation"] = self.templateLocation
            self.setupDictionary[
                "translationLocation"] = self.translationLocation

            # Finally, write the dictionary into the json file.
            self.writeConfig()
Beispiel #19
0
    def __init__(self,
                 parent: BaseTab,
                 spectrum_type: str = _MESU,
                 element_simulation: Optional[ElementSimulation] = None,
                 simulation: Optional[Simulation] = None,
                 measurement: Optional[Measurement] = None,
                 recoil_widget=None,
                 statusbar: Optional[QtWidgets.QStatusBar] = None,
                 spectra_changed=None):
        """Inits energy spectrum dialog.
        
        Args:
            parent: A TabWidget.
            spectrum_type: Whether spectrum is for measurement of simulation.
            element_simulation: ElementSimulation object.
            recoil_widget: RecoilElement widget.
            statusbar: QStatusBar
            spectra_changed: pyQtSignal that is emitted when recoil atom
                distribution is changed.
        """
        super().__init__()
        uic.loadUi(gutils.get_ui_dir() / "ui_energy_spectrum_params.ui", self)

        self.parent = parent
        if spectrum_type == EnergySpectrumWidget.MEASUREMENT:
            if measurement is None:
                raise ValueError(
                    f"Must provide a Measurement when spectrum type is "
                    f"{spectrum_type}")
        elif spectrum_type is EnergySpectrumWidget.SIMULATION:
            if simulation is None:
                raise ValueError(
                    f"Must provide a Simulation when spectrum type is "
                    f"{spectrum_type}")
            if element_simulation is None:
                raise ValueError(
                    f"Must provide an ElementSimulation when spectrum is "
                    f"{spectrum_type}")
        else:
            raise ValueError(f"Unexpected spectrum type: {spectrum_type}")

        self.spectrum_type = spectrum_type
        self.measurement = measurement
        self.simulation = simulation
        self.element_simulation = element_simulation
        self.statusbar = statusbar
        self.result_files = []

        self.use_eff_checkbox.stateChanged.connect(
            lambda *_: self.label_efficiency_files.setEnabled(self.
                                                              use_efficiency))
        self.use_efficiency = True

        locale = QLocale.c()
        self.histogramTicksDoubleSpinBox.setLocale(locale)

        # Connect buttons
        self.pushButton_Cancel.clicked.connect(self.close)

        self.external_tree_widget = QtWidgets.QTreeWidget()

        if self.spectrum_type == EnergySpectrumWidget.MEASUREMENT:
            EnergySpectrumParamsDialog.bin_width = \
                self.measurement.profile.channel_width
            self.pushButton_OK.clicked.connect(
                lambda: self.__accept_params(spectra_changed=spectra_changed))

            m_name = self.measurement.name
            if m_name not in EnergySpectrumParamsDialog.checked_cuts:
                EnergySpectrumParamsDialog.checked_cuts[m_name] = set()

            gutils.fill_cuts_treewidget(self.measurement,
                                        self.treeWidget.invisibleRootItem(),
                                        use_elemloss=True)
            self.measurement_cuts = \
                EnergySpectrumParamsDialog.checked_cuts[m_name]

            self.importPushButton.setVisible(False)
        else:
            EnergySpectrumParamsDialog.bin_width = \
                self.element_simulation.channel_width

            self._set_simulation_files(recoil_widget)
            self._set_measurement_files()
            self._set_external_files()

            # Change the bin width label text
            self.histogramTicksLabel.setText(
                "Simulation and measurement histogram bin width:")

            self.pushButton_OK.clicked.connect(
                self.__calculate_selected_spectra)
            self.importPushButton.clicked.connect(self.__import_external_file)

        self.used_bin_width = EnergySpectrumParamsDialog.bin_width
        # FIXME .eff files not shown in sim mode
        self.__update_eff_files()
        self.exec_()
Beispiel #20
0
    def __init__(self,
                 parent,
                 element_simulation: ElementSimulation,
                 target: Target,
                 ct: Optional[CancellationToken] = None):
        super().__init__(parent)
        self.parent = parent
        self.element_simulation = element_simulation
        self.target = target
        self.locale = QLocale.c()

        self.trans = matplotlib.transforms.blended_transform_factory(
            self.axes.transData, self.axes.transAxes)
        self.layer_colors = [(0.9, 0.9, 0.9), (0.85, 0.85, 0.85)]
        self.axes.format_coord = mpl_utils.format_coord

        self.current_recoil: Optional[RecoilElement] = None

        self.radios = QtWidgets.QButtonGroup(self)
        self.radios.buttonToggled[QtWidgets.QAbstractButton,
                                  bool].connect(self.choose_recoil)

        widget = QtWidgets.QWidget()
        self.recoil_vertical_layout = QtWidgets.QVBoxLayout()
        self.recoil_vertical_layout.setContentsMargins(0, 0, 0, 0)
        widget.setLayout(self.recoil_vertical_layout)

        self.parent.recoilListLayout.addWidget(widget)

        # TODO move these to parent
        btn_txts = "First solution", "Median solution", "Last solution"
        for t in btn_txts:
            radio_btn = QtWidgets.QRadioButton(t)
            radio_btn.setEnabled(False)
            self.radios.addButton(radio_btn)
            self.recoil_vertical_layout.addWidget(radio_btn)

        self.move_results_btn = QtWidgets.QPushButton("Accept results")
        self.move_results_btn.setToolTip(
            "Moves optimization results to recoil "
            "atom distribution view")
        self.move_results_btn.setEnabled(False)
        self.move_results_btn.clicked.connect(self._move_results)
        self.recoil_vertical_layout.addWidget(self.move_results_btn)

        self.stop_optim_btn = QtWidgets.QPushButton("Stop optimization")
        self.stop_optim_btn.setToolTip("Stops optimization after current "
                                       "generation has been evaluated.")
        self.stop_optim_btn.setEnabled(True)
        self.stop_optim_btn.clicked.connect(self._stop_optim)
        self.recoil_vertical_layout.addWidget(self.stop_optim_btn)

        self.cancellation_token = ct

        spacer = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum,
                                       QtWidgets.QSizePolicy.Expanding)
        self.recoil_vertical_layout.addItem(spacer)

        # A dictionary where keys are recoil elements and values are line
        # objects
        self.lines = {}
        self.selected_line = None
        self.highlighted_marker = None

        self.coordinates_widget = None
        self.coordinates_action = None

        # This customizes the toolbar buttons
        self.__fork_toolbar_buttons()

        self.name_y_axis = "Relative Concentration"
        self.name_x_axis = "Depth [nm]"

        self.canvas.mpl_connect('button_press_event', self.on_click)

        self.on_draw()

        if self.element_simulation.optimization_recoils:
            self.show_recoils()
Beispiel #21
0
from backend.barista.utils.settings import applicationQSetting
from backend.caffe import path_loader
from gui.start_dialog import StartDialog
from PyQt5.QtWidgets import QApplication
from gui.caffepath_dialog import CaffepathDialog
from backend.networking.barista_server import BaristaServer
import threading
import subprocess

if __name__ == "__main__":
    logging.basicConfig(
        format='[%(asctime)s] %(levelname)s @ %(funcName)s:    %(message)s',
        datefmt='%d/%m/%Y %H:%M:%S',
        filename="baristalog.txt",
        level=logging.INFO)
    QLocale.setDefault(QLocale.c())
    # Parse command line arguments.
    parser = argparse.ArgumentParser()
    parser.add_argument(
        '-s',
        '--server',
        help='start a local server and add it to the host manager',
        default=False,
        action='store_true')
    parser.add_argument('-d',
                        '--dir',
                        help='local directory to run server sessions in',
                        type=str,
                        default='.')
    parser.add_argument('-o',
                        '--open',