Skip to content

Commit 650de48

Browse files
committed
Support obs_points_path in SpatialDataWrapper
1 parent bac58e3 commit 650de48

File tree

5 files changed

+54
-6
lines changed

5 files changed

+54
-6
lines changed

docs/notebooks/spatial_data_blobs.ipynb

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,21 @@
6060
"sdata.write(spatialdata_filepath, overwrite=True)"
6161
]
6262
},
63+
{
64+
"cell_type": "code",
65+
"execution_count": null,
66+
"metadata": {},
67+
"outputs": [],
68+
"source": [
69+
"# Change data type of x and y columns from int64 to int32\n",
70+
"# Temporary workaround, will be resolved by https://github.com/vitessce/vitessce/issues/2292\n",
71+
"ddf = sdata[\"blobs_points\"]\n",
72+
"ddf[\"x\"] = ddf[\"x\"].astype('int32')\n",
73+
"ddf[\"y\"] = ddf[\"y\"].astype('int32')\n",
74+
"sdata[\"blobs_points_2\"] = ddf\n",
75+
"sdata.write_element(\"blobs_points_2\")"
76+
]
77+
},
6378
{
6479
"cell_type": "code",
6580
"execution_count": null,
@@ -107,7 +122,17 @@
107122
" \"fileUid\": \"my_unique_id\"\n",
108123
" }\n",
109124
")\n",
110-
"dataset = vc.add_dataset(name='Blobs').add_object(wrapper)\n",
125+
"points_wrapper = SpatialDataWrapper(\n",
126+
" sdata_store=spatialdata_filepath,\n",
127+
" # The following paths are relative to the root of the SpatialData zarr store on-disk.\n",
128+
" obs_points_path=\"points/blobs_points_2\",\n",
129+
" coordinate_system=\"global\",\n",
130+
" coordination_values={\n",
131+
" \"obsType\": \"point\",\n",
132+
" \"fileUid\": \"other_unique_id\"\n",
133+
" }\n",
134+
")\n",
135+
"dataset = vc.add_dataset(name='Blobs').add_object(wrapper).add_object(points_wrapper)\n",
111136
"\n",
112137
"# Add views (visualizations) to the configuration:\n",
113138
"spatial = vc.add_view(\"spatialBeta\", dataset=dataset)\n",
@@ -148,6 +173,14 @@
148173
" }]),\n",
149174
"}, scope_prefix=get_initial_coordination_scope_prefix(\"A\", \"obsSegmentations\"))\n",
150175
"\n",
176+
"vc.link_views_by_dict([spatial, layer_controller], {\n",
177+
" 'pointLayer': CL([{\n",
178+
" \"fileUid\": \"other_unique_id\",\n",
179+
" \"obsType\": \"point\",\n",
180+
" \"obsHighlight\": None,\n",
181+
" }]),\n",
182+
"}, scope_prefix=get_initial_coordination_scope_prefix(\"A\", \"obsPoints\"))\n",
183+
"\n",
151184
"# Layout the views\n",
152185
"vc.layout(spatial | layer_controller);"
153186
]

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
44

55
[project]
66
name = "vitessce"
7-
version = "3.7.4"
7+
version = "3.7.5"
88
authors = [
99
{ name="Mark Keller", email="[email protected]" },
1010
]

