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}))
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
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])
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_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))
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))
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
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)
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))
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)
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)
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))
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))
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)))
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))
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