ome-arrow 0.0.2__tar.gz → 0.0.3__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 (104) hide show
  1. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/.github/workflows/publish-docs.yml +8 -4
  2. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/.github/workflows/publish-pypi.yml +3 -3
  3. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/.github/workflows/run-tests.yml +6 -6
  4. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/.pre-commit-config.yaml +1 -1
  5. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/CITATION.cff +3 -0
  6. ome_arrow-0.0.3/PKG-INFO +111 -0
  7. ome_arrow-0.0.3/README.md +80 -0
  8. ome_arrow-0.0.3/docs/src/_static/logo.png +0 -0
  9. ome_arrow-0.0.3/docs/src/_static/references_to_files.png +0 -0
  10. ome_arrow-0.0.3/docs/src/_static/various_ome_arrow_schema.png +0 -0
  11. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/docs/src/conf.py +3 -0
  12. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/docs/src/examples/learning_to_fly_with_ome-arrow.ipynb +47 -21
  13. ome_arrow-0.0.3/docs/src/examples/learning_to_fly_with_ome-arrow.py +82 -0
  14. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/src/ome_arrow/_version.py +3 -3
  15. ome_arrow-0.0.3/src/ome_arrow.egg-info/PKG-INFO +111 -0
  16. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/src/ome_arrow.egg-info/SOURCES.txt +3 -0
  17. ome_arrow-0.0.2/PKG-INFO +0 -34
  18. ome_arrow-0.0.2/README.md +0 -3
  19. ome_arrow-0.0.2/docs/src/examples/learning_to_fly_with_ome-arrow.py +0 -57
  20. ome_arrow-0.0.2/src/ome_arrow.egg-info/PKG-INFO +0 -34
  21. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/.github/ISSUE_TEMPLATE/issue.yml +0 -0
  22. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  23. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/.github/dependabot.yml +0 -0
  24. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/.github/release-drafter.yml +0 -0
  25. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/.github/workflows/draft-release.yml +0 -0
  26. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/.gitignore +0 -0
  27. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/.python-version +0 -0
  28. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/CODE_OF_CONDUCT.md +0 -0
  29. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/CONTRIBUTING.md +0 -0
  30. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/LICENSE +0 -0
  31. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/docs/src/index.md +0 -0
  32. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/docs/src/python-api.md +0 -0
  33. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/pyproject.toml +0 -0
  34. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/setup.cfg +0 -0
  35. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/src/ome_arrow/__init__.py +0 -0
  36. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/src/ome_arrow/core.py +0 -0
  37. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/src/ome_arrow/export.py +0 -0
  38. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/src/ome_arrow/ingest.py +0 -0
  39. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/src/ome_arrow/meta.py +0 -0
  40. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/src/ome_arrow/transform.py +0 -0
  41. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/src/ome_arrow/utils.py +0 -0
  42. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/src/ome_arrow/view.py +0 -0
  43. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/src/ome_arrow.egg-info/dependency_links.txt +0 -0
  44. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/src/ome_arrow.egg-info/requires.txt +0 -0
  45. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/src/ome_arrow.egg-info/top_level.txt +0 -0
  46. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/tests/conftest.py +0 -0
  47. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/tests/data/examplehuman/AS_09125_050116030001_D03f00d0.tif +0 -0
  48. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/tests/data/examplehuman/AS_09125_050116030001_D03f00d1.tif +0 -0
  49. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/tests/data/examplehuman/AS_09125_050116030001_D03f00d2.tif +0 -0
  50. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/tests/data/nviz-artificial-4d-dataset/E99_C111_ZS000.tif +0 -0
  51. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/tests/data/nviz-artificial-4d-dataset/E99_C111_ZS001.tif +0 -0
  52. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/tests/data/nviz-artificial-4d-dataset/E99_C111_ZS002.tif +0 -0
  53. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/tests/data/nviz-artificial-4d-dataset/E99_C111_ZS003.tif +0 -0
  54. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/tests/data/nviz-artificial-4d-dataset/E99_C111_ZS004.tif +0 -0
  55. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/tests/data/nviz-artificial-4d-dataset/E99_C111_ZS005.tif +0 -0
  56. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/tests/data/nviz-artificial-4d-dataset/E99_C111_ZS006.tif +0 -0
  57. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/tests/data/nviz-artificial-4d-dataset/E99_C111_ZS007.tif +0 -0
  58. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/tests/data/nviz-artificial-4d-dataset/E99_C111_ZS008.tif +0 -0
  59. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/tests/data/nviz-artificial-4d-dataset/E99_C111_ZS009.tif +0 -0
  60. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/tests/data/nviz-artificial-4d-dataset/E99_C111_ZS010.tif +0 -0
  61. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/tests/data/nviz-artificial-4d-dataset/E99_C111_ZS011.tif +0 -0
  62. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/tests/data/nviz-artificial-4d-dataset/E99_C111_ZS012.tif +0 -0
  63. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/tests/data/nviz-artificial-4d-dataset/E99_C111_ZS013.tif +0 -0
  64. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/tests/data/nviz-artificial-4d-dataset/E99_C111_ZS014.tif +0 -0
  65. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/tests/data/nviz-artificial-4d-dataset/E99_C111_ZS015.tif +0 -0
  66. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/tests/data/nviz-artificial-4d-dataset/E99_C111_ZS016.tif +0 -0
  67. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/tests/data/nviz-artificial-4d-dataset/E99_C111_ZS017.tif +0 -0
  68. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/tests/data/nviz-artificial-4d-dataset/E99_C111_ZS018.tif +0 -0
  69. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/tests/data/nviz-artificial-4d-dataset/E99_C111_ZS019.tif +0 -0
  70. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/tests/data/nviz-artificial-4d-dataset/E99_C111_ZS020.tif +0 -0
  71. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/tests/data/nviz-artificial-4d-dataset/E99_C111_ZS021.tif +0 -0
  72. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/tests/data/nviz-artificial-4d-dataset/E99_C222_ZS000.tif +0 -0
  73. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/tests/data/nviz-artificial-4d-dataset/E99_C222_ZS001.tif +0 -0
  74. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/tests/data/nviz-artificial-4d-dataset/E99_C222_ZS002.tif +0 -0
  75. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/tests/data/nviz-artificial-4d-dataset/E99_C222_ZS003.tif +0 -0
  76. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/tests/data/nviz-artificial-4d-dataset/E99_C222_ZS004.tif +0 -0
  77. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/tests/data/nviz-artificial-4d-dataset/E99_C222_ZS005.tif +0 -0
  78. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/tests/data/nviz-artificial-4d-dataset/E99_C222_ZS006.tif +0 -0
  79. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/tests/data/nviz-artificial-4d-dataset/E99_C222_ZS007.tif +0 -0
  80. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/tests/data/nviz-artificial-4d-dataset/E99_C222_ZS008.tif +0 -0
  81. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/tests/data/nviz-artificial-4d-dataset/E99_C222_ZS009.tif +0 -0
  82. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/tests/data/nviz-artificial-4d-dataset/E99_C222_ZS010.tif +0 -0
  83. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/tests/data/nviz-artificial-4d-dataset/E99_C222_ZS011.tif +0 -0
  84. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/tests/data/nviz-artificial-4d-dataset/E99_C222_ZS012.tif +0 -0
  85. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/tests/data/nviz-artificial-4d-dataset/E99_C222_ZS013.tif +0 -0
  86. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/tests/data/nviz-artificial-4d-dataset/E99_C222_ZS014.tif +0 -0
  87. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/tests/data/nviz-artificial-4d-dataset/E99_C222_ZS015.tif +0 -0
  88. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/tests/data/nviz-artificial-4d-dataset/E99_C222_ZS016.tif +0 -0
  89. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/tests/data/nviz-artificial-4d-dataset/E99_C222_ZS017.tif +0 -0
  90. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/tests/data/nviz-artificial-4d-dataset/E99_C222_ZS018.tif +0 -0
  91. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/tests/data/nviz-artificial-4d-dataset/E99_C222_ZS019.tif +0 -0
  92. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/tests/data/nviz-artificial-4d-dataset/E99_C222_ZS020.tif +0 -0
  93. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/tests/data/nviz-artificial-4d-dataset/E99_C222_ZS021.tif +0 -0
  94. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/tests/data/ome-artificial-5d-datasets/4D-series.ome.tiff +0 -0
  95. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/tests/data/ome-artificial-5d-datasets/multi-channel-4D-series.ome.tiff +0 -0
  96. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/tests/data/ome-artificial-5d-datasets/multi-channel-time-series.ome.tiff +0 -0
  97. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/tests/data/ome-artificial-5d-datasets/multi-channel-z-series.ome.tiff +0 -0
  98. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/tests/data/ome-artificial-5d-datasets/multi-channel.ome.tiff +0 -0
  99. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/tests/data/ome-artificial-5d-datasets/single-channel.ome.tiff +0 -0
  100. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/tests/data/ome-artificial-5d-datasets/time-series.ome.tif +0 -0
  101. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/tests/data/ome-artificial-5d-datasets/z-series.ome.tiff +0 -0
  102. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/tests/test_core.py +0 -0
  103. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/tests/test_utils.py +0 -0
  104. {ome_arrow-0.0.2 → ome_arrow-0.0.3}/uv.lock +0 -0