src/vitessce/file_def_utils.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,16 @@ def gen_sdata_obs_segmentations_schema(options, path: str, table_path: str = "ta
146146
options["obsSegmentations"]['coordinateSystem'] = coordinate_system
147147
return options
148148

149+
def gen_sdata_obs_points_schema(options, path: str, table_path: str = "tables/table", coordinate_system: Optional[str] = None) -> dict:
150+
if path is not None:
151+
options["obsPoints"] = {
152+
"path": path
153+
}
154+
if table_path is not None:
155+
options["obsPoints"]['tablePath'] = table_path
156+
if coordinate_system is not None:
157+
options["obsPoints"]['coordinateSystem'] = coordinate_system
158+
return options
149159

150160
def gen_sdata_obs_spots_schema(options: dict, shapes_path: str, table_path: str = "tables/table", region: Optional[str] = None, coordinate_system: Optional[str] = None) -> dict:
151161
if shapes_path is not None:

src/vitessce/widget.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -651,7 +651,7 @@ class VitessceWidget(anywidget.AnyWidget):
651651

652652
next_port = DEFAULT_PORT
653653

654-
js_package_version = Unicode('3.6.18').tag(sync=True)
654+
js_package_version = Unicode('3.8.3').tag(sync=True)
655655
js_dev_mode = Bool(False).tag(sync=True)
656656
custom_js_url = Unicode('').tag(sync=True)
657657
plugin_esm = List(trait=Unicode(''), default_value=[]).tag(sync=True)
@@ -664,7 +664,7 @@ class VitessceWidget(anywidget.AnyWidget):
664664

665665
store_urls = List(trait=Unicode(''), default_value=[]).tag(sync=True)
666666

667-
def __init__(self, config, height=600, theme='auto', uid=None, port=None, proxy=False, js_package_version='3.6.18', js_dev_mode=False, custom_js_url='', plugins=None, remount_on_uid_change=True, prefer_local=True, invoke_timeout=300000, invoke_batched=True, page_mode=False, page_esm=None, prevent_scroll=True, server_host=None):
667+
def __init__(self, config, height=600, theme='auto', uid=None, port=None, proxy=False, js_package_version='3.8.3', js_dev_mode=False, custom_js_url='', plugins=None, remount_on_uid_change=True, prefer_local=True, invoke_timeout=300000, invoke_batched=True, page_mode=False, page_esm=None, prevent_scroll=True, server_host=None):
668668
"""
669669
Construct a new Vitessce widget. Not intended to be instantiated directly; instead, use ``VitessceConfig.widget``.
670670
@@ -798,7 +798,7 @@ def _plugin_command(self, params, buffers):
798798
# Launch Vitessce using plain HTML representation (no ipywidgets)
799799

800800

801-
def ipython_display(config, height=600, theme='auto', base_url=None, host_name=None, uid=None, port=None, proxy=False, js_package_version='3.6.18', js_dev_mode=False, custom_js_url='', plugins=None, remount_on_uid_change=True, page_mode=False, page_esm=None, server_host=None):
801+
def ipython_display(config, height=600, theme='auto', base_url=None, host_name=None, uid=None, port=None, proxy=False, js_package_version='3.8.3', js_dev_mode=False, custom_js_url='', plugins=None, remount_on_uid_change=True, page_mode=False, page_esm=None, server_host=None):
802802
from IPython.display import display, HTML
803803
uid_str = "vitessce" + get_uid_str(uid)
804804

src/vitessce/wrappers.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
gen_obs_sets_schema,
2929
gen_sdata_image_schema,
3030
gen_sdata_obs_segmentations_schema,
31+
gen_sdata_obs_points_schema,
3132
gen_sdata_obs_spots_schema,
3233
gen_sdata_obs_sets_schema,
3334
gen_sdata_obs_feature_matrix_schema,
@@ -1399,7 +1400,7 @@ def auto_view_config(self, vc):
13991400

14001401
class SpatialDataWrapper(AnnDataWrapper):
14011402

1402-
def __init__(self, sdata_path: Optional[str] = None, sdata_url: Optional[str] = None, sdata_store: Optional[Union[str, zarr.storage.StoreLike]] = None, sdata_artifact: Optional[ln.Artifact] = None, image_path: Optional[str] = None, region: Optional[str] = None, coordinate_system: Optional[str] = None, obs_spots_path: Optional[str] = None, obs_segmentations_path: Optional[str] = None, table_path: str = "tables/table", is_zip=None, coordination_values=None, **kwargs):
1403+
def __init__(self, sdata_path: Optional[str] = None, sdata_url: Optional[str] = None, sdata_store: Optional[Union[str, zarr.storage.StoreLike]] = None, sdata_artifact: Optional[ln.Artifact] = None, image_path: Optional[str] = None, region: Optional[str] = None, coordinate_system: Optional[str] = None, obs_spots_path: Optional[str] = None, obs_segmentations_path: Optional[str] = None, obs_points_path: Optional[str] = None, table_path: str = "tables/table", is_zip=None, coordination_values=None, **kwargs):
14031404
"""
14041405
Wrap a SpatialData object.
14051406
@@ -1422,6 +1423,8 @@ def __init__(self, sdata_path: Optional[str] = None, sdata_url: Optional[str] =
14221423
:type obs_spots_path: Optional[str]
14231424
:param obs_segmentations_path: Path to a labels or shapes element (segmentation bitmask label image or segmentation polygon shapes), by default None
14241425
:type obs_segmentations_path: Optional[str]
1426+
:param obs_points_path: Path to a points element, by default None
1427+
:type obs_points_path: Optional[str]
14251428
"""
14261429
raise_error_if_zero_or_more_than_one([
14271430
sdata_path,
@@ -1451,6 +1454,7 @@ def __init__(self, sdata_path: Optional[str] = None, sdata_url: Optional[str] =
14511454
self._kwargs = kwargs
14521455
self._obs_spots_path = obs_spots_path
14531456
self._obs_segmentations_path = obs_segmentations_path
1457+
self._obs_points_path = obs_points_path
14541458
if self._adata_path is not None:
14551459
self.zarr_folder = 'spatialdata.zarr'
14561460
self.obs_type_label = None
@@ -1538,6 +1542,7 @@ def generator(base_url):
15381542
options = gen_sdata_obs_spots_schema(options, self._obs_spots_path, self._table_path, self._region, self._coordinate_system)
15391543
options = gen_sdata_image_schema(options, self._image_path, self._coordinate_system)
15401544
options = gen_sdata_obs_segmentations_schema(options, self._obs_segmentations_path, self._table_path, self._coordinate_system)
1545+
options = gen_sdata_obs_points_schema(options, self._obs_points_path, self._table_path, self._coordinate_system)
15411546
options = gen_feature_labels_schema(self._feature_labels, options)
15421547
if len(options.keys()) > 0:
15431548
obj_file_def = {

0 commit comments

Comments
 (0)