From 4c6408f50f055355803355e398242a22c0237456 Mon Sep 17 00:00:00 2001 From: Sonja Stockhaus Date: Tue, 7 Jan 2025 21:30:10 +0100 Subject: [PATCH 1/9] layer selection for points, shapes and labels plus bugfixes for coloring points using a table --- src/spatialdata_plot/pl/basic.py | 26 +++++++++++--- src/spatialdata_plot/pl/render.py | 42 ++++++++++++++++++++--- src/spatialdata_plot/pl/render_params.py | 3 ++ src/spatialdata_plot/pl/utils.py | 43 ++++++++++++++++++++---- 4 files changed, 99 insertions(+), 15 deletions(-) diff --git a/src/spatialdata_plot/pl/basic.py b/src/spatialdata_plot/pl/basic.py index 78c59436..9f2becbc 100644 --- a/src/spatialdata_plot/pl/basic.py +++ b/src/spatialdata_plot/pl/basic.py @@ -169,6 +169,7 @@ def render_shapes( scale: float | int = 1.0, method: str | None = None, table_name: str | None = None, + table_layer: str | None = None, **kwargs: Any, ) -> sd.SpatialData: """ @@ -226,6 +227,9 @@ def render_shapes( Name of the table containing the color(s) columns. If one name is given than the table is used for each spatial element to be plotted if the table annotates it. If you want to use different tables for particular elements, as specified under element. + table_layer: str | None + Layer of the table to use for coloring if `color` is in :attr:`sdata.table.var_names`. If None, the data in + :attr:`sdata.table.X` is used for coloring. **kwargs : Any Additional arguments for customization. This can include: @@ -269,6 +273,7 @@ def render_shapes( norm=norm, scale=scale, table_name=table_name, + table_layer=table_layer, method=method, ds_reduction=kwargs.get("datashader_reduction", None), ) @@ -296,6 +301,7 @@ def render_shapes( fill_alpha=param_values["fill_alpha"], transfunc=kwargs.get("transfunc", None), table_name=param_values["table_name"], + table_layer=param_values["table_layer"], zorder=n_steps, method=param_values["method"], ds_reduction=param_values["ds_reduction"], @@ -318,6 +324,7 @@ def render_points( size: float | int = 1.0, method: str | None = None, table_name: str | None = None, + table_layer: str | None = None, **kwargs: Any, ) -> sd.SpatialData: """ @@ -368,6 +375,9 @@ def render_points( Name of the table containing the color(s) columns. If one name is given than the table is used for each spatial element to be plotted if the table annotates it. If you want to use different tables for particular elements, as specified under element. + table_layer: str | None + Layer of the table to use for coloring if `color` is in :attr:`sdata.table.var_names`. If None, the data in + :attr:`sdata.table.X` is used for coloring. **kwargs : Any Additional arguments for customization. This can include: @@ -401,6 +411,7 @@ def render_points( norm=norm, size=size, table_name=table_name, + table_layer=table_layer, ds_reduction=kwargs.get("datashader_reduction", None), ) @@ -431,6 +442,7 @@ def render_points( transfunc=kwargs.get("transfunc", None), size=param_values["size"], table_name=param_values["table_name"], + table_layer=param_values["table_layer"], zorder=n_steps, method=method, ds_reduction=param_values["ds_reduction"], @@ -571,6 +583,7 @@ def render_labels( fill_alpha: float | int = 0.4, scale: str | None = None, table_name: str | None = None, + table_layer: str | None = None, **kwargs: Any, ) -> sd.SpatialData: """ @@ -588,10 +601,10 @@ def render_labels( The name of the labels element to render. If `None`, all label elements in the `SpatialData` object will be used and all parameters will be broadcasted if possible. color : list[str] | str | None - Can either be string representing a color-like or key in :attr:`sdata.table.obs`. The latter can be used to - color by categorical or continuous variables. If the color column is found in multiple locations, please - provide the table_name to be used for the element if you would like a specific table to be used. By default - one table will automatically be choosen. + Can either be string representing a color-like or key in :attr:`sdata.table.obs` or in the index of + :attr:`sdata.table.var`. The latter can be used to color by categorical or continuous variables. If the + color column is found in multiple locations, please provide the table_name to be used for the element if you + would like a specific table to be used. By default one table will automatically be choosen. groups : list[str] | str | None When using `color` and the key represents discrete labels, `groups` can be used to show only a subset of them. Other values are set to NA. The list can contain multiple discrete labels to be visualized. @@ -624,6 +637,9 @@ def render_labels( with the highest resolution is selected. This can lead to long computing times for large images! table_name: str | None Name of the table containing the color columns. + table_layer: str | None + Layer of the table to use for coloring if `color` is in :attr:`sdata.table.var_names`. If None, the data in + :attr:`sdata.table.X` is used for coloring. kwargs Additional arguments to be passed to cmap and norm. @@ -652,6 +668,7 @@ def render_labels( palette=palette, scale=scale, table_name=table_name, + table_layer=table_layer, ) sdata = self._copy() @@ -676,6 +693,7 @@ def render_labels( transfunc=kwargs.get("transfunc", None), scale=param_values["scale"], table_name=param_values["table_name"], + table_layer=param_values["table_layer"], zorder=n_steps, ) n_steps += 1 diff --git a/src/spatialdata_plot/pl/render.py b/src/spatialdata_plot/pl/render.py index a3a6c1a1..dbb2ec37 100644 --- a/src/spatialdata_plot/pl/render.py +++ b/src/spatialdata_plot/pl/render.py @@ -17,7 +17,7 @@ from matplotlib.cm import ScalarMappable from matplotlib.colors import ListedColormap, Normalize from scanpy._settings import settings as sc_settings -from spatialdata import get_extent +from spatialdata import get_extent, get_values from spatialdata.models import PointsModel, get_table_keys from spatialdata.transformations import ( set_transformation, @@ -70,6 +70,7 @@ def _render_shapes( element = render_params.element col_for_color = render_params.col_for_color groups = render_params.groups + table_layer = render_params.table_layer sdata_filt = sdata.filter_by_coordinate_system( coordinate_system=coordinate_system, @@ -110,6 +111,7 @@ def _render_shapes( na_color=render_params.color or render_params.cmap_params.na_color, cmap_params=render_params.cmap_params, table_name=table_name, + table_layer=table_layer, ) values_are_categorical = color_source_vector is not None @@ -378,6 +380,7 @@ def _render_points( element = render_params.element col_for_color = render_params.col_for_color table_name = render_params.table_name + table_layer = render_params.table_layer color = render_params.color groups = render_params.groups palette = render_params.palette @@ -390,10 +393,14 @@ def _render_points( points = sdata.points[element] coords = ["x", "y"] - if col_for_color is None or (table_name is not None and col_for_color in sdata_filt[table_name].obs.columns): + if col_for_color is None or ( + table_name is not None + and (col_for_color in sdata_filt[table_name].obs.columns or col_for_color in sdata_filt[table_name].var_names) + ): points = points[coords].compute() if ( col_for_color + and col_for_color in sdata_filt[table_name].obs.columns and (color_col := sdata_filt[table_name].obs[col_for_color]).dtype == "O" and not _is_coercable_to_float(color_col) ): @@ -409,7 +416,21 @@ def _render_points( points = points[coords].compute() if groups is not None and col_for_color is not None: - points = points[points[col_for_color].isin(groups)] + if col_for_color in points.columns: + points_color_values = points[col_for_color] + else: + points_color_values = get_values( + value_key=col_for_color, + sdata=sdata_filt, + element_name=element, + table_name=table_name, + table_layer=table_layer, + ) + # TODO: merge necessary to ensure correct order? + points_color_values = points.merge(points_color_values, how="left", left_index=True, right_index=True)[ + col_for_color + ] + points = points[points_color_values.isin(groups)] if len(points) <= 0: raise ValueError(f"None of the groups {groups} could be found in the column '{col_for_color}'.") @@ -419,9 +440,18 @@ def _render_points( X=points[["x", "y"]].values, obs=points[coords].reset_index(), dtype=points[["x", "y"]].values.dtype ) else: + adata_obs = sdata_filt[table_name].obs + # if the points are colored by values in X (or a different layer), add the values to obs + if col_for_color in sdata_filt[table_name].var_names: + if table_layer is None: + adata_obs[col_for_color] = sdata_filt[table_name][:, col_for_color].X.flatten().copy() + else: + adata_obs[col_for_color] = sdata_filt[table_name][:, col_for_color].layers[table_layer].flatten().copy() + if groups is not None: + adata_obs = adata_obs[adata_obs[col_for_color].isin(groups)] adata = AnnData( X=points[["x", "y"]].values, - obs=sdata_filt[table_name].obs, + obs=adata_obs, dtype=points[["x", "y"]].values.dtype, uns=sdata_filt[table_name].uns, ) @@ -806,6 +836,7 @@ def _render_labels( ) -> None: element = render_params.element table_name = render_params.table_name + table_layer = render_params.table_layer palette = render_params.palette color = render_params.color groups = render_params.groups @@ -841,7 +872,7 @@ def _render_labels( extent=extent, ) - # the avove adds a useless c dimension of 1 (y, x) -> (1, y, x) + # the above adds a useless c dimension of 1 (y, x) -> (1, y, x) label = label.squeeze() if table_name is None: @@ -866,6 +897,7 @@ def _render_labels( na_color=render_params.cmap_params.na_color, cmap_params=render_params.cmap_params, table_name=table_name, + table_layer=table_layer, ) def _draw_labels(seg_erosionpx: int | None, seg_boundaries: bool, alpha: float) -> matplotlib.image.AxesImage: diff --git a/src/spatialdata_plot/pl/render_params.py b/src/spatialdata_plot/pl/render_params.py index ee37c57f..b44175c3 100644 --- a/src/spatialdata_plot/pl/render_params.py +++ b/src/spatialdata_plot/pl/render_params.py @@ -89,6 +89,7 @@ class ShapesRenderParams: method: str | None = None zorder: int = 0 table_name: str | None = None + table_layer: str | None = None ds_reduction: Literal["sum", "mean", "any", "count", "std", "var", "max", "min"] | None = None @@ -108,6 +109,7 @@ class PointsRenderParams: method: str | None = None zorder: int = 0 table_name: str | None = None + table_layer: str | None = None ds_reduction: Literal["sum", "mean", "any", "count", "std", "var", "max", "min"] | None = None @@ -141,4 +143,5 @@ class LabelsRenderParams: transfunc: Callable[[float], float] | None = None scale: str | None = None table_name: str | None = None + table_layer: str | None = None zorder: int = 0 diff --git a/src/spatialdata_plot/pl/utils.py b/src/spatialdata_plot/pl/utils.py index dd3d5ec0..dd0912af 100644 --- a/src/spatialdata_plot/pl/utils.py +++ b/src/spatialdata_plot/pl/utils.py @@ -700,13 +700,19 @@ def _get_colors_for_categorical_obs( # TODO consider move to relational query in spatialdata -def get_values_point_table(sdata: SpatialData, origin: _ValueOrigin, table_name: str) -> pd.Series: +def get_values_point_table( # TODO: remove??? + sdata: SpatialData, origin: _ValueOrigin, table_name: str, table_layer: str | None +) -> pd.Series: """Get a particular column stored in _ValueOrigin from the table in the spatialdata object.""" table = sdata[table_name] if origin.origin == "obs": return table.obs[origin.value_key] if origin.origin == "var": - return table[:, table.var_names.isin([origin.value_key])].X.copy() + if table_layer is None: + return table[:, table.var_names.isin([origin.value_key])].X.copy() + if table_layer not in table.layers: + raise ValueError(f"Layer `{table_layer}` not found in table {table_name}.") + return table[:, table.var_names.isin([origin.value_key])].layers[table_layer].copy() raise ValueError(f"Color column `{origin.value_key}` not found in table {table_name}") @@ -720,6 +726,7 @@ def _set_color_source_vec( palette: list[str] | str | None = None, cmap_params: CmapParams | None = None, table_name: str | None = None, + table_layer: str | None = None, ) -> tuple[ArrayLike | pd.Series | None, ArrayLike, bool]: if value_to_plot is None and element is not None: color = np.full(len(element), na_color) @@ -740,6 +747,7 @@ def _set_color_source_vec( value_to_plot=value_to_plot, element_name=element_name, table_name=table_name, + table_layer=table_layer, ) # numerical case, return early @@ -1627,7 +1635,10 @@ def _type_check_params(param_dict: dict[str, Any], element_type: str) -> dict[st raise ValueError("Parameter 'size' must be a positive number.") if param_dict.get("table_name") and not isinstance(param_dict["table_name"], str): - raise TypeError("Parameter 'table_name' must be a string .") + raise TypeError("Parameter 'table_name' must be a string.") + + if param_dict.get("table_layer") and not isinstance(param_dict["table_layer"], str): + raise TypeError("Parameter 'table_layer' must be a string.") # like this because the following would assign True/False to 'method' if (method := param_dict.get("method")) not in ["matplotlib", "datashader", None]: @@ -1668,6 +1679,7 @@ def _validate_label_render_params( outline_alpha: float | int, scale: str | None, table_name: str | None, + table_layer: str | None, ) -> dict[str, dict[str, Any]]: param_dict: dict[str, Any] = { "sdata": sdata, @@ -1683,6 +1695,7 @@ def _validate_label_render_params( "norm": norm, "scale": scale, "table_name": table_name, + "table_layer": table_layer, } param_dict = _type_check_params(param_dict, "labels") @@ -1696,11 +1709,12 @@ def _validate_label_render_params( element_params[el]["na_color"] = param_dict["na_color"] element_params[el]["cmap"] = param_dict["cmap"] element_params[el]["norm"] = param_dict["norm"] - element_params[el]["color"] = param_dict["color"] + # element_params[el]["color"] = param_dict["color"] # TODO: remove? element_params[el]["fill_alpha"] = param_dict["fill_alpha"] element_params[el]["scale"] = param_dict["scale"] element_params[el]["outline_alpha"] = param_dict["outline_alpha"] element_params[el]["contour_px"] = param_dict["contour_px"] + element_params[el]["table_layer"] = param_dict["table_layer"] element_params[el]["table_name"] = None element_params[el]["color"] = None @@ -1727,6 +1741,7 @@ def _validate_points_render_params( norm: Normalize | None, size: float | int, table_name: str | None, + table_layer: str | None, ds_reduction: str | None, ) -> dict[str, dict[str, Any]]: param_dict: dict[str, Any] = { @@ -1741,6 +1756,7 @@ def _validate_points_render_params( "norm": norm, "size": size, "table_name": table_name, + "table_layer": table_layer, "ds_reduction": ds_reduction, } param_dict = _type_check_params(param_dict, "points") @@ -1758,6 +1774,7 @@ def _validate_points_render_params( element_params[el]["color"] = param_dict["color"] element_params[el]["size"] = param_dict["size"] element_params[el]["alpha"] = param_dict["alpha"] + element_params[el]["table_layer"] = param_dict["table_layer"] element_params[el]["table_name"] = None element_params[el]["col_for_color"] = None @@ -1790,6 +1807,7 @@ def _validate_shape_render_params( norm: Normalize | None, scale: float | int, table_name: str | None, + table_layer: str | None, method: str | None, ds_reduction: str | None, ) -> dict[str, dict[str, Any]]: @@ -1808,6 +1826,7 @@ def _validate_shape_render_params( "norm": norm, "scale": scale, "table_name": table_name, + "table_layer": table_layer, "method": method, "ds_reduction": ds_reduction, } @@ -1828,6 +1847,7 @@ def _validate_shape_render_params( element_params[el]["cmap"] = param_dict["cmap"] element_params[el]["norm"] = param_dict["norm"] element_params[el]["scale"] = param_dict["scale"] + element_params[el]["table_layer"] = param_dict["table_layer"] element_params[el]["color"] = param_dict["color"] @@ -2169,12 +2189,23 @@ def _robust_get_value( value_to_plot: str | None, element_name: list[str] | str | None = None, table_name: str | None = None, + table_layer: str | None = None, ) -> pd.Series | None: """Locate the value to plot in the spatial data object.""" model = get_model(sdata[element_name]) if model == PointsModel and table_name is not None: - return get_values_point_table(sdata=sdata, origin=origin, table_name=table_name) - vals = get_values(value_key=value_to_plot, sdata=sdata, element_name=element_name, table_name=table_name) + # return get_values_point_table(sdata=sdata, origin=origin, table_name=table_name, table_layer=table_layer) + return get_values( + value_key=value_to_plot, + sdata=sdata, + element_name=element_name, + table_name=table_name, + table_layer=table_layer, + )[value_to_plot] + # TODO: this will only work with a spatialdata version that includes PR #818 + vals = get_values( + value_key=value_to_plot, sdata=sdata, element_name=element_name, table_name=table_name, table_layer=table_layer + ) return vals[value_to_plot] From 21b7564afcec946f3883f556f6191cd3e813a1dc Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 7 Jan 2025 20:40:37 +0000 Subject: [PATCH 2/9] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/spatialdata_plot/pl/basic.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/spatialdata_plot/pl/basic.py b/src/spatialdata_plot/pl/basic.py index c0697777..2e26b065 100644 --- a/src/spatialdata_plot/pl/basic.py +++ b/src/spatialdata_plot/pl/basic.py @@ -414,7 +414,7 @@ def render_points( size=size, table_name=table_name, table_layer=table_layer, - ds_reduction=kwargs.get("datashader_reduction", None), + ds_reduction=kwargs.get("datashader_reduction"), ) if method is not None: From 83e5ec8874928452c39a6ae1359e8e46ba904b24 Mon Sep 17 00:00:00 2001 From: Sonja Stockhaus Date: Mon, 13 Jan 2025 21:29:33 +0100 Subject: [PATCH 3/9] user warning when annotating points wuth a table + tests spatialdata version --- pyproject.toml | 3 ++- src/spatialdata_plot/pl/render.py | 11 ++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 6bada7e2..c495c8bd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -21,7 +21,8 @@ dynamic= [ license = {file = "LICENSE"} readme = "README.md" dependencies = [ - "spatialdata>=0.2.6", + "spatialdata @ git+https://github.com/scverse/spatialdata.git@c495854", + # "spatialdata>=0.2.6", "matplotlib", "scikit-learn", "scanpy", diff --git a/src/spatialdata_plot/pl/render.py b/src/spatialdata_plot/pl/render.py index dbb2ec37..a54f36e2 100644 --- a/src/spatialdata_plot/pl/render.py +++ b/src/spatialdata_plot/pl/render.py @@ -393,6 +393,16 @@ def _render_points( points = sdata.points[element] coords = ["x", "y"] + # TODO: warn if table_name not None and column not in points.columns + # inefficient to store annotations for points in Anndata, please add directly to parquet + if table_name is not None and col_for_color not in points.columns: + warnings.warn( + f"Annotating points with {col_for_color} which is stored in the table `{table_name}`. " + f"To improve performance, it is advisable to store point annotations directly in the .parquet file.", + UserWarning, + stacklevel=2, + ) + if col_for_color is None or ( table_name is not None and (col_for_color in sdata_filt[table_name].obs.columns or col_for_color in sdata_filt[table_name].var_names) @@ -426,7 +436,6 @@ def _render_points( table_name=table_name, table_layer=table_layer, ) - # TODO: merge necessary to ensure correct order? points_color_values = points.merge(points_color_values, how="left", left_index=True, right_index=True)[ col_for_color ] From c788d8bc65703c97f121321d5b4301fe6066d70a Mon Sep 17 00:00:00 2001 From: Sonja Stockhaus Date: Mon, 13 Jan 2025 21:54:52 +0100 Subject: [PATCH 4/9] add tests --- tests/pl/test_render_labels.py | 4 ++ tests/pl/test_render_points.py | 75 ++++++++++++++++++++++++++++++++++ tests/pl/test_render_shapes.py | 19 +++++++++ 3 files changed, 98 insertions(+) diff --git a/tests/pl/test_render_labels.py b/tests/pl/test_render_labels.py index 1e609f83..d7697bd7 100644 --- a/tests/pl/test_render_labels.py +++ b/tests/pl/test_render_labels.py @@ -233,3 +233,7 @@ def _make_tablemodel_with_categorical_labels(self, sdata_blobs, labels_name: str ) sdata_blobs["other_table"] = table sdata_blobs["other_table"].obs["category"] = sdata_blobs["other_table"].obs["category"].astype("category") + + def test_plot_can_annotate_labels_with_table_layer(self, sdata_blobs: SpatialData): + sdata_blobs["table"].layers["normalized"] = RNG.random(sdata_blobs["table"].X.shape) + sdata_blobs.pl.render_labels("blobs_labels", color="channel_0_sum", table_layer="normalized").pl.show() diff --git a/tests/pl/test_render_points.py b/tests/pl/test_render_points.py index f1ae56aa..3ddef2bb 100644 --- a/tests/pl/test_render_points.py +++ b/tests/pl/test_render_points.py @@ -224,3 +224,78 @@ def test_plot_datashader_can_transform_points(self, sdata_blobs: SpatialData): _set_transformations(sdata_blobs["blobs_points"], {"global": seq}) sdata_blobs.pl.render_points("blobs_points", method="datashader", color="black", size=5).pl.show() + + def test_plot_can_annotate_points_with_table_obs(self, sdata_blobs: SpatialData): + nrows, ncols = 200, 3 + feature_matrix = RNG.random((nrows, ncols)) + var_names = [f"feature{i}" for i in range(ncols)] + + obs_indices = sdata_blobs["blobs_points"].index + + obs = pd.DataFrame() + obs["instance_id"] = obs_indices + obs["region"] = "blobs_points" + obs["region"].astype("category") + obs["extra_feature"] = [1, 2] * 100 + + table = AnnData(X=feature_matrix, var=pd.DataFrame(index=var_names), obs=obs) + table = TableModel.parse(table, region="blobs_points", region_key="region", instance_key="instance_id") + sdata_blobs["points_table"] = table + + sdata_blobs.pl.render_points("blobs_points", color="extra_feature", size=10).pl.show() + + def test_plot_can_annotate_points_with_table_X(self, sdata_blobs: SpatialData): + nrows, ncols = 200, 3 + feature_matrix = RNG.random((nrows, ncols)) + var_names = [f"feature{i}" for i in range(ncols)] + + obs_indices = sdata_blobs["blobs_points"].index + + obs = pd.DataFrame() + obs["instance_id"] = obs_indices + obs["region"] = "blobs_points" + obs["region"].astype("category") + + table = AnnData(X=feature_matrix, var=pd.DataFrame(index=var_names), obs=obs) + table = TableModel.parse(table, region="blobs_points", region_key="region", instance_key="instance_id") + sdata_blobs["points_table"] = table + + sdata_blobs.pl.render_points("blobs_points", color="feature0", size=10).pl.show() + + def test_plot_can_annotate_points_with_table_and_groups(self, sdata_blobs: SpatialData): + nrows, ncols = 200, 3 + feature_matrix = RNG.random((nrows, ncols)) + var_names = [f"feature{i}" for i in range(ncols)] + + obs_indices = sdata_blobs["blobs_points"].index + + obs = pd.DataFrame() + obs["instance_id"] = obs_indices + obs["region"] = "blobs_points" + obs["region"].astype("category") + obs["extra_feature_cat"] = ["one", "two"] * 100 + + table = AnnData(X=feature_matrix, var=pd.DataFrame(index=var_names), obs=obs) + table = TableModel.parse(table, region="blobs_points", region_key="region", instance_key="instance_id") + sdata_blobs["points_table"] = table + + sdata_blobs.pl.render_points("blobs_points", color="extra_feature_cat", groups="two", size=10).pl.show() + + def test_plot_can_annotate_points_with_table_layer(self, sdata_blobs: SpatialData): + nrows, ncols = 200, 3 + feature_matrix = RNG.random((nrows, ncols)) + var_names = [f"feature{i}" for i in range(ncols)] + + obs_indices = sdata_blobs["blobs_points"].index + + obs = pd.DataFrame() + obs["instance_id"] = obs_indices + obs["region"] = "blobs_points" + obs["region"].astype("category") + + table = AnnData(X=feature_matrix, var=pd.DataFrame(index=var_names), obs=obs) + table = TableModel.parse(table, region="blobs_points", region_key="region", instance_key="instance_id") + sdata_blobs["points_table"] = table + sdata_blobs["points_table"].layers["normalized"] = RNG.random((nrows, ncols)) + + sdata_blobs.pl.render_points("blobs_points", color="feature0", size=10, table_layer="normalized").pl.show() diff --git a/tests/pl/test_render_shapes.py b/tests/pl/test_render_shapes.py index dcc24fac..7abb0783 100644 --- a/tests/pl/test_render_shapes.py +++ b/tests/pl/test_render_shapes.py @@ -455,3 +455,22 @@ def test_plot_can_do_non_matching_table(self, sdata_blobs: SpatialData): sdata_blobs["new_table"] = table_shapes sdata_blobs.pl.render_shapes("blobs_circles", color="instance_id").pl.show() + + def test_plot_can_annotate_shapes_with_table_layer(self, sdata_blobs: SpatialData): + nrows, ncols = 5, 3 + feature_matrix = RNG.random((nrows, ncols)) + var_names = [f"feature{i}" for i in range(ncols)] + + obs_indices = sdata_blobs["blobs_circles"].index + + obs = pd.DataFrame() + obs["instance_id"] = obs_indices + obs["region"] = "blobs_circles" + obs["region"].astype("category") + + table = AnnData(X=feature_matrix, var=pd.DataFrame(index=var_names), obs=obs) + table = TableModel.parse(table, region="blobs_circles", region_key="region", instance_key="instance_id") + sdata_blobs["circle_table"] = table + sdata_blobs["circle_table"].layers["normalized"] = RNG.random((nrows, ncols)) + + sdata_blobs.pl.render_shapes("blobs_circles", color="feature0", table_layer="normalized").pl.show() From 13c09ce262ecdedfb0e07a5763f78fd0b88c6e6e Mon Sep 17 00:00:00 2001 From: Sonja Stockhaus Date: Mon, 13 Jan 2025 22:05:19 +0100 Subject: [PATCH 5/9] add test images --- ...els_can_annotate_labels_with_table_layer.png | Bin 0 -> 31789 bytes .../Points_can_annotate_points_with_table_X.png | Bin 0 -> 31289 bytes ...an_annotate_points_with_table_and_groups.png | Bin 0 -> 17173 bytes ...nts_can_annotate_points_with_table_layer.png | Bin 0 -> 31269 bytes ...oints_can_annotate_points_with_table_obs.png | Bin 0 -> 29455 bytes ...pes_can_annotate_shapes_with_table_layer.png | Bin 0 -> 24346 bytes 6 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/_images/Labels_can_annotate_labels_with_table_layer.png create mode 100644 tests/_images/Points_can_annotate_points_with_table_X.png create mode 100644 tests/_images/Points_can_annotate_points_with_table_and_groups.png create mode 100644 tests/_images/Points_can_annotate_points_with_table_layer.png create mode 100644 tests/_images/Points_can_annotate_points_with_table_obs.png create mode 100644 tests/_images/Shapes_can_annotate_shapes_with_table_layer.png diff --git a/tests/_images/Labels_can_annotate_labels_with_table_layer.png b/tests/_images/Labels_can_annotate_labels_with_table_layer.png new file mode 100644 index 0000000000000000000000000000000000000000..ce2c179af60e0b8145be6f48c0a229d573bba81d GIT binary patch literal 31789 zcmYhC1yEdFw58!E!QCym6Ck)taBYHgaCdi?5F|JRclQn&+=Djm8Z5ZG`&{NtO+AXP zmTE5N9@*#YZ>=5v1tf!pOpFWz1A`_fE2#+4ZLN$c+|8U_tQ_n)S=m3ae)>pZ>FVm}BEZIG_y51a>fmg_mgubM z3|s}tQC7-y{eA)ulm`X?SuKbs;})gKEJ?LzwGK8+R-%>W(Cwg2EpYH2q_~;1YlCY zA*GdYRy;pa(_wRD@$Uv-pB&28j%)i=`Q4mpjn~e3lSxf;p@mCQ#mO#99-qR?(qMAFjvc;HGc%(^_H{=QaW1rau$kAU(Pw++Lj@2p$V|He-%CnLVq#$dFHrbA z&kP&Qa=yKIO-)TzYknNb;Em1C&j+o&zT9?N9L$vU_V#|VoS@hlN$Y8_Tk`daz?RF| zdu)ZpmMc9!{q~wc{&E(&?6sS|2>9V5;T=uQeFrF8K z^l98S_>VWo)GRC&1xHZwZ;Gm_*lcZQ|FN*JJZ%tk{!6#1%&V@(4C;arlaoWbU3S4B zA|k45Xt?iuYT!zR{++x%saIhVV?y^Q?x!EKEgt`AEielB~C6OEnEPucJWL z(ck(=68omS>6;Auma=(o5?*`Lo1;Y`4II%FnMn7t1?Idm?!-3RB=sR|GI)E53kj~es%w=4+e)|=0m+}YHHNg)m<0$ z_4Prvwzeg9yJK00s+IZqf#;i0xN7%f?SsR^`+q?g0$NPM;fazPY=!TEOMM5Gm~8Zh z``)dGW;Jx)uKKjkW$?Suk?`2=(V%Z{Z~LD25sYN=*Qza|k?=UaJl)51dYrC~4kpm2 z3Ai!AjE;^nL`<>gqM!8<7<^Gx-PpI1qamYwFG=N;044K@Qp(_|F&)I7tJE7tVQc&2 zGA*w`{4PGBKcIb)G!?OQY6tU7W{u;SZjM?&R8Noa}#rbz)CqDk@kg z1gtbvRDpMQo+s_M`swNE53O3*9 zJ)BbOdw&trIXpBZ5K{WnwaD(GnVEAUDaP43K(J}g|NZAj?uQ*gDV3Jy)uH({FURGE zAOly;zIr>o^k4r*^}sqhk+asvcRm-rMu|!DH<}{+w2>bK-94Qo*Qnn2LVNrBRdsZh z%zTuT(D?cJSLWV2YdD$Z@J^7Oy=JLN?z<%7XDbEaDqP!w)m8jlwpHBz$M8%;C~ew9l2Lm_Z=t(f9iRa>Au-&SAE7{Gktw|2BLF+0-gLrZf;%RJkPOv+0pfW zkfzquX#H2*Y)!6|PX&|Po7tt19p#M1YYP37JO*UmSfatY5!cw;xb*bD`=`GzwB=)- zYoHhV%^2RkAHPxPX^POXu~iLghEDHq?M)U?ChV2W8trbzi)Sz0N`-pDsB2|-?cRy_ z*Ln!+Fw1+Rk?koHA80S*V+0(Nn3Y}{iXnF0_nYS&4X>B{z-zy7vqHkl4~8}mN%HI;RxP!8~%`KoY7 z?0n2g;h_C-O{U}&jsafQg*Um0TEeIOmD*tNpWJCLKidG!$oD~!bLEFubmXdH@Ir4> z&&kQ@qkdZ|um~>S)-SO6h4w`fa9T|jzS!$mz5SbzAOjVPL&1_@oUWGx4t=4f@Q9rs z{Otc@+sSaa@tF3OLhR~{z-Xo+BT!wP`r~k8Z|Ks;$Ve40VpT7A z=jZ?nD#19x!;r25gK1glA{c51e@S4(AX+^AG_AUs#7Qr{zC+^KqG%x>7#%emP3L}I zL2X=6R~hL#aE?6?!18sxpn&1T<`g=>lZO|na7XyI(i9YbSue7X(LIu>7;7_5p53$N zaeBE|RL;btPy)J$yoT+vvbqZPouXaHL>CeEL0#{wIFzi06#k?O9Svnk2o?}Wv_(f~ zjTpb^-p%l%A+zJO9fcp){|A9^(9woFk)a0siWtg|>mkB5Ki^yMo7{mQXR%{ieV1KO z@k*D@xE0wqFUjh}wcq?c$@y#_QW_EHSbJM~uqE(Qj50X4xH+UAA=at5AsYg}CS5?5 zk{z{(f+AK0(dDE{q27g9HZ18uIQghD4=-eX=I||4-Flo2N{-8-Y+=hFcGdi4sw$5~ z;a^f8KlgsEY>JI)_?f={B0fC4vmdvAzV zlaZ@P#MGm39upI1Eyw--_B3Hq=H9K3EPB3zID9K6>6znEfnX-$*JRR*!+;hDWGhBq z%FTqxS+X##Fp;mbUT$iRsLa}OV|KLF)9%v#2vlMaQvmryx$+2W3kDMj(xmN?!OwuD zXxTXeTj^pgCI_%2Q`<;9J(9j)WA1my-(^CQ&C^NUsiI$e{`D&p$*UL<^-1|f=0F%e z-pxr;6+CY?Cf9{S<1Uz1ms{o?x+lj{DdmEF_(E=t)&CZ6zPPM)ftHlKg)c)bI60Yd z^a3j83`r07kbs`|1=UXX@AqqWl1YHUm9IB6*zx&3^^&O4!U?S7l$?T-RmaVVHTzkgy>NeW=kG_NXAEm=^7bT4?AY;9Fvhd`%Kb4hEKxdVr|B1d;t$ZqdQ2tfMirR{8hmXsdmKS_Zn1eHGUU2iO+wtZt_3MC0M2Ah1^jcoK(In$x(|iy=+=gwvA?ez8R}(5@b3FeX1Y1A!&fIwKJRR`$1!j}aW3_@~G5&MhtcCXtSwG1E&Li8Q+y zKB|h*ltPBOudw!fEd>PYzoaWrHDgk~qn&kYJ6puR$zp}#8xkZjla`fkSZWmwPxpmj z`a0z=(4GglGjEkQj$Q$W`1qea^Iv7#M~4RC)4F+aYxv*2)>_f?gcfvWOra1v*e@y6 zj&f^QMXq!aNYU$I$GYESvmBk)Eho!HS!`X74eAKIY7n6|8}d0hwkP1zgi+Sc0to&HY152K+W!p0gEzMuA` zqgoozD*jBDiOd*0vEaC6>c}dv7udgpL(8f~89FrH-0o3=S=T~HKb(S?NG96#0~b>c z0g@k&MFa)@T<*7|cYCLKNju9>Rh_u_kJ|cc&Eu}4mV>BiDdt`^5n*qkvs(wmGzy^G z^ajGBw!3O-wFHbK=EZ*(wWY>_@MN)&ut4B>c(aZCY^z#v+YZ?;vuNm|$Bh==4I+V) z|HU1Ou~G(OhDENS$?I4iMo#`>D%gx4jFc;^ZU~&E4P~^e^mt4Kaq%SAheT*5#<3CH zyywTFGtv1Sjfsslxm|oBU${sZkbL*Uko4mz5+em1Ddjt!5<>?$#^|pk24u`9SAV2* z6ctI5$5Lks?R$82Khijmtwe*Hb~h{u;+_`XIh$bnI_qPK-SVEX5ft4EH$v(eL|-FMQtdaq{Kb>_=6Bs{`DKS$W_s^(6vBMKZrXPmdEG2>@NCW zpu+rzR-(4K2`BSKMK(HeBR#I!6g9$0OBOiKpQodRE-j1TaH@Xt%W6?8fv`#;;N`RA zji(1e`BYW5;|06-aedof5yfJu@|l>@;+zyoGlz;JjCse3qrF>`(2AhVta^0r$Y0gL z+mJS+BSuEIL2g_oU|nS4K+jVu1o@p->#yZDRpZ0C+}!-?QK0D(GW;5AGsmfM(`D=L zKwsz1E(n$eiAjfNsa@n^BTp_@=edC7mTiJ78jKJFgKUEm<7TTI9${)~O{K=6RzrxU z*IT%vSAT!UIER<*=tG%WY*oJe?OkoxpRK&Im1Grg60_=WA#BWmp86!+lGo`LrHql6-_EOx9+)y1Cm$2^$Af2Z?Fm=BMnH(4 zjkIWOFg_HubqsE=Nl$ad&On}qI?@a`! zCtq%aAtnJoQAU=Kt5m}7=pP_9uTaeLWu1XJoD$*eq8&$M{iV8J%2;u%AHzMa(jj1p z>D(>f545|7_l3E884h&~r|m_>Wl8O{W{QLIhc}P1?QvIOgfTPVmUah&ZT*xx0${Ji zCK>(h#mT=mGtex zG~x14B$+o!bDtkO%{G&11ymZdshH}V($A%Q5etn-i4L%%ib$@S#Qz7wN}HJNlU z(N#f7joC+j$oolzmMZ-dMlc2A$3RPd6dN&Mv+x=Wl8Z#C)=^by@>XwHqcq8^|dq|y8E~rjH8)+W#)HoF(giS_Zt0- zYpj#oO?57=2Q!YYxCo|n)}gRcEN%YD?Szl}aSvZ@Vku>TLHjYHqDYn*agaaGGl?zd zuba=7!GMIV4mKM*D~BOt|1=jWf#{yYbUnRVZ=YZsqRQt1BG>c@JE$GOPesw5rJ|gyEjKpD?gOZ-=|}WsX?(+J~Bick-v{;humF<%z!p=E)c$zJ6xjvQ8~@z9dABt_FjI`}X}WeY+ewyUjB$3=z2 zEDmbvvYQf`XPr9mDskm$b;3ZM9Pz)kgE4-n7^cGf5Mrc(mFimS`NM8RXP+hXce|{$ zD-2ZPJRcR_hP83BJkkCib|)tfH&y})Mwvc1Ehl*xZ%~Vmt1CIeSew*cx}Po{n=D8L z{Jdd3L0U3NYyiu8LMia4gJ9GjF$(98FI)t%K-ZOcQj;Ufeo#IGzrk*25Cd|p3@VD% zIZViM@MlwcSJ7yVfuz0o?_$A&TXT_Xh4Uu=RmzWE8x(XDTbwsx3NAF{g?l4D!peu; z-iX6Sc6Ewpr3j^3*;hUy@^mYCpQQ3srdTk$zLOMDi6{F)h)puP7QKf*-@ExAsnkCP zv1wBf_P42yz?B?SWn$6^Enf&E9v5%D_IclpsZr_J@8g%N3nZSxfOpjGm68~`IL6(9 z4(&hah*xkhV2&&+eu>+Jd<~1oBmxyKiU#f1tmD&}U9~$er|f}~Cd=eR{$_LsPBydl zb|YtLX{w3^#!;l635y7)mEWEC)jfyLwV>bjZrVt4hedP@%e8gePHeT#3Lj%EQJ5b4BET`eq86V7Z%?q+V$7(Og2WyZgsVP99?=g^+RaZf^#XwmMIE7bYEeFSRR{B_wma`OghOwOV`Zx5ueAh%Rr7~GyUJPM zO0DbQNMoBIvEC*XBh}4~Bhg`4deEA~g?96ey z_DxjuadEsQQK!R~pRMDL%FN6xij+SdKs56sIijL478@VzHsZ#&Mku>(|C>(lYAEQ` zS;rGc9OL0S+j$XI*RA8LXe*1mD3-p-V%}|tGa*b$-D{Led65Q#ccKQmDc>EU=bWX5 z;U;DkRF}suoH^iQ+Vks+OZib3)uZWMtVyOT(MX1HeltZ6kHboB$4ofta(cV-{(=(6 zS^SB8b!QxSr(G_BzD=9JN$@OAo>%BYszfOIIe;V+($WS?RSH^IYVDSI-mp(9yNPDI zH}_kniy?f43EYrziSuv@+b#gCcCvj=jIIx6qlmd94y!t|^;+GVS1FXADo+0DenWW3%T@0*=KtBGk>c5}>{+`uZ_lhJUQ<;}a8m0TSSs%x17!bBcsR_cJ-U ze<+Dr&ster{6CN9bGOEEYM$lpZ)2TpCb=qz-z5-{<(c_C8#42UF2$A<d(q7hZH?(w1|T?DDb0(XldzwkMA;ab0=|HjJZB#rDBh#OS~?b+#kxk%9LEJyumvF z*T~7qtpgLLq@^X@Y&hBJemmuI)#vnD`?huMnU&n{3aj&Bwu(^Ln+w3`o0Br++Yg6T z7JU(TdP52X_*Y(W6K9T2&bmh*t9GyNVM`*0^Li(Ww{8F-l4f{5CmaLNf z!i%jEGpn|@(UzLrE(lXD5)7hLsx0vT^VaV?HFeBKSw#~eD#L`gb4{ZH|}wvOU1_1 zs(-#V?}(tWJu*)IV9m4o_qOvaF>lK?$`uDF3Au+OW@{Sk+wnO{wuX5 zTGf$Bw7CCF_G8P}gp z^xJssx2H|}cKWFhymucBI@(M|-sKh*g&a=nk)MI_-q$z8Ki8j>q@vlAQuM=Z3a^Fa z2O7iOwCc^;H`adZe7tTk0cpMi)%py^;=YfFB|TrHaQzfl6f}~Dr1=5e7Tu!CY*b*j zVz-Os0J2cuI9HULN3iLLT&e7!W4om8pByy1>pMl`U|}>nGvm5{B(5XVPz5?-u4?NR zzFqDyOVOLFu^Wu1eLC^zJZxyg#U!w7q_DQJ5wvr#wEVO0icLT;uQImpI<>H{Fo4ESlr}Rvhy481z?%;JbDRY0;gK@t} z{yG3`APb$}L_43h*_ux~9`At97K)z!v~&6mR2%htB97J@>5PO5{e3;I%$&5OVIICE zT6!RUMAYJ9UbyjY#Ms3B0+(6RiolU?g5)x7#z{$QCKicM*W7>~MFg@H?bn;;iuQ0P z&CM&SAODRWnlRsZwEktk*`c??oo%7PW-V@q7L$u&g68kAl@lAmM zG?BaW`xym)1Xe(l-IF73Eph#DMknS!G=s5Xu%yaCxO1yue&$Xu^qnssX;PXb2I z+^YW7?`WZh)vXW(#nRs1d=>(R$>ehi+}SaIxgY=b-zTpNQw|P}yKS~_gXLPank}x3 z3dtXhfZ+Ue9{X);(IV#<6CTj13SvcusAGl1fvqZmUU}zw-e4Ed;M$%phVAQ09mq?8 zv-B;VT6nDMc$NR4VJ5u1>Du;xKsGfpHezfb#Sb2BXA9%nch$`iG!Ae_ZIP)ue033C zTNo+MSJO@7Emvqt%pbCTOYmxEC(+zX5?=4E2}IMm)1o}bbxT%v;Ix_?DV0U;X_AtX zP|1V{1Cp3EfLT8Ph+Io1?IRBtMJg!xB zJTQ5zxDf!7?k;dE8*wsZ>lKZwRQ&vDB{}}-2xOkQYV8Q*zL)``PwN%dh--5;!OkUgi^;7G57)q#DNH$dWHKdcX<34}U@(@rDEA{O?+X%L~&bXdAwe=AuJ01$GzI+APkWON}BA+dKM!(xFG7k z8xN?L&bh2ypMvZO`68FAtTTz#=b$0MB+In`4b=acV}!a5{H;Rh~DX;=d{R0(K-qo{o*R6+liY z`!gOJCv)EvF5Eaha)-fLPcqRnF)Syyw9Cp*Hwrh>VL&bnnmcXeannIZ^TjfK$88}g z8VYjS4zpcuAIZbb{Ic2=pDU%}#*o}6rnwd}>zOzJ{I#m5M4V$SmL4W*;bS~cV-x+H z!g!9MiJ>0*V1UGANv`BG`6tjxUNG{*auo{(BUxSqvLdQu$7Qx`M9e?n6qc4EI&wLK zEEc?o2zk7gU@WR|HIfS?lZt+K+1SN}G5UZP25Dfs(qj0*p4)rlQ_dXj0U)ZQbuC*_ zr(%N@%^n;Cm))oa%NA-iY?u&blvtmc=NyrbJ;!AW$NZBL@83Xet`Y@&UNDRF^k4Jd zcb8(#y?#_m(v?I>J(K&X+|gD;u3R zwduQf*6C207i6==;;YRs`;3$?IHGX6a0q9c5s1Tw;r{&6O=+8HDfDOk$A{EeNA0ZW z1ukYLCM_%zB0N7LZ?L|qoMi!oDP`C66BTW?M(5vS=XT%<5^UN{8eiOFzUnNw>Slpx zMfqWaKxSJ%C4Znt(2iI-?n_lcm^fX2aCpmNpPq{JuK%t)uQu);(Tx*Kl#@`K^b(>g z`FAYdEk?D*Ln$8Ao_@W%+C`^5IZ++qu))ahq&m|SdO4>mEn@&`^9rkzrlE|6KxibT zFKWF~Y8+l)8Wz6@Yf(pZa~C)_2?-WN(oWjeu0ILzghd4QmEKxED=DUiw3;jC4w_p4 zRCoJ28fIiGR}koJIC0i;rGk3V3y>jF&7u)c-t3z4XZ)73aVol31Dff z1C%~T0@>4_w`mu6VyIsF5E*hf+ORWxGhzL`Xmn%q^Mxa>Lc}mN`LD_uA z9gTGlWs5MZ*8-7}p>%EPm#1zR4n4vl54+#Q^@Y@qOfY6nsyO*E2@ZVxnx z_E~|bO?pSb%hW4ZV1`;sS%R)2w&MwkUC_{cn@&GL$G~ncK(AU1E%+2iT{T&D2$~5^ znorZd`rJpXI@@MC*zPDFHlib9#o+_3CAD#6Lu0Dbq6E*WQlUBNM~5I%TDm4WHCPGG zHc*k~C-JHAz;j2{g$-AiriiQm8{=BCecB(k$m7Pc(^cB_tLZ+C=&=8gohd>yekcAt9?F zr;+S^ZoZjl57llQE)Q(`fsd$5_3!<=GLgQ5520#j>m3qNvSCo$L^dvmYW{bR<6p0| zDj_u?N>C6xCq1>Plwh!sCI|kUnAG{klt6Hj->$(S6&XQ3C4;r5f>RHCm5W#?G7FEO zK^EWk*DShUS@R9Y9j5-&-)e4M%WU3rM{|e9sLoqoI|Mxi!&|0LZ32SYf7n~4Wa*e* zDr&+FB17pOCOAs0Ny1BQ(b`K$#}G=s$uq41k@A!3 z?JcX=1OCiFx{SweYAXrYkMOr`$E~0ws$27bXP z3V6p4KrRyY?<$j=y4Y9+##C(95GY(29?PR%gUDYeYaVMKA~qt1k+H#x(rlFyVEf+K zoYNKH3z0VY&7n$t)7SxUA^b$MP?^N|JO~d6C;DA?0ymPw>X4THoJOXidE-hs3Ci0h_Q~3&;$nu|{J%gLj0m)dIJ<{J4cUwZ zT2`;&+;Wc?kwoSllxF9#N0LhpPcc1-`&1A|ZXgnJf6p&Whta~srqgeFfrTHG zeL9-@Pc_&i^7Hsic^xLceNl?CBm3EhdFd5 z-Mo=AY1O2Hj%9VyeBDDp27?DdVVmpkYX=l!PUnb;vI)n{C`o0pV3hXnaZF`VBsZ}0 z9>i|0{=2=tr;+}VKupqCc3J;nsR1vit8m_BbU=51=mHA@F;)k6@S6MwjJKxWKSTiY z&D3j#qw&@ns)J--=eh(mS8)J!5)Pa4U7y7-e&^qT-8fl20ihYux*}GDX^c*qBk(z4 z;iHVDHde=VO4D2&ADN1CpGXxf6lvzD5}fXVhRQ|6Z254~{lg55KhWkt=nFaeb06|< z)6h#<7B&u*AsBOp7jQQYeNdm}$#cW`Qq_?c;-PWcZ_Dw?!Wun6#%K2eQ@pz1j;nsO zLazfz(1w1{C4cKk8~$PDsHES3i$y+VA7@J6>!Fz;j(AUk@FpR{24Mz93&z%ZjU$!w z$mDG6RJhOigTvqz&s8OFl5RQ#R(2e#*Y}XbHq+Zk?*lK{N8L#bG8xTX?iqKA%o09) zkWuwCMSL0SB64edJDb426Gx0mQLni)3|H7VR}zj^?qGU{RvdM%C^>XM!ccZXoO5Ih zoNjw28*&p=C4ECN0~=#cEDX#t!a5CH5!)g01Sx;GiTG(kQ-22kL{LBuqq)KoueQ2H z>R3<-o(|Gd7Pl;4QJ4K{ErfJ_64FH=Ufpn(It+`yBqdqGFhWAPqSaxjVaA965zq-h zr{wzr1{q!RUuIh9>*FIGvxf@le#Rlrv1N7j z`CBo&URXERZX1+dT(fP8#LaTDtrzFox8quUGsEuPa&#n5%Guh>sgxxv)XC+QuI_A?B6aTDtdWre z*9&O7j@RXxKIvyxDvm_Cu=DY6F9{?LZE;suuHD_;Zwbe^=&O*s&n{P?&0M)rcQ8`w zsQC}{4?_;$9+&KI8-4Gcfp-y$w&ri9O29GuoiAD;{-A|!Onv6T)F6Gr@|%0iGh1P8TSKlljHSX<-2RVl5(Des;E?KQ;R%9i|aa!4M;_ws6Ro!2`oO?G)Vq(BoB6PbbozFs7 zY+j57kTG?6DtItj^yf8yjmfdza2!|$7M4Ei`iuMB92dYJn$NIy_1_zE1ss)&ZC;!(It{jY4GqZv zXssxS0`?a7B|G1T{gMUSytD%T)S5-V!_^U$EZdR zvVS#6Ip<^9K}Ssdkv&+!?OPOovg(Fc=H~xR+`BwIZehLnT_B!*5FVh;n7g>F5_KS5 z?MeQPtsS(mGK(W6CG}Ca>1S9N;>PA?GeBdktPgz35p(nMzQ5T`X@rG8Bn(PQOT&x4 z-jBDkFthw5ySo@>V<(PACEqFJ6F+eRcMf}nWWMbWQ^pRzG z0o;2AO!sW^=RFy~->0Ic1}CPds95407ZbOh%zl^dpl$5YAfF)mvccr&duT`LpdF6bB zbKLQ0fgP~B%7H*9mw+Y_9a>jTF5C#MR0n0FZ_9Gspm{-|h@8Yv-cg1HC5O4NyfQQ` z!uH!}F|~L{A4P#Y2BRBHWLK_T9|4dM_b`M%`BIT#VPXF^V?|HEV)|a&c=pZP_$j?` zg#oVlz^r+Xf^S&6xKM2bx4ypqhZkSc&dx670#uR!sC6;Uz%yXE27Q%neLt;#VhrdE z{lI7mynqxHO-EAMMFgw9M_>lNKF_;@viVQ1JGwtg`#VEFcC!@6*Z~N}<4_>8vT{2~ zNl=LFi^u!-Av$zX#?I!DwHPehEB6l~Y>dX+;XSZ+vHwY?jXZgdsAGRz@2Hpd{bbOX zn;Sr@knH-mc>Zv3bhN0tx*F=;*VmVroE#q)*YyTQ0Dm}8F#)vyY$K8lkdbDJKxcoA zVEe7>e*=&xA~I5|)t!Zrk@3SCU{Oacm|WO~c6yE!Jg=P$5k*V?{{8#O3mF>&fGSA$ zR+@^d*GJPE#&@y9bS6A^RR+a*PFK3%0kngM$YE8EFs`%*);$TX+_AqyoPr(yW&>9e zdASW;?kcDM9Si&f^f1;Fcgw?nH#^d7Yz{76B9|ka>KYoCT?pi7QwnV7K%v2Tg@fO( zB>`12n3Cy1kB-X^?net<5b!TT5ns=eQzbeaVAgMEd93bli=j5R04!fTB431=}`eoazt)X|I}h*fNKXdd@ZNUAq+$H`_z`7 zr$pBm(QuB$({LG88eJZ-NkI+{T|Mb?B!=zodW`K38t2!6m7qWOor{Mj9&j9=H&0w2 zvm9r|r=}9FetY%X8P6F9S~Ixza>LtTyV%|0cGxllcufA$i{2xV``=N%MQUJnROmFi z`=;dND66aEz7g!VN)Uw{$m)BODjI6Az;lUp0GKUfFYpY$=_zmNJ+UI1)asHe`ww8j0IhCR`@l$17s3GRc~k>^dkFY7`agS{k7thp zyV+1;KxSmG z8?X*eTAYZnj5^%DmqO&N73(xmP$i<1i@&=2ItM&lqS-YMLyI{1+%PB4zate@LYOoP z&Dn(+vmkTk?&_I9vfTW=`@lu)pRpXcvF>ba^4Zt_f$(z5B{e>kctT6Z%gak|c@OA+ zATa*6oXjUXe4FEHY$t!_<|^6O0NBanxrGdHPD7v;$S>LFtP4Rfn1&Ebe8RBaDYq_j zqYB}!ozmjW&=~=PYT5G4EB2SNkS}9hq)a!(ZFgg@BaFW7|l@ z1KejJz!+vYbNyP-x?i9t903hMEHQi*%&2L&a$q2DhdA4uXu`iYk?fN=zLigt%%+TOEPX-1_!szD??3Vh$p_6NbN7e=Xj>Z1$>-UN}e3b@E zl}wH+6IgBf)q>S<$HczA`9HDP&tdsrmzS4gYF4t}c=X$&#Wn{BD8PBkX`k=SR4I-q ze@Jq7H-V-7WQujwTb3^1p2KJ&Zv7jI5rrA3%tPK~@8MY7mK*``u39pyd1uaa-P}(H zd7@lE9vK5 zGtBWIZ!t@Jn)xGo^uy*(3 zaNlRw&%FFG-iHhlNrZ7-zk27xk;FFXm6Ua))k4Sb^SDp){%fu|hZU`y-QOzxWnYf@ z8F>Jv2q2km>+G4&O~%a)MM<@8C)+5YJm;R9J$8xU2c9X`KmA!!uv&e`1bM24{@Ffo zlj30xBL0N8&Is$cntngM7jyvs*|OohvG6qtWn%o7mTGtkK&rG@VoiVKe+}!|?>%rF z2Wp}qyVn>EQ&R`zzsl}LyqJDv$VT0+@r7Xqj>l%6?Tg^y+Gp|or9G6e{I6suckJtM z$KR~F2p$b3X-yu9?y0ajsONF$I3a&9T*gYRc$7I@P`pW-KxNezJUl5R+iWKwC%m}6 z+V~!b`xABm7@V=W`~Gbl*>WBP2j8YqhYi?&j>sZw&cUa;f?ZWXX)Ne#5gyjIxF(@j z!r3&zxlQ-)TCE!8D}%UaKLdHnA|Jo+cbB=EqsL*%(M^X@pH){NW` zC%ZLaWS#DU4#TDS4cWIDsdkQ&*~q+C=XSKQ!u^*XwG4aP{lRjV8rD6B_4t$y1|Yp4 zbKNKfv*BOF3m#kLYnN6qGu(Aww2ogEq6BdhH6CmYa8wiYBKUNsd;_Z>bCh)*a4d5R zV=i?a6PxE0fN|1m)6|vKTsA5Sh2BEESO$7QaPJfjEBG~dvbV68k`=jhYM8$1&3B0c z$#-5ESZ5Um*2bKJU<7_Hkt&SA5#oqpOXHp!lg93?up?`5ZuR<41t7WUdT8h48fWPk zSa8Jme?|U?C9DiYz@*f!xMknh|E|8HyG)}1q)wC}?=(>4PdTsS?H=QvUS0n-Max#a zG+2FS%anatiWlSshLfW0IIL+Ew}H_$>o63zj!>ABNvMsJ|K-Ezrjs?QzBHC#D!1S2 z$P1iN!UlT=h_l8z*f44>o+*hB)13q|2}j|n@_SOfHgSJL&EA=@-X>Pdj(EdW*n_Sd z5#Bf1?>VY=!{MNOoREbj3P?qLPPyP3G2HrH?z)39?!NfI=bKNJJ10YNCMAN|4l?UN znM0@>ZF7b`SXww7gLX11FYmUCAxt};a1wT7%`cuN)iWXaMT7FX#;7VmzL^!{P)Q=C z-t>{gdpR*&LwRT7>4fQ(#}DFrDu}DUn9mV`A>dtpq*1W{pr%5EOV(d*B;n#1Wz!F=uU+B1D{d*CMemu1&5~3T~5D(^w!Ev9N*D%)$!C356?{%B z_Q@>8uLkerg`6*R#mx2fWYr5pg85!6Wm118i(6If+BhxOi*&oKqw>(IOnT343qbNs z!f0o=%jV$XWP{?YIh4{f`^w0b}|Fu z-w%cxjHlf`EA%tIE0G_6^zCfVn=jMlXCVk${l=yQ@IN`iU{J}%6$M%H=Mon|({SLN zAroCZrG4@nFWyj|?l0z{`y)Iy;CAD+BYYfBQCr#2bL_iej|Do_=e{jCMvmdVX#hZO zYimRE8ITRg*or$cToVaQrbq}A;s@H+7kjlwK0KZiY=hBYQS28$((BDK<^Eyp&A1A;0U8M#Zg(a=|ODtWbha5`3c5SePh#i_(9*9f0)JN<0#ej zkyfV+EnfT$Knl|@;ds3e>W@ZL^tT3swK&{_#{F*a&?+jc?#QzFQc0j&J~M!kF^%7o zRlBG^Em=)in`-?*wjTeSGq)%52Kbaeb+FbEVD-mbOWI5 z8A(%X?3liF{cd`C(o%m$78my`9=Vg29DMK!UgU6Q2##+#`AAQ?V$L zXAIswaYg-TAaJa{f(Od_7@6XIER>2MWohH+Sv_YgM2OYlCIISEqY03^^B%Kpa1;ErXU4nAjs( z_}&|oaj0Bd)AaiU!I)fJ%{geGh)_vvAz6atLIX^36X!bzSG|M&%85m1DNPX`DvV^OA{UXPpOtfky4_F?F3#+E7n1D zm_X@BwNrx^37`?qRF{eUD+w63YQvUetJ6OAZMd&i;1>hh?fLaT6pLsoNXm#u{DcG| z!t5MQruAR3f_4_7&1!_y? zyNnEbcjk~fOmxzPiQojzQJtDd^RaqT$;}Lq64(Y7o;$OA;650^dA6fYj3&MkDCTm` z4@6svRdMP#&D@HZ;!*P0DKwfoAT;C)jt-h-F0IWuz>G!#Wamh85RWe?)rB?G`t`GU zuWt7>(udnX2~Di@porw>nFWxl3Cn@{tL^1YOedZ?e1=TEKMRA>jWh94(Fe2Ef|tY7 z!($5~g4^dm5wc+v?p8kDPe7J=$7UPjIW%@VxE6>K%1C zXVRPI{HY8JMqMYeIwD(;iU2w2M?%EhGg$@Q0okptUm*_v4XrntVR2oQsK9yTIeH%AjaexEv`7~c+S zC;Ntq_qZ(rPi&WXJvfhv)9E?;`^{*%l7(n+DuIz77KPw7h+vJ_qI$|d$x zEakoIm-z(bYoWR_L6u4~=WHawlTutt(el?=vKZR;D9$RT4p<2;%B^iTXRXe3)S z#;B^zD@rLzlyNPur|P&b&(C~5WzTf~tTyIZ*P4o_4tC04oT33SGbJ@YUWr9C^vJ#` zm;R%sb)12cO;LkC;~e5v=@Nb){*&UDz358b*GbXU8|q?QGo%pTohr??WK(uVf|^m* z2y-H%%!en^zaQf2PF_orkDfPTiiHs2{ep7+3W%hPA|g~Eo@#0mLk%4AMtN$8v^u+S z+s%G+E=YVY*S22T)}AAh>hPyd8y-aNNCZUfCuv>&#!nUbq_a=L-_dP<#1xaL9N6*< zQ`V^4%u~Pfj!A-9fc~(nj!3=j2>I@l3D47;q|cuCudiDpLHk<&^%g)QfspD(5BlmqX1!dH zpRw3-zP$v&cC=p+ETu;CEj|b>AN2nUQRPR!@1`(6zc@x8DABB)eZKW6V)1R9(b#NQFbDxVzqNChYl_$c&{6RB6wtb8m)b~i)&2x9!lF;tBEP!>m;+;Rn9 z0FiyJ{praPu|JUD*iGs76l7!2!H_2_%&@Afs}Tx3r5W4{AOXEJsv_EHj$O=Se?g)pHLbwZ){$v|h8*Wj|+)if#-d#q3Lp z`y6G3i5pAmfO=Mj+Bv^UMBAQK+LaZF^=(fan!S1u)#|XTb=v(Umf^iGhX}VrN|T9+ z=?fy6oCpc}f0N024xM-YM>ttJ>Mnj#0_F|%^oT4b%aoV;%o-X=kNI^Q%Fd9fZ(0x1;jT6| zW@g(|-d39J&j7V5n$;Q4kq2GMFX*{tV#cEa9hRbV>pWYxrohGR)iHL}(yS_R< zMc4tU1K#H|^M4@6NG~KbyX<2#*YFOcMk8)AE88s*w;1ndkBq*55c@GUhRp7F<^9uR zh0;Iz>tRw-lJYVwE$#4{Gsv56Zy~h?-2i8167re%w=0`xbH$|{DdH9w*2&M6DRM^( z^mx69vK`}5zH|0;Vjzb_^qsT0BSX98A%FB=%Lzkyl5A#XCcILHy6Pt?8XD?tvbdR2 zo_`;%Z{-(Mr{@&cH7ckJ^^dybF8X47*Vm&&3MrLF2nmf<_qgvjWs*=v% z<$##izjCpPN=u_b^p1~@Z-XSc0))pA*D;Vzz$O{W_2Elb_PtoTmynb+X~sDmB8yz_ z52D%k+1dU86!gDiWxkyd-yDM6V2mgF^nStty#lv=wGIC%%GDa6U zz3>Ik`Y^vWpZn*P)W_c^w~mpWD9^+(-qhD~Y&SO%y{<~)bD3@3E6{7b?GVgWHuI{G z8R_PoG}H#&m3VP3TeBAGP=VVG6O;FUfsx1s;myt2`h?(M9@QGHhqKO5O$Gu@I3eS4 zeGG}AcN{=o5Ui2ii-VyPE#+I^P@~9sZzGgpcDq?VMD7t1n%@@+3rkA2)LTA&L)5bUw&pWCvMz564~%r%=G1qC z|t4BV`>1b=*uMklW%5y_|Oz|;q-sy`Ma+Vt6nQ=%v975q;jNraD|>|NssvP1sffW ziyx=k`#i3Pj!bkB!%aycx^1vg`( zbQPx3=(pb9Hd9Uxw{1PdSxx1=`!zaQi$$~eJ`d0Pwb6VO+xH62&fKqBFI~g@EmOKc zc^_!KH;R@3of?T7jeZ@~@u3}~UNzultyo0UVZ7(qRziwMUT zLc7$|)B%9rIe?o0Vqr4yJze${l9(Tveql0EL%2DsBdPF+C2{_2M*97QB@cca=be%= zJaHo@z5**tV<$0=?xBpGzieC&qK73C?otqn>E+~hlQc&Vp3*Ie8kd5!~OS_m9%|xOx;;JkaVop61x`-Ny^oJAJ9*QRh z8{J)9uB2rlJbiSGjQQQ3h^YH#osx^)FwxCV^CCXAH8sQuJ;9wX*3@NgVeI};Q`v)G zN7{BEw?EYS{9(uuSLClzSS&W34Nq7f2rtjcZ*$qW$IlxGh`+80=Q0dqq5SlSH+A4^ zQRe1{oU9#fYo5lSW+{s)-5(4L3_;r)Tgt_*LlR|%BG#+^mp3=K!cZi9f zJ$okp?Ab&}6I|vOzZpdr;C?QVzXcDIP@(_zWn0ZI9NoWtd$TbXotwAH{)HjOigM=4 zmoB&mMUzG{#Kk4b>&b8Wdk$BJce~0nThEofbTc{-=bq*uJ-mB}vcgOG4dFI3W_ri> z_R6E-Qel7jZ?*m>tX@vr4I8D(GX`E;kFS6%b^uQf?5464d`5_aP*t1jSa~^XNVs6f z(AENtoBb!48&@rH2f689OPMWur~*OJn|l(;9;4ig@qtdBp9L|fwJHxV@`vgfXImH^ z(c&kFwXk_Z=gV4GhtIc#EVVNA_WQ(9cj!sjAqr5$j|}=vVuYoE;R9>E$=+h8VhVRb z_U!)_=DpMLY&u@!>(iLoOnwGjMKVb7wcYVHugXty()uM8}bL-kS?pZMt^#A@Iyrs>Yu` z8eS=g?1bVWqjv*?+MX|sk0P4wUVio~tdDsO;aRlXA@!CrV{7aw*i>U%BhmZQ2Axad z#RHl=moFPP!lMHLK(TQ`*}WEEuMmh%eN%8KZ8?Nh_Y_>y_4mY^Izx}_3{C0!|3j$Z ze*DcRuDDzH(%hj*%4Bs2FPY#g7~eb!jyNW2@=+=YWk5mXNGD#<@b1+UWfI1C@-b!T#5X48Qzc@P#0UWWe&_ty;kVu$<*Mj&MOC7oQ)TRSvbQGw z{K4}XCVTy}jtF70V>6}QhEmw(@7=Fl2CZ)19A3;cBmJv;Ya(lxuP$pX9t22zc3u#E zLa6h!uI!IWKaLz$>7!sgqKWbSL`uPO{&aocmrA4dAIcBY{Eh}|iYw7|C?2o#(g|#Ss$`T5!Y!~jK-?pz>7ka*8PH3@4#@q#Qvc{??mFPRF z7F&YogHN8oEBLXrCWJO@5G}-g^-!R+(TaedHvYVMg)EUGNh*XV427EeP=L~N?#pUP zSn?Y^VJr7mLkYk8!A5RYq&S)rqlzz6x=KeXH`!Rs^c)GW9Gx()1%3?wtl$(8bWPJK zvM3!NMBgt(WNJB)ARu=d+1|`(w@)AyU|ip$)z-2X@>1M>)1Ke8F(|ExC`wwm-H}jk zD5~3r8H`q{8*l>jdg89KpSP%#LdYJeco|@Fu;S};}G{7JKW;zn_`<% zXspkvc`o+ibirwGGWwrM^e+}tQkGOrC6AR%RIEt7`g$8}PEf^++#906$`C)5Dyr~N zQq;T2J1cxM!&vbh>1`iS%$!` zPLvNdoe^_=8k4>f8_R^I!I~4YBdn}Snxc(mM2<3a=eF0SAX_=vHAW3{9sFI))a5I$ zty4(;y0&K;t!UC4xECySl!n_*u4C(Z)nHwu;K2=PFG=mk%VRh>9WsqR#TQYMKd;w~ zp5*N_N3?a!Qa{Y#u>KN>j&zHOiK_lH-8@1^;RJJB+*62G*q*iKed#uOvs}#2m~9$Z z+>VLr-v#$9*zd1xXU}?!N!A+nOE*WCYxiuj3T)V^&6#@-($i5r(X_#akkygqM48za z3~HrD?(O#q{z#qzXOtQm9AT-A-WQ--n2q7s2(13JcK>F#}X(>~I;?OD_jj z29yH^?EY#h;g8QXIA6RtZzP>tjMUN!SRAQ0L1V}4;ppg)I@Eu<$N|E|l*fYP*Wzw%7R_$9i=U;HLzjPj_H}k1Vz@r-UQ%oV!qZye&^2BSXVQX$QM*0Ps|dK zWpHf-8k9M9Uc`C-jj-kOe&}@UEAfR(AjV^r0v%7PtJE`ubt4UW0xN^0&`v zrY|nplS-|g>Ta}#LPRO{M{UCw;)8)!YeC21lOYz1#iyP&5N~3?R^~GfK!)zh> zxK=2@vnfawd(bl^OUE{HBt%e(XUDUDZ$jCm>ziWC%_piFc4_>fmdR$H5k46uN%u$( z;kk+=@ZfS?q2tP2 z@5KWWmdCVE?o<7`2ekxvuO&TcuFLHU`)FQpkR}PcCOPXLi8a3V_FL@m@1jK!@4XQh zw2Bhz%97L7%~he3Vw+|wG9>uQ=EnVp{gS3tsLcl5%TD{UiqZQXcijwWf`2)i**=M0 zR@qp3(ZPHK2vBxfl>jD0s8DNxy0 zQBK@LbQNa>EGVq+^%P6z(BCZif=*jl=-6FXez!4Pk`?X&Mm?l){T&b5FW6{EMrLiy z4oGC&m)_xU|L{n{ogQ)~iT_DSBt^~38Zc9q_GNQ#O89-{G^LG@J?Dq*=8hzcXNy@k zT$>b76O_9*KPDTnqPaxkIU36$Lylye=jSgXR_>W-S8s~JX*Lr`jdOZkF%b}CqcGDT zRX};^EX=v&T4A4t$0P;I2QcDQ~lIn z&g**@ygy=Y`hl?aBqt}YRhHvb8mOdoiaVOp8Hav12%`nCCB;X~?_d51Nfcf39hIcw zX*meAdZ@0da}^QS+alOiXtfx{>gd&4@#%B}(* zpHxpxs`A+)lozN5+BjETW`$m2pOxvW<)3MpG6nzYyJSSFb8NcqmWa+2j>(RplbgX! zWEU0H_IGRmJ9lQ7|zPf>U~ z{F2OEPSLgXcG;ynU^LKKm}!Q{#oDw$BHHjBDe7?>>64@N?fMf!#FY&3;|^XBGTf~xXL z%`b;<@K8QvaFZ3%e&EO|YY6SH(vsyeLARs3w0$|FgeDwZj|5XK6T+kFCZo%dV~9ON zzgI$ClWEwp#^b%$VydvEI`1V`<&~)5Tt{JHR$=UW(xKQxzF_}qmJ@sXodN}E$rrTk zb#B9Eh!?;sVsKuN= zIlqdDCRf8{i@xF?RtkyXI8L1uVFgd32+5Gtdh>mIwtJ7?mfg&(NggSbpD_?p%7eCHPt3Jj3#%+B=1_lY|?bU#x2GF=#fnOe~iuhy8MP zc&8FWF33btIrU4E5;i3z@4PkYQ=P`iHroP1Lj&6cG-3*w6eGwx>sA-;YBZ~a&^`S- zeap(S#xbkEx;!b8-?b*9h~ba>Txfu#hY4-jroEETMF`~I+W;~R+8V%)Kx({RJ)DEO zbuxgHjg5^FiDw8CF4{Xc5C8N&P})C0aE%ekLExdF7M?1Ky9hYN- z;-linZWuhU7ZC9zddWNFtU^&%nm1;5VhfF@w(rZpS`mKtPT$FpgoFg4JP|-Z4AJO* z81vHR-5S&ogi3Api2KXdx%gm0q zA0Ar~*L)3E%`v;}Sl^^H>2ZB%VZ+~g&*EOV_jKp)?2$)j8j@K}7$F84^NMhaWL7Qh zTFr+K=PFxCpvVl?TZAX_@;n<8vUgmrizJH0;&b|gjcBwZxF3l-z6YuE2%tGaM$~w& z--+Nq_+3u;A$*W$1_nP>w-E{$aF>50ItCExM960dcFM~2)%-R2H#G;+e2J&dbw4b) zK06n-UA*izcI6mN#|u1B@#~r*J_#J-=eB5#_y%W^aA^_d*DFFZ5v$t#Z5BBTaQMnf zyB5S4+V~=IY1vN9ePprd>JU1W7I2Oc;N|@}$nVxIgp#wTwyt?VG<$_k3}TPz0o2o@i6A3BC^ zc31JxK9hTz#wIRP&oLe~Xu2*KscbF8lA~MNRqst`%uH&!-zpkdP(5d{Cg8n?h-7AeTu4kJfu4qLA0qqMN3wT<#(a|bCYAn|mFEYDNXH95X>2Mv4OG^eq&H|;Ekc6cB zgIG}AelN@EdQq8YF>U_djqA(#>o*WWh4X(Wap}>2*#P2mQ?E`<=Whv+4ZTNMp7VWm z%Z=U1cSqIiTqraPkIHy)wY=SKtWr=nIS_246>NNeeJ3;L9d345Qmp)wF ze#z*h6cQRMKU8JB zeq7&OlnnPp%rs?2V48DQS`3*3uvpJ!OhbQNZ~unl`i}>Q3v3tG9~UNPAD&TY}r?t9d;Iif9<+(D$S=5+>05RB1RYbQE5)!_q+HY}VJboNR zYezdGbSpP3Bsi6a!hA_!$dInE(EjLXiBwo%j&&n@YPgrB`#N00Nti^iAh(~+HoV-yXvO%Ve?F?M^7P9?AzonfXVUEH~@MA-r;zGBs{Njb4tf^_f;7P zTa$cH8GP)UrLX`0OrhqF5@C)Pe;uHrB~UYvDVhmYr*eRb+oArBcQZ~G@*pT0>xFcz zBAlzBpaM{z*gsbxkrROLZSC!HDk?jip{lB?V!&1JPLerqB}v?{vgw##b>Waq>N;Vf zLdx#S`{)_>$aFu-Mmok#MF=UHhsbNIWgP^Z;yI5T&{#Nz@y!>r+hAKM76zy-L7Li$ zPdFr;7FwF$!_ljh{w52$*#W%!p-vT)G%&yzSfbhp2@7*0z(r~{7y@P%zt^!%tqYq6 zGAXYe#l}S0&Y?Ec1CU~bkM9;eFGDi|JlDmB;dK_gKiS(6cUWNN0C3apS*q>Ago#~f zg}DiI!CxaPYNVud-8uW{5!R;m9a~KDJG}0uRUvUEb0?SLGj-jE$=j@VVLpK7i(Q;s z4dSp=D~IkLPCeCGqp%F^?A)7kFp-@6e%sTLh40aSIB~GK%>6SkFpw=>quD^k z&aQNZ&|}k85aPOP6`=mx7fg;k+`Lv#=y zTDdsUju+py$Ikp~3?`NhFAZQB?zsY`((|KV?R;*iKdy1W3`L)`Vhv~zrY=qu=yn7WPsjcyGlWOtx z?3=NlfNhJeUyv`5B%O0HsQMpqA&XD-9JYQ*(3Inf5eJGx;*L z>1pi>Q%peH>=oh^TGLH)M#_$IZ)QcL^%GIYT0-K-yVmJ?eq%wm=S#mHZ1-I0?Qi+Ae7 zUCgcH_RD_UmDz;j_X{4=z!%OQNS`+x)TLvF?z1q)ZKcLI{C@i2$i|#H(^&CfzY4pfWZeycq6JOAWKHnd>Q3mMWV# z-MmXbaEH(H+wLDsPYoHnU<*QIJ;2L{R|G6H6uz|nSXG$OPd6bxC@UTrfjCtZPmG1^rQldW{tSnAZFO~izVk@ zbs;1&iZ>YEydlrU#CDdXf=Nbgs@0swYx&jAu%s~G4lwLtJhCvJgP1>JvIF#=G|LPI zVAhKpP-dtQE(vrf1bSKZ8;CAZ6aHZU!B`FGJ|R52X0MY9mkrGtySd&BVXp?^_Ykk5 zj>-Ca?NWE}ZLI|>1cM`vIP{x(jaZbMNHLu5<0ZQP45WaiGiu7_&wE|F1&E?-r~`9r z(b;zi6VedB4%ceVFW|PitjW1`hJVrT0B} z3myb?;VVpqy^DR)_~dKt*q-qUWWe5_OGNT)j+Wyu_?^pmsIN6L6da970}AESw7+(j z-MNs|Y&ZQLC&U!7HzmRMe5PZNmL93fIbrJirwL;Ya&6961ehEPj+?ZTm?N_*!Z7KC zfIS#*v-tKKI_a-K2&NV02t6fqk_(TK{%Gq^fEUQZXqt`OX*R}PJuNV%5FTUxeS(bz zh&KTQ;sF8xM!zASW%cwM>N6toI*NkHdpV3<752Rtp&c@A_yJhggH(%s*x>|n^N1G} z8$=mwl?D5Dxy&uK{7*Sr7aJ3`)07ksw?*hbiwr?UHL9RO87Z;9s}Fjx z?**=RPpz_Q3bKsv;K<%6_{L5cULN<1kIh3|Mhq(DH+nz6R>u}V(abN|Y4iD@rf%L5 zbFdM49C^uTFK}78%fZx(<^K+F2VqHs+{$LPz#b`m|(>ol-_;o;DH@p*c8jL`DPA@WE|F zmI7*ho7#h7!G(9^eOX)%9vAMd&F&$1mX=i7_dr;h`lN{1+p;H!MFe#Si_3_bG7-xC zA|;NKuM?SFIwMXG*BvdR9wgdo*L3OngIA>^j8#uSVzp2hUN5O-8Y|QDMf&Glynpud zquCUZOpNApj^yc1+Mh&A=b`#fr=YXlY`euIC6;Oe%A{O@lItYvKLHyn%EZ6?x^*Qx(Hu86*hct|s zuK#)SyhG>y7|n^+I#|BMZ!4hg;4P}XBPFJ)-j>xrdt8ay!Qf1V^!&~pQHxxcNHJC8 zG<&Xz2GufJUX4(NL_L9TrSTn%>hA#aeeDx=X-N6i*v%OpVw7GIzU`W3(7YN7Wi##$ z!U5Dy&j$$yRY{O9w}UBYSfxd46*+$m|0fbhXFy94_|9+UiGoR_LgjmA`9U>(0}}uD z9${i2SxJe#2J7QYcC97eJzQEAC#$bffAMjrjC=uekwbkG(5@j}MJ`^=l2#7yfSaO=CKYyYS;VNOqcM~h zm_Q-wm64}O&Vf(NnXs6|FA!;;5P-pdAiu~GsKV$8*G>mZ3YpGigXb$h-u5y?yH6au zmLV#C%)EQs{>8`!2ifuxZGBaoihl=-4q0&(k1jm@A-CIb8}X2xHIl{$DB^)=8tgnR z-_%B6*G4zTOVC3f4r{IfK9#NU(`VSZj4ZQ-yhrOCBFW`H)<3Hnmsl7c$vGEBlLmzm z7Vu{8FnBje5)cH(qQU~Tcn6eA+pl*;+}F4g(MJZ18PIUU_txuJZ;$S^PA4k*y`JV;rum=@^+BgaKFNy)ToWns2Y*V=un11*Je&f;;gWy#XLe4Ye+ zktD%N=-w~evhCdt`>Z2yZsbPXA)`3or&`LK z!c(W>=>6y|m+`q(A})^i4?4mI#LA@q{&p8=?saj~|0>w38&o|uo=u;{#GGwznvk5h zxK|EO*g};>GJAEgYD(`mMf?IE1XVmb&3NJW!Rki-cvN1s6#e%H#OjZ$G}p1H`9_<< z7V}D~1Oy-X3cnKU@tBd5C#y}s=Lk9c{2+1GhXK;^)WL7mT>NsUd@E*l(sfu?Qd@Is z%mmjsL}~hC|0FCiJ84^|aY#|qG3Z~#0c7J(xHzl*zY$Aq{`te{<*yh20 zP@0{{j^pVg7A(?xf<&YA$3`dcb6S?)%Pw_cQ95q7)JdHrcL`6zN$$}8^KqiHrc)Hl z5fYJ3Ili`K3S7lmaoI;3-&v%ewKKZ=eaEYK5_o+J4G~mxZdzr#0CsSpT76a)4df0H z&r^GQd$XX8fWz-HHJ|eMWfHsb4agb5zGr`C{)*@R3N^Qw(#A0rga^`eSj=#CXoD@Z zPa4`Sc{t5}TKZlby8Ydjm~cEjB20EVAo4xiq@4Y`#3Cmjb0RMUCNyulQ;~9Z^SjZ3 zkL8vQ_wNS>?T213+g!46PanIzM)x1k7W3KQQ63XgO0X3b$J&;?sVPI-O~zB#RJ!Bd z{=ACM8!wB|nK(-U>$mvT*+eVEoW4c3w!?Pp%1>XP5-QL1^z

`b&f?EYvEcrKC_{ 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 C{NcF( literal 0 HcmV?d00001 diff --git a/tests/_images/Points_can_annotate_points_with_table_X.png b/tests/_images/Points_can_annotate_points_with_table_X.png new file mode 100644 index 0000000000000000000000000000000000000000..bad4e3e62c1b1269e4f5f6baea85fb3c056675ac GIT binary patch literal 31289 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 Ih2H!B1&VxWDgXcg literal 0 HcmV?d00001 diff --git a/tests/_images/Points_can_annotate_points_with_table_and_groups.png b/tests/_images/Points_can_annotate_points_with_table_and_groups.png new file mode 100644 index 0000000000000000000000000000000000000000..4941bfd28b3a6d625909de01856e2d29479283a4 GIT binary patch literal 17173 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 myH*=qNtg> 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 literal 0 HcmV?d00001 diff --git a/tests/_images/Points_can_annotate_points_with_table_obs.png b/tests/_images/Points_can_annotate_points_with_table_obs.png new file mode 100644 index 0000000000000000000000000000000000000000..8002e8f9ba09ac9193f73ba87a2032f61a03d279 GIT binary patch literal 29455 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 Date: Tue, 14 Jan 2025 20:41:34 +0100 Subject: [PATCH 6/9] delete get_values_point_table and comments --- src/spatialdata_plot/pl/render.py | 2 -- src/spatialdata_plot/pl/utils.py | 46 +++++++++---------------------- 2 files changed, 13 insertions(+), 35 deletions(-) diff --git a/src/spatialdata_plot/pl/render.py b/src/spatialdata_plot/pl/render.py index c80b8b71..5bafe7a8 100644 --- a/src/spatialdata_plot/pl/render.py +++ b/src/spatialdata_plot/pl/render.py @@ -412,8 +412,6 @@ def _render_points( points = sdata.points[element] coords = ["x", "y"] - # TODO: warn if table_name not None and column not in points.columns - # inefficient to store annotations for points in Anndata, please add directly to parquet if table_name is not None and col_for_color not in points.columns: warnings.warn( f"Annotating points with {col_for_color} which is stored in the table `{table_name}`. " diff --git a/src/spatialdata_plot/pl/utils.py b/src/spatialdata_plot/pl/utils.py index 7099783e..1f4745df 100644 --- a/src/spatialdata_plot/pl/utils.py +++ b/src/spatialdata_plot/pl/utils.py @@ -58,7 +58,7 @@ from spatialdata import SpatialData, get_element_annotators, get_extent, get_values, rasterize from spatialdata._core.query.relational_query import _locate_value, _ValueOrigin from spatialdata._types import ArrayLike -from spatialdata.models import Image2DModel, Labels2DModel, PointsModel, SpatialElement, get_model +from spatialdata.models import Image2DModel, Labels2DModel, SpatialElement # from spatialdata.transformations.transformations import Scale from spatialdata.transformations import Affine, Identity, MapAxis, Scale, Translation @@ -703,23 +703,6 @@ def _get_colors_for_categorical_obs( return palette[:len_cat] # type: ignore[return-value] -# TODO consider move to relational query in spatialdata -def get_values_point_table( # TODO: remove??? - sdata: SpatialData, origin: _ValueOrigin, table_name: str, table_layer: str | None -) -> pd.Series: - """Get a particular column stored in _ValueOrigin from the table in the spatialdata object.""" - table = sdata[table_name] - if origin.origin == "obs": - return table.obs[origin.value_key] - if origin.origin == "var": - if table_layer is None: - return table[:, table.var_names.isin([origin.value_key])].X.copy() - if table_layer not in table.layers: - raise ValueError(f"Layer `{table_layer}` not found in table {table_name}.") - return table[:, table.var_names.isin([origin.value_key])].layers[table_layer].copy() - raise ValueError(f"Color column `{origin.value_key}` not found in table {table_name}") - - def _set_color_source_vec( sdata: sd.SpatialData, element: SpatialElement | None, @@ -1713,7 +1696,6 @@ def _validate_label_render_params( element_params[el]["na_color"] = param_dict["na_color"] element_params[el]["cmap"] = param_dict["cmap"] element_params[el]["norm"] = param_dict["norm"] - # element_params[el]["color"] = param_dict["color"] # TODO: remove? element_params[el]["fill_alpha"] = param_dict["fill_alpha"] element_params[el]["scale"] = param_dict["scale"] element_params[el]["outline_alpha"] = param_dict["outline_alpha"] @@ -2205,7 +2187,7 @@ def _datshader_get_how_kw_for_spread( return reduction_to_how_map[reduction] -def _robust_get_value( +def _robust_get_value( # TODO: remove this method? sdata: sd.SpatialData, origin: _ValueOrigin, value_to_plot: str | None, @@ -2214,21 +2196,19 @@ def _robust_get_value( table_layer: str | None = None, ) -> pd.Series | None: """Locate the value to plot in the spatial data object.""" - model = get_model(sdata[element_name]) - if model == PointsModel and table_name is not None: - # return get_values_point_table(sdata=sdata, origin=origin, table_name=table_name, table_layer=table_layer) - return get_values( - value_key=value_to_plot, - sdata=sdata, - element_name=element_name, - table_name=table_name, - table_layer=table_layer, - )[value_to_plot] + # model = get_model(sdata[element_name]) + # if model == PointsModel and table_name is not None: + # return get_values( + # value_key=value_to_plot, + # sdata=sdata, + # element_name=element_name, + # table_name=table_name, + # table_layer=table_layer, + # )[value_to_plot] # TODO: this will only work with a spatialdata version that includes PR #818 - vals = get_values( + return get_values( value_key=value_to_plot, sdata=sdata, element_name=element_name, table_name=table_name, table_layer=table_layer - ) - return vals[value_to_plot] + )[value_to_plot] def _prepare_transformation( From dfcacf1d017c88086f82596911e7a91ae95515d3 Mon Sep 17 00:00:00 2001 From: Sonja Stockhaus Date: Wed, 15 Jan 2025 21:28:30 +0100 Subject: [PATCH 7/9] remove _robust_get_value() --- src/spatialdata_plot/pl/utils.py | 33 ++++---------------------------- 1 file changed, 4 insertions(+), 29 deletions(-) diff --git a/src/spatialdata_plot/pl/utils.py b/src/spatialdata_plot/pl/utils.py index 1f4745df..a86d848d 100644 --- a/src/spatialdata_plot/pl/utils.py +++ b/src/spatialdata_plot/pl/utils.py @@ -56,7 +56,7 @@ from skimage.segmentation import find_boundaries from skimage.util import map_array from spatialdata import SpatialData, get_element_annotators, get_extent, get_values, rasterize -from spatialdata._core.query.relational_query import _locate_value, _ValueOrigin +from spatialdata._core.query.relational_query import _locate_value from spatialdata._types import ArrayLike from spatialdata.models import Image2DModel, Labels2DModel, SpatialElement @@ -728,14 +728,13 @@ def _set_color_source_vec( ) if len(origins) == 1: - color_source_vector = _robust_get_value( + color_source_vector = get_values( + value_key=value_to_plot, sdata=sdata, - origin=origins[0], - value_to_plot=value_to_plot, element_name=element_name, table_name=table_name, table_layer=table_layer, - ) + )[value_to_plot] # numerical case, return early # TODO temporary split until refactor is complete @@ -2187,30 +2186,6 @@ def _datshader_get_how_kw_for_spread( return reduction_to_how_map[reduction] -def _robust_get_value( # TODO: remove this method? - sdata: sd.SpatialData, - origin: _ValueOrigin, - value_to_plot: str | None, - element_name: list[str] | str | None = None, - table_name: str | None = None, - table_layer: str | None = None, -) -> pd.Series | None: - """Locate the value to plot in the spatial data object.""" - # model = get_model(sdata[element_name]) - # if model == PointsModel and table_name is not None: - # return get_values( - # value_key=value_to_plot, - # sdata=sdata, - # element_name=element_name, - # table_name=table_name, - # table_layer=table_layer, - # )[value_to_plot] - # TODO: this will only work with a spatialdata version that includes PR #818 - return get_values( - value_key=value_to_plot, sdata=sdata, element_name=element_name, table_name=table_name, table_layer=table_layer - )[value_to_plot] - - def _prepare_transformation( element: DataArray | GeoDataFrame | dask.dataframe.core.DataFrame, coordinate_system: str, ax: Axes | None = None ) -> tuple[matplotlib.transforms.Affine2D, matplotlib.transforms.CompositeGenericTransform | None]: From 39d68af20b0ce6b89b5211f33dc3d0c3c7580a1e Mon Sep 17 00:00:00 2001 From: Tim Treis Date: Mon, 20 Jan 2025 11:32:54 -0500 Subject: [PATCH 8/9] Added validation function for anndata table/layer names --- src/spatialdata_plot/pl/basic.py | 5 ++-- src/spatialdata_plot/pl/utils.py | 50 ++++++++++++++++++++++++++++---- 2 files changed, 47 insertions(+), 8 deletions(-) diff --git a/src/spatialdata_plot/pl/basic.py b/src/spatialdata_plot/pl/basic.py index 2e26b065..e9dd630d 100644 --- a/src/spatialdata_plot/pl/basic.py +++ b/src/spatialdata_plot/pl/basic.py @@ -640,8 +640,8 @@ def render_labels( table_name: str | None Name of the table containing the color columns. table_layer: str | None - Layer of the table to use for coloring if `color` is in :attr:`sdata.table.var_names`. If None, the data in - :attr:`sdata.table.X` is used for coloring. + Layer of the AnnData table to use for coloring if `color` is in :attr:`sdata.table.var_names`. If None, + :attr:`sdata.table.X` of the default table is used for coloring. kwargs Additional arguments to be passed to cmap and norm. @@ -829,7 +829,6 @@ def show( ax_x_min, ax_x_max = ax.get_xlim() ax_y_max, ax_y_min = ax.get_ylim() # (0, 0) is top-left - # handle coordinate system coordinate_systems = sdata.coordinate_systems if coordinate_systems is None else coordinate_systems if isinstance(coordinate_systems, str): coordinate_systems = [coordinate_systems] diff --git a/src/spatialdata_plot/pl/utils.py b/src/spatialdata_plot/pl/utils.py index a86d848d..03941dd8 100644 --- a/src/spatialdata_plot/pl/utils.py +++ b/src/spatialdata_plot/pl/utils.py @@ -1600,13 +1600,13 @@ def _type_check_params(param_dict: dict[str, Any], element_type: str) -> dict[st raise ValueError("Parameter 'na_color' must be color-like.") if (norm := param_dict.get("norm")) is not None: - if element_type in ["images", "labels"] and not isinstance(norm, Normalize): + if element_type in {"images", "labels"} and not isinstance(norm, Normalize): raise TypeError("Parameter 'norm' must be of type Normalize.") if element_type in ["shapes", "points"] and not isinstance(norm, bool | Normalize): raise TypeError("Parameter 'norm' must be a boolean or a mpl.Normalize.") if (scale := param_dict.get("scale")) is not None: - if element_type in ["images", "labels"] and not isinstance(scale, str): + if element_type in {"images", "labels"} and not isinstance(scale, str): raise TypeError("Parameter 'scale' must be a string if specified.") if element_type == "shapes": if not isinstance(scale, float | int): @@ -1620,13 +1620,53 @@ def _type_check_params(param_dict: dict[str, Any], element_type: str) -> dict[st if size < 0: raise ValueError("Parameter 'size' must be a positive number.") - if param_dict.get("table_name") and not isinstance(param_dict["table_name"], str): + table_name = param_dict.get("table_name") + table_layer = param_dict.get("table_layer") + if table_name and not isinstance(param_dict["table_name"], str): raise TypeError("Parameter 'table_name' must be a string.") - if param_dict.get("table_layer") and not isinstance(param_dict["table_layer"], str): + if table_layer and not isinstance(param_dict["table_layer"], str): raise TypeError("Parameter 'table_layer' must be a string.") - # like this because the following would assign True/False to 'method' + def _ensure_table_and_layer_exist_in_sdata( + sdata: SpatialData, table_name: str | None, table_layer: str | None + ) -> bool: + """Ensure that table_name and table_layer are valid; throw error if not.""" + if table_name: + if table_layer: + if table_layer in sdata.tables[table_name].layers: + return True + raise ValueError(f"Layer '{table_layer}' not found in table '{table_name}'.") + return True # using sdata.tables[table_name].X + + if table_layer: + # user specified a layer but we have no tables => invalid + if len(sdata.tables) == 0: + raise ValueError("Trying to use 'table_layer' but no tables are present in the SpatialData object.") + if len(sdata.tables) == 1: + single_table_name = list(sdata.tables.keys())[0] + if table_layer in sdata.tables[single_table_name].layers: + return True + raise ValueError(f"Layer '{table_layer}' not found in table '{single_table_name}'.") + # more than one tables, try to find which one has the given layer + found_table = False + for tname in sdata.tables: + if table_layer in sdata.tables[tname].layers: + if found_table: + raise ValueError( + "Trying to guess 'table_name' based on 'table_layer', " "but found multiple matches." + ) + found_table = True + + if found_table: + return True + + raise ValueError(f"Layer '{table_layer}' not found in any table.") + + return True # not using any table + + assert _ensure_table_and_layer_exist_in_sdata(param_dict.get("sdata"), table_name, table_layer) + if (method := param_dict.get("method")) not in ["matplotlib", "datashader", None]: raise ValueError("If specified, parameter 'method' must be either 'matplotlib' or 'datashader'.") From c5d0c4279ecfb7c02834c1288ae20ad9cd02754a Mon Sep 17 00:00:00 2001 From: Tim Treis Date: Mon, 20 Jan 2025 11:39:18 -0500 Subject: [PATCH 9/9] Swapped sdata install from branch to released version --- pyproject.toml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index c495c8bd..45bbd798 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -21,8 +21,7 @@ dynamic= [ license = {file = "LICENSE"} readme = "README.md" dependencies = [ - "spatialdata @ git+https://github.com/scverse/spatialdata.git@c495854", - # "spatialdata>=0.2.6", + "spatialdata>=0.3.0", "matplotlib", "scikit-learn", "scanpy",