@@ -10,26 +10,30 @@ on:
10
10
  types:
11
11
  - published
12
12
 
13
+ permissions:
14
+ contents: write
15
+
13
16
  jobs:
14
17
  build:
15
18
  # only build and deploy docs if the actor is not dependabot
16
19
  if: ${{ github.actor != 'dependabot[bot]' }}
17
- runs-on: ubuntu-22.04
20
+ runs-on: ubuntu-24.04
18
21
  steps:
19
22
  - name: Checkout
20
- uses: actions/checkout@v4
23
+ uses: actions/checkout@v5
21
24
  with:
22
25
  fetch-depth: 0
23
- - uses: actions/setup-python@v5
26
+ - uses: actions/setup-python@v6
24
27
  with:
25
28
  python-version: "3.11"
26
29
  - name: Install the latest version of uv
27
- uses: astral-sh/setup-uv@v6
30
+ uses: astral-sh/setup-uv@v7
28
31
  - name: Build documentation
29
32
  run: |
30
33
  mkdir pages
31
34
  touch pages/.nojekyll
32
35
  cd docs
36
+ uv sync --all-extras --all-groups
33
37
  uv run --frozen sphinx-build src build
34
38
  # remove any doctrees dirs which aren't needed for publishing
35
39
  find ./build -type d -name '.doctrees' -exec rm -rf {} +
