Skip to contents

scop (development version)

  • fix: Pin PyNNDescent 0.6.0 in Scanpy environments to prevent sparse-array getnnz failures in large-data RunPAGA() neighbor searches. RunPAGA() now requests an R-session restart if an older PyNNDescent module remains loaded after the environment is updated.

  • docs: Dataset and RunMonocle3() examples load SeuratData archives directly and select a Monocle 3 lineage with igraph, so examples no longer require SeuratData or interactive Monocle 3 selection. The pbmcmultiome_sub example maps seurat_annotations to six cell types before sampling.

  • docs: RunKNNPredict() examples again annotate pancreas_sub with the bundled ref_scMCA bulk reference, including low-frequency filtering and cluster-level annotation. Four ref_scMCA cell type labels with mis-encoded characters (for example β-cell(Pancreas)) now match the original scMCA names; expression values are unchanged.

  • test: The bulk-container initialization test checks for stack imbalance only, so DelayedArray re-exports from S4Arrays built with retained sources no longer fail the check.

  • refactor: Remove unused native kernels and internal helpers. CellRank transition validation, stationary distribution and Schur routines and the proportion bootstrap sampler are internal to their entry points; unused Python scCODA and SCENIC command-line helpers and stale global variable declarations are removed.

  • fix: CNVPlot() heatmaps show cells in rows and genomic features in columns, use method-specific neutral values, and support automatic or explicit color limits. The help example runs CopyKAT on public expression data.

  • feat: Add CellTreePlot() for hierarchical cell annotations with group-colored leaf tiles, cell proportions, and optional numeric rings.

  • breaking: Remove allow_approximate from RunCellRank(), RunPalantir() and RunSCENICPlus(); selecting their C++ implementations emits an approximation warning. CellRankPlot() removes trends, clusters, enrichment and database; use DynamicHeatmap(), DynamicPlot() and EnrichmentPlot() for these views.

  • feat: CellStatePlot() combines cluster similarity, annotations, compositions, marker expression and precomputed GSEA in a standard patchwork object. It supports Seurat and AnnData, default palettes, optional summaries and flip = TRUE with the tree on the left and upright legends.

  • feat: Add RunATACCoaccessibility(), RunATACFootprint(), ATACFootprintPlot() and ATACMotifPlot() with explicit assay and reference contracts.

  • fix: Plotting functions restore caller random-number state after construction, data returns and errors. Repelled dimension labels and score-plot jitter use the requested seed during delayed rendering.

  • fix: Synchronize and restore PCA BLAS and OpenMP thread counts across successive calls with different core counts.

  • fix: CCC gene plots retrieve stored target genes and support unified interaction results. Reject conflicting CCC argument aliases.

  • fix: Keep zero-P-value GSEA weights finite, forward GSEA byrow, remove ineffective alpha and expression colour scales, and select contrasting text for annotated and mirrored enrichment bars.

  • fix: ATAC coordinate conversion uses public accessors while preserving interval IDs and closed-coordinate semantics.

  • refactor: Share enrichment term selection, maps, networks, word clouds and comparison tables, retaining group matching, ordering, gene selection and score semantics.

  • refactor: Share CCC data preparation and panel composition, reference-label preparation, SCENIC and spatial gradient scales, and projection arrow layers. Remove unused helpers and identity wrappers; keep GSVA- and enrichment-rank-specific code with their entrypoints.

  • refactor: Reuse thisplot scatter, highlight, three-dimensional, streamline and rounded-rectangle layers while retaining object adaptation and interactive controls in scop.

  • refactor: Place ... last in owned function signatures while retaining required external adapter contracts. RunDEtest() normalizes the deprecated named srt alias before standard S3 dispatch.

  • deps: ATAC checks optional packages in the analysis branches that use them. Word clouds check GO keyword dependencies only for GO workflows.

  • test: Consolidate ATAC and spatial fixtures and RNG assertions, remove redundant tests, and validate motif logos with ggseqlogo. Conversion tests use the existing Python runtime.

  • ci: Run the spatial coordinate source check directly and update renamed BANKSY and Presto test paths.

  • fix: PrepareEnv() no longer passes two conflicting pandas pins to pip during a default installation (#561). Environment requirements emit one pin per package, isolated profiles such as scprep_env no longer redefine shared package versions, and include_optional no longer pulls in magic (isolated scprep_env) or moscot (own JAX profile), so the optional shortcut stays usable.

  • fix: RunMonocle2() forwards verbose to Monocle dimensionality reduction so DDRTree progress follows the requested verbosity.

  • Removed the unused static inst/guides/ ATAC notes; their content now lives in the function documentation.

  • Add fixed-width genome tile counting through the validated sparse ATAC recount workflow, with reference checks and tile provenance.

  • Add grouped ATAC region endpoint matrices, heatmaps and aggregate profiles with explicit strand, coordinate and normalization semantics.

  • Add ATACDepthCorPlot() for depth/component correlations using fresh count-layer totals by default.

  • Add ATACTSSPlot() for precomputed positional TSS enrichment profiles with assay-cell alignment.

  • Add ATACFragmentPlot() for regional fragment-length diagnostics with explicit barcode mappings.

  • Add RunCellOracle() and CellOraclePlot() for the official CellOracle 0.20.0 workflow, saved-model reuse, original displacement/randomized controls and a standalone Linux/macOS Python environment profile.

  • Enrichment rank plots add a soft group-colored decorative contour around point clouds and use lighter outlines for highlighted terms. The contour does not represent uncertainty or change the displayed enrichment scores. Separated point clouds are smoothed independently; gaps and sparse segments are left unfilled.

  • EnrichmentMirrorPlot() compares two saved group-wise enrichment rankings with mirrored bars, full pathway labels, matching gene colors, adaptive axis extents, rounded database bands and configurable group colors, text and spacing.

  • EnrichmentPlot(plot_type = "rank") plots stored ORA terms by enrichment magnitude, with group colors, solid-point sizes, bold halo labels, grid_major reference grids, and zero-void panel bounds.

  • feat: GroupHeatmap() accepts legend_params to customize expression and percent legends independently, including horizontal color bars and single-row dot legends.

  • breaking:

  • feat:

    • Make ATAC workflows fail on requested graph, clustering or embedding errors, retain dimension/depth records, and fit default LSI dimensions to small inputs. WNN preserves complete modality assays and validates paired cells, normalizes SCT RNA separately from ATAC, and supports graph-only analysis. Peak calling resolves MACS2 from PATH and retains capture/group records after failure. Add an executable ATAC matrix quick start and complete the DAR motif recipe.

    • Add annotated enrichment bars with rounded database bands, in-bar term labels, matching hit-gene colors and significance opacity, Count dots and compact spacing.

    • Extend FeatureDimPlot() density, palette and title controls. Embedding plots default to label_insitu = TRUE; FALSE uses numbered labels. DE, volcano, Manhattan and ring plots accept standalone tables. Honor CNV palettes, SCENIC reductions and thisplot Pastel1 volcano overlays.

    • Add ATAC/multiome reading, QC, annotation, shared peaks, native Signac recounting, raw-range motifs, ChromVAR, gene activity, peak linking and complete exports. Preserve capture/cell/region alignment, doublet aggregation, native ties, fragment FRiP, eligible backgrounds, bias correction and measured pairing. Sample-level edgeR validates replicates, pairs and covariates.

    • Add experimental IREA analysis, plots and checksum-checked resources with contrast provenance; official-portal equivalence remains unestablished.

  • change:

    • Adapt RunscTenifoldKnk() to scTenifoldKnk 2.0. Use the official workflow for QC, CPM normalization and knockout analysis, with heat alignment, response directions, transcriptome-wide screens and reproducible seeds. Retain the Seurat interface, result storage and plotting functions.
    • Use gzip compression for package data and source installation.
    • Support shared and per-method reduction parameters in integration workflows.
    • Distinguish omitted object from NULL; reject duplicate object/srt. The deprecated srt alias warns until removal in scop 1.0.0.
    • Add standalone database preparation interfaces with shared caching/conversion, nested MSigDB subsets and parent resolution. Reject unknown collections, normalize species names and resolve chromosomes lazily.
    • BANKSY uses image/Spatial/RNA/default assay precedence; sample.by creates separate, prefixed, unaligned fits. Preserve spatial cell identities and provenance through subsetting/renaming; rerun unverifiable legacy results. BANKSY, PRECAST, SmoothClust, CHOIR and RareQ reject invalid provenance.
    • Milo, scCODA and Propeller require biological sample.by; pseudo-samples remain descriptive. Preserve donor pairing, seeds, Milo SpatialFDR and scCODA references. Propeller uses native speckle transformations/empirical Bayes tests, robust/trend/ paired controls and two samples per condition; bootstrap intervals are descriptive. Preserve CytoSPACE singleton, collision and zero-cell provenance.
  • fix:

    • Avoid deprecated Matrix ddiMatrix to dgCMatrix coercion in scenicplus_read_python_result() and cell QC tests so coverage runs stay clean.
    • Fix duplicate GSEA rankings after one-to-many ID conversion and retain unmapped labels. Expose RunGSEA() parameters nPermSimple and eps with unchanged defaults.
    • Preserve native Fisher tests and Holm correction in GO word clouds; support simplifyEnrichment 2.4.1/2.6.0 and GSVA version-specific scoring semantics.
    • Resolve explicit Ensembl archives directly, recovering catalogs from archive hosts and reporting unavailable releases. Restore the startup Logo, version/date and website with message suppression support.
    • Preserve the default Python version when preparing a missing environment; recognize micromamba package lists so installed native libraries are reused. Resolve Python requirements together and reject inconsistent environments; isolate PHATE/MAGIC with compatible pandas, separate TensorFlow from JAX, and keep scCODA’s compatible rpy2 version. PHATE supports an already active Python environment through an isolated call, preserving its warnings.
    • Scope Python conflict checks to the requested dependency closure, warn about unrelated legacy conflicts, pin compatible JAX companions, and retain installation errors. Restrict scVI/moscot rejection to explicit environment requests and pass caller verbosity through dependency checks.
    • Resolve Seurat t-SNE explicitly in integration workflows. Pass graph/neighbor inputs only to supported reductions. Treat destiny’s legacy Matrix coercions as warnings in RunDM(), restoring caller options.
    • Preserve MDS standard deviations, Conos layers and Seurat 5.6.0 CSS integration/ mapping. Align RCTD/CARD/SPOTlight references, RCTD library depths and PRECAST raw counts, six-neighbor adjacency and native parameters. Spatial neighborhood outputs retain deterministic order, saved coordinates and complete p-value families; SpatialCellChat requires explicit Visium HD calibration/tolerance.
    • Match native Palantir bandwidth/start pseudotime, CellRank Fisher-z p-values and stochastic scVelo percentile weights; existing results change. RSpectra can return fewer terminal regions for near-closed classes. Restore thread settings and validate Python runtimes.
  • refactor:

    • Share spatial/heatmap helpers and simplify backend/Scanorama calls; remove unused helpers, bridges and compatibility code. Preserve command history, metadata names and sparse RecoverCounts(trans = "exp"). Load CytoTRACE2 models once per call, invalidate changed assets, validate managed Python environments and resolve logging from thisutils scripts/ with older-path compatibility.
  • docs:

    • Refresh integration/deconvolution documentation and group release notes by type. Enable Scrublet and DoubletDetection examples with explicit environment preparation.

scop 0.9.2

  • breaking:

    • RunSpatialGradientFeatures() now exposes only the native C++ gradient interface. The unused compatibility parameters sample_name, platform, img_scale_fct, assay_modality, trajectory_id, width, annotation_id, core, distance, angle_span, resolution, model_add, model_subset, model_remove, and control, plus unsupported annotation_ids and ..., are removed and now fail as unused arguments. Use image/coord.cols/coordinate_space, the annotation metadata inputs, and the native screening controls documented by the function.
    • RunMonocle2() drops the backend = "cpp" path and its n_neighbors parameter. Monocle now accelerates the DDRTree ordering hot paths natively in C++, so the separate scop implementation is no longer needed; backend and n_neighbors are accepted with a deprecation warning and ignored. The group.by-based root_state resolution that only the C++ backend supported is removed with it, and root_state must be a trajectory State as with the previous "r" backend.
    • Public APIs take the data object as object= rather than srt=. Every exported function that took srt= now takes object=; srt= remains accepted as a deprecated alias that warns on use and is removed in scop 1.0.0. RunVECTOR(), VECTORPlot(), RuntAge(), tAgePlot(), RunscTenifoldNet(), and PrepareSCExplorer() take object= only.
    • Remove unverified RunSpatialDWLS() and its plotting path rather than presenting clipped least-squares output as SpatialDWLS. Use RunRCTD(), RunCARD(), or RunSPOTlight() with SpatialDeconvolutionPlot().
    • Remove SpatialEcoTyperCompositionPlot() and SpatialEcoTyperSpatialPlot(). Use CellStatPlot() and SpatialSpotPlot().
    • SpatialGradientPlot() now reads only stored summary, line, and model views. surface/combined plot types and current-assay/layer refetch are removed.
  • removed:

    • Removed the legacy spatial registry and result-discovery APIs (GetSpatialResult(), ListSpatialMethods(), SpatialBackendStatus(), and SpatialResultInfo()). Use each producer’s documented srt@tools entry and, where provided, its dedicated result accessor or plotting function.
  • feat:

    • RunSpatialIntegration() gains store_object = TRUE. Setting it to FALSE omits the complete native PRECAST object while retaining the standardized result, source, parameters, summaries, and plotting payload.
    • SpatialNeighborhoodProfile() returns observed per-cell neighbor counts and fractions at multiple raw-coordinate distances, retaining the full selected tissue context for target cells without modifying the Seurat object or storing an edge table.
    • RunDEtest() sample-level methods gain min.cells.sample (default 10) to drop pseudobulk samples whose cell count in the current group.by level is below a threshold, which can reverse DE direction relative to cell-level tests. Set min.cells.sample = 1 to keep the previous unfiltered behavior.
    • RunNichenetr() and RunMultiNichenetr() gain merged_table_file to export a temporary merged ligand-receptor/activity/target table as CSV; an existing file is never overwritten.
    • Add BANKSY and SmoothClust to RunStandardWorkflow(workflow = "spatial"), with explicit spatial_cluster_params. Optional SpotSweeper QC and SpaNorm normalization retain stage status and keep original counts separate from normalized downstream expression.
  • change:

    • ReadSpatialData() delegates Visium, Visium HD and Xenium loading to Seurat and records analysis units, assay/image resolution and coordinate units. Import and workflow entry points automatically validate the selected context.
    • Explicit do_normalization = FALSE is respected by preprocessing, including externally normalized data that the heuristic cannot classify. The SpaNorm workflow retains matched original counts for library QC alongside normalized expression.
  • fix:

    • Cell2location stores plotting matrices for all original spots, with NA for filtered observations, and retains the modeled IDs. Historical compact matrices are expanded only when their modeled/dropped-ID records explain the missing rows; stale or unknown IDs still fail.
    • Long-format spatial point/jitter maps forward explicit cutoffs and quantiles without changing the default full range. Both long maps and generic dominant deconvolution maps honor combine = FALSE.
    • Matrix spatial plots retain explicit cutoff/quantile scales, and Cell2location dominant maps forward combine and layout controls. Constant topic/abundance panels use consistent default legend breaks.
    • Spatial proportion, topic-proportion, and q05-abundance point maps share one renderer. Scale/title formatting now happens before the combine decision, so empty panels, constant values, named colors, and combined/non-combined returns have the same interpretation. Ordinary benchmark summary tables use the stable bar view for plot_type = "auto"; funkyheatmap remains explicit.
    • Spatial plots preserve coordinate aspect ratios, factor order and named category colors. Point, long-format and pie facets accept metadata names with spaces, constant features honor explicit color limits, and ambiguous value IDs are rejected.
    • Spatial integration maps render every sample with its matching image; aligned views use aligned coordinates without raw-image overlays. SpatialCellPlot() adds named-list/layout and legend controls, with a sequential default palette for numeric features.
    • Deconvolution summaries report assigned/unassigned spot counts without assigning zero-weight spots to the first cell type. Invalid weights fail before object mutation. Empty deconvolution panels remain plottable and constant proportion panels share comparable legends.
    • Restore cores forwarding to the ncores argument in SpatialEcoTyper deconvolution and both MERINGUE R permutation tests; the deprecated ncores alias remains supported.
    • Forward theme_use and theme_args in all SpaTalk and COMMOT CCC plot views. Consolidate SpaTalk result preparation and remove duplicate coordinate checks and redundant plot-call wrappers.
    • RunDoubletCalling() forwards the data object as object= only, so RunCellQC() no longer fails with “Provide only one of object or srt” for any db_method. The Python bridges (RunSCVELO(), RunCellRank(), RunPalantir(), RunPAGA(), RunWOT(), RunCellTypist()) no longer pass the data-object argument on to Python functions that accept neither object= nor extra keywords.
    • srt_to_adata() converts velocity matrices stored as extra layers of assay_x, such as spliced/unspliced in the RNA assay of a Seurat v5 object, instead of dropping them without a message. RunSCVELO() failed on such objects with Error in scVelo analysis: 'Ms', because scVelo skips the moment computation when the layers are absent and reports the problem later as adata.layers['Ms']. Names in assay_y that are neither an assay nor a layer of assay_x are now reported with the available ones, and the Python workflow names the missing layers instead of raising a KeyError.
    • MistyRPlot(measure =) selects the numeric result column explicitly (gain.R2/gain.RMSE or contribution/importance).
    • Spatial integration (PRECAST) domain, embedding, and coordinate results must match Seurat cell identities exactly, including named, reordered, missing, extra, and duplicate IDs.
    • SpatialCellPlot() fetches feature values through GetAssayData5() with explicit assay/layer.
    • StatialKontextualPlot() draws connecting lines only when a relationship has multiple radii.
    • Coordinate v3 accepts the empty native orientation slot introduced by newer SeuratObject versions. List integration resolves explicit image maps before merging duplicate image names. Existing coordinate-contract v2 results still require rerunning.
    • Spatial coordinate contract v3 uses persistent image axis provenance instead of guessing from mutable metadata, parses numeric factor coordinates correctly, and records the resolved coordinate columns. SetSpatialImageAxes() preserves custom VisiumV2 conventions through subsetting and renaming; the bundled Visium object is migrated without changing its measurements. Coordinate-dependent results from contract v2 must be rerun.
    • Spatial point and pie plots default to the same FOV/metadata y orientation as network and boundary plots (flip.y = FALSE). SpatialExperiment exports default to raw coordinates and retain transforms for reversible display-coordinate round trips.
    • Spatial integration and SpatialEcoTyper multi discovery resolve each sample’s image independently and reject incomplete image coverage. SpatialEcoTyper single discovery requires a single selected image and stores its raw coordinate source. SpotSweeper local outlier results with verified sample-prefixed IDs are restored to input order without accepting changed coordinates or expression.
    • Gradient result storage and VariableFeatures updates are independent; explicit empty updates clear VariableFeatures and completion messages describe actual actions.
    • Neighborhood spatial counts respect saved analysis scope and condition, distinguish zero from unevaluated cells, reject unsupported plot arguments, and support valid empty observed results.
    • RunMonocle2() skips estimateDispersions() unless feature_type = "Disp" or show_plot = TRUE. The sparse-matrix 2^31-1 crash in dispersion fitting is fixed in mengxu98/monocle 2.9.3.
    • C-SIDE completion messages respect result storage and document compatibility metadata as run-level significant record counts.
  • perf:

    • RunMonocle2() DDRTree ordering now runs on monocle’s native C++ fast paths (cell-to-MST projection, projected-cell minimum spanning tree, tree ordering traversal, and state-based root selection, ported from the former scop backend into mengxu98/monocle). Ordering a 3,000-cell dataset drops from ~9.3 s to ~1.2 s, and the ordering step no longer scales quadratically with cell number. Pseudotime, states, and the root cell are unchanged.
    • ScaleData() now supports Assay5 cell subsets and updates layer membership on rescaling. SPARK-X retains sparse input, and dense spatial-feature conversions have an explicit size guard.
  • deps:

    • Require thisutils >= 0.5.2 for the detect_cores() calls already used by SCOP.
    • Declare the existing direct lifecycle dependency used by PseudobulkExpression; no optional Remotes backend is promoted to Imports.
  • refactor:

    • Long-format spatial points and jitter reuse the standard point renderer. Spatial workflow parameter validation, stage-field updates and method-name dispatch are consolidated without removing preflight or result checks.
    • Remove the unreachable per-gene C++ branch after MERINGUE’s batch kernel returns; the batch implementation and numerical behavior are unchanged.
  • docs:

    • Execute the SpatialExperiment round-trip with the correct counts layer, use merged-image auto-resolution in the PRECAST template, and render the main workflow’s empty-panel and save/reload examples.
    • Refresh the three Spatial Analysis articles around the real Visium baseline, platform-specific imports and units, and separate Seurat–SpatialExperiment/Giotto bridge contracts. External paths are templates and optional backend examples are labeled as such.
    • Synced the RunMonocle3() use_partition default and the RunDoubletCalling() backend default with their sources, and bolded the README headings to match the other packages.
  • data:

    • Remove the derivative pbmc_celltypist_sub, visium_human_pancreas_results_sub, visium_human_pancreas_pair_sub, and xenium_human_pancreas_boundaries_sub datasets and one-off data migration scripts. Examples reuse pbmcmultiome_sub and visium_human_pancreas_sub, computing results when needed; specialized workflows document their required inputs without placeholder files. Existing scripts using the removed data() names must be updated.
  • chore:

    • Package attachment no longer prints the ASCII startup banner or repeated environment instructions. Explicit Python-environment initialization still reports its actual success or failure.
    • Cleared the remaining R CMD check findings across plot wrappers and integration benchmarks.

scop 0.9.1

  • removed:

    • The CaSpER branch of RunCNV() is removed: runCaSpER() segfaults deterministically on R >= 4.5 (HMM manualSegment, even on 50 cells), upstream is unmaintained since 2019, and its Bioconductor dependency set is archived. RunCNV() now supports copykat, fastCNV, scevan, infercnv, and numbat.
  • feat:

    • Internal preprocessing and integration workflows now use scop’s Seurat-compatible entry points, enabling validated native acceleration for normalization, variable-feature selection, scaling, PCA, and neighbor search while retaining transparent Seurat fallback for unsupported paths.
    • The native SCTransform(vst.flavor = "v2") path now supports validated numeric and factor vars.to.regress designs and latent.data; unsupported regression designs continue to delegate to Seurat.
    • The native PCA auto path accepts smaller stable trailing eigengaps after numerical and neighborhood-parity validation, allowing more datasets to use the accelerated implementation.
    • Added CellScoringPlot() for paired group/score UMAPs, score distributions, threshold proportions, and complete multi-program layouts from CellScoring() results.
    • CellRank + Palantir fate workflow now supports MAGIC layers, explicit Schur sizes and terminal-state validation, normalized fate/driver/transition payloads, CellRank GAM trend modules, module enrichment, and result-only CellRankPlot() views.
    • Added RunCOMMOT() and COMMOTPlot() for official COMMOT spatial communication through an isolated Python subprocess with raw-coordinate provenance and optional external H5AD storage.
    • Added RunSpaTalk() and SpaTalkPlot() for official SpaTalk single-cell and spot-reference spatial communication workflows with compact unified CCC storage.
    • Added CCCNetworkPlot(plot_type = "spatial"), a stored-result slice overlay for SpatialCellChat, SpaTalk, and COMMOT with abundance-scaled group nodes, sender-coloured directed edges, and proportion-aware composition pies.
    • RunCNV() backend coverage: copykat, fastCNV, SCEVAN, infercnv, and numbat are now verified against their original pipelines on real bundled datasets (breast-cancer scRNA-seq, infercnv example, numbat ATC2 example), with exact prediction agreement for copykat/SCEVAN/numbat and Spearman rho = 1.0 for fastCNV/infercnv.
    • The MERINGUE C++ permutation kernel now traverses the weight matrix sparsely (row-major edge list, bit-identical accumulation): nperm = 200 Moran p-values at 300 spots drop from ~442s to ~14s (~30x).
    • Removed wrappers whose upstream dependencies are unavailable or uncompilable: RunSpatialQM(), the RunSemla*() wrappers, the BASS/SpatialMNN branches of RunSpatialIntegration() (PRECAST unaffected), and the SPATA2 backend = "r" path of RunSpatialGradientFeatures() (C++ backend only; srt_to_spata2()/spata2_to_srt() removed as well).
    • RunMERINGUE() gains a backend = c("cpp", "r") option; the C++ kernels replicate MERINGUE::moranTest()/moranPermutationTest() to machine precision (including the sample.kind RNG stream). backend = "r" retains the original calls and honors moran_params.
    • DorotheaPlot() now follows the shared scop plot style: horizontal "bar"/"lollipop" comparison plots, "volcano", "heatmap" via GroupHeatmap(), "dim" (activity vs expression on embeddings), "stat" (FeatureStatPlot distributions), and "targets" (regulon-target volcano). RunDorothea() examples show FeatureDimPlot() / FeatureStatPlot() on the TF-activity assay.
    • RunIntegrationBenchmark() compares integration methods with scIB-style iLISI/cLISI, ASW, graph connectivity, and ARI/NMI scores and returns a Seurat object. Tables live in srt@tools$IntegrationBenchmark and are printed with thisplot::print_colored_table(). IntegrationBenchmarkPlot() draws box (per-cell LISI), heatmap, scatter, and UMAP views. LISIPlot() is removed; use IntegrationBenchmarkPlot(plot_type = "box").
    • SCENICPlot() / SCENICPlusPlot(): heatmap_dotplot, eregulon_dim, coverage, network, network_graph, egrn, overlap. "network" draws one hub per TF. Network plots have no title. Networks use "Chinese" when palette = "RdYlBu". Multi-TF legends show the top RSS cell type.
  • change:

  • fix:

    • RunCellRank() now disables PETSc explicitly when retrying fate probabilities with SciPy’s direct solver, preventing CellRank 2.0.7 from silently reverting the retry to GMRES and rejecting harmless floating-point negative probabilities (#380).
    • RunCellRank() defaults to the dependency-free brandts Schur method again, so the standard scop_env no longer fails because the optional petsc4py and slepc4py packages are absent. Users can still request schur_method = "krylov" when those packages are installed (#380).
    • CellRank stored-result plotting now follows SCOP’s theme_scop, Chinese, and Spectral visual contracts; draws transition projections directly from the saved sparse transition matrix; supports random walks without requiring trend results; facets trend modules; and adds module-enrichment dot plots. CellRank enrichment selects the database gene-ID column that overlaps the actual driver background, including three-column GO tables with both Entrez and symbol identifiers.
    • Coordinate-contract validation now covers unified CCC plots for SpatialCellChat, COMMOT, and SpaTalk without rejecting coordinate-independent SpatialDWLS proportions. Explicit coordinate_space = "legacy_display" analysis preserves its historical lowres-to-hires fallback; current display plotting remains strict about the selected scale.
    • Spatial coordinate contract v2 now reads full-resolution VisiumV1/VisiumV2 coordinates, restores the imagerow/imagecol order that Seurat’s standard VisiumV2 loader stores positionally as centroid x/y, preserves explicit generic FOV x/y, normalizes only explicitly named legacy image row/column coordinates, and applies exactly one selected lowres or hires display transform. SpatialCoordinates(), HE-overlay point/pie/network plots, and their public wrappers gain an appended image.scale argument; variadic wrappers keep it named-only after .... Raw SpatialCellChat analysis no longer requires an available display scale, and coordinate-independent producers no longer claim a coordinate-contract version. Users no longer need to modify Seurat @scale.factors slots. Coordinate-dependent stored results created under an older or unknown contract must be rerun.
    • RunSlingshot() / CellDimPlot(lineages=) no longer fail with scale$guide == "none" on ggplot2 >= 3.5 when ggnewscale is older than 0.5.0. Colour/fill scales now keep a character guide, legend overrides go through guides(), ggnewscale is pinned to >= 0.5.2, and a failed lineage plot no longer discards the Slingshot result.
    • RunGSEA() / RunEnrichment() no longer fail with “replacement has 0 rows, data has N” when the cached database carries an empty version. The KEGG REST API dropped the Release line from /info/<org>, so PrepareDB() now resolves the KEGG version from the release-notes page when the info endpoint does not report it (retrieval-date fallback; HPO hardened the same way), and the enrichment writers tolerate missing versions.
    • RunSpaTalk() now reuses stored RunRCTD() weights through SpaTalk method 2 and records the deconvolution source.
    • RunLIANA() now preserves the field set returned by LIANA’s official consensus mode: rank consensus no longer gains all-NA aggregate/significance placeholders, aggregate consensus no longer gains all-NA magnitude/specificity placeholders, and deterministic ligand-receptor display identifiers are completed during SCOP/LIANA export.
    • RunCNV() resolves bundled backend annotations for copykat, fastCNV and numbat.
    • RunCNV(numbat) prefers the plain seg column over seg_label when reading joint_post output, so segment identifiers are not polluted with the (loh) suffix.
    • RunCNV() numbat extraction is vectorized (direct index assignment with duplicate averaging instead of row-by-row aggregate/strsplit, plus split()-partitioned bin statistics): a 300-seg x 2000-cell joint_post extraction drops from ~16s to ~1.3s (~12x) with bit-identical results.
    • visium_mouse_brain_slices_sub rebuilt with the current SeuratObject so bundled VisiumV2 images can be subset again.
    • RunRCTD() extracts per-spot all_weights from spacexr >= 2.2 doublet_mode = "multi" results.
    • RunSpotSweeper() detects upstream SpotSweeper::localVariance breakage on SpatialExperiment colData and degrades gracefully.
    • RunSpatialIntegration(PRECAST) writes the raw coordinates expected by CreatePRECASTObject.
    • RunLIANA() recognizes logfc_comb (and other liana method score columns) as the interaction score.
    • Exported theme_scop / theme_spatial are listed in the pkgdown reference index.
    • DorotheaPlot(plot_type = "volcano") plots every tested TF, caps Wilcoxon underflow on the y-axis, colors points by direction, and labels significant TFs. "targets" labels only significant genes so leader lines no longer pile at x = 0.

scop 0.9.0

  • feat:

    • New optional-backend wrappers: RunCHOIR() for significance-based hierarchical clustering and RunCell2fate() for RNA-velocity modeling, both with pinned backend provenance, strict result validation, metadata writeback, and resumable artifacts.
    • Added RunCell2location() for official Python cell2location reference-signature learning and spatial abundance mapping, with manifest-validated resume, signature reuse, and Cell2locationPlot() visualizations.
    • Added RunCNV() as a unified CNV workflow with optional copykat, infercnv, SCEVAN, and fastCNV backends, standardized srt@tools[["CNV"]] storage, and CNVPlot() visualizations; added RunESTIMATE() for stromal/immune/tumor-purity scoring with EstimateScorePlot() / EstimateGenePlot().
    • GRN analysis extended: RunSCENICPlus() for SCENIC+ multi-omics workflows, plus standalone RunGRNBoost2(), RunGENIE3(), and RunCisTarget() modules sharing the SCENIC regulon infrastructure.
    • Added RunSpatialCellChat() as a SpatialCellChat v3 producer for cell-, spot-, and composition-level communication, with raw-to-micron coordinate contracts and schema-v1 provenance; GetCCCObject() and SpatialCellChatPlot() provide stored-result access.
    • Spatial analysis framework: added spatial contract schema v1 (SpatialCoordinates(), GetSpatialResult(), GetSpatialGraph()), a shared spatial method registry (ListSpatialMethods(), SpatialBackendStatus(), SpatialResultInfo()), strict raw-coordinate defaults, and sparse BiocNeighbors-backed graph kernels for SmoothClust, spatial-variable-feature, and spatial-neighborhood paths.
    • Added RunSpatialBenchmark() and SpatialBenchmarkPlot() for failure-tolerant comparison of stable spatial-domain clustering methods (ARI/NMI/purity, runtime, peak memory); added ClusterTreePlot() for multi-resolution clustering trees.
    • Visualization improvements: FeatureStatPlot()/ExpressionStatPlot() gain auto_comparison; GSVAPlot() gains a mode = "diff" two-group pathway test; FeatureHeatmap(), DynamicHeatmap(), and GroupHeatmap() compact long multi-term annotations; CellCorHeatmap() gains legend.position.
    • Performance: C++ acceleration for the core Seurat flow — NormalizeData(), FindVariableFeatures(), ScaleData(), PCA and neighbor search — and for marker detection (FindMarkers(), FindAllMarkers(), FindConservedMarkers()); native kernels for manifold learning (UMAP, PaCMAP, TriMap, PHATE, DM), trajectory inference (PAGA, SCVELO, VECTOR), Z-score/PLAGE/ssGSEA/AUCell gene-set scoring, spatial-variable-feature statistics, cross-KNN and connectivity graphs, and integration embeddings.
    • RunMetabolism() now builds gene sets via PrepareDB() by default with species-aware conversion; PrepareDB() accepts local single-file database sources (MSigDB, CORUM, JASPAR, TRRUST, CellChat, and more); RunSCENIC() gained a genome parameter for hg38/hg19 reference selection.
    • RunSpatialNeighborhood() defaults to observed-neighborhood summaries; the standard spatial workflow records per-stage requested/completed/skipped/failed state and reports partial completion.
  • change:

  • data:

    • Added visium_human_pancreas_sub, a Visium human pancreas spatial example dataset (GSE254829) with spatial image data and CODA-derived annotations, for spatial analysis.
    • Added a Xenium package-data import script for preparing curated Xenium example resources outside the installed package payload.

scop 0.8.9

  • feat:

    • Added loom_to_srt() for pure-R loom-to-Seurat conversion via rhdf5, preserving velocity spliced and unspliced layers as assays without initializing Python, and added Python-backed loom_to_adata() for users who need AnnData output.
    • Added RunBulk() as a unified bulk-strategy entrypoint with method-vector selection for bulk DE, deconvolution, and cell-type-specific DE workflows.
    • Added method-specific bulk runners for de_limma_voom, de_edgeR_qlf, de_DESeq2, de_dream, deconv_MuSiC, deconv_BisqueRNA, deconv_BayesPrism, and csde_TOAST.
    • Standardized bulk results under Bulk$results$de, Bulk$results$deconv, and Bulk$results$csde, keeping DE outputs compatible with existing DEtestPlot(), RunEnrichment(), RunGSEA(), GroupHeatmap(), and FeatureHeatmap() data flows.
    • RunBulk(run_enrichment = TRUE, run_gsea = TRUE) now filters bulk DE rows with pathway thresholds and mirrors successful pathway results to Enrichment_Bulk_wilcox and GSEA_Bulk_wilcox, so EnrichmentPlot() and GSEAPlot() can read them through the standard srt@tools contract.
    • Deconvolution and CSDE bundles now record their computational engine in details; the current deconvolution runners use explicit backend = "internal" SCOP profile fitting and csde_TOAST uses explicit backend = "limma_interaction", so package backends can be wired in later without pretending to call external packages.
    • Added explicit Remotes entries for mengxu98/thisplot and mengxu98/thisutils so source installs can resolve the minimum imported versions required by SCOP.
    • Added method_args to expose method-specific tuning parameters without expanding the public API surface.
  • fix:

    • RunGSVA(): Removed redundant dense as.matrix() conversion in single-cell mode for backend = "r"; sparse expression matrices now stay sparse through row filtering, reducing peak memory and avoiding unnecessary dense materialization.
    • RunCellQC(): Replaced Seurat::SplitObject() with lazy cell-name-based subsetting, avoiding full-object duplication per split group. Added caching of GetAssay() gene names, GetAssayData5() counts, and per-cell QC metrics (nCount / nFeature) outside the species-check loop to eliminate repeated data extraction.
    • RunDEtest(): Pre-computed cell index mapping (split(names(cell_group), cell_group)) for paired-marker tests, replacing per-pair which() calls with O(1) list lookups.
    • AnnotateFeatures(): Replaced per-detail sapply(… "[") with type-stable vapply(…, character(1)) to avoid implicit list-to-character coercion.
    • run_scomm(): Deferred dense conversion for reference and query subsetting by removing premature as.matrix() calls; sparse matrices are subset first, then densified only when required.
    • RunUMAP2(): Replaced isSymmetric(as.matrix(graph)) with sparse-aware Matrix::isSymmetric(graph) in symmetry checks and graph subset sampling, avoiding dense materialization of large neighbor graphs.
    • RunUMAP2(): Replaced apply(as.matrix(graph), 2, order) in the uwot-predict path with thisutils::run_sparse_topk_stored(by = "col"), avoiding full dense conversion and column-wise R-level apply() while retaining graph-edge semantics.
    • RunDimsReduction() (PCA centering): Uses SeuratObject::LayerData(…, features = features) to read only HVF rows from scale.data instead of loading the full matrix followed by manual subsetting.
    • RunMDS(): Removed as.matrix() before Matrix::t(); proxyC::dist now receives the sparse matrix directly, avoiding dense conversion of large count matrices.
    • integration.R (fastMNN): Removed three as.matrix() calls passed to batchelor::fastMNN(), which accepts sparse matrices directly via SingleCellExperiment.
    • RunStandardWorkflow(): Replaced full scale.data matrix load (via GetAssayData5()) with direct layer access (SeuratObject::GetAssayData for Assay5; @scale.data for Assay) to retrieve only rownames when checking whether HVFs have been scaled, substantially reducing peak memory during the ScaleData decision step.
    • GetAssayData5.Assay(): Fixed parameter naming to use positional matching for the slot/layer argument, so GetAssayData5() correctly retrieves counts, data, and scale.data layers in both Seurat v4 (slot) and v5 (layer). Previously the named layer argument was silently dropped by SeuratObject v4, always returning the data slot regardless of the requested layer.
    • CSS_integrate(): Added Assay5 guard before SeuratObject::JoinLayers() to avoid errors with Seurat v4 Assay objects, which do not support layered storage.
    • RunDimsReduction(): Added Seurat v4 fallback for PCA centering — SeuratObject::LayerData(…, features = …) is Assay5-only; v4 Assay objects now use GetAssayData5() with manual feature subsetting.
    • RunIntegration(): Added early detection for v5-only integration methods (CCA, RPCA, fastMNN5, Harmony5, scVI5) to provide a clear, actionable error message when used with Seurat v4 Assay objects, rather than failing deep in the call stack.
  • None:

      • Cell-cell communication:
    • RunLIANA() now stores LIANA’s official multi-method consensus from rank_aggregate() or liana_aggregate() alongside the historical method-stacked and scop-postprocessed tables. Human and mouse defaults use the Consensus and MouseConsensus ligand-receptor resources, respectively, and multiple resources are aggregated independently.
    • Added ListLIANAResources(), ListCCCMethods(), CCCResultInfo(), and GetCCCResult() for resource discovery and Seurat-centered CCC result access.
    • RunCCC() now registers all seven SCOP CCC producers while retaining CellChat, CellPhoneDB, and LIANA as the default core run. Unified CCC plotting separates backends by default and provides explicit support-count and within-method percentile-rank views.
    • Hardened unified CCC plotting and access semantics: context filters are applied before cross-method support/rank combinations, CellChat cached rows honor the requested significance threshold, LIANA resources remain separate during export, and unified retrieval preserves backend labels. RunCCC(skip_failed = TRUE) now records preflight failures without aborting otherwise runnable methods.

scop 0.8.8

  • fix:

    • Added optional wrappers for RunDorothea(), RunBayesSpace(), and RunscTenifoldKnk().
    • PrepareEnv(): Added explicit support for mamba and micromamba executables in addition to conda, including command-name resolution, automatic package-managed micromamba download when conda = "micromamba" is requested and the command is not on PATH, manager-aware logging, micromamba env path detection, and ToS handling that only runs for standard conda. Package-managed micromamba environments now use a no-space cache root to avoid micromamba run -p path parsing failures. PrepareEnv() now also stops early if reticulate has already initialized a different Python executable, avoiding unsafe in-session switches between conda and micromamba. The Python stack now also pins setuptools < 81 so legacy packages such as trimap can still import pkg_resources.
    • PrepareEnv(): The default modules = NULL environment no longer includes scomm; install it explicitly with modules = "scomm" because the TensorFlow/scOMM stack conflicts with the default JAX/scVI stack through incompatible ml-dtypes requirements.
    • CheckDataList() / RunStandardWorkflow(): Removed an unnecessary all-feature ScaleData() call immediately after LogNormalize. Downstream workflows still scale the selected HVFs before PCA, but large raw-count inputs no longer create a dense all-gene scale.data intermediate during checking.
    • srt_reorder(): Replaced per-cluster repeated sparse subsetting and rowMeans() with a single sparse group-membership matrix multiplication, speeding the cluster-reordering step used by RunStandardWorkflow() while preserving average expression values.
    • FindExpressedMarkers(): Added a sparse fold-change and detection-rate prefilter path for common sparse RNA inputs, avoiding dense all-feature expression materialization before marker filtering while preserving default results. Supplied features are now intersected with the active layer before dense fallback scoring, which also keeps scale.data and partial-feature layers from passing absent rows into fold-change calculation.
    • C++-accelerated backends are now the default where available: RunMetabolism(), RunGSVA(), CellScoring(), RunDynamicEnrichment(), and RunEnrichment() now prefer backend = "cpp" while retaining backend = "r" for exact legacy/package behavior. RunPermutation() now uses its validated C++ implementation directly.
    • RunMetabolism() and RunGSVA(): Added a reusable C++ gene-set scoring backend for ssGSEA, zscore, and plage; RunGSVA() can now use backend = "cpp" for method = "ssgsea", method = "zscore", method = "plage", and Gaussian- or Poisson-kernel method = "gsva". PLAGE scores are oriented by the gene set mean z-score to avoid backend-dependent sign flips.
    • RunMetabolism() and RunGSVA(): Added cpp_chunk_size for the C++ GSVA kernel paths to reduce peak dense intermediate memory on large cell counts; NULL now auto-selects a chunk size for large matrices.
    • RunEnrichment(): Added an experimental backend = "cpp" ORA path using a C++ hypergeometric implementation for faster enrichment tables while keeping backend = "r" available as the clusterProfiler-compatible path.
    • CellScoring(): Added experimental backend = "cpp" support for Seurat module scoring by keeping control-gene sampling in R and moving sparse mean calculations to C++ code.
    • RunPermutation(): Uses the C++ permutation and bootstrap loops directly after validating they match the legacy R calculation for observed fractions and log2 fold-differences while running substantially faster.
    • RunUMAP2(): Added an internal C++ sparse column top-k helper for Graph inputs to speed extraction of precomputed neighbor indices/connectivities before calling uwot.
    • RunKNNMap() and RunKNNPredict(): Added an internal C++ dense column top-k helper for the raw KNN fallback to speed nearest-neighbor extraction from precomputed distance matrices.
    • PseudotimeProjectionPlot(): Reused the internal dense top-k helper for pseudotime KNN/gradient neighbor extraction from distance matrices.
    • Mapping/integration metrics: Added an internal C++ contingency-table helper for metric_accuracy(), metric_macro_f1(), metric_purity(), metric_nmi(), metric_ari(), metric_weighted_recall(), and collect_mapping_metrics().
    • RunMetabolism(): Added a C++ backend for method = "GSVA" that keeps the Poisson-kernel GSVA scoring path but accelerates repeated count-kernel calculations.
    • RunMetabolism() and CellScoring(): Added an experimental C++ backend for AUCell scoring selected only through backend = "cpp", while keeping the original R/AUCell implementation available via backend = "r" for exact package output. RunDynamicEnrichment() now passes this backend through to AUCell-based scoring.
    • CellScoring(method = "AUCell"): Fixed score-name assignment when only one feature list is scored, avoiding vector dropping before metadata column names are applied.
    • RunMetabolism(method = "VISION"): Fixed signature construction so in-memory gene sets are passed as VISION::Signature objects instead of being interpreted as file paths.
    • DynamicHeatmap() / custom enrichment workflows: Fixed incorrect term label display when user-provided TERM2GENE / TERM2NAME use non-standard column names such as term / name. Custom term annotations are now normalized consistently so that heatmap term labels show readable term names instead of fallback IDs (e.g. GO IDs). Related issue #160 (@Pineapple-wen6, @mengxu98).
    • Refactored repeated custom database input handling by introducing shared internal helpers for normalizing and assembling user-provided TERM2GENE / TERM2NAME, and applied them across RunEnrichment(), RunDynamicEnrichment(), RunGSEA(), RunGSVA(), and PrepareDB() to keep behavior consistent.
    • RunIntegration(): Improved ChromatinAssay handling by standardizing ATAC reductions after integration, avoiding non-interactive small-batch blocking, clipping TFIDF/rlsi anchor dims to available cells, auto-switching Harmony5 to legacy Harmony, and rejecting unsupported Seurat / RPCA ATAC paths with explicit messages.
  • deps:

  • docs:

    • Updated pkgdown reference grouping for the cell-cycle workflow.

scop 0.8.7

scop 0.8.6

  • feat:

    • Added RunGSVA() for gene set variation analysis and GSVAPlot() for visualization of GSVA results. Related issue #146 (@mengxu98).
    • RunMetabolism() * Added RunMetabolism() for single-cell metabolism pathway scoring with support for AUCell, GSVA, ssGSEA, and optional VISION, and MetabolismPlot() for visualization * RunMetabolism() now uses scMetabolism KEGG / Reactome metabolism pathway definitions to identify metabolism-related terms, then rebuilds pathway gene sets from updated PrepareDB() annotations, enabling cached database updates and cross-species metabolism scoring. Related issue #146 (@mengxu98).
    • Added RunDecontX() and integrated optional decontX ambient RNA decontamination into RunCellQC(), including contamination metadata, optional decontaminated assay output, and threshold-based QC filtering. Related issue #147 (@mengxu98).
  • fix:

    • FeatureStatPlot(): Fixed duplicated X/Y axis titles and main title when stack = TRUE with theme_args or title. Stack assembly now strips axis and plot titles from non-edge panels and draws a single shared ylab/title via gtable; theme styling from theme_args (e.g. axis.title.y, title/plot.title) is applied to these shared grobs. Related issue #145 (@PanSX-Dr).
  • docs:

    • Updated the README badge/logo.
  • data:

    • Removed the example datasets ifnb_sub, ref_scHCL, and ref_scZCL.

scop 0.8.5

  • feat:

    • Default palette changed from "Paired" to "Chinese". See thisplot::ChineseColors() for details.
    • Unified the cores parameter across multiple functions (DynamicHeatmap(), FeatureHeatmap(), GroupHeatmap(), and heatmap_enrichment()), ensuring cores is correctly threaded through to RunEnrichment().
    • RunMonocle2() and RunMonocle3(): Added xlab and ylab parameters, passed through to internal CellDimPlot() and FeatureDimPlot() calls.
    • ListDB(): Now supports multiple species in the species parameter simultaneously and adds Species and DB columns to the output data frame for clearer identification.
    • Moved is_outlier to thisutils::is_outlier().
    • configure_apple_silicon_env() (Python function): Added OpenMP compatibility handling on macOS arm64 by prepending environment lib paths to DYLD_FALLBACK_LIBRARY_PATH/DYLD_LIBRARY_PATH and preloading libomp.dylib/libiomp5.dylib via ctypes.CDLL(..., RTLD_GLOBAL) to reduce scanpy/python-igraph import conflicts.
    • scVI_integrate(): Unified parameter naming by renaming num_threads to cores for consistency across integration functions.
    • Added find_neighbors_and_clusters() and run_nonlinear_reduction() helper functions to unify operations across integration functions and reduce redundant code.
  • fix:

    • PrepareDB() uses AnimalTFDB4 for TF annotations and resolves a consistent MP archive date from the server index. Update hTFtarget and CSPA download sources (#76, #139, #140).
    • LIGER_integrate() * Migrated to the rliger 2.x workflow (rliger::runIntegration() + rliger::quantileNorm() on Seurat object) and now prepares/uses the ligerScaleData layer via rliger::scaleNotCenter() before integration. * Updated argument naming from LIGER_dims_use to liger_dims_use, and removed legacy quantile-normalization parameter compatibility mapping (ref_dataset), keeping reference as the supported interface.
    • Optimized the installation of some Python packages on Apple Silicon devices.
  • docs:

    • Updated README example code and visualizations. After regenerating figures, the package size was reduced by ~3 MB.

scop 0.8.4

  • fix:

    • FeatureStatPlot() / ExpressionStatPlot(): Fixed box and violin x-axis misalignment when add_box = TRUE with split.by. Groups with fewer than 2 observations are now filtered before violin density estimation (with a warning), and the violin layer uses a consistent position_dodge(width = 0.9) to match the boxplot. Related issue #123 (@oranges7).

scop 0.8.3

  • feat:

    • RunDynamicFeatures(): Added PreTSA method for dynamic feature fitting. The PreTSA algorithm in scop has been re implemented to support parallelization for higher performance. Original research: PreTSA: computationally efficient modeling of temporal and spatial gene expression patterns. Use fit_method = "pretsa" for B-spline-based piecewise truncated spline analysis; fit_method = "gam" (default) keeps generalized additive models. PreTSA supports knot (0 or "auto") and max_knot_allowed when knot = "auto". Relate issue #133.
    • CellDimPlot() and FeatureDimPlot(): Added legend.title parameter (default NULL) to control the legend title. When NULL, default titles are used (e.g. group name for CellDimPlot, feature or empty for FeatureDimPlot).
    • ExpressionStatPlot() and FeatureStatPlot(): Added legend.title parameter (default NULL) for single-legend plots. When NULL, the default title (e.g. keynm or feature/group name) is used. FeatureStatPlot() forwards legend.title to ExpressionStatPlot().
    • Moved StatPlot function to thisplot::StatPlot.
  • fix:

    • Differential expression plots (VolcanoPlot(), DEtestManhattanPlot(), DEtestRingPlot()): added only.pos = TRUE for positive-only visualization. DEtestManhattanPlot() now keeps the cell-type track centered at y = 0 and sizes the track from the nearest point distance around zero.
    • DynamicHeatmap() / heatmap_enrichment(): Fixed incorrect db handling when using custom TERM2GENE/TERM2NAME. Enrichment results with Database = "custom" could be incorrectly filtered by default db values (e.g. "GO_BP"), causing false “No term enriched using the threshold” warnings even when enrichment succeeded. Relate issue #133 (@1228849000).

scop 0.8.2

  • feat:

    • Add the DEtestPlot() function, which calls the original VolcanoPlot() and adds two plot types, Manhattan and Ring, controlled by the plot_type parameter (c("volcano", "manhattan", "ring"), default "volcano"). Add standalone functions DEtestManhattanPlot() and DEtestRingPlot() for direct use. Relate issue #121 (@ericavalentini).
    • Differential expression visualization (DEtestPlot(), VolcanoPlot(), DEtestManhattanPlot(), DEtestRingPlot()): added res parameter to accept existing DE results (data.frame). When res is provided, srt is ignored. Data processing supports: (1) group1 or cluster column for grouped plots; (2) no grouping column for a single panel; (3) gene names from row names when gene column is missing. Relate issue #129 (@mengxu98).
    • PrepareEnv(): Update version parameter to specify the Python version of the conda environment. Default is "3.11-1" on Windows and "3.10-1" on macOS and Unix. Relate issue #103 (@PanSX-Dr).
    • RunNMF(): Add the cores parameter for RunNMF() and optimize the printed message.
    • Removed the setting in Python functions that prevents drawing functions from causing R crashes.
  • fix:

scop 0.8.1

scop 0.8.0

  • feat:

    • RunMonocle2(): New function for performing Monocle2 trajectory analysis with support for various dimensionality reduction methods (DDRTree, ICA, tSNE, SimplePPT, L1-graph, SGL-tree). Uses the fixed version of monocle2 from mengxu98/monocle.
    • RunMonocle3(): New function for performing Monocle3 trajectory analysis with support for cell ordering, trajectory learning, and pseudotime computation.
    • RunCytoTRACE(): New scop implementation for running CytoTRACE 2 analysis to predict cellular potency scores and categories (Differentiated, Unipotent, Oligopotent, Multipotent, Pluripotent, Totipotent) with support for human and mouse species.
    • CytoTRACEPlot(): New function for visualizing CytoTRACE 2 analysis results.

scop 0.7.9

scop 0.7.8

  • feat:

    • adata_to_srt(): Removed automatic removal of “X_” prefix from dimensionality reduction names in obsm keys. The function now preserves original reduction names as they are stored in AnnData objects.
  • fix:

    • RunPalantir(): Fixed unused plot_format parameter error. The parameter is now properly excluded from arguments passed to Python functions. Relate issue #114 (@Moonerss).
    • RunSCVELO(): Fixed PAGA computation error by replacing scv.tl.paga with sc.tl.paga (scanpy implementation) for better stability. The function now uses the same PAGA implementation as RunPAGA() function.
    • RunCellRank(): Fixed GPCCA Schur decomposition error by adding fallback mechanism. When brandts method fails with “subspace_angles” error, the function automatically tries krylov method. If both methods fail, it automatically switches to CFLARE estimator for more robust computation.
    • RunCellRank(): Fixed recover_dynamics error by ensuring velocity_graph and velocity_graph_neg are properly set before calling scv.tl.recover_dynamics() for latent time computation.
  • data:

    • Reducing the size of pancreas_sub example dataset.

scop 0.7.7

  • feat:

    • adata_to_srt(): Enhanced to support multiple AnnData object types including Python AnnData objects (from scanpy/reticulate), R6 AnnData objects from the anndata package (AnnDataR6), and R6 AnnData objects from the anndataR package (InMemoryAnnData). Added internal helper functions get_adata_element() and get_adata_names() for better compatibility. Relate issues #67 (@lisch7), #91 (@mengxu98) and commit91#issuecomment.
  • fix:

    • RunDEtest(): Fixed error when comparing one cluster against multiple clusters using group1 and group2 parameters. Relate issue #111 (@zhaoxiaoyan9225).
    • AnnotateFeatures(): Fixed bug where the function would fail when processing GTF file annotations due to column name matching issues during data naming. The function now correctly handles column name intersections when merging annotation data.

scop 0.7.6

  • feat:

    • RunDM(): Added automatic PCA-based dimensionality reduction when using many features (>1000) to speed up diffusion map computation. The npcs parameter can be used to control the number of principal components used for pre-processing.

scop 0.7.5

  • feat:

    • RunDEtest(): Fixed compatibility issue with SeuratObject 5.0.0+ by replacing deprecated Assays() slot argument with LayerData(). Relate issue #100 (@mattizecos).
    • RunDM(): Added automatic PCA-based dimensionality reduction when using many features (>1000) to speed up diffusion map computation. The npcs parameter can be used to control the number of principal components used for pre-processing.
  • fix:

scop 0.7.3

  • feat:

    • RunCellTypist(): New function for cell type annotation using the CellTypist method.
    • CellTypistModels(): New function for downloading and managing CellTypist pre-trained models.

scop 0.7.2

  • feat:

    • RunCellRank(): Performance optimizations and code improvements.

scop 0.7.1

scop 0.7.0

  • feat:

    • PrepareEnv(): Integrated uv as the primary Python package installer for improved installation speed.
    • check_python(): Now uses uv as the primary installation tool with pip as fallback, significantly improving package installation speed.
    • Added find_uv() and install_uv() internal functions for managing uv package manager installation and detection.

scop 0.6.6

  • docs:

    • Standardize Roxygen return tags, Markdown parameter formatting, default descriptions and cross-references.

scop 0.6.5

  • feat:

    • PrepareEnv() configures Python thread limits and accepts required conda Terms of Service automatically, improving environment stability and setup (#85).
    • Multiple Python-based functions (RunPAGA, RunSCVELO, RunPalantir, RunCellRank, RunWOT, RunPHATE, RunPaCMAP, RunTriMap): Enhanced message formatting and code improvements.
    • PrepareSCExplorer(): Fixed package version dependency issues with shiny and bslib compatibility. The function now properly handles bslib theme configuration to work with both shiny 1.6.0 and 1.7.0+, addressing compatibility errors reported in #87.
  • fix:

    • Improved code formatting and consistency across multiple functions.
    • Enhanced Python functions in inst/python/functions.py with better error handling and message formatting.
  • docs:

    • Updated documentation for multiple functions to reflect code improvements.

scop 0.6.2

  • feat:

    • CellChatPlot(): Adjusted the size of saved figures for better file size optimization.
  • docs:

    • Updated README.md to remove references to Monocle2 and Monocle3 (deprecated functions).

scop 0.6.1

  • feat:

    • PrepareEnv(): Improved message formatting and simplified log output for better user experience.
    • Added get_conda_envs_dir() helper function to centralize conda environment directory retrieval.
    • RunIntegration(): Enhanced integration_method parameter definition with explicit method list for better code clarity.
  • fix:

    • Moved exist_python_pkgs() function to check_package.R for better code organization.
    • Replaced direct conda_info()$envs_dirs[1] calls with get_conda_envs_dir() helper function for consistency.
    • RunSCExplorer(): Updated to use thisplot::palette_list and thisplot::slim_data() instead of scop::palette_list and scop::slim_data().
  • docs:

    • Updated documentation across multiple functions.

scop 0.6.0

  • feat:

    • PrepareEnv(): Enhanced with environment caching mechanism to avoid redundant environment preparation. Improved message formatting and error handling.
    • Python-based functions (RunPAGA(), RunSCVELO(), RunPalantir(), RunCellRank(), RunWOT()) now automatically call PrepareEnv() internally, eliminating the need for users to manually prepare the Python environment before using these functions.
    • cluster_within_group2(): New function for clustering within groups.
    • Multiple plotting functions: Replaced geom_sankey() with ggsankey::geom_sankey() for better Sankey diagram support.
  • fix:

    • Removed RunMonocle() function and related documentation (RunMonocle2.Rd, RunMonocle3.Rd).
    • Removed projection_functions.R file (functions moved to other locations).
    • Replaced custom theme functions with thisplot::theme_this() (exported as theme_scop()).
    • Replaced direct log_message() calls with thisutils::log_message() for consistency.
    • Removed palette_list data object.
  • deps:

    • Moved cli from Suggests to Imports for better message formatting support.
    • Added thisplot to Imports for theme and utility functions.
    • Added ggsankey to Suggests for Sankey diagram support.
    • Added remote dependencies: theislab/destiny, mengxu98/thisplot.
    • Removed unused dependencies: Biobase, BiocGenerics, concaveman, DDRTree, glmGamPoi, hexbin, monocle, png, ragg, tidyr.
  • docs:

    • Updated documentation across multiple functions to reflect code refactoring.
    • Improved code organization and maintainability.

scop 0.5.5

  • fix:

    • Fixed VelocityPlot() function error in plot_type = "grid" mode: replaced vectorized arrow length with fixed-length arrows (using mean length) to resolve vapply() error that occurred when grid::arrow() received a vector instead of a single value, see #74.

scop 0.5.4

scop 0.5.3

  • feat:

    • PrepareDB(): Changed default Ensembl_version parameter from 103 to NULL for more flexible version handling.
    • Added Python version log_message() for Python-based functions (RunSCVELO(), RunPAGA(), RunPalantir(), RunCellRank(), RunWOT()) and added verbose parameter inheritance and improved message formatting through cli formatting.
  • fix:

    • Delete harmonizomeapi.py file.
    • Move scop_analysis.py into a single functions.py file in inst/python/ for better code organization and maintainability.
  • docs:

    • Improved parameter documentation consistency.

scop 0.5.1

  • docs:

    • Improved reference formatting and consistency across multiple functions.
    • Enhanced documentation clarity and readability.

scop 0.5.0

  • feat:

    • RunCellChat(): New function to perform CellChat analysis for investigating cell-to-cell communication with support for human, mouse, and zebrafish species.
    • CellChatPlot(): New function to visualize CellChat analysis results with various plot types and customization options.
    • Multiple integration functions: Improved error messages and message formatting for better user experience.
  • fix:

    • Removed some example figures to optimize package installation size.
  • deps:

    • Added CellChat package dependency with remote repository jinworks/CellChat.
  • docs:

    • Updated README.md with improved code formatting and examples.
    • Enhanced documentation for cell communication analysis functions.
    • Improved error messages and user guidance across integration functions.

scop 0.4.0

  • feat:

    • RunProportionTest(): New function to perform Monte-carlo permutation test for quantifying cell proportion differences between conditions.
    • ProportionTestPlot(): New function to generate proportion test plots with customizable significance thresholds and visualization options.
    • Multiple Python-based functions: add \dontrun{} blocks for Github workfolw checking.
  • docs:

    • Added comprehensive documentation for new proportion testing functions.
    • Enhanced example documentation across multiple functions.
    • Updated package documentation and examples.

scop 0.3.4

  • docs:

    • Updated workflow examples and function documentation.

scop 0.3.3

  • feat:

    • Multiple functions: Improved parameter documentation formatting and consistency across the package.

scop 0.3.2

  • feat:

    • GetFeaturesData() and AddFeaturesData(): Enhanced argument clarity, added input validation, and standardized return values for Seurat, Assay, and Assay5 objects.
    • CellCorHeatmap(): - Renamed parameters: query_cell_annotation → query_annotation, ref_cell_annotation → ref_annotation. - Improved error message formatting through cli formatting. - Simplified variable assignments and improved readability.
  • docs:

    • Comprehensive documentation updates across multiple functions including AnnotateFeatures, CellDimPlot, CellStatPlot, FeatureStatPlot, GroupHeatmap, RunCellQC, and others.
    • Improved parameter descriptions and function clarity.

scop 0.3.1

  • feat:

    • EnrichmentPlot() and GSEAPlot(): Removed conditional font face styling (face = ifelse() logic) for better text rendering consistency. Set the default value of lineheight from 0.5 to 0.7.
    • Updated reexports functionality.
  • docs:

    • Updated documentation formatting and consistency.

scop 0.3.0

  • feat:

    • Fixed segmentation faults and R crashes on M-series MacBook when running Python functions.
    • RunPAGA(): Enhanced with M-series MacBook detection and automatic environment configuration.
    • RunSCVELO(): Added ARM64-specific optimizations to prevent crashes and ensure stable execution.
    • RunCellRank(): Implemented M-series compatibility with proper NUMBA configuration.
    • RunPalantir(): Added ARM64 support with single-threaded execution mode.
    • RunWOT(): Enhanced with M-series MacBook environment variable settings.
    • RunTriMap(): Added M-series MacBook compatibility for dimensionality reduction.
    • RunPaCMAP(): Implemented ARM64-specific environment configuration.
    • RunPHATE(): Added M-series MacBook support for non-linear dimensionality reduction.
    • RunCellQC(): Enhanced both scrublet and doubletdetection functions with ARM64 compatibility.
  • docs:

    • Updated function documentation to reflect M-series MacBook compatibility.
    • Added technical notes about ARM64 architecture considerations.

scop 0.2.9

  • fix:

  • docs:

    • Updated documentation for some functions.

scop 0.2.7

  • feat:

  • data:

    • Delete lifemap data, including: lifemap_cell, lifemap_compartment and lifemap_organ.
    • Reconstructed the sample data for both panc8_sub and pancreas_sub, retaining only the basic Seurat object.

scop 0.2.6

  • feat:

    • Added remove_r() function for easy remove R packages.
    • Rename function: RemovePackages() to remove_python().
    • Delete useless import packages: BBmisc, BiocManager, covr, devtools, promises and withr.
    • Optimize the structure of _pkgdown.yml file.
  • docs:

    • Updated documentation for some functions.

scop 0.2.5

  • feat:

    • Rename function: palette_scop() to palette_colors().

scop 0.2.4

  • feat:

    • Rename functions: check_srt_merge() to CheckDataMerge(), check_srt_list() to CheckDataList and check_data_type() to CheckDataType.

scop 0.2.2

scop 0.2.0

  • feat:

  • fix:

    • Corrected an issue in py_to_r2() function (intrinsic function), which ensures that Python-dependent functions like RunPAGA() and RunSCVELO() function run correctly.

scop 0.1.9

scop 0.1.5

scop 0.1.4

  • feat:

    • Update .onAttach(), now .onAttach() will print more information about conda and Python.
    • Update PrepareEnv() function for easy add or update a conda environments and install Python packages.
    • Added ListEnv() and RemoveEnv() functions for easy management of conda environment and Python packages.

scop 0.1.3

scop 0.0.9

  • fix:

    • Fix a bug for PrepareEnv() function.
    • The default Python version is now set to 3.10-1.

scop 0.0.6

scop 0.0.5

  • data:

    • Updated the pancreas_sub and panc8_sub test datasets to the Seurat v5 object format.

scop 0.0.1

  • feat:

    • Initial release.