muse 0.2.0__tar.gz → 0.2.2__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 (109) hide show
  1. {muse-0.2.0 → muse-0.2.2}/CHANGELOG.rst +9 -0
  2. {muse-0.2.0/muse.egg-info → muse-0.2.2}/PKG-INFO +7 -3
  3. {muse-0.2.0 → muse-0.2.2}/muse/_version.py +3 -3
  4. {muse-0.2.0 → muse-0.2.2}/muse/instrument/tests/test_figures.py +4 -0
  5. {muse-0.2.0 → muse-0.2.2}/muse/instrument/tests/test_linelist.py +4 -1
  6. {muse-0.2.0 → muse-0.2.2}/muse/instrument/tests/test_response.py +3 -0
  7. {muse-0.2.0 → muse-0.2.2}/muse/instrument/tests/test_spectral.py +5 -1
  8. {muse-0.2.0 → muse-0.2.2}/muse/synthesis/tests/test_backends.py +3 -1
  9. {muse-0.2.0 → muse-0.2.2}/muse/synthesis/tests/test_synthesis.py +3 -0
  10. {muse-0.2.0 → muse-0.2.2/muse.egg-info}/PKG-INFO +7 -3
  11. {muse-0.2.0 → muse-0.2.2}/muse.egg-info/requires.txt +6 -2
  12. {muse-0.2.0 → muse-0.2.2}/muse.egg-info/scm_version.json +2 -2
  13. {muse-0.2.0 → muse-0.2.2}/pyproject.toml +6 -2
  14. {muse-0.2.0 → muse-0.2.2}/MANIFEST.in +0 -0
  15. {muse-0.2.0 → muse-0.2.2}/README.rst +0 -0
  16. {muse-0.2.0 → muse-0.2.2}/docs/Makefile +0 -0
  17. {muse-0.2.0 → muse-0.2.2}/docs/_static/.gitkeep +0 -0
  18. {muse-0.2.0 → muse-0.2.2}/docs/_static/muse_logo.png +0 -0
  19. {muse-0.2.0 → muse-0.2.2}/docs/changelog.rst +0 -0
  20. {muse-0.2.0 → muse-0.2.2}/docs/conf.py +0 -0
  21. {muse-0.2.0 → muse-0.2.2}/docs/contributing.rst +0 -0
  22. {muse-0.2.0 → muse-0.2.2}/docs/design.rst +0 -0
  23. {muse-0.2.0 → muse-0.2.2}/docs/index.rst +0 -0
  24. {muse-0.2.0 → muse-0.2.2}/docs/installation.rst +0 -0
  25. {muse-0.2.0 → muse-0.2.2}/docs/make.bat +0 -0
  26. {muse-0.2.0 → muse-0.2.2}/docs/muse.rst +0 -0
  27. {muse-0.2.0 → muse-0.2.2}/docs/nitpick-exceptions +0 -0
  28. {muse-0.2.0 → muse-0.2.2}/docs/reference/data.rst +0 -0
  29. {muse-0.2.0 → muse-0.2.2}/docs/reference/index.rst +0 -0
  30. {muse-0.2.0 → muse-0.2.2}/docs/reference/instrument.rst +0 -0
  31. {muse-0.2.0 → muse-0.2.2}/docs/reference/muse.rst +0 -0
  32. {muse-0.2.0 → muse-0.2.2}/docs/reference/synthesis.rst +0 -0
  33. {muse-0.2.0 → muse-0.2.2}/docs/reference/transforms.rst +0 -0
  34. {muse-0.2.0 → muse-0.2.2}/docs/reference/utils.rst +0 -0
  35. {muse-0.2.0 → muse-0.2.2}/docs/robots.txt +0 -0
  36. {muse-0.2.0 → muse-0.2.2}/examples/README.txt +0 -0
  37. {muse-0.2.0 → muse-0.2.2}/examples/other_instruments/README.txt +0 -0
  38. {muse-0.2.0 → muse-0.2.2}/examples/other_instruments/aia_94_response.py +0 -0
  39. {muse-0.2.0 → muse-0.2.2}/examples/other_instruments/aia_94_synthesis.py +0 -0
  40. {muse-0.2.0 → muse-0.2.2}/examples/other_instruments/eis_fe_xii_response.py +0 -0
  41. {muse-0.2.0 → muse-0.2.2}/examples/other_instruments/eis_fe_xii_synthesis.py +0 -0
  42. {muse-0.2.0 → muse-0.2.2}/examples/other_instruments/skip_prepare_chianti_line_lists.py +0 -0
  43. {muse-0.2.0 → muse-0.2.2}/examples/synthesis_tutorial/02_vdem_to_muse_fov.py +0 -0
  44. {muse-0.2.0 → muse-0.2.2}/examples/synthesis_tutorial/04_create_sg_responses.py +0 -0
  45. {muse-0.2.0 → muse-0.2.2}/examples/synthesis_tutorial/05_synthesize_muse_observation.py +0 -0
  46. {muse-0.2.0 → muse-0.2.2}/examples/synthesis_tutorial/06_analyze_synthetic_spectra.py +0 -0
  47. {muse-0.2.0 → muse-0.2.2}/examples/synthesis_tutorial/07_density_and_nonthermal_responses.py +0 -0
  48. {muse-0.2.0 → muse-0.2.2}/examples/synthesis_tutorial/08_create_ci_response.py +0 -0
  49. {muse-0.2.0 → muse-0.2.2}/examples/synthesis_tutorial/README.txt +0 -0
  50. {muse-0.2.0 → muse-0.2.2}/examples/synthesis_tutorial/skip_01_create_vdem.py +0 -0
  51. {muse-0.2.0 → muse-0.2.2}/examples/synthesis_tutorial/skip_03_prepare_chianti_line_lists.py +0 -0
  52. {muse-0.2.0 → muse-0.2.2}/licenses/LICENSE.rst +0 -0
  53. {muse-0.2.0 → muse-0.2.2}/licenses/README.rst +0 -0
  54. {muse-0.2.0 → muse-0.2.2}/licenses/TEMPLATE_LICENSE.rst +0 -0
  55. {muse-0.2.0 → muse-0.2.2}/muse/__init__.py +0 -0
  56. {muse-0.2.0 → muse-0.2.2}/muse/conftest.py +0 -0
  57. {muse-0.2.0 → muse-0.2.2}/muse/data/README.rst +0 -0
  58. {muse-0.2.0 → muse-0.2.2}/muse/data/__init__.py +0 -0
  59. {muse-0.2.0 → muse-0.2.2}/muse/data/tests/__init__.py +0 -0
  60. {muse-0.2.0 → muse-0.2.2}/muse/data/tests/test_data.py +0 -0
  61. {muse-0.2.0 → muse-0.2.2}/muse/instrument/__init__.py +0 -0
  62. {muse-0.2.0 → muse-0.2.2}/muse/instrument/linelist.py +0 -0
  63. {muse-0.2.0 → muse-0.2.2}/muse/instrument/migration.py +0 -0
  64. {muse-0.2.0 → muse-0.2.2}/muse/instrument/radiometry.py +0 -0
  65. {muse-0.2.0 → muse-0.2.2}/muse/instrument/response.py +0 -0
  66. {muse-0.2.0 → muse-0.2.2}/muse/instrument/response_io.py +0 -0
  67. {muse-0.2.0 → muse-0.2.2}/muse/instrument/spectral.py +0 -0
  68. {muse-0.2.0 → muse-0.2.2}/muse/instrument/tests/__init__.py +0 -0
  69. {muse-0.2.0 → muse-0.2.2}/muse/instrument/tests/test_migration.py +0 -0
  70. {muse-0.2.0 → muse-0.2.2}/muse/instrument/tests/test_radiometry.py +0 -0
  71. {muse-0.2.0 → muse-0.2.2}/muse/instrument/tests/test_response_io.py +0 -0
  72. {muse-0.2.0 → muse-0.2.2}/muse/log.py +0 -0
  73. {muse-0.2.0 → muse-0.2.2}/muse/synthesis/__init__.py +0 -0
  74. {muse-0.2.0 → muse-0.2.2}/muse/synthesis/_backends.py +0 -0
  75. {muse-0.2.0 → muse-0.2.2}/muse/synthesis/synthesis.py +0 -0
  76. {muse-0.2.0 → muse-0.2.2}/muse/synthesis/tests/__init__.py +0 -0
  77. {muse-0.2.0 → muse-0.2.2}/muse/synthesis/tests/test_figures.py +0 -0
  78. {muse-0.2.0 → muse-0.2.2}/muse/synthesis/tests/test_utils.py +0 -0
  79. {muse-0.2.0 → muse-0.2.2}/muse/synthesis/utils.py +0 -0
  80. {muse-0.2.0 → muse-0.2.2}/muse/tests/__init__.py +0 -0
  81. {muse-0.2.0 → muse-0.2.2}/muse/tests/figure_hashes_mpl_3111_ft_2143_astropy_801.json +0 -0
  82. {muse-0.2.0 → muse-0.2.2}/muse/tests/helpers.py +0 -0
  83. {muse-0.2.0 → muse-0.2.2}/muse/tests/test_documentation.py +0 -0
  84. {muse-0.2.0 → muse-0.2.2}/muse/tests/test_figures.py +0 -0
  85. {muse-0.2.0 → muse-0.2.2}/muse/tests/test_helpers.py +0 -0
  86. {muse-0.2.0 → muse-0.2.2}/muse/tests/test_variables.py +0 -0
  87. {muse-0.2.0 → muse-0.2.2}/muse/transforms/__init__.py +0 -0
  88. {muse-0.2.0 → muse-0.2.2}/muse/transforms/tests/__init__.py +0 -0
  89. {muse-0.2.0 → muse-0.2.2}/muse/transforms/tests/test_figures.py +0 -0
  90. {muse-0.2.0 → muse-0.2.2}/muse/transforms/tests/test_transforms.py +0 -0
  91. {muse-0.2.0 → muse-0.2.2}/muse/transforms/transforms.py +0 -0
  92. {muse-0.2.0 → muse-0.2.2}/muse/utils/__init__.py +0 -0
  93. {muse-0.2.0 → muse-0.2.2}/muse/utils/documentation.py +0 -0
  94. {muse-0.2.0 → muse-0.2.2}/muse/utils/tests/__init__.py +0 -0
  95. {muse-0.2.0 → muse-0.2.2}/muse/utils/tests/test_documentation.py +0 -0
  96. {muse-0.2.0 → muse-0.2.2}/muse/utils/tests/test_utils.py +0 -0
  97. {muse-0.2.0 → muse-0.2.2}/muse/utils/utils.py +0 -0
  98. {muse-0.2.0 → muse-0.2.2}/muse/variables.py +0 -0
  99. {muse-0.2.0 → muse-0.2.2}/muse/variables_schema.py +0 -0
  100. {muse-0.2.0 → muse-0.2.2}/muse/version.py +0 -0
  101. {muse-0.2.0 → muse-0.2.2}/muse.egg-info/SOURCES.txt +0 -0
  102. {muse-0.2.0 → muse-0.2.2}/muse.egg-info/dependency_links.txt +0 -0
  103. {muse-0.2.0 → muse-0.2.2}/muse.egg-info/not-zip-safe +0 -0
  104. {muse-0.2.0 → muse-0.2.2}/muse.egg-info/scm_file_list.json +0 -0
  105. {muse-0.2.0 → muse-0.2.2}/muse.egg-info/top_level.txt +0 -0
  106. {muse-0.2.0 → muse-0.2.2}/pytest.ini +0 -0
  107. {muse-0.2.0 → muse-0.2.2}/setup.cfg +0 -0
  108. {muse-0.2.0 → muse-0.2.2}/setup.py +0 -0
  109. {muse-0.2.0 → muse-0.2.2}/tox.ini +0 -0
