gwpy 3.0.8__tar.gz → 3.0.9__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of gwpy might be problematic. Click here for more details.
- {gwpy-3.0.8 → gwpy-3.0.9}/PKG-INFO +2 -2
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/_version.py +2 -2
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/astro/range.py +3 -3
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/astro/tests/test_range.py +4 -5
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/cli/qtransform.py +1 -1
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/detector/units.py +1 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/io/datafind.py +1 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/io/ffldatafind.py +27 -16
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/io/tests/test_ffldatafind.py +10 -3
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/plot/tex.py +6 -4
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/signal/filter_design.py +4 -3
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/signal/tests/test_filter_design.py +3 -3
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/spectrogram/tests/test_spectrogram.py +2 -2
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/testing/fixtures.py +1 -18
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/testing/utils.py +15 -6
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/timeseries/io/cache.py +47 -29
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/timeseries/io/gwf/lalframe.py +8 -0
- gwpy-3.0.9/gwpy/timeseries/tests/test_io_cache.py +74 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/timeseries/tests/test_timeseries.py +27 -20
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/types/array.py +16 -3
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/types/index.py +7 -5
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/utils/tests/test_sphinx_zenodo.py +18 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy.egg-info/PKG-INFO +2 -2
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy.egg-info/SOURCES.txt +1 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy.egg-info/requires.txt +1 -1
- {gwpy-3.0.8 → gwpy-3.0.9}/pyproject.toml +1 -1
- {gwpy-3.0.8 → gwpy-3.0.9}/.codeclimate.yml +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/.codecov.yml +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/.flake8 +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/.gitattributes +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/.github/workflows/conda.yml +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/.github/workflows/dependencies.yml +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/.github/workflows/dist.yml +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/.github/workflows/lint.yml +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/.github/workflows/release.yml +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/.gitignore +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/.pep8speaks.yml +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/CODE_OF_CONDUCT.rst +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/CONTRIBUTING.md +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/LICENSE +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/MANIFEST.in +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/README.md +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/docs/Makefile +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/docs/_static/css/gwpy-sphinx.css +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/docs/_static/favicon.png +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/docs/_static/gwpy_white_24.png +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/docs/_templates/autoclass/class.rst +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/docs/_templates/autosummary/base.rst +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/docs/_templates/autosummary/class.rst +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/docs/_templates/autosummary/module.rst +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/docs/astro/index.rst +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/docs/citing.rst.in +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/docs/cli/examples.ini +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/docs/cli/index.rst +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/docs/conf.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/docs/detector/channel.rst +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/docs/dev/release.rst +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/docs/env.rst +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/docs/examples/table/H1-LDAS_STRAIN-968654552-10.xml.gz +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/docs/external/framecpp.rst +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/docs/external/framel.rst +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/docs/external/lalsuite.rst +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/docs/external/nds2.rst +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/docs/gwpy-docs-logo.png +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/docs/index.rst +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/docs/install.rst +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/docs/overview.rst +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/docs/plot/colorbars.rst +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/docs/plot/colors.rst +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/docs/plot/filter.rst +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/docs/plot/gps.rst +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/docs/plot/index.rst +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/docs/plot/legend.rst +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/docs/plot/log.rst +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/docs/references.rst +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/docs/segments/dqsegdb.rst +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/docs/segments/index.rst +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/docs/segments/io.rst +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/docs/segments/thresholding.rst +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/docs/signal/index.rst +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/docs/spectrogram/index.rst +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/docs/spectrum/filtering.rst +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/docs/spectrum/index.rst +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/docs/spectrum/io.rst +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/docs/table/H1-LDAS_STRAIN-968654552-10.xml.gz +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/docs/table/filter.rst +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/docs/table/histogram.rst +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/docs/table/index.rst +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/docs/table/io.rst +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/docs/table/plot.rst +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/docs/table/rate.rst +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/docs/time/index.rst +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/docs/timeseries/datafind.rst +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/docs/timeseries/index.rst +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/docs/timeseries/io.rst +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/docs/timeseries/opendata.rst +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/docs/timeseries/plot.rst +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/docs/timeseries/statevector.rst +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/examples/frequencyseries/coherence.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/examples/frequencyseries/hoff.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/examples/frequencyseries/index.rst +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/examples/frequencyseries/inject.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/examples/frequencyseries/percentiles.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/examples/frequencyseries/rayleigh.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/examples/frequencyseries/transfer_function.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/examples/frequencyseries/variance.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/examples/miscellaneous/index.rst +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/examples/miscellaneous/open-data-spectrogram.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/examples/miscellaneous/range-spectrogram.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/examples/miscellaneous/range-timeseries.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/examples/segments/index.rst +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/examples/segments/open-data.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/examples/signal/gw150914.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/examples/signal/index.rst +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/examples/signal/qscan.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/examples/spectrogram/coherence.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/examples/spectrogram/index.rst +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/examples/spectrogram/plot.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/examples/spectrogram/ratio.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/examples/spectrogram/rayleigh.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/examples/spectrogram/spectrogram2.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/examples/table/H1-LDAS_STRAIN-968654552-10.xml.gz +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/examples/table/histogram.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/examples/table/index.rst +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/examples/table/rate.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/examples/table/rate_binned.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/examples/table/scatter.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/examples/table/tiles.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/examples/test_examples.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/examples/timeseries/blrms.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/examples/timeseries/correlate.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/examples/timeseries/filter.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/examples/timeseries/index.rst +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/examples/timeseries/inject.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/examples/timeseries/public.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/examples/timeseries/pycbc-snr.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/examples/timeseries/qscan.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/examples/timeseries/statevector.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/examples/timeseries/whiten.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/__init__.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/astro/__init__.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/astro/tests/__init__.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/cli/__init__.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/cli/cliproduct.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/cli/coherence.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/cli/coherencegram.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/cli/gwpy_plot.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/cli/spectrogram.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/cli/spectrum.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/cli/tests/__init__.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/cli/tests/base.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/cli/tests/test_coherence.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/cli/tests/test_coherencegram.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/cli/tests/test_gwpy_plot.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/cli/tests/test_qtransform.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/cli/tests/test_spectrogram.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/cli/tests/test_spectrum.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/cli/tests/test_timeseries.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/cli/tests/test_transferfunction.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/cli/timeseries.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/cli/transferfunction.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/conftest.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/detector/__init__.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/detector/channel.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/detector/io/__init__.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/detector/io/cis.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/detector/io/clf.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/detector/io/omega.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/detector/tests/__init__.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/detector/tests/test_channel.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/detector/tests/test_units.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/frequencyseries/__init__.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/frequencyseries/_fdcommon.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/frequencyseries/frequencyseries.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/frequencyseries/hist.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/frequencyseries/io/__init__.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/frequencyseries/io/ascii.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/frequencyseries/io/hdf5.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/frequencyseries/io/ligolw.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/frequencyseries/tests/__init__.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/frequencyseries/tests/test_frequencyseries.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/frequencyseries/tests/test_hist.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/io/__init__.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/io/_framecpp.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/io/cache.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/io/gwf.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/io/hdf5.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/io/kerberos.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/io/ligolw.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/io/mp.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/io/nds2.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/io/registry.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/io/tests/__init__.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/io/tests/test_cache.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/io/tests/test_datafind.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/io/tests/test_gwf.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/io/tests/test_kerberos.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/io/tests/test_ligolw.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/io/tests/test_mp.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/io/tests/test_nds2.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/io/tests/test_utils.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/io/utils.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/plot/__init__.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/plot/axes.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/plot/bode.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/plot/colorbar.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/plot/colors.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/plot/gps.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/plot/legend.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/plot/log.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/plot/plot.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/plot/rc.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/plot/segments.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/plot/tests/__init__.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/plot/tests/test_axes.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/plot/tests/test_bode.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/plot/tests/test_colors.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/plot/tests/test_gps.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/plot/tests/test_log.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/plot/tests/test_plot.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/plot/tests/test_rc.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/plot/tests/test_segments.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/plot/tests/test_tex.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/plot/tests/test_text.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/plot/tests/test_utils.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/plot/tests/utils.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/plot/text.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/plot/units.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/plot/utils.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/segments/__init__.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/segments/flag.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/segments/io/__init__.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/segments/io/hdf5.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/segments/io/json.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/segments/io/ligolw.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/segments/io/segwizard.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/segments/segments.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/segments/tests/__init__.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/segments/tests/test_flag.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/segments/tests/test_segments.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/signal/__init__.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/signal/fft.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/signal/qtransform.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/signal/spectral/__init__.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/signal/spectral/_lal.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/signal/spectral/_median_mean.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/signal/spectral/_pycbc.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/signal/spectral/_registry.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/signal/spectral/_scipy.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/signal/spectral/_ui.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/signal/spectral/_utils.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/signal/tests/__init__.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/signal/tests/test_coherence.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/signal/tests/test_qtransform.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/signal/tests/test_spectral_lal.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/signal/tests/test_spectral_median_mean.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/signal/tests/test_spectral_pycbc.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/signal/tests/test_spectral_registry.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/signal/tests/test_spectral_scipy.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/signal/tests/test_spectral_ui.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/signal/tests/test_spectral_utils.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/signal/tests/test_window.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/signal/window.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/spectrogram/__init__.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/spectrogram/coherence.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/spectrogram/io/__init__.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/spectrogram/io/hdf5.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/spectrogram/spectrogram.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/spectrogram/tests/__init__.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/table/__init__.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/table/filter.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/table/filters.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/table/gravityspy.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/table/io/__init__.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/table/io/cwb.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/table/io/fetch.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/table/io/gravityspy.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/table/io/gstlal.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/table/io/gwf.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/table/io/hacr.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/table/io/ligolw.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/table/io/losc.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/table/io/omega.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/table/io/omicron.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/table/io/pycbc.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/table/io/root.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/table/io/snax.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/table/io/sql.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/table/io/utils.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/table/table.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/table/tests/__init__.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/table/tests/test_gravityspy.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/table/tests/test_io_gstlal.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/table/tests/test_io_ligolw.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/table/tests/test_io_pycbc.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/table/tests/test_table.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/testing/__init__.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/testing/data/H1-LDAS_STRAIN-968654552-10.xml.gz +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/testing/data/HLV-HW100916-968654552-1.gwf +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/testing/data/HLV-HW100916-968654552-1.hdf +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/testing/data/X1-GWPY_TEST_SEGMENTS-0-10.txt +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/testing/data/X1-GWPY_TEST_SEGMENTS-0-10.xml.gz +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/testing/errors.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/testing/marks.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/testing/mocks.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/time/__init__.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/time/__main__.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/time/_tconvert.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/time/tests/__init__.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/time/tests/test_main.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/time/tests/test_time.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/timeseries/__init__.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/timeseries/core.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/timeseries/io/__init__.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/timeseries/io/ascii.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/timeseries/io/core.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/timeseries/io/gwf/__init__.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/timeseries/io/gwf/framecpp.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/timeseries/io/gwf/framel.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/timeseries/io/hdf5.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/timeseries/io/losc.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/timeseries/io/nds2.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/timeseries/io/wav.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/timeseries/statevector.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/timeseries/tests/__init__.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/timeseries/tests/test_core.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/timeseries/tests/test_io_gwf_framecpp.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/timeseries/tests/test_io_gwf_lalframe.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/timeseries/tests/test_io_losc.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/timeseries/tests/test_statevector.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/timeseries/timeseries.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/types/__init__.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/types/array2d.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/types/io/__init__.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/types/io/ascii.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/types/io/hdf5.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/types/io/ligolw.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/types/series.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/types/sliceutils.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/types/tests/__init__.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/types/tests/test_array.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/types/tests/test_array2d.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/types/tests/test_index.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/types/tests/test_series.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/utils/__init__.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/utils/decorators.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/utils/enum.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/utils/env.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/utils/lal.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/utils/misc.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/utils/mp.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/utils/progress.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/utils/shell.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/utils/sphinx/__init__.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/utils/sphinx/ex2rst.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/utils/sphinx/zenodo.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/utils/tests/__init__.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/utils/tests/test_decorators.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/utils/tests/test_enum.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/utils/tests/test_env.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/utils/tests/test_lal.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/utils/tests/test_misc.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/utils/tests/test_mp.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/utils/tests/test_shell.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/utils/tests/test_sphinx_ex2rst.py +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy.egg-info/dependency_links.txt +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy.egg-info/entry_points.txt +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/gwpy.egg-info/top_level.txt +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/setup.cfg +0 -0
- {gwpy-3.0.8 → gwpy-3.0.9}/setup_utils.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: gwpy
|
|
3
|
-
Version: 3.0.
|
|
3
|
+
Version: 3.0.9
|
|
4
4
|
Summary: A python package for gravitational-wave astrophysics
|
|
5
5
|
Author-email: Duncan Macleod <duncan.macleod@ligo.org>
|
|
6
6
|
License: GPL-3.0-or-later
|
|
@@ -37,7 +37,7 @@ Requires-Dist: matplotlib>=3.3.0
|
|
|
37
37
|
Requires-Dist: numpy>=1.19
|
|
38
38
|
Requires-Dist: python-dateutil
|
|
39
39
|
Requires-Dist: requests
|
|
40
|
-
Requires-Dist: scipy>=1.
|
|
40
|
+
Requires-Dist: scipy>=1.6.0
|
|
41
41
|
Requires-Dist: tqdm>=4.10.0
|
|
42
42
|
Provides-Extra: test
|
|
43
43
|
Requires-Dist: coverage[toml]>=5.0; extra == "test"
|
|
@@ -25,7 +25,7 @@ import warnings
|
|
|
25
25
|
from functools import wraps
|
|
26
26
|
from math import pi
|
|
27
27
|
|
|
28
|
-
from scipy.integrate import
|
|
28
|
+
from scipy.integrate import trapezoid
|
|
29
29
|
from scipy.interpolate import interp1d
|
|
30
30
|
|
|
31
31
|
from astropy import (
|
|
@@ -238,7 +238,7 @@ def sensemon_range(psd, snr=8, mass1=1.4, mass2=1.4, fmin=None, fmax=None,
|
|
|
238
238
|
integrand = sensemon_range_psd(psd[frange], snr=snr, mass1=mass1,
|
|
239
239
|
mass2=mass2, horizon=horizon)
|
|
240
240
|
return (units.Quantity(
|
|
241
|
-
|
|
241
|
+
trapezoid(integrand.value, f.value[frange]),
|
|
242
242
|
unit=integrand.unit * units.Hertz,
|
|
243
243
|
) ** (1/2.)).to('Mpc')
|
|
244
244
|
|
|
@@ -528,7 +528,7 @@ def burst_range(psd, snr=8, energy=1e-2, fmin=100, fmax=500):
|
|
|
528
528
|
# calculate integrand and integrate
|
|
529
529
|
integrand = burst_range_spectrum(
|
|
530
530
|
psd[frange], snr=snr, energy=energy) ** 3
|
|
531
|
-
out =
|
|
531
|
+
out = trapezoid(integrand.value, f[frange])
|
|
532
532
|
# normalize and return
|
|
533
533
|
return (units.Quantity(
|
|
534
534
|
out / (fmax - fmin),
|
|
@@ -24,7 +24,7 @@ from unittest import mock
|
|
|
24
24
|
import pytest
|
|
25
25
|
|
|
26
26
|
from astropy import units
|
|
27
|
-
from scipy.integrate import
|
|
27
|
+
from scipy.integrate import trapezoid
|
|
28
28
|
|
|
29
29
|
from ... import astro
|
|
30
30
|
from ...testing import utils
|
|
@@ -71,7 +71,7 @@ def test_sensemon_range_psd(psd):
|
|
|
71
71
|
r = astro.sensemon_range_psd(psd[frange])
|
|
72
72
|
assert isinstance(r, FrequencySeries)
|
|
73
73
|
utils.assert_quantity_almost_equal(
|
|
74
|
-
|
|
74
|
+
trapezoid(r, r.frequencies) ** (1/2.),
|
|
75
75
|
TEST_RESULTS['sensemon_range'],
|
|
76
76
|
)
|
|
77
77
|
assert r.f0.value > 0
|
|
@@ -103,9 +103,8 @@ def test_inspiral_range_psd(psd):
|
|
|
103
103
|
frange = (psd.frequencies.value < 4096)
|
|
104
104
|
r = astro.inspiral_range_psd(psd[frange])
|
|
105
105
|
assert isinstance(r, FrequencySeries)
|
|
106
|
-
print(trapz(r, r.frequencies) ** (1/2.))
|
|
107
106
|
utils.assert_quantity_almost_equal(
|
|
108
|
-
|
|
107
|
+
trapezoid(r, r.frequencies) ** (1/2.),
|
|
109
108
|
TEST_RESULTS['inspiral_range'],
|
|
110
109
|
)
|
|
111
110
|
assert r.f0.value > 0
|
|
@@ -129,7 +128,7 @@ def test_burst_range_spectrum(psd):
|
|
|
129
128
|
r = astro.burst_range_spectrum(psd[frange])
|
|
130
129
|
assert isinstance(r, FrequencySeries)
|
|
131
130
|
utils.assert_quantity_almost_equal(
|
|
132
|
-
(
|
|
131
|
+
(trapezoid(r**3, f[frange]) / (400 * units.Hz)) ** (1/3.),
|
|
133
132
|
TEST_RESULTS['burst_range'],
|
|
134
133
|
)
|
|
135
134
|
assert r.f0.value > 0
|
|
@@ -215,7 +215,7 @@ class Qtransform(Spectrogram):
|
|
|
215
215
|
outseg = Segment(gps, gps).protract(args.plot[self.plot_num])
|
|
216
216
|
|
|
217
217
|
# use the precomputed ASD as the whitener if needed
|
|
218
|
-
if self.qxfrm_args.get("whiten"):
|
|
218
|
+
if self.qxfrm_args.get("whiten") is True:
|
|
219
219
|
self.qxfrm_args["whiten"] = asd
|
|
220
220
|
|
|
221
221
|
# This section tries to optimize the amount of data that is
|
|
@@ -65,6 +65,7 @@ GRB_TYPE = re.compile(r'^(?!.*_GRB\d{6}([A-Z])?$)') # *_GRBYYMMDD{A}
|
|
|
65
65
|
HIGH_PRIORITY_TYPE = re.compile("({})".format("|".join((
|
|
66
66
|
r'\A[A-Z]\d_HOFT_C\d\d(_T\d{7}_v\d)?\Z', # X1_HOFT_CXY
|
|
67
67
|
r'\AV1Online\Z',
|
|
68
|
+
r'\AHoftOnline\Z',
|
|
68
69
|
r'\AV1O[0-9]+([A-Z]+)?Repro[0-9]+[A-Z]+\Z', # V1OXReproXY
|
|
69
70
|
))))
|
|
70
71
|
LOW_PRIORITY_TYPE = re.compile("({})".format("|".join((
|
|
@@ -28,8 +28,9 @@ __author__ = "Duncan Macleod <duncan.macleod@ligo.org>"
|
|
|
28
28
|
|
|
29
29
|
import os
|
|
30
30
|
import re
|
|
31
|
-
from
|
|
31
|
+
from collections import defaultdict
|
|
32
32
|
from functools import lru_cache
|
|
33
|
+
from warnings import warn
|
|
33
34
|
|
|
34
35
|
from ligo.segments import (
|
|
35
36
|
segment,
|
|
@@ -37,8 +38,10 @@ from ligo.segments import (
|
|
|
37
38
|
)
|
|
38
39
|
|
|
39
40
|
from .cache import (
|
|
41
|
+
_CacheEntry,
|
|
40
42
|
_iter_cache,
|
|
41
43
|
cache_segments,
|
|
44
|
+
file_segment,
|
|
42
45
|
read_cache_entry,
|
|
43
46
|
)
|
|
44
47
|
|
|
@@ -123,10 +126,10 @@ def _find_ffl_files(basedir=None):
|
|
|
123
126
|
def _find_ffls(basedir=None):
|
|
124
127
|
"""Find all readable FFL files.
|
|
125
128
|
"""
|
|
126
|
-
ffls =
|
|
129
|
+
ffls = defaultdict(list)
|
|
127
130
|
for path in _find_ffl_files(basedir=basedir):
|
|
128
131
|
try:
|
|
129
|
-
ffls[_get_site_tag(path)]
|
|
132
|
+
ffls[_get_site_tag(path)].append(path)
|
|
130
133
|
except (
|
|
131
134
|
OSError, # file is empty (or cannot be read at all)
|
|
132
135
|
AttributeError, # last entry didn't match _SITE_REGEX
|
|
@@ -135,8 +138,8 @@ def _find_ffls(basedir=None):
|
|
|
135
138
|
return ffls
|
|
136
139
|
|
|
137
140
|
|
|
138
|
-
def
|
|
139
|
-
"""Return the
|
|
141
|
+
def _ffl_paths(site, tag, basedir=None):
|
|
142
|
+
"""Return the paths of all FFL files for a given site and tag.
|
|
140
143
|
"""
|
|
141
144
|
try:
|
|
142
145
|
return _find_ffls(basedir=basedir)[(site, tag)]
|
|
@@ -147,15 +150,18 @@ def _ffl_path(site, tag, basedir=None):
|
|
|
147
150
|
|
|
148
151
|
|
|
149
152
|
@lru_cache()
|
|
150
|
-
def
|
|
151
|
-
"""Read
|
|
153
|
+
def _read_ffls(site, tag, basedir=None):
|
|
154
|
+
"""Read all FFL files for a given site and tag
|
|
155
|
+
as a list of `CacheEntry` objects.
|
|
152
156
|
"""
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
157
|
+
entries = []
|
|
158
|
+
for ffl in _ffl_paths(site, tag, basedir=basedir):
|
|
159
|
+
with open(ffl, "r") as fobj:
|
|
160
|
+
entries.extend(
|
|
161
|
+
_CacheEntry(site, tag, entry.segment, entry.path)
|
|
162
|
+
for entry in _iter_cache(fobj, gpstype=float)
|
|
163
|
+
)
|
|
164
|
+
return entries
|
|
159
165
|
|
|
160
166
|
|
|
161
167
|
def _handle_error(action, message):
|
|
@@ -261,7 +267,7 @@ def find_urls(
|
|
|
261
267
|
span = segment(gpsstart, gpsend)
|
|
262
268
|
|
|
263
269
|
cache = [
|
|
264
|
-
e for e in
|
|
270
|
+
e for e in _read_ffls(site, tag) if (
|
|
265
271
|
e.observatory == site
|
|
266
272
|
and e.description == tag
|
|
267
273
|
and e.segment.intersects(span)
|
|
@@ -305,11 +311,16 @@ def find_latest(site, tag, on_missing="warn"):
|
|
|
305
311
|
for a specific site and tag.
|
|
306
312
|
"""
|
|
307
313
|
try:
|
|
308
|
-
|
|
314
|
+
fflfiles = _ffl_paths(site, tag)
|
|
309
315
|
except ValueError: # no readable FFL file
|
|
310
316
|
urls = []
|
|
311
317
|
else:
|
|
312
|
-
urls = [
|
|
318
|
+
urls = [
|
|
319
|
+
read_cache_entry(_read_last_line(fflfile), gpstype=float)
|
|
320
|
+
for fflfile in fflfiles
|
|
321
|
+
]
|
|
322
|
+
if urls: # if multiple, find the latest one
|
|
323
|
+
urls = sorted(urls, key=file_segment)[-1:]
|
|
313
324
|
|
|
314
325
|
if not urls:
|
|
315
326
|
_handle_error(on_missing, "No files found")
|
|
@@ -96,9 +96,11 @@ def test_is_ffl_file(path, result):
|
|
|
96
96
|
# -- test ffl UI ------------
|
|
97
97
|
|
|
98
98
|
FFLS = {
|
|
99
|
-
"test.ffl": [
|
|
99
|
+
"a/test.ffl": [
|
|
100
100
|
"/tmp/X-test-0-1.gwf 0 1 0 0",
|
|
101
101
|
"/tmp/X-test-1-1.gwf 1 1 0 0",
|
|
102
|
+
],
|
|
103
|
+
"b/test.ffl": [
|
|
102
104
|
"/tmp/X-test-2-1.gwf 2 1 0 0",
|
|
103
105
|
],
|
|
104
106
|
"test2.ffl": [
|
|
@@ -114,7 +116,11 @@ FFLS = {
|
|
|
114
116
|
"test-empty.ffl": [],
|
|
115
117
|
"test-bad.ffl": ["badness"],
|
|
116
118
|
}
|
|
117
|
-
TEST_URLS = [
|
|
119
|
+
TEST_URLS = [
|
|
120
|
+
x.split()[0]
|
|
121
|
+
for key in ("a/test.ffl", "b/test.ffl")
|
|
122
|
+
for x in FFLS[key]
|
|
123
|
+
]
|
|
118
124
|
|
|
119
125
|
|
|
120
126
|
@pytest.fixture(autouse=True)
|
|
@@ -124,6 +130,7 @@ def mock_ffl(tmp_path):
|
|
|
124
130
|
"""
|
|
125
131
|
for path, lines in FFLS.items():
|
|
126
132
|
ffl = tmp_path / path
|
|
133
|
+
ffl.parent.mkdir(parents=True, exist_ok=True)
|
|
127
134
|
ffl.write_text("\n".join(lines))
|
|
128
135
|
with mock.patch.dict(
|
|
129
136
|
"os.environ",
|
|
@@ -190,7 +197,7 @@ def test_find_latest():
|
|
|
190
197
|
assert ffldatafind.find_latest(
|
|
191
198
|
"X",
|
|
192
199
|
"test",
|
|
193
|
-
) == sorted(x.split()[0] for x in FFLS["test.ffl"])[-1:]
|
|
200
|
+
) == sorted(x.split()[0] for x in FFLS["b/test.ffl"])[-1:]
|
|
194
201
|
|
|
195
202
|
|
|
196
203
|
@pytest.mark.parametrize(("on_missing", "ctx"), (
|
|
@@ -39,10 +39,12 @@ def _test_usetex():
|
|
|
39
39
|
from matplotlib import (pyplot, rc_context)
|
|
40
40
|
with rc_context({"text.usetex": True}):
|
|
41
41
|
fig = pyplot.figure()
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
42
|
+
try:
|
|
43
|
+
ax = fig.gca()
|
|
44
|
+
ax.set_xlabel(r"\LaTeX")
|
|
45
|
+
fig.canvas.draw()
|
|
46
|
+
finally:
|
|
47
|
+
pyplot.close(fig)
|
|
46
48
|
|
|
47
49
|
|
|
48
50
|
@lru_cache(maxsize=None)
|
|
@@ -30,6 +30,7 @@ from scipy import signal
|
|
|
30
30
|
|
|
31
31
|
from astropy.units import (Unit, Quantity)
|
|
32
32
|
|
|
33
|
+
from ..types.array import COPY_IF_NEEDED
|
|
33
34
|
from .window import (get_window, planck)
|
|
34
35
|
|
|
35
36
|
__author__ = "Duncan Macleod <duncan.macleod@ligo.org>"
|
|
@@ -89,7 +90,7 @@ def _design_fir(wp, ws, sample_rate, gpass, gstop, window='hamming', **kwargs):
|
|
|
89
90
|
kwargs.setdefault('pass_zero', False)
|
|
90
91
|
if ws.shape == (1,):
|
|
91
92
|
kwargs.setdefault('width', ws - wp)
|
|
92
|
-
kwargs.setdefault('
|
|
93
|
+
kwargs.setdefault('fs', sample_rate)
|
|
93
94
|
return signal.firwin(nt, wp, window=window, **kwargs)
|
|
94
95
|
|
|
95
96
|
|
|
@@ -281,9 +282,9 @@ def bilinear_zpk(zeros, poles, gain, fs=1.0, unit='Hz'):
|
|
|
281
282
|
zpk : `tuple`
|
|
282
283
|
digital version of input zpk
|
|
283
284
|
"""
|
|
284
|
-
zeros = numpy.array(zeros, dtype=float, copy=
|
|
285
|
+
zeros = numpy.array(zeros, dtype=float, copy=COPY_IF_NEEDED)
|
|
285
286
|
zeros = zeros[numpy.isfinite(zeros)]
|
|
286
|
-
poles = numpy.array(poles, dtype=float, copy=
|
|
287
|
+
poles = numpy.array(poles, dtype=float, copy=COPY_IF_NEEDED)
|
|
287
288
|
gain = gain
|
|
288
289
|
|
|
289
290
|
# convert from Hz to rad/s if needed
|
|
@@ -50,7 +50,7 @@ LOWPASS_IIR_100HZ = signal.iirdesign(
|
|
|
50
50
|
analog=False, ftype='cheby1', output='zpk',
|
|
51
51
|
)
|
|
52
52
|
LOWPASS_FIR_100HZ = signal.firwin(
|
|
53
|
-
30, 100, window='hamming', width=50.,
|
|
53
|
+
30, 100, window='hamming', width=50., fs=1024.,
|
|
54
54
|
)
|
|
55
55
|
|
|
56
56
|
HIGHPASS_IIR_100HZ = signal.iirdesign(
|
|
@@ -60,7 +60,7 @@ HIGHPASS_IIR_100HZ = signal.iirdesign(
|
|
|
60
60
|
analog=False, ftype='cheby1', output='zpk',
|
|
61
61
|
)
|
|
62
62
|
HIGHPASS_FIR_100HZ = signal.firwin(
|
|
63
|
-
45, 100, window='hamming', pass_zero=False, width=-100/3.,
|
|
63
|
+
45, 100, window='hamming', pass_zero=False, width=-100/3., fs=1024.,
|
|
64
64
|
)
|
|
65
65
|
|
|
66
66
|
BANDPASS_IIR_100HZ_200HZ = signal.iirdesign(
|
|
@@ -70,7 +70,7 @@ BANDPASS_IIR_100HZ_200HZ = signal.iirdesign(
|
|
|
70
70
|
analog=False, ftype='cheby1', output='zpk',
|
|
71
71
|
)
|
|
72
72
|
BANDPASS_FIR_100HZ_200HZ = signal.firwin(
|
|
73
|
-
45, (100, 200.), window='hamming', pass_zero=False,
|
|
73
|
+
45, (100, 200.), window='hamming', pass_zero=False, fs=1024.,
|
|
74
74
|
)
|
|
75
75
|
|
|
76
76
|
|
|
@@ -175,11 +175,11 @@ class TestSpectrogram(_TestArray2D):
|
|
|
175
175
|
|
|
176
176
|
# test simple filter
|
|
177
177
|
a2 = array.filter(*zpk)
|
|
178
|
-
utils.
|
|
178
|
+
utils.assert_quantity_sub_equal(array * fresp, a2)
|
|
179
179
|
|
|
180
180
|
# test inplace filtering
|
|
181
181
|
array.filter(lti, inplace=True)
|
|
182
|
-
utils.
|
|
182
|
+
utils.assert_quantity_sub_equal(array, a2)
|
|
183
183
|
|
|
184
184
|
# test errors
|
|
185
185
|
with pytest.raises(TypeError):
|
|
@@ -52,25 +52,8 @@ def tmpfile():
|
|
|
52
52
|
|
|
53
53
|
# -- plotting -----------------------------------------------------------------
|
|
54
54
|
|
|
55
|
-
def _test_usetex():
|
|
56
|
-
"""Return `True` if we can render figures using `text.usetex`.
|
|
57
|
-
"""
|
|
58
|
-
from matplotlib import pyplot
|
|
59
|
-
with rc_context(rc={'text.usetex': True}):
|
|
60
|
-
fig = pyplot.figure()
|
|
61
|
-
fig.gca()
|
|
62
|
-
try:
|
|
63
|
-
fig.canvas.draw()
|
|
64
|
-
except RuntimeError:
|
|
65
|
-
return False
|
|
66
|
-
else:
|
|
67
|
-
return True
|
|
68
|
-
finally:
|
|
69
|
-
pyplot.close(fig)
|
|
70
|
-
|
|
71
|
-
|
|
72
55
|
SKIP_TEX = pytest.mark.skipif(
|
|
73
|
-
not has_tex()
|
|
56
|
+
not has_tex(),
|
|
74
57
|
reason='TeX is not available',
|
|
75
58
|
)
|
|
76
59
|
|
|
@@ -34,12 +34,14 @@ from numpy.testing import (assert_array_equal, assert_allclose)
|
|
|
34
34
|
|
|
35
35
|
from astropy.time import Time
|
|
36
36
|
|
|
37
|
-
from
|
|
37
|
+
from gwpy.io.cache import file_segment
|
|
38
|
+
from gwpy.utils.decorators import deprecated_function
|
|
38
39
|
|
|
39
40
|
# -- useful constants ---------------------------------------------------------
|
|
40
41
|
|
|
41
42
|
TEST_DATA_DIR = os.path.join(os.path.dirname(__file__), 'data')
|
|
42
43
|
TEST_GWF_FILE = os.path.join(TEST_DATA_DIR, 'HLV-HW100916-968654552-1.gwf')
|
|
44
|
+
TEST_GWF_SPAN = file_segment(TEST_GWF_FILE)
|
|
43
45
|
TEST_HDF5_FILE = os.path.join(TEST_DATA_DIR, 'HLV-HW100916-968654552-1.hdf')
|
|
44
46
|
|
|
45
47
|
|
|
@@ -328,11 +330,18 @@ def TemporaryFilename(*args, **kwargs): # pylint: disable=invalid-name
|
|
|
328
330
|
os.remove(name)
|
|
329
331
|
|
|
330
332
|
|
|
331
|
-
def test_read_write(
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
333
|
+
def test_read_write(
|
|
334
|
+
data,
|
|
335
|
+
format,
|
|
336
|
+
extension=None,
|
|
337
|
+
autoidentify=True,
|
|
338
|
+
read_args=[],
|
|
339
|
+
read_kw={},
|
|
340
|
+
write_args=[],
|
|
341
|
+
write_kw={},
|
|
342
|
+
assert_equal=assert_quantity_sub_equal,
|
|
343
|
+
assert_kw={},
|
|
344
|
+
):
|
|
336
345
|
"""Test that data can be written to and read from a file in some format
|
|
337
346
|
|
|
338
347
|
Parameters
|
|
@@ -19,22 +19,34 @@
|
|
|
19
19
|
"""I/O utilities for reading `TimeSeries` from a `list` of file paths.
|
|
20
20
|
"""
|
|
21
21
|
|
|
22
|
-
from
|
|
22
|
+
from io import BytesIO
|
|
23
|
+
from math import inf
|
|
24
|
+
from os import PathLike
|
|
25
|
+
|
|
26
|
+
from ...io.cache import (
|
|
27
|
+
FILE_LIKE,
|
|
28
|
+
file_segment,
|
|
29
|
+
read_cache,
|
|
30
|
+
write_cache,
|
|
31
|
+
)
|
|
23
32
|
from ...segments import Segment
|
|
24
33
|
|
|
25
34
|
__author__ = "Duncan Macleod <duncan.macleod@ligo.org>"
|
|
26
35
|
|
|
27
36
|
|
|
28
|
-
def preformat_cache(cache, start=None, end=None):
|
|
37
|
+
def preformat_cache(cache, start=None, end=None, sort=file_segment):
|
|
29
38
|
"""Preprocess a `list` of file paths for reading.
|
|
30
39
|
|
|
31
|
-
|
|
32
|
-
|
|
40
|
+
This function does the following:
|
|
41
|
+
|
|
42
|
+
- read the list of paths cache file (if necessary),
|
|
43
|
+
- sort the cache in time order (if possible),
|
|
44
|
+
- sieve the cache to only include data we need.
|
|
33
45
|
|
|
34
46
|
Parameters
|
|
35
47
|
----------
|
|
36
|
-
cache : `list`, `str`
|
|
37
|
-
List of file paths, or path to a
|
|
48
|
+
cache : `list`, `str`, `pathlib.Path`
|
|
49
|
+
List of file paths, or path to a cache file.
|
|
38
50
|
|
|
39
51
|
start : `~gwpy.time.LIGOTimeGPS`, `float`, `str`, optional
|
|
40
52
|
GPS start time of required data, defaults to start of data found;
|
|
@@ -44,31 +56,37 @@ def preformat_cache(cache, start=None, end=None):
|
|
|
44
56
|
GPS end time of required data, defaults to end of data found;
|
|
45
57
|
any input parseable by `~gwpy.time.to_gps` is fine.
|
|
46
58
|
|
|
59
|
+
sort : `callable`, optional
|
|
60
|
+
A callable key function by which to sort the file paths.
|
|
61
|
+
|
|
47
62
|
Returns
|
|
48
63
|
-------
|
|
49
64
|
modcache : `list`
|
|
50
65
|
A parsed, sieved list of paths based on the input arguments.
|
|
66
|
+
|
|
67
|
+
See also
|
|
68
|
+
--------
|
|
69
|
+
gwpy.io.cache.read_cache
|
|
70
|
+
For details of how the sorting and sieving is implemented
|
|
51
71
|
"""
|
|
52
|
-
#
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
#
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
start
|
|
72
|
-
|
|
73
|
-
end = file_segment(cache[-1])[-1]
|
|
74
|
-
return sieve(cache, segment=Segment(start, end))
|
|
72
|
+
# if given a list of paths, write it to a file-like structure
|
|
73
|
+
# so that we can use read_cache to do all the work
|
|
74
|
+
if not isinstance(cache, (str, PathLike) + FILE_LIKE):
|
|
75
|
+
cachef = BytesIO()
|
|
76
|
+
write_cache(cache, cachef)
|
|
77
|
+
cachef.seek(0)
|
|
78
|
+
cache = cachef
|
|
79
|
+
|
|
80
|
+
# need start and end times to sieve the cache
|
|
81
|
+
if start is None:
|
|
82
|
+
start = -inf
|
|
83
|
+
if end is None:
|
|
84
|
+
end = +inf
|
|
85
|
+
|
|
86
|
+
# read the cache
|
|
87
|
+
return read_cache(
|
|
88
|
+
cache,
|
|
89
|
+
coltype=type(start),
|
|
90
|
+
sort=sort,
|
|
91
|
+
segment=Segment(start, end),
|
|
92
|
+
)
|
|
@@ -149,6 +149,14 @@ def read(source, channels, start=None, end=None, series_class=TimeSeries,
|
|
|
149
149
|
end = epoch + streamdur
|
|
150
150
|
end = min(epoch + streamdur, lalutils.to_lal_ligotimegps(end))
|
|
151
151
|
duration = float(end - start)
|
|
152
|
+
if start >= (epoch + streamdur):
|
|
153
|
+
raise ValueError(
|
|
154
|
+
"cannot read data starting after stream ends",
|
|
155
|
+
)
|
|
156
|
+
if duration < 0:
|
|
157
|
+
raise ValueError(
|
|
158
|
+
"cannot read data with negative duration",
|
|
159
|
+
)
|
|
152
160
|
|
|
153
161
|
# read data
|
|
154
162
|
out = series_class.DictClass()
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# Copyright (C) Cardiff University 2023
|
|
3
|
+
#
|
|
4
|
+
# This file is part of GWpy.
|
|
5
|
+
#
|
|
6
|
+
# GWpy is free software: you can redistribute it and/or modify
|
|
7
|
+
# it under the terms of the GNU General Public License as published by
|
|
8
|
+
# the Free Software Foundation, either version 3 of the License, or
|
|
9
|
+
# (at your option) any later version.
|
|
10
|
+
#
|
|
11
|
+
# GWpy is distributed in the hope that it will be useful,
|
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
14
|
+
# GNU General Public License for more details.
|
|
15
|
+
#
|
|
16
|
+
# You should have received a copy of the GNU General Public License
|
|
17
|
+
# along with GWpy. If not, see <http://www.gnu.org/licenses/>.
|
|
18
|
+
|
|
19
|
+
"""Tests for :mod:`gwpy.timeseries.io.cache`
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
import pytest
|
|
23
|
+
|
|
24
|
+
from ...io.cache import write_cache
|
|
25
|
+
from ..io import cache as ts_io_cache
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
@pytest.fixture
|
|
29
|
+
def cache():
|
|
30
|
+
"""List of files over which to test sorting/sieving.
|
|
31
|
+
"""
|
|
32
|
+
return [
|
|
33
|
+
"/tmp/A-TEST-0-10.tmp",
|
|
34
|
+
"/tmp/A-TEST-10-10.tmp",
|
|
35
|
+
"/tmp/A-TEST-20-10.tmp",
|
|
36
|
+
"/tmp/A-TEST-30-5.tmp",
|
|
37
|
+
"/tmp/A-TEST-35-15.tmp",
|
|
38
|
+
]
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
@pytest.fixture
|
|
42
|
+
def cache_file(tmp_path, cache):
|
|
43
|
+
"""File version of `cache()`.
|
|
44
|
+
"""
|
|
45
|
+
path = tmp_path / "cache.txt"
|
|
46
|
+
write_cache(cache, path)
|
|
47
|
+
return path
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
@pytest.mark.parametrize("source", ("cache", "cache_file"))
|
|
51
|
+
@pytest.mark.parametrize(("start", "end", "idx"), [
|
|
52
|
+
# use everything in the cache
|
|
53
|
+
(None, None, slice(None)),
|
|
54
|
+
# use only GPS time '25' onwards, which is cache[2:]
|
|
55
|
+
(25, None, slice(2, None)),
|
|
56
|
+
# use only up to GPS time '25', which is cache[:3]
|
|
57
|
+
(None, 25, slice(None, 3)),
|
|
58
|
+
# use interval [10, 35), which needs cache[1:4]
|
|
59
|
+
(10, 35, slice(1, 4)),
|
|
60
|
+
])
|
|
61
|
+
def test_preformat_cache(request, cache, source, start, end, idx):
|
|
62
|
+
"""Test that `gwpy.timeseries.io.cache.preformat_cache` works properly.
|
|
63
|
+
|
|
64
|
+
Here `[start, end)` is a GPS segment, and `idx` the corresponding slice
|
|
65
|
+
needed to restrict the cache object.
|
|
66
|
+
|
|
67
|
+
Loops over a variety of input arguments, using `request` to dynamically
|
|
68
|
+
loop over `cache` or `cache_file` as the input.
|
|
69
|
+
"""
|
|
70
|
+
assert ts_io_cache.preformat_cache(
|
|
71
|
+
request.getfixturevalue(source), # cache or cache_file
|
|
72
|
+
start=start,
|
|
73
|
+
end=end,
|
|
74
|
+
) == cache[idx]
|