# Migrating from C++ salmon (≤ 1.12.0) to salmon 2.0 (Rust) salmon 2.0 is a from-scratch Rust rewrite. It keeps the same core workflow (`salmon index` → `salmon quant` → `quant.sf`) and the same output formats that downstream tools consume, but it is a new major version and makes some breaking changes. This guide maps C++ options/behavior to 2.0. ## Breaking change: rebuild your index **2.0 uses a new index format and cannot read C++ (pufferfish) indices.** Rebuild with `salmon index` from 2.0; loading a C++ index (or pointing C++ salmon at a 2.0 index) is detected and rejected with a clear error. `quant.sf` is unchanged (drop-in for tximport/tximeta). Inferential replicates (`aux_info/bootstrap/{names.tsv.gz,bootstraps.gz}` 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/` (`obs/exp*_seq.gz`, `obs/exp_gc.gz`, `obs/exp*_pos.gz`, `fld.gz`) are in a documented Rust format (see the docs site); they are not consumed by the standard downstream R packages. ## Removed subcommands | C++ | 2.0 | | --- | --- | | `salmon alevin` | Removed. Use the [alevin-fry](https://github.com/COMBINE-lab/alevin-fry) ecosystem for single-cell. `salmon alevin …` prints this redirect and exits. | ## Removed options (produce an error + this note) 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. | Option | Subcommand | Why / alternative | | --- | --- | --- | | `--features` | index | Index-feature dump not supported by the cf1-rs/piscem-rs index builder. | | `--mimicBT2`, `--mimicStrictBT2` | quant | bowtie2-mimicking presets removed; 2.0's selective alignment is the single supported mode. | | `--minAssignedFrags` | quant | The "zero the output below N assigned fragments" guard was removed; 2.0 reports what it quantifies. | | `--alternativeInitMode`, `--bootstrapReproject`, `--noGammaDraw` | quant | Inference-internal toggles not present in the 2.0 optimizer/Gibbs implementation. | | `--numBiasSamples` | quant | 2.0 collects bias samples online (abundance-aware dual-phase), so a fixed sample budget no longer applies. | | `--auxTargetFile`, `--writeOrphanLinks` | quant -a | Removed alignment-mode features. | ## Accepted but ignored (parse + warn) 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). - global: `--no-version-check` (and the `SALMON_NO_VERSION_CHECK` environment variable) — accepted **before or after** the command (e.g. `salmon --no-version-check quant …`), matching C++. It is a silent no-op: 2.0 never contacts the network to check for a newer release. - index: `--filterSize` - quant: `--eqclasses`, `--noFragLengthDist`, `--noSingleFragProb`, `--mismatchSeedSkip`, `--disableChainingHeuristic`, `--hitFilterPolicy`, `--maxRecoverReadOcc`, `--validateMappings` (selective alignment is the default) - quant -a: `--mappingCacheMemoryLimit`, `-s/--sampleOut`, `-u/--sampleUnaligned`, `--writeQualities` ## New in 2.0 - `--sketch` — alignment-free pseudoalignment mode (faster; quantifies directly from k-mer/equivalence-class hits). - `--sketchStrictOrphans` — in `--sketch`, only orphan a pair when the other mate had no matching k-mers (the conservative rule). Default is the relaxed rule (orphan when the other mate has no consistent target), which tracks selective alignment more closely. - `--allowDovetail` — now honored in `--sketch` as well (admits dovetailed short-insert fragments). - `--ignoreTxVersion` — compare `-g/--geneMap` identifiers without their trailing `.N` version suffix, as tximport's option of the same name does. Off by default. Needed for an Ensembl cDNA index against an Ensembl GTF, where the FASTA carries the version in the identifier and the GTF puts it in a separate `transcript_version` attribute. ## Behavior differences to be aware of - **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`. Note that 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 currently defaults `--orphanChainSubThresh` and `--postMergeChainSubThresh` to `0.0` (off) — it aligns every candidate, which is marginally more sensitive than C++ (which uses `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. See `docs/mapping-parity-differences.md`. ## Unchanged Index/quant basics, `quant.sf`, `cmd_info.json`, `lib_format_counts.json`, `aux_info/meta_info.json`, `--libType/-l`, `--threads/-p`, `-k/--kmerLen`, `-m/--minimizerLen`, `-n/--no-clip` (poly-A clipping, on by default), `--seqBias`, `--gcBias`, `--posBias`, `--numBootstraps`, `--numGibbsSamples`, `--useEM`, `--meta` (metagenomic preset), `--dumpEq`, decoys, and `salmon quantmerge`.