dkist 1.9.2__tar.gz → 1.10.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 (235) hide show
  1. {dkist-1.9.2 → dkist-1.10.0}/.circleci/config.yml +6 -6
  2. {dkist-1.9.2 → dkist-1.10.0}/.cruft.json +2 -2
  3. {dkist-1.9.2 → dkist-1.10.0}/.github/workflows/main.yml +9 -9
  4. {dkist-1.9.2 → dkist-1.10.0}/.pre-commit-config.yaml +3 -3
  5. {dkist-1.9.2 → dkist-1.10.0}/.rtd-environment.yml +1 -1
  6. {dkist-1.9.2 → dkist-1.10.0}/CHANGELOG.rst +44 -2
  7. {dkist-1.9.2/dkist.egg-info → dkist-1.10.0}/PKG-INFO +19 -19
  8. {dkist-1.9.2 → dkist-1.10.0}/dkist/_version.py +2 -2
  9. {dkist-1.9.2 → dkist-1.10.0}/dkist/conftest.py +6 -4
  10. {dkist-1.9.2 → dkist-1.10.0}/dkist/data/api_search_values.json +1 -1
  11. {dkist-1.9.2 → dkist-1.10.0}/dkist/dataset/loader.py +3 -10
  12. {dkist-1.9.2 → dkist-1.10.0}/dkist/dataset/tests/test_crop_dataset.py +27 -19
  13. {dkist-1.9.2 → dkist-1.10.0}/dkist/dataset/tests/test_tiled_dataset.py +83 -4
  14. {dkist-1.9.2 → dkist-1.10.0}/dkist/dataset/tiled_dataset.py +95 -31
  15. {dkist-1.9.2 → dkist-1.10.0}/dkist/io/asdf/converters/dataset.py +6 -1
  16. dkist-1.10.0/dkist/io/asdf/converters/tiled_dataset.py +32 -0
  17. {dkist-1.9.2 → dkist-1.10.0}/dkist/io/asdf/entry_points.py +2 -0
  18. dkist-1.10.0/dkist/io/asdf/resources/manifests/dkist-1.3.0.yaml +14 -0
  19. dkist-1.10.0/dkist/io/asdf/resources/schemas/tiled_dataset-1.1.0.yaml +38 -0
  20. {dkist-1.9.2 → dkist-1.10.0}/dkist/io/asdf/tests/test_dataset.py +2 -1
  21. {dkist-1.9.2 → dkist-1.10.0}/dkist/io/level_1_dataset_schema.yaml +1 -0
  22. {dkist-1.9.2 → dkist-1.10.0}/dkist/io/loaders.py +13 -13
  23. {dkist-1.9.2 → dkist-1.10.0}/dkist/net/tests/strategies.py +1 -1
  24. {dkist-1.9.2 → dkist-1.10.0}/dkist/tests/figure_hashes_mpl_391_ft_261_astropy_611_animators_111_ndcube_222.json +6 -2
  25. {dkist-1.9.2 → dkist-1.10.0}/dkist/tests/figure_hashes_mpl_dev_ft_261_astropy_dev_animators_dev_ndcube_dev.json +6 -2
  26. {dkist-1.9.2 → dkist-1.10.0/dkist.egg-info}/PKG-INFO +19 -19
  27. {dkist-1.9.2 → dkist-1.10.0}/dkist.egg-info/SOURCES.txt +8 -2
  28. {dkist-1.9.2 → dkist-1.10.0}/dkist.egg-info/requires.txt +17 -17
  29. dkist-1.10.0/docs/examples/index.rst +11 -0
  30. {dkist-1.9.2/docs/howto_guides → dkist-1.10.0/docs/examples}/reproject_vbi_mosaic.md +17 -43
  31. dkist-1.10.0/docs/howto_guides/index.rst +13 -0
  32. dkist-1.10.0/docs/howto_guides/sample_data.rst +43 -0
  33. {dkist-1.9.2 → dkist-1.10.0}/docs/index.rst +13 -3
  34. dkist-1.10.0/docs/whatsnew/1.10.rst +43 -0
  35. {dkist-1.9.2 → dkist-1.10.0}/docs/whatsnew/index.rst +1 -0
  36. {dkist-1.9.2 → dkist-1.10.0}/pyproject.toml +20 -20
  37. {dkist-1.9.2 → dkist-1.10.0}/pytest.ini +4 -24
  38. dkist-1.10.0/tools/update_sample_data.py +102 -0
  39. {dkist-1.9.2 → dkist-1.10.0}/tox.ini +7 -6
  40. dkist-1.9.2/dkist/io/asdf/converters/tiled_dataset.py +0 -20
  41. dkist-1.9.2/docs/howto_guides/index.rst +0 -11
  42. {dkist-1.9.2 → dkist-1.10.0}/.circleci/codecov_upload.sh +0 -0
  43. {dkist-1.9.2 → dkist-1.10.0}/.circleci/early_exit.sh +0 -0
  44. {dkist-1.9.2 → dkist-1.10.0}/.codecov.yaml +0 -0
  45. {dkist-1.9.2 → dkist-1.10.0}/.codespell-dict.txt +0 -0
  46. {dkist-1.9.2 → dkist-1.10.0}/.codespellrc +0 -0
  47. {dkist-1.9.2 → dkist-1.10.0}/.coveragerc +0 -0
  48. {dkist-1.9.2 → dkist-1.10.0}/.flake8 +0 -0
  49. {dkist-1.9.2 → dkist-1.10.0}/.github/ISSUE_TEMPLATE/BUG_REPORT.md +0 -0
  50. {dkist-1.9.2 → dkist-1.10.0}/.github/ISSUE_TEMPLATE/FEATURE_REQUEST.md +0 -0
  51. {dkist-1.9.2 → dkist-1.10.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  52. {dkist-1.9.2 → dkist-1.10.0}/.github/dependabot.yml +0 -0
  53. {dkist-1.9.2 → dkist-1.10.0}/.github/workflows/build_workshop.yml +0 -0
  54. {dkist-1.9.2 → dkist-1.10.0}/.github/workflows/codspeed.yml +0 -0
  55. {dkist-1.9.2 → dkist-1.10.0}/.github/workflows/prepare-release.yml +0 -0
  56. {dkist-1.9.2 → dkist-1.10.0}/.github/workflows/sub_package_update.yml +0 -0
  57. {dkist-1.9.2 → dkist-1.10.0}/.gitignore +0 -0
  58. {dkist-1.9.2 → dkist-1.10.0}/.gitmodules +0 -0
  59. {dkist-1.9.2 → dkist-1.10.0}/.isort.cfg +0 -0
  60. {dkist-1.9.2 → dkist-1.10.0}/.readthedocs.yaml +0 -0
  61. {dkist-1.9.2 → dkist-1.10.0}/.ruff.toml +0 -0
  62. {dkist-1.9.2 → dkist-1.10.0}/CODE_OF_CONDUCT.md +0 -0
  63. {dkist-1.9.2 → dkist-1.10.0}/CONTRIBUTING.md +0 -0
  64. {dkist-1.9.2 → dkist-1.10.0}/LICENSE.rst +0 -0
  65. {dkist-1.9.2 → dkist-1.10.0}/MANIFEST.in +0 -0
  66. {dkist-1.9.2 → dkist-1.10.0}/README.rst +0 -0
  67. {dkist-1.9.2 → dkist-1.10.0}/changelog/README.rst +0 -0
  68. {dkist-1.9.2 → dkist-1.10.0}/conftest.py +0 -0
  69. {dkist-1.9.2 → dkist-1.10.0}/dkist/__init__.py +0 -0
  70. {dkist-1.9.2 → dkist-1.10.0}/dkist/config/__init__.py +0 -0
  71. {dkist-1.9.2 → dkist-1.10.0}/dkist/data/README.rst +0 -0
  72. {dkist-1.9.2 → dkist-1.10.0}/dkist/data/VISP_HEADER.hdr +0 -0
  73. {dkist-1.9.2 → dkist-1.10.0}/dkist/data/__init__.py +0 -0
  74. {dkist-1.9.2 → dkist-1.10.0}/dkist/data/_sample.py +0 -0
  75. {dkist-1.9.2 → dkist-1.10.0}/dkist/data/sample.py +0 -0
  76. {dkist-1.9.2 → dkist-1.10.0}/dkist/data/test/5d_gwcs.asdf +0 -0
  77. {dkist-1.9.2 → dkist-1.10.0}/dkist/data/test/AGLKO-inv.ecsv +0 -0
  78. {dkist-1.9.2 → dkist-1.10.0}/dkist/data/test/EIT/efz20040301.000010_s.fits +0 -0
  79. {dkist-1.9.2 → dkist-1.10.0}/dkist/data/test/EIT/efz20040301.020010_s.fits +0 -0
  80. {dkist-1.9.2 → dkist-1.10.0}/dkist/data/test/EIT/efz20040301.030011_s.fits +0 -0
  81. {dkist-1.9.2 → dkist-1.10.0}/dkist/data/test/EIT/efz20040301.040010_s.fits +0 -0
  82. {dkist-1.9.2 → dkist-1.10.0}/dkist/data/test/EIT/efz20040301.050010_s.fits +0 -0
  83. {dkist-1.9.2 → dkist-1.10.0}/dkist/data/test/EIT/efz20040301.060010_s.fits +0 -0
  84. {dkist-1.9.2 → dkist-1.10.0}/dkist/data/test/EIT/efz20040301.080010_s.fits +0 -0
  85. {dkist-1.9.2 → dkist-1.10.0}/dkist/data/test/EIT/efz20040301.090010_s.fits +0 -0
  86. {dkist-1.9.2 → dkist-1.10.0}/dkist/data/test/EIT/efz20040301.100010_s.fits +0 -0
  87. {dkist-1.9.2 → dkist-1.10.0}/dkist/data/test/EIT/efz20040301.110010_s.fits +0 -0
  88. {dkist-1.9.2 → dkist-1.10.0}/dkist/data/test/EIT/efz20040301.120010_s.fits +0 -0
  89. {dkist-1.9.2 → dkist-1.10.0}/dkist/data/test/EIT/eit_test_dataset.asdf +0 -0
  90. {dkist-1.9.2 → dkist-1.10.0}/dkist/data/test/__init__.py +0 -0
  91. {dkist-1.9.2 → dkist-1.10.0}/dkist/data/test/croppable_cryo.asdf.gz +0 -0
  92. {dkist-1.9.2 → dkist-1.10.0}/dkist/data/test/croppable_visp.asdf.gz +0 -0
  93. {dkist-1.9.2 → dkist-1.10.0}/dkist/data/test/eit_dataset-0.1.0.asdf +0 -0
  94. {dkist-1.9.2 → dkist-1.10.0}/dkist/data/test/eit_dataset-0.2.0.asdf +0 -0
  95. {dkist-1.9.2 → dkist-1.10.0}/dkist/data/test/eit_dataset-0.3.0.asdf +0 -0
  96. {dkist-1.9.2 → dkist-1.10.0}/dkist/data/test/eit_dataset-1.0.0.asdf +0 -0
  97. {dkist-1.9.2 → dkist-1.10.0}/dkist/data/test/eit_dataset-1.1.0.asdf +0 -0
  98. {dkist-1.9.2 → dkist-1.10.0}/dkist/data/test/eit_dataset-1.2.0.asdf +0 -0
  99. {dkist-1.9.2 → dkist-1.10.0}/dkist/data/test/globus_operation_ls_response.json +0 -0
  100. {dkist-1.9.2 → dkist-1.10.0}/dkist/data/test/globus_search_response.json +0 -0
  101. {dkist-1.9.2 → dkist-1.10.0}/dkist/data/test/large_vbi.asdf.gz +0 -0
  102. {dkist-1.9.2 → dkist-1.10.0}/dkist/data/test/large_visp.asdf.gz +0 -0
  103. {dkist-1.9.2 → dkist-1.10.0}/dkist/data/test/small_visp/0.fits +0 -0
  104. {dkist-1.9.2 → dkist-1.10.0}/dkist/data/test/small_visp/1.fits +0 -0
  105. {dkist-1.9.2 → dkist-1.10.0}/dkist/data/test/small_visp/2.fits +0 -0
  106. {dkist-1.9.2 → dkist-1.10.0}/dkist/data/test/small_visp/test_visp.asdf +0 -0
  107. {dkist-1.9.2 → dkist-1.10.0}/dkist/data/test/test_old_wcs_BRMQY.asdf +0 -0
  108. {dkist-1.9.2 → dkist-1.10.0}/dkist/data/test/test_tiled_dataset-1.0.0_dataset-1.0.0.asdf +0 -0
  109. {dkist-1.9.2 → dkist-1.10.0}/dkist/data/test/test_tiled_dataset-1.0.0_dataset-1.1.0.asdf +0 -0
  110. {dkist-1.9.2 → dkist-1.10.0}/dkist/data/test/test_tiled_dataset-1.0.0_dataset-1.2.0.asdf +0 -0
  111. {dkist-1.9.2 → dkist-1.10.0}/dkist/data/test/visp_no_headers.asdf.gz +0 -0
  112. {dkist-1.9.2 → dkist-1.10.0}/dkist/data/tests/__init__.py +0 -0
  113. {dkist-1.9.2 → dkist-1.10.0}/dkist/data/tests/test_sample.py +0 -0
  114. {dkist-1.9.2 → dkist-1.10.0}/dkist/dataset/__init__.py +0 -0
  115. {dkist-1.9.2 → dkist-1.10.0}/dkist/dataset/dataset.py +0 -0
  116. {dkist-1.9.2 → dkist-1.10.0}/dkist/dataset/tests/__init__.py +0 -0
  117. {dkist-1.9.2 → dkist-1.10.0}/dkist/dataset/tests/test_dataset.py +0 -0
  118. {dkist-1.9.2 → dkist-1.10.0}/dkist/dataset/tests/test_load_dataset.py +0 -0
  119. {dkist-1.9.2 → dkist-1.10.0}/dkist/dataset/tests/test_plotting.py +0 -0
  120. {dkist-1.9.2 → dkist-1.10.0}/dkist/dataset/utils.py +0 -0
  121. {dkist-1.9.2 → dkist-1.10.0}/dkist/dkist.cfg +0 -0
  122. {dkist-1.9.2 → dkist-1.10.0}/dkist/extern/__init__.py +0 -0
  123. {dkist-1.9.2 → dkist-1.10.0}/dkist/io/__init__.py +0 -0
  124. {dkist-1.9.2 → dkist-1.10.0}/dkist/io/asdf/__init__.py +0 -0
  125. {dkist-1.9.2 → dkist-1.10.0}/dkist/io/asdf/converters/__init__.py +0 -0
  126. {dkist-1.9.2 → dkist-1.10.0}/dkist/io/asdf/converters/file_manager.py +0 -0
  127. {dkist-1.9.2 → dkist-1.10.0}/dkist/io/asdf/converters/models.py +0 -0
  128. {dkist-1.9.2 → dkist-1.10.0}/dkist/io/asdf/resources/__init__.py +0 -0
  129. {dkist-1.9.2 → dkist-1.10.0}/dkist/io/asdf/resources/manifests/dkist-0.9.0.yaml +0 -0
  130. {dkist-1.9.2 → dkist-1.10.0}/dkist/io/asdf/resources/manifests/dkist-1.0.0.yaml +0 -0
  131. {dkist-1.9.2 → dkist-1.10.0}/dkist/io/asdf/resources/manifests/dkist-1.1.0.yaml +0 -0
  132. {dkist-1.9.2 → dkist-1.10.0}/dkist/io/asdf/resources/manifests/dkist-1.2.0.yaml +0 -0
  133. {dkist-1.9.2 → dkist-1.10.0}/dkist/io/asdf/resources/manifests/dkist-wcs-1.0.0.yaml +0 -0
  134. {dkist-1.9.2 → dkist-1.10.0}/dkist/io/asdf/resources/manifests/dkist-wcs-1.1.0.yaml +0 -0
  135. {dkist-1.9.2 → dkist-1.10.0}/dkist/io/asdf/resources/manifests/dkist-wcs-1.2.0.yaml +0 -0
  136. {dkist-1.9.2 → dkist-1.10.0}/dkist/io/asdf/resources/manifests/dkist-wcs-1.3.0.yaml +0 -0
  137. {dkist-1.9.2 → dkist-1.10.0}/dkist/io/asdf/resources/schemas/asymmetric_mapping_model-1.0.0.yaml +0 -0
  138. {dkist-1.9.2 → dkist-1.10.0}/dkist/io/asdf/resources/schemas/asymmetric_mapping_model-1.1.0.yaml +0 -0
  139. {dkist-1.9.2 → dkist-1.10.0}/dkist/io/asdf/resources/schemas/coupled_compound_model-1.0.0.yaml +0 -0
  140. {dkist-1.9.2 → dkist-1.10.0}/dkist/io/asdf/resources/schemas/coupled_compound_model-1.1.0.yaml +0 -0
  141. {dkist-1.9.2 → dkist-1.10.0}/dkist/io/asdf/resources/schemas/dataset-0.1.0.yaml +0 -0
  142. {dkist-1.9.2 → dkist-1.10.0}/dkist/io/asdf/resources/schemas/dataset-0.2.0.yaml +0 -0
  143. {dkist-1.9.2 → dkist-1.10.0}/dkist/io/asdf/resources/schemas/dataset-0.3.0.yaml +0 -0
  144. {dkist-1.9.2 → dkist-1.10.0}/dkist/io/asdf/resources/schemas/dataset-1.0.0.yaml +0 -0
  145. {dkist-1.9.2 → dkist-1.10.0}/dkist/io/asdf/resources/schemas/dataset-1.1.0.yaml +0 -0
  146. {dkist-1.9.2 → dkist-1.10.0}/dkist/io/asdf/resources/schemas/file_manager-1.0.0.yaml +0 -0
  147. {dkist-1.9.2 → dkist-1.10.0}/dkist/io/asdf/resources/schemas/ravel_model-1.0.0.yaml +0 -0
  148. {dkist-1.9.2 → dkist-1.10.0}/dkist/io/asdf/resources/schemas/ravel_model-1.1.0.yaml +0 -0
  149. {dkist-1.9.2 → dkist-1.10.0}/dkist/io/asdf/resources/schemas/tiled_dataset-0.1.0.yaml +0 -0
  150. {dkist-1.9.2 → dkist-1.10.0}/dkist/io/asdf/resources/schemas/tiled_dataset-1.0.0.yaml +0 -0
  151. {dkist-1.9.2 → dkist-1.10.0}/dkist/io/asdf/resources/schemas/varying_celestial_transform-1.0.0.yaml +0 -0
  152. {dkist-1.9.2 → dkist-1.10.0}/dkist/io/asdf/resources/schemas/varying_celestial_transform-1.1.0.yaml +0 -0
  153. {dkist-1.9.2 → dkist-1.10.0}/dkist/io/asdf/tests/__init__.py +0 -0
  154. {dkist-1.9.2 → dkist-1.10.0}/dkist/io/asdf/tests/conftest.py +0 -0
  155. {dkist-1.9.2 → dkist-1.10.0}/dkist/io/asdf/tests/test_models.py +0 -0
  156. {dkist-1.9.2 → dkist-1.10.0}/dkist/io/asdf/tests/test_tiled_dataset.py +0 -0
  157. {dkist-1.9.2 → dkist-1.10.0}/dkist/io/dask_utils.py +0 -0
  158. {dkist-1.9.2 → dkist-1.10.0}/dkist/io/file_manager.py +0 -0
  159. {dkist-1.9.2 → dkist-1.10.0}/dkist/io/tests/__init__.py +0 -0
  160. {dkist-1.9.2 → dkist-1.10.0}/dkist/io/tests/test_file_manager.py +0 -0
  161. {dkist-1.9.2 → dkist-1.10.0}/dkist/io/tests/test_fits.py +0 -0
  162. {dkist-1.9.2 → dkist-1.10.0}/dkist/logger.py +0 -0
  163. {dkist-1.9.2 → dkist-1.10.0}/dkist/net/__init__.py +0 -0
  164. {dkist-1.9.2 → dkist-1.10.0}/dkist/net/attr_walker.py +0 -0
  165. {dkist-1.9.2 → dkist-1.10.0}/dkist/net/attrs.py +0 -0
  166. {dkist-1.9.2 → dkist-1.10.0}/dkist/net/attrs_values.py +0 -0
  167. {dkist-1.9.2 → dkist-1.10.0}/dkist/net/client.py +0 -0
  168. {dkist-1.9.2 → dkist-1.10.0}/dkist/net/globus/__init__.py +0 -0
  169. {dkist-1.9.2 → dkist-1.10.0}/dkist/net/globus/auth.py +0 -0
  170. {dkist-1.9.2 → dkist-1.10.0}/dkist/net/globus/endpoints.py +0 -0
  171. {dkist-1.9.2 → dkist-1.10.0}/dkist/net/globus/tests/__init__.py +0 -0
  172. {dkist-1.9.2 → dkist-1.10.0}/dkist/net/globus/tests/conftest.py +0 -0
  173. {dkist-1.9.2 → dkist-1.10.0}/dkist/net/globus/tests/test_auth.py +0 -0
  174. {dkist-1.9.2 → dkist-1.10.0}/dkist/net/globus/tests/test_endpoints.py +0 -0
  175. {dkist-1.9.2 → dkist-1.10.0}/dkist/net/globus/tests/test_transfer.py +0 -0
  176. {dkist-1.9.2 → dkist-1.10.0}/dkist/net/globus/transfer.py +0 -0
  177. {dkist-1.9.2 → dkist-1.10.0}/dkist/net/helpers.py +0 -0
  178. {dkist-1.9.2 → dkist-1.10.0}/dkist/net/tests/__init__.py +0 -0
  179. {dkist-1.9.2 → dkist-1.10.0}/dkist/net/tests/conftest.py +0 -0
  180. {dkist-1.9.2 → dkist-1.10.0}/dkist/net/tests/test_attr_walker.py +0 -0
  181. {dkist-1.9.2 → dkist-1.10.0}/dkist/net/tests/test_attrs.py +0 -0
  182. {dkist-1.9.2 → dkist-1.10.0}/dkist/net/tests/test_attrs_values.py +0 -0
  183. {dkist-1.9.2 → dkist-1.10.0}/dkist/net/tests/test_client.py +0 -0
  184. {dkist-1.9.2 → dkist-1.10.0}/dkist/net/tests/test_helpers.py +0 -0
  185. {dkist-1.9.2 → dkist-1.10.0}/dkist/tests/__init__.py +0 -0
  186. {dkist-1.9.2 → dkist-1.10.0}/dkist/tests/generate_aia_dataset.py +0 -0
  187. {dkist-1.9.2 → dkist-1.10.0}/dkist/tests/generate_eit_test_dataset.py +0 -0
  188. {dkist-1.9.2 → dkist-1.10.0}/dkist/tests/generate_eit_tiled_dataset.py +0 -0
  189. {dkist-1.9.2 → dkist-1.10.0}/dkist/tests/helpers.py +0 -0
  190. {dkist-1.9.2 → dkist-1.10.0}/dkist/tests/test_benchmarks.py +0 -0
  191. {dkist-1.9.2 → dkist-1.10.0}/dkist/tests/test_logger.py +0 -0
  192. {dkist-1.9.2 → dkist-1.10.0}/dkist/utils/__init__.py +0 -0
  193. {dkist-1.9.2 → dkist-1.10.0}/dkist/utils/_model_to_graphviz.py +0 -0
  194. {dkist-1.9.2 → dkist-1.10.0}/dkist/utils/decorators.py +0 -0
  195. {dkist-1.9.2 → dkist-1.10.0}/dkist/utils/exceptions.py +0 -0
  196. {dkist-1.9.2 → dkist-1.10.0}/dkist/utils/inventory.py +0 -0
  197. {dkist-1.9.2 → dkist-1.10.0}/dkist/utils/sysinfo.py +0 -0
  198. {dkist-1.9.2 → dkist-1.10.0}/dkist/utils/tests/__init__.py +0 -0
  199. {dkist-1.9.2 → dkist-1.10.0}/dkist/utils/tests/test_inventory.py +0 -0
  200. {dkist-1.9.2 → dkist-1.10.0}/dkist/utils/tests/test_sysinfo.py +0 -0
  201. {dkist-1.9.2 → dkist-1.10.0}/dkist/version.py +0 -0
  202. {dkist-1.9.2 → dkist-1.10.0}/dkist/wcs/__init__.py +0 -0
  203. {dkist-1.9.2 → dkist-1.10.0}/dkist/wcs/models.py +0 -0
  204. {dkist-1.9.2 → dkist-1.10.0}/dkist/wcs/tests/__init__.py +0 -0
  205. {dkist-1.9.2 → dkist-1.10.0}/dkist/wcs/tests/test_coupled_compound_model.py +0 -0
  206. {dkist-1.9.2 → dkist-1.10.0}/dkist/wcs/tests/test_models.py +0 -0
  207. {dkist-1.9.2 → dkist-1.10.0}/dkist.egg-info/dependency_links.txt +0 -0
  208. {dkist-1.9.2 → dkist-1.10.0}/dkist.egg-info/entry_points.txt +0 -0
  209. {dkist-1.9.2 → dkist-1.10.0}/dkist.egg-info/not-zip-safe +0 -0
  210. {dkist-1.9.2 → dkist-1.10.0}/dkist.egg-info/top_level.txt +0 -0
  211. {dkist-1.9.2 → dkist-1.10.0}/docs/Makefile +0 -0
  212. {dkist-1.9.2 → dkist-1.10.0}/docs/conf.py +0 -0
  213. {dkist-1.9.2 → dkist-1.10.0}/docs/developer.rst +0 -0
  214. {dkist-1.9.2 → dkist-1.10.0}/docs/installation.rst +0 -0
  215. {dkist-1.9.2 → dkist-1.10.0}/docs/logo/icon_square.jpg +0 -0
  216. {dkist-1.9.2 → dkist-1.10.0}/docs/make.bat +0 -0
  217. {dkist-1.9.2 → dkist-1.10.0}/docs/reference.rst +0 -0
  218. {dkist-1.9.2 → dkist-1.10.0}/docs/topic_guides/index.rst +0 -0
  219. {dkist-1.9.2 → dkist-1.10.0}/docs/topic_guides/level1data.rst +0 -0
  220. {dkist-1.9.2 → dkist-1.10.0}/docs/topic_guides/loading.rst +0 -0
  221. {dkist-1.9.2 → dkist-1.10.0}/docs/topic_guides/net.rst +0 -0
  222. {dkist-1.9.2 → dkist-1.10.0}/docs/topic_guides/usertools.rst +0 -0
  223. {dkist-1.9.2 → dkist-1.10.0}/docs/tutorial/1_astropy_and_sunpy.md +0 -0
  224. {dkist-1.9.2 → dkist-1.10.0}/docs/tutorial/2_search_and_asdf_download.md +0 -0
  225. {dkist-1.9.2 → dkist-1.10.0}/docs/tutorial/3_the_dataset.md +0 -0
  226. {dkist-1.9.2 → dkist-1.10.0}/docs/tutorial/4_more_dataset.md +0 -0
  227. {dkist-1.9.2 → dkist-1.10.0}/docs/tutorial/5_downloading_data.md +0 -0
  228. {dkist-1.9.2 → dkist-1.10.0}/docs/tutorial/6_visualization.md +0 -0
  229. {dkist-1.9.2 → dkist-1.10.0}/docs/tutorial/index.md +0 -0
  230. {dkist-1.9.2 → dkist-1.10.0}/docs/whatsnew/1.0.rst +0 -0
  231. {dkist-1.9.2 → dkist-1.10.0}/docs/whatsnew/1.1.rst +0 -0
  232. {dkist-1.9.2 → dkist-1.10.0}/docs/whatsnew/changelog.rst +0 -0
  233. {dkist-1.9.2 → dkist-1.10.0}/setup.cfg +0 -0
  234. {dkist-1.9.2 → dkist-1.10.0}/setup.py +0 -0
  235. {dkist-1.9.2 → dkist-1.10.0}/tools/build_workshop_materials.py +0 -0
@@ -32,7 +32,7 @@ jobs:
32
32
  jobname:
33
33
  type: string
34
34
  docker:
35
- - image: cimg/python:3.12
35
+ - image: cimg/python:3.13
36
36
  environment:
37
37
  TOXENV=<< parameters.jobname >>
38
38
  steps:
@@ -54,7 +54,7 @@ jobs:
54
54
  jobname:
55
55
  type: string
56
56
  docker:
57
- - image: cimg/python:3.12
57
+ - image: cimg/python:3.13
58
58
  environment:
59
59
  TOXENV: << parameters.jobname >>
60
60
  GIT_SSH_COMMAND: ssh -i ~/.ssh/id_rsa_7b8fc81c13a3b446ec9aa50d3f626978
@@ -96,16 +96,16 @@ workflows:
96
96
  matrix:
97
97
  parameters:
98
98
  jobname:
99
- - "py312-figure"
100
- - "py312-figure-devdeps"
99
+ - "py313-figure"
100
+ - "py313-figure-devdeps"
101
101
 
102
102
  - deploy-reference-images:
103
103
  name: baseline-<< matrix.jobname >>
104
104
  matrix:
105
105
  parameters:
106
106
  jobname:
107
- - "py312-figure"
108
- - "py312-figure-devdeps"
107
+ - "py313-figure"
108
+ - "py313-figure-devdeps"
109
109
  requires:
110
110
  - << matrix.jobname >>
111
111
  filters:
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "template": "https://github.com/sunpy/package-template",
3
- "commit": "d6b86e07efa31959f43e99ba32d323cf76736a05",
3
+ "commit": "29db3569a215e43fa8c5114d3dbcb98b6a9caac0",
4
4
  "checkout": null,
5
5
  "context": {
6
6
  "cookiecutter": {
@@ -32,7 +32,7 @@
32
32
  ".github/workflows/sub_package_update.yml"
33
33
  ],
34
34
  "_template": "https://github.com/sunpy/package-template",
35
- "_commit": "d6b86e07efa31959f43e99ba32d323cf76736a05"
35
+ "_commit": "29db3569a215e43fa8c5114d3dbcb98b6a9caac0"
36
36
  }
37
37
  },
