def __init__(self, parent=None, name=None, fl=0): CreateTaskBase.__init__(self, parent, name, fl, 'Standard') if not name: self.setName("create_discrete_widget") self.previous_energy = None self.init_models() # # Layout # v_layout = qt.QVBoxLayout(self, 2, 5, "v_layout") self._acq_gbox = qt.QVGroupBox('Acquisition', self, 'acq_gbox') self._acq_widget = \ AcquisitionWidget(self._acq_gbox, "acquisition_widget", layout='vertical', acq_params=self._acquisition_parameters, path_template=self._path_template) self._data_path_gbox = qt.QVGroupBox('Data location', self, 'data_path_gbox') self._data_path_widget = \ DataPathWidget(self._data_path_gbox, 'create_dc_path_widget', data_model=self._path_template, layout='vertical') self._processing_gbox = qt.QVGroupBox('Processing', self, 'processing_gbox') self._processing_widget = \ ProcessingWidget(self._processing_gbox, data_model=self._processing_parameters) v_layout.addWidget(self._acq_gbox) v_layout.addWidget(self._data_path_gbox) v_layout.addWidget(self._processing_gbox) v_layout.addStretch() dp_layout = self._data_path_widget.data_path_widget_layout self.connect(self._acq_widget, qt.PYSIGNAL('mad_energy_selected'), self.mad_energy_selected) self.connect(dp_layout.child('prefix_ledit'), qt.SIGNAL("textChanged(const QString &)"), self._prefix_ledit_change) self.connect(dp_layout.child('run_number_ledit'), qt.SIGNAL("textChanged(const QString &)"), self._run_number_ledit_change) self.connect(self._acq_widget, qt.PYSIGNAL("path_template_changed"), self.handle_path_conflict) self.connect(self._data_path_widget, qt.PYSIGNAL("path_template_changed"), self.handle_path_conflict)
class ReferenceImageWidget(QWidget): def __init__(self,parent = None,name = None,fl = 0): QWidget.__init__(self,parent,name,fl) if not name: self.setName("ReferenceImageWidget") self.main_layout = QVBoxLayout(self, 0, 4, "main_layout") self.gbox = QVGroupBox(self, "group_box") self.gbox.setTitle("Reference images") self.tool_box = QToolBox(self.gbox, "tool_box") self.page_layout = QVBox(self.tool_box, "page_layout") self.page_layout.setSpacing(7) self.path_widget = DataPathWidget(self.page_layout) self.path_widget.setBackgroundMode(QWidget.PaletteBackground) self.acq_gbox = QVGroupBox(self.page_layout) self.acq_gbox.setInsideMargin(2) self.acq_gbox.setTitle("Acquisition") self.acq_widget = AcquisitionWidget(self.acq_gbox, 'horizontal') self.acq_widget.setBackgroundMode(QWidget.PaletteBackground) self.acq_widget.acq_widget_layout.child('inverse_beam_cbx').hide() self.acq_widget.acq_widget_layout.child('shutterless_cbx').hide() self.acq_widget.acq_widget_layout.child('subwedge_size_label').hide() self.acq_widget.acq_widget_layout.child('subwedge_size_ledit').hide() self.acq_widget.acq_widget_layout.setFixedHeight(160) self.tool_box.addItem(self.page_layout, "Acquisition parameters") self.main_layout.addWidget(self.gbox)
def __init__(self, parent=None, name=None, fl=0): QWidget.__init__(self, parent, name, fl) if not name: self.setName("ReferenceImageWidget") self.main_layout = QVBoxLayout(self, 0, 4, "main_layout") self.gbox = QVGroupBox(self, "group_box") self.gbox.setTitle("Reference images") self.tool_box = QToolBox(self.gbox, "tool_box") self.page_layout = QVBox(self.tool_box, "page_layout") self.page_layout.setSpacing(7) self.path_widget = DataPathWidget(self.page_layout) self.path_widget.setBackgroundMode(QWidget.PaletteBackground) self.acq_gbox = QVGroupBox(self.page_layout) self.acq_gbox.setInsideMargin(2) self.acq_gbox.setTitle("Acquisition") self.acq_widget = AcquisitionWidget(self.acq_gbox, 'horizontal') self.acq_widget.setBackgroundMode(QWidget.PaletteBackground) self.acq_widget.acq_widget_layout.child('inverse_beam_cbx').hide() self.acq_widget.acq_widget_layout.child('shutterless_cbx').hide() self.acq_widget.acq_widget_layout.child('subwedge_size_label').hide() self.acq_widget.acq_widget_layout.child('subwedge_size_ledit').hide() self.acq_widget.acq_widget_layout.setFixedHeight(130) self.tool_box.addItem(self.page_layout, "Acquisition parameters") self.main_layout.addWidget(self.gbox)
def __init__(self, parent=None, name=None, fl=0): CreateTaskBase.__init__(self, parent, name, fl, "XRF-spectrum") self.count_time = None # Data attributes self.init_models() xrfspectrum_model = queue_model_objects.XRFSpectrum() self.xrfspectrum_mib = DataModelInputBinder(xrfspectrum_model) # Layout v_layout = qt.QVBoxLayout(self, 2, 6, "main_v_layout") self._data_path_gbox = qt.QVGroupBox("Data location", self, "data_path_gbox") self._data_path_widget = DataPathWidget( self._data_path_gbox, data_model=self._path_template, layout="vertical" ) parameters_hor_gbox = qt.QHGroupBox("Parameters", self) self.count_time_label = qt.QLabel("Count time", parameters_hor_gbox) self.count_time_label.setFixedWidth(83) self.count_time_ledit = qt.QLineEdit( "1.0", parameters_hor_gbox, "count_time_ledit" ) self.count_time_ledit.setFixedWidth(50) self.xrfspectrum_mib.bind_value_update( "count_time", self.count_time_ledit, float ) # , spacer = qt.QWidget(parameters_hor_gbox) spacer.setSizePolicy(qt.QSizePolicy.Expanding, qt.QSizePolicy.Fixed) v_layout.addWidget(self._data_path_gbox) v_layout.addWidget(parameters_hor_gbox) v_layout.addStretch() self.connect( self._data_path_widget.data_path_widget_layout.child("run_number_ledit"), qt.SIGNAL("textChanged(const QString &)"), self._run_number_ledit_change, ) self.connect( self._data_path_widget.data_path_widget_layout.child("prefix_ledit"), qt.SIGNAL("textChanged(const QString &)"), self._prefix_ledit_change, ) self.connect( self._data_path_widget, qt.PYSIGNAL("path_template_changed"), self.handle_path_conflict, )
def __init__(self, parent=None, name=None, fl=0): CreateTaskBase.__init__(self, parent, name, fl, "Workflow") # Data attributes self.workflow_hwobj = None self.workflows = {} self.init_models() # Layout v_layout = qt.QVBoxLayout(self, 2, 5, "main_v_layout") self._workflow_type_gbox = qt.QVGroupBox("Workflow type", self, "workflow_rtype") self._workflow_cbox = qt.QComboBox(self._workflow_type_gbox) self._data_path_gbox = qt.QVGroupBox("Data location", self, "data_path_gbox") self._data_path_widget = DataPathWidget(self._data_path_gbox, data_model=self._path_template, layout="vertical") self._data_path_widget.data_path_widget_layout.child( "file_name_label").setText("") self._data_path_widget.data_path_widget_layout.child( "file_name_value_label").hide() # self._grid_widget = MxLookupScanBrick.MxLookupScanBrick(self, 'grid_widget') v_layout.addWidget(self._workflow_type_gbox) v_layout.addWidget(self._data_path_gbox) # v_layout.addWidget(self._grid_widget) v_layout.addStretch() self.connect( self._data_path_widget.data_path_widget_layout.child( "prefix_ledit"), qt.SIGNAL("textChanged(const QString &)"), self._prefix_ledit_change, ) self.connect( self._data_path_widget.data_path_widget_layout.child( "run_number_ledit"), qt.SIGNAL("textChanged(const QString &)"), self._run_number_ledit_change, ) self.connect( self._data_path_widget, qt.PYSIGNAL("path_template_changed"), self.handle_path_conflict, )
def __init__(self, parent=None, name=None, fl=0): CreateTaskBase.__init__(self, parent, name, fl, 'Discrete') if not name: self.setName("create_discrete_widget") self.previous_energy = None self.init_models() # # Layout # v_layout = qt.QVBoxLayout(self, 2, 5, "v_layout") self._acq_gbox = qt.QVGroupBox('Acquisition', self, 'acq_gbox') self._acq_widget = \ AcquisitionWidget(self._acq_gbox, "acquisition_widget", layout='vertical', acq_params=self._acquisition_parameters, path_template=self._path_template) self._data_path_gbox = qt.QVGroupBox('Data location', self, 'data_path_gbox') self._data_path_widget = \ DataPathWidget(self._data_path_gbox, 'create_dc_path_widget', data_model=self._path_template, layout=DataPathWidgetVerticalLayout) self._processing_gbox = qt.QVGroupBox('Processing', self, 'processing_gbox') self._processing_widget = \ ProcessingWidget(self._processing_gbox, data_model=self._processing_parameters) v_layout.addWidget(self._acq_gbox) v_layout.addWidget(self._data_path_gbox) v_layout.addWidget(self._processing_gbox) v_layout.addStretch() dp_layout = self._data_path_widget.data_path_widget_layout self.connect(self._acq_widget, qt.PYSIGNAL('mad_energy_selected'), self.mad_energy_selected) self.connect(dp_layout.prefix_ledit, qt.SIGNAL("textChanged(const QString &)"), self._prefix_ledit_change) self.connect(dp_layout.run_number_ledit, qt.SIGNAL("textChanged(const QString &)"), self._run_number_ledit_change) self.connect(self._acq_widget, qt.PYSIGNAL("path_template_changed"), self.handle_path_conflict) self.connect(self._data_path_widget, qt.PYSIGNAL("path_template_changed"), self.handle_path_conflict)
def __init__(self, parent = None, name = "xrf_scan_tab_widget"): qt.QWidget.__init__(self, parent, name) # Data Attributes self.xrf_scan_hwobj = None self.xrf_scan = queue_model_objects.XRFScan() self._tree_view_item = None self.data_path_widget = DataPathWidget(self) #self.data_path_widget.setSizePolicy(qt.QSizePolicy.Expanding,qt.QSizePolicy.Fixed) self.other_parameters_gbox = qt.QHGroupBox("Other parameters", self) #self.other_parameters_gbox.setSizePolicy(qt.QSizePolicy.Expanding,qt.QSizePolicy.Fixed) self.count_time_label = qt.QLabel("Count time:", self.other_parameters_gbox) self.count_time_ledit = qt.QLineEdit(self.other_parameters_gbox,"count_time_ledit") self.count_time_ledit.setFixedWidth(50) spacer = qt.QWidget(self.other_parameters_gbox) spacer.setSizePolicy(qt.QSizePolicy.Expanding,qt.QSizePolicy.Fixed) widget_ui = os.path.join(os.path.dirname(__file__), 'ui_files/snapshot_widget_layout.ui') widget = qtui.QWidgetFactory.create(widget_ui) widget.reparent(self, qt.QPoint(0, 0)) self.position_widget = widget self.position_widget.setFixedSize(457, 350) #self.position_widget.setSizePolicy(qt.QSizePolicy.Fixed, qt.QSizePolicy.Fixed) self.mca_spectrum = McaSpectrumBrick(self) self.mca_spectrum.setSizePolicy(qt.QSizePolicy.Expanding,qt.QSizePolicy.Expanding) self.mca_spectrum.setMinimumHeight(700) v_layout = qt.QVBoxLayout(self) rone_hlayout = qt.QHBoxLayout(v_layout) rone_vlayout = qt.QVBoxLayout(rone_hlayout) rone_sv_layout = qt.QVBoxLayout(rone_hlayout) rone_vlayout.addWidget(self.data_path_widget) rone_vlayout.addWidget(self.other_parameters_gbox) rone_vlayout.addStretch() rone_sv_layout.addWidget(self.position_widget) rone_sv_layout.addStretch() v_layout.addWidget(self.mca_spectrum) v_layout.addStretch() qt.QObject.connect(self.data_path_widget.data_path_widget_layout.child('prefix_ledit'), qt.SIGNAL("textChanged(const QString &)"), self._prefix_ledit_change) qt.QObject.connect(self.data_path_widget.data_path_widget_layout.child('run_number_ledit'), qt.SIGNAL("textChanged(const QString &)"), self._run_number_ledit_change) qt.QObject.connect(self.count_time_ledit, qt.SIGNAL("textChanged(const QString &)"), self._count_time_ledit_change) qt.QObject.connect(qt.qApp, qt.PYSIGNAL('tab_changed'), self.tab_changed)
def __init__(self, parent=None, name=None, fl=0): CreateTaskBase.__init__(self, parent, name, fl, "Energy-scan") # Data attributes self.init_models() # Layout v_layout = qt.QVBoxLayout(self, 2, 5, "main_v_layout") h_box = qt.QHGroupBox("Available elements", self) self.periodic_table = PeriodicTableBrick(h_box) font = self.periodic_table.font() font.setPointSize(8) self.periodic_table.setFont(font) h_box.setMaximumWidth(470) h_box.setMaximumHeight(310) self._data_path_gbox = qt.QVGroupBox("Data location", self, "data_path_gbox") self._data_path_widget = DataPathWidget( self._data_path_gbox, data_model=self._path_template, layout="vertical" ) v_layout.addWidget(h_box) v_layout.addWidget(self._data_path_gbox) v_layout.addStretch() self.connect( self._data_path_widget.data_path_widget_layout.child("prefix_ledit"), qt.SIGNAL("textChanged(const QString &)"), self._prefix_ledit_change, ) self.connect( self._data_path_widget.data_path_widget_layout.child("run_number_ledit"), qt.SIGNAL("textChanged(const QString &)"), self._run_number_ledit_change, ) self.connect( self._data_path_widget, qt.PYSIGNAL("path_template_changed"), self.handle_path_conflict, ) qt.QObject.connect( self.periodic_table, qt.PYSIGNAL("edgeSelected"), self.element_clicked )
def __init__(self, parent=None, name="energy_scan_tab_widget"): qt.QWidget.__init__(self, parent, name) # Data Attributes self.energy_scan = queue_model_objects.EnergyScan() self._tree_view_item = None # Layout h_layout = qt.QHBoxLayout(self, 0, 0, "main_v_layout") col_one_vlayout = qt.QVBoxLayout(h_layout, 0, "row_one") periodic_table_gbox = qt.QHGroupBox("Available Elements", self) self.periodic_table = PeriodicTableBrick(periodic_table_gbox) #QPeriodicTable.QPeriodicTable(periodic_table_gbox) self.periodic_table.setFixedHeight(341) self.periodic_table.setFixedWidth(650) #font = periodic_table.font() #font.setPointSize(8) #periodic_table.setFont(font) #scan_plot_gbox = qt.QHGroupBox("Scan plot", self) #spec_scan_plot_brick = SpecScanPlotBrick(scan_plot_gbox) self.data_path_widget = DataPathWidget(self) self.data_path_widget.data_path_widget_layout.child( 'file_name_label').setText('') self.data_path_widget.data_path_widget_layout.child( 'file_name_value_label').hide() col_one_vlayout.add(periodic_table_gbox) col_one_vlayout.add(self.data_path_widget) col_one_vlayout.addStretch(10) qt.QObject.connect(self.periodic_table, qt.PYSIGNAL('edgeSelected'), self.element_clicked) qt.QObject.connect( self.data_path_widget.data_path_widget_layout.child( 'prefix_ledit'), qt.SIGNAL("textChanged(const QString &)"), self._prefix_ledit_change) qt.QObject.connect( self.data_path_widget.data_path_widget_layout.child( 'run_number_ledit'), qt.SIGNAL("textChanged(const QString &)"), self._run_number_ledit_change) qt.QObject.connect(qt.qApp, qt.PYSIGNAL('tab_changed'), self.tab_changed)
def __init__(self, parent=None, name=None, fl=0): CreateTaskBase.__init__(self, parent, name, fl, "Workflow") # Data attributes self.workflow_hwobj = None self.workflows = {} self.init_models() # Layout v_layout = qt.QVBoxLayout(self, 2, 5, "main_v_layout") self._workflow_type_gbox = qt.QVGroupBox( "Workflow type", self, "workflow_rtype" ) self._workflow_cbox = qt.QComboBox(self._workflow_type_gbox) self._data_path_gbox = qt.QVGroupBox("Data location", self, "data_path_gbox") self._data_path_widget = DataPathWidget( self._data_path_gbox, data_model=self._path_template, layout="vertical" ) self._data_path_widget.data_path_widget_layout.child("file_name_label").setText( "" ) self._data_path_widget.data_path_widget_layout.child( "file_name_value_label" ).hide() # self._grid_widget = MxLookupScanBrick.MxLookupScanBrick(self, 'grid_widget') v_layout.addWidget(self._workflow_type_gbox) v_layout.addWidget(self._data_path_gbox) # v_layout.addWidget(self._grid_widget) v_layout.addStretch() self.connect( self._data_path_widget.data_path_widget_layout.child("prefix_ledit"), qt.SIGNAL("textChanged(const QString &)"), self._prefix_ledit_change, ) self.connect( self._data_path_widget.data_path_widget_layout.child("run_number_ledit"), qt.SIGNAL("textChanged(const QString &)"), self._run_number_ledit_change, ) self.connect( self._data_path_widget, qt.PYSIGNAL("path_template_changed"), self.handle_path_conflict, )
def __init__(self, parent=None, name="energy_scan_tab_widget"): qt.QWidget.__init__(self, parent, name) # Data Attributes self.energy_scan = queue_model_objects.EnergyScan() self._tree_view_item = None # Layout h_layout = qt.QHBoxLayout(self, 0, 0, "main_v_layout") col_one_vlayout = qt.QVBoxLayout(h_layout, 0, "row_one") periodic_table_gbox = qt.QHGroupBox("Available Elements", self) self.periodic_table = PeriodicTableBrick(periodic_table_gbox) # QPeriodicTable.QPeriodicTable(periodic_table_gbox) self.periodic_table.setFixedHeight(341) self.periodic_table.setFixedWidth(650) # font = periodic_table.font() # font.setPointSize(8) # periodic_table.setFont(font) # scan_plot_gbox = qt.QHGroupBox("Scan plot", self) # spec_scan_plot_brick = SpecScanPlotBrick(scan_plot_gbox) self.data_path_widget = DataPathWidget(self) self.data_path_widget.data_path_widget_layout.child("file_name_label").setText( "" ) self.data_path_widget.data_path_widget_layout.child( "file_name_value_label" ).hide() col_one_vlayout.add(periodic_table_gbox) col_one_vlayout.add(self.data_path_widget) col_one_vlayout.addStretch(10) qt.QObject.connect( self.periodic_table, qt.PYSIGNAL("edgeSelected"), self.element_clicked ) qt.QObject.connect( self.data_path_widget.data_path_widget_layout.child("prefix_ledit"), qt.SIGNAL("textChanged(const QString &)"), self._prefix_ledit_change, ) qt.QObject.connect( self.data_path_widget.data_path_widget_layout.child("run_number_ledit"), qt.SIGNAL("textChanged(const QString &)"), self._run_number_ledit_change, ) qt.QObject.connect(qt.qApp, qt.PYSIGNAL("tab_changed"), self.tab_changed)
def __init__(self, parent = None, name = None, fl = 0): CreateTaskBase.__init__(self, parent, name, fl, 'Workflow') # Data attributes self.workflow_hwobj = None self.workflows = {} self.init_models() #Layout v_layout = qt.QVBoxLayout(self, 2, 5, "main_v_layout") self._workflow_type_gbox = qt.QVGroupBox('Workflow type', self, 'workflow_rtype') self._workflow_cbox = qt.QComboBox(self._workflow_type_gbox) self._data_path_gbox = qt.QVGroupBox('Data location', self, 'data_path_gbox') self._data_path_widget = DataPathWidget(self._data_path_gbox, data_model = self._path_template, layout = DataPathWidgetVerticalLayout) self._data_path_widget.data_path_widget_layout.file_name_label.setText('') self._data_path_widget.data_path_widget_layout.file_name_value_label.hide() self._grid_widget = MxLookupScanBrick.\ MxLookupScanBrick(self, 'grid_widget') v_layout.addWidget(self._workflow_type_gbox) v_layout.addWidget(self._data_path_gbox) v_layout.addWidget(self._grid_widget) v_layout.addStretch() self.connect(self._data_path_widget.data_path_widget_layout.prefix_ledit, qt.SIGNAL("textChanged(const QString &)"), self._prefix_ledit_change) self.connect(self._data_path_widget.data_path_widget_layout.run_number_ledit, qt.SIGNAL("textChanged(const QString &)"), self._run_number_ledit_change) self.connect(self._data_path_widget, qt.PYSIGNAL("path_template_changed"), self.handle_path_conflict)
def __init__(self, parent = None, name = None, fl = 0): CreateTaskBase.__init__(self, parent, name, fl, 'Energy-scan') # Data attributes self.init_models() #Layout v_layout = qt.QVBoxLayout(self, 2, 5, "main_v_layout") h_box = qt.QHGroupBox('Available elements', self) self.periodic_table = PeriodicTableBrick(h_box) font = self.periodic_table.font() font.setPointSize(8) self.periodic_table.setFont(font) h_box.setMaximumWidth(454) h_box.setMaximumHeight(300) self._data_path_gbox = qt.QVGroupBox('Data location', self, 'data_path_gbox') self._data_path_widget = DataPathWidget(self._data_path_gbox, data_model = self._path_template, layout = DataPathWidgetVerticalLayout) v_layout.addWidget(h_box) v_layout.addWidget(self._data_path_gbox) v_layout.addStretch() self.connect(self._data_path_widget.data_path_widget_layout.prefix_ledit, qt.SIGNAL("textChanged(const QString &)"), self._prefix_ledit_change) self.connect(self._data_path_widget.data_path_widget_layout.run_number_ledit, qt.SIGNAL("textChanged(const QString &)"), self._run_number_ledit_change) self.connect(self._data_path_widget, qt.PYSIGNAL("path_template_changed"), self.handle_path_conflict)
class EnergyScanParametersWidget(qt.QWidget): def __init__(self, parent=None, name="energy_scan_tab_widget"): qt.QWidget.__init__(self, parent, name) # Data Attributes self.energy_scan = queue_model_objects.EnergyScan() self._tree_view_item = None # Layout h_layout = qt.QHBoxLayout(self, 0, 0, "main_v_layout") col_one_vlayout = qt.QVBoxLayout(h_layout, 0, "row_one") periodic_table_gbox = qt.QHGroupBox("Available Elements", self) self.periodic_table = PeriodicTableBrick(periodic_table_gbox) #QPeriodicTable.QPeriodicTable(periodic_table_gbox) self.periodic_table.setFixedHeight(341) self.periodic_table.setFixedWidth(650) #font = periodic_table.font() #font.setPointSize(8) #periodic_table.setFont(font) #scan_plot_gbox = qt.QHGroupBox("Scan plot", self) #spec_scan_plot_brick = SpecScanPlotBrick(scan_plot_gbox) self.data_path_widget = DataPathWidget(self) self.data_path_widget.data_path_widget_layout.child( 'file_name_label').setText('') self.data_path_widget.data_path_widget_layout.child( 'file_name_value_label').hide() col_one_vlayout.add(periodic_table_gbox) col_one_vlayout.add(self.data_path_widget) col_one_vlayout.addStretch(10) qt.QObject.connect(self.periodic_table, qt.PYSIGNAL('edgeSelected'), self.element_clicked) qt.QObject.connect( self.data_path_widget.data_path_widget_layout.child( 'prefix_ledit'), qt.SIGNAL("textChanged(const QString &)"), self._prefix_ledit_change) qt.QObject.connect( self.data_path_widget.data_path_widget_layout.child( 'run_number_ledit'), qt.SIGNAL("textChanged(const QString &)"), self._run_number_ledit_change) qt.QObject.connect(qt.qApp, qt.PYSIGNAL('tab_changed'), self.tab_changed) def _prefix_ledit_change(self, new_value): self.energy_scan.set_name(str(new_value)) self._tree_view_item.setText(0, self.energy_scan.get_name()) def _run_number_ledit_change(self, new_value): if str(new_value).isdigit(): self.energy_scan.set_number(int(new_value)) self._tree_view_item.setText(0, self.energy_scan.get_name()) def tab_changed(self): if self._tree_view_item: self.populate_widget(self._tree_view_item) def populate_widget(self, item): self._tree_view_item = item self.energy_scan = item.get_model() if self.energy_scan.is_executed(): self.data_path_widget.setEnabled(False) self.periodic_table.setEnabled(False) else: self.data_path_widget.setEnabled(True) self.periodic_table.setEnabled(True) self.data_path_widget.update_data_model( self.energy_scan.path_template) self.periodic_table.periodicTable.\ tableElementChanged(self.energy_scan.element_symbol) def element_clicked(self, symbol, energy): self.energy_scan.element_symbol = symbol self.energy_scan.edge = energy
def __init__(self,parent = None,name = None, fl = 0): CreateTaskBase.__init__(self, parent, name, fl, 'Characterisation') if not name: self.setName("create_char_widget") # # Data attributes # self._current_selected_item = None self.init_models() self._char_params_mib = DataModelInputBinder(self._char_params) # # Layout # v_layout = qt.QVBoxLayout(self, 2, 6, "v_layout") self._acq_widget = \ AcquisitionWidgetSimple(self, acq_params = self._acquisition_parameters, path_template = self._path_template) current_dir = os.path.dirname(__file__) ui_file = 'ui_files/vertical_crystal_dimension_widget_layout.ui' widget = qtui.QWidgetFactory.\ create(os.path.join(current_dir, ui_file)) widget.reparent(self, qt.QPoint(0,0)) self._vertical_dimension_widget = widget ui_file = 'ui_files/characterise_simple_widget_vertical_layout.ui' widget = qtui.QWidgetFactory.\ create(os.path.join(current_dir, ui_file)) widget.reparent(self, qt.QPoint(0,0)) self._char_widget = widget self._data_path_gbox = \ qt.QVGroupBox('Data location', self, 'data_path_gbox') self._data_path_widget = \ DataPathWidget(self._data_path_gbox, data_model = self._path_template, layout = DataPathWidgetVerticalLayout) v_layout.addWidget(self._acq_widget) v_layout.addWidget(self._char_widget) v_layout.addWidget(self._vertical_dimension_widget) v_layout.addWidget(self._data_path_gbox) v_layout.addStretch(10) # # Logic # optimised_sad_cbx = self._char_widget.\ child('optimised_sad_cbx') account_rad_dmg_cbx = self._char_widget.\ child('account_rad_dmg_cbx') start_comp_cbox = self._char_widget.child('start_comp_cbox') induced_burn_cbx = self._char_widget.child('induced_burn_cbx') max_vdim_ledit = self._vertical_dimension_widget.\ child('max_vdim_ledit') min_vdim_ledit = self._vertical_dimension_widget.\ child('min_vdim_ledit') min_vphi_ledit = self._vertical_dimension_widget.\ child('min_vphi_ledit') max_vphi_ledit = self._vertical_dimension_widget.\ child('max_vphi_ledit') space_group_ledit = self._vertical_dimension_widget.\ child('space_group_ledit') self._char_params_mib.bind_value_update('opt_sad', optimised_sad_cbx, bool, None) self._char_params_mib.bind_value_update('account_rad_damage', account_rad_dmg_cbx, bool, None) self._char_params_mib.bind_value_update('determine_rad_params', induced_burn_cbx, bool, None) self._char_params_mib.bind_value_update('strategy_complexity', start_comp_cbox, int, None) self._char_params_mib.\ bind_value_update('max_crystal_vdim', max_vdim_ledit, float, qt.QDoubleValidator(0.0, 1000, 2, self)) self._char_params_mib.\ bind_value_update('min_crystal_vdim', min_vdim_ledit, float, qt.QDoubleValidator(0.0, 1000, 2, self)) self._char_params_mib.\ bind_value_update('min_crystal_vphi', min_vphi_ledit, float, qt.QDoubleValidator(0.0, 1000, 2, self)) self._char_params_mib.\ bind_value_update('max_crystal_vphi', max_vphi_ledit, float, qt.QDoubleValidator(0.0, 1000, 2, self)) space_group_ledit.insertStrList(XTAL_SPACEGROUPS) prefix_ledit = self._data_path_widget.\ data_path_widget_layout.prefix_ledit run_number_ledit = self._data_path_widget.\ data_path_widget_layout.run_number_ledit self.connect(prefix_ledit, qt.SIGNAL("textChanged(const QString &)"), self._prefix_ledit_change) self.connect(run_number_ledit, qt.SIGNAL("textChanged(const QString &)"), self._run_number_ledit_change) self.connect(space_group_ledit, qt.SIGNAL("activated(int)"), self._space_group_change) self.connect(self._data_path_widget, qt.PYSIGNAL("path_template_changed"), self.handle_path_conflict) self.connect(induced_burn_cbx, qt.SIGNAL("toggled(bool)"), self.use_induced_burn)
def __init__(self, parent = None,name = None, fl = 0): CreateTaskBase.__init__(self, parent, name, fl, 'Helical') if not name: self.setName("create_helical_widget") # # Data attributes # self.init_models() self._prev_pos = None self._current_pos = None self._list_item_map = {} self.init_models() # # Layout # v_layout = qt.QVBoxLayout(self, 2, 5, "v_layout") self._lines_gbox = qt.QGroupBox('Lines', self, "lines_gbox") self._lines_gbox.setColumnLayout(0, qt.Qt.Vertical) self._lines_gbox.layout().setSpacing(6) self._lines_gbox.layout().setMargin(11) lines_gbox_layout = qt.QHBoxLayout(self._lines_gbox.layout()) lines_gbox_layout.setAlignment(qt.Qt.AlignTop) self._list_box = qt.QListBox(self._lines_gbox, "helical_page") self._list_box.setSelectionMode(qt.QListBox.Extended) self._list_box.setFixedWidth(200) self._list_box.setFixedHeight(75) list_box_tool_tip = "Select the line(s) to perfrom helical scan on" qt.QToolTip.add(self._list_box, list_box_tool_tip) lines_gbox_layout.addWidget(self._list_box) button_layout = qt.QVBoxLayout(None, 0, 6, "button_layout") button_layout.setSpacing(5) add_button = qt.QPushButton("+", self._lines_gbox, "add_button") add_button.setFixedWidth(20) add_button.setFixedHeight(20) remove_button = qt.QPushButton("-", self._lines_gbox, "add_button") remove_button.setFixedWidth(20) remove_button.setFixedHeight(20) button_layout.addWidget(add_button) button_layout.addWidget(remove_button) lines_gbox_layout.addLayout(button_layout) add_button_tool_tip = "Add a line between two saved positions, " \ "CTRL click to select more than one position" qt.QToolTip.add(add_button, add_button_tool_tip) remove_button_tool_tip = "Remove selected line(s)" qt.QToolTip.add(remove_button, remove_button_tool_tip) self._acq_gbox = qt.QVGroupBox('Acquisition', self, 'acq_gbox') self._acq_widget = \ AcquisitionWidget(self._acq_gbox, "acquisition_widget", layout='vertical', acq_params=self._acquisition_parameters, path_template=self._path_template) self._acq_widget.disable_inverse_beam(True) self._data_path_gbox = qt.QVGroupBox('Data location', self, 'data_path_gbox') self._data_path_widget = \ DataPathWidget(self._data_path_gbox, data_model = self._path_template, layout = 'vertical') self._processing_gbox = qt.QVGroupBox('Processing', self, 'processing_gbox') self._processing_widget = \ ProcessingWidget(self._processing_gbox, data_model = self._processing_parameters) v_layout.addWidget(self._lines_gbox) v_layout.addWidget(self._acq_gbox) v_layout.addWidget(self._data_path_gbox) v_layout.addWidget(self._processing_gbox) qt.QObject.connect(add_button, qt.SIGNAL("clicked()"), self.add_clicked) qt.QObject.connect(remove_button, qt.SIGNAL("clicked()"), self.remove_clicked) qt.QObject.connect(self._list_box, qt.SIGNAL("selectionChanged()"), self.list_box_selection_changed) prefix_ledit = self._data_path_widget.\ data_path_widget_layout.child('prefix_ledit') run_number_ledit = self._data_path_widget.\ data_path_widget_layout.child('run_number_ledit') self.connect(prefix_ledit, qt.SIGNAL("textChanged(const QString &)"), self._prefix_ledit_change) self.connect(run_number_ledit, qt.SIGNAL("textChanged(const QString &)"), self._run_number_ledit_change) self.connect(self._data_path_widget, qt.PYSIGNAL("path_template_changed"), self.handle_path_conflict)
def __init__(self, parent=None, name="parameter_widget"): qt.QWidget.__init__(self, parent, name) self._data_collection = None self.add_dc_cb = None self._tree_view_item = None self.queue_model = None self._beamline_setup_hwobj = None self.caution_pixmap = Icons.load("Caution2.png") self.path_widget = DataPathWidget(self, 'dc_params_path_widget') self.acq_gbox = qt.QVGroupBox("Acquisition", self) self.acq_gbox.setInsideMargin(2) self.acq_widget = AcquisitionWidget(self.acq_gbox, layout='horizontal') self.acq_widget.setFixedHeight(170) widget_ui = os.path.join(os.path.dirname(__file__), 'ui_files/snapshot_widget_layout.ui') widget = qtui.QWidgetFactory.create(widget_ui) widget.reparent(self, qt.QPoint(0, 0)) self.position_widget = widget self._processing_gbox = qt.QVGroupBox('Processing', self, 'processing_gbox') self.processing_widget = ProcessingWidget(self._processing_gbox) v_layout = qt.QVBoxLayout(self, 11, 10, "main_layout") rone_hlayout = qt.QHBoxLayout(v_layout, 10, "rone") rone_vlayout = qt.QVBoxLayout(rone_hlayout) rone_sv_layout = qt.QVBoxLayout(rone_hlayout) rone_vlayout.addWidget(self.path_widget) rone_vlayout.addWidget(self.acq_gbox) rtwo_hlayout = qt.QHBoxLayout(rone_vlayout, 10, "rtwo") rone_vlayout.addStretch(10) rone_sv_layout.addWidget(self.position_widget) rone_sv_layout.addStretch(10) rone_hlayout.addStretch() rtwo_hlayout.addWidget(self._processing_gbox) rtwo_hlayout.addStretch(10) v_layout.addStretch() self.connect(self.acq_widget, qt.PYSIGNAL('mad_energy_selected'), self.mad_energy_selected) self.connect( self.path_widget.data_path_widget_layout.child('prefix_ledit'), qt.SIGNAL("textChanged(const QString &)"), self._prefix_ledit_change) self.connect( self.path_widget.data_path_widget_layout.child('run_number_ledit'), qt.SIGNAL("textChanged(const QString &)"), self._run_number_ledit_change) self.connect(self.acq_widget, qt.PYSIGNAL("path_template_changed"), self.handle_path_conflict) self.connect(self.path_widget, qt.PYSIGNAL("path_template_changed"), self.handle_path_conflict) qt.QObject.connect(qt.qApp, qt.PYSIGNAL('tab_changed'), self.tab_changed)
class CreateWorkflowWidget(CreateTaskBase): def __init__(self, parent=None, name=None, fl=0): CreateTaskBase.__init__(self, parent, name, fl, 'Workflow') # Data attributes self.workflow_hwobj = None self.workflows = {} self.init_models() #Layout v_layout = qt.QVBoxLayout(self, 2, 5, "main_v_layout") self._workflow_type_gbox = qt.QVGroupBox('Workflow type', self, 'workflow_rtype') self._workflow_cbox = qt.QComboBox(self._workflow_type_gbox) self._data_path_gbox = qt.QVGroupBox('Data location', self, 'data_path_gbox') self._data_path_widget = DataPathWidget(self._data_path_gbox, data_model=self._path_template, layout='vertical') self._data_path_widget.data_path_widget_layout.child( 'file_name_label').setText('') self._data_path_widget.data_path_widget_layout.child( 'file_name_value_label').hide() self._grid_widget = MxLookupScanBrick.MxLookupScanBrick( self, 'grid_widget') v_layout.addWidget(self._workflow_type_gbox) v_layout.addWidget(self._data_path_gbox) v_layout.addWidget(self._grid_widget) v_layout.addStretch() self.connect( self._data_path_widget.data_path_widget_layout.child( 'prefix_ledit'), qt.SIGNAL("textChanged(const QString &)"), self._prefix_ledit_change) self.connect( self._data_path_widget.data_path_widget_layout.child( 'run_number_ledit'), qt.SIGNAL("textChanged(const QString &)"), self._run_number_ledit_change) self.connect(self._data_path_widget, qt.PYSIGNAL("path_template_changed"), self.handle_path_conflict) def set_workflow(self, workflow_hwobj): self._workflow_hwobj = workflow_hwobj self.workflows.clear() self._workflow_cbox.clear() if self._workflow_hwobj is not None: for workflow in self._workflow_hwobj.get_available_workflows(): self._workflow_cbox.insertItem(workflow['name']) self.workflows[workflow['name']] = workflow def set_shape_history(self, shape_history_hwobj): self._grid_widget._shape_history = shape_history_hwobj motor = self._beamline_setup_hwobj.\ getObjectByRole('horizontal_motors') self._grid_widget.initialize_motors('horizontal', motor) motor = self._beamline_setup_hwobj.\ getObjectByRole('vertical_motors') self._grid_widget.initialize_motors('vertical', motor) def init_models(self): CreateTaskBase.init_models(self) def single_item_selection(self, tree_item): CreateTaskBase.single_item_selection(self, tree_item) wf_model = tree_item.get_model() if isinstance(tree_item, queue_item.GenericWorkflowQueueItem): if tree_item.get_model().is_executed(): self.setDisabled(True) else: self.setDisabled(False) if wf_model.get_path_template(): self._path_template = wf_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): return CreateTaskBase.approve_creation(self) # 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): tasks = [] path_template = copy.deepcopy(self._path_template) path_template.num_files = 0 if '<sample_name>' in path_template.directory: name = sample.get_name().replace(':', '-') path_template.directory = path_template.directory.\ replace('<sample_name>', name) path_template.process_directory = path_template.process_directory.\ replace('<sample_name>', name) if '<acronym>-<name>' in path_template.base_prefix: path_template.base_prefix = self.get_default_prefix(sample) path_template.run_numer = self._beamline_setup_hwobj.queue_model_hwobj.\ get_next_run_number(path_template) wf = queue_model_objects.Workflow() wf_name = str(self._workflow_cbox.currentText()) wf.path_template = path_template wf.set_name("Workflow task") wf.set_type(wf_name) beamline_params = {} beamline_params['directory'] = wf.path_template.directory beamline_params['prefix'] = wf.path_template.get_prefix() beamline_params['run_number'] = wf.path_template.run_number beamline_params['collection_software'] = 'mxCuBE - 2.0' beamline_params['sample_node_id'] = sample._node_id params_list = map(str, list(itertools.chain(*beamline_params.iteritems()))) params_list.insert(0, self.workflows[wf_name]['path']) params_list.insert(0, 'modelpath') wf.params_list = params_list tasks.append(wf) return tasks
class CreateDiscreteWidget(CreateTaskBase): def __init__(self, parent=None, name=None, fl=0): CreateTaskBase.__init__(self, parent, name, fl, 'Discrete') if not name: self.setName("create_discrete_widget") self.previous_energy = None self.init_models() # # Layout # v_layout = qt.QVBoxLayout(self, 2, 5, "v_layout") self._acq_gbox = qt.QVGroupBox('Acquisition', self, 'acq_gbox') self._acq_widget = \ AcquisitionWidget(self._acq_gbox, "acquisition_widget", layout='vertical', acq_params=self._acquisition_parameters, path_template=self._path_template) self._data_path_gbox = qt.QVGroupBox('Data location', self, 'data_path_gbox') self._data_path_widget = \ DataPathWidget(self._data_path_gbox, 'create_dc_path_widget', data_model=self._path_template, layout=DataPathWidgetVerticalLayout) self._processing_gbox = qt.QVGroupBox('Processing', self, 'processing_gbox') self._processing_widget = \ ProcessingWidget(self._processing_gbox, data_model=self._processing_parameters) v_layout.addWidget(self._acq_gbox) v_layout.addWidget(self._data_path_gbox) v_layout.addWidget(self._processing_gbox) v_layout.addStretch() dp_layout = self._data_path_widget.data_path_widget_layout self.connect(self._acq_widget, qt.PYSIGNAL('mad_energy_selected'), self.mad_energy_selected) self.connect(dp_layout.prefix_ledit, qt.SIGNAL("textChanged(const QString &)"), self._prefix_ledit_change) self.connect(dp_layout.run_number_ledit, qt.SIGNAL("textChanged(const QString &)"), self._run_number_ledit_change) self.connect(self._acq_widget, qt.PYSIGNAL("path_template_changed"), self.handle_path_conflict) self.connect(self._data_path_widget, qt.PYSIGNAL("path_template_changed"), self.handle_path_conflict) def init_models(self): CreateTaskBase.init_models(self) self._energy_scan_result = qmo.EnergyScanResult() self._processing_parameters = qmo.ProcessingParameters() def set_tunable_energy(self, state): self._acq_widget.set_tunable_energy(state) def update_processing_parameters(self, crystal): self._processing_parameters.space_group = crystal.space_group self._processing_parameters.cell_a = crystal.cell_a self._processing_parameters.cell_alpha = crystal.cell_alpha self._processing_parameters.cell_b = crystal.cell_b self._processing_parameters.cell_beta = crystal.cell_beta self._processing_parameters.cell_c = crystal.cell_c self._processing_parameters.cell_gamma = crystal.cell_gamma self._processing_widget.update_data_model(self._processing_parameters) def mad_energy_selected(self, name, energy, state): item = self._current_selected_items[0] model = item.get_model() if state: self._path_template.mad_prefix = name else: self._path_template.mad_prefix = '' run_number = self._beamline_setup_hwobj.queue_model_hwobj.\ get_next_run_number(self._path_template) data_path_widget = self.get_data_path_widget() data_path_widget.set_run_number(run_number) data_path_widget.set_prefix(self._path_template.base_prefix) if self.isEnabled(): if isinstance(item, queue_item.TaskQueueItem) and \ not isinstance(item, queue_item.DataCollectionGroupQueueItem): model.set_name(self._path_template.get_prefix()) item.setText(0, model.get_name()) def single_item_selection(self, tree_item): CreateTaskBase.single_item_selection(self, tree_item) if isinstance(tree_item, queue_item.SampleQueueItem) or \ isinstance(tree_item, queue_item.DataCollectionGroupQueueItem): self._processing_parameters = copy.deepcopy(self._processing_parameters) self._processing_widget.update_data_model(self._processing_parameters) self._acq_widget.disable_inverse_beam(False) elif isinstance(tree_item, queue_item.DataCollectionQueueItem): dc = tree_item.get_model() if dc.experiment_type != queue_model_enumerables.EXPERIMENT_TYPE.HELICAL: self.setDisabled(False) self._acq_widget.disable_inverse_beam(True) self._path_template = dc.get_path_template() self._data_path_widget.update_data_model(self._path_template) self._acquisition_parameters = dc.acquisitions[0].acquisition_parameters self._acq_widget.update_data_model(self._acquisition_parameters, self._path_template) if len(dc.acquisitions) == 1: self.select_shape_with_cpos(self._acquisition_parameters.\ centred_position) self._processing_parameters = dc.processing_parameters self._processing_widget.update_data_model(self._processing_parameters) else: self.setDisabled(True) else: self.setDisabled(True) def approve_creation(self): result = CreateTaskBase.approve_creation(self) selected_shapes = self._shape_history.selected_shapes for shape in selected_shapes: if isinstance(shape, shape_history.Line): result = False return result # 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): tasks = [] if not shape: cpos = qmo.CentredPosition() cpos.snapshot_image = self._shape_history.get_snapshot([]) else: # Shapes selected and sample is mounted, get the # centred positions for the shapes if isinstance(shape, shape_history.Point): snapshot = self._shape_history.\ get_snapshot([shape.qub_point]) cpos = shape.get_centred_positions()[0] cpos.snapshot_image = snapshot if self._acq_widget.use_inverse_beam(): total_num_images = self._acquisition_parameters.num_images subwedge_size = self._acq_widget.get_num_subwedges() osc_range = self._acquisition_parameters.osc_range osc_start = self._acquisition_parameters.osc_start run_number = self._path_template.run_number subwedges = qmo.create_inverse_beam_sw(total_num_images, subwedge_size, osc_range, osc_start, run_number) self._acq_widget.set_use_inverse_beam(False) for sw in subwedges: tasks.extend(self.create_dc(sample, sw[3], sw[0], sw[1], sw[2], cpos=cpos, inverse_beam = True)) self._path_template.run_number += 1 else: tasks.extend(self.create_dc(sample, cpos=cpos)) self._path_template.run_number += 1 return tasks def create_dc(self, sample, run_number=None, start_image=None, num_images=None, osc_start=None, sc=None, cpos=None, inverse_beam = False): tasks = [] # Acquisition for start position acq = qmo.Acquisition() acq.acquisition_parameters = \ copy.deepcopy(self._acquisition_parameters) acq.acquisition_parameters.collect_agent = \ queue_model_enumerables.COLLECTION_ORIGIN.MXCUBE acq.path_template = copy.deepcopy(self._path_template) acq.acquisition_parameters.centred_position = cpos if '<sample_name>' in acq.path_template.directory: name = sample.get_name().replace(':', '-') acq.path_template.directory = acq.path_template.directory.\ replace('<sample_name>', name) acq.path_template.process_directory = acq.path_template.process_directory.\ replace('<sample_name>', name) if '<acronym>-<name>' in acq.path_template.base_prefix: acq.path_template.base_prefix = self.get_default_prefix(sample) acq.path_template.run_numer = self._beamline_setup_hwobj.queue_model_hwobj.\ get_next_run_number(acq.path_template) if run_number: acq.path_template.run_number = run_number if start_image: acq.acquisition_parameters.first_image = start_image acq.path_template.start_num = start_image if num_images: acq.acquisition_parameters.num_images = num_images acq.path_template.num_files = num_images if osc_start: acq.acquisition_parameters.osc_start = osc_start if inverse_beam: acq.acquisition_parameters.inverse_beam = False processing_parameters = copy.deepcopy(self._processing_parameters) dc = qmo.DataCollection([acq], sample.crystals[0], processing_parameters) dc.set_name(acq.path_template.get_prefix()) dc.set_number(acq.path_template.run_number) dc.experiment_type = queue_model_enumerables.EXPERIMENT_TYPE.NATIVE tasks.append(dc) self._data_path_widget.update_data_model(self._path_template) self._acq_widget.update_data_model(self._acquisition_parameters, self._path_template) return tasks
def __init__(self, parent=None, name=None, fl=0): CreateTaskBase.__init__(self, parent, name, fl, "Standard") if not name: self.setName("create_discrete_widget") self.previous_energy = None self.init_models() # # Layout # v_layout = qt.QVBoxLayout(self, 2, 5, "v_layout") self._acq_gbox = qt.QVGroupBox("Acquisition", self, "acq_gbox") self._acq_widget = AcquisitionWidget( self._acq_gbox, "acquisition_widget", layout="vertical", acq_params=self._acquisition_parameters, path_template=self._path_template, ) self._data_path_gbox = qt.QVGroupBox("Data location", self, "data_path_gbox") self._data_path_widget = DataPathWidget( self._data_path_gbox, "create_dc_path_widget", data_model=self._path_template, layout="vertical", ) self._processing_gbox = qt.QVGroupBox("Processing", self, "processing_gbox") self._processing_widget = ProcessingWidget( self._processing_gbox, data_model=self._processing_parameters ) v_layout.addWidget(self._acq_gbox) v_layout.addWidget(self._data_path_gbox) v_layout.addWidget(self._processing_gbox) v_layout.addStretch() dp_layout = self._data_path_widget.data_path_widget_layout self.connect( self._acq_widget, qt.PYSIGNAL("mad_energy_selected"), self.mad_energy_selected, ) self.connect( dp_layout.child("prefix_ledit"), qt.SIGNAL("textChanged(const QString &)"), self._prefix_ledit_change, ) self.connect( dp_layout.child("run_number_ledit"), qt.SIGNAL("textChanged(const QString &)"), self._run_number_ledit_change, ) self.connect( self._acq_widget, qt.PYSIGNAL("path_template_changed"), self.handle_path_conflict, ) self.connect( self._data_path_widget, qt.PYSIGNAL("path_template_changed"), self.handle_path_conflict, )
def __init__(self, parent=None, name=None, fl=0): CreateTaskBase.__init__(self, parent, name, fl, 'Characterisation') if not name: self.setName("create_char_widget") # # Data attributes # self._current_selected_item = None self.init_models() self._char_params_mib = DataModelInputBinder(self._char_params) # # Layout # v_layout = qt.QVBoxLayout(self, 2, 6, "v_layout") self._acq_widget = \ AcquisitionWidgetSimple(self, acq_params = self._acquisition_parameters, path_template = self._path_template) #self._acq_widget.setFixedHeight(170) current_dir = os.path.dirname(__file__) ui_file = 'ui_files/vertical_crystal_dimension_widget_layout.ui' widget = qtui.QWidgetFactory.create(os.path.join(current_dir, ui_file)) widget.reparent(self, qt.QPoint(0, 0)) self._vertical_dimension_widget = widget ui_file = 'ui_files/characterise_simple_widget_vertical_layout.ui' widget = qtui.QWidgetFactory.\ create(os.path.join(current_dir, ui_file)) widget.reparent(self, qt.QPoint(0, 0)) self._char_widget = widget self._data_path_gbox = \ qt.QVGroupBox('Data location', self, 'data_path_gbox') self._data_path_widget = \ DataPathWidget(self._data_path_gbox, data_model = self._path_template, layout = 'vertical') v_layout.addWidget(self._acq_widget) v_layout.addWidget(self._data_path_gbox) v_layout.addWidget(self._char_widget) v_layout.addWidget(self._vertical_dimension_widget) v_layout.addStretch(100) # # Logic # optimised_sad_cbx = self._char_widget.\ child('optimised_sad_cbx') account_rad_dmg_cbx = self._char_widget.\ child('account_rad_dmg_cbx') start_comp_cbox = self._char_widget.child('start_comp_cbox') #induced_burn_cbx = self._char_widget.child('induced_burn_cbx') max_vdim_ledit = self._vertical_dimension_widget.\ child('max_vdim_ledit') min_vdim_ledit = self._vertical_dimension_widget.\ child('min_vdim_ledit') min_vphi_ledit = self._vertical_dimension_widget.\ child('min_vphi_ledit') max_vphi_ledit = self._vertical_dimension_widget.\ child('max_vphi_ledit') space_group_ledit = self._vertical_dimension_widget.\ child('space_group_ledit') self._char_params_mib.bind_value_update('opt_sad', optimised_sad_cbx, bool, None) self._char_params_mib.bind_value_update('account_rad_damage', account_rad_dmg_cbx, bool, None) #self._char_params_mib.bind_value_update('determine_rad_params', # induced_burn_cbx, # bool, None) self._char_params_mib.bind_value_update('strategy_complexity', start_comp_cbox, int, None) self._char_params_mib.\ bind_value_update('max_crystal_vdim', max_vdim_ledit, float, qt.QDoubleValidator(0.0, 1000, 2, self)) self._char_params_mib.\ bind_value_update('min_crystal_vdim', min_vdim_ledit, float, qt.QDoubleValidator(0.0, 1000, 2, self)) self._char_params_mib.\ bind_value_update('min_crystal_vphi', min_vphi_ledit, float, qt.QDoubleValidator(0.0, 1000, 2, self)) self._char_params_mib.\ bind_value_update('max_crystal_vphi', max_vphi_ledit, float, qt.QDoubleValidator(0.0, 1000, 2, self)) space_group_ledit.insertStrList(XTAL_SPACEGROUPS) prefix_ledit = self._data_path_widget.\ data_path_widget_layout.child('prefix_ledit') run_number_ledit = self._data_path_widget.\ data_path_widget_layout.child('run_number_ledit') self.connect(prefix_ledit, qt.SIGNAL("textChanged(const QString &)"), self._prefix_ledit_change) self.connect(run_number_ledit, qt.SIGNAL("textChanged(const QString &)"), self._run_number_ledit_change) self.connect(space_group_ledit, qt.SIGNAL("activated(int)"), self._space_group_change) self.connect(self._data_path_widget, qt.PYSIGNAL("path_template_changed"), self.handle_path_conflict)
class CreateEnergyScanWidget(CreateTaskBase): def __init__(self, parent=None, name=None, fl=0): CreateTaskBase.__init__(self, parent, name, fl, 'Energy-scan') # Data attributes self.init_models() #Layout v_layout = qt.QVBoxLayout(self, 2, 5, "main_v_layout") h_box = qt.QHGroupBox('Available elements', self) self.periodic_table = PeriodicTableBrick(h_box) font = self.periodic_table.font() font.setPointSize(8) self.periodic_table.setFont(font) h_box.setMaximumWidth(470) h_box.setMaximumHeight(310) self._data_path_gbox = qt.QVGroupBox('Data location', self, 'data_path_gbox') self._data_path_widget = DataPathWidget(self._data_path_gbox, data_model=self._path_template, layout='vertical') v_layout.addWidget(h_box) v_layout.addWidget(self._data_path_gbox) v_layout.addStretch() self.connect( self._data_path_widget.data_path_widget_layout.child( 'prefix_ledit'), qt.SIGNAL("textChanged(const QString &)"), self._prefix_ledit_change) self.connect( self._data_path_widget.data_path_widget_layout.child( 'run_number_ledit'), qt.SIGNAL("textChanged(const QString &)"), self._run_number_ledit_change) self.connect(self._data_path_widget, qt.PYSIGNAL("path_template_changed"), self.handle_path_conflict) 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' def set_energy_scan_hwobj(self, energy_hwobj): self.periodic_table.periodicTable.\ setElements(energy_hwobj.getElements()) 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() # JN,20140829, fix the bug-periodicTable not updated when selecting task self._data_path_widget.update_data_model(self._path_template) self.periodic_table.periodicTable.tableElementChanged( escan_model.element_symbol) 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_edge = False if self.periodic_table.current_edge: selected_edge = True else: logging.getLogger("user_level_log").\ info("No element selected, please select an element.") return base_result and selected_edge # 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): data_collections = [] if self.periodic_table.current_edge: path_template = copy.deepcopy(self._path_template) if '<sample_name>' in path_template.directory: name = sample.get_name().replace(':', '-') path_template.directory = path_template.directory.\ replace('<sample_name>', name) path_template.process_directory = path_template.process_directory.\ replace('<sample_name>', name) if '<acronym>-<name>' in path_template.base_prefix: path_template.base_prefix = self.get_default_prefix(sample) path_template.run_numer = self._beamline_setup_hwobj.queue_model_hwobj.\ get_next_run_number(path_template) energy_scan = queue_model_objects.EnergyScan(sample, path_template) energy_scan.set_name(path_template.get_prefix()) energy_scan.set_number(path_template.run_number) energy_scan.element_symbol = self.periodic_table.current_element energy_scan.edge = self.periodic_table.current_edge data_collections.append(energy_scan) else: logging.getLogger("user_level_log").\ info("No element selected, please select an element.") return data_collections
class CreateEnergyScanWidget(CreateTaskBase): def __init__(self, parent=None, name=None, fl=0): CreateTaskBase.__init__(self, parent, name, fl, "Energy-scan") # Data attributes self.init_models() # Layout v_layout = qt.QVBoxLayout(self, 2, 5, "main_v_layout") h_box = qt.QHGroupBox("Available elements", self) self.periodic_table = PeriodicTableBrick(h_box) font = self.periodic_table.font() font.setPointSize(8) self.periodic_table.setFont(font) h_box.setMaximumWidth(470) h_box.setMaximumHeight(310) self._data_path_gbox = qt.QVGroupBox("Data location", self, "data_path_gbox") self._data_path_widget = DataPathWidget( self._data_path_gbox, data_model=self._path_template, layout="vertical" ) v_layout.addWidget(h_box) v_layout.addWidget(self._data_path_gbox) v_layout.addStretch() self.connect( self._data_path_widget.data_path_widget_layout.child("prefix_ledit"), qt.SIGNAL("textChanged(const QString &)"), self._prefix_ledit_change, ) self.connect( self._data_path_widget.data_path_widget_layout.child("run_number_ledit"), qt.SIGNAL("textChanged(const QString &)"), self._run_number_ledit_change, ) self.connect( self._data_path_widget, qt.PYSIGNAL("path_template_changed"), self.handle_path_conflict, ) qt.QObject.connect( self.periodic_table, qt.PYSIGNAL("edgeSelected"), self.element_clicked ) def init_models(self): CreateTaskBase.init_models(self) self.energy_scan = queue_model_objects.EnergyScan() self._path_template.start_num = 1 self._path_template.num_files = 1 self._path_template.suffix = "raw" def set_energy_scan_hwobj(self, energy_scan_hwobj): self.periodic_table.periodicTable.setElements(energy_scan_hwobj.getElements()) 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() symbol, edge = escan_model.element_symbol, escan_model.edge self.periodic_table.setTableElement(symbol, edge) self._data_path_widget.update_data_model(self._path_template) elif isinstance(tree_item, queue_item.BasketQueueItem): self.setDisabled(False) 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_shapes = self._shape_history.selected_shapes for shape in selected_shapes: if isinstance(shape, shape_history.Line): base_result = False selected_edge = False if self.periodic_table.current_edge: selected_edge = True else: logging.getLogger("user_level_log").info( "No element selected, please select an element." ) return base_result and selected_edge # 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): data_collections = [] if self.periodic_table.current_edge: if not shape: cpos = queue_model_objects.CentredPosition() cpos.snapshot_image = self._shape_history.get_snapshot([]) else: # Shapes selected and sample is mounted, get the # centred positions for the shapes if isinstance(shape, shape_history.Point): snapshot = self._shape_history.get_snapshot([shape.qub_point]) cpos = copy.deepcopy(shape.get_centred_positions()[0]) 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 = self.periodic_table.current_element energy_scan.edge = self.periodic_table.current_edge data_collections.append(energy_scan) self._path_template.run_number += 1 else: logging.getLogger("user_level_log").info( "No element selected, please select an element." ) return data_collections # Called by the owning widget (task_toolbox_widget) when # one or several centred positions are selected. def centred_position_selection(self, positions): self._selected_positions = positions if len(self._current_selected_items) == 1 and len(positions) == 1: item = self._current_selected_items[0] pos = positions[0] if isinstance(pos, shape_history.Point): if isinstance(item, queue_item.EnergyScanQueueItem): cpos = pos.get_centred_positions()[0] snapshot = self._shape_history.get_snapshot([pos.qub_point]) cpos.snapshot_image = snapshot item.get_model().centred_position = cpos def element_clicked(self, symbol, energy): if len(self._current_selected_items) == 1: item = self._current_selected_items[0] if isinstance(item, queue_item.EnergyScanQueueItem): item.get_model().element_symbol = symbol item.get_model().edge = energy
class CreateDiscreteWidget(CreateTaskBase): def __init__(self, parent=None, name=None, fl=0): CreateTaskBase.__init__(self, parent, name, fl, 'Discrete') if not name: self.setName("create_discrete_widget") # # Data attributes # self.previous_energy = None self.init_models() # # Layout # v_layout = qt.QVBoxLayout(self, 2, 5, "v_layout") self._acq_gbox = qt.QVGroupBox('Acquisition', self, 'acq_gbox') self._acq_widget = \ AcquisitionWidget(self._acq_gbox, "acquisition_widget", layout='vertical', acq_params=self._acquisition_parameters, path_template=self._path_template) self._data_path_gbox = qt.QVGroupBox('Data location', self, 'data_path_gbox') self._data_path_widget = \ DataPathWidget(self._data_path_gbox, 'create_dc_path_widget', data_model=self._path_template, layout=DataPathWidgetVerticalLayout) self._processing_gbox = qt.QVGroupBox('Processing', self, 'processing_gbox') self._processing_widget = \ ProcessingWidget(self._processing_gbox, data_model=self._processing_parameters) v_layout.addWidget(self._acq_gbox) v_layout.addWidget(self._data_path_gbox) v_layout.addWidget(self._processing_gbox) v_layout.addStretch() self.connect(self._acq_widget, qt.PYSIGNAL('mad_energy_selected'), self.mad_energy_selected) self.connect(self._data_path_widget.data_path_widget_layout.prefix_ledit, qt.SIGNAL("textChanged(const QString &)"), self._prefix_ledit_change) self.connect(self._data_path_widget.data_path_widget_layout.run_number_ledit, qt.SIGNAL("textChanged(const QString &)"), self._run_number_ledit_change) self.connect(self._acq_widget, qt.PYSIGNAL("path_template_changed"), self.handle_path_conflict) self.connect(self._data_path_widget, qt.PYSIGNAL("path_template_changed"), self.handle_path_conflict) def init_models(self): CreateTaskBase.init_models(self) self._energy_scan_result = queue_model_objects.EnergyScanResult() self._processing_parameters = queue_model_objects.ProcessingParameters() if self._beamline_setup_hwobj is not None: has_shutter_less = self._beamline_setup_hwobj.\ detector_has_shutterless() self._acquisition_parameters.shutterless = has_shutter_less self._acquisition_parameters = self._beamline_setup_hwobj.\ get_default_acquisition_parameters() try: transmission = self._beamline_setup_hwobj.transmission_hwobj.getAttFactor() transmission = round(float(transmission), 2) except AttributeError: transmission = 0 try: resolution = self._beamline_setup_hwobj.resolution_hwobj.getPosition() resolution = round(float(resolution), 2) except AttributeError: resolution = 0 try: energy = self._beamline_setup_hwobj.\ energy_hwobj.getCurrentEnergy() if energy: energy = round(float(energy), 4) else: energy = round(float(-1), 4) except AttributeError: energy = 0 self._acquisition_parameters.resolution = resolution self._acquisition_parameters.energy = energy self._acquisition_parameters.transmission = transmission else: self._acquisition_parameters = queue_model_objects.\ AcquisitionParameters() def set_tunable_energy(self, state): self._acq_widget.set_tunable_energy(state) def update_processing_parameters(self, crystal): self._processing_parameters.space_group = crystal.space_group self._processing_parameters.cell_a = crystal.cell_a self._processing_parameters.cell_alpha = crystal.cell_alpha self._processing_parameters.cell_b = crystal.cell_b self._processing_parameters.cell_beta = crystal.cell_beta self._processing_parameters.cell_c = crystal.cell_c self._processing_parameters.cell_gamma = crystal.cell_gamma self._processing_widget.update_data_model(self._processing_parameters) def mad_energy_selected(self, name, energy, state): item = self._current_selected_items[0] model = item.get_model() if state: self._path_template.mad_prefix = name else: self._path_template.mad_prefix = '' run_number = self._beamline_setup_hwobj.queue_model_hwobj.\ get_next_run_number(self._path_template) data_path_widget = self.get_data_path_widget() data_path_widget.set_run_number(run_number) data_path_widget.set_prefix(self._path_template.base_prefix) if self.isEnabled(): if isinstance(item, queue_item.TaskQueueItem) and \ not isinstance(item, queue_item.DataCollectionGroupQueueItem): model.set_name(self._path_template.get_prefix()) item.setText(0, model.get_name()) def single_item_selection(self, tree_item): CreateTaskBase.single_item_selection(self, tree_item) if isinstance(tree_item, queue_item.SampleQueueItem) or \ isinstance(tree_item, queue_item.DataCollectionGroupQueueItem): self._acquisition_parameters = copy.deepcopy(self._acquisition_parameters) self._processing_parameters = copy.deepcopy(self._processing_parameters) self._acq_widget.disable_inverse_beam(False) elif isinstance(tree_item, queue_item.DataCollectionQueueItem): data_collection = tree_item.get_model() if data_collection.experiment_type != queue_model_enumerables.\ EXPERIMENT_TYPE.HELICAL: self.setDisabled(False) self._acq_widget.disable_inverse_beam(True) if data_collection.get_path_template(): 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) == 1: self.select_shape_with_cpos(self._acquisition_parameters.\ centred_position) self._processing_parameters = data_collection.processing_parameters else: self.setDisabled(True) else: # Disable control 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 approve_creation(self): result = CreateTaskBase.approve_creation(self) selected_shapes = self._shape_history.selected_shapes for shape in selected_shapes: if isinstance(shape, shape_history.Line): result = False return result def get_subwedges(self, total_num_images, subwedge_size, osc_range, osc_offset): number_of_subwedges = total_num_images / subwedge_size subwedges = [] for subwedge_num in range(0, number_of_subwedges): osc_start = osc_offset + (osc_range * subwedge_size * subwedge_num) subwedges.append((subwedge_num * subwedge_size + 1, subwedge_size, osc_start)) return subwedges # Called by the owning widget (task_toolbox_widget) to create # a collection. When a data collection group is selected. def _create_task(self, sample): tasks = [] sample_is_mounted = self._beamline_setup_hwobj.sample_changer_hwobj.\ is_mounted_sample(sample) if (not self._selected_positions) or (not sample_is_mounted): # No centred positions selected, or selected sample not # mounted create sample centring task. sc = self.create_sample_centring(sample) tasks.append(sc) cpos = queue_model_objects.CentredPosition() cpos.snapshot_image = self._shape_history.get_snapshot([]) cpos_list = [cpos] else: # Shapes selected and sample is mounted, get the # centred positions for the shapes selected_shapes = self._shape_history.selected_shapes cpos_list = self.get_centred_positions(selected_shapes) sc = None if self._acq_widget.use_inverse_beam(): total_num_images = self._acquisition_parameters.num_images subwedge_size = self._acq_widget.get_num_subwedges() osc_range = self._acquisition_parameters.osc_range osc_start = self._acquisition_parameters.osc_start run_number = self._path_template.run_number wedge_one = self.get_subwedges(total_num_images, subwedge_size, osc_range, osc_start) wedge_one = [pair + (run_number,) for pair in wedge_one] wedge_two = self.get_subwedges(total_num_images, subwedge_size, osc_range, 180 + osc_start) wedge_two = [pair + (run_number + 1,) for pair in wedge_two] subwedges = [sw_pair for pair in zip(wedge_one, wedge_two) for sw_pair in pair] self._acq_widget.set_use_inverse_beam(False) for cpos in cpos_list: for sw in subwedges: tasks.extend(self.create_dc(sample, sw[3], sw[0], sw[1], sw[2], sc=sc, cpos=cpos, inverse_beam = True)) self._path_template.run_number += 1 else: for cpos in cpos_list: tasks.extend(self.create_dc(sample, sc=sc, cpos=cpos)) self._path_template.run_number += 1 return tasks def create_sample_centring(self, sample): sc = queue_model_objects.SampleCentring() sc.set_name('sample-centring') return sc def get_centred_positions(self, shapes): centred_positions = [] for shape in shapes: snapshot = None if isinstance(shape, shape_history.Point): if shape.qub_point is not None: snapshot = self._shape_history.\ get_snapshot([shape.qub_point]) else: snapshot = self._shape_history.get_snapshot([]) centred_position = shape.get_centred_positions()[0] centred_position.snapshot_image = snapshot centred_positions.append(centred_position) return centred_positions def create_dc(self, sample, run_number=None, start_image=None, num_images=None, osc_start=None, sc=None, cpos=None, inverse_beam = False): tasks = [] # Acquisition for start position acq = queue_model_objects.Acquisition() acq.acquisition_parameters = \ copy.deepcopy(self._acquisition_parameters) acq.acquisition_parameters.collect_agent = \ queue_model_enumerables.COLLECTION_ORIGIN.MXCUBE acq.path_template = copy.deepcopy(self._path_template) acq.acquisition_parameters.centred_position = cpos if '<sample_name>' in acq.path_template.directory: name = sample.get_name().replace(':', '-') acq.path_template.directory = acq.path_template.directory.\ replace('<sample_name>', name) acq.path_template.process_directory = acq.path_template.process_directory.\ replace('<sample_name>', name) if '<acronym>-<name>' in acq.path_template.base_prefix: acq.path_template.base_prefix = self.get_default_prefix(sample) acq.path_template.run_numer = self._beamline_setup_hwobj.queue_model_hwobj.\ get_next_run_number(acq.path_template) if run_number: acq.path_template.run_number = run_number if start_image: acq.acquisition_parameters.first_image = start_image acq.path_template.start_num = start_image if num_images: acq.acquisition_parameters.num_images = num_images acq.path_template.num_files = num_images if osc_start: acq.acquisition_parameters.osc_start = osc_start if inverse_beam: acq.acquisition_parameters.inverse_beam = False processing_parameters = copy.deepcopy(self._processing_parameters) dc = queue_model_objects.DataCollection([acq], sample.crystals[0], processing_parameters) dc.set_name(acq.path_template.get_prefix()) dc.set_number(acq.path_template.run_number) dc.experiment_type = queue_model_enumerables.EXPERIMENT_TYPE.NATIVE if sc: sc.add_task(dc) tasks.append(dc) self._data_path_widget.update_data_model(self._path_template) self._acq_widget.update_data_model(self._acquisition_parameters, self._path_template) return tasks
def __init__(self, parent=None, name=None, fl=0): CreateTaskBase.__init__(self, parent, name, fl, 'Helical') if not name: self.setName("create_helical_widget") # # Data attributes # self.init_models() self._prev_pos = None self._current_pos = None self._list_item_map = {} self.init_models() # # Layout # v_layout = qt.QVBoxLayout(self, 2, 5, "v_layout") self._lines_gbox = qt.QGroupBox('Lines', self, "lines_gbox") self._lines_gbox.setColumnLayout(0, qt.Qt.Vertical) self._lines_gbox.layout().setSpacing(6) self._lines_gbox.layout().setMargin(11) lines_gbox_layout = qt.QHBoxLayout(self._lines_gbox.layout()) lines_gbox_layout.setAlignment(qt.Qt.AlignTop) self._list_box = qt.QListBox(self._lines_gbox, "helical_page") self._list_box.setSelectionMode(qt.QListBox.Extended) self._list_box.setFixedWidth(200) self._list_box.setFixedHeight(75) list_box_tool_tip = "Select the line(s) to perfrom helical scan on" qt.QToolTip.add(self._list_box, list_box_tool_tip) lines_gbox_layout.addWidget(self._list_box) button_layout = qt.QVBoxLayout(None, 0, 6, "button_layout") button_layout.setSpacing(5) add_button = qt.QPushButton("+", self._lines_gbox, "add_button") add_button.setFixedWidth(20) add_button.setFixedHeight(20) remove_button = qt.QPushButton("-", self._lines_gbox, "add_button") remove_button.setFixedWidth(20) remove_button.setFixedHeight(20) button_layout.addWidget(add_button) button_layout.addWidget(remove_button) lines_gbox_layout.addLayout(button_layout) add_button_tool_tip = "Add a line between two saved positions, " \ "CTRL click to select more than one position" qt.QToolTip.add(add_button, add_button_tool_tip) remove_button_tool_tip = "Remove selected line(s)" qt.QToolTip.add(remove_button, remove_button_tool_tip) self._acq_gbox = qt.QVGroupBox('Acquisition', self, 'acq_gbox') self._acq_widget = \ AcquisitionWidget(self._acq_gbox, "acquisition_widget", layout='vertical', acq_params=self._acquisition_parameters, path_template=self._path_template) self._acq_widget.disable_inverse_beam(True) self._data_path_gbox = qt.QVGroupBox('Data location', self, 'data_path_gbox') self._data_path_widget = \ DataPathWidget(self._data_path_gbox, data_model = self._path_template, layout = 'vertical') self._processing_gbox = qt.QVGroupBox('Processing', self, 'processing_gbox') self._processing_widget = \ ProcessingWidget(self._processing_gbox, data_model = self._processing_parameters) v_layout.addWidget(self._lines_gbox) v_layout.addWidget(self._acq_gbox) v_layout.addWidget(self._data_path_gbox) v_layout.addWidget(self._processing_gbox) qt.QObject.connect(add_button, qt.SIGNAL("clicked()"), self.add_clicked) qt.QObject.connect(remove_button, qt.SIGNAL("clicked()"), self.remove_clicked) qt.QObject.connect(self._list_box, qt.SIGNAL("selectionChanged()"), self.list_box_selection_changed) prefix_ledit = self._data_path_widget.\ data_path_widget_layout.child('prefix_ledit') run_number_ledit = self._data_path_widget.\ data_path_widget_layout.child('run_number_ledit') self.connect(prefix_ledit, qt.SIGNAL("textChanged(const QString &)"), self._prefix_ledit_change) self.connect(run_number_ledit, qt.SIGNAL("textChanged(const QString &)"), self._run_number_ledit_change) self.connect(self._data_path_widget, qt.PYSIGNAL("path_template_changed"), self.handle_path_conflict)
class CreateHelicalWidget(CreateTaskBase): def __init__(self, parent=None, name=None, fl=0): CreateTaskBase.__init__(self, parent, name, fl, 'Helical') if not name: self.setName("create_helical_widget") # # Data attributes # self.init_models() self._prev_pos = None self._current_pos = None self._list_item_map = {} self.init_models() # # Layout # v_layout = qt.QVBoxLayout(self, 2, 5, "v_layout") self._lines_gbox = qt.QGroupBox('Lines', self, "lines_gbox") self._lines_gbox.setColumnLayout(0, qt.Qt.Vertical) self._lines_gbox.layout().setSpacing(6) self._lines_gbox.layout().setMargin(11) lines_gbox_layout = qt.QHBoxLayout(self._lines_gbox.layout()) lines_gbox_layout.setAlignment(qt.Qt.AlignTop) self._list_box = qt.QListBox(self._lines_gbox, "helical_page") self._list_box.setSelectionMode(qt.QListBox.Extended) self._list_box.setFixedWidth(200) self._list_box.setFixedHeight(75) list_box_tool_tip = "Select the line(s) to perfrom helical scan on" qt.QToolTip.add(self._list_box, list_box_tool_tip) lines_gbox_layout.addWidget(self._list_box) button_layout = qt.QVBoxLayout(None, 0, 6, "button_layout") button_layout.setSpacing(5) add_button = qt.QPushButton("+", self._lines_gbox, "add_button") add_button.setFixedWidth(20) add_button.setFixedHeight(20) remove_button = qt.QPushButton("-", self._lines_gbox, "add_button") remove_button.setFixedWidth(20) remove_button.setFixedHeight(20) button_layout.addWidget(add_button) button_layout.addWidget(remove_button) lines_gbox_layout.addLayout(button_layout) add_button_tool_tip = "Add a line between two saved positions, " \ "CTRL click to select more than one position" qt.QToolTip.add(add_button, add_button_tool_tip) remove_button_tool_tip = "Remove selected line(s)" qt.QToolTip.add(remove_button, remove_button_tool_tip) self._acq_gbox = qt.QVGroupBox('Acquisition', self, 'acq_gbox') self._acq_widget = \ AcquisitionWidget(self._acq_gbox, "acquisition_widget", layout='vertical', acq_params=self._acquisition_parameters, path_template=self._path_template) self._acq_widget.disable_inverse_beam(True) self._data_path_gbox = qt.QVGroupBox('Data location', self, 'data_path_gbox') self._data_path_widget = \ DataPathWidget(self._data_path_gbox, data_model = self._path_template, layout = 'vertical') self._processing_gbox = qt.QVGroupBox('Processing', self, 'processing_gbox') self._processing_widget = \ ProcessingWidget(self._processing_gbox, data_model = self._processing_parameters) v_layout.addWidget(self._lines_gbox) v_layout.addWidget(self._acq_gbox) v_layout.addWidget(self._data_path_gbox) v_layout.addWidget(self._processing_gbox) qt.QObject.connect(add_button, qt.SIGNAL("clicked()"), self.add_clicked) qt.QObject.connect(remove_button, qt.SIGNAL("clicked()"), self.remove_clicked) qt.QObject.connect(self._list_box, qt.SIGNAL("selectionChanged()"), self.list_box_selection_changed) prefix_ledit = self._data_path_widget.\ data_path_widget_layout.child('prefix_ledit') run_number_ledit = self._data_path_widget.\ data_path_widget_layout.child('run_number_ledit') self.connect(prefix_ledit, qt.SIGNAL("textChanged(const QString &)"), self._prefix_ledit_change) self.connect(run_number_ledit, qt.SIGNAL("textChanged(const QString &)"), self._run_number_ledit_change) self.connect(self._data_path_widget, qt.PYSIGNAL("path_template_changed"), self.handle_path_conflict) def init_models(self): CreateTaskBase.init_models(self) self._energy_scan_result = qmo.EnergyScanResult() self._processing_parameters = qmo.ProcessingParameters() if self._beamline_setup_hwobj is not None: has_shutter_less = self._beamline_setup_hwobj.\ detector_has_shutterless() self._acquisition_parameters.shutterless = has_shutter_less self._acquisition_parameters = self._beamline_setup_hwobj.\ get_default_acquisition_parameters("default_helical_values") else: self._acquisition_parameters = qmo.AcquisitionParameters() self._path_template = qmo.PathTemplate() def add_clicked(self): selected_shapes = self._shape_history.selected_shapes.values() if len(selected_shapes) == 2: p1 = selected_shapes[0] p2 = selected_shapes[1] line = shape_history.\ Line(self._shape_history.get_drawing(), p1.qub_point, p2.qub_point, p1.centred_position, p2.centred_position) line.show() self._shape_history.add_shape(line) points_index = line.get_points_index() if points_index: display_name = "Line (points: %d, %d)" % \ (points_index[0], points_index[1]) else: display_name = "Line (points: #, #)" list_box_item = qt.QListBoxText(self._list_box, display_name) #list_box_item = qt.QListBoxText(self._list_box, 'Line') self._list_item_map[list_box_item] = line # De select previous items for item in self.selected_items(): self._list_box.setSelected(item, False) self._list_box.setSelected(list_box_item, True) def remove_clicked(self): selected_items = self.selected_items() if selected_items: for item in selected_items: self._list_box.removeItem(self._list_box.index(item)) line = self._list_item_map[item] self._shape_history.delete_shape(line) del self._list_item_map[item] # Calback from shape_history, called when a shape is deleted def shape_deleted(self, shape): if isinstance(shape, shape_history.Point): items_to_remove = [] for (list_item, line) in self._list_item_map.iteritems(): for qub_object in shape.get_qub_objects(): if qub_object in line.get_qub_objects(): items_to_remove.append((list_item, line)) for (list_item, line) in items_to_remove: self._list_box.removeItem(self._list_box.index(list_item)) del self._list_item_map[list_item] def centred_position_selection(self, positions): if len(positions) == 1: self._prev_pos = positions[0] elif len(positions) == 2: for pos in positions: if pos != self._prev_pos: self._current_pos = pos else: self._prev_pos = None self._current_pos = None self._list_box.clearSelection() def list_box_selection_changed(self): self.show_selected_lines() def selected_items(self): selected_items = [] for item_index in range(0, self._list_box.numRows()): if self._list_box.isSelected(item_index): selected_items.append(self._list_box.item(item_index)) return selected_items def show_selected_lines(self): selected_items = self.selected_items() for list_item in self._list_item_map.keys(): line = self._list_item_map[list_item] if list_item in selected_items: self._shape_history.select_shape(line) else: self._shape_history.de_select_shape(line) def approve_creation(self): base_result = CreateTaskBase.approve_creation(self) selected_lines = False if self.selected_items(): selected_lines = True else: logging.getLogger("user_level_log").\ warning("No lines selected, please select one or more lines.") return base_result and selected_lines def update_processing_parameters(self, crystal): self._processing_parameters.space_group = crystal.space_group self._processing_parameters.cell_a = crystal.cell_a self._processing_parameters.cell_alpha = crystal.cell_alpha self._processing_parameters.cell_b = crystal.cell_b self._processing_parameters.cell_beta = crystal.cell_beta self._processing_parameters.cell_c = crystal.cell_c self._processing_parameters.cell_gamma = crystal.cell_gamma self._processing_widget.update_data_model(self._processing_parameters) def select_shape_with_cpos(self, start_cpos, end_cpos): self._shape_history.de_select_all() selected_line = None for shape in self._shape_history.get_shapes(): if isinstance(shape, shape_history.Line): if shape.get_centred_positions()[0] == start_cpos and\ shape.get_centred_positions()[1] == end_cpos: self._shape_history.select_shape(shape) selected_line = shape #de-select previous selected list items and #select the current shape (Line). for (list_item, shape) in self._list_item_map.iteritems(): if selected_line is shape: self._list_box.setSelected(list_item, True) else: self._list_box.setSelected(list_item, False) 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.experiment_type == EXPERIMENT_TYPE.HELICAL: if tree_item.get_model().is_executed(): self.setDisabled(True) else: self.setDisabled(False) 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 self.select_shape_with_cpos(start_cpos, end_cpos) 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): data_collections = [] if isinstance(shape, shape_history.Line): if shape.get_qub_objects() is not None: snapshot = self._shape_history.get_snapshot( shape.get_qub_objects()) else: snapshot = self._shape_history.get_snapshot([]) # Acquisition for start position start_acq = self._create_acq(sample) start_acq.acquisition_parameters.\ centred_position = copy.deepcopy(shape.start_cpos) start_acq.acquisition_parameters.centred_position.\ snapshot_image = snapshot start_acq.path_template.suffix = self._session_hwobj.suffix # Add another acquisition for the end position end_acq = self._create_acq(sample) end_acq.acquisition_parameters.\ centred_position = shape.end_cpos end_acq.acquisition_parameters.centred_position.\ snapshot_image = snapshot end_acq.path_template.suffix = self._session_hwobj.suffix processing_parameters = copy.deepcopy(self._processing_parameters) dc = qmo.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.experiment_type = EXPERIMENT_TYPE.HELICAL data_collections.append(dc) self._path_template.run_number += 1 return data_collections
class CreateDiscreteWidget(CreateTaskBase): def __init__(self, parent=None, name=None, fl=0): CreateTaskBase.__init__(self, parent, name, fl, "Standard") if not name: self.setName("create_discrete_widget") self.previous_energy = None self.init_models() # # Layout # v_layout = qt.QVBoxLayout(self, 2, 5, "v_layout") self._acq_gbox = qt.QVGroupBox("Acquisition", self, "acq_gbox") self._acq_widget = AcquisitionWidget( self._acq_gbox, "acquisition_widget", layout="vertical", acq_params=self._acquisition_parameters, path_template=self._path_template, ) self._data_path_gbox = qt.QVGroupBox("Data location", self, "data_path_gbox") self._data_path_widget = DataPathWidget( self._data_path_gbox, "create_dc_path_widget", data_model=self._path_template, layout="vertical", ) self._processing_gbox = qt.QVGroupBox("Processing", self, "processing_gbox") self._processing_widget = ProcessingWidget( self._processing_gbox, data_model=self._processing_parameters ) v_layout.addWidget(self._acq_gbox) v_layout.addWidget(self._data_path_gbox) v_layout.addWidget(self._processing_gbox) v_layout.addStretch() dp_layout = self._data_path_widget.data_path_widget_layout self.connect( self._acq_widget, qt.PYSIGNAL("mad_energy_selected"), self.mad_energy_selected, ) self.connect( dp_layout.child("prefix_ledit"), qt.SIGNAL("textChanged(const QString &)"), self._prefix_ledit_change, ) self.connect( dp_layout.child("run_number_ledit"), qt.SIGNAL("textChanged(const QString &)"), self._run_number_ledit_change, ) self.connect( self._acq_widget, qt.PYSIGNAL("path_template_changed"), self.handle_path_conflict, ) self.connect( self._data_path_widget, qt.PYSIGNAL("path_template_changed"), self.handle_path_conflict, ) def init_models(self): CreateTaskBase.init_models(self) self._energy_scan_result = queue_model_objects.EnergyScanResult() self._processing_parameters = queue_model_objects.ProcessingParameters() def set_tunable_energy(self, state): self._acq_widget.set_tunable_energy(state) def update_processing_parameters(self, crystal): self._processing_parameters.space_group = crystal.space_group self._processing_parameters.cell_a = crystal.cell_a self._processing_parameters.cell_alpha = crystal.cell_alpha self._processing_parameters.cell_b = crystal.cell_b self._processing_parameters.cell_beta = crystal.cell_beta self._processing_parameters.cell_c = crystal.cell_c self._processing_parameters.cell_gamma = crystal.cell_gamma self._processing_widget.update_data_model(self._processing_parameters) def mad_energy_selected(self, name, energy, state): item = self._current_selected_items[0] model = item.get_model() if state: self._path_template.mad_prefix = name else: self._path_template.mad_prefix = "" run_number = self._beamline_setup_hwobj.queue_model_hwobj.get_next_run_number( self._path_template ) data_path_widget = self.get_data_path_widget() data_path_widget.set_run_number(run_number) data_path_widget.set_prefix(self._path_template.base_prefix) if self.isEnabled(): if isinstance(item, queue_item.TaskQueueItem) and not isinstance( item, queue_item.DataCollectionGroupQueueItem ): model.set_name(self._path_template.get_prefix()) item.setText(0, model.get_name()) 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 = copy.deepcopy(self._processing_parameters) self._processing_parameters = sample_model.processing_parameters self._processing_widget.update_data_model(self._processing_parameters) self._acq_widget.disable_inverse_beam(False) elif isinstance(tree_item, queue_item.BasketQueueItem): self.setDisabled(False) elif isinstance(tree_item, queue_item.DataCollectionQueueItem): dc = tree_item.get_model() if dc.experiment_type != queue_model_enumerables.EXPERIMENT_TYPE.HELICAL: if dc.is_executed(): self.setDisabled(True) else: self.setDisabled(False) sample_data_model = self.get_sample_item(tree_item).get_model() energy_scan_result = sample_data_model.crystals[0].energy_scan_result self._acq_widget.set_energies(energy_scan_result) self._acq_widget.disable_inverse_beam(True) self._path_template = dc.get_path_template() self._data_path_widget.update_data_model(self._path_template) self._acquisition_parameters = dc.acquisitions[0].acquisition_parameters self._acq_widget.update_data_model( self._acquisition_parameters, self._path_template ) self.get_acquisition_widget().use_osc_start(True) if len(dc.acquisitions) == 1: self.select_shape_with_cpos( self._acquisition_parameters.centred_position ) self._processing_parameters = dc.processing_parameters self._processing_widget.update_data_model(self._processing_parameters) else: self.setDisabled(True) else: self.setDisabled(True) def approve_creation(self): result = CreateTaskBase.approve_creation(self) selected_shapes = self._shape_history.selected_shapes for shape in selected_shapes: if isinstance(shape, shape_history.Line) or isinstance( shape, shape_history.CanvasGrid ): result = False return result # 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): tasks = [] cpos = queue_model_objects.CentredPosition() cpos.snapshot_image = self._shape_history.get_snapshot([]) if shape is not None: # Shapes selected and sample is mounted, get the # centred positions for the shapes if isinstance(shape, shape_history.Point): snapshot = self._shape_history.get_snapshot([shape.qub_point]) cpos = copy.deepcopy(shape.get_centred_positions()[0]) cpos.snapshot_image = snapshot if self._acq_widget.use_inverse_beam(): total_num_images = self._acquisition_parameters.num_images subwedge_size = self._acq_widget.get_num_subwedges() osc_range = self._acquisition_parameters.osc_range osc_start = self._acquisition_parameters.osc_start run_number = self._path_template.run_number subwedges = queue_model_objects.create_inverse_beam_sw( total_num_images, subwedge_size, osc_range, osc_start, run_number ) self._acq_widget.set_use_inverse_beam(False) for sw in subwedges: tasks.extend( self.create_dc( sample, sw[3], sw[0], sw[1], sw[2], cpos=cpos, inverse_beam=True ) ) self._path_template.run_number += 1 else: tasks.extend(self.create_dc(sample, cpos=cpos)) self._path_template.run_number += 1 return tasks def create_dc( self, sample, run_number=None, start_image=None, num_images=None, osc_start=None, sc=None, cpos=None, inverse_beam=False, ): tasks = [] # Acquisition for start position acq = self._create_acq(sample) if run_number: acq.path_template.run_number = run_number if start_image: acq.acquisition_parameters.first_image = start_image acq.path_template.start_num = start_image if num_images: acq.acquisition_parameters.num_images = num_images acq.path_template.num_files = num_images if osc_start: acq.acquisition_parameters.osc_start = osc_start if inverse_beam: acq.acquisition_parameters.inverse_beam = False acq.acquisition_parameters.centred_position = cpos processing_parameters = copy.deepcopy(self._processing_parameters) dc = queue_model_objects.DataCollection( [acq], sample.crystals[0], processing_parameters ) dc.set_name(acq.path_template.get_prefix()) dc.set_number(acq.path_template.run_number) dc.experiment_type = queue_model_enumerables.EXPERIMENT_TYPE.NATIVE tasks.append(dc) return tasks
class CreateXRFSpectrumWidget(CreateTaskBase): def __init__(self, parent=None, name=None, fl=0): CreateTaskBase.__init__(self, parent, name, fl, "XRF-spectrum") self.count_time = None # Data attributes self.init_models() xrfspectrum_model = queue_model_objects.XRFSpectrum() self.xrfspectrum_mib = DataModelInputBinder(xrfspectrum_model) # Layout v_layout = qt.QVBoxLayout(self, 2, 6, "main_v_layout") self._data_path_gbox = qt.QVGroupBox("Data location", self, "data_path_gbox") self._data_path_widget = DataPathWidget( self._data_path_gbox, data_model=self._path_template, layout="vertical" ) parameters_hor_gbox = qt.QHGroupBox("Parameters", self) self.count_time_label = qt.QLabel("Count time", parameters_hor_gbox) self.count_time_label.setFixedWidth(83) self.count_time_ledit = qt.QLineEdit( "1.0", parameters_hor_gbox, "count_time_ledit" ) self.count_time_ledit.setFixedWidth(50) self.xrfspectrum_mib.bind_value_update( "count_time", self.count_time_ledit, float ) # , spacer = qt.QWidget(parameters_hor_gbox) spacer.setSizePolicy(qt.QSizePolicy.Expanding, qt.QSizePolicy.Fixed) v_layout.addWidget(self._data_path_gbox) v_layout.addWidget(parameters_hor_gbox) v_layout.addStretch() self.connect( self._data_path_widget.data_path_widget_layout.child("run_number_ledit"), qt.SIGNAL("textChanged(const QString &)"), self._run_number_ledit_change, ) self.connect( self._data_path_widget.data_path_widget_layout.child("prefix_ledit"), qt.SIGNAL("textChanged(const QString &)"), self._prefix_ledit_change, ) self.connect( self._data_path_widget, qt.PYSIGNAL("path_template_changed"), self.handle_path_conflict, ) def init_models(self): CreateTaskBase.init_models(self) self._path_template.start_num = 1 self._path_template.num_files = 1 self._path_template.suffix = "raw" def single_item_selection(self, tree_item): CreateTaskBase.single_item_selection(self, tree_item) if isinstance(tree_item, queue_item.XRFSpectrumQueueItem): xrfspectrum_model = tree_item.get_model() self.xrfspectrum_mib.set_model(xrfspectrum_model) if xrfspectrum_model.is_executed(): self.setDisabled(True) else: self.setDisabled(False) if xrfspectrum_model.get_path_template(): self._path_template = xrfspectrum_model.get_path_template() self._data_path_widget.update_data_model(self._path_template) elif isinstance(tree_item, queue_item.BasketQueueItem): self.setDisabled(False) elif not ( isinstance(tree_item, queue_item.SampleQueueItem) or isinstance(tree_item, queue_item.DataCollectionGroupQueueItem) ): self.setDisabled(True) def approve_creation(self): result = CreateTaskBase.approve_creation(self) selected_shapes = self._shape_history.selected_shapes for shape in selected_shapes: if isinstance(shape, shape_history.Line) or isinstance( shape, shape_history.CanvasGrid ): result = False self.count_time = None try: self.count_time = float(str(self.count_time_ledit.text())) except BaseException: logging.getLogger("user_level_log").info("Incorrect count time value.") return 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): data_collections = [] if self.count_time is not None: if not shape: cpos = queue_model_objects.CentredPosition() cpos.snapshot_image = self._shape_history.get_snapshot([]) else: # Shapes selected and sample is mounted, get the # centred positions for the shapes if isinstance(shape, shape_history.Point): snapshot = self._shape_history.get_snapshot([shape.qub_point]) cpos = copy.deepcopy(shape.get_centred_positions()[0]) 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 data_collections.append(xrf_spectrum) self._path_template.run_number += 1 else: logging.getLogger("user_level_log").info("Incorrect count time value") return data_collections # Called by the owning widget (task_toolbox_widget) when # one or several centred positions are selected. def centred_position_selection(self, positions): self._selected_positions = positions if len(self._current_selected_items) == 1 and len(positions) == 1: item = self._current_selected_items[0] pos = positions[0] if isinstance(pos, shape_history.Point): if isinstance(item, queue_item.XRFSpectrumQueueItem): cpos = pos.get_centred_positions()[0] snapshot = self._shape_history.get_snapshot([pos.qub_point]) cpos.snapshot_image = snapshot item.get_model().centred_position = cpos
class CreateWorkflowWidget(CreateTaskBase): def __init__(self, parent=None, name=None, fl=0): CreateTaskBase.__init__(self, parent, name, fl, "Workflow") # Data attributes self.workflow_hwobj = None self.workflows = {} self.init_models() # Layout v_layout = qt.QVBoxLayout(self, 2, 5, "main_v_layout") self._workflow_type_gbox = qt.QVGroupBox("Workflow type", self, "workflow_rtype") self._workflow_cbox = qt.QComboBox(self._workflow_type_gbox) self._data_path_gbox = qt.QVGroupBox("Data location", self, "data_path_gbox") self._data_path_widget = DataPathWidget(self._data_path_gbox, data_model=self._path_template, layout="vertical") self._data_path_widget.data_path_widget_layout.child( "file_name_label").setText("") self._data_path_widget.data_path_widget_layout.child( "file_name_value_label").hide() # self._grid_widget = MxLookupScanBrick.MxLookupScanBrick(self, 'grid_widget') v_layout.addWidget(self._workflow_type_gbox) v_layout.addWidget(self._data_path_gbox) # v_layout.addWidget(self._grid_widget) v_layout.addStretch() self.connect( self._data_path_widget.data_path_widget_layout.child( "prefix_ledit"), qt.SIGNAL("textChanged(const QString &)"), self._prefix_ledit_change, ) self.connect( self._data_path_widget.data_path_widget_layout.child( "run_number_ledit"), qt.SIGNAL("textChanged(const QString &)"), self._run_number_ledit_change, ) self.connect( self._data_path_widget, qt.PYSIGNAL("path_template_changed"), self.handle_path_conflict, ) def set_workflow(self, workflow_hwobj): self._workflow_hwobj = workflow_hwobj self.workflows.clear() self._workflow_cbox.clear() if self._workflow_hwobj is not None: for workflow in self._workflow_hwobj.get_available_workflows(): self._workflow_cbox.insertItem(workflow["name"]) self.workflows[workflow["name"]] = workflow def set_shape_history(self, shape_history_hwobj): pass # self._grid_widget._shape_history = shape_history_hwobj # motor = self._beamline_setup_hwobj.\ # getObjectByRole('horizontal_motors') # self._grid_widget.initialize_motors('horizontal', motor) # motor = self._beamline_setup_hwobj.\ # getObjectByRole('vertical_motors') # self._grid_widget.initialize_motors('vertical', motor) def init_models(self): CreateTaskBase.init_models(self) def single_item_selection(self, tree_item): CreateTaskBase.single_item_selection(self, tree_item) wf_model = tree_item.get_model() if isinstance(tree_item, queue_item.GenericWorkflowQueueItem): if tree_item.get_model().is_executed(): self.setDisabled(True) else: self.setDisabled(False) if wf_model.get_path_template(): self._path_template = wf_model.get_path_template() self._data_path_widget.update_data_model(self._path_template) elif isinstance(tree_item, queue_item.BasketQueueItem): self.setDisabled(False) elif not (isinstance(tree_item, queue_item.SampleQueueItem) or isinstance(tree_item, queue_item.DataCollectionGroupQueueItem)): self.setDisabled(True) def approve_creation(self): return CreateTaskBase.approve_creation(self) # 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): tasks = [] path_template = self._create_path_template(sample, self._path_template) path_template.num_files = 0 wf = queue_model_objects.Workflow() wf_name = str(self._workflow_cbox.currentText()) wf.path_template = path_template wf.set_name("Workflow task") wf.set_type(wf_name) beamline_params = {} beamline_params["directory"] = wf.path_template.directory beamline_params["prefix"] = wf.path_template.get_prefix() beamline_params["run_number"] = wf.path_template.run_number beamline_params["collection_software"] = "mxCuBE - 2.0" beamline_params["sample_node_id"] = sample._node_id beamline_params["sample_lims_id"] = sample.lims_id params_list = map(str, list(itertools.chain(*beamline_params.iteritems()))) params_list.insert(0, self.workflows[wf_name]["path"]) params_list.insert(0, "modelpath") wf.params_list = params_list tasks.append(wf) return tasks
class CreateCharWidget(CreateTaskBase): def __init__(self, parent=None, name=None, fl=0): CreateTaskBase.__init__(self, parent, name, fl, 'Characterisation') if not name: self.setName("create_char_widget") # # Data attributes # self._current_selected_item = None self.init_models() self._char_params_mib = DataModelInputBinder(self._char_params) # # Layout # v_layout = qt.QVBoxLayout(self, 2, 6, "v_layout") self._acq_widget = \ AcquisitionWidgetSimple(self, acq_params = self._acquisition_parameters, path_template = self._path_template) #self._acq_widget.setFixedHeight(170) current_dir = os.path.dirname(__file__) ui_file = 'ui_files/vertical_crystal_dimension_widget_layout.ui' widget = qtui.QWidgetFactory.create(os.path.join(current_dir, ui_file)) widget.reparent(self, qt.QPoint(0, 0)) self._vertical_dimension_widget = widget ui_file = 'ui_files/characterise_simple_widget_vertical_layout.ui' widget = qtui.QWidgetFactory.\ create(os.path.join(current_dir, ui_file)) widget.reparent(self, qt.QPoint(0, 0)) self._char_widget = widget self._data_path_gbox = \ qt.QVGroupBox('Data location', self, 'data_path_gbox') self._data_path_widget = \ DataPathWidget(self._data_path_gbox, data_model = self._path_template, layout = 'vertical') v_layout.addWidget(self._acq_widget) v_layout.addWidget(self._data_path_gbox) v_layout.addWidget(self._char_widget) v_layout.addWidget(self._vertical_dimension_widget) v_layout.addStretch(100) # # Logic # optimised_sad_cbx = self._char_widget.\ child('optimised_sad_cbx') account_rad_dmg_cbx = self._char_widget.\ child('account_rad_dmg_cbx') start_comp_cbox = self._char_widget.child('start_comp_cbox') #induced_burn_cbx = self._char_widget.child('induced_burn_cbx') max_vdim_ledit = self._vertical_dimension_widget.\ child('max_vdim_ledit') min_vdim_ledit = self._vertical_dimension_widget.\ child('min_vdim_ledit') min_vphi_ledit = self._vertical_dimension_widget.\ child('min_vphi_ledit') max_vphi_ledit = self._vertical_dimension_widget.\ child('max_vphi_ledit') space_group_ledit = self._vertical_dimension_widget.\ child('space_group_ledit') self._char_params_mib.bind_value_update('opt_sad', optimised_sad_cbx, bool, None) self._char_params_mib.bind_value_update('account_rad_damage', account_rad_dmg_cbx, bool, None) #self._char_params_mib.bind_value_update('determine_rad_params', # induced_burn_cbx, # bool, None) self._char_params_mib.bind_value_update('strategy_complexity', start_comp_cbox, int, None) self._char_params_mib.\ bind_value_update('max_crystal_vdim', max_vdim_ledit, float, qt.QDoubleValidator(0.0, 1000, 2, self)) self._char_params_mib.\ bind_value_update('min_crystal_vdim', min_vdim_ledit, float, qt.QDoubleValidator(0.0, 1000, 2, self)) self._char_params_mib.\ bind_value_update('min_crystal_vphi', min_vphi_ledit, float, qt.QDoubleValidator(0.0, 1000, 2, self)) self._char_params_mib.\ bind_value_update('max_crystal_vphi', max_vphi_ledit, float, qt.QDoubleValidator(0.0, 1000, 2, self)) space_group_ledit.insertStrList(XTAL_SPACEGROUPS) prefix_ledit = self._data_path_widget.\ data_path_widget_layout.child('prefix_ledit') run_number_ledit = self._data_path_widget.\ data_path_widget_layout.child('run_number_ledit') self.connect(prefix_ledit, qt.SIGNAL("textChanged(const QString &)"), self._prefix_ledit_change) self.connect(run_number_ledit, qt.SIGNAL("textChanged(const QString &)"), self._run_number_ledit_change) self.connect(space_group_ledit, qt.SIGNAL("activated(int)"), self._space_group_change) self.connect(self._data_path_widget, qt.PYSIGNAL("path_template_changed"), self.handle_path_conflict) #self.connect(induced_burn_cbx, qt.SIGNAL("toggled(bool)"), # self.use_induced_burn) def use_induced_burn(self, state): self._acquisition_parameters.induce_burn = state def _space_group_change(self, index): self._char_params.space_group = queue_model_enumerables.\ XTAL_SPACEGROUPS[index] def _set_space_group(self, space_group): index = 0 if space_group in XTAL_SPACEGROUPS: index = XTAL_SPACEGROUPS.index(space_group) self._space_group_change(index) self._vertical_dimension_widget.\ child('space_group_ledit').setCurrentItem(index) def init_models(self): CreateTaskBase.init_models(self) self._init_models() def _init_models(self): self._char = queue_model_objects.Characterisation() self._char_params = self._char.characterisation_parameters self._processing_parameters = queue_model_objects.ProcessingParameters( ) if self._beamline_setup_hwobj is not None: self._acquisition_parameters = self._beamline_setup_hwobj.\ get_default_char_acq_parameters() self._char_params = self._beamline_setup_hwobj.\ get_default_characterisation_parameters() try: transmission = self._beamline_setup_hwobj.transmission_hwobj.getAttFactor( ) transmission = round(float(transmission), 1) except AttributeError: transmission = 0 try: resolution = self._beamline_setup_hwobj.resolution_hwobj.getPosition( ) resolution = round(float(resolution), 3) except AttributeError: resolution = 0 try: energy = self._beamline_setup_hwobj.energy_hwobj.getCurrentEnergy( ) energy = round(float(energy), 4) except AttributeError: energy = 0 self._acquisition_parameters.resolution = resolution self._acquisition_parameters.energy = energy self._acquisition_parameters.transmission = transmission else: self._acquisition_parameters = queue_model_objects.AcquisitionParameters( ) self._path_template.reference_image_prefix = 'ref' # The num images drop down default value is 1 # we would like it to be 2 self._acquisition_parameters.num_images = 2 self._char.characterisation_software =\ queue_model_enumerables.COLLECTION_ORIGIN.EDNA self._path_template.num_files = 2 self._acquisition_parameters.shutterless = False def single_item_selection(self, tree_item): CreateTaskBase.single_item_selection(self, tree_item) if isinstance(tree_item, queue_item.SampleQueueItem): self._init_models() self._set_space_group(self._char_params.space_group) self._acq_widget.update_data_model(self._acquisition_parameters, self._path_template) self._char_params_mib.set_model(self._char_params) #self._char_params = copy.deepcopy(self._char_params) #self._acquisition_parameters = copy.deepcopy(self._acquisition_parameters) elif isinstance(tree_item, queue_item.BasketQueueItem): self.setDisabled(False) elif isinstance(tree_item, queue_item.CharacterisationQueueItem): if tree_item.get_model().is_executed(): self.setDisabled(True) else: self.setDisabled(False) self._char = tree_item.get_model() if self._char.get_path_template(): self._path_template = self._char.get_path_template() self._data_path_widget.update_data_model(self._path_template) data_collection = self._char.reference_image_collection self._char_params = self._char.characterisation_parameters self._char_params_mib.set_model(self._char_params) 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) if len(data_collection.acquisitions) == 1: self.select_shape_with_cpos(self._acquisition_parameters.\ centred_position) self._processing_parameters = data_collection.processing_parameters else: self.setDisabled(True) def update_processing_parameters(self, crystal): self._processing_parameters.space_group = crystal.space_group self._char_params.space_group = crystal.space_group self._processing_parameters.cell_a = crystal.cell_a self._processing_parameters.cell_alpha = crystal.cell_alpha self._processing_parameters.cell_b = crystal.cell_b self._processing_parameters.cell_beta = crystal.cell_beta self._processing_parameters.cell_c = crystal.cell_c self._processing_parameters.cell_gamma = crystal.cell_gamma def approve_creation(self): return CreateTaskBase.approve_creation(self) selected_shapes = self._shape_history.selected_shapes for shape in selected_shapes: if isinstance(shape, shape_history.Line): result = False return result # 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): tasks = [] if not shape: cpos = queue_model_objects.CentredPosition() cpos.snapshot_image = self._shape_history.get_snapshot([]) else: # Shapes selected and sample is mounted, get the # centred positions for the shapes if isinstance(shape, shape_history.Point): snapshot = self._shape_history.\ get_snapshot([shape.qub_point]) #cpos = shape.get_centred_positions()[0] cpos = copy.deepcopy(shape.get_centred_positions()[0]) cpos.snapshot_image = snapshot char_params = copy.deepcopy(self._char_params) acq = self._create_acq(sample) dc = queue_model_objects.\ DataCollection([acq], sample.crystals[0], self._processing_parameters) # Reference images for characterisations should be taken 90 deg apart # this is achived by setting overap to -89 acq.acquisition_parameters.overlap = -89 acq.acquisition_parameters.centred_position = cpos dc.acquisitions[0] = acq dc.experiment_type = queue_model_enumerables.EXPERIMENT_TYPE.EDNA_REF char = queue_model_objects.Characterisation(dc, char_params) char.set_name(dc.acquisitions[0].\ path_template.get_prefix()) char.set_number(dc.acquisitions[0].\ path_template.run_number) tasks.append(char) self._path_template.run_number += 1 return tasks
class CreateWorkflowWidget(CreateTaskBase): def __init__(self, parent = None, name = None, fl = 0): CreateTaskBase.__init__(self, parent, name, fl, 'Workflow') # Data attributes self.workflow_hwobj = None self.workflows = {} self.init_models() #Layout v_layout = qt.QVBoxLayout(self, 2, 5, "main_v_layout") self._workflow_type_gbox = qt.QVGroupBox('Workflow type', self, 'workflow_rtype') self._workflow_cbox = qt.QComboBox(self._workflow_type_gbox) self._data_path_gbox = qt.QVGroupBox('Data location', self, 'data_path_gbox') self._data_path_widget = DataPathWidget(self._data_path_gbox, data_model = self._path_template, layout = 'vertical') self._data_path_widget.data_path_widget_layout.child('file_name_label').setText('') self._data_path_widget.data_path_widget_layout.child('file_name_value_label').hide() #self._grid_widget = MxLookupScanBrick.MxLookupScanBrick(self, 'grid_widget') v_layout.addWidget(self._workflow_type_gbox) v_layout.addWidget(self._data_path_gbox) #v_layout.addWidget(self._grid_widget) v_layout.addStretch() self.connect(self._data_path_widget.data_path_widget_layout.child('prefix_ledit'), qt.SIGNAL("textChanged(const QString &)"), self._prefix_ledit_change) self.connect(self._data_path_widget.data_path_widget_layout.child('run_number_ledit'), qt.SIGNAL("textChanged(const QString &)"), self._run_number_ledit_change) self.connect(self._data_path_widget, qt.PYSIGNAL("path_template_changed"), self.handle_path_conflict) def set_workflow(self, workflow_hwobj): self._workflow_hwobj = workflow_hwobj self.workflows.clear() self._workflow_cbox.clear() if self._workflow_hwobj is not None: for workflow in self._workflow_hwobj.get_available_workflows(): self._workflow_cbox.insertItem(workflow['name']) self.workflows[workflow['name']] = workflow def set_shape_history(self, shape_history_hwobj): pass #self._grid_widget._shape_history = shape_history_hwobj #motor = self._beamline_setup_hwobj.\ # getObjectByRole('horizontal_motors') #self._grid_widget.initialize_motors('horizontal', motor) #motor = self._beamline_setup_hwobj.\ # getObjectByRole('vertical_motors') #self._grid_widget.initialize_motors('vertical', motor) def init_models(self): CreateTaskBase.init_models(self) def single_item_selection(self, tree_item): CreateTaskBase.single_item_selection(self, tree_item) wf_model = tree_item.get_model() if isinstance(tree_item, queue_item.GenericWorkflowQueueItem): if tree_item.get_model().is_executed(): self.setDisabled(True) else: self.setDisabled(False) if wf_model.get_path_template(): self._path_template = wf_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): return CreateTaskBase.approve_creation(self) # 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): tasks = [] path_template = copy.deepcopy(self._path_template) path_template.num_files = 0 if '<sample_name>' in path_template.directory: name = sample.get_name().replace(':', '-') path_template.directory = path_template.directory.\ replace('<sample_name>', name) path_template.process_directory = path_template.process_directory.\ replace('<sample_name>', name) if '<acronym>-<name>' in path_template.base_prefix: path_template.base_prefix = self.get_default_prefix(sample) path_template.run_numer = self._beamline_setup_hwobj.queue_model_hwobj.\ get_next_run_number(path_template) wf = queue_model_objects.Workflow() wf_name = str(self._workflow_cbox.currentText()) wf.path_template = path_template wf.set_name("Workflow task") wf.set_type(wf_name) beamline_params = {} beamline_params['directory'] = wf.path_template.directory beamline_params['prefix'] = wf.path_template.get_prefix() beamline_params['run_number'] = wf.path_template.run_number beamline_params['collection_software'] = 'mxCuBE - 2.0' beamline_params['sample_node_id'] = sample._node_id beamline_params['sample_lims_id'] = sample.lims_id params_list = map(str, list(itertools.chain(*beamline_params.iteritems()))) params_list.insert(0, self.workflows[wf_name]['path']) params_list.insert(0, 'modelpath') wf.params_list = params_list tasks.append(wf) return tasks
class CreateDiscreteWidget(CreateTaskBase): def __init__(self, parent=None, name=None, fl=0): CreateTaskBase.__init__(self, parent, name, fl, 'Standard') if not name: self.setName("create_discrete_widget") self.previous_energy = None self.init_models() # # Layout # v_layout = qt.QVBoxLayout(self, 2, 5, "v_layout") self._acq_gbox = qt.QVGroupBox('Acquisition', self, 'acq_gbox') self._acq_widget = \ AcquisitionWidget(self._acq_gbox, "acquisition_widget", layout='vertical', acq_params=self._acquisition_parameters, path_template=self._path_template) self._data_path_gbox = qt.QVGroupBox('Data location', self, 'data_path_gbox') self._data_path_widget = \ DataPathWidget(self._data_path_gbox, 'create_dc_path_widget', data_model=self._path_template, layout='vertical') self._processing_gbox = qt.QVGroupBox('Processing', self, 'processing_gbox') self._processing_widget = \ ProcessingWidget(self._processing_gbox, data_model=self._processing_parameters) v_layout.addWidget(self._acq_gbox) v_layout.addWidget(self._data_path_gbox) v_layout.addWidget(self._processing_gbox) v_layout.addStretch() dp_layout = self._data_path_widget.data_path_widget_layout self.connect(self._acq_widget, qt.PYSIGNAL('mad_energy_selected'), self.mad_energy_selected) self.connect(dp_layout.child('prefix_ledit'), qt.SIGNAL("textChanged(const QString &)"), self._prefix_ledit_change) self.connect(dp_layout.child('run_number_ledit'), qt.SIGNAL("textChanged(const QString &)"), self._run_number_ledit_change) self.connect(self._acq_widget, qt.PYSIGNAL("path_template_changed"), self.handle_path_conflict) self.connect(self._data_path_widget, qt.PYSIGNAL("path_template_changed"), self.handle_path_conflict) def init_models(self): CreateTaskBase.init_models(self) self._energy_scan_result = qmo.EnergyScanResult() self._processing_parameters = qmo.ProcessingParameters() def set_tunable_energy(self, state): self._acq_widget.set_tunable_energy(state) def update_processing_parameters(self, crystal): self._processing_parameters.space_group = crystal.space_group self._processing_parameters.cell_a = crystal.cell_a self._processing_parameters.cell_alpha = crystal.cell_alpha self._processing_parameters.cell_b = crystal.cell_b self._processing_parameters.cell_beta = crystal.cell_beta self._processing_parameters.cell_c = crystal.cell_c self._processing_parameters.cell_gamma = crystal.cell_gamma self._processing_widget.update_data_model(self._processing_parameters) def mad_energy_selected(self, name, energy, state): item = self._current_selected_items[0] model = item.get_model() if state: self._path_template.mad_prefix = name else: self._path_template.mad_prefix = '' run_number = self._beamline_setup_hwobj.queue_model_hwobj.\ get_next_run_number(self._path_template) data_path_widget = self.get_data_path_widget() data_path_widget.set_run_number(run_number) data_path_widget.set_prefix(self._path_template.base_prefix) if self.isEnabled(): if isinstance(item, queue_item.TaskQueueItem) and \ not isinstance(item, queue_item.DataCollectionGroupQueueItem): model.set_name(self._path_template.get_prefix()) item.setText(0, model.get_name()) def single_item_selection(self, tree_item): CreateTaskBase.single_item_selection(self, tree_item) if isinstance(tree_item, queue_item.SampleQueueItem): self._processing_parameters = copy.deepcopy( self._processing_parameters) self._processing_widget.update_data_model( self._processing_parameters) self._acq_widget.disable_inverse_beam(False) elif isinstance(tree_item, queue_item.DataCollectionQueueItem): dc = tree_item.get_model() if dc.experiment_type != queue_model_enumerables.EXPERIMENT_TYPE.HELICAL: if dc.is_executed(): self.setDisabled(True) else: self.setDisabled(False) sample_data_model = self.get_sample_item(tree_item).get_model() energy_scan_result = sample_data_model.crystals[ 0].energy_scan_result self._acq_widget.set_energies(energy_scan_result) self._acq_widget.disable_inverse_beam(True) self._path_template = dc.get_path_template() self._data_path_widget.update_data_model(self._path_template) self._acquisition_parameters = dc.acquisitions[ 0].acquisition_parameters self._acq_widget.update_data_model( self._acquisition_parameters, self._path_template) self.get_acquisition_widget().use_osc_start(True) if len(dc.acquisitions) == 1: self.select_shape_with_cpos(self._acquisition_parameters.\ centred_position) self._processing_parameters = dc.processing_parameters self._processing_widget.update_data_model( self._processing_parameters) else: self.setDisabled(True) else: self.setDisabled(True) def approve_creation(self): result = CreateTaskBase.approve_creation(self) selected_shapes = self._shape_history.selected_shapes for shape in selected_shapes: if isinstance(shape, shape_history.Line): result = False return result # 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): tasks = [] if not shape: cpos = qmo.CentredPosition() cpos.snapshot_image = self._shape_history.get_snapshot([]) else: # Shapes selected and sample is mounted, get the # centred positions for the shapes if isinstance(shape, shape_history.Point): snapshot = self._shape_history.\ get_snapshot([shape.qub_point]) cpos = copy.deepcopy(shape.get_centred_positions()[0]) cpos.snapshot_image = snapshot if self._acq_widget.use_inverse_beam(): total_num_images = self._acquisition_parameters.num_images subwedge_size = self._acq_widget.get_num_subwedges() osc_range = self._acquisition_parameters.osc_range osc_start = self._acquisition_parameters.osc_start run_number = self._path_template.run_number subwedges = qmo.create_inverse_beam_sw(total_num_images, subwedge_size, osc_range, osc_start, run_number) self._acq_widget.set_use_inverse_beam(False) for sw in subwedges: tasks.extend( self.create_dc(sample, sw[3], sw[0], sw[1], sw[2], cpos=cpos, inverse_beam=True)) self._path_template.run_number += 1 else: tasks.extend(self.create_dc(sample, cpos=cpos)) self._path_template.run_number += 1 return tasks def create_dc(self, sample, run_number=None, start_image=None, num_images=None, osc_start=None, sc=None, cpos=None, inverse_beam=False): tasks = [] # Acquisition for start position acq = qmo.Acquisition() acq.acquisition_parameters = \ copy.deepcopy(self._acquisition_parameters) acq.acquisition_parameters.collect_agent = \ queue_model_enumerables.COLLECTION_ORIGIN.MXCUBE acq.path_template = copy.deepcopy(self._path_template) acq.acquisition_parameters.centred_position = cpos if '<sample_name>' in acq.path_template.directory: name = sample.get_name().replace(':', '-') acq.path_template.directory = acq.path_template.directory.\ replace('<sample_name>', name) acq.path_template.process_directory = acq.path_template.process_directory.\ replace('<sample_name>', name) if '<acronym>-<name>' in acq.path_template.base_prefix: acq.path_template.base_prefix = self.get_default_prefix(sample) acq.path_template.run_numer = self._beamline_setup_hwobj.queue_model_hwobj.\ get_next_run_number(acq.path_template) if run_number: acq.path_template.run_number = run_number if start_image: acq.acquisition_parameters.first_image = start_image acq.path_template.start_num = start_image if num_images: acq.acquisition_parameters.num_images = num_images acq.path_template.num_files = num_images if osc_start: acq.acquisition_parameters.osc_start = osc_start if inverse_beam: acq.acquisition_parameters.inverse_beam = False if self._beamline_setup_hwobj.in_plate_mode(): acq.acquisition_parameters.take_snapshots = False else: acq.acquisition_parameters.take_snapshots = True processing_parameters = copy.deepcopy(self._processing_parameters) dc = qmo.DataCollection([acq], sample.crystals[0], processing_parameters) dc.set_name(acq.path_template.get_prefix()) dc.set_number(acq.path_template.run_number) dc.experiment_type = queue_model_enumerables.EXPERIMENT_TYPE.NATIVE tasks.append(dc) return tasks
class DCParametersWidget(qt.QWidget): def __init__(self, parent=None, name="parameter_widget"): qt.QWidget.__init__(self, parent, name) self._data_collection = None self.add_dc_cb = None self._tree_view_item = None self.queue_model = None self._beamline_setup_hwobj = None self.caution_pixmap = Icons.load("Caution2.png") self.path_widget = DataPathWidget(self, 'dc_params_path_widget') self.acq_gbox = qt.QVGroupBox("Acquisition", self) self.acq_gbox.setInsideMargin(2) self.acq_widget = AcquisitionWidget(self.acq_gbox, layout='horizontal') self.acq_widget.setFixedHeight(170) widget_ui = os.path.join(os.path.dirname(__file__), 'ui_files/snapshot_widget_layout.ui') widget = qtui.QWidgetFactory.create(widget_ui) widget.reparent(self, qt.QPoint(0, 0)) self.position_widget = widget self._processing_gbox = qt.QVGroupBox('Processing', self, 'processing_gbox') self.processing_widget = ProcessingWidget(self._processing_gbox) v_layout = qt.QVBoxLayout(self, 11, 10, "main_layout") rone_hlayout = qt.QHBoxLayout(v_layout, 10, "rone") rone_vlayout = qt.QVBoxLayout(rone_hlayout) rone_sv_layout = qt.QVBoxLayout(rone_hlayout) rone_vlayout.addWidget(self.path_widget) rone_vlayout.addWidget(self.acq_gbox) rtwo_hlayout = qt.QHBoxLayout(rone_vlayout, 10, "rtwo") rone_vlayout.addStretch(10) rone_sv_layout.addWidget(self.position_widget) rone_sv_layout.addStretch(10) rone_hlayout.addStretch() rtwo_hlayout.addWidget(self._processing_gbox) rtwo_hlayout.addStretch(10) v_layout.addStretch() self.connect(self.acq_widget, qt.PYSIGNAL('mad_energy_selected'), self.mad_energy_selected) self.connect( self.path_widget.data_path_widget_layout.child('prefix_ledit'), qt.SIGNAL("textChanged(const QString &)"), self._prefix_ledit_change) self.connect( self.path_widget.data_path_widget_layout.child('run_number_ledit'), qt.SIGNAL("textChanged(const QString &)"), self._run_number_ledit_change) self.connect(self.acq_widget, qt.PYSIGNAL("path_template_changed"), self.handle_path_conflict) self.connect(self.path_widget, qt.PYSIGNAL("path_template_changed"), self.handle_path_conflict) qt.QObject.connect(qt.qApp, qt.PYSIGNAL('tab_changed'), self.tab_changed) def set_beamline_setup(self, bl_setup): self.acq_widget.set_beamline_setup(bl_setup) self._beamline_setup_hwobj = bl_setup def _prefix_ledit_change(self, new_value): prefix = self._data_collection.acquisitions[0].\ path_template.get_prefix() self._data_collection.set_name(prefix) self._tree_view_item.setText(0, self._data_collection.get_name()) def _run_number_ledit_change(self, new_value): if str(new_value).isdigit(): self._data_collection.set_number(int(new_value)) self._tree_view_item.setText(0, self._data_collection.get_name()) def handle_path_conflict(self, widget, new_value): dc_tree_widget = self._tree_view_item.listView().parent() dc_tree_widget.check_for_path_collisions() path_template = self._data_collection.acquisitions[0].path_template path_conflict = self.queue_model_hwobj.\ check_for_path_collisions(path_template) if new_value != '': if path_conflict: logging.getLogger("user_level_log").\ error('The current path settings will overwrite data' +\ ' from another task. Correct the problem before collecting') widget.setPaletteBackgroundColor(widget_colors.LIGHT_RED) else: widget.setPaletteBackgroundColor(widget_colors.WHITE) def __add_data_collection(self): return self.add_dc_cb(self._data_collection, self.collection_type) def mad_energy_selected(self, name, energy, state): path_template = self._data_collection.acquisitions[0].path_template if state: path_template.mad_prefix = name else: path_template.mad_prefix = '' run_number = self._beamline_setup_hwobj.queue_model_hwobj.\ get_next_run_number(path_template) self.path_widget.set_run_number(run_number) self.path_widget.set_prefix(path_template.base_prefix) model = self._tree_view_item.get_model() model.set_name(path_template.get_prefix()) self._tree_view_item.setText(0, model.get_name()) def tab_changed(self): if self._tree_view_item: self.populate_parameter_widget(self._tree_view_item) def set_enabled(self, state): self.acq_gbox.setEnabled(state) self.path_widget.setEnabled(state) self._processing_gbox.setEnabled(state) def populate_parameter_widget(self, item): data_collection = item.get_model() self._tree_view_item = item self._data_collection = data_collection self._acquisition_mib = DataModelInputBinder(self._data_collection.\ acquisitions[0].acquisition_parameters) # The acq_widget sends a signal to the path_widget, and it relies # on that both models upto date, we need to refactor this part # so that both models are set before taking ceratin actions. # This workaround, works for the time beeing. self.path_widget._data_model = data_collection.acquisitions[ 0].path_template self.acq_widget.set_energies( data_collection.crystal.energy_scan_result) self.acq_widget.update_data_model(data_collection.acquisitions[0].\ acquisition_parameters, data_collection.acquisitions[0].\ path_template) self.acq_widget.use_osc_start(True) self.path_widget.update_data_model(data_collection.\ acquisitions[0].path_template) self.processing_widget.update_data_model(data_collection.\ processing_parameters) if data_collection.acquisitions[0].acquisition_parameters.\ centred_position.snapshot_image: image = data_collection.acquisitions[0].\ acquisition_parameters.centred_position.snapshot_image image = image.scale(427, 320) self.position_widget.child("svideo").setPixmap(qt.QPixmap(image)) invalid = self._acquisition_mib.validate_all() if invalid: msg = "This data collection has one or more incorrect parameters,"+\ " correct the fields marked in red to solve the problem." logging.getLogger("user_level_log").\ warning(msg)
class XRFSpectrumParametersWidget(qt.QWidget): def __init__(self, parent=None, name="xrf_spectrum_tab_widget"): qt.QWidget.__init__(self, parent, name) # Data Attributes self.xrf_spectrum_hwobj = None self.xrf_spectrum = queue_model_objects.XRFSpectrum() self._tree_view_item = None self.data_path_widget = DataPathWidget(self) self.other_parameters_gbox = qt.QHGroupBox("Other parameters", self) self.count_time_label = qt.QLabel("Count time:", self.other_parameters_gbox) self.count_time_ledit = qt.QLineEdit( self.other_parameters_gbox, "count_time_ledit" ) self.count_time_ledit.setFixedWidth(50) spacer = qt.QWidget(self.other_parameters_gbox) spacer.setSizePolicy(qt.QSizePolicy.Expanding, qt.QSizePolicy.Fixed) widget_ui = os.path.join( os.path.dirname(__file__), "ui_files/snapshot_widget_layout.ui" ) widget = qtui.QWidgetFactory.create(widget_ui) widget.reparent(self, qt.QPoint(0, 0)) self.position_widget = widget self.position_widget.setFixedSize(457, 350) # self.position_widget.setSizePolicy(qt.QSizePolicy.Fixed, qt.QSizePolicy.Fixed) self.mca_spectrum = McaSpectrumBrick(self) self.mca_spectrum.setSizePolicy( qt.QSizePolicy.Expanding, qt.QSizePolicy.Expanding ) self.mca_spectrum.setMinimumHeight(700) v_layout = qt.QVBoxLayout(self) rone_hlayout = qt.QHBoxLayout(v_layout) rone_vlayout = qt.QVBoxLayout(rone_hlayout) rone_sv_layout = qt.QVBoxLayout(rone_hlayout) rone_vlayout.addWidget(self.data_path_widget) rone_vlayout.addWidget(self.other_parameters_gbox) rone_vlayout.addStretch() rone_sv_layout.addWidget(self.position_widget) rone_sv_layout.addStretch() v_layout.addWidget(self.mca_spectrum) v_layout.addStretch() qt.QObject.connect( self.data_path_widget.data_path_widget_layout.child("prefix_ledit"), qt.SIGNAL("textChanged(const QString &)"), self._prefix_ledit_change, ) qt.QObject.connect( self.data_path_widget.data_path_widget_layout.child("run_number_ledit"), qt.SIGNAL("textChanged(const QString &)"), self._run_number_ledit_change, ) qt.QObject.connect( self.count_time_ledit, qt.SIGNAL("textChanged(const QString &)"), self._count_time_ledit_change, ) qt.QObject.connect(qt.qApp, qt.PYSIGNAL("tab_changed"), self.tab_changed) def _prefix_ledit_change(self, new_value): self.xrf_spectrum.set_name(str(new_value)) self._tree_view_item.setText(0, self.xrf_spectrum.get_display_name()) def _run_number_ledit_change(self, new_value): if str(new_value).isdigit(): self.xrf_spectrum.set_number(int(new_value)) self._tree_view_item.setText(0, self.xrf_spectrum.get_display_name()) def _count_time_ledit_change(self, new_value): if str(new_value).isdigit(): self.xrf_spectrum.set_count_time(float(new_value)) def tab_changed(self): if self._tree_view_item: self.populate_widget(self._tree_view_item) def populate_widget(self, item): self._tree_view_item = item self.xrf_spectrum = item.get_model() self.data_path_widget.update_data_model(self.xrf_spectrum.path_template) self.count_time_ledit.setText(str(self.xrf_spectrum.count_time)) executed = self.xrf_spectrum.is_executed() self.data_path_widget.setEnabled(not executed) self.other_parameters_gbox.setEnabled(not executed) self.mca_spectrum.setEnabled(executed) image = self.xrf_spectrum.centred_position.snapshot_image if image: try: w = image.width() h = image.height() ratio = w / float(h) h2 = ( self.data_path_widget.height() + self.other_parameters_gbox.height() ) w2 = h2 * ratio image = image.scale(w2, h2) self.position_widget.child("svideo").setPixmap(qt.QPixmap(image)) except BaseException: pass def set_xrf_spectrum_hwobj(self, xrf_spectrum_hwobj): self.xrf_spectrum_hwobj = xrf_spectrum_hwobj if self.xrf_spectrum_hwobj: self.xrf_spectrum_hwobj.connect( "xrfSpectrumFinished", self.spectrum_finished ) def spectrum_finished(self, mcaData, mcaCalib, mcaConfig): self.mca_spectrum.setData(mcaData, mcaCalib, mcaConfig)
class CreateHelicalWidget(CreateTaskBase): def __init__(self, parent = None,name = None, fl = 0): CreateTaskBase.__init__(self, parent, name, fl, 'Helical') if not name: self.setName("create_helical_widget") # # Data attributes # self.init_models() self._prev_pos = None self._current_pos = None self._list_item_map = {} self.init_models() # # Layout # v_layout = qt.QVBoxLayout(self, 2, 5, "v_layout") self._lines_gbox = qt.QGroupBox('Lines', self, "lines_gbox") self._lines_gbox.setColumnLayout(0, qt.Qt.Vertical) self._lines_gbox.layout().setSpacing(6) self._lines_gbox.layout().setMargin(11) lines_gbox_layout = qt.QHBoxLayout(self._lines_gbox.layout()) lines_gbox_layout.setAlignment(qt.Qt.AlignTop) self._list_box = qt.QListBox(self._lines_gbox, "helical_page") self._list_box.setSelectionMode(qt.QListBox.Extended) self._list_box.setFixedWidth(200) self._list_box.setFixedHeight(75) list_box_tool_tip = "Select the line(s) to perfrom helical scan on" qt.QToolTip.add(self._list_box, list_box_tool_tip) lines_gbox_layout.addWidget(self._list_box) button_layout = qt.QVBoxLayout(None, 0, 6, "button_layout") button_layout.setSpacing(5) add_button = qt.QPushButton("+", self._lines_gbox, "add_button") add_button.setFixedWidth(20) add_button.setFixedHeight(20) remove_button = qt.QPushButton("-", self._lines_gbox, "add_button") remove_button.setFixedWidth(20) remove_button.setFixedHeight(20) button_layout.addWidget(add_button) button_layout.addWidget(remove_button) lines_gbox_layout.addLayout(button_layout) add_button_tool_tip = "Add a line between two saved positions, " \ "CTRL click to select more than one position" qt.QToolTip.add(add_button, add_button_tool_tip) remove_button_tool_tip = "Remove selected line(s)" qt.QToolTip.add(remove_button, remove_button_tool_tip) self._acq_gbox = qt.QVGroupBox('Acquisition', self, 'acq_gbox') self._acq_widget = \ AcquisitionWidget(self._acq_gbox, "acquisition_widget", layout='vertical', acq_params=self._acquisition_parameters, path_template=self._path_template) self._acq_widget.disable_inverse_beam(True) self._data_path_gbox = qt.QVGroupBox('Data location', self, 'data_path_gbox') self._data_path_widget = \ DataPathWidget(self._data_path_gbox, data_model = self._path_template, layout = 'vertical') self._processing_gbox = qt.QVGroupBox('Processing', self, 'processing_gbox') self._processing_widget = \ ProcessingWidget(self._processing_gbox, data_model = self._processing_parameters) v_layout.addWidget(self._lines_gbox) v_layout.addWidget(self._acq_gbox) v_layout.addWidget(self._data_path_gbox) v_layout.addWidget(self._processing_gbox) qt.QObject.connect(add_button, qt.SIGNAL("clicked()"), self.add_clicked) qt.QObject.connect(remove_button, qt.SIGNAL("clicked()"), self.remove_clicked) qt.QObject.connect(self._list_box, qt.SIGNAL("selectionChanged()"), self.list_box_selection_changed) prefix_ledit = self._data_path_widget.\ data_path_widget_layout.child('prefix_ledit') run_number_ledit = self._data_path_widget.\ data_path_widget_layout.child('run_number_ledit') self.connect(prefix_ledit, qt.SIGNAL("textChanged(const QString &)"), self._prefix_ledit_change) self.connect(run_number_ledit, qt.SIGNAL("textChanged(const QString &)"), self._run_number_ledit_change) self.connect(self._data_path_widget, qt.PYSIGNAL("path_template_changed"), self.handle_path_conflict) def init_models(self): CreateTaskBase.init_models(self) self._energy_scan_result = qmo.EnergyScanResult() self._processing_parameters = qmo.ProcessingParameters() if self._beamline_setup_hwobj is not None: has_shutter_less = self._beamline_setup_hwobj.\ detector_has_shutterless() self._acquisition_parameters.shutterless = has_shutter_less self._acquisition_parameters = self._beamline_setup_hwobj.\ get_default_acquisition_parameters("default_helical_values") else: self._acquisition_parameters = qmo.AcquisitionParameters() self._path_template = qmo.PathTemplate() def add_clicked(self): selected_shapes = list(self._shape_history.selected_shapes.values()) if len(selected_shapes) == 2: p1 = selected_shapes[0] p2 = selected_shapes[1] line = shape_history.\ Line(self._shape_history.get_drawing(), p1.qub_point, p2.qub_point, p1.centred_position, p2.centred_position) line.show() self._shape_history.add_shape(line) points_index = line.get_points_index() if points_index: display_name = "Line (points: %d, %d)" % \ (points_index[0], points_index[1]) else: display_name = "Line (points: #, #)" list_box_item = qt.QListBoxText(self._list_box, display_name) #list_box_item = qt.QListBoxText(self._list_box, 'Line') self._list_item_map[list_box_item] = line # De select previous items for item in self.selected_items(): self._list_box.setSelected(item, False) self._list_box.setSelected(list_box_item, True) def remove_clicked(self): selected_items = self.selected_items() if selected_items: for item in selected_items: self._list_box.removeItem(self._list_box.index(item)) line = self._list_item_map[item] self._shape_history.delete_shape(line) del self._list_item_map[item] # Calback from shape_history, called when a shape is deleted def shape_deleted(self, shape): if isinstance(shape, shape_history.Point): items_to_remove = [] for (list_item, line) in self._list_item_map.items(): for qub_object in shape.get_qub_objects(): if qub_object in line.get_qub_objects(): items_to_remove.append((list_item, line)) for (list_item, line) in items_to_remove: self._list_box.removeItem(self._list_box.index(list_item)) del self._list_item_map[list_item] def centred_position_selection(self, positions): if len(positions) == 1: self._prev_pos = positions[0] elif len(positions) == 2: for pos in positions: if pos != self._prev_pos: self._current_pos = pos else: self._prev_pos = None self._current_pos = None self._list_box.clearSelection() def list_box_selection_changed(self): self.show_selected_lines() def selected_items(self): selected_items = [] for item_index in range(0, self._list_box.numRows()): if self._list_box.isSelected(item_index): selected_items.append(self._list_box.item(item_index)) return selected_items def show_selected_lines(self): selected_items = self.selected_items() for list_item in list(self._list_item_map.keys()): line = self._list_item_map[list_item] if list_item in selected_items: self._shape_history.select_shape(line) else: self._shape_history.de_select_shape(line) def approve_creation(self): base_result = CreateTaskBase.approve_creation(self) selected_lines = False if self.selected_items(): selected_lines = True else: logging.getLogger("user_level_log").\ warning("No lines selected, please select one or more lines.") return base_result and selected_lines def update_processing_parameters(self, crystal): self._processing_parameters.space_group = crystal.space_group self._processing_parameters.cell_a = crystal.cell_a self._processing_parameters.cell_alpha = crystal.cell_alpha self._processing_parameters.cell_b = crystal.cell_b self._processing_parameters.cell_beta = crystal.cell_beta self._processing_parameters.cell_c = crystal.cell_c self._processing_parameters.cell_gamma = crystal.cell_gamma self._processing_widget.update_data_model(self._processing_parameters) def select_shape_with_cpos(self, start_cpos, end_cpos): self._shape_history.de_select_all() selected_line = None for shape in self._shape_history.get_shapes(): if isinstance(shape, shape_history.Line): if shape.get_centred_positions()[0] == start_cpos and\ shape.get_centred_positions()[1] == end_cpos: self._shape_history.select_shape(shape) selected_line = shape #de-select previous selected list items and #select the current shape (Line). for (list_item, shape) in self._list_item_map.items(): if selected_line is shape: self._list_box.setSelected(list_item, True) else: self._list_box.setSelected(list_item, False) 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.experiment_type == EXPERIMENT_TYPE.HELICAL: if tree_item.get_model().is_executed(): self.setDisabled(True) else: self.setDisabled(False) 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 self.select_shape_with_cpos(start_cpos, end_cpos) 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): data_collections = [] if isinstance(shape, shape_history.Line ): if shape.get_qub_objects() is not None: snapshot = self._shape_history.get_snapshot(shape.get_qub_objects()) else: snapshot = self._shape_history.get_snapshot([]) # Acquisition for start position start_acq = self._create_acq(sample) start_acq.acquisition_parameters.\ centred_position = copy.deepcopy(shape.start_cpos) start_acq.acquisition_parameters.centred_position.\ snapshot_image = snapshot start_acq.path_template.suffix = self._session_hwobj.suffix # Add another acquisition for the end position end_acq = self._create_acq(sample) end_acq.acquisition_parameters.\ centred_position = shape.end_cpos end_acq.acquisition_parameters.centred_position.\ snapshot_image = snapshot end_acq.path_template.suffix = self._session_hwobj.suffix processing_parameters = copy.deepcopy(self._processing_parameters) dc = qmo.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.experiment_type = EXPERIMENT_TYPE.HELICAL data_collections.append(dc) self._path_template.run_number += 1 return data_collections
def __init__(self, parent=None, name=None, fl=0): CreateTaskBase.__init__(self, parent, name, fl, "Characterisation") if not name: self.setName("create_char_widget") # # Data attributes # self._current_selected_item = None self.init_models() self._char_params_mib = DataModelInputBinder(self._char_params) # # Layout # v_layout = qt.QVBoxLayout(self, 2, 6, "v_layout") self._acq_widget = AcquisitionWidgetSimple( self, acq_params=self._acquisition_parameters, path_template=self._path_template, ) # self._acq_widget.setFixedHeight(170) current_dir = os.path.dirname(__file__) ui_file = "ui_files/vertical_crystal_dimension_widget_layout.ui" widget = qtui.QWidgetFactory.create(os.path.join(current_dir, ui_file)) widget.reparent(self, qt.QPoint(0, 0)) self._vertical_dimension_widget = widget ui_file = "ui_files/characterise_simple_widget_vertical_layout.ui" widget = qtui.QWidgetFactory.create(os.path.join(current_dir, ui_file)) widget.reparent(self, qt.QPoint(0, 0)) self._char_widget = widget self._data_path_gbox = qt.QVGroupBox("Data location", self, "data_path_gbox") self._data_path_widget = DataPathWidget( self._data_path_gbox, data_model=self._path_template, layout="vertical" ) v_layout.addWidget(self._acq_widget) v_layout.addWidget(self._data_path_gbox) v_layout.addWidget(self._char_widget) v_layout.addWidget(self._vertical_dimension_widget) v_layout.addStretch(100) # # Logic # optimised_sad_cbx = self._char_widget.child("optimised_sad_cbx") account_rad_dmg_cbx = self._char_widget.child("account_rad_dmg_cbx") start_comp_cbox = self._char_widget.child("start_comp_cbox") # induced_burn_cbx = self._char_widget.child('induced_burn_cbx') max_vdim_ledit = self._vertical_dimension_widget.child("max_vdim_ledit") min_vdim_ledit = self._vertical_dimension_widget.child("min_vdim_ledit") min_vphi_ledit = self._vertical_dimension_widget.child("min_vphi_ledit") max_vphi_ledit = self._vertical_dimension_widget.child("max_vphi_ledit") space_group_ledit = self._vertical_dimension_widget.child("space_group_ledit") self._char_params_mib.bind_value_update( "opt_sad", optimised_sad_cbx, bool, None ) self._char_params_mib.bind_value_update( "account_rad_damage", account_rad_dmg_cbx, bool, None ) # self._char_params_mib.bind_value_update('determine_rad_params', # induced_burn_cbx, # bool, None) self._char_params_mib.bind_value_update( "strategy_complexity", start_comp_cbox, int, None ) self._char_params_mib.bind_value_update( "max_crystal_vdim", max_vdim_ledit, float, qt.QDoubleValidator(0.0, 1000, 2, self), ) self._char_params_mib.bind_value_update( "min_crystal_vdim", min_vdim_ledit, float, qt.QDoubleValidator(0.0, 1000, 2, self), ) self._char_params_mib.bind_value_update( "min_crystal_vphi", min_vphi_ledit, float, qt.QDoubleValidator(0.0, 1000, 2, self), ) self._char_params_mib.bind_value_update( "max_crystal_vphi", max_vphi_ledit, float, qt.QDoubleValidator(0.0, 1000, 2, self), ) space_group_ledit.insertStrList(queue_model_enumerables.XTAL_SPACEGROUPS) prefix_ledit = self._data_path_widget.data_path_widget_layout.child( "prefix_ledit" ) run_number_ledit = self._data_path_widget.data_path_widget_layout.child( "run_number_ledit" ) self.connect( prefix_ledit, qt.SIGNAL("textChanged(const QString &)"), self._prefix_ledit_change, ) self.connect( run_number_ledit, qt.SIGNAL("textChanged(const QString &)"), self._run_number_ledit_change, ) self.connect( space_group_ledit, qt.SIGNAL("activated(int)"), self._space_group_change ) self.connect( self._data_path_widget, qt.PYSIGNAL("path_template_changed"), self.handle_path_conflict, )
def __init__(self, parent=None, name="xrf_spectrum_tab_widget"): qt.QWidget.__init__(self, parent, name) # Data Attributes self.xrf_spectrum_hwobj = None self.xrf_spectrum = queue_model_objects.XRFSpectrum() self._tree_view_item = None self.data_path_widget = DataPathWidget(self) self.other_parameters_gbox = qt.QHGroupBox("Other parameters", self) self.count_time_label = qt.QLabel("Count time:", self.other_parameters_gbox) self.count_time_ledit = qt.QLineEdit( self.other_parameters_gbox, "count_time_ledit" ) self.count_time_ledit.setFixedWidth(50) spacer = qt.QWidget(self.other_parameters_gbox) spacer.setSizePolicy(qt.QSizePolicy.Expanding, qt.QSizePolicy.Fixed) widget_ui = os.path.join( os.path.dirname(__file__), "ui_files/snapshot_widget_layout.ui" ) widget = qtui.QWidgetFactory.create(widget_ui) widget.reparent(self, qt.QPoint(0, 0)) self.position_widget = widget self.position_widget.setFixedSize(457, 350) # self.position_widget.setSizePolicy(qt.QSizePolicy.Fixed, qt.QSizePolicy.Fixed) self.mca_spectrum = McaSpectrumBrick(self) self.mca_spectrum.setSizePolicy( qt.QSizePolicy.Expanding, qt.QSizePolicy.Expanding ) self.mca_spectrum.setMinimumHeight(700) v_layout = qt.QVBoxLayout(self) rone_hlayout = qt.QHBoxLayout(v_layout) rone_vlayout = qt.QVBoxLayout(rone_hlayout) rone_sv_layout = qt.QVBoxLayout(rone_hlayout) rone_vlayout.addWidget(self.data_path_widget) rone_vlayout.addWidget(self.other_parameters_gbox) rone_vlayout.addStretch() rone_sv_layout.addWidget(self.position_widget) rone_sv_layout.addStretch() v_layout.addWidget(self.mca_spectrum) v_layout.addStretch() qt.QObject.connect( self.data_path_widget.data_path_widget_layout.child("prefix_ledit"), qt.SIGNAL("textChanged(const QString &)"), self._prefix_ledit_change, ) qt.QObject.connect( self.data_path_widget.data_path_widget_layout.child("run_number_ledit"), qt.SIGNAL("textChanged(const QString &)"), self._run_number_ledit_change, ) qt.QObject.connect( self.count_time_ledit, qt.SIGNAL("textChanged(const QString &)"), self._count_time_ledit_change, ) qt.QObject.connect(qt.qApp, qt.PYSIGNAL("tab_changed"), self.tab_changed)
class CreateCharWidget(CreateTaskBase): def __init__(self,parent = None,name = None, fl = 0): CreateTaskBase.__init__(self, parent, name, fl, 'Characterisation') if not name: self.setName("create_char_widget") # # Data attributes # self._current_selected_item = None self.init_models() self._char_params_mib = DataModelInputBinder(self._char_params) # # Layout # v_layout = qt.QVBoxLayout(self, 2, 6, "v_layout") self._acq_widget = \ AcquisitionWidgetSimple(self, acq_params = self._acquisition_parameters, path_template = self._path_template) current_dir = os.path.dirname(__file__) ui_file = 'ui_files/vertical_crystal_dimension_widget_layout.ui' widget = qtui.QWidgetFactory.\ create(os.path.join(current_dir, ui_file)) widget.reparent(self, qt.QPoint(0,0)) self._vertical_dimension_widget = widget ui_file = 'ui_files/characterise_simple_widget_vertical_layout.ui' widget = qtui.QWidgetFactory.\ create(os.path.join(current_dir, ui_file)) widget.reparent(self, qt.QPoint(0,0)) self._char_widget = widget self._data_path_gbox = \ qt.QVGroupBox('Data location', self, 'data_path_gbox') self._data_path_widget = \ DataPathWidget(self._data_path_gbox, data_model = self._path_template, layout = DataPathWidgetVerticalLayout) v_layout.addWidget(self._acq_widget) v_layout.addWidget(self._char_widget) v_layout.addWidget(self._vertical_dimension_widget) v_layout.addWidget(self._data_path_gbox) v_layout.addStretch(10) # # Logic # optimised_sad_cbx = self._char_widget.\ child('optimised_sad_cbx') account_rad_dmg_cbx = self._char_widget.\ child('account_rad_dmg_cbx') start_comp_cbox = self._char_widget.child('start_comp_cbox') induced_burn_cbx = self._char_widget.child('induced_burn_cbx') max_vdim_ledit = self._vertical_dimension_widget.\ child('max_vdim_ledit') min_vdim_ledit = self._vertical_dimension_widget.\ child('min_vdim_ledit') min_vphi_ledit = self._vertical_dimension_widget.\ child('min_vphi_ledit') max_vphi_ledit = self._vertical_dimension_widget.\ child('max_vphi_ledit') space_group_ledit = self._vertical_dimension_widget.\ child('space_group_ledit') self._char_params_mib.bind_value_update('opt_sad', optimised_sad_cbx, bool, None) self._char_params_mib.bind_value_update('account_rad_damage', account_rad_dmg_cbx, bool, None) self._char_params_mib.bind_value_update('determine_rad_params', induced_burn_cbx, bool, None) self._char_params_mib.bind_value_update('strategy_complexity', start_comp_cbox, int, None) self._char_params_mib.\ bind_value_update('max_crystal_vdim', max_vdim_ledit, float, qt.QDoubleValidator(0.0, 1000, 2, self)) self._char_params_mib.\ bind_value_update('min_crystal_vdim', min_vdim_ledit, float, qt.QDoubleValidator(0.0, 1000, 2, self)) self._char_params_mib.\ bind_value_update('min_crystal_vphi', min_vphi_ledit, float, qt.QDoubleValidator(0.0, 1000, 2, self)) self._char_params_mib.\ bind_value_update('max_crystal_vphi', max_vphi_ledit, float, qt.QDoubleValidator(0.0, 1000, 2, self)) space_group_ledit.insertStrList(XTAL_SPACEGROUPS) prefix_ledit = self._data_path_widget.\ data_path_widget_layout.prefix_ledit run_number_ledit = self._data_path_widget.\ data_path_widget_layout.run_number_ledit self.connect(prefix_ledit, qt.SIGNAL("textChanged(const QString &)"), self._prefix_ledit_change) self.connect(run_number_ledit, qt.SIGNAL("textChanged(const QString &)"), self._run_number_ledit_change) self.connect(space_group_ledit, qt.SIGNAL("activated(int)"), self._space_group_change) self.connect(self._data_path_widget, qt.PYSIGNAL("path_template_changed"), self.handle_path_conflict) self.connect(induced_burn_cbx, qt.SIGNAL("toggled(bool)"), self.use_induced_burn) def use_induced_burn(self, state): self._acquisition_parameters.induce_burn = state def _space_group_change(self, index): self._char_params.space_group = queue_model_enumerables.\ XTAL_SPACEGROUPS[index] def _set_space_group(self, space_group): index = 0 if space_group in XTAL_SPACEGROUPS: index = XTAL_SPACEGROUPS.index(space_group) self._space_group_change(index) self._vertical_dimension_widget.\ child('space_group_ledit').setCurrentItem(index) def init_models(self): CreateTaskBase.init_models(self) self._char = queue_model_objects.Characterisation() self._char_params = self._char.characterisation_parameters self._char_params.experiment_type = queue_model_enumerables.EXPERIMENT_TYPE.OSC self._processing_parameters = queue_model_objects.ProcessingParameters() if self._beamline_setup_hwobj is not None: self._acquisition_parameters = self._beamline_setup_hwobj.\ get_default_characterisation_parameters() try: transmission = self._beamline_setup_hwobj.transmission_hwobj.getAttFactor() transmission = round(float(transmission), 1) except AttributeError: transmission = 0 try: resolution = self._beamline_setup_hwobj.resolution_hwobj.getPosition() resolution = round(float(resolution), 4) except AttributeError: resolution = 0 try: energy = self._beamline_setup_hwobj.energy_hwobj.getCurrentEnergy() energy = round(float(energy), 2) except AttributeError: energy = 0 self._acquisition_parameters.resolution = resolution self._acquisition_parameters.energy = energy self._acquisition_parameters.transmission = transmission else: self._acquisition_parameters = queue_model_objects.AcquisitionParameters() self._path_template.reference_image_prefix = 'ref' # The num images drop down default value is 1 # we would like it to be 2 self._acquisition_parameters.num_images = 2 self._char.characterisation_software =\ queue_model_enumerables.COLLECTION_ORIGIN.EDNA self._path_template.num_files = 2 self._acquisition_parameters.shutterless = False def single_item_selection(self, tree_item): CreateTaskBase.single_item_selection(self, tree_item) if isinstance(tree_item, queue_item.SampleQueueItem) or \ isinstance(tree_item, queue_item.DataCollectionGroupQueueItem): self._char_params = copy.deepcopy(self._char_params) self._acquisition_parameters = copy.deepcopy(self._acquisition_parameters) elif isinstance(tree_item, queue_item.CharacterisationQueueItem): self.setDisabled(False) self._char = tree_item.get_model() if self._char.get_path_template(): self._path_template = self._char.get_path_template() self._data_path_widget.update_data_model(self._path_template) data_collection = self._char.reference_image_collection self._char_params = self._char.characterisation_parameters self._acquisition_parameters = data_collection.acquisitions[0].\ acquisition_parameters if len(data_collection.acquisitions) == 1: self.select_shape_with_cpos(self._acquisition_parameters.\ centred_position) self._processing_parameters = data_collection.processing_parameters else: self.setDisabled(True) if isinstance(tree_item, queue_item.SampleQueueItem) or \ isinstance(tree_item, queue_item.DataCollectionGroupQueueItem) or \ isinstance(tree_item, queue_item.CharacterisationQueueItem): self._set_space_group(self._char_params.space_group) self._acq_widget.update_data_model(self._acquisition_parameters, self._path_template) self._char_params_mib.set_model(self._char_params) def update_processing_parameters(self, crystal): self._processing_parameters.space_group = crystal.space_group self._char_params.space_group = crystal.space_group self._processing_parameters.cell_a = crystal.cell_a self._processing_parameters.cell_alpha = crystal.cell_alpha self._processing_parameters.cell_b = crystal.cell_b self._processing_parameters.cell_beta = crystal.cell_beta self._processing_parameters.cell_c = crystal.cell_c self._processing_parameters.cell_gamma = crystal.cell_gamma def approve_creation(self): return CreateTaskBase.approve_creation(self) # 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): tasks = [] if not shape: cpos = queue_model_objects.CentredPosition() cpos.snapshot_image = self._shape_history.get_snapshot([]) else: # Shapes selected and sample is mounted, get the # centred positions for the shapes if isinstance(shape, shape_history.Point): snapshot = self._shape_history.\ get_snapshot([shape.qub_point]) cpos = shape.get_centred_positions()[0] cpos.snapshot_image = snapshot char_params = copy.deepcopy(self._char_params) # Acquisition for start position acq = queue_model_objects.Acquisition() acq.acquisition_parameters = \ copy.deepcopy(self._acquisition_parameters) acq.acquisition_parameters.collect_agent = \ queue_model_enumerables.COLLECTION_ORIGIN.MXCUBE acq.acquisition_parameters.centred_position = cpos acq.path_template = copy.deepcopy(self._path_template) if '<sample_name>' in acq.path_template.directory: name = sample.get_name().replace(':', '-') acq.path_template.directory = acq.path_template.directory.\ replace('<sample_name>', name) acq.path_template.process_directory = acq.path_template.process_directory.\ replace('<sample_name>', name) if '<acronym>-<name>' in acq.path_template.base_prefix: acq.path_template.base_prefix = self.get_default_prefix(sample) acq.path_template.run_numer = self._beamline_setup_hwobj.queue_model_hwobj.\ get_next_run_number(acq.path_template) processing_parameters = copy.deepcopy(self._processing_parameters) data_collection = queue_model_objects.\ DataCollection([acq], sample.crystals[0], processing_parameters) # Referance images for characterisations should be taken 90 deg apart # this is achived by setting overap to -89 acq.acquisition_parameters.overlap = -89 data_collection.acquisitions[0] = acq data_collection.experiment_type = queue_model_enumerables.EXPERIMENT_TYPE.EDNA_REF char = queue_model_objects.Characterisation(data_collection, char_params) char.set_name(data_collection.acquisitions[0].\ path_template.get_prefix()) char.set_number(data_collection.acquisitions[0].\ path_template.run_number) tasks.append(char) self._path_template.run_number += 1 return tasks
class CreateEnergyScanWidget(CreateTaskBase): def __init__(self, parent = None, name = None, fl = 0): CreateTaskBase.__init__(self, parent, name, fl, 'Energy-scan') # Data attributes self.init_models() #Layout v_layout = qt.QVBoxLayout(self, 2, 5, "main_v_layout") h_box = qt.QHGroupBox('Available elements', self) self.periodic_table = PeriodicTableBrick(h_box) font = self.periodic_table.font() font.setPointSize(8) self.periodic_table.setFont(font) h_box.setMaximumWidth(454) h_box.setMaximumHeight(300) self._data_path_gbox = qt.QVGroupBox('Data location', self, 'data_path_gbox') self._data_path_widget = DataPathWidget(self._data_path_gbox, data_model = self._path_template, layout = DataPathWidgetVerticalLayout) v_layout.addWidget(h_box) v_layout.addWidget(self._data_path_gbox) v_layout.addStretch() self.connect(self._data_path_widget.data_path_widget_layout.prefix_ledit, qt.SIGNAL("textChanged(const QString &)"), self._prefix_ledit_change) self.connect(self._data_path_widget.data_path_widget_layout.run_number_ledit, qt.SIGNAL("textChanged(const QString &)"), self._run_number_ledit_change) self.connect(self._data_path_widget, qt.PYSIGNAL("path_template_changed"), self.handle_path_conflict) 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' def set_energy_scan_hwobj(self, energy_hwobj): self.periodic_table.periodicTable.\ setElements(energy_hwobj.getElements()) 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): 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_edge = False if self.periodic_table.current_edge: selected_edge = True else: logging.getLogger("user_level_log").\ info("No element selected, please select an element.") return base_result and selected_edge # Called by the owning widget (task_toolbox_widget) to create # a collection. When a data collection group is selected. def _create_task(self, sample): data_collections = [] if self.periodic_table.current_edge: path_template = copy.deepcopy(self._path_template) if '<sample_name>' in path_template.directory: name = sample.get_name().replace(':', '-') path_template.directory = path_template.directory.\ replace('<sample_name>', name) path_template.process_directory = path_template.process_directory.\ replace('<sample_name>', name) if '<acronym>-<name>' in path_template.base_prefix: path_template.base_prefix = self.get_default_prefix(sample) path_template.run_numer = self._beamline_setup_hwobj.queue_model_hwobj.\ get_next_run_number(path_template) energy_scan = queue_model_objects.EnergyScan(sample, path_template) energy_scan.set_name(path_template.get_prefix()) energy_scan.set_number(path_template.run_number) energy_scan.element_symbol = self.periodic_table.current_element energy_scan.edge = self.periodic_table.current_edge data_collections.append(energy_scan) else: logging.getLogger("user_level_log").\ info("No element selected, please select an element.") return data_collections
def __init__(self, parent = None, name = "parameter_widget"): qt.QWidget.__init__(self, parent, name) self._data_collection = None self.add_dc_cb = None self._tree_view_item = None self.queue_model = None self._beamline_setup_hwobj = None self.caution_pixmap = Icons.load("Caution2.png") self.path_widget = DataPathWidget(self, 'dc_params_path_widget') self.acq_gbox = qt.QVGroupBox("Acquisition", self) self.acq_gbox.setInsideMargin(2) self.acq_widget = AcquisitionWidget(self.acq_gbox, layout = 'horizontal') self.acq_widget.setFixedHeight(170) self.position_widget = SnapshotWidgetLayout(self) self._processing_gbox = qt.QVGroupBox('Processing', self, 'processing_gbox') self.processing_widget = ProcessingWidget(self._processing_gbox) v_layout = qt.QVBoxLayout(self, 11, 10, "main_layout") rone_hlayout = qt.QHBoxLayout(v_layout, 10, "rone") rone_vlayout = qt.QVBoxLayout(rone_hlayout) rone_sv_layout = qt.QVBoxLayout(rone_hlayout) rone_vlayout.addWidget(self.path_widget) rone_vlayout.addWidget(self.acq_gbox) rtwo_hlayout = qt.QHBoxLayout(rone_vlayout, 10, "rtwo") rone_vlayout.addStretch(10) rone_sv_layout.addWidget(self.position_widget) rone_sv_layout.addStretch(10) rone_hlayout.addStretch() rtwo_hlayout.addWidget(self._processing_gbox) rtwo_hlayout.addStretch(10) v_layout.addStretch() self.connect(self.acq_widget, qt.PYSIGNAL('mad_energy_selected'), self.mad_energy_selected) self.connect(self.path_widget.data_path_widget_layout.child('prefix_ledit'), qt.SIGNAL("textChanged(const QString &)"), self._prefix_ledit_change) self.connect(self.path_widget.data_path_widget_layout.child('run_number_ledit'), qt.SIGNAL("textChanged(const QString &)"), self._run_number_ledit_change) self.connect(self.acq_widget, qt.PYSIGNAL("path_template_changed"), self.handle_path_conflict) self.connect(self.path_widget, qt.PYSIGNAL("path_template_changed"), self.handle_path_conflict) qt.QObject.connect(qt.qApp, qt.PYSIGNAL('tab_changed'), self.tab_changed)
class CreateCharWidget(CreateTaskBase): def __init__(self, parent=None, name=None, fl=0): CreateTaskBase.__init__(self, parent, name, fl, "Characterisation") if not name: self.setName("create_char_widget") # # Data attributes # self._current_selected_item = None self.init_models() self._char_params_mib = DataModelInputBinder(self._char_params) # # Layout # v_layout = qt.QVBoxLayout(self, 2, 6, "v_layout") self._acq_widget = AcquisitionWidgetSimple( self, acq_params=self._acquisition_parameters, path_template=self._path_template, ) # self._acq_widget.setFixedHeight(170) current_dir = os.path.dirname(__file__) ui_file = "ui_files/vertical_crystal_dimension_widget_layout.ui" widget = qtui.QWidgetFactory.create(os.path.join(current_dir, ui_file)) widget.reparent(self, qt.QPoint(0, 0)) self._vertical_dimension_widget = widget ui_file = "ui_files/characterise_simple_widget_vertical_layout.ui" widget = qtui.QWidgetFactory.create(os.path.join(current_dir, ui_file)) widget.reparent(self, qt.QPoint(0, 0)) self._char_widget = widget self._data_path_gbox = qt.QVGroupBox("Data location", self, "data_path_gbox") self._data_path_widget = DataPathWidget( self._data_path_gbox, data_model=self._path_template, layout="vertical" ) v_layout.addWidget(self._acq_widget) v_layout.addWidget(self._data_path_gbox) v_layout.addWidget(self._char_widget) v_layout.addWidget(self._vertical_dimension_widget) v_layout.addStretch(100) # # Logic # optimised_sad_cbx = self._char_widget.child("optimised_sad_cbx") account_rad_dmg_cbx = self._char_widget.child("account_rad_dmg_cbx") start_comp_cbox = self._char_widget.child("start_comp_cbox") # induced_burn_cbx = self._char_widget.child('induced_burn_cbx') max_vdim_ledit = self._vertical_dimension_widget.child("max_vdim_ledit") min_vdim_ledit = self._vertical_dimension_widget.child("min_vdim_ledit") min_vphi_ledit = self._vertical_dimension_widget.child("min_vphi_ledit") max_vphi_ledit = self._vertical_dimension_widget.child("max_vphi_ledit") space_group_ledit = self._vertical_dimension_widget.child("space_group_ledit") self._char_params_mib.bind_value_update( "opt_sad", optimised_sad_cbx, bool, None ) self._char_params_mib.bind_value_update( "account_rad_damage", account_rad_dmg_cbx, bool, None ) # self._char_params_mib.bind_value_update('determine_rad_params', # induced_burn_cbx, # bool, None) self._char_params_mib.bind_value_update( "strategy_complexity", start_comp_cbox, int, None ) self._char_params_mib.bind_value_update( "max_crystal_vdim", max_vdim_ledit, float, qt.QDoubleValidator(0.0, 1000, 2, self), ) self._char_params_mib.bind_value_update( "min_crystal_vdim", min_vdim_ledit, float, qt.QDoubleValidator(0.0, 1000, 2, self), ) self._char_params_mib.bind_value_update( "min_crystal_vphi", min_vphi_ledit, float, qt.QDoubleValidator(0.0, 1000, 2, self), ) self._char_params_mib.bind_value_update( "max_crystal_vphi", max_vphi_ledit, float, qt.QDoubleValidator(0.0, 1000, 2, self), ) space_group_ledit.insertStrList(queue_model_enumerables.XTAL_SPACEGROUPS) prefix_ledit = self._data_path_widget.data_path_widget_layout.child( "prefix_ledit" ) run_number_ledit = self._data_path_widget.data_path_widget_layout.child( "run_number_ledit" ) self.connect( prefix_ledit, qt.SIGNAL("textChanged(const QString &)"), self._prefix_ledit_change, ) self.connect( run_number_ledit, qt.SIGNAL("textChanged(const QString &)"), self._run_number_ledit_change, ) self.connect( space_group_ledit, qt.SIGNAL("activated(int)"), self._space_group_change ) self.connect( self._data_path_widget, qt.PYSIGNAL("path_template_changed"), self.handle_path_conflict, ) # self.connect(induced_burn_cbx, qt.SIGNAL("toggled(bool)"), # self.use_induced_burn) def use_induced_burn(self, state): self._acquisition_parameters.induce_burn = state def _space_group_change(self, index): self._char_params.space_group = queue_model_enumerables.XTAL_SPACEGROUPS[index] def _set_space_group(self, space_group): index = 0 if space_group in queue_model_enumerables.XTAL_SPACEGROUPS: index = queue_model_enumerables.XTAL_SPACEGROUPS.index(space_group) self._space_group_change(index) self._vertical_dimension_widget.child("space_group_ledit").setCurrentItem(index) def init_models(self): CreateTaskBase.init_models(self) self._init_models() def _init_models(self): self._char = queue_model_objects.Characterisation() self._char_params = self._char.characterisation_parameters self._processing_parameters = queue_model_objects.ProcessingParameters() if self._beamline_setup_hwobj is not None: self._acquisition_parameters = ( self._beamline_setup_hwobj.get_default_char_acq_parameters() ) self._char_params = ( self._beamline_setup_hwobj.get_default_characterisation_parameters() ) try: transmission = ( self._beamline_setup_hwobj.transmission_hwobj.getAttFactor() ) transmission = round(float(transmission), 1) except AttributeError: transmission = 0 try: resolution = self._beamline_setup_hwobj.resolution_hwobj.getPosition() resolution = round(float(resolution), 3) except AttributeError: resolution = 0 try: energy = self._beamline_setup_hwobj.energy_hwobj.getCurrentEnergy() energy = round(float(energy), 4) except AttributeError: energy = 0 self._acquisition_parameters.resolution = resolution self._acquisition_parameters.energy = energy self._acquisition_parameters.transmission = transmission else: self._acquisition_parameters = queue_model_objects.AcquisitionParameters() self._path_template.reference_image_prefix = "ref" # The num images drop down default value is 1 # we would like it to be 2 self._acquisition_parameters.num_images = 2 self._char.characterisation_software = ( queue_model_enumerables.COLLECTION_ORIGIN.EDNA ) self._path_template.num_files = 2 self._acquisition_parameters.shutterless = False def single_item_selection(self, tree_item): CreateTaskBase.single_item_selection(self, tree_item) if isinstance(tree_item, queue_item.SampleQueueItem): self._init_models() self._set_space_group(self._char_params.space_group) self._acq_widget.update_data_model( self._acquisition_parameters, self._path_template ) self._char_params_mib.set_model(self._char_params) # self._char_params = copy.deepcopy(self._char_params) # self._acquisition_parameters = copy.deepcopy(self._acquisition_parameters) elif isinstance(tree_item, queue_item.BasketQueueItem): self.setDisabled(False) elif isinstance(tree_item, queue_item.CharacterisationQueueItem): if tree_item.get_model().is_executed(): self.setDisabled(True) else: self.setDisabled(False) self._char = tree_item.get_model() if self._char.get_path_template(): self._path_template = self._char.get_path_template() self._data_path_widget.update_data_model(self._path_template) data_collection = self._char.reference_image_collection self._char_params = self._char.characterisation_parameters self._char_params_mib.set_model(self._char_params) 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) if len(data_collection.acquisitions) == 1: self.select_shape_with_cpos( self._acquisition_parameters.centred_position ) self._processing_parameters = data_collection.processing_parameters else: self.setDisabled(True) def update_processing_parameters(self, crystal): self._processing_parameters.space_group = crystal.space_group self._char_params.space_group = crystal.space_group self._processing_parameters.cell_a = crystal.cell_a self._processing_parameters.cell_alpha = crystal.cell_alpha self._processing_parameters.cell_b = crystal.cell_b self._processing_parameters.cell_beta = crystal.cell_beta self._processing_parameters.cell_c = crystal.cell_c self._processing_parameters.cell_gamma = crystal.cell_gamma def approve_creation(self): return CreateTaskBase.approve_creation(self) selected_shapes = self._shape_history.selected_shapes for shape in selected_shapes: if isinstance(shape, shape_history.Line): result = False return result # 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): tasks = [] if not shape: cpos = queue_model_objects.CentredPosition() cpos.snapshot_image = self._shape_history.get_snapshot([]) else: # Shapes selected and sample is mounted, get the # centred positions for the shapes if isinstance(shape, shape_history.Point): snapshot = self._shape_history.get_snapshot([shape.qub_point]) # cpos = shape.get_centred_positions()[0] cpos = copy.deepcopy(shape.get_centred_positions()[0]) cpos.snapshot_image = snapshot char_params = copy.deepcopy(self._char_params) acq = self._create_acq(sample) dc = queue_model_objects.DataCollection( [acq], sample.crystals[0], self._processing_parameters ) # Reference images for characterisations should be taken 90 deg apart # this is achived by setting overap to -89 acq.acquisition_parameters.overlap = -89 acq.acquisition_parameters.centred_position = cpos dc.acquisitions[0] = acq dc.experiment_type = queue_model_enumerables.EXPERIMENT_TYPE.EDNA_REF char = queue_model_objects.Characterisation(dc, char_params) char.set_name(dc.acquisitions[0].path_template.get_prefix()) char.set_number(dc.acquisitions[0].path_template.run_number) tasks.append(char) self._path_template.run_number += 1 return tasks
class DCParametersWidget(qt.QWidget): def __init__(self, parent=None, name="parameter_widget"): qt.QWidget.__init__(self, parent, name) self._data_collection = None self.add_dc_cb = None self._tree_view_item = None self.queue_model = None self._beamline_setup_hwobj = None self.caution_pixmap = Icons.load("Caution2.png") self.path_widget = DataPathWidget(self, "dc_params_path_widget") self.acq_gbox = qt.QVGroupBox("Acquisition", self) self.acq_gbox.setInsideMargin(2) self.acq_widget = AcquisitionWidget(self.acq_gbox, layout="horizontal") self.acq_widget.setFixedHeight(170) widget_ui = os.path.join( os.path.dirname(__file__), "ui_files/snapshot_widget_layout.ui" ) widget = qtui.QWidgetFactory.create(widget_ui) widget.reparent(self, qt.QPoint(0, 0)) self.position_widget = widget self._processing_gbox = qt.QVGroupBox("Processing", self, "processing_gbox") self.processing_widget = ProcessingWidget(self._processing_gbox) v_layout = qt.QVBoxLayout(self, 11, 10, "main_layout") rone_hlayout = qt.QHBoxLayout(v_layout, 10, "rone") rone_vlayout = qt.QVBoxLayout(rone_hlayout) rone_sv_layout = qt.QVBoxLayout(rone_hlayout) rone_vlayout.addWidget(self.path_widget) rone_vlayout.addWidget(self.acq_gbox) rtwo_hlayout = qt.QHBoxLayout(rone_vlayout, 10, "rtwo") rone_vlayout.addStretch(10) rone_sv_layout.addWidget(self.position_widget) rone_sv_layout.addStretch(10) rone_hlayout.addStretch() rtwo_hlayout.addWidget(self._processing_gbox) rtwo_hlayout.addStretch(10) v_layout.addStretch() self.connect( self.acq_widget, qt.PYSIGNAL("mad_energy_selected"), self.mad_energy_selected, ) self.connect( self.path_widget.data_path_widget_layout.child("prefix_ledit"), qt.SIGNAL("textChanged(const QString &)"), self._prefix_ledit_change, ) self.connect( self.path_widget.data_path_widget_layout.child("run_number_ledit"), qt.SIGNAL("textChanged(const QString &)"), self._run_number_ledit_change, ) self.connect( self.acq_widget, qt.PYSIGNAL("path_template_changed"), self.handle_path_conflict, ) self.connect( self.path_widget, qt.PYSIGNAL("path_template_changed"), self.handle_path_conflict, ) qt.QObject.connect(qt.qApp, qt.PYSIGNAL("tab_changed"), self.tab_changed) def set_beamline_setup(self, bl_setup): self.acq_widget.set_beamline_setup(bl_setup) self._beamline_setup_hwobj = bl_setup def _prefix_ledit_change(self, new_value): prefix = self._data_collection.acquisitions[0].path_template.get_prefix() self._data_collection.set_name(prefix) self._tree_view_item.setText(0, self._data_collection.get_name()) def _run_number_ledit_change(self, new_value): if str(new_value).isdigit(): self._data_collection.set_number(int(new_value)) self._tree_view_item.setText(0, self._data_collection.get_name()) def handle_path_conflict(self, widget, new_value): dc_tree_widget = self._tree_view_item.listView().parent() dc_tree_widget.check_for_path_collisions() path_template = self._data_collection.acquisitions[0].path_template path_conflict = self.queue_model_hwobj.check_for_path_collisions(path_template) if new_value != "": if path_conflict: logging.getLogger("user_level_log").error( "The current path settings will overwrite data" + " from another task. Correct the problem before collecting" ) widget.setPaletteBackgroundColor(widget_colors.LIGHT_RED) else: widget.setPaletteBackgroundColor(widget_colors.WHITE) def __add_data_collection(self): return self.add_dc_cb(self._data_collection, self.collection_type) def mad_energy_selected(self, name, energy, state): path_template = self._data_collection.acquisitions[0].path_template if state: path_template.mad_prefix = name else: path_template.mad_prefix = "" run_number = self._beamline_setup_hwobj.queue_model_hwobj.get_next_run_number( path_template ) self.path_widget.set_run_number(run_number) self.path_widget.set_prefix(path_template.base_prefix) model = self._tree_view_item.get_model() model.set_name(path_template.get_prefix()) self._tree_view_item.setText(0, model.get_name()) def tab_changed(self): if self._tree_view_item: self.populate_parameter_widget(self._tree_view_item) def set_enabled(self, state): self.acq_gbox.setEnabled(state) self.path_widget.setEnabled(state) self._processing_gbox.setEnabled(state) def populate_parameter_widget(self, item): data_collection = item.get_model() self._tree_view_item = item self._data_collection = data_collection self._acquisition_mib = DataModelInputBinder( self._data_collection.acquisitions[0].acquisition_parameters ) # The acq_widget sends a signal to the path_widget, and it relies # on that both models upto date, we need to refactor this part # so that both models are set before taking ceratin actions. # This workaround, works for the time beeing. self.path_widget._data_model = data_collection.acquisitions[0].path_template self.acq_widget.set_energies(data_collection.crystal.energy_scan_result) self.acq_widget.update_data_model( data_collection.acquisitions[0].acquisition_parameters, data_collection.acquisitions[0].path_template, ) self.acq_widget.use_osc_start(True) self.path_widget.update_data_model( data_collection.acquisitions[0].path_template ) self.processing_widget.update_data_model(data_collection.processing_parameters) if data_collection.acquisitions[ 0 ].acquisition_parameters.centred_position.snapshot_image: image = data_collection.acquisitions[ 0 ].acquisition_parameters.centred_position.snapshot_image image = image.scale(427, 320) self.position_widget.child("svideo").setPixmap(qt.QPixmap(image)) invalid = self._acquisition_mib.validate_all() if invalid: msg = ( "This data collection has one or more incorrect parameters," + " correct the fields marked in red to solve the problem." ) logging.getLogger("user_level_log").warning(msg)
class CreateWorkflowWidget(CreateTaskBase): def __init__(self, parent=None, name=None, fl=0): CreateTaskBase.__init__(self, parent, name, fl, "Workflow") # Data attributes self.workflow_hwobj = None self.workflows = {} self.init_models() # Layout v_layout = qt.QVBoxLayout(self, 2, 5, "main_v_layout") self._workflow_type_gbox = qt.QVGroupBox( "Workflow type", self, "workflow_rtype" ) self._workflow_cbox = qt.QComboBox(self._workflow_type_gbox) self._data_path_gbox = qt.QVGroupBox("Data location", self, "data_path_gbox") self._data_path_widget = DataPathWidget( self._data_path_gbox, data_model=self._path_template, layout="vertical" ) self._data_path_widget.data_path_widget_layout.child("file_name_label").setText( "" ) self._data_path_widget.data_path_widget_layout.child( "file_name_value_label" ).hide() # self._grid_widget = MxLookupScanBrick.MxLookupScanBrick(self, 'grid_widget') v_layout.addWidget(self._workflow_type_gbox) v_layout.addWidget(self._data_path_gbox) # v_layout.addWidget(self._grid_widget) v_layout.addStretch() self.connect( self._data_path_widget.data_path_widget_layout.child("prefix_ledit"), qt.SIGNAL("textChanged(const QString &)"), self._prefix_ledit_change, ) self.connect( self._data_path_widget.data_path_widget_layout.child("run_number_ledit"), qt.SIGNAL("textChanged(const QString &)"), self._run_number_ledit_change, ) self.connect( self._data_path_widget, qt.PYSIGNAL("path_template_changed"), self.handle_path_conflict, ) def set_workflow(self, workflow_hwobj): self._workflow_hwobj = workflow_hwobj self.workflows.clear() self._workflow_cbox.clear() if self._workflow_hwobj is not None: for workflow in self._workflow_hwobj.get_available_workflows(): self._workflow_cbox.insertItem(workflow["name"]) self.workflows[workflow["name"]] = workflow def set_shape_history(self, shape_history_hwobj): pass # self._grid_widget._shape_history = shape_history_hwobj # motor = self._beamline_setup_hwobj.\ # getObjectByRole('horizontal_motors') # self._grid_widget.initialize_motors('horizontal', motor) # motor = self._beamline_setup_hwobj.\ # getObjectByRole('vertical_motors') # self._grid_widget.initialize_motors('vertical', motor) def init_models(self): CreateTaskBase.init_models(self) def single_item_selection(self, tree_item): CreateTaskBase.single_item_selection(self, tree_item) wf_model = tree_item.get_model() if isinstance(tree_item, queue_item.GenericWorkflowQueueItem): if tree_item.get_model().is_executed(): self.setDisabled(True) else: self.setDisabled(False) if wf_model.get_path_template(): self._path_template = wf_model.get_path_template() self._data_path_widget.update_data_model(self._path_template) elif isinstance(tree_item, queue_item.BasketQueueItem): self.setDisabled(False) elif not ( isinstance(tree_item, queue_item.SampleQueueItem) or isinstance(tree_item, queue_item.DataCollectionGroupQueueItem) ): self.setDisabled(True) def approve_creation(self): return CreateTaskBase.approve_creation(self) # 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): tasks = [] path_template = self._create_path_template(sample, self._path_template) path_template.num_files = 0 wf = queue_model_objects.Workflow() wf_name = str(self._workflow_cbox.currentText()) wf.path_template = path_template wf.set_name("Workflow task") wf.set_type(wf_name) beamline_params = {} beamline_params["directory"] = wf.path_template.directory beamline_params["prefix"] = wf.path_template.get_prefix() beamline_params["run_number"] = wf.path_template.run_number beamline_params["collection_software"] = "mxCuBE - 2.0" beamline_params["sample_node_id"] = sample._node_id beamline_params["sample_lims_id"] = sample.lims_id params_list = map(str, list(itertools.chain(*beamline_params.iteritems()))) params_list.insert(0, self.workflows[wf_name]["path"]) params_list.insert(0, "modelpath") wf.params_list = params_list tasks.append(wf) return tasks
def __init__(self, parent=None, name="parameter_widget"): qt.QWidget.__init__(self, parent, name) self._data_collection = None self.add_dc_cb = None self._tree_view_item = None self.queue_model = None self._beamline_setup_hwobj = None self.caution_pixmap = Icons.load("Caution2.png") self.path_widget = DataPathWidget(self, "dc_params_path_widget") self.acq_gbox = qt.QVGroupBox("Acquisition", self) self.acq_gbox.setInsideMargin(2) self.acq_widget = AcquisitionWidget(self.acq_gbox, layout="horizontal") self.acq_widget.setFixedHeight(170) widget_ui = os.path.join( os.path.dirname(__file__), "ui_files/snapshot_widget_layout.ui" ) widget = qtui.QWidgetFactory.create(widget_ui) widget.reparent(self, qt.QPoint(0, 0)) self.position_widget = widget self._processing_gbox = qt.QVGroupBox("Processing", self, "processing_gbox") self.processing_widget = ProcessingWidget(self._processing_gbox) v_layout = qt.QVBoxLayout(self, 11, 10, "main_layout") rone_hlayout = qt.QHBoxLayout(v_layout, 10, "rone") rone_vlayout = qt.QVBoxLayout(rone_hlayout) rone_sv_layout = qt.QVBoxLayout(rone_hlayout) rone_vlayout.addWidget(self.path_widget) rone_vlayout.addWidget(self.acq_gbox) rtwo_hlayout = qt.QHBoxLayout(rone_vlayout, 10, "rtwo") rone_vlayout.addStretch(10) rone_sv_layout.addWidget(self.position_widget) rone_sv_layout.addStretch(10) rone_hlayout.addStretch() rtwo_hlayout.addWidget(self._processing_gbox) rtwo_hlayout.addStretch(10) v_layout.addStretch() self.connect( self.acq_widget, qt.PYSIGNAL("mad_energy_selected"), self.mad_energy_selected, ) self.connect( self.path_widget.data_path_widget_layout.child("prefix_ledit"), qt.SIGNAL("textChanged(const QString &)"), self._prefix_ledit_change, ) self.connect( self.path_widget.data_path_widget_layout.child("run_number_ledit"), qt.SIGNAL("textChanged(const QString &)"), self._run_number_ledit_change, ) self.connect( self.acq_widget, qt.PYSIGNAL("path_template_changed"), self.handle_path_conflict, ) self.connect( self.path_widget, qt.PYSIGNAL("path_template_changed"), self.handle_path_conflict, ) qt.QObject.connect(qt.qApp, qt.PYSIGNAL("tab_changed"), self.tab_changed)
class EnergyScanParametersWidget(qt.QWidget): def __init__(self, parent = None, name = "energy_scan_tab_widget"): qt.QWidget.__init__(self, parent, name) # Data Attributes self.energy_scan = queue_model_objects.EnergyScan() self._tree_view_item = None # Layout h_layout = qt.QHBoxLayout(self, 0, 0, "main_v_layout") col_one_vlayout = qt.QVBoxLayout(h_layout, 0, "row_one") periodic_table_gbox = qt.QHGroupBox("Available Elements", self) self.periodic_table = PeriodicTableBrick(periodic_table_gbox) #QPeriodicTable.QPeriodicTable(periodic_table_gbox) self.periodic_table.setFixedHeight(341) self.periodic_table.setFixedWidth(650) #font = periodic_table.font() #font.setPointSize(8) #periodic_table.setFont(font) #scan_plot_gbox = qt.QHGroupBox("Scan plot", self) #spec_scan_plot_brick = SpecScanPlotBrick(scan_plot_gbox) self.data_path_widget = DataPathWidget(self) self.data_path_widget.data_path_widget_layout.child('file_name_label').setText('') self.data_path_widget.data_path_widget_layout.child('file_name_value_label').hide() col_one_vlayout.add(periodic_table_gbox) col_one_vlayout.add(self.data_path_widget) col_one_vlayout.addStretch(10) qt.QObject.connect(self.periodic_table, qt.PYSIGNAL('edgeSelected'), self.element_clicked) qt.QObject.connect(self.data_path_widget.data_path_widget_layout.child('prefix_ledit'), qt.SIGNAL("textChanged(const QString &)"), self._prefix_ledit_change) qt.QObject.connect(self.data_path_widget.data_path_widget_layout.child('run_number_ledit'), qt.SIGNAL("textChanged(const QString &)"), self._run_number_ledit_change) qt.QObject.connect(qt.qApp, qt.PYSIGNAL('tab_changed'), self.tab_changed) def _prefix_ledit_change(self, new_value): self.energy_scan.set_name(str(new_value)) self._tree_view_item.setText(0, self.energy_scan.get_name()) def _run_number_ledit_change(self, new_value): if str(new_value).isdigit(): self.energy_scan.set_number(int(new_value)) self._tree_view_item.setText(0, self.energy_scan.get_name()) def tab_changed(self): if self._tree_view_item: self.populate_widget(self._tree_view_item) def populate_widget(self, item): self._tree_view_item = item self.energy_scan = item.get_model() executed = self.energy_scan.is_executed() self.data_path_widget.setEnabled(not executed) self.periodic_table.setEnabled(not executed) self.scan_plot.setEnabled(not executed) self.results_plot.setEnabled(not executed) if self.energy_scan.is_executed(): self.data_path_widget.setEnabled(False) self.periodic_table.setEnabled(False) else: self.data_path_widget.setEnabled(True) self.periodic_table.setEnabled(True) self.data_path_widget.update_data_model(self.energy_scan.path_template) self.periodic_table.setTableElement(self.energy_scan.element_symbol, \ self.energy_scan.edge) def element_clicked(self, symbol, energy): self.energy_scan.element_symbol = symbol self.energy_scan.edge = energy
class CreateXRFScanWidget(CreateTaskBase): def __init__(self, parent=None, name=None, fl=0): CreateTaskBase.__init__(self, parent, name, fl, 'XRF-scan') self.count_time = None # Data attributes self.init_models() xrfscan_model = queue_model_objects.XRFScan() self.xrfscan_mib = DataModelInputBinder(xrfscan_model) #Layout v_layout = qt.QVBoxLayout(self, 2, 6, "main_v_layout") self._data_path_gbox = qt.QVGroupBox('Data location', self, 'data_path_gbox') self._data_path_widget = DataPathWidget(self._data_path_gbox, data_model=self._path_template, layout='vertical') parameters_hor_gbox = qt.QHGroupBox('Parameters', self) self.count_time_label = qt.QLabel("Count time", parameters_hor_gbox) self.count_time_label.setFixedWidth(83) self.count_time_ledit = qt.QLineEdit("1.0", parameters_hor_gbox, "count_time_ledit") self.count_time_ledit.setFixedWidth(50) self.xrfscan_mib.bind_value_update('count_time', self.count_time_ledit, float) #, spacer = qt.QWidget(parameters_hor_gbox) spacer.setSizePolicy(qt.QSizePolicy.Expanding, qt.QSizePolicy.Fixed) v_layout.addWidget(self._data_path_gbox) v_layout.addWidget(parameters_hor_gbox) v_layout.addStretch() self.connect( self._data_path_widget.data_path_widget_layout.child( 'run_number_ledit'), qt.SIGNAL("textChanged(const QString &)"), self._run_number_ledit_change) self.connect( self._data_path_widget.data_path_widget_layout.child( 'prefix_ledit'), qt.SIGNAL("textChanged(const QString &)"), self._prefix_ledit_change) self.connect(self._data_path_widget, qt.PYSIGNAL("path_template_changed"), self.handle_path_conflict) def init_models(self): CreateTaskBase.init_models(self) self._path_template.start_num = 1 self._path_template.num_files = 1 self._path_template.suffix = 'raw' def single_item_selection(self, tree_item): CreateTaskBase.single_item_selection(self, tree_item) if isinstance(tree_item, queue_item.XRFScanQueueItem): xrfscan_model = tree_item.get_model() self.xrfscan_mib.set_model(xrfscan_model) if xrfscan_model.is_executed(): self.setDisabled(True) else: self.setDisabled(False) if xrfscan_model.get_path_template(): self._path_template = xrfscan_model.get_path_template() self._data_path_widget.update_data_model(self._path_template) elif isinstance(tree_item, queue_item.BasketQueueItem): self.setDisabled(False) elif not(isinstance(tree_item, queue_item.SampleQueueItem) or \ isinstance(tree_item, queue_item.DataCollectionGroupQueueItem)): self.setDisabled(True) def approve_creation(self): result = CreateTaskBase.approve_creation(self) selected_shapes = self._shape_history.selected_shapes for shape in selected_shapes: if (isinstance(shape, shape_history.Line) or isinstance(shape, shape_history.CanvasGrid)): result = False self.count_time = None try: self.count_time = float(str(self.count_time_ledit.text())) except: logging.getLogger("user_level_log").\ info("Incorrect count time value.") return 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): data_collections = [] if self.count_time is not None: if not shape: cpos = queue_model_objects.CentredPosition() cpos.snapshot_image = self._shape_history.get_snapshot([]) else: # Shapes selected and sample is mounted, get the # centred positions for the shapes if isinstance(shape, shape_history.Point): snapshot = self._shape_history.\ get_snapshot([shape.qub_point]) cpos = copy.deepcopy(shape.get_centred_positions()[0]) cpos.snapshot_image = snapshot path_template = self._create_path_template(sample, self._path_template) xrf_scan = queue_model_objects.XRFScan(sample, path_template, cpos) xrf_scan.set_name(path_template.get_prefix()) xrf_scan.set_number(path_template.run_number) xrf_scan.count_time = self.count_time data_collections.append(xrf_scan) self._path_template.run_number += 1 else: logging.getLogger("user_level_log").\ info("Incorrect count time value") return data_collections # Called by the owning widget (task_toolbox_widget) when # one or several centred positions are selected. def centred_position_selection(self, positions): self._selected_positions = positions if len(self._current_selected_items) == 1 and len(positions) == 1: item = self._current_selected_items[0] pos = positions[0] if isinstance(pos, shape_history.Point): if isinstance(item, queue_item.XRFScanQueueItem): cpos = pos.get_centred_positions()[0] snapshot = self._shape_history.get_snapshot( [pos.qub_point]) cpos.snapshot_image = snapshot item.get_model().centred_position = cpos