def beamline_with_3_empty_parameters():
        """

        Returns: a beamline with three empty parameters, all in a mode

        """
        one = EmptyBeamlineParameter("one")
        two = EmptyBeamlineParameter("two")
        three = EmptyBeamlineParameter("three")
        beamline_parameters = [one, two, three]
        mode = BeamlineMode("all", [
            beamline_parameter.name
            for beamline_parameter in beamline_parameters
        ])
        naught_and_two = BeamlineMode(
            "components1and3",
            [beamline_parameters[0].name, beamline_parameters[2].name])
        two = BeamlineMode("just2", [beamline_parameters[2].name])

        beamline = Beamline([], beamline_parameters, [],
                            [mode, naught_and_two, two])

        beamline.active_mode = mode.name

        return beamline_parameters, beamline
 def beamline_with_one_mode_init_param_in_mode_and_at_off_init(
         init_sm_angle, off_init, param_name):
     super_mirror = ReflectingComponent(
         "super mirror", PositionAndAngle(z=10, y=0, angle=90))
     smangle = AxisParameter(param_name, super_mirror, ChangeAxis.ANGLE)
     beamline_mode = BeamlineMode("mode name", [smangle.name],
                                  {smangle.name: init_sm_angle})
     beamline = Beamline([super_mirror], [smangle], [], [beamline_mode])
     beamline.active_mode = beamline_mode.name
     smangle.sp = off_init
     return Beamline([super_mirror], [smangle], [], [beamline_mode])
Example #3
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))
Example #4
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)))
Example #5
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
    def setUp(self):
        beam_start = PositionAndAngle(y=0, z=0, angle=2.5)
        s0 = Component("s0", setup=PositionAndAngle(0, 0, 90))
        s1 = Component("s1", setup=PositionAndAngle(0, 1, 90))
        frame_overlap_mirror = ReflectingComponent("FOM",
                                                   setup=PositionAndAngle(
                                                       0, 2, 90))
        frame_overlap_mirror.beam_path_set_point.is_in_beam = False
        self.polarising_mirror = ReflectingComponent("Polariser",
                                                     setup=PositionAndAngle(
                                                         0, 3, 90))
        self.polarising_mirror.beam_path_set_point.is_in_beam = False
        s2 = Component("s2", setup=PositionAndAngle(0, 4, 90))
        self.ideal_sample_point = ReflectingComponent("ideal sample point",
                                                      setup=PositionAndAngle(
                                                          0, 5, 90))
        s3 = Component("s3", setup=PositionAndAngle(0, 6, 90))
        analyser = ReflectingComponent("analyser",
                                       setup=PositionAndAngle(0, 7, 90))
        analyser.beam_path_set_point.is_in_beam = False
        s4 = Component("s4", setup=PositionAndAngle(0, 8, 90))
        detector = Component("detector", setup=PositionAndAngle(0, 10, 90))

        theta = create_parameter_with_initial_value(0, AxisParameter, "theta",
                                                    self.ideal_sample_point,
                                                    ChangeAxis.ANGLE)
        theta.sp_no_move = 0
        smangle = create_parameter_with_initial_value(0, AxisParameter,
                                                      "smangle",
                                                      self.polarising_mirror,
                                                      ChangeAxis.ANGLE)
        smangle.sp_no_move = 0

        self.nr_mode = BeamlineMode("NR Mode", [theta.name])
        self.polarised_mode = BeamlineMode("Polarised Mode",
                                           [smangle.name, theta.name])

        self.beamline = Beamline([
            s0, s1, frame_overlap_mirror, self.polarising_mirror, s2,
            self.ideal_sample_point, s3, analyser, s4, detector
        ], [smangle, theta], [], [self.nr_mode, self.polarised_mode],
                                 beam_start)