38
38
  "directory": null
@@ -33,22 +33,22 @@ jobs:
33
33
  tests:
34
34
  uses: OpenAstronomy/github-actions-workflows/.github/workflows/tox.yml@main
35
35
  with:
36
- default_python: '3.10'
36
+ default_python: '3.13'
37
37
  coverage: 'codecov'
38
38
  posargs: '--color=yes'
39
39
  envs: |
40
+ - linux: py313
40
41
  - linux: py312
41
- - linux: py311
42
- - windows: py311-online
43
- - macos: py310
44
- - linux: py310-oldestdeps
42
+ - windows: py312-online
43
+ - macos: py311
44
+ - linux: py311-oldestdeps
45
45
  secrets:
46
46
  CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
47
47
 
48
48
  docs:
49
49
  uses: OpenAstronomy/github-actions-workflows/.github/workflows/tox.yml@main
50
50
  with:
51
- default_python: '3.10'
51
+ default_python: '3.12'
52
52
  coverage: 'codecov'
53
53
  envs: |
54
54
  - linux: build_docs-notebooks
@@ -65,7 +65,7 @@ jobs:
65
65
  - uses: actions/checkout@v4
66
66
  - uses: actions/setup-python@v5
67
67
  with:
68
- python-version: '3.10'
68
+ python-version: '3.13'
69
69
  - run: python -m pip install -U --user build
