You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
--soloUMIfiltering MultiGeneUMI_All is aliased to MultiGeneUMI (matches neither STAR nor the docs) #144
--soloUMIfiltering MultiGeneUMI_All currently resolves to the same behaviour as MultiGeneUMI:
// src/solo/count.rs:124-125// MultiGeneUMI_All behaves like MultiGeneUMI for the count matrix."MultiGeneUMI" | "MultiGeneUMI_All" => Ok(Self::MultiGeneUmi),
(same alias documented at src/params/mod.rs:1090).
That is neither what STAR 2.7.11b does nor what the option is documented to do, so rustar is currently the only one of the three behaviours that nobody asked for.
What STAR 2.7.11b actually does
In STAR, MultiGeneUMI_All is a no-op. The option is parsed and stored, but the consumption site tests only the MultiGeneUMI flag, so selecting MultiGeneUMI_All alone leaves the multi-gene UMI filter entirely disabled. The counts you get are the unfiltered counts.
What it is documented to do
STAR's documentation describes the two as:
MultiGeneUMI: remove the lower-count gene's reads when a UMI is assigned to more than one gene.
MultiGeneUMI_All: when a UMI is assigned to more than one gene, remove it from all of those genes, not just the losers.
So MultiGeneUMI_All is strictly more aggressive than MultiGeneUMI. Aliasing it to MultiGeneUMI silently under-filters; STAR's own no-op silently does not filter at all.
Three options
Reproduce STAR's no-op. Maximum byte-fidelity: a run with --soloUMIfiltering MultiGeneUMI_All matches STAR exactly. Also means the flag does nothing, which will surprise anyone who reads the STAR docs.
Implement the documented behaviour (split the enum variant, drop cross-gene UMIs from every gene they touch). Diverges from STAR on this one flag, with a documented entry and a locking test.
Status quo (alias to MultiGeneUMI). Matches neither.
a separate UmiFiltering::MultiGeneUmiAll variant rather than an alias;
an entry in a new docs-old/dev/divergences.md recording the deviation and the reason;
test_solo_multigene_umi_all_drops_cross_gene_umis asserting the correct result, never STAR's no-op.
Only the MultiGeneUMI_All path changes; the default (-) and the other modes produce identical output. If option 1 is preferred instead, the test asserts the behaviour either way and inverting it is a one-line change.
Already done on main, so closing with the evidence rather than opening a PR for it.
UmiFiltering::MultiGeneUmiAll is its own variant, not an alias: src/solo/count.rs:123, parsed at :135, and acted on at :941 (a multi-gene UMI is removed from every gene, which is what the option is documented to do).
The divergence from STAR — where the flag is a no-op, because its consumption site tests a different flag — is recorded in DIVERGENCE.md §1.2, with the ParametersSolo.cpp line numbers and the note that inverting the choice is a one-line change since the test asserts the behaviour either way.
Unit tests cover it directly (src/solo/count.rs:2633 and :2642): a UMI in two genes is kept by MultiGeneUMI, kept by MultiGeneUMI_CR, and dropped from both genes by MultiGeneUMI_All.
The one thing that was missing is an end-to-end check that the flag reaches the count matrix rather than only the filter function; #243 adds that for the neighbouring MultiGeneUMI_CR and 1MM_multi_Nbase_pseudocounts, which is where the same class of bug (#172) actually bit.
Activity
fix(solo): implement MultiGeneUMI_All instead of aliasing it to Multi…
Batch PRs #173, #175, #156, #158, #152 (#212)
BenjaminDEMAILLE commentedon Aug 27, 2026
Already done on
main, so closing with the evidence rather than opening a PR for it.UmiFiltering::MultiGeneUmiAllis its own variant, not an alias:src/solo/count.rs:123, parsed at:135, and acted on at:941(a multi-gene UMI is removed from every gene, which is what the option is documented to do).DIVERGENCE.md§1.2, with theParametersSolo.cppline numbers and the note that inverting the choice is a one-line change since the test asserts the behaviour either way.src/solo/count.rs:2633and:2642): a UMI in two genes is kept byMultiGeneUMI, kept byMultiGeneUMI_CR, and dropped from both genes byMultiGeneUMI_All.The one thing that was missing is an end-to-end check that the flag reaches the count matrix rather than only the filter function; #243 adds that for the neighbouring
MultiGeneUMI_CRand1MM_multi_Nbase_pseudocounts, which is where the same class of bug (#172) actually bit.