def test_GIVEN_move_duration_and_target_position_set_WHEN_moving_multiple_axes_THEN_computed_axis_velocity_is_correct_and_setpoint_set_for_all_axes(
            self):
        target_duration = 10.0
        expected_velocity_height = 1.0
        target_position_height = 10.0
        expected_velocity_angle = 3.0
        target_position_angle = 30.0
        self.supermirror.beam_path_set_point.axis[
            ChangeAxis.ANGLE].set_displacement(
                CorrectedReadbackUpdate(30.0, None, None))
        self.supermirror.beam_path_set_point.axis[
            ChangeAxis.POSITION].set_relative_to_beam(
                10.0)  # move component into beam

        self.supermirror_driver_disp.perform_move(target_duration, True)
        self.supermirror_driver_ang.perform_move(target_duration, True)

        assert_that(
            fabs(self.height_axis.velocity -
                 expected_velocity_height) <= FLOAT_TOLERANCE)
        assert_that(
            fabs(self.height_axis.sp -
                 target_position_height) <= FLOAT_TOLERANCE)
        assert_that(
            fabs(self.angle_axis.velocity -
                 expected_velocity_angle) <= FLOAT_TOLERANCE)
        assert_that(
            fabs(self.angle_axis.sp -
                 target_position_angle) <= FLOAT_TOLERANCE)
示例#2
0
    def test_GIVEN_theta_rbv_beam_path_calc_WHEN_add_CHI_axis_and_set_displacement_THEN_error(self):

        theta_sp = BeamPathCalcThetaRBV("theta", None, None)
        comp = Component("comp", PositionAndAngle(0, 0, 0))
        theta_sp.add_angle_to(comp.beam_path_rbv, comp.beam_path_set_point, [ChangeAxis.CHI])

        assert_that(calling(comp.beam_path_rbv.axis[ChangeAxis.CHI].set_displacement).with_args(
            CorrectedReadbackUpdate(10, None, None)), raises(RuntimeError))
示例#3
0
    def _on_physical_move(self, _):
        """
        When a motor axis moves physically update the control axes
        """
        rbv_axis = self.beam_path_rbv.axis
        height, pivot_angle, seesaw = self._calculate_motor_rbvs(rbv_axis)

        alarm_severity, alarm_status = maximum_severity(
            rbv_axis[ChangeAxis.JACK_FRONT].alarm,
            rbv_axis[ChangeAxis.JACK_REAR].alarm,
            rbv_axis[ChangeAxis.SLIDE].alarm)

        rbv_axis[self._position_axis].set_displacement(
            CorrectedReadbackUpdate(height, alarm_severity, alarm_status))
        rbv_axis[self._angle_axis].set_displacement(
            CorrectedReadbackUpdate(pivot_angle, alarm_severity, alarm_status))
        rbv_axis[ChangeAxis.SEESAW].set_displacement(
            CorrectedReadbackUpdate(seesaw, alarm_severity, alarm_status))
示例#4
0
    def test_GIVEN_engineering_correction_offset_of_1_WHEN_at_set_point_THEN_at_target_setpoint_is_true(self):
        correction = 4
        driver, mock_axis, comp = self._setup_driver_axis_and_correction(correction)
        comp.beam_path_set_point.axis[ChangeAxis.POSITION].set_displacement(CorrectedReadbackUpdate(2, None, None))
        driver.perform_move(1)

        result = driver.at_target_setpoint()

        assert_that(result, is_(True), "Axis is at set point")
示例#5
0
    def test_GIVEN_ioc_driver_with_engineering_correction_WHEN_update_mode_THEN_setpoint_updated_fired(self):
        mock_axis = create_mock_axis("mock", 0, 1)
        component = Component("comp", PositionAndAngle(0, 0, 0))
        driver = IocDriver(component, ChangeAxis.POSITION, mock_axis, engineering_correction=self.mode_selection_correction)
        component.beam_path_set_point.axis[ChangeAxis.POSITION].set_displacement(CorrectedReadbackUpdate(0, None, None))
        mock_axis.sp = self.default_offset
        driver.set_observe_mode_change_on(self.mock_beamline)
        assert_that(driver.at_target_setpoint(), is_(True), "Should be at the target setpoint before mode is changed")

        self.mock_beamline.trigger_listeners(ActiveModeUpdate(self.mode1))
        result = driver.at_target_setpoint()

        assert_that(result, is_(False), "Should NOT be at the target setpoint after mode is changed, because of new correction")
    def test_GIVEN_multiple_axes_need_to_move_WHEN_computing_move_duration_THEN_maximum_duration_is_returned(
            self):
        target_angle = 30.0
        expected = 3.0
        self.supermirror.beam_path_set_point.axis[
            ChangeAxis.ANGLE].set_displacement(
                CorrectedReadbackUpdate(target_angle, None, None))
        self.supermirror.beam_path_set_point.axis[
            ChangeAxis.POSITION].set_relative_to_beam(10.0)
        self.supermirror.beam_path_set_point.axis[
            ChangeAxis.POSITION].is_changed = True
        self.supermirror.beam_path_set_point.axis[
            ChangeAxis.ANGLE].is_changed = True

        result = max(self.supermirror_driver_disp.get_max_move_duration(),
                     self.supermirror_driver_ang.get_max_move_duration())

        assert_that(result, is_(expected))