70
70
  - run: python -m build . --sdist
71
71
  - run: python -m pip install -U --user twine
@@ -77,7 +77,7 @@ jobs:
77
77
  coverage: 'codecov'
78
78
  posargs: '--color=yes'
79
79
  envs: |
80
- - linux: py311-devdeps
80
+ - linux: py313-devdeps
81
81
  secrets:
82
82
  CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
83
83
 
@@ -90,7 +90,7 @@ jobs:
90
90
  )
91
91
  uses: OpenAstronomy/github-actions-workflows/.github/workflows/publish_pure_python.yml@main
92
92
  with:
93
- python-version: '3.10'
93
+ python-version: '3.13'
94
94
  test_extras: tests
95
95
  test_command: pytest --pyargs dkist -k "not test_fail"
96
96
  # We have to work around a github runner bug here: https://github.com/actions/runner/issues/2788#issuecomment-2145922705
@@ -1,12 +1,12 @@
1
1
  repos:
2
2
  # This should be before any formatting hooks like isort
3
3
  - repo: https://github.com/astral-sh/ruff-pre-commit
4
- rev: "v0.8.6"
4
+ rev: "v0.9.4"
5
5
  hooks:
6
6
  - id: ruff
7
7
  args: ["--fix"]
8
8
  - repo: https://github.com/PyCQA/isort
