Plans
A variety of plans for your use. These are built out of Bluesky plans and plan stubs, and customized to be very specific to operations at SSRL1-5. If you’d like to build your own plans out of the existing plans, see this tutorial section.
Helper functions, plans
show_table()
:
Shows data from the last run in tablular from. Providing an index (i)
will return data from the ‘i-th’ run. This is simply a wrapper for db[i].table()
In [33]: RE(bp.count([det]))
Transient Scan ID: 9 Time: 2020-09-03 14:32:59
Persistent Unique Scan ID: 'a70862bd-782f-44f6-98aa-bf5328854a67'
New stream: 'primary'
+-----------+------------+------------+
| seq_num | time | det |
+-----------+------------+------------+
| 1 | 14:32:59.1 | 0.989 |
+-----------+------------+------------+
generator count ['a70862bd'] (scan num: 9)
Out[33]: ('a70862bd-782f-44f6-98aa-bf5328854a67',)
In [34]: RE(bp.scan([det], motor, -1, 1, 2))
Transient Scan ID: 10 Time: 2020-09-03 14:33:18
Persistent Unique Scan ID: 'b161498f-df5f-4ae0-8a77-c894a9c1a567'
New stream: 'primary'
+-----------+------------+------------+------------+
| seq_num | time | motor | det |
+-----------+------------+------------+------------+
| 1 | 14:33:18.3 | -1.000 | 0.607 |
| 2 | 14:33:18.3 | 1.000 | 0.607 |
+-----------+------------+------------+------------+
generator scan ['b161498f'] (scan num: 10)
Out[34]: ('b161498f-df5f-4ae0-8a77-c894a9c1a567',)
In [37]: show_table()
Out[37]:
time det motor motor_setpoint
seq_num
1 2020-09-03 21:33:18.330529213 0.606531 -1.0 -1.0
2 2020-09-03 21:33:18.359466553 0.606531 1.0 1.0
In [38]: show_table(-2) # negative indexes walk from most recent to least
Out[38]:
time det
seq_num
1 2020-09-03 21:32:59.126556158 0.988639
show_image()
:
Shows last marCCD image, simple wrapper function around databroker call. Sets heat map scale to (min, mean+3*std). Defaults to first marccd data point in most recent scan, but allows for customization.
In [1]: show_image(ind=-1, data_pt=1, img_key='marCCD_image') #these are the default parameters
tune(signal, axis)
:
Tunes a motor based on output from a signal. A width and number of steps can be
specified. After scanning the motor from -width/2
to +width/2
relative
to the current position, the motor will be moved to either the center of mass
(‘com’) or midpoint between half-max points (‘cen’).
Default parameters are provided for some motors, otherwise parameters must be supplied as arguments.
Signature:
tune(signal, motor, width=None, num=None, peak_choice=None, md=None)
In [5]: RE(bps.mv(motor, 1))
Out[5]: ()
In [6]: RE(tune(det, motor))
Transient Scan ID: 3 Time: 2020-09-03 15:14:19
Persistent Unique Scan ID: '1a2e178d-89b0-4256-a6ed-7b6ea987e336'
New stream: 'primary'
+-----------+------------+------------+------------+
| seq_num | time | motor | det |
+-----------+------------+------------+------------+
| 1 | 15:14:19.3 | -1.000 | 0.607 |
| 2 | 15:14:19.4 | -0.789 | 0.732 |
| 3 | 15:14:19.4 | -0.579 | 0.846 |
| 4 | 15:14:19.4 | -0.368 | 0.934 |
| 5 | 15:14:19.4 | -0.158 | 0.988 |
| 6 | 15:14:19.4 | 0.053 | 0.999 |
| 7 | 15:14:19.5 | 0.263 | 0.966 |
| 8 | 15:14:19.5 | 0.474 | 0.894 |
| 9 | 15:14:19.5 | 0.684 | 0.791 |
| 10 | 15:14:19.5 | 0.895 | 0.670 |
| 11 | 15:14:19.6 | 1.105 | 0.543 |
| 12 | 15:14:19.6 | 1.316 | 0.421 |
| 13 | 15:14:19.6 | 1.526 | 0.312 |
| 14 | 15:14:19.7 | 1.737 | 0.221 |
| 15 | 15:14:19.7 | 1.947 | 0.150 |
| 16 | 15:14:19.7 | 2.158 | 0.097 |
| 17 | 15:14:19.8 | 2.368 | 0.061 |
| 18 | 15:14:19.8 | 2.579 | 0.036 |
| 19 | 15:14:19.8 | 2.789 | 0.020 |
| 20 | 15:14:19.8 | 3.000 | 0.011 |
+-----------+------------+------------+------------+
generator motor.tune ['1a2e178d'] (scan num: 3)
Out[6]: ('1a2e178d-89b0-4256-a6ed-7b6ea987e336',)
In [7]: motor.position
Out[7]: 0.2466375712535196
High Throughput (HiTp) specific plans
loc_177_scan(dets)
Macro for automatically scanning a HiTp library with 177 points. Currently this
plan does not take any dark-field images. dets
is a list of detectors
In [7]: RE(loc_177_scan([dexDet, xsp3]))
dark_light_plan(dets, shutter)
Simple acquisition plan for a single point. Closes the shutter, takes a dark
image, opens the shutter, and finally takes a light image. Both images are
referenced in the same run, under the metadata tag: im_type
. Returns the
uid of each image.
In [1]: uids = RE(dark_light_plan([dexDet], shutter))
level_stage_single
as of the writing of this passage (05/12/2021), the single wafer stage can be leveled via the following commands. Assuming the offsets have px=0, py=0 at the crosshair in the center of the stage.
In [1]: %mov py 0
In [2]: RE(level_stage_single(lrf, vx, px, -50, 50))
In [3]: %mov px 43
In [4]: RE(level_stage_single(lrf, vy, py, 75, -75))
mesh_grid_circ
Scans points in a circular grid with given radius. Scan bounds is defined by a
4 endpoints (s1, f1, s2, f2)
. A measurement is taken at every point within
the bounds defined by these endpoints if that point is inside the radius.
To align the grid within the circular boundary, a sample location can be provided to
the pin
variable. If no pin
is provied, then the current location is
used.
In the case where a scan has been interrupted after the first n measurements, one can supply a number of measurements to skip.
The order of the motors controls how the grid is traversed. The “slowest” axis
comes first, and only scans between its limits once. The second “faster” axis
will scan betwen its limits once for each position on the first motor.
This plan uses the blueksy.plans.grid_scan
behavior, and one can reference
its more complete documentation.

In [2]: RE(mesh_circ_grid([marDet], s_stage.px, -10, 10, 4.5,
s_stage.py, -10, 10, 4.5,
radius=10, pin=(1.5, 1.5), skip=4 ))