patchworks 1.3.0__tar.gz → 1.3.1__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 (86) hide show
  1. {patchworks-1.3.0 → patchworks-1.3.1}/PKG-INFO +1 -1
  2. {patchworks-1.3.0 → patchworks-1.3.1}/docs/guide/ome_zarr_napari.md +10 -0
  3. {patchworks-1.3.0 → patchworks-1.3.1}/docs/guide/snakemake.md +18 -5
  4. {patchworks-1.3.0 → patchworks-1.3.1}/pyproject.toml +6 -5
  5. {patchworks-1.3.0 → patchworks-1.3.1}/src/patchworks/plugins/napari.py +2 -2
  6. {patchworks-1.3.0 → patchworks-1.3.1}/src/patchworks/plugins/ome_zarr.py +4 -2
  7. {patchworks-1.3.0 → patchworks-1.3.1}/.github/workflows/docs.yml +0 -0
  8. {patchworks-1.3.0 → patchworks-1.3.1}/.github/workflows/lint.yml +0 -0
  9. {patchworks-1.3.0 → patchworks-1.3.1}/.github/workflows/release.yml +0 -0
  10. {patchworks-1.3.0 → patchworks-1.3.1}/.gitignore +0 -0
  11. {patchworks-1.3.0 → patchworks-1.3.1}/.markdownlint-cli2.yaml +0 -0
  12. {patchworks-1.3.0 → patchworks-1.3.1}/LICENSE +0 -0
  13. {patchworks-1.3.0 → patchworks-1.3.1}/README.md +0 -0
  14. {patchworks-1.3.0 → patchworks-1.3.1}/cliff.toml +0 -0
  15. {patchworks-1.3.0 → patchworks-1.3.1}/docs/api/chunks.md +0 -0
  16. {patchworks-1.3.0 → patchworks-1.3.1}/docs/api/cluster.md +0 -0
  17. {patchworks-1.3.0 → patchworks-1.3.1}/docs/api/io.md +0 -0
  18. {patchworks-1.3.0 → patchworks-1.3.1}/docs/api/merge_tile_labels.md +0 -0
  19. {patchworks-1.3.0 → patchworks-1.3.1}/docs/api/plugins/cellpose.md +0 -0
  20. {patchworks-1.3.0 → patchworks-1.3.1}/docs/api/plugins/dog.md +0 -0
  21. {patchworks-1.3.0 → patchworks-1.3.1}/docs/api/plugins/napari.md +0 -0
  22. {patchworks-1.3.0 → patchworks-1.3.1}/docs/api/plugins/ome_zarr.md +0 -0
  23. {patchworks-1.3.0 → patchworks-1.3.1}/docs/api/postprocess.md +0 -0
  24. {patchworks-1.3.0 → patchworks-1.3.1}/docs/api/relabel.md +0 -0
  25. {patchworks-1.3.0 → patchworks-1.3.1}/docs/api/tile_process.md +0 -0
  26. {patchworks-1.3.0 → patchworks-1.3.1}/docs/assets/logo.png +0 -0
  27. {patchworks-1.3.0 → patchworks-1.3.1}/docs/examples/cellpose_2d.md +0 -0
  28. {patchworks-1.3.0 → patchworks-1.3.1}/docs/examples/cellpose_2d.py +0 -0
  29. {patchworks-1.3.0 → patchworks-1.3.1}/docs/examples/cellpose_3d.md +0 -0
  30. {patchworks-1.3.0 → patchworks-1.3.1}/docs/examples/cellpose_3d.py +0 -0
  31. {patchworks-1.3.0 → patchworks-1.3.1}/docs/examples/custom.md +0 -0
  32. {patchworks-1.3.0 → patchworks-1.3.1}/docs/examples/custom_method.py +0 -0
  33. {patchworks-1.3.0 → patchworks-1.3.1}/docs/examples/dog.md +0 -0
  34. {patchworks-1.3.0 → patchworks-1.3.1}/docs/examples/dog.py +0 -0
  35. {patchworks-1.3.0 → patchworks-1.3.1}/docs/examples/standalone_merge.md +0 -0
  36. {patchworks-1.3.0 → patchworks-1.3.1}/docs/examples/stardist.md +0 -0
  37. {patchworks-1.3.0 → patchworks-1.3.1}/docs/examples/stardist_2d.py +0 -0
  38. {patchworks-1.3.0 → patchworks-1.3.1}/docs/getting_started.md +0 -0
  39. {patchworks-1.3.0 → patchworks-1.3.1}/docs/guide/gpu_distributed.md +0 -0
  40. {patchworks-1.3.0 → patchworks-1.3.1}/docs/guide/merging.md +0 -0
  41. {patchworks-1.3.0 → patchworks-1.3.1}/docs/guide/performance.md +0 -0
  42. {patchworks-1.3.0 → patchworks-1.3.1}/docs/guide/pitfalls.md +0 -0
  43. {patchworks-1.3.0 → patchworks-1.3.1}/docs/guide/skip_empty.md +0 -0
  44. {patchworks-1.3.0 → patchworks-1.3.1}/docs/guide/tiling.md +0 -0
  45. {patchworks-1.3.0 → patchworks-1.3.1}/docs/index.md +0 -0
  46. {patchworks-1.3.0 → patchworks-1.3.1}/mkdocs.yml +0 -0
  47. {patchworks-1.3.0 → patchworks-1.3.1}/src/patchworks/__init__.py +0 -0
  48. {patchworks-1.3.0 → patchworks-1.3.1}/src/patchworks/_chunks.py +0 -0
  49. {patchworks-1.3.0 → patchworks-1.3.1}/src/patchworks/_cluster.py +0 -0
  50. {patchworks-1.3.0 → patchworks-1.3.1}/src/patchworks/_core.py +0 -0
  51. {patchworks-1.3.0 → patchworks-1.3.1}/src/patchworks/_distributed.py +0 -0
  52. {patchworks-1.3.0 → patchworks-1.3.1}/src/patchworks/_io.py +0 -0
  53. {patchworks-1.3.0 → patchworks-1.3.1}/src/patchworks/_merge.py +0 -0
  54. {patchworks-1.3.0 → patchworks-1.3.1}/src/patchworks/_postprocess.py +0 -0
  55. {patchworks-1.3.0 → patchworks-1.3.1}/src/patchworks/_relabel.py +0 -0
  56. {patchworks-1.3.0 → patchworks-1.3.1}/src/patchworks/_relations.py +0 -0
  57. {patchworks-1.3.0 → patchworks-1.3.1}/src/patchworks/plugins/__init__.py +0 -0
  58. {patchworks-1.3.0 → patchworks-1.3.1}/src/patchworks/plugins/cellpose.py +0 -0
  59. {patchworks-1.3.0 → patchworks-1.3.1}/src/patchworks/plugins/dog.py +0 -0
  60. {patchworks-1.3.0 → patchworks-1.3.1}/tests/test_core.py +0 -0
  61. {patchworks-1.3.0 → patchworks-1.3.1}/tests/test_distributed.py +0 -0
  62. {patchworks-1.3.0 → patchworks-1.3.1}/tests/test_dog.py +0 -0
  63. {patchworks-1.3.0 → patchworks-1.3.1}/tests/test_napari.py +0 -0
  64. {patchworks-1.3.0 → patchworks-1.3.1}/tests/test_ome_zarr.py +0 -0
  65. {patchworks-1.3.0 → patchworks-1.3.1}/tests/test_postprocess.py +0 -0
  66. {patchworks-1.3.0 → patchworks-1.3.1}/tests/test_relations.py +0 -0
  67. {patchworks-1.3.0 → patchworks-1.3.1}/workflow/README.md +0 -0
  68. {patchworks-1.3.0 → patchworks-1.3.1}/workflow/Snakefile +0 -0
  69. {patchworks-1.3.0 → patchworks-1.3.1}/workflow/config/config.yaml +0 -0
  70. {patchworks-1.3.0 → patchworks-1.3.1}/workflow/config/config_cilia.yaml +0 -0
  71. {patchworks-1.3.0 → patchworks-1.3.1}/workflow/config/config_cyto.yaml +0 -0
  72. {patchworks-1.3.0 → patchworks-1.3.1}/workflow/config/config_nuclei.yaml +0 -0
  73. {patchworks-1.3.0 → patchworks-1.3.1}/workflow/config/multi.yaml +0 -0
  74. {patchworks-1.3.0 → patchworks-1.3.1}/workflow/pixi.toml +0 -0
  75. {patchworks-1.3.0 → patchworks-1.3.1}/workflow/profile/slurm/config.yaml +0 -0
  76. {patchworks-1.3.0 → patchworks-1.3.1}/workflow/rules/common.smk +0 -0
  77. {patchworks-1.3.0 → patchworks-1.3.1}/workflow/rules/convert.smk +0 -0
  78. {patchworks-1.3.0 → patchworks-1.3.1}/workflow/rules/merge.smk +0 -0
  79. {patchworks-1.3.0 → patchworks-1.3.1}/workflow/rules/segment.smk +0 -0
  80. {patchworks-1.3.0 → patchworks-1.3.1}/workflow/scripts/_pw.py +0 -0
  81. {patchworks-1.3.0 → patchworks-1.3.1}/workflow/scripts/convert.py +0 -0
  82. {patchworks-1.3.0 → patchworks-1.3.1}/workflow/scripts/fetch_model.py +0 -0
  83. {patchworks-1.3.0 → patchworks-1.3.1}/workflow/scripts/merge.py +0 -0
  84. {patchworks-1.3.0 → patchworks-1.3.1}/workflow/scripts/prepare_tiles.py +0 -0
  85. {patchworks-1.3.0 → patchworks-1.3.1}/workflow/scripts/run_multi.py +0 -0
  86. {patchworks-1.3.0 → patchworks-1.3.1}/workflow/scripts/segment_tile.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: patchworks
