Ejemplo n.º 1
0
 def test_only_one_det(self):
     # Disable one detector
     self.b.configure(
         self.make_generator(),
         self.tmpdir,
         detectors=DetectorTable.from_rows(
             [(False, "SLOW", "slow", 0.0, 0), [True, "FAST", "fast", 0.0, 1]]
         ),
     )
     assert self.b.state.value == "Armed"
     assert self.bs.state.value == "Ready"
     assert self.bf.state.value == "Armed"
     self.b.completedSteps.put_value(2)
     assert self.b.state.value == "Armed"
     assert self.bs.state.value == "Ready"
     assert self.bf.state.value == "Armed"
     self.b.run()
     assert self.b.state.value == "Finished"
     assert self.bs.state.value == "Ready"
     assert self.bf.state.value == "Finished"
     self.b.reset()
     assert self.b.state.value == "Ready"
     assert self.bs.state.value == "Ready"
     assert self.bf.state.value == "Ready"
     self.b.abort()
     assert self.b.state.value == "Aborted"
     assert self.bs.state.value == "Aborted"
     assert self.bf.state.value == "Aborted"
Ejemplo n.º 2
0
 def test_validate(self):
     compound = self.make_generator()
     detectors = DetectorTable.from_rows([[True, "DET", "DETECTOR", 0.0,
                                           1]])
     ret = self.b.validate(compound, self.tmpdir, detectors=detectors)
     assert list(ret["detectors"].rows()) == [[
         True, "DET", "DETECTOR", 0.098995, 1
     ]]
Ejemplo n.º 3
0
    def test_breakpoints_with_pause(self):
        breakpoints = [2, 3, 10, 2]
        self.b.configure(
            generator=self.make_generator_breakpoints(),
            fileDir=self.tmpdir,
            detectors=DetectorTable.from_rows(
                [[False, "SLOW", "slow", 0.0, 1], [True, "FAST", "fast", 0.0, 1]]
            ),
            axesToMove=["x"],
            breakpoints=breakpoints,
        )

        assert self.ct.configure_params.generator.size == 17

        self.checkSteps(self.b, 2, 0, 17)
        self.checkSteps(self.bf, 2, 0, 17)
        self.checkState(self.b, RunnableStates.ARMED)

        self.b.run()
        self.checkSteps(self.b, 5, 2, 17)
        self.checkSteps(self.bf, 5, 2, 17)
        self.checkState(self.b, RunnableStates.ARMED)

        # rewind
        self.b.pause(lastGoodStep=1)
        self.checkSteps(self.b, 2, 1, 17)
        self.checkSteps(self.bf, 2, 1, 17)
        self.checkState(self.b, RunnableStates.ARMED)
        self.b.run()
        self.checkSteps(self.b, 5, 2, 17)
        self.checkSteps(self.bf, 5, 2, 17)
        self.checkState(self.b, RunnableStates.ARMED)

        self.b.run()
        self.checkSteps(self.b, 15, 5, 17)
        self.checkSteps(self.bf, 15, 5, 17)
        self.checkState(self.b, RunnableStates.ARMED)

        self.b.run()
        self.checkSteps(self.b, 17, 15, 17)
        self.checkSteps(self.bf, 17, 15, 17)
        self.checkState(self.b, RunnableStates.ARMED)

        # rewind
        self.b.pause(lastGoodStep=11)
        self.checkSteps(self.b, 15, 11, 17)
        self.checkSteps(self.bf, 15, 11, 17)
        self.checkState(self.b, RunnableStates.ARMED)
        self.b.run()
        self.checkSteps(self.b, 17, 15, 17)
        self.checkSteps(self.bf, 17, 15, 17)
        self.checkState(self.b, RunnableStates.ARMED)

        self.b.run()
        self.checkSteps(self.b, 17, 17, 17)
        self.checkSteps(self.bf, 17, 17, 17)
        self.checkState(self.b, RunnableStates.FINISHED)
Ejemplo n.º 4
0
 def test_system_defined_exposure(self):
     xs = LineGenerator("x", "mm", 0.0, 0.3, 4)
     ys = LineGenerator("y", "mm", 0.0, 0.1, 2)
     generator = CompoundGenerator([ys, xs], [], [], 1.0)
     generator.prepare()
     detectors = DetectorTable.from_rows([[True, "det", "DET", 0.1, 5]])
     b = self.scan.block_view()
     b.configure(generator, self.tmpdir, detectors=detectors)
     self.check_pulse_mocks(0.1, 0.2, 0.05, 5)
Ejemplo n.º 5
0
 def test_setting_exposure_on_no_exposure_det_fails(self):
     with self.assertRaises(BadValueError) as cm:
         self.b.validate(
             self.make_generator(),
             self.tmpdir,
             detectors=DetectorTable.from_rows(
                 [(True, "FAST", "fast", 0.0, 1), (True, "SLOW", "slow", 0.5, 1)]
             ),
         )
     assert str(cm.exception) == "Detector SLOW doesn't take exposure"