@@ -16,17 +16,17 @@ jobs:
16
16
  id-token: write
17
17
  steps:
18
18
  - name: Checkout
19
- uses: actions/checkout@v4
19
+ uses: actions/checkout@v5
20
20
  with:
21
21
  fetch-depth: 0
22
22
  - name: Fetch tags
23
23
  run: git fetch --all --tags
24
24
  - name: Python setup
25
- uses: actions/setup-python@v5
25
+ uses: actions/setup-python@v6
26
26
  with:
27
27
  python-version: "3.11"
28
28
  - name: Install the latest version of uv
29
- uses: astral-sh/setup-uv@v6
29
+ uses: astral-sh/setup-uv@v7
30
30
  - name: uv build distribution content
31
31
  run: uv build
32
32
  - name: Publish package distributions to PyPI
@@ -13,14 +13,14 @@ jobs:
13
13
  runs-on: ubuntu-24.04
14
14
  steps:
15
15
  # checks out the repo
16
- - uses: actions/checkout@v4
16
+ - uses: actions/checkout@v5
17
17
  # run pre-commit
18
18
  - name: Python setup
19
- uses: actions/setup-python@v5
19
+ uses: actions/setup-python@v6
20
20
  with:
21
21
  python-version: "3.11"
22
22
  - name: Install the latest version of uv
23
- uses: astral-sh/setup-uv@v6
23
+ uses: astral-sh/setup-uv@v7
24
24
  - uses: pre-commit/action@v3.0.1
25
25
  # run pre-commit ci lite for automated fixes
26
26
  - uses: pre-commit-ci/lite-action@v1.1.0
@@ -35,12 +35,12 @@ jobs:
35
35
  OS: ${{ matrix.os }}
36
36
  steps:
37
37
  - name: Checkout
38
- uses: actions/checkout@v4
38
+ uses: actions/checkout@v5
39
39
  - name: Python setup
40
- uses: actions/setup-python@v5
40
+ uses: actions/setup-python@v6
41
41
  with:
42
42
  python-version: ${{ matrix.python_version }}
43
43
  - name: Install the latest version of uv
44
- uses: astral-sh/setup-uv@v6
44
+ uses: astral-sh/setup-uv@v7
45
45
  - name: Run pytest
46
46
  run: uv run --frozen pytest
@@ -39,7 +39,7 @@ repos:
39
39
  - id: yamllint
40
40
  exclude: pre-commit-config.yaml
41
41
  - repo: https://github.com/astral-sh/ruff-pre-commit
42
- rev: "v0.14.4"
42
+ rev: "v0.14.5"
43
43
  hooks:
44
44
  - id: ruff-format
45
45
  - id: ruff-check
@@ -17,6 +17,9 @@ authors:
17
17
  - given-names: Michael
18
18
  family-names: Lippincott
19
19
  orcid: 'https://orcid.org/0000-0002-8637-1448'
20
+ - given-names: Cameron
21
+ family-names: Mattson
22
+ orcid: 'https://orcid.org/0009-0008-4969-779X'
20
23
  - given-names: Gregory
21
24
  family-names: Way
22
25
  orcid: 'https://orcid.org/0000-0002-0503-9348'
