sxs 2025.0.16__tar.gz → 2025.0.18__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.
Files changed (137) hide show
  1. {sxs-2025.0.16 → sxs-2025.0.18}/.github/workflows/build.yml +3 -1
  2. {sxs-2025.0.16 → sxs-2025.0.18}/CITATION.cff +2 -2
  3. {sxs-2025.0.16 → sxs-2025.0.18}/PKG-INFO +9 -1
  4. {sxs-2025.0.16 → sxs-2025.0.18}/README.md +8 -0
  5. {sxs-2025.0.16 → sxs-2025.0.18}/mkdocs.yml +1 -0
  6. sxs-2025.0.18/mkdocs_preprocess.py +33 -0
  7. {sxs-2025.0.16 → sxs-2025.0.18}/pyproject.toml +3 -0
  8. sxs-2025.0.18/sxs/__version__.py +1 -0
  9. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/catalog/catalog.py +9 -30
  10. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/simulations/simulation.py +2 -1
  11. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/waveforms/format_handlers/rotating_paired_diff_multishuffle_bzip2.py +3 -4
  12. {sxs-2025.0.16 → sxs-2025.0.18}/tests/conftest.py +1 -1
  13. {sxs-2025.0.16 → sxs-2025.0.18}/tests/test_simulation.py +28 -1
  14. sxs-2025.0.16/sxs/__version__.py +0 -1
  15. {sxs-2025.0.16 → sxs-2025.0.18}/.codecov.yml +0 -0
  16. {sxs-2025.0.16 → sxs-2025.0.18}/.github/ISSUE_TEMPLATE/catalog-data-issue-template.md +0 -0
  17. {sxs-2025.0.16 → sxs-2025.0.18}/.github/dependabot.yml +0 -0
  18. {sxs-2025.0.16 → sxs-2025.0.18}/.github/scripts/parse_bump_rule.py +0 -0
  19. {sxs-2025.0.16 → sxs-2025.0.18}/.github/workflows/pr_rtd_link.yml +0 -0
  20. {sxs-2025.0.16 → sxs-2025.0.18}/.gitignore +0 -0
  21. {sxs-2025.0.16 → sxs-2025.0.18}/.readthedocs.yaml +0 -0
  22. {sxs-2025.0.16 → sxs-2025.0.18}/LICENSE +0 -0
  23. {sxs-2025.0.16 → sxs-2025.0.18}/docs/api/catalog.md +0 -0
  24. {sxs-2025.0.16 → sxs-2025.0.18}/docs/api/cite.md +0 -0
  25. {sxs-2025.0.16 → sxs-2025.0.18}/docs/api/horizons.md +0 -0
  26. {sxs-2025.0.16 → sxs-2025.0.18}/docs/api/load.md +0 -0
  27. {sxs-2025.0.16 → sxs-2025.0.18}/docs/api/metadata.md +0 -0
  28. {sxs-2025.0.16 → sxs-2025.0.18}/docs/api/simulation.md +0 -0
  29. {sxs-2025.0.16 → sxs-2025.0.18}/docs/api/simulations.md +0 -0
  30. {sxs-2025.0.16 → sxs-2025.0.18}/docs/api/time_series.md +0 -0
  31. {sxs-2025.0.16 → sxs-2025.0.18}/docs/api/waveforms.md +0 -0
  32. {sxs-2025.0.16 → sxs-2025.0.18}/docs/html/main.html +0 -0
  33. {sxs-2025.0.16 → sxs-2025.0.18}/docs/images/favicon.ico +0 -0
  34. {sxs-2025.0.16 → sxs-2025.0.18}/docs/index.md +0 -0
  35. {sxs-2025.0.16 → sxs-2025.0.18}/docs/javascript/mathjax.js +0 -0
  36. {sxs-2025.0.16 → sxs-2025.0.18}/docs/julia.md +0 -0
  37. {sxs-2025.0.16 → sxs-2025.0.18}/docs/mathematica.md +0 -0
  38. {sxs-2025.0.16 → sxs-2025.0.18}/docs/stylesheets/extra.css +0 -0
  39. {sxs-2025.0.16 → sxs-2025.0.18}/docs/tutorials/00-Introduction.ipynb +0 -0
  40. {sxs-2025.0.16 → sxs-2025.0.18}/docs/tutorials/01-Catalog_Dataframe.ipynb +0 -0
  41. {sxs-2025.0.16 → sxs-2025.0.18}/docs/tutorials/02-Simulation.ipynb +0 -0
  42. {sxs-2025.0.16 → sxs-2025.0.18}/docs/tutorials/03-Horizons.ipynb +0 -0
  43. {sxs-2025.0.16 → sxs-2025.0.18}/docs/tutorials/04-Waveforms.ipynb +0 -0
  44. {sxs-2025.0.16 → sxs-2025.0.18}/docs/tutorials/05-PreprocessingForFFTs.ipynb +0 -0
  45. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/__init__.py +0 -0
  46. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/catalog/__init__.py +0 -0
  47. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/catalog/create.py +0 -0
  48. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/catalog/description.py +0 -0
  49. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/citation.py +0 -0
  50. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/handlers.py +0 -0
  51. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/horizons/__init__.py +0 -0
  52. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/horizons/spec_horizons_h5.py +0 -0
  53. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/horizons/xor_multishuffle_bzip2.py +0 -0
  54. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/julia/GWFrames.py +0 -0
  55. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/julia/__init__.py +0 -0
  56. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/juliapkg.json +0 -0
  57. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/metadata/__init__.py +0 -0
  58. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/metadata/metadata.py +0 -0
  59. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/metadata/metric.py +0 -0
  60. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/simulations/__init__.py +0 -0
  61. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/simulations/analyze.py +0 -0
  62. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/simulations/local.py +0 -0
  63. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/simulations/simulations.py +0 -0
  64. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/time_series.py +0 -0
  65. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/utilities/__init__.py +0 -0
  66. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/utilities/bitwise.py +0 -0
  67. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/utilities/decimation/__init__.py +0 -0
  68. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/utilities/decimation/greedy_spline.py +0 -0
  69. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/utilities/decimation/linear_bisection.py +0 -0
  70. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/utilities/decimation/peak_greed.py +0 -0
  71. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/utilities/decimation/suppression.py +0 -0
  72. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/utilities/dicts.py +0 -0
  73. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/utilities/downloads.py +0 -0
  74. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/utilities/files.py +0 -0
  75. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/utilities/formats.py +0 -0
  76. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/utilities/inspire.py +0 -0
  77. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/utilities/lvcnr/__init__.py +0 -0
  78. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/utilities/lvcnr/comparisons.py +0 -0
  79. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/utilities/lvcnr/conversion.py +0 -0
  80. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/utilities/lvcnr/dataset.py +0 -0
  81. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/utilities/lvcnr/horizons.py +0 -0
  82. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/utilities/lvcnr/metadata.py +0 -0
  83. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/utilities/lvcnr/waveform_amp_phase.py +0 -0
  84. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/utilities/lvcnr/waveforms.py +0 -0
  85. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/utilities/monotonicity.py +0 -0
  86. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/utilities/pretty_print.py +0 -0
  87. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/utilities/references/__init__.py +0 -0
  88. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/utilities/references/ads.py +0 -0
  89. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/utilities/references/arxiv.py +0 -0
  90. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/utilities/references/fairchild_report.py +0 -0
  91. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/utilities/references/inspire.py +0 -0
  92. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/utilities/references/journal_abbreviations.py +0 -0
  93. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/utilities/references/references.py +0 -0
  94. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/utilities/select.py +0 -0
  95. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/utilities/smooth_functions.py +0 -0
  96. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/utilities/string_converters.py +0 -0
  97. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/utilities/sxs_directories.py +0 -0
  98. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/utilities/sxs_identifiers.py +0 -0
  99. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/utilities/url.py +0 -0
  100. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/waveforms/__init__.py +0 -0
  101. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/waveforms/alignment.py +0 -0
  102. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/waveforms/format_handlers/__init__.py +0 -0
  103. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/waveforms/format_handlers/grathena.py +0 -0
  104. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/waveforms/format_handlers/lvc.py +0 -0
  105. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/waveforms/format_handlers/nrar.py +0 -0
  106. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/waveforms/format_handlers/rotating_paired_xor_multishuffle_bzip2.py +0 -0
  107. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/waveforms/format_handlers/spectre_cce_v1.py +0 -0
  108. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/waveforms/memory.py +0 -0
  109. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/waveforms/mode_utilities.py +0 -0
  110. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/waveforms/norms.py +0 -0
  111. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/waveforms/transformations.py +0 -0
  112. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/waveforms/waveform_grid.py +0 -0
  113. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/waveforms/waveform_mixin.py +0 -0
  114. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/waveforms/waveform_modes.py +0 -0
  115. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/waveforms/waveform_mts.py +0 -0
  116. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/waveforms/waveform_signal.py +0 -0
  117. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/zenodo/__init__.py +0 -0
  118. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/zenodo/api/__init__.py +0 -0
  119. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/zenodo/api/deposit.py +0 -0
  120. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/zenodo/api/login.py +0 -0
  121. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/zenodo/api/records.py +0 -0
  122. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/zenodo/catalog.py +0 -0
  123. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/zenodo/creators.py +0 -0
  124. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/zenodo/simannex.py +0 -0
  125. {sxs-2025.0.16 → sxs-2025.0.18}/sxs/zenodo/surrogatemodeling.py +0 -0
  126. {sxs-2025.0.16 → sxs-2025.0.18}/tests/__init__.py +0 -0
  127. {sxs-2025.0.16 → sxs-2025.0.18}/tests/test_alignment.py +0 -0
  128. {sxs-2025.0.16 → sxs-2025.0.18}/tests/test_catalog.py +0 -0
  129. {sxs-2025.0.16 → sxs-2025.0.18}/tests/test_horizons.py +0 -0
  130. {sxs-2025.0.16 → sxs-2025.0.18}/tests/test_julia.py +0 -0
  131. {sxs-2025.0.16 → sxs-2025.0.18}/tests/test_loader.py +0 -0
  132. {sxs-2025.0.16 → sxs-2025.0.18}/tests/test_metadata.py +0 -0
  133. {sxs-2025.0.16 → sxs-2025.0.18}/tests/test_time_series.py +0 -0
  134. {sxs-2025.0.16 → sxs-2025.0.18}/tests/test_transformations.py +0 -0
  135. {sxs-2025.0.16 → sxs-2025.0.18}/tests/test_utilities.py +0 -0
  136. {sxs-2025.0.16 → sxs-2025.0.18}/tests/test_waveform_rotations.py +0 -0
  137. {sxs-2025.0.16 → sxs-2025.0.18}/tests/test_waveforms.py +0 -0
