{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Extracting ellipse parmeters from rings\n", "\n", "During a powder diffraction experiment, the scattering occures along cconcentric cones, originating from the sample position and named after 2 famous scientists: Debye and Scherrer. \n", "\n", "![Debye-Scherrer rings](Debye-Scherrer_rings.png)\n", "\n", "Those cones are intersected by the detector and all the calibration step in pyFAI comes down is fitting the \"ring\" seen on the detector into a meaningful experimental geometry.\n", "\n", "In the most common case, a flat detector is mounted orthogonal to the incident beam and all pixel have the same size. \n", "The diffraction patern is then a set of concentric cercles.\n", "When the detector is still flat and all the pixels are the same but the mounting may be a bit *off*, or maybe for other technical reason one gets a set of concentric ellipses. \n", "This procedures explains how to extract the center coordinates, axis lengths and orientation. \n", "\n", "The code in pyFAI is heavily inspired from:\n", "http://nicky.vanforeest.com/misc/fitEllipse/fitEllipse.html\n", "It uses a SVD decomposition in a similar way to the Wolfgang Kabsch's algorithm (1976) to retrieve the best ellipse fitting all point without actually performing a fit.\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "def fit_ellipse(pty, ptx, _allow_delta=True):\n", " \"\"\"Fit an ellipse\n", "\n", " inspired from\n", " http://nicky.vanforeest.com/misc/fitEllipse/fitEllipse.html\n", "\n", " :param pty: point coordinates in the slow dimension (y)\n", " :param ptx: point coordinates in the fast dimension (x)\n", " :raise ValueError: If the ellipse can't be fitted\n", " \"\"\"\n", " x = ptx[:, numpy.newaxis]\n", " y = pty[:, numpy.newaxis]\n", " D = numpy.hstack((x * x, x * y, y * y, x, y, numpy.ones_like(x)))\n", " S = numpy.dot(D.T, D)\n", " try:\n", " inv = numpy.linalg.inv(S)\n", " except numpy.linalg.LinAlgError:\n", " if not _allow_delta:\n", " raise ValueError(\"Ellipse can't be fitted\")\n", " # Try to do the same with a delta\n", " delta = 100\n", " ellipse = fit_ellipse(pty + delta, ptx + delta, _allow_delta=False)\n", " y0, x0, angle, wlong, wshort = ellipse\n", " return Ellipse(y0 - delta, x0 - delta, angle, wlong, wshort)\n", "\n", " C = numpy.zeros([6, 6])\n", " C[0, 2] = C[2, 0] = 2\n", " C[1, 1] = -1\n", " E, V = numpy.linalg.eig(numpy.dot(inv, C))\n", " m = numpy.logical_and(numpy.isfinite(E), numpy.isreal(E))\n", " E, V = E[m], V[:, m]\n", " n = numpy.argmax(E) if E.max() > 0 else numpy.argmin(E)\n", " res = V[:, n]\n", " b, c, d, f, g, a = res[1] / 2, res[2], res[3] / 2, res[4] / 2, res[5], res[0]\n", " num = b * b - a * c\n", " x0 = (c * d - b * f) / num\n", " y0 = (a * f - b * d) / num\n", " if b == 0:\n", " if a > c:\n", " angle = 0\n", " else:\n", " angle = pi / 2\n", " else:\n", " if a > c:\n", " angle = atan2(2 * b, (a - c)) / 2\n", " else:\n", " angle = numpy.pi / 2 + atan2(2 * b, (a - c)) / 2\n", " up = 2 * (a * f * f + c * d * d + g * b * b - 2 * b * d * f - a * c * g)\n", " down1 = (b * b - a * c) * ((c - a) * sqrt(1 + 4 * b * b / ((a - c) * (a - c))) - (c + a))\n", " down2 = (b * b - a * c) * ((a - c) * sqrt(1 + 4 * b * b / ((a - c) * (a - c))) - (c + a))\n", "\n", " a2 = up / down1\n", " b2 = up / down2\n", " if a2 < 0 or b2 < 0:\n", " raise ValueError(\"Ellipse can't be fitted\")\n", "\n", " res1 = numpy.sqrt(a2)\n", " res2 = numpy.sqrt(b2)\n", " return Ellipse(y0, x0, angle, max(res1, res2), min(res1, res2))\n", "\n" ] } ], "source": [ "from matplotlib import pyplot\n", "from pyFAI.utils.ellipse import fit_ellipse\n", "import inspect\n", "print(inspect.getsource(fit_ellipse))" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "from matplotlib import patches\n", "from numpy import rad2deg\n", "\n", "def display(ptx, pty, ellipse=None):\n", " \"\"\"A function to overlay a set of points and the calculated ellipse\n", " \"\"\"\n", " fig = pyplot.figure()\n", " ax = fig.add_subplot(111)\n", " if ellipse is not None:\n", " error = False\n", " y0, x0, angle, wlong, wshort = ellipse\n", " if wshort == 0:\n", " error = True\n", " wshort = 0.0001\n", " if wlong == 0:\n", " error = True\n", " wlong = 0.0001\n", " patch = patches.Arc((x0, y0), width=wlong*2, height=wshort*2, angle=rad2deg(angle))\n", " if error:\n", " patch.set_color(\"red\")\n", " else:\n", " patch.set_color(\"green\")\n", " ax.add_patch(patch)\n", "\n", " bbox = patch.get_window_extent()\n", " ylim = min(y0 - wlong, pty.min()), max(y0 + wlong, pty.max())\n", " xlim = min(x0 - wlong, ptx.min()), max(x0 - wlong, ptx.max())\n", " else:\n", " ylim = pty.min(), pty.max()\n", " xlim = ptx.min(), ptx.max()\n", " ax.plot(ptx, pty, \"ro\", color=\"blue\")\n", " ax.set_xlim(*xlim)\n", " ax.set_ylim(*ylim)\n", " pyplot.show()" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Ellipse(center_1=1.37812524025027, center_2=2.1702755528814146, angle=-0.1246970791733077, half_long_axis=1.289027842116212, half_short_axis=0.6066722714141386)\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from numpy import sin, cos, random, pi, linspace\n", "arc = 0.8\n", "npt = 100\n", "R = linspace(0, arc * pi, npt)\n", "ptx = 1.5 * cos(R) + 2 + random.normal(scale=0.05, size=npt)\n", "pty = sin(R) + 1. + random.normal(scale=0.05, size=npt)\n", "\n", "ellipse = fit_ellipse(pty, ptx)\n", "print(ellipse)\n", "display(ptx, pty, ellipse)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Ellipse(center_1=10.000000000332909, center_2=10.000000000325038, angle=2.3689992424085746, half_long_axis=19.999999999804693, half_short_axis=19.999999999532037)\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "angles = linspace(0, pi / 2, 10)\n", "pty = sin(angles) * 20 + 10\n", "ptx = cos(angles) * 20 + 10\n", "ellipse = fit_ellipse(pty, ptx)\n", "print(ellipse)\n", "display(ptx, pty, ellipse)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Ellipse(center_1=50.000000000000576, center_2=100.0000000000018, angle=3.141592653589068, half_long_axis=19.999999999994646, half_short_axis=10.000000000002697)\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "angles = linspace(0, pi * 2, 6, endpoint=False)\n", "pty = sin(angles) * 10 + 50\n", "ptx = cos(angles) * 20 + 100\n", "ellipse = fit_ellipse(pty, ptx)\n", "print(ellipse)\n", "display(ptx, pty, ellipse)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Ellipse(center_1=-5.030642569181509e-12, center_2=-8.540723683836404e-12, angle=1.6532775148903056e-11, half_long_axis=19.999999999815742, half_short_axis=10.00000000009243)\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Center to zero\n", "angles = linspace(0, 2*pi, 9, endpoint=False)\n", "pty = sin(angles) * 10 + 0\n", "ptx = cos(angles) * 20 + 0\n", "ellipse = fit_ellipse(pty, ptx)\n", "print(ellipse)\n", "display(ptx, pty, ellipse)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Ellipse(center_1=50.00000000000121, center_2=100.00000000000088, angle=0.5535743588955828, half_long_axis=18.09016994372895, half_short_axis=6.909830056258535)\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAD8CAYAAABn919SAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzt3XlcVXX+x/HXR8UFU1FxXwCXJLXEpETL3E3NUkutGTWzGrJlsqYpK2dax5apfmozFTlOZoqDRrm0QJviUmqhIuKWpoAiIIqgbILw/f1xr4aKckHgwOHzfDzu417OPefez5eLb7/3e875HjHGoJRSquqrYXUBSimlyoYGulJK2YQGulJK2YQGulJK2YQGulJK2YQGulJK2YQGulJK2YQGulJK2YQGulJK2UStinwzT09P4+3tXZFvqZRSVd6WLVuOGWOaFbdehQa6t7c3kZGRFfmWSilV5YlInCvr6ZCLUkrZhAa6UkrZhAa6UkrZhAa6UkrZhAa6UkrZhAa6UkrZhAa6UkrZhAa6UkrZhAa6UkrZhAa6UkrZhAa6UkrZhAa6UkrZhAa6UkrZhEuBLiIeIhIqIntEZLeI9BGRl0QkQUSinLeR5V2sUkqpS3N1+ty5QLgxZpyI1AbcgVuB2caYt8utOqWUUi4rNtBFpBFwC3AfgDEmF8gVkfKtTCmlVIm4MuTiA6QAC0Rkm4jMF5H6zuceE5FoEflIRBqXX5lKKaWK40qg1wKuBz4wxvQEMoFngQ+AjoAfkAi8U9TGIhIoIpEiEpmSklI2VSullLqIK4F+GDhsjNns/DkUuN4Yk2yMyTfGFAD/AW4samNjzDxjjL8xxr9Zs2IviaeUUqqUig10Y0wScEhEujgXDQZ2iUirQquNBWLKoT6llFIucvUolz8Dwc4jXA4AU4F3RcQPMEAs8FC5VKiUUsolLgW6MSYK8L9g8eSyL0cppVRp6ZmiSillExroSillExroSillExroSillExroSillExroSillExroSillExroSillExroSillExroSillExroSillExroSillExroSillExroSillExroSillExroSillExroSillE65egk4ppSqN02dOk5qdSmp2Ksezj597nJ2XTV5BHnn5eeTm5172cQ2pgbubO/Xd6jvua9c/7+ezyxrW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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "angles = linspace(0, 2 * pi, 9, endpoint=False)\n", "pty = 50 + 10 * cos(angles) + 5 * sin(angles)\n", "ptx = 100 + 5 * cos(angles) + 15 * sin(angles)\n", "ellipse = fit_ellipse(pty, ptx)\n", "print(ellipse)\n", "display(ptx, pty, ellipse)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Points from real peaking\n", "from numpy import array\n", "pty = array([0.06599215, 0.06105629, 0.06963708, 0.06900191, 0.06496001, 0.06352082, 0.05923421, 0.07080027, 0.07276284, 0.07170048])\n", "ptx = array([0.05836343, 0.05866434, 0.05883284, 0.05872581, 0.05823667, 0.05839846, 0.0591999, 0.05907079, 0.05945377, 0.05909428])\n", "try:\n", " ellipse = fit_ellipse(pty, ptx)\n", "except Exception as e:\n", " ellipse = None\n", " print(e)\n", "display(ptx, pty, ellipse)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Ellipse can't be fitted\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Line\n", "from numpy import arange\n", "pty = arange(10)\n", "ptx = arange(10)\n", "try:\n", " ellipse = fit_ellipse(pty, ptx)\n", "except Exception as e:\n", " ellipse = None\n", " print(e)\n", "display(ptx, pty, ellipse)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Conclusion\n", "Within pyFAI's calibration process, the parameters of the ellipse are used in first instance as input guess for starting the fit procedure, which uses *slsqp* from scipy.optimize." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3.7 local venv", "language": "python", "name": "python3.7" }, "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.2" } }, "nbformat": 4, "nbformat_minor": 2 }