9
- rev: 5.13.2
9
+ rev: 6.0.0
10
10
  hooks:
11
11
  - id: isort
12
12
  exclude: ".*(.fits|.fts|.fit|.header|.txt|tca.*|extern.*|dkist/extern)$"
@@ -26,7 +26,7 @@ repos:
26
26
  - id: mixed-line-ending
27
27
  exclude: ".*(.fits|.fts|.fit|.header|.txt|tca.*|.asdf|.json|.hdr)$"
28
28
  - repo: https://github.com/codespell-project/codespell
29
- rev: v2.3.0
29
+ rev: v2.4.1
30
30
  hooks:
31
31
  - id: codespell
32
32
  args: [ "--write-changes", "-D", "-", "-D", ".codespell-dict.txt"]
@@ -2,6 +2,6 @@ name: dkist
2
2
  channels:
3
3
  - conda-forge
4
4
  dependencies:
5
- - python=3.12
5
+ - python=3.13
6
6
  - pip
7
7
  - graphviz!=2.42.*,!=2.43.*
@@ -1,5 +1,39 @@
1
- 1.9.2 (2025-01-29)
2
- ==================
1
+ 1.10.0 (2025-02-07)
2
+ ===================
3
+
4
+ Backwards Incompatible Changes
5
+ ------------------------------
6
+
7
+ - This release of ``dkist`` includes both scheduled bumps to our dependencies as well as a special bump of gwcs to version 0.24, and associated dependencies.
8
+ The version upgrade to gwcs 0.24 fixes the inverse transform (world to pixel) for VISP WCSs. (`#507 <https://github.com/DKISTDC/dkist/pull/507>`__)
9
+
10
+ * Python >= 3.11
11
+ * dask >= 2023.2
12
+ * gwcs >= 0.24
13
+ * matplotlib >= 3.7
14
+ * ndcube >= 2.1
15
+ * numpy >= 1.25
16
+ * parfive >= 2.1
17
+ * sunpy >= 5.0.7
18
+ * asdf >= 3.3
19
+ * asdf-astropy >= 0.5
20
+ * asdf-coordinate-schemas >= 0.3
21
+ * asdf-transform-schemas >= 0.5
22
+ * asdf-wcs-schemas >= 0.4
23
+
24
+
25
+ Features
26
+ --------
27
+
28
+ - Add a ``figure=`` keyword argument to `TiledDataset.plot` and make it default to the current figure. (`#491 <https://github.com/DKISTDC/dkist/pull/491>`__)
29
+ - Add `swap_tile_limits` kwarg to `TiledDataset.plot`.
30
+ This option allows the user to invert plot limits on either axes to account for WCS values that decrease compared to the pixel axes. (`#504 <https://github.com/DKISTDC/dkist/pull/504>`__)
31
+ - Update grid orientation of `TiledDataset.plot`.
32
+ The grid now has MAXIS1 columns and MAXIS2 rows where MINDEX1 corresponds to column and MINDEX2 corresponds to row.
33
+ Additionally, the origin for the grid is now in the lower-left as opposed to the upper-left. (`#504 <https://github.com/DKISTDC/dkist/pull/504>`__)
34
+ - ``TiledDataset`` now has a ``.meta`` dictionary like that of ``Dataset``. (`#513 <https://github.com/DKISTDC/dkist/pull/513>`__)
35
+ - History of the ADSF file, such as versions of packages and extensions used when writing it are now exposed ``TiledDataset.meta["history"]`` and ``Dataset.meta["history"]``. (`#513 <https://github.com/DKISTDC/dkist/pull/513>`__)
36
+
3
37
 