def create_beamline():
    """

    Returns: example beamline

    """
    perp_to_floor = 90.0
    beam_start = PositionAndAngle(y=0, z=0, angle=-2.5)
    s0 = Component("s0", setup=PositionAndAngle(0, 0, perp_to_floor))
    s1 = Component("s1", setup=PositionAndAngle(0, 1, perp_to_floor))
    frame_overlap_mirror = ReflectingComponent("FOM",
                                               setup=PositionAndAngle(
                                                   0, 2, perp_to_floor))
    frame_overlap_mirror.beam_path_set_point.is_in_beam = False
    polarising_mirror = ReflectingComponent("Polarising mirror",
                                            setup=PositionAndAngle(
                                                0, 3, perp_to_floor))
    polarising_mirror.beam_path_set_point.is_in_beam = False
    s2 = Component("s2", setup=PositionAndAngle(0, 4, perp_to_floor))
    ideal_sample_point = ReflectingComponent("Ideal Sample Point",
                                             setup=PositionAndAngle(
                                                 0, 5, perp_to_floor))
    s3 = Component("s3", setup=PositionAndAngle(0, 6, perp_to_floor))
    analyser = ReflectingComponent("analyser",
                                   setup=PositionAndAngle(0, 7, perp_to_floor))
    analyser.beam_path_set_point.is_in_beam = False
    s4 = Component("s4", setup=PositionAndAngle(0, 8, perp_to_floor))
    detector = Component("detector",
                         setup=PositionAndAngle(0, 10, perp_to_floor))

    theta = AxisParameter("theta", ideal_sample_point, ChangeAxis.ANGLE)
    nr_mode = BeamlineMode("NR", ["theta"])
    beamline = Beamline([
        s0, s1, frame_overlap_mirror, polarising_mirror, s2,
        ideal_sample_point, s3, analyser, s4, detector
    ], [theta], [], [nr_mode], beam_start)

    beamline.active_mode = nr_mode.name

    return beamline
    def setUp(self) -> None:
        self.param_name = "ENUM"
        self.pvname = "PARAM:{}".format(self.param_name)
        self.opt1 = "opt1"
        options = [self.opt1, "opt2"]
        self.index_of_opt1 = 0
        self.param = EnumParameter(self.param_name, options)
        bl = Beamline([], [self.param], [], [BeamlineMode("mode", [])])

        pvmanager = PVManager()
        pvmanager.set_beamline(bl)

        self.driver_helper = DriverParamHelper(pvmanager, bl)
    def beamline_s1_gap_theta_s3_gap_detector(spacing):
        """
        Create beamline with Slits 1 and 3 a theta and a detector
        Args:
            spacing: spacing between components

        Returns: beamline, axes

        """
        # DRIVERS
        s1_gap_axis = create_mock_axis("MOT:MTR0101", 0, 1)
        s3_gap_axis = create_mock_axis("MOT:MTR0103", 0, 1)
        axes = {"s1_gap_axis": s1_gap_axis}
        drives = []

        # COMPONENTS
        theta = ThetaComponent("ThetaComp_comp",
                               PositionAndAngle(0.0, 2 * spacing, 90))
        detector = TiltingComponent("Detector_comp",
                                    PositionAndAngle(0.0, 4 * spacing, 90))
        theta.add_angle_to(detector)
        comps = [theta]

        # BEAMLINE PARAMETERS
        s1_gap = create_parameter_with_initial_value(0, SlitGapParameter,
                                                     "s1_gap", s1_gap_axis)
        theta_ang = create_parameter_with_initial_value(
            0, AxisParameter, "theta", theta, ChangeAxis.ANGLE)
        s3_gap = create_parameter_with_initial_value(0, SlitGapParameter,
                                                     "s3_gap", s3_gap_axis)
        detector_position = create_parameter_with_initial_value(
            0, AxisParameter, "det", detector, ChangeAxis.POSITION)
        detector_angle = create_parameter_with_initial_value(
            0, AxisParameter, "det_angle", detector, ChangeAxis.ANGLE)
        params = [s1_gap, theta_ang, s3_gap, detector_position, detector_angle]

        # MODES
        nr_inits = {}
        nr_mode = [
            BeamlineMode("NR", [param.name for param in params], nr_inits)
        ]
        beam_start = PositionAndAngle(0.0, 0.0, 0.0)
        bl = Beamline(comps, params, drives, nr_mode, beam_start)

        # Initialise motor positions to get rbv call backs set
        s1_gap_axis.sp = 0
        s3_gap_axis.sp = 0

        return bl, axes
def _create_beamline_in_error(error_message):
    """
    Args:
        error_message: error message to set for beamline
    Returns: a blank beamline with an error status set

    """
    error_mode = BeamlineMode("No modes", [])
    beamline = Beamline([], [], [], [error_mode])
    try:
        STATUS_MANAGER.update_active_problems(
            ProblemInfo(
                "Error reading configuration: {}".format(error_message),
                "Configuration", Severity.MAJOR_ALARM))
    except Exception as e:
        print(e)
    return beamline
