def setUp(self):
        self.start_position = 0.0
        self.max_velocity = 10.0
        self.tolerance_on_out_of_beam_position = 1
        self.out_of_beam_position = OutOfBeamPosition(
            -20, tolerance=self.tolerance_on_out_of_beam_position)

        self.height_axis = create_mock_axis("JAWS:HEIGHT", self.start_position,
                                            self.max_velocity)

        self.jaws = Component("component",
                              setup=PositionAndAngle(0.0, 10.0, 90.0))
        self.jaws.beam_path_set_point.set_incoming_beam(
            PositionAndAngle(0.0, 0.0, 0.0))
        self.jaws.beam_path_set_point.axis[
            ChangeAxis.POSITION].is_changed = True

        self.jaws_driver = IocDriver(
            self.jaws,
            ChangeAxis.POSITION,
            self.height_axis,
            out_of_beam_positions=[self.out_of_beam_position])
    def test_GIVEN_out_of_beam_with_offset_for_angle_WHEN_axis_move_THEN_component_is_out_of_beam(
            self):
        offset = 10
        beam_angle = 2
        comp = TiltingComponent("Comp", PositionAndAngle(0, 1, 90))
        mock_axis = create_mock_axis("axis", 0, 1)
        IocDriver(
            comp,
            ChangeAxis.ANGLE,
            mock_axis,
            out_of_beam_positions=[OutOfBeamPosition(offset, is_offset=True)])

        comp.beam_path_rbv.set_incoming_beam(PositionAndAngle(
            0, 0, beam_angle))

        mock_axis.sp = offset + beam_angle

        result = comp.beam_path_rbv.is_in_beam

        assert_that(result, is_(False))
    def test_GIVEN_out_of_beam_with_offset_for_angle_WHEN_init_THEN_component_is_out_of_beam(
            self):
        offset = 10
        beam_height = 2
        comp = Component("Comp", PositionAndAngle(0, 1, 90))
        mock_axis = create_mock_axis("axis", 0, 1)
        mock_axis.sp = offset + beam_height
        driver = IocDriver(
            comp,
            ChangeAxis.POSITION,
            mock_axis,
            out_of_beam_positions=[OutOfBeamPosition(offset, is_offset=True)])

        comp.beam_path_set_point.set_incoming_beam(
            PositionAndAngle(beam_height, 0, 0))

        driver.initialise_setpoint()

        result = comp.beam_path_set_point.is_in_beam

        assert_that(result, is_(False))
    def test_GIVEN_out_of_beam_with_offset_on_angle_WHEN_move_THEN_component_moves_to_correct_place(
            self):
        offset = 10
        beam_angle = 2
        expected_position = beam_angle + offset

        comp = TiltingComponent("Comp", PositionAndAngle(0, 1, 90))
        mock_axis = create_mock_axis("axis", 0, 1)
        driver = IocDriver(
            comp,
            ChangeAxis.ANGLE,
            mock_axis,
            out_of_beam_positions=[OutOfBeamPosition(offset, is_offset=True)])

        comp.beam_path_set_point.set_incoming_beam(
            PositionAndAngle(0, 0, beam_angle))
        comp.beam_path_set_point.is_in_beam = False

        driver.perform_move(1)

        result = mock_axis.sp

        assert_that(result, is_(expected_position))
    def test_GIVEN_out_of_beam_with_offset_WHEN_move_THEN_component_moves_to_correct_place(
            self, correction):
        offset = 10
        beam_height = 2
        expected_position = beam_height + offset + correction

        comp = Component("Comp", PositionAndAngle(0, 1, 90))
        mock_axis = create_mock_axis("axis", 0, 1)
        driver = IocDriver(
            comp,
            ChangeAxis.POSITION,
            mock_axis,
            out_of_beam_positions=[OutOfBeamPosition(offset, is_offset=True)],
            engineering_correction=ConstantCorrection(correction))

        comp.beam_path_set_point.set_incoming_beam(
            PositionAndAngle(beam_height, 0, 0))
        comp.beam_path_set_point.is_in_beam = False

        driver.perform_move(1)

        result = mock_axis.sp

        assert_that(result, is_(expected_position))
