def _do_test_quaternion(self, angle, axis, expected_axis=None): # Act quaternion = Quat(angle, axis) converted_angle, converted_axis = quaternion_to_angle_and_axis(quaternion) # Assert if expected_axis is not None: axis = expected_axis self.assertAlmostEqual(angle, converted_angle) self.assertAlmostEqual(axis[0], converted_axis[0]) self.assertAlmostEqual(axis[1], converted_axis[1]) self.assertAlmostEqual(axis[2], converted_axis[2])
def _do_test_quaternion(self, angle, axis, expected_axis=None): # Act quaternion = Quat(angle, axis) converted_angle, converted_axis = quaternion_to_angle_and_axis(quaternion) # Assert if expected_axis is not None: axis = expected_axis self.assertAlmostEqual(angle, converted_angle) self.assertAlmostEqual(axis[0], converted_axis[0]) self.assertAlmostEqual(axis[1], converted_axis[1]) self.assertAlmostEqual(axis[2], converted_axis[2])
def set_selected_components_to_original_position(workspace, component_names): """ Sets a component to its original (non-moved) position, i.e. the position one obtains when using standard loading. The way we know the original position/rotation is the base instrument. We look at the difference between the instrument and the base instrument and perform a reverse operation. :param workspace: the workspace which will have the move applied to it. :param component_names: the name of the component which is to be moved. """ # First get the original rotation and position of the unaltered instrument components. This information # is stored in the base instrument instrument = workspace.getInstrument() base_instrument = instrument.getBaseInstrument() # Get the original position and rotation for component_name in component_names: base_component = base_instrument.getComponentByName(component_name) moved_component = instrument.getComponentByName(component_name) # It can be that monitors are already defined in the IDF but they cannot be found on the workspace. They # are buffer monitor names which the experiments might use in the future. Hence we need to check if a component # is zero at this point if base_component is None or moved_component is None: continue base_position = base_component.getPos() base_rotation = base_component.getRotation() moved_position = moved_component.getPos() moved_rotation = moved_component.getRotation() move_alg = None if base_position != moved_position: if move_alg is None: move_alg_name = "MoveInstrumentComponent" move_alg_options = { "Workspace": workspace, "RelativePosition": False, "ComponentName": component_name, "X": base_position[0], "Y": base_position[1], "Z": base_position[2] } move_alg = create_unmanaged_algorithm(move_alg_name, **move_alg_options) else: move_alg.setProperty("ComponentName", component_name) move_alg.setProperty("X", base_position[0]) move_alg.setProperty("Y", base_position[1]) move_alg.setProperty("Z", base_position[2]) move_alg.execute() rot_alg = None if base_rotation != moved_rotation: angle, axis = quaternion_to_angle_and_axis(moved_rotation) # If the axis is a zero vector then, we continue, there is nothing to rotate if not is_zero_axis(axis): if rot_alg is None: rot_alg_name = "RotateInstrumentComponent" rot_alg_options = { "Workspace": workspace, "RelativeRotation": True, "ComponentName": component_name, "X": axis[0], "Y": axis[1], "Z": axis[2], "Angle": -1 * angle } rot_alg = create_unmanaged_algorithm( rot_alg_name, **rot_alg_options) else: rot_alg.setProperty("ComponentName", component_name) rot_alg.setProperty("X", axis[0]) rot_alg.setProperty("Y", axis[1]) rot_alg.setProperty("Z", axis[2]) rot_alg.setProperty("Angle", -1 * angle) rot_alg.execute()
def set_selected_components_to_original_position(workspace, component_names): """ Sets a component to its original (non-moved) position, i.e. the position one obtains when using standard loading. The way we know the original position/rotation is the base instrument. We look at the difference between the instrument and the base instrument and perform a reverse operation. :param workspace: the workspace which will have the move applied to it. :param component_names: the name of the component which is to be moved. """ # First get the original rotation and position of the unaltered instrument components. This information # is stored in the base instrument instrument = workspace.getInstrument() base_instrument = instrument.getBaseInstrument() # Get the original position and rotation for component_name in component_names: base_component = base_instrument.getComponentByName(component_name) moved_component = instrument.getComponentByName(component_name) # It can be that monitors are already defined in the IDF but they cannot be found on the workspace. They # are buffer monitor names which the experiments might use in the future. Hence we need to check if a component # is zero at this point if base_component is None or moved_component is None: continue base_position = base_component.getPos() base_rotation = base_component.getRotation() moved_position = moved_component.getPos() moved_rotation = moved_component.getRotation() move_alg = None if base_position != moved_position: if move_alg is None: move_alg_name = "MoveInstrumentComponent" move_alg_options = {"Workspace": workspace, "RelativePosition": False, "ComponentName": component_name, "X": base_position[0], "Y": base_position[1], "Z": base_position[2]} move_alg = create_unmanaged_algorithm(move_alg_name, **move_alg_options) else: move_alg.setProperty("ComponentName", component_name) move_alg.setProperty("X", base_position[0]) move_alg.setProperty("Y", base_position[1]) move_alg.setProperty("Z", base_position[2]) move_alg.execute() rot_alg = None if base_rotation != moved_rotation: angle, axis = quaternion_to_angle_and_axis(moved_rotation) # If the axis is a zero vector then, we continue, there is nothing to rotate if not is_zero_axis(axis): if rot_alg is None: rot_alg_name = "RotateInstrumentComponent" rot_alg_options = {"Workspace": workspace, "RelativeRotation": True, "ComponentName": component_name, "X": axis[0], "Y": axis[1], "Z": axis[2], "Angle": -1*angle} rot_alg = create_unmanaged_algorithm(rot_alg_name, **rot_alg_options) else: rot_alg.setProperty("ComponentName", component_name) rot_alg.setProperty("X", axis[0]) rot_alg.setProperty("Y", axis[1]) rot_alg.setProperty("Z", axis[2]) rot_alg.setProperty("Angle", -1*angle) rot_alg.execute()