class AcquisitionWidget(qt.QWidget): def __init__( self, parent=None, name=None, fl=0, acq_params=None, path_template=None, layout="horizontal", ): qt.QWidget.__init__(self, parent, name, fl) # # Attributes # self._beamline_setup = None self.previous_energy = 0 self.layout_type = layout if acq_params is None: self._acquisition_parameters = queue_model_objects.AcquisitionParameters() else: self._acquisition_parameters = acq_params if path_template is None: self._path_template = queue_model_objects.PathTemplate() else: self._path_template = path_template self._acquisition_mib = DataModelInputBinder(self._acquisition_parameters) # self._path_template_mib = DataModelInputBinder(self._path_template) # # Layout # h_layout = qt.QHBoxLayout(self) if layout == "vertical": widget = qtui.QWidgetFactory.create( os.path.join( os.path.dirname(__file__), "ui_files/acquisition_widget_vertical_layout.ui", ) ) elif layout == "horizontal": widget = qtui.QWidgetFactory.create( os.path.join( os.path.dirname(__file__), "ui_files/acquisition_widget_horizontal_layout.ui", ) ) widget.child("inverse_beam_cbx").hide() widget.child("subwedge_size_label").hide() widget.child("subwedge_size_ledit").hide() else: widget = qtui.QWidgetFactory.create( os.path.join( os.path.dirname(__file__), "ui_files/acquisition_widget_vertical_layout.ui", ) ) widget.reparent(self, qt.QPoint(0, 0)) self.acq_widget_layout = widget h_layout.addWidget(self.acq_widget_layout) # # Logic # qt.QObject.connect( self.acq_widget_layout.child("energies_combo"), qt.SIGNAL("activated(int)"), self.energy_selected, ) qt.QObject.connect( self.acq_widget_layout.child("mad_cbox"), qt.SIGNAL("toggled(bool)"), self.use_mad, ) qt.QObject.connect( self.acq_widget_layout.child("inverse_beam_cbx"), qt.SIGNAL("toggled(bool)"), self.set_use_inverse_beam, ) qt.QObject.connect( self.acq_widget_layout.child("first_image_ledit"), qt.SIGNAL("textChanged(const QString &)"), self.first_image_ledit_change, ) qt.QObject.connect( self.acq_widget_layout.child("num_images_ledit"), qt.SIGNAL("textChanged(const QString &)"), self.num_images_ledit_change, ) overlap_ledit = self.acq_widget_layout.child("overlap_ledit") if overlap_ledit: qt.QObject.connect( self.acq_widget_layout.child("overlap_ledit"), qt.SIGNAL("textChanged(const QString &)"), self.overlap_changed, ) qt.QObject.connect( self.acq_widget_layout.child("subwedge_size_ledit"), qt.SIGNAL("textChanged(const QString &)"), self.subwedge_size_ledit_change, ) qt.QObject.connect( self.acq_widget_layout.child("osc_start_cbox"), qt.SIGNAL("toggled(bool)"), self.osc_start_cbox_click, ) self.acq_widget_layout.child("subwedge_size_ledit").setDisabled(True) self.acq_widget_layout.child("energies_combo").setDisabled(True) self.acq_widget_layout.child("energies_combo").insertStrList( ["ip: -", "pk: -", "rm1: -", "rm2: -"] ) self.acq_widget_layout.child("osc_start_ledit").setEnabled(False) self.acq_widget_layout.child("kappa_ledit").setEnabled(False) self.acq_widget_layout.child("kappa_phi_ledit").setEnabled(False) self.acq_widget_layout.child("detector_mode_label").setEnabled(False) self.acq_widget_layout.child("detector_mode_combo").setEnabled(False) def osc_start_cbox_click(self, state): self.update_osc_start(self._beamline_setup._get_omega_axis_position()) self.acq_widget_layout.child("osc_start_ledit").setEnabled(state) def update_osc_start(self, new_value): if not self.acq_widget_layout.child("osc_start_cbox").isChecked(): osc_start_ledit = self.acq_widget_layout.child("osc_start_ledit") osc_start_value = 0 try: osc_start_value = round(float(new_value), 2) except TypeError: pass osc_start_ledit.setText("%.2f" % osc_start_value) self._acquisition_parameters.osc_start = osc_start_value def update_kappa(self, new_value): self.acq_widget_layout.child("kappa_ledit").setText("%.2f" % float(new_value)) def update_kappa_phi(self, new_value): self.acq_widget_layout.child("kappa_phi_ledit").setText( "%.2f" % float(new_value) ) def use_osc_start(self, state): self.acq_widget_layout.child("osc_start_cbox").setChecked(state) self.acq_widget_layout.child("osc_start_cbox").setDisabled(state) def use_kappa(self, state): if self.layout_type == "vertical": self.acq_widget_layout.child("kappa_ledit").setEnabled(state) def use_kappa_phi(self, state): if self.layout_type == "vertical": self.acq_widget_layout.child("kappa_phi_ledit").setEnabled(state) def set_beamline_setup(self, beamline_setup): self._beamline_setup = beamline_setup limits_dict = self._beamline_setup.get_acquisition_limit_values() if "osc_range" in limits_dict: limits = tuple(map(float, limits_dict["osc_range"].split(","))) (lower, upper) = limits osc_start_validator = qt.QDoubleValidator(lower, upper, 4, self) osc_range_validator = qt.QDoubleValidator(lower, upper, 4, self) else: osc_start_validator = qt.QDoubleValidator(-10000, 10000, 4, self) osc_range_validator = qt.QDoubleValidator(-10000, 10000, 4, self) osc_start_ledit = self.acq_widget_layout.child("osc_start_ledit") self._acquisition_mib.bind_value_update( "osc_start", osc_start_ledit, float, osc_start_validator ) osc_range_ledit = self.acq_widget_layout.child("osc_range_ledit") self._acquisition_mib.bind_value_update( "osc_range", osc_range_ledit, float, osc_range_validator ) kappa_validator = qt.QDoubleValidator(0, 360, 2, self) kappa_ledit = self.acq_widget_layout.child("kappa_ledit") self._acquisition_mib.bind_value_update( "kappa", kappa_ledit, float, kappa_validator ) kappa_phi_validator = qt.QDoubleValidator(0, 360, 2, self) kappa_phi_ledit = self.acq_widget_layout.child("kappa_phi_ledit") self._acquisition_mib.bind_value_update( "kappa_phi", kappa_phi_ledit, float, kappa_phi_validator ) if "exposure_time" in limits_dict: limits = tuple(map(float, limits_dict["exposure_time"].split(","))) (lower, upper) = limits exp_time_valdidator = qt.QDoubleValidator(lower, upper, 5, self) else: exp_time_valdidator = qt.QDoubleValidator(-0.003, 6000, 5, self) exp_time_ledit = self.acq_widget_layout.child("exp_time_ledit") self._acquisition_mib.bind_value_update( "exp_time", exp_time_ledit, float, exp_time_valdidator ) if "number_of_images" in limits_dict: limits = tuple(map(int, limits_dict["number_of_images"].split(","))) (lower, upper) = limits num_img_valdidator = qt.QIntValidator(lower, upper, self) first_img_valdidator = qt.QIntValidator(lower, upper, self) else: num_img_valdidator = qt.QIntValidator(1, 9999, self) first_img_valdidator = qt.QIntValidator(1, 9999, self) first_img_ledit = self.acq_widget_layout.child("first_image_ledit") self._acquisition_mib.bind_value_update( "first_image", first_img_ledit, int, first_img_valdidator ) num_img_ledit = self.acq_widget_layout.child("num_images_ledit") self._acquisition_mib.bind_value_update( "num_images", num_img_ledit, int, num_img_valdidator ) num_passes = self.acq_widget_layout.child("num_passes_ledit") if num_passes: self._acquisition_mib.bind_value_update( "num_passes", num_passes, int, qt.QIntValidator(1, 1000, self) ) overlap_ledit = self.acq_widget_layout.child("overlap_ledit") if overlap_ledit: self._acquisition_mib.bind_value_update( "overlap", overlap_ledit, float, qt.QDoubleValidator(-1000, 1000, 2, self), ) self._acquisition_mib.bind_value_update( "energy", self.acq_widget_layout.child("energy_ledit"), float, qt.QDoubleValidator(0, 1000, 4, self), ) self._acquisition_mib.bind_value_update( "transmission", self.acq_widget_layout.child("transmission_ledit"), float, qt.QDoubleValidator(0, 1000, 2, self), ) self._acquisition_mib.bind_value_update( "resolution", self.acq_widget_layout.child("resolution_ledit"), float, qt.QDoubleValidator(0, 1000, 3, self), ) self._acquisition_mib.bind_value_update( "inverse_beam", self.acq_widget_layout.child("inverse_beam_cbx"), bool, None ) self._acquisition_mib.bind_value_update( "shutterless", self.acq_widget_layout.child("shutterless_cbx"), bool, None ) te = beamline_setup.tunable_wavelength() self.set_tunable_energy(te) has_shutter_less = self._beamline_setup.detector_has_shutterless() self.acq_widget_layout.child("shutterless_cbx").setEnabled(has_shutter_less) self.acq_widget_layout.child("shutterless_cbx").setChecked(has_shutter_less) if self._beamline_setup.disable_num_passes(): num_passes = self.acq_widget_layout.child("num_passes_ledit") if num_passes: self.acq_widget_layout.child("num_passes_ledit").setDisabled(True) has_aperture = self._beamline_setup.has_aperture() self.hide_aperture(has_aperture) def first_image_ledit_change(self, new_value): if str(new_value).isdigit(): self._path_template.start_num = int(new_value) widget = self.acq_widget_layout.child("first_image_ledit") self.emit(qt.PYSIGNAL("path_template_changed"), (widget, new_value)) def num_images_ledit_change(self, new_value): if str(new_value).isdigit(): self._path_template.num_files = int(new_value) widget = self.acq_widget_layout.child("num_images_ledit") self.emit(qt.PYSIGNAL("path_template_changed"), (widget, new_value)) def overlap_changed(self, new_value): if self._beamline_setup: has_shutter_less = self._beamline_setup.detector_has_shutterless() else: has_shutter_less = True if has_shutter_less: try: new_value = float(new_value) except ValueError: pass if new_value != 0: self.acq_widget_layout.child("shutterless_cbx").setEnabled(False) self.acq_widget_layout.child("shutterless_cbx").setChecked(False) self._acquisition_parameters.shutterless = False else: self.acq_widget_layout.child("shutterless_cbx").setEnabled(True) self.acq_widget_layout.child("shutterless_cbx").setChecked(True) self._acquisition_parameters.shutterless = True def use_mad(self, state): self.acq_widget_layout.child("energies_combo").setEnabled(state) if state: (name, energy) = self.get_mad_energy() if energy != 0: self.set_energy(energy, 0) self.emit(qt.PYSIGNAL("mad_energy_selected"), (name, energy, state)) else: self.set_energy(self.previous_energy, 0) energy = self._beamline_setup.energy_hwobj.getCurrentEnergy() self.emit( qt.PYSIGNAL("mad_energy_selected"), ("", self.previous_energy, state) ) def set_use_inverse_beam(self, state): if state: self.acq_widget_layout.child("subwedge_size_ledit").setEnabled(True) else: self.acq_widget_layout.child("subwedge_size_ledit").setDisabled(True) def use_inverse_beam(self): return self.acq_widget_layout.child("inverse_beam_cbx").isOn() def get_num_subwedges(self): return int(self.acq_widget_layout.child("subwedge_size_ledit").text()) def subwedge_size_ledit_change(self, new_value): widget = self.acq_widget_layout.child("subwedge_size_ledit") if int(new_value) > self._acquisition_parameters.num_images: widget.setPaletteBackgroundColor(widget_colors.LIGHT_RED) else: widget.setPaletteBackgroundColor(widget_colors.WHITE) def get_mad_energy(self): energy_str = str(self.acq_widget_layout.child("energies_combo").currentText()) (name, value) = energy_str.split(":") name = name.strip() value = value.strip() value = 0 if (value == "-") else value return (name, value) def set_energies(self, energy_scan_result): self.acq_widget_layout.child("energies_combo").clear() inflection = ( ("ip: %.4f" % energy_scan_result.inflection) if energy_scan_result.inflection else "ip: -" ) peak = ( ("pk: %.4f" % energy_scan_result.peak) if energy_scan_result.peak else "pk: -" ) first_remote = ( ("rm1: %.4f" % energy_scan_result.first_remote) if energy_scan_result.first_remote else "rm1: -" ) second_remote = ( ("rm2: %.4f" % energy_scan_result.second_remote) if energy_scan_result.second_remote else "rm2: -" ) self.acq_widget_layout.child("energies_combo").insertStrList( [inflection, peak, first_remote, second_remote] ) def energy_selected(self, index): if self.acq_widget_layout.child("mad_cbox").isChecked(): (name, energy) = self.get_mad_energy() if energy != 0: self.set_energy(energy, 0) self.emit(qt.PYSIGNAL("mad_energy_selected"), (name, energy, True)) def set_energy(self, energy, wav): self._acquisition_parameters.energy = energy self.acq_widget_layout.child("energy_ledit").setText("%.4f" % float(energy)) def update_transmission(self, transmission): self.acq_widget_layout.child("transmission_ledit").setText( "%.2f" % float(transmission) ) # self._acquisition_parameters.transmission = float(transmission) def update_resolution(self, resolution): self.acq_widget_layout.child("resolution_ledit").setText( "%.3f" % float(resolution) ) # self._acquisition_parameters.resolution = float(resolution) def update_data_model(self, acquisition_parameters, path_template): self._acquisition_parameters = acquisition_parameters self._path_template = path_template self._acquisition_mib.set_model(acquisition_parameters) # Update mad widgets mad = True if self._path_template.mad_prefix != "" else False if mad: mad_prefix = self._path_template.mad_prefix index = MAD_ENERGY_COMBO_NAMES[mad_prefix] self.acq_widget_layout.child("energies_combo").setCurrentItem(index) self.acq_widget_layout.child("mad_cbox").setChecked(True) self.acq_widget_layout.child("energies_combo").setEnabled(True) else: self.acq_widget_layout.child("mad_cbox").setChecked(False) self.acq_widget_layout.child("energies_combo").setEnabled(False) self.acq_widget_layout.child("energies_combo").setCurrentItem(0) def set_tunable_energy(self, state): self.acq_widget_layout.child("energy_ledit").setEnabled(state) self.acq_widget_layout.child("mad_cbox").setEnabled(state) self.acq_widget_layout.child("energies_combo").setEnabled(state) def disable_inverse_beam(self, state): if state: self.acq_widget_layout.child("inverse_beam_cbx").hide() self.acq_widget_layout.child("subwedge_size_label").hide() self.acq_widget_layout.child("subwedge_size_ledit").hide() else: self.acq_widget_layout.child("inverse_beam_cbx").show() self.acq_widget_layout.child("subwedge_size_label").show() self.acq_widget_layout.child("subwedge_size_ledit").show() def hide_aperture(self, state): pass # if state: # self.acq_widget_layout.child('aperture_ledit').show() # self.acq_widget_layout.child('aperture_cbox').show() # else: # self.acq_widget_layout.child('aperture_ledit').hide() # self.acq_widget_layout.child('aperture_cbox').hide() def check_parameter_conflict(self): return len(self._acquisition_mib.validate_all()) > 0
class AcquisitionWidgetSimple(qt.QWidget): def __init__(self, parent=None, name=None, fl=0, acq_params=None, path_template=None, layout=None): qt.QWidget.__init__(self, parent, name, fl) # # Attributes # if acq_params is None: self._acquisition_parameters = queue_model_objects.AcquisitionParameters( ) else: self._acquisition_parameters = acq_params if path_template is None: self._path_template = queue_model_objects.PathTemplate() else: self._path_template = path_template self._acquisition_mib = DataModelInputBinder( self._acquisition_parameters) # # Layout # h_layout = qt.QHBoxLayout(self) current_dir = os.path.dirname(__file__) ui_file = 'ui_files/acquisition_widget_vertical_simple_layout.ui' widget = qtui.QWidgetFactory.create(os.path.join(current_dir, ui_file)) widget.reparent(self, qt.QPoint(0, 0)) h_layout.addWidget(widget) self.acq_widget_layout = widget # # Logic # self.acq_widget_layout.child('kappa_ledit').setEnabled(False) self.acq_widget_layout.child('kappa_phi_ledit').setEnabled(False) self.acq_widget_layout.child('osc_start_ledit').setEnabled(False) # Default to 2-images self.acq_widget_layout.child('num_images_cbox').setCurrentItem(1) qt.QObject.connect(self.acq_widget_layout.child('num_images_cbox'), qt.SIGNAL("activated(int)"), self.update_num_images) def osc_start_cbox_click(self, state): self.update_osc_start(self._beamline_setup._get_omega_axis_position()) self.acq_widget_layout.child('osc_start_ledit').setEnabled(state) def update_osc_start(self, new_value): if not self.acq_widget_layout.child('osc_start_cbox').isChecked(): osc_start_ledit = self.acq_widget_layout.child('osc_start_ledit') osc_start_value = 0 try: osc_start_value = round(float(new_value), 2) except TypeError: pass osc_start_ledit.setText("%.2f" % osc_start_value) self._acquisition_parameters.osc_start = osc_start_value def update_kappa(self, new_value): self.acq_widget_layout.child('kappa_ledit').\ setText("%.2f" % float(new_value)) def update_kappa_phi(self, new_value): self.acq_widget_layout.child('kappa_phi_ledit').\ setText("%.2f" % float(new_value)) def use_kappa(self, state): self.acq_widget_layout.child('kappa_ledit').setDisabled(state) def use_kappa_phi(self, state): self.acq_widget_layout.child('kappa_phi_ledit').setDisabled(state) def update_num_images(self, index=None, num_images=None): if index is not None: if index is 0: self._acquisition_parameters.num_images = 1 self._path_template.num_files = 1 elif index is 1: self._acquisition_parameters.num_images = 2 self._path_template.num_files = 2 elif index is 2: self._acquisition_parameters.num_images = 4 self._path_template.num_files = 4 if num_images: if self.acq_widget_layout.child('num_images_cbox').count() > 3: self.acq_widget_layout.child('num_images_cbox').removeItem(4) if num_images is 1: self.acq_widget_layout.child('num_images_cbox').setCurrentItem( 0) elif num_images is 2: self.acq_widget_layout.child('num_images_cbox').setCurrentItem( 1) elif num_images is 4: self.acq_widget_layout.child('num_images_cbox').setCurrentItem( 2) else: self.acq_widget_layout.child('num_images_cbox').insertItem( str(num_images)) self.acq_widget_layout.child('num_images_cbox').setCurrentItem( 3) self._path_template.num_files = num_images def use_mad(self, state): pass def get_mad_energy(self): pass def set_energies(self, energy_scan_result): pass def energy_selected(self, index): pass def set_beamline_setup(self, beamline_setup): self._beamline_setup = beamline_setup limits_dict = self._beamline_setup.get_acquisition_limit_values() if 'osc_range' in limits_dict: limits = tuple(map(float, limits_dict['osc_range'].split(','))) (lower, upper) = limits osc_start_validator = qt.QDoubleValidator(lower, upper, 4, self) osc_range_validator = qt.QDoubleValidator(lower, upper, 4, self) else: osc_start_validator = qt.QDoubleValidator(-10000, 10000, 4, self) osc_range_validator = qt.QDoubleValidator(-10000, 10000, 4, self) osc_start_ledit = self.acq_widget_layout.child('osc_start_ledit') self._acquisition_mib.bind_value_update('osc_start', osc_start_ledit, float, osc_start_validator) osc_range_ledit = self.acq_widget_layout.child('osc_range_ledit') self._acquisition_mib.bind_value_update('osc_range', osc_range_ledit, float, osc_range_validator) if 'exposure_time' in limits_dict: limits = tuple(map(float, limits_dict['exposure_time'].split(','))) (lower, upper) = limits exp_time_valdidator = qt.QDoubleValidator(lower, upper, 5, self) else: exp_time_valdidator = qt.QDoubleValidator(-0.003, 6000, 5, self) exp_time_ledit = self.acq_widget_layout.child('exp_time_ledit') self._acquisition_mib.bind_value_update('exp_time', exp_time_ledit, float, exp_time_valdidator) self._acquisition_mib.\ bind_value_update('energy', self.acq_widget_layout.child('energy_ledit'), float, qt.QDoubleValidator(0, 1000, 4, self)) self._acquisition_mib.\ bind_value_update('transmission', self.acq_widget_layout.child('transmission_ledit'), float, qt.QDoubleValidator(0, 1000, 2, self)) self._acquisition_mib.\ bind_value_update('resolution', self.acq_widget_layout.child('resolution_ledit'), float, qt.QDoubleValidator(0, 1000, 3, self)) qt.QObject.connect(self.acq_widget_layout.child('osc_start_cbox'), qt.SIGNAL("toggled(bool)"), self.osc_start_cbox_click) te = beamline_setup.tunable_wavelength() self.set_tunable_energy(te) has_aperture = self._beamline_setup.has_aperture() self.hide_aperture(has_aperture) def set_energy(self, energy, wav): self._acquisition_parameters.energy = energy self.acq_widget_layout.child('energy_ledit').setText("%.4f" % float(energy)) def update_transmission(self, transmission): self.acq_widget_layout.child('transmission_ledit').\ setText("%.2f" % float(transmission)) self._acquisition_parameters.transmission = float(transmission) def update_resolution(self, resolution): self.acq_widget_layout.child('resolution_ledit').\ setText("%.3f" % float(resolution)) self._acquisition_parameters.resolution = float(resolution) def update_data_model(self, acquisition_parameters, path_template): self._acquisition_parameters = acquisition_parameters self._acquisition_mib.set_model(acquisition_parameters) self._path_template = path_template self.update_num_images(None, acquisition_parameters.num_images) def set_tunable_energy(self, state): self.acq_widget_layout.child('energy_ledit').setEnabled(state) def hide_aperture(self, state): if state: self.acq_widget_layout.child('aperture_ledit').show() self.acq_widget_layout.child('aperture_cbox').show() else: self.acq_widget_layout.child('aperture_ledit').hide() self.acq_widget_layout.child('aperture_cbox').hide() def use_osc_start(self, state): self.acq_widget_layout.child('osc_start_cbox').setChecked(state) self.acq_widget_layout.child('osc_start_cbox').setDisabled(state) def check_parameter_conflict(self): return len(self._acquisition_mib.validate_all()) > 0
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 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 AcquisitionWidgetSimple(qt.QWidget): def __init__( self, parent=None, name=None, fl=0, acq_params=None, path_template=None, layout=None, ): qt.QWidget.__init__(self, parent, name, fl) # # Attributes # if acq_params is None: self._acquisition_parameters = queue_model_objects.AcquisitionParameters() else: self._acquisition_parameters = acq_params if path_template is None: self._path_template = queue_model_objects.PathTemplate() else: self._path_template = path_template self._acquisition_mib = DataModelInputBinder(self._acquisition_parameters) # # Layout # h_layout = qt.QHBoxLayout(self) current_dir = os.path.dirname(__file__) ui_file = "ui_files/acquisition_widget_vertical_simple_layout.ui" widget = qtui.QWidgetFactory.create(os.path.join(current_dir, ui_file)) widget.reparent(self, qt.QPoint(0, 0)) h_layout.addWidget(widget) self.acq_widget_layout = widget # # Logic # self.acq_widget_layout.child("kappa_ledit").setEnabled(False) self.acq_widget_layout.child("kappa_phi_ledit").setEnabled(False) self.acq_widget_layout.child("osc_start_ledit").setEnabled(False) # Default to 2-images self.acq_widget_layout.child("num_images_cbox").setCurrentItem(1) qt.QObject.connect( self.acq_widget_layout.child("num_images_cbox"), qt.SIGNAL("activated(int)"), self.update_num_images, ) def osc_start_cbox_click(self, state): self.update_osc_start(self._beamline_setup._get_omega_axis_position()) self.acq_widget_layout.child("osc_start_ledit").setEnabled(state) def update_osc_start(self, new_value): if not self.acq_widget_layout.child("osc_start_cbox").isChecked(): osc_start_ledit = self.acq_widget_layout.child("osc_start_ledit") osc_start_value = 0 try: osc_start_value = round(float(new_value), 2) except TypeError: pass osc_start_ledit.setText("%.2f" % osc_start_value) self._acquisition_parameters.osc_start = osc_start_value def update_kappa(self, new_value): self.acq_widget_layout.child("kappa_ledit").setText("%.2f" % float(new_value)) def update_kappa_phi(self, new_value): self.acq_widget_layout.child("kappa_phi_ledit").setText( "%.2f" % float(new_value) ) def use_kappa(self, state): self.acq_widget_layout.child("kappa_ledit").setDisabled(state) def use_kappa_phi(self, state): self.acq_widget_layout.child("kappa_phi_ledit").setDisabled(state) def update_num_images(self, index=None, num_images=None): if index is not None: if index is 0: self._acquisition_parameters.num_images = 1 self._path_template.num_files = 1 elif index is 1: self._acquisition_parameters.num_images = 2 self._path_template.num_files = 2 elif index is 2: self._acquisition_parameters.num_images = 4 self._path_template.num_files = 4 if num_images: if self.acq_widget_layout.child("num_images_cbox").count() > 3: self.acq_widget_layout.child("num_images_cbox").removeItem(4) if num_images is 1: self.acq_widget_layout.child("num_images_cbox").setCurrentItem(0) elif num_images is 2: self.acq_widget_layout.child("num_images_cbox").setCurrentItem(1) elif num_images is 4: self.acq_widget_layout.child("num_images_cbox").setCurrentItem(2) else: self.acq_widget_layout.child("num_images_cbox").insertItem( str(num_images) ) self.acq_widget_layout.child("num_images_cbox").setCurrentItem(3) self._path_template.num_files = num_images def use_mad(self, state): pass def get_mad_energy(self): pass def set_energies(self, energy_scan_result): pass def energy_selected(self, index): pass def set_beamline_setup(self, beamline_setup): self._beamline_setup = beamline_setup limits_dict = self._beamline_setup.get_acquisition_limit_values() if "osc_range" in limits_dict: limits = tuple(map(float, limits_dict["osc_range"].split(","))) (lower, upper) = limits osc_start_validator = qt.QDoubleValidator(lower, upper, 4, self) osc_range_validator = qt.QDoubleValidator(lower, upper, 4, self) else: osc_start_validator = qt.QDoubleValidator(-10000, 10000, 4, self) osc_range_validator = qt.QDoubleValidator(-10000, 10000, 4, self) osc_start_ledit = self.acq_widget_layout.child("osc_start_ledit") self._acquisition_mib.bind_value_update( "osc_start", osc_start_ledit, float, osc_start_validator ) osc_range_ledit = self.acq_widget_layout.child("osc_range_ledit") self._acquisition_mib.bind_value_update( "osc_range", osc_range_ledit, float, osc_range_validator ) if "exposure_time" in limits_dict: limits = tuple(map(float, limits_dict["exposure_time"].split(","))) (lower, upper) = limits exp_time_valdidator = qt.QDoubleValidator(lower, upper, 5, self) else: exp_time_valdidator = qt.QDoubleValidator(-0.003, 6000, 5, self) exp_time_ledit = self.acq_widget_layout.child("exp_time_ledit") self._acquisition_mib.bind_value_update( "exp_time", exp_time_ledit, float, exp_time_valdidator ) self._acquisition_mib.bind_value_update( "energy", self.acq_widget_layout.child("energy_ledit"), float, qt.QDoubleValidator(0, 1000, 4, self), ) self._acquisition_mib.bind_value_update( "transmission", self.acq_widget_layout.child("transmission_ledit"), float, qt.QDoubleValidator(0, 1000, 2, self), ) self._acquisition_mib.bind_value_update( "resolution", self.acq_widget_layout.child("resolution_ledit"), float, qt.QDoubleValidator(0, 1000, 3, self), ) qt.QObject.connect( self.acq_widget_layout.child("osc_start_cbox"), qt.SIGNAL("toggled(bool)"), self.osc_start_cbox_click, ) te = beamline_setup.tunable_wavelength() self.set_tunable_energy(te) has_aperture = self._beamline_setup.has_aperture() self.hide_aperture(has_aperture) def set_energy(self, energy, wav): self._acquisition_parameters.energy = energy self.acq_widget_layout.child("energy_ledit").setText("%.4f" % float(energy)) def update_transmission(self, transmission): self.acq_widget_layout.child("transmission_ledit").setText( "%.2f" % float(transmission) ) self._acquisition_parameters.transmission = float(transmission) def update_resolution(self, resolution): self.acq_widget_layout.child("resolution_ledit").setText( "%.3f" % float(resolution) ) self._acquisition_parameters.resolution = float(resolution) def update_data_model(self, acquisition_parameters, path_template): self._acquisition_parameters = acquisition_parameters self._acquisition_mib.set_model(acquisition_parameters) self._path_template = path_template self.update_num_images(None, acquisition_parameters.num_images) def set_tunable_energy(self, state): self.acq_widget_layout.child("energy_ledit").setEnabled(state) def hide_aperture(self, state): if state: self.acq_widget_layout.child("aperture_ledit").show() self.acq_widget_layout.child("aperture_cbox").show() else: self.acq_widget_layout.child("aperture_ledit").hide() self.acq_widget_layout.child("aperture_cbox").hide() def use_osc_start(self, state): self.acq_widget_layout.child("osc_start_cbox").setChecked(state) self.acq_widget_layout.child("osc_start_cbox").setDisabled(state) def check_parameter_conflict(self): return len(self._acquisition_mib.validate_all()) > 0