MVP for a thumbnail generator. Corners cut with ❤️.
See docstring for usage examples.
| import sys | |
| from imageio import imsave | |
| def generate_thumbnail(run, path_template): | |
| """ | |
| Write one thumbnail image to represent a Run if any image-like data can be found. | |
| Logs details to the stderr. | |
| Parameters | |
| ---------- | |
| run: BlueskyRun | |
| path_template: str | |
| May include templates like {start[plan_name]} or {stop[exit_status]} | |
| which will be extracted from the documents. If it does not end in ".png", then | |
| ".png" will be appended to the path. | |
| Returns | |
| ------- | |
| path: str or None | |
| The (possibly templated) path or, if no image data was found, None | |
| Examples | |
| -------- | |
| Write a PNG to a simple path. | |
| >>> generate_thumbnail(catalog[-1], "/tmp/test_thumbnail.png") | |
| Wrote 'img' from Run a907fe84 to /tmp/test_thumbnail.png | |
| '/tmp/test_thumbnail.png' | |
| Write a PNG to a path created by templating metadata from the Run. | |
| >>> generate_thumbnail(catalog[-1], "/tmp/test_thumbnail_{start[uid]:.8}_{start[plan_name]}.png") | |
| Wrote 'img' from Run a907fe84 /tmp/test_thumbnail_a907fe84_count.png | |
| '/tmp/test_thumbnail_a907fe84_count.png' | |
| """ | |
| if not path_template.endswith(".png"): | |
| path_template += ".png" | |
| path = path_template.format(**run.metadata) | |
| uid = run.metadata['start']['uid'] | |
| if 'primary' in run: | |
| stream_name = 'primary' | |
| elif list(run): | |
| # Just grab the first stream. | |
| stream_name = list(run)[0] | |
| else: | |
| print(f"No image data found in Run {uid:.8}", file=sys.stderr) | |
| dataset = run[stream_name].to_dask() | |
| # Find the first column that looks like an image. | |
| # Grab a slice from the middle because that is most likely to be interesting. | |
| for column in dataset: | |
| xarr = dataset[column] | |
| if xarr.ndim == 3: # a column of single images | |
| image = dataset[column][xarr.shape[0] // 2] | |
| break | |
| elif xarr.ndim == 4: # a column of stacks of images (like Area Detector gives) | |
| image = dataset[column][xarr.shape[0] // 2, xarr.shape[1] // 2] | |
| break | |
| else: | |
| print(f"No image data found in Run {uid:.8}", file=sys.stderr) | |
| return None | |
| imsave(path, image) | |
| print(f"Wrote {column!r} from Run {uid:.8} to {path}", file=sys.stderr) | |
| return path |