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.

Files changed (370) hide show
  1. {gwpy-3.0.8 → gwpy-3.0.9}/PKG-INFO +2 -2
  2. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/_version.py +2 -2
  3. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/astro/range.py +3 -3
  4. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/astro/tests/test_range.py +4 -5
  5. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/cli/qtransform.py +1 -1
  6. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/detector/units.py +1 -0
  7. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/io/datafind.py +1 -0
  8. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/io/ffldatafind.py +27 -16
  9. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/io/tests/test_ffldatafind.py +10 -3
  10. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/plot/tex.py +6 -4
  11. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/signal/filter_design.py +4 -3
  12. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/signal/tests/test_filter_design.py +3 -3
  13. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/spectrogram/tests/test_spectrogram.py +2 -2
  14. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/testing/fixtures.py +1 -18
  15. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/testing/utils.py +15 -6
  16. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/timeseries/io/cache.py +47 -29
  17. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/timeseries/io/gwf/lalframe.py +8 -0
  18. gwpy-3.0.9/gwpy/timeseries/tests/test_io_cache.py +74 -0
  19. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/timeseries/tests/test_timeseries.py +27 -20
  20. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/types/array.py +16 -3
  21. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/types/index.py +7 -5
  22. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/utils/tests/test_sphinx_zenodo.py +18 -0
  23. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy.egg-info/PKG-INFO +2 -2
  24. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy.egg-info/SOURCES.txt +1 -0
  25. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy.egg-info/requires.txt +1 -1
  26. {gwpy-3.0.8 → gwpy-3.0.9}/pyproject.toml +1 -1
  27. {gwpy-3.0.8 → gwpy-3.0.9}/.codeclimate.yml +0 -0
  28. {gwpy-3.0.8 → gwpy-3.0.9}/.codecov.yml +0 -0
  29. {gwpy-3.0.8 → gwpy-3.0.9}/.flake8 +0 -0
  30. {gwpy-3.0.8 → gwpy-3.0.9}/.gitattributes +0 -0
  31. {gwpy-3.0.8 → gwpy-3.0.9}/.github/workflows/conda.yml +0 -0
  32. {gwpy-3.0.8 → gwpy-3.0.9}/.github/workflows/dependencies.yml +0 -0
  33. {gwpy-3.0.8 → gwpy-3.0.9}/.github/workflows/dist.yml +0 -0
  34. {gwpy-3.0.8 → gwpy-3.0.9}/.github/workflows/lint.yml +0 -0
  35. {gwpy-3.0.8 → gwpy-3.0.9}/.github/workflows/release.yml +0 -0
  36. {gwpy-3.0.8 → gwpy-3.0.9}/.gitignore +0 -0
  37. {gwpy-3.0.8 → gwpy-3.0.9}/.pep8speaks.yml +0 -0
  38. {gwpy-3.0.8 → gwpy-3.0.9}/CODE_OF_CONDUCT.rst +0 -0
  39. {gwpy-3.0.8 → gwpy-3.0.9}/CONTRIBUTING.md +0 -0
  40. {gwpy-3.0.8 → gwpy-3.0.9}/LICENSE +0 -0
  41. {gwpy-3.0.8 → gwpy-3.0.9}/MANIFEST.in +0 -0
  42. {gwpy-3.0.8 → gwpy-3.0.9}/README.md +0 -0
  43. {gwpy-3.0.8 → gwpy-3.0.9}/docs/Makefile +0 -0
  44. {gwpy-3.0.8 → gwpy-3.0.9}/docs/_static/css/gwpy-sphinx.css +0 -0
  45. {gwpy-3.0.8 → gwpy-3.0.9}/docs/_static/favicon.png +0 -0
  46. {gwpy-3.0.8 → gwpy-3.0.9}/docs/_static/gwpy_white_24.png +0 -0
  47. {gwpy-3.0.8 → gwpy-3.0.9}/docs/_templates/autoclass/class.rst +0 -0
  48. {gwpy-3.0.8 → gwpy-3.0.9}/docs/_templates/autosummary/base.rst +0 -0
  49. {gwpy-3.0.8 → gwpy-3.0.9}/docs/_templates/autosummary/class.rst +0 -0
  50. {gwpy-3.0.8 → gwpy-3.0.9}/docs/_templates/autosummary/module.rst +0 -0
  51. {gwpy-3.0.8 → gwpy-3.0.9}/docs/astro/index.rst +0 -0
  52. {gwpy-3.0.8 → gwpy-3.0.9}/docs/citing.rst.in +0 -0
  53. {gwpy-3.0.8 → gwpy-3.0.9}/docs/cli/examples.ini +0 -0
  54. {gwpy-3.0.8 → gwpy-3.0.9}/docs/cli/index.rst +0 -0
  55. {gwpy-3.0.8 → gwpy-3.0.9}/docs/conf.py +0 -0
  56. {gwpy-3.0.8 → gwpy-3.0.9}/docs/detector/channel.rst +0 -0
  57. {gwpy-3.0.8 → gwpy-3.0.9}/docs/dev/release.rst +0 -0
  58. {gwpy-3.0.8 → gwpy-3.0.9}/docs/env.rst +0 -0
  59. {gwpy-3.0.8 → gwpy-3.0.9}/docs/examples/table/H1-LDAS_STRAIN-968654552-10.xml.gz +0 -0
  60. {gwpy-3.0.8 → gwpy-3.0.9}/docs/external/framecpp.rst +0 -0
  61. {gwpy-3.0.8 → gwpy-3.0.9}/docs/external/framel.rst +0 -0
  62. {gwpy-3.0.8 → gwpy-3.0.9}/docs/external/lalsuite.rst +0 -0
  63. {gwpy-3.0.8 → gwpy-3.0.9}/docs/external/nds2.rst +0 -0
  64. {gwpy-3.0.8 → gwpy-3.0.9}/docs/gwpy-docs-logo.png +0 -0
  65. {gwpy-3.0.8 → gwpy-3.0.9}/docs/index.rst +0 -0
  66. {gwpy-3.0.8 → gwpy-3.0.9}/docs/install.rst +0 -0
  67. {gwpy-3.0.8 → gwpy-3.0.9}/docs/overview.rst +0 -0
  68. {gwpy-3.0.8 → gwpy-3.0.9}/docs/plot/colorbars.rst +0 -0
  69. {gwpy-3.0.8 → gwpy-3.0.9}/docs/plot/colors.rst +0 -0
  70. {gwpy-3.0.8 → gwpy-3.0.9}/docs/plot/filter.rst +0 -0
  71. {gwpy-3.0.8 → gwpy-3.0.9}/docs/plot/gps.rst +0 -0
  72. {gwpy-3.0.8 → gwpy-3.0.9}/docs/plot/index.rst +0 -0
  73. {gwpy-3.0.8 → gwpy-3.0.9}/docs/plot/legend.rst +0 -0
  74. {gwpy-3.0.8 → gwpy-3.0.9}/docs/plot/log.rst +0 -0
  75. {gwpy-3.0.8 → gwpy-3.0.9}/docs/references.rst +0 -0
  76. {gwpy-3.0.8 → gwpy-3.0.9}/docs/segments/dqsegdb.rst +0 -0
  77. {gwpy-3.0.8 → gwpy-3.0.9}/docs/segments/index.rst +0 -0
  78. {gwpy-3.0.8 → gwpy-3.0.9}/docs/segments/io.rst +0 -0
  79. {gwpy-3.0.8 → gwpy-3.0.9}/docs/segments/thresholding.rst +0 -0
  80. {gwpy-3.0.8 → gwpy-3.0.9}/docs/signal/index.rst +0 -0
  81. {gwpy-3.0.8 → gwpy-3.0.9}/docs/spectrogram/index.rst +0 -0
  82. {gwpy-3.0.8 → gwpy-3.0.9}/docs/spectrum/filtering.rst +0 -0
  83. {gwpy-3.0.8 → gwpy-3.0.9}/docs/spectrum/index.rst +0 -0
  84. {gwpy-3.0.8 → gwpy-3.0.9}/docs/spectrum/io.rst +0 -0
  85. {gwpy-3.0.8 → gwpy-3.0.9}/docs/table/H1-LDAS_STRAIN-968654552-10.xml.gz +0 -0
  86. {gwpy-3.0.8 → gwpy-3.0.9}/docs/table/filter.rst +0 -0
  87. {gwpy-3.0.8 → gwpy-3.0.9}/docs/table/histogram.rst +0 -0
  88. {gwpy-3.0.8 → gwpy-3.0.9}/docs/table/index.rst +0 -0
  89. {gwpy-3.0.8 → gwpy-3.0.9}/docs/table/io.rst +0 -0
  90. {gwpy-3.0.8 → gwpy-3.0.9}/docs/table/plot.rst +0 -0
  91. {gwpy-3.0.8 → gwpy-3.0.9}/docs/table/rate.rst +0 -0
  92. {gwpy-3.0.8 → gwpy-3.0.9}/docs/time/index.rst +0 -0
  93. {gwpy-3.0.8 → gwpy-3.0.9}/docs/timeseries/datafind.rst +0 -0
  94. {gwpy-3.0.8 → gwpy-3.0.9}/docs/timeseries/index.rst +0 -0
  95. {gwpy-3.0.8 → gwpy-3.0.9}/docs/timeseries/io.rst +0 -0
  96. {gwpy-3.0.8 → gwpy-3.0.9}/docs/timeseries/opendata.rst +0 -0
  97. {gwpy-3.0.8 → gwpy-3.0.9}/docs/timeseries/plot.rst +0 -0
  98. {gwpy-3.0.8 → gwpy-3.0.9}/docs/timeseries/statevector.rst +0 -0
  99. {gwpy-3.0.8 → gwpy-3.0.9}/examples/frequencyseries/coherence.py +0 -0
  100. {gwpy-3.0.8 → gwpy-3.0.9}/examples/frequencyseries/hoff.py +0 -0
  101. {gwpy-3.0.8 → gwpy-3.0.9}/examples/frequencyseries/index.rst +0 -0
  102. {gwpy-3.0.8 → gwpy-3.0.9}/examples/frequencyseries/inject.py +0 -0
  103. {gwpy-3.0.8 → gwpy-3.0.9}/examples/frequencyseries/percentiles.py +0 -0
  104. {gwpy-3.0.8 → gwpy-3.0.9}/examples/frequencyseries/rayleigh.py +0 -0
  105. {gwpy-3.0.8 → gwpy-3.0.9}/examples/frequencyseries/transfer_function.py +0 -0
  106. {gwpy-3.0.8 → gwpy-3.0.9}/examples/frequencyseries/variance.py +0 -0
  107. {gwpy-3.0.8 → gwpy-3.0.9}/examples/miscellaneous/index.rst +0 -0
  108. {gwpy-3.0.8 → gwpy-3.0.9}/examples/miscellaneous/open-data-spectrogram.py +0 -0
  109. {gwpy-3.0.8 → gwpy-3.0.9}/examples/miscellaneous/range-spectrogram.py +0 -0
  110. {gwpy-3.0.8 → gwpy-3.0.9}/examples/miscellaneous/range-timeseries.py +0 -0
  111. {gwpy-3.0.8 → gwpy-3.0.9}/examples/segments/index.rst +0 -0
  112. {gwpy-3.0.8 → gwpy-3.0.9}/examples/segments/open-data.py +0 -0
  113. {gwpy-3.0.8 → gwpy-3.0.9}/examples/signal/gw150914.py +0 -0
  114. {gwpy-3.0.8 → gwpy-3.0.9}/examples/signal/index.rst +0 -0
  115. {gwpy-3.0.8 → gwpy-3.0.9}/examples/signal/qscan.py +0 -0
  116. {gwpy-3.0.8 → gwpy-3.0.9}/examples/spectrogram/coherence.py +0 -0
  117. {gwpy-3.0.8 → gwpy-3.0.9}/examples/spectrogram/index.rst +0 -0
  118. {gwpy-3.0.8 → gwpy-3.0.9}/examples/spectrogram/plot.py +0 -0
  119. {gwpy-3.0.8 → gwpy-3.0.9}/examples/spectrogram/ratio.py +0 -0
  120. {gwpy-3.0.8 → gwpy-3.0.9}/examples/spectrogram/rayleigh.py +0 -0
  121. {gwpy-3.0.8 → gwpy-3.0.9}/examples/spectrogram/spectrogram2.py +0 -0
  122. {gwpy-3.0.8 → gwpy-3.0.9}/examples/table/H1-LDAS_STRAIN-968654552-10.xml.gz +0 -0
  123. {gwpy-3.0.8 → gwpy-3.0.9}/examples/table/histogram.py +0 -0
  124. {gwpy-3.0.8 → gwpy-3.0.9}/examples/table/index.rst +0 -0
  125. {gwpy-3.0.8 → gwpy-3.0.9}/examples/table/rate.py +0 -0
  126. {gwpy-3.0.8 → gwpy-3.0.9}/examples/table/rate_binned.py +0 -0
  127. {gwpy-3.0.8 → gwpy-3.0.9}/examples/table/scatter.py +0 -0
  128. {gwpy-3.0.8 → gwpy-3.0.9}/examples/table/tiles.py +0 -0
  129. {gwpy-3.0.8 → gwpy-3.0.9}/examples/test_examples.py +0 -0
  130. {gwpy-3.0.8 → gwpy-3.0.9}/examples/timeseries/blrms.py +0 -0
  131. {gwpy-3.0.8 → gwpy-3.0.9}/examples/timeseries/correlate.py +0 -0
  132. {gwpy-3.0.8 → gwpy-3.0.9}/examples/timeseries/filter.py +0 -0
  133. {gwpy-3.0.8 → gwpy-3.0.9}/examples/timeseries/index.rst +0 -0
  134. {gwpy-3.0.8 → gwpy-3.0.9}/examples/timeseries/inject.py +0 -0
  135. {gwpy-3.0.8 → gwpy-3.0.9}/examples/timeseries/public.py +0 -0
  136. {gwpy-3.0.8 → gwpy-3.0.9}/examples/timeseries/pycbc-snr.py +0 -0
  137. {gwpy-3.0.8 → gwpy-3.0.9}/examples/timeseries/qscan.py +0 -0
  138. {gwpy-3.0.8 → gwpy-3.0.9}/examples/timeseries/statevector.py +0 -0
  139. {gwpy-3.0.8 → gwpy-3.0.9}/examples/timeseries/whiten.py +0 -0
  140. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/__init__.py +0 -0
  141. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/astro/__init__.py +0 -0
  142. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/astro/tests/__init__.py +0 -0
  143. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/cli/__init__.py +0 -0
  144. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/cli/cliproduct.py +0 -0
  145. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/cli/coherence.py +0 -0
  146. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/cli/coherencegram.py +0 -0
  147. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/cli/gwpy_plot.py +0 -0
  148. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/cli/spectrogram.py +0 -0
  149. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/cli/spectrum.py +0 -0
  150. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/cli/tests/__init__.py +0 -0
  151. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/cli/tests/base.py +0 -0
  152. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/cli/tests/test_coherence.py +0 -0
  153. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/cli/tests/test_coherencegram.py +0 -0
  154. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/cli/tests/test_gwpy_plot.py +0 -0
  155. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/cli/tests/test_qtransform.py +0 -0
  156. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/cli/tests/test_spectrogram.py +0 -0
  157. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/cli/tests/test_spectrum.py +0 -0
  158. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/cli/tests/test_timeseries.py +0 -0
  159. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/cli/tests/test_transferfunction.py +0 -0
  160. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/cli/timeseries.py +0 -0
  161. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/cli/transferfunction.py +0 -0
  162. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/conftest.py +0 -0
  163. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/detector/__init__.py +0 -0
  164. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/detector/channel.py +0 -0
  165. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/detector/io/__init__.py +0 -0
  166. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/detector/io/cis.py +0 -0
  167. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/detector/io/clf.py +0 -0
  168. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/detector/io/omega.py +0 -0
  169. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/detector/tests/__init__.py +0 -0
  170. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/detector/tests/test_channel.py +0 -0
  171. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/detector/tests/test_units.py +0 -0
  172. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/frequencyseries/__init__.py +0 -0
  173. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/frequencyseries/_fdcommon.py +0 -0
  174. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/frequencyseries/frequencyseries.py +0 -0
  175. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/frequencyseries/hist.py +0 -0
  176. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/frequencyseries/io/__init__.py +0 -0
  177. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/frequencyseries/io/ascii.py +0 -0
  178. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/frequencyseries/io/hdf5.py +0 -0
  179. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/frequencyseries/io/ligolw.py +0 -0
  180. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/frequencyseries/tests/__init__.py +0 -0
  181. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/frequencyseries/tests/test_frequencyseries.py +0 -0
  182. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/frequencyseries/tests/test_hist.py +0 -0
  183. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/io/__init__.py +0 -0
  184. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/io/_framecpp.py +0 -0
  185. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/io/cache.py +0 -0
  186. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/io/gwf.py +0 -0
  187. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/io/hdf5.py +0 -0
  188. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/io/kerberos.py +0 -0
  189. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/io/ligolw.py +0 -0
  190. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/io/mp.py +0 -0
  191. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/io/nds2.py +0 -0
  192. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/io/registry.py +0 -0
  193. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/io/tests/__init__.py +0 -0
  194. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/io/tests/test_cache.py +0 -0
  195. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/io/tests/test_datafind.py +0 -0
  196. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/io/tests/test_gwf.py +0 -0
  197. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/io/tests/test_kerberos.py +0 -0
  198. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/io/tests/test_ligolw.py +0 -0
  199. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/io/tests/test_mp.py +0 -0
  200. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/io/tests/test_nds2.py +0 -0
  201. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/io/tests/test_utils.py +0 -0
  202. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/io/utils.py +0 -0
  203. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/plot/__init__.py +0 -0
  204. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/plot/axes.py +0 -0
  205. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/plot/bode.py +0 -0
  206. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/plot/colorbar.py +0 -0
  207. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/plot/colors.py +0 -0
  208. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/plot/gps.py +0 -0
  209. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/plot/legend.py +0 -0
  210. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/plot/log.py +0 -0
  211. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/plot/plot.py +0 -0
  212. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/plot/rc.py +0 -0
  213. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/plot/segments.py +0 -0
  214. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/plot/tests/__init__.py +0 -0
  215. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/plot/tests/test_axes.py +0 -0
  216. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/plot/tests/test_bode.py +0 -0
  217. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/plot/tests/test_colors.py +0 -0
  218. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/plot/tests/test_gps.py +0 -0
  219. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/plot/tests/test_log.py +0 -0
  220. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/plot/tests/test_plot.py +0 -0
  221. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/plot/tests/test_rc.py +0 -0
  222. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/plot/tests/test_segments.py +0 -0
  223. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/plot/tests/test_tex.py +0 -0
  224. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/plot/tests/test_text.py +0 -0
  225. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/plot/tests/test_utils.py +0 -0
  226. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/plot/tests/utils.py +0 -0
  227. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/plot/text.py +0 -0
  228. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/plot/units.py +0 -0
  229. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/plot/utils.py +0 -0
  230. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/segments/__init__.py +0 -0
  231. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/segments/flag.py +0 -0
  232. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/segments/io/__init__.py +0 -0
  233. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/segments/io/hdf5.py +0 -0
  234. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/segments/io/json.py +0 -0
  235. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/segments/io/ligolw.py +0 -0
  236. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/segments/io/segwizard.py +0 -0
  237. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/segments/segments.py +0 -0
  238. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/segments/tests/__init__.py +0 -0
  239. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/segments/tests/test_flag.py +0 -0
  240. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/segments/tests/test_segments.py +0 -0
  241. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/signal/__init__.py +0 -0
  242. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/signal/fft.py +0 -0
  243. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/signal/qtransform.py +0 -0
  244. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/signal/spectral/__init__.py +0 -0
  245. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/signal/spectral/_lal.py +0 -0
  246. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/signal/spectral/_median_mean.py +0 -0
  247. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/signal/spectral/_pycbc.py +0 -0
  248. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/signal/spectral/_registry.py +0 -0
  249. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/signal/spectral/_scipy.py +0 -0
  250. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/signal/spectral/_ui.py +0 -0
  251. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/signal/spectral/_utils.py +0 -0
  252. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/signal/tests/__init__.py +0 -0
  253. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/signal/tests/test_coherence.py +0 -0
  254. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/signal/tests/test_qtransform.py +0 -0
  255. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/signal/tests/test_spectral_lal.py +0 -0
  256. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/signal/tests/test_spectral_median_mean.py +0 -0
  257. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/signal/tests/test_spectral_pycbc.py +0 -0
  258. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/signal/tests/test_spectral_registry.py +0 -0
  259. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/signal/tests/test_spectral_scipy.py +0 -0
  260. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/signal/tests/test_spectral_ui.py +0 -0
  261. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/signal/tests/test_spectral_utils.py +0 -0
  262. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/signal/tests/test_window.py +0 -0
  263. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/signal/window.py +0 -0
  264. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/spectrogram/__init__.py +0 -0
  265. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/spectrogram/coherence.py +0 -0
  266. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/spectrogram/io/__init__.py +0 -0
  267. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/spectrogram/io/hdf5.py +0 -0
  268. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/spectrogram/spectrogram.py +0 -0
  269. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/spectrogram/tests/__init__.py +0 -0
  270. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/table/__init__.py +0 -0
  271. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/table/filter.py +0 -0
  272. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/table/filters.py +0 -0
  273. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/table/gravityspy.py +0 -0
  274. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/table/io/__init__.py +0 -0
  275. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/table/io/cwb.py +0 -0
  276. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/table/io/fetch.py +0 -0
  277. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/table/io/gravityspy.py +0 -0
  278. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/table/io/gstlal.py +0 -0
  279. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/table/io/gwf.py +0 -0
  280. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/table/io/hacr.py +0 -0
  281. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/table/io/ligolw.py +0 -0
  282. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/table/io/losc.py +0 -0
  283. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/table/io/omega.py +0 -0
  284. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/table/io/omicron.py +0 -0
  285. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/table/io/pycbc.py +0 -0
  286. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/table/io/root.py +0 -0
  287. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/table/io/snax.py +0 -0
  288. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/table/io/sql.py +0 -0
  289. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/table/io/utils.py +0 -0
  290. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/table/table.py +0 -0
  291. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/table/tests/__init__.py +0 -0
  292. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/table/tests/test_gravityspy.py +0 -0
  293. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/table/tests/test_io_gstlal.py +0 -0
  294. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/table/tests/test_io_ligolw.py +0 -0
  295. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/table/tests/test_io_pycbc.py +0 -0
  296. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/table/tests/test_table.py +0 -0
  297. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/testing/__init__.py +0 -0
  298. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/testing/data/H1-LDAS_STRAIN-968654552-10.xml.gz +0 -0
  299. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/testing/data/HLV-HW100916-968654552-1.gwf +0 -0
  300. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/testing/data/HLV-HW100916-968654552-1.hdf +0 -0
  301. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/testing/data/X1-GWPY_TEST_SEGMENTS-0-10.txt +0 -0
  302. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/testing/data/X1-GWPY_TEST_SEGMENTS-0-10.xml.gz +0 -0
  303. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/testing/errors.py +0 -0
  304. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/testing/marks.py +0 -0
  305. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/testing/mocks.py +0 -0
  306. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/time/__init__.py +0 -0
  307. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/time/__main__.py +0 -0
  308. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/time/_tconvert.py +0 -0
  309. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/time/tests/__init__.py +0 -0
  310. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/time/tests/test_main.py +0 -0
  311. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/time/tests/test_time.py +0 -0
  312. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/timeseries/__init__.py +0 -0
  313. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/timeseries/core.py +0 -0
  314. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/timeseries/io/__init__.py +0 -0
  315. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/timeseries/io/ascii.py +0 -0
  316. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/timeseries/io/core.py +0 -0
  317. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/timeseries/io/gwf/__init__.py +0 -0
  318. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/timeseries/io/gwf/framecpp.py +0 -0
  319. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/timeseries/io/gwf/framel.py +0 -0
  320. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/timeseries/io/hdf5.py +0 -0
  321. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/timeseries/io/losc.py +0 -0
  322. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/timeseries/io/nds2.py +0 -0
  323. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/timeseries/io/wav.py +0 -0
  324. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/timeseries/statevector.py +0 -0
  325. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/timeseries/tests/__init__.py +0 -0
  326. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/timeseries/tests/test_core.py +0 -0
  327. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/timeseries/tests/test_io_gwf_framecpp.py +0 -0
  328. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/timeseries/tests/test_io_gwf_lalframe.py +0 -0
  329. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/timeseries/tests/test_io_losc.py +0 -0
  330. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/timeseries/tests/test_statevector.py +0 -0
  331. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/timeseries/timeseries.py +0 -0
  332. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/types/__init__.py +0 -0
  333. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/types/array2d.py +0 -0
  334. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/types/io/__init__.py +0 -0
  335. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/types/io/ascii.py +0 -0
  336. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/types/io/hdf5.py +0 -0
  337. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/types/io/ligolw.py +0 -0
  338. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/types/series.py +0 -0
  339. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/types/sliceutils.py +0 -0
  340. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/types/tests/__init__.py +0 -0
  341. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/types/tests/test_array.py +0 -0
  342. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/types/tests/test_array2d.py +0 -0
  343. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/types/tests/test_index.py +0 -0
  344. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/types/tests/test_series.py +0 -0
  345. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/utils/__init__.py +0 -0
  346. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/utils/decorators.py +0 -0
  347. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/utils/enum.py +0 -0
  348. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/utils/env.py +0 -0
  349. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/utils/lal.py +0 -0
  350. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/utils/misc.py +0 -0
  351. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/utils/mp.py +0 -0
  352. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/utils/progress.py +0 -0
  353. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/utils/shell.py +0 -0
  354. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/utils/sphinx/__init__.py +0 -0
  355. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/utils/sphinx/ex2rst.py +0 -0
  356. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/utils/sphinx/zenodo.py +0 -0
  357. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/utils/tests/__init__.py +0 -0
  358. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/utils/tests/test_decorators.py +0 -0
  359. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/utils/tests/test_enum.py +0 -0
  360. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/utils/tests/test_env.py +0 -0
  361. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/utils/tests/test_lal.py +0 -0
  362. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/utils/tests/test_misc.py +0 -0
  363. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/utils/tests/test_mp.py +0 -0
  364. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/utils/tests/test_shell.py +0 -0
  365. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy/utils/tests/test_sphinx_ex2rst.py +0 -0
  366. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy.egg-info/dependency_links.txt +0 -0
  367. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy.egg-info/entry_points.txt +0 -0
  368. {gwpy-3.0.8 → gwpy-3.0.9}/gwpy.egg-info/top_level.txt +0 -0
  369. {gwpy-3.0.8 → gwpy-3.0.9}/setup.cfg +0 -0
  370. {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.8
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.5.0
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"
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '3.0.8'
16
- __version_tuple__ = version_tuple = (3, 0, 8)
15
+ __version__ = version = '3.0.9'
16
+ __version_tuple__ = version_tuple = (3, 0, 9)
@@ -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 trapz
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
- trapz(integrand.value, f.value[frange]),
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 = trapz(integrand.value, f[frange])
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 trapz
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
- trapz(r, r.frequencies) ** (1/2.),
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
- trapz(r, r.frequencies) ** (1/2.),
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
- (trapz(r**3, f[frange]) / (400 * units.Hz)) ** (1/3.),
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
@@ -167,6 +167,7 @@ for unit, aliases in [
167
167
  # GW observatories like to record 'time' as the unit
168
168
  (units.Unit('second'), (
169
169
  'time',
170
+ 'time (s)',
170
171
  'time [s]',
171
172
  'Time [sec]',
172
173
  'Time (sec)',
@@ -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 warnings import warn
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)] = 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 _ffl_path(site, tag, basedir=None):
139
- """Return the path of the FFL file for a given site and tag.
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 _read_ffl(site, tag, basedir=None):
151
- """Read an FFL file as a list of `CacheEntry` objects
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
- ffl = _ffl_path(site, tag, basedir=basedir)
154
- with open(ffl, "r") as fobj:
155
- return [
156
- type(entry)(site, tag, entry.segment, entry.path)
157
- for entry in _iter_cache(fobj, gpstype=float)
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 _read_ffl(site, tag) if (
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
- fflfile = _ffl_path(site, tag)
314
+ fflfiles = _ffl_paths(site, tag)
309
315
  except ValueError: # no readable FFL file
310
316
  urls = []
311
317
  else:
312
- urls = [read_cache_entry(_read_last_line(fflfile), gpstype=float)]
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 = [x.split()[0] for x in FFLS["test.ffl"]]
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
- ax = fig.gca()
43
- ax.set_xlabel(r"\LaTeX")
44
- fig.canvas.draw()
45
- pyplot.close(fig)
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('nyq', sample_rate/2.)
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=False)
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=False)
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., nyq=512.,
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., nyq=512.,
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, nyq=512.,
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.assert_array_equal(array * fresp, a2)
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.assert_array_equal(array, a2)
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() or not _test_usetex(),
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 ..utils.decorators import deprecated_function
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(data, format,
332
- extension=None, autoidentify=True,
333
- read_args=[], read_kw={},
334
- write_args=[], write_kw={},
335
- assert_equal=assert_array_equal, assert_kw={}):
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 ...io.cache import (FILE_LIKE, read_cache, file_segment, sieve)
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
- - read the cache from the file (if necessary)
32
- - sieve the cache to only include data we need
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 LAL-format cache file on disk.
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
- # open cache file
53
- if isinstance(cache, (str,) + FILE_LIKE):
54
- return read_cache(cache, sort=file_segment,
55
- segment=Segment(start, end))
56
-
57
- # format existing cache file
58
- cache = type(cache)(cache) # copy cache
59
-
60
- # sort cache
61
- try:
62
- cache.sort(key=file_segment) # sort
63
- except ValueError:
64
- # if this failed, then the sieving will also fail, but lets proceed
65
- # anyway, since the user didn't actually ask us to do this (but
66
- # its a very good idea)
67
- return cache
68
-
69
- # sieve cache
70
- if start is None: # start time of earliest file
71
- start = file_segment(cache[0])[0]
72
- if end is None: # end time of latest file
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]