Quick Start#
Installation#
spey-pyhf
plug-in is available at pypi , so it can be installed by running:
>>> pip install spey-pyhf
Python >=3.8 is required. This will also automatically install pyhf
since it is a requirement.
For Gradient and Hessian implementations in likelihood optimisation, we recommend also installing Jax
.
Once this package is installed, spey
can automatically detect it, which can be tested using
AvailableBackends()
function;
>>> import spey
>>> print(spey.AvailableBackends())
>>> # ['default_pdf.correlated_background',
>>> # 'default_pdf.effective_sigma',
>>> # 'default_pdf.third_moment_expansion',
>>> # 'default_pdf.uncorrelated_background',
>>> # 'pyhf',
>>> # 'pyhf.uncorrelated_background']
First Steps#
"pyhf"
accessor enables user to access all pyhf
’s likelihood building capabilities.
The function of this accessor accepts a background-only statistical model dictionary as described
in pyhf’s online documentation. Additionally,
a signal patch sample needs to be provided. An example of these two can be found below.
>>> background_only = {
... "channels": [
... {
... "name": "singlechannel",
... "samples": [
... {
... "name": "background",
... "data": [50.0, 52.0],
... "modifiers": [
... {
... "name": "uncorr_bkguncrt",
... "type": "shapesys",
... "data": [3.0, 7.0],
... }
... ],
... }
... ],
... }
... ],
... "observations": [{"name": "singlechannel", "data": [51.0, 48.0]}],
... "measurements": [{"name": "Measurement", "config": {"poi": "mu", "parameters": []}}],
... "version": "1.0.0",
... }
>>> signal = [
... {
... "op": "add",
... "path": "/channels/0/samples/1",
... "value": {
... "name": "signal",
... "data": [12.0, 11.0],
... "modifiers": [{"name": "mu", "type": "normfactor", "data": None}],
... },
... }
... ]
The background_only
dictionary refers to the statistical model that encapsulates only the background
, and the signal
includes the signal-only patch set. In the following, we demonstrate the usage of these
descriptions within spey
;
>>> import spey
>>> stat_wrapper = spey.get_backend("pyhf")
>>> statistical_model = stat_wrapper(
... analysis="simple_pyhf",
... background_only_model=background_only,
... signal_patch=signal,
... )
>>> statistical_model.exclusion_confidence_level() # [0.9474850259721279]
For the rest of the functionalities, please refer to the spey
documentation, which can be found
in this link. Due to Spey’s fully
backend agnostic structure, all the functionalities of the StatisticalModel
class also
applies to pyhf
plug-in.
Arguments:
background_only_model
: This background-only model dictionary includes information about background yields, uncertainties and observations. Details on constructing these dictionaries can be found in pyhf’s online documentation.
signal_patch
: This signal patch includes dictionaries describing which regions will be added or removed from the statistical model.
analysis
(optional): Unique identifier for the analysis.
xsection
(optional): Cross-section value for the signal hypothesis. Units determined by the user.
Additionally, this plug-in is shipped with simple uncorrelated background-attachment which accesses
pyhf
’s uncorrelated_backgound
function can be accessed through spey with the following function
>>> import spey
>>> pdf_wrapper = spey.get_backend('pyhf.uncorrelated_background')
>>> data = [1]
>>> signal_yields = [0.5]
>>> background_yields = [2.0]
>>> background_unc = [1.1]
>>> stat_model = pdf_wrapper(
... signal_yields=signal_yields,
... background_yields=background_yields,
... data=data,
... absolute_uncertainties=background_unc,
... analysis="single_bin",
... xsection=0.123,
... )
>>> statistical_model.exclusion_confidence_level() # [0.32907621368190676]
Arguments:
signal_yields
: signal yields as a list.
background_yields
: background yields as a list.
data
: observations as a list.
absolute_uncertainties
: uncertainties on the background as a list.
analysis
(optional): Unique identifier for the analysis.
xsection
(optional): Cross-section value for the signal hypothesis. Units determined by the user.
Note
pyhf
offers an interface to combine the likelihoods that are described as JSON serialised
files. This has been exploited in spey
interface via combine()
function.
This function combines pyhf
workspaces and adjusts the signal structure accordingly. For more information
about how pyhf
handles the workspace combination see the dedicated tutorial here.