4
38
  Bug Fixes
5
39
  ---------
@@ -7,6 +41,14 @@ Bug Fixes
7
41
  - Improve the ASDF detection code so out of date ASDF filenames generated by the DKIST data center are skipped if a newer filename is present. (`#503 <https://github.com/DKISTDC/dkist/pull/503>`__)
8
42
 
9
43
 
44
+ Improved Documentation
45
+ ----------------------
46
+
47
+ - Update the :ref:`dkist:examples:vbi-reproject` example for improvements in ``TiledDataset``. (`#491 <https://github.com/DKISTDC/dkist/pull/491>`__)
48
+ - Add an examples section for tutorial style self-contained examples. (`#491 <https://github.com/DKISTDC/dkist/pull/491>`__)
49
+ - Add a how-to guide on redownloading the sample data with Fido / Globus. (`#491 <https://github.com/DKISTDC/dkist/pull/491>`__)
50
+
51
+
10
52
  1.9.1 (2025-01-15)
11
53
  ==================
12
54
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: dkist
3
- Version: 1.9.2
3
+ Version: 1.10.0
4
4
  Summary: DKIST User Tools
5
5
  Author-email: NSO / AURA <stuart@cadair.com>
6
6
  Project-URL: Homepage, https://github.com/DKISTDC/dkist
@@ -9,27 +9,27 @@ Project-URL: Download, https://pypi.org/project/dkist
9
9
  Project-URL: Documentation, https://docs.dkist.nso.edu/projects/python-tools/en/stable/
10
10
  Project-URL: Changelog, https://docs.dkist.nso.edu/projects/python-tools/en/stable/whatsnew/changelog.html
11
11
  Project-URL: Issue Tracker, https://github.com/DKISTDC/dkist/issues
12
- Requires-Python: >=3.10
12
+ Requires-Python: >=3.11
13
13
  Description-Content-Type: text/x-rst
14
14
  License-File: LICENSE.rst
15
- Requires-Dist: aiohttp>=3.8
16
- Requires-Dist: asdf>=2.11.2
17
- Requires-Dist: asdf-astropy>=0.2.0
18
- Requires-Dist: asdf-coordinates-schemas>=0.1.0
19
- Requires-Dist: asdf-standard>=1.0.3
20
- Requires-Dist: asdf-transform-schemas>=0.3.0
21
- Requires-Dist: asdf-wcs-schemas>=0.3.0
22
- Requires-Dist: astropy>=5.3
23
- Requires-Dist: dask[array]>=2021.8.0
15
+ Requires-Dist: aiohttp>=3.9
16
+ Requires-Dist: asdf>=3.3.0
17
+ Requires-Dist: asdf-astropy>=0.5.0
18
+ Requires-Dist: asdf-coordinates-schemas>=0.3.0
19
+ Requires-Dist: asdf-standard>=1.1.0
20
+ Requires-Dist: asdf-transform-schemas>=0.5.0
21
+ Requires-Dist: asdf-wcs-schemas>=0.4.0
22
+ Requires-Dist: astropy>=6.0
23
+ Requires-Dist: dask[array]>=2023.2.0
24
24
  Requires-Dist: globus-sdk>=3.0
25
- Requires-Dist: gwcs>=0.19.0
26
- Requires-Dist: matplotlib>=3.5
27
- Requires-Dist: ndcube[plotting,reproject]>=2.0
28
- Requires-Dist: numpy>=1.22
29
- Requires-Dist: parfive[ftp]>=1.5
25
+ Requires-Dist: gwcs>=0.24.0
26
+ Requires-Dist: matplotlib>=3.7
27
+ Requires-Dist: ndcube[plotting,reproject]>=2.1
28
+ Requires-Dist: numpy>=1.25
29
+ Requires-Dist: parfive[ftp]>=2.1
30
30
  Requires-Dist: platformdirs>=3.0
31
- Requires-Dist: sunpy[asdf,net]>=4.0.7
32
- Requires-Dist: tqdm>=4.63
31
+ Requires-Dist: sunpy[asdf,net]>=5.0.7
32
+ Requires-Dist: tqdm>=4.65
33
33
  Provides-Extra: tests
34
34
  Requires-Dist: pytest; extra == "tests"
35
35
  Requires-Dist: pytest-doctestplus; extra == "tests"
@@ -54,7 +54,7 @@ Requires-Dist: sphinx-astropy; extra == "docs"
54
54
  Requires-Dist: sphinx-gallery; extra == "docs"
55
55
  Requires-Dist: pytest; extra == "docs"
56
56
  Requires-Dist: sphinx_autodoc_typehints; extra == "docs"
57
- Requires-Dist: dkist-sphinx-theme>=1.1.2; extra == "docs"
57
+ Requires-Dist: dkist-sphinx-theme>=2.0; extra == "docs"
58
58
  Requires-Dist: sphinx-design; extra == "docs"
59
59
  Requires-Dist: myst-nb; extra == "docs"
60
60
  Requires-Dist: ipywidgets; extra == "docs"
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '1.9.2'
16
- __version_tuple__ = version_tuple = (1, 9, 2)
15
+ __version__ = version = '1.10.0'
16
+ __version_tuple__ = version_tuple = (1, 10, 0)
@@ -305,7 +305,8 @@ def simple_tiled_dataset(dataset):
305
305
  for ds in datasets:
306
306
  ds.meta["inventory"] = dataset.meta["inventory"]
307
307
  dataset_array = np.array(datasets).reshape((2,2))
308
- return TiledDataset(dataset_array, dataset.meta["inventory"])
308
+ meta = {"inventory": dataset.meta["inventory"]}
309
+ return TiledDataset(dataset_array, meta=meta)
309
310
 
310
311
 
311
312
  @pytest.fixture
@@ -420,8 +421,9 @@ def croppable_visp_dataset(tmp_path_factory):
420
421
 
421
422
 
422
423
  @pytest.fixture(scope="session")
423
- def croppable_cryo_dataset():
424
+ def croppable_cryo_dataset(tmp_path_factory):
425
+ cryodir = tmp_path_factory.mktemp("data")
424
426
  with gzip.open(Path(rootdir) / "croppable_cryo.asdf.gz", mode="rb") as gfo:
425
- with open(rootdir / "croppable_cryo.asdf", mode="wb") as afo:
427
+ with open(cryodir / "croppable_cryo.asdf", mode="wb") as afo:
426
428
  afo.write(gfo.read())
