Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
54 commits
Select commit Hold shift + click to select a range
15d8f00
Transformation manager foundation (#1164)
ajkswamy Aug 10, 2026
89b8667
Transformation manager foundation (#1164)
ajkswamy Aug 10, 2026
db849b7
Creates the graph module based on the Ngff* classes
Tomaz-Vieira Aug 21, 2026
dccc3f6
addresses some PR comments, simplifies MapAxis
Tomaz-Vieira Sep 2, 2026
950ffd7
Adds ProjectAxisEdge, makes inverse return optional
Tomaz-Vieira Sep 3, 2026
0a2f374
Moves exceptions to exceptions.py, edge names default to None
Tomaz-Vieira Sep 4, 2026
d29a2a4
Use custom exceptions everywhere, adds Raises to docstrings
Tomaz-Vieira Sep 4, 2026
3618cdd
Fix Affine.from_affine_matrix slicing]
Tomaz-Vieira Sep 8, 2026
4313c56
Fix coords bug when reading from OMEZarrMultiscale. Some cleanup
Tomaz-Vieira Sep 8, 2026
9c2e1d3
Adds test for parsing OMEZarrMultiscale
Tomaz-Vieira Sep 8, 2026
f94498e
Adds transformations tests, fixes some slicing bugs
Tomaz-Vieira Sep 9, 2026
c0da25f
Adds basic .sel test to parsed multiscale
Tomaz-Vieira Sep 9, 2026
3a94382
Removes unused class
Tomaz-Vieira Sep 9, 2026
129fd2d
Adds more slicing tests to parsed multiscales
Tomaz-Vieira Sep 9, 2026
e050c10
Adds/fixes comments in try_parse_ngff06_multiscales
Tomaz-Vieira Sep 9, 2026
5836cd0
Removes to_model methods for now
Tomaz-Vieira Sep 9, 2026
de5718c
Moves AxisParsingException to exceptions.py
Tomaz-Vieira Sep 9, 2026
d58038d
Moves AxisParsingException back into vert.py to prevent circular imports
Tomaz-Vieira Sep 9, 2026
55e1ba5
Fixes docstrings, list exceptions in "Raises"
Tomaz-Vieira Sep 9, 2026
d802aa8
Incorporates parse_project_axis
Tomaz-Vieira Sep 9, 2026
c18df09
Fixes parsing translatiion model getting bad name
Tomaz-Vieira Sep 9, 2026
c10c758
Adds test for parsing *Edge transforms from ngff
Tomaz-Vieira Sep 9, 2026
b6d4a66
Fixes dependencies on ome-zarr and ome-zarr-models
Tomaz-Vieira Sep 11, 2026
ec7f22b
Cleans up transform_points for rotation and affine
Tomaz-Vieira Sep 11, 2026
05a28c7
Fixes renamed fields in ome-zarr-models
Tomaz-Vieira Sep 11, 2026
98c1b37
Use frozen dataclasses for CoordSystems and Axis. Fix MapAxisEdge
Tomaz-Vieira Sep 10, 2026
834f921
Enforces Rotation matrix is orthonormal with det==1
Tomaz-Vieira Sep 10, 2026
6ca7e21
Bump xarray so we can use RangeIndex
Tomaz-Vieira Sep 21, 2026
0c3ae64
Removes try-from_model_or_defaul for now
Tomaz-Vieira Sep 21, 2026
1951436
Emits warning on AffineEdge.inverse when condition is big
Tomaz-Vieira Sep 21, 2026
475d15b
Uses matrix in exceptions
Tomaz-Vieira Sep 21, 2026
9832d6d
feat(NgffAxisTypes): defined
ajkswamy Sep 10, 2026
20af288
refac + fix(TransformationManager + Tests): to work with new Vert and…
ajkswamy Sep 10, 2026
095686f
feat(transformations): added _to_ngff_transformation_edge() for all c…
ajkswamy Sep 10, 2026
3f83416
feat(transformations_facade): setting and removing transformations
ajkswamy Sep 16, 2026
261a5f7
feat(sd-transformations): MapAxis._to_ngff_transformation_edge
ajkswamy Sep 16, 2026
5f24aa7
feat: doc strings
ajkswamy Sep 16, 2026
672b569
refac(model, transformation._graph): code reorganization in files and…
ajkswamy Sep 16, 2026
0f08a75
feat(spatialdata.SpatialData): add transform info from spatialelement…
ajkswamy Sep 17, 2026
5c0f3cd
fix + reorg (transformations): fix circular import issue
ajkswamy Sep 29, 2026
3451462
feat(transformations): get_union_of_axes + tests
ajkswamy Sep 30, 2026
732b94b
feat(transformations): dynamic project axis classes, no tests yet
ajkswamy Sep 30, 2026
7f03be0
reorg (tests/transformations/graph/utils)
ajkswamy Sep 30, 2026
04344cc
reorg (tests/transformations/graph): consolidated conftest files
ajkswamy Oct 16, 2026
5bc5100
feat (transformations/_graph/exceptions): passing only name instead o…
ajkswamy Oct 16, 2026
5fb6860
wip (dynamic projection axes)
ajkswamy Oct 16, 2026
541b087
fix (test_dynamic_axis_edges.py): tests passing
ajkswamy Oct 16, 2026
26b39b2
fix (transformations/utils/get_union_of_axes): during union, sorting …
ajkswamy Oct 16, 2026
d6c435f
fix (dynamic project axis): removed unused code
ajkswamy Oct 26, 2026
7bcce04
fix (transformation graph): assorted minor fixes
ajkswamy Oct 26, 2026
6aabf6a
feat (spatialdata.__init__): coordinate systems and edges added based…
ajkswamy Oct 27, 2026
a540da3
fix + reorg (literals, get_axes_names, get_spatial_axes): avoid circu…
ajkswamy Oct 27, 2026
743a9c3
fix (attrs accessor registration for dask data structures) explicit f…
ajkswamy Oct 27, 2026
14578ff
fix (docs): moved get_spatial_axes from model utils to tranformations…
ajkswamy Oct 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -54,3 +54,29 @@ _version.py
# benchmarking and profiling
.asv/
profile.speedscope.json

# other
node_modules/

.mypy_cache
.ruff_cache

# Kilo and plans
.kilo/
plans/

# test coverage
.coverage
htmlcov/

# local hatch config
hatch.toml

# Kilo and plans
.kilo/
plans/

# test coverage
.coverage
htmlcov/

1 change: 0 additions & 1 deletion docs/api/models_utils.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
.. autofunction:: validate_element
.. autodata:: SpatialElement
.. autofunction:: get_axes_names
.. autofunction:: get_spatial_axes
.. autofunction:: points_geopandas_to_dask_dataframe
.. autofunction:: points_dask_dataframe_to_geopandas
.. autofunction:: get_channel_names
Expand Down
1 change: 1 addition & 0 deletions docs/api/transformations_utils.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,5 @@
.. autofunction:: get_transformation_between_landmarks
.. autofunction:: align_elements_using_landmarks
.. autofunction:: remove_transformations_to_coordinate_system
.. autofunction:: get_spatial_axes
```
5 changes: 3 additions & 2 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,8 @@ dependencies = [
"networkx",
"numba>=0.55",
"numpy",
"ome-zarr>=0.16",
"ome-zarr>=0.19.2",
"ome-zarr-models>=1.8",
"pandas",
"pooch",
"pyarrow",
Expand All @@ -51,7 +52,7 @@ dependencies = [
"spatial-image>=1.2.3",
"typing-extensions>=4.8",
"universal-pathlib>=0.2.6",
"xarray>=2024.10",
"xarray>=2025.4",
"xarray-spatial>=0.3.5",
"zarr>=3",
]
Expand Down
6 changes: 4 additions & 2 deletions src/spatialdata/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,10 @@
from importlib.metadata import version
from typing import TYPE_CHECKING, Any

import spatialdata.models._accessor
from spatialdata.models._accessor import register_attrs_accessor_dask_df_series

# Import registers Dask .attrs accessor, enabling metadata handling on Dask collections
register_attrs_accessor_dask_df_series()

__version__ = version("spatialdata")

Expand Down Expand Up @@ -59,7 +62,6 @@
"polygon_query": "spatialdata._core.query.spatial_query",
# _core.spatialdata
"SpatialData": "spatialdata._core.spatialdata",
# _io._utils
"get_dask_backing_files": "spatialdata._io._utils",
# _io.format
"SpatialDataFormatType": "spatialdata._io.format",
Expand Down
4 changes: 2 additions & 2 deletions src/spatialdata/_core/_deepcopy.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,14 @@
from xarray import DataArray, DataTree

from spatialdata._core.spatialdata import SpatialData
from spatialdata.models._utils import SpatialElement
from spatialdata.models.models import (
from spatialdata.models import (
Image2DModel,
Image3DModel,
Labels2DModel,
Labels3DModel,
PointsModel,
RasterSchema,
SpatialElement,
get_model,
)

Expand Down
4 changes: 1 addition & 3 deletions src/spatialdata/_core/centroids.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,7 @@
from xarray import DataArray, DataTree

from spatialdata._core.operations.transform import transform
from spatialdata.models import get_axes_names
from spatialdata.models._utils import SpatialElement
from spatialdata.models.models import Labels2DModel, Labels3DModel, PointsModel, get_model
from spatialdata.models import Labels2DModel, Labels3DModel, PointsModel, SpatialElement, get_axes_names, get_model
from spatialdata.transformations.operations import get_transformation
from spatialdata.transformations.transformations import BaseTransformation

Expand Down
4 changes: 1 addition & 3 deletions src/spatialdata/_core/data_extent.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,7 @@

from spatialdata._core.operations.transform import transform
from spatialdata._core.spatialdata import SpatialData
from spatialdata.models import get_axes_names
from spatialdata.models._utils import SpatialElement
from spatialdata.models.models import PointsModel
from spatialdata.models import PointsModel, SpatialElement, get_axes_names
from spatialdata.transformations.operations import get_transformation

BoundingBoxDescription = dict[str, tuple[float, float]]
Expand Down
3 changes: 2 additions & 1 deletion src/spatialdata/_core/operations/_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@
from anndata import AnnData
from xarray import DataArray, DataTree

from spatialdata.models import SpatialElement, get_axes_names, get_spatial_axes
from spatialdata.models import SpatialElement, get_axes_names
from spatialdata.transformations import get_spatial_axes

if TYPE_CHECKING:
from spatialdata._core.spatialdata import SpatialData
Expand Down
2 changes: 1 addition & 1 deletion src/spatialdata/_core/operations/map.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
from xarray import DataArray, DataTree

from spatialdata._types import IntArrayLike
from spatialdata.models._utils import get_axes_names, get_channel_names, get_raster_model_from_data_dims
from spatialdata.models import get_axes_names, get_channel_names, get_raster_model_from_data_dims
from spatialdata.transformations import get_transformation

__all__ = ["map_raster", "relabel_sequential"]
Expand Down
2 changes: 1 addition & 1 deletion src/spatialdata/_core/operations/rasterize.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
get_axes_names,
get_model,
)
from spatialdata.models._utils import get_spatial_axes
from spatialdata.transformations import get_spatial_axes
from spatialdata.transformations._utils import _get_scale, compute_coordinates
from spatialdata.transformations.operations import get_transformation, remove_transformation, set_transformation
from spatialdata.transformations.transformations import (
Expand Down
14 changes: 8 additions & 6 deletions src/spatialdata/_core/operations/transform.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,14 @@
from spatialdata._core.spatialdata import SpatialData
from spatialdata._types import ArrayLike
from spatialdata._utils import disable_dask_tune_optimization
from spatialdata.models import SpatialElement, get_axes_names, get_model
from spatialdata.models._utils import DEFAULT_COORDINATE_SYSTEM, get_channel_names
from spatialdata.models.models import RasterSchema
from spatialdata.literals import DEFAULT_COORDINATE_SYSTEM, TRANSFORM_KEY
from spatialdata.models import (
RasterSchema,
SpatialElement,
get_axes_names,
get_channel_names,
get_model,
)
from spatialdata.transformations._utils import _get_scale, compute_coordinates, scale_radii

if TYPE_CHECKING:
Expand Down Expand Up @@ -356,7 +361,6 @@ def _(
schema = get_model(data)
assert issubclass(schema, RasterSchema)
from spatialdata.models import Image2DModel, Image3DModel, Labels2DModel, Labels3DModel
from spatialdata.models._utils import TRANSFORM_KEY
from spatialdata.transformations import get_transformation, set_transformation
from spatialdata.transformations.transformations import Identity, Sequence

Expand Down Expand Up @@ -441,7 +445,6 @@ def _(
to_coordinate_system: str | None = None,
) -> DaskDataFrame:
from spatialdata.models import PointsModel
from spatialdata.models._utils import TRANSFORM_KEY
from spatialdata.transformations import Identity, get_transformation

transformation, to_coordinate_system = _validate_target_coordinate_systems(
Expand Down Expand Up @@ -519,7 +522,6 @@ def _(
to_coordinate_system: str | None = None,
) -> GeoDataFrame:
from spatialdata.models import ShapesModel
from spatialdata.models._utils import TRANSFORM_KEY
from spatialdata.transformations import Identity, get_transformation

axes = get_axes_names(data)
Expand Down
2 changes: 1 addition & 1 deletion src/spatialdata/_core/operations/vectorize.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,8 @@
SpatialElement,
get_axes_names,
get_model,
points_dask_dataframe_to_geopandas,
)
from spatialdata.models._utils import points_dask_dataframe_to_geopandas
from spatialdata.transformations.operations import get_transformation
from spatialdata.transformations.transformations import Identity

Expand Down
5 changes: 3 additions & 2 deletions src/spatialdata/_core/query/spatial_query.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,15 +21,16 @@
from spatialdata._types import ArrayLike, ListOrNDArrayFloating, Raster_T
from spatialdata._utils import _parse_list_into_array
from spatialdata.models import (
ATTRS_KEY,
PointsModel,
ShapesModel,
SpatialElement,
get_axes_names,
points_dask_dataframe_to_geopandas,
points_geopandas_to_dask_dataframe,
)
from spatialdata.models._utils import ValidAxis_t, get_spatial_axes
from spatialdata.models.models import ATTRS_KEY
from spatialdata.transformations import get_spatial_axes
from spatialdata.transformations._graph.types import ValidAxis_t
from spatialdata.transformations.operations import set_transformation
from spatialdata.transformations.transformations import (
Affine,
Expand Down
Loading
Loading