@@ -1,3 +1,12 @@
1
+ 0.2.1 (2026-09-07)
2
+ ==================
3
+
4
+ Internal Changes
5
+ ----------------
6
+
7
+ - Declare Dask, Zarr, netCDF4, and SciPy explicitly instead of relying on xarray extras, and skip tests requiring unavailable optional science dependencies. (`#102 <https://github.com/LM-SAL/muse/pull/102>`__)
8
+
9
+
1
10
  0.2.0 (2026-09-07)
2
11
  ==================
3
12
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: muse
3
- Version: 0.2.0
3
+ Version: 0.2.2
4
4
  Summary: A library to reduce and analyze data from the MUSE Mission.
5
5
  Author-email: MUSE Instrument Team <nfreij@seti.org>
6
6
  Project-URL: Documentation, https://muse-lmsal.readthedocs.io/en/latest/
@@ -23,10 +23,14 @@ Description-Content-Type: text/x-rst
23
23
  License-File: licenses/LICENSE.rst
24
24
  Requires-Dist: astropy>=8.0
25
25
  Requires-Dist: attrs>=26.1.0
26
- Requires-Dist: loguru>=0.7.3
26
+ Requires-Dist: dask[array]>=2026.8.0
27
+ Requires-Dist: loguru>=0.7.0
28
+ Requires-Dist: netCDF4>=1.7.0
27
29
  Requires-Dist: numpy>=2.5.0
