pyerrors/examples/example_combined_fit.ipynb

467 lines
46 KiB
Text

{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "ethical-frontier",
"metadata": {},
"outputs": [],
"source": [
"import pyerrors as pe\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "incredible-posting",
"metadata": {},
"outputs": [],
"source": [
"x_test = {'a':[0,1,2,3,4,5],'b':[0,1,2,3,4,5]}\n",
"y_test = {'a':[pe.Obs([np.random.normal(i, i*1.5, 1000)],['ensemble1']) for i in range(1,7)],\n",
" 'b':[pe.Obs([np.random.normal(val, val*1.5, 1000)],['ensemble1']) for val in [1.0,2.5,4.0,5.5,7.0,8.5]]}\n",
"for key in y_test.keys():\n",
" [item.gamma_method() for item in y_test[key]]"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "subtle-malaysia",
"metadata": {},
"outputs": [],
"source": [
"def func_a(a, x):\n",
" return a[1] * x + a[0]\n",
"\n",
"def func_b(a, x):\n",
" return a[2] * x + a[0]\n",
"\n",
"funcs_test = {\"a\": func_a,\"b\": func_b}"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "modern-relay",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Fit with 3 parameters\n",
"Method: migrad\n",
"Optimization terminated successfully.\n",
"chisquare/d.o.f.: 1.1407448193242595\n",
"fit parameters [0.98418071 0.95797691 1.52431702]\n",
"chisquare/expected_chisquare: 1.1485431097238927\n"
]
}
],
"source": [
"output_test = pe.fits.least_squares(x_test,y_test,funcs_test,method='migrad',expected_chisquare=True)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "technological-rolling",
"metadata": {},
"outputs": [],
"source": [
"output_test.gamma_method()"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "persistent-mathematics",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Goodness of fit:\n",
"χ²/d.o.f. = 1.140745\n",
"χ²/χ²exp = 1.148543\n",
"p-value = 0.3293\n",
"Fit parameters:\n",
"0\t 0.984(33)\n",
"1\t 0.958(32)\n",
"2\t 1.524(42)\n",
"\n"
]
}
],
"source": [
"print(output_test)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "wooden-potential",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAWoAAAD4CAYAAADFAawfAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAyL0lEQVR4nO3de3zO9f/H8cd7TttkFMmcIpnmEDKHSlFSKn0pScwhKSXbzPnQD6MccmZO6UvfDTnEVE6Rcowwch5zHGNYzszGdr1/f7ydKoex69rn2nW97rfbdfvucO1zva7R8/v2+rwPSmuNEEII5+VhdQFCCCHuToJaCCGcnAS1EEI4OQlqIYRwchLUQgjh5LI74qIFChTQJUqUcMSlhRDCJW3atOkvrfWjt/ueQ4K6RIkSREdHO+LSQgjhkpRScXf6nrQ+hBDCyUlQCyGEk5OgFkIIJ+eQHvXtXL16lfj4eJKTkzPrJZ2ap6cnRYsWJUeOHFaXIoRwcpkW1PHx8eTJk4cSJUqglMqsl3VKWmtOnTpFfHw8JUuWtLocIYSTy7TWR3JyMvnz53f7kAZQSpE/f37514UQIl0ytUctIX2T/C6EEOklNxOFEMLJSVALIUQGhIWFoZT61yMsLMxur+FWQT1mzBj8/f0JDAy0uhQhhIsICwtDa02tWrWoVasWWmu01nYN6kyb9eEMxo8fz7JlyyhatKjVpQghRLpZE9ShobBli32vWakSjBp1x29/+umnHDhwgNdff53Dhw/Tu3dvunTpAkD58uVZsGABAK+//jo1a9Zk7dq1FClShB9//BEvLy/27dvHp59+SmJiItmyZeP777+nVKlS/3qdixcv0qBBA86cOcPVq1f58ssvadCggX3fqxDCrbhN62PixIkULlyY5cuX07Fjxzs+b+/evbRv356dO3eSL18+5s6dC0BgYCDt27dn69atrF27Fl9f39v+vKenJ/PmzWPz5s0sX76czp07I+dSCiEywpoR9V1GvlYrWbIklSpVAqBKlSocOnSICxcucPToUd5++23AhPGdaK3p1asXq1atwsPDg6NHj3LixAkKFSqUGeULIVyQW/Wor8uePTs2m+3G57cuPMmVK9eNj7Nly8bly5fv69rTp08nMTGRTZs2kSNHDkqUKCELW4QQGeI2rY9blShRgs2bNwOwefNmDh48eNfn58mTh6JFi/LDDz8AkJKSQlJS0m2fe+7cOQoWLEiOHDlYvnw5cXF33GJWCOFCUlJS2LJlC8ePH7f7td0yqBs1asTp06cpV64cY8eOxc/P754/M3XqVMaMGcPTTz/Nc889d8c/jMDAQKKjo6lQoQKRkZE89dRT9i5fCOGE4uLiOHfuHP3797f7tZUjbnQFBATof57wEhMTg7+/v91fKyuT34kQWZ+Xl9dt25uenp731TpVSm3SWgfc7ntuOaIWQgh7OXDgAM2aNcPDw8Spt7c3gYGB92yp3g+3vJloD9u3b6dFixZ/+1quXLlYv369RRUJIazg6+uLj48PNpsNDw8PkpOT8fHxsetMLwnqB1ShQgW22HvRjhAiSzpx4gSFCxfG19eX6tWrk5CQYNfrS1ALIUQGRUVFUbt2bQDGjRtn9+tLj1oIIZycjKiFEMIO0tLS7ri+IqMkqIUQIgO01sydO5eNGzdis9lISkrC29vbrq/hVq2PzNiPesWKFdSvX99h1xdCOI9du3ZRt25dGjduTPbs2SlbtqzdQxrcbEQt+1ELIezh3LlzhIWFER4ejo+PD+PGjWPWrFkOOwvVkqAODQ21+9S2SpUqMcoJ9qMGOH/+PG+++Sb79u3jpZdeYvz48Tcmwwshsi6bzUZkZCTdu3cnMTGRjz/+mLx589K+ffsbz7ke1n379rXbKS9ukx6ZtR81wIYNGwgPD2fXrl3s37+fqKgou78fIUTmio6O5vnnn6d169aUKlWKjRs38vXXXzNkyJAbx2/d+sjyR3HdbeRrtYzuRw1QrVo1nnjiCQCaNm3KmjVrePfddx1atxDCMRITE+nVqxeTJ0+mYMGCRERE0Lx580z9V7LbjKhvdT/7Uaempt739f/Zp3JU30oI4Tipqak3dtf83//+R6dOnYiNjaVly5aZ3sp0y6B25H7UYFofBw8exGazMWvWLGrWrGm32oUQjrdy5UqeeeYZgoODCQgIYNu2bQwbNgwfHx9L6nHLoHbkftQAVatWJSgoCH9/f0qWLHmjZSKEcG7x8fE0bdqU2rVrc/78eebOncvSpUst345Y9qO2kPxOhHAOKSkpjBgxggEDBpCWlkb37t3p1q2bQ+ZE38nd9qN2q3nUQgjxT4sWLaJDhw7s27ePhg0bMmLECEqWLGl1WX8jQf2AZD9qIbK2ffv20bFjRxYsWECZMmVYsmQJr776qtVl3Va6glop1RH4CNDAdqC11tqtj9aW/aiFyJouXbrEwIEDGTZsGDlz5mTo0KGEhISQM2dOq0u7o3veTFRKFQFCgACtdXkgG/C+owsTQgh70loza9YsnnrqKQYOHEiTJk2IjY2lS5cuTh3SkP5ZH9kBL6VUdsAbOOa4koQQwr62b9/Oyy+/zPvvv0+BAgVYs2YNkZGRd11h7EzuGdRa66PAMOAwkACc01ov/efzlFJtlVLRSqnoxMTEjFUVFgZK/fthxyWZQgjXd/bsWUJCQqhcuTLbtm1jwoQJN5aCZyXpaX08DDQASgKFgdxKqeb/fJ7WepLWOkBrHfDoo49mrKqwMNAaatUyD63NQ4JaCJEONpuNyZMn4+fnx7hx42jbti2xsbF8+umnZMuWzery7lt6Wh+vAAe11ola66tAFPCcY8u6JiUFtmyBuywuEUKIW23YsIEaNWrw0Ucf4efnR3R0NOPHjyd//vxWl/bA0hPUh4EaSilvZTatqAPEOLasa+Li4Nw56N/fLpdr2LAhVapUoVy5ckyaNMku1xRCOIeTJ0/Spk0bqlevTnx8PNOmTWP16tVUrlzZ6tIyLD096vXAHGAzZmqeB+DYlPPyMj3p60euT5hgPvfyytBlp0yZwqZNm4iOjmbMmDGcOnXKDsUKIax09epVRo8ejZ+fH1OnTqVr167s2bOHwMBAl9kQLV2zPrTWfbXWT2mty2utW2itUxxa1YED0KwZXN+hytsbAgPhHpsn3cuYMWOoWLEiNWrU4MiRI+zdu9cOxQohrLJ8+XIqV65MaGgoNWrUYPv27QwZMoQ8efJYXZpdOeemTL6+4OMDNpsJ6+Rk83mhQg98yRUrVrBs2TLWrVvH1q1bqVy58t+2NxVCZB2HDx/mvffe4+WXXyYpKYkffviBxYsXU6ZMGatLcwjnXUJ+4gQULmxCu3r1m22QB3Tu3DkefvhhvL292b17N3/88YedChVCZJbk5GSGDRvGwIED0VrTr18/unbtilcG26LOznmDOioKatc2H48bl+HL1atXj4kTJ+Lv70+ZMmWoUaNGhq8phMgcWmsWLFhAaGgoBw4coFGjRgwfPpzHH3/c6tIyhfMGtZ3lypWLxYsXW12GEOI+xcbGEhoayuLFi/H39+eXX37hlVdesbqsTOWcPerrKxNXrjQPWZkohNu5ePEiPXr0oHz58vz++++MGDGCrVu3ul1Ig7OOqMPCJJSFcFNaa2bMmEHXrl05duwYH3zwAYMGDaJQBiYTZHXOOaIWQrilrVu3Urt2bQIDA/H19WXt2rV8++23bh3SIEEthHACp0+fJigoiGeeeYadO3cyadIk1q9fz7PPPmt1aU7BOVsfQgi3kJaWxuTJk+nVqxdnzpzhs88+o3///jz88MNWl+ZUnHJEHRYWhlLqX48w6VsL4TLWrVtH9erV+eSTTyhbtiybN28mPDxcQvo2nDaotdbUqlWLWrVqobVGa52hoD506BDly5e3X5FCiH9JzyDr+PHjfPDBBzz33HMkJCTw3XffsXLlSipWrGhd4U7OKYP6upSUFLZs2cJx2eZUiCzhboOsq1evMmLECPz8/Pjuu+/o0aMHe/bsoWnTpi6zeZKjOHVQx8XFce7cOfrbaZvT1NRUAgMD8ff359133yUpKcku1xVC3N2yZcuoWLEinTt3pmbNmuzYsYNBgwbx0EMPWV1aluCUQe3l5YVSioRr+3tMmDABpVSG1/Pv2bOHzz77jJiYGHx8fBg/frw9yhVC3EFcXByNGjWibt26pKSk8NNPP7Fw4UL8/PysLi1LccqgPnDgAM2aNcPj2jan3t7eBAYGcjCD25wWK1bsxllpzZs3Z82aNRmuVQjxb5cvX+aPP/6gTJkyLF68mC+//JKdO3fy1ltvSZvjATjl9DxfX198fHyw2Wx4eHiQnJyMj49Phie9//MviPyFEcK+tNb8+OOPbNq0ibS0NEqVKsXy5cspVqyY1aVlaU4Z1AAnTpygcOHC+Pr6Ur169RttkIw4fPgw69at49lnn+W7776jZs2adqhUCAGwe/duypUrh81mu/G1/fv3U7x4cTw9Pbl8+bKF1WVtTtn6AIiKiqJ06dI89NBDjBs3jqioqAxfs0yZMowbNw5/f3/OnDlDu3bt7FCpEO7t/PnzdO3alQoVKpA7d26eeeYZu7ct3Z3TjqjtrUSJEuzevdvqMoRwGVprpk+fTteuXTl+/DgffvghgwYNom/fvmzevNmubUt355Qj6uuT5leuXMnKlStlZaIQTubPP//khRdeoEWLFhQrVoz169czefJkChYseKNtWblyZT799FNZB2EHSmtt94sGBATo6Ojov30tJiYGf39/u79WVia/E5HVnDp1iv/7v//j66+/pkCBAgwaNIjWrVvfaHVcV/va6UwrVqzI/CKzKKXUJq11wO2+l6kjakf8n0JWJb8LkZWkpaUxYcIE/Pz8+OabbwgODiY2NpY2bdr8K6SF/WXab9jT05NTp05JQGFC+tSpU3h6elpdihD3tGbNGgICAvjss894+umn+fPPPxk9ejT58uWzujS3kWk3E4sWLUp8fDyJiYmZ9ZJOzdPTk6JFi1pdhhB3lJCQQLdu3Zg2bRpFixZl1qxZNG7cWNYfWCDTgjpHjhyULFkys15OCPGArly5wujRo+nfvz9Xrlzh888/p2fPnuTOnfuePxsWFka/fv1ufH491Pv27SuTATIg024mCiGc35IlS+jQoQN79uyhfv36jBw5kieffNLqstyC09xMFEI4p4MHD9KwYUPq1atHWloaCxcuZP78+RLSTkKCWgg3lpSURJ8+ffD392fZsmUMGjSIHTt28MYbb1hdmriF26xMFELcpLUmKiqKTp06cfjwYZo2bcqQIUPkBreTkqAWws3s2rWLkJAQfv31VypUqMCKFSuoVauW1WWJu5DWhxBu4ty5c3Tq1ImKFSuyadMmwsPD2bx5s4R0FiBBLYSLs9lsREREUKZMGUaNGkXr1q2JjY0lKCiI7NnlH9UZFhYGSv37YcfpiPKnJIQL27RpE0FBQfzxxx/UqFGDBQsWEBBw2xlg4kGFhZnHtf1NcMD+JjKiFsIF/fXXX7Rt25aqVaty4MABvv32W37//XcJ6SxKgloIF5KamsrYsWMpXbo0U6ZMITQ0lNjYWD744APZPMnRUlJgyxZwwLau8icnhItYtWoVVapUITg4mCpVqrBt2zZGjBhB3rx5rS7NPcTFwblz0L+/3S8tQS1EFnf06FGaNWtGrVq1OHv2LHPmzOGXX36hbNmyVpfmHry8zM3D6+e6TphgPvfysttLSFALkUWlpKQwePBgypQpQ1RUFH369CEmJoZGjRrJDneZ6cABaNYMrreWvL0hMBDseE5kumZ9KKXyAf8FygMa+FBrvc5uVQgh7suiRYsIDQ1l7969NGjQgBEjRvDEE09YXZZ78vUFHx+w2UxYJyebz+14TmR6p+eNBn7WWr+rlMoJeNutAiFEuu3fv5/Q0FAWLFiAn58fP//8M6+99prVZYkTJ6BwYRPa1avfbIPYyT2DWimVF3gR+ABAa30FuGLXKoQQd3Xp0iUGDhzIsGHDyJkzJ0OGDKFDhw7kzJnT6tIEQFTUzXnU48bZ/fLpGVGXBBKBb5VSFYFNQAet9aVbn6SUagu0BShevLi96xTCLWmt+f777+ncuTPx8fE0b96cr776isKFC1tdmshE6bmZmB14Bpigta4MXAJ6/PNJWutJWusArXXAo48+aucyhXA/O3bsoE6dOjRp0oQCBQqwevVqpk6dKiHthtIT1PFAvNZ6/bXP52CCWwjhAGfPnqVDhw5UqlSJrVu3Mn78eKKjo6lZs6bVpQmL3DOotdbHgSNKqTLXvlQH2OXQqoRwQzabjSlTpuDn50d4eDgff/wxsbGxtGvXjmzZslldnriT65syrVxpHg7YlCldZyYqpSphpuflBA4ArbXWZ+70fDkzUYj7s2HDBoKDg9mwYQPPPfccY8eOpXLlylaXJdJLa1i3DmJioE2bB7rE3c5MTNf0PK31FkB2cxHCzk6ePEnPnj2ZMmUKhQoVIjIykubNm8uClawiLg6mToXISNi7FwoUgBYtwM6zcWRlohAWSE1NZfTo0fj5+REZGUmXLl3Ys2cPLVq0kJB2dhcvQkQEvPwylCgBvXubOdRTpphVig6YMin7UQuRyZYvX05wcDA7d+7k1VdfZfTo0Tz11FNWlyXuxmYz+0xHRMDcuXDpEpQqBf36mRF0yZIOfXkJaiEcJCwsjH79+t32eyVKlGDevHk0aNBARtDObO9eE85Tp8Lhw2ZpeNOm0KoVPP+8uWmYCdJ1M/F+yc1EIW568cUXOXLkCCdPnsRms9GzZ0+6du2Klx13VxN2dPYszJplAnrdOrN/R926JpwbNrTrrni3yvDNRCHEg1mwYAEbN24kOTmZd955h+HDh1OiRAmryxL/lJoKS5eacP7xR3MIQNmy8NVX0Ly56UFbSIJaCAfYu3cvoaGhLFq0CC8vL7y9vRk3bhyF7LijmrCD7dtNOE+fbk5myZ8fPv7YjJ6rVMm01sa9yKwPIezo4sWL9OzZk/Lly7N69WqGDx9Ovnz5SEpKor8DTv4QDyAxEUaPhmeegaefNh/XqGE2Vjp2DMLDISDAaUIapEcthF1orZk5cyZdu3bl6NGjtGrVipkzZ5KSkvKv53p6enL58mULqnRjKSmwcKEZPS9aZFodzzxjRs5Nm4IT7E90tx61jKiFyKBt27ZRu3ZtmjVrxmOPPcbatWv53//+x8GDB2nWrNmNQ2W9vb0JDAzkoB1P/hB3oTVs3AhBQabH3KgRbNgAoaGm5bFpE4SEOEVI34v0qIV4QGfOnKFPnz6MHz+ehx9+mK+//po2bdrc2JfD19cXHx8fbDYbHh4eJCcn4+PjI31qRzt6FKZNM6PnmBjIlcvM1mjVyszeyJ71Yi/rVSyExdLS0pgyZQq9evXi9OnTtGvXjv79+/PII4/867knTpygcOHC+Pr6Ur16dRLsfPKHuCYpCX74wYTzsmVmgcpzz8HXX8N770G+fFZXmCHSoxbiPvzxxx8EBQWxadMmXnjhBcLDw6lYseJdf6b2tZM/VqxY4fgC3YnWsGaNCefZs+HCBSheHFq2NI/Spa2u8L7IPGohMuj48eP06NGDiIgIChcuzPTp02natKmsKrTCwYNmE6TISLO3Ru7c8O67prVRq9bN08BdiAS1EHdx9epVwsPD6devH5cvX6Z79+58/vnn5MmTx+rS3Mv58zBnjhk9r1plps69/LLZ8/ntt+Ghh6yu0LG01nZ/VKlSRQuR1S1btkz7+/trQL/++ut6z5499/Xzffv21cC/Hn379nVMwa4mNVXrpUu1DgzU2stLa9Daz0/rAQO0jouzujq7A6L1HTJVetRC/ENcXBydO3dm7ty5PPHEE4waNYr69etLmyOz7N59cyOko0fNjcD33zetjerVnWohij1Jj1qIdLh8+TJDhw5l8ODBAHzxxRd06dIFT09PiytzA6dPw8yZJqA3bIBs2aBePRg5Et56C9z8z0CCWrg9rTU//fQToaGhHDp0iMaNGzNs2DCKFy9udWmu7epV+PlnE87z58OVK2ZJ9/Dh0KwZyHzzGySohVvbs2cPHTp0YMmSJZQrV45ff/2Vl19+2eqyXNuWLTc3QkpMNCsDP/vMtDYqVbK6OqckQS3c0oULF/jiiy8YNWoUXl5ejBw5kvbt25MjRw6rS3NNx4+bYI6MhG3bzHFVb71lwrlePZDf+11JUAu3orVm+vTpdOvWjYSEBFq3bs2gQYN47LHHrC7NNYSFmeOp/kkps0ClWjUYNw6aNDFbiop0kaAWbuPPP/8kODiY33//nYCAAObNm0f16tWtLsu19O1rRsjvvGPaGqmpUKSIOVewZUvw97e6wixJglq4vFOnTtG7d2++/vprHnnkEb755hs+/PDDG7vaCTs4csRMp4uIgNhYszqwQAGzOdLLL5tZHOKByd9U4bLS0tKYOHEifn5+TJo0ifbt2xMbG8tHH30kIW0Ply6ZcH7lFXj8cfj8czNTY/JkczpKSgpUqCAhbQfyt1W4pN9//52qVavSrl07KlSowJ9//smYMWN4+OGHrS4ta7PZYMUKaN3ahHLLlmbvjb59Yf9+WLkSPvwQ4uPh3DmQU23sQlofwqUkJCTQrVs3pk2bRtGiRZk5cybvvfeerCrMqH37bm6EFBcHefKYG4KtWkHNmjdXC3p5QXLyzZ+bMME8PD1BTrV5YDKiFi7hypUrDB06FD8/P2bPnk2vXr3YvXs3TZo0kZB+UGfPwqRJ8PzzZsvQL7+EMmVuHgT73//CCy/8fUn3gQNmscr11pK3NwQGmlG3eGAyohZZ3tKlSwkJCWHPnj28+eabjBo1iieffNLqsrKm1FT45RdzU/DHH83o2N8fBg+G5s3NDI678fUFHx/TIvHwMD/v4yOrDDNIglpkWQcPHqRTp0788MMPlCpVigULFvDmm29aXVbWtGPHzdWCCQnwyCPQpo1pbdzvidwnTpgzCn19zSZKcqpNhklQiywnKSmJr776iiFDhuDh4cGAAQPo1KmTbJ50v/76C777zgT05s3mLME33jDh/Oab5qzBBxEVBddOtWHcOLuV684kqEWWobVm3rx5dOrUibi4OJo0acLQoUMpVqyY1aVlHVeuwMKFJpwXLjStjsqVYdQoaNoUCha0ukJxGxLUIkuIiYkhJCSEZcuWUb58eZYvX37jLEJxD1rDpk0mnGfMgFOn4LHHoEMHM3quUMHqCsU9yKwPkWnCwsJQSv3rERYWdsefOX/+PJ07d+bpp58mOjqaMWPG8Oeff0pIp8exYzBkCJQvD1WrwjffQJ06ZiQdHw/Dhtk/pMPCTD975UrzUMo87vJnLO5NTngRmS49p3LbbDamTp1K9+7dOXnyJG3atGHgwIE8+uijmVNkVnX5Mvzwgxk9//KLmX3x7LNm5PzeeyALfpyWnPAinEpKSgoxMTEcP36cQreZtrV582aCgoJYt24d1apVY/78+VStWtWCSrMIreH33004z55tDoItXhx69jQrB/38rK5QZJC0PkSmi4uL49y5c/T/x/Liv/76i08++YSAgAD279/PlClTWLdunYT0nRw6ZJZoly5tFp7MmAENG8Kvv5oFJl9+KSHtIqT1ITKNl5cXybcuL77G09OTYcOG0bt3b86fP09wcDB9+/YlX758mV+ks7twAebMMaPnlSvN1156ybQ2GjWChx6ytj7xwO7W+pARtcg0Bw4coFmzZjd2rvP29qZu3bqULFmSoKAgKleuzNatWxk5cqSE9K3S0mDZMrOnc6FCZtOjY8fgiy/MqPq330xQS0i7rHT3qJVS2YBo4KjWur7jShKuytfXFx8fH2w2G0opkpKS+OWXXyhWrBjff/89jRo1kn05brVnjxk5T51qZmnkzWvCulUrqFHj/lYLiiztfm4mdgBiAB8H1SLcQEJCAnny5OHixYt4eHhQunRpNm3aRO7cua0uzTmcOQMzZ5qAXr/e7JdRr545mfs//zG70Am3k66gVkoVBd4EBgCdHFqRcFmLFy9m165dXLhwgfz587NhwwaeeOIJq8uy3tWrsGSJCeeffjKrBytUMPOcAwNlQyOR7hH1KKAbkOdOT1BKtQXaAhQvXjzDhQnXsX//fjp27Mj8+fMpXbo05cuXJ3/+/BLSW7fe3Ajp5ElzdFW7dqa1UamStDbEDfe8maiUqg+c1FpvutvztNaTtNYBWusAWZQgwGye1Lt3b8qVK8dvv/1GnTp12Lt3Lzt27GDlypXpWpnock6cgJEjTRBXqgRjx5qN93/80dwgHDXK7L0hIS1ukZ4R9fPAf5RSbwCegI9SaprWurljSxNZldaaOXPm0LlzZ44cOUKzZs0YMmQIRe61l7GrSkmB+fPN6HnxYjOLo2pVE9Lvvw/581tdoXBy9wxqrXVPoCeAUqo20EVCWtzJzp07CQ4OZvny5VSsWJHp06fzwgsvWF1W5tMaNmww4TxzprlJWLgwdOliVguWLWt1hSILkSXkwi7Onj1LWFgYY8eOxcfHh3HjxtG2bVuyZ3ezv2Lx8WY6XUSEmV7n5QVvv236znXqyInc4oHc139FWusVwAqHVCKyJJvNRkREBD169CAxMZGPP/6YAQMGUKBAAatLyzyXLsG8eSacf/3VjKZfeAG6doXGjc1RVEJkgJsNd4Q9bdy4keDgYNavX8+zzz7LokWLqFKlitVlZQ6bDVavNuH8/fdw8SKULAl9+pjWhrvPaBF2JUEt7ltiYiI9e/ZkypQpFCxYkIiICJo3b35jabhL278fIiPN49AhyJPHbB/aqpWZveEOvwOR6eRvlUi31NRUxowZQ+nSpYmIiKBTp07ExsbSsmVL1w7pc+fgv/817YwnnzR7bJQuDdOmwfHjMHkyvPjiv0P6+ib6/3y403REYReye55IlxUrVhAcHMyOHTuoW7cuo0ePxt/f3+qyHOf6RkgREab/nJwMTz1lRs7Nm0PRoum/1rPPQkwM7N4tqwzFHcnueeKBxcfH8/777/PSSy9x4cIFoqKiWLJkieuG9M6d0K0bFCtm9tj4+WezW9369bBrF/TocX8hDRAXZ0bl/9h/W4j0khG1uK2UlBSGDx/OgAEDsNlsdO/enW7duuHt7W11afb3119m0/2ICHMIbPbs8PrrZvRcvz7kyvVg1/XyMiPxf/L0NEdmCXELGVGL+7Jw4ULKlSvH559/zmuvvUZMTAxhYWGuFdJXrpizBd9+2yxECQkx7Y6RI+HoUbM5UqNGDx7SAAcOQLNmN3vX3t5mk6WDB+3yFoT7kFkf4oZ9+/YRGhrKwoULeeqpp1i6dCl169a1uiz70Ro2bzYj5xkzzEj6sccgONiMnp9+2r6v5+tr5lDbbCask5PN59KnFvdJglpw6dIlBgwYwPDhw8mZMydDhw4lJCSEnDlzWl2afSQkmBkaERGmB50zJzRoYML5tddMq8NRTpwwI3ZfX6he3dQixH2SoHZjWmtmzZpFly5dOHr0KC1atOCrr77C19fX6tIy7vJlsyNdRAQsXWpGtTVqwIQJ0KQJPPxw5tQRFQW1a5uPx43LnNcULkeC2k1t376d4OBgVq5cSeXKlZk9ezbPPfec1WVljNawdq0J59mzzUyLYsXMTI2WLaFMGasrFOKByM1EN3PmzBlCQkKoXLky27dvZ+LEiWzcuDFrh3RcnFmE4udnVgdOn26OrVq2zKweHDDAmpC+vuBl5UrzkAUv4gHJ9Dw3YbPZmDJlCj179uT06dN8+umnfPHFFzzyyCNWl/ZgLl6EOXPM6HnFCvO12rVN37lRI7O0W4gs5G7T86T14QbWr19PUFAQ0dHR1KxZk/DwcCpVqmR1WffPZoPly004z50LSUlmSXf//uZ07hIlrK5QCIeQ1ocLO3HiBB9++CE1atTg6NGjTJs2jVWrVlkX0g+690VsLHz+uQniV14xNwkDA2HNGvO93r0lpIVr01rb/VGlShUtrHPlyhU9cuRI7ePjo3PkyKG7deumz58/b3VZN/n6ag1at2t35+ecPq31hAla16hhnuvhoXW9elrPmKF1UlLm1SpEJgGi9R0yVXrULua3334jJCSEnTt3Uq9ePUaNGkUZZ5ntcK8l1ampsGSJaW389JM5a7B8edN3btbMzEcWwkXJEnI3cPjwYRo3bkydOnVISkrixx9/ZNGiRc4T0nDnJdULF0Lnzmazo/r1TR/6k0/MvhvbtplzBiWkhRuTm4lZXHJyMsOGDWPgwIEA9O/fn65du+Lp6WlxZbdx65Jqpcwo+uefzXS6HDlMSLdqZTZEcpVVkULYgQR1FqW1Zv78+XTs2JEDBw7w7rvvMmzYMB5//HGrS7uzlBSz10auXOZjMBshhYfD+++DO52zKMR9kKDOgmJjY+nQoQM///wzZcuWZdmyZdSpU8fqsm5Pa9i48eZGSGfOmNFysWKweDGUK2d1hUI4PelRZyEXLlyge/fulC9fnrVr1zJy5Ei2bNninCEdHw+DB0PZsmYzoilToEgR870rV+DIEXOjUFbqCXFPMqLOArTWzJgxg65du3Ls2DE++OADBg8ezGOPPWZ1aX+XlGQ2IYqMNMu3tTZLur/5Bho3hrx5ra5QiCxJgtrJbd26leDgYFavXk1AQABz586lRo0aVpd1k80Gq1eb1sb335ul3SVKmEUoLVtCqVJWVyhElidB7aROnz5N7969mThxIo888gjffPMNH374ofOc9r1/vxk5T51qTix56CEzam7VypzW7Sx1CuECJKidTFpaGpMnT6ZXr16cOXOG9u3b069fPx7OrP2T7+bcOTNqjogwy7eVgjp1zF4bb78NuXNbXaEQLkmC2omsW7eOoKAgNm/ezIsvvkh4eDhP2/t4qPuVlmb6zRERMG+eWVlYpgwMHAjNm5vZG0IIh5KgdgLHjx+ne/fuREZGUqRIEWbMmEGTJk1QSllX1K5dJpynTYNjx8yJKK1bm9ZGtWpmNC2EyBQS1Ba6evUq4eHhhIWFkZKSQs+ePenVqxcPPfSQNQWdOgUzZ5qA3rgRsmUzqwRHj4a33srYidxCiAcmQW2RFi1aMG3atL99bdCgQeTMmZOwzJxXfPUqLFpkwnnBAvN5xYowYoTZl8PZpgAK4YYkqDPZoUOH6Ny5M1FRUZQqVYozZ85w+vRp2rVrx/jx4zOnCK3hzz9NOH/3Hfz1FxQsCEFBprVRsWLm1CGESBfZ5jSTXL58mSFDhjB48GA8PDy4cuUKqamp/3qep6cnly9fdkwRCQlmA6SICNixwyzl/s9/TDi/9prZGEkIYQnZ5tRCWmvmzZtH2bJlCQsLo0GDBuzevZvDhw/TrFmzG/Oivb29CQwM5ODBg/YtIDkZZs2CN94w24h27Wqm0Y0fb4L7++/NrnUS0kI4LWl9ONDu3bvp0KEDS5cupXz58ixfvpzatWvf+L6Pjw82mw0PDw+Sk5Px8fGhUKFCGX9hrWHdOjNynjXLzH8uWhS6dzerBZ96KuOvIYTINBLUDnD+/Hm++OILRo0aRe7cuRkzZgzt2rUje/a//7pPnDhB4cKF8fX1pXr16iQkJGTshePizErByEjYu9dszP/OO6a18dJLZhaHECLrudMZXRl5uOuZiTabTUdGRupChQpppZRu06aNPnHixG2f27dvXw3869G3b9/7e9ELF7T+3/+0fuklc7YgaF2rltZTpmjtTOckCiHuCjkz0fE2b95McHAwa9eupVq1aowdO5aqVas65sVsNlixwrQ25s6FS5fM5kctW0KLFlCypGNeVwjhMHe7mSitjww6deoUn3/+OZMmTeLRRx9lypQptGrVyjGbJ+3da8J56lQ4fNgca9W0qWltPP+8rBYUwkXdM02UUsWUUsuVUruUUjuVUh0yozBnl5aWxoQJE/Dz8+O///0vHTp0YM+ePbRu3Tp9IR0WZoL1n49/LnY5exa+/hqeew78/GDQIPD3N/Ofjx83ez3XrCkhLYQru1NP5PoD8AWeufZxHiAWKHu3n3H1HvXq1at1pUqVNKBfeuklvX379ge/mK+v6Su3a3fza1evar1wodbvvad1rlzm+2XLav3VV1ofPZrxNyCEcDrcpUd9z9aH1joBSLj28QWlVAxQBNjlmP/rcF7Hjh2jW7duTJ8+nWLFijF79mzefffdB9s8ycvLzHG+bsIE88iWDR591IyW8+eHjz82rY0qVWTULISbuq9GqlKqBFAZWH+b77VVSkUrpaITExPtVJ5zuHLlCkOGDKFMmTLMmTOH//u//yMmJobGjRs/+A53Bw6YvTSut0luvU6NGuZIq2PHzAndAQES0kK4sXTfTFRKPQTMBUK11uf/+X2t9SRgEphZH3ar0GJLliwhJCSE2NhY3nrrLUaOHEmpjB4vlZJiFqT8/ruZwQFmYt3zz8MPP0CBAhmuWwjhOtI1olZK5cCE9HStdZRjS3IOBw4coGHDhtSrVw+tNYsWLeKnn3568JDW2mwdGhQEhQtDo0Zmgcqtfv8dxo7NePFCCJdyzxG1Mv+2nwzEaK1HOL4kayUlJTF48GCGDBlC9uzZGTx4MKGhoeR60L2Yjx41m+9HREBMDHh6QsOGpu/8yiuQXWZICiHuLj0p8TzQAtiulNpy7Wu9tNaLHFaVBbTWzJ07l86dO9/YMGnIkCEUKVLk/i+WlGRaGBER5hgrm820NSZNMgfA5stn7/KFEC4sPbM+1gAufSdr165dhISE8Ouvv/L0008zdepUXnzxxfu7iNbmwNeICJg9Gy5cgMcfh88/NysGn3zSMcULIVyeW/+7+9y5c/Tr14/w8HDy5MnD2LFj+eSTT/61edJdHTxoNkGKjDQzOXLnNqPmVq3gxRdvzuoQQogH5JZBbbPZiIyMpEePHpw8eZKPP/6YAQMGUCC9sy3On4c5c8zoedUqM3Xu5ZfNqsK33warzjwUQrgktwvq6OhogoOD+eOPP3j22WdZuHAhVapUufcPpqXBb7+ZcI6KgsuXzZLuAQOgeXMoXtzxxQsh3JLbBHViYiK9evVi8uTJFCxYkIiICJo3b37vfTl27zbhPG0axMebG4GtWplH9eqyEEUI4XAuH9SpqalMnDiR3r17c/HiRTp27EifPn3ImzfvnX/o9GmYOdME9IYNZll3vXrmZO633jJT7IQQIpO4dFCvWrWKoKAgtm/fziuvvMKYMWPw9/e//ZOvXoWffzbhPH8+XLkCFSrA8OFmqbc9jsgSQogH4JJBHR8fT9euXZk5cybFixdnzpw5vPPOO7ffl2PLFhPO330HJ0+aDZHatTOtjUqVpLUhhLCcSwV1SkoKI0aMYMCAAaSmptKnTx+6d++Ot7f335944gRMn24Cets2cwL3W2+ZcH79dTmRWwjhVFwmqBctWkSHDh3Yt28fDRs2ZMSIEZS89Uiq5GTT0oiIMC2OtDSoVg3GjYMmTcyWokII4YSyfFDv27ePjh07smDBAsqUKcOSJUt49dVXzTe1hvXrTTjPnGlOSylSBLp2NasF79SvFkIIJ5Jlg/rSpUsMHDiQYcOGkTNnToYOHUpISAg5c+aEI0fMuYKRkbBnj9mk/+234YMPzMKUbNmsLl8IIdItywW11prZs2fTpUsX4uPjad68OV999RWF8+aFWbPM6Pm338xo+oUXzOi5cWNzEKwQQmRBWSqot2/fTkhICCtWrKBSpUrM/O47nk9LMxsfzZkDFy9CyZLQp49pbTzxhNUlCyFEhmWJoD579ix9+/Zl3Lhx5M2blwn9+vHxlStka9kSDh2CPHngvffMrI2aNWUjJCGES3HqoLbZbHz77bf07NmTU6dO8ckLL/DF5cvk79vXzG+uWxe+/NL0n/85BU8IIVyEcw09ExKgVi04fpwNGzZQo3p1PvroI/y0Jjp7dsavXEn+8+dh0CA4fBiWLIHAQAlpIYRLc6oRdUKPHry/ahXB1arR+MgRfD08mAoEpqaiPvrItDaqVpXVgkIIt+IcQZ0jB6Sm8gWwBih35AgaM8NDzZkD9evDg55ZKIQQWZxTBHUOrUm95fMJ1x7ZPTy42qiRRVUJIYRzcIoe9eEOHWgGXO80ewOBwJHQUMtqEkIIZ+EUQf11njz8BVzGnKJ7GUgEJsqRVkIIgdJa2/2iAQEBOjo6+r5+5p133sHX15e2bdsyadIkEhISiIqKsnttQgjhjJRSm7TWAbf9nrMEtRBCuLO7BbVTtD6EEELcmQS1EEI4OQlqIYRwchLUQgjh5CSohRDCyUlQCyGEk5OgFkIIJ+eQedRKqUQg7gF/vADwlx3LyQrkPbs+d3u/IO/5fj2utX70dt9wSFBnhFIq+k6Tvl2VvGfX527vF+Q925O0PoQQwslJUAshhJNzxqCeZHUBFpD37Prc7f2CvGe7cboetRBCiL9zxhG1EEKIW0hQCyGEk3OaoFZK1VNK7VFK7VNK9bC6nsyglJqilDqplNphdS2ZQSlVTCm1XCm1Sym1UynVweqaHE0p5amU2qCU2nrtPfezuqbMopTKppT6Uym1wOpaMoNS6pBSartSaotSyq4b8jtFj1oplQ2IBeoC8cBGoKnWepelhTmYUupF4CIQqbUub3U9jqaU8gV8tdablVJ5gE1AQ1f+c1ZKKSC31vqiUioHsAbooLX+w+LSHE4p1QkIAHy01vWtrsfRlFKHgACttd0X+TjLiLoasE9rfUBrfQWYCTSwuCaH01qvAk5bXUdm0VonaK03X/v4AhADFLG2KsfSxsVrn+a49rB+dORgSqmiwJvAf62uxRU4S1AXAY7c8nk8Lv4fsLtTSpUAKgPrLS7F4a61ALYAJ4FftNYu/56BUUA3wGZxHZlJA0uVUpuUUm3teWFnCWrhRpRSDwFzgVCt9Xmr63E0rXWa1roSUBSoppRy6TaXUqo+cFJrvcnqWjJZTa31M8DrQPtrrU27cJagPgoUu+Xzote+JlzMtT7tXGC61tqtjpnXWp8FlgP1LC7F0Z4H/nOtZzsTeFkpNc3akhxPa3302v+eBOZhWrp24SxBvREorZQqqZTKCbwP/GRxTcLOrt1YmwzEaK1HWF1PZlBKPaqUynftYy/MDfPdlhblYFrrnlrrolrrEpj/ln/TWje3uCyHUkrlvnaDHKVUbuBVwG6zuZwiqLXWqUAQsARzg2m21nqntVU5nlJqBrAOKKOUildKtbG6Jgd7HmiBGWFtufZ4w+qiHMwXWK6U2oYZkPyitXaL6Wpu5jFgjVJqK7ABWKi1/tleF3eK6XlCCCHuzClG1EIIIe5MgloIIZycBLUQQjg5CWohhHByEtRCCOHkJKiFEMLJSVALIYST+388TUYcEE4rnAAAAABJRU5ErkJggg==\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"colour= {'a':'red','b':'black'}\n",
"plt.figure()\n",
"for key in funcs_test.keys():\n",
" plt.errorbar(x_test[key],[o.value for o in y_test[key]],ls='none',marker='*',color=colour[key],yerr=[o.dvalue for o in y_test[key]],capsize=3,label=key)\n",
" plt.plot([x_val for x_val in x_test[key]],[funcs_test[key](output_test.fit_parameters,x_val) for x_val in x_test[key]],color=colour[key],label='func_'+key)\n",
"plt.legend()\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "3b82d1c6",
"metadata": {},
"outputs": [],
"source": [
"x_const = {'c':list(np.arange(0,10)),'d':list(np.arange(10,20))}\n",
"y_const = {'c':[pe.Obs([np.random.normal(1, val, 1000)],['ensemble1']) \n",
" for val in [0.25,0.3,0.01,0.2,0.5,1.3,0.26,0.4,0.1,1.0]],\n",
" 'd':[pe.Obs([np.random.normal(1, val, 1000)],['ensemble1'])\n",
" for val in [0.5,1.12,0.26,0.25,0.3,0.01,0.2,1.0,0.38,0.1]]}\n",
"for key in y_const.keys():\n",
" [item.gamma_method() for item in y_const[key]]"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "7c1f7950",
"metadata": {},
"outputs": [],
"source": [
"def func_const(a, x):\n",
" return a[0]\n",
"\n",
"funcs_const = {\"c\": func_const,\"d\": func_const}"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "82e0cdb6",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Fit with 1 parameter\n",
"Method: migrad\n",
"Optimization terminated successfully.\n",
"chisquare/d.o.f.: 0.7268201670950173\n",
"fit parameters [0.99968989]\n"
]
}
],
"source": [
"output_const = pe.combined_fits.combined_fit(x_const,y_const,funcs_const,method='migrad')"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "53021f73",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"13.80958317480533"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"output_const.chisquare"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "ab5c5bef",
"metadata": {},
"outputs": [],
"source": [
"output_const.gamma_method()"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "d6abfe4f",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
" chisquare: 13.80958317480533\n",
" chisquare_by_dof: 0.7268201670950173\n",
" dof: 19\n",
" fit_function: {'c': <function func_const at 0x7f3742783378>, 'd': <function func_const at 0x7f3742783378>}\n",
" fit_parameters: [Obs[0.99969(22)]]\n",
" iterations: 15\n",
" message: 'Optimization terminated successfully.'\n",
" method: 'migrad'\n",
" p_value: 0.7946762502119166"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"output_const"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "efd3d4d0",
"metadata": {},
"outputs": [],
"source": [
"y_const_ls = []\n",
"for key in y_const:\n",
" for item in y_const[key]:\n",
" y_const_ls.append(item)"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "57d65824",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[Obs[0.9905(78)], Obs[1.0090(96)], Obs[0.99960(32)], Obs[1.0032(62)], Obs[1.018(18)], Obs[0.988(49)], Obs[1.0084(83)], Obs[1.000(13)], Obs[0.9960(32)], Obs[1.009(34)], Obs[0.990(16)], Obs[0.970(35)], Obs[0.9865(91)], Obs[0.9981(80)], Obs[1.0065(97)], Obs[0.99983(31)], Obs[0.9985(61)], Obs[1.040(32)], Obs[1.011(12)], Obs[0.9966(31)]]\n"
]
}
],
"source": [
"print(y_const_ls)"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "731552bc",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Fit with 1 parameter\n",
"Method: Levenberg-Marquardt\n",
"`ftol` termination condition is satisfied.\n",
"chisquare/d.o.f.: 0.7268201670947627\n"
]
}
],
"source": [
"output_const2 = pe.fits.least_squares(list(np.arange(0,20)),y_const_ls, func_const)"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "019583b5",
"metadata": {},
"outputs": [],
"source": [
"output_const2.gamma_method()"
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "f28a3478",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
" chisquare: 13.809583174800492\n",
" chisquare_by_dof: 0.7268201670947627\n",
" dof: 19\n",
" fit_function: <function func_const at 0x7f3742783378>\n",
" fit_parameters: [Obs[0.99969(22)]]\n",
" iterations: 7\n",
" message: '`ftol` termination condition is satisfied.'\n",
" method: 'Levenberg-Marquardt'\n",
" p_value: 0.7946762502121925"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"output_const2"
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "466cd303",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"colour= {'c':'red','d':'black'}\n",
"plt.figure()\n",
"for key in funcs_const.keys():\n",
" plt.errorbar(x_const[key],[o.value for o in y_const[key]],ls='none',marker='*',\n",
" color=colour[key],yerr=[o.dvalue for o in y_const[key]],capsize=3,label=key)\n",
"plt.plot(np.arange(0,20),[func_const(output_const.fit_parameters,x_val) for x_val in list(np.arange(0,20))],\n",
" label='combined fit',color ='lightblue')\n",
"plt.plot(np.arange(0,20),[func_const(output_const2.fit_parameters,x_val) for x_val in list(np.arange(0,20))],\n",
" label='one fit',color='black',ls='--')\n",
"plt.legend()\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "dd14c5dc",
"metadata": {},
"outputs": [],
"source": [
"def func_const_wrong():\n",
" a=x"
]
},
{
"cell_type": "code",
"execution_count": 22,
"id": "d4e8adbc",
"metadata": {},
"outputs": [],
"source": [
"funcs_const_wrong = {\"c\": 4,\"d\": func_const_wrong}"
]
},
{
"cell_type": "code",
"execution_count": 23,
"id": "27f8d77c",
"metadata": {},
"outputs": [
{
"ename": "TypeError",
"evalue": "func (key=c) is not a function.",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m/tmp/ipykernel_55611/20019894.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0moutput_const2_wrong\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpe\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcombined_fits\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcombined_fit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx_const\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0my_const\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mfuncs_const_wrong\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mmethod\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'migrad'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;32m~/phd/develop_pyerrors/piapyerrors/pyerrors/combined_fits.py\u001b[0m in \u001b[0;36mcombined_fit\u001b[0;34m(x, y, funcs, silent, **kwargs)\u001b[0m\n\u001b[1;32m 71\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mkey\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mfuncs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mkeys\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 72\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mcallable\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfuncs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 73\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mTypeError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'func (key='\u001b[0m\u001b[0;34m+\u001b[0m \u001b[0mkey\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;34m') is not a function.'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 74\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0my\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 75\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mException\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'x and y input (key='\u001b[0m\u001b[0;34m+\u001b[0m \u001b[0mkey\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;34m') do not have the same length'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mTypeError\u001b[0m: func (key=c) is not a function."
]
}
],
"source": [
"output_const2_wrong = pe.combined_fits.combined_fit(x_const,y_const,funcs_const_wrong,method='migrad')"
]
},
{
"cell_type": "code",
"execution_count": 24,
"id": "e7110837",
"metadata": {},
"outputs": [],
"source": [
"x_const_wrong = {'c':list(np.arange(0,11)),'d':list(np.arange(10,20))}"
]
},
{
"cell_type": "code",
"execution_count": 25,
"id": "2dae0db9",
"metadata": {},
"outputs": [
{
"ename": "Exception",
"evalue": "x and y input (key=c) do not have the same length",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mException\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m/tmp/ipykernel_55611/2795677260.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mpe\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcombined_fits\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcombined_fit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx_const_wrong\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0my_const\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mfuncs_const\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mmethod\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'migrad'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;32m~/phd/develop_pyerrors/piapyerrors/pyerrors/combined_fits.py\u001b[0m in \u001b[0;36mcombined_fit\u001b[0;34m(x, y, funcs, silent, **kwargs)\u001b[0m\n\u001b[1;32m 73\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mTypeError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'func (key='\u001b[0m\u001b[0;34m+\u001b[0m \u001b[0mkey\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;34m') is not a function.'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 74\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0my\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 75\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mException\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'x and y input (key='\u001b[0m\u001b[0;34m+\u001b[0m \u001b[0mkey\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;34m') do not have the same length'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 76\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m42\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 77\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mException\u001b[0m: x and y input (key=c) do not have the same length"
]
}
],
"source": [
"pe.combined_fits.combined_fit(x_const_wrong,y_const,funcs_const,method='migrad')"
]
}
],
"metadata": {
"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.7.3"
}
},
"nbformat": 4,
"nbformat_minor": 5
}