├── data ├── HZZ.root ├── Zmumu.root └── HZZ-objects.root ├── img ├── iminuit.png ├── tshirt.jpg ├── dask-logo.png ├── pyobject.png ├── pypl-2019.png ├── root-logo.png ├── shells-1.png ├── shells-2.png ├── shells-3.png ├── shells-4.png ├── shells-5.png ├── apl-keyboard.jpg ├── apl-timeline.png ├── awkward-logo.png ├── coffea-logo.png ├── cython-logo.png ├── numba-logo.png ├── numpy-logo.png ├── pandas-logo.png ├── scipy-docs.png ├── scipy-logo.png ├── uproot-logo.png ├── 03-cheat-sheet.png ├── arrow-website.png ├── ligo-notebook.png ├── numpy-slicing.png ├── pybind11-logo.png ├── benchmark-games.png ├── commute-by-plane.png ├── github-alice-lin.png ├── github-cmssw-lin.png ├── numerical-recipes.jpg ├── scikit-hep-page.png ├── scikit-learn-logo.png ├── swallows-coconut.jpg ├── abstraction-layers.png ├── numpy-memory-layout.png ├── scikit-learn-estimators.png ├── numpy-memory-broadcasting.png ├── root-spark-pandas-google-trends.png ├── mentions-of-programming-languages.png ├── python-r-cpp-googletrends-dataset.png └── python-r-cpp-googletrends-machinelearning.png ├── .gitignore ├── environment.yml ├── LICENSE ├── README.md └── 02-histograms.ipynb /data/HZZ.root: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpivarski-talks/2019-07-29-dpf-python/HEAD/data/HZZ.root -------------------------------------------------------------------------------- /data/Zmumu.root: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpivarski-talks/2019-07-29-dpf-python/HEAD/data/Zmumu.root -------------------------------------------------------------------------------- /img/iminuit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpivarski-talks/2019-07-29-dpf-python/HEAD/img/iminuit.png -------------------------------------------------------------------------------- /img/tshirt.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpivarski-talks/2019-07-29-dpf-python/HEAD/img/tshirt.jpg -------------------------------------------------------------------------------- /img/dask-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpivarski-talks/2019-07-29-dpf-python/HEAD/img/dask-logo.png -------------------------------------------------------------------------------- /img/pyobject.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpivarski-talks/2019-07-29-dpf-python/HEAD/img/pyobject.png -------------------------------------------------------------------------------- /img/pypl-2019.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpivarski-talks/2019-07-29-dpf-python/HEAD/img/pypl-2019.png -------------------------------------------------------------------------------- /img/root-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpivarski-talks/2019-07-29-dpf-python/HEAD/img/root-logo.png -------------------------------------------------------------------------------- /img/shells-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpivarski-talks/2019-07-29-dpf-python/HEAD/img/shells-1.png -------------------------------------------------------------------------------- /img/shells-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpivarski-talks/2019-07-29-dpf-python/HEAD/img/shells-2.png -------------------------------------------------------------------------------- /img/shells-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpivarski-talks/2019-07-29-dpf-python/HEAD/img/shells-3.png -------------------------------------------------------------------------------- /img/shells-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpivarski-talks/2019-07-29-dpf-python/HEAD/img/shells-4.png -------------------------------------------------------------------------------- /img/shells-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpivarski-talks/2019-07-29-dpf-python/HEAD/img/shells-5.png -------------------------------------------------------------------------------- /img/apl-keyboard.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpivarski-talks/2019-07-29-dpf-python/HEAD/img/apl-keyboard.jpg -------------------------------------------------------------------------------- /img/apl-timeline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpivarski-talks/2019-07-29-dpf-python/HEAD/img/apl-timeline.png -------------------------------------------------------------------------------- /img/awkward-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpivarski-talks/2019-07-29-dpf-python/HEAD/img/awkward-logo.png -------------------------------------------------------------------------------- /img/coffea-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpivarski-talks/2019-07-29-dpf-python/HEAD/img/coffea-logo.png -------------------------------------------------------------------------------- /img/cython-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpivarski-talks/2019-07-29-dpf-python/HEAD/img/cython-logo.png -------------------------------------------------------------------------------- /img/numba-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpivarski-talks/2019-07-29-dpf-python/HEAD/img/numba-logo.png -------------------------------------------------------------------------------- /img/numpy-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpivarski-talks/2019-07-29-dpf-python/HEAD/img/numpy-logo.png -------------------------------------------------------------------------------- /img/pandas-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpivarski-talks/2019-07-29-dpf-python/HEAD/img/pandas-logo.png -------------------------------------------------------------------------------- /img/scipy-docs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpivarski-talks/2019-07-29-dpf-python/HEAD/img/scipy-docs.png -------------------------------------------------------------------------------- /img/scipy-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpivarski-talks/2019-07-29-dpf-python/HEAD/img/scipy-logo.png -------------------------------------------------------------------------------- /img/uproot-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpivarski-talks/2019-07-29-dpf-python/HEAD/img/uproot-logo.png -------------------------------------------------------------------------------- /data/HZZ-objects.root: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpivarski-talks/2019-07-29-dpf-python/HEAD/data/HZZ-objects.root -------------------------------------------------------------------------------- /img/03-cheat-sheet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpivarski-talks/2019-07-29-dpf-python/HEAD/img/03-cheat-sheet.png -------------------------------------------------------------------------------- /img/arrow-website.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpivarski-talks/2019-07-29-dpf-python/HEAD/img/arrow-website.png -------------------------------------------------------------------------------- /img/ligo-notebook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpivarski-talks/2019-07-29-dpf-python/HEAD/img/ligo-notebook.png -------------------------------------------------------------------------------- /img/numpy-slicing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpivarski-talks/2019-07-29-dpf-python/HEAD/img/numpy-slicing.png -------------------------------------------------------------------------------- /img/pybind11-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpivarski-talks/2019-07-29-dpf-python/HEAD/img/pybind11-logo.png -------------------------------------------------------------------------------- /img/benchmark-games.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpivarski-talks/2019-07-29-dpf-python/HEAD/img/benchmark-games.png -------------------------------------------------------------------------------- /img/commute-by-plane.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpivarski-talks/2019-07-29-dpf-python/HEAD/img/commute-by-plane.png -------------------------------------------------------------------------------- /img/github-alice-lin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpivarski-talks/2019-07-29-dpf-python/HEAD/img/github-alice-lin.png -------------------------------------------------------------------------------- /img/github-cmssw-lin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpivarski-talks/2019-07-29-dpf-python/HEAD/img/github-cmssw-lin.png -------------------------------------------------------------------------------- /img/numerical-recipes.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpivarski-talks/2019-07-29-dpf-python/HEAD/img/numerical-recipes.jpg -------------------------------------------------------------------------------- /img/scikit-hep-page.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpivarski-talks/2019-07-29-dpf-python/HEAD/img/scikit-hep-page.png -------------------------------------------------------------------------------- /img/scikit-learn-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpivarski-talks/2019-07-29-dpf-python/HEAD/img/scikit-learn-logo.png -------------------------------------------------------------------------------- /img/swallows-coconut.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpivarski-talks/2019-07-29-dpf-python/HEAD/img/swallows-coconut.jpg -------------------------------------------------------------------------------- /img/abstraction-layers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpivarski-talks/2019-07-29-dpf-python/HEAD/img/abstraction-layers.png -------------------------------------------------------------------------------- /img/numpy-memory-layout.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpivarski-talks/2019-07-29-dpf-python/HEAD/img/numpy-memory-layout.png -------------------------------------------------------------------------------- /img/scikit-learn-estimators.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpivarski-talks/2019-07-29-dpf-python/HEAD/img/scikit-learn-estimators.png -------------------------------------------------------------------------------- /img/numpy-memory-broadcasting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpivarski-talks/2019-07-29-dpf-python/HEAD/img/numpy-memory-broadcasting.png -------------------------------------------------------------------------------- /img/root-spark-pandas-google-trends.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpivarski-talks/2019-07-29-dpf-python/HEAD/img/root-spark-pandas-google-trends.png -------------------------------------------------------------------------------- /img/mentions-of-programming-languages.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpivarski-talks/2019-07-29-dpf-python/HEAD/img/mentions-of-programming-languages.png -------------------------------------------------------------------------------- /img/python-r-cpp-googletrends-dataset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpivarski-talks/2019-07-29-dpf-python/HEAD/img/python-r-cpp-googletrends-dataset.png -------------------------------------------------------------------------------- /img/python-r-cpp-googletrends-machinelearning.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpivarski-talks/2019-07-29-dpf-python/HEAD/img/python-r-cpp-googletrends-machinelearning.png -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .ipynb_checkpoints 2 | COPYOVER*.ipynb 3 | tmp.parquet 4 | tmp.root 5 | cpp_calculate.cpp 6 | cpp_calculate.cpython*.so 7 | global.lock 8 | mydask.png 9 | purge.lock 10 | worker-* 11 | output.root 12 | -------------------------------------------------------------------------------- /environment.yml: -------------------------------------------------------------------------------- 1 | name: dpf-python 2 | channels: 3 | - conda-forge 4 | dependencies: 5 | - numpy<1.17.0 # technically fixed in awkward 0.12.4, but I don't want to rock the boat 6 | - awkward==0.12.3 # before committing a lot of things; again, for safety 7 | - uproot 8 | - pandas 9 | - matplotlib 10 | - iminuit 11 | - scikit-learn 12 | - numba 13 | - dask 14 | - python-graphviz 15 | - cython 16 | - pybind11 17 | - root 18 | - h5py 19 | - pyarrow 20 | - pip 21 | - pip: 22 | - pyjet 23 | - particle 24 | - pyhf 25 | - root_numpy 26 | - coffea==0.6.6 # requested by Nick 27 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | BSD 3-Clause License 2 | 3 | Copyright (c) 2019, Jim Pivarski 4 | All rights reserved. 5 | 6 | Redistribution and use in source and binary forms, with or without 7 | modification, are permitted provided that the following conditions are met: 8 | 9 | 1. Redistributions of source code must retain the above copyright notice, this 10 | list of conditions and the following disclaimer. 11 | 12 | 2. Redistributions in binary form must reproduce the above copyright notice, 13 | this list of conditions and the following disclaimer in the documentation 14 | and/or other materials provided with the distribution. 15 | 16 | 3. Neither the name of the copyright holder nor the names of its 17 | contributors may be used to endorse or promote products derived from 18 | this software without specific prior written permission. 19 | 20 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 21 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 23 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 24 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 26 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 27 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 28 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 2019-07-29-dpf-python 2 | 3 | Tutorials for the [IRIS-HEP tutorial at APS DPF](https://indico.cern.ch/event/782953/sessions/302485/#20190729), July 29, 2019, 2‒6pm in Shillman 425, Northeastern University. 4 | 5 | ## How to participate 6 | 7 | The preferred way to participate is to run the JupyterLab code with us, altering examples and asking us "what if" questions as we go along, as well as using the notebooks as starting points for the five-minute exercises. 8 | 9 | You can run all of these notebooks on a public cloud service called Binder: 10 | 11 |

