webknossos 4.2.0__tar.gz → 4.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 (178) hide show
  1. {webknossos-4.2.0 → webknossos-4.2.2}/PKG-INFO +2 -2
  2. {webknossos-4.2.0 → webknossos-4.2.2}/pyproject.toml +2 -2
  3. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/layer/_downsampling_utils.py +48 -26
  4. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/layer/layer.py +10 -6
  5. webknossos-4.2.2/webknossos/version.py +1 -0
  6. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos.egg-info/PKG-INFO +2 -2
  7. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos.egg-info/requires.txt +1 -1
  8. webknossos-4.2.0/webknossos/version.py +0 -1
  9. {webknossos-4.2.0 → webknossos-4.2.2}/README.md +0 -0
  10. {webknossos-4.2.0 → webknossos-4.2.2}/setup.cfg +0 -0
  11. {webknossos-4.2.0 → webknossos-4.2.2}/tests/test_annotation.py +0 -0
  12. {webknossos-4.2.0 → webknossos-4.2.2}/tests/test_api_client.py +0 -0
  13. {webknossos-4.2.0 → webknossos-4.2.2}/tests/test_cli.py +0 -0
  14. {webknossos-4.2.0 → webknossos-4.2.2}/tests/test_cli_utils.py +0 -0
  15. {webknossos-4.2.0 → webknossos-4.2.2}/tests/test_skeleton.py +0 -0
  16. {webknossos-4.2.0 → webknossos-4.2.2}/tests/test_utils.py +0 -0
  17. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/__init__.py +0 -0
  18. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/_nml/__init__.py +0 -0
  19. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/_nml/branchpoint.py +0 -0
  20. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/_nml/comment.py +0 -0
  21. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/_nml/edge.py +0 -0
  22. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/_nml/group.py +0 -0
  23. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/_nml/meta.py +0 -0
  24. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/_nml/metadata_entry.py +0 -0
  25. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/_nml/nml.py +0 -0
  26. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/_nml/node.py +0 -0
  27. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/_nml/parameters.py +0 -0
  28. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/_nml/segment.py +0 -0
  29. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/_nml/tree.py +0 -0
  30. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/_nml/utils.py +0 -0
  31. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/_nml/volume.py +0 -0
  32. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/administration/__init__.py +0 -0
  33. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/administration/project.py +0 -0
  34. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/administration/task.py +0 -0
  35. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/administration/team.py +0 -0
  36. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/administration/user.py +0 -0
  37. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/ai_model/__init__.py +0 -0
  38. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/ai_model/ai_model_category.py +0 -0
  39. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/ai_model/remote_ai_model.py +0 -0
  40. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/annotation/__init__.py +0 -0
  41. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/annotation/_nml_conversion.py +0 -0
  42. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/annotation/annotation.py +0 -0
  43. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/annotation/annotation_info.py +0 -0
  44. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/annotation/volume_layer.py +0 -0
  45. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/cli/__init__.py +0 -0
  46. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/cli/_utils.py +0 -0
  47. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/cli/check_equality.py +0 -0
  48. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/cli/compress.py +0 -0
  49. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/cli/convert.py +0 -0
  50. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/cli/convert_knossos.py +0 -0
  51. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/cli/convert_raw.py +0 -0
  52. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/cli/convert_zarr.py +0 -0
  53. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/cli/copy_dataset.py +0 -0
  54. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/cli/download.py +0 -0
  55. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/cli/downsample.py +0 -0
  56. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/cli/export_as_tiff.py +0 -0
  57. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/cli/main.py +0 -0
  58. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/cli/merge_fallback.py +0 -0
  59. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/cli/upload.py +0 -0
  60. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/cli/upsample.py +0 -0
  61. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/client/__init__.py +0 -0
  62. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/client/_defaults.py +0 -0
  63. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/client/_download_dataset.py +0 -0
  64. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/client/_resolve_short_link.py +0 -0
  65. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/client/_resumable/__init__.py +0 -0
  66. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/client/_resumable/chunk.py +0 -0
  67. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/client/_resumable/core.py +0 -0
  68. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/client/_resumable/file.py +0 -0
  69. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/client/_resumable/util.py +0 -0
  70. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/client/_upload_dataset.py +0 -0
  71. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/client/api_client/__init__.py +0 -0
  72. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/client/api_client/_abstract_api_client.py +0 -0
  73. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/client/api_client/_serialization.py +0 -0
  74. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/client/api_client/datastore_api_client.py +0 -0
  75. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/client/api_client/errors.py +0 -0
  76. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/client/api_client/models.py +0 -0
  77. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/client/api_client/tracingstore_api_client.py +0 -0
  78. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/client/api_client/wk_api_client.py +0 -0
  79. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/client/context.py +0 -0
  80. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/__init__.py +0 -0
  81. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/_image_conversion/__init__.py +0 -0
  82. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/_image_conversion/chunked_image_source.py +0 -0
  83. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/_image_conversion/common_slice_readers.py +0 -0
  84. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/_image_conversion/czi_image_source.py +0 -0
  85. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/_image_conversion/dm_slice_reader.py +0 -0
  86. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/_image_conversion/image_conversion.py +0 -0
  87. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/_image_conversion/image_source.py +0 -0
  88. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/_image_conversion/image_source_registry.py +0 -0
  89. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/_image_conversion/ims_image_source.py +0 -0
  90. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/_image_conversion/infer_bounding_box_existing_files.py +0 -0
  91. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/_image_conversion/mrc_image_source.py +0 -0
  92. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/_image_conversion/n5_image_source.py +0 -0
  93. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/_image_conversion/neuroglancer_precomputed_image_source.py +0 -0
  94. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/_image_conversion/ome_zarr_helpers.py +0 -0
  95. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/_image_conversion/ozx_image_source.py +0 -0
  96. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/_image_conversion/segmentation_recognition.py +0 -0
  97. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/_image_conversion/slice_reader.py +0 -0
  98. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/_image_conversion/sliced_image_source.py +0 -0
  99. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/_image_conversion/tensorstore_chunked_image_source.py +0 -0
  100. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/_image_conversion/tiff_slice_reader.py +0 -0
  101. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/_image_conversion/vendor/dm3.py +0 -0
  102. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/_image_conversion/vendor/dm4.py +0 -0
  103. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/_image_conversion/zarr_image_source.py +0 -0
  104. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/_metadata.py +0 -0
  105. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/_utils/__init__.py +0 -0
  106. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/_utils/buffered_slice_reader.py +0 -0
  107. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/_utils/buffered_slice_writer.py +0 -0
  108. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/_utils/tensorstore_helpers.py +0 -0
  109. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/_utils/tinywkw.py +0 -0
  110. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/abstract_dataset.py +0 -0
  111. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/dataset.py +0 -0
  112. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/defaults.py +0 -0
  113. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/errors.py +0 -0
  114. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/layer/__init__.py +0 -0
  115. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/layer/_downsampling_numba.py +0 -0
  116. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/layer/_transform_utils.py +0 -0
  117. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/layer/_upsampling_utils.py +0 -0
  118. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/layer/abstract_layer.py +0 -0
  119. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/layer/export.py +0 -0
  120. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/layer/layer_to_link.py +0 -0
  121. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/layer/remote_layer.py +0 -0
  122. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/layer/segmentation_layer/__init__.py +0 -0
  123. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/layer/segmentation_layer/abstract_segmentation_layer.py +0 -0
  124. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/layer/segmentation_layer/attachments/__init__.py +0 -0
  125. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/layer/segmentation_layer/attachments/agglomerate_attachment.py +0 -0
  126. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/layer/segmentation_layer/attachments/attachment.py +0 -0
  127. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/layer/segmentation_layer/attachments/attachments.py +0 -0
  128. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/layer/segmentation_layer/remote_segmentation_layer.py +0 -0
  129. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/layer/segmentation_layer/segmentation_layer.py +0 -0
  130. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/layer/view/__init__.py +0 -0
  131. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/layer/view/_array.py +0 -0
  132. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/layer/view/mag_view.py +0 -0
  133. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/layer/view/remote_mag_view.py +0 -0
  134. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/layer/view/view.py +0 -0
  135. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/ome_metadata.py +0 -0
  136. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/remote_access_mode.py +0 -0
  137. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/remote_dataset.py +0 -0
  138. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/remote_dataset_registry.py +0 -0
  139. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/remote_folder.py +0 -0
  140. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/sampling_modes.py +0 -0
  141. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset/transfer_mode.py +0 -0
  142. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset_properties/__init__.py +0 -0
  143. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset_properties/_bigint_envelope.py +0 -0
  144. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset_properties/coordinate_transformations.py +0 -0
  145. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset_properties/data_format.py +0 -0
  146. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset_properties/dataset_properties.py +0 -0
  147. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset_properties/dtype_conversion.py +0 -0
  148. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset_properties/layer_categories.py +0 -0
  149. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset_properties/length_unit.py +0 -0
  150. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/dataset_properties/structuring.py +0 -0
  151. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/datastore/__init__.py +0 -0
  152. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/datastore/datastore.py +0 -0
  153. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/geometry/__init__.py +0 -0
  154. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/geometry/bounding_box.py +0 -0
  155. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/geometry/constants.py +0 -0
  156. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/geometry/mag.py +0 -0
  157. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/geometry/nd_bounding_box.py +0 -0
  158. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/geometry/normalized_bounding_box.py +0 -0
  159. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/geometry/vec3_float.py +0 -0
  160. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/geometry/vec3_int.py +0 -0
  161. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/geometry/vec_int.py +0 -0
  162. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/proofreading/__init__.py +0 -0
  163. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/proofreading/agglomerate_graph_data.py +0 -0
  164. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/proofreading/generated/__init__.py +0 -0
  165. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/proofreading/generated/agglomerate_graph_pb2.py +0 -0
  166. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/proofreading/generated/agglomerate_graph_pb2.pyi +0 -0
  167. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/py.typed +0 -0
  168. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/skeleton/__init__.py +0 -0
  169. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/skeleton/group.py +0 -0
  170. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/skeleton/node.py +0 -0
  171. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/skeleton/skeleton.py +0 -0
  172. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/skeleton/tree.py +0 -0
  173. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/ssl_context.py +0 -0
  174. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos/utils.py +0 -0
  175. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos.egg-info/SOURCES.txt +0 -0
  176. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos.egg-info/dependency_links.txt +0 -0
  177. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos.egg-info/entry_points.txt +0 -0
  178. {webknossos-4.2.0 → webknossos-4.2.2}/webknossos.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: webknossos