427
- return load_dataset(Path(rootdir) / "croppable_cryo.asdf")
429
+ return load_dataset(cryodir / "croppable_cryo.asdf")
@@ -1 +1 @@
1
- {"parameterValues":[{"parameterName":"createDateMin","values":{"minValue":"2022-12-08T19:07:55.038280","maxValue":"2025-01-28T07:25:53.776348"}},{"parameterName":"createDateMax","values":{"minValue":"2022-12-08T19:07:55.038280","maxValue":"2025-01-28T07:25:53.776348"}},{"parameterName":"endTimeMin","values":{"minValue":"2022-02-23T20:48:55.393500","maxValue":"2024-11-08T22:02:14.064417"}},{"parameterName":"endTimeMax","values":{"minValue":"2022-02-23T20:48:55.393500","maxValue":"2024-11-08T22:02:14.064417"}},{"parameterName":"exposureTimeMin","values":{"minValue":0.037,"maxValue":1380.2332394366197}},{"parameterName":"exposureTimeMax","values":{"minValue":0.037,"maxValue":1380.2332394366197}},{"parameterName":"instrumentNames","values":{"categoricalValues":["VBI","CRYO-NIRSP","VISP"]}},{"parameterName":"qualityAverageFriedParameterMin","values":{"minValue":0.01695005847191685,"maxValue":2.6520787500175156e+30}},{"parameterName":"qualityAverageFriedParameterMax","values":{"minValue":0.01695005847191685,"maxValue":2.6520787500175156e+30}},{"parameterName":"qualityAveragePolarimetricAccuracyMin","values":{"minValue":0.14787299538416715,"maxValue":263.313656131021}},{"parameterName":"qualityAveragePolarimetricAccuracyMax","values":{"minValue":0.14787299538416715,"maxValue":263.313656131021}},{"parameterName":"startTimeMin","values":{"minValue":"2022-02-23T19:05:32.338002","maxValue":"2024-11-08T21:40:00.522500"}},{"parameterName":"startTimeMax","values":{"minValue":"2022-02-23T19:05:32.338002","maxValue":"2024-11-08T21:40:00.522500"}},{"parameterName":"targetTypes","values":{"categoricalValues":["coronalhole","activecorona","quietcorona","prominence","sunspot","spicules","quietsun","plages","unknown","filament"]}},{"parameterName":"averageDatasetSpectralSamplingMin","values":{"minValue":0.000540156130946172,"maxValue":0.004605031614270178}},{"parameterName":"averageDatasetSpectralSamplingMax","values":{"minValue":0.000540156130946172,"maxValue":0.004605031614270178}},{"parameterName":"averageDatasetSpatialSamplingMin","values":{"minValue":0.0,"maxValue":12388.04306084}},{"parameterName":"averageDatasetSpatialSamplingMax","values":{"minValue":0.0,"maxValue":12388.04306084}},{"parameterName":"averageDatasetTemporalSamplingMin","values":{"minValue":2.66666599999823,"maxValue":5263.145059399398}},{"parameterName":"averageDatasetTemporalSamplingMax","values":{"minValue":2.66666599999823,"maxValue":5263.145059399398}},{"parameterName":"highLevelSoftwareVersion","values":{"categoricalValues":["Alakai_10-0","Pono_6.1.5","Pono_2.1.0","Alakai_5-1","Pono_3.1.0","Pono_8.0.0","Alakai_11.1.0","Alakai_6-0","Alakai_8-0","Alakai_7-0","Pono_7.0.0","Pono_1.0.0","Alakai_3-0","Alakai_4-0","Pono_9.1.0"]}},{"parameterName":"workflowName","values":{"categoricalValues":["l0_to_l1_visp","l0_to_l1_cryonirsp_sp","l0_to_l1_cryonirsp_ci","l0_to_l1_vbi_summit-calibrated"]}},{"parameterName":"workflowVersion","values":{"categoricalValues":["1.18.6","2.16.7","1.18.0","2.0.2","1.11.1","2.20.9","2.19.5","1.2.1","2.7.5","2.19.4","2.3.1","2.19.3","1.15.0","1.0.0","1.15.1","1.3.5","1.18.4","2.16.0","1.2.0","2.10.2","2.7.4","1.18.8","2.10.3","2.20.8","2.16.4","1.1.7","2.17.0","0.16.0","1.3.2","1.17.5","1.1.10","2.15.0","2.20.7","2.7.2","2.10.15","1.4.9","1.1.2","2.7.0","2.19.1","2.20.5","2.20.10","2.10.1","2.7.3","1.12.1","2.10.12","1.1.5","1.3.3","2.6.1","2.10.13","2.19.2","2.0.1","1.18.5","1.4.8","1.8.2","2.9.0","2.10.7","2.3.0","2.10.0","1.17.1","1.13.0","2.20.6","1.14.7","1.4.11","2.20.3","2.13.1","1.4.1"]}},{"parameterName":"headerDataUnitCreationDateMin","values":{"minValue":"2022-12-08T17:30:30.462000","maxValue":"2025-01-28T00:07:38.944000"}},{"parameterName":"headerDataUnitCreationDateMax","values":{"minValue":"2022-12-08T17:30:30.462000","maxValue":"2025-01-28T00:07:38.944000"}},{"parameterName":"headerVersion","values":{"categoricalValues":["4.3.0","4.6.0","4.0.0","4.1.1","3.4.0","3.9.0","4.7.0","4.10.0","3.5.0","4.2.0","3.6.0","3.3.0","3.0.0","3.7.1","3.8.1","4.5.0"]}},{"parameterName":"spectralLines","values":{"categoricalValues":["Na I D2 (589.0 nm)","Sr I (460.73 nm)","Ca II (854.21 nm)","Fe I (630.15 nm)","Ca II K (393.37 nm)","Ca II H (396.85 nm)","Na I D1 (589.59 nm)","Mg I b1 (517.27 nm)","Fe I (630.25 nm)","Fe XIII (1079.8 nm)","Fe XIII (1074.7 nm)","H epsilon (397.0 nm)","Fe I (525.04 nm)","H beta (486.13 nm)","He I (1083.0 nm)","H alpha (656.28 nm)"]}}]}
1
+ {"parameterValues":[{"parameterName":"createDateMin","values":{"minValue":"2022-12-08T19:07:55.038280","maxValue":"2025-02-01T03:44:31.791568"}},{"parameterName":"createDateMax","values":{"minValue":"2022-12-08T19:07:55.038280","maxValue":"2025-02-01T03:44:31.791568"}},{"parameterName":"endTimeMin","values":{"minValue":"2022-02-23T20:48:55.393500","maxValue":"2024-11-08T22:02:14.064417"}},{"parameterName":"endTimeMax","values":{"minValue":"2022-02-23T20:48:55.393500","maxValue":"2024-11-08T22:02:14.064417"}},{"parameterName":"exposureTimeMin","values":{"minValue":0.037,"maxValue":1380.2332394366197}},{"parameterName":"exposureTimeMax","values":{"minValue":0.037,"maxValue":1380.2332394366197}},{"parameterName":"instrumentNames","values":{"categoricalValues":["VBI","CRYO-NIRSP","VISP"]}},{"parameterName":"qualityAverageFriedParameterMin","values":{"minValue":0.01695005847191685,"maxValue":2.6520787500175156e+30}},{"parameterName":"qualityAverageFriedParameterMax","values":{"minValue":0.01695005847191685,"maxValue":2.6520787500175156e+30}},{"parameterName":"qualityAveragePolarimetricAccuracyMin","values":{"minValue":0.14787299538416715,"maxValue":263.313656131021}},{"parameterName":"qualityAveragePolarimetricAccuracyMax","values":{"minValue":0.14787299538416715,"maxValue":263.313656131021}},{"parameterName":"startTimeMin","values":{"minValue":"2022-02-23T19:05:32.338002","maxValue":"2024-11-08T21:40:00.522500"}},{"parameterName":"startTimeMax","values":{"minValue":"2022-02-23T19:05:32.338002","maxValue":"2024-11-08T21:40:00.522500"}},{"parameterName":"targetTypes","values":{"categoricalValues":["coronalhole","activecorona","quietcorona","prominence","sunspot","spicules","quietsun","plages","unknown","filament"]}},{"parameterName":"averageDatasetSpectralSamplingMin","values":{"minValue":0.000540156130946172,"maxValue":0.004605031614270178}},{"parameterName":"averageDatasetSpectralSamplingMax","values":{"minValue":0.000540156130946172,"maxValue":0.004605031614270178}},{"parameterName":"averageDatasetSpatialSamplingMin","values":{"minValue":0.0,"maxValue":12388.04306084}},{"parameterName":"averageDatasetSpatialSamplingMax","values":{"minValue":0.0,"maxValue":12388.04306084}},{"parameterName":"averageDatasetTemporalSamplingMin","values":{"minValue":2.66666599999823,"maxValue":5263.145059399398}},{"parameterName":"averageDatasetTemporalSamplingMax","values":{"minValue":2.66666599999823,"maxValue":5263.145059399398}},{"parameterName":"highLevelSoftwareVersion","values":{"categoricalValues":["Alakai_10-0","Pono_6.1.5","Pono_2.1.0","Alakai_5-1","Pono_3.1.0","Pono_8.0.0","Alakai_11.1.0","Alakai_6-0","Alakai_8-0","Alakai_7-0","Pono_7.0.0","Pono_1.0.0","Alakai_3-0","Alakai_4-0","Pono_9.1.0"]}},{"parameterName":"workflowName","values":{"categoricalValues":["l0_to_l1_visp","l0_to_l1_cryonirsp_sp","l0_to_l1_cryonirsp_ci","l0_to_l1_vbi_summit-calibrated"]}},{"parameterName":"workflowVersion","values":{"categoricalValues":["1.18.6","2.16.7","1.18.0","2.0.2","1.11.1","2.20.9","2.19.5","1.2.1","2.7.5","2.19.4","2.3.1","2.19.3","1.15.0","1.0.0","1.15.1","1.3.5","1.18.4","2.16.0","1.2.0","2.10.2","2.7.4","1.18.8","2.10.3","2.20.8","2.16.4","1.4.15","1.1.7","2.17.0","0.16.0","1.3.2","1.17.5","1.1.10","2.15.0","2.20.7","2.7.2","2.10.15","1.4.9","1.1.2","2.7.0","2.19.1","2.20.5","2.20.10","2.10.1","2.7.3","1.12.1","2.10.12","1.1.5","1.3.3","2.6.1","2.10.13","2.19.2","2.0.1","1.18.5","1.4.8","1.8.2","2.9.0","2.10.7","2.3.0","2.10.0","1.17.1","1.13.0","2.20.6","1.14.7","1.4.11","2.20.3","2.13.1","1.4.1"]}},{"parameterName":"headerDataUnitCreationDateMin","values":{"minValue":"2022-12-08T17:30:30.462000","maxValue":"2025-02-01T03:21:22.091000"}},{"parameterName":"headerDataUnitCreationDateMax","values":{"minValue":"2022-12-08T17:30:30.462000","maxValue":"2025-02-01T03:21:22.091000"}},{"parameterName":"headerVersion","values":{"categoricalValues":["4.3.0","4.6.0","4.0.0","4.1.1","3.4.0","3.9.0","4.7.0","4.10.0","3.5.0","4.2.0","3.6.0","3.3.0","3.0.0","3.7.1","3.8.1","4.5.0"]}},{"parameterName":"spectralLines","values":{"categoricalValues":["Na I D2 (589.0 nm)","Sr I (460.73 nm)","Ca II (854.21 nm)","Fe I (630.15 nm)","Ca II K (393.37 nm)","Ca II H (396.85 nm)","Na I D1 (589.59 nm)","Mg I b1 (517.27 nm)","Fe I (630.25 nm)","Fe XIII (1079.8 nm)","Fe XIII (1074.7 nm)","H epsilon (397.0 nm)","Fe I (525.04 nm)","H beta (486.13 nm)","He I (1083.0 nm)","H alpha (656.28 nm)"]}}]}
@@ -22,12 +22,6 @@ except ImportError:
22
22
  ASDF_FILENAME_PATTERN = r"^(?P<instrument>[A-Z-]+)_L1_(?P<timestamp>\d{8}T\d{6})_(?P<datasetid>[A-Z]{5,})(?P<suffix>_user_tools|_metadata)?.asdf$"
