示例#1
0
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
示例#2
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)
示例#4
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 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