{ "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\n", "#For documentation purpose, `inline` is used to enforce the storage of the image in the notebook\n", "%matplotlib widget" ] }, { "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], dtype=numpy.float64)\n", " C[0, 2] = C[2, 0] = 2.0\n", " C[1, 1] = -1.0\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", "\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", " 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", "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.342218248453694, center_2=2.1627393910083916, angle=3.004563840417115, half_long_axis=1.2995895403025433, half_short_axis=0.641761939108477)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ ":31: UserWarning: color is redundantly defined by the 'color' keyword argument and the fmt string \"ro\" (-> color='r'). The keyword argument will take precedence.\n", " ax.plot(ptx, pty, \"ro\", color=\"blue\")\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "1e88f322b37b4ad9aa3e3569bb02b1bc", "version_major": 2, "version_minor": 0 }, "image/png": "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", "text/html": [ "\n", "
\n", "
\n", " Figure\n", "
\n", " \n", "
\n", " " ], "text/plain": [ "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" ] }, "metadata": {}, "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": {}, "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" ] }, { "name": "stderr", "output_type": "stream", "text": [ ":31: UserWarning: color is redundantly defined by the 'color' keyword argument and the fmt string \"ro\" (-> color='r'). The keyword argument will take precedence.\n", " ax.plot(ptx, pty, \"ro\", color=\"blue\")\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "7e00732c87304d3ca451aec507f7a9df", "version_major": 2, "version_minor": 0 }, "image/png": "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", "text/html": [ "\n", "
\n", "
\n", " Figure\n", "
\n", " \n", "
\n", " " ], "text/plain": [ "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" ] }, "metadata": {}, "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" ] }, { "name": "stderr", "output_type": "stream", "text": [ ":31: UserWarning: color is redundantly defined by the 'color' keyword argument and the fmt string \"ro\" (-> color='r'). The keyword argument will take precedence.\n", " ax.plot(ptx, pty, \"ro\", color=\"blue\")\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "fcb602bbb194475890e06af07d1e078e", "version_major": 2, "version_minor": 0 }, "image/png": "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", "text/html": [ "\n", "
\n", "
\n", " Figure\n", "
\n", " \n", "
\n", " " ], "text/plain": [ "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" ] }, "metadata": {}, "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" ] }, { "name": "stderr", "output_type": "stream", "text": [ ":31: UserWarning: color is redundantly defined by the 'color' keyword argument and the fmt string \"ro\" (-> color='r'). The keyword argument will take precedence.\n", " ax.plot(ptx, pty, \"ro\", color=\"blue\")\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "62800cda1a6949d295403eafe7a7465c", "version_major": 2, "version_minor": 0 }, "image/png": "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", "text/html": [ "\n", "
\n", "
\n", " Figure\n", "
\n", " \n", "
\n", " " ], "text/plain": [ "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" ] }, "metadata": {}, "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" ] }, { "name": "stderr", "output_type": "stream", "text": [ ":31: UserWarning: color is redundantly defined by the 'color' keyword argument and the fmt string \"ro\" (-> color='r'). The keyword argument will take precedence.\n", " ax.plot(ptx, pty, \"ro\", color=\"blue\")\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "568ec325c49e42da8a1a185b694b1f42", "version_major": 2, "version_minor": 0 }, "image/png": "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", "text/html": [ "\n", "
\n", "
\n", " Figure\n", "
\n", " \n", "
\n", " " ], "text/plain": [ "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" ] }, "metadata": {}, "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": [ { "name": "stderr", "output_type": "stream", "text": [ ":31: UserWarning: color is redundantly defined by the 'color' keyword argument and the fmt string \"ro\" (-> color='r'). The keyword argument will take precedence.\n", " ax.plot(ptx, pty, \"ro\", color=\"blue\")\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "717a6139e3244ff7ad2753f03dee030e", "version_major": 2, "version_minor": 0 }, "image/png": "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", "text/html": [ "\n", "
\n", "
\n", " Figure\n", "
\n", " \n", "
\n", " " ], "text/plain": [ "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" ] }, "metadata": {}, "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" ] }, { "name": "stderr", "output_type": "stream", "text": [ ":31: UserWarning: color is redundantly defined by the 'color' keyword argument and the fmt string \"ro\" (-> color='r'). The keyword argument will take precedence.\n", " ax.plot(ptx, pty, \"ro\", color=\"blue\")\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "1629b1d8c793406ab4e93214e5d87655", "version_major": 2, "version_minor": 0 }, "image/png": "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", "text/html": [ "\n", "
\n", "
\n", " Figure\n", "
\n", " \n", "
\n", " " ], "text/plain": [ "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" ] }, "metadata": {}, "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", "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.5" } }, "nbformat": 4, "nbformat_minor": 4 }