@@ -52,7 +52,7 @@ jobs:
52
52
  if: ${{ env.skipping_build_and_test_replicate != 'true' }}
53
53
  uses: actions/cache@v4
54
54
  with:
55
- key: sxs-${{ runner.os }}-2 # Increment this number whenever the cached files should change
55
+ key: sxs-${{ runner.os }}-3 # Increment this number whenever the cached files should change
56
56
  path: |
57
57
  ${{ runner.os == 'Linux' && '/home/runner/.cache/sxs' || runner.os == 'Windows' && 'C:\Users\runneradmin\.sxs\cache' || '/Users/runner/.sxs/cache' }}
58
58
 
@@ -83,6 +83,8 @@ jobs:
83
83
  - name: Run tests
84
84
  if: ${{ env.skipping_build_and_test_replicate != 'true' }}
85
85
  shell: bash
86
+ env:
87
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
86
88
  run: |
87
89
  hatch run test --durations=0
88
90
 
@@ -16,5 +16,5 @@ authors:
16
16
  title: "The sxs package"
17
17
  license: MIT
18
18
  doi: 10.5281/zenodo.4034006
19
- version: 2025.0.16
20
- date-released: 2025-05-29
19
+ version: 2025.0.18
20
+ date-released: 2025-07-21
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sxs
3
- Version: 2025.0.16
3
+ Version: 2025.0.18
4
4
  Summary: Interface to data produced by the Simulating eXtreme Spacetimes collaboration
