essdiffraction 26.5.2__tar.gz → 26.6.0__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 (125) hide show
  1. {essdiffraction-26.5.2/src/essdiffraction.egg-info → essdiffraction-26.6.0}/PKG-INFO +18 -18
  2. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/docs/user-guide/dream/dream-make-wavelength-lookup-table.ipynb +5 -5
  3. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/pyproject.toml +17 -17
  4. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/src/ess/dream/workflows.py +11 -3
  5. {essdiffraction-26.5.2 → essdiffraction-26.6.0/src/essdiffraction.egg-info}/PKG-INFO +18 -18
  6. essdiffraction-26.6.0/src/essdiffraction.egg-info/requires.txt +36 -0
  7. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/tests/dream/geant4_reduction_test.py +75 -84
  8. essdiffraction-26.5.2/src/essdiffraction.egg-info/requires.txt +0 -36
  9. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/.copier-answers.ess.yml +0 -0
  10. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/.copier-answers.yml +0 -0
  11. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/LICENSE +0 -0
  12. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/README.md +0 -0
  13. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/docs/_static/anaconda-icon.js +0 -0
  14. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/docs/_static/essdiffraction-search-logo.png +0 -0
  15. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/docs/_static/favicon.svg +0 -0
  16. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/docs/_static/logo-dark.svg +0 -0
  17. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/docs/_static/logo.svg +0 -0
  18. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/docs/_static/thumbnails/beer_mcstas_dark.svg +0 -0
  19. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/docs/_static/thumbnails/beer_mcstas_light.svg +0 -0
  20. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/docs/_static/thumbnails/dream_advanced_powder_reduction_dark.svg +0 -0
  21. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/docs/_static/thumbnails/dream_advanced_powder_reduction_light.svg +0 -0
  22. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/docs/_static/thumbnails/dream_basic_powder_reduction_dark.svg +0 -0
  23. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/docs/_static/thumbnails/dream_basic_powder_reduction_light.svg +0 -0
  24. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/docs/_templates/class-template.rst +0 -0
  25. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/docs/_templates/doc_version.html +0 -0
  26. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/docs/_templates/layout.html +0 -0
  27. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/docs/_templates/module-template.rst +0 -0
  28. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/docs/about/bibliography.rst +0 -0
  29. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/docs/about/index.md +0 -0
  30. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/docs/api-reference/index.md +0 -0
  31. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/docs/bibliography.bib +0 -0
  32. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/docs/conf.py +0 -0
  33. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/docs/developer/coding-conventions.md +0 -0
  34. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/docs/developer/dependency-management.md +0 -0
  35. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/docs/developer/getting-started.md +0 -0
  36. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/docs/developer/index.md +0 -0
  37. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/docs/index.md +0 -0
  38. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/docs/user-guide/beer/beer_modulation_mcstas.ipynb +0 -0
  39. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/docs/user-guide/beer/index.md +0 -0
  40. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/docs/user-guide/common/index.md +0 -0
  41. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/docs/user-guide/common/vanadium_processing.ipynb +0 -0
  42. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/docs/user-guide/dream/dream-advanced-powder-reduction.ipynb +0 -0
  43. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/docs/user-guide/dream/dream-detector-diagnostics.ipynb +0 -0
  44. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/docs/user-guide/dream/dream-instrument-view.ipynb +0 -0
  45. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/docs/user-guide/dream/dream-powder-reduction.ipynb +0 -0
  46. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/docs/user-guide/dream/dream-visualize-absorption.ipynb +0 -0
  47. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/docs/user-guide/dream/index.md +0 -0
  48. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/docs/user-guide/dream/workflow-widget-dream.ipynb +0 -0
  49. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/docs/user-guide/index.md +0 -0
  50. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/docs/user-guide/installation.md +0 -0
  51. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/docs/user-guide/magic/index.md +0 -0
  52. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/docs/user-guide/sns-instruments/POWGEN_data_reduction.ipynb +0 -0
  53. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/docs/user-guide/sns-instruments/index.md +0 -0
  54. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/resources/logo.svg +0 -0
  55. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/setup.cfg +0 -0
  56. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/src/ess/beer/__init__.py +0 -0
  57. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/src/ess/beer/clustering.py +0 -0
  58. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/src/ess/beer/conversions.py +0 -0
  59. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/src/ess/beer/data.py +0 -0
  60. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/src/ess/beer/io.py +0 -0
  61. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/src/ess/beer/peakfinding.py +0 -0
  62. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/src/ess/beer/types.py +0 -0
  63. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/src/ess/beer/workflow.py +0 -0
  64. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/src/ess/diffraction/__init__.py +0 -0
  65. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/src/ess/diffraction/peaks.py +0 -0
  66. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/src/ess/diffraction/py.typed +0 -0
  67. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/src/ess/dream/__init__.py +0 -0
  68. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/src/ess/dream/beamline.py +0 -0
  69. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/src/ess/dream/data.py +0 -0
  70. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/src/ess/dream/diagnostics.py +0 -0
  71. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/src/ess/dream/instrument_view.py +0 -0
  72. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/src/ess/dream/io/__init__.py +0 -0
  73. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/src/ess/dream/io/cif.py +0 -0
  74. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/src/ess/dream/io/geant4.py +0 -0
  75. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/src/ess/dream/parameters.py +0 -0
  76. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/src/ess/dream/py.typed +0 -0
  77. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/src/ess/magic/__init__.py +0 -0
  78. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/src/ess/magic/beamline.py +0 -0
  79. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/src/ess/magic/data.py +0 -0
  80. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/src/ess/magic/types.py +0 -0
  81. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/src/ess/magic/workflow.py +0 -0
  82. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/src/ess/powder/__init__.py +0 -0
  83. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/src/ess/powder/_util.py +0 -0
  84. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/src/ess/powder/calibration.py +0 -0
  85. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/src/ess/powder/conversion.py +0 -0
  86. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/src/ess/powder/correction.py +0 -0
  87. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/src/ess/powder/filtering.py +0 -0
  88. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/src/ess/powder/grouping.py +0 -0
  89. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/src/ess/powder/logging.py +0 -0
  90. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/src/ess/powder/masking.py +0 -0
  91. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/src/ess/powder/py.typed +0 -0
  92. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/src/ess/powder/smoothing.py +0 -0
  93. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/src/ess/powder/transform.py +0 -0
  94. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/src/ess/powder/types.py +0 -0
  95. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/src/ess/powder/workflow.py +0 -0
  96. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/src/ess/snspowder/powgen/__init__.py +0 -0
  97. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/src/ess/snspowder/powgen/beamline.py +0 -0
  98. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/src/ess/snspowder/powgen/calibration.py +0 -0
  99. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/src/ess/snspowder/powgen/data.py +0 -0
  100. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/src/ess/snspowder/powgen/instrument_view.py +0 -0
  101. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/src/ess/snspowder/powgen/peaks.py +0 -0
  102. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/src/ess/snspowder/powgen/workflow.py +0 -0
  103. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/src/essdiffraction.egg-info/SOURCES.txt +0 -0
  104. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/src/essdiffraction.egg-info/dependency_links.txt +0 -0
  105. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/src/essdiffraction.egg-info/top_level.txt +0 -0
  106. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/tests/beer/mcstas_reduction_test.py +0 -0
  107. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/tests/conftest.py +0 -0
  108. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/tests/diffraction/peaks_test.py +0 -0
  109. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/tests/dream/diagnostics_test.py +0 -0
  110. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/tests/dream/instrument_view_test.py +0 -0
  111. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/tests/dream/io/cif_test.py +0 -0
  112. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/tests/dream/io/geant4_test.py +0 -0
  113. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/tests/dream/workflows/dream_generic_workflow_test.py +0 -0
  114. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/tests/magic/workflow_test.py +0 -0
  115. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/tests/package_test.py +0 -0
  116. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/tests/powder/conversion_test.py +0 -0
  117. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/tests/powder/correction_test.py +0 -0
  118. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/tests/powder/filtering_test.py +0 -0
  119. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/tests/powder/transform_test.py +0 -0
  120. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/tests/snspowder/powgen/load_test.py +0 -0
  121. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/tests/snspowder/powgen/powgen_reduction_test.py +0 -0
  122. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/tools/docs/beer-thumbnails.ipynb +0 -0
  123. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/tools/docs/dream-thumbnails.ipynb +0 -0
  124. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/tools/preprocess_pg3_files.ipynb +0 -0
  125. {essdiffraction-26.5.2 → essdiffraction-26.6.0}/tools/shrink_nexus.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: essdiffraction
