Skip to content

Instantly share code, notes, and snippets.

@lukasheinrich
Created October 15, 2021 08:11
Show Gist options
  • Save lukasheinrich/d100605d5473ea4bfa0980e4f78b01b3 to your computer and use it in GitHub Desktop.
Save lukasheinrich/d100605d5473ea4bfa0980e4f78b01b3 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Custom Modifiers"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [],
"source": [
"import pyhf\n",
"import pyhf.modifiers\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"import scipy.stats\n",
"from pyhf.parameters import ParamViewer"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'k1': <pyhf.parameters.paramsets.unconstrained object at 0x12addcd30>, 'k2': <pyhf.parameters.paramsets.unconstrained object at 0x12addcd68>}\n",
"['k1', 'k2']\n"
]
}
],
"source": [
"class custom_builder:\n",
" def __init__(self, pdfconfig):\n",
" self.config = pdfconfig\n",
" self.required_parsets = {\n",
" 'k1': [\n",
" {\n",
" 'paramset_type': 'unconstrained',\n",
" 'n_parameters': 1,\n",
" 'is_constrained': False,\n",
" 'is_shared': True,\n",
" 'inits': (1.0,),\n",
" 'bounds': ((-5, 5),),\n",
" 'fixed': False,\n",
" }\n",
" ],\n",
" 'k2': [\n",
" {\n",
" 'paramset_type': 'unconstrained',\n",
" 'n_parameters': 1,\n",
" 'is_constrained': False,\n",
" 'is_shared': True,\n",
" 'inits': (1.0,),\n",
" 'bounds': ((-5, 5),),\n",
" 'fixed': False,\n",
" }\n",
" ]\n",
" }\n",
" self.builder_data = {}\n",
"\n",
" def append(self, key, channel, sample, thismod, defined_samp):\n",
" self.builder_data.setdefault(key, {}).setdefault(sample, {}).setdefault('data', {'mask': []})\n",
" moddata = {'mask': [True if thismod else False] * len(defined_samp['data'])}\n",
" self.builder_data[key][sample]['data']['mask'] += moddata['mask']\n",
"\n",
" def finalize(self):\n",
" return self.builder_data\n",
"\n",
"\n",
"class custom_applicator:\n",
" op_code = 'multiplication'\n",
" name = 'customfunc'\n",
"\n",
" def __init__(\n",
" self, modifiers=None, pdfconfig=None, builder_data=None, batch_size=None\n",
" ):\n",
" self.batch_size = batch_size\n",
" keys = ['customfunc/singlemod']\n",
"\n",
" parfield_shape = (\n",
" (self.batch_size, pdfconfig.npars)\n",
" if self.batch_size\n",
" else (pdfconfig.npars,)\n",
" )\n",
" self.param_viewer = ParamViewer(parfield_shape, pdfconfig.par_map, ['k1','k2'])\n",
" self.mask = [\n",
" [[builder_data[m][s]['data']['mask']] for s in pdfconfig.samples]\n",
" for m in keys\n",
" ]\n",
" self.mask_bool = pyhf.tensorlib.astensor(\n",
" self.mask, dtype=\"bool\"\n",
" )\n",
" self.default = pyhf.tensorlib.ones(\n",
" (1, len(pdfconfig.samples), 1, sum(pdfconfig.channel_nbins.values()))\n",
" )\n",
" \n",
" def compute_function(self,pars):\n",
" k1,k2 = self.param_viewer.get(pars)\n",
" computed = pyhf.tensorlib.astensor([(k1+k2)**2])\n",
" return computed\n",
"\n",
" def apply(self, pars):\n",
" computed = self.compute_function(pars)\n",
" results = pyhf.tensorlib.einsum(\n",
" 'msab,m->msab', self.default, computed\n",
" )\n",
" results_normfactor = pyhf.tensorlib.where(\n",
" self.mask_bool, results, self.default\n",
" )\n",
" return results_normfactor\n",
"\n",
"modifier_set = {\n",
" custom_applicator.name: (custom_builder, custom_applicator)\n",
"}\n",
"modifier_set.update(**pyhf.modifiers.histfactory_set)\n",
"\n",
"m = pyhf.Model(\n",
" {\n",
" 'channels': [\n",
" {\n",
" 'name': 'singlechannel',\n",
" 'samples': [\n",
" {\n",
" 'name': 'signal',\n",
" 'data': [10] * 20,\n",
" 'modifiers': [\n",
" {'name': 'singlemod', 'type': 'customfunc', 'data': None},\n",
" ],\n",
" },\n",
" {'name': 'background', 'data': [300] * 20, 'modifiers': []},\n",
" ],\n",
" }\n",
" ]\n",
" },\n",
" modifier_set=modifier_set,\n",
" poi_name='k1',\n",
" validate=False,\n",
")\n",
"bp = pyhf.tensorlib.astensor(m.config.suggested_init())\n",
"d = m.make_pdf(bp).sample()"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[390. 390. 390. 390. 390. 390. 390. 390. 390. 390. 390. 390. 390. 390.\n",
" 390. 390. 390. 390. 390. 390.]\n"
]
}
],
"source": [
"data = m.expected_actualdata([1.0,2.0]) #function will compute a factoor oof (1+2)^2=9 for the signal sample i.e.e a signal yield of 90\n",
"print(data)"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[1.50000077 1.50000077]\n"
]
}
],
"source": [
"\n",
"init = pyhf.tensorlib.astensor(m.config.suggested_init())\n",
"bestfit = pyhf.infer.mle.fit(data, m, init_pars=init.tolist())\n",
"bestfit #the fitted results are ok.. (1+2)^2 and (1.5+1.5)^2 is just the same / degenerate in this toyo example\n",
"print(bestfit)"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x12ae14828>"
]
},
"execution_count": 38,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAXwAAAD4CAYAAADvsV2wAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAWs0lEQVR4nO3df5BdZX3H8ffHJASDYPixJnE3zYKmauwMAbeIVZkUKgJlDHaUCXYgxXTij9BBx6KoragtVUqVDk7FRkGDoUBEKSlDihFh1JkSXDAEkqismpjN5MfyMyADkvDtH/fZeNns7j137+88n9fMnXvOc57nPt899+aTu+eevUcRgZmZHfxe1uoCzMysORz4ZmaZcOCbmWXCgW9mlgkHvplZJia3ugCAY445Jnp7e1tdhplZR7n//vsfjYiuov3bIvB7e3vp7+9vdRlmZh1F0tZq+vuQjplZJhz4ZmaZcOCbmWXCgW9mlgkHvplZJhz4ZmaZcOCbmWXCgW9mlgkHvplZJg7awF+wYAELFixo+thataruWn/mXOeuRac+17Xo1Llb+Rqtp8KBL2mSpJ9Juj2tHytpnaQBSTdLOiS1T03rA2l7b4Nqb0vt8sRa4+X6XHdqaFt17/AvBjaXrV8BXBURrwWeAJak9iXAE6n9qtTPzMxarFDgS+oB/hL4RloXcCpwS+qyAjgnLS9M66Ttp6X+ZmbWQkXf4f878HHgxbR+NPBkROxN64NAd1ruBrYBpO1Ppf4vIWmppH5J/UNDQxOr3szMCqsY+JLOBnZHxP31nDgilkdEX0T0dXUV/jpnMzObqIgY9wZ8gdI7+C3ATuBZ4AbgUWBy6vMW4M60fCfwlrQ8OfXTeHO86U1vinpauXJlTJ06NYCYM2dOrFy5su3Huu7Omtt15zN3K+uuBOiPChlefivcsfTYLABuT8vfARal5a8BH07Ly4CvpeVFwKpKj1vPwF+5cmVMmzYtgP23adOmFdrJrRrrujtrbtedz9ytrLuIZgb+ccB9wEAK/6mp/dC0PpC2H1fpcesZ+HPmzHnJzh2+zZkzp23Huu7Omtt15zN3K+suoqGB36hbLYE/s3v2qDt0vNvM7tkTHl+vsa2cu1P3WafW7X3muqt5rVSDKgNfpTGt1dfXFxO9pq0k5nzi9v3rg9dcyL49B571M+mILno+9E0Atl5x9vBvLC8Z38yxrZy72rHtss/8XPu5bsd9Vs+6qyXp/ojoK9r/oPtqhemnXIAmT31JmyZPZfopF7Tt2FbO3al1t3Ju153P3K2suxEmt2TWBnrFG/8cgMfWXA37XmDSEV1MP+WC/e3tONZ1d9bcrjufuVtZdyMcdIEPpZ38zIN3AjDzfV/siLGtnLtT627l3K47n7lbWXe9HXSHdMzMbHQOfDOzTDjwzcwy4cA3M8vEQfmhbSu1+kMZa55an+tOfa20sm7vs9octIFfyw7u1Bd0K3/mXOdulU79mTt17k59nYzkQzpmZplw4JuZZcKBb2aWCQe+mVkmHPhmZplw4JuZZaLIRcwPlXSfpAclbZT0udT+LUm/kbQ+3eandkm6WtKApA2STmzwz2BmZgUUOQ//eeDUiHhG0hTgJ5LWpG2XRMQtI/qfCcxNtzcD16R7MzNroYrv8NOVtJ5Jq1PSbbzLsywErk/j7gWmS5pVe6lmZlaLQsfwJU2StB7YDayNiHVp0+XpsM1VkoYv69INbCsbPpjazMyshQoFfkTsi4j5QA9wkqQ/AT4JvB74U+Ao4BPVTCxpqaR+Sf1DQwde89HMzOqrqrN0IuJJ4G7gjIjYkQ7bPA98EzgpddsOzC4b1pPaRj7W8ojoi4i+rq6uCRVvZmbFFTlLp0vS9LT8cuAdwM+Hj8tLEnAO8HAashq4IJ2tczLwVETsaEDtZmZWhSJn6cwCVkiaROk/iFURcbukH0rqAgSsBz6Y+t8BnAUMAM8CF9a9ajMzq1rFwI+IDcAJo7SfOkb/AJbVXpqZmdWT/9LWzCwTDnwzs0w48M3MMuHANzPLhAPfzCwTDnwzs0w48M3MMuHANzPLhAPfzCwTDnwzs0w48M3MMuHANzPLhAPfzCwTDnwzs0w48M3MMuHANzPLhAPfzCwTRa5pe6ik+yQ9KGmjpM+l9mMlrZM0IOlmSYek9qlpfSBt723wz2BmZgUUeYf/PHBqRBwPzAfOSBcnvwK4KiJeCzwBLEn9lwBPpParUj8zM2uxioEfJc+k1SnpFsCpwC2pfQVwTlpemNZJ20+TpHoVbGZmE1PoGL6kSZLWA7uBtcCvgCcjYm/qMgh0p+VuYBtA2v4UcPQoj7lUUr+k/qGhoZp+CDMzq6xQ4EfEvoiYD/QAJwGvr3XiiFgeEX0R0dfV1VXrw5mZWQVVnaUTEU8CdwNvAaZLmpw29QDb0/J2YDZA2v5K4LF6FGtmZhNX5CydLknT0/LLgXcAmykF/3tSt8XAbWl5dVonbf9hREQdazYzswmYXLkLs4AVkiZR+g9iVUTcLmkTcJOkfwZ+Blyb+l8LfFvSAPA4sKgBdZuZWZUqBn5EbABOGKX915SO549sfw54b12qMzOzuvFf2pqZZcKBb2aWCQe+mVkmHPhmZplw4JuZZcKBb2aWCQe+mVkmHPhmZplw4JuZZcKBb2aWCQe+mVkmHPhmZplw4JuZZcKBb2aWCQe+mVkmHPhmZpkoconD2ZLulrRJ0kZJF6f2z0raLml9up1VNuaTkgYk/ULSOxv5A5iZWTFFLnG4F/hYRDwg6XDgfklr07arIuLfyjtLmkfpsoZvBF4N/EDSH0fEvnoWbmZm1an4Dj8idkTEA2n5aUoXMO8eZ8hC4KaIeD4ifgMMMMqlEM3MrLmqOoYvqZfS9W3XpaaLJG2QdJ2kI1NbN7CtbNggo/wHIWmppH5J/UNDQ9VXbmZmVSkc+JJeAXwX+EhE7AGuAV4DzAd2AF+qZuKIWB4RfRHR19XVVc1QMzObgEKBL2kKpbC/ISK+BxARuyJiX0S8CHydPxy22Q7MLhvek9rMzKyFipylI+BaYHNEfLmsfVZZt3cDD6fl1cAiSVMlHQvMBe6rX8lmZjYRRc7SeStwPvCQpPWp7VPAeZLmAwFsAT4AEBEbJa0CNlE6w2eZz9AxM2u9ioEfET8BNMqmO8YZczlweQ11mZlZnfkvbc3MMuHANzPLhAPfzCwTDnwzs0w48M3MMuHANzPLhAPfzCwTDnwzs0w48M3MMuHANzPLhAPfzCwTDnwzs0w48M3MMuHANzPLhAPfzCwTDnwzs0wUucThbEl3S9okaaOki1P7UZLWSnok3R+Z2iXpakkDkjZIOrHRP4SZmVVW5B3+XuBjETEPOBlYJmkecClwV0TMBe5K6wBnUrqO7VxgKXBN3as2M7OqVQz8iNgREQ+k5aeBzUA3sBBYkbqtAM5JywuB66PkXmD6iAuem5lZC1R1DF9SL3ACsA6YERE70qadwIy03A1sKxs2mNrMzKyFCge+pFcA3wU+EhF7yrdFRABRzcSSlkrql9Q/NDRUzVAzM5uAQoEvaQqlsL8hIr6XmncNH6pJ97tT+3ZgdtnwntT2EhGxPCL6IqKvq6trovWbmVlBRc7SEXAtsDkivly2aTWwOC0vBm4ra78gna1zMvBU2aEfMzNrkckF+rwVOB94SNL61PYp4IvAKklLgK3AuWnbHcBZwADwLHBhPQs2M7OJqRj4EfETQGNsPm2U/gEsq7EuMzOrM/+lrZlZJhz4ZmaZcOCbmWXCgW9mlgkHvplZJhz4ZmaZcOCbmWXCgW9mlgkHvplZJhz4ZmaZcOCbmWXCgW9mlgkHvplZJhz4ZmaZcOCbmWXCgW9mlgkHvplZJopc0/Y6SbslPVzW9llJ2yWtT7ezyrZ9UtKApF9IemejCjczs+oUeYf/LeCMUdqvioj56XYHgKR5wCLgjWnMVyVNqlexZmY2cRUDPyJ+BDxe8PEWAjdFxPMR8RtKFzI/qYb6zMysTmo5hn+RpA3pkM+Rqa0b2FbWZzC1HUDSUkn9kvqHhoZqKMPMzIqYaOBfA7wGmA/sAL5U7QNExPKI6IuIvq6urgmWYWZmRU0o8CNiV0Tsi4gXga/zh8M224HZZV17UpuZmbXYhAJf0qyy1XcDw2fwrAYWSZoq6VhgLnBfbSWamVk9TK7UQdKNwALgGEmDwGXAAknzgQC2AB8AiIiNklYBm4C9wLKI2NeQys3MrCoVAz8izhul+dpx+l8OXF5LUWZmVn/+S1szs0w48M3MMuHANzPLhAPfzCwTDnwzs0w48M3MMuHANzPLhAPfzCwTDnwzs0w48M3MMuHANzPLhAPfzCwTDnwzs0w48M3MMuHANzPLhAPfzCwTFQNf0nWSdkt6uKztKElrJT2S7o9M7ZJ0taQBSRskndjI4s3MrLgi7/C/BZwxou1S4K6ImAvcldYBzqR0Hdu5wFLgmvqUaWZmtaoY+BHxI+DxEc0LgRVpeQVwTln79VFyLzB9xAXPzcysRSZ6DH9GROxIyzuBGWm5G9hW1m8wtR1A0lJJ/ZL6h4aGJliGmZkVVfOHthERQExg3PKI6IuIvq6urlrLMDOzCiYa+LuGD9Wk+92pfTswu6xfT2ozM7MWm2jgrwYWp+XFwG1l7Reks3VOBp4qO/RjZmYtNLlSB0k3AguAYyQNApcBXwRWSVoCbAXOTd3vAM4CBoBngQsbULOZmU1AxcCPiPPG2HTaKH0DWFZrUWZmVn/+S1szs0w48M3MMuHANzPLhAPfzCwTDnwzs0w48M3MMuHANzPLhAPfzCwTDnwzs0w48M3MMuHANzPLhAPfzCwTDnwzs0w48M3MMuHANzPLhAPfzCwTFS+AMh5JW4CngX3A3ojok3QUcDPQC2wBzo2IJ2or08zMalWPd/h/HhHzI6IvrV8K3BURc4G70rqZmbVYIw7pLARWpOUVwDkNmMPMzKpUa+AH8H1J90tamtpmRMSOtLwTmDHaQElLJfVL6h8aGqqxDDMzq6SmY/jA2yJiu6RXAWsl/bx8Y0SEpBhtYEQsB5YD9PX1jdrHzMzqp6Z3+BGxPd3vBm4FTgJ2SZoFkO5311qkmZnVbsLv8CUdBrwsIp5Oy6cDnwdWA4uBL6b72yby+C+88AKDg4M899xz4/Zbs2YNk454VVWPvW/BGjZv3jyh8eONDYKtT77AV9Y9wZ7nX6yqJjOzRqvlkM4M4FZJw4/zXxHxv5J+CqyStATYCpw7kQcfHBzk8MMPp7e3lzTHqH73u99xyMzjqnrs3+98kTe84Q0TGj/e2Ijg6KP38HfA5T96rKqazMwabcKBHxG/Bo4fpf0x4LRaigJ47rnnKoZ9u5HE5GlHMGf6o60uxczsAG39l7adFPbDJCE6r24zO/i1deCbmVn91HpaZtPM6vkjdm7fVrfHm9k9mx2Dvx23zw3X/Sff+fZ1PDq0iws/dDFLln2Ue+65h2nTpjFv3ry61WJm1gwdE/g7t29jzidur9vjbb3i7Ip9Vl1/LctvvJUZs7r3t91zzz309vY68M2s4/iQzhj+6ZMfZfC3W/jw+e/l21//Kv/yD5ewvn8dP/7xj7nkkkuYP38+g4ODrS7TzKwwB/4Y/vELV/GqGTP5xqr/4YhXTgdgft+befvb386VV17J+vXr6enpaW2RZmZVcOCbmWXCgW9mlgkHfpUOO+wwnn766VaXYWZWtY45S2dm9+xCZ9ZU83gTcfrpp3PllVdy9dVXc9lll3HczNfWrSYzs0bqmMAf65z5/v5+DqkydH+/c4C+vr6K/db83wYAFp77Phae+z4Ajj/+eDZt2rR/bjOzTuFDOmZmmXDgm5lloq0DP6LzLoQVEQSdV7eZHfzaNvAPPfRQHnvssY4K/Yhg77N72PrkC60uxczsAG37oW1PTw+Dg4NUusD5o48+yqTfV/f/1r49j+6/alW148cbW37FKzOzdtO2gT9lyhSOPfbYiv3mzZtX9Zeqbb3i7P2/OVQ7vpaxZmat1LBDOpLOkPQLSQOSLm3UPGZmVkxDAl/SJOA/gDOBecB5kvx9wmZmLdSod/gnAQMR8euI+D1wE7CwQXOZmVkBasRZMJLeA5wREX+b1s8H3hwRF5X1WQosTauvA35R90LgGKAdryjuuqrXrrW1a13QvrW1a13QvrWNVdeciOgq+iAt+9A2IpYDyxs5h6T+iKj8HQpN5rqq1661tWtd0L61tWtd0L611auuRh3S2Q6UfztZT2ozM7MWaVTg/xSYK+lYSYcAi4DVDZrLzMwKaMghnYjYK+ki4E5gEnBdRGxsxFwVNPSQUQ1cV/XatbZ2rQvat7Z2rQvat7a61NWQD23NzKz9tO136ZiZWX058M3MMtHxgV/pKxwkTZV0c9q+TlJvk+qaLeluSZskbZR08Sh9Fkh6StL6dPtMk2rbIumhNOcBl+1SydVpn22QdGKT6npd2b5YL2mPpI+M6NOUfSbpOkm7JT1c1naUpLWSHkn3R44xdnHq84ikxU2q7UpJP0/P162Spo8xdtznvgF1fVbS9rLn66wxxjb0q1jGqO3msrq2SFo/xthG7rNRc6Jhr7WI6NgbpQ+EfwUcBxwCPAjMG9Hnw8DX0vIi4OYm1TYLODEtHw78cpTaFgC3t2C/bQGOGWf7WcAaQMDJwLoWPbc7Kf1hSdP3GXAKcCLwcFnbvwKXpuVLgStGGXcU8Ot0f2RaPrIJtZ0OTE7LV4xWW5HnvgF1fRb4+wLP9bj/jhtR24jtXwI+04J9NmpONOq11unv8It8hcNCYEVavgU4TZIaXVhE7IiIB9Ly08BmoLvR89bJQuD6KLkXmC5pVpNrOA34VURsbfK8AETEj4DHRzSXv5ZWAOeMMvSdwNqIeDwingDWAmc0uraI+H5E7E2r91L625emGmOfFdHwr2IZr7aUB+cCN9ZzziLGyYmGvNY6PfC7gW1l64McGKr7+6R/EE8BRzeluiQdRjoBWDfK5rdIelDSGklvbFJJAXxf0v0qfcXFSEX2a6MtYux/gK3YZwAzImJHWt4JzBilTzvsu/dT+g1tNJWe+0a4KB1qum6MQxOt3mdvB3ZFxCNjbG/KPhuREw15rXV64Lc9Sa8Avgt8JCL2jNj8AKVDFscDXwH+u0llvS0iTqT0babLJJ3SpHkLUemP9d4FfGeUza3aZy8Rpd+p2+6cZkmfBvYCN4zRpdnP/TXAa4D5wA5Kh07azXmM/+6+4ftsvJyo52ut0wO/yFc47O8jaTLwSuCxZhQnaQqlJ/GGiPjeyO0RsScinknLdwBTJB3T6LoiYnu63w3cSulX6nKt/mqMM4EHImLXyA2t2mfJruFDW+l+9yh9WrbvJP0NcDbw1ykkDlDgua+riNgVEfsi4kXg62PM18p9Nhn4K+Dmsfo0ep+NkRMNea11euAX+QqH1cDwp9fvAX441j+GekrHBa8FNkfEl8foM3P48wRJJ1F6Phr6n5GkwyQdPrxM6cO+h0d0Ww1coJKTgafKfr1shjHfcbVin5Upfy0tBm4bpc+dwOmSjkyHL05PbQ0l6Qzg48C7IuLZMfoUee7rXVf5Zz/vHmO+Vn4Vy18AP4+IwdE2NnqfjZMTjXmtNeKT52beKJ1R8ktKn/J/OrV9ntILH+BQSocGBoD7gOOaVNfbKP0atgFYn25nAR8EPpj6XARspHRWwr3AnzWhruPSfA+muYf3WXldonQBm18BDwF9TXw+D6MU4K8sa2v6PqP0H84O4AVKx0aXUPrs5y7gEeAHwFGpbx/wjbKx70+vtwHgwibVNkDpeO7wa234zLRXA3eM99w3uK5vp9fQBkohNmtkXWn9gH/Hja4ttX9r+LVV1reZ+2ysnGjIa81frWBmlolOP6RjZmYFOfDNzDLhwDczy4QD38wsEw58M7NMOPDNzDLhwDczy8T/A5x75mWpv1YlAAAAAElFTkSuQmCC",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.bar(\n",
" np.arange(20),\n",
" m.expected_actualdata(bestfit),\n",
" alpha=1.0,\n",
" facecolor=None,\n",
" edgecolor='k',\n",
" label='fit',\n",
")\n",
"plt.errorbar(\n",
" np.arange(20),\n",
" data[: m.config.nmaindata],\n",
" yerr=np.sqrt(d[: m.config.nmaindata]),\n",
" marker='o',\n",
" c='k',\n",
" linestyle='',\n",
")\n",
"plt.legend()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"interpreter": {
"hash": "f61c63fc1acc84ad3c625f4bf6c3449e7b07eb32112a8664d99a4ffa47aefafa"
},
"kernelspec": {
"display_name": "Python 3.7.2 64-bit ('pyhfdevenv': venv)",
"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.2"
},
"orig_nbformat": 2
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment