Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
86665b7
don't remove coords
giovp Feb 5, 2023
632c112
update iter multiscale
giovp Feb 17, 2023
0410cea
merge
giovp Feb 17, 2023
6e4a050
update spatial-image and multiscale-spatial_image version
giovp Feb 17, 2023
6565b12
remove check that is now in multiscale spatial image
giovp Feb 19, 2023
4833e63
add coordinates assignment
giovp Feb 19, 2023
2d8bbd2
add coordinates to parser
giovp Feb 19, 2023
22b18a9
Merge branch 'main' into models/images/add-coordinates
giovp Feb 19, 2023
c99c5dd
fix tests
giovp Feb 20, 2023
f562a3b
update tests for 3d
giovp Feb 20, 2023
aef337b
add tests for labels
giovp Feb 20, 2023
0dc0459
update shapely
giovp Feb 20, 2023
97f8d7e
add some comments
giovp Feb 20, 2023
90e0cc3
improve validation per #115
giovp Feb 20, 2023
6140832
remove multiscale_factors and add sclae_factors
giovp Feb 20, 2023
238fb8c
try fixing tests
giovp Feb 20, 2023
c67435a
updates
giovp Feb 20, 2023
3240659
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Feb 20, 2023
55c0e7c
fix mypy
giovp Feb 20, 2023
4214abc
add channels to IO
giovp Feb 20, 2023
f65151e
update omero exlcuding it from labels
giovp Feb 20, 2023
448da01
use isel
giovp Feb 22, 2023
51d865d
read name from raster data
LucaMarconato Feb 23, 2023
697eae1
Merge branch 'main' into models/images/add-coordinates
LucaMarconato Feb 23, 2023
5245259
fix unpad_raster()
LucaMarconato Feb 23, 2023
0a752fe
all tests passing
LucaMarconato Feb 23, 2023
f20582a
fixed precommit
LucaMarconato Feb 23, 2023
7a9f140
remove reference to name
giovp Feb 24, 2023
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
6 changes: 3 additions & 3 deletions pyproject.toml
Original file line numberDiff line numberDiff line change
Expand Up@@ -26,12 +26,12 @@ dependencies = [
"zarr",
# "ome_zarr",
"ome_zarr@git+https://github.com/LucaMarconato/ome-zarr-py@bug_fix_io",
"spatial_image",
"multiscale_spatial_image",
"spatial_image>=0.3.0",
"multiscale_spatial_image>=0.11.2",
"xarray-schema",
"pygeos",
"geopandas",
"shapely==2.0rc2",
"shapely>=2.0.1",
"rich",
"pyarrow",
"tqdm",
Expand Down
1 change: 1 addition & 0 deletions spatialdata/_compat.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -22,4 +22,5 @@ def _check_geopandas_using_shapely() -> None:
"If you intended to use PyGEOS, set the option to False."
),
UserWarning,
stacklevel=2,
)
2 changes: 1 addition & 1 deletion spatialdata/_core/_spatial_query.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -131,7 +131,7 @@ def _bounding_box_query_image(
# add the
selection[axis_name] = slice(min_value, max_value)

query_result = image.sel(selection)
query_result = image.isel(selection)

# update the transform
# currently, this assumes the existing transforms input coordinate system
Expand Down
73 changes: 43 additions & 30 deletions spatialdata/_core/_transform_elements.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -20,6 +20,8 @@
from spatialdata._core.core_utils import (
DEFAULT_COORDINATE_SYSTEM,
SpatialElement,
_get_scale,
compute_coordinates,
get_dims,
)
from spatialdata._core.models import get_schema
Expand DownExpand Up@@ -208,14 +210,21 @@ def _(data: SpatialImage, transformation: BaseTransformation, maintain_positioni
get_transformation,
set_transformation,
)
from spatialdata._core.models import Labels2DModel, Labels3DModel
from spatialdata._core.models import (
Image2DModel,
Image3DModel,
Labels2DModel,
Labels3DModel,
)

# labels need to be preserved after the resizing of the image
if schema == Labels2DModel or schema == Labels3DModel:
# TODO: this should work, test better
kwargs = {"prefilter": False}
else:
elif schema == Image2DModel or schema == Image3DModel:
kwargs = {}
else:
raise ValueError(f"Unsupported schema {schema}")

axes = get_dims(data)
transformed_dask, raster_translation = _transform_raster(
Expand All@@ -232,6 +241,8 @@ def _(data: SpatialImage, transformation: BaseTransformation, maintain_positioni
raster_translation=raster_translation,
maintain_positioning=maintain_positioning,
)
transformed_data = compute_coordinates(transformed_data)
schema().validate(transformed_data)
return transformed_data


Expand All@@ -244,43 +255,43 @@ def _(
get_transformation,
set_transformation,
)
from spatialdata._core.models import Labels2DModel, Labels3DModel
from spatialdata._core.models import (
Image2DModel,
Image3DModel,
Labels2DModel,
Labels3DModel,
)
from spatialdata._core.transformations import BaseTransformation, Sequence

# labels need to be preserved after the resizing of the image
if schema == Labels2DModel or schema == Labels3DModel:
# TODO: this should work, test better
kwargs = {"prefilter": False}
else:
elif schema == Image2DModel or schema == Image3DModel:
kwargs = {}
else:
raise ValueError(f"MultiscaleSpatialImage with schema {schema} not supported")

axes = get_dims(data)
scale0 = dict(data["scale0"])
assert len(scale0) == 1
scale0_data = scale0.values().__iter__().__next__()
transformed_dask, raster_translation = _transform_raster(
data=scale0_data.data, axes=scale0_data.dims, transformation=transformation, **kwargs
)
get_dims(data)
transformed_dict = {}
for k, v in data.items():
assert len(v) == 1
xdata = v.values().__iter__().__next__()

composed: BaseTransformation
if k == "scale0":
composed = transformation
else:
scale = _get_scale(xdata.attrs["transform"])
composed = Sequence([scale, transformation, scale.inverse()])

transformed_dask, raster_translation = _transform_raster(
data=xdata.data, axes=xdata.dims, transformation=composed, **kwargs
)
transformed_dict[k] = SpatialImage(transformed_dask, dims=xdata.dims, name=xdata.name)

# this code is temporary and doens't work in all cases (in particular it breaks when the data is not similar
# to a square but has sides of very different lengths). I would remove it an implement (inside the parser)
# the logic described in https://github.com/scverse/spatialdata/issues/108)
shapes = []
for level in range(len(data)):
dims = data[f"scale{level}"].dims.values()
shape = np.array([dict(dims._mapping)[k] for k in axes if k != "c"])
shapes.append(shape)
multiscale_factors = []
shape0 = shapes[0]
for shape in shapes[1:]:
factors = shape0 / shape
factors - min(factors)
# assert np.allclose(almost_zero, np.zeros_like(almost_zero), rtol=2.)
try:
multiscale_factors.append(round(factors[0]))
except OverflowError as e:
raise e
# mypy thinks that schema could be ShapesModel, PointsModel, ...
transformed_data = schema.parse(transformed_dask, dims=axes, multiscale_factors=multiscale_factors) # type: ignore[call-arg,arg-type]
transformed_data = MultiscaleSpatialImage.from_dict(transformed_dict)
old_transformations = get_transformation(data, get_all=True)
assert isinstance(old_transformations, dict)
set_transformation(transformed_data, old_transformations, set_all=True)
Expand All@@ -290,6 +301,8 @@ def _(
raster_translation=raster_translation,
maintain_positioning=maintain_positioning,
)
transformed_data = compute_coordinates(transformed_data)
schema().validate(transformed_data)
return transformed_data


Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
86665b7
don't remove coords
giovp Feb 5, 2023
632c112
update iter multiscale
giovp Feb 17, 2023
0410cea
merge
giovp Feb 17, 2023
6e4a050
update spatial-image and multiscale-spatial_image version
giovp Feb 17, 2023
6565b12
remove check that is now in multiscale spatial image
giovp Feb 19, 2023
4833e63
add coordinates assignment
giovp Feb 19, 2023
2d8bbd2
add coordinates to parser
giovp Feb 19, 2023
22b18a9
Merge branch 'main' into models/images/add-coordinates
giovp Feb 19, 2023
c99c5dd
fix tests
giovp Feb 20, 2023
f562a3b
update tests for 3d
giovp Feb 20, 2023
aef337b
add tests for labels
giovp Feb 20, 2023
0dc0459
update shapely
giovp Feb 20, 2023
97f8d7e
add some comments
giovp Feb 20, 2023
90e0cc3
improve validation per #115
giovp Feb 20, 2023
6140832
remove multiscale_factors and add sclae_factors
giovp Feb 20, 2023
238fb8c
try fixing tests
giovp Feb 20, 2023
c67435a
updates
giovp Feb 20, 2023
3240659
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Feb 20, 2023
55c0e7c
fix mypy
giovp Feb 20, 2023
4214abc
add channels to IO
giovp Feb 20, 2023
f65151e
update omero exlcuding it from labels
giovp Feb 20, 2023
448da01
use isel
giovp Feb 22, 2023
51d865d
read name from raster data
LucaMarconato Feb 23, 2023
697eae1
Merge branch 'main' into models/images/add-coordinates
LucaMarconato Feb 23, 2023
5245259
fix unpad_raster()
LucaMarconato Feb 23, 2023
0a752fe
all tests passing
LucaMarconato Feb 23, 2023
f20582a
fixed precommit
LucaMarconato Feb 23, 2023
7a9f140
remove reference to name
giovp Feb 24, 2023
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
6 changes: 3 additions & 3 deletions pyproject.toml
Original file line numberDiff line numberDiff line change
Expand Up@@ -26,12 +26,12 @@ dependencies = [
"zarr",
# "ome_zarr",
"ome_zarr@git+https://github.com/LucaMarconato/ome-zarr-py@bug_fix_io",
"spatial_image",
"multiscale_spatial_image",
"spatial_image>=0.3.0",
"multiscale_spatial_image>=0.11.2",
"xarray-schema",
"pygeos",
"geopandas",
"shapely==2.0rc2",
"shapely>=2.0.1",
"rich",
"pyarrow",
"tqdm",
Expand Down
1 change: 1 addition & 0 deletions spatialdata/_compat.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -22,4 +22,5 @@ def _check_geopandas_using_shapely() -> None:
"If you intended to use PyGEOS, set the option to False."
),
UserWarning,
stacklevel=2,
)
2 changes: 1 addition & 1 deletion spatialdata/_core/_spatial_query.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -131,7 +131,7 @@ def _bounding_box_query_image(
# add the
selection[axis_name] = slice(min_value, max_value)

query_result = image.sel(selection)
query_result = image.isel(selection)

# update the transform
# currently, this assumes the existing transforms input coordinate system
Expand Down
73 changes: 43 additions & 30 deletions spatialdata/_core/_transform_elements.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -20,6 +20,8 @@
from spatialdata._core.core_utils import (
DEFAULT_COORDINATE_SYSTEM,
SpatialElement,
_get_scale,
compute_coordinates,
get_dims,
)
from spatialdata._core.models import get_schema
Expand DownExpand Up@@ -208,14 +210,21 @@ def _(data: SpatialImage, transformation: BaseTransformation, maintain_positioni
get_transformation,
set_transformation,
)
from spatialdata._core.models import Labels2DModel, Labels3DModel
from spatialdata._core.models import (
Image2DModel,
Image3DModel,
Labels2DModel,
Labels3DModel,
)

# labels need to be preserved after the resizing of the image
if schema == Labels2DModel or schema == Labels3DModel:
# TODO: this should work, test better
kwargs = {"prefilter": False}
else:
elif schema == Image2DModel or schema == Image3DModel:
kwargs = {}
else:
raise ValueError(f"Unsupported schema {schema}")

axes = get_dims(data)
transformed_dask, raster_translation = _transform_raster(
Expand All@@ -232,6 +241,8 @@ def _(data: SpatialImage, transformation: BaseTransformation, maintain_positioni
raster_translation=raster_translation,
maintain_positioning=maintain_positioning,
)
transformed_data = compute_coordinates(transformed_data)
schema().validate(transformed_data)
return transformed_data


Expand All@@ -244,43 +255,43 @@ def _(
get_transformation,
set_transformation,
)
from spatialdata._core.models import Labels2DModel, Labels3DModel
from spatialdata._core.models import (
Image2DModel,
Image3DModel,
Labels2DModel,
Labels3DModel,
)
from spatialdata._core.transformations import BaseTransformation, Sequence

# labels need to be preserved after the resizing of the image
if schema == Labels2DModel or schema == Labels3DModel:
# TODO: this should work, test better
kwargs = {"prefilter": False}
else:
elif schema == Image2DModel or schema == Image3DModel:
kwargs = {}
else:
raise ValueError(f"MultiscaleSpatialImage with schema {schema} not supported")

axes = get_dims(data)
scale0 = dict(data["scale0"])
assert len(scale0) == 1
scale0_data = scale0.values().__iter__().__next__()
transformed_dask, raster_translation = _transform_raster(
data=scale0_data.data, axes=scale0_data.dims, transformation=transformation, **kwargs
)
get_dims(data)
transformed_dict = {}
for k, v in data.items():
assert len(v) == 1
xdata = v.values().__iter__().__next__()

composed: BaseTransformation
if k == "scale0":
composed = transformation
else:
scale = _get_scale(xdata.attrs["transform"])
composed = Sequence([scale, transformation, scale.inverse()])

transformed_dask, raster_translation = _transform_raster(
data=xdata.data, axes=xdata.dims, transformation=composed, **kwargs
)
transformed_dict[k] = SpatialImage(transformed_dask, dims=xdata.dims, name=xdata.name)

# this code is temporary and doens't work in all cases (in particular it breaks when the data is not similar
# to a square but has sides of very different lengths). I would remove it an implement (inside the parser)
# the logic described in https://github.com/scverse/spatialdata/issues/108)
shapes = []
for level in range(len(data)):
dims = data[f"scale{level}"].dims.values()
shape = np.array([dict(dims._mapping)[k] for k in axes if k != "c"])
shapes.append(shape)
multiscale_factors = []
shape0 = shapes[0]
for shape in shapes[1:]:
factors = shape0 / shape
factors - min(factors)
# assert np.allclose(almost_zero, np.zeros_like(almost_zero), rtol=2.)
try:
multiscale_factors.append(round(factors[0]))
except OverflowError as e:
raise e
# mypy thinks that schema could be ShapesModel, PointsModel, ...
transformed_data = schema.parse(transformed_dask, dims=axes, multiscale_factors=multiscale_factors) # type: ignore[call-arg,arg-type]
transformed_data = MultiscaleSpatialImage.from_dict(transformed_dict)
old_transformations = get_transformation(data, get_all=True)
assert isinstance(old_transformations, dict)
set_transformation(transformed_data, old_transformations, set_all=True)
Expand All@@ -290,6 +301,8 @@ def _(
raster_translation=raster_translation,
maintain_positioning=maintain_positioning,
)
transformed_data = compute_coordinates(transformed_data)
schema().validate(transformed_data)
return transformed_data


Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
86665b7
don't remove coords
giovp Feb 5, 2023
632c112
update iter multiscale
giovp Feb 17, 2023
0410cea
merge
giovp Feb 17, 2023
6e4a050
update spatial-image and multiscale-spatial_image version
giovp Feb 17, 2023
6565b12
remove check that is now in multiscale spatial image
giovp Feb 19, 2023
4833e63
add coordinates assignment
giovp Feb 19, 2023
2d8bbd2
add coordinates to parser
giovp Feb 19, 2023
22b18a9
Merge branch 'main' into models/images/add-coordinates
giovp Feb 19, 2023
c99c5dd
fix tests
giovp Feb 20, 2023
f562a3b
update tests for 3d
giovp Feb 20, 2023
aef337b
add tests for labels
giovp Feb 20, 2023
0dc0459
update shapely
giovp Feb 20, 2023
97f8d7e
add some comments
giovp Feb 20, 2023
90e0cc3
improve validation per #115
giovp Feb 20, 2023
6140832
remove multiscale_factors and add sclae_factors
giovp Feb 20, 2023
238fb8c
try fixing tests
giovp Feb 20, 2023
c67435a
updates
giovp Feb 20, 2023
3240659
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Feb 20, 2023
55c0e7c
fix mypy
giovp Feb 20, 2023
4214abc
add channels to IO
giovp Feb 20, 2023
f65151e
update omero exlcuding it from labels
giovp Feb 20, 2023
448da01
use isel
giovp Feb 22, 2023
51d865d
read name from raster data
LucaMarconato Feb 23, 2023
697eae1
Merge branch 'main' into models/images/add-coordinates
LucaMarconato Feb 23, 2023
5245259
fix unpad_raster()
LucaMarconato Feb 23, 2023
0a752fe
all tests passing
LucaMarconato Feb 23, 2023
f20582a
fixed precommit
LucaMarconato Feb 23, 2023
7a9f140
remove reference to name
giovp Feb 24, 2023
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
6 changes: 3 additions & 3 deletions pyproject.toml
Original file line numberDiff line numberDiff line change
Expand Up@@ -26,12 +26,12 @@ dependencies = [
"zarr",
# "ome_zarr",
"ome_zarr@git+https://github.com/LucaMarconato/ome-zarr-py@bug_fix_io",
"spatial_image",
"multiscale_spatial_image",
"spatial_image>=0.3.0",
"multiscale_spatial_image>=0.11.2",
"xarray-schema",
"pygeos",
"geopandas",
"shapely==2.0rc2",
"shapely>=2.0.1",
"rich",
"pyarrow",
"tqdm",
Expand Down
1 change: 1 addition & 0 deletions spatialdata/_compat.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -22,4 +22,5 @@ def _check_geopandas_using_shapely() -> None:
"If you intended to use PyGEOS, set the option to False."
),
UserWarning,
stacklevel=2,
)
2 changes: 1 addition & 1 deletion spatialdata/_core/_spatial_query.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -131,7 +131,7 @@ def _bounding_box_query_image(
# add the
selection[axis_name] = slice(min_value, max_value)

query_result = image.sel(selection)
query_result = image.isel(selection)

# update the transform
# currently, this assumes the existing transforms input coordinate system
Expand Down
73 changes: 43 additions & 30 deletions spatialdata/_core/_transform_elements.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -20,6 +20,8 @@
from spatialdata._core.core_utils import (
DEFAULT_COORDINATE_SYSTEM,
SpatialElement,
_get_scale,
compute_coordinates,
get_dims,
)
from spatialdata._core.models import get_schema
Expand DownExpand Up@@ -208,14 +210,21 @@ def _(data: SpatialImage, transformation: BaseTransformation, maintain_positioni
get_transformation,
set_transformation,
)
from spatialdata._core.models import Labels2DModel, Labels3DModel
from spatialdata._core.models import (
Image2DModel,
Image3DModel,
Labels2DModel,
Labels3DModel,
)

# labels need to be preserved after the resizing of the image
if schema == Labels2DModel or schema == Labels3DModel:
# TODO: this should work, test better
kwargs = {"prefilter": False}
else:
elif schema == Image2DModel or schema == Image3DModel:
kwargs = {}
else:
raise ValueError(f"Unsupported schema {schema}")

axes = get_dims(data)
transformed_dask, raster_translation = _transform_raster(
Expand All@@ -232,6 +241,8 @@ def _(data: SpatialImage, transformation: BaseTransformation, maintain_positioni
raster_translation=raster_translation,
maintain_positioning=maintain_positioning,
)
transformed_data = compute_coordinates(transformed_data)
schema().validate(transformed_data)
return transformed_data


Expand All@@ -244,43 +255,43 @@ def _(
get_transformation,
set_transformation,
)
from spatialdata._core.models import Labels2DModel, Labels3DModel
from spatialdata._core.models import (
Image2DModel,
Image3DModel,
Labels2DModel,
Labels3DModel,
)
from spatialdata._core.transformations import BaseTransformation, Sequence

# labels need to be preserved after the resizing of the image
if schema == Labels2DModel or schema == Labels3DModel:
# TODO: this should work, test better
kwargs = {"prefilter": False}
else:
elif schema == Image2DModel or schema == Image3DModel:
kwargs = {}
else:
raise ValueError(f"MultiscaleSpatialImage with schema {schema} not supported")

axes = get_dims(data)
scale0 = dict(data["scale0"])
assert len(scale0) == 1
scale0_data = scale0.values().__iter__().__next__()
transformed_dask, raster_translation = _transform_raster(
data=scale0_data.data, axes=scale0_data.dims, transformation=transformation, **kwargs
)
get_dims(data)
transformed_dict = {}
for k, v in data.items():
assert len(v) == 1
xdata = v.values().__iter__().__next__()

composed: BaseTransformation
if k == "scale0":
composed = transformation
else:
scale = _get_scale(xdata.attrs["transform"])
composed = Sequence([scale, transformation, scale.inverse()])

transformed_dask, raster_translation = _transform_raster(
data=xdata.data, axes=xdata.dims, transformation=composed, **kwargs
)
transformed_dict[k] = SpatialImage(transformed_dask, dims=xdata.dims, name=xdata.name)

# this code is temporary and doens't work in all cases (in particular it breaks when the data is not similar
# to a square but has sides of very different lengths). I would remove it an implement (inside the parser)
# the logic described in https://github.com/scverse/spatialdata/issues/108)
shapes = []
for level in range(len(data)):
dims = data[f"scale{level}"].dims.values()
shape = np.array([dict(dims._mapping)[k] for k in axes if k != "c"])
shapes.append(shape)
multiscale_factors = []
shape0 = shapes[0]
for shape in shapes[1:]:
factors = shape0 / shape
factors - min(factors)
# assert np.allclose(almost_zero, np.zeros_like(almost_zero), rtol=2.)
try:
multiscale_factors.append(round(factors[0]))
except OverflowError as e:
raise e
# mypy thinks that schema could be ShapesModel, PointsModel, ...
transformed_data = schema.parse(transformed_dask, dims=axes, multiscale_factors=multiscale_factors) # type: ignore[call-arg,arg-type]
transformed_data = MultiscaleSpatialImage.from_dict(transformed_dict)
old_transformations = get_transformation(data, get_all=True)
assert isinstance(old_transformations, dict)
set_transformation(transformed_data, old_transformations, set_all=True)
Expand All@@ -290,6 +301,8 @@ def _(
raster_translation=raster_translation,
maintain_positioning=maintain_positioning,
)
transformed_data = compute_coordinates(transformed_data)
schema().validate(transformed_data)
return transformed_data


Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
86665b7
don't remove coords
giovp Feb 5, 2023
632c112
update iter multiscale
giovp Feb 17, 2023
0410cea
merge
giovp Feb 17, 2023
6e4a050
update spatial-image and multiscale-spatial_image version
giovp Feb 17, 2023
6565b12
remove check that is now in multiscale spatial image
giovp Feb 19, 2023
4833e63
add coordinates assignment
giovp Feb 19, 2023
2d8bbd2
add coordinates to parser
giovp Feb 19, 2023
22b18a9
Merge branch 'main' into models/images/add-coordinates
giovp Feb 19, 2023
c99c5dd
fix tests
giovp Feb 20, 2023
f562a3b
update tests for 3d
giovp Feb 20, 2023
aef337b
add tests for labels
giovp Feb 20, 2023
0dc0459
update shapely
giovp Feb 20, 2023
97f8d7e
add some comments
giovp Feb 20, 2023
90e0cc3
improve validation per #115
giovp Feb 20, 2023
6140832
remove multiscale_factors and add sclae_factors
giovp Feb 20, 2023
238fb8c
try fixing tests
giovp Feb 20, 2023
c67435a
updates
giovp Feb 20, 2023
3240659
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Feb 20, 2023
55c0e7c
fix mypy
giovp Feb 20, 2023
4214abc
add channels to IO
giovp Feb 20, 2023
f65151e
update omero exlcuding it from labels
giovp Feb 20, 2023
448da01
use isel
giovp Feb 22, 2023
51d865d
read name from raster data
LucaMarconato Feb 23, 2023
697eae1
Merge branch 'main' into models/images/add-coordinates
LucaMarconato Feb 23, 2023
5245259
fix unpad_raster()
LucaMarconato Feb 23, 2023
0a752fe
all tests passing
LucaMarconato Feb 23, 2023
f20582a
fixed precommit
LucaMarconato Feb 23, 2023
7a9f140
remove reference to name
giovp Feb 24, 2023
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
6 changes: 3 additions & 3 deletions pyproject.toml
Original file line numberDiff line numberDiff line change
Expand Up@@ -26,12 +26,12 @@ dependencies = [
"zarr",
# "ome_zarr",
"ome_zarr@git+https://github.com/LucaMarconato/ome-zarr-py@bug_fix_io",
"spatial_image",
"multiscale_spatial_image",
"spatial_image>=0.3.0",
"multiscale_spatial_image>=0.11.2",
"xarray-schema",
"pygeos",
"geopandas",
"shapely==2.0rc2",
"shapely>=2.0.1",
"rich",
"pyarrow",
"tqdm",
Expand Down
1 change: 1 addition & 0 deletions spatialdata/_compat.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -22,4 +22,5 @@ def _check_geopandas_using_shapely() -> None:
"If you intended to use PyGEOS, set the option to False."
),
UserWarning,
stacklevel=2,
)
2 changes: 1 addition & 1 deletion spatialdata/_core/_spatial_query.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -131,7 +131,7 @@ def _bounding_box_query_image(
# add the
selection[axis_name] = slice(min_value, max_value)

query_result = image.sel(selection)
query_result = image.isel(selection)

# update the transform
# currently, this assumes the existing transforms input coordinate system
Expand Down
73 changes: 43 additions & 30 deletions spatialdata/_core/_transform_elements.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -20,6 +20,8 @@
from spatialdata._core.core_utils import (
DEFAULT_COORDINATE_SYSTEM,
SpatialElement,
_get_scale,
compute_coordinates,
get_dims,
)
from spatialdata._core.models import get_schema
Expand DownExpand Up@@ -208,14 +210,21 @@ def _(data: SpatialImage, transformation: BaseTransformation, maintain_positioni
get_transformation,
set_transformation,
)
from spatialdata._core.models import Labels2DModel, Labels3DModel
from spatialdata._core.models import (
Image2DModel,
Image3DModel,
Labels2DModel,
Labels3DModel,
)

# labels need to be preserved after the resizing of the image
if schema == Labels2DModel or schema == Labels3DModel:
# TODO: this should work, test better
kwargs = {"prefilter": False}
else:
elif schema == Image2DModel or schema == Image3DModel:
kwargs = {}
else:
raise ValueError(f"Unsupported schema {schema}")

axes = get_dims(data)
transformed_dask, raster_translation = _transform_raster(
Expand All@@ -232,6 +241,8 @@ def _(data: SpatialImage, transformation: BaseTransformation, maintain_positioni
raster_translation=raster_translation,
maintain_positioning=maintain_positioning,
)
transformed_data = compute_coordinates(transformed_data)
schema().validate(transformed_data)
return transformed_data


Expand All@@ -244,43 +255,43 @@ def _(
get_transformation,
set_transformation,
)
from spatialdata._core.models import Labels2DModel, Labels3DModel
from spatialdata._core.models import (
Image2DModel,
Image3DModel,
Labels2DModel,
Labels3DModel,
)
from spatialdata._core.transformations import BaseTransformation, Sequence

# labels need to be preserved after the resizing of the image
if schema == Labels2DModel or schema == Labels3DModel:
# TODO: this should work, test better
kwargs = {"prefilter": False}
else:
elif schema == Image2DModel or schema == Image3DModel:
kwargs = {}
else:
raise ValueError(f"MultiscaleSpatialImage with schema {schema} not supported")

axes = get_dims(data)
scale0 = dict(data["scale0"])
assert len(scale0) == 1
scale0_data = scale0.values().__iter__().__next__()
transformed_dask, raster_translation = _transform_raster(
data=scale0_data.data, axes=scale0_data.dims, transformation=transformation, **kwargs
)
get_dims(data)
transformed_dict = {}
for k, v in data.items():
assert len(v) == 1
xdata = v.values().__iter__().__next__()

composed: BaseTransformation
if k == "scale0":
composed = transformation
else:
scale = _get_scale(xdata.attrs["transform"])
composed = Sequence([scale, transformation, scale.inverse()])

transformed_dask, raster_translation = _transform_raster(
data=xdata.data, axes=xdata.dims, transformation=composed, **kwargs
)
transformed_dict[k] = SpatialImage(transformed_dask, dims=xdata.dims, name=xdata.name)

# this code is temporary and doens't work in all cases (in particular it breaks when the data is not similar
# to a square but has sides of very different lengths). I would remove it an implement (inside the parser)
# the logic described in https://github.com/scverse/spatialdata/issues/108)
shapes = []
for level in range(len(data)):
dims = data[f"scale{level}"].dims.values()
shape = np.array([dict(dims._mapping)[k] for k in axes if k != "c"])
shapes.append(shape)
multiscale_factors = []
shape0 = shapes[0]
for shape in shapes[1:]:
factors = shape0 / shape
factors - min(factors)
# assert np.allclose(almost_zero, np.zeros_like(almost_zero), rtol=2.)
try:
multiscale_factors.append(round(factors[0]))
except OverflowError as e:
raise e
# mypy thinks that schema could be ShapesModel, PointsModel, ...
transformed_data = schema.parse(transformed_dask, dims=axes, multiscale_factors=multiscale_factors) # type: ignore[call-arg,arg-type]
transformed_data = MultiscaleSpatialImage.from_dict(transformed_dict)
old_transformations = get_transformation(data, get_all=True)
assert isinstance(old_transformations, dict)
set_transformation(transformed_data, old_transformations, set_all=True)
Expand All@@ -290,6 +301,8 @@ def _(
raster_translation=raster_translation,
maintain_positioning=maintain_positioning,
)
transformed_data = compute_coordinates(transformed_data)
schema().validate(transformed_data)
return transformed_data


Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
86665b7
don't remove coords
giovp Feb 5, 2023
632c112
update iter multiscale
giovp Feb 17, 2023
0410cea
merge
giovp Feb 17, 2023
6e4a050
update spatial-image and multiscale-spatial_image version
giovp Feb 17, 2023
6565b12
remove check that is now in multiscale spatial image
giovp Feb 19, 2023
4833e63
add coordinates assignment
giovp Feb 19, 2023
2d8bbd2
add coordinates to parser
giovp Feb 19, 2023
22b18a9
Merge branch 'main' into models/images/add-coordinates
giovp Feb 19, 2023
c99c5dd
fix tests
giovp Feb 20, 2023
f562a3b
update tests for 3d
giovp Feb 20, 2023
aef337b
add tests for labels
giovp Feb 20, 2023
0dc0459
update shapely
giovp Feb 20, 2023
97f8d7e
add some comments
giovp Feb 20, 2023
90e0cc3
improve validation per #115
giovp Feb 20, 2023
6140832
remove multiscale_factors and add sclae_factors
giovp Feb 20, 2023
238fb8c
try fixing tests
giovp Feb 20, 2023
c67435a
updates
giovp Feb 20, 2023
3240659
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Feb 20, 2023
55c0e7c
fix mypy
giovp Feb 20, 2023
4214abc
add channels to IO
giovp Feb 20, 2023
f65151e
update omero exlcuding it from labels
giovp Feb 20, 2023
448da01
use isel
giovp Feb 22, 2023
51d865d
read name from raster data
LucaMarconato Feb 23, 2023
697eae1
Merge branch 'main' into models/images/add-coordinates
LucaMarconato Feb 23, 2023
5245259
fix unpad_raster()
LucaMarconato Feb 23, 2023
0a752fe
all tests passing
LucaMarconato Feb 23, 2023
f20582a
fixed precommit
LucaMarconato Feb 23, 2023
7a9f140
remove reference to name
giovp Feb 24, 2023
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
6 changes: 3 additions & 3 deletions pyproject.toml
Original file line numberDiff line numberDiff line change
Expand Up@@ -26,12 +26,12 @@ dependencies = [
"zarr",
# "ome_zarr",
"ome_zarr@git+https://github.com/LucaMarconato/ome-zarr-py@bug_fix_io",
"spatial_image",
"multiscale_spatial_image",
"spatial_image>=0.3.0",
"multiscale_spatial_image>=0.11.2",
"xarray-schema",
"pygeos",
"geopandas",
"shapely==2.0rc2",
"shapely>=2.0.1",
"rich",
"pyarrow",
"tqdm",
Expand Down
1 change: 1 addition & 0 deletions spatialdata/_compat.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -22,4 +22,5 @@ def _check_geopandas_using_shapely() -> None:
"If you intended to use PyGEOS, set the option to False."
),
UserWarning,
stacklevel=2,
)
2 changes: 1 addition & 1 deletion spatialdata/_core/_spatial_query.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -131,7 +131,7 @@ def _bounding_box_query_image(
# add the
selection[axis_name] = slice(min_value, max_value)

query_result = image.sel(selection)
query_result = image.isel(selection)

# update the transform
# currently, this assumes the existing transforms input coordinate system
Expand Down
73 changes: 43 additions & 30 deletions spatialdata/_core/_transform_elements.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -20,6 +20,8 @@
from spatialdata._core.core_utils import (
DEFAULT_COORDINATE_SYSTEM,
SpatialElement,
_get_scale,
compute_coordinates,
get_dims,
)
from spatialdata._core.models import get_schema
Expand DownExpand Up@@ -208,14 +210,21 @@ def _(data: SpatialImage, transformation: BaseTransformation, maintain_positioni
get_transformation,
set_transformation,
)
from spatialdata._core.models import Labels2DModel, Labels3DModel
from spatialdata._core.models import (
Image2DModel,
Image3DModel,
Labels2DModel,
Labels3DModel,
)

# labels need to be preserved after the resizing of the image
if schema == Labels2DModel or schema == Labels3DModel:
# TODO: this should work, test better
kwargs = {"prefilter": False}
else:
elif schema == Image2DModel or schema == Image3DModel:
kwargs = {}
else:
raise ValueError(f"Unsupported schema {schema}")

axes = get_dims(data)
transformed_dask, raster_translation = _transform_raster(
Expand All@@ -232,6 +241,8 @@ def _(data: SpatialImage, transformation: BaseTransformation, maintain_positioni
raster_translation=raster_translation,
maintain_positioning=maintain_positioning,
)
transformed_data = compute_coordinates(transformed_data)
schema().validate(transformed_data)
return transformed_data


Expand All@@ -244,43 +255,43 @@ def _(
get_transformation,
set_transformation,
)
from spatialdata._core.models import Labels2DModel, Labels3DModel
from spatialdata._core.models import (
Image2DModel,
Image3DModel,
Labels2DModel,
Labels3DModel,
)
from spatialdata._core.transformations import BaseTransformation, Sequence

# labels need to be preserved after the resizing of the image
if schema == Labels2DModel or schema == Labels3DModel:
# TODO: this should work, test better
kwargs = {"prefilter": False}
else:
elif schema == Image2DModel or schema == Image3DModel:
kwargs = {}
else:
raise ValueError(f"MultiscaleSpatialImage with schema {schema} not supported")

axes = get_dims(data)
scale0 = dict(data["scale0"])
assert len(scale0) == 1
scale0_data = scale0.values().__iter__().__next__()
transformed_dask, raster_translation = _transform_raster(
data=scale0_data.data, axes=scale0_data.dims, transformation=transformation, **kwargs
)
get_dims(data)
transformed_dict = {}
for k, v in data.items():
assert len(v) == 1
xdata = v.values().__iter__().__next__()

composed: BaseTransformation
if k == "scale0":
composed = transformation
else:
scale = _get_scale(xdata.attrs["transform"])
composed = Sequence([scale, transformation, scale.inverse()])

transformed_dask, raster_translation = _transform_raster(
data=xdata.data, axes=xdata.dims, transformation=composed, **kwargs
)
transformed_dict[k] = SpatialImage(transformed_dask, dims=xdata.dims, name=xdata.name)

# this code is temporary and doens't work in all cases (in particular it breaks when the data is not similar
# to a square but has sides of very different lengths). I would remove it an implement (inside the parser)
# the logic described in https://github.com/scverse/spatialdata/issues/108)
shapes = []
for level in range(len(data)):
dims = data[f"scale{level}"].dims.values()
shape = np.array([dict(dims._mapping)[k] for k in axes if k != "c"])
shapes.append(shape)
multiscale_factors = []
shape0 = shapes[0]
for shape in shapes[1:]:
factors = shape0 / shape
factors - min(factors)
# assert np.allclose(almost_zero, np.zeros_like(almost_zero), rtol=2.)
try:
multiscale_factors.append(round(factors[0]))
except OverflowError as e:
raise e
# mypy thinks that schema could be ShapesModel, PointsModel, ...
transformed_data = schema.parse(transformed_dask, dims=axes, multiscale_factors=multiscale_factors) # type: ignore[call-arg,arg-type]
transformed_data = MultiscaleSpatialImage.from_dict(transformed_dict)
old_transformations = get_transformation(data, get_all=True)
assert isinstance(old_transformations, dict)
set_transformation(transformed_data, old_transformations, set_all=True)
Expand All@@ -290,6 +301,8 @@ def _(
raster_translation=raster_translation,
maintain_positioning=maintain_positioning,
)
transformed_data = compute_coordinates(transformed_data)
schema().validate(transformed_data)
return transformed_data


Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
86665b7
don't remove coords
giovp Feb 5, 2023
632c112
update iter multiscale
giovp Feb 17, 2023
0410cea
merge
giovp Feb 17, 2023
6e4a050
update spatial-image and multiscale-spatial_image version
giovp Feb 17, 2023
6565b12
remove check that is now in multiscale spatial image
giovp Feb 19, 2023
4833e63
add coordinates assignment
giovp Feb 19, 2023
2d8bbd2
add coordinates to parser
giovp Feb 19, 2023
22b18a9
Merge branch 'main' into models/images/add-coordinates
giovp Feb 19, 2023
c99c5dd
fix tests
giovp Feb 20, 2023
f562a3b
update tests for 3d
giovp Feb 20, 2023
aef337b
add tests for labels
giovp Feb 20, 2023
0dc0459
update shapely
giovp Feb 20, 2023
97f8d7e
add some comments
giovp Feb 20, 2023
90e0cc3
improve validation per #115
giovp Feb 20, 2023
6140832
remove multiscale_factors and add sclae_factors
giovp Feb 20, 2023
238fb8c
try fixing tests
giovp Feb 20, 2023
c67435a
updates
giovp Feb 20, 2023
3240659
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Feb 20, 2023
55c0e7c
fix mypy
giovp Feb 20, 2023
4214abc
add channels to IO
giovp Feb 20, 2023
f65151e
update omero exlcuding it from labels
giovp Feb 20, 2023
448da01
use isel
giovp Feb 22, 2023
51d865d
read name from raster data
LucaMarconato Feb 23, 2023
697eae1
Merge branch 'main' into models/images/add-coordinates
LucaMarconato Feb 23, 2023
5245259
fix unpad_raster()
LucaMarconato Feb 23, 2023
0a752fe
all tests passing
LucaMarconato Feb 23, 2023
f20582a
fixed precommit
LucaMarconato Feb 23, 2023
7a9f140
remove reference to name
giovp Feb 24, 2023
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
6 changes: 3 additions & 3 deletions pyproject.toml
Original file line numberDiff line numberDiff line change
Expand Up@@ -26,12 +26,12 @@ dependencies = [
"zarr",
# "ome_zarr",
"ome_zarr@git+https://github.com/LucaMarconato/ome-zarr-py@bug_fix_io",
"spatial_image",
"multiscale_spatial_image",
"spatial_image>=0.3.0",
"multiscale_spatial_image>=0.11.2",
"xarray-schema",
"pygeos",
"geopandas",
"shapely==2.0rc2",
"shapely>=2.0.1",
"rich",
"pyarrow",
"tqdm",
Expand Down
1 change: 1 addition & 0 deletions spatialdata/_compat.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -22,4 +22,5 @@ def _check_geopandas_using_shapely() -> None:
"If you intended to use PyGEOS, set the option to False."
),
UserWarning,
stacklevel=2,
)
2 changes: 1 addition & 1 deletion spatialdata/_core/_spatial_query.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -131,7 +131,7 @@ def _bounding_box_query_image(
# add the
selection[axis_name] = slice(min_value, max_value)

query_result = image.sel(selection)
query_result = image.isel(selection)

# update the transform
# currently, this assumes the existing transforms input coordinate system
Expand Down
73 changes: 43 additions & 30 deletions spatialdata/_core/_transform_elements.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -20,6 +20,8 @@
from spatialdata._core.core_utils import (
DEFAULT_COORDINATE_SYSTEM,
SpatialElement,
_get_scale,
compute_coordinates,
get_dims,
)
from spatialdata._core.models import get_schema
Expand DownExpand Up@@ -208,14 +210,21 @@ def _(data: SpatialImage, transformation: BaseTransformation, maintain_positioni
get_transformation,
set_transformation,
)
from spatialdata._core.models import Labels2DModel, Labels3DModel
from spatialdata._core.models import (
Image2DModel,
Image3DModel,
Labels2DModel,
Labels3DModel,
)

# labels need to be preserved after the resizing of the image
if schema == Labels2DModel or schema == Labels3DModel:
# TODO: this should work, test better
kwargs = {"prefilter": False}
else:
elif schema == Image2DModel or schema == Image3DModel:
kwargs = {}
else:
raise ValueError(f"Unsupported schema {schema}")

axes = get_dims(data)
transformed_dask, raster_translation = _transform_raster(
Expand All@@ -232,6 +241,8 @@ def _(data: SpatialImage, transformation: BaseTransformation, maintain_positioni
raster_translation=raster_translation,
maintain_positioning=maintain_positioning,
)
transformed_data = compute_coordinates(transformed_data)
schema().validate(transformed_data)
return transformed_data


Expand All@@ -244,43 +255,43 @@ def _(
get_transformation,
set_transformation,
)
from spatialdata._core.models import Labels2DModel, Labels3DModel
from spatialdata._core.models import (
Image2DModel,
Image3DModel,
Labels2DModel,
Labels3DModel,
)
from spatialdata._core.transformations import BaseTransformation, Sequence

# labels need to be preserved after the resizing of the image
if schema == Labels2DModel or schema == Labels3DModel:
# TODO: this should work, test better
kwargs = {"prefilter": False}
else:
elif schema == Image2DModel or schema == Image3DModel:
kwargs = {}
else:
raise ValueError(f"MultiscaleSpatialImage with schema {schema} not supported")

axes = get_dims(data)
scale0 = dict(data["scale0"])
assert len(scale0) == 1
scale0_data = scale0.values().__iter__().__next__()
transformed_dask, raster_translation = _transform_raster(
data=scale0_data.data, axes=scale0_data.dims, transformation=transformation, **kwargs
)
get_dims(data)
transformed_dict = {}
for k, v in data.items():
assert len(v) == 1
xdata = v.values().__iter__().__next__()

composed: BaseTransformation
if k == "scale0":
composed = transformation
else:
scale = _get_scale(xdata.attrs["transform"])
composed = Sequence([scale, transformation, scale.inverse()])

transformed_dask, raster_translation = _transform_raster(
data=xdata.data, axes=xdata.dims, transformation=composed, **kwargs
)
transformed_dict[k] = SpatialImage(transformed_dask, dims=xdata.dims, name=xdata.name)

# this code is temporary and doens't work in all cases (in particular it breaks when the data is not similar
# to a square but has sides of very different lengths). I would remove it an implement (inside the parser)
# the logic described in https://github.com/scverse/spatialdata/issues/108)
shapes = []
for level in range(len(data)):
dims = data[f"scale{level}"].dims.values()
shape = np.array([dict(dims._mapping)[k] for k in axes if k != "c"])
shapes.append(shape)
multiscale_factors = []
shape0 = shapes[0]
for shape in shapes[1:]:
factors = shape0 / shape
factors - min(factors)
# assert np.allclose(almost_zero, np.zeros_like(almost_zero), rtol=2.)
try:
multiscale_factors.append(round(factors[0]))
except OverflowError as e:
raise e
# mypy thinks that schema could be ShapesModel, PointsModel, ...
transformed_data = schema.parse(transformed_dask, dims=axes, multiscale_factors=multiscale_factors) # type: ignore[call-arg,arg-type]
transformed_data = MultiscaleSpatialImage.from_dict(transformed_dict)
old_transformations = get_transformation(data, get_all=True)
assert isinstance(old_transformations, dict)
set_transformation(transformed_data, old_transformations, set_all=True)
Expand All@@ -290,6 +301,8 @@ def _(
raster_translation=raster_translation,
maintain_positioning=maintain_positioning,
)
transformed_data = compute_coordinates(transformed_data)
schema().validate(transformed_data)
return transformed_data


Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
86665b7
don't remove coords
giovp Feb 5, 2023
632c112
update iter multiscale
giovp Feb 17, 2023
0410cea
merge
giovp Feb 17, 2023
6e4a050
update spatial-image and multiscale-spatial_image version
giovp Feb 17, 2023
6565b12
remove check that is now in multiscale spatial image
giovp Feb 19, 2023
4833e63
add coordinates assignment
giovp Feb 19, 2023
2d8bbd2
add coordinates to parser
giovp Feb 19, 2023
22b18a9
Merge branch 'main' into models/images/add-coordinates
giovp Feb 19, 2023
c99c5dd
fix tests
giovp Feb 20, 2023
f562a3b
update tests for 3d
giovp Feb 20, 2023
aef337b
add tests for labels
giovp Feb 20, 2023
0dc0459
update shapely
giovp Feb 20, 2023
97f8d7e
add some comments
giovp Feb 20, 2023
90e0cc3
improve validation per #115
giovp Feb 20, 2023
6140832
remove multiscale_factors and add sclae_factors
giovp Feb 20, 2023
238fb8c
try fixing tests
giovp Feb 20, 2023
c67435a
updates
giovp Feb 20, 2023
3240659
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Feb 20, 2023
55c0e7c
fix mypy
giovp Feb 20, 2023
4214abc
add channels to IO
giovp Feb 20, 2023
f65151e
update omero exlcuding it from labels
giovp Feb 20, 2023
448da01
use isel
giovp Feb 22, 2023
51d865d
read name from raster data
LucaMarconato Feb 23, 2023
697eae1
Merge branch 'main' into models/images/add-coordinates
LucaMarconato Feb 23, 2023
5245259
fix unpad_raster()
LucaMarconato Feb 23, 2023
0a752fe
all tests passing
LucaMarconato Feb 23, 2023
f20582a
fixed precommit
LucaMarconato Feb 23, 2023
7a9f140
remove reference to name
giovp Feb 24, 2023
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
6 changes: 3 additions & 3 deletions pyproject.toml
Original file line numberDiff line numberDiff line change
Expand Up@@ -26,12 +26,12 @@ dependencies = [
"zarr",
# "ome_zarr",
"ome_zarr@git+https://github.com/LucaMarconato/ome-zarr-py@bug_fix_io",
"spatial_image",
"multiscale_spatial_image",
"spatial_image>=0.3.0",
"multiscale_spatial_image>=0.11.2",
"xarray-schema",
"pygeos",
"geopandas",
"shapely==2.0rc2",
"shapely>=2.0.1",
"rich",
"pyarrow",
"tqdm",
Expand Down
1 change: 1 addition & 0 deletions spatialdata/_compat.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -22,4 +22,5 @@ def _check_geopandas_using_shapely() -> None:
"If you intended to use PyGEOS, set the option to False."
),
UserWarning,
stacklevel=2,
)
2 changes: 1 addition & 1 deletion spatialdata/_core/_spatial_query.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -131,7 +131,7 @@ def _bounding_box_query_image(
# add the
selection[axis_name] = slice(min_value, max_value)

query_result = image.sel(selection)
query_result = image.isel(selection)

# update the transform
# currently, this assumes the existing transforms input coordinate system
Expand Down
73 changes: 43 additions & 30 deletions spatialdata/_core/_transform_elements.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -20,6 +20,8 @@
from spatialdata._core.core_utils import (
DEFAULT_COORDINATE_SYSTEM,
SpatialElement,
_get_scale,
compute_coordinates,
get_dims,
)
from spatialdata._core.models import get_schema
Expand DownExpand Up@@ -208,14 +210,21 @@ def _(data: SpatialImage, transformation: BaseTransformation, maintain_positioni
get_transformation,
set_transformation,
)
from spatialdata._core.models import Labels2DModel, Labels3DModel
from spatialdata._core.models import (
Image2DModel,
Image3DModel,
Labels2DModel,
Labels3DModel,
)

# labels need to be preserved after the resizing of the image
if schema == Labels2DModel or schema == Labels3DModel:
# TODO: this should work, test better
kwargs = {"prefilter": False}
else:
elif schema == Image2DModel or schema == Image3DModel:
kwargs = {}
else:
raise ValueError(f"Unsupported schema {schema}")

axes = get_dims(data)
transformed_dask, raster_translation = _transform_raster(
Expand All@@ -232,6 +241,8 @@ def _(data: SpatialImage, transformation: BaseTransformation, maintain_positioni
raster_translation=raster_translation,
maintain_positioning=maintain_positioning,
)
transformed_data = compute_coordinates(transformed_data)
schema().validate(transformed_data)
return transformed_data


Expand All@@ -244,43 +255,43 @@ def _(
get_transformation,
set_transformation,
)
from spatialdata._core.models import Labels2DModel, Labels3DModel
from spatialdata._core.models import (
Image2DModel,
Image3DModel,
Labels2DModel,
Labels3DModel,
)
from spatialdata._core.transformations import BaseTransformation, Sequence

# labels need to be preserved after the resizing of the image
if schema == Labels2DModel or schema == Labels3DModel:
# TODO: this should work, test better
kwargs = {"prefilter": False}
else:
elif schema == Image2DModel or schema == Image3DModel:
kwargs = {}
else:
raise ValueError(f"MultiscaleSpatialImage with schema {schema} not supported")

axes = get_dims(data)
scale0 = dict(data["scale0"])
assert len(scale0) == 1
scale0_data = scale0.values().__iter__().__next__()
transformed_dask, raster_translation = _transform_raster(
data=scale0_data.data, axes=scale0_data.dims, transformation=transformation, **kwargs
)
get_dims(data)
transformed_dict = {}
for k, v in data.items():
assert len(v) == 1
xdata = v.values().__iter__().__next__()

composed: BaseTransformation
if k == "scale0":
composed = transformation
else:
scale = _get_scale(xdata.attrs["transform"])
composed = Sequence([scale, transformation, scale.inverse()])

transformed_dask, raster_translation = _transform_raster(
data=xdata.data, axes=xdata.dims, transformation=composed, **kwargs
)
transformed_dict[k] = SpatialImage(transformed_dask, dims=xdata.dims, name=xdata.name)

# this code is temporary and doens't work in all cases (in particular it breaks when the data is not similar
# to a square but has sides of very different lengths). I would remove it an implement (inside the parser)
# the logic described in https://github.com/scverse/spatialdata/issues/108)
shapes = []
for level in range(len(data)):
dims = data[f"scale{level}"].dims.values()
shape = np.array([dict(dims._mapping)[k] for k in axes if k != "c"])
shapes.append(shape)
multiscale_factors = []
shape0 = shapes[0]
for shape in shapes[1:]:
factors = shape0 / shape
factors - min(factors)
# assert np.allclose(almost_zero, np.zeros_like(almost_zero), rtol=2.)
try:
multiscale_factors.append(round(factors[0]))
except OverflowError as e:
raise e
# mypy thinks that schema could be ShapesModel, PointsModel, ...
transformed_data = schema.parse(transformed_dask, dims=axes, multiscale_factors=multiscale_factors) # type: ignore[call-arg,arg-type]
transformed_data = MultiscaleSpatialImage.from_dict(transformed_dict)
old_transformations = get_transformation(data, get_all=True)
assert isinstance(old_transformations, dict)
set_transformation(transformed_data, old_transformations, set_all=True)
Expand All@@ -290,6 +301,8 @@ def _(
raster_translation=raster_translation,
maintain_positioning=maintain_positioning,
)
transformed_data = compute_coordinates(transformed_data)
schema().validate(transformed_data)
return transformed_data


Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
86665b7
don't remove coords
giovp Feb 5, 2023
632c112
update iter multiscale
giovp Feb 17, 2023
0410cea
merge
giovp Feb 17, 2023
6e4a050
update spatial-image and multiscale-spatial_image version
giovp Feb 17, 2023
6565b12
remove check that is now in multiscale spatial image
giovp Feb 19, 2023
4833e63
add coordinates assignment
giovp Feb 19, 2023
2d8bbd2
add coordinates to parser
giovp Feb 19, 2023
22b18a9
Merge branch 'main' into models/images/add-coordinates
giovp Feb 19, 2023
c99c5dd
fix tests
giovp Feb 20, 2023
f562a3b
update tests for 3d
giovp Feb 20, 2023
aef337b
add tests for labels
giovp Feb 20, 2023
0dc0459
update shapely
giovp Feb 20, 2023
97f8d7e
add some comments
giovp Feb 20, 2023
90e0cc3
improve validation per #115
giovp Feb 20, 2023
6140832
remove multiscale_factors and add sclae_factors
giovp Feb 20, 2023
238fb8c
try fixing tests
giovp Feb 20, 2023
c67435a
updates
giovp Feb 20, 2023
3240659
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Feb 20, 2023
55c0e7c
fix mypy
giovp Feb 20, 2023
4214abc
add channels to IO
giovp Feb 20, 2023
f65151e
update omero exlcuding it from labels
giovp Feb 20, 2023
448da01
use isel
giovp Feb 22, 2023
51d865d
read name from raster data
LucaMarconato Feb 23, 2023
697eae1
Merge branch 'main' into models/images/add-coordinates
LucaMarconato Feb 23, 2023
5245259
fix unpad_raster()
LucaMarconato Feb 23, 2023
0a752fe
all tests passing
LucaMarconato Feb 23, 2023
f20582a
fixed precommit
LucaMarconato Feb 23, 2023
7a9f140
remove reference to name
giovp Feb 24, 2023
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
6 changes: 3 additions & 3 deletions pyproject.toml
Original file line numberDiff line numberDiff line change
Expand Up@@ -26,12 +26,12 @@ dependencies = [
"zarr",
# "ome_zarr",
"ome_zarr@git+https://github.com/LucaMarconato/ome-zarr-py@bug_fix_io",
"spatial_image",
"multiscale_spatial_image",
"spatial_image>=0.3.0",
"multiscale_spatial_image>=0.11.2",
"xarray-schema",
"pygeos",
"geopandas",
"shapely==2.0rc2",
"shapely>=2.0.1",
"rich",
"pyarrow",
"tqdm",
Expand Down
1 change: 1 addition & 0 deletions spatialdata/_compat.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -22,4 +22,5 @@ def _check_geopandas_using_shapely() -> None:
"If you intended to use PyGEOS, set the option to False."
),
UserWarning,
stacklevel=2,
)
2 changes: 1 addition & 1 deletion spatialdata/_core/_spatial_query.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -131,7 +131,7 @@ def _bounding_box_query_image(
# add the
selection[axis_name] = slice(min_value, max_value)

query_result = image.sel(selection)
query_result = image.isel(selection)

# update the transform
# currently, this assumes the existing transforms input coordinate system
Expand Down
73 changes: 43 additions & 30 deletions spatialdata/_core/_transform_elements.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -20,6 +20,8 @@
from spatialdata._core.core_utils import (
DEFAULT_COORDINATE_SYSTEM,
SpatialElement,
_get_scale,
compute_coordinates,
get_dims,
)
from spatialdata._core.models import get_schema
Expand DownExpand Up@@ -208,14 +210,21 @@ def _(data: SpatialImage, transformation: BaseTransformation, maintain_positioni
get_transformation,
set_transformation,
)
from spatialdata._core.models import Labels2DModel, Labels3DModel
from spatialdata._core.models import (
Image2DModel,
Image3DModel,
Labels2DModel,
Labels3DModel,
)

# labels need to be preserved after the resizing of the image
if schema == Labels2DModel or schema == Labels3DModel:
# TODO: this should work, test better
kwargs = {"prefilter": False}
else:
elif schema == Image2DModel or schema == Image3DModel:
kwargs = {}
else:
raise ValueError(f"Unsupported schema {schema}")

axes = get_dims(data)
transformed_dask, raster_translation = _transform_raster(
Expand All@@ -232,6 +241,8 @@ def _(data: SpatialImage, transformation: BaseTransformation, maintain_positioni
raster_translation=raster_translation,
maintain_positioning=maintain_positioning,
)
transformed_data = compute_coordinates(transformed_data)
schema().validate(transformed_data)
return transformed_data


Expand All@@ -244,43 +255,43 @@ def _(
get_transformation,
set_transformation,
)
from spatialdata._core.models import Labels2DModel, Labels3DModel
from spatialdata._core.models import (
Image2DModel,
Image3DModel,
Labels2DModel,
Labels3DModel,
)
from spatialdata._core.transformations import BaseTransformation, Sequence

# labels need to be preserved after the resizing of the image
if schema == Labels2DModel or schema == Labels3DModel:
# TODO: this should work, test better
kwargs = {"prefilter": False}
else:
elif schema == Image2DModel or schema == Image3DModel:
kwargs = {}
else:
raise ValueError(f"MultiscaleSpatialImage with schema {schema} not supported")

axes = get_dims(data)
scale0 = dict(data["scale0"])
assert len(scale0) == 1
scale0_data = scale0.values().__iter__().__next__()
transformed_dask, raster_translation = _transform_raster(
data=scale0_data.data, axes=scale0_data.dims, transformation=transformation, **kwargs
)
get_dims(data)
transformed_dict = {}
for k, v in data.items():
assert len(v) == 1
xdata = v.values().__iter__().__next__()

composed: BaseTransformation
if k == "scale0":
composed = transformation
else:
scale = _get_scale(xdata.attrs["transform"])
composed = Sequence([scale, transformation, scale.inverse()])

transformed_dask, raster_translation = _transform_raster(
data=xdata.data, axes=xdata.dims, transformation=composed, **kwargs
)
transformed_dict[k] = SpatialImage(transformed_dask, dims=xdata.dims, name=xdata.name)

# this code is temporary and doens't work in all cases (in particular it breaks when the data is not similar
# to a square but has sides of very different lengths). I would remove it an implement (inside the parser)
# the logic described in https://github.com/scverse/spatialdata/issues/108)
shapes = []
for level in range(len(data)):
dims = data[f"scale{level}"].dims.values()
shape = np.array([dict(dims._mapping)[k] for k in axes if k != "c"])
shapes.append(shape)
multiscale_factors = []
shape0 = shapes[0]
for shape in shapes[1:]:
factors = shape0 / shape
factors - min(factors)
# assert np.allclose(almost_zero, np.zeros_like(almost_zero), rtol=2.)
try:
multiscale_factors.append(round(factors[0]))
except OverflowError as e:
raise e
# mypy thinks that schema could be ShapesModel, PointsModel, ...
transformed_data = schema.parse(transformed_dask, dims=axes, multiscale_factors=multiscale_factors) # type: ignore[call-arg,arg-type]
transformed_data = MultiscaleSpatialImage.from_dict(transformed_dict)
old_transformations = get_transformation(data, get_all=True)
assert isinstance(old_transformations, dict)
set_transformation(transformed_data, old_transformations, set_all=True)
Expand All@@ -290,6 +301,8 @@ def _(
raster_translation=raster_translation,
maintain_positioning=maintain_positioning,
)
transformed_data = compute_coordinates(transformed_data)
schema().validate(transformed_data)
return transformed_data


Expand Down
Loading