3
- Version: 26.5.2
3
+ Version: 26.6.0
4
4
  Summary: Diffraction data reduction for the European Spallation Source
5
5
  Author: Scipp contributors
6
6
  License-Expression: BSD-3-Clause
@@ -21,8 +21,8 @@ Requires-Python: >=3.11
21
21
  Description-Content-Type: text/markdown
22
22
  License-File: LICENSE
23
23
  Requires-Dist: dask>=2022.1.0
24
- Requires-Dist: essreduce>=26.4.0
25
- Requires-Dist: graphviz
24
+ Requires-Dist: essreduce>=26.6.0
25
+ Requires-Dist: graphviz>=0.20
26
26
  Requires-Dist: numpy>=2
27
27
  Requires-Dist: plopp>=26.2.0
28
28
  Requires-Dist: pythreejs>=2.4.1
@@ -32,28 +32,28 @@ Requires-Dist: scippneutron>=26.3.0
32
32
  Requires-Dist: scippnexus>=23.12.0
33
33
  Requires-Dist: tof>=25.12.0
34
34
  Requires-Dist: ncrystal[cif]>=4.1.0
35
- Requires-Dist: spglib!=2.7
35
+ Requires-Dist: spglib!=2.7,>=2.0.0
36
36
  Provides-Extra: test
37
37
  Requires-Dist: pandas>=2.1.2; extra == "test"
38
38
  Requires-Dist: pooch>=1.5; extra == "test"
39
39
  Requires-Dist: pytest>=7.0; extra == "test"
40
40
  Requires-Dist: ipywidgets>=8.1.7; extra == "test"
41
41
  Provides-Extra: docs
