From 0c09b1a147e1270218791c4677354f5cf733b5ac Mon Sep 17 00:00:00 2001 From: Dan Allan Date: Mon, 5 Jul 2021 11:11:59 -0400 Subject: [PATCH 1/2] Add XAFS tutorial to TOC. --- _toc.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/_toc.yml b/_toc.yml index f80692b..c90d783 100644 --- a/_toc.yml +++ b/_toc.yml @@ -14,6 +14,7 @@ parts: - caption: Applications chapters: - file: Adaptive RL Sampling/Adaptive Sampling + - file: X-ray Absorption Fine Structure/Monochromator Optimization - caption: About chapters: - file: CONTRIBUTING From 3c3f3d54e2ae325c59d50372576f7da169acab29 Mon Sep 17 00:00:00 2001 From: Dan Allan Date: Mon, 5 Jul 2021 11:42:58 -0400 Subject: [PATCH 2/2] Remove Powder Diffraction, superseded by Adaptive tutorial. --- .../Exposures and Dark Frames.ipynb | 775 ------------------ Powder Diffraction/automatic_darkframes.py | 28 - Powder Diffraction/generate_data.py | 56 -- Powder Diffraction/index.rst | 7 - Powder Diffraction/simulated_hardware.py | 288 ------- .../static/HEX-2D-diffraction.png | Bin 56947 -> 0 bytes Powder Diffraction/utils.py | 106 --- 7 files changed, 1260 deletions(-) delete mode 100644 Powder Diffraction/Exposures and Dark Frames.ipynb delete mode 100644 Powder Diffraction/automatic_darkframes.py delete mode 100644 Powder Diffraction/generate_data.py delete mode 100644 Powder Diffraction/index.rst delete mode 100644 Powder Diffraction/simulated_hardware.py delete mode 100644 Powder Diffraction/static/HEX-2D-diffraction.png delete mode 100644 Powder Diffraction/utils.py diff --git a/Powder Diffraction/Exposures and Dark Frames.ipynb b/Powder Diffraction/Exposures and Dark Frames.ipynb deleted file mode 100644 index aa3bdb5..0000000 --- a/Powder Diffraction/Exposures and Dark Frames.ipynb +++ /dev/null @@ -1,775 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Exposures and Dark Frames" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In this notebook you will:\n", - "- Learn how to manipulate samples, shutters, and measure on a simulated diffraction beamline\n", - "- Design and implement a custom scan plan to manage dark-image subtraction\n", - "- Collect and average the data from multiple exposures" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Science Background\n", - "\n", - "At high-flux synchrotron lightsources like the NSLS-II, we often employ 2D large area-detectors to quickly gather powder diffraction data by measuring a wide bandwidth of reciprocal-space in a single measurement. In this transmission geometry, the Debye-Scherrer cones are captured as circles on the detector. These 2D images can be azimuthally integrated to process (or reduce) the data from the 2D-image format into the commonly encounter 1-D representation of diffraction peaks as Intensity vs. momentum-transfer vector ($Q$) or Intensity vs. scattering angle ($2\\theta$).\n", - "\n", - "\"Powder [(image source)](https://commons.wikimedia.org/wiki/File:HEX-2D-diffraction.png)\n", - "\n", - "This method of collecting diffraction data has the advantage of being very fast, allowing for in situ diffraction and total scattering studies of materials. For example, we can measure at a 10 Hz frame rate out to $Q = 25 \\, Å^{-1}$ at the PDF Beamline (28-ID-1) at NSLS-II. However, one challenge of this approach is that these large area-detectors often suffer from issues of burn-in, ghosting, and other so-called 'dark image' effects on the detectors.\n", - "\n", - "To address many of these issues, we employ a method called dark-image subtraction on the 2D-image data. Put simply, we measure a 'dark' image on the detector when there is no light being exposed (i.e. the shutter is closed), in which presumably any static artifacts on the detector are captured. This dark-image is then subtracted from any light-images (which we presume to also have these static artifacts) to produce a final clean image. \n", - "\n", - "Making things more complicated, these dark images must be regularly refreshed during the course of a beamtime. These detectors can experience image-ghosting, particularly from strongly scattering materials or over-exposed images. These ghost-images are essentially residual intensity on the detector that fades slowly with time. Careful management of when to collect dark-images, how to recognize over-exposure, and best practices for efficient data collection are all part of a successful powder diffraction measurement using 2D area-detectors." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Simulated Beamline\n", - "\n", - "We have designed a simulated beamline that exhibits a simplified version of these detector effects that can be controlled with Bluesky. Also key to this exercise, we simulated the passage of time and how it effects the image on the detector. This is to say that simply leaving the notebook open will not cause the decay of ghosted after-images on the detector (these effects are not tied to the actual wallclock time). Instead, explicit actions taken will move time forward. The four possible actions you can take in this tutorial are:\n", - "\n", - "- Load and unload different several samples \n", - "- Open and close a shutter\n", - "- Take measurements from the detector\n", - "- Take no action for a specific amount of time\n", - "\n", - "In the case of the latter action (or inaction), you can in principle move backwards in time. However, as \"Introductory Time Travel\" is saved for a future tutorial, we are recommending against it at this time, and are not responsible for any actions you may take or un-take. It might break the simulation. Please use time travel responsibly.\n", - "\n", - "\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Setup Bluesky & Simulation" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To begin with, setup your Bluesky environment and import those libraries we will need for the rest of the notebook." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import matplotlib.pyplot as plt\n", - "import numpy as np\n", - "\n", - "from bluesky_tutorial_utils import setup_data_saving\n", - "from bluesky import RunEngine\n", - "from bluesky.plans import count\n", - "\n", - "%matplotlib inline\n", - "\n", - "#if you'd prefer interactive plots, comment out the above line, and uncomment below\n", - "#%matplotlib widget\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Just as you can often find at real beamlines, we have written a number of custom helper-scripts which execute some of the more complicated raw commands in a more human-friendly way. But, as with real beamlines, you are not limited to the scripts we have provided and could develop your own custom scan-plans or data reduction procedures to gather and analyze data in your own preferred style. \n", - "\n", - "We also setup the Run Engine (RE) and Databroker instance (catalog) here." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from simulated_hardware import detector, load_sample, unload_sample, light, history_reset, sim_sleep\n", - "from simulated_hardware import _history\n", - "\n", - "RE = RunEngine()\n", - "catalog = setup_data_saving(RE)\n", - "\n", - "%run -i utils.py" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "plt.figure()\n", - "plt.plot(q,perfect_int1)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Part 1: Basic Image Collection" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To measure a sample, we need to do three things: load the sample into the beamline, open the shutter, and perform a 'count' plan on our detector." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "#load sample\n", - "RE(load_sample(1))\n", - "\n", - "#turn on light\n", - "RE(light(True))\n", - "\n", - "#count\n", - "RE(count([detector]))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Each of these actions takes 0.5 seconds, so if we look at our watch at the end, we should see 1.5 seconds has passed." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "look_at_watch()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To look at the image we've just measured, we'll use a helper function called `retrieve_im`, which takes as an argument the UID or index number of a run. As we've _just_ measured this image, it'll be the last image added to the Databroker, so we can pass it the argument `-1`." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "#retrieve image from databroker\n", - "my_im = retrieve_im(-1)\n", - "#plot\n", - "plt.figure()\n", - "plt.imshow(my_im)\n", - "plt.colorbar()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We see the diffraction pattern atop the characteristic paneling-effect that is seen on this detector. These panels are the individual modules that make up the large area detector. To get rid of this paneling artifact, we'll need to measure a dark image." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Dark Images\n", - "\n", - "To gather our dark image, we need to first close the shutter, wait a bit for the image to decay, and then measure." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "RE(light(False))\n", - "\n", - "sim_sleep(15) # a simulated 15 second pause\n", - "\n", - "RE(count([detector]))\n", - "\n", - "my_dark = retrieve_im(-1) #the last image will now be our new dark." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can look at that dark, and see only the paneling (no diffraction rings)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "plt.figure()\n", - "plt.imshow(my_dark)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Finally, look at the result of subtracting this dark from the light image we took earlier." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "plt.figure()\n", - "plt.imshow(my_im - my_dark)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "That looks much better! The last thing we'd like to do is integrate this dark-subtracted image in order to reduce our data into a familiar I(Q) form. We'll use our helper function, `simple_integration` to do this" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Integrate to get pattern" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "intensity = simple_integration(my_im - my_dark)\n", - "\n", - "plt.figure()\n", - "plt.plot(q,intensity, label=\"'measured' data\")\n", - "plt.legend()\n", - "plt.xlabel('Q ($\\AA^{-1}$)');\n", - "plt.ylabel('I(Q)');\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Using plans in Bluesky to gather light/dark automatically\n", - "\n", - "Rather than manually performing all the steps we've taken thus far, we can write a plan for Bluesky that will perform the same actions we have done thus far. Beamlines will often supply their own 'common' set of plans tailored to the experiments performed, but you are free to create your own! These can be as simple or as complicated as you like.\n", - "\n", - "For the workflow design of this simulated enviornment, we are separating out our data collection step from our data reduction step. Recall that when a plan is executed with the Run Engine (RE), the unique identifiers (uid) of the run is returned. We will use that functionality in our data processing workflow here.\n", - "\n", - "In the plan below, `dark_light_collection`, the only required argument is the sample number. We will use more of the complicated features of this plan later in the tutorial." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def dark_light_collection(sample_num, num_lights = 1):\n", - " uids = []\n", - " #close shutter if not already closed\n", - " yield from light(False)\n", - " \n", - " #move to desired sample\n", - " yield from load_sample(sample_num)\n", - " \n", - " #take dark image\n", - " uid = yield from count([detector])\n", - " uids.append(uid)\n", - " \n", - " #open shutter\n", - " yield from light(True)\n", - " \n", - " #take light image\n", - " for i in range(num_lights):\n", - " uid = yield from count([detector])\n", - " uids.append(uid)\n", - " \n", - " #close shutter to be nice to detector\n", - " yield from light(False)\n", - " return uids" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Running this plan will return a tuple of uids, the first of which will be the dark image, and the second the light. Let's measure the 1st sample, just as we did before." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "uids = RE(dark_light_collection(1))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can look into the variable `uids` that we had the plan return into." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "uids" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Finally, we'll take advantage of the data reduction helper-function provided here called `process_data`. This function takes as an argument this tuple of dark/light uid values, will internally do the dark-subtraction and integration, and return the resultant intensity.\n", - "\n", - "We can now plot this, and compare to the pattern we measured before to see that we've done the same thing (within measurement noise), but with only a couple lines." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "this_intensity = process_data(uids)\n", - "\n", - "plt.figure()\n", - "plt.plot(q, intensity, label=\"'hand-measured' data\")\n", - "plt.plot(q, this_intensity, label=\"plan-generated data\")\n", - "\n", - "plt.legend()\n", - "plt.xlabel('Q ($\\AA^{-1}$)');\n", - "plt.ylabel('I(Q)');\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Part B: Managing multiple samples.\n", - "\n", - "Recall that our simulation has multiple samples. If you wanted to look at these different samples, you could load them sequentially into the beamline using the following commands." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "RE(light(True))\n", - "\n", - "RE(load_sample(1))\n", - "\n", - "RE(load_sample(2))\n", - "\n", - "RE(load_sample(3))\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "However, recall that this detector has some memory and ghosting issues! Upon reflection, keeping the shutter open while we switched between samples was maybe not the best idea in the world. Let's take a look at what good-old sample number 1 looks like if we measure it now using our plan." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "uids = RE(dark_light_collection(1))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "First we'll examing things on the dark-subtracted image. You may notice the problem." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "my_light = retrieve_im(uids[1])\n", - "my_dark = retrieve_im(uids[0])\n", - "\n", - "plt.figure()\n", - "plt.imshow(my_light - my_dark)\n", - "\n", - "plt.colorbar()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Indeed, if we process this data in the standard way, we'll see negative peaks due to improper dark-image management.\n", - "\n", - "We can pass the kwarg (option) `return_light = True` or `return_dark = True` to our `process_data` function to return those individual components reduced." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "plt.figure()\n", - "ax1=plt.subplot(211)\n", - "plt.plot(q, process_data(uids))\n", - "plt.ylabel('I(Q)');\n", - "\n", - "plt.subplot(212,sharex = ax1)\n", - "plt.plot(q, process_data(uids,return_light=True),color='b', label='light')\n", - "plt.plot(q, process_data(uids,return_dark=True),color='k', label='dark')\n", - "plt.legend(loc=0)\n", - "\n", - "plt.xlabel('Q ($\\AA^{-1}$)');\n", - "plt.ylabel('I(Q)');" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The most straight-forward way to mitigate artifacts such as this is to simply let the ghost-images on the detector fade, and repeat the measurement. Let's rest for 100 seconds and remeasure sample 1. You can try adjusting the time given in `sim_sleep`, or changing the sample number in `dark_light_collection` to see what effect that has on the data." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sim_sleep(100)\n", - "\n", - "uids = RE(dark_light_collection(1))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "plt.figure()\n", - "ax1=plt.subplot(211)\n", - "plt.plot(q, process_data(uids))\n", - "plt.ylabel('I(Q)');\n", - "\n", - "plt.subplot(212,sharex = ax1)\n", - "plt.plot(q,process_data(uids,return_light=True),color='b', label='light')\n", - "plt.plot(q, process_data(uids,return_dark=True),color='k', label='dark')\n", - "plt.legend(loc=0)\n", - "\n", - "plt.xlabel('Q ($\\AA^{-1}$)');\n", - "plt.ylabel('I(Q)');" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Part C : More samples, more problems.\n", - "\n", - "In a real experiment, you often switch between samples, and they don't all scatter the same. We often measure multiple times on a single sample and sum the results to improve statistics. Up to now, we've been using very 'friendly' simulated samples, but let's crank up the difficulty a little bit. Assume you are now dealing with weakly scattering materials or small-quantities of sample. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "hard_mode()\n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's get a feeling for this new 'hard mode' by taking a standard shot as we've done before with `dark_light_collection`. We will plot it atop the ideal pattern we've already calculated for you called `perfect_int1`." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "uid = RE(dark_light_collection(1))\n", - "plt.figure()\n", - "plt.plot(q, process_data(uid), label='measured data')\n", - "plt.plot(q, perfect_int1, label='ideal')\n", - "\n", - "plt.legend(loc=0)\n", - "\n", - "plt.xlabel('Q ($\\AA^{-1}$)');\n", - "plt.ylabel('I(Q)');" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "That certainly looks a lot more noisy than before. In situations like this, it's common to measure the sample multiple times, and sum or average the results. Our `dark_light_collection` plan actually has such a feature in there already. Simply pass the kwarg `num_lights=10` to take 10-consecutive light exposures after the dark. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "uids1 = RE(dark_light_collection(1, num_lights=10))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can see the uids1 list now contains 11-entries (the 1-dark, followed by 10-lights)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "uids1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Our `process_data` function is already setup to handle lists of uids like this, simply pass it the same kwarg and it will return you a list of dark-subtraced and reduced intensities. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "reduced_data1 = process_data(uids1, num_lights=10)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let's take the average of those 10 patterns and plot them against the ideal data." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "plt.figure()\n", - "plt.plot(q, reduced_data1.mean(axis=1),label='mean data');\n", - "plt.plot(q, perfect_int1,label='ideal')\n", - "\n", - "plt.legend(loc=0)\n", - "\n", - "plt.xlabel('Q ($\\AA^{-1}$)');\n", - "plt.ylabel('I(Q)');" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "While the noise-level seems slightly reduced, you may notice the disturbing trend that the background on our average data is starting to rise. Let's plot all 10 of these datasets atop each other to see if we can determine why. You may want to turn on interactive plotting at this point to zoom in on the data." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "plt.figure()\n", - "plt.plot(q, reduced_data1);\n", - "\n", - "plt.xlabel('Q ($\\AA^{-1}$)');\n", - "\n", - "plt.ylabel('I(Q)');" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If it's not clear what is happening yet, we can plot the average of each dataset." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "plt.figure()\n", - "plt.plot(reduced_data1.sum(axis=0))\n", - "\n", - "plt.xlabel('data index');\n", - "plt.ylabel('$\\sum$ I(Q)');" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**We see there is a slowly rising background, which is why our average was corrupted. What is happening?**\n", - "\n", - "Unfortunately, just like some of our real detectors, this simulated detector has a slowly varying background. We need to refresh our dark more frequently to account for this!\n", - "\n", - "Here, we will write a custom plan which takes advantage of our previous `dark_light_collection` plan to perform sequential dark/light measurements, with a built-in kwarg-define sleep time to let the ghost-images fade. While we're being fancy, we'll also include our data processing function, `process_data`, in the plan to take care of everything in a single step. We'll append each of those individually reduced dark/light pairs into a new list." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "#let detector cool down intially\n", - "sim_sleep(60)\n", - "\n", - "#define our new list\n", - "new_int_list = []\n", - "\n", - "#define our custom plan\n", - "def custom_plan(sample_num, sleep_time = 0, num_loops=1):\n", - " for i in range(num_loops):\n", - " print ('on loop '+str(i))\n", - " this_pair = yield from dark_light_collection(sample_num)\n", - " new_int_list.append(process_data(this_pair))\n", - " sim_sleep(sleep_time)\n", - " \n", - "#excecute the plan with the run engine\n", - "RE(custom_plan(1, sleep_time = 60, num_loops = 10))\n", - "\n", - "#turn our new intensity list into a numpy array (because I like numpy arrays more than native python lists)\n", - "new_int_list = np.array(new_int_list).T" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now compare this to the ideal data" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "plt.figure()\n", - "plt.plot(q, perfect_int1, label='ideal')\n", - "plt.plot(q, new_int_list.mean(axis=1),label='new data')\n", - "plt.plot(q, new_int_list.mean(axis=1) - perfect_int1, label='diff')\n", - "\n", - "plt.legend()\n", - "\n", - "plt.xlabel('data index');\n", - "plt.ylabel('$\\sum$ I(Q)');" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Success" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " While python and Bluesky can be a bit of a learning-curve at first, they let the beamline staff __and__ users easily develop their own data collection and reduction procedures. Here, we've just been using a greatl simplified simulated detector, but demonstrated how some of the more tedious aspects of beamline life can be streamlined with Bluesky." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 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.7.7" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/Powder Diffraction/automatic_darkframes.py b/Powder Diffraction/automatic_darkframes.py deleted file mode 100644 index 2e04aad..0000000 --- a/Powder Diffraction/automatic_darkframes.py +++ /dev/null @@ -1,28 +0,0 @@ -import bluesky.plan_stubs as bps -import bluesky_darkframes -from simulated_hardware import detector, shutter - -def dark_plan(detector): - # Restage to ensure that dark frames goes into a separate file. - yield from bps.unstage(detector) - yield from bps.stage(detector) - yield from bps.mv(shutter, 'closed') - # The `group` parameter passed to trigger MUST start with - # bluesky-darkframes-trigger. - yield from bps.trigger(detector, group='bluesky-darkframes-trigger') - yield from bps.wait('bluesky-darkframes-trigger') - snapshot = bluesky_darkframes.SnapshotDevice(detector) - yield from bps.mv(shutter, 'open') - # Restage. - yield from bps.unstage(detector) - yield from bps.stage(detector) - return snapshot - -def setup_automatic_darkframes(RE): - # Take a fresh dark frame if the last one we took *with this exposure time* - # is more than 30 seconds old. - dark_frame_preprocessor = bluesky_darkframes.DarkFramePreprocessor( - dark_plan=dark_plan, detector=detector, max_age=30, - locked_signals=[detector.exposure_time]) - RE.preprocessors.append(dark_frame_preprocessor) - return dark_frame_preprocessor diff --git a/Powder Diffraction/generate_data.py b/Powder Diffraction/generate_data.py deleted file mode 100644 index 0b59dae..0000000 --- a/Powder Diffraction/generate_data.py +++ /dev/null @@ -1,56 +0,0 @@ -import numpy as np - - -def make_random_peaks( - x, xmin=None, xmax=None, peak_chance=0.1, return_pristine_peaks=False): - - # select boundaries for peaks - if xmin is None: - xmin = np.percentile(x, 10) - if xmax is None: - xmax = np.percentile(x, 90) - - y = np.zeros(len(x)) - - # make peak positions - peak_pos = np.array(np.random.random(len(x)) < peak_chance) - peak_pos[x < xmin] = False - peak_pos[x > xmax] = False - - for peak_idex in [i for i, x in enumerate(peak_pos) if x]: - y += gaussian(x, c=x[peak_idex], sig=0.1, amp=(1 / x[peak_idex]) ** 0.5) - - # now for any diffuse low-Q component - y += gaussian(x, c=0, sig=3, amp=0.1) - - return y - - -def gaussian(x, c=0, sig=1, amp=None): - if amp is None: - return ( - 1.0 - / (np.sqrt(2.0 * np.pi) * sig) - * np.exp(-np.power((x - c) / sig, 2.0) / 2) - ) - else: - return amp * np.exp(-np.power((x - c) / sig, 2.0) / 2) - - -def generate_flat_field(shape): - num_bands = shape[0] // 20 + 1 - values = np.random.RandomState(0).random(num_bands) * 10 - # Tile values into bands. - return np.broadcast_to(np.repeat(values, 20)[: shape[0]], shape).copy() - - -def generate_image(x, intensity, shape): - """ - Given a 1D array of intensity, generate a 2D diffraction image. - """ - xL, yL = shape[0] // 2, shape[1] // 2 # half-lengths of each dimension - x_, y_ = np.mgrid[-xL:xL, -yL:yL] - ordinal_r = np.hypot(x_, y_) - unit_r = ordinal_r / ordinal_r.max() - r = unit_r * x.max() - return np.interp(r, x, intensity) diff --git a/Powder Diffraction/index.rst b/Powder Diffraction/index.rst deleted file mode 100644 index b7a3565..0000000 --- a/Powder Diffraction/index.rst +++ /dev/null @@ -1,7 +0,0 @@ -Powder Diffraction -================== - -.. toctree:: - :maxdepth: 1 - - Exposures and Dark Frames.ipynb diff --git a/Powder Diffraction/simulated_hardware.py b/Powder Diffraction/simulated_hardware.py deleted file mode 100644 index 0da9cf8..0000000 --- a/Powder Diffraction/simulated_hardware.py +++ /dev/null @@ -1,288 +0,0 @@ -import threading - -import numpy -import numpy as np -from ophyd import Component, Device, Signal, DeviceStatus -from bluesky.plan_stubs import mv - -from generate_data import make_random_peaks, generate_flat_field, generate_image - -LIMIT = 9999.0 - -big_image_mode = False #use only if running on something that isn't binder machine (otherwise slow) - -_time = {"state": 0.0} - -_history = {"sample": [], "light": [], "image": []} - -_history['decay_a'] = 1000 -_history['panel_amp'] = 50 -_history['panel_oset'] = 10 -_history['panel_wid'] = 32 -_history['noise'] = 50 -_history["panel_wl"] = 80000 -_history["panel_wl_hard"] = 100 -_history['action_time'] = 0.5 -_history['perfect_data'] = False -_history['integration_bins'] = 101 -SHAPE = (128,128) - - -if big_image_mode: - SHAPE = (512, 512) - _history['panel_wid'] = 128 - _history['integration_bins'] = 301 - _history['panel_wl_hard'] = 400 - -def sim_sleep(t): - print (f"sleeping for {t}") - time_travel(current_time()+t) - -def time_travel(t): - if t > LIMIT: - raise ValueError(f"Cannot time travel past {LIMIT}") - _time["state"] = t - - -def current_time(): - t = _time["state"] - #print("current time is", t) - return t - -class Shutter(Signal): - def put(self, value): - current_value = self.get() - if value == "open": - _history["light"].append((current_time(),)) - - if value == "closed": - (opened_time,) = _history["light"].pop() - _history["light"].append((opened_time, current_time())) - super().put(value) - - -class SampleSelector(Signal): - def put(self, value): - current_value = self.get() - if current_value != value: #check if need to change anything - if current_value: - (loaded_time,) = _history["sample"].pop() - _history["sample"].append((loaded_time, current_time())) - if value: - _history["sample"].append((current_time(),)) - _history["image"].append(patterns[value]) - #else: - # print ('already have sample number '+str(value)+' selected') - - super().put(value) - - -shutter = Shutter(name="shutter", value="closed") -sample_selector = SampleSelector(name="sample_selector", value=0) - - -patterns = {} -x = numpy.linspace(0, 30, num=_history['integration_bins']) -intensities = {} - - -for i in range(1, 5): - if big_image_mode: - intensity = make_random_peaks(x, peak_chance=0.1) * 1000.0 - else: - intensity = make_random_peaks(x, peak_chance=0.2) * 1000.0 - - image = generate_image(x, intensity, SHAPE) - intensities[i] = intensity - patterns[i] = image - - -def det_panels(shape, oset=1, wid=32, amp=2000): - det_im = np.zeros(shape) - #print ('amp '+str(amp)) - for x in range(shape[1]): - det_im[:int(shape[0]/2),x] = amp*np.mod(x,wid)**.5+oset - det_im[int(shape[0]/2):,x] = amp*np.mod(shape[1]-x,wid)**.5+oset - return det_im - -def noisy_im(shape,noise=10): - return np.random.random(shape)*noise - -class TimerStatus(DeviceStatus): - """Simulate the time it takes for a detector to acquire an image.""" - - def __init__(self, device, delay): - super().__init__(device) - self.delay = delay # for introspection purposes - threading.Timer(delay, self.set_finished).start() - - -class DiffractionDetector(Device): - # exposure_time = Component(Signal, value=1) - image = Component(Signal, value=numpy.zeros(SHAPE)) - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - def trigger(self): - # Start with a flat field. - # arr = generate_flat_field(SHAPE) - - f = make_illumination_combinations( - _history["sample"], _history["image"], _history["light"], _history["decay_a"] - ) - - arr = f(current_time()) - #arr = patterns[sample_selector.read()['sample_selector']['value']] - #self.image.set(arr) - - #add panel effect to image - varying_pan_amp = np.sin(current_time()*(2.0*np.pi/_history["panel_wl"]))+1.0 - - arr += det_panels(SHAPE, - oset=_history["panel_oset"], - wid=_history["panel_wid"], - amp=varying_pan_amp* _history["panel_amp"]) - - #add noisy effect to image - arr += noisy_im(SHAPE,noise=_history["noise"]) - - if _history["perfect_data"]: - #wipe out all other effects, just make a perfect iamge from patterns - arr = patterns[sample_selector.read()['sample_selector']['value']] - - self.image.set(arr) - READOUT_TIME = 0.17 - - #move time forward - time_travel(current_time()+_history['action_time']) - - return TimerStatus(self, READOUT_TIME) - - def collect_asset_docs(self): - yield from [] - - -detector = DiffractionDetector(name="detector") - -def make_simple_decay_func(I0, a=10, t1=2, t2=10,s=10): - def decay_func(x): - #rise = np.exp((x-t1)*s)/(1+np.exp((x-t1)*s)) * (x>=t1) * (x<=t2) - rise = 1.0*(x>=t1) * (x<=t2) - fall = np.exp(-a*(x-t2)/I0) * (x > t2) - return I0 * (rise + fall) - return decay_func - -def make_decay_func(I0, a=10, t1=2, t2=10): - def decay_func(x): - with np.errstate(divide="ignore", invalid="ignore", over="ignore"): - pre = np.nan_to_num(I0 ** 2 / a * np.exp(-(a * x / I0))) - - f1 = np.heaviside(t1 - t2, 1) * np.heaviside(x - t2, 1) - f1a = np.exp(a * t2 / I0) - np.exp(a * x / I0) - f1b = (np.exp(x * a / I0) - np.exp(a * t1 / I0)) * np.heaviside(-t1 + x, 1) - f1 *= f1a + f1b - - f2 = np.heaviside(t2 - t1, 1) * np.heaviside(x - t1, 1) - f2a = np.exp(t1 * a / I0) - np.exp(x * a / I0) - f2b = (np.exp(x * a / I0) - np.exp(t2 * a / I0)) * np.heaviside(x - t2, 1) - f2 *= f2a + f2b - - return np.nan_to_num(pre * (f1 - f2)) - - return decay_func - - -def make_illumination_combinations( - sample_history, im_history, light_history, a, tmax=LIMIT): - sample_history = sample_history.copy() - im_history = im_history.copy() - light_history = light_history.copy() - decay_func_list = [] - tmax = _time["state"] - - #check for empty lists - if len(sample_history) > 0 and len(light_history) > 0: - if len(sample_history[-1]) == 1: - sample_history[-1] = (sample_history[-1][0], tmax) - # print ('setting max time to sample_history '+str(sample_history[-1])) - - if len(light_history[-1]) == 1: - light_history[-1] = (light_history[-1][0], tmax) - - for i in range(len(sample_history)): - this_im = im_history[i] - # make a series of tuples - im_tstart = sample_history[i][0] - im_tend = sample_history[i][1] - - my_list = [] - # see if a time exists in a light_loop - for j in range(len(light_history)): - light_tstart = light_history[j][0] # light on - light_tend = light_history[j][1] # light off - - # first, check if image ends before light starts - if light_tstart > im_tend or light_tend < im_tstart: - # print ('this light does not overlap sample') - pass - else: # have some overlap - # determine start - use_start = im_tstart - if im_tstart < light_tstart: - use_start = light_tstart - use_end = im_tend - if im_tend > light_tend: - use_end = light_tend - my_list.append((use_start, use_end)) - - for k in range(len(my_list)): - #print ('making a decay func for times '+str(my_list[k][0])+' '+str(my_list[k][1])) - # make a decay func for these - decay_func_list.append( - #make_decay_func(this_im, a=a, t1=my_list[k][0], t2=my_list[k][1]) - make_simple_decay_func(this_im, a=a, t1=my_list[k][0], t2=my_list[k][1], s = 10) - ) - #print ("total length of combination list is "+str(len(my_list))) - - else: - #print ('something empty') - pass - - def f(t): - return sum(f(t) for f in decay_func_list) - - return f - - -def load_sample(i): - yield from mv(sample_selector, i) - time_travel(current_time()+_history['action_time']) - -def unload_sample(): - yield from mv(sample_selector, 0) - time_travel(current_time()+_history['action_time']) - -def light(state): - "state: True or False" - if shutter.get() == "open" and not state: - yield from mv(shutter, {True: "open", False: "closed"}[bool(state)]) - time_travel(current_time()+_history['action_time']) - - elif shutter.get() == "closed" and state: - yield from mv(shutter, {True: "open", False: "closed"}[bool(state)]) - time_travel(current_time()+_history['action_time']) - - else: - #print ('shutter already in requested state') - pass - -def history_reset(): - sample_selector.put(0) - if shutter.get() == 'open': #check if open - shutter.put('closed') #command to close shutter directly - - _history["sample"] = [] - _history["light"] = [] - _history["image"] = [] - time_travel(0) diff --git a/Powder Diffraction/static/HEX-2D-diffraction.png b/Powder Diffraction/static/HEX-2D-diffraction.png deleted file mode 100644 index 62728ae77f95800c7b4ab136fe75bcdf94a37d00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56947 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 g@Bh_a|D*lC{NKQ`%h!(n+XYhY>FVdQ&MBb@0MJ