{ "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], 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.3686563886665153, center_2=2.1900508822775953, angle=2.9705119126896884, half_long_axis=1.2923052742597478, half_short_axis=0.6154578287232199)\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.000000000021668, center_2=10.00000000001636, angle=2.501627558643098, half_long_axis=19.99999999998908, half_short_axis=19.999999999972612)\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=49.99999999999963, center_2=100.00000000000023, angle=3.204103649068202e-13, half_long_axis=19.99999999998351, half_short_axis=10.000000000008267)\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=-9.276530161312418e-16, center_2=-1.32634644008552e-15, angle=3.141592653589793, half_long_axis=19.999999999999996, half_short_axis=9.999999999999998)\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.00000000000087, center_2=100.00000000000139, angle=0.5535743588957454, half_long_axis=18.090169943676262, half_short_axis=6.909830056278465)\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": "iVBORw0KGgoAAAANSUhEUgAAAYAAAAD4CAYAAADlwTGnAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAhlklEQVR4nO3de3hU1b3/8fc3CYhBIVaCIBBQRCytcosUbbVVvIC2UK8F00dOOU8jVOyv9iZtTq3nZ+mx2t/pqed4wHihYlMtop7iKQKK1V4UJUhEEdGAXKIgoRIpRAgk398fs9MOw4RMyEx2Zubzep55Zu+11t77u5gw39m3tc3dERGR7JMTdgAiIhIOJQARkSylBCAikqWUAEREspQSgIhIlsoLO4C26NWrlw8aNCjsMERE0sqqVat2unthbHlaJYBBgwZRWVkZdhgiImnFzDbHK9chIBGRLKUEICKSpZQARESylBKAiEiWUgIQEclSSgAiIllKCUBEJEspAYiIZKiKCojcOzt6dLz6tLoRTEREElNRAaWlUF/fchvtAYiIZKCysiN/+YMSgIhIRtqypfU2SgAiIhmoqKj1NkoAIiIZaPZsyM8/chslABGRDFRSAt+/o5qcgq0ttlECEBHJQE+ue5L/2ncOv3v5NWDVqnhtdBmoiEiG+Y8V/8FdL97FkpIljD457i0AgBKAiEjGaGxq5NtLv82z7z7Li9NeZGDBwCO2VwIQEckAexv2UvJECbv37+Yv0/5CQbeCVpdJ6ByAmY03s/VmVm1ms+LUm5ndHdSvMbNRQflQM6uKeu02s28FdXeZ2VtB+yfNrPVoRUTkMLs+3sWF8y+kxzE9WPLVJQl9+UMCCcDMcoF7gAnAMGCKmQ2LaTYBGBK8SoE5AO6+3t1HuPsIYDRQDzwZLPMM8Gl3Pwt4G/hBQhGLiMjf7d6/m/EV4zm3/7k89OWH6JrbNeFlE9kDGANUu/tGd28AHgUmxbSZBMz3iBVAgZn1jWkzDtjg7psB3H2Zux8M6lYA/ROOWkRE2NOwhwkVEyjuW8y/X/rvmFmblk8kAfQDoi8krQnK2tpmMvBIC9uYBjwdr8LMSs2s0swqa2trEwhXRCTz1R+o54u/+SLDeg3jPy/7zzZ/+UNiCSDeWr0tbcysKzAReOywlZuVAQeBingbd/dydy929+LCwsIEwhURyWwfH/iYSY9OYmDBQO790r3k2NHd0pXIUjXAgKj5/sD7bWwzAXjV3T+IXsjMpgJfBErcPTapiIhkpeZx/HNyIu8VUT+P9x/cz5ULrqQwv5AHJz541F/+kFgCWAkMMbNTgl/yk4FFMW0WAdcHVwONBT5y921R9VOIOfxjZuOBW4CJ7t7KoKUiItmheRz/zZvBPfJeWhopb2hs4JrHrqF7l+7Mv2I+uTm57dpWq/cBuPtBM5sJLAVygQfdfa2ZTQ/q5wKLgcuAaiJX+nyteXkzywcuBm6IWfV/AccAzwTHrla4+/R29UZEJM3FG8e/vh5++ENnWfev4zi/ueo35OW0/zYuS6cjL8XFxV5ZWRl2GCIiKZOTE/nlfxhziu8dwwv/9AL5XVoZ5jN2UbNV7l582LaONkgREUm+lsbxzy14j6emPNXmL/8jUQIQEelE4o7j36We2bOdPsf1Seq2lABERDqRkhIoL4eBA8HMySnYyvf+7W1umTGg9YXbSAlARKSTKSmBN9+pZ8Sc0fzs97/lzu+MSMl2lABERDoZd2fa76bxqd6f4jvnfCdl29Fw0CIinczPX/w5G3Zt4I//9MejGuIhUUoAIiKdyCvvvcJdL95FZWklx3Y5NqXb0iEgEZFOYvf+3Ux5fAr/ffl/U9SzhetBk0gJQESkk7hx8Y2MO2UcVw+7ukO2p0NAIiKdwMOvPUzl+5VUfr3jRjvQHoCISMiqP6zm28u+zaNXPcr/PNa9xZFAk017ACIiIWpobOC6x6/jR+f/iDeWD6e09B+DwTWPBAqRewOSTXsAIiIhuvUPt9K7e29uGnNTiyOBlpWlZtvaAxARCckf3v0DD695mKobqjAztmyJ366l8vbSHoCISAj2HdxH6f+WMufyORR2jzzutqWRQFsqby8lABGREMz+42zOOuksJg6d+I+yOCOB5udHylNBh4BERDrYm7VvMnfVXKpuqDqkvPlEb1lZ5LBPUVHkyz8VJ4BBCUBEpEM1eROlT5Vy2+dvo1+PfofVl5Sk7gs/lg4BiYh0oPtfvZ+DTQeZXhz+I9C1ByAi0kG279lO2XNlLL9+Obk5uWGHoz0AEZGOcvPSm/nnkf/MWSedFXYogPYAREQ6xJLqJbzy3is8MPGBsEP5u4T2AMxsvJmtN7NqM5sVp97M7O6gfo2ZjQrKh5pZVdRrt5l9K6j7hJk9Y2bvBO8nJLVnIiKdRENjAzMXz+Sey+4hv0vsE9/D02oCMLNc4B5gAjAMmGJmw2KaTQCGBK9SYA6Au6939xHuPgIYDdQDTwbLzAKWu/sQYHkwLyKSce6tvJchJw5h/Gnjww7lEInsAYwBqt19o7s3AI8Ck2LaTALme8QKoMDM+sa0GQdscPfNUcs8FEw/BHz5aDogItKZ7d6/m5/86Sf87KKfhR3KYRJJAP2ArVHzNUFZW9tMBh6Jmj/J3bcBBO+9423czErNrNLMKmtraxMIV0Sk87jzL3cy4bQJnebEb7REEkC8JxJ7W9qYWVdgIvBY4qEFK3Evd/didy8uLCxs6+IiIqF5b/d7zKmcw+0X3B52KHElkgBqgAFR8/2B99vYZgLwqrt/EFX2QfNhouB9R6JBi4ikg9uev41zd93DecMHdMgDXtoqkQSwEhhiZqcEv+QnA4ti2iwCrg+uBhoLfNR8eCcwhUMP/zQvMzWYngr8rs3Ri4h0Umt3rOW3j+Sy/O6vsHkzuP/jAS+dJQm0mgDc/SAwE1gKrAMWuPtaM5tuZs33Mi8GNgLVwH3AN5qXN7N84GLgiZhV3wFcbGbvBPV3tLMvIiKdxqzls8j7w518XH/oEfJUPuClrRK6EczdFxP5ko8umxs17cCNLSxbD5wYp/yvRK4MEhHJKC9seoE3drxB3Y7j49an6gEvbaWhIEREksjdmbV8FrMvnE1RUbzrY1L3gJe2UgIQEUmi5e8up25fHZM/PbnDH/DSVkoAIiJJNPtPs/nh535IjuVQUgLl5TBwIJhF3svLO268/9ZoMDgRkST585Y/s7luM1POnPL3so58wEtbaQ9ARCRJZv9pNrM+N4u8nPT4ba0EICKSBKu3reb1D15n6vCprTfuJJQARESS4K4X7+L83XMZetoxnfKu33jSYz9FRKQT21S3iUWPHUfTU5fzcX2krPmuX9A5ABGRjPWLl35B7h9+1qnv+o1HCUBEpB0+/PhDHl7zMH+rLYhb31nu+o1HCUBEpB3uf/V+vjT0S53+rt94lABERI5SkzdRvqqcGcUzOv1dv/EoAYiIHKXn3n2O7l2785l+n+n0d/3Go6uARESO0r2r7uWG0TdgFjn805nv+o1HewAiIkdh+57tPLPhGUrOTKNv/BhKACIiR2He6nlc9cmr6NmtZ9ihHDUlABGRNmryJu579T5uKL4h7FDaRQlARKSNnt34LD279eTsk88OO5R2UQIQEWmj2JO/6UoJQESkDbb9bRvPvfsc1515XdihtJsSgIhIG1S8XsGVZ1xJj2N6hB1KuyWUAMxsvJmtN7NqM5sVp97M7O6gfo2ZjYqqKzCzhWb2lpmtM7NzgvIRZrbCzKrMrNLMxiSvWyIiqfHbtb895Ilf6azVBGBmucA9wARgGDDFzIbFNJsADAlepcCcqLpfAkvc/QxgOLAuKL8T+Fd3HwHcGsyLiHRaG3dtZHPdZr4w6Athh5IUiewBjAGq3X2juzcAjwKTYtpMAuZ7xAqgwMz6mlkP4HzgAQB3b3D3umAZB5r3oXoC77evKyIiqbVg7QKu+uRVafPIx9YkkgD6AVuj5muCskTanArUAvPMbLWZ3W9m3YM23wLuMrOtwM+BH8TbuJmVBoeIKmtraxMIV0QkNRasXcBXPv2VsMNImkQSQLzrnDzBNnnAKGCOu48E9gLN5xBmADe7+wDgZoK9hMNW4l7u7sXuXlxYWJhAuCIiyffOX99h255tnFd0XtihJE0iCaAGGBA135/DD9e01KYGqHH3l4PyhUQSAsBU4Ilg+jEih5pERDqlBWsXcPUnryY3JzfsUJImkQSwEhhiZqeYWVdgMrAops0i4PrgaqCxwEfuvs3dtwNbzWxo0G4c8GYw/T7w+WD6QuCd9nRERCSVFry5gGs/dW3YYSRVq2cy3P2gmc0ElgK5wIPuvtbMpgf1c4HFwGVANVAPfC1qFTcBFUHy2BhV93Xgl2aWB+wjcvWQiEin89bOt9hZv5PPFn027FCSKqFT2e6+mMiXfHTZ3KhpB25sYdkqoDhO+Z+B0W2IVUQkFAvWLuCaYdeQY5l172xm9UZEJAUWvrkw4w7/gBKAiMgR1eyu4b2/vcdn+n0m7FCSTglAROQIlm1YxkWnXpRRV/80UwIQETmCZRuWcengS8MOIyWUAEREWtDY1MizG5/lksGXhB1KSigBiIi04NVtr3LScSfRv0f/sENJCSUAEZEWLN2wlEtOzcxf/6AEICLSoqUblnLpaZl5/B+UAERE4tq9fzdV26s4f+D5YYeSMkoAIiJxPPfuc4ztP5b8Lvlhh5IySgAiInFk8uWfzZQARETi+OPmP3LBoAvCDiOllABERGLU7atj80ebGd5neNihpJQSgIhIjBU1Kyg+uThjnv3bEiUAEZEYL259kXP7nxt2GCmnBCAiEuOlmpc4d4ASgIhIVmnyJl557xU+0z/zhn+OpQQgIhLl7b++zYnHnkiv/F5hh5JySgAiIlFWvreSs/udHXYYHUIJQEQkysr3V3L2yUoAIiJZp/L9SiUAEZFs09jUyGsfvMbIviPDDqVDJJQAzGy8ma03s2ozmxWn3szs7qB+jZmNiqorMLOFZvaWma0zs3Oi6m4K1rvWzO5MTpdERNqmogIGDYIueTns//l6nlrYI+yQOkSrt7mZWS5wD3AxUAOsNLNF7v5mVLMJwJDg9RlgTvAO8EtgibtfbWZdgfxgvRcAk4Cz3H2/mfVOUp9ERBJWUQGlpVBfD2A07upPaWmkrqQkzMhSL5E9gDFAtbtvdPcG4FEiX9zRJgHzPWIFUGBmfc2sB3A+8ACAuze4e12wzAzgDnffH9TtaH93RETapqys+cv/H+rrI+WZLpEE0A/YGjVfE5Ql0uZUoBaYZ2arzex+M+setDkdOM/MXjazF8ws7lkXMys1s0ozq6ytrU0gXBGRxG3Z0rbyTJJIArA4ZZ5gmzxgFDDH3UcCe4Hmcwh5wAnAWOB7wAIzO2w97l7u7sXuXlxYWJhAuCIiiSsqalt5JkkkAdQAA6Lm+wPvJ9imBqhx95eD8oVEEkLzMk8Eh41eAZqAzL/1TkQ6ldmzIT/moV/5+ZHyTJdIAlgJDDGzU4KTuJOBRTFtFgHXB1cDjQU+cvdt7r4d2GpmQ4N244Dmk8f/A1wIYGanA12Bne3qjYhIG5WUQHk59B/QCDRRVOSUl2f+CWBI4Cogdz9oZjOBpUAu8KC7rzWz6UH9XGAxcBlQDdQDX4taxU1ARZA8NkbVPQg8aGZvAA3AVHePPbQkIpJyJSUw+PMrmbl4JpWllWGH02ESetqBuy8m8iUfXTY3atqBG1tYtgoojlPeAHy1DbGKiKTMWzvf4oxeZ4QdRofSncAiIsD6neuVAEREstGW3VsY2HNg2GF0KCUAERFg+57t9D2+b9hhdCglABERggRwnBKAiEjW2b5nO32O6xN2GB1KCUBEst7+g/vZ07CHE449IexQOpQSgIhkvR17d9C7e29yLLu+ErOrtyKStZrH/M/JibxXVPyjLhsP/0CCN4KJiKSzQ8f8h82bOWTM/2xNANoDEJGM19qY/9v2bKNPdyUAEZGM09qY/9oDEBHJUK2N+b+zficn5p/YcQF1EkoAIpLxWhvzf9/BfRybd2zHBxYyJQARyXjNY/4PHAhmkffoMf/3HdxHt7xu4QYZAl0FJCJZoaSk5Ye8ZGsC0B6AiGS9/Y37lQBERLKR9gBERLLUvoP7OCbvmLDD6HBKACKS9fYf1CEgEZGspENAIiJZSgngCMxsvJmtN7NqM5sVp97M7O6gfo2ZjYqqKzCzhWb2lpmtM7NzYpb9rpm5mfVqf3dERNruQNMB8nKy76r4VhOAmeUC9wATgGHAFDMbFtNsAjAkeJUCc6LqfgkscfczgOHAuqh1DwAuBloYqUNEJPW65HThQOOBsMPocInsAYwBqt19o7s3AI8Ck2LaTALme8QKoMDM+ppZD+B84AEAd29w97qo5X4BfB/wdvZDROSoHZN3DPsb94cdRodLJAH0A7ZGzdcEZYm0ORWoBeaZ2Wozu9/MugOY2UTgPXd/7UgbN7NSM6s0s8ra2toEwhURaZuuuV1paGwIO4wOl0gCsDhlsb/YW2qTB4wC5rj7SGAvMMvM8oEy4NbWNu7u5e5e7O7FhYWFCYQrItI2x+Qew/6D2gOIpwYYEDXfH3g/wTY1QI27vxyULySSEAYDpwCvmdmmoP2rZpZ9A3KLSOi65XVj38F9YYfR4RJJACuBIWZ2ipl1BSYDi2LaLAKuD64GGgt85O7b3H07sNXMhgbtxgFvuvvr7t7b3Qe5+yAiiWJU0F5EpEMd1/U49jTsCTuMDtfqdU/uftDMZgJLgVzgQXdfa2bTg/q5wGLgMqAaqAe+FrWKm4CKIHlsjKkTEQnd8cccrwTQEndfTORLPrpsbtS0Aze2sGwVUNzK+gclEoeISCoc1+U4li86iR9Nijwmsqgo8rCYloaPzhTZd+eDiEiMrX8+j2X/cQEHgvPAmzdDaWlkOpOTgIaCEJGs95dfXc6B/V0OKauvh7KykALqIEoAIpL16nb0iFu+JcPHKFACEJGs17tv/EtAi4o6OJAOpgQgIlnv+7fWYV3qDynLz4+cCM5kSgAikvVmTOtJzqQZFBU5ZjBwIJSXZ/YJYNBVQCIi5HfJp+Ds31P5q50Uds+eIWe0ByAiAvTv0Z+tu7e23jCDKAGIiBBJADW7a8IOo0MpAYiIoAQgIpK1inoW8e6ud8MOo0MpAYiIAGf2PpM1O9aEHUaHUgIQEQFG9h3J6m2riYxtmR2UAEREgH7H98Nx3v9b7POuMpcSgIgIYGaM7DOS1dtXhx1Kh1ECEBEJjOwTOQyULZQAREQCI/qMoOqDqrDD6DBKACIigeYTwdlCCUBEJDDkE0PYsXcHdfvqwg6lQygBiIgEcnNyGX3yaF7a+lLYoXQIJQARkSiXDr6UpRuWhh1Gh1ACEBGJMv608SypXhJ2GB0ioQRgZuPNbL2ZVZvZrDj1ZmZ3B/VrzGxUVF2BmS00s7fMbJ2ZnROU3xWUrTGzJ82sIGm9EhE5SiP6jGDXvl1ZMS5QqwnAzHKBe4AJwDBgipkNi2k2ARgSvEqBOVF1vwSWuPsZwHBgXVD+DPBpdz8LeBv4QTv6ISKSFDmWkzWHgRLZAxgDVLv7RndvAB4FJsW0mQTM94gVQIGZ9TWzHsD5wAMA7t7g7nXB9DJ3PxgsvwLo3/7uiIi03/jTxvN09dNhh5FyiSSAfkD0Y3JqgrJE2pwK1ALzzGy1md1vZt3jbGMaEPdf28xKzazSzCpra2sTCFdEpH0uGXwJz296nobGhrBDSalEEoDFKYsdLq+lNnnAKGCOu48E9gKHnEMwszLgIFARb+PuXu7uxe5eXFiYPc/qFJHw9MrvxRm9zuAvW/4SdigplUgCqAEGRM33B2KHy2upTQ1Q4+4vB+ULiSQEAMxsKvBFoMSzaQxWEen0LjvtMhatXxR2GCmVSAJYCQwxs1PMrCswGYj9V1kEXB9cDTQW+Mjdt7n7dmCrmQ0N2o0D3oTIlUXALcBEd69PRmdERJLlujOv45E3HuFA44GwQ0mZVhNAcKJ2JrCUyBU8C9x9rZlNN7PpQbPFwEagGrgP+EbUKm4CKsxsDTAC+GlQ/l/A8cAzZlZlZnOT0B8RkaQYcuIQTj3hVJZtWBZ2KClj6XTkpbi42CsrK8MOQ0SyxL2V97L83eUsuGZB2KG0i5mtcvfi2HLdCSwi0oKvfPorLNuwjNq9mXkFohKAiEgLCroVcMUnr2Be1bywQ0kJJQARkSOYUTyDe1fdS5M3hR1K0ikBiIgcwdknn01BtwKWVmfe0BBKACIiR2BmfHvst/nJn35COl00kwglABGRVkz+9GTq9tXFHR+oogIGDYKcnMh7RdwxDTonJQARkVbk5uRy+wW3U/Zc2SHnAioqoLQUNm8G98h7aWn6JAElABGRBFxxxhXkWi6Pv/n438vKyqA+ZhyD+vpIeTpQAhARSYCZMfvC2dz6/K0cbIqMZL9lS/y2LZV3NkoAIiIJumTwJRTmF/LrNb8GoKgofruWyjsbJQARkQQ17wXc9vxt7G3Yy+zZkJ9/aJv8fJg9O5z42koJQESkDc4beB7nDTyPW569hZISKC+HgQPBLPJeXg4lJWFHmRgNBici0kZ1++o4c86ZzJs0j4tOvSjscFqlweBERJKkoFsBD0x8gGm/m0bdvrqwwzlqSgAiIkfhksGX8KXTv8Q3n/5m2KEcNSUAEZGjdOfFd/JSzUs8ue7JsEM5KkoAIiJHqXvX7jz05YeY8fsZvLvr3bDDaTMlABGRdjh3wLn8y/n/wqW/vjTtHhyjBCAi0k4zx8zk2k9dy+W/uZw9DXvCDidhSgAiIklw+wW3c9ZJZ3HVgqtoaGwIO5yEKAGIiCSBmTH3i3PplteNab+blhZPEEsoAZjZeDNbb2bVZjYrTr2Z2d1B/RozGxVVV2BmC83sLTNbZ2bnBOWfMLNnzOyd4P2E5HVLRKTj5eXk8chVj7CpbhMzF8+ksakx7JCOqNUEYGa5wD3ABGAYMMXMhsU0mwAMCV6lwJyoul8CS9z9DGA4sC4onwUsd/chwPJgXkQkreV3yed/r/tf1v91PVcuuJK9DXvDDqlFiewBjAGq3X2juzcAjwKTYtpMAuZ7xAqgwMz6mlkP4HzgAQB3b3D3uqhlHgqmHwK+3K6eiIh0EgXdCni65GlO6HYCn//V56nZXRN2SHElkgD6AVuj5muCskTanArUAvPMbLWZ3W9m3YM2J7n7NoDgvXe8jZtZqZlVmlllbW16XWIlItmra25X5k2axzXDruHs+85m+cblYYd0mEQSgMUpix1BrqU2ecAoYI67jwT20sZDPe5e7u7F7l5cWFjYlkVFREJlZtzyuVv49RW/5qtPfpUf/+HH7Du4L+yw/i6RBFADDIia7w+8n2CbGqDG3V8OyhcSSQgAH5hZX4DgfUfbQhcRSQ/jTh3Hyq+v5I3aNxh2zzCeWPcEnWEk5kQSwEpgiJmdYmZdgcnAopg2i4Drg6uBxgIfufs2d98ObDWzoUG7ccCbUctMDaanAr9rT0dERDqz/j368/i1j3P/xPv58fM/Ztz8caz5YE2oMbWaANz9IDATWErkCp4F7r7WzKab2fSg2WJgI1AN3Ad8I2oVNwEVZrYGGAH8NCi/A7jYzN4BLg7mRUQy2oWnXMjqG1Zz9bCruWj+RXzj99+g+sPqUGLRA2FERELy4ccf8m9/+jceeu0hhvYaytThU7lm2DX07NYzqdtp6YEwSgAiIiE70HiAp6uf5ldVv+K5d5/j8tMv56tnfpWx/cdywrHtv0e2pQSQ1+41i4hIu3TJ7cLEoROZOHQiO+t38sjrj/DTP/+Uqu1V9MrvxYg+Ixhx0ghG9BnB8D7DKcwvJL9LPmaHXoC5/+B+NtVtYsOuDWz4cAMbdm1g466NLW5XewAiIp1UY1MjG3ZtoGp7FVXbq1i9fTVrPljDro93sb9xP927dCc3J5cmb6LJm2hobGBAjwEM/sRgBp8QvD4xmCs+eYX2AERE0kluTi6nn3g6p594OgeqruU3ZbBtCxQVwe0/aWTi1Xto8ibMjBzLIb9LPnk5iX+tKwGIiHRyFRVQWgr19ZH5zZth+g255FhPSkqOfr0aDlpEpJMrK/vHl3+z+vpIeXuk1TkAM6sFNh/l4r2AnUkMJwyZ0AdQPzqTTOgDZEY/jtCH0aNbXmzVqgTWPdDdDxtLJ60SQHuYWWW8kyDpJBP6AOpHZ5IJfYDM6EcYfdAhIBGRLKUEICKSpbIpAZSHHUASZEIfQP3oTDKhD5AZ/ejwPmTNOQARETlUNu0BiIhIFCUAEZEslZYJwMzGm9l6M6s2s8MeMRk8mObuoH6NmY2KqttkZq+bWZWZVUaV3x60rTKzZWZ2cjr2I6r+u2bmZtYr3fpgZreZ2XtBeZWZXZbKPqSqH0HdTcF615rZnenWBzP7bdTnsMnMqlLZhxT2Y4SZrWguN7MxadqP4Wb2UlD3lJn1aFeQ7p5WLyAX2EDkgfNdgdeAYTFtLgOeJvKs4rHAy1F1m4BecdbbI2r6m8DcdOxHUDeAyAN8NrfUpjP3AbgN+G4G/E1dADwLHBPM9063PsQs//+AW9P0s1gGTIha/vk07cdK4PPB9DTg9vbEmY57AGOAanff6O4NwKPApJg2k4D5HrECKLDg+cMtcffdUbPdOfzB98mWkn4EfgF8n/TuQ0dKVT9mAHe4+34Ad0/lc69T+lmYmQHXAo8kM+g4UtUPB5p/Lffk8OeaJ1uq+jEU+GMw/QxwVXuCTMcE0A/YGjVfE5Ql2saBZWa2ysxKoxcys9lmthUoAW5NatSHS0k/zGwi8J67v5b8kA+Tss8CmBnsFj9oZu1/IsaRpaofpwPnmdnLZvaCmZ2d5LgTjS+RNkf6LADOAz5w93eSFG9LUtWPbwF3Bf+/fw78IJlBx5GqfrwBTAymryGyt3/U0jEBWJyy2F+6R2rzWXcfBUwAbjSz8//ewL3M3QcAFUSeg5xKSe+HmeUDZaQ+eSUSXyJtWvos5gCDiTxDehuRQw+plKp+5AEnENm9/x6wIPglnQop+38RmELqf/1D6voxA7g5+P99M/BAMoI9glT1Y1owvwo4HmhoT5DpmABqODTr9efw3bkW27h78/sO4Ekiu2qxfkM7d60SkIp+DAZOAV4zs01B+1fNrE8K4j9ifIm0aemzcPcP3L3R3ZuA+4j/GSVTqv6maoAngl38V4AmIgN+pULK/l+YWR5wJfDbpEd9uFT1YyrwRDD9GGn6N+Xub7n7Je4+mkhC3tCuKNtzAiGMF5FfVRuJfNE1n1z5VEybyzn05MorQXl34Pio6ReB8cH8kKjlbwIWpmM/YpbfRGpPAqfqs+gbtfzNwKPp+FkA04H/G0yfTmR339KpD0HZeOCFVH4GHfBZrAO+EEyPA1alaT96B+85wHxgWrvi7IgPNQX/uJcBbxPJfmVB2XRgejBtwD1B/etAcVB+avBBvAasbV42qHucyPG1NcBTQL907EfM+jeRwgSQws/i4aDtGmARUQkhzfrRFfh18Hf1KnBhuvUhqP9V8zo64pWiz+JzwKqg7mVgdJr24/8E63wbuIN2/qDQUBAiIlkqHc8BiIhIEigBiIhkKSUAEZEspQQgIpKllABERLKUEoCISJZSAhARyVL/HzEG7UPabOBuAAAAAElFTkSuQmCC\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": "iVBORw0KGgoAAAANSUhEUgAAAW0AAAD8CAYAAAC8TPVwAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAARaElEQVR4nO3df4zkdX3H8ed7DwjMicHgahTcXUkMakgUOqEq7aUVa0ANRtM/MGuTGtvpH9SCbWLU/aPxj/2jiTH2j8ZkAloTR4zyI2mJUmj8VZOKnQMsB4dV8XY5QW+JPxDHVNB3//jO9vaWO+c77Mx+57P3fCSb73w/+5nJK5u9V773/bGfyEwkSWWYazqAJKk+S1uSCmJpS1JBLG1JKoilLUkFsbQlqSC1Sjsiro+IQxHxYETcMOVMkqRTGFnaEXEJ8JfA5cBrgLdFxCumHUyS9Gx1jrRfBXwzMweZ+QzwNeAd040lSTqZM2rMOQSsRsT5wK+AtwD97ZMiogN0APbv3/97r3zlKyeZU5L2nIMHt+4dIfOJGPWeqPMYe0S8F7gOeAp4CPhVZr7/VPPb7Xb2+8/qdUnSFktLsLa2udcmsz+ytGtdiMzMmzLzssw8APwE+O5zTilJAmB1FVqt8d5T9+6RFw23C8A7gZvHDSdJOtHyMnS7sLhY/z1179O+NSIeAv4VuC4zf/oc8kmStllehiNHYPsZ7lOpcyGSzPzDHWSSJE2IT0RKUkEsbUkqiKUtSQWxtCWpIJa2JBXE0pakgljaklQQS1uSCmJpS1JBLG1JKoilLUkFsbQlqSCWtiQVxNKWpIJY2pJUkLor17w/Ih6MiEMRcXNEnD3tYJKkZxtZ2hFxAfA3QDszLwH2AddOO5gkTVqvVy2mOzdXbXu9phONr9bKNcN550TE00ALeGx6kSRp8no96HRgMKj219aqfaiW/CrFyCPtzPwh8FFgHXgc+Hlm3jXtYJI0SSsrxwt702BQjZekzumRFwBvB14OvBTYHxHvPsm8TkT0I6K/sbEx+aSStAPr6+ONz6o6FyLfBPwgMzcy82ngNuAN2ydlZjcz25nZnp+fn3ROSdqRhYXxxmdVndJeB14XEa2ICOBK4PB0Y0nSZK2uQqt14lirVY2XpM457XuAW4B7gQeG7+lOOZckTdTyMnS7sLgIEdW22y3rIiRAZObEP7Tdbme/35/450rSXhURBzOzPWqeT0RKUkEsbUkqiKUtSQWxtCWpIJa2JBXE0pakgljaklQQS1uSCmJpS1JBLG1JKoilLUkFsbQlqSCWtiQVxNKWpIJY2pJUEEtbkgpSZ2HfiyPi/i1fT0bEDbuQTVLBej1YWoK5uWrb6zWdaG84Y9SEzPwO8FqAiNgH/BC4fbqxJJWs14NOBwaDan9trdqH8pb3mjXjnh65Evh+Zq5NI4ykvWFl5XhhbxoMqnHtzLilfS1w88m+ERGdiOhHRH9jY2PnySQVa319vHHVV7u0I+Is4BrgCyf7fmZ2M7Odme35+flJ5ZNUoIWF8cZV3zhH2lcD92bmj6cVRtLesLoKrdaJY61WNa6dGae038UpTo1I0lbLy9DtwuIiRFTbbteLkJMQmTl6UkQLeBS4KDN/Pmp+u93Ofr8/gXiSdHqIiIOZ2R41b+QtfwCZOQDO33EqSdKO+ESkJBXE0pakgljaklQQS1uSCmJpS1JBLG1JKoilLUkFsbQlqSCWtiQVxNKWpIJY2pJUEEtbkgpiaUtSQSxtSSqIpS1JBalV2hFxXkTcEhEPR8ThiHj9tINJqq/Xg6UlmJurtr1e04k0LbUWQQD+EbgzM/90uMBva9QbJO2OXg86HRgMqv21tWofXN5rLxp5pB0RzwcOADcBZOavM/NnU84lqaaVleOFvWkwqMa199Q5PXIRsAF8KiLui4gbI2L/9kkR0YmIfkT0NzY2Jh5U0smtr483rrLVKe0zgMuAT2TmpcAvgQ9un5SZ3cxsZ2Z7fn5+wjElncrCwnjjKlud0j4KHM3Me4b7t1CVuKQZsLoKrW1XmVqtalx7z8jSzswfAY9GxMXDoSuBh6aaSlJty8vQ7cLiIkRU227Xi5B7Vd27R94H9IZ3jjwCvGd6kSSNa3nZkj5d1CrtzLwfaE83iiRpFJ+IlKSCWNqSVBBLW5IKYmlLUkEsbUkqiKUtSQWxtCWpIJa2JBXE0pakgljaklQQS1uSCmJpS1JBLG1JKoilLUkFsbQlqSC1SjsijkTEAxFxf0T0px1KmmW9Hiwtwdxcte31mk6k00ndlWsA/jgzn5haEqkAvR50OjAYVPtra9U+uHKMdoenR6QxrKwcL+xNg0E1Lu2GuqWdwF0RcTAiOiebEBGdiOhHRH9jY2NyCaUZsr4+3rg0aXVL+4rMvAy4GrguIg5sn5CZ3cxsZ2Z7fn5+oiGlWbGwMN64NGm1SjszHxtujwG3A5dPM5Q0q1ZXodU6cazVqsal3TCytCNif0Scu/kaeDNwaNrBpFm0vAzdLiwuQkS17Xa9CKndU+fukRcDt0fE5vzPZuadU00lzbDlZUtazRlZ2pn5CPCaXcgiSRrBW/4kqSCWtiQVxNKWpIJY2pJUEEtbkgpiaUtSQSxtSSqIpS1JBbG0JakglrYkFcTSlqSCWNqSVBBLW5IKYmlLUkEsbUkqSO3Sjoh9EXFfRNwxzUDSpl4PlpZgbq7a9npNJ5KaV2flmk3XA4eB508pi/T/ej3odGAwqPbX1qp9cNUYnd5qHWlHxIXAW4EbpxtHqqysHC/sTYNBNS6dzuqeHvk48AHgt6eaEBGdiOhHRH9jY2MS2XQaW18fb1w6XdRZjf1twLHMPPi75mVmNzPbmdmen5+fWECdnhYWxhuXThd1jrSvAK6JiCPA54A3RsRnpppKp73VVWi1Thxrtapx6XQ2srQz80OZeWFmLgHXAl/OzHdPPZlOa8vL0O3C4iJEVNtu14uQ0jh3j0i7annZkpa2G6u0M/OrwFenkkSSNJJPREpSQSxtSSqIpS1JBbG0JakglrYkFcTSlqSCWNqSVBBLW5IKYmlLUkEsbUkqiKUtSQWxtCWpIJa2JBXE0pakgljaklSQOmtEnh0R34qIb0fEgxHxkd0Ipt3V68HSEszNVdter+lEkk6mziII/wu8MTOfiogzgW9ExJcy85tTzqZd0utBpwODQbW/tlbtgyvHSLOmzhqRmZlPDXfPHH7lVFNpV62sHC/sTYNBNS5pttQ6px0R+yLifuAYcHdm3nOSOZ2I6EdEf2NjY8IxNU3r6+ONS2pOrdLOzN9k5muBC4HLI+KSk8zpZmY7M9vz8/MTjqlpWlgYb1xSc8a6eyQzf0a1sO9V0wijZqyuQqt14lirVY1Lmi117h6Zj4jzhq/PAd4EPDzlXNpFy8vQ7cLiIkRU227Xi5DSLKpz98hLgE9HxD6qkv98Zt4x3VjabcvLlrRUgpGlnZn/DVy6C1kkSSP4RKQkFcTSlqSCWNqSVBBLW5IKYmlLUkEsbUkqiKUtSQWxtCWpIJa2JBXE0pakgljaklQQS1uSCmJpS1JBLG1JKoilLUkFqbNyzcsi4isRcTgiHoyI63cj2F7W68HSEszNVdter+lEkkpRZ+WaZ4C/y8x7I+Jc4GBE3J2ZD005257U60GnA4NBtb+2Vu2DK8dIGm3kkXZmPp6Z9w5f/wI4DFww7WB71crK8cLeNBhU45I0yljntCNiiWrpsXtO8r1ORPQjor+xsTGheHvP+vp445K0Ve3SjojnAbcCN2Tmk9u/n5ndzGxnZnt+fn6SGfeUhYXxxiVpq1qlHRFnUhV2LzNvm26kvW11FVqtE8darWpckkapc/dIADcBhzPzY9OPtLctL0O3C4uLEFFtu10vQkqqJzLzd0+I+APgP4AHgN8Ohz+cmV881Xva7Xb2+/2JhZSkvS4iDmZme9S8kbf8ZeY3gJhIKknSjvhEpCQVxNKWpIJY2pJUEEtbkgpiaUtSQSxtSSqIpS1JBbG0JakglrYkFcTSlqSCWNqSVBBLW5IKYmlLUkEsbUkqiKUtSQWps3LNJyPiWEQc2o1AkqRTq3Ok/c/AVVPOMTW9Hiwtwdxcte31mk4kSc9dnZVrvh4RS7uQZeJ6Peh0YDCo9tfWqn1wTUZJZdrT57RXVo4X9qbBoBqXpBJNrLQjohMR/Yjob2xsTOpjd2R9fbxxSZp1EyvtzOxmZjsz2/Pz85P62B1ZWBhvXJJm3Z4+PbK6Cq3WiWOtVjUuSSWqc8vfzcB/AhdHxNGIeO/0Y03G8jJ0u7C4CBHVttv1IqSkckVmTvxD2+129vv9iX+uJO1VEXEwM9uj5u3p0yOStNdY2pJUEEtbkgpiaUtSQSxtSSqIpS1JBbG0JakglrYkFcTSlqSCWNqSVBBLW5IKYmlLUkEsbUkqiKUtSQWxtCWpIJa2JBWkVmlHxFUR8Z2I+F5EfHDU/IMHYWkJer0d55MkbVFnubF9wD8BVwOvBt4VEa8e9b61Neh0LG5JmqQ6R9qXA9/LzEcy89fA54C31/nwwQBWVnYST5K01Rk15lwAPLpl/yjw+9snRUQH6FR75wPVUmdraxBx8OAOc07CC4Enmg6xjZnqmcVMMJu5zFTPLGa6uM6kOqUdJxl71mrAmdkFugAR0c98YuQClbupyjR60czdZKZ6ZjETzGYuM9Uzq5nqzKtzeuQo8LIt+xcCjz2XUJKknalT2v8FvCIiXh4RZwHXAv8y3ViSpJMZeXokM5+JiL8G/g3YB3wyMx8c8bbuJMJNmJnqMVN9s5jLTPUUmykyn3V6WpI0o3wiUpIKYmlLUkEmWtrjPu6+GyLikxFxLCIONZ1lU0S8LCK+EhGHI+LBiLh+BjKdHRHfiohvDzN9pOlMmyJiX0TcFxF3NJ0FICKORMQDEXF/3du0pi0izouIWyLi4eHv1etnINPFw5/R5teTEXHDDOR6//B3/FBE3BwRZ89ApuuHeR4c+TPKzIl8UV2k/D5wEXAW8G3g1ZP6/B3kOgBcBhxqOsuWTC8BLhu+Phf4n6Z/VlT34z9v+PpM4B7gdU3/rIZ5/hb4LHBH01mGeY4AL2w6x7ZMnwb+Yvj6LOC8pjNty7cP+BGw2HCOC4AfAOcM9z8P/HnDmS4BDgEtqptD/h14xanmT/JI+zk/7j5Nmfl14CdN59gqMx/PzHuHr38BHKb6ZWoyU2bmU8PdM4dfjV+ljogLgbcCNzadZVZFxPOpDk5uAsjMX2fmzxoN9WxXAt/PzLWmg1AV4zkRcQZVUTb93MmrgG9m5iAznwG+BrzjVJMnWdone9y90SIqQUQsAZdSHdk2anga4n7gGHB3ZjaeCfg48AHgtw3n2CqBuyLi4PDPNzTtImAD+NTwNNKNEbG/6VDbXAvc3HSIzPwh8FFgHXgc+Hlm3tVsKg4BByLi/IhoAW/hxAcaTzDJ0q71uLuOi4jnAbcCN2Tmk03nyczfZOZrqZ56vTwiLmkyT0S8DTiWmbPwt2u2uiIzL6P6y5fXRcSBhvOcQXUK8BOZeSnwS2AmrikBDB/Kuwb4wgxkeQHVGYCXAy8F9kfEu5vMlJmHgX8A7gbupDq1/Myp5k+ytH3cfQwRcSZVYfcy87am82w1/K/1V4Grmk3CFcA1EXGE6nTbGyPiM81Ggsx8bLg9BtxOdWqwSUeBo1v+Z3QLVYnPiquBezPzx00HAd4E/CAzNzLzaeA24A0NZyIzb8rMyzLzANXp3O+eau4kS9vH3WuKiKA6/3g4Mz/WdB6AiJiPiPOGr8+h+uV+uMlMmfmhzLwwM5eofp++nJmNHhVFxP6IOHfzNfBmqv/eNiYzfwQ8GhGbfyXuSuChBiNt9y5m4NTI0DrwuohoDf8dXkl1TalREfGi4XYBeCe/4+dV56/81ZLP7XH3qYuIm4E/Al4YEUeBv8/Mm5pNxRXAnwEPDM8hA3w4M7/YXCReAnx6uOjFHPD5zJyJW+xmzIuB26t/75wBfDYz72w2EgDvA3rDA6ZHgPc0nAeA4TnaPwH+quksAJl5T0TcAtxLdQriPmbjkfZbI+J84Gngusz86akm+hi7JBXEJyIlqSCWtiQVxNKWpIJY2pJUEEtbkgpiaUtSQSxtSSrI/wH58WA+Fkg9OQAAAABJRU5ErkJggg==\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", "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.1+" } }, "nbformat": 4, "nbformat_minor": 2 }