Skip to content

What changed in 2.0

salmon 2.0 is a from-scratch Rust rewrite. It keeps the same core workflow (salmon indexsalmon quantquant.sf) and the same output formats downstream tools consume, but it is a new major version and makes some breaking changes. This page maps C++ options and behavior to 2.0.

quant.sf is unchanged (drop-in for tximport/tximeta). Inferential replicates (aux_info/bootstrap/… for both --numBootstraps and --numGibbsSamples) are written in the same format C++ salmon used, so tximport/fishpond/swish keep working. The bias-model diagnostic dumps in aux_info/ are in a documented Rust format (see the output format specification); they are not consumed by the standard downstream R packages.

C++2.0
salmon alevinRemoved. Use the alevin-fry ecosystem for single-cell. salmon alevin … prints a redirect and exits.

Passing any of these errors out with a pointer to this guide. They are gone because the underlying feature was removed or has no equivalent in 2.0.

OptionSubcommandWhy / alternative
--featuresindexIndex-feature dump not supported by the cf1-rs/piscem-rs index builder.
--mimicBT2, --mimicStrictBT2quantbowtie2-mimicking presets removed; selective alignment is the single supported mode.
--minAssignedFragsquantThe “zero the output below N assigned fragments” guard was removed; 2.0 reports what it quantifies.
--alternativeInitMode, --bootstrapReproject, --noGammaDrawquantInference-internal toggles not present in the 2.0 optimizer/Gibbs implementation.
--numBiasSamplesquant2.0 collects bias samples online (abundance-aware, dual-phase), so a fixed sample budget no longer applies.
--auxTargetFile, --writeOrphanLinksquant -aRemoved alignment-mode features.

These still parse so existing scripts run; 2.0 logs a warning and ignores them (the behavior is either the default now or handled differently).

  • index: --filterSize
  • quant: --eqclasses, --noFragLengthDist, --noSingleFragProb, --mismatchSeedSkip, --disableChainingHeuristic, --hitFilterPolicy, --maxRecoverReadOcc, --validateMappings (selective alignment is the default)
  • quant -a: --mappingCacheMemoryLimit, -s/--sampleOut, -u/--sampleUnaligned, --writeQualities
  • --sketch — alignment-free pseudoalignment mode (faster). See mapping modes.
  • --sketchStrictOrphans — in --sketch, only orphan a pair when the other mate had no matching k-mers at all (the conservative rule). The default is the relaxed rule, which tracks selective alignment more closely.
  • --allowDovetail — now honored in --sketch as well.
  • --ignoreTxVersion — compare -g/--geneMap identifiers without their trailing .N version suffix, as tximport’s option of the same name does. Off by default. See Ensembl cDNA + GTF.
  • Sketch orphan rule defaults to the relaxed policy (see --sketchStrictOrphans).
  • -g/--geneMap: unmatched transcripts are reported differently, not aggregated differently. As in C++ salmon’s aggregateEstimatesToGeneLevel, a transcript with no gene-map entry is emitted as its own single-transcript gene, named after the transcript, so nothing quantified is dropped on the way to gene level and tximport can apply its own transcript-to-gene policy to the whole file. What changed is the reporting: C++ warned once per unmatched transcript (half a million lines on a failed join), while 2.x warns once with the count and writes the names to aux_info/genemap_unmatched_txps.json, under an unmatched_transcripts key. That file is removed when nothing is unmatched, so its presence always refers to the current run. 2.x additionally warns when the match rate is at or below 50%, says how many transcripts would match without the version suffix, and names --ignoreTxVersion. A quant.genes.sf whose rows are mostly stand-ins is transcript-level output under a gene-level file name; the run’s closing line says so explicitly when any row is a stand-in.
  • Selective-alignment chain pruning: 2.0 defaults --orphanChainSubThresh and --postMergeChainSubThresh to 0.0 (off) — it aligns every candidate, marginally more sensitive than C++ (0.95 / 0.9). Quantification is essentially unaffected (per-transcript Pearson ≈ 0.999); pass --orphanChainSubThresh 0.95 --postMergeChainSubThresh 0.9 to reproduce C++ mapping counts exactly.

-p is accepted unchanged, but from 2.5.0 it names one execution-slot budget shared between mapping and gzip decompression, rather than a mapping-thread count with decompression taken on top. C++ salmon (and 2.x before 2.5.0) could run more total threads than -p on compressed input; 2.5.0 stays within the budget and divides it from live measurement. Totals and results are unaffected; wall time on compressed input may differ from what the old accounting produced at the same -p. See threads and compressed input.

Index/quant basics, quant.sf, cmd_info.json, lib_format_counts.json, aux_info/meta_info.json, --libType/-l, --seqBias, --gcBias, --posBias, --numBootstraps, --numGibbsSamples, --useEM, --dumpEq, decoys, and salmon quantmerge.