5
5
  Project-URL: Homepage, https://github.com/sxs-collaboration/sxs
6
6
  Project-URL: Documentation, https://sxs.readthedocs.io/
@@ -83,6 +83,14 @@ Description-Content-Type: text/markdown
83
83
 
84
84
  # Simulating eXtreme Spacetimes package
85
85
 
86
+ > [!NOTE]
87
+ > As described in our [latest paper](https://arxiv.org/abs/2505.13378), our
88
+ > waveforms now include memory effects. Specifically, when using any
89
+ > simulation with version 3 or greater, you should expect to see memory effects,
90
+ > most visible in the $(\ell, 0)$ modes, and generally resulting in ringdowns
91
+ > that do not approach 0 at late times.
92
+
93
+
86
94
  The `sxs` python package provides a high-level interface for using data
87
95
  produced by the SXS collaboration. In particular, the function `sxs.load` can
88
96
  automatically find, download, and load data, returning objects that provide
@@ -8,6 +8,14 @@
8
8
 
9
9
  # Simulating eXtreme Spacetimes package
10
10
 
11
+ > [!NOTE]
12
+ > As described in our [latest paper](https://arxiv.org/abs/2505.13378), our
13
+ > waveforms now include memory effects. Specifically, when using any
14
+ > simulation with version 3 or greater, you should expect to see memory effects,
15
+ > most visible in the $(\ell, 0)$ modes, and generally resulting in ringdowns
16
+ > that do not approach 0 at late times.
17
+
18
+
11
19
  The `sxs` python package provides a high-level interface for using data
12
20
  produced by the SXS collaboration. In particular, the function `sxs.load` can
13
21
  automatically find, download, and load data, returning objects that provide
@@ -12,6 +12,7 @@ plugins:
12
12
  options:
13
13
  docstring_style: numpy
14
14
  show_source: true
15
+ - admonitions_translation
15
16
 
16
17
  nav:
17
18
  - Home: "index.md"
@@ -0,0 +1,33 @@
1
+ import re
2
+ import difflib
3
+ from mkdocs.plugins import BasePlugin
4
+
5
+
6
+ class AdmonitionTranslationPlugin(BasePlugin):
7
+ """
8
+ Convert GitHub-flavored admonitions to MkDocs numpy-style admonitions.
9
+ """
10
+
11
+ def on_page_markdown(self, markdown, page, config, files):
12
+ lines = markdown.splitlines(keepends=True)
13
+ out = []
14
+ i = 0
15
+ while i < len(lines):
16
+ m = re.match(r'> \[\!(?P<tag>\w+)\]\s*$', lines[i])
17
+ if m:
18
+ tag = m.group('tag').lower()
19
+ # emit the MkDocs admonition start
20
+ out.append(f"!!! {tag}\n")
21
+ i += 1
22
+ # consume all the > … lines as the body
23
+ while i < len(lines) and lines[i].startswith('>'):
24
+ # strip leading "> " (or just ">") and rstrip newline
25
+ body = lines[i].lstrip('> ').rstrip('\n')
26
+ out.append(f" {body}\n")
27
+ i += 1
28
+ continue
29
+ # otherwise, copy line verbatim
30
+ out.append(lines[i])
31
+ i += 1
32
+
33
+ return "".join(out)
@@ -64,6 +64,9 @@ ecosystem = [
64
64
  Homepage = "https://github.com/sxs-collaboration/sxs"
65
65
  Documentation = "https://sxs.readthedocs.io/"
66
66
 
67
+ [project.entry-points."mkdocs.plugins"]
68
+ admonitions_translation = "mkdocs_preprocess:AdmonitionTranslationPlugin"
69
+
67
70
 
68
71
  [build-system]
69
72
  requires = ["hatchling"]
@@ -0,0 +1 @@
1
+ __version__ = "2025.0.18"
@@ -6,7 +6,7 @@ import functools
6
6
  # noinspection SpellCheckingInspection
7
7
  class Catalog(object):
8
8
  """Container interface to the SXS catalog"""
9
- url = "https://data.black-holes.org/catalog.json"
9
+ url = "https://data.black-holes.org/catalog.zip"
10
10
 
11
11
  def __init__(self, catalog=None, **kwargs):
12
12
  from .. import Metadata
@@ -60,6 +60,9 @@ class Catalog(object):
60
60
  which, as of `sxs` version 2024.0.0, has been deprecated in
61
61
  favor of the `Simulations` interface. See the documentation
62
62
  for more information.
63
+
64
+ THIS CAN ONLY PROVIDE OLD DATA!
65
+
63
66
  """
64
67
  warn(deprecation_notice)
65
68
 
@@ -73,36 +76,12 @@ class Catalog(object):
73
76
  if_newer = False
74
77
 
75
78
  if download or download is None:
76
- # 1. Download the full json file (zipped in flight, but auto-decompressed on arrival)
77
- # 2. Zip to a temporary file (using bzip2, which is better than the in-flight compression)
78
- # 3. Replace the original catalog.zip with the temporary zip file
79
- # 4. Remove the full json file
80
- # 5. Make sure the temporary zip file is gone too
81
- temp_json = cache_path.with_suffix(".temp.json")
82
- temp_zip = cache_path.with_suffix(".temp.zip")
83
79
  try:
84
- try:
85
- download_file(cls.url, temp_json, progress=progress, if_newer=if_newer)
86
- except Exception as e:
87
- if download:
88
- raise RuntimeError(f"Failed to download '{cls.url}'; try setting `download=False`") from e
89
- download_failed = e # We'll try the cache
90
- else:
91
- download_failed = False
92
- if temp_json.exists():
93
- with zipfile.ZipFile(temp_zip, "w", compression=zipfile.ZIP_BZIP2) as catalog_zip:
94
- catalog_zip.write(temp_json, arcname="catalog.json")
95
- temp_zip.replace(cache_path)
96
- finally:
97
- # The `missing_ok` argument to `unlink` would be much nicer, but was added in python 3.8
98
- try:
99
- temp_json.unlink()
100
- except FileNotFoundError as e:
101
- pass
102
- try:
103
- temp_zip.unlink()
104
- except FileNotFoundError as e:
105
- pass
80
+ download_file(cls.url, cache_path, progress=progress, if_newer=if_newer)
81
+ except Exception as e:
82
+ if download:
83
+ raise RuntimeError(f"Failed to download '{cls.url}'; try setting `download=False`") from e
84
+ download_failed = e # We'll try the cache
106
85
 
107
86
  if not cache_path.exists():
108
87
  if download is False: # Test if it literally *is* False, rather than just casts to False
@@ -782,6 +782,7 @@ class SimulationBase:
782
782
  strain = self.load_waveform(
783
783
  *self.strain_path,
784
784
  transform_to_inertial=False,
785
+ drop_times_before=kwargs.pop("drop_times_before", 0)
785
786
  )
786
787
  return to_lvc_conventions(strain, self.horizons, **kwargs)
787
788
 
@@ -933,7 +934,7 @@ class Simulation_v2(SimulationBase):
933
934
  download_file(json_location, json_truepath)
934
935
  return load(
935
936
  h5_location, truepath=h5_truepath, group=group, metadata=self.metadata,
936
- transform_to_inertial=transform_to_inertial
937
+ transform_to_inertial=transform_to_inertial, drop_times_before=0,
937
938
  )
938
939
 
939
940
 
@@ -387,9 +387,8 @@ def load(
387
387
  a string is given, the corresponding time will be used. The
388
388
  "begin" option represents the earliest time in the data, so no
389
389
  data will be dropped; "reference" is the `reference_time`
390
- reported in the metadata. If `None`, the default, t=0 will be
391
- used if present in the data, and the first time step
392
- otherwise.
390
+ reported in the metadata. If no argument is given, all times
391
+ will be used ("begin").
393
392
  metadata : Metadata, optional
394
393
  If given, this metadata will be used instead of attempting to
395
394
  load the metadata from an accompanying file.
@@ -582,7 +581,7 @@ def load(
582
581
  except ValueError as e:
583
582
  invalid(f"\n{e},\nbut one is expected for this data format.")
584
583
 
585
- dtb = kwargs.pop("drop_times_before", 0)
584
+ dtb = kwargs.pop("drop_times_before", "begin")
586
585
  if dtb=="begin":
587
586
  i0 = 0
588
587
  elif dtb==0:
@@ -1,4 +1,5 @@
1
1
  import os
2
+ import time
2
3
  import functools
3
4
  import pytest
4
5
  import numpy as np
@@ -36,7 +37,6 @@ if GITHUB_ACTIONS_MACOS:
36
37
  else:
37
38
  skip_macOS_GH_actions_downloads = lambda f: f
38
39
 
39
-
40
40
  def pytest_addoption(parser):
41
41
  parser.addoption("--ell_max", action="store", type=int, default=ell_max_default,
42
42
  help="Maximum ell value to test")
@@ -36,6 +36,7 @@ def test_sxs_load_v2():
36
36
  s.Horizons
37
37
  s.psi4
38
38
  s.Psi4
39
+ assert s.h.t[0] >= 0
39
40
 
40
41
 
41
42
  @skip_macOS_GH_actions_downloads
@@ -63,6 +64,7 @@ def test_sxs_load_v2_levs():
63
64
  s.Strain
64
65
  s.horizons
65
66
  s.Horizons
67
+ assert s.h.t[0] >= 0
66
68
 
67
69
 
68
70
  @skip_macOS_GH_actions_downloads
@@ -81,6 +83,7 @@ def test_sxs_load_v3():
81
83
  s.Horizons
82
84
  s.psi4
83
85
  s.Psi4
86
+ assert s.h.t[0] >= 0
84
87
 
85
88
 
86
89
  @skip_macOS_GH_actions_downloads
@@ -108,6 +111,7 @@ def test_sxs_load_v3_levs():
108
111
  s.Strain
109
112
  s.horizons
110
113
  s.Horizons
114
+ assert s.h.t[0] >= 0
111
115
  # Check that Lev-1 and Lev0 work and are not the same as the highest Lev
112
116
  s = sxs.load(f"SXS:BBH:1132v3.0", ignore_deprecation=True)
113
117
  sm1 = sxs.load(f"SXS:BBH:1132v3.0/Lev-1", ignore_deprecation=True)
@@ -144,6 +148,7 @@ def test_sxs_load_v3_catalog():
144
148
  # at each Lev with each extrapolation order, but doesn't download
145
149
  # any data
146
150
  from pathlib import Path
151
+ from tqdm.auto import tqdm
147
152
 
148
153
  def fake_load_metadata(self):
149
154
  metadata_path = self.metadata_path
@@ -186,7 +191,7 @@ def test_sxs_load_v3_catalog():
186
191
  simulations = sxs.load("simulations")
187
192
 
188
193
  success = True
189
- for sxs_id, metadata in simulations.items():
194
+ for sxs_id, metadata in tqdm(simulations.items()):
190
195
  if "NSNS" in sxs_id or "BHNS" in sxs_id:
191
196
  continue
192
197
 
@@ -263,3 +268,25 @@ def test_superseding(loader):
263
268
  # Version, ignore_deprecation, auto_supersede
264
269
  s = loader(f"{simulation}v2.0", ignore_deprecation=True, auto_supersede=True)
265
270
  assert s.sxs_id_stem == simulation
271
+
272
+
273
+ def test_issue_116():
274
+ import tempfile
275
+ import contextlib
276
+ # Test that loading the strain as a user normally would drops
277
+ # times before 0
278
+ h = sxs.load("SXS:BBH:4000v3.0").h
279
+ assert h.t[0] >= 0
280
+ # Test that loading that same file directly *keeps* times before 0
281
+ h2 = sxs.load(h.__file__, metadata={})
282
+ assert h2.t[0] < 0
283
+ # Test that manually changing the time array and round-tripping
284
+ # through RPDMB preserves times
285
+ h3 = h.copy()
286
+ h3.t -= h3.max_norm_time()
287
+ with tempfile.TemporaryDirectory() as temp_dir:
288
+ with contextlib.redirect_stdout(None):
289
+ sxs.rpdmb.save(h3, f"{temp_dir}/test")
290
+ h4 = sxs.load(f"{temp_dir}/test", metadata={})
291
+ assert h4.t.size == h3.t.size == h.t.size
292
+ assert h4.t[0] == h3.t[0]
@@ -1 +0,0 @@
1
- __version__ = "2025.0.16"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes