scan_clustering() — completely redesigned. The function no longer runs
Monte Carlo CSR envelope tests. Instead it computes the K-integral
clustering index (mean positive L excess over theoretical CSR) in each
sliding window and — when plot = TRUE (now the default) — draws a
spatial base-graphics map with LOESS-smoothed L-excess curves and numeric
CI labels overlaid inside each qualifying window. The returned value is a
plain list of Lest objects (one per qualifying window). The nsim
argument has been removed; a new min_phen_cells argument controls the
per-window phenotype-cell threshold.calc_icat() — fixed sign-ambiguity bug. The previous implementation
returned the raw signed trace of the FastICA mixing matrix, which could be
negative. The index is now computed as
100 * sqrt(v1 + v2 + 2*sqrt(v1*v2)) / nrow(X) — a normalised
trace-standard-deviation of the ICA-reconstructed coordinates — which is
always non-negative and reflects average spatial spread per cell in microns.
plot_TLS() — two visual improvements:
bg_alpha = 0.25 by default, making them more visually recessive.point_size * tic_size_mult (default 1.8x),
making them slightly larger than TLS cells.
Both new arguments (bg_alpha, tic_size_mult) are fully exposed.grDevices::adjustcolor, graphics::*,
stats::cov, stats::loess, stats::predict; removed
spatstat.explore::envelope (no longer needed).grDevices, graphics, stats.summarize_TLS() — produces a tidy data.frame with one row per sample
summarising detected TLS count, size, cell fractions, T-cell clusters, and
(optionally) per-TLS ICAT scores.
plot_TLS() — ggplot2-based spatial scatter plot of TLS and T-cell cluster
membership, using a colourblind-friendly palette. Returns the ggplot
object invisibly for further customisation.
calc_icat() — now returns NA_real_ with an informative message() when
a TLS has fewer than 3 cells or when FastICA fails to converge, instead of
throwing an error.
detect_tic() — now returns the updated ldata list visibly (was
invisible). Two new arguments min_pts and min_cluster_size expose
HDBSCAN tuning parameters that were previously hard-coded. Non-T-cell rows
now receive NA (not 0) in the tcell_cluster_hdbscan column.
scan_clustering() — the return value is now a named list of result objects
each containing Lest, envelope, window_center, and n_cells. New
nsim and min_cells arguments added. Tissue-extent guard now fires before
seq() is called, preventing a wrong-sign error on small datasets.
All functions — phenotype matching now accepts both singular ("B cell",
"T cell") and plural ("B cells", "T cells") labels via internal
helpers .is_bcell() and .is_tcell().
All functions — the global ldata fallback now emits a warning() asking
users to pass ldata explicitly. This behaviour is deprecated and will be
removed in v0.3.0.
plot_TLS() — replaced the Greek mu character (\u03bc) in axis labels
with plain ASCII "um" to prevent encoding failures on systems with limited
locale support.
plot_TLS() — now returns the ggplot object truly invisibly (no implicit
print() call), preventing spurious rendering during R CMD check.
>= 4.0.0.spatstat imports updated to spatstat.geom and spatstat.explore.VignetteBuilder: knitr added to DESCRIPTION (was missing, causing a
vignette WARNING in R CMD check).LICENSE.md and cran-comments.md added to .Rbuildignore (were
generating a NOTE about non-standard top-level files).testthat unit tests covering all exported functions."tlsR-workflow" demonstrating the full analysis pipeline.