23
23
 
24
24
 
25
- def asdf_open_memory_mapping_kwarg(memmap: bool) -> dict:
26
- if asdf.__version__ > "3.1.0":
27
- return {"memmap": memmap}
28
- return {"copy_arrays": not memmap}
29
-
30
-
31
25
  @singledispatch
32
26
  def load_dataset(target):
33
27
  """
@@ -108,9 +102,7 @@ def _load_from_results(results):
108
102
  return _load_from_iterable(results)
109
103
 
110
104
 
111
- # In Python 3.11 we can use the Union type here
112
- @load_dataset.register(list)
113
- @load_dataset.register(tuple)
105
+ @load_dataset.register(tuple | list)
114
106
  def _load_from_iterable(iterable):
115
107
  """
116
108
  A list or tuple of valid inputs to ``load_dataset``.
@@ -243,8 +235,9 @@ def _load_from_asdf(filepath):
243
235
  try:
244
236
  with importlib_resources.as_file(importlib_resources.files("dkist.io") / "level_1_dataset_schema.yaml") as schema_path:
245
237
  with asdf.open(filepath, custom_schema=schema_path.as_posix(),
246
- lazy_load=False, **asdf_open_memory_mapping_kwarg(memmap=False)) as ff:
238
+ lazy_load=False, memmap=False) as ff:
247
239
  ds = ff.tree["dataset"]
240
+ ds.meta["history"] = ff.tree["history"]
248
241
  if isinstance(ds, TiledDataset):
249
242
  for sub in ds.flat:
250
243
  sub.files.basepath = base_path
@@ -1,3 +1,4 @@
1
+ import numpy as np
1
2
  import pytest
2
3
 
3
4
  import astropy.units as u
@@ -7,6 +8,13 @@ from astropy.time import Time
7
8
  gwcs = pytest.importorskip("gwcs", "0.22.2a1.dev2")
8
9
 
9
10
 
11
+ def assert_skycoord_allclose(coord1, coord2):
12
+ assert coord1.is_equivalent_frame(coord2)
13
+ data1 = coord1.frame.cartesian.xyz
14
+ data2 = coord2.frame.cartesian.xyz
15
+ assert np.allclose(data1, data2)
16
+
17
+
10
18
  def test_crop_visp_by_only_stokes(croppable_visp_dataset):
11
19
 
