Exemplo n.º 1
0
def test_align():
    a = Stream()
    b = Stream()
    z = a.AlignEventStreams(b)
    sl = z.sink_to_list()
    # TODO: use real run engine here
    for n, d, dd in zip(
        ["start", "descriptor", "event", "stop"],
        [
            {"a": "hi", "b": {"hi": "world"}, "uid": "hi", "time": 123},
            {"bla": "foo", "uid": "abc"},
            {"data": "now", "descriptor": "abc"},
            {"stop": "doc"},
        ],
        [
            {"a": "hi2", "b": {"hi2": "world"}},
            {"bla": "foo", "uid": "123"},
            {"data": "now", "descriptor": "123"},
            {"stop": "doc"},
        ],
    ):
        a.emit((n, d))
        b.emit((n, dd))

    assert len(sl) == 4
    assert sl[0][1].get("b") == {"hi": "world", "hi2": "world"}
Exemplo n.º 2
0
def test_align_interrupted(RE, hw):
    a = Stream()
    b = FromEventStream("event", ("data", "img"), a, principle=True).map(
        op.add, 1
    )
    b.sink(print)
    c = ToEventStream(b, ("out",))
    z = move_to_first(a.AlignEventStreams(c))
    sl = z.sink_to_list()

    L = []

    RE.subscribe(lambda *x: L.append(x))

    RE(count([hw.img]))

    for nd in L:
        name, doc = nd
        # cause an exception
        if name == "event":
            doc["data"]["img"] = "hi"
        try:
            a.emit((name, doc))
        except TypeError:
            pass
    assert {"start", "stop"} == set(list(zip(*sl))[0])
    # check that buffers are not cleared, yet
    sl.clear()
    # If there are elements in the buffer they need to be cleared when all
    # start docs come in.
    for nd in L:
        name, doc = nd
        # cause an exception
        if name == "event":
            doc["data"]["img"] = 1
        a.emit((name, doc))
        if name == "start":
            # now buffers should be clear
            assert not any(
                [b for n, tb in z.true_buffers.items() for u, b in tb.items()]
            )
    assert {"start", "descriptor", "event", "stop"} == set(list(zip(*sl))[0])
    # now buffers should be clear (as all docs were emitted)
    assert not any(
        [b for n, tb in z.true_buffers.items() for u, b in tb.items()]
    )
Exemplo n.º 3
0
def test_align_res_dat(RE, hw):
    a = Stream()
    b = FromEventStream("event", ("data", "motor"), a,
                        principle=True).map(op.add, 1)
    c = ToEventStream(b, ("out", ))
    z = a.AlignEventStreams(c)
    sl = z.sink_to_list()

    RE.subscribe(lambda *x: a.emit(x))

    osu = RE(scan([hw.img], hw.motor, 0, 10, 10))

    for n, d in sl:
        if n == "start":
            assert d["original_start_uid"] == osu[0]
        if n == "event":
            assert d["data"]["out"] == d["data"]["motor"] + 1
Exemplo n.º 4
0
def test_align_buffering(RE, hw):
    zz = {"data": False}
    a = Stream()
    b = FromEventStream(
        "event",
        ("data", "motor"),
        a.filter(lambda x: zz["data"]),
        principle=True,
    ).map(op.add, 1)
    c = ToEventStream(b, ("out",))
    z = move_to_first(a.AlignEventStreams(c))
    sl = z.sink_to_list()

    RE.subscribe(lambda *x: a.emit(x))

    RE(scan([hw.img], hw.motor, 0, 10, 10, md={"hello": "world"}))
    zz["data"] = True
    sl.clear()
    RE(scan([hw.img], hw.motor, 0, 10, 10))

    assert "hello" not in sl[0][1]
Exemplo n.º 5
0
def test_align_multi_stream(RE, hw):
    a = Stream()
    b = FromEventStream(
        "event",
        ("data", "motor"),
        a,
        principle=True,
        event_stream_name="primary",
    ).map(op.add, 1)
    c = ToEventStream(b, ("out",))
    c.sink(print)
    z = a.AlignEventStreams(c, event_stream_name="primary")
    sl = z.sink_to_list()

    RE.subscribe(lambda *x: a.emit(x))

    def one_1d_step(detectors, motor, step):
        """
        Inner loop of a 1D step scan

        This is the default function for ``per_step`` param in 1D plans.
        """
        yield from checkpoint()
        yield from abs_set(motor, step, wait=True)
        yield from trigger_and_read(list(detectors) + [motor], name="dark")
        return (yield from trigger_and_read(list(detectors) + [motor]))

    osu = RE(scan([hw.img], hw.motor, 0, 10, 10, per_step=one_1d_step))

    assert len(sl) == 10 + 3

    for n, d in sl:
        if n == "start":
            assert d["original_start_uid"] == osu[0]
        if n == "event":
            print(d)
            assert d["data"]["out"] == d["data"]["motor"] + 1