Ejemplo n.º 6
0
 def test_bad_det_mri(self):
     # Send mismatching rows
     with self.assertRaises(AssertionError) as cm:
         self.b.configure(
             self.make_generator(),
             self.tmpdir,
             axesToMove=(),
             detectors=DetectorTable.from_rows([(True, "SLOW", "fast", 0.0, 0)]),
         )
     assert str(cm.exception) == "SLOW has mri slow, passed fast"
Ejemplo n.º 7
0
 def test_guessing_frames_and_exposure(self):
     self.slow_multi.active = True
     ret = self.b.validate(
         self.make_generator(),
         self.tmpdir,
         detectors=DetectorTable.from_rows([(True, "FAST", "fast", 0.0, 0)]),
     )
     assert list(ret.detectors.rows()) == [
         [True, "FAST", "fast", 0.99895, 1],
         [False, "SLOW", "slow", 0, 0],
     ]
Ejemplo n.º 8
0
 def test_guessing_frames_1(self):
     ret = self.b.validate(
         self.make_generator(),
         self.tmpdir,
         detectors=DetectorTable.from_rows(
             [(True, "FAST", "fast", 0.5, 0), (True, "SLOW", "slow", 0.0, 1)]
         ),
     )
     assert list(ret.detectors.rows()) == [
         [True, "FAST", "fast", 0.5, 1],
         [True, "SLOW", "slow", 0.0, 1],
     ]
Ejemplo n.º 9
0
 def test_validate_returns_exposures(self):
     ret = self.b.validate(
         self.make_generator(),
         self.tmpdir,
         detectors=DetectorTable.from_rows(
             [(True, "SLOW", "slow", 0.0, 1), (True, "FAST", "fast", 0.0, 1)]
         ),
     )
     assert list(ret.detectors.rows()) == [
         [True, "SLOW", "slow", 0.0, 1],
         [True, "FAST", "fast", 0.99895, 1],
     ]
Ejemplo n.º 10
0
    def test_on_validate_tweaks_zero_duration(self):
        points = StaticPointGenerator(10)
        generator = CompoundGenerator([points], [], [], 0.0)
        generator.prepare()
        # Disable the detector
        detectors = DetectorTable.from_rows([[False, "det", "DET", 0.0, 5]])
        # Expected duration is 2 clock cycles
        expected_duration = 2 * 8.0e-9

        b = self.scan.block_view()
        params = b.validate(generator, self.tmpdir, detectors=detectors)

        self.assertEqual(expected_duration, params["generator"]["duration"])
Ejemplo n.º 11
0
 def test_multi_frame_no_infos_fails(self):
     with self.assertRaises(BadValueError) as cm:
         self.b.configure(
             self.make_generator(),
             self.tmpdir,
             detectors=DetectorTable.from_rows(
                 [(True, "SLOW", "slow", 0.0, 1), (True, "FAST", "fast", 0.0, 5)]
             ),
         )
     assert str(cm.exception) == (
         "There are no trigger multipliers setup for Detector 'FAST' "
         "so framesPerStep can only be 0 or 1 for this row in the detectors "
         "table"
     )
Ejemplo n.º 12
0
    def test_on_validate_raises_AssertionError_for_negative_duration(self):
        xs = LineGenerator("x", "mm", 0.0, 0.3, 4)
        ys = LineGenerator("y", "mm", 0.0, 0.1, 2)
        generator = CompoundGenerator([ys, xs], [], [], -1.0)
        generator.prepare()
        # Disable the detector
        detectors = DetectorTable.from_rows([[False, "det", "DET", 0.0, 5]])

        b = self.scan.block_view()
        self.assertRaises(AssertionError,
                          b.validate,
                          generator,
                          self.tmpdir,
                          detectors=detectors)
Ejemplo n.º 13
0
 def test_configure_multiple_no_exposure(self):
     xs = LineGenerator("x", "mm", 0.0, 0.3, 4)
     ys = LineGenerator("y", "mm", 0.0, 0.1, 2)
     generator = CompoundGenerator([ys, xs], [], [], 1.0)
     generator.prepare()
     detectors = DetectorTable.from_rows([[True, "det", "DET", 0.0, 5]])
     self.o.on_configure(self.context, generator, detectors)
     assert self.o.generator_duration == 1.0
     assert self.o.frames_per_step == 5
     # Detector would normally be configured by DetectorChildPart
     detector = self.process.block_view("DET")
     spg = StaticPointGenerator(5, axes=["det_frames_per_step"])
     ex = SquashingExcluder(axes=["det_frames_per_step", "x"])
     generatormultiplied = CompoundGenerator([ys, xs, spg], [ex], [], 0.2)
     detector.configure(generatormultiplied, self.tmpdir)
     self.o.on_post_configure()
     self.check_pulse_mocks(0.19899, 0.2, 0.000505, 5)