30
+ Requires-Dist: scipy>=1.18.0
28
31
  Requires-Dist: tqdm>=4.70
29
- Requires-Dist: xarray[io,parallel]>=2026.7.0
32
+ Requires-Dist: xarray>=2026.7.0
33
+ Requires-Dist: zarr>=3.3.0
30
34
  Provides-Extra: all
31
35
  Requires-Dist: muse[chianti,torch]; extra == "all"
32
36
  Provides-Extra: chianti
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '0.2.0'
22
- __version_tuple__ = version_tuple = (0, 2, 0)
21
+ __version__ = version = '0.2.2'
22
+ __version_tuple__ = version_tuple = (0, 2, 2)
23
23
 
24
- __commit_id__ = commit_id = 'gc9eabe1e2'
24
+ __commit_id__ = commit_id = 'gd336a0a5f'
@@ -1,11 +1,15 @@
1
1
  import matplotlib.pyplot as plt
2
2
  import numpy as np
3
+ import pytest
3
4
 
4
5
  import astropy.units as u
5
6
 
6
7
  from muse.instrument.spectral import create_spectral_response
7
8
  from muse.tests.helpers import figure_test, synthetic_effective_area, synthetic_line_list
8
9
 
10
+ pytest.importorskip("numexpr")
11
+ pytest.importorskip("periodictable")
12
+
9
13
  WAVELENGTH_GRID = np.linspace(170.75, 171.25, 501) * u.AA
