Skip to content
9 changes: 9 additions & 0 deletions HISTORY.rst
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,15 @@
History
=======

1.4.1 (2026-06-16)
------------------
* Improved speed of random spot generation used in permutation testing.

API and Bug Fixes:
* Fixed up docstring and types for various CCI methods.
* Fixes for issues #350 and #300 with incorrect types.
* Upgrade libraries: pillow>=12.0.0,<13.0

1.4.0 (2026-05-01)
------------------
* Removed tensorflow and keras and replaced with torch and torchvision.
Expand Down
2 changes: 2 additions & 0 deletions docs/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ undissociated tissue sample.
Latest Additions
----------------

.. include:: release_notes/1.4.1.rst

.. include:: release_notes/1.4.0.rst

.. include:: release_notes/1.3.0.rst
Expand Down
11 changes: 11 additions & 0 deletions docs/release_notes/1.4.1.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
1.4.1 `2026-06-16`
~~~~~~~~~~~~~~~~~~~~~~~~~

.. rubric:: Features
* Improved speed of random spot generation used in permutation testing.

.. rubric:: Bugs

* Fixed up docstring and types for various CCI methods.
* Fixes for issues #350 and #300 with incorrect types.
* Upgrade libraries: pillow>=12.0.0,<13.0
2 changes: 2 additions & 0 deletions docs/release_notes/index.rst
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
Release Notes
===================================================

.. include:: 1.4.1.rst

.. include:: 1.4.0.rst

.. include:: 1.3.0.rst
Expand Down
4 changes: 2 additions & 2 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"

[project]
name = "stlearn"
version = "1.4.0"
version = "1.4.1"
authors = [
{ name = "Genomics and Machine Learning Lab", email = "andrew.newman@uq.edu.au" },
]
Expand All @@ -20,7 +20,7 @@ dependencies = [
"leidenalg>=0.11.0",
"numba>=0.58.1",
"numpy>=2.4.0",
"pillow>=11.0.0,<12.0",
"pillow>=12.0.0,<13.0",
"scanpy>=1.12.0",
"scikit-image>=0.22.0",
"pandas>=2.3.0",
Expand Down
2 changes: 1 addition & 1 deletion stlearn/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

__author__ = """Genomics and Machine Learning Lab"""
__email__ = "andrew.newman@uq.edu.au"
__version__ = "1.4.0"
__version__ = "1.4.1"

from . import add, datasets, em, pl, pp, spatial, tl, types
from ._settings import settings
Expand Down
36 changes: 24 additions & 12 deletions stlearn/adds/add_mask.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,11 @@ def add_mask(
library_id = next(iter(adata.uns["spatial"].keys()))
quality = adata.uns["spatial"][library_id]["use_quality"]
except Exception as e:
raise KeyError("""\
raise KeyError(
"""\
Please read ST data first and try again
""") from e
"""
) from e

if imgpath is not None and os.path.isfile(imgpath):
try:
Expand All @@ -59,13 +61,17 @@ def add_mask(
adata.uns["mask_image"][library_id][key][quality] = img
print("Added tissue mask to the object!")
except Exception as e:
raise ValueError(f"""\
raise ValueError(
f"""\
{imgpath!r} does not end on a valid extension.
""") from e
"""
) from e
else:
raise ValueError(f"""\
raise ValueError(
f"""\
{imgpath!r} does not end on a valid extension.
""")
"""
)
return adata if copy else None


Expand Down Expand Up @@ -128,9 +134,11 @@ def apply_mask(
library_id = next(iter(adata.uns["spatial"].keys()))
quality = adata.uns["spatial"][library_id]["use_quality"]
except Exception as e:
raise KeyError("""\
raise KeyError(
"""\
Please read ST data first and try again
""") from e
"""
) from e

if masks == "all":
masks = list(adata.uns["mask_image"][library_id].keys())
Expand All @@ -144,9 +152,11 @@ def apply_mask(
try:
mask_image = adata.uns["mask_image"][library_id][mask][quality]
except Exception as e:
raise KeyError(f"""\
raise KeyError(
f"""\
Please load mask {mask} images first and try again
""") from e
"""
) from e

# Normalise to uint8 if the image is float in [0, 1]
if mask_image.dtype.kind == "f" and mask_image.max() <= 1.0:
Expand All @@ -157,9 +167,11 @@ def apply_mask(
elif select == "white":
mask_image = np.where(mask_image >= 155, 1, 0)
else:
raise ValueError("""\
raise ValueError(
"""\
Only support black and white mask yet.
""")
"""
)
mask_image_2d = mask_image.mean(axis=2)

def apply_spot_mask(x, _mask=mask, _i=i, _mask_image_2d=mask_image_2d):
Expand Down
12 changes: 8 additions & 4 deletions stlearn/adds/image.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,11 +71,15 @@ def image(

print("Added tissue image to the object!")
except Exception as e:
raise ValueError(f"""\
raise ValueError(
f"""\
{imgpath!r} does not end on a valid extension.
""") from e
"""
) from e
else:
raise ValueError(f"""\
raise ValueError(
f"""\
{imgpath!r} does not end on a valid extension.
""")
"""
)
return adata if copy else None
6 changes: 4 additions & 2 deletions stlearn/spatial/sme/_weighting_matrix.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,11 @@ def row_col_by_platform(
array_col = adata.obs_names.map(lambda x: x.split("x")[0])
rate = 1.5
else:
raise ValueError(f"""\
raise ValueError(
f"""\
{platform!r} does not support.
""")
"""
)
regression = LinearRegression()
reg_row: LinearRegression = regression.fit(array_row.values.reshape(-1, 1), img_row) # type: ignore
reg_col: LinearRegression = regression.fit(array_col.values.reshape(-1, 1), img_col) # type: ignore
Expand Down
6 changes: 4 additions & 2 deletions stlearn/spatial/sme/pseudo_spot.py
Original file line number Diff line number Diff line change
Expand Up @@ -172,9 +172,11 @@ def pseudo_spot(
).reset_index()
obs_df.drop_duplicates(subset=["array_row", "array_col"], keep="last")
else:
raise ValueError(f"""\
raise ValueError(
f"""\
{platform!r} does not support.
""")
"""
)

reg_row = LinearRegression().fit(array_row.values.reshape(-1, 1), img_row)

Expand Down
6 changes: 4 additions & 2 deletions stlearn/spatial/sme/sme_impute0.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,9 +61,11 @@ def sme_impute0(
elif isinstance(adata.X, pd.Dataframe):
count_embed = adata.X.values
else:
raise ValueError(f"""\
raise ValueError(
f"""\
{type(adata.X)} is not a valid type.
""")
"""
)
else:
count_embed = adata.obsm[use_data]

Expand Down
6 changes: 4 additions & 2 deletions stlearn/spatial/sme/sme_normalize.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,9 +61,11 @@ def sme_normalize(
elif isinstance(adata.X, pd.Dataframe):
count_embed = adata.X.values
else:
raise ValueError(f"""\
raise ValueError(
f"""\
{type(adata.X)} is not a valid type.
""")
"""
)
else:
count_embed = adata.obsm[use_data]

Expand Down
Loading