Version 1.1.1

We have just released version 1.1.1, which you can find here.

Contributions

There have been 102 commits since version v1.1, which can be inspected here.

Contributors of these commits are:

  • Matthew Kirk
  • Stefan Meiser
  • Fatemeh Nouri
  • Méril Reboud
  • Danny van Dyk

Changelog

Changed

  • Rename eos.stderr_handler to eos.default_log_handler #1290 (D. van Dyk)
  • Let eos.set_log_level accept any Python log level or its name, e.g. 'DEBUG', and change the native log level in lock-step, also for the CLI’s verbosity #1290 (D. van Dyk)
  • Breaking: Rethrow the first exception raised while evaluating an observable in ObservableCache::update(), on the calling thread and only after every pending computation has been waited on, in lieu of logging it and writing a NaN into the affected prediction; every evaluation path now catches exceptions of any type, not only eos::Exception, so that an exception escaping a worker thread no longer terminates the process. Code that relied on update() never throwing must now handle the exception, and a single unevaluable point of a large grid surfaces as an error in lieu of a NaN log-posterior that a sampler steps straight past #1236 (D. van Dyk)
  • Test the eos-analysis commands in Python, in lieu of the bash script src/scripts/eos-analysis_TEST; the tests of the pypmc-based commands sample-mcmc, find-clusters, sample-pmc, and find-mode --from-mcmc are kept apart in eos/cli/analysis_pypmc_TEST.py (issue #1264) (D. van Dyk)
  • Breaking: Reject a task argument interpolated into the task’s output directory unless it is a single path component without whitespace, and reject file-local names . and .. in analysis files (issue #1291) (D. van Dyk)
  • Write each task’s outputs to a temporary directory that replaces the final one only once the task succeeds, so that a failed task leaves previous results untouched and no incomplete output directory behind; sample-mcmc now fails on a run time error in lieu of logging it and succeeding (issue #1291) (D. van Dyk)
  • Let kinematic aliases take precedence over kinematic variables of the same name, so that a kinematic specification in an expression applies even if the kinematics provide a variable of that name, e.g. in <<B->pi::f_+(q2)>> / <<B->pi::f_+(q2)>>[q2=0.0] (D. van Dyk)
  • Require at least Python 3.11 as 3.10 went EOL in October 2026 (M. Kirk)

Added

  • Add the Bbar^*->D and Bbar^*->D^* tensor form factors in the HQE parametrisation, following [BGJvD:2025A]; the FormFactors<VToP> and FormFactors<VToV> interfaces gain h_tbar_1 to h_tbar_3 and h_t4 to h_t10 respectively (D. van Dyk)
  • Add the reference [BGJvD:2025A] and cite it from BGLCoefficients and HQETUnitarityBounds, which implement its BGL coefficients for the tensor form factors and its 1^+ and 1^- tensor bounds (D. van Dyk)
  • Add batch computations to ObservableCache: add_batch() registers a group of observables that are evaluated into one contiguous, pre-allocated block of memory, partitioned across the available threads, and operator[](BatchId) retrieves their predictions as a std::span #1236 (D. van Dyk)
  • Add ObservableCache.used_parameter_ids, which reports the parameters used by all observables of a cache, including those evaluated in batches #1236 (D. van Dyk)
  • Add the class eos::ResolutionConvolution, which convolves a signal sampled on a uniform tensor-product grid of rank 1 to 4 with a fixed resolution kernel, through the discrete Fourier transform; the kernel is supplied in centred order and renormalised to unit sum, and the convolution is circular, so that the grid must be padded with a region in which both the signal and the resolution are negligible #1236 (D. van Dyk)
  • Add the class eos::DetectorLevelPDF and its Python counterpart eos.DetectorLevelPDF: a truth-level SignalPDF of rank 1 to 4 convolved with a detector resolution, which is itself a SignalPDF and can therefore be evaluated, sampled, and plotted like any other PDF. The truth PDF is sampled on the grid through a single ObservableCache batch, and the resolution is supplied either as an EOS expression in the per-axis offset variables, which is sampled anew whenever the parameters change, or as a pre-computed kernel grid #1236 (D. van Dyk)
  • Add the unbinned log-likelihood blocks LogLikelihoodBlock::Unbinned1D through Unbinned4D, and export them to Python as eos.LogLikelihoodBlock.Unbinned1D through Unbinned4D. Each takes an eos::DetectorLevelPDF whose rank matches, together with the individually observed events, and sums the logarithm of the normalized detector-level density over them; the grid is convolved once per evaluation and interpolated at every event. An optional list of non-overlapping windows restricts the events to their union and normalizes the density over it, through the new DetectorLevelPDF::integral() (eos.DetectorLevelPDF.integral in Python) #1236 (D. van Dyk)
  • Export SignalPDF.evaluate_linear to Python, which returns the unnormalized density on the linear scale #1236 (D. van Dyk)
  • Add the eos.data.UnbinnedLikelihood data object, a directory holding the individually observed events, the detector resolution, and the description of the native sampling grid that the resolution supports; the rank of the problem is detected from the number of axes rather than declared #1236 (D. van Dyk)
  • Add the type: unbinned analysis-file likelihood component, which builds an unbinned likelihood from an eos.data.UnbinnedLikelihood directory and the qualified name of the truth-level signal PDF fitted to it, and adds it to the posterior. Its optional axes key crops the data object’s native grid to a window without changing the node spacing; because the underlying real discrete Fourier transform requires an even number of points per axis, a crop that yields an odd count is reported as a diagnostic of severity ERROR and raises a ValueError in lieu of being silently adjusted. Its optional windows key restricts the fit to a union of non-overlapping boxes within the cropped axes, over which the detector-level PDF is normalized. Validation also checks the parameters and observables that the resolution of the data object refers to, so that a parameter used only there is no longer reported as unused #1236 (D. van Dyk)
  • Add a type key to the analysis-file likelihood components. It is presently required only for type: 'unbinned'; where it is absent, the kind of a component is inferred as before from the presence of the constraints, manual_constraints, or pyhf key #1236 (D. van Dyk)
  • Add a user-guide notebook on detector-level PDFs, which builds the truth-level 2D PDF of B->Dlnu in q2 and cos(theta_l), convolves it with a Gaussian q2 resolution assembled from EOS expressions, validates the result against manually smeared samples, and fits the form factor shape parameters to the smeared events through an unbinned likelihood in an analysis file #1236 (D. van Dyk)
  • Let functions in EOS expressions take several arguments, each of which may be a full expression, and accept prefixed function names such as Kernel::Gaussian; calling a function with the wrong number of arguments is reported as an error #1236 (D. van Dyk)
  • Add resolution kernels to EOS expressions, beginning with Kernel::Gaussian(u, mu, sigma), a density of unit area in its first argument, together with a decomposition of an expression into a linear combination of kernels in an offset variable, whose coefficients and kernel parameters may depend on parameters, observables, and other kinematic variables #1236 (D. van Dyk)
  • Add the resolution kernel Kernel::CrystalBall(u, mu, sigma, alpha_L, n_L, alpha_R, n_R) to EOS expressions, a Gaussian core with power-law tails on either side #1236 (D. van Dyk)
  • Add the functions atan, log, and the Heaviside step function theta to EOS expressions #1236 (D. van Dyk)
  • Add the signal_pdfs analysis-file section, which registers a truth-level signal PDF as the ratio of two observables, its unnormalized density and its normalization, either of which may be a custom observable of the same file #1236 (D. van Dyk)
  • Add the class eos::UnbinnedObservations and its Python counterpart eos.UnbinnedObservations, which hold the observed events of an unbinned likelihood and share them between copies. The unbinned log-likelihood blocks accept them in lieu of an array of events, and use their current events at every evaluation, so that replacing the events through set() reaches every block built from them, including the clones held by a LogLikelihood; many pseudo-data sets can thus be fitted without constructing the detector-level PDF anew #1236 (D. van Dyk)
  • Add the figure item detector-level-pdf, which plots a signal PDF convolved with a resolution, given either explicitly or through an eos.data.UnbinnedLikelihood data object #1236 (D. van Dyk)
  • Add the Faddeeva function eos::faddeeva_w (D. van Dyk)
  • Add eos::CauchyTransform, the Cauchy transforms of resolution kernels: for Kernel::Gaussian in closed form through the Faddeeva function, and for Kernel::CrystalBall to first order in the ratio of the width of a pole to the width of the kernel (D. van Dyk)
  • Add the subtraction of narrow poles of the truth-level amplitude to eos::DetectorLevelPDF and eos.DetectorLevelPDF.make_from_expression: the terms of the poles are subtracted from the truth-level PDF before the numerical convolution, and convolved analytically through the Cauchy transform of the resolution, which is evaluated at the query points rather than interpolated from the grid, and integrated over windows by Gauss-Legendre quadrature on panels of one grid spacing. The grid therefore only needs to resolve the resolution, not the widths of the poles. The subtraction coefficients are either given as observables, or extracted from the truth-level PDF on the grid points nearest to each pole; for grids of rank 2 to 4, they are convolved numerically with the resolution of the other axes (D. van Dyk)
  • Add the poles key to the type: unbinned analysis-file likelihood component (D. van Dyk)
  • Add the poles key to the figure item detector-level-pdf (D. van Dyk)
  • Let each data file of eos.figure.CornerFigure set its line style, line width, and opacity, as well as the contours and credibility levels of its kernel density estimates; level: null on a one-dimensional KDE item now shades no interval, rather than the 68.3% interval (D. van Dyk)
  • Let the templates of the report task load any YAML file through the function load_yaml(path), with path relative to the base directory (D. van Dyk)
  • Add two benchmark problems of the pole subtraction, which eos::register_benchmarks() and eos.register_benchmarks() register on request, as does importing eos with the environment variable EOS_REGISTER_BENCHMARKS set (D. van Dyk)
  • Add the eos-analysis task model-comparison, which compares a group of posteriors sharing the same likelihood by their nested-sampling evidences: it corrects for differing uniform or transform priors of shared parameters and records their log prior volumes, grades all pairwise Bayes factors on Jeffreys’ scale, and flags pairs whose conclusion is unstable under the evidence uncertainties or the prior-volume correction. The result is stored as the new eos.data.ModelComparison, exposed to reports through AnalysisData.model_comparisons, and shown at the top of the example report template (issue #1282) (D. van Dyk)
  • Let eos.figure.CornerFigure display an eos.data.Mode, drawn as a vertical line on the diagonal and as a point off the diagonal; eos.data.Mode gains a lookup_table #1302 (D. van Dyk)
  • Add kinematic substitutions to EOS expressions: <<B->pi::f_+(q2)>>[q2={m}^2] evaluates the referenced observable with q2 computed from other kinematic variables through constants and functions; parameters and observables are rejected. The substituted variable is computed whenever it is read, so that it follows changes of the kinematics, also within an ObservableCache and its clones (D. van Dyk)
  • Add derived kinematic variables to eos::Kinematics, declared through Kinematics::declare_derived() with a KinematicHook that computes the value whenever the variable is read; derived variables cannot be set, and follow clones of their kinematics (D. van Dyk)

Deprecated

Removed

  • Breaking: Remove the C++ base class eos::Density; eos::SignalPDF no longer offers begin()/end(), and its two clone() overloads are replaced by clone(const ObservableCache &), which returns a SignalPDFPtr #1303 (D. van Dyk)

Fixed

  • Fix eos.set_log_level to set the level of the default log handler rather than that of the logger, so that DEBUG messages are shown; correct the FAQ on setting the log level, which caused messages to be printed twice #1290 (D. van Dyk)
  • Use the mass parameters, rather than compile-time constants, when converting q2 to w in the V->V HQE form factors, as the other three transitions already did; setting mass::B_d^* or mass::D_u^* previously had no effect on the Bbar^*->D^* form factors (D. van Dyk)
  • Correct the normalization constants K passed to the outer function _phi for the tensor form factors t_1, t_2, t_23, and f_t in the BGL1997-like parametrization (D. van Dyk)
  • Evaluate the HQET form factors at zero recoil independently of the compiler’s use of fused multiply-add: reconstructing q2 from the meson masses reproduces w = 1 only up to rounding, and the auxiliary functions r and Omega returned NaN whenever it landed a few ulps below the endpoint (D. van Dyk)
  • Fix a reference leak in the conversion of Python sequences to std::vector in the Python bindings #1236 (D. van Dyk)
  • Fix ObservableCache::clone() to register the observables that a cloned expression refers to with the clone, rather than with the original cache #1236 (D. van Dyk)
  • Fix fixed kinematic values in expressions, e.g. <<B->pi::f_+(q2)>>[q2=1.0], which overwrote each other when several expressions, including nested ones, were made on the same kinematics (D. van Dyk)
  • Fix cloning an ObservableCache that holds an expression whose observables are made through a kinematic alias or a fixed kinematic value, which threw an UnknownKinematicVariableError (D. van Dyk)
  • Fix Kinematics::set() for an alias, which threw an UnknownKinematicVariableError, and for an unknown name, which accessed invalid memory (D. van Dyk)
  • Fix Kinematics::alias() to reject an alias name that is already installed, which it replaced silently; an expression whose kinematic specification renames, fixes, or substitutes a variable that a nested expression handles already now raises an error in lieu of yielding wrong values (D. van Dyk)
  • Breaking: Fix running of the transverse Gegenbauer moments for rho and K* mesons. The previous implementation did not subtract the running of the transverse decay constant #1311 (S. Meiser)

Version 1.1

We have just released version 1.1, which you can find here.

Contributions

There have been 367 commits since version 1.0.21, which can be inspected here.

Contributors of these commits are:

  • Carolina Bolognani
  • Lorenz Gärtner
  • Matthew Kirk
  • Simon Mutke
  • Méril Reboud
  • Mark E Smith
  • Danny van Dyk

Changelog

Changed

  • Breaking: Rename the BFW2010, BMRvD2022 and ABR2022 form factor parametrizations to SE (D. van Dyk)
  • Breaking: Rename the hadronic-matrix-element mass parameters shared by the BSZ2015, SE, SSE, BGL1997, and HKVT2025 form factor parametrizations from an @BSZ2015/@SE suffix to @HME, since these are shared parametrization inputs rather than parametrization-specific fit outputs or physical masses; any saved parameter samples or analysis files that name a mass::...@BSZ2015 or mass::...@SE parameter explicitly must be updated to @HME (D. van Dyk)
  • Breaking: Default eos.figure.ConstraintResidueItem to a new style: 'pull', drawing each residue as a bar in units of standard deviations; the previous error-bar drawing of the absolute deviation is still available via style: 'delta' (D. van Dyk)
  • Breaking: Removes and forbids the $ signs in the latex representation of parameters (M. Reboud)
  • Breaking: Remove the WET-SMEFT model, which imposed the relations among the b->sll Wilson coefficients that follow from matching the SMEFT onto the WET; EOS uses the most general basis of dimension-six WET operators throughout, and imposing any such relation is left to the user (D. van Dyk)
  • Breaking: Stamp the EOS watermark on a single plot of an eos.figure.GridFigure by default – the bottom-right one that is not an empty plot – in lieu of every plot; watermark_plot: 'all' restores the previous behaviour, and an explicitly selected plot is now stamped even if it is empty (issue #1255) (D. van Dyk)
  • Accept the watermark and watermark_plot keys in an eos.figure.CornerFigure, whose watermark is placed by default in the plot in the bottom-left corner (issue #1255) (D. van Dyk)
  • Breaking: Record the varied parameters of an eos.data.MixtureDensity as full parameter descriptions (name, min, max) under a parameters key, as the other eos.data objects do, and bump its on-disk format to v2; eos.data.MixtureDensity.create now requires them, its varied_parameters attribute yields those descriptions in lieu of bare qualified names, and the find-clusters and mixture-product tasks record them. Format-v1 files remain readable (issue #848) (D. van Dyk)
  • Report problems in an analysis file as located eos.diagnostic.Diagnostic objects in lieu of raising on the first one: loading now enforces a structural validation phase, while a separate and side-effect-free semantic phase resolves the file’s own custom parameters, observables and constraints through a per-file validation context, checks expressions through the C++ expression parser without registering them, reports unused priors, likelihoods, masks, and custom entities, and reports parameters that a posterior fixes while one of its own priors varies them or that neither its likelihood nor any of its predictions uses (D. van Dyk)
  • Attach the source YAML line number to each eos.diagnostic.Diagnostic reported for an analysis file, resolved by walking the file’s raw YAML parse tree rather than the already-parsed structure, since the latter has discarded that information by the time a diagnostic is created (L. Gärtner)
  • Restrict file-local names in analysis files to exclude / and whitespace (D. van Dyk)
  • Replace the hand-rolled eoshep-before wheel-preparation recipe with a PEP 517 build driven by pyproject.toml and setup.py: setuptools now compiles the _eos extension from source against a staged installation prefix, and auditwheel/delocate perform all library bundling and RPATH/install-name rewriting, in lieu of a hand-maintained shared-object regex, manual chrpath calls, and an _eos_libs package that duplicated the libraries the repair tools bundle anyway; the cp312 Linux wheel shrinks from 88 MB to 21 MB as a result (D. van Dyk)
  • Ship all nine command-line scripts in the wheel, up from the six that were previously listed by hand (D. van Dyk)
  • Determine eos.is_wheel at runtime from the presence of the _eos_data package, in lieu of appending a line to a copy of eos/config.py while building the wheel; the file in the source tree and the file in the wheel are now identical (D. van Dyk)
  • Split Figure.draw() into Figure.draw() and Figure.save() (D. van Dyk)
  • Update the documentation to discuss the SE and SSE form factor parametrizations, reflect that SSE is now the default choice (D. van Dyk)
  • Default the --with-boost-python-suffix used at ./configure time to the Python major+minor version (e.g. 312 for CPython 3.12), matching the modern Boost.Python naming convention used by conda-forge and current Debian/Ubuntu/Fedora releases, in lieu of the previous OS/codename-based detection (D. van Dyk)
  • Extend the inference example figure with a residual panel showing each constraint’s pull below the main panel (D. van Dyk)
  • Move the implementation of the eos-analysis command into the new module eos.cli.analysis, leaving the script as a shim, so that its subcommands can be tested and called from Python (D. van Dyk)
  • Notify the callbacks registered with the Log singleton without holding its lock, and document that they may therefore be invoked concurrently and have to be thread-safe: a callback that waits for a resource held by a thread which is itself emitting a message deadlocked both threads (D. van Dyk)
  • Deliver a native log message to the Python logger synchronously and in order, in lieu of deferring it to the main thread through Py_AddPendingCall; messages emitted after atexit no longer reach Python, since that is where the callbacks’ references are released (D. van Dyk)
  • Bounds-check the id that a parameter name maps to in Parameters::operator[], matching the check that its Parameter::Id overload already performs, so that an id outliving its parameter is reported in lieu of read out of bounds (D. van Dyk)
  • Enforce dynesty>=3.0.0 on installation (C. Bolognani)
  • Fix the integration routines to avoid anticipated termination of the range subdivision (M. Reboud)
  • Templatise the cacheable observable machinery on the type of the intermediate result, so that one provider can offer several of them (D. van Dyk)
  • Declare a cacheable observable through the new cache() and evaluate() helpers, which pair each half of it with the kinematic variables that half consumes: an observable’s kinematic variables no longer all enter its intermediate result, and observables that differ only in the variables their evaluation consumes now share one (D. van Dyk)
  • Obtain a cacheable observable’s provider, its option specifications, and its references through the new impl::ProviderTraits class template, so that a provider which a factory selects – as a form factor parametrization is selected from the observable’s prefix – can back a cacheable observable, in lieu of only one constructed from a set of parameters and a set of options (D. van Dyk)
  • Move the base of all intermediate results out of CacheableObservable into eos::IntermediateResult, declared in the new header eos/utils/intermediate-result.hh, so that a provider below the observable layer, such as a form factor, can derive from it without depending on the observable interface (D. van Dyk)
  • Move the implementation of the eos-figure command into the new module eos.cli.figure, leaving the script as a shim, so that its subcommands can be tested and called from Python (D. van Dyk)
  • Move the implementations of the eos-list-observables and eos-list-references commands into the new modules eos.cli.list_observables and eos.cli.list_references, leaving the scripts as shims (D. van Dyk)
  • Reimplement the eos-list-constraints, eos-list-parameters, and eos-list-signal-pdfs commands in Python, as the new modules eos.cli.list_constraints, eos.cli.list_parameters, and eos.cli.list_signal_pdfs, in lieu of the C++ clients of the same names; their output is unchanged, except that eos-list-parameters now sorts the parameter sections by name, since the order in which EOS reads their files is arbitrary (D. van Dyk)
  • Recommend make -j4 over make -j when building EOS, and warn that an unbounded parallel build can exhaust the available memory (D. van Dyk)
  • Breaking: Default the form factor option of the semileptonic, rare, and nonlocal form factor observables to the SSE parametrization, in lieu of the previously process-dependent choices BSZ2015, BCL2008, BFvD2014, DM2016, SE, and DKMR2017; predictions made with the default form factors change accordingly, and an analysis that relies on a previous default has to name it explicitly through the form-factors option (D. van Dyk)
  • Force the V option of the B_s->K^*lnu and B_s->D_s^*lnu observables, which could not be constructed from their names alone because the option carries no default (D. van Dyk)
  • Fix the value of the B option of the Lambda_c->Neutronlnu observables, which named the final state Neutron in lieu of the neutron that the form factors and the option’s allowed values use (D. van Dyk)
  • Report all LaTeX errors in Parameters, Observables and References rather than just the first one (M. Kirk)
  • Rename the “Reference” section of the documentation to “Reference Manual” (issue #1281) (D. van Dyk)
  • Name the base directory of an example notebook after the notebook: simulation.ipynb writes below simulation-base in lieu of simulation-data, and analysis-organisation.ipynb below analysis-organisation-base in lieu of its own directory (D. van Dyk)
  • Name a type in the :type: fields of the docstrings, in lieu of prose such as iterable, 2D numpy array, or int > 0; the admissible range of a value is now stated in the description of the parameter (issue #779) (D. van Dyk)
  • Build the documentation in Sphinx’ nitpicky mode and treat its warnings as errors, so that a reference which does not resolve fails the build (issue #779) (D. van Dyk)
  • Let a task declare more than one output through the eos.tasks.task decorator, and declare the importance samples that sample-nested and sample-pmc write and the masked predictions that predict-observables writes, so that eos-data check no longer reports them as unclaimed (D. van Dyk)
  • Report an absent output of the predict-observables or create-mask task as a warning in eos-data check, since it can be regenerated from the importance samples, and report an output that lacks one of its data files as an error (D. van Dyk)

Added

  • Add the SSE parametrization of the Lambda_b->Lambda_c form factors, whose coefficients default to a description of the DKMR2017 results (D. van Dyk)
  • Test that every observable of the b-decays, c-decays, nonlocal-form-factors, rare-b-decays, rare-c-decays, s-decays, and tau-decays sections can be constructed with its default options, through a new observables_TEST in each of these directories (D. van Dyk)
  • Add height_ratios and width_ratios to eos.figure.GridFigure, for sizing a grid’s rows and columns unevenly (D. van Dyk)
  • Add a mode_file key to eos.figure.ConstraintResidueItem, reading the best-fit parameter values directly from a stored eos.data.Mode (e.g. as written by eos.tasks.find_mode) in lieu of an explicit parameters dictionary (D. van Dyk)
  • Add a locations key to eos.figure.plot.XTicks and YTicks for pinning explicit major-tick positions, since automatic tick placement chooses its step from the axes’ rendered size and can otherwise label a small panel differently than intended (D. van Dyk)
  • Add the function eos.analyze_expression, which reports whether an EOS expression is well-formed and which observables and parameters it references, without registering anything (D. van Dyk)
  • Document how to build an eoshep wheel manually, in a new “Building a Wheel Manually” section of the installation guide (D. van Dyk)
  • Add the SSE (Simplified Series Expansion) form factor parametrization for pseudoscalar-to-pseudoscalar, pseudoscalar-to-vector, and 1/2^+ -> 1/2^+ transitions (D. van Dyk)
  • Add the M:2017A reference and its constraints on the Lambda_c->proton and Lambda_c->neutron form factors (D. van Dyk)
  • Add the mass::D_u,0@HME and mass::D_u,1@HME parameters (D. van Dyk)
  • Add the mass::Lambda_c(2595)@HME, mass::Lambda_c(2625)@HME, and mass::Lambda(1520)@HME parameters (D. van Dyk)
  • Add the Lambda_b->Lambda(1520)::tp_v@SE, Lambda_b->Lambda(1520)::tp_a@SE, and Lambda_b->Lambda(1520)::t0@SE parameters (D. van Dyk)
  • Add the eos-data check, create, publish, and register commands for validating analysis datasets, creating citable dataset tags, publishing GitHub releases for Zenodo, and registering published datasets (D. van Dyk)
  • Expose the name_part(), year_part(), and index_part() accessors of eos.ReferenceName to Python, which eos.References’ year and index filters require (D. van Dyk)
  • Add a has() member function to the Constraints, Kinematics, Observables, Options, Parameters, References, and SignalPDFs classes, and export it to Python as __contains__, so that name in eos.Constraints() and its analogues report membership (D. van Dyk)
  • Add a test case that creates every class exported to Python and calls each of its members, and that fails for any class or member exported in future without either an entry describing how to exercise it or an explicit exemption (D. van Dyk)
  • Add a test case that checks that every class and member exported to Python carries a docstring, and that the docstring describes every argument that its binding declares under the name that callers must use (D. van Dyk)
  • Add docstrings to the 57 classes and members exported to Python that carried none, among them the eos.Parameters, eos.Observables, eos.Constraints, eos.References, and eos.SignalPDFs base classes, the section and group classes that organise them, eos.KinematicVariable, eos.OptionSpecification, and all thirteen eos.Unit factory methods (D. van Dyk)
  • Add __repr__, __eq__, and __hash__ to eos.ObservableId, so that an observable cache handle prints as ObservableId(0), compares by value, and can serve as a dictionary key (D. van Dyk)
  • Accept the lepton flavor as a str in eos.Model.wilson_coefficients_b_to_s, which no Python call could satisfy before for want of a converter (D. van Dyk)
  • Add ThreadPool::WaitGuard, a guard that a thread holds while it waits for the work it enqueued, so that an embedding runtime can relinquish exclusive access to its own state for as long as the pool’s threads need it in turn; the Python bindings install one that detaches the calling thread from the interpreter (D. van Dyk)
  • Add a test case that races sixteen threads for a singleton’s first instance() call and checks that exactly one instance is constructed (D. van Dyk)
  • Add a generation index to Parameters, exported to Python as the eos.Parameters.generation property: it changes whenever any of the parameters is written to and is invariant under reading them, so that a consumer can reuse a costly parameter-dependent result across observables that differ only in their kinematics (D. van Dyk)
  • Add eos-mcp-server, an optional local MCP (Model Context Protocol) server exposing eos.Observables, eos.Parameters, eos.Constraints, and eos.References as read-only lookup tools for an LLM coding agent, shipped as eos.mcp behind the new mcp extra (L. Gärtner)
  • Add an opaque intermediate result to the FormFactors<VacuumToPP> interface: it depends on the parameters only, is obtained from prepare(), and is passed to every accessor alongside that accessor’s own kinematic variables, so that a parametrization can hoist an expensive parameter-dependent step out of its per-q^2 work (D. van Dyk)
  • Register the twelve 0->pipi and 0->Kpi form factor observables as cacheable observables, so that they share one intermediate result across all values of q^2 within one update of an observable cache (D. van Dyk)
  • Export MemoisationControl to Python, so that eos.MemoisationControl.instance().clear() frees the memory held by all memoisation caches (L. Gärtner)
  • Expose the numerator_kinematic_variables() and denominator_kinematic_variables() accessors of eos.SignalPDFEntry to Python, which listing a signal PDF’s kinematic variables requires (D. van Dyk)
  • Add double-differential rates tau->K_Spinu::d^2Gamma/dq^2/dcos(theta_K) and similar based on [EPPRR:2026A] (D. van Dyk)
  • Link every bibliography entry that carries an INSPIRE id to its INSPIRE record, so that an entry without an eprint is no longer listed without any link at all (D. van Dyk)
  • Link every bibliography entry that carries a URL but not INSPIRE id or arXiv eprint to said URL, so that an entry is no longer listed without any link at all (M. Kirk)
  • Check the LaTeX representation of every observable in doc/doc_TEST.py, mirroring the existing check of the parameters (D. van Dyk)
  • Declare the ipywidgets dependency, which eos.tasks imports whenever a task runs under IPython (D. van Dyk)
  • Expose url() property of eos.Reference to Python, so that the URL of a reference can be retrieved (M. Kirk)
  • Add final check on generated documentation to look for LaTeX -> HTML conversion errors (M. Kirk)
  • Document the format of the constraint files in the new “Constraint Format” section of the reference manual (D. van Dyk)
  • Document that a working (Xe)LaTeX installation is required for some functionality, such as the PDF output of the report task and the labels drawn by eos.figure (D. van Dyk)
  • Document eos.analysis_file_context.AnalysisFileContext, eos.data.SampleMask, eos.diagnostic.Diagnostic, eos.diagnostic.Severity, eos.PyhfLogLikelihood, and the bound classes eos.KinematicVariable, eos.ObservableId, eos.ReferenceName, and the parts of a qualified name and of a reference name (issue #779) (D. van Dyk)
  • Resolve references to the types documented by Python, NumPy, SciPy, matplotlib, and pyhf through intersphinx, whose inventories are pinned in doc/_inventories/ so that the documentation builds without network access (issue #779) (D. van Dyk)
  • Add the k_\perp-dependent branching ratio observables dBR/dkperp and BR(kperp_min,kperp_max) to all B->Plnu and B->Vlnu decays, which so far were only available for B_s->D_slnu; this also adds the k_\perp-differential branching ratio to BToVectorLeptonNeutrino, which previously offered only the integrated one. For B->D^*lnu the two new observables follow the naming of that decay’s other observables: BR_CP_specific(kperp_min,kperp_max) and dBR_CP_specific/dkperp evaluate a single CP conjugate, while the unqualified BR(kperp_min,kperp_max) and dBR/dkperp are the corresponding CP averages (D. van Dyk)
  • Document the eoshep/ubuntu-resolute Docker image, which ships all of EOS’s build dependencies pre-installed, as an alternative to installing them by hand (D. van Dyk, M. Kirk)
  • Add a workflow to generate Docker images with each released version of EOS preinstalled, and document them (M. Kirk)

Deprecated

Removed

  • Remove the eos.plot Python package, deprecated for removal in version 1.1; use the eos.figure package instead (D. van Dyk)
  • Remove the corner-plot task and the eos-analysis corner-plot command, deprecated for removal in version 1.1; declare a figure of type corner (eos.figure.CornerFigure) in the analysis file and draw it with the draw-figure task instead (D. van Dyk)
  • Remove the eos-plot, eos-plot-1d, and eos-plot-2d scripts, which were mere drivers for the removed eos.plot package; use the eos-figure draw command instead (D. van Dyk)
  • Remove the eos-analysis plot-samples command, whose sole output was produced by the removed eos.plot package; declare a figure in the analysis file and draw it with the draw-figure task instead (D. van Dyk)
  • Remove the eos.Mutable and eos.ParameterDescription classes, which no exported function or member could produce and which therefore could not be reached from Python (D. van Dyk)
  • Remove the eos-make-constraint, eos-merge-mcmc, eos-prepare-home, eos-print-modes, and eos-print-uncertainty scripts, none of which could be run any longer: all but one referred to the HDF5-based data-file classes that eos.data no longer provides, and eos-prepare-home imported a module that no longer exists; use eos-analysis create-constraint in lieu of eos-make-constraint (D. van Dyk)
  • Remove the --base-directory option of the eos-figure draw command, which the command never read; the base directory addresses the data files of an analysis and therefore belongs to eos-analysis (D. van Dyk)
  • Remove the polarization-dependent Lambda_c->Lambda and Lambda_c->neutron saturation observables Saturation[...,0], Saturation[...,perp], and Saturation[...,para]; use the polarization-summed Saturation[...] in their stead, as the mesonic transitions and the Lambda_b ones already do (D. van Dyk)
  • Remove the eos-evaluate, eos-print-polynomial, and eos-scan command-line clients together with the libcli library that supported them, leaving EOS without C++ clients; polynomials in the Wilson coefficients are now created from Python, and eos-scan had not been part of the build for years. The btopilnu-evaluate.bash CLI example is removed along with eos-evaluate (D. van Dyk)

Fixed

  • Declare B_s->D_slnu::BR(kperp_min,kperp_max) dimensionless in lieu of GeV^-1: integrating dBR/dkperp over k_\perp yields a branching ratio, so the advertised unit made a client apply a spurious unit conversion (D. van Dyk)
  • Correct the Lambda_c mass entering the Lambda_b->Lambda_c, Lambda_c->Lambda, Lambda_c->proton, and Lambda_c->neutron unitarity-bound thresholds to match the canonical mass::Lambda_c parameter (D. van Dyk)
  • Convert the Lambda_b->Lambda_c::DKMR2017, Lambda_b->Lambda::DM2016, Lambda_b->Lambda_c(2595)::HQET, Lambda_b->Lambda_c(2625)::HQET, and Lambda_b->Lambda(1520)::SE form factors to read their initial- and final-state masses from Parameters in lieu of hardcoded compile-time constants that could silently drift from the corresponding @HME parameter values (D. van Dyk)
  • Fix displaying eos.Constraints in a notebook, which raised for the 20 constraints whose qualified name has no suffix part and therefore no associated reference (D. van Dyk)
  • Fix eos.References’ year and index filters, which raised an AttributeError on every entry (D. van Dyk)
  • Fix eos.Parameters.FromWCxf for the b->s Wilson coefficients that EOS treats as real-valued, which raised an “Unknown parameter” error in lieu of taking their real-valued branch (D. van Dyk)
  • Fix membership tests on eos.Constraints, eos.Kinematics, eos.Options, eos.Parameters, eos.References, and eos.SignalPDFs, which fell through to iteration over (name, entry) pairs and therefore reported False for every name, including names that exist (D. van Dyk)
  • Fix Observables::has(), which consulted the copy of the observable registry taken when the Observables object was created in lieu of the registry that Observables::operator[] consults, and therefore did not find observables inserted at run time (D. van Dyk)
  • Fix eos-analysis list-likelihoods --display, which addressed the likelihood description as a dictionary and reported every likelihood as specifying neither the constraints nor the manual_constraints key; the command now also lists a likelihood’s pyhf file (D. van Dyk)
  • Fix eos.tasks.find_mode to include the first optimization when searching for the best-fit point: a single optimization step previously raised an AttributeError, and any run silently discarded the result of the first step (D. van Dyk)
  • Fix eos.figure.ConstraintItem for MultivariateGaussian constraints, which raised an UnboundLocalError whenever the observable key carried an options part (D. van Dyk)
  • Fix eos.figure.UncertaintyBandItem to compare the options of the requested observable against those recorded in the data file as strings, in lieu of comparing them against qnp::OptionKey and qnp::OptionValue objects that never equal them, which silently plotted predictions computed with other options (D. van Dyk)
  • Fix eos.figure.ConstraintItem, ConstraintResidueItem, and TwoDimensionalConstraintItem to report an unknown constraint as a ValueError, in lieu of the RuntimeError that reached the user because the guard tested the looked-up entry for falsiness after the lookup had already raised (D. van Dyk)
  • Fix three diagnostic messages in eos.figure.ConstraintItem and eos.figure.ConstraintResidueItem that lacked an f prefix and therefore reported the names of skipped observables as literal braces (D. van Dyk)
  • Fix an intermittent segfault at interpreter shutdown after eos.register_python_observable: the registered entry holds a reference to the Python provider and lives in a process-wide registry that outlives the interpreter, so releasing the reference during static destruction ran after the interpreter had shut down; the references are now released through atexit while the interpreter is still alive (D. van Dyk)
  • Fix eos.LogPrior.Gaussian, which reported no varied parameters at all, so that a Gaussian prior contributed none to an eos.LogPosterior and could not be recognised as varying its parameter (D. van Dyk)
  • Fix eos.LogPosterior.add, which accepted a second prior on an already-varied parameter: the set of names that the duplicate check consults was read but never written (D. van Dyk)
  • Fix the keyword names declared for eos.make_wilson_polynomial_ratio_observable, which named only three of its four arguments and therefore bound name to the numerator and reference_observable to the denominator (D. van Dyk)
  • Fix the docstring of eos.LogPrior.Scale, which described its scale factor as lambda, a Python reserved word that can never be a keyword argument, in lieu of the declared scale (D. van Dyk)
  • Fix a segfault when evaluating an observable that a Python provider backs: the ObservableCache dispatches observables to threads of EOS’s own making, which called into the interpreter without holding the GIL; the external log prior and log-likelihood block now acquire it as well, although they are reached on the calling thread (D. van Dyk)
  • Fix a segfault when a callback registered with the native log outlives the caller’s last reference to it: the Log singleton recorded the Python callable as a borrowed reference, and now holds one of its own until atexit (D. van Dyk)
  • Fix eos.Parameters.declare appending a second entry for a name it has already declared, which grew the process-wide set of default parameters by one entry for every eos.AnalysisFile that declares parameters of its own and left two eos.Parameters objects created at different times disagreeing on which id a name denotes (D. van Dyk)
  • Fix the double-checked locking in InstantiationPolicy<T_, Singleton>::instance(), which read the instance pointer outside its lock without synchronisation and could therefore hand a thread a pointer to an object whose construction it cannot yet observe (D. van Dyk)
  • Fix the order of marking a Ticket and releasing the job associated with it, curing a race condition leading to a rare segfault on the Python side (D. van Dyk)
  • Share an intermediate result only between cacheable observables that agree on the function preparing it and on the implementation behind their provider interface: two observables of one provider whose prepare functions have the same signature were grouped together, and the second silently evaluated the first’s intermediate result (D. van Dyk)
  • Fix the arXiv identifier that eos-list-references prints: it searched the reversed eprint id for a colon and then sliced the unreversed id at that index, so that oai:arXiv.org:1912.09335 was reported as arXiv:org:1912.09335 (D. van Dyk)
  • Fix eos-list-constraints --dump-as-yaml, which emitted each constraint nested inside the one before it, so that the dump of all 741 constraints parsed as a mapping of 7 entries and the remainder was unreachable (D. van Dyk)
  • Fix bug in scalar contributions to tau->K_spinu::dBR/dq2 and tau->K^-pinu::dBR/dq2 (issue #1203) (D. van Dyk)
  • Fix the LaTeX descriptions of the B->K^*ll::P'_{4,5,6}(q2) and B->K^*ll::P'_{4,5,6,8}@LHCb observables, the former naming the kinematic variable q2 in lieu of q^2, the latter placing a second superscript on a symbol that already carries a prime, which LaTeX rejects (D. van Dyk)
  • List FFTW3 among the prerequisites and add it to the apt and brew commands, since configure refuses to build EOS without it (D. van Dyk)
  • Describe --with-boost-python-suffix as encoding the Python version that BOOST.Python was built against, in lieu of leaving it to be read as the minimal Python version EOS requires, and refresh its stale libboost_python39 and python3.8 examples (D. van Dyk)
  • Sort the list of units in the conventions page, which was built from a set and therefore ordered differently in every build (D. van Dyk)
  • Let a display equation that exceeds the page width scroll horizontally in lieu of running off the page, and split the baryonic vector and axialvector matrix elements over more lines (D. van Dyk)
  • Fix a stray space in the basics example notebook, and an invalid \p escape sequence in the analysis-organisation example notebook that emitted a SyntaxWarning into the rendered documentation (D. van Dyk)
  • Rename the custom observable of the b-to-u-l-nu example analysis file to B->pilnu::R_pi_e, since it shadowed the built-in B->pilnu::R_pi, which is a ratio of tau and muon modes rather than of tau and electron modes (D. van Dyk)
  • Emit eos.figure’s per-item progress message at debug level in lieu of info level, so that drawing a figure no longer writes one line per item to stderr (D. van Dyk)
  • Forward the parameters used by the ParameterUser members that a ParameterUser owns, so that the set of used_parameter_ids an observable reports is complete. The SE, SSE, BSZ2015, BGL1997, DM2016, DKMR2017, and HKVT2025 form factors now cover their traits objects; the B->gamma QCDF form factors cover the B-meson LCDAs and the model; HQETUnitarityBounds covers the BGL coefficients; the Lambda_b->Lambda_c zero-recoil sum rules cover the Lambda_c(2595) form factors; the Bq->D(*)q P amplitudes cover the light-meson LCDAs; BsToPhiDileptonAndConjugate covers both of its B_s->phill members; and a further set of classes cover the model (D. van Dyk)
  • Re-raise the exception of a failing task once the ipywidgets output widget has displayed it: the widget suppresses whatever is raised within it, so a task that failed inside a notebook was reported and then ignored, and a failing example produced a successful documentation build (D. van Dyk)
  • Typeset the parameter names of the inference report template as math, so that eos.tasks.report produces its PDF in lieu of failing in XeLaTeX (D. van Dyk)
  • Name pypandoc in the installation instructions, in lieu of the unrelated pandoc package on PyPI, and list it among the packages to install into a virtual environment (D. van Dyk)
  • Define \pandocbounded in the report template, which pandoc 3 wraps around every image and which only its own template provides, so that eos.tasks.report produces its PDF with a current pandoc (D. van Dyk)
  • Drop the dollar signs from the latex representations declared in the b-to-u-l-nu and x-parameters example analysis files, which the latex representation of a parameter no longer accepts (D. van Dyk)

Version 1.0.21

We have just released version 1.0.21, which you can find here.

Contributions

There have been 293 commits since version 1.0.20, which can be inspected here.

Contributors of these commits are:

  • Dominik Suelmann
  • Matthew Kirk
  • Nico Gubernari
  • Danny van Dyk

Changelog

Changed

  • Rename the following signal PDFs (D. van Dyk)
    • B->gammalnu::d^2Gamma/dEgamma/dcos(theta_l) -> B_u->gammalnu::P(E_gamma,cos(theta_l))
    • B_u->enumumu::d^5Gamma -> B_u->enumumu::P(q2,k2,z_gamma,z_w,phi)
    • B_u->munuee::d^5Gamma -> B_u->munuee::P(q2,k2,z_gamma,z_w,phi)
    • B->pilnu::dGamma/dq2 -> B->pilnu::P(q2)
    • B->pilnu::d^2Gamma/dq2/dcos(theta_l) -> B->pilnu::P(q2,cos(theta_l))
    • B->Dlnu::dGamma/dq2 -> B->Dlnu::P(q2)
    • B->Dlnu::d^2Gamma/dq2/dcos(theta_l) -> B->Dlnu::P(q2,cos(theta_l))
    • B->D^*lnu::dBR -> B->D^*lnu::P(q2)
    • B->D^*lnu::d^4Gamma -> B->D^*lnu::P(q2,cos(theta_l),cos(theta_D),phi)
    • B_s->K^*lnu::dBR -> B_s->K^*lnu::P(q2)
    • B_s->K^*lnu::d^4Gamma -> B_s->K^*lnu::P(q2,cos(theta_l),cos(theta_K),phi)
    • B->pipimunu::d^3Gamma@QCDF -> B^+->pi^+pi^-lnu::PDF(q2,k2,cos(theta_pi))
    • B->Knunu::dGamma/dq2 -> B->Knunu::P(q2)
    • B->Kll::d^2Gamma@LargeRecoil -> B->Kll::P(q2,cos(theta_l))
    • B->K^*nunu::dGamma/dq2 -> B->K^*nunu::P(q2)
    • B->K^*ll::d^2Gamma@LargeRecoil -> B->K^*ll::P(q2,cos(theta_l))
  • Make pypmc an optional Python dependency and adjust the documentation (D. van Dyk)
  • Split the eos.data package into multiple modules, one per class (D. van Dyk)
  • Convert the eos.data classes (MarkovChain, Mode, ImportanceSamples, DynestyResults, NabuLikelihood, Prediction, SampleMask, PMCSampler, and MixtureDensity) to the new eos.Serializable/eos.Deserializable interface, and bump the on-disk format for eos.data.Mode (D. van Dyk)
  • Allow the characters |, (, ), and * in qnp::OptionValue (D. van Dyk)
  • Switch Options to use qnp::OptionValue in lieu of std::string for its option values; hard-coded option values are now expressed using the _ov user-defined literal (D. van Dyk)
  • Use qnp::OptionValue keys in the the factory method Model::make (D. van Dyk)
  • Use std::filesystem in lieu of boost::filesystem (D. van Dyk)
  • Use std::format in lieu of boost::format when templating parameters (D. van Dyk)
  • Change the interface for generating reports: report templates now access the recorded results through a single, lazily-loaded eos.reporting.AnalysisData object (iterating over the posteriors and, on demand, their importance samples, modes and goodness of fit, and predictions) together with a corner_figure helper, in lieu of the previous analyses, modes, len, and zip template variables (D. van Dyk)
  • Move AnalysisFileContext into its own module, eos.analysis_file_context (D. van Dyk)
  • Deserialize analysis files through a new eos.AnalysisFileDescription class, which maps the YAML structure to description objects and rejects unknown top-level keys (issue #1197) (D. van Dyk)
  • Replace the dedicated BToDPiLeptonNeutrino implementation of the B->D^*lnu 1D PDFs with the general BToVectorLeptonNeutrino class; the observables are renamed from B->Dpilnu::P(...) to B->D^*lnu::P(...) and the Belle:2017A constraints are updated accordingly (D. van Dyk)
  • Return bin-averaged densities for the angular B->D^*lnu::P(cos(theta_D)...), ...P(cos(theta_l)...), and ...P(phi...) observables, consistent with the other 1D PDFs, and rescale the Belle:2017A angular distributions by their bin widths (D. van Dyk)
  • Bump the CodeQL Action to v4 in the compiler-warning SARIF upload workflow (D. van Dyk)
  • Ignore the files generated by running the examples in examples/ (D. van Dyk)
  • Adapt eos/maths, eos/meson-mixing, and eos/statistics to clang-format-based coding style (D. van Dyk)
  • Let legend keys reflect what variety of color+opacity are actually plotted in eos.figure items (D. van Dyk)

Added

  • Add G2026 form factor parameterisation (N. Gubernari)
  • Add B(s) -> K(*) constraints from BGMT:2025A (N. Gubernari)
  • Add BSZ:2025A constraints in the Traditional Basis (N. Gubernari)
  • Add B->pi f0 and f+ constraints from FLAG:2024A (N. Gubernari)
  • Add Lambda_c->pll observables (D. Suelmann)
  • Add the following signal PDFs (D. van Dyk)
    • B_s->Klnu::P(q2)
    • B_s->Klnu::P(q2,cos(theta_l))
    • B_s->D_slnu::P(q2)
    • B_s->D_slnu::P(q2,cos(theta_l))
    • B->etalnu::P(q2)
    • B->etalnu::P(q2,cos(theta_l))
    • B->eta'lnu::P(q2)
    • B->eta'lnu::P(q2,cos(theta_l))
    • B_s->D_s^*lnu::P(q2)
    • B_s->D_s^*lnu::P(q2,cos(theta_l),cos(theta_D_s),phi)
    • B^+->pi^+pi^-lnu::PDF(q2,k2,cos(theta_pi))
  • Add the eos.Serializable base class and the eos.Deserializable.from_yaml_file() helper, with a type check in eos.Deserializable.from_yaml (D. van Dyk)
  • Expand the unit test coverage of the Python interface (D. van Dyk)
  • Add a workflow to determine code coverage with test cases (D. van Dyk)
  • Add comparison operators for qnp::OptionValue (D. van Dyk)
  • Add an output stream operator for qnp::OptionValue (D. van Dyk)
  • Document the user-facing classes and methods of the eos Python modules, and auto-generate the analysis file format reference from the eos.analysis_file_description classes (D. van Dyk)
  • Complete the reference documentation of the eos Python bindings: fix several incorrect docstrings, name all arguments and add docstrings across the documented C++-bound classes, and document the previously undocumented Model, LogLikelihoodBlock, Constraint, ConstraintEntry, ObservableEntry, Reference, References, and SignalPDFEntry classes; the list of documented classes now lives in eos._api, shared by the API reference template and by a new unit test that guards argument naming and docstring coverage against regressions (D. van Dyk)
  • Add a top-level Physics section to the documentation, split off from the reference, covering the physics conventions, the definitions and parametrisations of the hadronic matrix elements of local operators (decay constants and semileptonic form factors, including the 1/2^+ -> 1/2^+ baryon form factors), and the observables predicted for semileptonic decays to a pseudoscalar meson, to a vector meson, and to a 1/2^+ baryon (D. van Dyk)
  • Add a vertical plot item that draws a vertical line at a fixed position on the x axis, e.g. to mark a kinematic threshold (D. van Dyk)
  • Add an optional size field to grid figures to set the figure size explicitly (D. van Dyk)
  • Add an optional watermark_plot field to grid figures to stamp the watermark on a single panel, addressed either by a flattened index or by a (row, col) pair (D. van Dyk)
  • Allow an explicit anchor (xy) and a configurable offset for the figure watermark (D. van Dyk)
  • Add tight_layout and shared_axes options to grid figures (D. van Dyk)
  • Provide a sensible default legend() entry for most figure item types (D. van Dyk)
  • Make the tick label format configurable via a format field on the xticks and yticks of a plot (D. van Dyk)
  • Add the unbinned log-likelihood block LogLikelihoodBlock::Unbinned1D (Python: eos.LogLikelihoodBlock.Unbinned1D), which convolves a signal PDF with a resolution function on a grid via a discrete Fourier transform (D. van Dyk)
  • Add classes for discrete Fourier transforms, eos::dft::Container and eos::dft::Plan (D. van Dyk)
  • Add SignalPDF::evaluate_linear() to evaluate a signal PDF on the linear scale (D. van Dyk)
  • Allow registering a custom SignalPDF at run time via SignalPDFs::insert (Python: eos.SignalPDFs.insert) (D. van Dyk)
  • Add an expression plot item that draws an arbitrary mathematical expression of the x-axis variable (D. van Dyk)
  • Add a constraint2D plot item that draws the 2D contours of two correlated observables from a single constraint (D. van Dyk)
  • Add a point plot item that draws a single marker at a fixed position (D. van Dyk)
  • Add a contours2D plot item that draws 2D probability contours from a histogram of pre-existing samples (D. van Dyk)
  • Add a scaling_factor field to the xticks and yticks of a plot to rescale the displayed tick values (D. van Dyk)
  • Add the eos.reporting module with the AnalysisData, PosteriorData, and GoodnessOfFit classes, providing lazy, disk-driven access to the recorded results of an analysis for use in report templates (D. van Dyk)
  • Extend the inference example to find the best-fit point via a find-mode step and to report the goodness of fit (as a per-constraint table) and a corner figure for each posterior (D. van Dyk)
  • Add further test cases to cover the worst offenders in terms of code coverage (D. van Dyk)
  • Add a format_version field to the analysis file format, so that EOS rejects files declaring a newer schema version than it supports (issue #1196) (D. van Dyk)
  • Complete the documentation of the figure description format (D. van Dyk)
  • Detect newly introduced C++ compiler warnings in the CI/CD workflows using g++’s SARIF diagnostics output, providing native code-scanning annotations on pull requests and failing the build on any warning not present in a committed baseline (D. van Dyk)
  • Add eos.LogPrior.External, which wraps a user-supplied Python factory (providing evaluate(), sample(), and compute_cdf() callables) as a prior (D. van Dyk)
  • Add the means to ensure a minimum effective sample size for the final samples produced by sample-nested, exposed through the eos-analysis command-line interface (D. van Dyk)
  • Add an optional levels field to UncertaintyBandItem and BinnedUncertaintyItem items that modifies the plotted credibility interval (D. Suelmann)
  • Add an optional band field to BinnedUncertaintyItem items to plot different parts of the band separately (D. Suelmann)

Deprecated

  • Deprecate the curtailed Gaussian prior description, i.e. a gauss/gaussian prior with min/max keys; use type: gaussian without min/max instead (D. van Dyk)
  • Deprecate constraint-based prior descriptions without a type key; use type: constraint instead (D. van Dyk)
  • Deprecate the eos.plot subpackage for removal in version 1.1; use the eos.figure subpackage instead (D. van Dyk)
  • Deprecate the corner-plot task for removal in version 1.1; use the corner figure type (eos.figure.CornerFigure) instead (D. van Dyk)

Removed

  • Remove the following univariate signal PDFs, since the corresponding multivariate PDFs render them superfluous (D. van Dyk)
    • Lambda_b->Lambda_clnu::dBR
    • Lambda_b->Lambda_c(2625)lnu::dGamma
  • Remove the following signal PDFs, since they are unused and not worth maintaining (D. van Dyk)
    • B->pimu1nu::d^2Gamma
    • B->pimu3nu::d^5Gamma
    • B->Dmu1nu::d^2Gamma
    • B->Dmu3nu::d^5Gamma
    • B->Kll::d^2Gamma@LowRecoil
    • B->K^*ll::d^2Gamma@LowRecoil

Fixed

  • Fix typos and errors in the documentation of the semileptonic form factors (D. van Dyk)
  • Fix some linewidth and linestyles arguments in figure framework (D. Suelmann)
  • Fix undefined name errors in Python code (D. van Dyk)
  • Fix usage of mutable default arguments in Python code (D. van Dyk)
  • Fix exception handling in Python code (D. van Dyk)
  • Remove dead code and unused imports in Python code (D. van Dyk)
  • Fix exception handling in li22logA1 (D. van Dyk)
  • Fix use of std::abs in inclusive B->X_sll decays (D. van Dyk)
  • Remove unused debugging code (D. van Dyk)
  • Remove call to exit() in cubature code (D. van Dyk)
  • Use context.nullcontext instead of context.suppress (D. van Dyk)
  • Fix inconsistent use of s rather than q2 across B->Plnu, Lambda_b->Lambda_clnu, Lambda_b->Lambda_c(2595)lnu, and Lambda_b->Lambda_c(2625)lnu (D. van Dyk)
  • Fix inconsistent use of s rather than q2 across D->Plnu, and Lambda_c->(S=1/2)^+lnu (D. van Dyk)
  • Fix inconsistent use of s rather than q2 across B->Kll, B->K^*ll, B_s->phill, Lambda_b->Lambdall, Lambda_b->Lambda(1520)ll, and B->X_sll (D. van Dyk)
  • Fix bugs in figure framework (D. Suelmann)
  • Fix bug in (non-)packaging of constraint files (D. van Dyk)
  • Fix the default Item.legend to return a list rather than a tuple (D. van Dyk)
  • Fix the type annotation of MaskComponent.description (D. van Dyk)
  • Do not draw an empty legend (D. van Dyk)
  • Fix a potential out-of-range bug when computing the contour level for eos.figure.TwoDimensionalKernelDensityEstimateItem (D. van Dyk)
  • Fix incorrect expression for CurtailedGauss::compute_cdf (issue #1189) (D. van Dyk)
  • Fix missing initialization of an index in ExpressionCloner and ExpressionMaker (issue #1191) (D. van Dyk)
  • Fix incorrect cloning of Parameters (issue #1192) (D. van Dyk)
  • Fix handling of the unit field when overriding parameters from file (issue #1193) (D. van Dyk)
  • Fix a typo in eos.figure.ObservableItem that prevented plotting an observable as a function of a parameter (D. van Dyk)
  • Fix the handling of asymmetric uncertainties when drawing single-point constraints in eos.figure (D. van Dyk)
  • Fix the detection of option conflicts in eos.AnalysisFile, which silently failed to warn when an observable’s option-part contradicted a global or local option (D. van Dyk)
  • Fix a crash when loading an analysis file that has no likelihoods section (D. van Dyk)
  • Report all unknown observable names in an analysis file prediction, rather than only the first (D. van Dyk)
  • Fix incorrect cloning of cached ExpressionObservable instances that fix the same kinematic variable to different values (issue #1077) (D. van Dyk)
  • Fix eos.figure.GridFigure to forward the analysis file context to each of its plots, so that items resolve relative data and parameter paths against the analysis file’s base directory (D. van Dyk)
  • Defer loading of a figure item’s fixed_parameters_from_file from construction to draw time, so that loading an analysis file no longer requires the parameter file (which may be the output of an earlier task such as find-mode) to already exist (issue #1181) (D. van Dyk)
  • Fix the B->D^*lnu azimuthal (phi) 1D distribution, which contained a spurious cos(phi) term, and the phase-space normalization of the 1D PDFs, previously computed by BToDPiLeptonNeutrino (D. van Dyk)
  • Fix a latent initialization-order bug in the [GP:2004A] B->K^*ll amplitudes, where the lambda_* and sl_phase_* subleading parameters read the use_simple_sl flag before it was initialized (D. van Dyk)
  • Fix various C++ compiler warnings (-Wreorder, -Wunused-parameter, -Wignored-qualifiers, -Wunused-variable, -Woverloaded-virtual) (D. van Dyk)
  • Fix the workflow that uploads compiler-warning SARIF to code scanning, which failed on warning-free builds because the merged SARIF contained an empty set of runs (D. van Dyk)
  • Fix inconsistency in the expected values for options related to SSLP Isgur-Wise functions in the unitarity bounds (D. van Dyk)
  • Fix a long-standing memory leak in ThreadPool (D. van Dyk)

Version 1.0.20

We have just released version 1.0.20, which you can find here.

There have been 95 commits since version 1.0.19, which can be inspected here. The changes include

  • Renaming the following constraints (M. Kirk, M. Reboud)
    • B->pi::FormFactors[parametric,LCSR+LQCD]@LvDM:2021A -> LMvD:2021A
    • B_s->D_s^*::A_1[s_max]@HPQCD:2019A -> HPQCD:2019B
    • B->K^*::A_12@FNAL+MILC:2013A -> HPQCD:2013B
    • B->K^*::A_1@FNAL+MILC:2013A -> HPQCD:2013B
    • B->K^*::V@FNAL+MILC:2013A -> HPQCD:2013B
    • B_s->K^*::A_12@FNAL+MILC:2013A -> HPQCD:2013B
    • B_s->K^*::A_1@FNAL+MILC:2013A -> HPQCD:2013B
    • B_s->K^*::V@FNAL+MILC:2013A -> HPQCD:2013B
    • D^+->Kbar^0e^+nu::BR[0.0,q2max]@PDG:2023A -> PDG:2024A
    • 0->pipi::Abs{f_+}^2@CMD3:2023C -> CMD3:2023A
    • B->K^*::FormFactors[A_0,A_1,A_2,V,T_1,T_2,T_23]@GRvDV:2021A -> GRvDV:2022A
    • B_(s)->D_(s)^*::FormFactors@HPQCD:2023A -> B_(s)->D_(s)^*::FormFactors[HQETBasis]@HPQCD:2023A
    • B_(s)->D_(s)^*::FormFactors[TraditionalBasis]@HPQCD:2023A -> B_(s)->D_(s)^*::FormFactors@HPQCD:2023A
  • Imposing the exact relation f+(0) = f0(0) in the BGL parameterisation of P -> P form factors (M. Reboud)
  • Bumping the Ubuntu image to resolute and the PyPI container (D. van Dyk)
  • Reorganising the structure of constraints (F. Herren)
  • Adding functionality to the figure framework to allow export to multiple files at once (M. Kirk)
  • Exporting wilson-polynomials to python (M. Reboud, D. van Dyk)
  • Adding missing references to bibliography and implementing a commit hook to check for missing references (M. Kirk, E. McPartland)
  • Implementing a new figure item to plot constraints residues (M. Reboud)
  • Updating the examples and the tests of the figure framework (M. Reboud)
  • Implementing an observable option to specify which option needs to be plotted in an uncertainty band item (M. Reboud)
  • Implementing B_c -> J/psi ell nu decays (C. Bolognani, M. Reboud)
  • Adding the basis for WCs with Delta c = Delta u = 1 transitions (D. Sue)
  • Extending the WC RGE and testing it (D. Sue)
  • Implementing L_c -> neutron ell nu decays (C. Bolognani)
  • Purging integrate1d (M. Reboud, F. Herren)
  • Removing the matplotlib backend choice (M. Kirk)
  • Correcting references list (M. Kirk, E. McPartland)
  • Fixing bugs in the figure framework (M. Reboud)
  • Fixing the constraint B_(s)->D_(s)^*::FormFactors@HPQCD:2023A (M. Reboud)
  • Fixing the bound saturations in the BGL parameterisation (M. Reboud)
  • Fixing the font used by matplotlib (M. Kirk)
  • Fixing a race condition in TreadPool (D. van Dyk)

Contributors of these commits are:

  • Carolina Bolognani
  • Florian Herren
  • Matthew Kirk
  • Ery McPartland
  • Méril Reboud
  • Dominik Suelmann
  • Danny van Dyk

Version 1.0.19

We have just released version 1.0.19, which you can find here.

There have been 19 commits since version 1.0.18, which can be inspected here. The changes include

  • starting to build wheels for Python version 3.14 (M. Kirk)
  • accounting for log-scale plot in the new figure framework (M. Kirk)
  • including the eos-data, eos-figure, and eos-list-observables scripts in the Python wheels (M. Kirk)
  • adding to code to draw posterior-predictive samples in the 1D and 2D KDE (D. van Dyk)
  • adding a differential dBR/dkperp distribution for B̅ₛ⁰→ Dₛ⁺ℓ⁻ν̅ decays (D. van Dyk)
  • fixing a bug that prohibits building with gcc version 15 or newer (M. E. Smith)
  • fixing a bug that selects a non-existent font as default in the figure framework (M. Kirk)
  • fixing a bug in the Python bindings that broke the documentation (D. van Dyk)
  • fixing various issues with LaTeX representations of observables (M. Kirk, D. van Dyk)

Contributors of these commits are:

  • Matthew Kirk
  • Mark E. Smith
  • Danny van Dyk