Ejemplo n.º 14
0
    def test_breakpoints_tomo(self):
        breakpoints = [2, 3, 10, 2]
        # Configure RunnableController(mri='top')
        self.b.configure(
            generator=self.make_generator_breakpoints(),
            fileDir=self.tmpdir,
            detectors=DetectorTable.from_rows(
                [[False, "SLOW", "slow", 0.0, 1], [True, "FAST", "fast", 0.0, 1]]
            ),
            axesToMove=["x"],
            breakpoints=breakpoints,
        )

        assert self.ct.configure_params.generator.size == 17
        self.checkSteps(self.b, 2, 0, 17)
        self.checkSteps(self.bf, 2, 0, 17)
        assert self.b.state.value == "Armed"
        assert self.bs.state.value == "Ready"
        assert self.bf.state.value == "Armed"

        self.b.run()
        self.checkSteps(self.b, 5, 2, 17)
        self.checkSteps(self.bf, 5, 2, 17)
        assert self.b.state.value == "Armed"
        assert self.bs.state.value == "Ready"
        assert self.bf.state.value == "Armed"

        self.b.run()
        self.checkSteps(self.b, 15, 5, 17)
        assert self.b.state.value == "Armed"
        assert self.bs.state.value == "Ready"
        assert self.bf.state.value == "Armed"

        self.b.run()
        self.checkSteps(self.b, 17, 15, 17)
        assert self.b.state.value == "Armed"
        assert self.bs.state.value == "Ready"
        assert self.bf.state.value == "Armed"

        self.b.run()
        self.checkSteps(self.b, 17, 17, 17)
        self.checkSteps(self.bf, 17, 17, 17)
        assert self.b.state.value == "Finished"
        assert self.bs.state.value == "Ready"
        assert self.bf.state.value == "Finished"
Ejemplo n.º 15
0
 def test_multi_frame_fast_det(self):
     self.fast_multi.active = True
     self.b.configure(
         self.make_generator(),
         self.tmpdir,
         detectors=DetectorTable.from_rows(
             [(True, "SLOW", "slow", 0.0, 1), (True, "FAST", "fast", 0.0, 5)]
         ),
     )
     assert self.b.completedSteps.value == 0
     assert self.b.totalSteps.value == 6
     assert self.b.configuredSteps.value == 6
     assert self.bs.completedSteps.value == 0
     assert self.bs.totalSteps.value == 6
     assert self.bs.configuredSteps.value == 6
     assert self.bf.completedSteps.value == 0
     assert self.bf.totalSteps.value == 30
     assert self.bf.configuredSteps.value == 30
Ejemplo n.º 16
0
 def test_not_paused_when_resume(self):
     # Set it up to do 6 steps
     self.b.configure(
         self.make_generator(),
         self.tmpdir,
         axesToMove=(),
         detectors=DetectorTable.from_rows(
             [(True, "FAST", "fast", 0, 1), (True, "SLOW", "slow", 0, 1)]
         ),
     )
     assert self.b.completedSteps.value == 0
     assert self.b.totalSteps.value == 6
     assert self.b.configuredSteps.value == 1
     # Do one step
     self.b.run()
     assert self.b.completedSteps.value == 1
     assert self.b.totalSteps.value == 6
     assert self.b.configuredSteps.value == 2
     assert self.b.state.value == "Armed"
     assert self.bs.state.value == "Armed"
     assert self.bf.state.value == "Armed"
     # Now do a second step but pause before the second one is done
     f = self.b.run_async()
     self.context.sleep(0.2)
     assert self.b.state.value == "Running"
     assert self.bf.state.value == "Armed"
     assert self.bs.state.value == "Running"
     self.b.pause()
     assert self.b.state.value == "Paused"
     assert self.bf.state.value == "Armed"
     assert self.bs.state.value == "Paused"
     assert self.b.completedSteps.value == 1
     assert self.b.totalSteps.value == 6
     assert self.b.configuredSteps.value == 2
     self.b.resume()
     self.context.wait_all_futures(f)
     assert self.b.completedSteps.value == 2
     assert self.b.totalSteps.value == 6
     assert self.b.configuredSteps.value == 3
Ejemplo n.º 17
0
 def test_adding_faulty_fails(self):
     t = LayoutTable.from_rows([["BAD", "faulty", 0, 0, True]])
     self.b.layout.put_value(t)
     assert list(self.b.configure.meta.defaults["detectors"].rows()) == [
         [True, "FAST", "fast", 0.0, 1],
         [True, "SLOW", "slow", 0.0, 1],
         [True, "BAD", "faulty", 0.0, 1],
     ]
     with self.assertRaises(BadValueError) as cm:
         self.b.configure(self.make_generator(), self.tmpdir)
     assert str(cm.exception) == (
         "Detector BAD was faulty at init and is unusable. "
         "If the detector is now working please restart Malcolm"
     )
     self.b.configure(
         self.make_generator(),
         self.tmpdir,
         detectors=DetectorTable.from_rows([(False, "BAD", "faulty", 0.0, 1)]),
     )
     self.b.reset()
     t = LayoutTable.from_rows([["BAD", "faulty", 0, 0, False]])
     self.b.layout.put_value(t)
     self.test_init()
     self.b.configure(self.make_generator(), self.tmpdir)