==================
- Add ``--f-high`` option to ``bayestar-realize-coincs`` in order to simulate
early warning triggers.
- In sky maps produced by ``bayestar-localize-coincs``, the FITS headers now
contain ``OBJECT`` identifiers that are integer event IDs (such as ``1``)
rather than strings (such as ``coinc_event:coinc_event_id:1``).
- The ``ligo-skymap-stats`` tool now recognizes FITS headers with either
integer or string ``OBJECT`` identifiers.
- Use Astropy rather than LAL for GPS to UTC time conversion in FITS headers so
that LALSuite is not a requirement for reading and writing FITS files.
- Refactor ``ligo-skymap-stats`` to unify its multiprocessing and progress bar
implementation with other command line tools.
- Update the compiler version that is used to build Linux wheels to icc
19.1.2.254 from Intel Parallel Studio XE 2020u2.
- Port the Python C extension to the limited stable Python API so that one
binary wheel works for all supported Python versions for any given operating
system. See `PEP 384 <https://www.python.org/dev/peps/pep-0384/>`_.
- Eliminate global static variables from the Python C extension to enable
compatibility with Python subinterpreters. See
`PEP 3121 <https://www.python.org/dev/peps/pep-3121/>`_.
- Improve the numerical stability of the method
:meth:`ligo.skymap.distance.conditional_ppf` by reparametrizing the equation
that is being solved. This method, which calculates the inverse of the
distance CDF, works by solving the equation :math:`f(x) - p = 0` for
:math:`x`, where :math:`f(x)` is the distance CDF, and :math:`p` is the
desired probability.
The reparametrized equation is :math:`log(1 - f(x)) - log(1 - p) = 0` if
:math:`p > 1/2` and :math:`log(f(x)) - log(p) = 0` otherwise. This
reparametrization is effective because it improves the dynamic range in the
tails of the distribution. This same reparametrization had already proven
effective in the related method :meth:`ligo.skymap.distance.marginal_ppf`.
This change also fixes some rare corner cases where
:meth:`~ligo.skymap.distance.marginal_ppf` returned silly values becauses it
uses :meth:`~ligo.skymap.distance.conditional_ppf` internally to create its
own initial guess. One example was the median distance for the binary neutron
star candidate S191205ah. Before this patch, the result was negative and
invalid::
>>> from ligo.skymap.distance import marginal_ppf
>>> from ligo.skymap.moc import uniq2pixarea
>>> from ligo.skymap.io import read_sky_map
>>> url = 'https://gracedb.ligo.org/apiweb/superevents/S191205ah/files/bayestar.multiorder.fits'
>>> s = read_sky_map(url, moc=True)
>>> marginal_ppf(0.5, s['PROBDENSITY'] * uniq2pixarea(s['UNIQ']),
... s['DISTMU'], s['DISTSIGMA'], s['DISTNORM'])
/Users/lpsinger/src/ligo.skymap/ligo/skymap/util/numpy.py:46: RuntimeWarning: invalid value encountered in marginal_ppf
return func(*args, **kwargs)
-223357.8508233767
After this patch, the result is positive and sensible::
>>> marginal_ppf(0.5, s['PROBDENSITY'] * uniq2pixarea(s['UNIQ']),
... s['DISTMU'], s['DISTSIGMA'], s['DISTNORM'])
362.7485740018039
- Increase the range of validity of the solver used in
:meth:`ligo.skymap.distance.moments_to_parameters` for low-probability pixels
that are very prior dominated. Sky maps that have many such pixels could have
credible volumes repoted as infinity. The incidence of such cases should now
be decreased.
- Correct the alignment of Numpy record arrays passed to
:func:`ligo.skymap.moc.rasterize` in order to avoid possibly undefined
behavior that was detected by UBSan.