3
- Version: 1.3.0
3
+ Version: 1.3.1
4
4
  Summary: Tiled processing of arbitrarily large images with globally consistent labels
5
5
  Project-URL: Homepage, https://github.com/imcf/patchworks
6
6
  Project-URL: Issues, https://github.com/imcf/patchworks/issues
@@ -152,6 +152,16 @@ just one channel instead: `view_in_napari("scan.zarr", channel=0)`.
152
152
  napari ships in `patchworks[all]`, or install just it with
153
153
  `pip install "patchworks[napari]"`.
154
154
 
155
+ !!! tip "Measuring all the objects"
156
+ Once labels are loaded, use
157
+ [napari-chunked-regionprops](https://github.com/imcf/napari-chunked-regionprops)'s
158
+ "Measure" dock widget for area/centroid/intensity stats — it works
159
+ out-of-core straight off the Labels layer's backing dask/zarr array, so
160
+ it scales to the same huge label images `tile_process` writes, unlike
161
+ plain `skimage.measure.regionprops`. Bundled in `patchworks[napari]`. See
162
+ [Measurements](snakemake.md#measurements-fast-whole-volume-regionprops)
163
+ for the non-interactive/headless equivalent.
164
+
155
165
  ## End-to-end
156
166
 
157
167
  ```python
@@ -361,10 +361,20 @@ needs `pip install "patchworks[dog]"` in the segment jobs' environment.
361
361
  ## Measurements (fast, whole-volume regionprops)
362
362
 
363
363
  `skimage.measure.regionprops` needs the full labelled + intensity array in
364
- RAM — fine for one tile, not for a hundred-thousand-object OME-ZARR. Use
365
- [`dask-image`](https://image.dask.org)'s `ndmeasure`, which computes directly
366
- on the dask/zarr-backed arrays, chunk-parallel, without materializing the
367
- volume:
364
+ RAM — fine for one tile, not for a hundred-thousand-object OME-ZARR.
365
+
366
+ **Interactively, in napari**, this is what
367
+ [napari-chunked-regionprops](https://github.com/imcf/napari-chunked-regionprops)
368
+ is for — its "Measure" dock widget computes area/centroid/intensity stats
369
+ directly off a Labels layer's dask/zarr-backed array, out-of-core, and scales
370
+ with chunk count rather than object count. It's the best fit for measuring
371
+ *every* object in a store this size, not just a cropped region — see
372
+ [View image + labels in napari](ome_zarr_napari.md#view-image--labels-in-napari).
373
+ Bundled in `patchworks[napari]`.
374
+
375
+ **Headless/scripted**, use [`dask-image`](https://image.dask.org)'s
376
+ `ndmeasure`, which computes directly on the dask/zarr-backed arrays,
377
+ chunk-parallel, without materializing the volume:
368
378
 
369
379
  ```bash
370
380
  pip install dask-image
@@ -392,7 +402,10 @@ For interactively inspecting individual cells by clicking in the viewer
392
402
  (not all objects at once), the
393
403
  [napari-skimage-regionprops](https://github.com/haesleinhuepf/napari-skimage-regionprops)
394
404
  plugin's table widget works well — point it at a cropped region rather than
395
- the full volume, since it loads its input fully into memory.
405
+ the full volume, since it loads its input fully into memory. For measuring
406
+ *all* objects at once, use
407
+ [napari-chunked-regionprops](https://github.com/imcf/napari-chunked-regionprops)
408
+ instead (see above) — it doesn't have this in-memory limitation.
396
409
 
397
410
  ## Custom segmentation function
398
411
 
@@ -72,11 +72,12 @@ imaris = ["imaris-ims-file-reader"]
72
72
  # - lxml-html-clean: napari's notebook_display imports lxml.html.clean, split
73
73
  # into a separate package in lxml >= 5.2 (else ImportError on Viewer()).
74
74
  # - glasbey: distinct high-contrast label LUTs for view_in_napari.
75
- # - napari-chunked-regionprops: out-of-core regionprops-style measurements
76
- # (area/centroid/intensity stats) for huge Labels layers, straight off
77
- # their backing dask/zarr arrays the "Measure" dock widget. Formerly
78
- # napari-dask-ndmeasure; renamed when its engine dropped dask_image.ndmeasure
79
- # for a chunk-local map/merge that scales with chunk count, not object count.
75
+ # - napari-chunked-regionprops (https://github.com/imcf/napari-chunked-regionprops):
76
+ # out-of-core regionprops-style measurements (area/centroid/intensity
77
+ # stats) for huge Labels layers, straight off their backing dask/zarr
78
+ # arrays the "Measure" dock widget. Formerly napari-dask-ndmeasure;
79
+ # renamed when its engine dropped dask_image.ndmeasure for a chunk-local
80
+ # map/merge that scales with chunk count, not object count.
80
81
  # - pyqt6 < 6.10: PyQt6-Qt6 6.10.2's Windows wheel fails to import (`DLL load
81
82
  # failed while importing QtWidgets: The specified procedure could not be
82
83
  # found`) — confirmed unrelated to napari/qtpy, reproduces on a bare
@@ -187,8 +187,8 @@ def _label_hint(path: Union[str, Path]) -> dict[str, Any]:
187
187
  during the merge) — the exact id set is then ``range(1, n_objects +
188
188
  1)`` by construction, with no scan needed. Passed through as a Labels
189
189
  layer's ``metadata`` so a downstream consumer (e.g.
190
- napari-chunked-regionprops) can use it instead of re-deriving the id
191
- set from the array itself.
190
+ napari-chunked-regionprops, https://github.com/imcf/napari-chunked-regionprops)
191
+ can use it instead of re-deriving the id set from the array itself.
192
192
 
193
193
  Parameters
194
194
  ----------
@@ -1083,8 +1083,10 @@ def register_labels(
1083
1083
  ``sequential_labels=True``, which means ``ids == range(1, n_objects
1084
1084
  + 1)`` by construction). When given, written into the label group's
1085
1085
  attrs as ``n_objects``/``sequential_labels`` so a downstream reader
1086
- (e.g. napari-chunked-regionprops) can use the known id set instead
1087
- of re-deriving it with a full-volume scan of its own.
1086
+ (e.g. napari-chunked-regionprops,
1087
+ https://github.com/imcf/napari-chunked-regionprops) can use the
1088
+ known id set instead of re-deriving it with a full-volume scan of
1089
+ its own.
1088
1090
 
1089
1091
  Returns
1090
1092
  -------
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes