{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Populating the interactive namespace from numpy and matplotlib\n" ] } ], "source": [ "%pylab inline" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import os\n", "import pyhf\n", "import pyhf.readxml\n", "from ipywidgets import interact, fixed" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Binned HEP Statistical Analysis in Python\n", "\n", "## HistFactory\n", "\n", "HistFactory is a popular framework to analyze binned event data and commonly used in High Energy Physics. At its core it is a template for building a statistical model from individual binned distribution ('Histograms') and variations on them ('Systematics') that represent auxiliary measurements (for example an energy scale of the detector which affects the shape of a distribution)\n", "\n", "## pyhf\n", "\n", "`pyhf` is a work-in-progress standalone implementation of the HistFactory p.d.f. template and an implementation of the test statistics and asymptotic formulae described in the paper by Cowan, Cranmer, Gross, Vitells: *Asymptotic formulae for likelihood-based tests of new physics* [[arxiv:1007.1727](https://arxiv.org/abs/1007.1727)].\n", "\n", "Models can be defined using JSON specification, but existing models based on the XML + ROOT file scheme are readable as well.\n", "\n", "## The Demo\n", "\n", "The input data for the statistical analysis was built generated using the containerized workflow engine [yadage](https://github.com/diana-hep/yadage) (see demo from KubeCon 2018 [[youtube](https://github.com/diana-hep/yadage)]). Similarly to Binder this utilizes modern container technology for reproducible science. Below you see the execution graph leading up to the model input data at the bottom." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/mcf/miniconda3/envs/pyhf/lib/python3.6/site-packages/ipykernel_launcher.py:3: ResourceWarning: unclosed file <_io.BufferedReader name='workflow.gif'>\n", " This is separate from the ipykernel package so we can avoid doing imports until\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import base64\n", "from IPython.core.display import display, HTML\n", "anim = base64.b64encode(open('workflow.gif','rb').read()).decode('ascii')\n", "HTML(''.format(anim))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Read in the Model from XML and ROOT\n", "\n", "The ROOT files are read using scikit-hep's [uproot](https://github.com/scikit-hep/uproot) module." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "parsed = pyhf.readxml.parse('meas.xml',os.getcwd())\n", "obs_data = parsed['data']['channel1'] " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "From the parsed data, we construct a probability density function (p.d.f). As the model includes systematics a number of implied \"auxiliary measurements\" must be added to the observed data distribution." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "pdf = pyhf.Model({'channels': parsed['channels'], 'parameters': parsed['toplvl']['measurements'][0]['config']['parameters']}, poiname = 'SigXsecOverSM')\n", "data = obs_data + pdf.config.auxdata" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The p.d.f is build from one data-drived \"qcd\" (or multijet) estimate and two Monte Carlo-based background samples and is parametrized by five parameters: One parameter of interest `SigXsecOverSM` and four *nuisance parameters* that affect the shape of the two Monte Carlo background estimates (both weight-only and shape systematics)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Samples:\n", " ['qcd', 'signal', 'mc2', 'mc1']\n", "Parameters:\n", " {'SigXsecOverSM': 0, 'mc1_weight_var1': 1, 'mc1_shape_conv': 2, 'mc2_weight_var1': 3, 'mc2_shape_conv': 4}\n" ] } ], "source": [ "par_name_dict = {k: v['slice'].start for k,v in pdf.config.par_map.items()}\n", "print('Samples:\\n {}'.format(pdf.config.samples))\n", "print('Parameters:\\n {}'.format(par_name_dict))" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "all_par_settings = {n[0]: tuple(m) for n,m in zip(sorted(reversed(list(par_name_dict.items())), key=lambda x:x[1]), pdf.config.suggested_bounds())}\n", "default_par_settings = {n[0]: sum(tuple(m))/2.0 for n,m in all_par_settings.items()}\n", "\n", "def get_mc_counts(pars):\n", " deltas, factors = pdf._modifications(pars)\n", " allsum = pyhf.tensorlib.concatenate(deltas + [pyhf.tensorlib.astensor(pdf.thenom)])\n", " nom_plus_delta = pyhf.tensorlib.sum(allsum,axis=0)\n", " nom_plus_delta = pyhf.tensorlib.reshape(nom_plus_delta,(1,)+pyhf.tensorlib.shape(nom_plus_delta))\n", " allfac = pyhf.tensorlib.concatenate(factors + [nom_plus_delta])\n", " return pyhf.tensorlib.product(allfac,axis=0)\n", "\n", "animate_plot_pieces = None\n", "def init_plot(fig, ax, par_settings):\n", " global animate_plot_pieces\n", " \n", " nbins = sum(list(pdf.config.channel_nbins.values()))\n", " x = np.arange(nbins)\n", " data = np.zeros(nbins)\n", " items = []\n", " for i in [3, 2, 1, 0]:\n", " items.append(ax.bar(x, data, 1, alpha=1.0))\n", " animate_plot_pieces = (items, ax.scatter(x, obs_data, c='k', alpha=1., zorder=99))\n", "\n", "def animate(ax=None, fig=None, **par_settings):\n", " global animate_plot_pieces\n", " items, obs = animate_plot_pieces\n", " pars = pyhf.tensorlib.astensor(pdf.config.suggested_init())\n", " for k,v in par_settings.items():\n", " pars[par_name_dict[k]] = v\n", "\n", " mc_counts = get_mc_counts(pars)\n", " rectangle_collection = zip(*map(lambda x: x.patches, items))\n", " \n", " for rectangles,binvalues in zip(rectangle_collection, mc_counts[:,0].T):\n", " offset = 0\n", " for sample_index in [3, 2, 1, 0]:\n", " rect = rectangles[sample_index]\n", " binvalue = binvalues[sample_index]\n", " rect.set_y(offset)\n", " rect.set_height(binvalue)\n", " offset += rect.get_height()\n", "\n", " fig.canvas.draw()\n", "\n", "def plot(ax=None, order=[3, 2, 1, 0], **par_settings):\n", " pars = pyhf.tensorlib.astensor(pdf.config.suggested_init())\n", " for k,v in par_settings.items():\n", " pars[par_name_dict[k]] = v\n", "\n", " mc_counts = get_mc_counts(pars)\n", " bottom = None\n", " # nb: bar_data[0] because evaluating only one parset\n", " for i,sample_index in enumerate(order):\n", " data = mc_counts[sample_index][0]\n", " x = np.arange(len(data))\n", " ax.bar(x, data, 1, bottom = bottom, alpha = 1.0)\n", " bottom = data if i==0 else bottom + data\n", " ax.scatter(x, obs_data, c = 'k', alpha = 1., zorder=99)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Interactive Exploration of a HistFactory Model\n", "\n", "One advantage of a pure-python implementation of Histfactory is the ability to explore the pdf interactively within the setting of a notebook. Try moving the sliders and oberserve the effect on the samples. For example changing the parameter of interest `SigXsecOverSM` (or µ) controls the overall normalization of the (BSM) signal sample (µ=0 for background-only and µ=1 for the nominal signal-plus-background hypothesis)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "application/javascript": [ "/* Put everything inside the global mpl namespace */\n", "window.mpl = {};\n", "\n", "\n", "mpl.get_websocket_type = function() {\n", " if (typeof(WebSocket) !== 'undefined') {\n", " return WebSocket;\n", " } else if (typeof(MozWebSocket) !== 'undefined') {\n", " return MozWebSocket;\n", " } else {\n", " alert('Your browser does not have WebSocket support.' +\n", " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", " 'Firefox 4 and 5 are also supported but you ' +\n", " 'have to enable WebSockets in about:config.');\n", " };\n", "}\n", "\n", "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", " this.id = figure_id;\n", "\n", " this.ws = websocket;\n", "\n", " this.supports_binary = (this.ws.binaryType != undefined);\n", "\n", " if (!this.supports_binary) {\n", " var warnings = document.getElementById(\"mpl-warnings\");\n", " if (warnings) {\n", " warnings.style.display = 'block';\n", " warnings.textContent = (\n", " \"This browser does not support binary websocket messages. \" +\n", " \"Performance may be slow.\");\n", " }\n", " }\n", "\n", " this.imageObj = new Image();\n", "\n", " this.context = undefined;\n", " this.message = undefined;\n", " this.canvas = undefined;\n", " this.rubberband_canvas = undefined;\n", " this.rubberband_context = undefined;\n", " this.format_dropdown = undefined;\n", "\n", " this.image_mode = 'full';\n", "\n", " this.root = $('
');\n", " this._root_extra_style(this.root)\n", " this.root.attr('style', 'display: inline-block');\n", "\n", " $(parent_element).append(this.root);\n", "\n", " this._init_header(this);\n", " this._init_canvas(this);\n", " this._init_toolbar(this);\n", "\n", " var fig = this;\n", "\n", " this.waiting = false;\n", "\n", " this.ws.onopen = function () {\n", " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", " fig.send_message(\"send_image_mode\", {});\n", " if (mpl.ratio != 1) {\n", " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", " }\n", " fig.send_message(\"refresh\", {});\n", " }\n", "\n", " this.imageObj.onload = function() {\n", " if (fig.image_mode == 'full') {\n", " // Full images could contain transparency (where diff images\n", " // almost always do), so we need to clear the canvas so that\n", " // there is no ghosting.\n", " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", " }\n", " fig.context.drawImage(fig.imageObj, 0, 0);\n", " };\n", "\n", " this.imageObj.onunload = function() {\n", " fig.ws.close();\n", " }\n", "\n", " this.ws.onmessage = this._make_on_message_function(this);\n", "\n", " this.ondownload = ondownload;\n", "}\n", "\n", "mpl.figure.prototype._init_header = function() {\n", " var titlebar = $(\n", " '
');\n", " var titletext = $(\n", " '
');\n", " titlebar.append(titletext)\n", " this.root.append(titlebar);\n", " this.header = titletext[0];\n", "}\n", "\n", "\n", "\n", "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", "\n", "}\n", "\n", "\n", "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", "\n", "}\n", "\n", "mpl.figure.prototype._init_canvas = function() {\n", " var fig = this;\n", "\n", " var canvas_div = $('
');\n", "\n", " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", "\n", " function canvas_keyboard_event(event) {\n", " return fig.key_event(event, event['data']);\n", " }\n", "\n", " canvas_div.keydown('key_press', canvas_keyboard_event);\n", " canvas_div.keyup('key_release', canvas_keyboard_event);\n", " this.canvas_div = canvas_div\n", " this._canvas_extra_style(canvas_div)\n", " this.root.append(canvas_div);\n", "\n", " var canvas = $('');\n", " canvas.addClass('mpl-canvas');\n", " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", "\n", " this.canvas = canvas[0];\n", " this.context = canvas[0].getContext(\"2d\");\n", "\n", " var backingStore = this.context.backingStorePixelRatio ||\n", "\tthis.context.webkitBackingStorePixelRatio ||\n", "\tthis.context.mozBackingStorePixelRatio ||\n", "\tthis.context.msBackingStorePixelRatio ||\n", "\tthis.context.oBackingStorePixelRatio ||\n", "\tthis.context.backingStorePixelRatio || 1;\n", "\n", " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", "\n", " var rubberband = $('');\n", " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", "\n", " var pass_mouse_events = true;\n", "\n", " canvas_div.resizable({\n", " start: function(event, ui) {\n", " pass_mouse_events = false;\n", " },\n", " resize: function(event, ui) {\n", " fig.request_resize(ui.size.width, ui.size.height);\n", " },\n", " stop: function(event, ui) {\n", " pass_mouse_events = true;\n", " fig.request_resize(ui.size.width, ui.size.height);\n", " },\n", " });\n", "\n", " function mouse_event_fn(event) {\n", " if (pass_mouse_events)\n", " return fig.mouse_event(event, event['data']);\n", " }\n", "\n", " rubberband.mousedown('button_press', mouse_event_fn);\n", " rubberband.mouseup('button_release', mouse_event_fn);\n", " // Throttle sequential mouse events to 1 every 20ms.\n", " rubberband.mousemove('motion_notify', mouse_event_fn);\n", "\n", " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", "\n", " canvas_div.on(\"wheel\", function (event) {\n", " event = event.originalEvent;\n", " event['data'] = 'scroll'\n", " if (event.deltaY < 0) {\n", " event.step = 1;\n", " } else {\n", " event.step = -1;\n", " }\n", " mouse_event_fn(event);\n", " });\n", "\n", " canvas_div.append(canvas);\n", " canvas_div.append(rubberband);\n", "\n", " this.rubberband = rubberband;\n", " this.rubberband_canvas = rubberband[0];\n", " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", " this.rubberband_context.strokeStyle = \"#000000\";\n", "\n", " this._resize_canvas = function(width, height) {\n", " // Keep the size of the canvas, canvas container, and rubber band\n", " // canvas in synch.\n", " canvas_div.css('width', width)\n", " canvas_div.css('height', height)\n", "\n", " canvas.attr('width', width * mpl.ratio);\n", " canvas.attr('height', height * mpl.ratio);\n", " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", "\n", " rubberband.attr('width', width);\n", " rubberband.attr('height', height);\n", " }\n", "\n", " // Set the figure to an initial 600x600px, this will subsequently be updated\n", " // upon first draw.\n", " this._resize_canvas(600, 600);\n", "\n", " // Disable right mouse context menu.\n", " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", " return false;\n", " });\n", "\n", " function set_focus () {\n", " canvas.focus();\n", " canvas_div.focus();\n", " }\n", "\n", " window.setTimeout(set_focus, 100);\n", "}\n", "\n", "mpl.figure.prototype._init_toolbar = function() {\n", " var fig = this;\n", "\n", " var nav_element = $('
')\n", " nav_element.attr('style', 'width: 100%');\n", " this.root.append(nav_element);\n", "\n", " // Define a callback function for later on.\n", " function toolbar_event(event) {\n", " return fig.toolbar_button_onclick(event['data']);\n", " }\n", " function toolbar_mouse_event(event) {\n", " return fig.toolbar_button_onmouseover(event['data']);\n", " }\n", "\n", " for(var toolbar_ind in mpl.toolbar_items) {\n", " var name = mpl.toolbar_items[toolbar_ind][0];\n", " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", " var image = mpl.toolbar_items[toolbar_ind][2];\n", " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", "\n", " if (!name) {\n", " // put a spacer in here.\n", " continue;\n", " }\n", " var button = $('');\n", " button.click(method_name, toolbar_event);\n", " button.mouseover(tooltip, toolbar_mouse_event);\n", " nav_element.append(button);\n", " }\n", "\n", " // Add the status bar.\n", " var status_bar = $('');\n", " nav_element.append(status_bar);\n", " this.message = status_bar[0];\n", "\n", " // Add the close button to the window.\n", " var buttongrp = $('
');\n", " var button = $('');\n", " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", " buttongrp.append(button);\n", " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", " titlebar.prepend(buttongrp);\n", "}\n", "\n", "mpl.figure.prototype._root_extra_style = function(el){\n", " var fig = this\n", " el.on(\"remove\", function(){\n", "\tfig.close_ws(fig, {});\n", " });\n", "}\n", "\n", "mpl.figure.prototype._canvas_extra_style = function(el){\n", " // this is important to make the div 'focusable\n", " el.attr('tabindex', 0)\n", " // reach out to IPython and tell the keyboard manager to turn it's self\n", " // off when our div gets focus\n", "\n", " // location in version 3\n", " if (IPython.notebook.keyboard_manager) {\n", " IPython.notebook.keyboard_manager.register_events(el);\n", " }\n", " else {\n", " // location in version 2\n", " IPython.keyboard_manager.register_events(el);\n", " }\n", "\n", "}\n", "\n", "mpl.figure.prototype._key_event_extra = function(event, name) {\n", " var manager = IPython.notebook.keyboard_manager;\n", " if (!manager)\n", " manager = IPython.keyboard_manager;\n", "\n", " // Check for shift+enter\n", " if (event.shiftKey && event.which == 13) {\n", " this.canvas_div.blur();\n", " event.shiftKey = false;\n", " // Send a \"J\" for go to next cell\n", " event.which = 74;\n", " event.keyCode = 74;\n", " manager.command_mode();\n", " manager.handle_keydown(event);\n", " }\n", "}\n", "\n", "mpl.figure.prototype.handle_save = function(fig, msg) {\n", " fig.ondownload(fig, null);\n", "}\n", "\n", "\n", "mpl.find_output_cell = function(html_output) {\n", " // Return the cell and output element which can be found *uniquely* in the notebook.\n", " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", " // IPython event is triggered only after the cells have been serialised, which for\n", " // our purposes (turning an active figure into a static one), is too late.\n", " var cells = IPython.notebook.get_cells();\n", " var ncells = cells.length;\n", " for (var i=0; i= 3 moved mimebundle to data attribute of output\n", " data = data.data;\n", " }\n", " if (data['text/html'] == html_output) {\n", " return [cell, data, j];\n", " }\n", " }\n", " }\n", " }\n", "}\n", "\n", "// Register the function which deals with the matplotlib target/channel.\n", "// The kernel may be null if the page has been refreshed.\n", "if (IPython.notebook.kernel != null) {\n", " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", "}\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "f,(ax1,ax2,ax3) = plt.subplots(1,3, sharey=True, sharex=True)\n", "f.set_size_inches(18,4)\n", "ax1.set_ylim(0,1.5*np.max(obs_data))\n", "ax1.set_title(u'nominal signal + background µ = 1')\n", "plot(ax = ax1, **{k: nominal[v] for k,v in par_name_dict.items()})\n", "\n", "ax2.set_title(u'nominal background-only µ = 0')\n", "plot(ax = ax2, **{k: background_only[v] for k,v in par_name_dict.items()})\n", "\n", "ax3.set_title(u'best fit µ = {:.3g}'.format(best_fit[pdf.config.poi_index]))\n", "plot(ax = ax3, **{k: best_fit[v] for k,v in par_name_dict.items()})" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Interval Estimation (Computing Upper Limits on µ)\n", "\n", "A common task in the statistical evaluation of High Energy Physics data analyses is the estimation of confidence intervals of parameters of interest. The general strategy is to perform a series of hypothesis tests and then *invert* the tests in order to obtain an interval with the correct coverage properties.\n", "\n", "A common figure of merit is a modified p-value, CLs. Here we compute an upper limit based on a series of CLs tests." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "def plot_results(ax, test_mus, cls_obs, cls_exp, test_size=0.05):\n", " ax.plot(mu_tests, cls_obs, c = 'k')\n", " for i,c in zip(range(5),['k','k','k','k','k']):\n", " ax.plot(mu_tests, cls_exp[i], c = c, linestyle = 'dotted' if i!=2 else 'dashed')\n", " ax.fill_between(test_mus,cls_exp[0],cls_exp[-1], facecolor = 'y')\n", " ax.fill_between(test_mus,cls_exp[1],cls_exp[-2], facecolor = 'g')\n", " ax.plot(test_mus,[test_size]*len(test_mus), c = 'r')\n", " ax.set_ylim(0,1)\n", "\n", "def invert_interval(test_mus, cls_obs, cls_exp, test_size = 0.05):\n", " point05cross = {'exp':[],'obs':None}\n", " for cls_exp_sigma in cls_exp:\n", " y_vals = cls_exp_sigma\n", " point05cross['exp'].append(np.interp(test_size, list(reversed(y_vals)), list(reversed(test_mus))))\n", " yvals = cls_obs\n", " point05cross['obs'] = np.interp(test_size, list(reversed(y_vals)), list(reversed(test_mus)))\n", " return point05cross" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "scrolled": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n", "/home/jovyan/pyhf/pyhf/tensor/numpy_backend.py:173: RuntimeWarning: invalid value encountered in log\n", " return n * np.log(lam) - lam - gammaln(n + 1.0)\n" ] }, { "data": { "application/javascript": [ "/* Put everything inside the global mpl namespace */\n", "window.mpl = {};\n", "\n", "\n", "mpl.get_websocket_type = function() {\n", " if (typeof(WebSocket) !== 'undefined') {\n", " return WebSocket;\n", " } else if (typeof(MozWebSocket) !== 'undefined') {\n", " return MozWebSocket;\n", " } else {\n", " alert('Your browser does not have WebSocket support.' +\n", " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", " 'Firefox 4 and 5 are also supported but you ' +\n", " 'have to enable WebSockets in about:config.');\n", " };\n", "}\n", "\n", "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", " this.id = figure_id;\n", "\n", " this.ws = websocket;\n", "\n", " this.supports_binary = (this.ws.binaryType != undefined);\n", "\n", " if (!this.supports_binary) {\n", " var warnings = document.getElementById(\"mpl-warnings\");\n", " if (warnings) {\n", " warnings.style.display = 'block';\n", " warnings.textContent = (\n", " \"This browser does not support binary websocket messages. \" +\n", " \"Performance may be slow.\");\n", " }\n", " }\n", "\n", " this.imageObj = new Image();\n", "\n", " this.context = undefined;\n", " this.message = undefined;\n", " this.canvas = undefined;\n", " this.rubberband_canvas = undefined;\n", " this.rubberband_context = undefined;\n", " this.format_dropdown = undefined;\n", "\n", " this.image_mode = 'full';\n", "\n", " this.root = $('
');\n", " this._root_extra_style(this.root)\n", " this.root.attr('style', 'display: inline-block');\n", "\n", " $(parent_element).append(this.root);\n", "\n", " this._init_header(this);\n", " this._init_canvas(this);\n", " this._init_toolbar(this);\n", "\n", " var fig = this;\n", "\n", " this.waiting = false;\n", "\n", " this.ws.onopen = function () {\n", " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", " fig.send_message(\"send_image_mode\", {});\n", " if (mpl.ratio != 1) {\n", " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", " }\n", " fig.send_message(\"refresh\", {});\n", " }\n", "\n", " this.imageObj.onload = function() {\n", " if (fig.image_mode == 'full') {\n", " // Full images could contain transparency (where diff images\n", " // almost always do), so we need to clear the canvas so that\n", " // there is no ghosting.\n", " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", " }\n", " fig.context.drawImage(fig.imageObj, 0, 0);\n", " };\n", "\n", " this.imageObj.onunload = function() {\n", " fig.ws.close();\n", " }\n", "\n", " this.ws.onmessage = this._make_on_message_function(this);\n", "\n", " this.ondownload = ondownload;\n", "}\n", "\n", "mpl.figure.prototype._init_header = function() {\n", " var titlebar = $(\n", " '
');\n", " var titletext = $(\n", " '
');\n", " titlebar.append(titletext)\n", " this.root.append(titlebar);\n", " this.header = titletext[0];\n", "}\n", "\n", "\n", "\n", "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", "\n", "}\n", "\n", "\n", "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", "\n", "}\n", "\n", "mpl.figure.prototype._init_canvas = function() {\n", " var fig = this;\n", "\n", " var canvas_div = $('
');\n", "\n", " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", "\n", " function canvas_keyboard_event(event) {\n", " return fig.key_event(event, event['data']);\n", " }\n", "\n", " canvas_div.keydown('key_press', canvas_keyboard_event);\n", " canvas_div.keyup('key_release', canvas_keyboard_event);\n", " this.canvas_div = canvas_div\n", " this._canvas_extra_style(canvas_div)\n", " this.root.append(canvas_div);\n", "\n", " var canvas = $('');\n", " canvas.addClass('mpl-canvas');\n", " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", "\n", " this.canvas = canvas[0];\n", " this.context = canvas[0].getContext(\"2d\");\n", "\n", " var backingStore = this.context.backingStorePixelRatio ||\n", "\tthis.context.webkitBackingStorePixelRatio ||\n", "\tthis.context.mozBackingStorePixelRatio ||\n", "\tthis.context.msBackingStorePixelRatio ||\n", "\tthis.context.oBackingStorePixelRatio ||\n", "\tthis.context.backingStorePixelRatio || 1;\n", "\n", " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", "\n", " var rubberband = $('');\n", " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", "\n", " var pass_mouse_events = true;\n", "\n", " canvas_div.resizable({\n", " start: function(event, ui) {\n", " pass_mouse_events = false;\n", " },\n", " resize: function(event, ui) {\n", " fig.request_resize(ui.size.width, ui.size.height);\n", " },\n", " stop: function(event, ui) {\n", " pass_mouse_events = true;\n", " fig.request_resize(ui.size.width, ui.size.height);\n", " },\n", " });\n", "\n", " function mouse_event_fn(event) {\n", " if (pass_mouse_events)\n", " return fig.mouse_event(event, event['data']);\n", " }\n", "\n", " rubberband.mousedown('button_press', mouse_event_fn);\n", " rubberband.mouseup('button_release', mouse_event_fn);\n", " // Throttle sequential mouse events to 1 every 20ms.\n", " rubberband.mousemove('motion_notify', mouse_event_fn);\n", "\n", " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", "\n", " canvas_div.on(\"wheel\", function (event) {\n", " event = event.originalEvent;\n", " event['data'] = 'scroll'\n", " if (event.deltaY < 0) {\n", " event.step = 1;\n", " } else {\n", " event.step = -1;\n", " }\n", " mouse_event_fn(event);\n", " });\n", "\n", " canvas_div.append(canvas);\n", " canvas_div.append(rubberband);\n", "\n", " this.rubberband = rubberband;\n", " this.rubberband_canvas = rubberband[0];\n", " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", " this.rubberband_context.strokeStyle = \"#000000\";\n", "\n", " this._resize_canvas = function(width, height) {\n", " // Keep the size of the canvas, canvas container, and rubber band\n", " // canvas in synch.\n", " canvas_div.css('width', width)\n", " canvas_div.css('height', height)\n", "\n", " canvas.attr('width', width * mpl.ratio);\n", " canvas.attr('height', height * mpl.ratio);\n", " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", "\n", " rubberband.attr('width', width);\n", " rubberband.attr('height', height);\n", " }\n", "\n", " // Set the figure to an initial 600x600px, this will subsequently be updated\n", " // upon first draw.\n", " this._resize_canvas(600, 600);\n", "\n", " // Disable right mouse context menu.\n", " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", " return false;\n", " });\n", "\n", " function set_focus () {\n", " canvas.focus();\n", " canvas_div.focus();\n", " }\n", "\n", " window.setTimeout(set_focus, 100);\n", "}\n", "\n", "mpl.figure.prototype._init_toolbar = function() {\n", " var fig = this;\n", "\n", " var nav_element = $('
')\n", " nav_element.attr('style', 'width: 100%');\n", " this.root.append(nav_element);\n", "\n", " // Define a callback function for later on.\n", " function toolbar_event(event) {\n", " return fig.toolbar_button_onclick(event['data']);\n", " }\n", " function toolbar_mouse_event(event) {\n", " return fig.toolbar_button_onmouseover(event['data']);\n", " }\n", "\n", " for(var toolbar_ind in mpl.toolbar_items) {\n", " var name = mpl.toolbar_items[toolbar_ind][0];\n", " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", " var image = mpl.toolbar_items[toolbar_ind][2];\n", " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", "\n", " if (!name) {\n", " // put a spacer in here.\n", " continue;\n", " }\n", " var button = $('