diff --git a/docs/source/examples/de_2_adsim_hdf5_single_mode.ipynb b/docs/source/examples/de_2_adsim_hdf5_single_mode.ipynb index c523e245c..154aeab85 100644 --- a/docs/source/examples/de_2_adsim_hdf5_single_mode.ipynb +++ b/docs/source/examples/de_2_adsim_hdf5_single_mode.ipynb @@ -118,7 +118,7 @@ "source": [ "### Preparation\n", "\n", - "Configure how [matplotlib](https://matplotlib.org/) charts will be displayed by in the notebook.\n", + "Configure how [matplotlib](https://matplotlib.org/) charts will be displayed in the notebook.\n", "\n", "We'll import additional libraries as needed by each of the following steps." ] @@ -131,7 +131,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 4, @@ -207,7 +207,7 @@ " \"\"\"\n", " Add data acquisition methods to HDF5Plugin.\n", "\n", - " * ``stage()`` - prepare device PVs befor data acquisition\n", + " * ``stage()`` - prepare device PVs before data acquisition\n", " * ``unstage()`` - restore device PVs after data acquisition\n", " * ``generate_datum()`` - coordinate image storage metadata\n", " \"\"\"\n", @@ -482,7 +482,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 16, "metadata": {}, "outputs": [], "source": [ @@ -502,7 +502,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 17, "metadata": {}, "outputs": [ { @@ -511,7 +511,7 @@ "0" ] }, - "execution_count": 19, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" } @@ -535,7 +535,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 18, "metadata": {}, "outputs": [], "source": [ @@ -563,21 +563,21 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "BlueskyRun\n", - " uid='97521687-897c-413e-8ba2-0183d190bacb'\n", + " uid='6780800e-b08a-4933-bf26-8618b3fb53ed'\n", " exit_status='success'\n", - " 2022-09-30 15:30:17.496 -- 2022-09-30 15:30:17.572\n", + " 2022-09-30 16:31:38.860 -- 2022-09-30 16:31:38.965\n", " Streams:\n", " * primary\n" ] }, - "execution_count": 21, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } @@ -599,27 +599,13 @@ "\n", "NOTE: Any Python client that reads data compressed with these compression modes will also need to import the `hdf5plugin` library, or provide alternative support.\n", "\n", - "
\n", - "!!!BUGFIX required!!!\n", - "\n", - "NOTE: This relies on a [bugfix pending release](https://github.com/bluesky/area-detector-handlers/pull/32) in the area detector handlers (current version 0.0.9). The fixed method is in file `area_detector_handlers/handlers.py` in the `HDF5SingleHandler` class at lines 530-536:\n", - "\n", - "```py\n", - " def __call__(self, point_number):\n", - " ret = []\n", - " for fn in self._fnames_for_point(point_number):\n", - " f = h5py.File(fn, 'r')\n", - " data = f[self._key][:]\n", - " ret.append(data)\n", - " return np.stack(ret)\n", - "```\n", - "\n", - "
\n" + "NOTE: Make sure you are using at least version 0.0.10 (or higher) of the [area-detector-handlers](https://github.com/bluesky/area-detector-handlers/pull/32)\n", + "for an important bugfix relating to how databroker will read these HDF5 files.\n" ] }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 20, "metadata": {}, "outputs": [ { @@ -977,34 +963,34 @@ " fill: currentColor;\n", "}\n", "
<xarray.DataArray 'adsimdet_image' (dim_1: 1024, dim_2: 1024)>\n",
-       "array([[  5,   6,   7, ...,   2,   3,   4],\n",
-       "       [  6,   7,   8, ...,   3,   4,   5],\n",
-       "       [  7,   8,   9, ...,   4,   5,   6],\n",
+       "array([[ 9, 10, 11, ...,  6,  7,  8],\n",
+       "       [10, 11, 12, ...,  7,  8,  9],\n",
+       "       [11, 12, 13, ...,  8,  9, 10],\n",
        "       ...,\n",
-       "       [  2,   3,   4, ..., 255,   0,   1],\n",
-       "       [  3,   4,   5, ...,   0,   1,   2],\n",
-       "       [  4,   5,   6, ...,   1,   2,   3]], dtype=uint8)\n",
+       "       [ 6,  7,  8, ...,  3,  4,  5],\n",
+       "       [ 7,  8,  9, ...,  4,  5,  6],\n",
+       "       [ 8,  9, 10, ...,  5,  6,  7]], dtype=uint8)\n",
        "Coordinates:\n",
        "    time     float64 1.665e+09\n",
        "Dimensions without coordinates: dim_1, dim_2\n",
        "Attributes:\n",
-       "    object:   adsimdet
    • time
      ()
      float64
      1.665e+09
      array(1.6645735e+09)
  • object :
    adsimdet
  • " ], "text/plain": [ "\n", - "array([[ 5, 6, 7, ..., 2, 3, 4],\n", - " [ 6, 7, 8, ..., 3, 4, 5],\n", - " [ 7, 8, 9, ..., 4, 5, 6],\n", + "array([[ 9, 10, 11, ..., 6, 7, 8],\n", + " [10, 11, 12, ..., 7, 8, 9],\n", + " [11, 12, 13, ..., 8, 9, 10],\n", " ...,\n", - " [ 2, 3, 4, ..., 255, 0, 1],\n", - " [ 3, 4, 5, ..., 0, 1, 2],\n", - " [ 4, 5, 6, ..., 1, 2, 3]], dtype=uint8)\n", + " [ 6, 7, 8, ..., 3, 4, 5],\n", + " [ 7, 8, 9, ..., 4, 5, 6],\n", + " [ 8, 9, 10, ..., 5, 6, 7]], dtype=uint8)\n", "Coordinates:\n", " time float64 1.665e+09\n", "Dimensions without coordinates: dim_1, dim_2\n", @@ -1012,7 +998,7 @@ " object: adsimdet" ] }, - "execution_count": 22, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" } @@ -1020,7 +1006,6 @@ "source": [ "import hdf5plugin # required for LZ4, Blosc, and other compression codecs\n", "\n", - "# print(run.primary._resources) # show how the files are referenced in the databroker\n", "frame = run.primary.read()[adsimdet.image.name][0][0]\n", "frame" ] @@ -1036,22 +1021,22 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 23, + "execution_count": 21, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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", + "image/png": "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", "text/plain": [ "
    " ] @@ -1077,44 +1062,45 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "[Resource({'path_semantics': 'posix',\n", - " 'resource_kwargs': {'filename': 'd89e412a-abd1-4a04-be1b',\n", + "Resource({'path_semantics': 'posix',\n", + " 'resource_kwargs': {'filename': '62e73032-4d57-4e37-b784',\n", " 'frame_per_point': 1,\n", " 'template': '%s%s_%6.6d.h5'},\n", " 'resource_path': 'tmp/docker_ioc/iocad/tmp/example/2022/09/30',\n", " 'root': '/',\n", - " 'run_start': '97521687-897c-413e-8ba2-0183d190bacb',\n", + " 'run_start': '6780800e-b08a-4933-bf26-8618b3fb53ed',\n", " 'spec': 'AD_HDF5_SINGLE',\n", - " 'uid': '3fad7176-20c9-450a-9bb1-76c2d455fa4d'})]" + " 'uid': 'e00f8f86-4dbe-46c1-959e-3d504986b7f5'})" ] }, - "execution_count": 24, + "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "run.primary._resources" + "rsrc = run.primary._resources[0]\n", + "rsrc" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "This information has shown the path to the image file *as seen from the bluesky workstation's file system.* We can parse this structure for the file name. In this case, the file is found since the `resource_path` is written relative to the `READ_PATH_TEMPLATE` defined [above](#File-Directories).\n", + "This information has shown the path to the image file *as seen from the bluesky workstation's file system.* We can parse this structure for the file name. In this case, the file is found since the `resource_path` is written relative to the `READ_PATH_TEMPLATE` defined [above](#File-Directories). It takes a bit of work to re-assemble the file name.\n", "\n", "This is an important distinction since the IOC and bluesky see the same file on different directory paths, as described [above](#File-Directories)." ] }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 23, "metadata": {}, "outputs": [ { @@ -1122,14 +1108,18 @@ "output_type": "stream", "text": [ "file_name.exists()=True\n", - "file_name=PosixPath('/tmp/docker_ioc/iocad/tmp/example/2022/09/30')\n" + "file_name=PosixPath('/tmp/docker_ioc/iocad/tmp/example/2022/09/30/62e73032-4d57-4e37-b784_000000.h5')\n" ] } ], "source": [ - "rsrc = run.primary._resources[0]\n", - "rk = rsrc[\"resource_kwargs\"]\n", - "file_name = pathlib.Path(f\"{rsrc[\"root\"]}{rsrc[\"resource_path\"]}\")\n", + "file_name = pathlib.Path(\n", + " rsrc[\"resource_kwargs\"][\"template\"] % (\n", + " f\"{rsrc['root']}{rsrc['resource_path']}/\",\n", + " rsrc[\"resource_kwargs\"][\"filename\"],\n", + " rsrc[\"resource_kwargs\"][\"frame_per_point\"] - 1\n", + " )\n", + ")\n", "print(f\"{file_name.exists()=}\\n{file_name=}\")" ] }, @@ -1144,9 +1134,28 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 24, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "local_file_name.exists()=True\n", + "local_file_name=PosixPath('/tmp/docker_ioc/iocad/tmp/example/2022/09/30/62e73032-4d57-4e37-b784_000000.h5')\n" + ] + }, + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "from apstools.devices import AD_full_file_name_local\n", "\n", @@ -1166,9 +1175,85 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 25, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "!!! WARNING: this program is not ready for distribution.\n", + "\n", + "/tmp/docker_ioc/iocad/tmp/example/2022/09/30/62e73032-4d57-4e37-b784_000000.h5 : NeXus data file\n", + " entry:NXentry\n", + " @NX_class = \"NXentry\"\n", + " data:NXdata\n", + " @NX_class = \"NXdata\"\n", + " data:NX_UINT8[1024,1024] = __array\n", + " __array = [\n", + " [9, 10, 11, '...', 8]\n", + " [10, 11, 12, '...', 9]\n", + " [11, 12, 13, '...', 10]\n", + " ...\n", + " [8, 9, 10, '...', 7]\n", + " ]\n", + " @NDArrayDimBinning = [1 1]\n", + " @NDArrayDimOffset = [0 0]\n", + " @NDArrayDimReverse = [0 0]\n", + " @NDArrayNumDims = 2\n", + " @signal = 1\n", + " instrument:NXinstrument\n", + " @NX_class = \"NXinstrument\"\n", + " NDAttributes:NXcollection\n", + " @NX_class = \"NXcollection\"\n", + " @hostname = \"zap\"\n", + " NDArrayEpicsTSSec:NX_UINT32 = 1033421498\n", + " @NDAttrDescription = \"The NDArray EPICS timestamp seconds past epoch\"\n", + " @NDAttrName = \"NDArrayEpicsTSSec\"\n", + " @NDAttrSource = \"Driver\"\n", + " @NDAttrSourceType = \"NDAttrSourceDriver\"\n", + " NDArrayEpicsTSnSec:NX_UINT32 = 913238900\n", + " @NDAttrDescription = \"The NDArray EPICS timestamp nanoseconds\"\n", + " @NDAttrName = \"NDArrayEpicsTSnSec\"\n", + " @NDAttrSource = \"Driver\"\n", + " @NDAttrSourceType = \"NDAttrSourceDriver\"\n", + " NDArrayTimeStamp:NX_FLOAT64 = 1033421498.9031079\n", + " @NDAttrDescription = \"The timestamp of the NDArray as float64\"\n", + " @NDAttrName = \"NDArrayTimeStamp\"\n", + " @NDAttrSource = \"Driver\"\n", + " @NDAttrSourceType = \"NDAttrSourceDriver\"\n", + " NDArrayUniqueId:NX_INT32 = 1033\n", + " @NDAttrDescription = \"The unique ID of the NDArray\"\n", + " @NDAttrName = \"NDArrayUniqueId\"\n", + " @NDAttrSource = \"Driver\"\n", + " @NDAttrSourceType = \"NDAttrSourceDriver\"\n", + " detector:NXdetector\n", + " @NX_class = \"NXdetector\"\n", + " data:NX_UINT8[1024,1024] = __array\n", + " __array = [\n", + " [9, 10, 11, '...', 8]\n", + " [10, 11, 12, '...', 9]\n", + " [11, 12, 13, '...', 10]\n", + " ...\n", + " [8, 9, 10, '...', 7]\n", + " ]\n", + " @NDArrayDimBinning = [1 1]\n", + " @NDArrayDimOffset = [0 0]\n", + " @NDArrayDimReverse = [0 0]\n", + " @NDArrayNumDims = 2\n", + " @signal = 1\n", + " NDAttributes:NXcollection\n", + " @NX_class = \"NXcollection\"\n", + " ColorMode:NX_INT32 = 0\n", + " @NDAttrDescription = \"Color mode\"\n", + " @NDAttrName = \"ColorMode\"\n", + " @NDAttrSource = \"Driver\"\n", + " @NDAttrSourceType = \"NDAttrSourceDriver\"\n", + " performance\n", + "\n" + ] + } + ], "source": [ "from apstools.utils import unix\n", "\n", @@ -1182,9 +1267,159 @@ "source": [ "## Recapitulation\n", "\n", - "Let's gather the above parts together as one would usually write code. First, all the imports, constants, and classes.\n", + "Let's gather the above parts together as one would usually write code.\n", + "\n", + "```py\n", + "# matplotlib graphics, choices include: inline, notebook, auto\n", + "%matplotlib auto\n", + "\n", + "from apstools.devices import AD_plugin_primed\n", + "from apstools.devices import AD_prime_plugin2\n", + "from apstools.devices import CamMixin_V34\n", + "from apstools.devices import SingleTrigger_V34\n", + "import hdf5plugin # required for LZ4, Blosc, and other compression codecs\n", + "from ophyd import ADComponent\n", + "from ophyd.areadetector import DetectorBase\n", + "from ophyd.areadetector import SimDetectorCam\n", + "from ophyd.areadetector.filestore_mixins import FileStoreHDF5SingleIterativeWrite\n", + "from ophyd.areadetector.plugins import HDF5Plugin_V34 as HDF5Plugin\n", + "from ophyd.areadetector.plugins import ImagePlugin_V34 as ImagePlugin\n", + "import bluesky\n", + "import bluesky.plans as bp\n", + "import databroker\n", + "import matplotlib.pyplot as plt\n", + "import pathlib\n", + "import warnings\n", + "\n", + "plt.ion() # turn on matplotlib plots\n", + "\n", + "RE = bluesky.RunEngine()\n", + "cat = databroker.temp().v2\n", + "# or use your own catalog like this example:\n", + "# cat = databroker.catalog[\"training\"]\n", + "RE.subscribe(cat.v1.insert)\n", "\n", - "TODO" + "IOC = \"ad:\"\n", + "\n", + "# These paths are specific to how this IOC is implemented.\n", + "AD_IOC_MOUNT_PATH = pathlib.Path(\"/tmp\")\n", + "BLUESKY_MOUNT_PATH = pathlib.Path(\"/tmp/docker_ioc/iocad/tmp\")\n", + "\n", + "IMAGE_DIR = \"example/%Y/%m/%d\" # our choice for file arrangement\n", + "\n", + "# MUST end with a `/`, pathlib will NOT provide it\n", + "WRITE_PATH_TEMPLATE = f\"{AD_IOC_MOUNT_PATH / IMAGE_DIR}/\"\n", + "READ_PATH_TEMPLATE = f\"{BLUESKY_MOUNT_PATH / IMAGE_DIR}/\"\n", + "\n", + "\n", + "class TheDetectorCam(CamMixin_V34, SimDetectorCam):\n", + " \"\"\"Revise SimDetectorCam for ADCore revisions.\"\"\"\n", + "\n", + " def __init__(self, *args, **kwargs):\n", + " super().__init__(*args, **kwargs)\n", + " self.stage_sigs.update(\n", + " dict(\n", + " acquire_time=0.01,\n", + " acquire_period=0.015, # a wee bit longer than acquire_time\n", + " num_images=1,\n", + " num_exposures=1, # Exp./image\n", + " wait_for_plugins=\"Yes\",\n", + " array_callbacks=\"Enable\",\n", + " )\n", + " )\n", + "\n", + "\n", + "class CustomHDF5Plugin(FileStoreHDF5SingleIterativeWrite, HDF5Plugin):\n", + " \"\"\"\n", + " Add data acquisition methods to HDF5Plugin.\n", + "\n", + " * ``stage()`` - prepare device PVs before data acquisition\n", + " * ``unstage()`` - restore device PVs after data acquisition\n", + " * ``generate_datum()`` - coordinate image storage metadata\n", + " \"\"\"\n", + "\n", + " def __init__(self, *args, **kwargs):\n", + " super().__init__(*args, **kwargs)\n", + " self.stage_sigs.update(\n", + " dict(\n", + " array_callbacks=\"Disable\",\n", + " auto_increment=\"Yes\",\n", + " auto_save=\"Yes\",\n", + " blocking_callbacks=\"No\",\n", + " compression=\"zlib\",\n", + " lazy_open=\"Yes\",\n", + " store_perform=\"No\",\n", + " zlevel=6,\n", + " )\n", + " )\n", + " # capture is not used with Single mode\n", + " # parent.cam.array_callbacks is staged once in the cam\n", + " # create_directory must be set before file_path, which is set before staging\n", + " remove_these = \"\"\"\n", + " capture\n", + " array_counter\n", + " parent.cam.array_callbacks\n", + " create_directory\n", + " \"\"\".split()\n", + " for k in remove_these:\n", + " if k in self.stage_sigs:\n", + " self.stage_sigs.pop(k)\n", + "\n", + " def stage(self):\n", + " # Again, do not press the Capture button in the HDF plugin\n", + " if \"capture\" in self.stage_sigs:\n", + " warnings.warn(\"Do not use capture with file_write_mode='Single'\")\n", + " self.stage_sigs.pop(\"capture\")\n", + " super().stage()\n", + "\n", + "\n", + "class CustomDetector(SingleTrigger_V34, DetectorBase):\n", + " \"\"\"\n", + " ADSimDetector\n", + "\n", + " SingleTrigger:\n", + "\n", + " * stop any current acquisition\n", + " * sets image_mode to 'Multiple'\n", + " \"\"\"\n", + "\n", + " cam = ADComponent(TheDetectorCam, \"cam1:\")\n", + " hdf1 = ADComponent(\n", + " CustomHDF5Plugin,\n", + " \"HDF1:\",\n", + " write_path_template=WRITE_PATH_TEMPLATE,\n", + " read_path_template=READ_PATH_TEMPLATE,\n", + " )\n", + " image = ADComponent(ImagePlugin, \"image1:\")\n", + "\n", + "\n", + "adsimdet = CustomDetector(IOC, name=\"adsimdet\")\n", + "adsimdet.wait_for_connection(timeout=15)\n", + "adsimdet.missing_plugins()\n", + "adsimdet.read_attrs.append(\"hdf1\")\n", + "adsimdet.hdf1.create_directory.put(-5)\n", + "NUM_FRAMES = 1\n", + "adsimdet.cam.stage_sigs[\"num_frames\"] = NUM_FRAMES\n", + "\n", + "# this step is needed for ophyd\n", + "if not AD_plugin_primed(adsimdet.hdf1):\n", + " print(f\"Priming {adsimdet.hdf1.dotted_name}\")\n", + " AD_prime_plugin2(adsimdet.hdf1)\n", + "\n", + "\n", + "uids = RE(\n", + " bp.count([adsimdet],\n", + " md=dict(\n", + " title=\"Area Detector, Single mode, HDF5 file\",\n", + " purpose=\"image\")\n", + " )\n", + ")\n", + "\n", + "run = cat.v2[uids[0]]\n", + "frame = run.primary.read()[adsimdet.image.name][0][0]\n", + "\n", + "frame.plot.pcolormesh() # show the image\n", + "```" ] } ],