From 97fb91dfbe05f189f201dd4e43a056506bc9cb87 Mon Sep 17 00:00:00 2001 From: Matthew Feickert Date: Mon, 6 Jan 2025 19:12:15 -0700 Subject: [PATCH] feat: Update pyhf to v0.7.6 * Update to pyhf v0.7.6. - Update URLs to point to v0.7.6. * Update pixi.toml and pixi.lock. * Update requirements.txt and upgrade lock file. --- README.md | 2 +- binder/requirements.txt | 2 +- book/HelloWorld.ipynb | 8 ++++---- book/Modifiers.ipynb | 4 ++-- book/SerializationAndPatching.ipynb | 2 +- book/SimpleWorkspace.ipynb | 4 ++-- book/WorkspaceManipulations.ipynb | 8 ++++---- book/introduction.md | 10 +++++----- book/requirements.lock | 6 +++--- lite/jupyterlite.py | 4 ++-- pixi.lock | 22 +++++++++++----------- pixi.toml | 4 ++-- 12 files changed, 38 insertions(+), 38 deletions(-) diff --git a/README.md b/README.md index 2dcbffd..ea85346 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # `pyhf` Tutorial -**The tutorial is based off of [`pyhf` `v0.7.5`](https://pypi.org/project/pyhf/0.7.5/)** +**The tutorial is based off of [`pyhf` `v0.7.6`](https://pypi.org/project/pyhf/0.7.6/)** [![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/pyhf/pyhf-tutorial/main?urlpath=lab) [![JupyterLite](https://jupyterlite.rtfd.io/en/latest/_static/badge.svg)](https://pyhf.github.io/pyhf-tutorial/live/lab/index.html?path=jupyterlite.ipynb) diff --git a/binder/requirements.txt b/binder/requirements.txt index 3560b8b..1fcfe53 100644 --- a/binder/requirements.txt +++ b/binder/requirements.txt @@ -1,4 +1,4 @@ -pyhf[xmlio,minuit,contrib]==0.7.5 +pyhf[xmlio,minuit,contrib]==0.7.6 # visualization ipywidgets~=8.1.1 ipympl~=0.9.3 diff --git a/book/HelloWorld.ipynb b/book/HelloWorld.ipynb index 73b337d..5cc7941 100644 --- a/book/HelloWorld.ipynb +++ b/book/HelloWorld.ipynb @@ -49,7 +49,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "What did we just make? This returns a [`pyhf.pdf.Model`](https://pyhf.readthedocs.io/en/v0.7.5/_generated/pyhf.pdf.Model.html#pyhf.pdf.Model) object. Let's check out the specification." + "What did we just make? This returns a [`pyhf.pdf.Model`](https://pyhf.readthedocs.io/en/v0.7.6/_generated/pyhf.pdf.Model.html#pyhf.pdf.Model) object. Let's check out the specification." ] }, { @@ -144,7 +144,7 @@ "\n", "where $n = \\{n_1, n_2\\}$ for a 2-bin model (we're being slightly fast and loose with our mathematical notation here), and similarly for $s$, $b$, and $\\gamma$.\n", "\n", - "The 'shapesys' is defined in the [HistFactory paper](https://cds.cern.ch/record/1456844)... however, it can be a little hard to extract out the necessary information. We've provided a nice table of [Modifiers and Constraints](https://pyhf.readthedocs.io/en/v0.7.5/intro.html#id24) in the introduction of our pyhf documentation to use as reference.\n", + "The 'shapesys' is defined in the [HistFactory paper](https://cds.cern.ch/record/1456844)... however, it can be a little hard to extract out the necessary information. We've provided a nice table of [Modifiers and Constraints](https://pyhf.readthedocs.io/en/v0.7.6/intro.html#id24) in the introduction of our pyhf documentation to use as reference.\n", "\n", "![modifiers and constraints](assets/modifiers_and_constraints.png)" ] @@ -515,7 +515,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "We're not performing inference just yet. We're simply computing the 'logpdf' of the model specified by the parameters $\\theta$ against the provided data. To perform a fit, we use the [inference API](https://pyhf.readthedocs.io/en/v0.7.5/api.html#inference) via `pyhf.infer`.\n", + "We're not performing inference just yet. We're simply computing the 'logpdf' of the model specified by the parameters $\\theta$ against the provided data. To perform a fit, we use the [inference API](https://pyhf.readthedocs.io/en/v0.7.6/api.html#inference) via `pyhf.infer`.\n", "\n", "When fitting a model to data, we usually want to find the $\\hat{\\theta}$ which refers to the \"Maximum Likelihood Estimate\" of the model parameters. This is often referred to mathematically by\n", "\n", @@ -675,7 +675,7 @@ "source": [ "## Simple Upper Limit\n", "\n", - "To get upper limits, we just need to run multiple hypothesis tests for a lot of different null hypotheses of BSM with $\\mu \\in [0, \\ldots, 5.0]$ and then find the value of $\\mu$ for which the null hypothesis is rejected (a 95% $\\text{CL}_\\text{s}$). We can do all of this very easily just using the [`upper_limits.upper_limit` API](https://pyhf.readthedocs.io/en/v0.7.5/_generated/pyhf.infer.intervals.upper_limits.upper_limit.html#pyhf.infer.intervals.upper_limits.upper_limit), which also can calculate the upper limit by interpolating" + "To get upper limits, we just need to run multiple hypothesis tests for a lot of different null hypotheses of BSM with $\\mu \\in [0, \\ldots, 5.0]$ and then find the value of $\\mu$ for which the null hypothesis is rejected (a 95% $\\text{CL}_\\text{s}$). We can do all of this very easily just using the [`upper_limits.upper_limit` API](https://pyhf.readthedocs.io/en/v0.7.6/_generated/pyhf.infer.intervals.upper_limits.upper_limit.html#pyhf.infer.intervals.upper_limits.upper_limit), which also can calculate the upper limit by interpolating" ] }, { diff --git a/book/Modifiers.ipynb b/book/Modifiers.ipynb index 3a40f59..d491ec7 100644 --- a/book/Modifiers.ipynb +++ b/book/Modifiers.ipynb @@ -8,9 +8,9 @@ "source": [ "# Modifiers\n", "\n", - "In our simple examples so far, we've only used two types of modifiers, but HistFactory allows for a handful of modifiers that have proven to be sufficient to model a wide range of uncertainties. Each of the modifiers is further described in the [Modifiers section](https://pyhf.readthedocs.io/en/v0.7.5/likelihood.html#modifiers) of the pyhf docs on model specification.\n", + "In our simple examples so far, we've only used two types of modifiers, but HistFactory allows for a handful of modifiers that have proven to be sufficient to model a wide range of uncertainties. Each of the modifiers is further described in the [Modifiers section](https://pyhf.readthedocs.io/en/v0.7.6/likelihood.html#modifiers) of the pyhf docs on model specification.\n", "\n", - "There is an addtional table of [Modifiers and Constraints](https://pyhf.readthedocs.io/en/v0.7.5/intro.html#id24) in the introduction of the pyhf documentation to use as reference.\n", + "There is an addtional table of [Modifiers and Constraints](https://pyhf.readthedocs.io/en/v0.7.6/intro.html#id24) in the introduction of the pyhf documentation to use as reference.\n", "\n", "![modifiers and constraints](assets/modifiers_and_constraints.png)\n", "\n", diff --git a/book/SerializationAndPatching.ipynb b/book/SerializationAndPatching.ipynb index b388caa..39acc0b 100644 --- a/book/SerializationAndPatching.ipynb +++ b/book/SerializationAndPatching.ipynb @@ -107,7 +107,7 @@ "source": [ "## Patching in Signals\n", "\n", - "Let's look at this [`pyhf.PatchSet`](https://pyhf.readthedocs.io/en/v0.7.5/_generated/pyhf.patchset.PatchSet.html#pyhf.patchset.PatchSet) object which provides a user-friendly way to interact with many signal patches at once.\n", + "Let's look at this [`pyhf.PatchSet`](https://pyhf.readthedocs.io/en/v0.7.6/_generated/pyhf.patchset.PatchSet.html#pyhf.patchset.PatchSet) object which provides a user-friendly way to interact with many signal patches at once.\n", "\n", "### PatchSet" ] diff --git a/book/SimpleWorkspace.ipynb b/book/SimpleWorkspace.ipynb index 85407b0..0a43c32 100644 --- a/book/SimpleWorkspace.ipynb +++ b/book/SimpleWorkspace.ipynb @@ -67,7 +67,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "What did we just make? This returns a [`pyhf.Workspace`](https://pyhf.readthedocs.io/en/v0.7.5/_generated/pyhf.workspace.Workspace.html#pyhf.workspace.Workspace) object. Let's check out the specification." + "What did we just make? This returns a [`pyhf.Workspace`](https://pyhf.readthedocs.io/en/v0.7.6/_generated/pyhf.workspace.Workspace.html#pyhf.workspace.Workspace) object. Let's check out the specification." ] }, { @@ -142,7 +142,7 @@ "source": [ "What does this mean for us though? Well, when we ask for a model, we specify the measurement that we want to use with it. Each of these measurements above have no additional parameter configurations on top of the existing model specification. Additionally, they all declare that the parameter of interest is `mu`.\n", "\n", - "See the [documentation](https://pyhf.readthedocs.io/en/v0.7.5/_generated/pyhf.workspace.Workspace.html#pyhf.workspace.Workspace.model) for more information. In this case, let's build the model for the default measurement." + "See the [documentation](https://pyhf.readthedocs.io/en/v0.7.6/_generated/pyhf.workspace.Workspace.html#pyhf.workspace.Workspace.model) for more information. In this case, let's build the model for the default measurement." ] }, { diff --git a/book/WorkspaceManipulations.ipynb b/book/WorkspaceManipulations.ipynb index 05a53f1..6aeae9a 100644 --- a/book/WorkspaceManipulations.ipynb +++ b/book/WorkspaceManipulations.ipynb @@ -207,7 +207,7 @@ "\n", "### via the command line\n", "\n", - "So pyhf comes with a lot of nifty utilities you can access. The documentation for the command line can be found via `pyhf --help` or [online](https://pyhf.readthedocs.io/en/v0.7.5/cli.html)." + "So pyhf comes with a lot of nifty utilities you can access. The documentation for the command line can be found via `pyhf --help` or [online](https://pyhf.readthedocs.io/en/v0.7.6/cli.html)." ] }, { @@ -229,7 +229,7 @@ "python -m pip install pyhf[xmlio]\n", "```\n", "\n", - "Again, the online documentation for this option is found [here](https://pyhf.readthedocs.io/en/v0.7.5/cli.html#pyhf-xml2json)." + "Again, the online documentation for this option is found [here](https://pyhf.readthedocs.io/en/v0.7.6/cli.html#pyhf-xml2json)." ] }, { @@ -292,7 +292,7 @@ "\n", "Nearly at the end, the next part of this specification is for the `observations` (observed data) on line 113. Each observation corresponds with the channel, where `channel1` has two bins, and `channel2` also has two bins.\n", "\n", - "Finally, we have a `version` which specifies the version of the schema used for the JSON HistFactory. In this case, we're using `1.0.0` which has the [https://pyhf.readthedocs.io/en/v0.7.5/schemas/1.0.0/workspace.json](https://pyhf.readthedocs.io/en/v0.7.5/schemas/1.0.0/workspace.json) definition which refers to the [https://pyhf.readthedocs.io/en/v0.7.5/schemas/1.0.0/defs.json](https://pyhf.readthedocs.io/en/v0.7.5/schemas/1.0.0/defs.json).\n", + "Finally, we have a `version` which specifies the version of the schema used for the JSON HistFactory. In this case, we're using `1.0.0` which has the [https://pyhf.readthedocs.io/en/v0.7.6/schemas/1.0.0/workspace.json](https://pyhf.readthedocs.io/en/v0.7.6/schemas/1.0.0/workspace.json) definition which refers to the [https://pyhf.readthedocs.io/en/v0.7.6/schemas/1.0.0/defs.json](https://pyhf.readthedocs.io/en/v0.7.6/schemas/1.0.0/defs.json).\n", "\n", "What's really nice about the schema definition is that it allows anyone to write their own tooling/scripting to build up the workspace and quickly check if it matches the schema. This will get you 90% of the way there in having a valid workspace to work with.\n", "\n", @@ -330,7 +330,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "So we're not going to dump this out. We already did that above. Let's just quickly go ahead and load it into a [`pyhf.Workspace`](https://pyhf.readthedocs.io/en/v0.7.5/_generated/pyhf.workspace.Workspace.html#pyhf.workspace.Workspace) object because we can." + "So we're not going to dump this out. We already did that above. Let's just quickly go ahead and load it into a [`pyhf.Workspace`](https://pyhf.readthedocs.io/en/v0.7.6/_generated/pyhf.workspace.Workspace.html#pyhf.workspace.Workspace) object because we can." ] }, { diff --git a/book/introduction.md b/book/introduction.md index 1cb4d12..2197286 100644 --- a/book/introduction.md +++ b/book/introduction.md @@ -151,7 +151,7 @@ The 'minuit' extra installs [`iminuit`](https://iminuit.readthedocs.io/). :::: -See our [installation docs](https://pyhf.readthedocs.io/en/v0.7.5/installation.html) for more information about installation options. +See our [installation docs](https://pyhf.readthedocs.io/en/v0.7.6/installation.html) for more information about installation options. ### Dependencies for this tutorial @@ -198,11 +198,11 @@ If you want to also get the dependencies to build and explore the Jupyter Book f (pyhf-tutorial) $ pyhf --citation @software{pyhf, author = {Lukas Heinrich and Matthew Feickert and Giordon Stark}, - title = "{pyhf: v0.7.5}", - version = {0.7.5}, + title = "{pyhf: v0.7.6}", + version = {0.7.6}, doi = {10.5281/zenodo.1169739}, url = {https://doi.org/10.5281/zenodo.1169739}, - note = {https://github.com/scikit-hep/pyhf/releases/tag/v0.7.5} + note = {https://github.com/scikit-hep/pyhf/releases/tag/v0.7.6} } @article{pyhf_joss, @@ -219,7 +219,7 @@ If you want to also get the dependencies to build and explore the Jupyter Book f } ``` -Alternatively, [check the website](https://pyhf.readthedocs.io/en/v0.7.5/citations.html). +Alternatively, [check the website](https://pyhf.readthedocs.io/en/v0.7.6/citations.html). ### Statistics References diff --git a/book/requirements.lock b/book/requirements.lock index 4f16f1b..920f771 100644 --- a/book/requirements.lock +++ b/book/requirements.lock @@ -1394,9 +1394,9 @@ pygments==2.19.1 \ # pydata-sphinx-theme # rich # sphinx -pyhf==0.7.5 \ - --hash=sha256:51aa26bb87c13f493221371e94e693528378779137499029801f99cc10d8d5b2 \ - --hash=sha256:83a73f1f662c5be3aa15126351eb29c5154c000d87e2a5d9f0f9f9df20b1c28c +pyhf==0.7.6 \ + --hash=sha256:01b2401b9fdc53d94fa28256128c4898c380c64f71446f1695580fb18fba349d \ + --hash=sha256:d41d9cdce5555863a77a37efd0784ad81d84b817295aa07ebc1cfa5ec50cc78c # via -r requirements.txt pyparsing==3.2.1 \ --hash=sha256:506ff4f4386c4cec0590ec19e6302d3aedb992fdc02c761e90416f158dacf8e1 \ diff --git a/lite/jupyterlite.py b/lite/jupyterlite.py index c1f7a76..dffd0e1 100644 --- a/lite/jupyterlite.py +++ b/lite/jupyterlite.py @@ -17,7 +17,7 @@ import micropip # Install pyhf in the browser -await micropip.install(["pyhf==0.7.5", "matplotlib>=3.0.0"]) +await micropip.install(["pyhf==0.7.6", "matplotlib>=3.0.0"]) # %matplotlib inline import pyhf @@ -30,4 +30,4 @@ import micropip # Install pyhf in the browser -await micropip.install(["pyhf==0.7.5", "matplotlib>=3.0.0"]) +await micropip.install(["pyhf==0.7.6", "matplotlib>=3.0.0"]) diff --git a/pixi.lock b/pixi.lock index a175902..b13b4d1 100644 --- a/pixi.lock +++ b/pixi.lock @@ -243,7 +243,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.15.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyhf-0.7.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyhf-0.7.6-pyhff2d567_5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pythia8-8.312-py312hc4ac7be_101.conda @@ -502,7 +502,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.15.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyhf-0.7.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyhf-0.7.6-pyhff2d567_5.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-core-10.3.2-py312h2365019_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-framework-cocoa-10.3.2-py312h2365019_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.1-pyhd8ed1ab_0.conda @@ -738,7 +738,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.15.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyhf-0.7.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyhf-0.7.6-pyhff2d567_5.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-core-10.3.2-py312hb9d441b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-framework-cocoa-10.3.2-py312hb9d441b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.1-pyhd8ed1ab_0.conda @@ -971,7 +971,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyhf-0.7.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyhf-0.7.6-pyhff2d567_5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.8-h9e4cc4f_1_cpython.conda @@ -1168,7 +1168,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyhf-0.7.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyhf-0.7.6-pyhff2d567_5.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-core-10.3.2-py312h2365019_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-framework-cocoa-10.3.2-py312h2365019_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.1-pyhd8ed1ab_0.conda @@ -1366,7 +1366,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyhf-0.7.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyhf-0.7.6-pyhff2d567_5.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-core-10.3.2-py312hb9d441b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-framework-cocoa-10.3.2-py312hb9d441b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.1-pyhd8ed1ab_0.conda @@ -6124,9 +6124,9 @@ packages: license_family: BSD size: 876700 timestamp: 1733221731178 -- conda: https://conda.anaconda.org/conda-forge/noarch/pyhf-0.7.5-pyhd8ed1ab_0.conda - sha256: ce9e6b1cfc1420f70c0c4538ec66568c7c21b242bcc4d5e01d59f818ad23ea01 - md5: 177c02933b306b75a8cbfa15368de868 +- conda: https://conda.anaconda.org/conda-forge/noarch/pyhf-0.7.6-pyhff2d567_5.conda + sha256: b84236b11811671f7f587fce4f281e1e03dba1af4a0e178ea45ffeb1f98552b9 + md5: 2915ba749ca1c05e59fc1733f8355568 depends: - click >=8.0.0 - importlib_resources >=1.4.0 @@ -6140,8 +6140,8 @@ packages: - typing_extensions >=3.7.4.3 license: Apache-2.0 license_family: Apache - size: 110272 - timestamp: 1698351461483 + size: 110669 + timestamp: 1731921178040 - conda: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-core-10.3.2-py312h2365019_0.conda sha256: 118c17b20c084a9a6584ae47908d130745100e3b8dffdc92332c45c315ffb2e2 md5: 78bc9b5b0ff74c271ddb45ac0b8a679c diff --git a/pixi.toml b/pixi.toml index 46d96c8..1774a03 100644 --- a/pixi.toml +++ b/pixi.toml @@ -4,7 +4,7 @@ channels = ["conda-forge"] description = "pyhf user guide" name = "pyhf-tutorial" platforms = ["linux-64", "osx-64", "osx-arm64"] -version = "0.7.5" +version = "0.7.6" [tasks.start] description = "Launch Jupyer Lab and explore the user guide notebooks" @@ -12,7 +12,7 @@ cmd = "jupyter lab" [dependencies] python = "3.12.*" -pyhf = "0.7.5.*" +pyhf = "0.7.6.*" uproot = ">=5.5.1,<6" iminuit = ">=2.30.1,<3" matplotlib-base = ">=3.10.0,<4"