42
- Requires-Dist: autodoc-pydantic; extra == "docs"
43
- Requires-Dist: ipykernel; extra == "docs"
44
- Requires-Dist: ipympl; extra == "docs"
45
- Requires-Dist: ipython!=8.7.0; extra == "docs"
46
- Requires-Dist: myst-parser; extra == "docs"
47
- Requires-Dist: nbsphinx; extra == "docs"
48
- Requires-Dist: pandas; extra == "docs"
49
- Requires-Dist: pooch; extra == "docs"
42
+ Requires-Dist: autodoc-pydantic>=2.0.0; extra == "docs"
43
+ Requires-Dist: ipykernel>=6.20.0; extra == "docs"
44
+ Requires-Dist: ipympl>=0.9.0; extra == "docs"
45
+ Requires-Dist: ipython!=8.7.0,>=8.8.0; extra == "docs"
46
+ Requires-Dist: myst-parser>=2.0.0; extra == "docs"
47
+ Requires-Dist: nbsphinx>=0.9.3; extra == "docs"
48
+ Requires-Dist: pandas>=2.1.2; extra == "docs"
49
+ Requires-Dist: pooch>=1.5; extra == "docs"
50
50
  Requires-Dist: pydata-sphinx-theme>=0.14; extra == "docs"
51
- Requires-Dist: sphinx; extra == "docs"
52
- Requires-Dist: sphinx-autodoc-typehints; extra == "docs"
53
- Requires-Dist: sphinx-copybutton; extra == "docs"
54
- Requires-Dist: sphinx-design; extra == "docs"
55
- Requires-Dist: sphinxcontrib-bibtex; extra == "docs"
56
- Requires-Dist: pyarrow; extra == "docs"
51
+ Requires-Dist: sphinx>=7; extra == "docs"
52
+ Requires-Dist: sphinx-autodoc-typehints>=1.24.0; extra == "docs"
53
+ Requires-Dist: sphinx-copybutton>=0.5.2; extra == "docs"
54
+ Requires-Dist: sphinx-design>=0.5.0; extra == "docs"
55
+ Requires-Dist: sphinxcontrib-bibtex>=2.5.0; extra == "docs"
56
+ Requires-Dist: pyarrow>=12.0.0; extra == "docs"
57
57
  Dynamic: license-file
58
58
 
59
59
  [![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg)](CODE_OF_CONDUCT.md)
@@ -18,8 +18,9 @@
18
18
  "outputs": [],
19
19
  "source": [
20
20
  "import scipp as sc\n",
21
+ "import scippnexus as snx\n",
21
22
  "from ess.reduce import unwrap\n",
22
- "from ess.reduce.nexus.types import AnyRun\n",
23
+ "from ess.reduce.nexus.types import AnyRun, Position\n",
23
24
  "from ess.dream.beamline import InstrumentConfiguration, choppers"
24
25
  ]
25
26
  },
@@ -62,14 +63,13 @@
62
63
  "source": [
63
64
  "wf = unwrap.LookupTableWorkflow()\n",
64
65
  "\n",
65
- "wf[unwrap.LtotalRange] = sc.scalar(5.0, unit=\"m\"), sc.scalar(80.0, unit=\"m\")\n",
66
+ "wf[unwrap.LtotalRange[AnyRun, snx.NXdetector]] = sc.scalar(5.0, unit=\"m\"), sc.scalar(80.0, unit=\"m\")\n",
66
67
  "wf[unwrap.NumberOfSimulatedNeutrons] = 200_000 # Increase this number for more reliable results\n",
67
- "wf[unwrap.SourcePosition] = sc.vector([0, 0, 0], unit='m')\n",
68
+ "wf[Position[snx.NXsource, AnyRun]] = sc.vector([0, 0, 0], unit='m')\n",
68
69
  "wf[unwrap.DiskChoppers[AnyRun]] = disk_choppers\n",
69
70
  "wf[unwrap.DistanceResolution] = sc.scalar(0.1, unit=\"m\")\n",
70
71
  "wf[unwrap.TimeResolution] = sc.scalar(250.0, unit='us')\n",
71
72
  "wf[unwrap.PulsePeriod] = 1.0 / sc.scalar(14.0, unit=\"Hz\")\n",
72
- "wf[unwrap.PulseStride] = 1\n",
73
73
  "wf[unwrap.PulseStrideOffset] = None"
74
74
  ]
75
75
  },
@@ -88,7 +88,7 @@
88
88
  "metadata": {},
89
89
  "outputs": [],
90
90
  "source": [
91
- "table = wf.compute(unwrap.LookupTable)\n",
91
+ "table = wf.compute(unwrap.LookupTable[AnyRun, snx.NXdetector])\n",
92
92
  "table.array"
93
93
  ]
94
94
  },
@@ -30,8 +30,8 @@ requires-python = ">=3.11"
30
30
  # Make sure to list one dependency per line.
