{"library":"pyhf","title":"pyhf - Pure-Python HistFactory","description":"pyhf is a pure-Python implementation of the HistFactory statistical model for binned data analysis, widely used in particle physics. It leverages modern tensor libraries like NumPy, TensorFlow, PyTorch, and JAX with automatic differentiation for efficient and scalable statistical inference. The current version is 0.7.6, and it follows a regular release cadence with patch releases addressing fixes and minor improvements, and minor versions introducing new features and sometimes API changes.","language":"python","status":"active","last_verified":"Sun May 17","install":{"commands":["pip install pyhf","pip install 'pyhf[tensorflow]'","pip install 'pyhf[torch]'","pip install 'pyhf[jax]' 'jaxlib'","pip install 'pyhf[full]'"],"cli":{"name":"pyhf","version":"pyhf, version 0.7.6"}},"imports":["import pyhf","import pyhf\npyhf.set_backend(\"numpy\")","import pyhf\nmodel = pyhf.Model(...)","import pyhf\nresult = pyhf.infer.mle.fit(...)","import pyhf\nmu_test_stat = pyhf.infer.test_statistics.qmu(...)"],"auth":{"required":false,"env_vars":[]},"quickstart":{"code":"import pyhf\nimport json\n\n# Define a simple workspace (example adapted from pyhf documentation)\nworkspace_data = {\n  \"channels\": [\n    {\n      \"name\": \"singlechannel\",\n      \"samples\": [\n        {\n          \"name\": \"signal\",\n          \"data\": [12.0],\n          \"modifiers\": [\n            {\"name\": \"mu\", \"type\": \"normfactor\", \"data\": None},\n            {\"name\": \"lumi\", \"type\": \"lumi\", \"data\": {\"correlated\": True, \"nom_data\": 1.0, \"rel_data\": 0.1}}\n          ]\n        },\n        {\n          \"name\": \"background\",\n          \"data\": [100.0],\n          \"modifiers\": [\n            {\"name\": \"lumi\", \"type\": \"lumi\", \"data\": {\"correlated\": True, \"nom_data\": 1.0, \"rel_data\": 0.1}},\n            {\"name\": \"bkg_norm\", \"type\": \"normfactor\", \"data\": None}\n          ]\n        }\n      ]\n    }\n  ],\n  \"observations\": [\n    {\n      \"name\": \"singlechannel\",\n      \"data\": [120.0],\n      \"modifier_data\": [\n        {\"name\": \"lumi\", \"type\": \"lumi\", \"data\": 1.0}\n      ]\n    }\n  ]\n}\n\n# Set the backend (e.g., 'numpy', 'tensorflow', 'torch', or 'jax')\npyhf.set_backend(\"numpy\")\n\n# Create a model from the workspace data\nworkspace = pyhf.Workspace(workspace_data)\nmodel = workspace.model(modifier_settings={'lumi': {'type': 'lumi', 'decorrelate': False}})\n\n# Prepare data and initial parameters for the fit\n# The model's data method handles observation and auxiliary data.\nactual_data = model.data(workspace.data)\ninit_pars = model.config.suggested_init()\nfixed_pars = model.config.suggested_fixed()\nbounds = model.config.suggested_bounds()\n\n# Perform Maximum Likelihood Estimation (MLE)\n# This fits the model to the data to find the best-fit parameters.\nfit_results = pyhf.infer.mle.fit(\n    data=actual_data,\n    pdf=model,\n    init_pars=init_pars,\n    fixed_params=fixed_pars,\n    par_bounds=bounds\n)\n\nprint(f\"Fitted parameters: {fit_results[0]}\")\nprint(f\"Parameter uncertainties: {fit_results[1]}\")\n\n# Example for hypothesis testing: fixing 'mu' (signal strength) to 0 (background-only hypothesis)\nmu_index = model.config.modifier_index('mu') # Get index of the 'mu' parameter\n\nbkg_only_init_pars = list(init_pars) # Create a mutable copy\nbkg_only_init_pars[mu_index] = 0.0 # Set mu to 0\n\nbkg_only_fixed_params = list(fixed_pars) # Create a mutable copy\nbkg_only_fixed_params[mu_index] = True # Fix mu at 0\n\nbkg_only_fit_results = pyhf.infer.mle.fit(\n    data=actual_data,\n    pdf=model,\n    init_pars=bkg_only_init_pars,\n    fixed_params=bkg_only_fixed_params,\n    par_bounds=bounds\n)\nprint(f\"Fitted parameters (mu=0 fixed): {bkg_only_fit_results[0]}\")","lang":"python","description":"This quickstart demonstrates how to define a simple HistFactory workspace, set a backend, create a pyhf model, and perform a basic maximum likelihood fit to extract best-fit parameters and their uncertainties. It also shows how to set and fix specific parameters for hypothesis testing.","tag":null,"tag_description":null,"last_tested":null,"results":[]},"compatibility":{"tag":null,"tag_description":null,"last_tested":"2026-05-17","installed_version":"0.7.6","pypi_latest":"0.7.6","is_stale":false,"summary":{"python_range":"3.10–3.9","success_rate":68,"avg_install_s":28,"avg_import_s":3.07,"wheel_type":"wheel"},"results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"full","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":2.14,"mem_mb":42.2,"disk_size":"239.6M"},{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"jax","exit_code":1,"wheel_type":null,"failure_reason":"build_error","import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"tensorflow","exit_code":1,"wheel_type":null,"failure_reason":"build_error","import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"torch","exit_code":1,"wheel_type":null,"failure_reason":"build_error","import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"pyhf","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":2.24,"mem_mb":42.2,"disk_size":"239.6M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"full","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":9.3,"import_time_s":1.72,"mem_mb":42.2,"disk_size":"231M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"jax","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":13.6,"import_time_s":1.64,"mem_mb":42.2,"disk_size":"594M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"tensorflow","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":42.6,"import_time_s":2.56,"mem_mb":44.7,"disk_size":"2.3G"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"torch","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":80.8,"import_time_s":2.16,"mem_mb":42.2,"disk_size":"4.8G"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"pyhf","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":8.8,"import_time_s":1.75,"mem_mb":42.2,"disk_size":"231M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"full","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":3.76,"mem_mb":51.9,"disk_size":"255.9M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"jax","exit_code":1,"wheel_type":null,"failure_reason":"build_error","import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"tensorflow","exit_code":1,"wheel_type":null,"failure_reason":"build_error","import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"torch","exit_code":1,"wheel_type":null,"failure_reason":"build_error","import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"pyhf","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":3.98,"mem_mb":51.9,"disk_size":"255.9M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"full","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":9,"import_time_s":3.48,"mem_mb":51.9,"disk_size":"245M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"jax","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":14.5,"import_time_s":3.51,"mem_mb":51.9,"disk_size":"643M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"tensorflow","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":40.1,"import_time_s":4.57,"mem_mb":54.7,"disk_size":"2.3G"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"torch","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":76.9,"import_time_s":3.95,"mem_mb":51.9,"disk_size":"4.9G"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"pyhf","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":8.6,"import_time_s":3.55,"mem_mb":51.9,"disk_size":"245M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"full","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":3.48,"mem_mb":50.7,"disk_size":"241.7M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"jax","exit_code":1,"wheel_type":null,"failure_reason":"build_error","import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"tensorflow","exit_code":1,"wheel_type":null,"failure_reason":"build_error","import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"torch","exit_code":1,"wheel_type":null,"failure_reason":"build_error","import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"pyhf","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":3.44,"mem_mb":50.8,"disk_size":"241.7M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"full","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":8.7,"import_time_s":3.56,"mem_mb":50.8,"disk_size":"231M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"jax","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":14.1,"import_time_s":3.68,"mem_mb":50.8,"disk_size":"628M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"tensorflow","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":40.6,"import_time_s":4.39,"mem_mb":53.5,"disk_size":"2.3G"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"torch","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":73.8,"import_time_s":5.39,"mem_mb":50.8,"disk_size":"4.9G"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"pyhf","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":8.4,"import_time_s":3.55,"mem_mb":50.8,"disk_size":"231M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"full","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":3.35,"mem_mb":51.1,"disk_size":"240.1M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"jax","exit_code":1,"wheel_type":null,"failure_reason":"build_error","import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"tensorflow","exit_code":1,"wheel_type":null,"failure_reason":"build_error","import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"torch","exit_code":1,"wheel_type":null,"failure_reason":"build_error","import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"pyhf","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":3.05,"mem_mb":51.1,"disk_size":"240.1M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"full","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":8.6,"import_time_s":3.19,"mem_mb":51.1,"disk_size":"229M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"jax","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":13.2,"import_time_s":3.16,"mem_mb":51.1,"disk_size":"626M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"tensorflow","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":37.9,"import_time_s":4.08,"mem_mb":54.1,"disk_size":"2.3G"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"torch","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":71.2,"import_time_s":3.71,"mem_mb":51.4,"disk_size":"4.9G"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"pyhf","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":8.3,"import_time_s":3.17,"mem_mb":51.1,"disk_size":"229M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"full","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":1.98,"mem_mb":40.3,"disk_size":"241.7M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"jax","exit_code":1,"wheel_type":null,"failure_reason":"build_error","import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"tensorflow","exit_code":1,"wheel_type":null,"failure_reason":"build_error","import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"torch","exit_code":1,"wheel_type":null,"failure_reason":"build_error","import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"pyhf","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":1.98,"mem_mb":40.3,"disk_size":"241.7M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"full","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":10,"import_time_s":1.91,"mem_mb":40.3,"disk_size":"238M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"jax","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":14.9,"import_time_s":1.98,"mem_mb":40.3,"disk_size":"564M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"tensorflow","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":48.5,"import_time_s":2.32,"mem_mb":42.7,"disk_size":"2.3G"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"torch","exit_code":1,"wheel_type":null,"failure_reason":"timeout","import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"pyhf","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":9.8,"import_time_s":1.96,"mem_mb":40.3,"disk_size":"238M"}]}}