3
- Version: 4.2.0
3
+ Version: 4.2.2
4
4
  Summary: Python API for working with WEBKNOSSOS datasets, annotations, and for WEBKNOSSOS server interaction.
5
5
  Author-email: scalable minds <hello@scalableminds.com>
6
6
  License: AGPL-3.0
@@ -37,7 +37,7 @@ Requires-Dist: boltons>=21.0.0
37
37
  Requires-Dist: cattrs>=22.0.0
38
38
  Requires-Dist: certifi>=2023
39
39
  Requires-Dist: click<8.2.0
40
- Requires-Dist: cluster-tools==4.2.0
40
+ Requires-Dist: cluster-tools==4.2.2
41
41
  Requires-Dist: httpx~=0.27.0
42
42
  Requires-Dist: imageio>=2.37.0
43
43
  Requires-Dist: lz4>=4.0.0
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "webknossos"
3
- version = "4.2.0" # filled by dunamai
3
+ version = "4.2.2" # filled by dunamai
4
4
  description = "Python API for working with WEBKNOSSOS datasets, annotations, and for WEBKNOSSOS server interaction."
5
5
  authors = [{ name = "scalable minds", email = "hello@scalableminds.com" }]
6
6
  readme = "README.md"
@@ -39,7 +39,7 @@ dependencies = [
39
39
  "cattrs >=22.0.0",
40
40
  "certifi >=2023",
41
41
  "click <8.2.0", # pinned because of incompatibility with typer
42
- "cluster-tools==4.2.0",
42
+ "cluster-tools==4.2.2",
43
43
  "httpx ~=0.27.0",
44
44
  "imageio >=2.37.0",
45
45
  "lz4 >=4.0.0",
@@ -14,7 +14,14 @@ if TYPE_CHECKING:
14
14
  from webknossos.dataset.dataset import Dataset, RemoteDataset
15
15
 
16
16
  from webknossos.dataset_properties import LayerCategoryType
17
- from webknossos.geometry import C_AXIS, Mag, Vec3FloatLike, Vec3Int, Vec3IntLike
17
+ from webknossos.geometry import (
18
+ C_AXIS,
19
+ Mag,
20
+ NormalizedBoundingBox,
21
+ Vec3FloatLike,
22
+ Vec3Int,
23
+ Vec3IntLike,
24
+ )
18
25
 
19
26
  from .view import ArrayInfo, View
20
27
 
@@ -299,28 +306,6 @@ def _downsample_mode(data: np.ndarray, factors: list[int]) -> np.ndarray:
299
306
  return non_linear_filter_3d(data, factors, _mode)
300
307
 
301
308
 
302
- def downsample_unpadded_data(
303
- buffer: np.ndarray, target_mag: Mag, interpolation_mode: InterpolationModes
304
- ) -> np.ndarray:
305
- target_mag_np = np.array(target_mag.to_list())
306
- current_dimension_size = np.array(buffer.shape[1:])
307
- padding_size_for_downsampling = (
308
- target_mag_np - (current_dimension_size % target_mag_np) % target_mag_np
309
- )
310
- padding_size_for_downsampling = list(zip([0, 0, 0], padding_size_for_downsampling))
311
- buffer = np.pad(
312
- buffer, pad_width=[(0, 0)] + padding_size_for_downsampling, mode="constant"
313
- )
314
- dimension_decrease = np.array([1] + target_mag.to_list())
315
- downsampled_buffer_shape = np.array(buffer.shape) // dimension_decrease
316
- downsampled_buffer = np.empty(dtype=buffer.dtype, shape=downsampled_buffer_shape)
317
- for channel in range(buffer.shape[0]):
318
- downsampled_buffer[channel] = downsample_cube(
319
- buffer[channel], target_mag.to_list(), interpolation_mode
320
- )
321
- return downsampled_buffer
322
-
323
-
324
309
  def downsample_cube(
325
310
  cube_buffer: np.ndarray, factors: list[int], interpolation_mode: InterpolationModes
326
311
  ) -> np.ndarray:
@@ -347,8 +332,17 @@ def downsample_cube_job(
347
332
  mag_factors: Vec3Int,
348
333
  interpolation_mode: InterpolationModes,
349
334
  buffer_shape: Vec3Int,
335
+ valid_source_bbox: NormalizedBoundingBox | None = None,
350
336
  ) -> None:
337
+ """Downsamples the data of `source_view` into `target_view`.
338
+
339
+ Source voxels outside of `valid_source_bbox` (in mag 1, aligned with the source
340
+ mag) are not read. Instead, the valid data is mirrored into that region, so that
341
+ the area outside of the layer's bounding box doesn't darken the border voxels of
342
+ the target mag.
343
+ """
351
344
  (source_view, target_view, _i) = args
345
+ source_mag = source_view.mag.to_vec3_int()
352
346
 
353
347
  try:
354
348
  source_bbox = source_view.normalized_bounding_box
@@ -376,9 +370,37 @@ def downsample_cube_job(
376
370
 
377
371
  bbox = source_bbox.offset(source_offset).with_size_xyz(source_size)
378
372
 
379
- cube_buffer_channels = source_view.read_cxyz(
380
- absolute_bounding_box=bbox,
381
- )
373
+ if valid_source_bbox is None:
374
+ valid_topleft = bbox.topleft_xyz
375
+ valid_bottomright = bbox.bottomright_xyz
376
+ else:
377
+ valid_topleft = bbox.topleft_xyz.pairmax(valid_source_bbox.topleft_xyz)
378
+ valid_bottomright = bbox.bottomright_xyz.pairmin(
379
+ valid_source_bbox.bottomright_xyz
380
+ )
381
+
382
+ if (
383
+ valid_topleft == bbox.topleft_xyz
384
+ and valid_bottomright == bbox.bottomright_xyz
385
+ ):
386
+ cube_buffer_channels = source_view.read_cxyz(
387
+ absolute_bounding_box=bbox,
388
+ )
389
+ else:
390
+ cube_buffer_channels = source_view.read_cxyz(
391
+ absolute_bounding_box=bbox.with_topleft_xyz(
392
+ valid_topleft
393
+ ).with_size_xyz(valid_bottomright - valid_topleft),
394
+ )
395
+ # Mirroring keeps a representative mix of the valid values, also when
396
+ # the padding is wider than the valid data (e.g. for large mag factors).
397
+ pad_before = (valid_topleft - bbox.topleft_xyz) // source_mag
398
+ pad_after = (bbox.bottomright_xyz - valid_bottomright) // source_mag
399
+ cube_buffer_channels = np.pad(
400
+ cube_buffer_channels,
401
+ [(0, 0)] + list(zip(pad_before, pad_after)),
402
+ mode="symmetric",
403
+ )
382
404
 
383
405
  for channel_index in range(num_channels):
384
406
  cube_buffer = cube_buffer_channels[channel_index]
@@ -843,15 +843,14 @@ class Layer(AbstractLayer):
843
843
  mag = Mag(mag) if mag is not None else foreign_mag_view.mag
844
844
  self._assert_mag_does_not_exist_yet(mag)
845
845
 
846
+ # Validated against the foreign properties without opening the foreign array,
847
+ # whose path might not be readable from here, e.g. a direct path without
848
+ # credentials for the underlying storage.
849
+ foreign_data_format = foreign_mag_view.data_format
846
850
  if isinstance(foreign_mag_view, RemoteMagView):
847
- # The remote properties suffice, so the foreign array is not opened.
848
- # Its path might not be readable from here, e.g. a direct path without
849
- # credentials for the underlying storage.
850
- foreign_data_format = foreign_mag_view.data_format
851
851
  foreign_dtype = foreign_mag_view._layer_properties.dtype_np
852
852
  else:
853
- foreign_data_format = foreign_mag_view.info.data_format
854
- foreign_dtype = foreign_mag_view.get_dtype()
853
+ foreign_dtype = foreign_mag_view.layer.dtype
855
854
  assert self.data_format == foreign_data_format, (
856
855
  f"Cannot add a remote mag whose data format {foreign_data_format} "
857
856
  + f"does not match the layers data format {self.data_format}"
@@ -1250,6 +1249,11 @@ class Layer(AbstractLayer):
1250
1249
  mag_factors=mag_factors,
1251
1250
  interpolation_mode=parsed_interpolation_mode,
1252
1251
  buffer_shape=buffer_shape,
1252
+ # Source voxels outside of the layer's bounding box are not read,
1253
+ # so that they don't darken the border voxels of the target mag.
1254
+ valid_source_bbox=self.normalized_bounding_box.align_with_mag(
1255
+ from_mag, ceil=True
1256
+ ),
1253
1257
  )
1254
1258
  # The downsampling computation is chunked using buffer_shape anyways.
1255
1259
  # The target_chunk_shape determines how many jobs are spawned. Increase it
@@ -0,0 +1 @@
1
+ __version__ = '4.2.2'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: webknossos
3
- Version: 4.2.0
3
+ Version: 4.2.2
4
4
  Summary: Python API for working with WEBKNOSSOS datasets, annotations, and for WEBKNOSSOS server interaction.
5
5
  Author-email: scalable minds <hello@scalableminds.com>
6
6
  License: AGPL-3.0
@@ -37,7 +37,7 @@ Requires-Dist: boltons>=21.0.0
37
37
  Requires-Dist: cattrs>=22.0.0
38
38
  Requires-Dist: certifi>=2023
39
39
  Requires-Dist: click<8.2.0
40
- Requires-Dist: cluster-tools==4.2.0
40
+ Requires-Dist: cluster-tools==4.2.2
41
41
  Requires-Dist: httpx~=0.27.0
42
42
  Requires-Dist: imageio>=2.37.0
43
43
  Requires-Dist: lz4>=4.0.0
@@ -4,7 +4,7 @@ boltons>=21.0.0
4
4
  cattrs>=22.0.0
5
5
  certifi>=2023
6
6
  click<8.2.0
7
- cluster-tools==4.2.0
7
+ cluster-tools==4.2.2
8
8
  httpx~=0.27.0
9
9
  imageio>=2.37.0
10
10
  lz4>=4.0.0
@@ -1 +0,0 @@
1
- __version__ = '4.2.0'
File without changes
File without changes
File without changes