@@ -0,0 +1,111 @@
1
+ Metadata-Version: 2.4
2
+ Name: ome-arrow
3
+ Version: 0.0.3
4
+ Summary: Using OME specifications with Apache Arrow for fast, queryable, and language agnostic bioimage data.
5
+ Author: Dave Bunten
6
+ Classifier: Programming Language :: Python :: 3 :: Only
7
+ Classifier: Programming Language :: Python :: 3.11
8
+ Classifier: Programming Language :: Python :: 3.12
9
+ Classifier: Programming Language :: Python :: 3.13
10
+ Classifier: Programming Language :: Python :: 3.14
11
+ Requires-Python: >=3.11
12
+ Description-Content-Type: text/markdown
13
+ License-File: LICENSE
14
+ Requires-Dist: bioio>=3
15
+ Requires-Dist: bioio-ome-tiff>=1.4
16
+ Requires-Dist: bioio-ome-zarr>=3.0.3
17
+ Requires-Dist: bioio-tifffile>=1.3
18
+ Requires-Dist: fire>=0.7
19
+ Requires-Dist: ipywidgets>=8.1.8
20
+ Requires-Dist: jupyterlab-widgets>=3.0.16
21
+ Requires-Dist: matplotlib>=3.10.7
22
+ Requires-Dist: numpy>=2.2.6
23
+ Requires-Dist: pandas>=2.2.3
24
+ Requires-Dist: pillow>=12
25
+ Requires-Dist: pyarrow>=22
26
+ Requires-Dist: pyvista>=0.46.4
27
+ Requires-Dist: trame>=3.12
28
+ Requires-Dist: trame-vtk>=2.10
29
+ Requires-Dist: trame-vuetify>=3.1
30
+ Dynamic: license-file
31
+
32
+ <img height="200" src="https://raw.githubusercontent.com/wayscience/ome-arrow/main/docs/src/_static/logo.png?raw=true">
33
+
34
+ ![PyPI - Version](https://img.shields.io/pypi/v/ome-arrow)
35
+ [![Build Status](https://github.com/wayscience/ome-arrow/actions/workflows/run-tests.yml/badge.svg?branch=main)](https://github.com/wayscience/ome-arrow/actions/workflows/run-tests.yml?query=branch%3Amain)
36
+ [![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)
37
+ [![uv](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/uv/main/assets/badge/v0.json)](https://github.com/astral-sh/uv)
38
+
39
+ # Open, interoperable, and queryable microscopy images with OME Arrow
40
+
41
+ OME-Arrow uses [Open Microscopy Environment (OME)](https://github.com/ome) specifications through [Apache Arrow](https://arrow.apache.org/) for fast, queryable, and language agnostic bioimage data.
42
+
43
+ <img height="200" src="https://raw.githubusercontent.com/wayscience/ome-arrow/main/docs/src/_static/references_to_files.png">
44
+
45
+ __Images are often left behind from the data model, referenced but excluded from databases.__
46
+
47
+ <img height="200" src="https://raw.githubusercontent.com/wayscience/ome-arrow/main/docs/src/_static/various_ome_arrow_schema.png">
48
+
49
+ __OME-Arrow brings images back into the story.__
50
+
51
+ OME Arrow enables image data to be stored alongside metadata or derived data such as single-cell morphology features.
52
+ Images in OME Arrow are composed of mutlilayer [structs](https://arrow.apache.org/docs/python/generated/pyarrow.struct.html) so they may be stored as values within tables.
53
+ This means you can store, query, and build relationships on data from the same location using any system which is compatible with Apache Arrow (including Parquet) through common data interfaces (such as SQL and DuckDB).
54
+
55
+ ## Installation
56
+
57
+ Install OME Arrow from PyPI or from source:
58
+
59
+ ```sh
60
+ # install from pypi
61
+ pip install ome-arrow
62
+
63
+ # install directly from source
64
+ pip install git+https://github.com/wayscience/ome-arrow.git
65
+ ```
66
+
67
+ ## Quick start
68
+
69
+ See below for a quick start guide.
70
+ Please also reference an example notebook: [Learning to fly with OME-Arrow](https://github.com/wayscience/ome-arrow/tree/main/docs/src/examples/learning_to_fly_with_ome-arrow.ipynb).
71
+
72
+ ```python
73
+ from ome_arrow import OMEArrow
74
+
75
+ # Ingest a tif image through a convenient OME Arrow class
76
+ # We can also ingest OME-Zarr or NumPy arrays.
77
+ oa_image = OMEArrow(
78
+ data="your_image.tif"
79
+ )
80
+
81
+ # Access the OME Arrow struct itself
82
+ # (compatible with Arrow-compliant data storage).
83
+ oa_image.data
84
+
85
+ # Show information about the image.
86
+ oa_image.info()
87
+
88
+ # Display the image with matplotlib.
89
+ oa_image.view(how="matplotlib")
90
+
91
+ # Display the image with pyvista
92
+ # (great for ZYX 3D images).
93
+ oa_image.view(how="pyvista")
94
+
95
+ # Export to OME-Parquet.
96
+ # We can also export OME-TIFF, OME-Zarr or NumPy arrays.
97
+ oa_image.export(how="ome-parquet", out="your_image.ome.parquet")
98
+ ```
99
+
100
+ ## Contributing, Development, and Testing
101
+
102
+ Please see our [contributing documentation](https://github.com/wayscience/ome-arrow/tree/main/CONTRIBUTING.md) for more details on contributions, development, and testing.
103
+
104
+ ## Related projects
105
+
106
+ OME Arrow is used or inspired by the following projects, check them out!
107
+
108
+ - [`napari-ome-arrow`](https://github.com/WayScience/napari-ome-arrow): enables you to view OME Arrow and related images.
109
+ - [`nViz`](https://github.com/WayScience/nViz): focuses on ingesting and visualizing various 3D image data.
110
+ - [`CytoDataFrame`](https://github.com/cytomining/CytoDataFrame): provides a DataFrame-like experience for viewing feature and microscopy image data within Jupyter notebook interfaces.
111
+ - [`coSMicQC`](https://github.com/cytomining/coSMicQC): performs quality control on microscopy feature datasets, visualized using CytoDataFrames.
@@ -0,0 +1,80 @@
1
+ <img height="200" src="https://raw.githubusercontent.com/wayscience/ome-arrow/main/docs/src/_static/logo.png?raw=true">
2
+
3
+ ![PyPI - Version](https://img.shields.io/pypi/v/ome-arrow)
4
+ [![Build Status](https://github.com/wayscience/ome-arrow/actions/workflows/run-tests.yml/badge.svg?branch=main)](https://github.com/wayscience/ome-arrow/actions/workflows/run-tests.yml?query=branch%3Amain)
5
+ [![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)
6
+ [![uv](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/uv/main/assets/badge/v0.json)](https://github.com/astral-sh/uv)
7
+
8
+ # Open, interoperable, and queryable microscopy images with OME Arrow
9
+
10
+ OME-Arrow uses [Open Microscopy Environment (OME)](https://github.com/ome) specifications through [Apache Arrow](https://arrow.apache.org/) for fast, queryable, and language agnostic bioimage data.
11
+
12
+ <img height="200" src="https://raw.githubusercontent.com/wayscience/ome-arrow/main/docs/src/_static/references_to_files.png">
13
+
14
+ __Images are often left behind from the data model, referenced but excluded from databases.__
15
+
16
+ <img height="200" src="https://raw.githubusercontent.com/wayscience/ome-arrow/main/docs/src/_static/various_ome_arrow_schema.png">
17
+
18
+ __OME-Arrow brings images back into the story.__
19
+
20
+ OME Arrow enables image data to be stored alongside metadata or derived data such as single-cell morphology features.
21
+ Images in OME Arrow are composed of mutlilayer [structs](https://arrow.apache.org/docs/python/generated/pyarrow.struct.html) so they may be stored as values within tables.
22
+ This means you can store, query, and build relationships on data from the same location using any system which is compatible with Apache Arrow (including Parquet) through common data interfaces (such as SQL and DuckDB).
23
+
24
+ ## Installation
25
+
26
+ Install OME Arrow from PyPI or from source:
27
+
28
+ ```sh
29
+ # install from pypi
30
+ pip install ome-arrow
31
+
32
+ # install directly from source
33
+ pip install git+https://github.com/wayscience/ome-arrow.git
34
+ ```
35
+
36
+ ## Quick start
37
+
38
+ See below for a quick start guide.
39
+ Please also reference an example notebook: [Learning to fly with OME-Arrow](https://github.com/wayscience/ome-arrow/tree/main/docs/src/examples/learning_to_fly_with_ome-arrow.ipynb).
40
+
41
+ ```python
42
+ from ome_arrow import OMEArrow
43
+
44
+ # Ingest a tif image through a convenient OME Arrow class
45
+ # We can also ingest OME-Zarr or NumPy arrays.
46
+ oa_image = OMEArrow(
47
+ data="your_image.tif"
48
+ )
49
+
50
+ # Access the OME Arrow struct itself
51
+ # (compatible with Arrow-compliant data storage).
52
+ oa_image.data
53
+
54
+ # Show information about the image.
55
+ oa_image.info()
56
+
57
+ # Display the image with matplotlib.
58
+ oa_image.view(how="matplotlib")
59
+
60
+ # Display the image with pyvista
61
+ # (great for ZYX 3D images).
62
+ oa_image.view(how="pyvista")
63
+
64
+ # Export to OME-Parquet.
65
+ # We can also export OME-TIFF, OME-Zarr or NumPy arrays.
66
+ oa_image.export(how="ome-parquet", out="your_image.ome.parquet")
67
+ ```
68
+
69
+ ## Contributing, Development, and Testing
70
+
71
+ Please see our [contributing documentation](https://github.com/wayscience/ome-arrow/tree/main/CONTRIBUTING.md) for more details on contributions, development, and testing.
72
+
73
+ ## Related projects
74
+
75
+ OME Arrow is used or inspired by the following projects, check them out!
76
+
77
+ - [`napari-ome-arrow`](https://github.com/WayScience/napari-ome-arrow): enables you to view OME Arrow and related images.
78
+ - [`nViz`](https://github.com/WayScience/nViz): focuses on ingesting and visualizing various 3D image data.
79
+ - [`CytoDataFrame`](https://github.com/cytomining/CytoDataFrame): provides a DataFrame-like experience for viewing feature and microscopy image data within Jupyter notebook interfaces.
80
+ - [`coSMicQC`](https://github.com/cytomining/coSMicQC): performs quality control on microscopy feature datasets, visualized using CytoDataFrames.
@@ -83,3 +83,6 @@ autodoc_preserve_defaults = True
83
83
 
84
84
  # enable anchor creation
85
85
  myst_heading_anchors = 3
86
+
87
+ # disable notebook execution
88
+ nb_execution_mode = "off"
@@ -5,7 +5,9 @@
5
5
  "id": "d778aece-5867-49b6-8890-f5a387f22c44",
6
6
  "metadata": {},
7
7
  "source": [
8
- "# Learning to fly with OME-Arrow\n"
8
+ "# Learning to fly with OME-Arrow\n",
9
+ "\n",
10
+ "This notebook provides a quick demonstration of what you can do with OME Arrow."
9
11
  ]
10
12
  },
11
13
  {
@@ -15,6 +17,8 @@
15
17
  "metadata": {},
16
18
  "outputs": [],
17
19
  "source": [
20
+ "# we import a single class, OMEArrow\n",
21
+ "# which handles all data I/O and manipulation\n",
18
22
  "from ome_arrow import OMEArrow"
19
23
  ]
20
24
  },
@@ -30,7 +34,7 @@
30
34
  "2D image, single-channel - shape (T=1, C=1, Z=1, Y=512, X=512)"
31
35
  ],
32
36
  "text/plain": [
33
- "<ome_arrow.core.OMEArrow at 0x169de7d90>"
37
+ "<ome_arrow.core.OMEArrow at 0x162d227d0>"
34
38
  ]
35
39
  },
36
40
  "execution_count": 2,
@@ -49,9 +53,11 @@
49
53
  }
50
54
  ],
51
55
  "source": [
56
+ "# read a TIFF file and convert it to OME-Arrow\n",
52
57
  "oa_image = OMEArrow(\n",
53
58
  " data=\"../../../tests/data/examplehuman/AS_09125_050116030001_D03f00d0.tif\"\n",
54
59
  ")\n",
60
+ "# by default, the image and metadata are shown\n",
55
61
  "oa_image"
56
62
  ]
57
63
  },
@@ -77,6 +83,7 @@
77
83
  }
78
84
  ],
79
85
  "source": [
86
+ "# we can also get a summary of the OME-Arrow object\n",
80
87
  "oa_image.info()"
81
88
  ]
82
89
  },
@@ -105,6 +112,8 @@
105
112
  }
106
113
  ],
107
114
  "source": [
115
+ "# we can export the data into a number\n",
116
+ "# of different formats, e.g. numpy\n",
108
117
  "oa_image.export(how=\"numpy\")"
109
118
  ]
110
119
  },
@@ -120,7 +129,7 @@
120
129
  "3D image (z-stack), multi-channel (2 channels) - shape (T=1, C=2, Z=22, Y=128, X=128)"
121
130
  ],
122
131
  "text/plain": [
123
- "<ome_arrow.core.OMEArrow at 0x31d2e8550>"
132
+ "<ome_arrow.core.OMEArrow at 0x1662b2810>"
124
133
  ]
125
134
  },
126
135
  "execution_count": 5,
@@ -139,8 +148,11 @@
139
148
  }
140
149
  ],
141
150
  "source": [
151
+ "# We can also read in TIFF stacks following OME bfconvert API conventions\n",
142
152
  "stack = OMEArrow(\n",
143
153
  " data=\"../../../tests/data/nviz-artificial-4d-dataset/E99_C<111,222>_ZS<000-021>.tif\",\n",
154
+ " # this is an optional for which\n",
155
+ " # timepoint, channel, and z-slice to show by default\n",
144
156
  " tcz=(0, 0, 20),\n",
145
157
  ")\n",
146
158
  "stack"
@@ -148,19 +160,19 @@
148
160
  },
149
161
  {
150
162
  "cell_type": "code",
151
- "execution_count": 10,
163
+ "execution_count": 6,
152
164
  "id": "383e1f10-b32f-47cb-9906-15dd9947b09a",
153
165
  "metadata": {},
154
166
  "outputs": [
155
167
  {
156
168
  "data": {
157
169
  "application/vnd.jupyter.widget-view+json": {
158
- "model_id": "cf00f3c09cc340f792d8811b76cc739b",
170
+ "model_id": "e644f91c4e3843c39f130f05b628277e",
159
171
  "version_major": 2,
160
172
  "version_minor": 0
161
173
  },
162
174
  "text/plain": [
163
- "Widget(value='<iframe src=\"http://localhost:65381/index.html?ui=P_0x3620ef510_0&reconnect=auto\" class=\"pyvista…"
175
+ "Widget(value='<iframe src=\"http://localhost:55867/index.html?ui=P_0x1663cf990_0&reconnect=auto\" class=\"pyvista…"
164
176
  ]
165
177
  },
166
178
  "metadata": {},
@@ -186,21 +198,22 @@
186
198
  {
187
199
  "data": {
188
200
  "text/plain": [
189
- "<pyvista.plotting.plotter.Plotter at 0x3620ef510>"
201
+ "<pyvista.plotting.plotter.Plotter at 0x1663cf990>"
190
202
  ]
191
203
  },
192
- "execution_count": 10,
204
+ "execution_count": 6,
193
205
  "metadata": {},
194
206
  "output_type": "execute_result"
195
207
  }
196
208
  ],
197
209
  "source": [
210
+ "# we can visualize the stack using pyvista for 3D rendering\n",
198
211
  "stack.view(how=\"pyvista\")"
199
212
  ]
200
213
  },
201
214
  {
202
215
  "cell_type": "code",
203
- "execution_count": 6,
216
+ "execution_count": 7,
204
217
  "id": "d041ba28-bb16-4833-9661-9c9da2ff3a9c",
205
218
  "metadata": {},
206
219
  "outputs": [
@@ -210,10 +223,10 @@
210
223
  "3D image (z-stack), multi-channel (2 channels) - shape (T=1, C=2, Z=22, Y=128, X=128)"
211
224
  ],
212
225
  "text/plain": [
213
- "<ome_arrow.core.OMEArrow at 0x31d3a9790>"
226
+ "<ome_arrow.core.OMEArrow at 0x10aae1ad0>"
214
227
  ]
215
228
  },
216
- "execution_count": 6,
229
+ "execution_count": 7,
217
230
  "metadata": {},
218
231
  "output_type": "execute_result"
219
232
  },
@@ -229,13 +242,16 @@
229
242
  }
230
243
  ],
231
244
  "source": [
245
+ "# here we demonstrate that the data can be exported again\n",
246
+ "# into numpy format and re-imported\n",
247
+ "# into a new OME-Arrow object (from numpy data).\n",
232
248
  "stack_np = stack.export(how=\"numpy\")\n",
233
249
  "OMEArrow(data=stack_np, tcz=(0, 0, 20))"
234
250
  ]
235
251
  },
236
252
  {
237
253
  "cell_type": "code",
238
- "execution_count": 7,
254
+ "execution_count": 8,
239
255
  "id": "013baec4-0fed-452c-b200-cfd3b5f04d3e",
240
256
  "metadata": {},
241
257
  "outputs": [
@@ -245,10 +261,10 @@
245
261
  "3D image (z-stack), multi-channel (2 channels) - shape (T=1, C=2, Z=22, Y=128, X=128)"
246
262
  ],
247
263
  "text/plain": [
248
- "<ome_arrow.core.OMEArrow at 0x31d3e1710>"
264
+ "<ome_arrow.core.OMEArrow at 0x1662019d0>"
249
265
  ]
250
266
  },
251
- "execution_count": 7,
267
+ "execution_count": 8,
252
268
  "metadata": {},
253
269
  "output_type": "execute_result"
254
270
  },
@@ -264,13 +280,16 @@
264
280
  }
265
281
  ],
266
282
  "source": [
283
+ "# here we demonstrate that the data can be exported again\n",
284
+ "# into OME-TIFF format and re-imported\n",
285
+ "# into a new OME-Arrow object (from OME-TIFF data).\n",
267
286
  "stack.export(how=\"ome-tiff\", out=\"example.ome.tiff\")\n",
268
287
  "OMEArrow(data=\"example.ome.tiff\", tcz=(0, 0, 20))"
269
288
  ]
270
289
  },
271
290
  {
272
291
  "cell_type": "code",
273
- "execution_count": 8,
292
+ "execution_count": 9,
274
293
  "id": "ebaab572-f820-4402-9dd7-2ad5ce657e05",
275
294
  "metadata": {},
276
295
  "outputs": [
@@ -280,10 +299,10 @@
280
299
  "3D image (z-stack), multi-channel (2 channels) - shape (T=1, C=2, Z=22, Y=128, X=128)"
281
300
  ],
282
301
  "text/plain": [
283
- "<ome_arrow.core.OMEArrow at 0x31d3521d0>"
302
+ "<ome_arrow.core.OMEArrow at 0x1663adad0>"
284
303
  ]
285
304
  },
286
- "execution_count": 8,
305
+ "execution_count": 9,
287
306
  "metadata": {},
288
307
  "output_type": "execute_result"
289
308
  },
@@ -299,13 +318,16 @@
299
318
  }
300
319
  ],
301
320
  "source": [
321
+ "# here we demonstrate that the data can be exported again\n",
322
+ "# into OME-ZARR format and re-imported\n",
323
+ "# into a new OME-Arrow object (from OME-ZARR data).\n",
302
324
  "stack.export(how=\"ome-zarr\", out=\"example.ome.zarr\")\n",
303
325
  "OMEArrow(data=\"example.ome.zarr\", tcz=(0, 0, 20))"
304
326
  ]
305
327
  },
306
328
  {
307
329
  "cell_type": "code",
308
- "execution_count": 9,
330
+ "execution_count": 10,
309
331
  "id": "11b5c23c-d4b1-4170-ad0c-64c358b0cfe6",
310
332
  "metadata": {},
311
333
  "outputs": [
@@ -315,10 +337,10 @@
315
337
  "3D image (z-stack), multi-channel (2 channels) - shape (T=1, C=2, Z=22, Y=128, X=128)"
316
338
  ],
317
339
  "text/plain": [
318
- "<ome_arrow.core.OMEArrow at 0x31d349d50>"
340
+ "<ome_arrow.core.OMEArrow at 0x38064c810>"
319
341
  ]
320
342
  },
321
- "execution_count": 9,
343
+ "execution_count": 10,
322
344
  "metadata": {},
323
345
  "output_type": "execute_result"
324
346
  },
@@ -334,6 +356,9 @@
334
356
  }
335
357
  ],
336
358
  "source": [
359
+ "# here we demonstrate that the data can be exported again\n",
360
+ "# into OME-Parquet format and re-imported\n",
361
+ "# into a new OME-Arrow object (from OME-Parquet data).\n",
337
362
  "stack.export(how=\"ome-parquet\", out=\"example.ome.parquet\")\n",
338
363
  "OMEArrow(data=\"example.ome.parquet\", tcz=(0, 0, 20))"
339
364
  ]
@@ -350,7 +375,7 @@
350
375
  "2D image, single-channel - shape (T=1, C=1, Z=1, Y=30, X=30)"
351
376
  ],
352
377
  "text/plain": [
353
- "<ome_arrow.core.OMEArrow at 0x31d385f10>"
378
+ "<ome_arrow.core.OMEArrow at 0x167243690>"
354
379
  ]
355
380
  },
356
381
  "execution_count": 11,
@@ -369,6 +394,7 @@
369
394
  }
370
395
  ],
371
396
  "source": [
397
+ "# we can also slice the data to get a smaller region of interest\n",
372
398
  "stack.slice(\n",
373
399
  " x_min=40,\n",
374
400
  " y_min=80,\n",
@@ -0,0 +1,82 @@
1
+ # ---
2
+ # jupyter:
3
+ # jupytext:
4
+ # text_representation:
5
+ # extension: .py
6
+ # format_name: light
7
+ # format_version: '1.5'
8
+ # jupytext_version: 1.17.3
9
+ # kernelspec:
10
+ # display_name: ome-arrow
11
+ # language: python
12
+ # name: python3
13
+ # ---
14
+
15
+ # # Learning to fly with OME-Arrow
16
+ #
17
+ # This notebook provides a quick demonstration of what you can do with OME Arrow.
18
+
19
+ # we import a single class, OMEArrow
20
+ # which handles all data I/O and manipulation
21
+ from ome_arrow import OMEArrow
22
+
23
+ # read a TIFF file and convert it to OME-Arrow
24
+ oa_image = OMEArrow(
25
+ data="../../../tests/data/examplehuman/AS_09125_050116030001_D03f00d0.tif"
26
+ )
27
+ # by default, the image and metadata are shown
28
+ oa_image
29
+
30
+ # we can also get a summary of the OME-Arrow object
31
+ oa_image.info()
32
+
33
+ # we can export the data into a number
34
+ # of different formats, e.g. numpy
35
+ oa_image.export(how="numpy")
36
+
37
+ # We can also read in TIFF stacks following OME bfconvert API conventions
38
+ stack = OMEArrow(
39
+ data="../../../tests/data/nviz-artificial-4d-dataset/E99_C<111,222>_ZS<000-021>.tif",
40
+ # this is an optional for which
41
+ # timepoint, channel, and z-slice to show by default
42
+ tcz=(0, 0, 20),
43
+ )
44
+ stack
45
+
46
+ # we can visualize the stack using pyvista for 3D rendering
47
+ stack.view(how="pyvista")
48
+
49
+ # here we demonstrate that the data can be exported again
50
+ # into numpy format and re-imported
51
+ # into a new OME-Arrow object (from numpy data).
52
+ stack_np = stack.export(how="numpy")
53
+ OMEArrow(data=stack_np, tcz=(0, 0, 20))
54
+
55
+ # here we demonstrate that the data can be exported again
56
+ # into OME-TIFF format and re-imported
57
+ # into a new OME-Arrow object (from OME-TIFF data).
58
+ stack.export(how="ome-tiff", out="example.ome.tiff")
59
+ OMEArrow(data="example.ome.tiff", tcz=(0, 0, 20))
60
+
61
+ # here we demonstrate that the data can be exported again
62
+ # into OME-ZARR format and re-imported
63
+ # into a new OME-Arrow object (from OME-ZARR data).
64
+ stack.export(how="ome-zarr", out="example.ome.zarr")
65
+ OMEArrow(data="example.ome.zarr", tcz=(0, 0, 20))
66
+
67
+ # here we demonstrate that the data can be exported again
68
+ # into OME-Parquet format and re-imported
69
+ # into a new OME-Arrow object (from OME-Parquet data).
70
+ stack.export(how="ome-parquet", out="example.ome.parquet")
71
+ OMEArrow(data="example.ome.parquet", tcz=(0, 0, 20))
72
+
73
+ # we can also slice the data to get a smaller region of interest
74
+ stack.slice(
75
+ x_min=40,
76
+ y_min=80,
77
+ x_max=70,
78
+ y_max=110,
79
+ t_indices=[0],
80
+ c_indices=[0],
81
+ z_indices=[20],
82
+ )
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '0.0.2'
32
- __version_tuple__ = version_tuple = (0, 0, 2)
31
+ __version__ = version = '0.0.3'
32
+ __version_tuple__ = version_tuple = (0, 0, 3)
33
33
 
34
- __commit_id__ = commit_id = 'g19935963f'
34
+ __commit_id__ = commit_id = 'g401409c77'