Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-gwpy for openSUSE:Factory checked in at 2023-06-21 22:40:29 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-gwpy (Old) and /work/SRC/openSUSE:Factory/.python-gwpy.new.15902 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-gwpy" Wed Jun 21 22:40:29 2023 rev:3 rq:1094393 version:3.0.5 Changes: -------- --- /work/SRC/openSUSE:Factory/python-gwpy/python-gwpy.changes 2023-05-27 00:51:11.866900014 +0200 +++ /work/SRC/openSUSE:Factory/.python-gwpy.new.15902/python-gwpy.changes 2023-06-21 22:41:20.954909227 +0200 @@ -1,0 +2,18 @@ +Wed Jun 21 14:12:43 UTC 2023 - Ben Greiner <c...@bnavigator.de> + +- Update to 3.0.5 + * [#1613] Update all GWOSC URLs to gwosc.org + * [#1608] Fix issues writing StateVector.bits to HDF5 + * [#1610] Fix plotting TimeSeriesDict on separate Axes + * [#1611] Resample time series for coherence calculation when + sampling rates differ + * [#1622] Update LatexInlineDimensional unit formatter for + Astropy 5.3 + * [#1621] Fix issues with Series.crop precision + * [#1617] Document the copy keyword for TimeSeriesBaseDict.crop + * [#1619] Address inconsistency in transfer_function between CSD + and PSD averaging methods + * [#1628] Add H0 and L0 to dynamic_scaled exclusion list +- Update requirements + +------------------------------------------------------------------- Old: ---- gwpy-3.0.4.tar.gz New: ---- gwpy-3.0.5.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-gwpy.spec ++++++ --- /var/tmp/diff_new_pack.xoN4yk/_old 2023-06-21 22:41:21.510912572 +0200 +++ /var/tmp/diff_new_pack.xoN4yk/_new 2023-06-21 22:41:21.518912621 +0200 @@ -16,61 +16,65 @@ # -# Python2 no longer supported upstream -%define skip_python2 1 - Name: python-gwpy -Version: 3.0.4 +Version: 3.0.5 Release: 0 Summary: A python package for gravitational-wave astrophysics License: GPL-3.0-only URL: https://gwpy.github.io/ Source: https://files.pythonhosted.org/packages/source/g/gwpy/gwpy-%{version}.tar.gz +BuildRequires: %{python_module base >= 3.7} BuildRequires: %{python_module pip} BuildRequires: %{python_module setuptools_scm} BuildRequires: %{python_module wheel} BuildRequires: fdupes BuildRequires: python-rpm-macros -Requires: python-astropy >= 3.0.0 +Requires: python-astropy >= 4.3.0 Requires: python-dqsegdb2 -Requires: python-gwosc -Requires: python-h5py -Requires: python-lal -Requires: python-ligo-lw -Requires: python-ligo-segments -Requires: python-matplotlib >= 3.1.0 -Requires: python-numpy +Requires: python-gwdatafind >= 1.1.0 +Requires: python-gwosc >= 0.5.3 +Requires: python-h5py >= 3 +Requires: python-ligo-segments >= 1.0.0 +Requires: python-ligotimegps >= 1.2.1 +Requires: python-matplotlib >= 3.3.0 +Requires: python-numpy >= 1.17 Requires: python-python-dateutil Requires: python-requests -Requires: python-scipy -Requires: python-tqdm +Requires: python-scipy >= 1.2.0 +Requires: python-tqdm >= 4.10.0 Recommends: python-PyCBC Recommends: python-PyMySQL Recommends: python-lalsimulation Recommends: python-lscsoft-glue +Suggests: python-inspiral-range BuildArch: noarch # SECTION test requirements # BuildRequires: %%{python_module PyCBC} -- optional, not available on aarch64 BuildRequires: %{python_module PyMySQL} -BuildRequires: %{python_module astropy >= 3.0.0} +BuildRequires: %{python_module astropy >= 4.3.0} BuildRequires: %{python_module dqsegdb2} -BuildRequires: %{python_module framel} -BuildRequires: %{python_module freezegun} -BuildRequires: %{python_module gwosc} -BuildRequires: %{python_module h5py} -BuildRequires: %{python_module lalsimulation} -BuildRequires: %{python_module lal} -BuildRequires: %{python_module ligo-lw} -BuildRequires: %{python_module ligo-segments} -BuildRequires: %{python_module matplotlib >= 3.1.0} -BuildRequires: %{python_module numpy} -BuildRequires: %{python_module pytest >= 3.3} +BuildRequires: %{python_module gwdatafind >= 1.1.0} +BuildRequires: %{python_module gwosc >= 0.5.3} +BuildRequires: %{python_module h5py >= 3} +BuildRequires: %{python_module ligo-segments >= 1.0.0} +BuildRequires: %{python_module ligotimegps >= 1.2.1} +BuildRequires: %{python_module lscsoft-glue} +BuildRequires: %{python_module matplotlib >= 3.3.0} +BuildRequires: %{python_module numpy >= 1.17} +BuildRequires: %{python_module pytest-freezegun} +BuildRequires: %{python_module pytest-socket} +BuildRequires: %{python_module pytest-xdist} +BuildRequires: %{python_module pytest} +BuildRequires: %{python_module python-dateutil} BuildRequires: %{python_module requests-mock} -BuildRequires: %{python_module scipy} -BuildRequires: %{python_module tqdm} +BuildRequires: %{python_module requests} +BuildRequires: %{python_module scipy >= 1.2.0} +BuildRequires: %{python_module tqdm >= 4.10.0} +# extra not defined upstream but needed for tests +BuildRequires: %{python_module ligo-lw} # /SECTION # Unsupported archs by upstream -ExcludeArch: %ix86 +ExcludeArch: %{ix86} Requires(post): update-alternatives Requires(postun):update-alternatives %python_subpackages ++++++ gwpy-3.0.4.tar.gz -> gwpy-3.0.5.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gwpy-3.0.4/PKG-INFO new/gwpy-3.0.5/PKG-INFO --- old/gwpy-3.0.4/PKG-INFO 2023-04-12 14:14:41.108642600 +0200 +++ new/gwpy-3.0.5/PKG-INFO 2023-06-02 10:36:27.297606200 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: gwpy -Version: 3.0.4 +Version: 3.0.5 Summary: A python package for gravitational-wave astrophysics Author-email: Duncan Macleod <duncan.macl...@ligo.org> License: GPL-3.0-or-later diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gwpy-3.0.4/docs/install.rst new/gwpy-3.0.5/docs/install.rst --- old/gwpy-3.0.4/docs/install.rst 2023-04-12 11:57:39.000000000 +0200 +++ new/gwpy-3.0.5/docs/install.rst 2023-06-02 10:29:18.000000000 +0200 @@ -50,7 +50,7 @@ |dqsegdb2|_ |gwdatafind|_ ``>=1.1.0`` |gwosc-mod|_ ``>=0.5.3`` - |h5py|_ ``>=2.8.0`` + |h5py|_ ``>=3.0.0`` |ligo-segments|_ ``>=1.0.0`` |ligotimegps|_ ``>=1.2.1`` |matplotlib|_ ``>=3.1.0`` diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gwpy-3.0.4/docs/references.rst new/gwpy-3.0.5/docs/references.rst --- old/gwpy-3.0.4/docs/references.rst 2023-04-12 11:57:39.000000000 +0200 +++ new/gwpy-3.0.5/docs/references.rst 2023-06-02 10:29:18.000000000 +0200 @@ -103,13 +103,13 @@ .. _GravitySpy: https://gravityspy.org .. |GWOSCl| replace:: The Gravitational-Wave Open Science Centre (GWOSC) -.. _GWOSCl: https://www.gw-openscience.org/ +.. _GWOSCl: https://gwosc.org/ .. |GWOSC| replace:: GWOSC -.. _GWOSC: https://www.gw-openscience.org/ +.. _GWOSC: https://gwosc.org/ .. |GWOSC_AUX_RELEASE| replace:: Auxiliary Channel Three Hour Release -.. _GWOSC_AUX_RELEASE: https://www.gw-openscience.org/auxiliary/GW170814/ +.. _GWOSC_AUX_RELEASE: https://gwosc.org/auxiliary/GW170814/ .. |LIGO-T050017| replace:: LIGO-T050017 .. _LIGO-T050017: https://dcc.ligo.org/LIGO-T050017/public @@ -119,34 +119,34 @@ .. catalogues .. |GWTCl| replace:: Gravitational-Wave Transient Catalogue (GWTC) -.. _GWTCl: https://www.gw-openscience.org/eventapi/html/GWTC/ +.. _GWTCl: https://gwosc.org/eventapi/html/GWTC/ .. |GWTC| replace:: GWTC -.. _GWTC: https://www.gw-openscience.org/eventapi/html/GWTC/ +.. _GWTC: https://gwosc.org/eventapi/html/GWTC/ .. |GWTC-1l| replace:: Gravitational-Wave Transient Catalogue (GWTC) 1 -.. _GWTC-1l: https://www.gw-openscience.org/GWTC-1/ +.. _GWTC-1l: https://gwosc.org/GWTC-1/ .. |GWTC-1| replace:: GWTC-1 -.. _GWTC-1: https://www.gw-openscience.org/GWTC-1/ +.. _GWTC-1: https://gwosc.org/GWTC-1/ .. |GWTC-2l| replace:: Gravitational-Wave Transient Catalogue (GWTC) 2 -.. _GWTC-2l: https://www.gw-openscience.org/GWTC-2/ +.. _GWTC-2l: https://gwosc.org/GWTC-2/ .. |GWTC-2| replace:: GWTC-2 -.. _GWTC-2: https://www.gw-openscience.org/GWTC-2/ +.. _GWTC-2: https://gwosc.org/GWTC-2/ .. |GWTC-2.1l| replace:: Gravitational-Wave Transient Catalogue (GWTC) 2.1 -.. _GWTC-2.1l: https://www.gw-openscience.org/GWTC-2.1/ +.. _GWTC-2.1l: https://gwosc.org/GWTC-2.1/ .. |GWTC-2.1| replace:: GWTC-2.1 -.. _GWTC-2.1: https://www.gw-openscience.org/GWTC-2.1/ +.. _GWTC-2.1: https://gwosc.org/GWTC-2.1/ .. |GWTC-3l| replace:: Gravitational-Wave Transient Catalogue (GWTC) 3 -.. _GWTC-3l: https://www.gw-openscience.org/GWTC-3/ +.. _GWTC-3l: https://gwosc.org/GWTC-3/ .. |GWTC-3| replace:: GWTC-3 -.. _GWTC-3: https://www.gw-openscience.org/GWTC-3/ +.. _GWTC-3: https://gwosc.org/GWTC-3/ .. events diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gwpy-3.0.4/docs/table/io.rst new/gwpy-3.0.5/docs/table/io.rst --- old/gwpy-3.0.4/docs/table/io.rst 2023-04-12 11:57:39.000000000 +0200 +++ new/gwpy-3.0.5/docs/table/io.rst 2023-06-02 10:29:18.000000000 +0200 @@ -129,7 +129,7 @@ .. admonition:: GWOSC catalogues - For more details on the GWOSC catalogues, see https://www.gw-openscience.org/eventapi/html/. + For more details on the GWOSC catalogues, see https://gwosc.org/eventapi/html/. .. _gwpy-table-gwosc-filter: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gwpy-3.0.4/docs/timeseries/opendata.rst new/gwpy-3.0.5/docs/timeseries/opendata.rst --- old/gwpy-3.0.4/docs/timeseries/opendata.rst 2023-04-12 14:10:00.000000000 +0200 +++ new/gwpy-3.0.5/docs/timeseries/opendata.rst 2023-06-02 10:29:18.000000000 +0200 @@ -18,7 +18,7 @@ For full details of the available data, please see - https://www.gw-openscience.org/data/ + https://gwosc.org/data/ .. _gwpy-timeseries-fetchopendata: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gwpy-3.0.4/docs/timeseries/statevector.rst new/gwpy-3.0.5/docs/timeseries/statevector.rst --- old/gwpy-3.0.4/docs/timeseries/statevector.rst 2023-04-06 12:37:11.000000000 +0200 +++ new/gwpy-3.0.5/docs/timeseries/statevector.rst 2023-06-02 10:29:18.000000000 +0200 @@ -117,7 +117,7 @@ .. admonition:: GWOSC data usage notes Refer to the GWOSC - `data usage notes <https://www.gw-openscience.org/yellow_box/>`__ + `data usage notes <https://gwosc.org/yellow_box/>`__ page for details of the various bits (states) in the state vectors. To demonstate, we can download the `StateVector` associated with diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gwpy-3.0.4/examples/miscellaneous/open-data-spectrogram.py new/gwpy-3.0.5/examples/miscellaneous/open-data-spectrogram.py --- old/gwpy-3.0.4/examples/miscellaneous/open-data-spectrogram.py 2023-04-06 12:37:11.000000000 +0200 +++ new/gwpy-3.0.5/examples/miscellaneous/open-data-spectrogram.py 2023-06-02 10:29:18.000000000 +0200 @@ -24,7 +24,7 @@ issues. This is done for the LIGO-Virgo detector network, with -`up-to-date plots <https://www.gw-openscience.org/detector_status/>`__ +`up-to-date plots <https://gwosc.org/detector_status/>`__ available from |GWOSC|. This example demonstrates how to download data segments from GWOSC, then @@ -42,7 +42,7 @@ # First, we need to fetch the Open Data timeline segments from GWOSC. # To do that we can call the :meth:`DataQualityFlag.fetch_open_data` method # using ``'H1_DATA'`` as the flag (for an explanation of what this means, -# read up on `The S6 Data Release <https://www.gw-openscience.org/S6/>`__). +# read up on `The S6 Data Release <https://gwosc.org/S6/>`__). from gwpy.segments import DataQualityFlag h1segs = DataQualityFlag.fetch_open_data('H1_DATA', diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gwpy-3.0.4/examples/miscellaneous/range-spectrogram.py new/gwpy-3.0.5/examples/miscellaneous/range-spectrogram.py --- old/gwpy-3.0.4/examples/miscellaneous/range-spectrogram.py 2023-04-06 12:37:11.000000000 +0200 +++ new/gwpy-3.0.5/examples/miscellaneous/range-spectrogram.py 2023-06-02 10:29:18.000000000 +0200 @@ -29,7 +29,7 @@ __author__ = 'Alex Urban <alexander.ur...@ligo.org>' # First, we need to load some data. As before we can `fetch` the -# `public data <https://www.gw-openscience.org/catalog/>`__ +# `public data <https://gwosc.org/catalog/>`__ # around the GW170817 BNS merger: from gwpy.timeseries import TimeSeries diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gwpy-3.0.4/examples/miscellaneous/range-timeseries.py new/gwpy-3.0.5/examples/miscellaneous/range-timeseries.py --- old/gwpy-3.0.4/examples/miscellaneous/range-timeseries.py 2023-04-06 12:37:11.000000000 +0200 +++ new/gwpy-3.0.5/examples/miscellaneous/range-timeseries.py 2023-06-02 10:29:18.000000000 +0200 @@ -31,7 +31,7 @@ __credits__ = 'Alex Urban <alexander.ur...@ligo.org>' # First, we need to load some data. We can `fetch` the -# `public data <https://www.gw-openscience.org/catalog/>`__ +# `public data <https://gwosc.org/catalog/>`__ # around the GW170817 BNS merger: from gwpy.timeseries import TimeSeries diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gwpy-3.0.4/examples/segments/open-data.py new/gwpy-3.0.5/examples/segments/open-data.py --- old/gwpy-3.0.4/examples/segments/open-data.py 2023-04-06 12:37:11.000000000 +0200 +++ new/gwpy-3.0.5/examples/segments/open-data.py 2023-06-02 10:29:18.000000000 +0200 @@ -20,7 +20,7 @@ """Plotting observing segments for O1 The data from the full -`Observing Run 1 (O1) <https://www.gw-openscience.org/O1/>`__ +`Observing Run 1 (O1) <https://gwosc.org/O1/>`__ have been released by |GWOSC|_. This example demonstrates how to download segment information into a diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gwpy-3.0.4/examples/timeseries/inject.py new/gwpy-3.0.5/examples/timeseries/inject.py --- old/gwpy-3.0.4/examples/timeseries/inject.py 2023-04-06 12:37:11.000000000 +0200 +++ new/gwpy-3.0.5/examples/timeseries/inject.py 2023-06-02 10:29:18.000000000 +0200 @@ -41,7 +41,7 @@ # Then we can download a simulation of the GW150914 signal from GWOSC: from astropy.utils.data import get_readable_fileobj -url = ("https://www.gw-openscience.org/s/events/GW150914/P150914/" +url = ("https://gwosc.org/s/events/GW150914/P150914/" "fig2-unfiltered-waveform-H.txt") with get_readable_fileobj(url) as f: signal = TimeSeries.read(f, format='txt') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gwpy-3.0.4/gwpy/_version.py new/gwpy-3.0.5/gwpy/_version.py --- old/gwpy-3.0.4/gwpy/_version.py 2023-04-12 14:14:40.000000000 +0200 +++ new/gwpy-3.0.5/gwpy/_version.py 2023-06-02 10:36:26.000000000 +0200 @@ -1,4 +1,4 @@ # file generated by setuptools_scm # don't change, don't track in version control -__version__ = version = '3.0.4' -__version_tuple__ = version_tuple = (3, 0, 4) +__version__ = version = '3.0.5' +__version_tuple__ = version_tuple = (3, 0, 5) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gwpy-3.0.4/gwpy/frequencyseries/tests/test_hist.py new/gwpy-3.0.5/gwpy/frequencyseries/tests/test_hist.py --- old/gwpy-3.0.4/gwpy/frequencyseries/tests/test_hist.py 2023-04-12 11:57:39.000000000 +0200 +++ new/gwpy-3.0.5/gwpy/frequencyseries/tests/test_hist.py 2023-06-02 10:29:18.000000000 +0200 @@ -106,6 +106,9 @@ assert array.y0 == self.bins[0] assert array.dy == self.bins[1] - self.bins[0] + def test_crop_float_precision(self): + pytest.skip("float precision test not supported for SpectralVariance") + def test_is_compatible_yindex(self, array): return NotImplemented diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gwpy-3.0.4/gwpy/io/tests/test_datafind.py new/gwpy-3.0.5/gwpy/io/tests/test_datafind.py --- old/gwpy-3.0.4/gwpy/io/tests/test_datafind.py 2023-04-12 11:57:39.000000000 +0200 +++ new/gwpy-3.0.5/gwpy/io/tests/test_datafind.py 2023-06-02 10:29:18.000000000 +0200 @@ -84,7 +84,7 @@ """ @mock.patch.dict( # point GWDataFind at GWOSC server "os.environ", - {"GWDATAFIND_SERVER": "datafind.gw-openscience.org:80"}, + {"GWDATAFIND_SERVER": "datafind.gwosc.org:80"}, ) @pytest_skip_cvmfs_read_error # skip CVMFS problems @pytest_skip_network_error # skip network problems diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gwpy-3.0.4/gwpy/plot/units.py new/gwpy-3.0.5/gwpy/plot/units.py --- old/gwpy-3.0.4/gwpy/plot/units.py 2023-04-06 12:37:11.000000000 +0200 +++ new/gwpy-3.0.5/gwpy/plot/units.py 2023-06-02 10:29:18.000000000 +0200 @@ -24,17 +24,31 @@ class LatexInlineDimensional(LatexInline): - """Custom LaTeX formatter that includes physical type (if available) + r"""Custom LaTeX formatter that includes physical type (if available) - Mainly for auto-labelling `Axes` in matplotlib figures + Mainly for auto-labelling `Axes` in matplotlib figures. + + Examples + -------- + The built-in astropy ``latex_inline`` formatter gives this: + + >>> Unit('m/s').to_string(format='latex_inline') + '$\mathrm{m\,s^{-1}}$' + + This custom 'dimensional' formatter gives: + + >>> Unit('m/s').to_string(format='latex_inline_dimensional') + 'Speed [$\mathrm{m\,s^{-1}}$]' """ name = 'latex_inline_dimensional' @classmethod - def to_string(cls, unit): - u = f"[{super().to_string(unit)}]" + def to_string(cls, unit, *args, **kwargs): + u = f"[{super().to_string(unit, *args, **kwargs)}]" if unit.physical_type not in {None, 'unknown', 'dimensionless'}: - ptype = str(unit.physical_type).split('/', 1)[0].title() - return f"{cls._latex_escape(ptype)} {u}" + # format physical type of unit for LaTeX + ptype = str(unit.physical_type).title().replace("_", r"\_") + # return '<Physical type> [<unit>]' + return f"{ptype} {u}" return u diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gwpy-3.0.4/gwpy/segments/flag.py new/gwpy-3.0.5/gwpy/segments/flag.py --- old/gwpy-3.0.4/gwpy/segments/flag.py 2023-04-06 12:37:11.000000000 +0200 +++ new/gwpy-3.0.5/gwpy/segments/flag.py 2023-06-02 10:29:18.000000000 +0200 @@ -443,7 +443,7 @@ timeout for download (seconds) host : `str`, optional - URL of GWOSC host, default: ``'https://gw-openscience.org'`` + URL of GWOSC host, default: ``'https://gwosc.org'`` Returns ------- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gwpy-3.0.4/gwpy/signal/spectral/_scipy.py new/gwpy-3.0.5/gwpy/signal/spectral/_scipy.py --- old/gwpy-3.0.4/gwpy/signal/spectral/_scipy.py 2023-04-06 12:37:11.000000000 +0200 +++ new/gwpy-3.0.5/gwpy/signal/spectral/_scipy.py 2023-06-02 10:29:18.000000000 +0200 @@ -20,6 +20,7 @@ """ import numpy +import warnings import scipy.signal @@ -171,7 +172,8 @@ sdfunc=scipy.signal.csd, **kwargs) -def coherence(timeseries, other, segmentlength, noverlap=None, **kwargs): +def coherence(timeseries, other, segmentlength, downsample=None, + noverlap=None, **kwargs): """Calculate the coherence between two `TimeSeries` using Welch's method Parameters @@ -188,6 +190,10 @@ noverlap : `int` number of samples to overlap between segments, defaults to 50%. + downsample : `bool` + Downsample the series with higher sampling frequency? SciPy assumes + that both TimeSeries have the same rate. + **kwargs other keyword arguments are passed to :meth:`scipy.signal.coherence` @@ -200,6 +206,33 @@ -------- scipy.signal.coherence """ + + # Should we warn about unequal sampling frequencies? + warn_fs = False + + if downsample is None: + warn_fs = True + downsample = True + + if timeseries.sample_rate != other.sample_rate: + # scipy assumes a single sampling frequency + if not downsample: + raise ValueError("Cannot calculate coherence when sampling " + "frequencies are unequal") + if warn_fs: + warnings.warn("Sampling frequencies are unequal. Higher " + "frequency series will be downsampled before " + "coherence is calculated", + category=UserWarning) + # downsample the one with the higher rate + if timeseries.sample_rate > other.sample_rate: + timeseries = timeseries.resample(other.sample_rate) + else: + other = other.resample(timeseries.sample_rate) + + # should never be unequal from here on + assert timeseries.sample_rate == other.sample_rate + # calculate CSD kwargs.setdefault('y', other.value) out = _spectral_density( diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gwpy-3.0.4/gwpy/signal/tests/test_coherence.py new/gwpy-3.0.5/gwpy/signal/tests/test_coherence.py --- old/gwpy-3.0.4/gwpy/signal/tests/test_coherence.py 1970-01-01 01:00:00.000000000 +0100 +++ new/gwpy-3.0.5/gwpy/signal/tests/test_coherence.py 2023-06-02 10:29:18.000000000 +0200 @@ -0,0 +1,159 @@ +# -*- coding: utf-8 -*- +# Copyright (C) Cardiff University (2023) +# +# This file is part of GWpy. +# +# GWpy is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# GWpy is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GWpy. If not, see <http://www.gnu.org/licenses/>. + +"""Custom filtering utilities for the `TimeSeries` +""" + +__author__ = "Alex Southgate <alex.southg...@ligo.org>" + +import numpy as np +import pytest +import scipy.signal as sig + +from ...signal import spectral +from ...timeseries import TimeSeries + + +@pytest.fixture +def series_data(): + """Create some fake data with equal sampling frequencies. + + Returns: + firstarr: an array of data, simple mixture of waves + secondarr: a second array of data from different mixture + seglen: segment length param to reuse for ffts + """ + seglen = 512 + n_segs = 10 + n_t = seglen * n_segs + t_end = 2 * np.pi + + ts = np.linspace(0, t_end, n_t) + + firstarr = 0.1 * np.cos(ts + 0.1) + 0.9 * np.sin(2 * ts + 5) + firstarr += np.random.normal(5.8, 2, n_t) + + secondarr = 0.5 * np.cos(ts + 0.1) + 0.1 * np.sin(5 * ts + 10) + firstarr += np.random.normal(5.8, 2, n_t) + + return firstarr, secondarr, seglen + + +@pytest.fixture +def unequal_fs_series_data(): + """Create some fake data with unequal sampling frequencies. + + Returns: + ts1: array of time points for first data array + ts2: array of time points for second data array + firstarr: an array of data, simple mixture of waves + secondarr: a second array of data from different mixture + seglen: segment length param to reuse for ffts + fs_1: sampling frequency 1 + fs_2: sampling frequency 2 + """ + + seglen = 512 + n_segs1 = 10 + n_segs2 = 20 + n_t1 = seglen * n_segs1 + n_t2 = seglen * n_segs2 + t_end = 10 + + fs_1 = n_t1 / t_end + fs_2 = n_t2 / t_end + + ts1 = np.linspace(0, t_end, n_t1) + ts2 = np.linspace(0, t_end, n_t2) + + firstarr = np.sin(2 * np.pi * ts1) + 0.1 * np.sin(2 * np.pi * ts1 * 5) + secondarr = np.sin(2 * np.pi * ts2) + + return ts1, ts2, firstarr, secondarr, seglen, fs_1, fs_2 + + +def test_coherence_happy(series_data): + """Test the interface to scipy.signal.coherence. + + For other tests see timeseries/tests/timeseries.py + """ + + firstarr, secondarr, seglen = series_data + f_s = 0.001 + + first = TimeSeries(firstarr, sample_rate=f_s) + second = TimeSeries(secondarr, sample_rate=f_s) + + coh = spectral.coherence(first, second, segmentlength=seglen) + ftemp, cxytemp = sig.coherence(firstarr, secondarr, f_s, nperseg=seglen) + + coharr = np.array(coh.data) + + assert all(coharr == cxytemp) + + +def test_coherence_resample(unequal_fs_series_data): + """Ensure warning is raised by unequal sampling frequencies""" + + ts1, ts2, firstarr, secondarr, seglen, fs_1, fs_2 = unequal_fs_series_data + + # first and second arrays are different, secondarr should have + # sampling frequency fs_2, but sometimes a mistake is made + first = TimeSeries(firstarr, sample_rate=fs_1) + second = TimeSeries(secondarr, sample_rate=fs_1) + third = TimeSeries(secondarr, sample_rate=fs_2) + + # the first coherence val coh12 is broken intentionally since + # secondarr data should not have fs_1, instead fs_2 + coh12 = spectral.coherence(first, second, segmentlength=seglen) + coh13 = spectral.coherence(first, third, segmentlength=seglen) + + # get the frequency at minimum coherence, this should be the extra + # component in secondarr + maxi12 = np.argmin(coh12[:50]) + maxf12 = coh12.frequencies[maxi12] + maxi13 = np.argmin(coh13[:50]) + maxf13 = coh12.frequencies[maxi13] + + # this one is close to 5 -- the extra freq component in secondarr + assert 4 <= maxf13.value <= 6 + # this one is totally broken + assert not (4 <= maxf12.value <= 6) + + +def test_coherence_resample_arg(series_data): + """Ensure warning is raised by unequal sampling frequencies""" + + firstarr, secondarr, seglen = series_data + f_s = 0.001 + + first = TimeSeries(firstarr, sample_rate=f_s) + second = TimeSeries(secondarr, sample_rate=f_s * 2.32) + + with pytest.warns(UserWarning, match="Sampling frequencies are unequal"): + spectral.coherence(first, second, segmentlength=seglen) + + with pytest.raises(ValueError): + spectral.coherence(first, second, segmentlength=seglen, + downsample=False) + + coh1 = spectral.coherence(first, second, segmentlength=seglen) + coh2 = spectral.coherence(first, second, segmentlength=seglen, + downsample=True) + + assert all(np.array(coh1.data) == np.array(coh2.data)) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gwpy-3.0.4/gwpy/timeseries/core.py new/gwpy-3.0.5/gwpy/timeseries/core.py --- old/gwpy-3.0.4/gwpy/timeseries/core.py 2023-04-12 14:10:02.000000000 +0200 +++ new/gwpy-3.0.5/gwpy/timeseries/core.py 2023-06-02 10:29:18.000000000 +0200 @@ -84,7 +84,9 @@ """Determine default for scaled based on channel name This is mainly to work around LIGO not correctly recording ADC - scaling parameters for most of Advanced LIGO (through 2019). + scaling parameters for most of Advanced LIGO (through 2023). + Scaling parameters for H0 and L0 data are also not correct + starting in mid-2020. Parameters ---------- @@ -108,7 +110,7 @@ """ if scaled is not None: return scaled - return not str(channel).startswith(("H1", "L1")) + return not str(channel).startswith(("H0", "L0", "H1", "L1")) # -- TimeSeriesBase------------------------------------------------------------ @@ -993,7 +995,7 @@ return self def crop(self, start=None, end=None, copy=False): - """Crop each entry of this `dict` + """Crop each entry of this `dict`. This method calls the :meth:`crop` method of all entries and modifies this dict in place. @@ -1008,6 +1010,10 @@ GPS end time of required data, defaults to end of data found; any input parseable by `~gwpy.time.to_gps` is fine + copy : `bool`, optional, default: `False` + If `True` copy the data for each entry to fresh memory, + otherwise return a view. + See also -------- TimeSeries.crop @@ -1441,9 +1447,18 @@ all other keyword arguments are passed to the plotter as appropriate """ + kwargs.update({ + "method": method, + "label": label, + }) + # make plot from ..plot import Plot - plot = Plot(self.values(), method=method, label=label, **kwargs) + + if kwargs.get("separate", False): + plot = Plot(*self.values(), **kwargs) + else: + plot = Plot(self.values(), **kwargs) # update labels artmap = {'plot': 'lines', 'scatter': 'collections'} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gwpy-3.0.4/gwpy/timeseries/statevector.py new/gwpy-3.0.5/gwpy/timeseries/statevector.py --- old/gwpy-3.0.4/gwpy/timeseries/statevector.py 2023-04-06 12:37:11.000000000 +0200 +++ new/gwpy-3.0.5/gwpy/timeseries/statevector.py 2023-06-02 10:29:18.000000000 +0200 @@ -427,8 +427,8 @@ indent, self.__class__.__name__, mask, str(self.channel), str(self.epoch))) - def __array__(self): - return numpy.array([b or '' for b in self]) + def __array__(self, dtype="U"): + return numpy.array([b or '' for b in self], dtype=dtype) # -- StateVector -------------------------------------------------------------- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gwpy-3.0.4/gwpy/timeseries/tests/test_core.py new/gwpy-3.0.5/gwpy/timeseries/tests/test_core.py --- old/gwpy-3.0.4/gwpy/timeseries/tests/test_core.py 2023-04-12 11:57:39.000000000 +0200 +++ new/gwpy-3.0.5/gwpy/timeseries/tests/test_core.py 2023-06-02 10:29:18.000000000 +0200 @@ -420,6 +420,22 @@ plot.save(BytesIO(), format='png') plot.close() + def test_plot_separate(self, instance): + """Test plotting `TimeSeriesDict` on separate axes. + + See https://github.com/gwpy/gwpy/issues/1609 + """ + with rc_context(rc={'text.usetex': False}): + plot = instance.plot(separate=True) + assert len(plot.axes) == len(instance.keys()) + for ax, key in zip(plot.axes, instance): + utils.assert_array_equal(ax.lines[-1].get_xdata(), + instance[key].xindex.value) + utils.assert_array_equal(ax.lines[-1].get_ydata(), + instance[key].value) + plot.save(BytesIO(), format='png') + plot.close() + # -- TimeSeriesBaseList ------------------------------------------------------- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gwpy-3.0.4/gwpy/timeseries/tests/test_statevector.py new/gwpy-3.0.5/gwpy/timeseries/tests/test_statevector.py --- old/gwpy-3.0.4/gwpy/timeseries/tests/test_statevector.py 2023-04-12 11:57:39.000000000 +0200 +++ new/gwpy-3.0.5/gwpy/timeseries/tests/test_statevector.py 2023-06-02 10:29:18.000000000 +0200 @@ -370,6 +370,22 @@ array = self.TEST_CLASS.from_nds2_buffer(nds_buffer) assert array.unit is units.dimensionless_unscaled + @pytest.mark.parametrize('ext', ('hdf5', 'h5')) + def test_read_write_hdf5(self, tmp_path, array, ext): + array.bits = ["a", "b", "c", "d"] + array.name = "test" + + tmp = tmp_path / "test.{}".format(ext) + + # write array (with auto-identify) + array.write(tmp, overwrite=True) + + # check reading gives the same data (with/without auto-identify) + new = type(array).read(tmp, format='hdf5') + utils.assert_quantity_sub_equal(array, new) + new = type(array).read(tmp) + utils.assert_quantity_sub_equal(array, new) + # -- StateVectorDict ---------------------------------------------------------- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gwpy-3.0.4/gwpy/timeseries/tests/test_timeseries.py new/gwpy-3.0.5/gwpy/timeseries/tests/test_timeseries.py --- old/gwpy-3.0.4/gwpy/timeseries/tests/test_timeseries.py 2023-04-12 11:57:39.000000000 +0200 +++ new/gwpy-3.0.5/gwpy/timeseries/tests/test_timeseries.py 2023-06-02 10:29:18.000000000 +0200 @@ -82,7 +82,7 @@ isgood=True, ) -GWOSC_DATAFIND_SERVER = "datafind.gw-openscience.org" +GWOSC_DATAFIND_SERVER = "datafind.gwosc.org" GWOSC_GW150914_IFO = "L1" GWOSC_GW150914_CHANNEL = "L1:GWOSC-16KHZ_R1_STRAIN" NDS2_GW150914_CHANNEL = "L1:DCS-CALIB_STRAIN_C02" @@ -834,23 +834,32 @@ gw150914.psd(1, **kw) ** (1/2.), ) - def test_csd(self, noisy_sinusoid, corrupt_noisy_sinusoid): - # test that csd(self) is the same as psd() - fs = noisy_sinusoid.csd(noisy_sinusoid) + def test_csd(self, noisy_sinusoid): + """Test that `TimeSeries.csd(self)` is the same as `psd()`. + """ + fs = noisy_sinusoid.csd(noisy_sinusoid, average="mean") utils.assert_quantity_sub_equal( - fs, + fs.abs(), noisy_sinusoid.psd(method="welch"), exclude=['name'], ) - # test fftlength + def test_csd_fftlength(self, noisy_sinusoid, corrupt_noisy_sinusoid): + """Test that `TimeSeries.csd` uses the ``fftlength`` keyword properly. + """ + # test fftlength is used fs = noisy_sinusoid.csd(corrupt_noisy_sinusoid, fftlength=0.5) assert fs.size == 0.5 * noisy_sinusoid.sample_rate.value // 2 + 1 assert fs.df == 2 * units.Hertz + + # test that the default overlap works (by comparing to explicit) utils.assert_quantity_sub_equal( fs, - noisy_sinusoid.csd(corrupt_noisy_sinusoid, fftlength=0.5, - overlap=0.25), + noisy_sinusoid.csd( + corrupt_noisy_sinusoid, + fftlength=0.5, + overlap=0.25, + ), ) @staticmethod diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gwpy-3.0.4/gwpy/timeseries/timeseries.py new/gwpy-3.0.5/gwpy/timeseries/timeseries.py --- old/gwpy-3.0.4/gwpy/timeseries/timeseries.py 2023-04-12 11:57:39.000000000 +0200 +++ new/gwpy-3.0.5/gwpy/timeseries/timeseries.py 2023-06-02 10:29:18.000000000 +0200 @@ -1107,7 +1107,7 @@ return new def transfer_function(self, other, fftlength=None, overlap=None, - window='hann', **kwargs): + window='hann', average='mean', **kwargs): """Calculate the transfer function between this `TimeSeries` and another. @@ -1132,6 +1132,10 @@ see :func:`scipy.signal.get_window` for details on acceptable formats + average : `str`, optional + FFT-averaging method (default: ``'mean'``) passed to + underlying csd() and psd() methods + **kwargs any other keyword arguments accepted by :meth:`TimeSeries.csd` or :meth:`TimeSeries.psd` @@ -1149,9 +1153,9 @@ `TimeSeries` will be down-sampled to match the lower. """ csd = self.csd(other, fftlength=fftlength, overlap=overlap, - window=window, **kwargs) + window=window, average=average, **kwargs) psd = self.psd(fftlength=fftlength, overlap=overlap, window=window, - **kwargs) + average=average, **kwargs) # Take the minimum of the frequencyseries csd and psd because the # sample rate of different channels might yield different length diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gwpy-3.0.4/gwpy/types/io/hdf5.py new/gwpy-3.0.5/gwpy/types/io/hdf5.py --- old/gwpy-3.0.4/gwpy/types/io/hdf5.py 2023-04-06 12:37:11.000000000 +0200 +++ new/gwpy-3.0.5/gwpy/types/io/hdf5.py 2023-06-02 10:29:18.000000000 +0200 @@ -125,8 +125,10 @@ try: dataset.attrs[attr] = value except (TypeError, ValueError, RuntimeError) as exc: - exc.args = ("Failed to store {} ({}) for {}: {}".format( - attr, type(value).__name__, type(array).__name__, str(exc))) + exc.args = ( + f"Failed to store {attr} ({type(value).__name__}) " + f"for {type(array).__name__}: '{exc}'", + ) raise diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gwpy-3.0.4/gwpy/types/series.py new/gwpy-3.0.5/gwpy/types/series.py --- old/gwpy-3.0.4/gwpy/types/series.py 2023-04-06 12:37:11.000000000 +0200 +++ new/gwpy-3.0.5/gwpy/types/series.py 2023-06-02 10:29:18.000000000 +0200 @@ -947,25 +947,26 @@ Parameters ---------- start : `float`, optional - lower limit of x-axis to crop to, defaults to - current `~Series.x0` + Lower limit of x-axis to crop to, defaults to + :attr:`~Series.x0`. end : `float`, optional - upper limit of x-axis to crop to, defaults to current series end + Upper limit of x-axis to crop to, defaults to series end. - copy : `bool`, optional, default: `False` - copy the input data to fresh memory, otherwise return a view + copy : `bool`, optional + Copy the input data to fresh memory, + otherwise return a view (default). Returns ------- series : `Series` - A new series with a sub-set of the input data + A new series with a sub-set of the input data. Notes ----- If either ``start`` or ``end`` are outside of the original `Series` span, warnings will be printed and the limits will - be restricted to the :attr:`~Series.xspan` + be restricted to the :attr:`~Series.xspan`. """ x0, x1 = self.xspan xtype = type(x0) @@ -978,18 +979,20 @@ if start == x0: start = None elif start is not None and xtype(start) < x0: - warn('%s.crop given start smaller than current start, ' - 'crop will begin when the Series actually starts.' - % type(self).__name__) + warn( + f"{type(self).__name__}.crop given start smaller than current " + "start, crop will begin when the Series actually starts.", + ) start = None # pin late ends to time-series end if end == x1: end = None if end is not None and xtype(end) > x1: - warn('%s.crop given end larger than current end, ' - 'crop will end when the Series actually ends.' - % type(self).__name__) + warn( + f"{type(self).__name__}.crop given end larger than current " + "end, crop will begin when the Series actually ends.", + ) end = None # check if series is irregular @@ -1003,31 +1006,26 @@ # find start index if start is None: idx0 = None + elif irregular: + idx0 = numpy.searchsorted( + self.xindex.value, + xtype(start), + side="left", + ) else: - if not irregular: - idx0 = int((xtype(start) - x0) // self.dx.value) - else: - idx0 = numpy.searchsorted( - self.xindex.value, xtype(start), side="left" - ) + idx0 = floor((xtype(start) - x0) / self.dx.value) # find end index if end is None: idx1 = None + elif irregular: + idx1 = numpy.searchsorted( + self.xindex.value, + xtype(end), + side="left", + ) else: - if not irregular: - idx1 = int((xtype(end) - x0) // self.dx.value) - if idx1 >= self.size: - idx1 = None - else: - if xtype(end) >= self.xindex.value[-1]: - idx1 = None - else: - idx1 = ( - numpy.searchsorted( - self.xindex.value, xtype(end), side="left" - ) - ) + idx1 = floor((xtype(end) - x0) / self.dx.value) # crop if copy: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gwpy-3.0.4/gwpy/types/tests/test_series.py new/gwpy-3.0.5/gwpy/types/tests/test_series.py --- old/gwpy-3.0.4/gwpy/types/tests/test_series.py 2023-04-12 11:57:39.000000000 +0200 +++ new/gwpy-3.0.5/gwpy/types/tests/test_series.py 2023-06-02 10:29:18.000000000 +0200 @@ -185,16 +185,25 @@ z, numpy.column_stack((array.xindex.value, array.value))) def test_crop(self, array): + """Test basic functionality of `Series.crop`. + """ + # all defaults + utils.assert_quantity_equal(array, array.crop()) + + # normal operation a2 = array.crop(10, 20) utils.assert_quantity_equal(array[10:20], a2) - # check that warnings are printed for out-of-bounds + + def test_crop_warnings(self, array): + """Test that `Series.crop` emits warnings when it is supposed to. + """ with pytest.warns(UserWarning): array.crop(array.xspan[0]-1, array.xspan[1]) with pytest.warns(UserWarning): array.crop(array.xspan[0], array.xspan[1]+1) def test_crop_irregular(self): - """The cropping on an irregularly spaced series. + """Test `Series.crop` with an irregular index. """ x = numpy.linspace(0, 100, num=self.data.shape[0]) @@ -212,6 +221,19 @@ cropped = series.crop(start=25, end=75) utils.assert_quantity_equal(series[(x > 25) & (x < 75)], cropped) + def test_crop_float_precision(self): + """Verify the float precision of the crop function. + + This tests regression against https://github.com/gwpy/gwpy/issues/1601. + """ + # construct empty data array with the right shape for this array object + shape = (101,) * self.TEST_CLASS._ndim + series = self.TEST_CLASS(numpy.empty(shape), dx=0.01) + + # assert that when we crop it, we only crop a single sample + cropped = series.crop(end=1.) + utils.assert_quantity_equal(series[:-1], cropped) + def test_is_compatible(self, array): """Test the `Series.is_compatible` method """ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gwpy-3.0.4/gwpy.egg-info/PKG-INFO new/gwpy-3.0.5/gwpy.egg-info/PKG-INFO --- old/gwpy-3.0.4/gwpy.egg-info/PKG-INFO 2023-04-12 14:14:40.000000000 +0200 +++ new/gwpy-3.0.5/gwpy.egg-info/PKG-INFO 2023-06-02 10:36:26.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: gwpy -Version: 3.0.4 +Version: 3.0.5 Summary: A python package for gravitational-wave astrophysics Author-email: Duncan Macleod <duncan.macl...@ligo.org> License: GPL-3.0-or-later diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gwpy-3.0.4/gwpy.egg-info/SOURCES.txt new/gwpy-3.0.5/gwpy.egg-info/SOURCES.txt --- old/gwpy-3.0.4/gwpy.egg-info/SOURCES.txt 2023-04-12 14:14:40.000000000 +0200 +++ new/gwpy-3.0.5/gwpy.egg-info/SOURCES.txt 2023-06-02 10:36:26.000000000 +0200 @@ -242,6 +242,7 @@ gwpy/signal/spectral/_ui.py gwpy/signal/spectral/_utils.py gwpy/signal/tests/__init__.py +gwpy/signal/tests/test_coherence.py gwpy/signal/tests/test_filter_design.py gwpy/signal/tests/test_qtransform.py gwpy/signal/tests/test_spectral_lal.py diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gwpy-3.0.4/gwpy.egg-info/requires.txt new/gwpy-3.0.5/gwpy.egg-info/requires.txt --- old/gwpy-3.0.4/gwpy.egg-info/requires.txt 2023-04-12 14:14:40.000000000 +0200 +++ new/gwpy-3.0.5/gwpy.egg-info/requires.txt 2023-06-02 10:36:26.000000000 +0200 @@ -2,7 +2,7 @@ dqsegdb2 gwdatafind>=1.1.0 gwosc>=0.5.3 -h5py>=2.8.0 +h5py>=3.0.0 ligo-segments>=1.0.0 ligotimegps>=1.2.1 matplotlib>=3.3.0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gwpy-3.0.4/pyproject.toml new/gwpy-3.0.5/pyproject.toml --- old/gwpy-3.0.4/pyproject.toml 2023-04-12 12:27:17.000000000 +0200 +++ new/gwpy-3.0.5/pyproject.toml 2023-06-02 10:29:18.000000000 +0200 @@ -40,7 +40,7 @@ "dqsegdb2", "gwdatafind >=1.1.0", "gwosc >=0.5.3", - "h5py >=2.8.0", + "h5py >=3.0.0", "ligo-segments >=1.0.0", "ligotimegps >=1.2.1", "matplotlib >=3.3.0",