{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", " \n", "Disclaimer: \n", " \n", "The main objective of the Jupyter notebooks is to show how to use the models of the QENS library by\n", " \n", "- building a fitting model: composition of models, convolution with a resolution function \n", "- setting and running the fit \n", "- extracting and displaying information about the results \n", "\n", "These steps have a minimizer-dependent syntax. That's one of the reasons why different minimizers have been used in the notebooks provided as examples. \n", "But, note that the initial guessed parameters might not be optimal, resulting in a poor fit of the reference data.\n", " \n", "
\n", "\n", "\n", "# Equivalent sites circle with lmfit\n", "\n", "## Introduction\n", "\n", "
\n", " \n", "The objective of this notebook is to show how to use the Equivalent Sites Circle model to perform some \n", "fits using lmfit.\n", "
\n", "\n", "### Physical units\n", "Please note that the following units are used for the QENS models\n", "\n", "| Type of parameter | Unit |\n", "| :---------------- | :-----------: |\n", "| Time | picosecond |\n", "| Length | Angstrom |\n", "| Momentum transfer | 1/Angstrom |\n", "\n", "For information about unit conversion, please refer to the jupyter notebook called `Convert_units.ipynb` in the `tools` folder.\n", "\n", "The dictionary of units defined in the cell below specify the units of the refined parameters adapted to the convention used in the experimental datafile." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# Units of parameters for selected QENS model and experimental data\n", "dict_physical_units = {'omega': \"1/ps\", \n", " 'q': \"1/Angstrom\", \n", " 'scale': \"unit_of_signal/ps\", \n", " 'center': \"1/ps\", \n", " 'radius': \"Angstrom\", \n", " 'resTime': \"ps\"}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Importing libraries" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import ipywidgets\n", "import matplotlib.pyplot as plt\n", "import lmfit\n", "import QENSmodels" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Plot of the fitting model\n", "\n", "The widget below shows the peak shape function imported from QENSmodels where the function's parameters can be varied." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "f3bf0f5fe79740699b47e67da4bea67b", "version_major": 2, "version_minor": 0 }, "text/plain": [ "HBox(children=(VBox(children=(FloatSlider(value=1.0, continuous_update=False, description='q', max=10.0, min=0…" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "f0fdebe58eba4d0887bc708d6460b1cb", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Output()" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "6ad46935d630437ea1799062afe4625e", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Button(description='Reset', style=ButtonStyle())" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Dictionary of initial values\n", "ini_parameters = {'q': 1., 'scale': 5., 'center': 5., 'Nsites': 3, 'radius': 5., 'resTime': 1.} \n", "\n", "def interactive_fct(q, scale, center, Nsites, radius, resTime):\n", " \"\"\"\n", " Plot to be updated when ipywidgets sliders are modified\n", " \"\"\"\n", " xs = np.linspace(-10, 10, 100)\n", " \n", " fig1, ax1 = plt.subplots()\n", " ax1.plot(xs, \n", " QENSmodels.sqwEquivalentSitesCircle(\n", " xs, \n", " q, \n", " scale, \n", " center, \n", " Nsites, \n", " radius, \n", " resTime))\n", " ax1.set_xlabel('x')\n", " ax1.grid()\n", "\n", "# Define sliders for modifiable parameters and their range of variations\n", "\n", "q_slider = ipywidgets.FloatSlider(value=ini_parameters['q'],\n", " min=0.1, max=10., step=0.1,\n", " description='q', \n", " continuous_update=False) \n", "\n", "scale_slider = ipywidgets.FloatSlider(value=ini_parameters['scale'],\n", " min=0.1, max=10, step=0.1,\n", " description='scale',\n", " continuous_update=False) \n", "\n", "center_slider = ipywidgets.IntSlider(value=ini_parameters['center'],\n", " min=-10, max=10, step=1,\n", " description='center', \n", " continuous_update=False) \n", "\n", "Nsites_slider = ipywidgets.IntSlider(value=ini_parameters['Nsites'],\n", " min=2, max=10, step=1,\n", " description='Nsites',\n", " continuous_update=False)\n", "\n", "radius_slider = ipywidgets.FloatSlider(value=ini_parameters['radius'],\n", " min=0.1, max=10, step=0.1,\n", " description='radius',\n", " continuous_update=False)\n", "\n", "resTime_slider = ipywidgets.FloatSlider(value=ini_parameters['resTime'],\n", " min=0.1, max=10, step=0.1,\n", " description='resTime', \n", " continuous_update=False)\n", "\n", "grid_sliders = ipywidgets.HBox([ipywidgets.VBox([q_slider, scale_slider, center_slider]), \n", " ipywidgets.VBox([Nsites_slider, radius_slider, resTime_slider])])\n", " \n", "\n", "# Define function to reset all parameters' values to the initial ones\n", "def reset_values(b):\n", " \"\"\"\n", " Reset the interactive plots to inital values\n", " \"\"\"\n", " q_slider.value = ini_parameters['q'] \n", " scale_slider.value = ini_parameters['scale'] \n", " center_slider.value = ini_parameters['center'] \n", " Nsites_slider.value = ini_parameters['Nsites'] \n", " radius_slider.value = ini_parameters['radius'] \n", " resTime_slider.value = ini_parameters['resTime']\n", "\n", "# Define reset button and occurring action when clicking on it\n", "reset_button = ipywidgets.Button(description = \"Reset\")\n", "reset_button.on_click(reset_values)\n", "\n", "# Display the interactive plot\n", "interactive_plot = ipywidgets.interactive_output(interactive_fct, \n", " {'q': q_slider, \n", " 'scale': scale_slider,\n", " 'center': center_slider,\n", " 'Nsites': Nsites_slider,\n", " 'radius': radius_slider,\n", " 'resTime': resTime_slider}) \n", " \n", "display(grid_sliders, interactive_plot, reset_button)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Creating the reference data" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "nb_points = 200\n", "xx = np.linspace(-5, 5, nb_points)\n", "added_noise = np.random.normal(0, 1, nb_points)\n", "\n", "equiv_sites_circle_noisy = QENSmodels.sqwEquivalentSitesCircle(\n", " xx,\n", " q=1.,\n", " scale=1.3,\n", " center=0.3,\n", " Nsites=5,\n", " radius=4.,\n", " resTime=3.\n", ") * (1 + 0.1 * added_noise) + 0.01 * added_noise" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Setting and fitting" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Names of parameters: ['q', 'scale', 'center', 'Nsites', 'radius', 'resTime']\n", "Independent variable(s): ['w'].\n" ] } ], "source": [ "gmodel = lmfit.Model(QENSmodels.sqwEquivalentSitesCircle)\n", "\n", "print(f'Names of parameters: {gmodel.param_names}\\nIndependent variable(s): {gmodel.independent_vars}.')\n", "\n", "ini_values = {'scale': 1.22, 'center': 0.2, 'Nsites': 5, 'radius': 3.1, 'resTime': 0.33}\n", "\n", "# Define boundaries for parameters to be refined\n", "gmodel.set_param_hint('scale', min=0)\n", "gmodel.set_param_hint('center', min=-5, max=5)\n", "gmodel.set_param_hint('radius', min=0)\n", "gmodel.set_param_hint('resTime', min=0)\n", "\n", "# Fix some of the parameters\n", "gmodel.set_param_hint('q', vary=False)\n", "gmodel.set_param_hint('Nsites', vary=False)\n", "\n", "# Fit\n", "result = gmodel.fit(\n", " equiv_sites_circle_noisy,\n", " w=xx,\n", " q=1.,\n", " scale=ini_values['scale'],\n", " center=ini_values['center'],\n", " Nsites=ini_values['Nsites'],\n", " radius=ini_values['radius'],\n", " resTime=ini_values['resTime']\n", ")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Plots - Initial model and reference data\n", "fig0, ax0 = plt.subplots()\n", "ax0.plot(xx, equiv_sites_circle_noisy, 'b.-', label='reference data')\n", "ax0.plot(xx, result.init_fit, 'k--', label='model with initial guesses')\n", "ax0.set(xlabel='x', title='Initial model and reference data')\n", "ax0.grid()\n", "ax0.legend();" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Plotting results\n", "\n", "using methods implemented in `lmfit`" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# display result\n", "print('Result of fit:\\n',result.fit_report())\n", "\n", "# plot fitting result using lmfit functionality\n", "result.plot()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Other option: plot fitting result using `matplotlib.pyplot`" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "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goWIiIiEjIJFBLndbiZNmoTb7Y50Kbamdg4ftXV4qJ3DQ+18fMI+eVNERETsSz0WIiIiEjIKFiIiIhIyChYiIiISMgoWIiIiEjIKFiehwsJCOnTogGVZrFixItLl2MrmzZsZOXIkzZo1IzY2lhYtWjBp0iSKiooiXVq198QTT9C0aVNiYmLo0qUL3377baRLspVp06Zx7rnnkpiYSJ06dbj88stZt25dpMuyvfvvvx/Lshg3blykS6k2FCxOQrfddhv169ePdBm2tHbtWnw+H8888wxr1qzhkUce4emnn+aOO+6IdGnV2iuvvML48eOZNGkSy5cvp3379vTt25eMjIxIl2Ybn376KaNHj+brr78mPT0dj8dDnz59yM3NjXRptrV06VKeeeYZ2rVrF+lSqhcjJ5UFCxaYM844w6xZs8YA5vvvv490Sbb3r3/9yzRr1izSZVRrnTt3NqNHjw489nq9pn79+mbatGkRrMreMjIyDGA+/fTTSJdiS9nZ2aZly5YmPT3ddOvWzdx4442RLqnaUI/FSWT37t2MGjWKOXPmEBcXF+lyThmZmZnUrFkz0mVUW0VFRSxbtoxevXoFljkcDnr16sVXX30VwcrsLTMzE0Dv3SoyevRo+vfvH/S+looJ+03IpHzGGIYPH85f//pXOnXqxObNmyNd0ilhw4YNzJw5kwcffDDSpVRbe/fuxev1Urdu3aDldevWZe3atRGqyt58Ph/jxo3jd7/7HW3bto10ObYzd+5cli9fztKlSyNdSrWkHosqNmHCBCzLOurX2rVrmTlzJtnZ2UycODHSJVdLFW3n0rZv384ll1zCVVddxahRoyJUuUjljR49mtWrVzN37txIl2I727Zt48Ybb+S///0vMTExkS6nWtIlvavYnj172Ldv31HXad68OYMHD+add97BsqzAcq/Xi9Pp5JprruGll16q6lKrtYq2c3R0NAA7duyge/funHfeecyePRuHQxn7eBUVFREXF8e8efO4/PLLA8uHDRvGwYMHmT9/fuSKs6ExY8Ywf/58PvvsM5o1axbpcmznrbfeYtCgQTidzsAyr9eLZVk4HA4KCwuDnpOyFCxOElu3biUrKyvweMeOHfTt25d58+bRpUsXGjZsGMHq7GX79u306NGDjh078p///Ee/JEKgS5cudO7cmZkzZwL+rvrGjRszZswYJkyYEOHq7MEYw9ixY3nzzTdZvHgxLVu2jHRJtpSdnc2WLVuClo0YMYIzzjiD22+/XUNPFaA5FieJxo0bBz1OSEgAoEWLFgoVIbR9+3a6d+9OkyZNePDBB9mzZ0/gubS0tAhWVr2NHz+eYcOG0alTJzp37syMGTPIzc1lxIgRkS7NNkaPHs3LL7/M/PnzSUxMZNeuXQAkJycTGxsb4ersIzExsUx4iI+Pp1atWgoVFaRgIaeU9PR0NmzYwIYNG8oENnXeHb8//vGP7Nmzh7vvvptdu3bRoUMHPvjggzITOuX4PfXUUwB07949aPmsWbMYPnx4+AsSOQINhYiIiEjIaMaaiIiIhIyChYiIiISMgoWIiIiEjIKFiIiIhIyChYiIiISMgoWIiIiEjIKFiIiIhIyChYiIiISMgoWIiIiEjIKFiIiIhIyChYickD179pCWlsZ9990XWPbll18SHR3Nxx9/HMHKRCQSdK8QETlhCxYs4PLLL+fLL7+kVatWdOjQgd///vc8/PDDkS5NRMJMwUJEQmL06NEsXLiQTp06sWrVKpYuXYrb7Y50WSISZgoWIhIS+fn5tG3blm3btrFs2TLOOuusSJckIhGgORYiEhIbN25kx44d+Hw+Nm/eHOlyRCRC1GMhIiesqKiIzp0706FDB1q1asWMGTNYtWoVderUiXRpIhJmChYicsJuvfVW5s2bx8qVK0lISKBbt24kJyfz7rvvRro0EQkzDYWIyAlZvHgxM2bMYM6cOSQlJeFwOJgzZw6ff/45Tz31VKTLE5EwU4+FiIiIhIx6LERERCRkFCxEREQkZBQsREREJGQULERERCRkFCxEREQkZBQsREREJGQULERERCRkFCxEREQkZBQsREREJGQULERERCRkFCxEREQkZBQsREREJGT+H+BCBHfhq5TFAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig2 = plt.figure()\n", "plt.plot(xx, equiv_sites_circle_noisy, 'b-', label='reference data')\n", "plt.plot(xx, result.best_fit, 'r', label='fitting result')\n", "plt.legend()\n", "plt.xlabel('x')\n", "plt.title('Fit result and reference data')\n", "plt.grid();" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Print values and errors of refined parameters:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "resTime: 3.0223323418811363 +/- 0.17278081176482926 ps\n", "radius: 4.367424188198108 +/- 0.39816818761927975 Angstrom\n", "center: 0.29066458538309625 +/- 0.004683646032517251 1/ps\n", "scale: 1.312415165006191 +/- 0.01108276952841706 unit_of_signal/ps\n" ] } ], "source": [ "for item in ['resTime', 'radius', 'center', 'scale']:\n", " print(f\"{item}: {result.params[item].value} +/- {result.params[item].stderr} {dict_physical_units[item]}\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "hide_input": false, "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.8.9" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": true, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": {}, "toc_section_display": true, "toc_window_display": false }, "varInspector": { "cols": { "lenName": 16, "lenType": 16, "lenVar": 40 }, "kernels_config": { "python": { "delete_cmd_postfix": "", "delete_cmd_prefix": "del ", "library": "var_list.py", "varRefreshCmd": "print(var_dic_list())" }, "r": { "delete_cmd_postfix": ") ", "delete_cmd_prefix": "rm(", "library": "var_list.r", "varRefreshCmd": "cat(var_dic_list()) " } }, "types_to_exclude": [ "module", "function", "builtin_function_or_method", "instance", "_Feature" ], "window_display": false } }, "nbformat": 4, "nbformat_minor": 4 }