示例#7
0
    def test_GIVEN_no_set_displacement_set_WHEN_set_displacement_THEN_Error(self):

        calc_axis = BeamPathCalcAxis(None, None, None)

        assert_that(calling(calc_axis.set_displacement).with_args(CorrectedReadbackUpdate(None, None, None)),
                    raises(TypeError, pattern="Axis does not support set_displacement"))
    def setUp(self):
        sm_angle = 0.0
        supermirror = ReflectingComponent("supermirror",
                                          setup=PositionAndAngle(y=0.0,
                                                                 z=10.0,
                                                                 angle=90.0))
        sm_height_axis = create_mock_axis("SM:HEIGHT", 0.0, 10.0)
        sm_angle_axis = create_mock_axis("SM:ANGLE", sm_angle, 10.0)
        supermirror.beam_path_set_point.axis[
            ChangeAxis.ANGLE].set_displacement(
                CorrectedReadbackUpdate(sm_angle, None, None))
        supermirror_driver_disp = IocDriver(supermirror, ChangeAxis.POSITION,
                                            sm_height_axis)
        supermirror_driver_ang = IocDriver(supermirror, ChangeAxis.ANGLE,
                                           sm_angle_axis)

        slit_2 = Component("slit_2",
                           setup=PositionAndAngle(y=0.0, z=20.0, angle=90.0))
        slit_2_height_axis = create_mock_axis("SLIT2:HEIGHT", 0.0, 10.0)
        self.slit_2_driver = MagicMock(IocDriver)
        self.slit_2_driver.get_max_move_duration = MagicMock(return_value=0)
        self.slit_2_driver.component = slit_2
        self.slit_2_driver.component_axis = ChangeAxis.POSITION

        slit_3 = Component("slit_3",
                           setup=PositionAndAngle(y=0.0, z=30.0, angle=90.0))
        slit_3_height_axis = create_mock_axis("SLIT3:HEIGHT", 0.0, 10.0)
        slit_3_driver = IocDriver(slit_3, ChangeAxis.POSITION,
                                  slit_3_height_axis)
        self.slit_3_driver = slit_3_driver

        detector = TiltingComponent("comp",
                                    setup=PositionAndAngle(y=0.0,
                                                           z=40.0,
                                                           angle=90.0))
        detector_height_axis = create_mock_axis("DETECTOR:HEIGHT", 0.0, 10.0)
        detector_tilt_axis = create_mock_axis("DETECTOR:TILT", 0.0, 10.0)
        detector_driver_disp = IocDriver(detector, ChangeAxis.POSITION,
                                         detector_height_axis)
        detector_driver_ang = IocDriver(detector, ChangeAxis.ANGLE,
                                        detector_tilt_axis)

        self.smangle = AxisParameter("smangle", supermirror, ChangeAxis.ANGLE)
        slit_2_pos = AxisParameter("s2_pos", slit_2, ChangeAxis.POSITION)
        self.slit_2_pos = slit_2_pos
        slit_3_pos = AxisParameter("s3_pos", slit_3, ChangeAxis.POSITION)
        self.slit_3_pos = slit_3_pos
        det_pos = AxisParameter("det_pos", detector, ChangeAxis.POSITION)
        det_ang = AxisParameter("det_ang", detector, ChangeAxis.ANGLE)

        components = [supermirror, slit_2, slit_3, detector]
        beamline_parameters = [
            self.smangle, slit_2_pos, slit_3_pos, det_pos, det_ang
        ]
        self.drivers = [
            supermirror_driver_disp, supermirror_driver_ang,
            self.slit_2_driver, slit_3_driver, detector_driver_disp,
            detector_driver_ang
        ]
        mode = BeamlineMode("mode name", [
            self.smangle.name, slit_2_pos.name, slit_3_pos.name, det_pos.name,
            det_ang.name
        ])
        beam_start = PositionAndAngle(0.0, 0.0, 0.0)
        self.beamline = Beamline(components, beamline_parameters, self.drivers,
                                 [mode], beam_start)

        self.beamline.active_mode = mode.name

        slit_2_pos.sp_no_move = 0.0
        slit_3_pos.sp_no_move = 0.0
        det_pos.sp_no_move = 0.0
        det_ang.sp_no_move = 0