31
31
  dependencies = [
32
32
  "dask>=2022.1.0",
33
- "essreduce>=26.4.0",
34
- "graphviz",
33
+ "essreduce>=26.6.0",
34
+ "graphviz>=0.20",
35
35
  "numpy>=2",
36
36
  "plopp>=26.2.0",
37
37
  "pythreejs>=2.4.1",
@@ -41,7 +41,7 @@ dependencies = [
41
41
  "scippnexus>=23.12.0",
42
42
  "tof>=25.12.0",
43
43
  "ncrystal[cif]>=4.1.0",
44
- "spglib!=2.7", # https://github.com/mctools/ncrystal/issues/320
44
+ "spglib>=2.0.0,!=2.7", # https://github.com/mctools/ncrystal/issues/320
45
45
  ]
46
46
 
47
47
  dynamic = ["version"]
@@ -54,23 +54,23 @@ test = [
54
54
  "ipywidgets>=8.1.7",
55
55
  ]
56
56
  docs = [
57
- "autodoc-pydantic",
58
- "ipykernel",
59
- "ipympl",
57
+ "autodoc-pydantic>=2.0.0",
58
+ "ipykernel>=6.20.0",
59
+ "ipympl>=0.9.0",
60
60
  # Breaks syntax highlighting in Jupyter code cells.
61
- "ipython!=8.7.0",
62
- "myst-parser",
63
- "nbsphinx",
64
- "pandas",
65
- "pooch",
61
+ "ipython>=8.8.0,!=8.7.0",
62
+ "myst-parser>=2.0.0",
63
+ "nbsphinx>=0.9.3",
64
+ "pandas>=2.1.2",
65
+ "pooch>=1.5",
66
66
  "pydata-sphinx-theme>=0.14",
67
- "sphinx",
68
- "sphinx-autodoc-typehints",
69
- "sphinx-copybutton",
70
- "sphinx-design",
71
- "sphinxcontrib-bibtex",
67
+ "sphinx>=7",
68
+ "sphinx-autodoc-typehints>=1.24.0",
69
+ "sphinx-copybutton>=0.5.2",
70
+ "sphinx-design>=0.5.0",
71
+ "sphinxcontrib-bibtex>=2.5.0",
72
72
  # needed by pandas < 3.0
73
- "pyarrow",
73
+ "pyarrow>=12.0.0",
74
74
  ]
75
75
 
76
76
  [project.urls]
@@ -32,7 +32,7 @@ from scippneutron.metadata import Software
32
32
 
33
33
  from ess.reduce.nexus.types import DetectorBankSizes, NeXusName
34
34
  from ess.reduce.parameter import parameter_mappers
35
- from ess.reduce.unwrap import GenericUnwrapWorkflow
35
+ from ess.reduce.unwrap import GenericUnwrapWorkflow, WavelengthLutMode
36
36
  from ess.reduce.workflow import register_workflow
37
37
 
38
38
  from .beamline import InstrumentConfiguration
@@ -97,7 +97,9 @@ def _collect_reducer_software() -> ReducerSoftware:
97
97
  )
98
98
 
99
99
 
