def setUp(self):
        start_position_height = 0.0
        max_velocity_height = 10.0
        self.height_axis = create_mock_axis("JAWS:HEIGHT",
                                            start_position_height,
                                            max_velocity_height)

        start_position_tilt = 90.0
        max_velocity_tilt = 10.0
        self.tilt_axis = create_mock_axis("JAWS:TILT", start_position_tilt,
                                          max_velocity_tilt)
        self.tilt_axis.velocity = 0.123

        self.tilting_jaws = TiltingComponent("component",
                                             setup=PositionAndAngle(
                                                 0.0, 10.0, 90.0))
        self.tilting_jaws.beam_path_set_point.axis[
            ChangeAxis.POSITION].is_changed = True
        self.tilting_jaws.beam_path_set_point.axis[
            ChangeAxis.ANGLE].is_changed = True

        self.tilting_jaws_driver_disp = IocDriver(self.tilting_jaws,
                                                  ChangeAxis.POSITION,
                                                  self.height_axis)
        self.tilting_jaws_driver_ang = IocDriver(self.tilting_jaws,
                                                 ChangeAxis.ANGLE,
                                                 self.tilt_axis,
                                                 synchronised=False)
    def setUp(self):
        start_position = 0.0
        max_velocity = 10.0
        self.height_axis = create_mock_axis("JAWS:HEIGHT", start_position,
                                            max_velocity)
        self.alt_axis = create_mock_axis("JAWS:NORTH", start_position,
                                         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.opt1 = "axis"
        self.opt2 = "alt_axis"
        self.opt3 = "other"
        self.param = EnumParameter("param",
                                   options=[self.opt1, self.opt2, self.opt3])

        self.jaws_driver = IocDriver(
            self.jaws,
            ChangeAxis.POSITION,
            self.height_axis,
            pv_wrapper_for_parameter=PVWrapperForParameter(
                self.param, {self.opt2: self.alt_axis}))
Exemplo n.º 3
0
 def _setup_driver_axis_and_correction(self, correction):
     comp = Component("comp", PositionAndAngle(0.0, 0.0, 0.0))
     mock_axis = create_mock_axis("MOT:MTR0101", 0, 1)
     engineering_correction = ConstantCorrection(correction)
     driver = IocDriver(comp, ChangeAxis.POSITION, mock_axis, engineering_correction=engineering_correction)
     comp.beam_path_set_point.axis[ChangeAxis.POSITION].is_changed = lambda: True  # simulate that the component has requested a change
     return driver, mock_axis, comp, engineering_correction
Exemplo n.º 4
0
    def test_GIVEN_ioc_driver_with_engineering_correction_containing_a_mode_update_correction_WHEN_update_mode_THEN_correct_readback_updated_fired(self):
        mode1_mode1_offset = 11
        mode1_mode2_offset = 12
        mode2_mode1_offset = 210
        mode2_mode2_offset = 220

        mode1_mode_selection = ModeSelectCorrection(self.default_correction,
                             {self.mode1.name: (ConstantCorrection(mode1_mode1_offset)),
                              self.mode2.name: (ConstantCorrection(mode1_mode2_offset))})
        mode2_mode_selection = ModeSelectCorrection(self.default_correction,
                                                    {self.mode1.name: (ConstantCorrection(mode2_mode1_offset)),
                                                     self.mode2.name: (ConstantCorrection(mode2_mode2_offset))})
        mode_selection_correction = ModeSelectCorrection(self.default_correction,
                                                              {self.mode1.name: mode1_mode_selection,
                                                               self.mode2.name: mode2_mode_selection})
        mode_selection_correction.set_observe_mode_change_on(self.mock_beamline)
        mode_selection_correction.add_listener(CorrectionRecalculate, self.get_update)
        mode_selection_correction.add_listener(CorrectionUpdate, self.get_correction_update)

        mock_axis = create_mock_axis("mock", 0, 1)
        driver = IocDriver(Component("comp", PositionAndAngle(0, 0, 0)), ChangeAxis.POSITION, mock_axis, engineering_correction=mode_selection_correction)
        mock_axis.trigger_rbv_change()
        driver.set_observe_mode_change_on(self.mock_beamline)
        mock_listener = Mock()
        driver.add_listener(CorrectionUpdate, mock_listener)

        self.mock_beamline.trigger_listeners(ActiveModeUpdate(self.mode1))

        args = mock_listener.call_args[0]
        assert_that(args[0].correction, is_(mode1_mode1_offset))
    def setUp(self):
        self.start_position = 0.0
        self.max_velocity = 10.0
        self.tolerance_on_out_of_beam_position = 1
        self.parking_sequence = [-1, -2, -3]
        self.out_of_beam_position = OutOfBeamSequence(
            self.parking_sequence,
            tolerance=self.tolerance_on_out_of_beam_position)

        self.axis = create_mock_axis("HEIGHT", self.start_position,
                                     self.max_velocity)

        with patch(
                'ReflectometryServer.beam_path_calc.parking_index_autosave.read_parameter',
                new=Mock(return_value=None)):
            self.comp = Component("component",
                                  setup=PositionAndAngle(0.0, 10.0, 90.0))
            self.comp.beam_path_set_point.set_incoming_beam(
                PositionAndAngle(0.0, 0.0, 0.0))
            self.comp.beam_path_set_point.axis[
                ChangeAxis.POSITION].is_changed = True

            self.jaws_driver = IocDriver(
                self.comp,
                ChangeAxis.POSITION,
                self.axis,
                out_of_beam_positions=[self.out_of_beam_position])
Exemplo n.º 6
0
 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
Exemplo n.º 7
0
    def test_GVIEN_add_driver_WHEN_get_beamline_THEN_driver_added(self):
        comp1 = Component("1", PositionAndAngle(0, 0, 1))
        driver = IocDriver(comp1, ChangeAxis.POSITION,
                           create_mock_axis("MOT0101", 1, 1))
        add_driver(driver)

        result = get_configured_beamline()

        assert_that(result.drivers, only_contains(driver))
Exemplo n.º 8
0
    def test_GIVEN_engineering_correction_offset_of_1_on_angle_driver_WHEN_initialise_THEN_rbv_set_correctly(self):
        correction = 1
        comp = TiltingComponent("comp", PositionAndAngle(0.0, 0.0, 0.0))
        mock_axis = create_mock_axis("MOT:MTR0101", 0, 1)
        driver = IocDriver(comp, ChangeAxis.ANGLE, mock_axis, engineering_correction=ConstantCorrection(correction))
        driver.initialise()

        result = comp.beam_path_set_point.axis[ChangeAxis.ANGLE].get_displacement()

        assert_that(result, is_(-1 * correction))
Exemplo n.º 9
0
    def test_GIVEN_beamline_with_engineering_correction_containing_a_mode_update_correction_WHEN_init_THEN_set_point_includes_correction(self, autosave):
        autosave.read_parameter = Mock(return_value=self.mode1.name)
        comp = Component("comp", PositionAndAngle(0, 0, 90))
        param = AxisParameter("comp", comp, ChangeAxis.POSITION)
        mock_axis = create_mock_axis("mock", 0, 1)
        driver = IocDriver(comp, ChangeAxis.POSITION, mock_axis, engineering_correction=self.mode_selection_correction)

        bl = Beamline(components=[comp], beamline_parameters=[param], drivers=[driver], modes=[self.mode1, self.mode2])

        assert_that(param.sp, is_(-self.mode1_offset))  # readback is -11 so sp must be set to this
Exemplo n.º 10
0
    def test_GIVEN_ioc_driver_with_engineering_correction_WHEN_update_mode_THEN_readback_updated_fired(self):
        mock_axis = create_mock_axis("mock", 0, 1)
        driver = IocDriver(Component("comp", PositionAndAngle(0, 0, 0)), ChangeAxis.POSITION, mock_axis, engineering_correction=self.mode_selection_correction)
        mock_axis.trigger_rbv_change()
        driver.set_observe_mode_change_on(self.mock_beamline)
        mock_listener = Mock()
        driver.add_listener(CorrectionUpdate, mock_listener)

        self.mock_beamline.trigger_listeners(ActiveModeUpdate(self.mode1))

        mock_listener.assert_called_once()
    def test_GIVEN_two_axes_with_backlash_WHEN_triggering_move_THEN_components_move_at_speed_of_slowest_axis(
            self, pos, ang, expected_max_duration):

        detector = TiltingComponent("point_detector",
                                    setup=PositionAndAngle(y=0.0,
                                                           z=6.0,
                                                           angle=90.0))
        detector_height_axis = create_mock_axis("HEIGHT", pos["start"],
                                                pos["max_vel"],
                                                pos["back_dist"],
                                                pos["back_speed"], pos["dir"])
        detector_tilt_axis = create_mock_axis("TILT", ang["start"],
                                              ang["max_vel"], ang["back_dist"],
                                              ang["back_speed"], ang["dir"])
        detector_driver_disp = IocDriver(detector, ChangeAxis.POSITION,
                                         detector_height_axis)
        detector_driver_ang = IocDriver(detector, ChangeAxis.ANGLE,
                                        detector_tilt_axis)
        det_pos = AxisParameter("det_pos", detector, ChangeAxis.POSITION)
        det_ang = AxisParameter("det_ang", detector, ChangeAxis.ANGLE)

        components = [detector]
        beamline_parameters = [det_pos, det_ang]
        drivers = [detector_driver_disp, detector_driver_ang]
        mode = BeamlineMode("mode name", [det_pos.name, det_ang.name])
        beam_start = PositionAndAngle(0.0, 0.0, 0.0)
        beamline = Beamline(components, beamline_parameters, drivers, [mode],
                            beam_start)

        beamline.active_mode = mode.name

        det_pos.sp_no_move = pos["set"]
        det_ang.sp_no_move = ang["set"]

        with patch.object(beamline, '_perform_move_for_all_drivers') as mock:
            beamline.move = 1

            if expected_max_duration == "ERROR":
                mock.assert_not_called()
            else:
                mock.assert_called_with(expected_max_duration)
Exemplo n.º 12
0
    def test_GIVEN_angle_driver_no_engineering_correction_WHEN_receive_set_angle_as_event_for_positionset_THEN_motor_position_is_set(
            self):
        expected_position = 1

        component = TiltingComponent("comp", PositionAndAngle(0, 0, 0))
        mock_axis = create_mock_axis("axis", 0, 1)
        driver = IocDriver(component, ChangeAxis.ANGLE, mock_axis)

        component.beam_path_rbv.axis[ChangeAxis.ANGLE].trigger_listeners(
            DefineValueAsEvent(expected_position, ChangeAxis.ANGLE))

        assert_that(mock_axis.set_position_as_value, is_(expected_position))
Exemplo n.º 13
0
    def test_GIVEN_engineering_correction_offset_of_1_on_angle_driver_WHEN_driver_told_to_go_to_0_THEN_pv_sent_to_1(self):
        expected_correction = 1
        comp = TiltingComponent("comp", PositionAndAngle(0.0, 0.0, 0.0))
        mock_axis = create_mock_axis("MOT:MTR0101", 0, 1)
        driver = IocDriver(comp, ChangeAxis.ANGLE, mock_axis,
                           engineering_correction=ConstantCorrection(expected_correction))
        comp.beam_path_set_point.axis[ChangeAxis.ANGLE].is_changed = lambda: True  # simulate that the component has requested a change
        driver.perform_move(1)

        result = mock_axis.sp

        assert_that(result, is_(close_to(expected_correction, FLOAT_TOLERANCE)))
    def setUp(self):
        start_position_height = 0.0
        max_velocity_height = 10.0
        self.height_axis = create_mock_axis("JAWS:HEIGHT",
                                            start_position_height,
                                            max_velocity_height)

        start_position_tilt = 90.0
        max_velocity_tilt = 10.0
        self.tilt_axis = create_mock_axis("JAWS:TILT", start_position_tilt,
                                          max_velocity_tilt)

        self.tilting_jaws = TiltingComponent("component",
                                             setup=PositionAndAngle(
                                                 0.0, 10.0, 90.0))

        self.tilting_jaws_driver_disp = IocDriver(self.tilting_jaws,
                                                  ChangeAxis.POSITION,
                                                  self.height_axis)
        self.tilting_jaws_driver_ang = IocDriver(self.tilting_jaws,
                                                 ChangeAxis.ANGLE,
                                                 self.tilt_axis)
Exemplo n.º 15
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 setUp(self):
        start_position = 0.0
        max_velocity = 10.0
        self.height_axis = create_mock_axis("JAWS:HEIGHT", start_position,
                                            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_driver = IocDriver(self.jaws, ChangeAxis.POSITION,
                                     self.height_axis)
    def setUp(self):
        start_position_height = 0.0
        max_velocity_height = 10.0
        self.height_axis = create_mock_axis("SM:HEIGHT", start_position_height,
                                            max_velocity_height)

        start_position_angle = 0.0
        max_velocity_angle = 10.0
        self.angle_axis = create_mock_axis("SM:ANGLE", start_position_angle,
                                           max_velocity_angle)

        self.supermirror = ReflectingComponent("component",
                                               setup=PositionAndAngle(
                                                   0.0, 10.0, 90.0))
        self.supermirror.beam_path_set_point.set_incoming_beam(
            PositionAndAngle(0.0, 0.0, 0.0))

        self.supermirror_driver_disp = IocDriver(self.supermirror,
                                                 ChangeAxis.POSITION,
                                                 self.height_axis)
        self.supermirror_driver_ang = IocDriver(self.supermirror,
                                                ChangeAxis.ANGLE,
                                                self.angle_axis)
Exemplo n.º 18
0
    def test_GIVEN_beam_line_parameter_driver_and_component_added_at_marker_WHEN_get_parameters_THEN_inserted_at_right_place(
            self):
        comp1 = Component("1", PositionAndAngle(0, 0, 1))
        expected1 = AxisParameter("param1", comp1, ChangeAxis.POSITION)
        driver1 = IocDriver(comp1, ChangeAxis.POSITION,
                            create_mock_axis("MOT0101", 1, 1))

        comp2 = Component("2", PositionAndAngle(0, 0, 2))
        expected2 = AxisParameter("param2", comp2, ChangeAxis.POSITION)
        driver2 = IocDriver(comp2, ChangeAxis.POSITION,
                            create_mock_axis("MOT0102", 1, 1))

        comp3 = Component("2", PositionAndAngle(0, 0, 2))
        expected3 = AxisParameter("param3", comp3, ChangeAxis.POSITION)
        driver3 = IocDriver(comp3, ChangeAxis.POSITION,
                            create_mock_axis("MOT0103", 1, 1))

        add_component(comp1)
        add_parameter(expected1)
        add_driver(driver1)

        comp_marker = add_component_marker()
        param_marker = add_parameter_marker()
        driver_marker = add_driver_marker()

        add_parameter(expected3)
        add_component(comp3)
        add_driver(driver3)

        add_component(comp2, marker=comp_marker)
        add_parameter(expected2, marker=param_marker)
        add_driver(driver2, marker=driver_marker)

        assert_that(ConfigHelper.parameters,
                    contains(expected1, expected2, expected3))
        assert_that(ConfigHelper.drivers, contains(driver1, driver2, driver3))
        assert_that(ConfigHelper.components, contains(comp1, comp2, comp3))
Exemplo n.º 19
0
    def test_GIVEN_beamline_with_engineering_correction_containing_a_mode_update_correction_WHEN_update_mode_THEN_correct_readback_updated_fired(self):

        comp = Component("comp", PositionAndAngle(0, 0, 90))
        param = AxisParameter("comp", comp, ChangeAxis.POSITION)
        mock_axis = create_mock_axis("mock", 0, 1)
        driver = IocDriver(comp, ChangeAxis.POSITION, mock_axis, engineering_correction=self.mode_selection_correction)
        mock_axis.trigger_rbv_change()
        bl = Beamline(components=[comp], beamline_parameters=[param], drivers=[driver], modes=[self.mode1, self.mode2])

        bl.active_mode = self.mode1.name

        assert_that(self.correction_update.correction, is_(self.mode1_offset))

        bl.active_mode = self.mode2.name

        assert_that(self.correction_update.correction, is_(self.mode2_offset))
Exemplo n.º 20
0
    def test_GIVEN_beam_line_where_autosave_and_engineering_correction_on_displacement_WHEN_init_THEN_beamline_is_at_given_place(self, param_float_autosave):
        expected_setpoint = 1.0
        multiple = 2.0
        param_float_autosave.read_parameter.return_value = expected_setpoint
        offset = expected_setpoint / multiple
        comp = Component("comp", PositionAndAngle(0.0, 0, 90))
        param = AxisParameter("param", comp, ChangeAxis.POSITION, autosave=True)
        axis = create_mock_axis("MOT:MTR0101", offset + expected_setpoint, 1)
        driver = IocDriver(comp, ChangeAxis.POSITION, axis,
                           engineering_correction=UserFunctionCorrection(lambda sp: sp / multiple))
        nr_mode = BeamlineMode("NR", [param.name], {})
        bl = Beamline([comp], [param], [driver], [nr_mode])
        bl.active_mode = nr_mode.name

        result = comp.beam_path_set_point.axis[ChangeAxis.POSITION].get_displacement()

        assert_that(result, is_(close_to(expected_setpoint, 1e-6)))
Exemplo n.º 21
0
    def test_GIVEN_displacement_driver_with_engineering_correction_WHEN_receive_set_position_as_event_for_positionset_THEN_motor_position_is_set_with_correction(
            self):
        expected_position = 1
        correction = 1

        component = Component("comp", PositionAndAngle(0, 0, 0))
        mock_axis = create_mock_axis("axis", 0, 1)
        driver = IocDriver(
            component,
            ChangeAxis.POSITION,
            mock_axis,
            engineering_correction=ConstantCorrection(correction))

        component.beam_path_rbv.axis[ChangeAxis.POSITION].trigger_listeners(
            DefineValueAsEvent(expected_position, ChangeAxis.POSITION))

        assert_that(mock_axis.set_position_as_value,
                    is_(expected_position + correction))
    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 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_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))