10
14
 
11
15
 
@@ -165,6 +165,7 @@ def test_no_lines_raises(monkeypatch):
165
165
 
166
166
 
167
167
  def test_missing_xuvtop_raises(monkeypatch):
168
+ pytest.importorskip("ChiantiPy")
168
169
  monkeypatch.delenv("XUVTOP", raising=False)
169
170
  temperature = xr.DataArray([1e6] * u.K, dims="logT")
170
171
  pressure = xr.DataArray([3e15] * u.K / u.cm**3, dims="pressure")
@@ -174,10 +175,11 @@ def test_missing_xuvtop_raises(monkeypatch):
174
175
 
175
176
  @pytest.mark.chianti
176
177
  def test_create_chianti_line_list_live_minimum_abundance_scalar_grid(monkeypatch):
178
+ pytest.importorskip("ChiantiPy")
177
179
  assert os.environ.get("XUVTOP")
178
180
  with warnings.catch_warnings():
179
181
  warnings.simplefilter("ignore", RuntimeWarning)
180
- import ChiantiPy.tools.data as chdata # noqa: PLC0415
182
+ chdata = pytest.importorskip("ChiantiPy.tools.data")
181
183
 
182
184
  monkeypatch.delattr(chdata, "Defaults")
183
185
  temperature = xr.DataArray([1e6] * u.K, dims="logT")