class TestHeightDriverInAndOutOfBeam(unittest.TestCase):
    @no_autosave
    def setUp(self):
        self.start_position = 0.0
        self.max_velocity = 10.0
        self.tolerance_on_out_of_beam_position = 1
        self.out_of_beam_position = OutOfBeamPosition(
            -20, tolerance=self.tolerance_on_out_of_beam_position)

        self.height_axis = create_mock_axis("JAWS:HEIGHT", self.start_position,
                                            self.max_velocity)

        self.jaws = Component("component",
                              setup=PositionAndAngle(0.0, 10.0, 90.0))
        self.jaws.beam_path_set_point.set_incoming_beam(
            PositionAndAngle(0.0, 0.0, 0.0))
        self.jaws.beam_path_set_point.axis[
            ChangeAxis.POSITION].is_changed = True

        self.jaws_driver = IocDriver(
            self.jaws,
            ChangeAxis.POSITION,
            self.height_axis,
            out_of_beam_positions=[self.out_of_beam_position])

    def test_GIVEN_component_which_is_out_of_beam_WHEN_calculating_move_duration_THEN_returned_duration_is_0(
            self):

        self.jaws.beam_path_set_point.is_in_beam = False

        result = self.jaws_driver.get_max_move_duration()

        assert_that(result, is_(0.0))

    def test_GIVEN_component_which_is_moving_into_beam_from_out_of_beam_WHEN_calculating_move_duration_THEN_returned_duration_is_0(
            self):
        self.height_axis.sp = self.out_of_beam_position.get_final_position()
        self.jaws.beam_path_rbv.is_in_beam = False
        self.jaws.beam_path_set_point.is_in_beam = True

        result = self.jaws_driver.get_max_move_duration()

        assert_that(result, is_(0.0))

    def test_GIVEN_component_which_is_out_of_beam_WHEN_moving_axis_THEN_velocity_is_not_set_and_setpoint_is_set(
            self):
        expected_position = self.out_of_beam_position.get_final_position()
        target_duration = 4.0
        self.jaws.beam_path_set_point.is_in_beam = False

        self.jaws_driver.perform_move(target_duration, True)

        assert_that(self.height_axis.velocity,
                    is_(None))  # i.e. not set because parking
        assert_that(self.height_axis.sp, is_(expected_position))

    def test_GIVEN_displacement_changed_to_out_of_beam_position_WHEN_listeners_on_axis_triggered_THEN_listeners_on_driving_layer_triggered_and_have_in_beam_is_false(
            self):
        listener = MagicMock()
        self.jaws.beam_path_rbv.add_listener(BeamPathUpdate, listener)
        expected_value = False

        self.height_axis.sp = self.out_of_beam_position.get_final_position()

        listener.assert_called()
        assert_that(self.jaws.beam_path_rbv.is_in_beam, is_(expected_value))

    def test_GIVEN_displacement_changed_to_an_in_beam_position_WHEN_listeners_on_axis_triggered_THEN_listeners_on_driving_layer_triggered_and_have_in_beam_is_true(
            self):
        listener = MagicMock()
        self.jaws.beam_path_rbv.add_listener(BeamPathUpdate, listener)
        expected_value = True

        self.height_axis.sp = self.out_of_beam_position.get_final_position(
        ) + 2 * self.tolerance_on_out_of_beam_position

        listener.assert_called()
        assert_that(self.jaws.beam_path_rbv.is_in_beam, is_(expected_value))

    def test_GIVEN_displacement_changed_to_out_of_beam_position_within_tolerance_WHEN_listeners_on_axis_triggered_THEN_listeners_on_driving_layer_triggered_and_have_in_beam_is_false(
            self):
        listener = MagicMock()
        self.jaws.beam_path_rbv.add_listener(BeamPathUpdate, listener)
        expected_value = False

        self.height_axis.sp = self.out_of_beam_position.get_final_position(
        ) + self.tolerance_on_out_of_beam_position * 0.9

        listener.assert_called()
        assert_that(self.jaws.beam_path_rbv.is_in_beam, is_(expected_value))
示例#7
0
import unittest


from ReflectometryServer import beamline_configuration, Component, TiltingComponent, AxisParameter
from ReflectometryServer.beamline import ActiveModeUpdate, BeamlineMode, Beamline
from ReflectometryServer.geometry import ChangeAxis, PositionAndAngle
from ReflectometryServer.engineering_corrections import InterpolateGridDataCorrectionFromProvider, CorrectionUpdate, \
    ModeSelectCorrection, CorrectionRecalculate, ConstantCorrection, UserFunctionCorrection, GridDataFileReader

from ReflectometryServer.ioc_driver import CorrectedReadbackUpdate, IocDriver
from ReflectometryServer.out_of_beam import OutOfBeamPosition
from server_common.observable import observable
from ReflectometryServer.test_modules.data_mother import create_mock_axis, DataMother

FLOAT_TOLERANCE = 1e-9
OUT_OF_BEAM_POSITION = OutOfBeamPosition(10)


class TestEngineeringCorrections(unittest.TestCase):

    def _setup_driver_axis_and_correction(self, correction):
        comp = Component("comp", PositionAndAngle(0.0, 0.0, 90.0))
        mock_axis = create_mock_axis("MOT:MTR0101", 0, 1)
        driver = IocDriver(comp, ChangeAxis.POSITION, mock_axis, out_of_beam_positions=[OUT_OF_BEAM_POSITION],
                           engineering_correction=ConstantCorrection(correction))
        comp.beam_path_set_point.axis[ChangeAxis.POSITION].is_changed = lambda: True  # simulate that the component has requested a change
        comp.beam_path_set_point.in_beam_manager.parking_index = 0  # The parking index is normally set initialised either through autosave or through initialise on the motor
        return driver, mock_axis, comp

    def test_GIVEN_engineering_correction_offset_of_1_WHEN_driver_told_to_go_to_0_THEN_pv_sent_to_1(self):
        expected_correction = 1