12 | 13 | Launch Binder 14 | 15 |

16 | 17 | Navigate in the JupyterLab file view (left sidebar) to the desired lesson. Note that Binder cannot save data permanently (reloading your web browser will take you to a new instance), and it may take a minute or two to start up. 18 | 19 | ## Running everything on your own computer 20 | 21 | Alternatively, you might want to follow along using your own computer so that you can save data and have copies of the software after the tutorial. If you want a copy of all software packages (a few GB) and you have a non-Windows computer, install [conda](https://docs.conda.io/en/latest/miniconda.html) and [git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git) and clone this repository: 22 | 23 | ```bash 24 | git clone https://github.com/jpivarski/2019-07-29-dpf-python.git 25 | cd 2019-07-29-dpf-python 26 | ``` 27 | 28 | Then use 29 | 30 | ```bash 31 | conda env create -f environment.yml 32 | ``` 33 | 34 | to install nearly everything in an isolated environment named `dpf-python`. You can delete this without affecting anything else with the command `conda remove --name dpf-python --all`. 35 | 36 | To _use_ the software, you have to enter the isolated environment. Type 37 | 38 | ```bash 39 | conda activate dpf-python 40 | ``` 41 | 42 | to enter the environment (and exit it by closing the terminal or `conda deactivate`). One additional package, JupyterLab, must be installed manually in the isolated environment: 43 | 44 | ```bash 45 | conda install jupyterlab 46 | ``` 47 | 48 | Start JupyterLab by typing 49 | 50 | ```bash 51 | jupyter lab 52 | ``` 53 | 54 | A web browser tab should open with the same environment as the Binder site above, or a URL will be provided that you can copy-paste into a web browser. However, the software will be running on your computer. 55 | 56 | ## Cherry-picking software packages or manually installing 57 | 58 | Chances are, you won't want to install _everything_ defined by `environment.yml`, only the packages most relevant to your work. They can be installed individually with pip or conda. There are, however, a few constraints: 59 | 60 | * ROOT can be installed with conda on Macs and UNIX-like computers (e.g. Linux), but not with conda on Windows and not with pip. You can install ROOT manually, but be sure to install the latest version, [release 6.18/00](https://root.cern/content/release-61800) to get the `RDataFrame.AsNumpy` feature. Also, interaction between ROOT and Python might not work if the compile-time and runtime versions of Python differ. Note that conda installs a custom Python version and pip doesn't. 61 | * We do very little with `root-numpy`, but if you install this package, it should be with pip and it should be after ROOT and Python are already installed because it compiles against both of them. 62 | * The tutorial examples use Python [f-strings](https://realpython.com/python-f-strings/) for formatting; these require at least Python 3.6. None of the exercises have been tested with Python 2, though most of the software described in this tutorial will support Python 2.7 until it reaches its end of life in December 2019. 63 | -------------------------------------------------------------------------------- /02-histograms.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "




\n", 8 | "\n", 9 | "# Histograms in Scientific Python\n", 10 | "\n", 11 | "




" 12 | ] 13 | }, 14 | { 15 | "cell_type": "markdown", 16 | "metadata": {}, 17 | "source": [ 18 | "


\n", 19 | "\n", 20 | "In scientific python, histograms seem to be considered as a plot style, on equal footing with, e.g. scatter plots.\n", 21 | "It may well be that HEP is the only place where users predominantly work with *pre-binned* data, and thus must use histograms as persistent objects representing reduced data. This notebook will discuss a few ways that such objects can be manipulated.\n", 22 | "\n", 23 | "A histogram object roughly goes through three stages in its life:\n", 24 | " - Filling\n", 25 | " - Transformation\n", 26 | " - Plotting\n", 27 | "\n", 28 | "


" 29 | ] 30 | }, 31 | { 32 | "cell_type": "markdown", 33 | "metadata": {}, 34 | "source": [ 35 | "




\n", 36 | "\n", 37 | "### 1. Filling\n", 38 | "\n", 39 | "




" 40 | ] 41 | }, 42 | { 43 | "cell_type": "markdown", 44 | "metadata": {}, 45 | "source": [ 46 | "