100
- def DreamWorkflow(**kwargs) -> sciline.Pipeline:
100
+ def DreamWorkflow(
101
+ wavelength_from: WavelengthLutMode = "file", **kwargs
102
+ ) -> sciline.Pipeline:
101
103
  """
102
104
  Dream generic workflow with default parameters.
103
105
  The workflow is based on the GenericUnwrapWorkflow.
@@ -109,6 +111,10 @@ def DreamWorkflow(**kwargs) -> sciline.Pipeline:
109
111
 
110
112
  Parameters
111
113
  ----------
114
+ wavelength_from:
115
+ Mode for creating the wavelength lookup table. Possible values are
116
+ 'analytical', 'simulation', and 'file'. See
117
+ https://scipp.github.io/ess/reduce/user-guide/unwrap/lut-building-methods.html
112
118
  kwargs:
113
119
  Additional keyword arguments are forwarded to the base
114
120
  :func:`GenericUnwrapWorkflow`.
@@ -116,12 +122,14 @@ def DreamWorkflow(**kwargs) -> sciline.Pipeline:
116
122
  wf = GenericUnwrapWorkflow(
117
123
  run_types=[SampleRun, VanadiumRun, EmptyCanRun],
118
124
  monitor_types=[BunkerMonitor, CaveMonitor],
125
+ wavelength_from=wavelength_from,
119
126
  **kwargs,
120
127
  )
121
128
  wf[DetectorBankSizes] = DETECTOR_BANK_SIZES
122
129
  wf[NeXusName[BunkerMonitor]] = "monitor_bunker"
123
130
  wf[NeXusName[CaveMonitor]] = "monitor_cave"
124
- wf.insert(_get_lookup_table_filename_from_configuration)
131
+ if wavelength_from == "file":
132
+ wf.insert(_get_lookup_table_filename_from_configuration)
125
133
  wf[ReducerSoftware] = _collect_reducer_software()
126
134
  wf[LookupTableRelativeErrorThreshold] = {
127
135
  "endcap_backward_detector": float('inf'),
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: essdiffraction
3
- Version: 26.5.2
3
+ Version: 26.6.0
4
4
  Summary: Diffraction data reduction for the European Spallation Source
5
5
  Author: Scipp contributors
6
6
  License-Expression: BSD-3-Clause
@@ -21,8 +21,8 @@ Requires-Python: >=3.11
21
21
  Description-Content-Type: text/markdown
22
22
  License-File: LICENSE
23
23
  Requires-Dist: dask>=2022.1.0
24
- Requires-Dist: essreduce>=26.4.0
25
- Requires-Dist: graphviz
24
+ Requires-Dist: essreduce>=26.6.0
25
+ Requires-Dist: graphviz>=0.20
26
26
  Requires-Dist: numpy>=2
27
27
  Requires-Dist: plopp>=26.2.0
28
28
  Requires-Dist: pythreejs>=2.4.1
@@ -32,28 +32,28 @@ Requires-Dist: scippneutron>=26.3.0
32
32
  Requires-Dist: scippnexus>=23.12.0
33
33
  Requires-Dist: tof>=25.12.0
34
34
  Requires-Dist: ncrystal[cif]>=4.1.0
35
- Requires-Dist: spglib!=2.7
35
+ Requires-Dist: spglib!=2.7,>=2.0.0
36
36
  Provides-Extra: test
37
37
  Requires-Dist: pandas>=2.1.2; extra == "test"
38
38
  Requires-Dist: pooch>=1.5; extra == "test"
39
39
  Requires-Dist: pytest>=7.0; extra == "test"
40
40
  Requires-Dist: ipywidgets>=8.1.7; extra == "test"
41
41
  Provides-Extra: docs
42
- Requires-Dist: autodoc-pydantic; extra == "docs"
43
- Requires-Dist: ipykernel; extra == "docs"
44
- Requires-Dist: ipympl; extra == "docs"
45
- Requires-Dist: ipython!=8.7.0; extra == "docs"
46
- Requires-Dist: myst-parser; extra == "docs"
47
- Requires-Dist: nbsphinx; extra == "docs"
48
- Requires-Dist: pandas; extra == "docs"
49
- Requires-Dist: pooch; extra == "docs"
42
+ Requires-Dist: autodoc-pydantic>=2.0.0; extra == "docs"
43
+ Requires-Dist: ipykernel>=6.20.0; extra == "docs"
44
+ Requires-Dist: ipympl>=0.9.0; extra == "docs"
45
+ Requires-Dist: ipython!=8.7.0,>=8.8.0; extra == "docs"
46
+ Requires-Dist: myst-parser>=2.0.0; extra == "docs"
47
+ Requires-Dist: nbsphinx>=0.9.3; extra == "docs"
48
+ Requires-Dist: pandas>=2.1.2; extra == "docs"
49
+ Requires-Dist: pooch>=1.5; extra == "docs"
50
50
  Requires-Dist: pydata-sphinx-theme>=0.14; extra == "docs"
51
- Requires-Dist: sphinx; extra == "docs"
52
- Requires-Dist: sphinx-autodoc-typehints; extra == "docs"
53
- Requires-Dist: sphinx-copybutton; extra == "docs"
54
- Requires-Dist: sphinx-design; extra == "docs"
55
- Requires-Dist: sphinxcontrib-bibtex; extra == "docs"
56
- Requires-Dist: pyarrow; extra == "docs"
51
+ Requires-Dist: sphinx>=7; extra == "docs"
52
+ Requires-Dist: sphinx-autodoc-typehints>=1.24.0; extra == "docs"
53
+ Requires-Dist: sphinx-copybutton>=0.5.2; extra == "docs"
54
+ Requires-Dist: sphinx-design>=0.5.0; extra == "docs"
55
+ Requires-Dist: sphinxcontrib-bibtex>=2.5.0; extra == "docs"
56
+ Requires-Dist: pyarrow>=12.0.0; extra == "docs"
57
57
  Dynamic: license-file
58
58
 
59
59
  [![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg)](CODE_OF_CONDUCT.md)
@@ -0,0 +1,36 @@
1
+ dask>=2022.1.0
2
+ essreduce>=26.6.0
3
+ graphviz>=0.20
4
+ numpy>=2
5
+ plopp>=26.2.0
6
+ pythreejs>=2.4.1
7
+ sciline>=25.04.1
8
+ scipp>=25.11.0
9
+ scippneutron>=26.3.0
10
+ scippnexus>=23.12.0
11
+ tof>=25.12.0
12
+ ncrystal[cif]>=4.1.0
13
+ spglib!=2.7,>=2.0.0
14
+
15
+ [docs]
16
+ autodoc-pydantic>=2.0.0
17
+ ipykernel>=6.20.0
18
+ ipympl>=0.9.0
19
+ ipython!=8.7.0,>=8.8.0
20
+ myst-parser>=2.0.0
21
+ nbsphinx>=0.9.3
22
+ pandas>=2.1.2
23
+ pooch>=1.5
24
+ pydata-sphinx-theme>=0.14
25
+ sphinx>=7
26
+ sphinx-autodoc-typehints>=1.24.0
27
+ sphinx-copybutton>=0.5.2
28
+ sphinx-design>=0.5.0
29
+ sphinxcontrib-bibtex>=2.5.0
30
+ pyarrow>=12.0.0
31
+
32
+ [test]
33
+ pandas>=2.1.2
34
+ pooch>=1.5
35
+ pytest>=7.0
36
+ ipywidgets>=8.1.7
@@ -28,7 +28,6 @@ from ess.powder.types import (
28
28
  IntensityDspacingTwoTheta,
29
29
  IntensityTof,
30
30
  KeepEvents,
31
- LookupTable,
32
31
  LookupTableFilename,
33
32
  MonitorFilename,
34
33
  NeXusDetectorName,
@@ -42,10 +41,14 @@ from ess.powder.types import (
42
41
  WavelengthMask,
43
42
  )
44
43
  from scippneutron import metadata
44
+ from scippnexus import NXsource
45
45
 
46
46
  from ess.reduce import unwrap
47
47
  from ess.reduce import workflow as reduce_workflow
48
- from ess.reduce.nexus.types import AnyRun
48
+ from ess.reduce.nexus.types import AnyRun, Position
49
+
50
+ PARAMETRIZATION = ("detector_name", ["mantle", "endcap_backward", "endcap_forward"])
51
+
49
52
 
50
53
  params = {
51
54
  Filename[SampleRun]: dream.data.simulated_diamond_sample(small=True),
@@ -55,6 +58,7 @@ params = {
55
58
  MonitorFilename[VanadiumRun]: dream.data.simulated_monitor_vanadium_sample(),
56
59
  MonitorFilename[EmptyCanRun]: dream.data.simulated_monitor_empty_can(),
57
60
  dream.InstrumentConfiguration: dream.beamline.InstrumentConfiguration.high_flux_BC215, # noqa: E501
61
+ Position[NXsource, AnyRun]: sc.vector(value=[0, 0, -76.55], unit="m"),
58
62
  CalibrationFilename: None,
59
63
  UncertaintyBroadcastMode: UncertaintyBroadcastMode.drop,
60
64
  DspacingBins: sc.linspace('dspacing', 0.0, 2.3434, 201, unit='angstrom'),
@@ -74,32 +78,32 @@ params = {
74
78
  }
75
79
 
76
80
 
77
- @pytest.fixture(params=["mantle", "endcap_backward", "endcap_forward"])
78
- def params_for_det(request):
79
- # Not available in simulated data
80
- return {**params, NeXusDetectorName: request.param}
81
-
82
-
83
- @pytest.fixture
84
- def workflow(params_for_det):
85
- return make_workflow(params_for_det, run_norm=powder.RunNormalization.proton_charge)
86
-
81
+ def _make_workflow(
82
+ detector_name,
83
+ run_norm=powder.RunNormalization.proton_charge,
84
+ wavelength_from="file",
85
+ ):
86
+ wf = dream.DreamGeant4Workflow(run_norm=run_norm, wavelength_from=wavelength_from)
87
+ wf[NeXusDetectorName] = detector_name
87
88
 
88
- def make_workflow(params_for_det, *, run_norm):
89
- wf = dream.DreamGeant4Workflow(run_norm=run_norm)
90
- for key, value in params_for_det.items():
89
+ for key, value in params.items():
91
90
  wf[key] = value
92
91
  return wf
93
92
 
94
93
 
95
- def test_pipeline_can_compute_dspacing_result(workflow):
96
- workflow = powder.with_pixel_mask_filenames(workflow, [])
94
+ @pytest.mark.parametrize(*PARAMETRIZATION)
95
+ def test_pipeline_can_compute_dspacing_result(detector_name):
96
+ workflow = powder.with_pixel_mask_filenames(
97
+ _make_workflow(detector_name=detector_name), []
98
+ )
97
99
  result = workflow.compute(EmptyCanSubtractedIofDspacing)
98
100
  assert result.sizes == {'dspacing': len(params[DspacingBins]) - 1}
99
101
  assert sc.identical(result.coords['dspacing'], params[DspacingBins])
100
102
 
101
103
 
102
- def test_pipeline_can_compute_dspacing_result_without_empty_can(workflow):
104
+ @pytest.mark.parametrize(*PARAMETRIZATION)
105
+ def test_pipeline_can_compute_dspacing_result_without_empty_can(detector_name):
106
+ workflow = _make_workflow(detector_name=detector_name)
103
107
  workflow[Filename[EmptyCanRun]] = None
104
108
  workflow[MonitorFilename[EmptyCanRun]] = None
105
109
  workflow = powder.with_pixel_mask_filenames(workflow, [])
@@ -108,66 +112,39 @@ def test_pipeline_can_compute_dspacing_result_without_empty_can(workflow):
108
112
  assert sc.identical(result.coords['dspacing'], params[DspacingBins])
109
113
 
110
114
 
111
- def test_pipeline_can_compute_dspacing_result_using_lookup_table_filename(workflow):
112
- workflow = powder.with_pixel_mask_filenames(workflow, [])
113
- workflow[LookupTableFilename] = dream.data.lookup_table_high_flux()
114
- result = workflow.compute(EmptyCanSubtractedIofDspacing)
115
- assert result.sizes == {'dspacing': len(params[DspacingBins]) - 1}
116
- assert sc.identical(result.coords['dspacing'], params[DspacingBins])
117
-
118
-
119
- @pytest.fixture(scope="module")
120
- def dream_lookup_table():
121
- lut_wf = unwrap.LookupTableWorkflow()
122
- lut_wf[unwrap.DiskChoppers[AnyRun]] = dream.beamline.choppers(
123
- dream.beamline.InstrumentConfiguration.high_flux_BC215
124
- )
125
- lut_wf[unwrap.SourcePosition] = sc.vector(value=[0, 0, -76.55], unit="m")
126
- lut_wf[unwrap.NumberOfSimulatedNeutrons] = 500_000
127
- lut_wf[unwrap.SimulationSeed] = 555
128
- lut_wf[unwrap.PulseStride] = 1
129
- lut_wf[unwrap.LtotalRange] = (
130
- sc.scalar(60.0, unit="m"),
131
- sc.scalar(80.0, unit="m"),
132
- )
133
- lut_wf[unwrap.DistanceResolution] = sc.scalar(0.1, unit="m")
134
- lut_wf[unwrap.TimeResolution] = sc.scalar(250.0, unit='us')
135
- return lut_wf.compute(unwrap.LookupTable)
136
-
137
-
138
- def test_pipeline_can_compute_dspacing_result_using_custom_built_tof_lookup(
139
- workflow, dream_lookup_table
115
+ @pytest.mark.parametrize(*PARAMETRIZATION)
116
+ @pytest.mark.parametrize("lut_mode", ["file", "simulation", "analytical"])
117
+ def test_pipeline_can_compute_dspacing_result_different_lookup_tables(
118
+ detector_name,
119
+ lut_mode,
140
120
  ):
141
- workflow = powder.with_pixel_mask_filenames(workflow, [])
142
- workflow[LookupTable] = dream_lookup_table
121
+ workflow = _make_workflow(detector_name=detector_name, wavelength_from=lut_mode)
122
+
123
+ if lut_mode == "file":
124
+ workflow[LookupTableFilename] = dream.data.lookup_table_high_flux()
125
+ else:
126
+ workflow[unwrap.DiskChoppers] = dream.beamline.choppers(
127
+ dream.beamline.InstrumentConfiguration.high_flux_BC215
128
+ )
129
+ workflow[unwrap.DistanceResolution] = sc.scalar(0.1, unit="m")
130
+ workflow[unwrap.TimeResolution] = sc.scalar(250.0, unit='us')
131
+ if lut_mode == "simulation":
132
+ workflow[unwrap.NumberOfSimulatedNeutrons] = 200_000
133
+ workflow[unwrap.SimulationSeed] = 555
143
134
 
144
- result = workflow.compute(IntensityDspacing[SampleRun])
145
- assert result.sizes == {'dspacing': len(params[DspacingBins]) - 1}
146
- assert sc.identical(result.coords['dspacing'], params[DspacingBins])
147
-
148
-
149
- @pytest.mark.parametrize("keep_events", [True, False])
150
- def test_pipeline_can_compute_dspacing_result_with_hist_monitor_norm(
151
- params_for_det, keep_events: bool
152
- ):
153
- workflow = make_workflow(
154
- params_for_det, run_norm=powder.RunNormalization.monitor_histogram
155
- )
156
- workflow[KeepEvents[SampleRun]] = KeepEvents[SampleRun](keep_events)
157
- workflow[KeepEvents[VanadiumRun]] = KeepEvents[VanadiumRun](keep_events)
158
135
  workflow = powder.with_pixel_mask_filenames(workflow, [])
159
- result = workflow.compute(IntensityDspacing[SampleRun])
136
+ result = workflow.compute(EmptyCanSubtractedIofDspacing)
160
137
  assert result.sizes == {'dspacing': len(params[DspacingBins]) - 1}
161
138
  assert sc.identical(result.coords['dspacing'], params[DspacingBins])
162
139
 
163
140
 
141
+ @pytest.mark.parametrize(*PARAMETRIZATION)
164
142
  @pytest.mark.parametrize("keep_events", [True, False])
165
- def test_pipeline_can_compute_dspacing_result_with_integrated_monitor_norm(
166
- params_for_det, keep_events: bool
143
+ @pytest.mark.parametrize("norm", ["monitor_histogram", "monitor_integrated"])
144
+ def test_pipeline_can_compute_dspacing_result_with_different_norm(
145
+ detector_name, keep_events: bool, norm: str
167
146
  ):
168
- workflow = make_workflow(
169
- params_for_det, run_norm=powder.RunNormalization.monitor_integrated
170
- )
147
+ workflow = _make_workflow(detector_name=detector_name, run_norm=norm)
171
148
  workflow[KeepEvents[SampleRun]] = KeepEvents[SampleRun](keep_events)
172
149
  workflow[KeepEvents[VanadiumRun]] = KeepEvents[VanadiumRun](keep_events)
173
150
  workflow = powder.with_pixel_mask_filenames(workflow, [])
@@ -176,13 +153,13 @@ def test_pipeline_can_compute_dspacing_result_with_integrated_monitor_norm(
176
153
  assert sc.identical(result.coords['dspacing'], params[DspacingBins])
177
154
 
178
155
 
179
- def test_pipeline_normalizes_and_subtracts_empty_can_as_expected(
180
- workflow: sciline.Pipeline,
181
- ) -> None:
156
+ @pytest.mark.parametrize(*PARAMETRIZATION)
157
+ def test_pipeline_normalizes_and_subtracts_empty_can_as_expected(detector_name) -> None:
182
158
  sample = sc.data.binned_x(13, 3)
183
159
  vanadium = sc.data.binned_x(16, 3)
184
160
  empty_can = sc.data.binned_x(9, 3)
185
161
 
162
+ workflow = _make_workflow(detector_name=detector_name)
186
163
  workflow[FocussedDataDspacing[SampleRun]] = sample
187
164
  workflow[FocussedDataDspacing[VanadiumRun]] = vanadium
188
165
  workflow[FocussedDataDspacing[EmptyCanRun]] = empty_can
@@ -199,8 +176,11 @@ def test_pipeline_normalizes_and_subtracts_empty_can_as_expected(
199
176
  sc.testing.assert_allclose(result, expected)
200
177
 
201
178
 
202
- def test_workflow_is_deterministic(workflow):
203
- workflow = powder.with_pixel_mask_filenames(workflow, [])
179
+ @pytest.mark.parametrize(*PARAMETRIZATION)
180
+ def test_workflow_is_deterministic(detector_name):
181
+ workflow = powder.with_pixel_mask_filenames(
182
+ _make_workflow(detector_name=detector_name), []
183
+ )
204
184
  # This is Sciline's default scheduler, but we want to be explicit here
205
185
  scheduler = sciline.scheduler.DaskScheduler()
206
186
  graph = workflow.get(IntensityTof, scheduler=scheduler)
@@ -209,8 +189,11 @@ def test_workflow_is_deterministic(workflow):
209
189
  assert sc.identical(sc.values(result), sc.values(reference))
210
190
 
211
191
 
212
- def test_pipeline_can_compute_intermediate_results(workflow):
213
- workflow = powder.with_pixel_mask_filenames(workflow, [])
192
+ @pytest.mark.parametrize(*PARAMETRIZATION)
193
+ def test_pipeline_can_compute_intermediate_results(detector_name):
194
+ workflow = powder.with_pixel_mask_filenames(
195
+ _make_workflow(detector_name=detector_name), []
196
+ )
214
197
  results = workflow.compute((CorrectedDetector[SampleRun], NeXusDetectorName))
215
198
  result = results[CorrectedDetector[SampleRun]]
216
199
 
@@ -222,10 +205,12 @@ def test_pipeline_can_compute_intermediate_results(workflow):
222
205
  assert expected_dims.issubset(set(result.dims))
223
206
 
224
207
 
225
- def test_pipeline_group_by_two_theta(workflow):
208
+ @pytest.mark.parametrize(*PARAMETRIZATION)
209
+ def test_pipeline_group_by_two_theta(detector_name):
226
210
  two_theta_bins = sc.linspace(
227
211
  dim='two_theta', unit='rad', start=0.8, stop=2.4, num=17
228
212
  )
213
+ workflow = _make_workflow(detector_name=detector_name)
229
214
  workflow[TwoThetaBins] = two_theta_bins
230
215
  workflow = powder.with_pixel_mask_filenames(workflow, [])
231
216
  result = workflow.compute(IntensityDspacingTwoTheta[SampleRun])
@@ -235,7 +220,9 @@ def test_pipeline_group_by_two_theta(workflow):
235
220
  assert sc.allclose(result.coords['two_theta'], two_theta_bins)
236
221
 
237
222
 
238
- def test_pipeline_wavelength_masking(workflow):
223
+ @pytest.mark.parametrize(*PARAMETRIZATION)
224
+ def test_pipeline_wavelength_masking(detector_name):
225
+ workflow = _make_workflow(detector_name=detector_name)
239
226
  wmin = sc.scalar(0.18, unit="angstrom")
240
227
  wmax = sc.scalar(0.21, unit="angstrom")
241
228
  workflow[WavelengthMask] = lambda x: (x > wmin) & (x < wmax)
@@ -253,7 +240,9 @@ def test_pipeline_wavelength_masking(workflow):
253
240
  )
254
241
 
255
242
 
256
- def test_pipeline_two_theta_masking(workflow):
243
+ @pytest.mark.parametrize(*PARAMETRIZATION)
244
+ def test_pipeline_two_theta_masking(detector_name):
245
+ workflow = _make_workflow(detector_name=detector_name)
257
246
  tmin = sc.scalar(1.0, unit="rad")
258
247
  tmax = sc.scalar(1.2, unit="rad")
259
248
  workflow[TwoThetaMask] = lambda x: (x > tmin) & (x < tmax)
@@ -269,8 +258,11 @@ def test_pipeline_two_theta_masking(workflow):
269
258
  )
270
259
 
271
260
 
272
- def test_pipeline_can_save_data(workflow):
273
- workflow = powder.with_pixel_mask_filenames(workflow, [])
261
+ @pytest.mark.parametrize(*PARAMETRIZATION)
262
+ def test_pipeline_can_save_data(detector_name):
263
+ workflow = powder.with_pixel_mask_filenames(
264
+ _make_workflow(detector_name=detector_name), []
265
+ )
274
266
  result = workflow.compute(ReducedTofCIF)
275
267
 
276
268
  buffer = io.StringIO()
@@ -293,9 +285,8 @@ def test_pipeline_save_data_to_disk(output_folder: Path):
293
285
  to have enough signal: we thus use the large files instead of small, and use the
294
286
  mantle detector bank.
295
287
  """