12
20
  cropped = croppable_visp_dataset.crop([
@@ -52,11 +60,11 @@ def test_crop_visp_by_time(croppable_visp_dataset):
52
60
 
53
61
  orig_coords = croppable_visp_dataset.axis_world_coords()
54
62
  cropped_coords = cropped.axis_world_coords()
55
- assert (cropped_coords[0][0] == orig_coords[0][200]).all()
56
- assert (cropped_coords[0][-1] == orig_coords[0][400]).all()
57
- assert (cropped_coords[1] == orig_coords[1]).all()
58
- assert (cropped_coords[2] == orig_coords[2][200:401]).all()
59
- assert (cropped_coords[3] == orig_coords[3]).all()
63
+ assert_skycoord_allclose(cropped_coords[0][0], orig_coords[0][200])
64
+ assert_skycoord_allclose(cropped_coords[0][-1], orig_coords[0][400])
65
+ assert np.allclose(cropped_coords[1], orig_coords[1])
66
+ assert np.allclose(cropped_coords[2].jd, orig_coords[2][200:401].jd)
67
+ assert np.allclose(cropped_coords[3], orig_coords[3])
60
68
 
61
69
 
62
70
  def test_crop_visp_by_lonlat(croppable_visp_dataset):
@@ -90,11 +98,11 @@ def test_crop_visp_by_lonlat(croppable_visp_dataset):
90
98
 
91
99
  orig_coords = croppable_visp_dataset.axis_world_coords()
92
100
  cropped_coords = cropped.axis_world_coords()
93
- assert (cropped_coords[0][0] == orig_coords[0][200][500:1001]).all()
94
- assert (cropped_coords[0][-1] == orig_coords[0][600][500:1001]).all()
95
- assert (cropped_coords[1] == orig_coords[1]).all()
96
- assert (cropped_coords[2] == orig_coords[2][200:601]).all()
97
- assert (cropped_coords[3] == orig_coords[3]).all()
101
+ assert_skycoord_allclose(cropped_coords[0][0], orig_coords[0][200][500:1001])
102
+ assert_skycoord_allclose(cropped_coords[0][-1], orig_coords[0][600][500:1001])
103
+ assert np.allclose(cropped_coords[1], orig_coords[1])
104
+ assert np.allclose(cropped_coords[2].jd, orig_coords[2][200:601].jd)
105
+ assert np.allclose(cropped_coords[3], orig_coords[3])
98
106
 
99
107
 
100
108
  def test_crop_cryo_by_only_stokes(croppable_cryo_dataset):
@@ -144,12 +152,12 @@ def test_crop_cryo_by_time(croppable_cryo_dataset):
144
152
  cropped_coords = cropped.axis_world_coords()
145
153
 
146
154
  # Whole coordinate array is too large to compare, so check just the edges
147
- assert (cropped_coords[0][0, 0, 0, :] == orig_coords[0][0, 0, 0, :]).all()
148
- assert (cropped_coords[0][0, 0, -1, :] == orig_coords[0][0, 0, -1, :]).all()
149
- assert (cropped_coords[0][0, 0, :, 0] == orig_coords[0][0, 0, :, 0]).all()
150
- assert (cropped_coords[0][0, 0, :, -1] == orig_coords[0][0, 0, :, -1]).all()
151
- assert (cropped_coords[1] == orig_coords[1][:2, :2]).all()
152
- assert (cropped_coords[2] == orig_coords[2]).all()
155
+ assert_skycoord_allclose(cropped_coords[0][0, 0, 0, :], orig_coords[0][0, 0, 0, :])
156
+ assert_skycoord_allclose(cropped_coords[0][0, 0, -1, :], orig_coords[0][0, 0, -1, :])
157
+ assert_skycoord_allclose(cropped_coords[0][0, 0, :, 0], orig_coords[0][0, 0, :, 0])
158
+ assert_skycoord_allclose(cropped_coords[0][0, 0, :, -1], orig_coords[0][0, 0, :, -1])
159
+ assert np.allclose(cropped_coords[1].jd, orig_coords[1][:2, :2].jd)
160
+ assert np.allclose(cropped_coords[2], orig_coords[2])
153
161
 
154
162
 
155
163
  def test_crop_cryo_by_only_lonlat(croppable_cryo_dataset):
@@ -180,6 +188,6 @@ def test_crop_cryo_by_only_lonlat(croppable_cryo_dataset):
180
188
  orig_coords = croppable_cryo_dataset.axis_world_coords()
181
189
  cropped_coords = cropped.axis_world_coords()
182
190
 
183
- assert (cropped_coords[0][0, 0] == orig_coords[0][0, 0, :201, :201]).all()
184
- assert (cropped_coords[1] == orig_coords[1]).all()
185
- assert (cropped_coords[2] == orig_coords[2]).all()
191
+ assert_skycoord_allclose(cropped_coords[0][0, 0], orig_coords[0][0, 0, :201, :201])
192
+ assert np.allclose(cropped_coords[1].jd, orig_coords[1].jd)
193
+ assert np.allclose(cropped_coords[2], orig_coords[2])
@@ -1,3 +1,4 @@
1
+ import re
1
2
  import copy
2
3
 
3
4
  import matplotlib.pyplot as plt
@@ -6,6 +7,7 @@ import pytest
6
7
 
7
8
  from dkist import Dataset, TiledDataset, load_dataset
8
9
  from dkist.tests.helpers import figure_test
10
+ from dkist.utils.exceptions import DKISTUserWarning
9
11
 
10
12
 
11
13
  def test_tiled_dataset(simple_tiled_dataset, dataset):
@@ -44,16 +46,17 @@ def test_tiled_dataset_headers(simple_tiled_dataset, dataset):
44
46
 
45
47
 
46
48
  def test_tiled_dataset_invalid_construction(dataset, dataset_4d):
49
+ meta = {"inventory": dataset.meta["inventory"]}
47
50
  with pytest.raises(ValueError, match="inventory record of the first dataset"):
48
51
  TiledDataset(np.array((dataset, dataset_4d)))
49
52
 
50
53
  with pytest.raises(ValueError, match="physical types do not match"):
51
- TiledDataset(np.array((dataset, dataset_4d)), inventory=dataset.meta["inventory"])
54
+ TiledDataset(np.array((dataset, dataset_4d)), meta=meta)
52
55
 
53
56
  ds2 = copy.deepcopy(dataset)
54
57
  ds2.meta["inventory"] = {"hello": "world"}
55
58
  with pytest.raises(ValueError, match="inventory records of all the datasets"):
56
- TiledDataset(np.array((dataset, ds2)), dataset.meta["inventory"])
59
+ TiledDataset(np.array((dataset, ds2)), meta=meta)
57
60
 
58
61
 
59
62
  def test_tiled_dataset_from_components(dataset):
@@ -78,6 +81,7 @@ def test_tiled_dataset_from_components(dataset):
78
81
  def test_tileddataset_plot(share_zscale):
79
82
  from dkist.data.sample import VBI_AJQWW
80
83
  ori_ds = load_dataset(VBI_AJQWW)
84
+
81
85
  newtiles = []
82
86
  for tile in ori_ds.flat:
83
87
  newtiles.append(tile.rebin((1, 8, 8), operation=np.sum))
@@ -85,11 +89,86 @@ def test_tileddataset_plot(share_zscale):
85
89
  # https://github.com/sunpy/ndcube/issues/815
86
90
  for tile in newtiles:
87
91
  tile.meta["inventory"] = ori_ds.inventory
88
- ds = TiledDataset(np.array(newtiles).reshape(ori_ds.shape), inventory=newtiles[0].inventory)
92
+ ds = TiledDataset(np.array(newtiles).reshape(ori_ds.shape), meta={"inventory": newtiles[0].inventory})
93
+
89
94
  fig = plt.figure(figsize=(12, 15))
90
- ds.plot(0, share_zscale=share_zscale)
95
+ with pytest.warns(DKISTUserWarning,
96
+ match="The metadata ASDF file that produced this dataset is out of date and will result in "
97
+ "incorrect plots. Please re-download the metadata ASDF file."):
98
+ #TODO: Once sample data have been updated maybe we should test both paths here (old data and new data)
99
+ ds.plot(0, share_zscale=share_zscale, figure=fig)
100
+
91
101
  return plt.gcf()
92
102
 
103
+ @figure_test
104
+ @pytest.mark.parametrize("swap_tile_limits", ["x", "y", "xy", None])
105
+ def test_tileddataset_plot_limit_swapping(swap_tile_limits):
106
+ # Also test that row/column sizes are correct
107
+
108
+ from dkist.data.sample import VBI_AJQWW
109
+ ori_ds = load_dataset(VBI_AJQWW)
110
+
111
+ # Swap WCS to make the `swap_tile_limits` option more natural
112
+ for tile in ori_ds.flat:
113
+ tile.wcs.forward_transform[0].cdelt *= -1
114
+
115
+ newtiles = []
116
+ for tile in ori_ds.flat:
117
+ newtiles.append(tile.rebin((1, 8, 8), operation=np.sum))
118
+ # ndcube 2.3.0 introduced a deepcopy for rebin, this broke our dataset validation
119
+ # https://github.com/sunpy/ndcube/issues/815
120
+ for tile in newtiles:
121
+ tile.meta["inventory"] = ori_ds.inventory
122
+ ds = TiledDataset(np.array(newtiles).reshape(ori_ds.shape), meta={"inventory": newtiles[0].inventory})
123
+
124
+ non_square_ds = ds[:2, :]
125
+ assert non_square_ds.shape[0] != non_square_ds.shape[1] # Just in case the underlying data change for some reason
126
+
127
+ fig = plt.figure(figsize=(12, 15))
128
+ with pytest.warns(DKISTUserWarning,
129
+ match="The metadata ASDF file that produced this dataset is out of date and will result in "
130
+ "incorrect plots. Please re-download the metadata ASDF file."):
131
+ #TODO: Once sample data have been updated maybe we should test both paths here (old data and new data)
132
+ non_square_ds.plot(0, share_zscale=False, swap_tile_limits=swap_tile_limits, figure=fig)
133
+
134
+ assert fig.axes[0].get_gridspec().get_geometry() == non_square_ds.shape[::-1]
135
+ for ax in fig.axes:
136
+ xlims = ax.get_xlim()
137
+ ylims = ax.get_ylim()
138
+
139
+ if swap_tile_limits in ["x", "xy"]:
140
+ assert xlims[0] > xlims[1]
141
+ if swap_tile_limits in ["y", "xy"]:
142
+ assert ylims[0] > ylims[1]
143
+ if swap_tile_limits is None:
144
+ assert xlims[0] < xlims[1]
145
+ assert ylims[0] < ylims[1]
146
+
147
+ return plt.gcf()
148
+
149
+ @pytest.mark.remote_data
150
+ def test_tileddataset_plot_non2d_sliceindex():
151
+ from dkist.data.sample import VBI_AJQWW
152
+ ds = load_dataset(VBI_AJQWW)
153
+
154
+ newtiles = []
155
+ for tile in ds.flat:
156
+ newtiles.append(tile.rebin((1, 8, 8), operation=np.sum))
157
+ # ndcube 2.3.0 introduced a deepcopy for rebin, this broke our dataset validation
158
+ # https://github.com/sunpy/ndcube/issues/815
159
+ for tile in newtiles:
160
+ tile.meta["inventory"] = ds.inventory
161
+ ds = TiledDataset(np.array(newtiles).reshape(ds.shape), meta={"inventory": newtiles[0].inventory})
162
+
163
+ already_sliced_ds = ds.slice_tiles[0]
164
+
165
+ fig = plt.figure(figsize=(12, 15))
166
+ with pytest.warns(DKISTUserWarning,
167
+ match="The metadata ASDF file that produced this dataset is out of date and will result in "
168
+ "incorrect plots. Please re-download the metadata ASDF file."):
169
+ with pytest.raises(ValueError, match=re.escape("Applying slice '(0,)' to this dataset resulted in a 1 "
170
+ "dimensional dataset, you should pass a slice which results in a 2D dataset for each tile.")):
171
+ already_sliced_ds.plot(0, figure=fig)
93
172
 
94
173
  @pytest.mark.accept_cli_tiled_dataset
95
174
  def test_repr(simple_tiled_dataset):