\n", 47 | "\n", 48 | "Let's explore what solutions for filling histograms exist within numpy. We'll use a random distribution [near and dear](https://en.wikipedia.org/wiki/ARGUS_distribution) to of b and c factory physicists as a test case.\n", 49 | "\n", 50 | "



" 51 | ] 52 | }, 53 | { 54 | "cell_type": "code", 55 | "execution_count": 1, 56 | "metadata": {}, 57 | "outputs": [ 58 | { 59 | "name": "stdout", 60 | "output_type": "stream", 61 | "text": [ 62 | "(array([ 21, 52, 71, 97, 122, 140, 149, 125, 139, 84]), array([0.04036875, 0.13567467, 0.23098059, 0.32628651, 0.42159243,\n", 63 | " 0.51689835, 0.61220427, 0.70751019, 0.80281611, 0.89812203,\n", 64 | " 0.99342795]))\n" 65 | ] 66 | } 67 | ], 68 | "source": [ 69 | "import numpy as np\n", 70 | "from scipy.stats import argus\n", 71 | "\n", 72 | "vals = argus(chi=.5).rvs(size=1000)\n", 73 | "\n", 74 | "h = np.histogram(vals)\n", 75 | "print(h)" 76 | ] 77 | }, 78 | { 79 | "cell_type": "markdown", 80 | "metadata": {}, 81 | "source": [ 82 | "


\n", 83 | "\n", 84 | "So we're done, right?\n", 85 | "\n", 86 | "
\n", 87 | "\n", 88 | "Probably not: we have to analyze _O(1 billion)_ events, not _O(1000)_, and probably need to use some map-reduce paradigm to fill the histogram because we can't keep all 1 billion `vals` in memory. So we need two things: a pre-specified binning (so that all histograms that were independently created can be added) and the ability to add two histograms.\n", 89 | "\n", 90 | "


" 91 | ] 92 | }, 93 | { 94 | "cell_type": "code", 95 | "execution_count": 2, 96 | "metadata": {}, 97 | "outputs": [], 98 | "source": [ 99 | "def add_histos(h1, h2):\n", 100 | " h1sumw, h1binning = h1\n", 101 | " h2sumw, h2binning = h2\n", 102 | " if np.array_equal(h1binning, h2binning):\n", 103 | " return h1sumw+h2sumw, h1binning\n", 104 | " else:\n", 105 | " raise ValueError(\"The histograms have inconsistent binning\")" 106 | ] 107 | }, 108 | { 109 | "cell_type": "code", 110 | "execution_count": 3, 111 | "metadata": {}, 112 | "outputs": [ 113 | { 114 | "name": "stdout", 115 | "output_type": "stream", 116 | "text": [ 117 | "(array([ 0, 2, 6, 12, 8, 6, 18, 12, 24, 18, 30, 34, 22, 22, 40, 36, 24,\n", 118 | " 46, 34, 52, 58, 46, 54, 38, 54, 60, 76, 56, 62, 56, 52, 50, 64, 86,\n", 119 | " 78, 56, 50, 40, 52, 50, 72, 66, 54, 56, 38, 44, 24, 48, 14]), array([0. , 0.02040816, 0.04081633, 0.06122449, 0.08163265,\n", 120 | " 0.10204082, 0.12244898, 0.14285714, 0.16326531, 0.18367347,\n", 121 | " 0.20408163, 0.2244898 , 0.24489796, 0.26530612, 0.28571429,\n", 122 | " 0.30612245, 0.32653061, 0.34693878, 0.36734694, 0.3877551 ,\n", 123 | " 0.40816327, 0.42857143, 0.44897959, 0.46938776, 0.48979592,\n", 124 | " 0.51020408, 0.53061224, 0.55102041, 0.57142857, 0.59183673,\n", 125 | " 0.6122449 , 0.63265306, 0.65306122, 0.67346939, 0.69387755,\n", 126 | " 0.71428571, 0.73469388, 0.75510204, 0.7755102 , 0.79591837,\n", 127 | " 0.81632653, 0.83673469, 0.85714286, 0.87755102, 0.89795918,\n", 128 | " 0.91836735, 0.93877551, 0.95918367, 0.97959184, 1. ]))\n" 129 | ] 130 | } 131 | ], 132 | "source": [ 133 | "vals2 = argus(chi=.5).rvs(size=1000)\n", 134 | "\n", 135 | "binning = np.linspace(0, 1, 50)\n", 136 | "h1 = np.histogram(vals, bins=binning)\n", 137 | "h2 = np.histogram(vals, bins=binning)\n", 138 | "\n", 139 | "h = add_histos(h1, h2)\n", 140 | "print(h)" 141 | ] 142 | }, 143 | { 144 | "cell_type": "markdown", 145 | "metadata": {}, 146 | "source": [ 147 | "




\n", 148 | "\n", 149 | "So now we have all the code ingredients we need to make our own version of a ROOT TH1, from a filling perspective.\n", 150 | "\n", 151 | "




" 152 | ] 153 | }, 154 | { 155 | "cell_type": "code", 156 | "execution_count": 4, 157 | "metadata": {}, 158 | "outputs": [], 159 | "source": [ 160 | "class myTH1:\n", 161 | " def __init__(self, binning):\n", 162 | " self._binning = binning\n", 163 | " self._sumw = np.zeros(binning.size - 1)\n", 164 | " \n", 165 | " def fill(self, values, weights=None):\n", 166 | " sumw, _ = np.histogram(values, bins=self._binning, weights=weights)\n", 167 | " self._sumw += sumw\n", 168 | " \n", 169 | " def __add__(self, other):\n", 170 | " if not isinstance(other, myTH1):\n", 171 | " raise ValueError\n", 172 | " if not np.array_equal(other._binning, self._binning):\n", 173 | " raise ValueError(\"The histograms have inconsistent binning\")\n", 174 | " out = myTH1(self._binning)\n", 175 | " out._sumw = self._sumw + other._sumw\n", 176 | " return out" 177 | ] 178 | }, 179 | { 180 | "cell_type": "code", 181 | "execution_count": 5, 182 | "metadata": {}, 183 | "outputs": [ 184 | { 185 | "name": "stdout", 186 | "output_type": "stream", 187 | "text": [ 188 | "[ 0. 5. 6. 10. 12. 10. 22. 17. 23. 19. 26. 27. 22. 23. 35. 35. 23. 42.\n", 189 | " 44. 55. 48. 38. 54. 34. 48. 53. 75. 59. 55. 56. 64. 58. 64. 70. 78. 56.\n", 190 | " 56. 52. 58. 53. 56. 61. 61. 56. 45. 44. 27. 49. 16.]\n" 191 | ] 192 | } 193 | ], 194 | "source": [ 195 | "binning = np.linspace(0, 1, 50)\n", 196 | "\n", 197 | "h1 = myTH1(binning)\n", 198 | "h1.fill(vals)\n", 199 | "\n", 200 | "h2 = myTH1(binning)\n", 201 | "h2.fill(vals2)\n", 202 | "\n", 203 | "h = h1 + h2\n", 204 | "print(h._sumw)" 205 | ] 206 | }, 207 | { 208 | "cell_type": "markdown", 209 | "metadata": {}, 210 | "source": [ 211 | "

\n", 212 | "\n", 213 | "**Homework:** add `sumw2` support.\n", 214 | "\n", 215 | "
\n", 216 | "\n", 217 | "Of course, we might want multidimensional histograms. There is `np.histogram2d` and even `np.histogramdd`:\n", 218 | "\n", 219 | "```python\n", 220 | "xyz = np.random.multivariate_normal(mean=[1, 3, 7], cov=np.eye(3), size=10000)\n", 221 | "\n", 222 | "binning = np.linspace(-10, 10, 20)\n", 223 | "hnumpy = np.histogramdd(xyz, bins=(binning, binning, binning))\n", 224 | "```\n", 225 | "\n", 226 | "This is the extent of native numpy histogram filling support.\n", 227 | "\n", 228 | "

" 229 | ] 230 | }, 231 | { 232 | "cell_type": "markdown", 233 | "metadata": {}, 234 | "source": [ 235 | "
\n", 236 | "\n", 237 | "There are many histogramming libraries based on the scientific python stack that implement extended features for filling. A non-exhaustive list:\n", 238 | " - [fast-histogram](https://github.com/astrofrog/fast-histogram)\n", 239 | " - [physt](https://github.com/janpipek/physt)\n", 240 | " - [histbook](https://github.com/scikit-hep/histbook) (_deprecated_)\n", 241 | " - [coffea.hist](https://github.com/CoffeaTeam/coffea)\n", 242 | " - [boost-histogram](https://github.com/scikit-hep/boost-histogram) (_in beta_)\n", 243 | " \n", 244 | "The extensions (with respect to filling) focus to varying degrees on:\n", 245 | " - speed\n", 246 | " - improved book-keeping of variables\n", 247 | " - support for additional axis types beyond binned real-valued axes\n", 248 | " - support for additional accumulators beyond \\$\\sum w_i\\$\n", 249 | " \n", 250 | "Below, we demonstrate filling with the [coffea histogram](https://coffeateam.github.io/coffea/stubs/coffea.hist.hist_tools.Hist.html) object. The syntax is quite similar for [boost-histogram](https://boost-histogram.readthedocs.io/en/latest/usage/quickstart.html#making-a-histogram) as well.\n", 251 | "\n", 252 | "
" 253 | ] 254 | }, 255 | { 256 | "cell_type": "code", 257 | "execution_count": 6, 258 | "metadata": {}, 259 | "outputs": [ 260 | { 261 | "name": "stdout", 262 | "output_type": "stream", 263 | "text": [ 264 | "\n" 265 | ] 266 | } 267 | ], 268 | "source": [ 269 | "import coffea.hist as hist\n", 270 | "\n", 271 | "h = hist.Hist(\"Counts\",\n", 272 | " hist.Cat(\"sample\", \"sample name\"),\n", 273 | " hist.Bin(\"x\", \"x position [cm]\", 20, -10, 10),\n", 274 | " hist.Bin(\"y\", \"y position [cm]\", 20, -10, 10),\n", 275 | " hist.Bin(\"z\", \"z position [cm]\", 20, -10, 10),\n", 276 | " )\n", 277 | "\n", 278 | "xyz = np.random.multivariate_normal(mean=[1, 3, 7], cov=np.eye(3), size=10000)\n", 279 | "h.fill(sample=\"sample 1\", x=xyz[:,0], y=xyz[:,1], z=xyz[:,2])\n", 280 | "\n", 281 | "# suppose we have another sample of xyz values\n", 282 | "xyz_sample2 = np.random.multivariate_normal(mean=[1, 3, 7], cov=np.eye(3), size=10000)\n", 283 | "\n", 284 | "# additionally, lets assume entries in sample 2 have some complicated weight associated\n", 285 | "weight = np.arctan(np.sqrt(np.power(xyz_sample2, 2).sum(axis=1)))\n", 286 | "\n", 287 | "h.fill(sample=\"sample 2\", # each variable is specified as a keyword argument\n", 288 | " x=xyz_sample2[:,0],\n", 289 | " y=xyz_sample2[:,1],\n", 290 | " z=xyz_sample2[:,2],\n", 291 | " weight=weight # weight is a reserved keyword in Hist\n", 292 | " )\n", 293 | "\n", 294 | "print(h)" 295 | ] 296 | }, 297 | { 298 | "cell_type": "markdown", 299 | "metadata": {}, 300 | "source": [ 301 | "




\n", 302 | "\n", 303 | "### 2. Transformation\n", 304 | "\n", 305 | "




" 306 | ] 307 | }, 308 | { 309 | "cell_type": "markdown", 310 | "metadata": {}, 311 | "source": [ 312 | "

\n", 313 | "\n", 314 | "A (multidimensional) histogram object can be transformed in any way that preserves or reduces the binning, such as\n", 315 | " - Integration\n", 316 | " - Rebinning\n", 317 | " - Scaling\n", 318 | " \n", 319 | "and all of these can be done on one or several axes. Most of the previously mentioned histogramming libraries support these operations.\n", 320 | "\n", 321 | "
\n", 322 | "\n", 323 | "Here are a few examples of transformations on multidimensional histograms in Coffea, to motivate why treating histograms as high-dimensional manipulatable objects can be useful. For each, the docstring (`help(function)` or shift+tab in Jupyter) provides useful info.\n", 324 | "\n", 325 | "

" 326 | ] 327 | }, 328 | { 329 | "cell_type": "code", 330 | "execution_count": 7, 331 | "metadata": {}, 332 | "outputs": [ 333 | { 334 | "data": { 335 | "text/plain": [ 336 | "" 337 | ] 338 | }, 339 | "execution_count": 7, 340 | "metadata": {}, 341 | "output_type": "execute_result" 342 | } 343 | ], 344 | "source": [ 345 | "# sum all x bins within nominal range (-10, 10)\n", 346 | "h.sum(\"x\", overflow='none')" 347 | ] 348 | }, 349 | { 350 | "cell_type": "code", 351 | "execution_count": 8, 352 | "metadata": {}, 353 | "outputs": [ 354 | { 355 | "data": { 356 | "text/plain": [ 357 | "" 358 | ] 359 | }, 360 | "execution_count": 8, 361 | "metadata": {}, 362 | "output_type": "execute_result" 363 | } 364 | ], 365 | "source": [ 366 | "# integrate y bins from -2 to +10 and remove y axis from histogram\n", 367 | "h.project(\"y\", slice(0, 10))" 368 | ] 369 | }, 370 | { 371 | "cell_type": "code", 372 | "execution_count": 9, 373 | "metadata": {}, 374 | "outputs": [ 375 | { 376 | "data": { 377 | "text/plain": [ 378 | "" 379 | ] 380 | }, 381 | "execution_count": 9, 382 | "metadata": {}, 383 | "output_type": "execute_result" 384 | } 385 | ], 386 | "source": [ 387 | "# rebin z axis by providing a new axis definition\n", 388 | "h.rebin(\"z\", hist.Bin(\"znew\", \"rebinned z value\", [-10, -6, 6, 10]))" 389 | ] 390 | }, 391 | { 392 | "cell_type": "code", 393 | "execution_count": 10, 394 | "metadata": {}, 395 | "outputs": [ 396 | { 397 | "data": { 398 | "text/plain": [ 399 | "" 400 | ] 401 | }, 402 | "execution_count": 10, 403 | "metadata": {}, 404 | "output_type": "execute_result" 405 | } 406 | ], 407 | "source": [ 408 | "# merge categorical axes\n", 409 | "mapping = {\n", 410 | " 'all samples': ['sample 1', 'sample 2'],\n", 411 | " 'just sample 1': ['sample 1'],\n", 412 | "}\n", 413 | "h.group(hist.Cat(\"cat\", \"new category\"), \"sample\", mapping)" 414 | ] 415 | }, 416 | { 417 | "cell_type": "code", 418 | "execution_count": 11, 419 | "metadata": {}, 420 | "outputs": [], 421 | "source": [ 422 | "# scale entire histogram by 3 (in-place)\n", 423 | "h.scale(3.)" 424 | ] 425 | }, 426 | { 427 | "cell_type": "code", 428 | "execution_count": 12, 429 | "metadata": {}, 430 | "outputs": [], 431 | "source": [ 432 | "# scale samples by different values\n", 433 | "scales = {\n", 434 | " 'sample 1': 1.2,\n", 435 | " 'sample 2': 0.2,\n", 436 | "}\n", 437 | "h.scale(scales, axis='sample')" 438 | ] 439 | }, 440 | { 441 | "cell_type": "code", 442 | "execution_count": 13, 443 | "metadata": {}, 444 | "outputs": [ 445 | { 446 | "data": { 447 | "text/plain": [ 448 | "[,\n", 449 | " ]" 450 | ] 451 | }, 452 | "metadata": {}, 453 | "output_type": "display_data" 454 | }, 455 | { 456 | "data": { 457 | "text/plain": [ 458 | "[,\n", 459 | " ,\n", 460 | " ,\n", 461 | " ,\n", 462 | " ,\n", 463 | " ,\n", 464 | " ,\n", 465 | " ,\n", 466 | " ,\n", 467 | " ,\n", 468 | " ,\n", 469 | " ,\n", 470 | " ,\n", 471 | " ,\n", 472 | " ,\n", 473 | " ,\n", 474 | " ,\n", 475 | " ,\n", 476 | " ,\n", 477 | " ]" 478 | ] 479 | }, 480 | "metadata": {}, 481 | "output_type": "display_data" 482 | } 483 | ], 484 | "source": [ 485 | "# print bins, aka 'identifiers'\n", 486 | "display(h.identifiers('sample'))\n", 487 | "display(h.identifiers('x'))" 488 | ] 489 | }, 490 | { 491 | "cell_type": "markdown", 492 | "metadata": {}, 493 | "source": [ 494 | "


\n", 495 | "\n", 496 | "There is some analog to fancy array slicing (of Numpy fame) for histogram objects, which is supported (with reasonable consistency) in Coffea. Here, the slice boundaries are interpreted as physical axis values, rather than bin indices. All values outside the slice range are merged into overflow bins.\n", 497 | "\n", 498 | "
\n", 499 | "\n", 500 | "For a lengthy discussion on possible histogram slicing syntax for the future, see [boost-histogram#35](https://github.com/scikit-hep/boost-histogram/issues/35).\n", 501 | "\n", 502 | "


" 503 | ] 504 | }, 505 | { 506 | "cell_type": "code", 507 | "execution_count": 14, 508 | "metadata": {}, 509 | "outputs": [ 510 | { 511 | "data": { 512 | "text/plain": [ 513 | "" 514 | ] 515 | }, 516 | "metadata": {}, 517 | "output_type": "display_data" 518 | }, 519 | { 520 | "data": { 521 | "text/plain": [ 522 | "[,\n", 523 | " ,\n", 524 | " ,\n", 525 | " ,\n", 526 | " ,\n", 527 | " ,\n", 528 | " ,\n", 529 | " ]" 530 | ] 531 | }, 532 | "metadata": {}, 533 | "output_type": "display_data" 534 | } 535 | ], 536 | "source": [ 537 | "sliced = h[:,0:,4:,0:]\n", 538 | "display(sliced)\n", 539 | "display(sliced.identifiers(\"y\", overflow='all'))" 540 | ] 541 | }, 542 | { 543 | "cell_type": "code", 544 | "execution_count": 15, 545 | "metadata": {}, 546 | "outputs": [ 547 | { 548 | "data": { 549 | "text/plain": [ 550 | "{('sample 1',): array([0.00000e+00, 0.00000e+00, 0.00000e+00, 0.00000e+00, 0.00000e+00,\n", 551 | " 0.00000e+00, 0.00000e+00, 0.00000e+00, 0.00000e+00, 0.00000e+00,\n", 552 | " 0.00000e+00, 0.00000e+00, 3.60000e+00, 3.24000e+01, 7.70400e+02,\n", 553 | " 5.03640e+03, 1.25604e+04, 1.20744e+04, 4.74840e+03, 7.34400e+02]),\n", 554 | " ('sample 2',): array([0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", 555 | " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", 556 | " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", 557 | " 8.08933567e-01, 4.89224300e+00, 1.71204039e+02, 1.19003443e+03,\n", 558 | " 2.90009134e+03, 2.95578982e+03, 1.23395049e+03, 1.77331091e+02])}" 559 | ] 560 | }, 561 | "execution_count": 15, 562 | "metadata": {}, 563 | "output_type": "execute_result" 564 | } 565 | ], 566 | "source": [ 567 | "# bin contents are accessed using Hist.values()\n", 568 | "h.sum('x', 'y').values(sumw2=False)" 569 | ] 570 | }, 571 | { 572 | "cell_type": "code", 573 | "execution_count": 16, 574 | "metadata": {}, 575 | "outputs": [], 576 | "source": [ 577 | "# data can be exported to ROOT via uproot, but only 1D (and soon 2D)\n", 578 | "import uproot\n", 579 | "outputfile = uproot.recreate(\"output.root\")\n", 580 | "hout = h.sum('x', 'y')\n", 581 | "for sample in hout.identifiers('sample'):\n", 582 | " outputfile[sample.name] = hist.export1d(hout.project('sample', sample))\n", 583 | "outputfile.close()" 584 | ] 585 | }, 586 | { 587 | "cell_type": "markdown", 588 | "metadata": {}, 589 | "source": [ 590 | "




\n", 591 | "\n", 592 | "### 3. Plotting\n", 593 | "\n", 594 | "




" 595 | ] 596 | }, 597 | { 598 | "cell_type": "markdown", 599 | "metadata": {}, 600 | "source": [ 601 | "


\n", 602 | "\n", 603 | "The most integrated plotting utility in the scientific python ecosystem, by far, is [Matplotlib](https://matplotlib.org/). However, as we will see, it is not tailored to HEP needs. To facilitate the transition, there is a developing package called [mpl-hep](https://github.com/nsmith-/mpl-hep#mpl-hep). Meanwhile, Coffea tools provide several convenience functions to aid in plotting `Hist` objects.\n", 604 | "\n", 605 | "
\n", 606 | "\n", 607 | "Let's start by looking at basic \"mpl\" histogramming.\n", 608 | "\n", 609 | "


" 610 | ] 611 | }, 612 | { 613 | "cell_type": "code", 614 | "execution_count": 17, 615 | "metadata": {}, 616 | "outputs": [], 617 | "source": [ 618 | "# Jupyter display backends for matplotlib: nbagg, inline, etc.\n", 619 | "%matplotlib inline\n", 620 | "import matplotlib.pyplot as plt" 621 | ] 622 | }, 623 | { 624 | "cell_type": "code", 625 | "execution_count": 18, 626 | "metadata": {}, 627 | "outputs": [ 628 | { 629 | "data": { 630 | "image/png": "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\n", 631 | "text/plain": [ 632 | "
" 633 | ] 634 | }, 635 | "metadata": { 636 | "needs_background": "light" 637 | }, 638 | "output_type": "display_data" 639 | } 640 | ], 641 | "source": [ 642 | "vals = argus(chi=.5).rvs(size=1000)\n", 643 | "\n", 644 | "# notice the semicolon, which prevents display of the return values\n", 645 | "plt.hist(vals);" 646 | ] 647 | }, 648 | { 649 | "cell_type": "markdown", 650 | "metadata": {}, 651 | "source": [ 652 | "



\n", 653 | "\n", 654 | "Suppose we want to plot pre-binned data, for example from our earlier `np.histogram` usage. Here we start running into the edge of typical mpl usage. As mentioned before, apparently HEP is the only regular user of pre-binned histograms.\n", 655 | "\n", 656 | "



" 657 | ] 658 | }, 659 | { 660 | "cell_type": "code", 661 | "execution_count": 19, 662 | "metadata": {}, 663 | "outputs": [ 664 | { 665 | "data": { 666 | "image/png": "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\n", 667 | "text/plain": [ 668 | "
" 669 | ] 670 | }, 671 | "metadata": { 672 | "needs_background": "light" 673 | }, 674 | "output_type": "display_data" 675 | } 676 | ], 677 | "source": [ 678 | "binning = np.linspace(0, 1, 50)\n", 679 | "\n", 680 | "h1vals, h1bins = np.histogram(vals, bins=binning)\n", 681 | "plt.step(x=h1bins[:-1], y=h1vals, where='post');" 682 | ] 683 | }, 684 | { 685 | "cell_type": "markdown", 686 | "metadata": {}, 687 | "source": [ 688 | "




\n", 689 | "\n", 690 | "Coffea utilities include a plotting package to aid in displaying pre-binned histograms. Here are a small set of example plots that can be made using this utility. More examples can be found in [this notebook](https://github.com/CoffeaTeam/coffea/blob/master/binder/plotting-demo.ipynb).\n", 691 | "\n", 692 | "




" 693 | ] 694 | }, 695 | { 696 | "cell_type": "code", 697 | "execution_count": 20, 698 | "metadata": {}, 699 | "outputs": [ 700 | { 701 | "data": { 702 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZ0AAAEGCAYAAAC+fkgiAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nO3de5hU1Znv8e+Pi6BGVAQVaQxgQLmGcBODMcwxgolGjCOKiZFRE4zKjGGORpjkmMvImTgzJ1HjKHGigh6jEkcPRNEoqNEYFBsHRcALRsSWVpEkgjGi4Hv+2LuxaKq7q7urd1V3/z7PU0/tWnvtXW+t7q63165VaykiMDMzy0KHUgdgZmbth5OOmZllxknHzMwy46RjZmaZcdIxM7PMdCp1AFnr0aNH9O3bt9RhmJm1KitWrHg7Ino29zztLun07duXysrKUodhZtaqSHq1GOfx5TUzM8uMk46ZmWXGScfMzDLT7j7TyefDDz+kqqqK999/v9ShtFpdu3aloqKCzp07lzoUMytjTjpAVVUV++yzD3379kVSqcNpdSKCzZs3U1VVRb9+/UodjpmVMV9eA95//30OOOAAJ5wmksQBBxzgnqKZNchJJ+WE0zxuPzMrhJOOmZllxkmnzEyYMMFfXjWzNstJx8ysCU7/+TJO//myUofR6jjpNOAvf/kLJ5xwAp/+9KcZOnQod9xxBwA/+tGPGDNmDEOHDmX69OnUrMA6YcIEZs6cyTHHHMOgQYN46qmnOOWUUxgwYADf+973AFi/fj1HHHEE06ZNY/jw4Zx66qm89957uz33Aw88wFFHHcXIkSOZMmUK77777m51JkyYwKWXXsrYsWMZOHAgjz322M7n+NznPsfIkSMZOXIkv//97wF45JFH+PznP89pp53GwIEDmTVrFrfeeitjx45l2LBhvPzyywBs2rSJv/3bv2XMmDGMGTOGxx9/vPiNa2btjodMN+D+++/nkEMO4d577wXgnXfeAWDGjBlcdtllAHz961/nnnvu4ctf/jIAe+yxB48++ihXXXUVkydPZsWKFXTv3p3DDjuMmTNnAvDCCy9www03MH78eM455xyuvfZaLr744p3P+/bbb3P55ZezZMkS9t57b6644gp+8pOf7HzOXNu3b2f58uUsXryYH/7whyxZsoQDDzyQBx98kK5du/LSSy9xxhln7Lxs98wzz7B27Vq6d+9O//79+cY3vsHy5cu56qqr+NnPfsaVV17JRRddxMyZMzn66KPZsGEDkyZNYu3atS3X0GZl5pdPbmDhytfr3L+megtAg72dySN689UjDy1qbK2ZezoNGDZsGEuWLOHSSy/lscceY9999wXg4Ycf5sgjj2TYsGE89NBDrF69eucxJ5100s5jhwwZQq9evejSpQv9+/fntddeA6BPnz6MHz8egDPPPJPf/e53uzzvE088wZo1axg/fjwjRoxg/vz5vPpq/vn2TjnlFABGjRrF+vXrgeQLr9/85jcZNmwYU6ZMYc2aNTvrjxkzZmdMhx12GBMnTtwZb83xS5YsYcaMGYwYMYKTTjqJLVu2sHXr1uY0pVmrsnDl6zsTS1Otqd5Sb+Jqj9zTacDAgQNZsWIFixcvZvbs2UycOJHvfOc7XHDBBVRWVtKnTx9+8IMf7PIdlS5dugDQoUOHnds1j7dv3w7sPsS49uOI4LjjjuO2225rMMaa5+jYsePO8//0pz/loIMO4plnnuGjjz6ia9euu9WvHWNufB999BHLli1jzz33bPD5zdqqwb26ccd5R+XdV9PDqWt/bh37mHs6Ddi4cSN77bUXZ555JhdffDFPP/30zgTTo0cP3n33Xe68885Gn3fDhg0sW5b8Qt52220cffTRu+wfN24cjz/+OOvWrQPgvffe48UXXyz4/O+88w69evWiQ4cO3HLLLezYsaNR8U2cOJFrrrlm5+OVK1c26ngzs3ycdBqwatUqxo4dy4gRI5gzZw7f+9732G+//XZeujr55JMZM2ZMo887aNAg5s+fz/Dhw/njH//I+eefv8v+nj17Mm/ePM444wyGDx/OuHHjeP755ws+/wUXXMD8+fMZN24cL774InvvvXej4rv66quprKxk+PDhDB48mLlz5zbqeDOzfFQz6qq9GD16dNT+HszatWsZNGhQZjGsX7+eE088keeeey6z58xC1u1o1pIKuXyWxTnKhaQVETG6uedxT8fMrETa43d9WizpSLpR0luSnssp+zdJz0t6VtLdkvbL2Tdb0jpJL0ialFM+StKqdN/VSj9xl9RF0h1p+ZOS+rbUaym2vn37trlejplZIVpy9No84Brg5pyyB4HZEbFd0hXAbOBSSYOBqcAQ4BBgiaSBEbEDuA6YDjwBLAaO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\n", 703 | "text/plain": [ 704 | "
" 705 | ] 706 | }, 707 | "metadata": { 708 | "needs_background": "light" 709 | }, 710 | "output_type": "display_data" 711 | } 712 | ], 713 | "source": [ 714 | "hist.plot1d(h.sum(\"x\", \"y\"), overlay='sample');" 715 | ] 716 | }, 717 | { 718 | "cell_type": "code", 719 | "execution_count": 21, 720 | "metadata": {}, 721 | "outputs": [ 722 | { 723 | "data": { 724 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZ0AAAEHCAYAAAB1IpuHAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nO3de5xVdb3/8debu5bgBTRksCGFvKB5ZOBgplIoYVp4TBRPJKdMUtGsjheo38+oI4+0OmkeUx/8kkAzFDmWqHhFTFNER1K5pWKiTpiMWN4QCPz8/tjfwc2wh9nD7L3mwvv5eOzHXvuzvt/v+q41zHxYa333dykiMDMzy0KHlu6AmZntOJx0zMwsM046ZmaWGScdMzPLjJOOmZllxknHzMwy06lcDUuaBpwArI6IgXnx84BzgY3AXRFxUYpPAs4ANgHfioh7U3wQMB3YCZgLnB8RIakrcAMwCFgDnBoRKxvrV8+ePaOysrJEe2lmtmN46qmn3oiIXs1tp2xJh1yiuJpcYgBA0meBUcAhEbFe0p4pfiAwBjgI2Bt4QNKAiNgEXAuMBx4nl3RGAneTS1B/j4j9JI0BLgdObaxTlZWVVFdXl2wnzcx2BJJeLkU7Zbu8FhEPA2/WC58NXBYR61OZ1Sk+Crg5ItZHxEvACmCIpN5A94hYELlvsd4AnJhXZ0Zang0Ml6Ry7Y+ZmTVf1vd0BgBHSloo6Q+SBqd4H+DVvHI1KdYnLdePb1EnIjYCbwF7FNqopPGSqiVV19bWlmxnzMysabJOOp2A3YChwIXArHR2UugMJbYRp5F1WwYjpkZEVURU9erV7EuSZma2ncp5T6eQGuC2dKnsCUkfAD1TvG9euQpgVYpXFIiTV6dGUiegB1tfzjOzHcg///lPampqWLduXUt3pc3q1q0bFRUVdO7cuSztZ510fg98DnhI0gCgC/AGMAf4raSfkxtI0B94IiI2SXpH0lBgIXA68D+prTnAOGABcDLwYHj2UrMdWk1NDbvssguVlZX4Fm/TRQRr1qyhpqaGfv36lWUb5RwyPRMYBvSUVAP8AJgGTJO0BNgAjEuJYqmkWcAyckOpJ6SRa5AbfDCd3JDpu9ML4HrgRkkryJ3hjCnXvphZ27Bu3TonnGaQxB577EE5732XLelExGkNrBrbQPkpwJQC8WpgYIH4OmB0c/poZu2PE07zlPv4eUYCMzPLjJOOmVkZDBs2zF9ELyDrgQRmZm3Hqj9tf90N70Ltc0BVybrTHvhMx8x2CO+99x7HH388n/rUpxg4cCC33HILAD/60Y8YPHgwAwcOZPz48dQNgh02bBjf+cHPOOqkMzjg6JN48umlnPSN/6T/EaP4P5f/EoCVr65i/6NOYtz5l3DIMadw8pkXsvb997fa9n333cfhhx/OYYcdxujRo3n33Xe3KjNs2DAuvvhihgwZwoABA3jkkUdy21i5kiOPPJLDDjuMww47jMceewyAhx56iKOPPppTTjmFAQMGMHHiRG666SaGDBnCwQcfzIsvvghAbW0tX/7ylxk8eDCDBw/m0UcfLf3BbYqI2KFegwYNCjNrn5YtW9bgutmzZ8c3vvGNzZ//8Y9/RETEmjVrNsfGjh0bc+bMiYiIo48+Oi46Z1zEXxfFlT+8IHrv1TNWLbo31v3l8ejzsT3jjcUPxkuP3xlA/PH30yL+uii+duqX4qf/99sRf10URx8+KJ6c+5uora2NI488Mt59992IiLjsssvihz/84Vb9O/roo+O73/1uRETcddddMXz48IiIeO+99+L999+PiIjnn38+6v6GzZ8/P3r06BGrVq2KdevWxd577x2XXHJJRERceeWVcf7550dExGmnnRaPPPJIRES8/PLLsf/++2/XcQSqowR/g315zcx2CAcffDAXXHABF198MSeccAJHHnkkAPPnz+cnP/kJa9eu5c033+Sggw7ii1/8IgBfGnF0ru7++3HQgH3pvVduRpNPfLwPr656nV177ELfvT/GEYMPBWDsSV/gqmk3c8FZp2/e7uOPP86yZcs44ogjANiwYQOHH354wT6edNJJAAwaNIiVK1cCuS+8nnvuuTz99NN07NiR559/fnP5wYMH07t3bwD23XdfRowYsXlf58+fD8ADDzzAsmXLNtd5++23eeedd9hll12291A2i5OOme0QBgwYwFNPPcXcuXOZNGkSI0aM4KKLLuKcc86hurqavn37Mnny5C1mM+japQsAHTp0oGuXD7+h36FDBzZuyn2VsP4I4/pDjiOCY489lpkzZzbax65duwLQsWNHNm7cCMAVV1zBXnvtxTPPPMMHH3xAt27dtiq/uY/pc4cOHTbX/+CDD1iwYAE77bRTo9vPgu/pmNkOYdWqVey8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\n", 725 | "text/plain": [ 726 | "
" 727 | ] 728 | }, 729 | "metadata": { 730 | "needs_background": "light" 731 | }, 732 | "output_type": "display_data" 733 | } 734 | ], 735 | "source": [ 736 | "hist.plot1d(h.sum(\"x\", \"y\"), overlay='sample', stack=True);" 737 | ] 738 | }, 739 | { 740 | "cell_type": "code", 741 | "execution_count": 22, 742 | "metadata": {}, 743 | "outputs": [ 744 | { 745 | "data": { 746 | "image/png": "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\n", 747 | "text/plain": [ 748 | "
" 749 | ] 750 | }, 751 | "metadata": { 752 | "needs_background": "light" 753 | }, 754 | "output_type": "display_data" 755 | } 756 | ], 757 | "source": [ 758 | "hist.plot2d(h.sum('x', 'sample'), xaxis='y');" 759 | ] 760 | }, 761 | { 762 | "cell_type": "code", 763 | "execution_count": 23, 764 | "metadata": {}, 765 | "outputs": [ 766 | { 767 | "data": { 768 | "image/png": "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x4wZM+q9DmZm1eK43fS4pdzMmqWVK1ey/fbbM3nyZKZOncpTTz21OZB36dKFdevWMWvWrLLzfeWVV5g3LzkIzZgxgwMPPHCL6SNHjuTRRx/lxRdfBGDDhg288MIL9VwbM7OWz3G7OFfKzaxZWrx4McOHD2fIkCFcfPHFnH/++ey0006ceuqpDBo0iK9+9asMGzas7Hz79+/P9OnTGTx4MH//+985/fTTt5jetWtXrr/+eo477jgGDx7MyJEjee6557bK57bbbqNnz57MmzePCRMmcOihh9Z5Xc3MWgLH7eKUu8O1pRk6dGj42cBWCQ15Ka85LLeQZ599lv79+5eVpqmtQ03Lli3j8MMP55lnnmm0Zeb7HiUtjIihjVaIJsAx26zyHLfrr5Ix233KzazRNNWgbmZm+TluNx53XzEzS/Xp06dRW8nNzKx+WlLcdqXczMzMzKzKXCk3MzMzM6syV8rNzMzMzKrMlXIzazzXTUheZmbWPDhuNxpXys3MSjB27FjKeWTf2WefzT777MPgwYM58sgjeffddytYOjMzq6m5xW1Xys3MKmDcuHE888wzPP300/Tr14//9//+X7WLZGZmRVQ7brtSbmbN0vr165kwYQL77bcfAwcOZObMmQBceOGFDBs2jIEDBzJlyhRyf5A2duxYzjrrLMaMGUP//v158sknmTRpEn379uX8888Hkj+h2GeffTjxxBMZPHgwRx11FBs2bNhq2ffeey+jRo1i//335+ijj2bdunVbzTN+/HjatEn+CmLkyJGsWLGiUl+FmVmz4LhdnP88yMzq7+4fw+uLa5/v9aeT91L6J+4+CP7PJQUn33PPPXTv3p0777wTgPfeew+AM888kwsuuACA448/ntmzZ/OVr3wFgHbt2vHnP/+ZX/7yl0ycOJGFCxeyyy67sPfee3PWWWcB8Pzzz3PNNdcwevRoTj75ZC6//HKmTp26eblvv/02F110EXPmzGGHHXbg0ksv5bLLLtu8zHyuvfZajj322NrX2cyssThuN7m47ZZyM2uWBg0axJw5czj33HN5+OGH6dy5MwAPPvggI0aMYNCgQTzwwAMsWbJkc5ojjjhic9oBAwbQrVs32rdvz1577cWrr74KQK9evRg9ejQAkydP5pFHHtliufPnz2fp0qWMHj2aIUOGMH36dJYvX16wnBdffDFt2rThm9/8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I0eO5MYbbwTgsssuY9y4cYwcOZIZM2aw4QFpkydP5rzzzuPwww9n+PDhzJ8/nxNPPJGhQ4dyySWXAJUHXey///5Mnz6d0aNHM3XqVNatW7fZvu+8804mTpzIQQcdxEknncTatWs3W2b48OG8733vq+MRkKTmYt5un0W5pKZ0xx13sNdee/HII4+wZMkSjjnmGADOPfdc5s+fz5IlS3j11Ve57bbbNq6z7bbb8otf/ILPfOYzTJkyha9//essWbKEWbNmsWbNGgAef/xxZsyYwaJFixg4cCDXXHPNO/b7wgsvcPnll3PXXXfx0EMPMXbsWK666qrGfXBJalLm7fZ5TbnUjZrxmrvu8MX/eJSlqzq++bWj0WlaO2CvgfyPj45oc/6oUaOYOXMmF154IccddxyHHXYYAHPnzuXLX/4y69at48UXX2TEiBF89KMfBeD444/fuO6IESNoaWkBYL/99uPpp59m5513ZvDgwUyaNAmAadOmcfXVVzNz5syN+73//vtZunTpxmXeeOMNJk7sm793Sc3LvN3z8rZFuaSmNGzYMBYuXMjtt9/OxRdfzNFHH80FF1zA2WefzYIFCxg8eDCXXnopr7322sZ1+vfvD0C/fv02Tm94v379egCKZytstOn7zOSoo45izpw59fpoktQrmbfbZ1EuaYu11zPSWnfexb9q1Sp23XVXpk2bxg477MCsWbM2JvLddtuNtWvXcvPNNzN16tSatvvUU08xb948Jk6cyJw5czj00EPfMX/ChAmcc845LF++nPe+972sW7eOlStXMmzYsC3+TJLUKObtnpe3vaZcUlNavHgx48ePZ8yYMVxxxRVccskl7LzzzpxxxhmMGjWKE044gXHjxtW83eHDhzN79mxGjx7Niy++yFlnnfWO+bvvvjuzZs3itNNOY/To0UyYMIHHHntss+386Ec/YtCgQcybN49jjz2WD3/4w13+rJLUG5i32xcb7nDtbcaOHZsLFiwoOwz1QmWN2drTxopdtmwZw4cPr2mdnvYZNrVixQqOO+44lixZ0rB9VjuOEbEwM/vUwObmbKn+zNtbrp45255ySZIkqWReUy6pYXpqT8sGQ4YMaWgvuST1dObtxrGnXJIkSSqZRbkkSZJUMotySZIkqWQW5ZIkSVLJLMolNc63j628mtDkyZOpZci+888/n/3335/Ro0fzsY99jD/96U91jE6S6sS83TAW5ZJUB0cddRRLlixh0aJFDBs2jH/6p38qOyRJUjvKztsW5ZKa0iuvvMKxxx7LgQceyMiRI7nxxhsBuOyyyxg3bhwjR45kxowZbHhA2uTJkznvvPM4/PDDGT58OPPnz+fEE09k6NChXHLJJUDlIRT7778/06dPZ/To0UydOpV169Zttu8777yTiRMnctBBB3HSSSexdu3azZY5+uij2XrryqizEyZMYOXKlfU6FJLUFMzb7bMol9SU7rjjDvbaay8eeeQRlixZwjHHHAPAueeey/z581myZAmvvvoqt91228Z1tt12W37xi1/wmc98hilTpvD1r3+dJUuWMGvWLNasWQPA448/zowZM1i0aBEDBw7kmmuuecd+X3jhBS6//HLuuusuHnroIcaOHctVV13Vbqzf+ta3+MhHPtLNR0CSmot5u30+PEjSlvvJRfDs4o6Xe3ZR5Wdnrk/ccxR85Mo2Z48aNYqZM2dy4YUXctxxx3HYYYcBMHfuXL785S+zbt06XnzxRUaMGMFHP/pRAI4//viN644YMYKWlhYA9ttvP55++ml23nlnBg8ezKRJkwCYNm0aV199NTNnzty43/vvv5+lS5duXOaNN95g4sS2H65xxRVXsPXWW/PJT36y488sSY1i3m4zzrLytkW5pKY0bNgwFi5cyO23387FF1/M0UcfzQUXXMDZZ5/NggULGDx4MJdeeimvvfbaxnX69+8PQL9+/TZOb3i/fv16ACLiHfvZ9H1mctRRRzFnzpwOY5w9eza33XYbd99992bbkaS+xrzdPotySVuunZ6Rd9jQ03L6j7d4l6tWrWLXXXdl2rRp7LDDDsyaNWtjIt9tt91Yu3YtN998M1OnTq1pu0899RTz5s1j4sSJzJkzh0MPPfQd8ydMmMA555zD8uXLee9738u6detYuXIlw4YNe8dyd9xxB1/60pe499572X777bfsw0pSdzNv97i8bVEuqSktXryY888/n379+rHNNttw7bXXsvPOO3PGGWcwatQohgwZwrhx42re7vDhw5k9ezZnnnkmQ4cO5ayzznrH/N13351Zs2Zx2mmn8frrrwNw+eWXb5bczz33XF5//XWOOuoooHJSuO6667r4aSWp+Zm32xcb7nDtbcaOHZu1jE0pddYp35gHwI1ntn09Wm/ab1uWLVvG8OHD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\n", 769 | "text/plain": [ 770 | "
" 771 | ] 772 | }, 773 | "metadata": { 774 | "needs_background": "light" 775 | }, 776 | "output_type": "display_data" 777 | } 778 | ], 779 | "source": [ 780 | "# make coarse binned hist and look at several distributions\n", 781 | "hnew = (h.rebin(\"y\", hist.Bin(\"ynew\", \"rebinned y value\", [0, 3, 5]))\n", 782 | " .rebin(\"z\", hist.Bin(\"znew\", \"rebinned z value\", [5, 8, 10]))\n", 783 | " )\n", 784 | "\n", 785 | "hist.plotgrid(hnew, row='ynew', col='znew', overlay='sample');" 786 | ] 787 | }, 788 | { 789 | "cell_type": "code", 790 | "execution_count": 24, 791 | "metadata": {}, 792 | "outputs": [ 793 | { 794 | "name": "stderr", 795 | "output_type": "stream", 796 | "text": [ 797 | "/home/jpivarski/miniconda3/lib/python3.7/site-packages/coffea/hist/plot.py:313: RuntimeWarning: invalid value encountered in true_divide\n", 798 | " rsumw = sumw_num / sumw_denom\n" 799 | ] 800 | }, 801 | { 802 | "data": { 803 | "text/plain": [ 804 | "(-10, 10)" 805 | ] 806 | }, 807 | "execution_count": 24, 808 | "metadata": {}, 809 | "output_type": "execute_result" 810 | }, 811 | { 812 | "data": { 813 | "image/png": "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\n", 814 | "text/plain": [ 815 | "
" 816 | ] 817 | }, 818 | "metadata": { 819 | "needs_background": "light" 820 | }, 821 | "output_type": "display_data" 822 | } 823 | ], 824 | "source": [ 825 | "numerator = h.project('sample', 'sample 1').sum('y', 'z')\n", 826 | "denominator = h.sum('sample', 'y', 'z')\n", 827 | "\n", 828 | "numerator.label = r'$\\epsilon$'\n", 829 | "fig, ax, _ = hist.plotratio(num=numerator,\n", 830 | " denom=denominator,\n", 831 | " error_opts={'color': 'k', 'marker': '.'},\n", 832 | " unc='clopper-pearson'\n", 833 | " )\n", 834 | "ax.set_ylim(0.6, 1.)\n", 835 | "ax.set_xlim(-10, 10)" 836 | ] 837 | } 838 | ], 839 | "metadata": { 840 | "kernelspec": { 841 | "display_name": "Python 3", 842 | "language": "python", 843 | "name": "python3" 844 | }, 845 | "language_info": { 846 | "codemirror_mode": { 847 | "name": "ipython", 848 | "version": 3 849 | }, 850 | "file_extension": ".py", 851 | "mimetype": "text/x-python", 852 | "name": "python", 853 | "nbconvert_exporter": "python", 854 | "pygments_lexer": "ipython3", 855 | "version": "3.7.3" 856 | } 857 | }, 858 | "nbformat": 4, 859 | "nbformat_minor": 4 860 | } 861 | --------------------------------------------------------------------------------