Scan a grid around each sample in a gridΒΆ

from collections import ChainMap
from bluesky.plans import (abs_set, relative_outer_product_scan, wait,
                           run_decorator, stage_decorator, subs_decorator)
from bluesky.callbacks import LiveTable, LivePlot
from bluesky.examples import det4, motor1, motor2


def grid_in_grid(samples):
    """
    Scan a grid around the neighborhood of each sample.

    Parameters
    ----------
    sample : dict
        mapping each sample's name to its (x, y) position
    """
    
    # In this example we hard-code the hardware and other parameters. For more
    # flexibility, they could instead be parameters to the function.
    detector = det4
    x = motor1
    y = motor2
    x_range = y_range = 0.2
    x_num = y_num = 5

    @subs_decorator([LiveTable([detector, x, y]),
                     LivePlot('motor2', 'motor1')])
    def plan():
        for name, position in samples.items():
            # Prepare metadata.
            md = {'sample': name}

            # Move to the cetner of the sample position.
            x_pos, y_pos = position
            yield from abs_set(x, x_pos)
            yield from abs_set(y, y_pos)
            yield from wait()

            # Scan a grid around that position.
            yield from relative_outer_product_scan([detector],
                                                   x, -x_range, x_range, x_num,
                                                   y, -y_range, y_range, y_num,
                                                   True, md=md)

    yield from plan()


# Example usage:

samples = {'A': (1, 1),
           'B': (1, 2),
           'C': (1, 3),
           'D': (2, 1),
           'E': (2, 2),
           'F': (2, 3)}

RE(grid_in_grid(samples))

Demo output:

../_images/grid_in_grid.png
In [1]: RE(grid_in_grid(samples))
+-----------+------------+------------+------------+-----------------+------------+-----------------+
|   seq_num |       time |       det4 |     motor1 | motor1_setpoint |     motor2 | motor2_setpoint |
+-----------+------------+------------+------------+-----------------+------------+-----------------+
|         1 | 20:48:00.0 |       0.01 |       0.80 |            0.80 |       2.80 |            2.80 |
|         2 | 20:48:00.0 |       0.01 |       0.80 |            0.80 |       2.90 |            2.90 |
|         3 | 20:48:00.1 |       0.01 |       0.80 |            0.80 |       3.00 |            3.00 |
|         4 | 20:48:00.1 |       0.01 |       0.80 |            0.80 |       3.10 |            3.10 |
|         5 | 20:48:00.1 |       0.00 |       0.80 |            0.80 |       3.20 |            3.20 |
|         6 | 20:48:00.2 |       0.00 |       0.90 |            0.90 |       3.20 |            3.20 |
|         7 | 20:48:00.2 |       0.01 |       0.90 |            0.90 |       3.10 |            3.10 |
|         8 | 20:48:00.2 |       0.01 |       0.90 |            0.90 |       3.00 |            3.00 |
|         9 | 20:48:00.2 |       0.01 |       0.90 |            0.90 |       2.90 |            2.90 |
|        10 | 20:48:00.3 |       0.01 |       0.90 |            0.90 |       2.80 |            2.80 |
|        11 | 20:48:00.3 |       0.01 |       1.00 |            1.00 |       2.80 |            2.80 |
|        12 | 20:48:00.3 |       0.01 |       1.00 |            1.00 |       2.90 |            2.90 |
|        13 | 20:48:00.4 |       0.01 |       1.00 |            1.00 |       3.00 |            3.00 |
|        14 | 20:48:00.4 |       0.00 |       1.00 |            1.00 |       3.10 |            3.10 |
|        15 | 20:48:00.4 |       0.00 |       1.00 |            1.00 |       3.20 |            3.20 |
|        16 | 20:48:00.5 |       0.00 |       1.10 |            1.10 |       3.20 |            3.20 |
|        17 | 20:48:00.5 |       0.00 |       1.10 |            1.10 |       3.10 |            3.10 |
|        18 | 20:48:00.5 |       0.01 |       1.10 |            1.10 |       3.00 |            3.00 |
|        19 | 20:48:00.6 |       0.01 |       1.10 |            1.10 |       2.90 |            2.90 |
|        20 | 20:48:00.6 |       0.01 |       1.10 |            1.10 |       2.80 |            2.80 |
|        21 | 20:48:00.6 |       0.01 |       1.20 |            1.20 |       2.80 |            2.80 |
|        22 | 20:48:00.6 |       0.01 |       1.20 |            1.20 |       2.90 |            2.90 |
|        23 | 20:48:00.7 |       0.01 |       1.20 |            1.20 |       3.00 |            3.00 |
|        24 | 20:48:00.7 |       0.00 |       1.20 |            1.20 |       3.10 |            3.10 |
|        25 | 20:48:00.7 |       0.00 |       1.20 |            1.20 |       3.20 |            3.20 |
+-----------+------------+------------+------------+-----------------+------------+-----------------+
generator relative_outer_product_scan ['8397b6'] (scan num: 7)
+-----------+------------+------------+------------+-----------------+------------+-----------------+
|   seq_num |       time |       det4 |     motor1 | motor1_setpoint |     motor2 | motor2_setpoint |
+-----------+------------+------------+------------+-----------------+------------+-----------------+
|         1 | 20:48:00.9 |       0.00 |       1.80 |            1.80 |       2.80 |            2.80 |
|         2 | 20:48:00.9 |       0.00 |       1.80 |            1.80 |       2.90 |            2.90 |
|         3 | 20:48:01.0 |       0.00 |       1.80 |            1.80 |       3.00 |            3.00 |
|         4 | 20:48:01.0 |       0.00 |       1.80 |            1.80 |       3.10 |            3.10 |
|         5 | 20:48:01.0 |       0.00 |       1.80 |            1.80 |       3.20 |            3.20 |
|         6 | 20:48:01.1 |       0.00 |       1.90 |            1.90 |       3.20 |            3.20 |
|         7 | 20:48:01.1 |       0.00 |       1.90 |            1.90 |       3.10 |            3.10 |
|         8 | 20:48:01.1 |       0.00 |       1.90 |            1.90 |       3.00 |            3.00 |
|         9 | 20:48:01.2 |       0.00 |       1.90 |            1.90 |       2.90 |            2.90 |
|        10 | 20:48:01.2 |       0.00 |       1.90 |            1.90 |       2.80 |            2.80 |
|        11 | 20:48:01.2 |       0.00 |       2.00 |            2.00 |       2.80 |            2.80 |
|        12 | 20:48:01.3 |       0.00 |       2.00 |            2.00 |       2.90 |            2.90 |
|        13 | 20:48:01.3 |       0.00 |       2.00 |            2.00 |       3.00 |            3.00 |
|        14 | 20:48:01.3 |       0.00 |       2.00 |            2.00 |       3.10 |            3.10 |
|        15 | 20:48:01.4 |       0.00 |       2.00 |            2.00 |       3.20 |            3.20 |
|        16 | 20:48:01.4 |       0.00 |       2.10 |            2.10 |       3.20 |            3.20 |
|        17 | 20:48:01.5 |       0.00 |       2.10 |            2.10 |       3.10 |            3.10 |
|        18 | 20:48:01.6 |       0.00 |       2.10 |            2.10 |       3.00 |            3.00 |
|        19 | 20:48:01.6 |       0.00 |       2.10 |            2.10 |       2.90 |            2.90 |
|        20 | 20:48:01.7 |       0.00 |       2.10 |            2.10 |       2.80 |            2.80 |
|        21 | 20:48:01.7 |       0.00 |       2.20 |            2.20 |       2.80 |            2.80 |
|        22 | 20:48:01.7 |       0.00 |       2.20 |            2.20 |       2.90 |            2.90 |
|        23 | 20:48:01.8 |       0.00 |       2.20 |            2.20 |       3.00 |            3.00 |
|        24 | 20:48:01.8 |       0.00 |       2.20 |            2.20 |       3.10 |            3.10 |
|        25 | 20:48:01.8 |       0.00 |       2.20 |            2.20 |       3.20 |            3.20 |
+-----------+------------+------------+------------+-----------------+------------+-----------------+
generator relative_outer_product_scan ['7c1727'] (scan num: 8)
+-----------+------------+------------+------------+-----------------+------------+-----------------+
|   seq_num |       time |       det4 |     motor1 | motor1_setpoint |     motor2 | motor2_setpoint |
+-----------+------------+------------+------------+-----------------+------------+-----------------+
|         1 | 20:48:02.0 |       0.14 |       1.80 |            1.80 |       0.80 |            0.80 |
|         2 | 20:48:02.0 |       0.13 |       1.80 |            1.80 |       0.90 |            0.90 |
|         3 | 20:48:02.1 |       0.12 |       1.80 |            1.80 |       1.00 |            1.00 |
|         4 | 20:48:02.1 |       0.11 |       1.80 |            1.80 |       1.10 |            1.10 |
|         5 | 20:48:02.1 |       0.10 |       1.80 |            1.80 |       1.20 |            1.20 |
|         6 | 20:48:02.2 |       0.08 |       1.90 |            1.90 |       1.20 |            1.20 |
|         7 | 20:48:02.2 |       0.09 |       1.90 |            1.90 |       1.10 |            1.10 |
|         8 | 20:48:02.3 |       0.10 |       1.90 |            1.90 |       1.00 |            1.00 |
|         9 | 20:48:02.3 |       0.11 |       1.90 |            1.90 |       0.90 |            0.90 |
|        10 | 20:48:02.3 |       0.12 |       1.90 |            1.90 |       0.80 |            0.80 |
|        11 | 20:48:02.4 |       0.10 |       2.00 |            2.00 |       0.80 |            0.80 |
|        12 | 20:48:02.4 |       0.09 |       2.00 |            2.00 |       0.90 |            0.90 |
|        13 | 20:48:02.4 |       0.08 |       2.00 |            2.00 |       1.00 |            1.00 |
|        14 | 20:48:02.5 |       0.07 |       2.00 |            2.00 |       1.10 |            1.10 |
|        15 | 20:48:02.5 |       0.07 |       2.00 |            2.00 |       1.20 |            1.20 |
|        16 | 20:48:02.6 |       0.05 |       2.10 |            2.10 |       1.20 |            1.20 |
|        17 | 20:48:02.6 |       0.06 |       2.10 |            2.10 |       1.10 |            1.10 |
|        18 | 20:48:02.6 |       0.07 |       2.10 |            2.10 |       1.00 |            1.00 |
|        19 | 20:48:02.7 |       0.07 |       2.10 |            2.10 |       0.90 |            0.90 |
|        20 | 20:48:02.7 |       0.08 |       2.10 |            2.10 |       0.80 |            0.80 |
|        21 | 20:48:02.7 |       0.06 |       2.20 |            2.20 |       0.80 |            0.80 |
|        22 | 20:48:02.8 |       0.06 |       2.20 |            2.20 |       0.90 |            0.90 |
|        23 | 20:48:02.8 |       0.05 |       2.20 |            2.20 |       1.00 |            1.00 |
|        24 | 20:48:02.8 |       0.05 |       2.20 |            2.20 |       1.10 |            1.10 |
|        25 | 20:48:02.9 |       0.04 |       2.20 |            2.20 |       1.20 |            1.20 |
+-----------+------------+------------+------------+-----------------+------------+-----------------+
generator relative_outer_product_scan ['abac8c'] (scan num: 9)
+-----------+------------+------------+------------+-----------------+------------+-----------------+
|   seq_num |       time |       det4 |     motor1 | motor1_setpoint |     motor2 | motor2_setpoint |
+-----------+------------+------------+------------+-----------------+------------+-----------------+
|         1 | 20:48:03.0 |       0.53 |       0.80 |            0.80 |       0.80 |            0.80 |
|         2 | 20:48:03.1 |       0.48 |       0.80 |            0.80 |       0.90 |            0.90 |
|         3 | 20:48:03.1 |       0.44 |       0.80 |            0.80 |       1.00 |            1.00 |
|         4 | 20:48:03.2 |       0.40 |       0.80 |            0.80 |       1.10 |            1.10 |
|         5 | 20:48:03.2 |       0.35 |       0.80 |            0.80 |       1.20 |            1.20 |
|         6 | 20:48:03.3 |       0.32 |       0.90 |            0.90 |       1.20 |            1.20 |
|         7 | 20:48:03.3 |       0.36 |       0.90 |            0.90 |       1.10 |            1.10 |
|         8 | 20:48:03.4 |       0.40 |       0.90 |            0.90 |       1.00 |            1.00 |
|         9 | 20:48:03.4 |       0.44 |       0.90 |            0.90 |       0.90 |            0.90 |
|        10 | 20:48:03.4 |       0.48 |       0.90 |            0.90 |       0.80 |            0.80 |
|        11 | 20:48:03.5 |       0.44 |       1.00 |            1.00 |       0.80 |            0.80 |
|        12 | 20:48:03.5 |       0.40 |       1.00 |            1.00 |       0.90 |            0.90 |
|        13 | 20:48:03.6 |       0.37 |       1.00 |            1.00 |       1.00 |            1.00 |
|        14 | 20:48:03.6 |       0.33 |       1.00 |            1.00 |       1.10 |            1.10 |
|        15 | 20:48:03.7 |       0.30 |       1.00 |            1.00 |       1.20 |            1.20 |
|        16 | 20:48:03.7 |       0.27 |       1.10 |            1.10 |       1.20 |            1.20 |
|        17 | 20:48:03.7 |       0.30 |       1.10 |            1.10 |       1.10 |            1.10 |
|        18 | 20:48:03.8 |       0.33 |       1.10 |            1.10 |       1.00 |            1.00 |
|        19 | 20:48:03.9 |       0.36 |       1.10 |            1.10 |       0.90 |            0.90 |
|        20 | 20:48:03.9 |       0.40 |       1.10 |            1.10 |       0.80 |            0.80 |
|        21 | 20:48:04.0 |       0.35 |       1.20 |            1.20 |       0.80 |            0.80 |
|        22 | 20:48:04.0 |       0.32 |       1.20 |            1.20 |       0.90 |            0.90 |
|        23 | 20:48:04.0 |       0.30 |       1.20 |            1.20 |       1.00 |            1.00 |
|        24 | 20:48:04.1 |       0.27 |       1.20 |            1.20 |       1.10 |            1.10 |
|        25 | 20:48:04.1 |       0.24 |       1.20 |            1.20 |       1.20 |            1.20 |
+-----------+------------+------------+------------+-----------------+------------+-----------------+
generator relative_outer_product_scan ['24ffda'] (scan num: 10)
+-----------+------------+------------+------------+-----------------+------------+-----------------+
|   seq_num |       time |       det4 |     motor1 | motor1_setpoint |     motor2 | motor2_setpoint |
+-----------+------------+------------+------------+-----------------+------------+-----------------+
|         1 | 20:48:04.3 |       0.14 |       0.80 |            0.80 |       1.80 |            1.80 |
|         2 | 20:48:04.4 |       0.12 |       0.80 |            0.80 |       1.90 |            1.90 |
|         3 | 20:48:04.4 |       0.10 |       0.80 |            0.80 |       2.00 |            2.00 |
|         4 | 20:48:04.5 |       0.08 |       0.80 |            0.80 |       2.10 |            2.10 |
|         5 | 20:48:04.5 |       0.06 |       0.80 |            0.80 |       2.20 |            2.20 |
|         6 | 20:48:04.5 |       0.06 |       0.90 |            0.90 |       2.20 |            2.20 |
|         7 | 20:48:04.6 |       0.07 |       0.90 |            0.90 |       2.10 |            2.10 |
|         8 | 20:48:04.6 |       0.09 |       0.90 |            0.90 |       2.00 |            2.00 |
|         9 | 20:48:04.7 |       0.11 |       0.90 |            0.90 |       1.90 |            1.90 |
|        10 | 20:48:04.7 |       0.13 |       0.90 |            0.90 |       1.80 |            1.80 |
|        11 | 20:48:04.8 |       0.12 |       1.00 |            1.00 |       1.80 |            1.80 |
|        12 | 20:48:04.8 |       0.10 |       1.00 |            1.00 |       1.90 |            1.90 |
|        13 | 20:48:04.9 |       0.08 |       1.00 |            1.00 |       2.00 |            2.00 |
|        14 | 20:48:04.9 |       0.07 |       1.00 |            1.00 |       2.10 |            2.10 |
|        15 | 20:48:04.9 |       0.05 |       1.00 |            1.00 |       2.20 |            2.20 |
|        16 | 20:48:05.0 |       0.05 |       1.10 |            1.10 |       2.20 |            2.20 |
|        17 | 20:48:05.0 |       0.06 |       1.10 |            1.10 |       2.10 |            2.10 |
|        18 | 20:48:05.1 |       0.07 |       1.10 |            1.10 |       2.00 |            2.00 |
|        19 | 20:48:05.1 |       0.09 |       1.10 |            1.10 |       1.90 |            1.90 |
|        20 | 20:48:05.2 |       0.11 |       1.10 |            1.10 |       1.80 |            1.80 |
|        21 | 20:48:05.2 |       0.10 |       1.20 |            1.20 |       1.80 |            1.80 |
|        22 | 20:48:05.3 |       0.08 |       1.20 |            1.20 |       1.90 |            1.90 |
|        23 | 20:48:05.3 |       0.07 |       1.20 |            1.20 |       2.00 |            2.00 |
|        24 | 20:48:05.3 |       0.05 |       1.20 |            1.20 |       2.10 |            2.10 |
|        25 | 20:48:05.4 |       0.04 |       1.20 |            1.20 |       2.20 |            2.20 |
+-----------+------------+------------+------------+-----------------+------------+-----------------+
generator relative_outer_product_scan ['a1281d'] (scan num: 11)
+-----------+------------+------------+------------+-----------------+------------+-----------------+
|   seq_num |       time |       det4 |     motor1 | motor1_setpoint |     motor2 | motor2_setpoint |
+-----------+------------+------------+------------+-----------------+------------+-----------------+
|         1 | 20:48:05.6 |       0.04 |       1.80 |            1.80 |       1.80 |            1.80 |
|         2 | 20:48:05.6 |       0.03 |       1.80 |            1.80 |       1.90 |            1.90 |
|         3 | 20:48:05.7 |       0.03 |       1.80 |            1.80 |       2.00 |            2.00 |
|         4 | 20:48:05.7 |       0.02 |       1.80 |            1.80 |       2.10 |            2.10 |
|         5 | 20:48:05.8 |       0.02 |       1.80 |            1.80 |       2.20 |            2.20 |
|         6 | 20:48:05.8 |       0.01 |       1.90 |            1.90 |       2.20 |            2.20 |
|         7 | 20:48:05.9 |       0.02 |       1.90 |            1.90 |       2.10 |            2.10 |
|         8 | 20:48:05.9 |       0.02 |       1.90 |            1.90 |       2.00 |            2.00 |
|         9 | 20:48:06.0 |       0.03 |       1.90 |            1.90 |       1.90 |            1.90 |
|        10 | 20:48:06.0 |       0.03 |       1.90 |            1.90 |       1.80 |            1.80 |
|        11 | 20:48:06.1 |       0.03 |       2.00 |            2.00 |       1.80 |            1.80 |
|        12 | 20:48:06.1 |       0.02 |       2.00 |            2.00 |       1.90 |            1.90 |
|        13 | 20:48:06.2 |       0.02 |       2.00 |            2.00 |       2.00 |            2.00 |
|        14 | 20:48:06.2 |       0.01 |       2.00 |            2.00 |       2.10 |            2.10 |
|        15 | 20:48:06.3 |       0.01 |       2.00 |            2.00 |       2.20 |            2.20 |
|        16 | 20:48:06.3 |       0.01 |       2.10 |            2.10 |       2.20 |            2.20 |
|        17 | 20:48:06.4 |       0.01 |       2.10 |            2.10 |       2.10 |            2.10 |
|        18 | 20:48:06.4 |       0.01 |       2.10 |            2.10 |       2.00 |            2.00 |
|        19 | 20:48:06.5 |       0.02 |       2.10 |            2.10 |       1.90 |            1.90 |
|        20 | 20:48:06.5 |       0.02 |       2.10 |            2.10 |       1.80 |            1.80 |
|        21 | 20:48:06.6 |       0.02 |       2.20 |            2.20 |       1.80 |            1.80 |
|        22 | 20:48:06.7 |       0.01 |       2.20 |            2.20 |       1.90 |            1.90 |
|        23 | 20:48:06.7 |       0.01 |       2.20 |            2.20 |       2.00 |            2.00 |
|        24 | 20:48:06.8 |       0.01 |       2.20 |            2.20 |       2.10 |            2.10 |
|        25 | 20:48:06.8 |       0.01 |       2.20 |            2.20 |       2.20 |            2.20 |
+-----------+------------+------------+------------+-----------------+------------+-----------------+
generator relative_outer_product_scan ['293df0'] (scan num: 12)
Out[1]: 
['8397b603-fcef-4b0c-a82b-cd308f05a457',
 '7c172709-6aa7-4db5-9d0e-be348f12d533',
 'abac8c6c-a61d-47eb-8452-acb93d4ccea2',
 '24ffda3a-c291-4c98-99ac-58e09731fb07',
 'a1281d19-d02c-4e04-a9cd-ec168d12fa52',
 '293df077-9a75-413c-b3e9-9478e3e3cc8e']