296
- wf = make_workflow(
297
- {**params, NeXusDetectorName: "mantle"},
298
- run_norm=powder.RunNormalization.proton_charge,
288
+ wf = _make_workflow(
289
+ detector_name="mantle", run_norm=powder.RunNormalization.proton_charge
299
290
  )
300
291
 
301
292
  wf[Filename[SampleRun]] = dream.data.simulated_diamond_sample(small=False)
@@ -1,36 +0,0 @@
1
- dask>=2022.1.0
2
- essreduce>=26.4.0
3
- graphviz
4
- numpy>=2
5
- plopp>=26.2.0
6
- pythreejs>=2.4.1
7
- sciline>=25.04.1
8
- scipp>=25.11.0
9
- scippneutron>=26.3.0
10
- scippnexus>=23.12.0
11
- tof>=25.12.0
12
- ncrystal[cif]>=4.1.0
13
- spglib!=2.7
14
-
15
- [docs]
16
- autodoc-pydantic
17
- ipykernel
18
- ipympl
19
- ipython!=8.7.0
20
- myst-parser
21
- nbsphinx
22
- pandas
23
- pooch
24
- pydata-sphinx-theme>=0.14
25
- sphinx
26
- sphinx-autodoc-typehints
27
- sphinx-copybutton
28
- sphinx-design
29
- sphinxcontrib-bibtex
30
- pyarrow
31
-
32
- [test]
33
- pandas>=2.1.2
34
- pooch>=1.5
35
- pytest>=7.0
36
- ipywidgets>=8.1.7
File without changes