Exemplo n.º 27
0
def get_beamline(macros):
    beam_angle_natural = -45
    perp_to_floor = 90.0

    # MODES
    nr = add_mode("nr")
    pnr = add_mode("pnr")
    disabled = add_mode("disabled", is_disabled=True)

    add_component(Component("s1", PositionAndAngle(0.0, 1, perp_to_floor)))

    super_mirror = add_component(
        ReflectingComponent("sm", PositionAndAngle(0.0, 5, perp_to_floor)))
    add_parameter(InBeamParameter("smenabled", super_mirror),
                  modes=[pnr],
                  mode_inits=[(nr, False), (pnr, True)])
    add_parameter(AxisParameter("smangle", super_mirror, ChangeAxis.ANGLE),
                  modes=[pnr],
                  mode_inits=[(nr, 0.0), (pnr, 0.5)])
    add_driver(
        IocDriver(super_mirror,
                  ChangeAxis.POSITION,
                  create_mock_axis("MOT:MTR0101", 0, 1),
                  out_of_beam_positions=[OutOfBeamPosition(position=-10)]))

    s2 = add_component(Component("s2", PositionAndAngle(0.0, 9,
                                                        perp_to_floor)))
    add_parameter(AxisParameter("slit2pos", s2, ChangeAxis.POSITION),
                  modes=[nr, pnr])

    sample = add_component(
        ReflectingComponent("sample", PositionAndAngle(0.0, 10,
                                                       perp_to_floor)))
    add_parameter(AxisParameter("samplepos", sample, ChangeAxis.POSITION),
                  modes=[nr, pnr])

    theta = add_component(
        ThetaComponent("THETA", PositionAndAngle(0, 10, perp_to_floor)))
    add_parameter(AxisParameter("theta", theta, ChangeAxis.ANGLE),
                  modes=[nr, pnr])

    s3 = add_component(
        Component("s3", PositionAndAngle(0.0, 15, perp_to_floor)))
    add_parameter(AxisParameter("slit3pos", s3, ChangeAxis.POSITION),
                  modes=[nr, pnr])

    s4 = add_component(
        Component("s4", PositionAndAngle(0.0, 19, perp_to_floor)))
    add_parameter(AxisParameter("slit4pos", s4, ChangeAxis.POSITION),
                  modes=[nr, pnr])

    point_det = add_component(
        TiltingComponent("det", PositionAndAngle(0.0, 20, perp_to_floor)))
    add_parameter(AxisParameter("detpos", point_det, ChangeAxis.POSITION),
                  modes=[nr, pnr, disabled])
    theta.add_angle_to(point_det)

    if optional_is_set(1, macros):
        add_parameter(
            AxisParameter(OPTIONAL_PARAM_1, point_det, ChangeAxis.CHI))

    add_beam_start(PositionAndAngle(0.0, 0.0, beam_angle_natural))

    return get_configured_beamline()
    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