.. note:: :class: sphx-glr-download-link-note Click :ref:`here ` to download the full example code .. rst-class:: sphx-glr-example-title .. _sphx_glr_cookbook_grid_in_grid.py: Scan a grid around each sample in a grid **************************************** Problem ======= Examples are arranged on a substrate. There are two motors, x and y, for moving a detector over the subtrate. Scan a grid of readings around the center position of each sample. Approach ======== Specify the samples and their arrangement as a mapping of sample names to (x, y) positions, like ``{'A': (1, 1), 'B': (1, 2)}``. Write a custom plan that loops through the samples. For each sample, move to sample's center position and perform a :func:`bluesky.plans.relative_outer_product_scan` (i.e., grid scan) around that position. For each sample, one run will be saved. Include the sample name in the metadata. Example Solution ================ .. image:: /cookbook/images/sphx_glr_grid_in_grid_001.png :class: sphx-glr-single-img .. rst-class:: sphx-glr-script-out Out: .. code-block:: none +-----------+------------+------------+------------+-----------------+------------+-----------------+ | seq_num | time | det4 | motor1 | motor1_setpoint | motor2 | motor2_setpoint | +-----------+------------+------------+------------+-----------------+------------+-----------------+ | 1 | 21:00:46.7 | 0.527 | 0.800 | 0.800 | 0.800 | 0.800 | | 2 | 21:00:46.8 | 0.484 | 0.800 | 0.800 | 0.900 | 0.900 | | 3 | 21:00:46.8 | 0.440 | 0.800 | 0.800 | 1.000 | 1.000 | | 4 | 21:00:46.8 | 0.397 | 0.800 | 0.800 | 1.100 | 1.100 | | 5 | 21:00:46.9 | 0.353 | 0.800 | 0.800 | 1.200 | 1.200 | | 6 | 21:00:46.9 | 0.325 | 0.900 | 0.900 | 1.200 | 1.200 | | 7 | 21:00:46.9 | 0.364 | 0.900 | 0.900 | 1.100 | 1.100 | | 8 | 21:00:47.0 | 0.405 | 0.900 | 0.900 | 1.000 | 1.000 | | 9 | 21:00:47.0 | 0.445 | 0.900 | 0.900 | 0.900 | 0.900 | | 10 | 21:00:47.0 | 0.484 | 0.900 | 0.900 | 0.800 | 0.800 | | 11 | 21:00:47.1 | 0.440 | 1.000 | 1.000 | 0.800 | 0.800 | | 12 | 21:00:47.1 | 0.405 | 1.000 | 1.000 | 0.900 | 0.900 | | 13 | 21:00:47.1 | 0.368 | 1.000 | 1.000 | 1.000 | 1.000 | | 14 | 21:00:47.2 | 0.331 | 1.000 | 1.000 | 1.100 | 1.100 | | 15 | 21:00:47.2 | 0.295 | 1.000 | 1.000 | 1.200 | 1.200 | | 16 | 21:00:47.2 | 0.266 | 1.100 | 1.100 | 1.200 | 1.200 | | 17 | 21:00:47.3 | 0.298 | 1.100 | 1.100 | 1.100 | 1.100 | | 18 | 21:00:47.3 | 0.331 | 1.100 | 1.100 | 1.000 | 1.000 | | 19 | 21:00:47.4 | 0.364 | 1.100 | 1.100 | 0.900 | 0.900 | | 20 | 21:00:47.4 | 0.397 | 1.100 | 1.100 | 0.800 | 0.800 | | 21 | 21:00:47.4 | 0.353 | 1.200 | 1.200 | 0.800 | 0.800 | | 22 | 21:00:47.5 | 0.325 | 1.200 | 1.200 | 0.900 | 0.900 | | 23 | 21:00:47.5 | 0.295 | 1.200 | 1.200 | 1.000 | 1.000 | | 24 | 21:00:47.5 | 0.266 | 1.200 | 1.200 | 1.100 | 1.100 | | 25 | 21:00:47.6 | 0.237 | 1.200 | 1.200 | 1.200 | 1.200 | +-----------+------------+------------+------------+-----------------+------------+-----------------+ generator rel_grid_scan ['ed3e7375'] (scan num: 1) +-----------+------------+------------+------------+-----------------+------------+-----------------+ | seq_num | time | det4 | motor1 | motor1_setpoint | motor2 | motor2_setpoint | +-----------+------------+------------+------------+-----------------+------------+-----------------+ | 1 | 21:00:47.7 | 0.144 | 0.800 | 0.800 | 1.800 | 1.800 | | 2 | 21:00:47.8 | 0.119 | 0.800 | 0.800 | 1.900 | 1.900 | | 3 | 21:00:47.8 | 0.098 | 0.800 | 0.800 | 2.000 | 2.000 | | 4 | 21:00:47.9 | 0.080 | 0.800 | 0.800 | 2.100 | 2.100 | | 5 | 21:00:47.9 | 0.065 | 0.800 | 0.800 | 2.200 | 2.200 | | 6 | 21:00:47.9 | 0.059 | 0.900 | 0.900 | 2.200 | 2.200 | | 7 | 21:00:48.0 | 0.074 | 0.900 | 0.900 | 2.100 | 2.100 | | 8 | 21:00:48.0 | 0.090 | 0.900 | 0.900 | 2.000 | 2.000 | | 9 | 21:00:48.0 | 0.110 | 0.900 | 0.900 | 1.900 | 1.900 | | 10 | 21:00:48.1 | 0.132 | 0.900 | 0.900 | 1.800 | 1.800 | | 11 | 21:00:48.1 | 0.120 | 1.000 | 1.000 | 1.800 | 1.800 | | 12 | 21:00:48.1 | 0.100 | 1.000 | 1.000 | 1.900 | 1.900 | | 13 | 21:00:48.2 | 0.082 | 1.000 | 1.000 | 2.000 | 2.000 | | 14 | 21:00:48.2 | 0.067 | 1.000 | 1.000 | 2.100 | 2.100 | | 15 | 21:00:48.3 | 0.054 | 1.000 | 1.000 | 2.200 | 2.200 | | 16 | 21:00:48.3 | 0.049 | 1.100 | 1.100 | 2.200 | 2.200 | | 17 | 21:00:48.3 | 0.060 | 1.100 | 1.100 | 2.100 | 2.100 | | 18 | 21:00:48.4 | 0.074 | 1.100 | 1.100 | 2.000 | 2.000 | | 19 | 21:00:48.4 | 0.090 | 1.100 | 1.100 | 1.900 | 1.900 | | 20 | 21:00:48.5 | 0.108 | 1.100 | 1.100 | 1.800 | 1.800 | | 21 | 21:00:48.5 | 0.096 | 1.200 | 1.200 | 1.800 | 1.800 | | 22 | 21:00:48.5 | 0.080 | 1.200 | 1.200 | 1.900 | 1.900 | | 23 | 21:00:48.6 | 0.066 | 1.200 | 1.200 | 2.000 | 2.000 | | 24 | 21:00:48.6 | 0.054 | 1.200 | 1.200 | 2.100 | 2.100 | | 25 | 21:00:48.6 | 0.043 | 1.200 | 1.200 | 2.200 | 2.200 | +-----------+------------+------------+------------+-----------------+------------+-----------------+ generator rel_grid_scan ['f35b0a7d'] (scan num: 2) +-----------+------------+------------+------------+-----------------+------------+-----------------+ | seq_num | time | det4 | motor1 | motor1_setpoint | motor2 | motor2_setpoint | +-----------+------------+------------+------------+-----------------+------------+-----------------+ | 1 | 21:00:48.8 | 0.014 | 0.800 | 0.800 | 2.800 | 2.800 | | 2 | 21:00:48.8 | 0.011 | 0.800 | 0.800 | 2.900 | 2.900 | | 3 | 21:00:48.8 | 0.008 | 0.800 | 0.800 | 3.000 | 3.000 | | 4 | 21:00:48.9 | 0.006 | 0.800 | 0.800 | 3.100 | 3.100 | | 5 | 21:00:48.9 | 0.004 | 0.800 | 0.800 | 3.200 | 3.200 | | 6 | 21:00:48.9 | 0.004 | 0.900 | 0.900 | 3.200 | 3.200 | | 7 | 21:00:49.0 | 0.005 | 0.900 | 0.900 | 3.100 | 3.100 | | 8 | 21:00:49.0 | 0.007 | 0.900 | 0.900 | 3.000 | 3.000 | | 9 | 21:00:49.0 | 0.010 | 0.900 | 0.900 | 2.900 | 2.900 | | 10 | 21:00:49.0 | 0.013 | 0.900 | 0.900 | 2.800 | 2.800 | | 11 | 21:00:49.1 | 0.012 | 1.000 | 1.000 | 2.800 | 2.800 | | 12 | 21:00:49.1 | 0.009 | 1.000 | 1.000 | 2.900 | 2.900 | | 13 | 21:00:49.1 | 0.007 | 1.000 | 1.000 | 3.000 | 3.000 | | 14 | 21:00:49.2 | 0.005 | 1.000 | 1.000 | 3.100 | 3.100 | | 15 | 21:00:49.2 | 0.004 | 1.000 | 1.000 | 3.200 | 3.200 | | 16 | 21:00:49.2 | 0.003 | 1.100 | 1.100 | 3.200 | 3.200 | | 17 | 21:00:49.3 | 0.004 | 1.100 | 1.100 | 3.100 | 3.100 | | 18 | 21:00:49.3 | 0.006 | 1.100 | 1.100 | 3.000 | 3.000 | | 19 | 21:00:49.3 | 0.008 | 1.100 | 1.100 | 2.900 | 2.900 | | 20 | 21:00:49.4 | 0.011 | 1.100 | 1.100 | 2.800 | 2.800 | | 21 | 21:00:49.4 | 0.010 | 1.200 | 1.200 | 2.800 | 2.800 | | 22 | 21:00:49.4 | 0.007 | 1.200 | 1.200 | 2.900 | 2.900 | | 23 | 21:00:49.5 | 0.005 | 1.200 | 1.200 | 3.000 | 3.000 | | 24 | 21:00:49.5 | 0.004 | 1.200 | 1.200 | 3.100 | 3.100 | | 25 | 21:00:49.5 | 0.003 | 1.200 | 1.200 | 3.200 | 3.200 | +-----------+------------+------------+------------+-----------------+------------+-----------------+ generator rel_grid_scan ['81bb23f1'] (scan num: 3) +-----------+------------+------------+------------+-----------------+------------+-----------------+ | seq_num | time | det4 | motor1 | motor1_setpoint | motor2 | motor2_setpoint | +-----------+------------+------------+------------+-----------------+------------+-----------------+ | 1 | 21:00:49.7 | 0.144 | 1.800 | 1.800 | 0.800 | 0.800 | | 2 | 21:00:49.7 | 0.132 | 1.800 | 1.800 | 0.900 | 0.900 | | 3 | 21:00:49.7 | 0.120 | 1.800 | 1.800 | 1.000 | 1.000 | | 4 | 21:00:49.8 | 0.108 | 1.800 | 1.800 | 1.100 | 1.100 | | 5 | 21:00:49.8 | 0.096 | 1.800 | 1.800 | 1.200 | 1.200 | | 6 | 21:00:49.8 | 0.080 | 1.900 | 1.900 | 1.200 | 1.200 | | 7 | 21:00:49.9 | 0.090 | 1.900 | 1.900 | 1.100 | 1.100 | | 8 | 21:00:49.9 | 0.100 | 1.900 | 1.900 | 1.000 | 1.000 | | 9 | 21:00:49.9 | 0.110 | 1.900 | 1.900 | 0.900 | 0.900 | | 10 | 21:00:50.0 | 0.119 | 1.900 | 1.900 | 0.800 | 0.800 | | 11 | 21:00:50.0 | 0.098 | 2.000 | 2.000 | 0.800 | 0.800 | | 12 | 21:00:50.0 | 0.090 | 2.000 | 2.000 | 0.900 | 0.900 | | 13 | 21:00:50.1 | 0.082 | 2.000 | 2.000 | 1.000 | 1.000 | | 14 | 21:00:50.1 | 0.074 | 2.000 | 2.000 | 1.100 | 1.100 | | 15 | 21:00:50.1 | 0.066 | 2.000 | 2.000 | 1.200 | 1.200 | | 16 | 21:00:50.2 | 0.054 | 2.100 | 2.100 | 1.200 | 1.200 | | 17 | 21:00:50.2 | 0.060 | 2.100 | 2.100 | 1.100 | 1.100 | | 18 | 21:00:50.2 | 0.067 | 2.100 | 2.100 | 1.000 | 1.000 | | 19 | 21:00:50.3 | 0.074 | 2.100 | 2.100 | 0.900 | 0.900 | | 20 | 21:00:50.3 | 0.080 | 2.100 | 2.100 | 0.800 | 0.800 | | 21 | 21:00:50.4 | 0.065 | 2.200 | 2.200 | 0.800 | 0.800 | | 22 | 21:00:50.4 | 0.059 | 2.200 | 2.200 | 0.900 | 0.900 | | 23 | 21:00:50.4 | 0.054 | 2.200 | 2.200 | 1.000 | 1.000 | | 24 | 21:00:50.5 | 0.049 | 2.200 | 2.200 | 1.100 | 1.100 | | 25 | 21:00:50.5 | 0.043 | 2.200 | 2.200 | 1.200 | 1.200 | +-----------+------------+------------+------------+-----------------+------------+-----------------+ generator rel_grid_scan ['f30d034d'] (scan num: 4) +-----------+------------+------------+------------+-----------------+------------+-----------------+ | seq_num | time | det4 | motor1 | motor1_setpoint | motor2 | motor2_setpoint | +-----------+------------+------------+------------+-----------------+------------+-----------------+ | 1 | 21:00:50.6 | 0.039 | 1.800 | 1.800 | 1.800 | 1.800 | | 2 | 21:00:50.7 | 0.033 | 1.800 | 1.800 | 1.900 | 1.900 | | 3 | 21:00:50.7 | 0.027 | 1.800 | 1.800 | 2.000 | 2.000 | | 4 | 21:00:50.8 | 0.022 | 1.800 | 1.800 | 2.100 | 2.100 | | 5 | 21:00:50.8 | 0.018 | 1.800 | 1.800 | 2.200 | 2.200 | | 6 | 21:00:50.8 | 0.015 | 1.900 | 1.900 | 2.200 | 2.200 | | 7 | 21:00:50.9 | 0.018 | 1.900 | 1.900 | 2.100 | 2.100 | | 8 | 21:00:50.9 | 0.022 | 1.900 | 1.900 | 2.000 | 2.000 | | 9 | 21:00:51.0 | 0.027 | 1.900 | 1.900 | 1.900 | 1.900 | | 10 | 21:00:51.0 | 0.033 | 1.900 | 1.900 | 1.800 | 1.800 | | 11 | 21:00:51.0 | 0.027 | 2.000 | 2.000 | 1.800 | 1.800 | | 12 | 21:00:51.1 | 0.022 | 2.000 | 2.000 | 1.900 | 1.900 | | 13 | 21:00:51.1 | 0.018 | 2.000 | 2.000 | 2.000 | 2.000 | | 14 | 21:00:51.2 | 0.015 | 2.000 | 2.000 | 2.100 | 2.100 | | 15 | 21:00:51.2 | 0.012 | 2.000 | 2.000 | 2.200 | 2.200 | | 16 | 21:00:51.2 | 0.010 | 2.100 | 2.100 | 2.200 | 2.200 | | 17 | 21:00:51.3 | 0.012 | 2.100 | 2.100 | 2.100 | 2.100 | | 18 | 21:00:51.3 | 0.015 | 2.100 | 2.100 | 2.000 | 2.000 | | 19 | 21:00:51.3 | 0.018 | 2.100 | 2.100 | 1.900 | 1.900 | | 20 | 21:00:51.4 | 0.022 | 2.100 | 2.100 | 1.800 | 1.800 | | 21 | 21:00:51.4 | 0.018 | 2.200 | 2.200 | 1.800 | 1.800 | | 22 | 21:00:51.5 | 0.015 | 2.200 | 2.200 | 1.900 | 1.900 | | 23 | 21:00:51.5 | 0.012 | 2.200 | 2.200 | 2.000 | 2.000 | | 24 | 21:00:51.5 | 0.010 | 2.200 | 2.200 | 2.100 | 2.100 | | 25 | 21:00:51.6 | 0.008 | 2.200 | 2.200 | 2.200 | 2.200 | +-----------+------------+------------+------------+-----------------+------------+-----------------+ generator rel_grid_scan ['13a42d3f'] (scan num: 5) +-----------+------------+------------+------------+-----------------+------------+-----------------+ | seq_num | time | det4 | motor1 | motor1_setpoint | motor2 | motor2_setpoint | +-----------+------------+------------+------------+-----------------+------------+-----------------+ | 1 | 21:00:51.7 | 0.004 | 1.800 | 1.800 | 2.800 | 2.800 | | 2 | 21:00:51.8 | 0.003 | 1.800 | 1.800 | 2.900 | 2.900 | | 3 | 21:00:51.8 | 0.002 | 1.800 | 1.800 | 3.000 | 3.000 | | 4 | 21:00:51.9 | 0.002 | 1.800 | 1.800 | 3.100 | 3.100 | | 5 | 21:00:51.9 | 0.001 | 1.800 | 1.800 | 3.200 | 3.200 | | 6 | 21:00:51.9 | 0.001 | 1.900 | 1.900 | 3.200 | 3.200 | | 7 | 21:00:52.0 | 0.001 | 1.900 | 1.900 | 3.100 | 3.100 | | 8 | 21:00:52.0 | 0.002 | 1.900 | 1.900 | 3.000 | 3.000 | | 9 | 21:00:52.0 | 0.002 | 1.900 | 1.900 | 2.900 | 2.900 | | 10 | 21:00:52.1 | 0.003 | 1.900 | 1.900 | 2.800 | 2.800 | | 11 | 21:00:52.1 | 0.003 | 2.000 | 2.000 | 2.800 | 2.800 | | 12 | 21:00:52.2 | 0.002 | 2.000 | 2.000 | 2.900 | 2.900 | | 13 | 21:00:52.2 | 0.002 | 2.000 | 2.000 | 3.000 | 3.000 | | 14 | 21:00:52.3 | 0.001 | 2.000 | 2.000 | 3.100 | 3.100 | | 15 | 21:00:52.3 | 0.001 | 2.000 | 2.000 | 3.200 | 3.200 | | 16 | 21:00:52.3 | 0.001 | 2.100 | 2.100 | 3.200 | 3.200 | | 17 | 21:00:52.4 | 0.001 | 2.100 | 2.100 | 3.100 | 3.100 | | 18 | 21:00:52.4 | 0.001 | 2.100 | 2.100 | 3.000 | 3.000 | | 19 | 21:00:52.5 | 0.002 | 2.100 | 2.100 | 2.900 | 2.900 | | 20 | 21:00:52.5 | 0.002 | 2.100 | 2.100 | 2.800 | 2.800 | | 21 | 21:00:52.6 | 0.002 | 2.200 | 2.200 | 2.800 | 2.800 | | 22 | 21:00:52.6 | 0.001 | 2.200 | 2.200 | 2.900 | 2.900 | | 23 | 21:00:52.6 | 0.001 | 2.200 | 2.200 | 3.000 | 3.000 | | 24 | 21:00:52.7 | 0.001 | 2.200 | 2.200 | 3.100 | 3.100 | | 25 | 21:00:52.7 | 0.001 | 2.200 | 2.200 | 3.200 | 3.200 | +-----------+------------+------------+------------+-----------------+------------+-----------------+ generator rel_grid_scan ['1129ae81'] (scan num: 6) | .. code-block:: default from bluesky.plans import relative_outer_product_scan from bluesky.plan_stubs import abs_set, wait from bluesky.preprocessors import (run_decorator, stage_decorator, subs_decorator) from bluesky.callbacks import LiveTable, LivePlot from ophyd.sim import det4, motor1, motor2 from bluesky import RunEngine 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: RE = RunEngine({}) samples = {'A': (1, 1), 'B': (1, 2), 'C': (1, 3), 'D': (2, 1), 'E': (2, 2), 'F': (2, 3)} RE(grid_in_grid(samples)) .. rst-class:: sphx-glr-timing **Total running time of the script:** ( 0 minutes 6.399 seconds) .. _sphx_glr_download_cookbook_grid_in_grid.py: .. only :: html .. container:: sphx-glr-footer :class: sphx-glr-footer-example .. container:: sphx-glr-download :download:`Download Python source code: grid_in_grid.py ` .. container:: sphx-glr-download :download:`Download Jupyter notebook: grid_in_grid.ipynb ` .. only:: html .. rst-class:: sphx-glr-signature `Gallery generated by Sphinx-Gallery `_