class TestComponentBeamline(unittest.TestCase):
    def setUp(self):
        beam_start = PositionAndAngle(y=0, z=0, angle=2.5)
        s0 = Component("s0", setup=PositionAndAngle(0, 0, 90))
        s1 = Component("s1", setup=PositionAndAngle(0, 1, 90))
        frame_overlap_mirror = ReflectingComponent("FOM",
                                                   setup=PositionAndAngle(
                                                       0, 2, 90))
        frame_overlap_mirror.beam_path_set_point.is_in_beam = False
        self.polarising_mirror = ReflectingComponent("Polariser",
                                                     setup=PositionAndAngle(
                                                         0, 3, 90))
        self.polarising_mirror.beam_path_set_point.is_in_beam = False
        s2 = Component("s2", setup=PositionAndAngle(0, 4, 90))
        self.ideal_sample_point = ReflectingComponent("ideal sample point",
                                                      setup=PositionAndAngle(
                                                          0, 5, 90))
        s3 = Component("s3", setup=PositionAndAngle(0, 6, 90))
        analyser = ReflectingComponent("analyser",
                                       setup=PositionAndAngle(0, 7, 90))
        analyser.beam_path_set_point.is_in_beam = False
        s4 = Component("s4", setup=PositionAndAngle(0, 8, 90))
        detector = Component("detector", setup=PositionAndAngle(0, 10, 90))

        theta = create_parameter_with_initial_value(0, AxisParameter, "theta",
                                                    self.ideal_sample_point,
                                                    ChangeAxis.ANGLE)
        theta.sp_no_move = 0
        smangle = create_parameter_with_initial_value(0, AxisParameter,
                                                      "smangle",
                                                      self.polarising_mirror,
                                                      ChangeAxis.ANGLE)
        smangle.sp_no_move = 0

        self.nr_mode = BeamlineMode("NR Mode", [theta.name])
        self.polarised_mode = BeamlineMode("Polarised Mode",
                                           [smangle.name, theta.name])

        self.beamline = Beamline([
            s0, s1, frame_overlap_mirror, self.polarising_mirror, s2,
            self.ideal_sample_point, s3, analyser, s4, detector
        ], [smangle, theta], [], [self.nr_mode, self.polarised_mode],
                                 beam_start)

    def test_GIVEN_beam_line_contains_multiple_component_WHEN_set_theta_THEN_angle_between_incoming_and_outgoing_beam_is_correct(
            self):
        self.beamline.active_mode = self.nr_mode.name

        theta_set = 10.0
        self.beamline.parameter("theta").sp = theta_set

        reflection_angle = self.ideal_sample_point.beam_path_set_point.get_outgoing_beam(
        ).angle - self.ideal_sample_point.beam_path_set_point._incoming_beam.angle
        assert_that(reflection_angle, is_(theta_set * 2.0))

    def test_GIVEN_beam_line_contains_active_super_mirror_WHEN_set_theta_THEN_angle_between_incoming_and_outgoing_beam_is_correct(
            self):
        self.beamline.active_mode = self.polarised_mode.name
        theta_set = 10.0
        self.polarising_mirror.beam_path_set_point.is_in_beam = True
        self.beamline.parameter("smangle").sp = 10

        self.beamline.parameter("theta").sp = theta_set

        reflection_angle = self.ideal_sample_point.beam_path_set_point.get_outgoing_beam(
        ).angle - self.ideal_sample_point.beam_path_set_point._incoming_beam.angle
        assert_that(reflection_angle, is_(theta_set * 2.0))

    def test_GIVEN_beam_line_contains_active_super_mirror_WHEN_angle_set_THEN_angle_between_incoming_and_outgoing_beam_is_correct(
            self):
        self.beamline.active_mode = self.polarised_mode.name
        theta_set = 10.0
        self.beamline.parameter("theta").sp = theta_set
        self.polarising_mirror.beam_path_set_point.is_in_beam = True

        self.beamline.parameter("smangle").sp = 10

        reflection_angle = self.ideal_sample_point.beam_path_set_point.get_outgoing_beam(
        ).angle - self.ideal_sample_point.beam_path_set_point._incoming_beam.angle
        assert_that(reflection_angle, is_(theta_set * 2.0))
    def create_beamline(self, param):
        bl = Beamline([], [param], [], [BeamlineMode("mode", [])])
        pvmanager = PVManager()
        pvmanager.set_beamline(bl)

        return pvmanager
    def beamline_sm_theta_detector(sm_angle,
                                   theta,
                                   det_offset=0,
                                   autosave_theta_not_offset=True,
                                   beam_angle=0.0,
                                   sm_angle_engineering_correction=False):
        """
        Create beamline with supermirror, theta and a tilting detector.

        Args:
            sm_angle (float): The initialisation value for supermirror angle
            theta (float): The initialisation value for theta
            det_offset (float): The initialisation value for detector offset
            autosave_theta_not_offset (bool): true to autosave theta and not the offset, false otherwise
            beam_angle (float): angle of the beam, worked out as the angle the components run along + 90

        Returns: beamline, axes
        """
        beam_start = PositionAndAngle(0.0, 0.0, 0.0)
        perp_to_floor_angle_in_mantid = 90 + beam_angle

        # COMPONENTS
        z_sm_to_sample = 1
        z_sample_to_det = 2
        sm_comp = ReflectingComponent(
            "sm_comp", PositionAndAngle(0.0, 0, perp_to_floor_angle_in_mantid))
        detector_comp = TiltingComponent(
            "detector_comp",
            PositionAndAngle(0.0, z_sm_to_sample + z_sample_to_det,
                             perp_to_floor_angle_in_mantid))
        theta_comp = ThetaComponent(
            "theta_comp",
            PositionAndAngle(0.0, z_sm_to_sample,
                             perp_to_floor_angle_in_mantid))
        theta_comp.add_angle_to(detector_comp)

        comps = [sm_comp, theta_comp, detector_comp]

        # BEAMLINE PARAMETERS
        sm_angle_param = AxisParameter("sm_angle", sm_comp, ChangeAxis.ANGLE)
        theta_param = AxisParameter("theta",
                                    theta_comp,
                                    ChangeAxis.ANGLE,
                                    autosave=autosave_theta_not_offset)
        detector_position_param = AxisParameter(
            "det_pos",
            detector_comp,
            ChangeAxis.POSITION,
            autosave=not autosave_theta_not_offset)
        detector_angle_param = AxisParameter("det_angle", detector_comp,
                                             ChangeAxis.ANGLE)

        params = [
            sm_angle_param, theta_param, detector_position_param,
            detector_angle_param
        ]

        # DRIVERS
        # engineering correction
        if sm_angle_engineering_correction:
            grid_data_provider = GridDataFileReader("linear_theta")
            grid_data_provider.variables = ["Theta"]
            grid_data_provider.points = np.array([[
                -90,
            ], [
                0.0,
            ], [
                90.0,
            ]])
            grid_data_provider.corrections = np.array([-45, 0.0, 45])
            grid_data_provider.read = lambda: None
            correction = InterpolateGridDataCorrectionFromProvider(
                grid_data_provider, theta_param)
            size_of_correction = theta / 2.0
        else:
            correction = None
            size_of_correction = 0

        # setup motors
        beam_angle_after_sample = theta * 2 + sm_angle * 2
        supermirror_segment = (z_sm_to_sample, sm_angle)
        theta_segment = (z_sample_to_det, theta)
        reflection_offset = DataMother._calc_reflection_offset(
            beam_angle, [supermirror_segment, theta_segment])
        sm_axis = create_mock_axis("MOT:MTR0101",
                                   sm_angle + size_of_correction, 1)
        det_axis = create_mock_axis("MOT:MTR0104",
                                    reflection_offset + det_offset, 1)
        det_angle_axis = create_mock_axis(
            "MOT:MTR0105", beam_start.angle + beam_angle_after_sample, 1)

        axes = {
            "sm_axis": sm_axis,
            "det_axis": det_axis,
            "det_angle_axis": det_angle_axis
        }

        drives = [
            IocDriver(sm_comp,
                      ChangeAxis.ANGLE,
                      sm_axis,
                      engineering_correction=correction),
            IocDriver(detector_comp, ChangeAxis.POSITION, det_axis),
            IocDriver(detector_comp, ChangeAxis.ANGLE, det_angle_axis)
        ]

        # MODES
        nr_inits = {}
        nr_mode = BeamlineMode("NR", [param.name for param in params],
                               nr_inits)
        modes = [nr_mode]
        beam_start = PositionAndAngle(0.0, 0.0, 0.0)
        bl = Beamline(comps, params, drives, modes, beam_start)
        bl.active_mode = nr_mode.name
        return bl, axes