{ "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", "https://github.com/ndvanforeest/fit_ellipse\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", " Math from \n", " https://mathworld.wolfram.com/Ellipse.html #15\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: singular matrix\")\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", "\n", " # First of all, sieve out all infinite and complex eigenvalues and come back to the Real world\n", " m = numpy.logical_and(numpy.isfinite(E), numpy.isreal(E))\n", " E, V = E[m].real, V[:, m].real\n", "\n", " # Ensures a>0, invert eigenvectors concerned\n", " V[:, V[0] < 0] = -V[:, V[0] < 0]\n", " # See https://mathworld.wolfram.com/Ellipse.html #15\n", " # Eigenvector must meet constraint (ac - b^2)>0 to be valid.\n", " A = V[0]\n", " B = V[1] / 2.0\n", " C = V[2]\n", " D = V[3] / 2.0\n", " F = V[4] / 2.0\n", " G = V[5]\n", "\n", " # Condition 1: Delta = det((a b d)(b c f)(d f g)) !=0\n", " Delta = A * (C * G - F * F) - G * B * B + D * (2 * B * F - C * D)\n", " # Condition 2: J>0\n", " J = (A * C - B * B)\n", "\n", " # Condition 3: Delta/(A+C)<0, replaces by Delta*(A+C)<0, less warnings\n", " m = numpy.logical_and(J > 0, Delta != 0)\n", " m = numpy.logical_and(m, Delta * (A + C) < 0)\n", "\n", " n = numpy.where(m)[0]\n", " if len(n) == 0:\n", " raise ValueError(\"Ellipse can't be fitted: No Eigenvalue match all 3 criteria\")\n", " else:\n", " n = n[0]\n", " a = A[n]\n", " b = B[n]\n", " c = C[n]\n", " d = D[n]\n", " f = F[n]\n", " g = G[n]\n", "# print(f\"a {a}, b {b}, c {c}, ac-b² {a*c - b*b}\")\n", "\n", " # Calculation of the center:\n", " denom = b * b - a * c\n", " x0 = (c * d - b * f) / denom\n", " y0 = (a * f - b * d) / denom\n", "\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", "# print(f\"up {up}, down1 {down1}, down2 {down2}\")\n", " a2 = up / down1\n", " b2 = up / down2\n", " if a2 <= 0 or b2 <= 0:\n", " raise ValueError(\"Ellipse can't be fitted, negative sqrt\")\n", "\n", " res1 = sqrt(a2)\n", " res2 = sqrt(b2)\n", "\n", " if a == c:\n", " angle = 0 # we have a circle\n", " elif res2 > res1:\n", " res1, res2 = res2, res1\n", " angle = 0.5 * (pi + atan2(2 * b, (a - c)))\n", " else:\n", " angle = 0.5 * (pi + atan2(2 * b, (a - c)))\n", " return Ellipse(y0, x0, angle, res1, res2)\n", "\n" ] } ], "source": [ "import sys\n", "sys.path.insert(0,\"/home/jerome/workspace-ssd/pyFAI/build/lib.linux-x86_64-3.9/\")\n", "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.3541199392478749, center_2=2.185507522307149, angle=2.9807976434722416, half_long_axis=1.293119256631015, half_short_axis=0.6228734407617278)\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+0) * 10 + 0\n", "ptx = cos(angles+0) * 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": "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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: singular matrix\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": "venv-py3.8", "language": "python", "name": "venv-py3.8" }, "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.8.0" } }, "nbformat": 4, "nbformat_minor": 2 }