@@ -203,6 +205,7 @@ def test_create_chianti_line_list_live_minimum_abundance_scalar_grid(monkeypatch
203
205
 
204
206
  @pytest.mark.chianti
205
207
  def test_create_chianti_line_list_live_density():
208
+ pytest.importorskip("ChiantiPy")
206
209
  assert os.environ.get("XUVTOP")
207
210
  temperature = xr.DataArray(10 ** np.arange(5.6, 6.2, 0.2) * u.K, dims="logT")
208
211
  density = xr.DataArray([1e8, 1e9] / u.cm**3, dims="density")
@@ -404,6 +404,9 @@ def test_map_response_to_ci_detector_rejects_invalid_inputs(case, error, match):
404
404
  )
405
405
  @pytest.mark.chianti
406
406
  def test_public_response_workflow_composes_through_moment_analysis(tmp_path):
407
+ pytest.importorskip("ChiantiPy")
408
+ pytest.importorskip("numexpr")
409
+ pytest.importorskip("periodictable")
407
410
  line_list = create_chianti_line_list(
408
411
  xr.DataArray([1e6] * u.K, dims="logT"),
409
412
  pressure=xr.DataArray([3e15] * u.K / u.cm**3, dims="pressure"),
@@ -17,6 +17,9 @@ from muse.instrument.spectral import _evaluate_gaussian_response, create_spectra
17
17
  from muse.tests.helpers import synthetic_effective_area, synthetic_line_list
18
18
  from muse.variables import DEFAULTS_MUSE
19
19
 
20
+ pytest.importorskip("numexpr")
21
+ pytest.importorskip("periodictable")
22
+
20
23
  RESPONSE_NORMALIZATION = 1e-27
21
24
  DEFAULT_WAVELENGTH_GRID = np.arange(170.0, 172.002, 0.002) * u.AA
22
25
  DOPPLER_VELOCITY = np.array([-200.0, 0.0, 200.0]) * u.km / u.s
@@ -127,7 +130,8 @@ def test_gaussian_window_matches_full_grid():
127
130
  expected = gofnt_scaled.data * np.exp(-0.5 * (shift.data / width.data) ** 2) / gaussian_norm / width.data
128
131
 
129
132
  response, _ = _evaluate_gaussian_response(wavelength_grid, line_center, doppler_width, gofnt, gaussian_norm)
130
- np.testing.assert_allclose(response, expected, rtol=1e-15, atol=0)
133
+ # NumPy and numexpr can underflow differently in the subnormal Gaussian tails.
134
+ np.testing.assert_allclose(response, expected, rtol=1e-15, atol=np.finfo(expected.dtype).tiny)
131
135
 
132
136
  response, _ = _evaluate_gaussian_response(
133
137
  wavelength_grid,
@@ -40,7 +40,9 @@ def test_numpy_to_torch_caps_precision_at_float32() -> None:
40
40
 
41
41
  @pytest.mark.cuda
42
42
  def test_torch_numpy_round_trip_cuda() -> None:
43
- pytest.importorskip("torch")
43
+ torch = pytest.importorskip("torch")
44
+ if not torch.cuda.is_available():
45
+ pytest.skip("CUDA is not available")
44
46
  array = np.arange(6.0).reshape(2, 3)
45
47
  tensor = numpy_to_torch(array, cuda_device=0)
46
48
  assert tensor.is_cuda
@@ -384,6 +384,9 @@ def test_vdem_synthesis_converts_wavelength_coords_to_angstrom(response, raster)
384
384
 
385
385
  @pytest.mark.cuda
386
386
  def test_vdem_synthesis_cuda_matches_cpu(response, raster) -> None:
387
+ torch = pytest.importorskip("torch")
388
+ if not torch.cuda.is_available():
389
+ pytest.skip("CUDA is not available")
387
390
  cpu = vdem_synthesis(raster, response)
388
391
  gpu = vdem_synthesis(raster, response, cuda_device=0, backend="torch")
389
392
  assert_dataset_structure(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: muse
3
- Version: 0.2.0
3
+ Version: 0.2.2
4
4
  Summary: A library to reduce and analyze data from the MUSE Mission.
5
5
  Author-email: MUSE Instrument Team <nfreij@seti.org>
6
6
  Project-URL: Documentation, https://muse-lmsal.readthedocs.io/en/latest/
@@ -23,10 +23,14 @@ Description-Content-Type: text/x-rst
23
23
  License-File: licenses/LICENSE.rst
24
24
  Requires-Dist: astropy>=8.0
25
25
  Requires-Dist: attrs>=26.1.0
26
- Requires-Dist: loguru>=0.7.3
26
+ Requires-Dist: dask[array]>=2026.8.0
27
+ Requires-Dist: loguru>=0.7.0
28
+ Requires-Dist: netCDF4>=1.7.0
27
29
  Requires-Dist: numpy>=2.5.0
30
+ Requires-Dist: scipy>=1.18.0
28
31
  Requires-Dist: tqdm>=4.70
29
- Requires-Dist: xarray[io,parallel]>=2026.7.0
32
+ Requires-Dist: xarray>=2026.7.0
33
+ Requires-Dist: zarr>=3.3.0
30
34
  Provides-Extra: all
31
35
  Requires-Dist: muse[chianti,torch]; extra == "all"
32
36
  Provides-Extra: chianti
@@ -1,9 +1,13 @@
1
1
  astropy>=8.0
2
2
  attrs>=26.1.0
3
- loguru>=0.7.3
3
+ dask[array]>=2026.8.0
4
+ loguru>=0.7.0
5
+ netCDF4>=1.7.0
4
6
  numpy>=2.5.0
7
+ scipy>=1.18.0
5
8
  tqdm>=4.70
6
- xarray[io,parallel]>=2026.7.0
9
+ xarray>=2026.7.0
10
+ zarr>=3.3.0
7
11
 
8
12
  [all]
9
13
  muse[chianti,torch]
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "0.2.0",
2
+ "tag": "0.2.2",
3
3
  "distance": 0,
4
- "node": "gc9eabe1e2aaaf15daadff373ba7dcd2cd09b7347",
4
+ "node": "gd336a0a5f2e32971d60d0bb35158bc90b439e31b",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-09-07"
@@ -27,10 +27,14 @@ urls."Source Code" = "https://github.com/LM-SAL/muse"
27
27
  dependencies = [
28
28
  "astropy>=8.0",
29
29
  "attrs>=26.1.0",
30
- "loguru>=0.7.3",
30
+ "dask[array]>=2026.8.0",
31
+ "loguru>=0.7.0",
32
+ "netCDF4>=1.7.0",
31
33
  "numpy>=2.5.0",
34
+ "scipy>=1.18.0",
32
35
  "tqdm>=4.70",
33
- "xarray[io,parallel]>=2026.7.0",
36
+ "xarray>=2026.7.0",
37
+ "zarr>=3.3.0",
34
38
  ]
35
39
  optional-dependencies.all = ["muse[chianti,torch]"]
36
40
  optional-dependencies.chianti = [
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
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