Changelog
Source:NEWS.md
Matisse 0.1.0
Phase 6 (April 2026): unify event input, drop junction_data
-
CreateMatisseObject()now takes a singleeventsparameter that accepts either a SUPPA2.ioepath (or vector of paths) or a pre-builtdata.frame. The previousioe_filesandevent_dataparameters are removed — Matisse auto-dispatches on input class. The IOE-precedence warning that gated the two-parameter form (P14) is gone, since the conflict isn’t possible anymore. -
junction_dataparameter dropped (P7). Per-junction genomic coordinates are auto-parsed from junction IDs at construction and written toseurat[["isoform"]][[]](the isoform assay’s feature-metadata table). Supported ID formats:chr-start-end-strand,chr:start-end:strand,chr_start_end_strand. Names that don’t match get NA coords with a warning — counts still work, only sashimi plots degrade. -
Renamed event-annotation columns:
inclusion_junctions/exclusion_junctions→inclusion_features/exclusion_features(mode-agnostic — they hold junction IDs in junction mode, transcript IDs in transcript mode). -
PlotSashiminow reads junction coords fromseurat[["isoform"]][[]]instead ofobj@misc[["junction_data"]].
Code-review pass (April 2026): API surface tightened, several bug fixes
This release applies a multi-phase code-review pass that simplifies the API surface, fixes four real correctness bugs, and refactors event annotation storage so it lives natively inside the embedded Seurat object.
Architectural changes
- Per-event annotation now lives in
seurat[["psi"]]@meta.data(the Assay5 feature-metadata table), accessed via the[[ ]]API. Previously stored inMatisseObject@misc[["event_data"]]. Single source of truth — annotation rides with the assay through any subset/merge automatically. -
CreateMatisseObject()now folds the PSI calculation into construction by default. The two-step “construct thenCalculatePSI” flow collapses to one. Passdefer_psi = TRUEto skip the PSI step (rare; for power users who want to inspect intermediate state).min_coverageparameter added to the constructor. -
MatisseObject@misc[["event_data_path"]]records the source path of the event annotation (normalized) for provenance, orNA_character_when annotation was passed as adata.framedirectly.
Breaking API changes
-
Removed accessor wrappers (use the native Seurat API instead):
-
GetJunctionCounts(obj)→Matrix::t(SeuratObject::GetAssayData(GetSeurat(obj)[["isoform"]], "counts")) -
GetTranscriptCounts(obj)→SeuratObject::GetAssayData(GetSeurat(obj)[["isoform"]], "counts") -
GetInclusionCounts(obj)→Matrix::t(SeuratObject::GetAssayData(GetSeurat(obj)[["psi"]], "counts")) -
GetExclusionCounts(obj)→Matrix::t(SeuratObject::GetAssayData(GetSeurat(obj)[["psi"]], "exclusion")) -
GetEventData(obj)→GetSeurat(obj)[["psi"]][[]](post-CalculatePSI) -
GetJunctionData(obj)→obj@misc[["junction_data"]] -
AddIsoformMetadata(obj, df)→SeuratObject::AddMetaData(matisse_obj, df)(S3 method delegates)
-
-
Removed
BuildSimpleEvents(). Matisse no longer ships a heuristic event caller. Junction-mode users must bring an external event annotation (SUPPA2 IOE, rMATS, or equivalent), as transcript-mode already requiresioe_files. -
Single-event MatisseObjects are no longer representable. SeuratObject’s
Assay5requires at least 2 features, so the[operator now errors when an event subset would leave fewer than 2 events. For single-event values, useGetPSI(obj)[, event_id]directly.
Bug fixes
-
MatisseMeta(obj) <- valuepreviously wrote columns by positional index, silently writing the wrong values whenvalue’s rownames disagreed withmeta.data’s ordering. Now delegates toSeuratObject::AddMetaDatafor proper barcode alignment. -
rlang::abort()was being called with multiple positional string arguments at 8 sites; this silently truncated the message and consumed the second string as the error class. All sites collapsed to a single string so the full message reaches the user. -
cli::cli_alert_*()had the same multi-arg truncation bug at 5 sites (the second string isid, not message-continuation). Fixed. -
SCTransform.MatisseObjectreferencedobject@mode == "event", but the slot isinput.modeand valid values are"junction"/"transcript". The function crashed on every call; it was untested. The default assay in transcript mode also pointed to a non-existent"transcript"assay (the actual assay name is"isoform"). Both fixed; new tests cover both modes.
Removed dead code
-
.psi_rowmeans_sparse(utils.R) — only caller was its own test. -
.parse_junction_list(psi.R) — never called;.calculate_psi_matrixinlined the same logic. -
na_fillparameter — declared onCalculatePSIand threaded through the implementation, but never actually applied. Removed in P5.
Matisse 0.1.0 (initial release)
- New
MatisseObjectS4 class wrapping aSeuratobject with isoform-resolved layers: junction counts, PSI matrix, inclusion/exclusion counts, event and junction annotation tables, and per-cell isoform metadata. -
CreateMatisseObject(): primary constructor with input validation and automatic cell-barcode alignment. -
CalculatePSI(): computes PSI matrices from junction count data and splice event definitions. Supports bothMatisseObjectand bare matrix input. -
SummarizePSI(): per-event summary statistics (mean, median, sd, coverage). -
FilterCells()andFilterEvents(): threshold-based filtering with informative removal summaries. - Visualization:
PlotUMAP(),PlotViolin(),PlotHeatmap(),PlotSashimi(). -
MergeMatisse(): concatenate twoMatisseObjects with cell-prefix deduplication. - GitHub Actions workflows for R CMD check (multi-OS), pkgdown website deployment, and test coverage reporting.