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)
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))
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))
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")
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))
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