def __init__(self, parent=None, name=None, fl=0): CreateTaskBase.__init__(self, parent, name, fl, "Energy scan") if not name: self.setObjectName("create_energy_scan_widget") # Hardware objects ---------------------------------------------------- # Internal variables -------------------------------------------------- self.init_models() # Graphic elements ---------------------------------------------------- self._periodic_table_widget = PeriodicTableWidget(self) self._data_path_widget = DataPathWidget(self, data_model=self._path_template, layout="vertical") _parameters_gbox = qt_import.QGroupBox("Parameters", self) self._adjust_transmission_cbox = qt_import.QCheckBox( "Adjust transmission", _parameters_gbox) self._adjust_transmission_cbox.setChecked(False) self._adjust_transmission_cbox.setEnabled(True) self._max_transmission_label = qt_import.QLabel( "Maximum transmission:") self._max_transmission_ledit = qt_import.QLineEdit( "20", _parameters_gbox) self._max_transmission_ledit.setFixedWidth(80) self._max_transmission_ledit.setEnabled(False) self._comments_widget = CommentsWidget(self) # Layout -------------------------------------------------------------- _parameters_gbox_hlayout = qt_import.QGridLayout(_parameters_gbox) _parameters_gbox_hlayout.addWidget(self._adjust_transmission_cbox, 0, 0) _parameters_gbox_hlayout.addWidget(self._max_transmission_label, 1, 0) _parameters_gbox_hlayout.addWidget(self._max_transmission_ledit, 1, 1) _parameters_gbox_hlayout.setColumnStretch(2, 1) _parameters_gbox_hlayout.setSpacing(2) _main_vlayout = qt_import.QVBoxLayout(self) _main_vlayout.addWidget(self._periodic_table_widget) _main_vlayout.addWidget(self._data_path_widget) _main_vlayout.addWidget(_parameters_gbox) _main_vlayout.addWidget(self._comments_widget) _main_vlayout.setContentsMargins(2, 2, 2, 2) _main_vlayout.setSpacing(6) _main_vlayout.addStretch(10) # SizePolicies -------------------------------------------------------- self._comments_widget.setFixedHeight(100) # Qt signal/slot connections ------------------------------------------ # self._periodic_table_widget.elementEdgeSelectedSignal.connect(\ # self.acq_parameters_changed) self._data_path_widget.pathTemplateChangedSignal.connect( self.path_template_changed) self._adjust_transmission_cbox.stateChanged.connect( self.adjust_transmission_state_changed) self._max_transmission_ledit.textEdited.connect( self.max_transmission_value_changed) self._data_path_widget.data_path_layout.compression_cbox.setVisible( False) try: self._periodic_table_widget.set_elements( HWR.beamline.energy_scan.get_elements()) max_transmission_value = ( HWR.beamline.energy_scan.get_max_transmission_value()) self._adjust_transmission_cbox.setEnabled(True) self._adjust_transmission_cbox.setChecked(True) HWR.beamline.energy_scan.adjust_transmission(True) if max_transmission_value: self._max_transmission_ledit.setText("%.2f" % max_transmission_value) except BaseException: pass
def __init__(self, parent=None, name=None, fl=0): CreateTaskBase.__init__( self, parent, name, qt_import.Qt.WindowFlags(fl), "Advanced" ) if not name: self.setObjectName("create_advanced_widget") # Hardware objects ---------------------------------------------------- # Internal variables -------------------------------------------------- self._advanced_methods = None self._grid_map = {} self.spacing = [0, 0] self.dc_selected = False self.init_models() # Graphic elements ---------------------------------------------------- self._advanced_methods_widget = qt_import.load_ui_file( "advanced_methods_layout.ui" ) self._acq_widget = AcquisitionWidget( self, "acquisition_widget", layout="vertical", acq_params=self._acquisition_parameters, path_template=self._path_template, ) self._acq_widget.grid_mode = True self._data_path_widget = DataPathWidget( self, "create_dc_path_widget", data_model=self._path_template, layout="vertical", ) self._comments_widget = CommentsWidget(self) # Layout -------------------------------------------------------------- _main_vlayout = qt_import.QVBoxLayout(self) _main_vlayout.addWidget(self._advanced_methods_widget) _main_vlayout.addWidget(self._acq_widget) _main_vlayout.addWidget(self._data_path_widget) _main_vlayout.addWidget(self._comments_widget) _main_vlayout.addStretch(0) _main_vlayout.setSpacing(6) _main_vlayout.setContentsMargins(2, 2, 2, 2) # SizePolicies -------------------------------------------------------- # Qt signal/slot connections ------------------------------------------ self._acq_widget.acqParametersChangedSignal.connect(self.acq_parameters_changed) self._acq_widget.madEnergySelectedSignal.connect(self.mad_energy_selected) self._acq_widget.acq_widget_layout.osc_range_ledit.textEdited.connect( self.grid_osc_range_ledit_changed ) self._acq_widget.acq_widget_layout.osc_total_range_ledit.textEdited.connect( self.grid_osc_total_range_ledit_changed ) self._data_path_widget.pathTemplateChangedSignal.connect( self.path_template_changed ) self._advanced_methods_widget.grid_treewidget.itemSelectionChanged.connect( self.grid_treewidget_item_selection_changed ) self._advanced_methods_widget.draw_grid_button.clicked.connect( self.draw_grid_button_clicked ) self._advanced_methods_widget.remove_grid_button.clicked.connect( self.remove_grid_button_clicked ) self._advanced_methods_widget.hor_spacing_ledit.textEdited.connect( self.hor_spacing_changed ) self._advanced_methods_widget.ver_spacing_ledit.textEdited.connect( self.ver_spacing_changed ) self._advanced_methods_widget.move_right_button.clicked.connect( lambda: self.move_grid("right") ) self._advanced_methods_widget.move_left_button.clicked.connect( lambda: self.move_grid("left") ) self._advanced_methods_widget.move_up_button.clicked.connect( lambda: self.move_grid("up") ) self._advanced_methods_widget.move_down_button.clicked.connect( lambda: self.move_grid("down") ) self._advanced_methods_widget.overlay_cbox.toggled.connect(self.overlay_toggled) self._advanced_methods_widget.overlay_slider.valueChanged.connect( self.overlay_alpha_changed ) self._advanced_methods_widget.overlay_color_button.clicked.connect( self.overlay_change_color ) self._advanced_methods_widget.move_to_grid_button.clicked.connect( self.move_to_grid ) self._advanced_methods_widget.method_combo.activated.connect( self.method_combo_activated ) # Other --------------------------------------------------------------- self._acq_widget.use_osc_start(False) self._acq_widget.use_kappa(False) self._acq_widget.acq_widget_layout.num_images_label.setEnabled(False) self._acq_widget.acq_widget_layout.num_images_ledit.setEnabled(False) for col in range(self._advanced_methods_widget.grid_treewidget.columnCount()): self._advanced_methods_widget.grid_treewidget.resizeColumnToContents(col) self._acq_widget.acq_widget_layout.osc_total_range_label.setText( "Total osc. range per line" ) self._advanced_methods = list(HWR.beamline.advanced_methods) if self._advanced_methods: for method in self._advanced_methods: self._advanced_methods_widget.method_combo.addItem(method) else: self.setEnabled(False) self._acq_widget.acq_widget_layout.osc_start_label.setText( "Oscillation middle:" ) hor_size, ver_size = HWR.beamline.beam.get_beam_size() self.spacing[0] = hor_size self.spacing[1] = ver_size self._advanced_methods_widget.hor_spacing_ledit.setText( "%.1f" % (hor_size * 1000) ) self._advanced_methods_widget.ver_spacing_ledit.setText( "%.1f" % (ver_size * 1000) ) HWR.beamline.sample_view.connect("shapeCreated", self.shape_created) HWR.beamline.sample_view.connect("shapeChanged", self.shape_changed) HWR.beamline.sample_view.connect("shapeDeleted", self.shape_deleted) self._comments_widget.setHidden(True)
class CreateEnergyScanWidget(CreateTaskBase): def __init__(self, parent=None, name=None, fl=0): CreateTaskBase.__init__(self, parent, name, fl, "Energy scan") if not name: self.setObjectName("create_energy_scan_widget") # Hardware objects ---------------------------------------------------- # Internal variables -------------------------------------------------- self.init_models() # Graphic elements ---------------------------------------------------- self._periodic_table_widget = PeriodicTableWidget(self) self._data_path_widget = DataPathWidget(self, data_model=self._path_template, layout="vertical") _parameters_gbox = qt_import.QGroupBox("Parameters", self) self._adjust_transmission_cbox = qt_import.QCheckBox( "Adjust transmission", _parameters_gbox) self._adjust_transmission_cbox.setChecked(False) self._adjust_transmission_cbox.setEnabled(True) self._max_transmission_label = qt_import.QLabel( "Maximum transmission:") self._max_transmission_ledit = qt_import.QLineEdit( "20", _parameters_gbox) self._max_transmission_ledit.setFixedWidth(80) self._max_transmission_ledit.setEnabled(False) self._comments_widget = CommentsWidget(self) # Layout -------------------------------------------------------------- _parameters_gbox_hlayout = qt_import.QGridLayout(_parameters_gbox) _parameters_gbox_hlayout.addWidget(self._adjust_transmission_cbox, 0, 0) _parameters_gbox_hlayout.addWidget(self._max_transmission_label, 1, 0) _parameters_gbox_hlayout.addWidget(self._max_transmission_ledit, 1, 1) _parameters_gbox_hlayout.setColumnStretch(2, 1) _parameters_gbox_hlayout.setSpacing(2) _main_vlayout = qt_import.QVBoxLayout(self) _main_vlayout.addWidget(self._periodic_table_widget) _main_vlayout.addWidget(self._data_path_widget) _main_vlayout.addWidget(_parameters_gbox) _main_vlayout.addWidget(self._comments_widget) _main_vlayout.setContentsMargins(2, 2, 2, 2) _main_vlayout.setSpacing(6) _main_vlayout.addStretch(10) # SizePolicies -------------------------------------------------------- self._comments_widget.setFixedHeight(100) # Qt signal/slot connections ------------------------------------------ # self._periodic_table_widget.elementEdgeSelectedSignal.connect(\ # self.acq_parameters_changed) self._data_path_widget.pathTemplateChangedSignal.connect( self.path_template_changed) self._adjust_transmission_cbox.stateChanged.connect( self.adjust_transmission_state_changed) self._max_transmission_ledit.textEdited.connect( self.max_transmission_value_changed) self._data_path_widget.data_path_layout.compression_cbox.setVisible( False) try: self._periodic_table_widget.set_elements( HWR.beamline.energy_scan.get_elements()) max_transmission_value = ( HWR.beamline.energy_scan.get_max_transmission_value()) self._adjust_transmission_cbox.setEnabled(True) self._adjust_transmission_cbox.setChecked(True) HWR.beamline.energy_scan.adjust_transmission(True) if max_transmission_value: self._max_transmission_ledit.setText("%.2f" % max_transmission_value) except BaseException: pass def set_expert_mode(self, state): self._adjust_transmission_cbox.setEnabled(state) self._max_transmission_label.setEnabled(state) self._max_transmission_ledit.setEnabled(state) def enable_compression(self, state): CreateTaskBase.enable_compression(self, False) def init_models(self): CreateTaskBase.init_models(self) self.enery_scan = queue_model_objects.EnergyScan() self._path_template.start_num = 1 self._path_template.num_files = 1 self._path_template.suffix = "raw" self._path_template.compression = False def single_item_selection(self, tree_item): CreateTaskBase.single_item_selection(self, tree_item) escan_model = tree_item.get_model() if isinstance(tree_item, queue_item.EnergyScanQueueItem): if tree_item.get_model().is_executed(): self.setDisabled(True) else: self.setDisabled(False) if escan_model.get_path_template(): self._path_template = escan_model.get_path_template() self._data_path_widget.update_data_model(self._path_template) elif not (isinstance(tree_item, queue_item.SampleQueueItem) or isinstance(tree_item, queue_item.DataCollectionGroupQueueItem)): self.setDisabled(True) def approve_creation(self): base_result = CreateTaskBase.approve_creation(self) selected_element, selected_edge = ( self._periodic_table_widget.get_selected_element_edge()) if not selected_element: logging.getLogger("GUI").warning( "No element selected, please select an element.") return base_result and selected_element # Called by the owning widget (task_toolbox_widget) to create # a collection. When a data collection group is selected. def _create_task(self, sample, shape, comments=None): data_collections = [] selected_element, selected_edge = ( self._periodic_table_widget.get_selected_element_edge()) if selected_element: if not shape: cpos = queue_model_objects.CentredPosition() cpos.snapshot_image = HWR.beamline.sample_view.get_snapshot() else: # Shapes selected and sample is mounted, get the # centred positions for the shapes if isinstance(shape, GraphicsItemPoint): snapshot = HWR.beamline.sample_view.get_snapshot( shape=shape) cpos = copy.deepcopy(shape.get_centred_position()) cpos.snapshot_image = snapshot path_template = self._create_path_template(sample, self._path_template) energy_scan = queue_model_objects.EnergyScan( sample, path_template, cpos) energy_scan.set_name(path_template.get_prefix()) energy_scan.set_number(path_template.run_number) energy_scan.element_symbol = selected_element energy_scan.edge = selected_edge data_collections.append(energy_scan) self._path_template.run_number += 1 else: logging.getLogger("GUI").info( "No element selected, please select an element.") return data_collections def element_edge_selected(self, element, edge): if len(self._current_selected_items) == 1: item = self._current_selected_items[0] if isinstance(item, queue_item.EnergyScanQueueItem): item.get_model().element_symbol = str(element) item.get_model().edge = str(edge) def adjust_transmission_state_changed(self, state): self._max_transmission_ledit.setEnabled(state) HWR.beamline.energy_scan.adjust_transmission(state) def max_transmission_value_changed(self, value): try: max_transmission = float(value) HWR.beamline.energy_scan.set_max_transmission(max_transmission) except BaseException: pass
def __init__(self, parent=None, name=None, fl=0): CreateTaskBase.__init__( self, parent, name, qt_import.Qt.WindowFlags(fl), "XRF spectrum" ) if name is not None: self.setObjectName(name) # Hardware objects ---------------------------------------------------- # Internal variables -------------------------------------------------- self.count_time = None self.xrf_spectrum_model = None self.init_models() # Graphic elements ---------------------------------------------------- self._data_path_widget = DataPathWidget( self, data_model=self._path_template, layout="vertical" ) _parameters_gbox = qt_import.QGroupBox("Parameters", self) _count_time_label = qt_import.QLabel("Count time (sec.):", _parameters_gbox) self.count_time_ledit = qt_import.QLineEdit("1", _parameters_gbox) # self.count_time_ledit.setMaximumWidth(75) self.adjust_transmission_cbox = qt_import.QCheckBox( "Adjust transmission", _parameters_gbox ) self.adjust_transmission_cbox.setChecked(True) self._comments_widget = CommentsWidget(self) # Layout -------------------------------------------------------------- _parameters_gbox_hlayout = qt_import.QHBoxLayout(_parameters_gbox) _parameters_gbox_hlayout.addWidget(_count_time_label) _parameters_gbox_hlayout.addWidget(self.count_time_ledit) _parameters_gbox_hlayout.addWidget(self.adjust_transmission_cbox) _parameters_gbox_hlayout.addStretch(0) _parameters_gbox_hlayout.setSpacing(2) _parameters_gbox_hlayout.setContentsMargins(0, 0, 0, 0) _main_vlayout = qt_import.QVBoxLayout(self) _main_vlayout.addWidget(self._data_path_widget) _main_vlayout.addWidget(_parameters_gbox) _main_vlayout.addWidget(self._comments_widget) _main_vlayout.setSpacing(6) _main_vlayout.setContentsMargins(2, 2, 2, 2) _main_vlayout.addStretch(0) # SizePolicies -------------------------------------------------------- self._comments_widget.setFixedHeight(100) # Qt signal/slot connections ------------------------------------------ self._data_path_widget.pathTemplateChangedSignal.connect( self.path_template_changed ) self.adjust_transmission_cbox.stateChanged.connect( self.adjust_transmission_state_changed ) # Other --------------------------------------------------------------- self._data_path_widget.data_path_layout.compression_cbox.setVisible(False)
class CreateAdvancedWidget(CreateTaskBase): """Widget used to create advanced collection methods """ def __init__(self, parent=None, name=None, fl=0): CreateTaskBase.__init__( self, parent, name, qt_import.Qt.WindowFlags(fl), "Advanced" ) if not name: self.setObjectName("create_advanced_widget") # Hardware objects ---------------------------------------------------- # Internal variables -------------------------------------------------- self._advanced_methods = None self._grid_map = {} self.spacing = [0, 0] self.dc_selected = False self.init_models() # Graphic elements ---------------------------------------------------- self._advanced_methods_widget = qt_import.load_ui_file( "advanced_methods_layout.ui" ) self._acq_widget = AcquisitionWidget( self, "acquisition_widget", layout="vertical", acq_params=self._acquisition_parameters, path_template=self._path_template, ) self._acq_widget.grid_mode = True self._data_path_widget = DataPathWidget( self, "create_dc_path_widget", data_model=self._path_template, layout="vertical", ) self._comments_widget = CommentsWidget(self) # Layout -------------------------------------------------------------- _main_vlayout = qt_import.QVBoxLayout(self) _main_vlayout.addWidget(self._advanced_methods_widget) _main_vlayout.addWidget(self._acq_widget) _main_vlayout.addWidget(self._data_path_widget) _main_vlayout.addWidget(self._comments_widget) _main_vlayout.addStretch(0) _main_vlayout.setSpacing(6) _main_vlayout.setContentsMargins(2, 2, 2, 2) # SizePolicies -------------------------------------------------------- # Qt signal/slot connections ------------------------------------------ self._acq_widget.acqParametersChangedSignal.connect(self.acq_parameters_changed) self._acq_widget.madEnergySelectedSignal.connect(self.mad_energy_selected) self._acq_widget.acq_widget_layout.osc_range_ledit.textEdited.connect( self.grid_osc_range_ledit_changed ) self._acq_widget.acq_widget_layout.osc_total_range_ledit.textEdited.connect( self.grid_osc_total_range_ledit_changed ) self._data_path_widget.pathTemplateChangedSignal.connect( self.path_template_changed ) self._advanced_methods_widget.grid_treewidget.itemSelectionChanged.connect( self.grid_treewidget_item_selection_changed ) self._advanced_methods_widget.draw_grid_button.clicked.connect( self.draw_grid_button_clicked ) self._advanced_methods_widget.remove_grid_button.clicked.connect( self.remove_grid_button_clicked ) self._advanced_methods_widget.hor_spacing_ledit.textEdited.connect( self.hor_spacing_changed ) self._advanced_methods_widget.ver_spacing_ledit.textEdited.connect( self.ver_spacing_changed ) self._advanced_methods_widget.move_right_button.clicked.connect( lambda: self.move_grid("right") ) self._advanced_methods_widget.move_left_button.clicked.connect( lambda: self.move_grid("left") ) self._advanced_methods_widget.move_up_button.clicked.connect( lambda: self.move_grid("up") ) self._advanced_methods_widget.move_down_button.clicked.connect( lambda: self.move_grid("down") ) self._advanced_methods_widget.overlay_cbox.toggled.connect(self.overlay_toggled) self._advanced_methods_widget.overlay_slider.valueChanged.connect( self.overlay_alpha_changed ) self._advanced_methods_widget.overlay_color_button.clicked.connect( self.overlay_change_color ) self._advanced_methods_widget.move_to_grid_button.clicked.connect( self.move_to_grid ) self._advanced_methods_widget.method_combo.activated.connect( self.method_combo_activated ) # Other --------------------------------------------------------------- self._acq_widget.use_osc_start(False) self._acq_widget.use_kappa(False) self._acq_widget.acq_widget_layout.num_images_label.setEnabled(False) self._acq_widget.acq_widget_layout.num_images_ledit.setEnabled(False) for col in range(self._advanced_methods_widget.grid_treewidget.columnCount()): self._advanced_methods_widget.grid_treewidget.resizeColumnToContents(col) self._acq_widget.acq_widget_layout.osc_total_range_label.setText( "Total osc. range per line" ) self._advanced_methods = list(HWR.beamline.advanced_methods) if self._advanced_methods: for method in self._advanced_methods: self._advanced_methods_widget.method_combo.addItem(method) else: self.setEnabled(False) self._acq_widget.acq_widget_layout.osc_start_label.setText( "Oscillation middle:" ) hor_size, ver_size = HWR.beamline.beam.get_beam_size() self.spacing[0] = hor_size self.spacing[1] = ver_size self._advanced_methods_widget.hor_spacing_ledit.setText( "%.1f" % (hor_size * 1000) ) self._advanced_methods_widget.ver_spacing_ledit.setText( "%.1f" % (ver_size * 1000) ) HWR.beamline.sample_view.connect("shapeCreated", self.shape_created) HWR.beamline.sample_view.connect("shapeChanged", self.shape_changed) HWR.beamline.sample_view.connect("shapeDeleted", self.shape_deleted) self._comments_widget.setHidden(True) def enable_widgets(self, state): self._acq_widget.setEnabled(state) self._data_path_widget.setEnabled(state) def init_models(self): CreateTaskBase.init_models(self) self._processing_parameters = queue_model_objects.ProcessingParameters() has_shutter_less = HWR.beamline.detector.has_shutterless() self._acquisition_parameters.shutterless = has_shutter_less self._acquisition_parameters = ( HWR.beamline.get_default_acquisition_parameters("advanced") ) def set_beam_info(self, beam_info): try: self.spacing[0] = beam_info["size_x"] self.spacing[1] = beam_info["size_y"] self._advanced_methods_widget.hor_spacing_ledit.setText( "%.1f" % (beam_info["size_x"] * 1000) ) self._advanced_methods_widget.ver_spacing_ledit.setText( "%.1f" % (beam_info["size_x"] * 1000) ) except: pass def approve_creation(self): """ Descript. : """ result = CreateTaskBase.approve_creation(self) selected_grid = self.get_selected_shapes()[0] if not selected_grid: msg = "No grid selected. Please select a grid to continue!" logging.getLogger("GUI").warning(msg) result = False # selected_grid = HWR.beamline.sample_view.get_auto_grid() else: grid_properties = selected_grid.get_properties() exp_time = float(self._acq_widget.acq_widget_layout.exp_time_ledit.text()) speed = grid_properties["yOffset"] / exp_time if speed >= 2.25: logging.getLogger("GUI").error( "Translation speed %.3f is above the limit 2.25" % speed ) return False osc_range_per_frame = float( self._acq_widget.acq_widget_layout.osc_range_ledit.text() ) speed = osc_range_per_frame / exp_time if speed >= 300: logging.getLogger("GUI").error( "Rotation speed per frame %.3f is above the limit 300" % speed ) return False return result def single_item_selection(self, tree_item): """ Descript. : """ CreateTaskBase.single_item_selection(self, tree_item) self.dc_selected = False if isinstance(tree_item, queue_item.SampleQueueItem): pass elif isinstance(tree_item, queue_item.BasketQueueItem): pass # self.setDisabled(False) elif isinstance(tree_item, queue_item.DataCollectionQueueItem) or isinstance( tree_item, queue_item.XrayCenteringQueueItem ): if isinstance(tree_item, queue_item.XrayCenteringQueueItem): data_collection = tree_item.get_model().mesh_dc else: data_collection = tree_item.get_model() if tree_item.get_model().is_executed(): self.setDisabled(True) else: self.setDisabled(False) if data_collection.is_mesh(): HWR.beamline.sample_view.select_shape(data_collection.grid) self._advanced_methods_widget.grid_treewidget.setCurrentItem( self._grid_map[data_collection.grid] ) self._path_template = data_collection.get_path_template() self._data_path_widget.update_data_model(self._path_template) self._acquisition_parameters = data_collection.acquisitions[ 0 ].acquisition_parameters self._acq_widget.update_data_model( self._acquisition_parameters, self._path_template ) # self.get_acquisition_widget().use_osc_start(True) self.dc_selected = True else: self.setDisabled(True) self.grid_treewidget_item_selection_changed() def _create_task(self, sample, shape, comments=None): """Creates tasks based on selected grids :param sample: selected sample object :type sample: SampleQueueItem :param shape: selected shape :type shape: GraphicsLib.GraphicsItem """ tasks = [] selected_grid = self.get_selected_shapes()[0] mesh_dc = self._create_dc_from_grid(sample, selected_grid) cpos = queue_model_objects.CentredPosition() cpos.snapshot_image = HWR.beamline.sample_view.get_snapshot() exp_type = str(self._advanced_methods_widget.method_combo.currentText()) if exp_type == "MeshScan": tasks.append(mesh_dc) elif exp_type == "XrayCentering": xray_centering = queue_model_objects.XrayCentering(mesh_dc) tasks.append(xray_centering) elif exp_type == "MXPressO": optical_centering = queue_model_objects.OpticalCentring() dc_task = self.create_dc(sample, cpos=cpos)[0] dc_task.set_requires_centring(False) tasks.append(optical_centering) tasks.append(dc_task) else: logging.getLogger("GUI").warning( "Method %s does not exist in queue_model_objects" % exp_type ) mesh_dc.run_online_processing = exp_type return tasks def shape_created(self, shape, shape_type): """If a grid is created then adds it to the treewidget. A binding between graphical grid and treewidget item is based on the self._grid_map :param shape: graphics object :type shape: GraphicsLib.GraphicsItem :param shape_type: type of the object (point, line, grid) :type shape_type: str """ if shape_type == "Grid": self._advanced_methods_widget.grid_treewidget.clearSelection() grid_properties = shape.get_properties() info_str_list = [] info_str_list.append(grid_properties["name"]) info_str_list.append("%d" % grid_properties["num_lines"]) info_str_list.append("%d" % grid_properties["num_images_per_line"]) if not self.dc_selected: exp_time = max( float(grid_properties["yOffset"] / 2.245), self._acq_widget.exp_time_validator.bottom() + 0.00001, ) self._acq_widget.acq_widget_layout.exp_time_ledit.setText( "%.6f" % exp_time ) grid_treewidget_item = qt_import.QTreeWidgetItem( self._advanced_methods_widget.grid_treewidget, info_str_list ) self._grid_map[shape] = grid_treewidget_item if not self.dc_selected: grid_treewidget_item.setSelected(True) self.grid_treewidget_item_selection_changed() if self._acq_widget.acq_widget_layout.max_osc_range_cbx.isChecked(): self._acq_widget.update_osc_total_range_limits( grid_properties["num_images_per_line"] ) else: self.update_grid_osc_total_range() def shape_deleted(self, shape, shape_type): """Removes shape from QTreeWidget and self._grid_map :param shape: graphics object :type shape: QtGraphicsLib.GraphicsItem :param shape_type: type of the object (point, line, grid) :type shape_type: str """ if self._grid_map.get(shape): treewidget_item_modelindex = self._advanced_methods_widget.grid_treewidget.indexFromItem( self._grid_map[shape] ) self._advanced_methods_widget.grid_treewidget.takeTopLevelItem( treewidget_item_modelindex.row() ) self._grid_map.pop(shape) def grid_treewidget_item_selection_changed(self): """Updates acquisition parameters based on the selected grid. """ self.enable_grid_controls(False) for item in self._grid_map.items(): grid = item[0] treewidget_item = item[1] if treewidget_item.isSelected(): grid_properties = grid.get_properties() cell_count = ( grid_properties["num_lines"] * grid_properties["num_images_per_line"] ) self._acq_widget.acq_widget_layout.num_images_ledit.setText( "%d" % cell_count ) self._acq_widget.acq_widget_layout.first_image_ledit.setText( "%d" % grid_properties["first_image_num"] ) centred_point = grid.get_centred_position() self._acq_widget.acq_widget_layout.kappa_ledit.setText( "%.2f" % float(centred_point.kappa) ) self._acq_widget.acq_widget_layout.kappa_phi_ledit.setText( "%.2f" % float(centred_point.kappa_phi) ) self._advanced_methods_widget.hor_spacing_ledit.setText( "%.2f" % (float(grid_properties["xOffset"]) * 1000) ) self._advanced_methods_widget.ver_spacing_ledit.setText( "%.2f" % (float(grid_properties["yOffset"]) * 1000) ) treewidget_item.setText(3, str(grid_properties["num_lines"])) treewidget_item.setText(4, str(grid_properties["num_images_per_line"])) grid.setSelected(True) self.enable_grid_controls(True) else: grid.setSelected(False) def get_selected_shapes(self): """Returns selected grids :returns: selected grid objects """ shapes = [] for grid, grid_treewidget_item in self._grid_map.items(): if grid_treewidget_item.isSelected(): shapes.append(grid) return shapes def get_selected_grid_properties(self): """Returns properties of the selected grid :returns: dict with properties """ for grid, grid_treewidget_item in self._grid_map.items(): if grid_treewidget_item.isSelected(): return grid.get_properties() def draw_grid_button_clicked(self): """Starts grid drawing """ HWR.beamline.sample_view.create_grid(self.spacing) def remove_grid_button_clicked(self): """Removes selected grid """ grid_to_delete = self.get_selected_shapes()[0] if grid_to_delete: HWR.beamline.sample_view.delete_shape(grid_to_delete) self._advanced_methods_widget.move_to_grid_button.setEnabled(False) def hor_spacing_changed(self, value): """Updates spacing of the selected grid """ try: self.spacing[0] = ( float(self._advanced_methods_widget.hor_spacing_ledit.text()) / 1000 ) self.set_spacing() except BaseException: pass def ver_spacing_changed(self, value): """Updates spacing of the selected grid """ try: self.spacing[1] = ( float(self._advanced_methods_widget.ver_spacing_ledit.text()) / 1000 ) self.set_spacing() except BaseException: pass def set_spacing(self): if 0 in self.spacing: return for grid, treewidget_item in self._grid_map.items(): if treewidget_item.isSelected(): grid.set_spacing( self.spacing, adjust_size=self._advanced_methods_widget.adjust_size_cbox.isChecked(), ) grid_properties = grid.get_properties() treewidget_item.setText(1, str(grid_properties["num_lines"])) treewidget_item.setText(2, str(grid_properties["num_images_per_line"])) self._acq_widget.acq_widget_layout.num_images_ledit.setText( str( grid_properties["num_lines"] * grid_properties["num_images_per_line"] ) ) def move_to_grid(self): """Moves diffractometer to the center of the grid """ grid = self.get_selected_shapes()[0] if grid: HWR.beamline.diffractometer.move_to_centred_position( grid.get_centred_position() ) def method_combo_activated(self, index): self._task_node_name = self._advanced_methods_widget.method_combo.currentText() def overlay_toggled(self, state): """Toggles (on/off) overlay """ grid = self.get_selected_shapes()[0] if grid: grid.set_display_overlay(state) def overlay_alpha_changed(self, alpha_value): """Changes the transperency of the grid """ grid = self.get_selected_shapes()[0] if grid: grid.set_fill_alpha(alpha_value) def overlay_change_color(self): """Changes the default color (blue) of overlay """ color = qt_import.QColorDialog.getColor() grid = self.get_selected_shapes()[0] if color.isValid() and grid: grid.set_base_color(color) def move_grid(self, direction): """Moves grid by one pix in selected direction :param direction: direction to move (right, left, up, down) :type direction: str """ grid = self.get_selected_shapes()[0] if grid: grid.move_by_pix(direction) HWR.beamline.sample_view.update_grid_motor_positions(grid) def enable_grid_controls(self, state): """Enables grid controls if a grid is selectd """ self._advanced_methods_widget.overlay_cbox.setEnabled(state) self._advanced_methods_widget.overlay_slider.setEnabled(state) self._advanced_methods_widget.overlay_color_button.setEnabled(state) self._advanced_methods_widget.move_to_grid_button.setEnabled(state) self._advanced_methods_widget.remove_grid_button.setEnabled(state) self._advanced_methods_widget.move_right_button.setEnabled(state) self._advanced_methods_widget.move_left_button.setEnabled(state) self._advanced_methods_widget.move_up_button.setEnabled(state) self._advanced_methods_widget.move_down_button.setEnabled(state) self._acq_widget.acq_widget_layout.max_osc_range_cbx.setEnabled( state and self._in_plate_mode ) self.enable_widgets(state) self._acq_widget.emit_acq_parameters_changed() def grid_osc_range_ledit_changed(self, new_value): """Osc range per frame changed :param new_value: new value :type new_value: str """ self.update_grid_osc_total_range() def grid_osc_total_range_ledit_changed(self, new_value): """Updates osc range per frame :param new_value: new value :type new_value: str """ grid_properties = self.get_selected_grid_properties() if grid_properties: try: self._acq_widget.acq_widget_layout.osc_range_ledit.setText( "%.4f" % (float(new_value) / grid_properties["num_images_per_line"] - 1e-5) ) self._acq_widget.emit_acq_parameters_changed() except BaseException: pass def update_grid_osc_total_range(self): """Updates osc range per line """ grid_properties = self.get_selected_grid_properties() if grid_properties: self._acq_widget.acq_widget_layout.osc_total_range_ledit.setText( str( float(self._acq_widget.acq_widget_layout.osc_range_ledit.text()) * grid_properties["num_images_per_line"] ) ) def set_osc_total_range(self, num_images=None, mesh=False): grid_properties = self.get_selected_grid_properties() if grid_properties: CreateTaskBase.set_osc_total_range( self, grid_properties["num_images_per_line"], mesh=True )
class CreateXRFSpectrumWidget(CreateTaskBase): def __init__(self, parent=None, name=None, fl=0): CreateTaskBase.__init__( self, parent, name, qt_import.Qt.WindowFlags(fl), "XRF spectrum" ) if name is not None: self.setObjectName(name) # Hardware objects ---------------------------------------------------- # Internal variables -------------------------------------------------- self.count_time = None self.xrf_spectrum_model = None self.init_models() # Graphic elements ---------------------------------------------------- self._data_path_widget = DataPathWidget( self, data_model=self._path_template, layout="vertical" ) _parameters_gbox = qt_import.QGroupBox("Parameters", self) _count_time_label = qt_import.QLabel("Count time (sec.):", _parameters_gbox) self.count_time_ledit = qt_import.QLineEdit("1", _parameters_gbox) # self.count_time_ledit.setMaximumWidth(75) self.adjust_transmission_cbox = qt_import.QCheckBox( "Adjust transmission", _parameters_gbox ) self.adjust_transmission_cbox.setChecked(True) self._comments_widget = CommentsWidget(self) # Layout -------------------------------------------------------------- _parameters_gbox_hlayout = qt_import.QHBoxLayout(_parameters_gbox) _parameters_gbox_hlayout.addWidget(_count_time_label) _parameters_gbox_hlayout.addWidget(self.count_time_ledit) _parameters_gbox_hlayout.addWidget(self.adjust_transmission_cbox) _parameters_gbox_hlayout.addStretch(0) _parameters_gbox_hlayout.setSpacing(2) _parameters_gbox_hlayout.setContentsMargins(0, 0, 0, 0) _main_vlayout = qt_import.QVBoxLayout(self) _main_vlayout.addWidget(self._data_path_widget) _main_vlayout.addWidget(_parameters_gbox) _main_vlayout.addWidget(self._comments_widget) _main_vlayout.setSpacing(6) _main_vlayout.setContentsMargins(2, 2, 2, 2) _main_vlayout.addStretch(0) # SizePolicies -------------------------------------------------------- self._comments_widget.setFixedHeight(100) # Qt signal/slot connections ------------------------------------------ self._data_path_widget.pathTemplateChangedSignal.connect( self.path_template_changed ) self.adjust_transmission_cbox.stateChanged.connect( self.adjust_transmission_state_changed ) # Other --------------------------------------------------------------- self._data_path_widget.data_path_layout.compression_cbox.setVisible(False) def set_expert_mode(self, state): self.adjust_transmission_cbox.setEnabled(state) def enable_compression(self, state): CreateTaskBase.enable_compression(self, False) def init_models(self): CreateTaskBase.init_models(self) self.xrf_spectrum_model = queue_model_objects.XRFSpectrum() self._path_template.start_num = 1 self._path_template.num_files = 1 self._path_template.suffix = "raw" self._path_template.compression = False def single_item_selection(self, tree_item): CreateTaskBase.single_item_selection(self, tree_item) self.xrf_spectrum_model = tree_item.get_model() if isinstance(tree_item, queue_item.XRFSpectrumQueueItem): if self.xrf_spectrum_model.is_executed(): self.setDisabled(True) else: self.setDisabled(False) if self.xrf_spectrum_model.get_path_template(): self._path_template = self.xrf_spectrum_model.get_path_template() self._data_path_widget.update_data_model(self._path_template) elif not ( isinstance(tree_item, queue_item.SampleQueueItem) or isinstance(tree_item, queue_item.DataCollectionGroupQueueItem) ): self.setDisabled(True) def approve_creation(self): # base_result = CreateTaskBase.approve_creation(self) base_result = True self.count_time = None try: self.count_time = float(str(self.count_time_ledit.text())) except BaseException: logging.getLogger("GUI").error("Incorrect count time value.") return base_result and self.count_time # Called by the owning widget (task_toolbox_widget) to create # a collection. When a data collection group is selected. def _create_task(self, sample, shape, comments=None): data_collections = [] if self.count_time is not None: if not shape: cpos = queue_model_objects.CentredPosition() cpos.snapshot_image = HWR.beamline.sample_view.get_snapshot() else: # Shapes selected and sample is mounted, get the # centred positions for the shapes if isinstance(shape, GraphicsItemPoint): snapshot = HWR.beamline.sample_view.get_snapshot(shape=shape) cpos = copy.deepcopy(shape.get_centred_position()) cpos.snapshot_image = snapshot path_template = self._create_path_template(sample, self._path_template) xrf_spectrum = queue_model_objects.XRFSpectrum(sample, path_template, cpos) xrf_spectrum.set_name(path_template.get_prefix()) xrf_spectrum.set_number(path_template.run_number) xrf_spectrum.count_time = self.count_time xrf_spectrum.adjust_transmission = self.adjust_transmission_cbox.isChecked() data_collections.append(xrf_spectrum) else: logging.getLogger("GUI").error("No count time specified.") return data_collections def adjust_transmission_state_changed(self, state): self.xrf_spectrum_model.adjust_transmission = state > 0
def __init__(self, parent=None, name="task_toolbox"): qt_import.QWidget.__init__(self, parent) self.setObjectName = name # Internal variables -------------------------------------------------- self.tree_brick = None self.previous_page_index = 0 self.is_running = None self.path_conflict = False self.acq_conflict = False self.enable_collect = False self.create_task_widgets = {} # Graphic elements ---------------------------------------------------- self.method_label = qt_import.QLabel("Collection method", self) self.method_label.setAlignment(qt_import.Qt.AlignCenter) self.tool_box = qt_import.QToolBox(self) self.tool_box.setObjectName("tool_box") # self.tool_box.setFixedWidth(600) self.discrete_page = CreateDiscreteWidget(self.tool_box, "Discrete") self.char_page = CreateCharWidget(self.tool_box, "Characterise") self.helical_page = CreateHelicalWidget(self.tool_box, "helical_page") self.energy_scan_page = CreateEnergyScanWidget(self.tool_box, "energy_scan") self.xrf_spectrum_page = CreateXRFSpectrumWidget( self.tool_box, "xrf_spectrum") if HWR.beamline.gphl_workflow is not None: self.gphl_workflow_page = CreateGphlWorkflowWidget( self.tool_box, "gphl_workflow") else: self.gphl_workflow_page = None self.advanced_page = CreateAdvancedWidget(self.tool_box, "advanced_scan") self.xray_imaging_page = CreateXrayImagingWidget( self.tool_box, "xray_imaging") self.ssx_page = CreateSsxWidget(self.tool_box, "ssx") self.tool_box.addItem(self.discrete_page, "Standard Collection") self.tool_box.addItem(self.char_page, "Characterisation") self.tool_box.addItem(self.helical_page, "Helical Collection") self.tool_box.addItem(self.energy_scan_page, "Energy Scan") self.tool_box.addItem(self.xrf_spectrum_page, "XRF Spectrum") if self.gphl_workflow_page is not None: self.tool_box.addItem(self.gphl_workflow_page, "GPhL Workflows") self.tool_box.addItem(self.advanced_page, "Advanced") self.tool_box.addItem(self.xray_imaging_page, "Xray Imaging") self.tool_box.addItem(self.ssx_page, "SSX") self.button_box = qt_import.QWidget(self) self.create_task_button = qt_import.QPushButton( " Add to queue", self.button_box) self.create_task_button.setIcon(icons.load_icon("add_row.png")) msg = "Add the collection method to the selected sample" self.create_task_button.setToolTip(msg) self.create_task_button.setEnabled(False) self.collect_now_button = qt_import.QPushButton( "Collect Now", self.button_box) self.collect_now_button.setIcon(icons.load_icon("VCRPlay2.png")) self.collect_now_button.setToolTip( "Add the collection method to the queue and execute it") self.comments_widget = CommentsWidget(self) self.comments_widget.setFixedHeight(100) # Layout -------------------------------------------------------------- _button_box_hlayout = qt_import.QHBoxLayout(self.button_box) _button_box_hlayout.addWidget(self.collect_now_button) _button_box_hlayout.addStretch(0) _button_box_hlayout.addWidget(self.create_task_button) _button_box_hlayout.setSpacing(0) _button_box_hlayout.setContentsMargins(0, 0, 0, 0) _main_vlayout = qt_import.QVBoxLayout(self) _main_vlayout.addWidget(self.method_label) _main_vlayout.addWidget(self.tool_box) _main_vlayout.addWidget(self.comments_widget) _main_vlayout.addWidget(self.button_box) _main_vlayout.setSpacing(0) _main_vlayout.setContentsMargins(0, 0, 0, 0) # SizePolicies -------------------------------------------------------- # self.setSizePolicy(QSizePolicy.Expanding, # QSizePolicy.Expanding) # Qt signal/slot connections ------------------------------------------ self.create_task_button.clicked.connect(self.create_task_button_click) self.collect_now_button.clicked.connect(self.collect_now_button_click) self.tool_box.currentChanged.connect(self.current_page_changed) for i in range(0, self.tool_box.count()): self.tool_box.widget(i).acqParametersConflictSignal.connect( self.acq_parameters_conflict_changed) self.tool_box.widget(i).pathTempleConflictSignal.connect( self.path_template_conflict_changed) # Other --------------------------------------------------------------- in_plate_mode = HWR.beamline.diffractometer.in_plate_mode() if (HWR.beamline.energy_scan is None or in_plate_mode or not HWR.beamline.tunable_wavelength): self.hide_task(self.energy_scan_page) logging.getLogger("HWR").info("Energy scan task not available") if HWR.beamline.xrf_spectrum is None or in_plate_mode: self.hide_task(self.xrf_spectrum_page) logging.getLogger("HWR").info("XRF spectrum task not available") if not HWR.beamline.imaging or in_plate_mode: self.hide_task(self.xray_imaging_page) logging.getLogger("HWR").info("Xray Imaging task not available") if HWR.beamline.gphl_connection and HWR.beamline.gphl_workflow: self.gphl_workflow_page.initialise_workflows() else: logging.getLogger("HWR").info("GPhL workflow task not available")
class TaskToolBoxWidget(qt_import.QWidget): def __init__(self, parent=None, name="task_toolbox"): qt_import.QWidget.__init__(self, parent) self.setObjectName = name # Internal variables -------------------------------------------------- self.tree_brick = None self.previous_page_index = 0 self.is_running = None self.path_conflict = False self.acq_conflict = False self.enable_collect = False self.create_task_widgets = {} # Graphic elements ---------------------------------------------------- self.method_label = qt_import.QLabel("Collection method", self) self.method_label.setAlignment(qt_import.Qt.AlignCenter) self.tool_box = qt_import.QToolBox(self) self.tool_box.setObjectName("tool_box") # self.tool_box.setFixedWidth(600) self.discrete_page = CreateDiscreteWidget(self.tool_box, "Discrete") self.char_page = CreateCharWidget(self.tool_box, "Characterise") self.helical_page = CreateHelicalWidget(self.tool_box, "helical_page") self.energy_scan_page = CreateEnergyScanWidget(self.tool_box, "energy_scan") self.xrf_spectrum_page = CreateXRFSpectrumWidget( self.tool_box, "xrf_spectrum") if HWR.beamline.gphl_workflow is not None: self.gphl_workflow_page = CreateGphlWorkflowWidget( self.tool_box, "gphl_workflow") else: self.gphl_workflow_page = None self.advanced_page = CreateAdvancedWidget(self.tool_box, "advanced_scan") self.xray_imaging_page = CreateXrayImagingWidget( self.tool_box, "xray_imaging") self.ssx_page = CreateSsxWidget(self.tool_box, "ssx") self.tool_box.addItem(self.discrete_page, "Standard Collection") self.tool_box.addItem(self.char_page, "Characterisation") self.tool_box.addItem(self.helical_page, "Helical Collection") self.tool_box.addItem(self.energy_scan_page, "Energy Scan") self.tool_box.addItem(self.xrf_spectrum_page, "XRF Spectrum") if self.gphl_workflow_page is not None: self.tool_box.addItem(self.gphl_workflow_page, "GPhL Workflows") self.tool_box.addItem(self.advanced_page, "Advanced") self.tool_box.addItem(self.xray_imaging_page, "Xray Imaging") self.tool_box.addItem(self.ssx_page, "SSX") self.button_box = qt_import.QWidget(self) self.create_task_button = qt_import.QPushButton( " Add to queue", self.button_box) self.create_task_button.setIcon(icons.load_icon("add_row.png")) msg = "Add the collection method to the selected sample" self.create_task_button.setToolTip(msg) self.create_task_button.setEnabled(False) self.collect_now_button = qt_import.QPushButton( "Collect Now", self.button_box) self.collect_now_button.setIcon(icons.load_icon("VCRPlay2.png")) self.collect_now_button.setToolTip( "Add the collection method to the queue and execute it") self.comments_widget = CommentsWidget(self) self.comments_widget.setFixedHeight(100) # Layout -------------------------------------------------------------- _button_box_hlayout = qt_import.QHBoxLayout(self.button_box) _button_box_hlayout.addWidget(self.collect_now_button) _button_box_hlayout.addStretch(0) _button_box_hlayout.addWidget(self.create_task_button) _button_box_hlayout.setSpacing(0) _button_box_hlayout.setContentsMargins(0, 0, 0, 0) _main_vlayout = qt_import.QVBoxLayout(self) _main_vlayout.addWidget(self.method_label) _main_vlayout.addWidget(self.tool_box) _main_vlayout.addWidget(self.comments_widget) _main_vlayout.addWidget(self.button_box) _main_vlayout.setSpacing(0) _main_vlayout.setContentsMargins(0, 0, 0, 0) # SizePolicies -------------------------------------------------------- # self.setSizePolicy(QSizePolicy.Expanding, # QSizePolicy.Expanding) # Qt signal/slot connections ------------------------------------------ self.create_task_button.clicked.connect(self.create_task_button_click) self.collect_now_button.clicked.connect(self.collect_now_button_click) self.tool_box.currentChanged.connect(self.current_page_changed) for i in range(0, self.tool_box.count()): self.tool_box.widget(i).acqParametersConflictSignal.connect( self.acq_parameters_conflict_changed) self.tool_box.widget(i).pathTempleConflictSignal.connect( self.path_template_conflict_changed) # Other --------------------------------------------------------------- in_plate_mode = HWR.beamline.diffractometer.in_plate_mode() if (HWR.beamline.energy_scan is None or in_plate_mode or not HWR.beamline.tunable_wavelength): self.hide_task(self.energy_scan_page) logging.getLogger("HWR").info("Energy scan task not available") if HWR.beamline.xrf_spectrum is None or in_plate_mode: self.hide_task(self.xrf_spectrum_page) logging.getLogger("HWR").info("XRF spectrum task not available") if not HWR.beamline.imaging or in_plate_mode: self.hide_task(self.xray_imaging_page) logging.getLogger("HWR").info("Xray Imaging task not available") if HWR.beamline.gphl_connection and HWR.beamline.gphl_workflow: self.gphl_workflow_page.initialise_workflows() else: logging.getLogger("HWR").info("GPhL workflow task not available") def set_available_tasks(self, available_tasks): for task_name in available_tasks.split(): module_name = "gui.widgets.create_%s_widget" % task_name class_name = "Create%sWidget" % task_name.title().replace(" ", "") create_task_widget_cls = getattr( importlib.import_module(module_name), class_name) create_task_widget = create_task_widget_cls( self.tool_box, task_name) self.tool_box.addItem(create_task_widget, task_name.title()) self.create_task_widgets[task_name] = create_task_widget def adjust_width(self, width): # Adjust periodic table width if width > -1: self.energy_scan_page._periodic_table_widget.setFixedWidth(width - 4) self.energy_scan_page._periodic_table_widget.setFixedHeight(width / 1.5) def set_expert_mode(self, state): for i in range(0, self.tool_box.count()): self.tool_box.widget(i).set_expert_mode(state) def enable_compression(self, state): for i in range(0, self.tool_box.count()): self.tool_box.widget(i).enable_compression(state) def set_tree_brick(self, brick): """Sets the tree brick of each page in the toolbox. """ self.tree_brick = brick for i in range(0, self.tool_box.count()): self.tool_box.widget(i).set_tree_brick(brick) self.tree_brick.dc_tree_widget.enableCollectSignal.connect( self.enable_collect_changed) self.selection_changed(self.tree_brick.get_selected_items()) def use_osc_start_cbox(self, status): for i in range(0, self.tool_box.count()): acq_widget = self.tool_box.widget(i).get_acquisition_widget() if acq_widget: acq_widget.use_osc_start(status) def hide_task(self, task_page): self.tool_box.removeItem(self.tool_box.indexOf(task_page)) task_page.hide() def update_data_path_model(self): for i in range(0, self.tool_box.count()): item = self.tool_box.widget(i) item.init_data_path_model() item.update_selection() def ispyb_logged_in(self, logged_in): """ Handels the signal logged_in from the brick the handles LIMS (ISPyB) login, ie ProposalBrick. The signal is emitted when a user was succesfully logged in. """ for i in range(0, self.tool_box.count()): self.tool_box.widget(i).ispyb_logged_in(logged_in) def current_page_changed(self, page_index): if not self.tree_brick: return tree_items = self.tree_brick.get_selected_items() # self.collect_now_button.setHidden(page_index > 0) self.create_task_button.setEnabled(False) if len(tree_items) > 0: tree_item = tree_items[0] # Get the directory form the previous page and update # the new page with the direcotry and run_number from the old. # IF sample, basket group selected. if type(tree_item) in ( queue_item.DataCollectionGroupQueueItem, queue_item.SampleQueueItem, queue_item.BasketQueueItem, ): new_pt = self.tool_box.widget(page_index)._path_template previous_pt = self.tool_box.widget( self.previous_page_index)._path_template new_pt.directory = previous_pt.directory new_pt.base_prefix = previous_pt.base_prefix new_pt.run_number = HWR.beamline.queue_model.get_next_run_number( new_pt) self.create_task_button.setEnabled(True) elif isinstance(tree_item, queue_item.DataCollectionQueueItem): # self.collect_now_button.show() data_collection = tree_item.get_model() if data_collection.is_helical(): if self.tool_box.currentWidget() == self.helical_page: self.create_task_button.setEnabled(True) elif data_collection.is_mesh(): if self.tool_box.currentWidget() == self.advanced_page: self.create_task_button.setEnabled(True) elif data_collection.is_still(): if self.tool_box.currentWidget() == self.ssx_page: self.create_task_button.setEnabled(True) elif self.tool_box.currentWidget() == self.discrete_page: self.create_task_button.setEnabled(True) elif isinstance(tree_item, queue_item.CharacterisationQueueItem): if self.tool_box.currentWidget() == self.char_page: self.create_task_button.setEnabled(True) elif isinstance(tree_item, queue_item.EnergyScanQueueItem): if self.tool_box.currentWidget() == self.energy_scan_page: self.create_task_button.setEnabled(True) elif isinstance(tree_item, queue_item.XRFSpectrumQueueItem): if self.tool_box.currentWidget() == self.xrf_spectrum_page: self.create_task_button.setEnabled(True) elif isinstance(tree_item, queue_item.GphlWorkflowQueueItem): if self.tool_box.currentWidget() == self.gphl_workflow_page: self.create_task_button.setEnabled(True) elif isinstance(tree_item, queue_item.GenericWorkflowQueueItem): if self.tool_box.currentWidget() == self.workflow_page: self.create_task_button.setEnabled(True) elif isinstance(tree_item, queue_item.XrayCenteringQueueItem): if self.tool_box.currentWidget() == self.advanced_page: self.create_task_button.setEnabled(True) elif isinstance(tree_item, queue_item.XrayImagingQueueItem): if self.tool_box.currentWidget() == self.xray_imaging_page: self.create_task_button.setEnabled(True) self.tool_box.widget(page_index).selection_changed(tree_items) self.previous_page_index = page_index def selection_changed(self, items): """ Called by the parent widget when selection in the tree changes. """ title = "<b>Collection method template</b>" if len(items) == 1: self.create_task_button.setEnabled(False) data_model = items[0].get_model() title = "<b>%s</b>" % data_model.get_display_name() if not isinstance(items[0], queue_item.DataCollectionGroupQueueItem): self.create_task_button.setEnabled(True) if isinstance(items[0], queue_item.DataCollectionQueueItem): if data_model.is_helical(): self.tool_box.setCurrentWidget(self.helical_page) elif data_model.is_mesh(): self.tool_box.setCurrentWidget(self.advanced_page) elif data_model.is_still(): self.tool_box.setCurrentWidget(self.ssx_page) else: self.tool_box.setCurrentWidget(self.discrete_page) elif isinstance(items[0], queue_item.CharacterisationQueueItem): self.tool_box.setCurrentWidget(self.char_page) elif isinstance(items[0], queue_item.EnergyScanQueueItem): self.tool_box.setCurrentWidget(self.energy_scan_page) elif isinstance(items[0], queue_item.XRFSpectrumQueueItem): self.tool_box.setCurrentWidget(self.xrf_spectrum_page) elif isinstance(items[0], queue_item.GphlWorkflowQueueItem): self.tool_box.setCurrentWidget(self.gphl_workflow_page) elif isinstance(items[0], queue_item.GenericWorkflowQueueItem): self.tool_box.setCurrentWidget(self.workflow_page) elif isinstance(items[0], queue_item.XrayCenteringQueueItem): self.tool_box.setCurrentWidget(self.advanced_page) elif isinstance(items[0], queue_item.XrayImagingQueueItem): self.tool_box.setCurrentWidget(self.xray_imaging_page) elif isinstance(items[0], queue_item.SampleQueueItem): title = "<b>Sample: %s</b>" % data_model.get_display_name() self.method_label.setText(title) else: self.create_task_button.setEnabled(True) current_page = self.tool_box.currentWidget() current_page.selection_changed(items) def create_task_button_click(self): if self.tool_box.currentWidget().approve_creation(): items = self.tree_brick.get_selected_items() if not items: logging.getLogger("GUI").warning( "Select the sample, basket or task group you would like to add to." ) else: for item in items: shapes = HWR.beamline.sample_view.get_selected_points() task_model = item.get_model() # TODO Consider if GPhL workflow needs task-per-shape # like xrf does # Create a new group if sample is selected if isinstance(task_model, queue_model_objects.Sample): task_model = self.create_task_group(task_model) if self.tool_box.currentWidget() in ( self.discrete_page, self.char_page, self.energy_scan_page, self.xrf_spectrum_page, ) and len(shapes): # This could be done in more nicer way... for shape in shapes: self.create_task(task_model, shape) else: self.create_task(task_model) elif isinstance(task_model, queue_model_objects.Basket): for sample_node in task_model.get_sample_list(): task_group = self.create_task_group(sample_node) if self.tool_box.currentWidget() in ( self.discrete_page, self.char_page, self.energy_scan_page, self.xrf_spectrum_page, self.xray_imaging_page, ) and len(shapes): for shape in shapes: self.create_task(task_group, shape) else: self.create_task(task_group) else: if self.tool_box.currentWidget() in ( self.discrete_page, self.char_page, self.energy_scan_page, self.xrf_spectrum_page, self.xray_imaging_page, ) and len(shapes): for shape in shapes: self.create_task(task_model, shape) else: self.create_task(task_model) self.tree_brick.select_last_added_item() self.tree_brick.update_enable_collect() self.tool_box.currentWidget().update_selection() def create_task_group(self, task_model): group_task_node = queue_model_objects.TaskGroup() current_item = self.tool_box.currentWidget() group_name = current_item.get_task_node_name() group_task_node.set_name(group_name) num = task_model.get_next_number_for_name(group_name) group_task_node.set_number(num) HWR.beamline.queue_model.add_child(task_model, group_task_node) return group_task_node def create_task(self, task_node, shape=None): # Selected item is a task group if isinstance(task_node, queue_model_objects.TaskGroup): sample = task_node.get_parent() comment = self.comments_widget.get_comment_text() task_list = self.tool_box.currentWidget().create_task( sample, shape, comment) for child_task_node in task_list: HWR.beamline.queue_model.add_child(task_node, child_task_node) # The selected item is a task, make a copy. else: new_node = HWR.beamline.queue_model.copy_node(task_node) new_snapshot = (HWR.beamline.sample_view.get_snapshot()) if isinstance(task_node, queue_model_objects.Characterisation): new_node.reference_image_collection.acquisitions[ 0].acquisition_parameters.centred_position.snapshot_image = new_snapshot elif isinstance(task_node, queue_model_objects.DataCollection): new_node.acquisitions[ 0].acquisition_parameters.centred_position.snapshot_image = new_snapshot elif type(task_node) in ( queue_model_objects.DataCollection, queue_model_objects.XRFSpectrum, ): new_node.centred_position.snapshot_image = new_snapshot HWR.beamline.queue_model.add_child(task_node.get_parent(), new_node) def collect_now_button_click(self): if not self.tree_brick.dc_tree_widget.enable_collect_condition: logging.getLogger("GUI").warning("Collections are disabled") selected_items = self.tree_brick.get_selected_items() mounted_sample_item = self.tree_brick.dc_tree_widget.get_mounted_sample_item( ) will_mount_sample = False for item in selected_items: if isinstance(item, (queue_item.SampleQueueItem, queue_item.OpticalCentringQueueItem, queue_item.XrayCenteringQueueItem)): if item != mounted_sample_item: will_mount_sample = True else: sample_item = item.get_sample_view_item() if sample_item != mounted_sample_item: will_mount_sample = True if will_mount_sample: conf_msg = "One or several not mounted samples are selected.\n" +\ "Before collecting sample(s) will be mounted. Continue?" if (qt_import.QMessageBox.warning( None, "Question", conf_msg, qt_import.QMessageBox.Ok, qt_import.QMessageBox.No) == qt_import.QMessageBox.No): return self.create_task_button_click() collect_items = [] for item in self.tree_brick.dc_tree_widget.get_collect_items(): if isinstance(item, (queue_item.SampleCentringQueueItem, queue_item.OpticalCentringQueueItem, queue_item.XrayCenteringQueueItem)): item.setOn(False) item.setText(1, "Skipped") item.set_strike_out(True) item.get_model().set_executed(True) item.get_model().set_running(False) item.get_model().set_enabled(False) else: collect_items.append(item) if self.tree_brick.dc_tree_widget.enable_collect_condition: self.tree_brick.dc_tree_widget.collect_items(collect_items) else: logging.getLogger("GUI").warning("Collections are disabled") def path_template_conflict_changed(self, is_conflict): self.path_conflict = is_conflict self.toggle_queue_button_enable() def acq_parameters_conflict_changed(self, is_conflict): self.acq_conflict = is_conflict self.toggle_queue_button_enable() def enable_collect_changed(self, enable_collect): self.enable_collect = enable_collect self.toggle_queue_button_enable() def toggle_queue_button_enable(self): enable_create_task_button = False enable_collect_now_button = False if self.tree_brick.get_selected_items(): enable_create_task_button = not self.path_conflict and not self.acq_conflict enable_collect_now_button = enable_create_task_button and self.enable_collect if self.tool_box.currentWidget() in (self.helical_page, self.advanced_page): if len(self.tool_box.currentWidget().get_selected_shapes() ) == 0: enable_create_task_button = False enable_collect_now_button = False elif self.tool_box.currentWidget() == self.xray_imaging_page: enable_create_task_button = True enable_collect_now_button = True self.create_task_button.setEnabled(enable_create_task_button) self.collect_now_button.setEnabled(enable_collect_now_button)
def __init__(self, parent=None, name=None, fl=0): CreateTaskBase.__init__(self, parent, name, fl, "Helical") if not name: self.setObjectName("create_helical_widget") self.init_models() # Hardware objects ---------------------------------------------------- # Internal variables -------------------------------------------------- self._lines_map = {} # Graphic elements ---------------------------------------------------- self._lines_widget = qt_import.load_ui_file( "helical_line_widget_layout.ui") self._acq_widget = AcquisitionWidget( self, "acquisition_widget", layout="vertical", acq_params=self._acquisition_parameters, path_template=self._path_template, ) self._data_path_widget = DataPathWidget( self, "create_dc_path_widget", data_model=self._path_template, layout="vertical", ) self._processing_widget = ProcessingWidget( self, data_model=self._processing_parameters) self._comments_widget = CommentsWidget(self) # Layout -------------------------------------------------------------- _main_vlayout = qt_import.QVBoxLayout(self) _main_vlayout.addWidget(self._lines_widget) _main_vlayout.addWidget(self._acq_widget) _main_vlayout.addWidget(self._data_path_widget) _main_vlayout.addWidget(self._processing_widget) _main_vlayout.addWidget(self._comments_widget) _main_vlayout.addStretch(0) _main_vlayout.setSpacing(6) _main_vlayout.setContentsMargins(2, 2, 2, 2) # SizePolicies -------------------------------------------------------- self._comments_widget.setFixedHeight(100) # Qt signal/slot connections ------------------------------------------ self._lines_widget.lines_treewidget.itemSelectionChanged.connect( self.lines_treewidget_selection_changed) self._lines_widget.create_line_button.clicked.connect( self.create_line_button_clicked) self._lines_widget.create_auto_line_button.clicked.connect( self.create_auto_line_button_clicked) self._lines_widget.remove_line_button.clicked.connect( self.remove_line_button_clicked) self._lines_widget.overlay_cbox.stateChanged.connect( self.overlay_toggled) self._lines_widget.overlay_slider.valueChanged.connect( self.overlay_alpha_changed) self._lines_widget.swap_points_button.clicked.connect( self.swap_points_clicked) self._acq_widget.acqParametersChangedSignal.connect( self.acq_parameters_changed) self._acq_widget.madEnergySelectedSignal.connect( self.mad_energy_selected) self._data_path_widget.pathTemplateChangedSignal.connect( self.path_template_changed) self._processing_widget.enableProcessingSignal.connect( self._run_processing_toggled) # Other --------------------------------------------------------------- for col in range(self._lines_widget.lines_treewidget.columnCount()): self._lines_widget.lines_treewidget.resizeColumnToContents(col) # self._processing_widget.processing_widget.\ # run_online_processing_cbox.setChecked(False) self._processing_widget.processing_widget.run_online_processing_cbox.setChecked( HWR.beamline.run_online_processing) self.enable_widgets(False) shapes = HWR.beamline.sample_view.get_shapes() for shape in shapes: if isinstance(shape, GraphicsItemLine): self.shape_created(shape, "Line") HWR.beamline.sample_view.connect("shapeCreated", self.shape_created) HWR.beamline.sample_view.connect("shapeChanged", self.shape_changed) HWR.beamline.sample_view.connect("shapeDeleted", self.shape_deleted) self._comments_widget.setHidden(True)
class CreateHelicalWidget(CreateTaskBase): def __init__(self, parent=None, name=None, fl=0): CreateTaskBase.__init__(self, parent, name, fl, "Helical") if not name: self.setObjectName("create_helical_widget") self.init_models() # Hardware objects ---------------------------------------------------- # Internal variables -------------------------------------------------- self._lines_map = {} # Graphic elements ---------------------------------------------------- self._lines_widget = qt_import.load_ui_file( "helical_line_widget_layout.ui") self._acq_widget = AcquisitionWidget( self, "acquisition_widget", layout="vertical", acq_params=self._acquisition_parameters, path_template=self._path_template, ) self._data_path_widget = DataPathWidget( self, "create_dc_path_widget", data_model=self._path_template, layout="vertical", ) self._processing_widget = ProcessingWidget( self, data_model=self._processing_parameters) self._comments_widget = CommentsWidget(self) # Layout -------------------------------------------------------------- _main_vlayout = qt_import.QVBoxLayout(self) _main_vlayout.addWidget(self._lines_widget) _main_vlayout.addWidget(self._acq_widget) _main_vlayout.addWidget(self._data_path_widget) _main_vlayout.addWidget(self._processing_widget) _main_vlayout.addWidget(self._comments_widget) _main_vlayout.addStretch(0) _main_vlayout.setSpacing(6) _main_vlayout.setContentsMargins(2, 2, 2, 2) # SizePolicies -------------------------------------------------------- self._comments_widget.setFixedHeight(100) # Qt signal/slot connections ------------------------------------------ self._lines_widget.lines_treewidget.itemSelectionChanged.connect( self.lines_treewidget_selection_changed) self._lines_widget.create_line_button.clicked.connect( self.create_line_button_clicked) self._lines_widget.create_auto_line_button.clicked.connect( self.create_auto_line_button_clicked) self._lines_widget.remove_line_button.clicked.connect( self.remove_line_button_clicked) self._lines_widget.overlay_cbox.stateChanged.connect( self.overlay_toggled) self._lines_widget.overlay_slider.valueChanged.connect( self.overlay_alpha_changed) self._lines_widget.swap_points_button.clicked.connect( self.swap_points_clicked) self._acq_widget.acqParametersChangedSignal.connect( self.acq_parameters_changed) self._acq_widget.madEnergySelectedSignal.connect( self.mad_energy_selected) self._data_path_widget.pathTemplateChangedSignal.connect( self.path_template_changed) self._processing_widget.enableProcessingSignal.connect( self._run_processing_toggled) # Other --------------------------------------------------------------- for col in range(self._lines_widget.lines_treewidget.columnCount()): self._lines_widget.lines_treewidget.resizeColumnToContents(col) # self._processing_widget.processing_widget.\ # run_online_processing_cbox.setChecked(False) self._processing_widget.processing_widget.run_online_processing_cbox.setChecked( HWR.beamline.run_online_processing) self.enable_widgets(False) shapes = HWR.beamline.sample_view.get_shapes() for shape in shapes: if isinstance(shape, GraphicsItemLine): self.shape_created(shape, "Line") HWR.beamline.sample_view.connect("shapeCreated", self.shape_created) HWR.beamline.sample_view.connect("shapeChanged", self.shape_changed) HWR.beamline.sample_view.connect("shapeDeleted", self.shape_deleted) self._comments_widget.setHidden(True) def enable_widgets(self, state): self._acq_widget.setEnabled(state) self._data_path_widget.setEnabled(state) self._processing_widget.setEnabled(state) def init_models(self): CreateTaskBase.init_models(self) self._energy_scan_result = queue_model_objects.EnergyScanResult() self._processing_parameters = queue_model_objects.ProcessingParameters( ) has_shutter_less = HWR.beamline.detector.has_shutterless() self._acquisition_parameters.shutterless = has_shutter_less self._acquisition_parameters = ( HWR.beamline.get_default_acquisition_parameters("helical")) def shape_created(self, shape, shape_type): if shape_type == "Line": self._lines_widget.lines_treewidget.clearSelection() # info_str_list = QStringList() info_str_list = [] info_str_list.append(shape.get_display_name()) info_str_list.append("%d" % shape.get_points_index()[0]) info_str_list.append("%d" % shape.get_points_index()[1]) lines_treewidget_item = qt_import.QTreeWidgetItem( self._lines_widget.lines_treewidget, info_str_list) lines_treewidget_item.setSelected(True) self._lines_map[shape] = lines_treewidget_item self.lines_treewidget_selection_changed() def shape_deleted(self, shape, shape_type): if shape_type == "Line" and self._lines_map.get(shape): shape_index = self._lines_widget.lines_treewidget.indexFromItem( self._lines_map[shape]) self._lines_widget.lines_treewidget.takeTopLevelItem( shape_index.row()) self._lines_map.pop(shape) def approve_creation(self): base_result = CreateTaskBase.approve_creation(self) if len(self._lines_widget.lines_treewidget.selectedItems()) == 0: logging.getLogger("GUI").warning( "No lines selected, please select one or more lines.") return False else: return base_result def select_line_with_cpos(self, start_cpos, end_cpos, num_images): """Selects graphical line which contains two cpositions Adds number of frames next to the graphical line """ self._lines_widget.overlay_slider.setEnabled(False) self._lines_widget.overlay_cbox.setEnabled(False) HWR.beamline.sample_view.de_select_all() for shape in HWR.beamline.sample_view.get_shapes(): if isinstance(shape, GraphicsItemLine): (start_cpos_index, end_cpos_index) = shape.get_points_index() if (start_cpos_index == start_cpos.index and end_cpos_index == end_cpos.index): HWR.beamline.sample_view.select_shape(shape) shape.set_num_images(num_images) self._lines_widget.overlay_slider.setEnabled(True) self._lines_widget.overlay_cbox.setEnabled(True) def single_item_selection(self, tree_item): CreateTaskBase.single_item_selection(self, tree_item) if isinstance(tree_item, queue_item.SampleQueueItem): sample_model = tree_item.get_model() self._processing_parameters = sample_model.processing_parameters # self._processing_parameters = copy.deepcopy(self._processing_parameters) self._processing_widget.update_data_model( self._processing_parameters) elif isinstance(tree_item, queue_item.BasketQueueItem): self.setDisabled(False) elif isinstance(tree_item, queue_item.DataCollectionQueueItem): data_collection = tree_item.get_model() if data_collection.is_helical(): self.setDisabled(tree_item.get_model().is_executed()) self._path_template = data_collection.get_path_template() self._data_path_widget.update_data_model(self._path_template) self._acquisition_parameters = data_collection.acquisitions[ 0].acquisition_parameters if len(data_collection.acquisitions) == 2: start_cpos = data_collection.acquisitions[ 0].acquisition_parameters.centred_position end_cpos = data_collection.acquisitions[ 1].acquisition_parameters.centred_position num_images = data_collection.acquisitions[ 0].acquisition_parameters.num_images self.select_line_with_cpos(start_cpos, end_cpos, num_images) self._acq_widget.update_data_model( self._acquisition_parameters, self._path_template) # self.get_acquisition_widget().use_osc_start(True) self._processing_parameters = data_collection.processing_parameters self._processing_widget.update_data_model( self._processing_parameters) else: self.setDisabled(True) else: self.setDisabled(True) if (isinstance(tree_item, queue_item.SampleQueueItem) or isinstance( tree_item, queue_item.DataCollectionGroupQueueItem) or isinstance(tree_item, queue_item.DataCollectionQueueItem)): self._processing_widget.update_data_model( self._processing_parameters) self._acq_widget.update_data_model(self._acquisition_parameters, self._path_template) def _create_task(self, sample, shape, comments=None): data_collections = [] for shape in self.get_selected_shapes(): snapshot = HWR.beamline.sample_view.get_snapshot(shape=shape) # Acquisition for start position start_acq = self._create_acq(sample) start_graphical_point, end_graphical_point = shape.get_graphical_points( ) start_acq.acquisition_parameters.centred_position = copy.deepcopy( start_graphical_point.get_centred_position()) start_acq.acquisition_parameters.centred_position.snapshot_image = snapshot start_acq.path_template.suffix = HWR.beamline.session.suffix # Add another acquisition for the end position end_acq = self._create_acq(sample) end_acq.acquisition_parameters.centred_position = copy.deepcopy( end_graphical_point.get_centred_position()) end_acq.acquisition_parameters.centred_position.snapshot_image = snapshot end_acq.path_template.suffix = HWR.beamline.session.suffix processing_parameters = copy.deepcopy(self._processing_parameters) dc = queue_model_objects.DataCollection([start_acq, end_acq], sample.crystals[0], processing_parameters) dc.set_name(start_acq.path_template.get_prefix()) dc.set_number(start_acq.path_template.run_number) dc.set_experiment_type(EXPERIMENT_TYPE.HELICAL) dc.set_requires_centring(False) dc.run_processing_after = ( self._processing_widget.processing_widget. run_processing_after_cbox.isChecked()) if (self._processing_widget.processing_widget. run_online_processing_cbox.isChecked()): dc.run_online_processing = "LineScan" data_collections.append(dc) self._path_template.run_number += 1 return data_collections def lines_treewidget_selection_changed(self): self.enable_widgets( len(self._lines_widget.lines_treewidget.selectedItems()) > 0) self._lines_widget.remove_line_button.setEnabled( len(self._lines_widget.lines_treewidget.selectedItems()) > 0) self._lines_widget.swap_points_button.setEnabled( len(self._lines_widget.lines_treewidget.selectedItems()) > 0) for shape, list_item in self._lines_map.items(): HWR.beamline.sample_view.select_shape(shape, list_item.isSelected()) self._acq_widget.emit_acq_parameters_changed() def create_line_button_clicked(self): HWR.beamline.sample_view.create_line() def create_auto_line_button_clicked(self): HWR.beamline.sample_view.create_auto_line() def remove_line_button_clicked(self): line_to_delete = None for line, treewidget_item in self._lines_map.items(): if treewidget_item.isSelected(): line_to_delete = line break if line_to_delete: HWR.beamline.sample_view.delete_shape(line_to_delete) self.lines_treewidget_selection_changed() def get_selected_shapes(self): selected_lines = [] for line, treewidget_item in self._lines_map.items(): if treewidget_item.isSelected(): selected_lines.append(line) return selected_lines def overlay_toggled(self, state): HWR.beamline.sample_view.set_display_overlay(state) def overlay_alpha_changed(self, alpha_value): for line, treewidget_item in self._lines_map.items(): if treewidget_item.isSelected(): line.set_fill_alpha(alpha_value) def swap_points_clicked(self): for line, treewidget_item in self._lines_map.items(): if treewidget_item.isSelected(): HWR.beamline.sample_view.swap_line_points(line)