{ "cells": [ { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "# The ``lineup()`` plan - align an axis with a signal\n", "\n", "In this example, we demonstrate the `apstools.plans.lineup()` plan, which aligns\n", "an axis using some statistical measure (`cen`: centroid, `com`: center of mass,\n", "`max`: position of peak value, or even `min`: negative trending peaks) of a\n", "signal. If an alignment is possible, an optional rescan will fine-tune the\n", "alignment within the width and center of the first scan. Use `rescan=False`\n", "keyword to disable. Here's an example chart showing the first (roughly, locate\n", "at least one point **within** the peak) and second (fine-tune the position)\n", "scans.\n", "\n", "![Chart of example lineup showing first and second scans.](lineup.png)\n", "\n", "We'll use a floating-point scalar value (not connected to hardware) as a\n", "*positioner*. Then, we prepare a simulated *detector* signal that is a\n", "computation based on the value of our positioner. The computed signal is a\n", "model of a realistic diffraction peak\n", "([pseudo-Voigt](https://en.wikipedia.org/wiki/Voigt_profile), a mixture of a\n", "Gaussian and a Lorentzian) one might encounter in a powder diffraction scan.\n", "The model peak is a pseudo-voigt function to which some noise has been added.\n", "Random numbers are used to modify the ideal pseudo-voigt function so as to\n", "simulate a realistic signal.\n", "\n", "For this demo, we'll use a temporary databroker catalog (deleted when the\n", "notebook is closed) since we do not plan to review any of this data after\n", "collection. We'll display the data during the scan(in both a table and a chart)\n", "using a `BestEffortCallback()` subscription to the `bluesky.RunEngine()`." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from apstools.devices import SynPseudoVoigt\n", "from apstools.plans import lineup\n", "from bluesky import RunEngine\n", "from bluesky.callbacks import best_effort\n", "import bluesky.plan_stubs as bps\n", "import databroker\n", "import numpy\n", "import ophyd\n", "\n", "bec = best_effort.BestEffortCallback()\n", "cat = databroker.temp()\n", "RE = RunEngine({})\n", "RE.subscribe(cat.v1.insert)\n", "RE.subscribe(bec)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Setup\n", "\n", "Set the IOC prefix and connect with our EPICS PVs." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "IOC = \"gp:\"\n", "axis = ophyd.EpicsSignal(f\"{IOC}gp:float1\", name=\"axis\")\n", "\n", "axis.wait_for_connection()" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Once connected, create the *detector* signal (the computed pseudo-Voigt) with default peak parameters." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "# Need to know that axis is connected before using here.\n", "pvoigt = SynPseudoVoigt(name=\"pvoigt\", motor=axis, motor_field=axis.name)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "The `pvoigt` signal must have `kind=\"hinted\"` for it to appear in tables and plots." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "pvoigt.kind = \"hinted\"" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Move `axis` to a starting position. Pick zero." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "()" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "RE(bps.mv(axis, 0))" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Scan\n", "\n", "To make things interesting, first randomize the peak parameters. (Peak is placed randomly between -1..+1 on `axis` scale, with random width, scale, pseudo-Voigt mixing parameter, noise, ...)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "pvoigt.randomize_parameters(scale=100_000)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Run the `lineup()` plan through the range where the peak is expected. Don't need many points to catch some value that is acceptable (max is more than 4*min) the background." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n", "Transient Scan ID: 1 Time: 2022-09-28 15:35:18\n", "Persistent Unique Scan ID: '22182d47-72c1-450b-bf62-035a2c608d11'\n", "New stream: 'primary'\n", "+-----------+------------+------------+------------+\n", "| seq_num | time | axis | pvoigt |\n", "+-----------+------------+------------+------------+\n", "| 1 | 15:35:18.6 | -1.2000 | 1413 |\n", "| 2 | 15:35:18.6 | -1.0000 | 5259 |\n", "| 3 | 15:35:18.7 | -0.8000 | 55856 |\n", "| 4 | 15:35:18.7 | -0.6000 | 2113 |\n", "| 5 | 15:35:18.7 | -0.4000 | 1070 |\n", "| 6 | 15:35:18.8 | -0.2000 | 796 |\n", "| 7 | 15:35:18.8 | 0.0000 | 689 |\n", "| 8 | 15:35:18.8 | 0.2000 | 675 |\n", "| 9 | 15:35:18.8 | 0.4000 | 600 |\n", "| 10 | 15:35:18.8 | 0.6000 | 649 |\n", "| 11 | 15:35:18.9 | 0.8000 | 567 |\n", "| 12 | 15:35:18.9 | 1.0000 | 547 |\n", "| 13 | 15:35:18.9 | 1.2000 | 552 |\n", "+-----------+------------+------------+------------+\n", "generator rel_scan ['22182d47'] (scan num: 1)\n", "\n", "\n", "\n", "\n", "\n", "Transient Scan ID: 2 Time: 2022-09-28 15:35:19\n", "Persistent Unique Scan ID: '9928a319-fa14-4b5e-837f-1f4058f7029c'\n", "New stream: 'primary'\n", "+-----------+------------+------------+------------+\n", "| seq_num | time | axis | pvoigt |\n", "+-----------+------------+------------+------------+\n", "| 1 | 15:35:19.1 | -1.0154 | 4403 |\n", "| 2 | 15:35:19.1 | -0.9801 | 7746 |\n", "| 3 | 15:35:19.1 | -0.9447 | 18831 |\n", "| 4 | 15:35:19.2 | -0.9093 | 46123 |\n", "| 5 | 15:35:19.2 | -0.8739 | 88448 |\n", "| 6 | 15:35:19.2 | -0.8386 | 99186 |\n", "| 7 | 15:35:19.2 | -0.8032 | 59675 |\n", "| 8 | 15:35:19.2 | -0.7678 | 25649 |\n", "| 9 | 15:35:19.3 | -0.7325 | 10329 |\n", "| 10 | 15:35:19.3 | -0.6971 | 5200 |\n", "| 11 | 15:35:19.3 | -0.6617 | 3386 |\n", "| 12 | 15:35:19.3 | -0.6263 | 2602 |\n", "| 13 | 15:35:19.3 | -0.5910 | 2046 |\n", "+-----------+------------+------------+------------+\n", "generator rel_scan ['9928a319'] (scan num: 2)\n", "\n", "\n", "\n", "pvoigt.read()={'pvoigt': {'value': 2046, 'timestamp': 1664397319.3793561}}, axis.get()=-0.8496701712914874\n" ] }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "RE(lineup(pvoigt, axis, -1.2, 1.2, 13, feature=\"cen\", rescan=True))\n", "print(f\"{pvoigt.read()=}, {axis.get()=}\")" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Validate\n", "\n", "Show the position after the `lineup()` completes. Test (Python `assert`) that it is within the expected range." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "center=-0.8503901139652472\n", "sigma=0.11456520969899238\n", "bec.peaks={\n", "'com':\n", " {'pvoigt': -0.8461974129441658}\n", ",\n", "'cen':\n", " {'pvoigt': -0.8496701712914874}\n", ",\n", "'max':\n", " {'pvoigt': (-0.8385705807871623,\n", " 99186)}\n", ",\n", "'min':\n", " {'pvoigt': (-0.5909727956676526,\n", " 2046)}\n", ",\n", "'fwhm':\n", " {'pvoigt': 0.11177564414922392}\n", ",\n", "}\n" ] } ], "source": [ "center = pvoigt.center\n", "sigma = 2.355 * pvoigt.sigma\n", "print(f\"{center=}\\n{sigma=}\\n{bec.peaks=}\")\n", "assert center-sigma <= axis.get() <= center+sigma" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3.9.13 ('bluesky_2022_3')", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.13" }, "orig_nbformat": 4, "vscode": { "interpreter": { "hash": "b8b33b6f973508780ebf5a25daa70491e33966a11f9c922d918d5dafd5e1ee6b" } } }, "nbformat": 4, "nbformat_minor": 2 }