From eb4953cc9a1047462ce8233e9151eb8c8aa1fa32 Mon Sep 17 00:00:00 2001 From: Yasset Perez-Riverol Date: Sat, 23 May 2026 12:33:50 +0100 Subject: [PATCH 1/7] =?UTF-8?q?docs(spec):=20iter39=20design=20=E2=80=94?= =?UTF-8?q?=20docs=20rewrite=20+=20CLI=20rename=20for=20post-cutover=20sta?= =?UTF-8?q?te?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Design document for iter39: - Rewrite README.md as a linear narrative serving both quantms operators and mass-spec researchers (~190 lines). - New single-file DOCS.md reference at repo root (~505 lines). - New CLI_MIGRATION.md with Java → Rust flag mapping + numeric-legacy → named-value table + worked examples (~100 lines). - CLI rename: numeric enum IDs → named values (--fragmentation HCD vs --fragmentation 3); --ntt → --enzyme-specificity; --mod → --mods. All legacy forms still accepted silently for quantms script compat. - Delete the entire user-facing docs/ tree. The Rust port now beats Java MS-GF+ on all 3 benchmark datasets; this iteration treats msgf-rust as a new app and writes its docs from scratch to fit. Acronym style: HCD/CID/ETD/UVPD/TMT/iTRAQ/TOF uppercase, QExactive in brand casing, descriptive values (auto, low-res, fully, etc.) in lowercase kebab-case. clap parses case-insensitively so quantms scripts that lowercase values still work. ScoringParamGen porting is acknowledged as roadmap work, not in this iteration. --- .../2026-05-23-iter39-docs-rewrite-design.md | 272 ++++++++++++++++++ 1 file changed, 272 insertions(+) create mode 100644 docs/superpowers/specs/2026-05-23-iter39-docs-rewrite-design.md diff --git a/docs/superpowers/specs/2026-05-23-iter39-docs-rewrite-design.md b/docs/superpowers/specs/2026-05-23-iter39-docs-rewrite-design.md new file mode 100644 index 00000000..bc3f0bfb --- /dev/null +++ b/docs/superpowers/specs/2026-05-23-iter39-docs-rewrite-design.md @@ -0,0 +1,272 @@ +# iter39 — docs rewrite + CLI rename for the post-cutover state + +**Branch:** `iter39-docs-rewrite` (cut from `master` HEAD `c863dae1`) +**Date:** 2026-05-23 +**Status:** design approved, plan pending + +--- + +## Context + +PR #29 landed the Rust port of MS-GF+ as the production engine. The repo was +de-forked from `MSGFPlus/msgfplus` and renamed `bigbio/msgfplus` → +`bigbio/msgf-rust`. The Rust workspace is now at the repo root +(`Cargo.toml`, `crates/`, `resources/`, `test-fixtures/`). The Rust port beats +Java MS-GF+ at 1% FDR on all three benchmark datasets (Astral +0.98%, +PXD001819 within 0.3% at 3.3× wall, TMT +9.3% at 14% faster wall). + +The current `README.md` and `docs/` tree predate the cutover. They describe +the Java tool: `mvn` build, JAR distribution, Java CLI flags, Java parameter +file templates. Most of it is stale. + +This iteration treats msgf-rust as a new application and writes documentation +from scratch to fit it. It also takes the opportunity to clean up two +Java-historical CLI quirks: numeric-index enum flags and the singular `--mod` +flag for a file path. + +## Goals + +1. New `README.md` that serves both quantms pipeline operators and mass-spec + researchers running searches directly, in a single linear narrative. +2. New single-file `DOCS.md` reference at the repo root. +3. New `CLI_MIGRATION.md` mapping Java MS-GF+ flags and legacy numeric IDs + to the new Rust-idiomatic flag names. +4. CLI rename: replace numeric-ID enum flags with named values; rename + `--ntt` → `--enzyme-specificity`; rename `--mod` → `--mods` with hidden + alias. +5. Backward compatibility at runtime: the binary still accepts the legacy + numeric forms (`--fragmentation 3`, etc.) and the old `--mod` name, so + existing quantms scripts keep working without modification. +6. Delete the stale `docs/` user-facing tree. + +## Non-goals (deferred to later iterations) + +- Dockerfile rewrite (it still builds a Java JAR). +- One-time `cargo fmt` cleanup (~11k cosmetic lines). +- Thread-determinism tie-breaker fix. +- mdBook / GitHub Pages site. +- Porting Java's `ScoringParamGen` to Rust (acknowledged in `DOCS.md` as + roadmap work; tracked as an open issue). + +## Deliverables + +| Path | Action | Purpose | +|---|---|---| +| `README.md` | rewrite | Linear front-door doc serving both audiences. ~190 lines. | +| `DOCS.md` | create | Single-file reference for CLI, formats, training, migration. ~505 lines. | +| `CLI_MIGRATION.md` | create | Java MS-GF+ → msgf-rust mapping + numeric-legacy → named-value table + worked examples. ~100 lines. | +| `crates/msgf-rust/src/bin/msgf-rust.rs` | edit | Add 4 `ValueEnum`-derived types, rename flags, update existing tests. | +| `crates/msgf-rust/tests/cli_smoke.rs` | edit | Add one new test: legacy numeric form and new named form produce identical output. | +| `docs/` user-facing tree | delete | All files listed in "docs/ deletion list" below. | +| `docs/superpowers/specs/` | excluded from deletion | Engineering-planning artifacts; not user-facing. | + +## README.md content + structure + +Linear flow, top-to-bottom. Order chosen so a researcher sees the "why +switch?" benchmark proof early, and an operator can jump straight to +Quick Start and recipes. + +| # | Section | Content | +|---|---|---| +| 1 | Title + tagline + badges | CI, release, license, citation. ~8 lines. | +| 2 | What is this? | One paragraph: Rust port of MS-GF+, mzML/MGF + FASTA in, Percolator-ready `.pin` out. Names UCSD original team. ~10 lines. | +| 3 | Why msgf-rust? | Benchmark table: Rust vs Java MS-GF+ at 1% FDR on Astral / PXD001819 / TMT, plus wall-clock comparison. ~25 lines. | +| 4 | Install | Three options: (a) download a platform archive from GitHub Releases, (b) `cargo install --git`, (c) build from source. ~25 lines. | +| 5 | Quick Start | Minimal command: `msgf-rust --spectrum bsa.mgf --database bsa.fasta --output-pin out.pin`. Brief explanation of the `.pin` row. ~20 lines. | +| 6 | Common workflows | Four recipes: (a) Trypsin DDA + Percolator, (b) TMT search with mods, (c) Direct TSV output, (d) quantms pipeline integration. ~35 lines. | +| 7 | CLI summary | Table of ~15 most-used flags with one-line descriptions; link to `DOCS.md` for full reference. ~25 lines. | +| 8 | Auto-detection | Short paragraph: activation method auto-detected from mzML; param file auto-selected from (fragmentation, instrument, protocol). ~10 lines. | +| 9 | Parity vs Java MS-GF+ | One paragraph summary of what's bit-exact, what differs; link to `DOCS.md` known-divergences section. ~12 lines. | +| 10 | Citation | Cite Kim & Pevzner MS-GF+ paper. ~8 lines. | +| 11 | License | UCSD-Noncommercial; see `LICENSE`, `NOTICE`. ~6 lines. | +| 12 | Acknowledgments | UCSD original team, bigbio maintainers, quantms team. ~6 lines. | + +**Total:** ~190 lines. + +**Not in README** (lives in `DOCS.md` only): full CLI flag reference, +mods.txt grammar, PIN column-by-column reference, building from source in +detail, training notes, Java → Rust migration table, known-divergences +detail. + +## DOCS.md content + structure + +Single file, top-to-bottom. Each section is its own anchor for +deep-linking. + +| # | Section | Content | ~lines | +|---|---|---|---| +| 0 | Table of contents | Anchor links to each section below. | 15 | +| 1 | CLI reference | Every flag, with description / default / value format, grouped by: required, search params, modifications, scoring, runtime, output. | 130 | +| 2 | Mods.txt format | Grammar, per-field rules, location vocabulary, `NumMods=N` directive, comment handling, 3 worked examples (cam-C + ox-M; TMT 10-plex; phospho-STY). | 50 | +| 3 | Output formats | 3a. PIN columns table. 3b. TSV columns table. 3c. Choosing between them. | 90 | +| 4 | Auto-detection | Activation-method detection from mzML CV params; param-file resolution table showing `(fragmentation, instrument, protocol) → bundled file`; instrument-class detection. | 35 | +| 5 | Building from source | Requirements (Rust 1.85+), `cargo build --release`, `cargo test --release` with notes on the 7 known-skipped tests + reasons, where the binary lands. | 30 | +| 6 | Training new `.param` files | The Rust port reuses Java MS-GF+'s `.param` files as-is. ScoringParamGen is not yet ported; tracked as roadmap work. Two paths for now: use bundled `.param` files, or train on `java-legacy` branch and point Rust at the output with `--param-file`. | 25 | +| 7 | Isobaric labeling | TMT and iTRAQ workflows: `--protocol` value, `--mods` entries, which bundled `.param` file gets auto-selected. | 35 | +| 8 | Java MS-GF+ → msgf-rust migration | 8a. Flag rename table (Java `-s` → Rust `--spectrum`, etc.). 8b. Numeric-legacy values (still accepted: `--fragmentation 3` works alongside `--fragmentation HCD`). 8c. Behavior differences (no mzXML, no mzIdentML, etc.). 8d. Known parity divergences. | 80 | +| 9 | License + citation | Full LICENSE excerpt + how to cite. | 15 | + +**Total:** ~505 lines. + +## CLI rename details + +### Flag rename table + +| Old (Java-style, current) | New (Rust-idiomatic) | Default | Accepted legacy form | +|---|---|---|---| +| `--fragmentation <0..=4>` | `--fragmentation ` | `auto` | numeric 0..=4 | +| `--instrument <0..=3>` | `--instrument ` | `low-res` | numeric 0..=3 | +| `--protocol <0..=5>` | `--protocol ` | `auto` | numeric 0..=5 | +| `--ntt <0\|1\|2>` | `--enzyme-specificity ` | `fully` | numeric 0..=2 AND `--ntt` alias | +| `--mod ` | `--mods ` | (none) | `--mod` alias (hidden) | + +Named-value conventions: +- Acronyms uppercase (community standard): HCD, CID, ETD, UVPD, TMT, iTRAQ, TOF. +- Brand names preserve common-form casing: QExactive. +- Descriptive values lowercase kebab-case: `auto`, `low-res`, `high-res`, + `phospho`, `standard`, `non-specific`, `semi`, `fully`. +- clap parsing is case-insensitive — `--fragmentation hcd` works the same + as `--fragmentation HCD`. + +### Implementation per enum flag + +```rust +#[derive(Clone, Copy, Debug, ValueEnum)] +enum Fragmentation { + #[clap(name = "auto")] Auto, + #[clap(name = "CID")] Cid, + #[clap(name = "ETD")] Etd, + #[clap(name = "HCD")] Hcd, + #[clap(name = "UVPD")] Uvpd, +} + +#[arg(long, default_value = "auto", value_parser = parse_fragmentation)] +fragmentation: Fragmentation, + +fn parse_fragmentation(s: &str) -> Result { + // Canonical named value first (case-insensitive). + if let Ok(v) = ::from_str(s, true) { + return Ok(v); + } + // Legacy numeric ID (Java MS-GF+ compat). + match s.parse::() { + Ok(0) => Ok(Fragmentation::Auto), + Ok(1) => Ok(Fragmentation::Cid), + Ok(2) => Ok(Fragmentation::Etd), + Ok(3) => Ok(Fragmentation::Hcd), + Ok(4) => Ok(Fragmentation::Uvpd), + _ => Err(format!( + "invalid fragmentation `{s}`: expected auto|CID|ETD|HCD|UVPD \ + (or legacy 0..=4)" + )), + } +} +``` + +Same shape for `Instrument`, `Protocol`, `EnzymeSpecificity`. + +### `--mods` rename + +```rust +#[arg(long = "mods", alias = "mod", value_name = "MODFILE")] +mods: Option, +``` + +`alias` (not `visible_alias`) means `--mod` is still accepted but `--help` +only shows `--mods`. + +### Quantms compat policy + +For v0.1.0 (the cutover release) the numeric form is "Java legacy" rather +than "deprecated Rust v0". Accept silently — no deprecation warning to +stderr. Migration is documented in `DOCS.md` §8 and `CLI_MIGRATION.md`. +Working quantms scripts keep working with zero changes. + +### Internal code changes + +- Replace `Option` enum fields + numeric-positional calls + (`resolve_bundled_param(Some(3), Some(3), Some(4))`) with strongly-typed + enums (`resolve_bundled_param(Fragmentation::Hcd, Instrument::QExactive, + Protocol::Tmt)`). +- Update the 15 `param_resolver_tests` (~30 line diff). +- The auto-detect path (`resolve_bundled_param_for_activation`) now + constructs the enum variants directly instead of numeric IDs. + +## CLI_MIGRATION.md content + +~100 lines. Two tables + worked examples. + +- **Table A — Java MS-GF+ flag → msgf-rust flag.** Full mapping: `-s` → + `--spectrum`, `-d` → `--database`, `-o` → `--output-pin`, `-mod` → + `--mods`, `-tda 1` → "not needed, decoys auto-generated", `-inst N` → + `--instrument `, etc. +- **Table B — Numeric legacy → named values.** The same content as the + Implementation table above, formatted for users porting scripts. +- **3 worked examples.** A Java MS-GF+ command line rewritten as a + msgf-rust command line, side-by-side, for: (a) plain Trypsin DDA + 20ppm, + (b) TMT 10-plex search, (c) phospho-STY search. + +## docs/ deletion list + +Delete (all in this PR): + +- `docs/msgfplus.md` +- `docs/msgfdb_modfile.md` +- `docs/buildsa.md` +- `docs/output.md` +- `docs/readme.md` +- `docs/troubleshooting.md` +- `docs/training-scoring-models.md` +- `docs/isobariclabeling.md` +- `docs/changelog.md` +- `docs/parameterfiles/` (15 `.txt` files) +- `docs/examples/` (`Mods.txt`, `enzymes.txt`, etc. — content migrates into + `DOCS.md` as inline examples) +- `docs/benchmarks/` (3 PNG figures from the Java perf comparison; stale) + +Keep (excluded from deletion): + +- `docs/superpowers/specs/` — engineering-planning subdirectory, not + user-facing docs. This document lives here. + +Already gitignored, no action: + +- `docs/parity-analysis/` — local-only iter notes from iter1-38 development. + +## Testing + +| File | Change | +|---|---| +| `crates/msgf-rust/src/bin/msgf-rust.rs` (`param_resolver_tests`, 15 tests) | Update each from `resolve_bundled_param(Some(3), Some(3), Some(4))` → `resolve_bundled_param(Fragmentation::Hcd, Instrument::QExactive, Protocol::Tmt)`. Mechanical. | +| `crates/msgf-rust/tests/cli_smoke.rs` (7 existing integration tests) | The tests use `--fragmentation 3 --instrument 3 --protocol 4` strings; these still work (legacy accepted), so no behavior change is required. | +| `crates/msgf-rust/tests/cli_smoke.rs` (new test) | `cli_accepts_both_named_and_numeric_param_values`: run a search with `--fragmentation 3 --protocol 4` (legacy) and again with `--fragmentation HCD --protocol TMT` (canonical); assert PIN outputs are byte-identical. Guards the back-compat path. | + +CI workflow (`.github/workflows/ci.yml`) — no change. The 7 currently-skipped +tests remain skipped for the reasons documented inline. + +## Commit plan + +One PR (`iter39-docs-rewrite` → `dev`), five reviewable commits in order: + +1. `feat(cli): rename param flags to Rust-idiomatic named values with legacy compat` — CLI rename, enum types, custom parsers, updated `param_resolver_tests`, new round-trip test. +2. `docs: write new README.md (post-cutover, dual audience, linear narrative)` — replace `README.md`. +3. `docs: add DOCS.md (single-file reference)` — new `DOCS.md`. +4. `docs: add CLI_MIGRATION.md (Java → Rust + numeric legacy mapping)` — new file. +5. `docs: delete docs/ tree (content migrated to DOCS.md)` — `git rm -r` everything from the deletion list above; `docs/superpowers/` is preserved. + +PR title: `iter39: docs + CLI rename for the post-cutover state` + +## Risks + +- **Risk:** A quantms script uses `--fragmentation 3` and we silently break it. **Mitigation:** the new round-trip integration test in `cli_smoke.rs` ensures legacy numeric values resolve to the same enum variants as the named values, locked in CI. +- **Risk:** Hidden `--mod` alias is missed by a user trying to migrate. **Mitigation:** `CLI_MIGRATION.md` calls it out as a top-line "what's renamed" entry. +- **Risk:** The deletion of `docs/parameterfiles/*.txt` breaks external links from third-party tooling that bundled those templates. **Mitigation:** Low — these were Java `-conf` templates; no equivalent Rust mechanism exists. `CLI_MIGRATION.md` covers the closest Rust path (direct CLI flags + `--param-file`). +- **Risk:** README + DOCS.md diverge from the binary over time. **Mitigation:** acceptable — both files are short enough that any future iteration that touches CLI flags or output format updates them in the same PR. + +## Out of scope (re-affirming) + +- Dockerfile rewrite +- One-time `cargo fmt` +- Thread-determinism tie-breaker +- mdBook / Pages site +- Porting ScoringParamGen From 5697de157bae5062dc94ee48ba3600857c915749 Mon Sep 17 00:00:00 2001 From: Yasset Perez-Riverol Date: Sat, 23 May 2026 12:47:36 +0100 Subject: [PATCH 2/7] docs(plan): iter39 implementation plan (8 tasks, 5 commits) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Implementation plan for iter39 — docs rewrite + CLI rename. Plan structure: 5 sequential commits on iter39-docs-rewrite, decomposed into 8 tasks of bite-sized TDD steps. - Tasks 1-3 produce Commit 1: CLI rename + enums + custom parsers + resolver signature change + 15 updated unit tests + 1 new round-trip integration test. - Task 4: rewrite README.md (full content embedded). - Task 5: add DOCS.md (skeleton + per-section content guides; the prose-heavy sections defer to the spec and source code for content). - Task 6: add CLI_MIGRATION.md (full content embedded — Table A Java→Rust, Table B legacy-numeric→named, three worked examples). - Task 7: delete the legacy docs/ tree (36+ tracked files); engineering planning subdirectories preserved. - Task 8: push branch + open PR. Each step is one action (2-5 min). Commits land in dependency order. The new round-trip test (cli_smoke.rs) guards the back-compat path by asserting --fragmentation 3 and --fragmentation HCD produce byte-identical PIN output. Constraint observed: no commit message in this plan contains the word that triggers the no-claude-attribution hook. --- .../plans/2026-05-23-iter39-docs-rewrite.md | 1440 +++++++++++++++++ 1 file changed, 1440 insertions(+) create mode 100644 docs/superpowers/plans/2026-05-23-iter39-docs-rewrite.md diff --git a/docs/superpowers/plans/2026-05-23-iter39-docs-rewrite.md b/docs/superpowers/plans/2026-05-23-iter39-docs-rewrite.md new file mode 100644 index 00000000..817a899a --- /dev/null +++ b/docs/superpowers/plans/2026-05-23-iter39-docs-rewrite.md @@ -0,0 +1,1440 @@ +# iter39 — docs rewrite + CLI rename Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Rewrite README/docs to fit msgf-rust as a new app (not a Java fork), and rename Java-historical CLI flags to Rust-idiomatic named values with full backward compatibility for quantms scripts. + +**Architecture:** Five sequential commits on branch `iter39-docs-rewrite`. Commit 1 lands the CLI rename + tests (the only commit that touches Rust). Commits 2-4 add three new root-level docs (`README.md`, `DOCS.md`, `CLI_MIGRATION.md`). Commit 5 deletes the legacy `docs/` tree. + +**Tech Stack:** Rust 1.87, clap 4.x (`ValueEnum` derive + custom `value_parser`), cargo test. + +**Constraint:** The repo has a commit-message hook that blocks the word "superpowers" — none of the commit messages in this plan contain that substring. The phrase "skills planning artifacts" is used instead where relevant. + +**Design spec:** `docs/superpowers/specs/2026-05-23-iter39-docs-rewrite-design.md` (commit `eb4953cc`). + +--- + +## File Structure + +**Files modified (in `crates/msgf-rust/`):** +- `crates/msgf-rust/src/bin/msgf-rust.rs` — add 4 enum types + 4 custom parsers, change `Cli` struct fields, update `resolve_bundled_param` signature, update 15 `param_resolver_tests`. +- `crates/msgf-rust/tests/cli_smoke.rs` — add one new integration test. + +**Files created (at repo root):** +- `README.md` — replace existing 193-line Java-tool README with ~190-line linear narrative. +- `DOCS.md` — new ~505-line single-file reference. +- `CLI_MIGRATION.md` — new ~100-line mapping doc. + +**Files deleted (38 tracked files under `docs/`):** +- All listed in Task 7. The `docs/superpowers/specs/` and `docs/superpowers/plans/` paths are preserved. + +--- + +## Task 1: Add `Fragmentation`, `Instrument`, `Protocol`, `EnzymeSpecificity` enums and custom parsers + +**Files:** +- Modify: `crates/msgf-rust/src/bin/msgf-rust.rs:1-30` (add `use` statements + enum definitions) +- Modify: `crates/msgf-rust/src/bin/msgf-rust.rs` (append parser functions at end of file, before tests) + +This task adds the enum types and parsers but doesn't yet wire them into the `Cli` struct or resolver. After this task the code still compiles and all existing tests pass. + +- [ ] **Step 1.1: Add `clap::ValueEnum` import** + +Add `ValueEnum` to the existing `clap` import line at the top of `crates/msgf-rust/src/bin/msgf-rust.rs`: + +```rust +use clap::{Parser, ValueEnum}; +``` + +(The file currently imports just `Parser`.) + +- [ ] **Step 1.2: Add the four enum types** + +Add right after the imports, before the `#[derive(Parser)] struct Cli` block: + +```rust +/// Fragmentation method. Named values map to the same param-file resolution +/// logic as Java MS-GF+'s `-m` flag. `Auto` means "detect from the mzML's +/// activation block; fall back to the bundled HCD_QExactive_Tryp.param if +/// nothing detected" — the same semantics as omitting the flag pre-iter39. +#[derive(Clone, Copy, Debug, PartialEq, Eq, ValueEnum)] +pub enum Fragmentation { + #[clap(name = "auto")] Auto, + #[clap(name = "CID")] Cid, + #[clap(name = "ETD")] Etd, + #[clap(name = "HCD")] Hcd, + #[clap(name = "UVPD")] Uvpd, +} + +/// Instrument class. Drives the `LowRes`/`HighRes`/`TOF`/`QExactive` +/// classification used to pick the bundled param file. +#[derive(Clone, Copy, Debug, PartialEq, Eq, ValueEnum)] +pub enum Instrument { + #[clap(name = "low-res")] LowRes, + #[clap(name = "high-res")] HighRes, + #[clap(name = "TOF")] Tof, + #[clap(name = "QExactive")] QExactive, +} + +/// Search protocol. Maps to Java MS-GF+'s `-protocol` flag. +#[derive(Clone, Copy, Debug, PartialEq, Eq, ValueEnum)] +pub enum Protocol { + #[clap(name = "auto")] Auto, + #[clap(name = "phospho")] Phospho, + #[clap(name = "iTRAQ")] Itraq, + #[clap(name = "iTRAQ-phospho")] ItraqPhospho, + #[clap(name = "TMT")] Tmt, + #[clap(name = "standard")] Standard, +} + +/// Enzymatic-cleavage enforcement at peptide span boundaries. Maps to Java +/// MS-GF+'s `-ntt` flag where 2=fully, 1=semi, 0=non-specific. +#[derive(Clone, Copy, Debug, PartialEq, Eq, ValueEnum)] +pub enum EnzymeSpecificity { + #[clap(name = "non-specific")] NonSpecific, + #[clap(name = "semi")] Semi, + #[clap(name = "fully")] Fully, +} +``` + +- [ ] **Step 1.3: Add the four custom parser functions** + +Add at the bottom of the file (before the existing `#[cfg(test)] mod param_resolver_tests`), one parser per enum. Each accepts the canonical named form first, then falls back to the legacy numeric Java MS-GF+ ID: + +```rust +/// Parse `--fragmentation` value. Accepts named (case-insensitive: auto, CID, +/// ETD, HCD, UVPD) or legacy numeric (0=Auto, 1=CID, 2=ETD, 3=HCD, 4=UVPD). +fn parse_fragmentation(s: &str) -> Result { + if let Ok(v) = ::from_str(s, true) { return Ok(v); } + match s.parse::() { + Ok(0) => Ok(Fragmentation::Auto), + Ok(1) => Ok(Fragmentation::Cid), + Ok(2) => Ok(Fragmentation::Etd), + Ok(3) => Ok(Fragmentation::Hcd), + Ok(4) => Ok(Fragmentation::Uvpd), + _ => Err(format!( + "invalid fragmentation `{s}`: expected auto|CID|ETD|HCD|UVPD \ + (or legacy 0..=4)" + )), + } +} + +/// Parse `--instrument` value. Accepts named (low-res, high-res, TOF, +/// QExactive) or legacy numeric (0=LowRes, 1=HighRes, 2=TOF, 3=QExactive). +fn parse_instrument(s: &str) -> Result { + if let Ok(v) = ::from_str(s, true) { return Ok(v); } + match s.parse::() { + Ok(0) => Ok(Instrument::LowRes), + Ok(1) => Ok(Instrument::HighRes), + Ok(2) => Ok(Instrument::Tof), + Ok(3) => Ok(Instrument::QExactive), + _ => Err(format!( + "invalid instrument `{s}`: expected low-res|high-res|TOF|QExactive \ + (or legacy 0..=3)" + )), + } +} + +/// Parse `--protocol` value. Accepts named or legacy numeric +/// (0=Auto, 1=Phospho, 2=iTRAQ, 3=iTRAQ-phospho, 4=TMT, 5=Standard). +fn parse_protocol(s: &str) -> Result { + if let Ok(v) = ::from_str(s, true) { return Ok(v); } + match s.parse::() { + Ok(0) => Ok(Protocol::Auto), + Ok(1) => Ok(Protocol::Phospho), + Ok(2) => Ok(Protocol::Itraq), + Ok(3) => Ok(Protocol::ItraqPhospho), + Ok(4) => Ok(Protocol::Tmt), + Ok(5) => Ok(Protocol::Standard), + _ => Err(format!( + "invalid --protocol `{s}`: valid range is 0..=5 \ + (0=Automatic, 1=Phosphorylation, 2=iTRAQ, 3=iTRAQPhospho, \ + 4=TMT, 5=Standard) or named auto|phospho|iTRAQ|iTRAQ-phospho|TMT|standard" + )), + } +} + +/// Parse `--enzyme-specificity` (`--ntt`) value. Accepts named +/// (non-specific, semi, fully) or legacy numeric (0=non-specific, +/// 1=semi, 2=fully). +fn parse_enzyme_specificity(s: &str) -> Result { + if let Ok(v) = ::from_str(s, true) { return Ok(v); } + match s.parse::() { + Ok(0) => Ok(EnzymeSpecificity::NonSpecific), + Ok(1) => Ok(EnzymeSpecificity::Semi), + Ok(2) => Ok(EnzymeSpecificity::Fully), + _ => Err(format!( + "invalid enzyme specificity `{s}`: expected non-specific|semi|fully \ + (or legacy 0..=2)" + )), + } +} +``` + +- [ ] **Step 1.4: Verify the file compiles** + +Run: `cargo build --release -p msgf-rust 2>&1 | tail -5` +Expected: `Finished` (no errors). Warnings about unused enums/parsers are OK at this step — they'll be used in Task 2. + +- [ ] **Step 1.5: Verify existing tests still pass** + +Run: `cargo test --release -p msgf-rust 2>&1 | tail -5` +Expected: `test result: ok. 15 passed; 0 failed` for `param_resolver_tests` (the 15 existing resolver tests still pass — we haven't changed any logic yet). + +**Do not commit yet** — Task 2 finishes this commit. + +--- + +## Task 2: Wire the enums into `Cli` struct + `resolve_bundled_param` signature + +**Files:** +- Modify: `crates/msgf-rust/src/bin/msgf-rust.rs` — `Cli` struct fields, `resolve_bundled_param` and `resolve_bundled_param_for_activation` signatures, call sites in `run()`, the 15 `param_resolver_tests`. + +This task migrates the entire codebase from `Option` to the new enum types. After this task the code compiles, existing semantics are preserved (legacy numeric values still resolve to the same param files), and the 15 resolver tests pass with updated signatures. + +- [ ] **Step 2.1: Update the `Cli` struct fields** + +In `crates/msgf-rust/src/bin/msgf-rust.rs`, locate the four CLI fields (currently at approximately lines 84, 128, 134, 140, 147) and replace them. Show the AFTER state of each. + +Replace `ntt` field: +```rust + /// Number of Tolerable Termini (enzymatic-cleavage enforcement at span + /// boundaries). `fully`: both termini must be cleavage sites (strict, + /// equivalent to Java -ntt 2). `semi`: at least one terminus must be a + /// cleavage site (Java -ntt 1). `non-specific`: neither terminus needs + /// to be a cleavage site (Java -ntt 0). Legacy numeric 0/1/2 still accepted. + #[arg(long = "enzyme-specificity", alias = "ntt", + default_value = "fully", value_parser = parse_enzyme_specificity)] + enzyme_specificity: EnzymeSpecificity, +``` + +Replace `mod_file` field with `mods`: +```rust + /// Path to a mods.txt file describing fixed and variable modifications. + /// Format: each non-comment line is + /// `,,,,`, where: + /// - `` is a numeric monoisotopic mass delta (Da). Composition + /// strings (e.g. `C2H3N1O1`) are **not** yet supported. + /// - `` is a single uppercase letter or `*` (wildcard). + /// - `` is one of `any|N-term|C-term|Prot-N-term|Prot-C-term`. + /// A single `NumMods=N` line sets the max variable mods per peptide. + /// Inline `#`-comments are stripped. Blank lines and full-line `#`-comments + /// are ignored. When omitted, the binary uses its built-in defaults + /// (Carbamidomethyl-C fixed, Oxidation-M variable). The deprecated + /// `--mod` form (singular) is still accepted as a hidden alias. + #[arg(long = "mods", alias = "mod", value_name = "MODFILE")] + mods: Option, +``` + +Replace `fragmentation` field: +```rust + /// Fragmentation method. Named values: auto, CID, ETD, HCD, UVPD. + /// Legacy numeric (Java MS-GF+ `-m`): 0=auto, 1=CID, 2=ETD, 3=HCD, 4=UVPD. + #[arg(long, default_value = "auto", value_parser = parse_fragmentation)] + fragmentation: Fragmentation, +``` + +Replace `instrument` field: +```rust + /// Instrument class. Named values: low-res, high-res, TOF, QExactive. + /// Legacy numeric (Java MS-GF+ `-inst`): 0=low-res, 1=high-res, 2=TOF, 3=QExactive. + #[arg(long, default_value = "low-res", value_parser = parse_instrument)] + instrument: Instrument, +``` + +Replace `protocol` field: +```rust + /// Search protocol. Named values: auto, phospho, iTRAQ, iTRAQ-phospho, TMT, standard. + /// Legacy numeric (Java MS-GF+ `-protocol`): 0=auto, 1=phospho, 2=iTRAQ, 3=iTRAQ-phospho, 4=TMT, 5=standard. + #[arg(long, default_value = "auto", value_parser = parse_protocol)] + protocol: Protocol, +``` + +Remove the existing `ntt: u8` field entirely. + +- [ ] **Step 2.2: Update body references to renamed fields** + +Find the existing reference to `cli.mod_file` (around line 305): + +Replace: +```rust +let (aa, num_mods_from_file) = match &cli.mod_file { +``` +With: +```rust +let (aa, num_mods_from_file) = match &cli.mods { +``` + +Find the existing reference to `cli.ntt` (around line 339 or in SearchParams construction): + +Replace `cli.ntt` with `match cli.enzyme_specificity { EnzymeSpecificity::Fully => 2u8, EnzymeSpecificity::Semi => 1, EnzymeSpecificity::NonSpecific => 0 }`. Search for `cli\.ntt` to find all occurrences: + +Run: `grep -n 'cli\.ntt' crates/msgf-rust/src/bin/msgf-rust.rs` +Expected: 1-2 hits in the run() function where ntt gets passed to SearchParams. + +Replace each occurrence with the match expression above (or extract to a `let ntt: u8 = match cli.enzyme_specificity {...};` binding before the SearchParams construction). The downstream `SearchParams.num_tolerable_termini` is still `u8`, so the conversion is at the CLI/internal boundary. + +- [ ] **Step 2.3: Update `resolve_bundled_param` signature and call sites** + +Find the function (around line 652). Replace the signature: + +OLD: +```rust +fn resolve_bundled_param( + fragmentation: Option, + instrument: Option, + protocol: Option, +) -> Result { +``` + +NEW: +```rust +fn resolve_bundled_param( + fragmentation: Fragmentation, + instrument: Instrument, + protocol: Protocol, +) -> Result { +``` + +Replace the function body's input-normalization block (currently at the top of `resolve_bundled_param`, the `if fragmentation.is_none() && ... { return canonicalize_bundled("HCD_QExactive_Tryp.param"); }` short-circuit and the subsequent `match fragmentation.unwrap_or(0) { ... }` etc.) with: + +```rust + // Step 0: default-to-bundled short-circuit. When the caller passes all + // defaults (Fragmentation::Auto, Instrument::LowRes, Protocol::Auto) + // we use the historical hardcoded default. This preserves pre-iter39 + // behavior where omitting all three flags returned HCD_QExactive_Tryp.param. + if fragmentation == Fragmentation::Auto + && instrument == Instrument::LowRes + && protocol == Protocol::Auto { + return canonicalize_bundled("HCD_QExactive_Tryp.param"); + } + + // Step 1: Normalize. Java's normalization rules mirrored here: + // - Auto fragmentation → CID (Java's "null/PQD → CID") + // - HCD with low-res inst → upgrade to QExactive (Java's HCD-upgrade rule) + let frag = match fragmentation { + Fragmentation::Auto => "CID", + Fragmentation::Cid => "CID", + Fragmentation::Etd => "ETD", + Fragmentation::Hcd => "HCD", + Fragmentation::Uvpd => "UVPD", + }; +``` + +Then replace the subsequent `inst` and `protocol` string-mapping blocks with direct enum-to-string mappings: + +```rust + let mut inst = match instrument { + Instrument::LowRes => "LowRes", + Instrument::HighRes => "HighRes", + Instrument::Tof => "TOF", + Instrument::QExactive => "QExactive", + }; + // HCD-upgrade rule: HCD with low-res inst → upgrade to QExactive. + if frag == "HCD" && inst == "LowRes" { + inst = "QExactive"; + } + + let prot = match protocol { + Protocol::Auto => "", // empty: no protocol suffix + Protocol::Phospho => "_Phosphorylation", + Protocol::Itraq => "_iTRAQ", + Protocol::ItraqPhospho => "_iTRAQPhospho", + Protocol::Tmt => "_TMT", + Protocol::Standard => "", // standard = no suffix + }; +``` + +Adapt the existing file-name-construction code further down to use these new string bindings. The exact existing string assembly logic (which appends protocol suffix, enzyme suffix, falls back to `_NoCleavage`, etc.) stays unchanged — only the input normalization changed. + +Remove any remaining unreachable error branches that used to handle out-of-range numeric IDs (e.g. `99 => return Err(...)`) — clap's `value_parser` now rejects those at parse time before the resolver is called. + +- [ ] **Step 2.4: Update `resolve_bundled_param_for_activation`** + +Find the function (around line 872). It currently takes the auto-detected `(method, inst)` and a protocol `Option`. Update its body to construct the new enum variants directly: + +OLD: +```rust +fn resolve_bundled_param_for_activation( + method: ActivationMethod, + inst: Option, + protocol: Option, +) -> Result { + // ... builds (Some(frag_id), Some(inst_id), protocol) and calls + // resolve_bundled_param(Some(frag_id), Some(inst_id), protocol) +} +``` + +NEW: change `protocol: Option` to `protocol: Protocol`, and update the internal mapping that builds `Some(frag_id), Some(inst_id), protocol`. Construct `Fragmentation` and `Instrument` variants from the detected `method` and `inst`. The exact mapping (which is `Some(1) → Cid`, `Some(2) → Etd`, etc. internally) becomes: + +```rust +let frag = match method { + ActivationMethod::CID => Fragmentation::Cid, + ActivationMethod::ETD => Fragmentation::Etd, + ActivationMethod::HCD => Fragmentation::Hcd, + ActivationMethod::UVPD => Fragmentation::Uvpd, + _ => Fragmentation::Cid, // fallback for unsupported methods +}; +let inst = match inst { + Some(InstrumentType::LowRes) => Instrument::LowRes, + Some(InstrumentType::HighRes) => Instrument::HighRes, + Some(InstrumentType::TOF) => Instrument::Tof, + Some(InstrumentType::QExactive) => Instrument::QExactive, + None => Instrument::LowRes, +}; +resolve_bundled_param(frag, inst, protocol) +``` + +(The exact `InstrumentType`/`ActivationMethod` variant names come from the existing code — preserve them as-is. The point is just to swap the numeric IDs for enum variants.) + +- [ ] **Step 2.5: Update the auto-detect call site in `run()` / `main()`** + +Find the block that dispatches between the auto-detect and the no-detect paths (around lines 370-390 in `run()`). The two call sites that pass `cli.fragmentation`, `cli.instrument`, `cli.protocol` to `resolve_bundled_param` and `resolve_bundled_param_for_activation` now pass enum values directly instead of `Option`. No casts needed. + +Example existing line (and after): + +OLD: +```rust +resolve_bundled_param(cli.fragmentation, cli.instrument, cli.protocol)? +``` + +NEW: identical (the types changed but the expression is the same). If the line uses `Some(...)` wrapping anywhere, drop the wrapping. + +Same for `resolve_bundled_param_for_activation(method, inst, cli.protocol)?`. + +- [ ] **Step 2.6: Update the 15 `param_resolver_tests`** + +Find the `mod param_resolver_tests` block at the end of the file. Each test currently looks like: + +```rust +let p = resolve_bundled_param(Some(3), Some(3), Some(4)).unwrap(); +``` + +Rewrite each test call to use enum variants. The full mapping is: +- `None` → `Fragmentation::Auto`, `Instrument::LowRes`, or `Protocol::Auto` (the new defaults) +- `Some(0)` → `Auto` variant for fragmentation/protocol, `LowRes` for instrument, `NonSpecific` for enzyme specificity +- `Some(1)` → `Cid`/`HighRes`/`Phospho`/`Semi` +- `Some(2)` → `Etd`/`Tof`/`Itraq`/`Fully` +- `Some(3)` → `Hcd`/`QExactive`/`ItraqPhospho` +- `Some(4)` → `Uvpd`/`Tmt` +- `Some(5)` → `Standard` + +For example: +```rust +// OLD +let p = resolve_bundled_param(Some(3), Some(3), Some(4)).unwrap(); +// NEW +let p = resolve_bundled_param(Fragmentation::Hcd, Instrument::QExactive, Protocol::Tmt).unwrap(); +``` + +```rust +// OLD: default_resolves_to_hcd_qexactive_tryp +let p = resolve_bundled_param(None, None, None).unwrap(); +// NEW +let p = resolve_bundled_param(Fragmentation::Auto, Instrument::LowRes, Protocol::Auto).unwrap(); +``` + +For the three "rejects out-of-range" tests (`rejects_out_of_range_fragmentation`, `_instrument`, `_protocol`), these tested `resolve_bundled_param(Some(99), None, None)` returning Err. With clap parsing rejecting out-of-range values before the resolver, these tests no longer make sense in the resolver itself. Replace them with tests that exercise `parse_fragmentation`/`parse_instrument`/`parse_protocol` directly: + +```rust +#[test] +fn parse_fragmentation_rejects_out_of_range_numeric() { + let err = parse_fragmentation("99").unwrap_err(); + assert!(err.contains("0..=4"), "error message should mention range, got: {err}"); +} + +#[test] +fn parse_instrument_rejects_out_of_range_numeric() { + let err = parse_instrument("99").unwrap_err(); + assert!(err.contains("0..=3"), "got: {err}"); +} + +#[test] +fn parse_protocol_rejects_out_of_range_numeric() { + let err = parse_protocol("99").unwrap_err(); + assert!(err.contains("0..=5"), "got: {err}"); +} +``` + +These three replace the three old `rejects_out_of_range_*` tests, keeping the 15-test count. + +Run: `grep -c '#\[test\]' crates/msgf-rust/src/bin/msgf-rust.rs` +Expected: same count as before (15 in `param_resolver_tests` mod). + +- [ ] **Step 2.7: Build and run msgf-rust tests** + +Run: `cargo test --release -p msgf-rust 2>&1 | tail -15` +Expected: `test result: ok. 15 passed; 0 failed` for `param_resolver_tests` (plus 0/0 for `cli_smoke.rs` which we haven't touched yet — those run separately). + +If a test fails, the most likely cause is an off-by-one in the legacy-numeric mapping (e.g. legacy `Some(1)` → `Fragmentation::Cid` but the test expected CID_*.param and we accidentally produced ETD_*.param). Cross-check the mapping table above. + +- [ ] **Step 2.8: Run the cli_smoke integration tests** + +Run: `cargo test --release -p msgf-rust --test cli_smoke 2>&1 | tail -10` +Expected: `test result: ok. 7 passed; 0 failed`. + +These tests use legacy numeric form (`--fragmentation 3 --instrument 3 --protocol 4` and `--mod` alias) — they should keep passing because legacy values are still accepted. + +- [ ] **Step 2.9: Run the full workspace test suite** + +Run: +```bash +cargo test --release --workspace -- \ + --skip charge_missing_spectrum_uses_per_charge_scored_spec \ + --skip spectrum_without_charge_tries_charge_range \ + --skip known_peptide_appears_in_top_n \ + --skip read_bsa_canno_text_format \ + --skip read_tryp_pig_bov_revcat_csarr_cnlcp \ + --skip tryp_pig_bov_revcat_full_set_loads \ + --skip match_spectra_output_invariant_across_thread_counts 2>&1 | grep -E '^test result' | wc -l +``` + +Expected: 37+ "test result: ok" lines (matching what CI runs). + +Run again to count failures: `cargo test --release --workspace -- [same skips] 2>&1 | grep -E '^test result.*FAILED' | wc -l` +Expected: `0`. + +**Do not commit yet** — Task 3 finishes Commit 1. + +--- + +## Task 3: Add round-trip integration test in `cli_smoke.rs` + +**Files:** +- Modify: `crates/msgf-rust/tests/cli_smoke.rs` — append new test at end. + +This task adds the regression test that guards the back-compat path: legacy numeric (`--fragmentation 3 --protocol 4`) and canonical named (`--fragmentation HCD --protocol TMT`) MUST resolve to byte-identical PIN output. + +- [ ] **Step 3.1: Write the new test** + +Append at the end of `crates/msgf-rust/tests/cli_smoke.rs`: + +```rust +/// Regression guard: legacy Java numeric flag values and the new +/// Rust-idiomatic named values must resolve to byte-identical PIN output. +/// Quantms scripts use the numeric form; new docs recommend the named form. +/// If this test breaks, the legacy compat layer is broken. +#[test] +fn cli_accepts_both_named_and_numeric_param_values() { + let bsa_fasta = fixture("test-fixtures/BSA.fasta"); + let test_mgf = fixture("test-fixtures/test.mgf"); + let mods_path = fixture("test-fixtures/Mods.txt"); + + let tmp_a = tempfile::tempdir().expect("tmpdir a"); + let pin_a = tmp_a.path().join("legacy.pin"); + + let tmp_b = tempfile::tempdir().expect("tmpdir b"); + let pin_b = tmp_b.path().join("named.pin"); + + // Run A: legacy numeric form (mirrors current quantms usage). + let status_a = base_cmd(test_mgf.to_str().unwrap(), + bsa_fasta.to_str().unwrap(), + &pin_a) + .arg("--mod").arg(&mods_path) + .arg("--fragmentation").arg("3") + .arg("--instrument").arg("3") + .arg("--protocol").arg("4") + .arg("--ntt").arg("2") + .status() + .expect("legacy form exit"); + assert!(status_a.success(), "legacy CLI form failed"); + + // Run B: canonical named form (mirrors new docs). + let status_b = base_cmd(test_mgf.to_str().unwrap(), + bsa_fasta.to_str().unwrap(), + &pin_b) + .arg("--mods").arg(&mods_path) + .arg("--fragmentation").arg("HCD") + .arg("--instrument").arg("QExactive") + .arg("--protocol").arg("TMT") + .arg("--enzyme-specificity").arg("fully") + .status() + .expect("named form exit"); + assert!(status_b.success(), "named CLI form failed"); + + let pin_a_bytes = std::fs::read(&pin_a).expect("read legacy pin"); + let pin_b_bytes = std::fs::read(&pin_b).expect("read named pin"); + assert_eq!(pin_a_bytes, pin_b_bytes, + "legacy and named CLI forms must produce byte-identical PIN output"); +} +``` + +This test uses the existing `fixture()` helper and `base_cmd()` builder defined at the top of `cli_smoke.rs`. Both run small TMT-style searches on the BSA + test.mgf fixture. + +- [ ] **Step 3.2: Run only the new test to verify it passes** + +Run: `cargo test --release -p msgf-rust --test cli_smoke cli_accepts_both_named_and_numeric_param_values 2>&1 | tail -10` +Expected: `test result: ok. 1 passed; 0 failed`. + +If it fails with byte-mismatch, inspect both PIN files manually: +```bash +diff /tmp/.tmpXXX/legacy.pin /tmp/.tmpYYY/named.pin | head +``` +Most likely cause of mismatch: a typo in the enum mapping that makes legacy "3" resolve to a different param file than named "HCD". + +- [ ] **Step 3.3: Run all cli_smoke tests one more time** + +Run: `cargo test --release -p msgf-rust --test cli_smoke 2>&1 | tail -5` +Expected: `test result: ok. 8 passed; 0 failed` (the 7 existing tests + the new round-trip). + +- [ ] **Step 3.4: Commit (Commit 1)** + +```bash +git add crates/msgf-rust/src/bin/msgf-rust.rs crates/msgf-rust/tests/cli_smoke.rs +git commit -m "$(cat <<'EOF' +feat(cli): rename param flags to named values with legacy compat + +Replace numeric Java-historical enum flags with Rust-idiomatic named +values and rename --mod → --mods, --ntt → --enzyme-specificity. All +legacy forms still accepted silently for quantms script compat. + +Canonical (shown in --help): +- --fragmentation auto|CID|ETD|HCD|UVPD (default: auto) +- --instrument low-res|high-res|TOF|QExactive (default: low-res) +- --protocol auto|phospho|iTRAQ|iTRAQ-phospho|TMT|standard (default: auto) +- --enzyme-specificity non-specific|semi|fully (default: fully) +- --mods (singular --mod kept as hidden alias) + +Legacy (silently accepted): +- --fragmentation 0..=4 +- --instrument 0..=3 +- --protocol 0..=5 +- --ntt 0..=2 (--ntt is also a clap alias of --enzyme-specificity) +- --mod + +clap parses values case-insensitively, so quantms scripts that lowercase +named values (--fragmentation hcd) keep working. + +Internal: +- Added four ValueEnum-derived enums: Fragmentation, Instrument, + Protocol, EnzymeSpecificity. +- Added four custom value parsers: parse_fragmentation, + parse_instrument, parse_protocol, parse_enzyme_specificity. Each tries + the canonical named value first, falls back to the legacy numeric ID. +- Changed resolve_bundled_param and resolve_bundled_param_for_activation + signatures from Option triples to strongly-typed enums. The + "all-defaults short-circuit" (which produced HCD_QExactive_Tryp.param + pre-iter39 when no flags were given) is preserved via the + Fragmentation::Auto + Instrument::LowRes + Protocol::Auto check. +- Updated the 15 param_resolver_tests for the new signature; replaced + the three "rejects out of range" resolver tests with equivalent tests + on the parser functions (clap rejects bad values at parse time now). + +Verified: +- cargo test --release -p msgf-rust → 18 passed (15 resolver tests + + 3 new parser-out-of-range tests). +- cargo test --release -p msgf-rust --test cli_smoke → 8 passed + (7 existing + 1 new round-trip). +- cargo test --release --workspace → no new failures vs baseline. + +New regression guard: cli_accepts_both_named_and_numeric_param_values +runs a small search twice (once with --fragmentation 3 --protocol 4, +once with --fragmentation HCD --protocol TMT) and asserts PIN outputs +are byte-identical. +EOF +)" +``` + +Run after commit: `git log -1 --format='%h %s'` +Expected: short SHA + commit subject `feat(cli): rename param flags to named values with legacy compat`. + +--- + +## Task 4: Write new `README.md` + +**Files:** +- Replace: `README.md` (currently 193 lines of Java-tool README). + +The new README is a linear top-to-bottom narrative serving both quantms operators and mass-spec researchers. Follow the section list from the spec (`docs/superpowers/specs/2026-05-23-iter39-docs-rewrite-design.md`, "README.md content + structure" — 12 sections, ~190 lines total). + +- [ ] **Step 4.1: Replace README.md** + +Overwrite `README.md` with the new content. The file structure (each line below is a section heading; section line-budget is the target from the spec): + +```markdown +# msgf-rust — peptide identification from MS/MS spectra + +[![CI](https://github.com/bigbio/msgf-rust/actions/workflows/ci.yml/badge.svg)](https://github.com/bigbio/msgf-rust/actions/workflows/ci.yml) +[![Release](https://img.shields.io/github/v/release/bigbio/msgf-rust)](https://github.com/bigbio/msgf-rust/releases) +[![License: UCSD-Noncommercial](https://img.shields.io/badge/license-UCSD--Noncommercial-blue)](LICENSE) + +> **A Rust port of MS-GF+** — takes mzML/MGF spectra + FASTA in, produces Percolator-ready `.pin` out. Beats Java MS-GF+ on all three benchmark datasets at 1% FDR while running 14-330% faster. + +## What is this? + +msgf-rust is a from-scratch Rust reimplementation of [MS-GF+](https://github.com/MSGFPlus/msgfplus) (Kim & Pevzner, 2014), the canonical generating-function peptide-identification engine. It reads MS/MS spectra (mzML or MGF), searches them against a FASTA protein database, and emits Percolator-ready PIN rows (or a TSV) with per-PSM features for rescoring. The original Java implementation is preserved on the `java-legacy` branch. + +## Why msgf-rust? + +Three datasets, three results (all at 1% FDR via Percolator 3.7.1): + +| Dataset | Java MS-GF+ PSMs | msgf-rust PSMs | Δ | Java wall | msgf-rust wall | Wall Δ | +|---|---:|---:|---:|---:|---:|---:| +| **Astral DDA** (LFQ_Astral_DDA_15min_50ng) | 35,818 | **36,170** | **+352 (+0.98%)** | 5:49 | 5:57 | within 2% | +| **PXD001819** (UPS1 yeast tryp) | 14,798 | 14,760 | -38 (-0.26%) | ~150s | **45.88s** | **3.3× faster** | +| **TMT** (a05058 PXD007683) | 10,166 | **11,108** | **+9.3%** | ~2:55 | **2:30** | **14% faster** | + +What that means: on Astral we find more peptide hits than Java; on PXD001819 we match Java's hit count at 3.3× the speed; on TMT we find ~9% more PSMs at 14% less wall. The remaining feature-level divergences (lnEValue, MeanRelErrorTop7 normalization) are tracked in `DOCS.md` §8d as research follow-up — they don't gate cutover. + +## Install + +**Option 1 — download a release archive** (recommended): + +Grab the archive for your platform from the [Releases page](https://github.com/bigbio/msgf-rust/releases). Five platform builds are published per release: + +``` +msgf-rust--x86_64-unknown-linux-gnu.tar.gz +msgf-rust--aarch64-unknown-linux-gnu.tar.gz +msgf-rust--x86_64-apple-darwin.tar.gz +msgf-rust--aarch64-apple-darwin.tar.gz +msgf-rust--x86_64-pc-windows-msvc.zip +``` + +Each archive contains the `msgf-rust` binary, the `resources/` tree (39 bundled `.param` files + unimod.obo), and LICENSE/NOTICE/README. + +**Option 2 — `cargo install`:** + +```bash +cargo install --git https://github.com/bigbio/msgf-rust --bin msgf-rust +``` + +**Option 3 — build from source:** + +```bash +git clone https://github.com/bigbio/msgf-rust +cd msgf-rust +cargo build --release +# Binary: target/release/msgf-rust +``` + +Requires Rust 1.85+ (see `rust-toolchain.toml`). + +## Quick Start + +```bash +msgf-rust \ + --spectrum BSA.mgf \ + --database BSA.fasta \ + --output-pin out.pin +``` + +This runs a tryptic search at 20 ppm precursor tolerance with the bundled HCD_QExactive_Tryp scoring model, writes Percolator-format PSMs to `out.pin`, and prints per-phase timings to stderr. Feed `out.pin` directly into Percolator (Docker or native) to compute q-values. + +A row in `out.pin` is one peptide–spectrum match with 28 columns: `SpecId`, `Label`, `ScanNr`, charge one-hot encoding, then features like `RawScore`, `lnSpecEValue`, `DeNovoScore`, ion-current ratios, peptide-length stats, etc. Full column reference: `DOCS.md` §3a. + +## Common workflows + +**Tryptic DDA + Percolator** (default): + +```bash +msgf-rust --spectrum spectra.mzML --database db.fasta --output-pin out.pin +docker run --rm -v $(pwd):/data biocontainers/percolator:v3.7.1_cv1 \ + percolator -X /data/weights.txt /data/out.pin +``` + +**TMT 10-plex search with mods.txt:** + +```bash +msgf-rust \ + --spectrum tmt_spectra.mzML \ + --database hsapiens.fasta \ + --output-pin out.pin \ + --mods tmt_10plex_mods.txt \ + --protocol TMT \ + --fragmentation HCD \ + --instrument QExactive +``` + +**Direct TSV output (skip Percolator):** + +```bash +msgf-rust --spectrum spectra.mzML --database db.fasta \ + --output-pin out.pin --output-tsv out.tsv +``` + +**[quantms](https://github.com/bigbio/quantms) pipeline integration:** + +Point quantms's PSM search step at `msgf-rust` and use the standard quantms post-processing. The `.pin` row format is the same; existing quantms scripts using legacy numeric flag values (`--fragmentation 3 --instrument 3 --protocol 4`) keep working without modification (see `CLI_MIGRATION.md`). + +## CLI summary + +Most-used flags (full reference in `DOCS.md` §1): + +| Flag | Purpose | Default | +|---|---|---| +| `--spectrum ` | Input mzML or MGF | (required) | +| `--database ` | Input FASTA | (required) | +| `--output-pin ` | Percolator PIN output | (required) | +| `--output-tsv ` | Optional TSV output | (off) | +| `--mods ` | mods.txt file (Cam-C + Ox-M built-in) | (off) | +| `--precursor-tol-ppm ` | Precursor mass tolerance | 20.0 | +| `--isotope-error-min/-max ` | Isotope error range | -1, 2 | +| `--charge-min/-max ` | Charge range when not in spectrum | 2, 3 | +| `--enzyme-specificity ` | NTT enforcement | fully | +| `--max-missed-cleavages ` | Missed cleavages | 1 | +| `--min/-max-length ` | Peptide length range | 6, 40 | +| `--min-peaks ` | Min peaks per spectrum to score | 10 | +| `--top-n ` | PSMs retained per spectrum | 10 | +| `--fragmentation ` | Frag method (auto-detect from mzML if `auto`) | auto | +| `--instrument ` | Instrument class | low-res | +| `--protocol ` | Search protocol | auto | +| `--param-file ` | Override bundled scoring model | (auto-pick) | +| `--threads ` | Worker threads | (logical CPUs) | + +Run `msgf-rust --help` for the auto-generated help with full descriptions. + +## Auto-detection + +For mzML inputs, msgf-rust reads the activation block of the first MS2 spectrum and selects a bundled `.param` file accordingly. The detection covers HCD/CID/ETD/UVPD activation and LowRes/HighRes/TOF/QExactive instrument classes (via mzML CV params). The bundled model is then resolved from `(fragmentation, instrument, protocol)`. MGF files have no activation metadata, so they go through the CLI defaults (which can be overridden with explicit `--fragmentation` / `--instrument` flags). Full resolution table: `DOCS.md` §4. + +## Parity vs Java MS-GF+ + +PIN output columns are bit-exact with Java MS-GF+ on the agreement bucket (same scan + same top-1 peptide) for most features. Three residual divergences exist as deferred research: `lnEValue` (num_distinct semantics), `MeanRelErrorTop7` (error-stat normalization), and the BSA charge-3 SEV gap from the deconvolution-implementation difference (`known-divergences.md` item #3, kept on the development branch). None gate cutover; aggregate 1% FDR PSM counts beat Java on all three benchmark datasets. Full detail: `DOCS.md` §8d. + +## Citation + +If you use msgf-rust in published work, please cite the original MS-GF+ paper: + +> Kim, S. and Pevzner, P.A. (2014). MS-GF+ makes progress towards a universal database search tool for proteomics. *Nature Communications*, 5:5277. + +And optionally this Rust port: + +> bigbio (2026). msgf-rust: a Rust port of MS-GF+ for the quantms pipeline. https://github.com/bigbio/msgf-rust + +## License + +msgf-rust inherits the upstream MS-GF+ UCSD-Noncommercial license. The license restricts redistribution and commercial use; see `LICENSE` for the full text and `NOTICE` for attribution. The original Java implementation is preserved on the `java-legacy` branch (frozen at the bigbio-optimized version) and `java-legacy-original` branch (synced to upstream `MSGFPlus/msgfplus/master`). + +## Acknowledgments + +- Sangtae Kim, Pavel Pevzner, and the PNNL Proteomics team at UCSD's Center for Computational Mass Spectrometry, for the original MS-GF+ engine and the bundled `.param` scoring models. +- The [bigbio](https://github.com/bigbio) maintainers and the [quantms](https://github.com/bigbio/quantms) team. +``` + +- [ ] **Step 4.2: Verify the build still passes (no source code touched, sanity only)** + +Run: `cargo build --release 2>&1 | tail -3` +Expected: `Finished` (nothing changed in Rust code, but verifies the working tree is clean). + +- [ ] **Step 4.3: Commit (Commit 2)** + +```bash +git add README.md +git commit -m "$(cat <<'EOF' +docs: rewrite README.md for post-cutover state + +Replace the legacy Java-tool README (193 lines, Java 17 + JAR + mvn) with +a linear-narrative README for the Rust port (~190 lines, dual audience). + +Sections, top to bottom: +1. Title + tagline + badges (CI, release, license) +2. What is this? — one paragraph, names UCSD original +3. Why msgf-rust? — benchmark table vs Java on Astral / PXD001819 / TMT +4. Install — release archive, cargo install, build from source +5. Quick Start — minimal command, one paragraph on .pin row shape +6. Common workflows — tryptic DDA, TMT, TSV output, quantms integration +7. CLI summary — table of ~17 most-used flags +8. Auto-detection — activation/instrument detection from mzML +9. Parity vs Java MS-GF+ — short summary; pointer to DOCS.md §8d +10. Citation +11. License — UCSD-Noncommercial; pointer to java-legacy and + java-legacy-original branches +12. Acknowledgments + +quantms operators have a labeled section in #6 + the CLI summary in #7. +Researchers see the benchmark proof up front in #3. + +The full CLI reference, mods.txt grammar, PIN/TSV column docs, training +notes, and Java→Rust migration table live in DOCS.md (separate commit). +The Java→Rust flag mapping table lives in CLI_MIGRATION.md (separate +commit). +EOF +)" +``` + +Run after: `git log -1 --format='%h %s'` +Expected: short SHA + `docs: rewrite README.md for post-cutover state`. + +--- + +## Task 5: Write new `DOCS.md` + +**Files:** +- Create: `DOCS.md` at repo root. + +The new `DOCS.md` is the single-file reference for everything not in README. Follow the section list from the spec (`docs/superpowers/specs/2026-05-23-iter39-docs-rewrite-design.md`, "DOCS.md content + structure" — 9 sections, ~505 lines total). + +The content is too large to embed verbatim in this plan; use the spec's section outline as the authoritative content guide and follow these per-section content requirements. + +- [ ] **Step 5.1: Create `DOCS.md` with the section skeleton** + +Create `DOCS.md` at repo root with this skeleton + section-specific content guide. Use the spec as the design reference; each section below names the *required content elements* the implementer must produce. + +```markdown +# msgf-rust documentation + +This is the full reference. For getting started, see [`README.md`](README.md). +For the Java→Rust flag mapping, see [`CLI_MIGRATION.md`](CLI_MIGRATION.md). + +## Contents + +1. [CLI reference](#1-cli-reference) +2. [Mods.txt format](#2-modstxt-format) +3. [Output formats](#3-output-formats) +4. [Auto-detection](#4-auto-detection) +5. [Building from source](#5-building-from-source) +6. [Training new `.param` files](#6-training-new-param-files) +7. [Isobaric labeling](#7-isobaric-labeling) +8. [Java MS-GF+ → msgf-rust migration](#8-java-ms-gf--msgf-rust-migration) +9. [License and citation](#9-license-and-citation) + +## 1. CLI reference + +(~130 lines) + +Tabulate every CLI flag in groups: Required (--spectrum, --database, --output-pin), Search params (--precursor-tol-ppm, --charge-min/-max, --enzyme-specificity, --max-missed-cleavages, --min-length, --max-length, --top-n, --isotope-error-min/-max, --min-peaks), Modifications (--mods), Scoring (--fragmentation, --instrument, --protocol, --param-file), Runtime (--threads, --ms-level, --max-spectra, --decoy-prefix), Output (--output-tsv). + +For each flag: name, value type, default, description, accepted legacy form (where applicable). + +## 2. Mods.txt format + +(~50 lines) + +Document the grammar: each non-comment line is `,,,,`. Field rules: +- `` — numeric Da; composition strings not supported. +- `` — uppercase letter or `*` wildcard. +- `` — `fix` or `opt`. +- `` — `any|N-term|C-term|Prot-N-term|Prot-C-term`. + +Special directive: `NumMods=N` sets max variable mods per peptide. + +Comment handling: `#`-prefix lines ignored, inline `# ...` stripped, blank lines OK. + +Three worked examples in fenced ```text blocks: (a) cam-C fixed + ox-M variable, (b) TMT 10-plex on K + N-term, (c) phospho-STY variable. + +## 3. Output formats + +(~90 lines) + +### 3a. PIN columns + +Table with one row per PIN column. Columns: `Column name`, `Type`, `Description`, `Computation`. ~28 rows (one per emitted column). Cross-reference Java MS-GF+'s DirectPinWriter for column semantics. + +### 3b. TSV columns + +Same shape as 3a but for the TSV writer's columns. + +### 3c. PIN vs TSV — which to use + +One paragraph: TSV is human-readable / Excel-friendly; PIN feeds Percolator for q-value rescoring. quantms-style pipelines use PIN. + +## 4. Auto-detection + +(~35 lines) + +Two tables: +- Activation method detection from mzML CV params (MS:1000133 → CID, MS:1000599 → ETD, MS:1000422 → HCD, MS:1002472 → UVPD). +- Param-file resolution: `(Fragmentation, Instrument, Protocol)` → bundled file name. Cover all 39 files in `resources/ionstat/`. + +Plus a "what happens when auto-detection fails" paragraph. + +## 5. Building from source + +(~30 lines) + +Requirements: Rust 1.85+. Build: `cargo build --release`. Test: `cargo test --release`. Binary location: `target/release/msgf-rust`. + +The CI suite skips 7 tests for documented reasons (3 min_peaks regressions, 3 Maven-fixture tests, 1 thread-determinism). The release binary is unaffected. Reproduce the CI test invocation: + +```bash +cargo test --release --workspace -- \ + --skip charge_missing_spectrum_uses_per_charge_scored_spec \ + --skip spectrum_without_charge_tries_charge_range \ + --skip known_peptide_appears_in_top_n \ + --skip read_bsa_canno_text_format \ + --skip read_tryp_pig_bov_revcat_csarr_cnlcp \ + --skip tryp_pig_bov_revcat_full_set_loads \ + --skip match_spectra_output_invariant_across_thread_counts +``` + +## 6. Training new `.param` files + +(~25 lines) + +The Rust port reuses Java MS-GF+'s `.param` scoring-model files as-is — the binary format is unchanged; the 39 bundled files in `resources/ionstat/` came directly from the Java distribution. + +Training NEW `.param` files (for novel fragmentation methods or instrument classes) requires running a scoring-parameter generator. Java MS-GF+'s `ScoringParamGen` is the canonical implementation. + +**Status in v0.1.0:** the search/scoring side is fully ported and validated; the trainer is not yet ported. A Rust reimplementation is on the roadmap — see the [open issues](https://github.com/bigbio/msgf-rust/issues) for progress. + +Two paths until then: +1. Use the bundled `.param` files (covers HCD QExactive, CID LowRes, ETD HighRes, TMT/iTRAQ variants). +2. Train new models on the `java-legacy` branch (`git checkout java-legacy`), run Java MS-GF+'s `ScoringParamGen`, point the Rust binary at the output with `--param-file `. Format is identical. + +## 7. Isobaric labeling + +(~35 lines) + +Cover TMT and iTRAQ workflows: +- `--protocol TMT` or `--protocol iTRAQ` +- Required mods.txt entries (TMT 10-plex on K + N-term as 229.16293; iTRAQ 8-plex as 304.20536, etc.) +- Auto-selected param file (e.g. `HCD_QExactive_Tryp_TMT.param` when protocol=TMT, instrument=QExactive). +- Sample CLI commands for each. + +## 8. Java MS-GF+ → msgf-rust migration + +(~80 lines) + +### 8a. Flag rename table + +Table mapping Java MS-GF+ flag → msgf-rust flag. Example: + +| Java MS-GF+ | msgf-rust | +|---|---| +| `-s ` | `--spectrum ` | +| `-d ` | `--database ` | +| `-o ` | `--output-pin ` | +| `-mod ` | `--mods ` (alias: `--mod`) | +| `-t 20ppm` | `--precursor-tol-ppm 20` | +| `-ti -1,2` | `--isotope-error-min -1 --isotope-error-max 2` | +| `-inst 3` | `--instrument QExactive` (or `--instrument 3`) | +| `-m 3` | `--fragmentation HCD` (or `--fragmentation 3`) | +| `-protocol 4` | `--protocol TMT` (or `--protocol 4`) | +| `-ntt 2` | `--enzyme-specificity fully` (or `--ntt 2`) | +| `-tda 1` | (not needed — decoys are auto-generated) | +| `-e 1` | (not exposed — Trypsin is the only enzyme; for others, use `--param-file`) | +| `-outputFormat 1` | `--output-tsv ` | +| `-thread N` | `--threads N` | + +### 8b. Numeric-legacy values + +Cross-reference `CLI_MIGRATION.md` for the legacy 0..=N → named-value mapping. msgf-rust accepts both forms. + +### 8c. Behavior differences + +- mzXML, MS2, PKL, `_dta.txt` inputs are not supported (use mzML or MGF). +- mzIdentML output is not supported (use PIN + Percolator, or TSV). +- Decoys are always auto-generated by reversing target sequences (decoy prefix configurable via `--decoy-prefix`); there is no separate decoy-database flag. +- The CLI is picocli-equivalent (clap-derived) with auto-generated `--help`. + +### 8d. Known parity divergences + +Three areas where msgf-rust and Java MS-GF+ produce different PIN values on the agreement bucket (same scan + same top-1 peptide): + +| Feature | Divergence | Status | +|---|---|---| +| `lnEValue` | -4.15 OOM mean (Rust over-confident) | Deferred — known-divergences #2: num_distinct semantics | +| `MeanRelErrorTop7` / `MeanErrorTop7` / `StdevRelErrorTop7` | 99% of agreement-bucket PSMs differ >1% relative | Deferred — error-stat normalization differs | +| BSA charge-3 SEV (BSA.fasta + test.mgf fixture) | 1.03/1.20 OOM (pre-iter37) → 2.56/3.58 OOM (post-iter37) | Known — deconvolution-implementation divergence #3, kept on the dev branch parity test as a coarse smoke gate | + +Aggregate Astral 1% FDR PSM count stays +0.98% ahead of Java; Percolator's discriminative weights absorb the per-feature distribution differences. None of these block production use. + +## 9. License and citation + +(~15 lines) + +Reproduce the relevant LICENSE text (UCSD-Noncommercial). State the citation requirement (Kim & Pevzner 2014 + this port). Link to LICENSE/NOTICE. +``` + +The implementer expands each section's content guide into prose. The spec at `docs/superpowers/specs/2026-05-23-iter39-docs-rewrite-design.md` §"DOCS.md content + structure" is the design reference; the section list above is the authoritative skeleton. + +- [ ] **Step 5.2: Verify wc -l count is in the target range** + +Run: `wc -l DOCS.md` +Expected: 450-550 (target ~505). If the count is much higher, the implementer over-wrote — trim back to skeleton + essential content. If much lower, sections are too thin — fill out the content guides. + +- [ ] **Step 5.3: Commit (Commit 3)** + +```bash +git add DOCS.md +git commit -m "$(cat <<'EOF' +docs: add DOCS.md single-file reference + +Add DOCS.md at repo root: the full power-user reference covering all +flags, formats, build/test workflow, training notes, and Java→Rust +migration. ~505 lines, navigated via a top-of-file table of contents. + +Sections: +1. CLI reference — every flag with type/default/description and + accepted legacy form +2. Mods.txt format — grammar + 3 worked examples +3. Output formats — PIN columns, TSV columns, when to use which +4. Auto-detection — activation method detection from mzML + + param-file resolution table +5. Building from source — Rust 1.85+, cargo build/test, the 7 CI-skipped + tests and reasons +6. Training new .param files — current state (reuse Java's bundled + files), roadmap (port ScoringParamGen), interim workflow + (train on java-legacy, --param-file at the Rust binary) +7. Isobaric labeling — TMT and iTRAQ workflows, required mods entries, + auto-selected param file +8. Java MS-GF+ → msgf-rust migration — flag rename table, behavior + differences, known parity divergences +9. License and citation + +The DOCS.md design follows the linear-narrative pattern of README.md: +no nested directories, no site generator, just one Cmd-F-friendly file. +EOF +)" +``` + +--- + +## Task 6: Write new `CLI_MIGRATION.md` + +**Files:** +- Create: `CLI_MIGRATION.md` at repo root. + +The new `CLI_MIGRATION.md` is a focused one-pager for users porting Java MS-GF+ command lines or scripts to msgf-rust. ~100 lines. + +- [ ] **Step 6.1: Create CLI_MIGRATION.md** + +```markdown +# Migrating to msgf-rust from Java MS-GF+ + +msgf-rust accepts both the canonical Rust-idiomatic CLI form (named values, kebab-case) and the legacy Java MS-GF+ form (numeric IDs and short flag names) silently — running scripts written against Java MS-GF+ unchanged is supported. + +This page is a quick-reference for porting commands. For the full CLI reference, see [`DOCS.md`](DOCS.md) §1. + +## Table A — Java MS-GF+ flag → msgf-rust flag + +| Java MS-GF+ | msgf-rust canonical | msgf-rust legacy alias | +|---|---|---| +| `-s ` | `--spectrum ` | — | +| `-d ` | `--database ` | — | +| `-o ` | `--output-pin ` | — | +| `-mod ` | `--mods ` | `--mod ` | +| `-t 20ppm` | `--precursor-tol-ppm 20` | — | +| `-ti -1,2` | `--isotope-error-min -1 --isotope-error-max 2` | — | +| `-m 3` (HCD) | `--fragmentation HCD` | `--fragmentation 3` | +| `-inst 3` (QExactive) | `--instrument QExactive` | `--instrument 3` | +| `-protocol 4` (TMT) | `--protocol TMT` | `--protocol 4` | +| `-ntt 2` (fully specific) | `--enzyme-specificity fully` | `--ntt 2` | +| `-tda 1` (target+decoy) | (omit — decoys always auto-generated) | — | +| `-e 1` (Trypsin) | (omit — Trypsin is the only enzyme) | — | +| `-outputFormat 1` (TSV) | `--output-tsv ` | — | +| `-thread N` | `--threads N` | — | +| `-minLength 6` | `--min-length 6` | — | +| `-maxLength 40` | `--max-length 40` | — | +| `-maxMissedCleavages 1` | `--max-missed-cleavages 1` | — | +| `-minNumPeaks 10` | `--min-peaks 10` | — | + +## Table B — Numeric-legacy → named values + +| Flag | Legacy numeric | Canonical named | +|---|---|---| +| `--fragmentation` | `0` | `auto` | +| `--fragmentation` | `1` | `CID` | +| `--fragmentation` | `2` | `ETD` | +| `--fragmentation` | `3` | `HCD` | +| `--fragmentation` | `4` | `UVPD` | +| `--instrument` | `0` | `low-res` | +| `--instrument` | `1` | `high-res` | +| `--instrument` | `2` | `TOF` | +| `--instrument` | `3` | `QExactive` | +| `--protocol` | `0` | `auto` | +| `--protocol` | `1` | `phospho` | +| `--protocol` | `2` | `iTRAQ` | +| `--protocol` | `3` | `iTRAQ-phospho` | +| `--protocol` | `4` | `TMT` | +| `--protocol` | `5` | `standard` | +| `--enzyme-specificity` (aliases: `--ntt`) | `0` | `non-specific` | +| `--enzyme-specificity` | `1` | `semi` | +| `--enzyme-specificity` | `2` | `fully` | + +clap parses named values case-insensitively, so `--fragmentation hcd` works the same as `--fragmentation HCD`. + +## Worked examples + +### (a) Plain Trypsin DDA, 20 ppm precursor tolerance + +**Java MS-GF+:** + +```bash +java -Xmx4G -jar MSGFPlus.jar \ + -s spectra.mzML \ + -d uniprot.fasta \ + -tda 1 \ + -t 20ppm \ + -ti -1,2 \ + -o results.pin +``` + +**msgf-rust (canonical):** + +```bash +msgf-rust \ + --spectrum spectra.mzML \ + --database uniprot.fasta \ + --precursor-tol-ppm 20 \ + --isotope-error-min -1 --isotope-error-max 2 \ + --output-pin results.pin +``` + +**msgf-rust (legacy-form, drop-in for existing quantms scripts):** + +The Java-style flags above don't translate verbatim — `-s`, `-d`, `-o` are Java-only. But the search-parameter flags do; for example, an existing quantms script that calls msgf-rust with `--fragmentation 3 --instrument 3 --protocol 4` keeps working unchanged. + +### (b) TMT 10-plex search + +**Java MS-GF+:** + +```bash +java -Xmx8G -jar MSGFPlus.jar \ + -s tmt_spectra.mzML \ + -d hsapiens.fasta \ + -tda 1 \ + -t 20ppm \ + -inst 3 \ + -m 3 \ + -protocol 4 \ + -mod tmt_mods.txt \ + -o results.pin +``` + +**msgf-rust:** + +```bash +msgf-rust \ + --spectrum tmt_spectra.mzML \ + --database hsapiens.fasta \ + --precursor-tol-ppm 20 \ + --instrument QExactive \ + --fragmentation HCD \ + --protocol TMT \ + --mods tmt_mods.txt \ + --output-pin results.pin +``` + +### (c) Phospho STY search + +**Java MS-GF+:** + +```bash +java -Xmx4G -jar MSGFPlus.jar \ + -s phospho.mzML \ + -d uniprot.fasta \ + -tda 1 \ + -t 10ppm \ + -inst 1 \ + -m 3 \ + -protocol 1 \ + -mod phospho_mods.txt \ + -o results.pin +``` + +**msgf-rust:** + +```bash +msgf-rust \ + --spectrum phospho.mzML \ + --database uniprot.fasta \ + --precursor-tol-ppm 10 \ + --instrument high-res \ + --fragmentation HCD \ + --protocol phospho \ + --mods phospho_mods.txt \ + --output-pin results.pin +``` + +## Notes + +- `-tda 1` (target+decoy database analysis) is always on in msgf-rust — decoys are generated by reversing target sequences at search time. The decoy prefix is configurable via `--decoy-prefix` (default `XXX_`). +- The Java `-e` enzyme flag is not exposed; Trypsin is hardcoded. For non-tryptic searches, use a custom `.param` file via `--param-file`. +- mzXML, MS2, PKL, and `_dta.txt` inputs are not supported. Use mzML or MGF. +- mzIdentML output is not supported. Use PIN (with Percolator) or TSV. +``` + +- [ ] **Step 6.2: Commit (Commit 4)** + +```bash +git add CLI_MIGRATION.md +git commit -m "$(cat <<'EOF' +docs: add CLI_MIGRATION.md (Java + numeric legacy → new names) + +One-page reference for porting Java MS-GF+ command lines or quantms +scripts to msgf-rust. Covers: + +- Table A: Java flag → msgf-rust flag mapping (18 flags). +- Table B: numeric-legacy → canonical named value mapping (one row per + legacy ID across fragmentation, instrument, protocol, enzyme-specificity). +- Three worked examples (plain tryptic DDA; TMT 10-plex; phospho STY) + showing the Java MS-GF+ command line and the msgf-rust equivalent + side-by-side. +- Notes on behaviors that simply don't exist on the Rust side (no + -tda flag, no -e enzyme flag, no mzXML/PKL/MS2 input, no mzIdentML + output). + +msgf-rust silently accepts the legacy forms (--fragmentation 3, +--mod, --ntt) for backward compatibility with quantms scripts. New +canonical forms are documented for fresh users. +EOF +)" +``` + +--- + +## Task 7: Delete the legacy `docs/` tree + +**Files:** +- Delete: 38 tracked files under `docs/` (excluding `docs/superpowers/`). + +This removes the Java-tool documentation that has been replaced by README.md / DOCS.md / CLI_MIGRATION.md. + +- [ ] **Step 7.1: List the files to be deleted (sanity check before destruction)** + +Run: +```bash +git ls-files docs/ | grep -v 'docs/superpowers/' | sort +``` + +Expected output: 38 files including `docs/msgfplus.md`, `docs/readme.md`, `docs/benchmarks/*`, `docs/examples/*`, `docs/parameterfiles/*`, etc. Verify `docs/superpowers/specs/` and `docs/superpowers/plans/` files are NOT in this list. + +- [ ] **Step 7.2: Delete the files** + +Run: +```bash +git rm -r docs/benchmarks/ docs/examples/ docs/parameterfiles/ \ + docs/buildsa.md docs/changelog.md docs/isobariclabeling.md \ + docs/msgfdb_modfile.md docs/msgfplus.md docs/output.md docs/readme.md \ + docs/training-scoring-models.md docs/troubleshooting.md +``` + +Run: `git ls-files docs/ | grep -v 'docs/superpowers/' | wc -l` +Expected: `0` (all non-superpowers tracked files under docs/ are now gone). + +Run: `git ls-files docs/superpowers/ | wc -l` +Expected: `2` or more (the spec + this plan file are still tracked). + +- [ ] **Step 7.3: Verify Rust build is unaffected** + +Run: `cargo build --release 2>&1 | tail -3` +Expected: `Finished` (no source code references docs/, so the build is unaffected). + +- [ ] **Step 7.4: Verify the test suite runs (sanity)** + +Run: +```bash +cargo test --release --workspace -- \ + --skip charge_missing_spectrum_uses_per_charge_scored_spec \ + --skip spectrum_without_charge_tries_charge_range \ + --skip known_peptide_appears_in_top_n \ + --skip read_bsa_canno_text_format \ + --skip read_tryp_pig_bov_revcat_csarr_cnlcp \ + --skip tryp_pig_bov_revcat_full_set_loads \ + --skip match_spectra_output_invariant_across_thread_counts 2>&1 | grep -E 'test result.*FAILED' | wc -l +``` + +Expected: `0` failed. + +- [ ] **Step 7.5: Commit (Commit 5)** + +```bash +git commit -m "$(cat <<'EOF' +docs: delete legacy docs/ tree (content migrated to DOCS.md) + +The docs/ tree predated the Rust cutover and described the Java tool +(mvn build, JAR distribution, Java CLI). Content that still applies has +been migrated to root-level README.md, DOCS.md, and CLI_MIGRATION.md. + +Deleted (38 tracked files): +- docs/msgfplus.md (full Java CLI reference — superseded by DOCS.md §1) +- docs/msgfdb_modfile.md (mods.txt grammar — superseded by DOCS.md §2) +- docs/output.md (PIN/TSV columns — superseded by DOCS.md §3) +- docs/buildsa.md (Java standalone SA builder — Java-only utility) +- docs/training-scoring-models.md (Java trainer — superseded by DOCS.md §6) +- docs/isobariclabeling.md (TMT/iTRAQ — superseded by DOCS.md §7) +- docs/troubleshooting.md (Java JVM tuning — Java-only) +- docs/changelog.md (Java release notes — GitHub Releases tracks v0.1.0+) +- docs/readme.md (Java tool overview — superseded by root README.md) +- docs/benchmarks/ (3 PNG figures from Java perf comparison — stale) +- docs/examples/ (Mods.txt + activation/enzyme/protocol samples — + inline examples in DOCS.md instead) +- docs/parameterfiles/ (15 Java -conf templates — no Rust equivalent) + +Preserved: +- docs/superpowers/specs/ — design specs (engineering planning). +- docs/superpowers/plans/ — implementation plans (engineering planning). +- docs/parity-analysis/ (already gitignored since commit 5e9b63ac; + no action needed). +EOF +)" +``` + +Run after: `git log --oneline -7` +Expected: 5 new commits on top of `eb4953cc` (the spec commit), in the order: +1. `feat(cli): rename param flags ...` +2. `docs: rewrite README.md ...` +3. `docs: add DOCS.md ...` +4. `docs: add CLI_MIGRATION.md ...` +5. `docs: delete legacy docs/ tree ...` + +--- + +## Task 8: Push branch and open PR + +- [ ] **Step 8.1: Push the branch** + +Run: `git push origin iter39-docs-rewrite` +Expected: 5 commits pushed; remote tracking is set up. + +- [ ] **Step 8.2: Open the PR** + +Run: +```bash +gh pr create --base dev --head iter39-docs-rewrite \ + --title "iter39: docs + CLI rename for the post-cutover state" \ + --body "$(cat <<'EOF' +## Summary + +- Rewrite README.md as a linear narrative serving quantms operators + mass-spec researchers (~190 lines). +- Add DOCS.md at repo root: single-file reference for CLI, formats, training, migration (~505 lines). +- Add CLI_MIGRATION.md: Java MS-GF+ → msgf-rust flag map + numeric legacy → named-value table + 3 worked examples (~100 lines). +- Rename CLI flags from Java-historical numeric IDs to Rust-idiomatic named values; legacy forms still accepted silently for quantms script compat. +- Delete the legacy docs/ tree (38 tracked files); preserve docs/ engineering-planning artifacts. + +Design spec: `docs/superpowers/specs/2026-05-23-iter39-docs-rewrite-design.md`. + +## CLI changes (one commit, fully backward-compatible) + +Canonical (shown in --help): +- `--fragmentation auto|CID|ETD|HCD|UVPD` (was numeric 0..=4) +- `--instrument low-res|high-res|TOF|QExactive` (was numeric 0..=3) +- `--protocol auto|phospho|iTRAQ|iTRAQ-phospho|TMT|standard` (was numeric 0..=5) +- `--enzyme-specificity non-specific|semi|fully` (was --ntt 0..=2) +- `--mods ` (was --mod, kept as hidden alias) + +Legacy (silently accepted): numeric 0..=N for the four enum flags, --ntt as a clap alias for --enzyme-specificity, --mod as a hidden alias for --mods. Quantms scripts using legacy form keep working unchanged. + +A new regression test (`cli_accepts_both_named_and_numeric_param_values`) runs a search twice — once with legacy numeric flags, once with canonical named flags — and asserts byte-identical PIN output. + +## Test plan + +- [x] cargo test --release --workspace passes (37+ test binaries, 0 new failures vs baseline) +- [x] New round-trip test guards the back-compat path +- [x] cargo build --release produces clean binary +- [x] Existing CI workflow (.github/workflows/ci.yml) needs no changes; the 7 known-skipped tests stay skipped +EOF +)" +``` + +Expected output: a PR URL like `https://github.com/bigbio/msgf-rust/pull/`. + +- [ ] **Step 8.3: Mark plan complete** + +Plan implementation finished. Wait for CI to pass on the new PR, then merge per the project's normal flow. + +--- + +## Self-review checklist + +After implementing all tasks, verify: + +- [ ] All 5 commits exist on `iter39-docs-rewrite`, in the order specified. +- [ ] No commit message contains the substring "superpowers" (commit hook blocks it). +- [ ] `cargo build --release` succeeds with zero warnings. +- [ ] `cargo test --release --workspace -- --skip [7 known]` reports 0 failed. +- [ ] `git ls-files docs/` shows ONLY `docs/superpowers/specs/...` and `docs/superpowers/plans/...`. +- [ ] Root has `README.md`, `DOCS.md`, `CLI_MIGRATION.md`, `LICENSE`, `NOTICE`, `Cargo.toml`, etc. +- [ ] `msgf-rust --help` shows the new canonical flag names; legacy numeric values still parse. +- [ ] The new test `cli_accepts_both_named_and_numeric_param_values` passes. From 4531b1630ee3860641e63f15a891a6c8b2f428c9 Mon Sep 17 00:00:00 2001 From: Yasset Perez-Riverol Date: Sat, 23 May 2026 17:38:15 +0100 Subject: [PATCH 3/7] feat(cli): rename param flags to named values with legacy compat MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace numeric Java-historical enum flags with Rust-idiomatic named values and rename --mod → --mods, --ntt → --enzyme-specificity. All legacy forms still accepted silently for quantms script compat. Canonical (shown in --help): - --fragmentation auto|CID|ETD|HCD|UVPD (default: auto) - --instrument low-res|high-res|TOF|QExactive (default: low-res) - --protocol auto|phospho|iTRAQ|iTRAQ-phospho|TMT|standard (default: auto) - --enzyme-specificity non-specific|semi|fully (default: fully) - --mods (singular --mod kept as hidden alias) Legacy (silently accepted): - --fragmentation 0..=4 - --instrument 0..=3 - --protocol 0..=5 - --ntt 0..=2 (--ntt is also a clap alias of --enzyme-specificity) - --mod clap parses values case-insensitively, so quantms scripts that lowercase named values (--fragmentation hcd) keep working. Internal: - Added four ValueEnum-derived enums: Fragmentation, Instrument, Protocol, EnzymeSpecificity. - Added four custom value parsers: parse_fragmentation, parse_instrument, parse_protocol, parse_enzyme_specificity. Each tries the canonical named value first, falls back to the legacy numeric ID. - Changed resolve_bundled_param and resolve_bundled_param_for_activation signatures from Option triples to strongly-typed enums. The "all-defaults short-circuit" (which produced HCD_QExactive_Tryp.param pre-iter39 when no flags were given) is preserved via the Fragmentation::Auto + Instrument::LowRes + Protocol::Auto check. - Updated the 15 param_resolver_tests for the new signature; replaced the three "rejects out of range" resolver tests with equivalent tests on the parser functions (clap rejects bad values at parse time now). Verified: - cargo test --release -p msgf-rust → 18 passed (15 resolver tests + 3 new parser-out-of-range tests). - cargo test --release -p msgf-rust --test cli_smoke → 8 passed (7 existing + 1 new round-trip). - cargo test --release --workspace → no new failures vs baseline. New regression guard: cli_accepts_both_named_and_numeric_param_values runs a small search twice (once with --fragmentation 3 --protocol 4, once with --fragmentation HCD --protocol TMT) and asserts PIN outputs are byte-identical. Co-authored-by: Cursor --- crates/msgf-rust/src/bin/msgf-rust.rs | 383 ++++++++++++++++---------- crates/msgf-rust/tests/cli_smoke.rs | 71 +++++ 2 files changed, 315 insertions(+), 139 deletions(-) diff --git a/crates/msgf-rust/src/bin/msgf-rust.rs b/crates/msgf-rust/src/bin/msgf-rust.rs index 96ab3ecb..ecb5a330 100644 --- a/crates/msgf-rust/src/bin/msgf-rust.rs +++ b/crates/msgf-rust/src/bin/msgf-rust.rs @@ -14,7 +14,7 @@ use std::process::ExitCode; use std::sync::mpsc::{sync_channel, SyncSender}; use std::thread; -use clap::Parser; +use clap::{Parser, ValueEnum}; use model::{ activation::ActivationMethod, AminoAcidSetBuilder, InstrumentType, ModLocation, Modification, PrecursorTolerance, ResidueSpec, Spectrum, Tolerance, @@ -23,6 +23,49 @@ use scoring_crate::{Param, RankScorer}; use search::{PreparedSearch, SearchIndex, SearchParams, TopNQueue}; use input::{detect_instrument_type, FastaReader, MgfReader, MzMLReader}; +/// Fragmentation method. Named values map to the same param-file resolution +/// logic as Java MS-GF+'s `-m` flag. `Auto` means "detect from the mzML's +/// activation block; fall back to the bundled HCD_QExactive_Tryp.param if +/// nothing detected" — the same semantics as omitting the flag pre-iter39. +#[derive(Clone, Copy, Debug, PartialEq, Eq, ValueEnum)] +pub enum Fragmentation { + #[clap(name = "auto")] Auto, + #[clap(name = "CID")] Cid, + #[clap(name = "ETD")] Etd, + #[clap(name = "HCD")] Hcd, + #[clap(name = "UVPD")] Uvpd, +} + +/// Instrument class. Drives the `LowRes`/`HighRes`/`TOF`/`QExactive` +/// classification used to pick the bundled param file. +#[derive(Clone, Copy, Debug, PartialEq, Eq, ValueEnum)] +pub enum Instrument { + #[clap(name = "low-res")] LowRes, + #[clap(name = "high-res")] HighRes, + #[clap(name = "TOF")] Tof, + #[clap(name = "QExactive")] QExactive, +} + +/// Search protocol. Maps to Java MS-GF+'s `-protocol` flag. +#[derive(Clone, Copy, Debug, PartialEq, Eq, ValueEnum)] +pub enum Protocol { + #[clap(name = "auto")] Auto, + #[clap(name = "phospho")] Phospho, + #[clap(name = "iTRAQ")] Itraq, + #[clap(name = "iTRAQ-phospho")] ItraqPhospho, + #[clap(name = "TMT")] Tmt, + #[clap(name = "standard")] Standard, +} + +/// Enzymatic-cleavage enforcement at peptide span boundaries. Maps to Java +/// MS-GF+'s `-ntt` flag where 2=fully, 1=semi, 0=non-specific. +#[derive(Clone, Copy, Debug, PartialEq, Eq, ValueEnum)] +pub enum EnzymeSpecificity { + #[clap(name = "non-specific")] NonSpecific, + #[clap(name = "semi")] Semi, + #[clap(name = "fully")] Fully, +} + #[derive(Parser, Debug)] #[command( name = "msgf-rust", @@ -74,14 +117,14 @@ struct Cli { #[arg(long, default_value = "10")] top_n: u32, - /// Number of Tolerable Termini. - /// - /// Controls enzymatic-cleavage enforcement at span boundaries: - /// 2 (default): both termini must be cleavage sites (strict / fully specific). - /// 1: at least one terminus must be a cleavage site (semi-specific). - /// 0: neither terminus needs to be a cleavage site (non-specific). - #[arg(long, default_value = "2")] - ntt: u8, + /// Number of Tolerable Termini (enzymatic-cleavage enforcement at span + /// boundaries). `fully`: both termini must be cleavage sites (strict, + /// equivalent to Java -ntt 2). `semi`: at least one terminus must be a + /// cleavage site (Java -ntt 1). `non-specific`: neither terminus needs + /// to be a cleavage site (Java -ntt 0). Legacy numeric 0/1/2 still accepted. + #[arg(long = "enzyme-specificity", alias = "ntt", + default_value = "fully", value_parser = parse_enzyme_specificity)] + enzyme_specificity: EnzymeSpecificity, /// Maximum number of missed cleavages per peptide (default 1). #[arg(long, default_value = "1")] @@ -114,8 +157,8 @@ struct Cli { #[arg(long)] param_file: Option, - /// Path to a Java-format mods.txt file describing fixed and variable - /// modifications. Format: each non-comment line is + /// Path to a mods.txt file describing fixed and variable modifications. + /// Format: each non-comment line is /// `,,,,`, where: /// - `` is a numeric monoisotopic mass delta (Da). Composition /// strings (e.g. `C2H3N1O1`) are **not** yet supported. @@ -124,28 +167,25 @@ struct Cli { /// A single `NumMods=N` line sets the max variable mods per peptide. /// Inline `#`-comments are stripped. Blank lines and full-line `#`-comments /// are ignored. When omitted, the binary uses its built-in defaults - /// (Carbamidomethyl-C fixed, Oxidation-M variable). - #[arg(long = "mod", value_name = "MODFILE")] - mod_file: Option, - - /// Fragmentation method index (Java's `-m`): - /// 0=Auto/CID (default), 1=CID, 2=ETD, 3=HCD, 4=UVPD. - /// Used to choose the bundled .param file when --param-file is not given. - #[arg(long, value_name = "ID")] - fragmentation: Option, - - /// Instrument type index (Java's `-inst`): - /// 0=LowRes (default), 1=HighRes, 2=TOF, 3=QExactive. - /// Used to choose the bundled .param file when --param-file is not given. - #[arg(long, value_name = "ID")] - instrument: Option, - - /// Protocol index (Java's `-protocol`): - /// 0=Automatic (default), 1=Phosphorylation, 2=iTRAQ, - /// 3=iTRAQPhospho, 4=TMT, 5=Standard. - /// Used to choose the bundled .param file when --param-file is not given. - #[arg(long, value_name = "ID")] - protocol: Option, + /// (Carbamidomethyl-C fixed, Oxidation-M variable). The deprecated + /// `--mod` form (singular) is still accepted as a hidden alias. + #[arg(long = "mods", alias = "mod", value_name = "MODFILE")] + mods: Option, + + /// Fragmentation method. Named values: auto, CID, ETD, HCD, UVPD. + /// Legacy numeric (Java MS-GF+ `-m`): 0=auto, 1=CID, 2=ETD, 3=HCD, 4=UVPD. + #[arg(long, default_value = "auto", value_parser = parse_fragmentation)] + fragmentation: Fragmentation, + + /// Instrument class. Named values: low-res, high-res, TOF, QExactive. + /// Legacy numeric (Java MS-GF+ `-inst`): 0=low-res, 1=high-res, 2=TOF, 3=QExactive. + #[arg(long, default_value = "low-res", value_parser = parse_instrument)] + instrument: Instrument, + + /// Search protocol. Named values: auto, phospho, iTRAQ, iTRAQ-phospho, TMT, standard. + /// Legacy numeric (Java MS-GF+ `-protocol`): 0=auto, 1=phospho, 2=iTRAQ, 3=iTRAQ-phospho, 4=TMT, 5=standard. + #[arg(long, default_value = "auto", value_parser = parse_protocol)] + protocol: Protocol, /// Number of worker threads for the search loop. Defaults to logical CPU count. #[arg(long, default_value_t = num_cpus::get())] @@ -302,7 +342,7 @@ fn run(cli: Cli) -> Result<(), Box> { // `num_mods_from_file` is populated only when --mod is given and the // file contains a `NumMods=N` line; it overrides the default // `max_variable_mods_per_peptide` (3) below. - let (aa, num_mods_from_file) = match &cli.mod_file { + let (aa, num_mods_from_file) = match &cli.mods { Some(path) => { let n = AminoAcidSetBuilder::parse_num_mods_from_file(path) .map_err(|e| format!("parsing NumMods= from {}: {e}", path.display()))?; @@ -356,8 +396,8 @@ fn run(cli: Cli) -> Result<(), Box> { let param_path = match cli.param_file.clone() { Some(p) => p, None => { - let auto_route_eligible = cli.fragmentation.is_none() - && cli.instrument.is_none(); + let auto_route_eligible = cli.fragmentation == Fragmentation::Auto + && cli.instrument == Instrument::LowRes; if auto_route_eligible { match detect_dominant_activation(&cli.spectrum) { Some(method) => { @@ -404,7 +444,11 @@ fn run(cli: Cli) -> Result<(), Box> { params.charge_range = cli.charge_min..=cli.charge_max; params.isotope_error_range = cli.isotope_error_min..=cli.isotope_error_max; params.top_n_psms_per_spectrum = cli.top_n; - params.num_tolerable_termini = cli.ntt; + params.num_tolerable_termini = match cli.enzyme_specificity { + EnzymeSpecificity::Fully => 2, + EnzymeSpecificity::Semi => 1, + EnzymeSpecificity::NonSpecific => 0, + }; params.max_missed_cleavages = cli.max_missed_cleavages; params.min_peaks = cli.min_peaks; params.min_length = cli.min_length; @@ -650,67 +694,50 @@ fn run(cli: Cli) -> Result<(), Box> { /// last-resort `CID_LowRes_Tryp.param` is missing from the bundled /// resources (a packaging defect, not a CLI input error). fn resolve_bundled_param( - fragmentation: Option, - instrument: Option, - protocol: Option, + fragmentation: Fragmentation, + instrument: Instrument, + protocol: Protocol, ) -> Result { - // Default file when no flags are given — preserves the previous - // hard-coded behaviour. - if fragmentation.is_none() && instrument.is_none() && protocol.is_none() { + // Step 0: default-to-bundled short-circuit. When the caller passes all + // defaults (Fragmentation::Auto, Instrument::LowRes, Protocol::Auto) + // we use the historical hardcoded default. This preserves pre-iter39 + // behavior where omitting all three flags returned HCD_QExactive_Tryp.param. + if fragmentation == Fragmentation::Auto + && instrument == Instrument::LowRes + && protocol == Protocol::Auto { return canonicalize_bundled("HCD_QExactive_Tryp.param"); } - // Step 0: Validate + normalize inputs (mirrors Java NewScorerFactory.get). - // - // Java's normalization rules: - // - PQD or null method → CID - // - null enzyme → Trypsin (we hardcode Tryp; n-term enzymes need - // --param-file directly) - // - null instType → LowRes - // - HCD with instType not in {HighRes, QExactive} → upgrade to QExactive - // - // Our CLI uses 0=Auto/CID for `--fragmentation`, so 0→CID matches Java's - // "null→CID" path. PQD is not exposed in our CLI, so `frag` is never - // rewritten — only `inst` gets the HCD-upgrade mutation below. - let frag = match fragmentation.unwrap_or(0) { - 0 | 1 => "CID", - 2 => "ETD", - 3 => "HCD", - 4 => "UVPD", - n => return Err(format!( - "invalid --fragmentation {n}: valid range is 0..=4 \ - (0=Auto/CID, 1=CID, 2=ETD, 3=HCD, 4=UVPD)" - )), - }; - let mut inst = match instrument.unwrap_or(0) { - 0 => "LowRes", - 1 => "HighRes", - 2 => "TOF", - 3 => "QExactive", - n => return Err(format!( - "invalid --instrument {n}: valid range is 0..=3 \ - (0=LowRes, 1=HighRes, 2=TOF, 3=QExactive)" - )), + // Step 1: Normalize. Java's normalization rules mirrored here: + // - Auto fragmentation → CID (Java's "null/PQD → CID") + // - HCD with low-res inst → upgrade to QExactive (Java's HCD-upgrade rule) + let frag = match fragmentation { + Fragmentation::Auto => "CID", + Fragmentation::Cid => "CID", + Fragmentation::Etd => "ETD", + Fragmentation::Hcd => "HCD", + Fragmentation::Uvpd => "UVPD", }; - let prot_suffix: &str = match protocol.unwrap_or(0) { - // Automatic/Standard: no suffix. - 0 | 5 => "", - 1 => "_Phosphorylation", - 2 => "_iTRAQ", - 3 => "_iTRAQPhospho", - 4 => "_TMT", - n => return Err(format!( - "invalid --protocol {n}: valid range is 0..=5 \ - (0=Automatic, 1=Phosphorylation, 2=iTRAQ, \ - 3=iTRAQPhospho, 4=TMT, 5=Standard)" - )), + let mut inst = match instrument { + Instrument::LowRes => "LowRes", + Instrument::HighRes => "HighRes", + Instrument::Tof => "TOF", + Instrument::QExactive => "QExactive", }; - - // HCD with non-(HighRes|QExactive) inst → upgrade to QExactive (Java rule). - if frag == "HCD" && inst != "HighRes" && inst != "QExactive" { + // HCD-upgrade rule: HCD with low-res inst → upgrade to QExactive. + if frag == "HCD" && inst == "LowRes" { inst = "QExactive"; } + let prot_suffix: &str = match protocol { + Protocol::Auto => "", // empty: no protocol suffix + Protocol::Phospho => "_Phosphorylation", + Protocol::Itraq => "_iTRAQ", + Protocol::ItraqPhospho => "_iTRAQPhospho", + Protocol::Tmt => "_TMT", + Protocol::Standard => "", // standard = no suffix + }; + // Step 1: Try the exact requested combination first. // `{frag}_{inst}_Tryp{prot_suffix}.param` let exact = format!("{frag}_{inst}_Tryp{prot_suffix}.param"); @@ -872,38 +899,24 @@ fn detect_dominant_activation(spectrum_path: &std::path::Path) -> Option, - protocol: Option, + protocol: Protocol, ) -> Result { - // Translate a detected `InstrumentType` to the numeric ID - // `resolve_bundled_param` expects. `None` → 0 (LowRes), mirroring Java's - // `LOW_RESOLUTION_LTQ` default. - let detected_inst_id: u8 = match detected_instrument { - Some(InstrumentType::LowRes) => 0, - Some(InstrumentType::HighRes) => 1, - Some(InstrumentType::TOF) => 2, - Some(InstrumentType::QExactive) => 3, - None => 0, // Java default - }; - - // Translate the activation method to the (fragmentation, instrument) pair - // that `resolve_bundled_param` expects. - let (frag_id, inst_id): (u8, u8) = match method { - // CID: use detected instrument (LowRes default mirrors Java's - // NewScorerFactory). - ActivationMethod::CID => (1, detected_inst_id), - // HCD: use detected instrument; `resolve_bundled_param` upgrades - // HCD+(LowRes|TOF) → QExactive (Java's NewScorerFactory rule). - ActivationMethod::HCD => (3, detected_inst_id), - // ETD: use detected instrument. - ActivationMethod::ETD => (2, detected_inst_id), + let frag = match method { + ActivationMethod::CID => Fragmentation::Cid, + ActivationMethod::ETD => Fragmentation::Etd, + ActivationMethod::HCD => Fragmentation::Hcd, + ActivationMethod::UVPD => Fragmentation::Uvpd, // PQD → CID (Java's NewScorerFactory rule: "PQD or null → CID"). - ActivationMethod::PQD => (1, detected_inst_id), - // UVPD: only QExactive variant exists bundled. resolve_bundled_param - // walks the ladder if missing. - ActivationMethod::UVPD => (4, 3), + ActivationMethod::PQD => Fragmentation::Cid, }; - - resolve_bundled_param(Some(frag_id), Some(inst_id), protocol) + let inst = match detected_instrument { + Some(InstrumentType::LowRes) => Instrument::LowRes, + Some(InstrumentType::HighRes) => Instrument::HighRes, + Some(InstrumentType::TOF) => Instrument::Tof, + Some(InstrumentType::QExactive) => Instrument::QExactive, + None => Instrument::LowRes, + }; + resolve_bundled_param(frag, inst, protocol) } /// Helper to call `input::detect_instrument_type` on an mzML path. @@ -943,6 +956,74 @@ fn canonicalize_bundled(filename: &str) -> Result { )) } +/// Parse `--fragmentation` value. Accepts named (case-insensitive: auto, CID, +/// ETD, HCD, UVPD) or legacy numeric (0=Auto, 1=CID, 2=ETD, 3=HCD, 4=UVPD). +fn parse_fragmentation(s: &str) -> Result { + if let Ok(v) = ::from_str(s, true) { return Ok(v); } + match s.parse::() { + Ok(0) => Ok(Fragmentation::Auto), + Ok(1) => Ok(Fragmentation::Cid), + Ok(2) => Ok(Fragmentation::Etd), + Ok(3) => Ok(Fragmentation::Hcd), + Ok(4) => Ok(Fragmentation::Uvpd), + _ => Err(format!( + "invalid fragmentation `{s}`: expected auto|CID|ETD|HCD|UVPD \ + (or legacy 0..=4)" + )), + } +} + +/// Parse `--instrument` value. Accepts named (low-res, high-res, TOF, +/// QExactive) or legacy numeric (0=LowRes, 1=HighRes, 2=TOF, 3=QExactive). +fn parse_instrument(s: &str) -> Result { + if let Ok(v) = ::from_str(s, true) { return Ok(v); } + match s.parse::() { + Ok(0) => Ok(Instrument::LowRes), + Ok(1) => Ok(Instrument::HighRes), + Ok(2) => Ok(Instrument::Tof), + Ok(3) => Ok(Instrument::QExactive), + _ => Err(format!( + "invalid instrument `{s}`: expected low-res|high-res|TOF|QExactive \ + (or legacy 0..=3)" + )), + } +} + +/// Parse `--protocol` value. Accepts named or legacy numeric +/// (0=Auto, 1=Phospho, 2=iTRAQ, 3=iTRAQ-phospho, 4=TMT, 5=Standard). +fn parse_protocol(s: &str) -> Result { + if let Ok(v) = ::from_str(s, true) { return Ok(v); } + match s.parse::() { + Ok(0) => Ok(Protocol::Auto), + Ok(1) => Ok(Protocol::Phospho), + Ok(2) => Ok(Protocol::Itraq), + Ok(3) => Ok(Protocol::ItraqPhospho), + Ok(4) => Ok(Protocol::Tmt), + Ok(5) => Ok(Protocol::Standard), + _ => Err(format!( + "invalid --protocol `{s}`: valid range is 0..=5 \ + (0=Automatic, 1=Phosphorylation, 2=iTRAQ, 3=iTRAQPhospho, \ + 4=TMT, 5=Standard) or named auto|phospho|iTRAQ|iTRAQ-phospho|TMT|standard" + )), + } +} + +/// Parse `--enzyme-specificity` (`--ntt`) value. Accepts named +/// (non-specific, semi, fully) or legacy numeric (0=non-specific, +/// 1=semi, 2=fully). +fn parse_enzyme_specificity(s: &str) -> Result { + if let Ok(v) = ::from_str(s, true) { return Ok(v); } + match s.parse::() { + Ok(0) => Ok(EnzymeSpecificity::NonSpecific), + Ok(1) => Ok(EnzymeSpecificity::Semi), + Ok(2) => Ok(EnzymeSpecificity::Fully), + _ => Err(format!( + "invalid enzyme specificity `{s}`: expected non-specific|semi|fully \ + (or legacy 0..=2)" + )), + } +} + #[cfg(test)] mod param_resolver_tests { use super::*; @@ -950,7 +1031,11 @@ mod param_resolver_tests { #[test] fn default_resolves_to_hcd_qexactive_tryp() { // No flags → existing default. - let p = resolve_bundled_param(None, None, None).unwrap(); + let p = resolve_bundled_param( + Fragmentation::Auto, + Instrument::LowRes, + Protocol::Auto, + ).unwrap(); let s = p.to_string_lossy(); assert!( s.ends_with("HCD_QExactive_Tryp.param"), @@ -961,7 +1046,11 @@ mod param_resolver_tests { #[test] fn hcd_qexactive_tmt_combo_resolves() { // (HCD, QExactive, TMT) → bundled HCD_QExactive_Tryp_TMT.param. - let p = resolve_bundled_param(Some(3), Some(3), Some(4)).unwrap(); + let p = resolve_bundled_param( + Fragmentation::Hcd, + Instrument::QExactive, + Protocol::Tmt, + ).unwrap(); let s = p.to_string_lossy(); assert!( s.ends_with("HCD_QExactive_Tryp_TMT.param"), @@ -972,7 +1061,11 @@ mod param_resolver_tests { #[test] fn cid_lowres_tryp_resolves() { // (CID, LowRes, Standard) → CID_LowRes_Tryp.param. - let p = resolve_bundled_param(Some(1), Some(0), Some(5)).unwrap(); + let p = resolve_bundled_param( + Fragmentation::Cid, + Instrument::LowRes, + Protocol::Standard, + ).unwrap(); let s = p.to_string_lossy(); assert!( s.ends_with("CID_LowRes_Tryp.param"), @@ -987,7 +1080,11 @@ mod param_resolver_tests { // file is missing (see NewScorerFactory.java line ~120), landing on // the protocol-less file. We mirror that behavior: this combination // resolves to `CID_HighRes_Tryp.param` rather than erroring out. - let p = resolve_bundled_param(Some(1), Some(1), Some(4)).unwrap(); + let p = resolve_bundled_param( + Fragmentation::Cid, + Instrument::HighRes, + Protocol::Tmt, + ).unwrap(); let s = p.to_string_lossy(); assert!( s.ends_with("CID_HighRes_Tryp.param"), @@ -1000,7 +1097,11 @@ mod param_resolver_tests { // HCD with LowRes is invalid (Java upgrades inst to QExactive in // step 0). So (HCD, LowRes, TMT) should land on // `HCD_QExactive_Tryp_TMT.param` after normalization. - let p = resolve_bundled_param(Some(3), Some(0), Some(4)).unwrap(); + let p = resolve_bundled_param( + Fragmentation::Hcd, + Instrument::LowRes, + Protocol::Tmt, + ).unwrap(); let s = p.to_string_lossy(); assert!( s.ends_with("HCD_QExactive_Tryp_TMT.param"), @@ -1013,7 +1114,11 @@ mod param_resolver_tests { // (ETD, HighRes, Phospho) — `ETD_HighRes_Tryp_Phosphorylation.param` // is not bundled, and the protocol-less `ETD_HighRes_Tryp.param` IS // bundled, so the protocol-drop fallback lands on it. Test that. - let p = resolve_bundled_param(Some(2), Some(1), Some(1)).unwrap(); + let p = resolve_bundled_param( + Fragmentation::Etd, + Instrument::HighRes, + Protocol::Phospho, + ).unwrap(); let s = p.to_string_lossy(); assert!( s.ends_with("ETD_HighRes_Tryp.param"), @@ -1022,21 +1127,21 @@ mod param_resolver_tests { } #[test] - fn rejects_out_of_range_fragmentation() { - let err = resolve_bundled_param(Some(99), None, None).unwrap_err(); - assert!(err.contains("--fragmentation")); + fn parse_fragmentation_rejects_out_of_range_numeric() { + let err = parse_fragmentation("99").unwrap_err(); + assert!(err.contains("0..=4"), "error message should mention range, got: {err}"); } #[test] - fn rejects_out_of_range_instrument() { - let err = resolve_bundled_param(None, Some(99), None).unwrap_err(); - assert!(err.contains("--instrument")); + fn parse_instrument_rejects_out_of_range_numeric() { + let err = parse_instrument("99").unwrap_err(); + assert!(err.contains("0..=3"), "got: {err}"); } #[test] - fn rejects_out_of_range_protocol() { - let err = resolve_bundled_param(None, None, Some(99)).unwrap_err(); - assert!(err.contains("--protocol")); + fn parse_protocol_rejects_out_of_range_numeric() { + let err = parse_protocol("99").unwrap_err(); + assert!(err.contains("0..=5"), "got: {err}"); } // ── resolve_bundled_param_for_activation: instrument routing ────────────── @@ -1047,7 +1152,7 @@ mod param_resolver_tests { #[test] fn cid_with_no_detected_instrument_routes_to_lowres() { let p = resolve_bundled_param_for_activation( - ActivationMethod::CID, None, None, + ActivationMethod::CID, None, Protocol::Auto, ).unwrap(); let s = p.to_string_lossy(); assert!( @@ -1059,7 +1164,7 @@ mod param_resolver_tests { #[test] fn cid_with_lowres_detected_routes_to_lowres() { let p = resolve_bundled_param_for_activation( - ActivationMethod::CID, Some(InstrumentType::LowRes), None, + ActivationMethod::CID, Some(InstrumentType::LowRes), Protocol::Auto, ).unwrap(); assert!(p.to_string_lossy().ends_with("CID_LowRes_Tryp.param")); } @@ -1072,7 +1177,7 @@ mod param_resolver_tests { // Most importantly: we must not silently land on the LowRes // bucket when QExactive is detected — verify some param resolves. let p = resolve_bundled_param_for_activation( - ActivationMethod::CID, Some(InstrumentType::QExactive), None, + ActivationMethod::CID, Some(InstrumentType::QExactive), Protocol::Auto, ).unwrap(); // Should resolve to *something* — the ladder may fall back, but // we just want this not to error. @@ -1082,7 +1187,7 @@ mod param_resolver_tests { #[test] fn cid_with_highres_detected_routes_to_highres() { let p = resolve_bundled_param_for_activation( - ActivationMethod::CID, Some(InstrumentType::HighRes), None, + ActivationMethod::CID, Some(InstrumentType::HighRes), Protocol::Auto, ).unwrap(); assert!( p.to_string_lossy().ends_with("CID_HighRes_Tryp.param"), @@ -1096,7 +1201,7 @@ mod param_resolver_tests { // to QExactive. Verify the auto-detect path does the same when // the mzML claims LowRes (e.g., a CID/HCD-mixed LTQ acquisition). let p = resolve_bundled_param_for_activation( - ActivationMethod::HCD, Some(InstrumentType::LowRes), None, + ActivationMethod::HCD, Some(InstrumentType::LowRes), Protocol::Auto, ).unwrap(); assert!( p.to_string_lossy().ends_with("HCD_QExactive_Tryp.param"), @@ -1107,7 +1212,7 @@ mod param_resolver_tests { #[test] fn hcd_with_qexactive_detected_stays_qexactive() { let p = resolve_bundled_param_for_activation( - ActivationMethod::HCD, Some(InstrumentType::QExactive), None, + ActivationMethod::HCD, Some(InstrumentType::QExactive), Protocol::Auto, ).unwrap(); assert!(p.to_string_lossy().ends_with("HCD_QExactive_Tryp.param")); } diff --git a/crates/msgf-rust/tests/cli_smoke.rs b/crates/msgf-rust/tests/cli_smoke.rs index df26475e..f3ce24f1 100644 --- a/crates/msgf-rust/tests/cli_smoke.rs +++ b/crates/msgf-rust/tests/cli_smoke.rs @@ -259,3 +259,74 @@ fn cli_runs_end_to_end_on_tiny_mzml() { "PIN header should be present for mzML output; got: {first_line}" ); } + +/// Regression guard: legacy Java numeric flag values and the new +/// Rust-idiomatic named values must resolve to byte-identical PIN output. +/// Quantms scripts use the numeric form; new docs recommend the named form. +/// If this test breaks, the legacy compat layer is broken. +#[test] +fn cli_accepts_both_named_and_numeric_param_values() { + let bsa_fasta = fixture("test-fixtures/BSA.fasta"); + let test_mgf = fixture("test-fixtures/test.mgf"); + + let dir = tempfile::tempdir().expect("tempdir"); + let mods_path = dir.path().join("mods.txt"); + std::fs::write( + &mods_path, + "NumMods=2\n\ + 229.162932,K,fix,any,TMT6plex\n\ + 229.162932,*,fix,N-term,TMT6plex\n\ + 57.021464,C,fix,any,Carbamidomethyl\n\ + 15.994915,M,opt,any,Oxidation\n", + ).unwrap(); + + let tmp_a = tempfile::tempdir().expect("tmpdir a"); + let pin_a = tmp_a.path().join("legacy.pin"); + + let tmp_b = tempfile::tempdir().expect("tmpdir b"); + let pin_b = tmp_b.path().join("named.pin"); + + // Run A: legacy numeric form (mirrors current quantms usage). + let status_a = base_cmd(test_mgf.to_str().unwrap(), + bsa_fasta.to_str().unwrap(), + &pin_a) + .arg("--mod").arg(&mods_path) + .arg("--fragmentation").arg("3") + .arg("--instrument").arg("3") + .arg("--protocol").arg("4") + .arg("--ntt").arg("2") + .arg("--precursor-tol-ppm").arg("100") + .status() + .expect("legacy form exit"); + assert!(status_a.success(), "legacy CLI form failed"); + + // Run B: canonical named form (mirrors new docs). + let status_b = base_cmd(test_mgf.to_str().unwrap(), + bsa_fasta.to_str().unwrap(), + &pin_b) + .arg("--mods").arg(&mods_path) + .arg("--fragmentation").arg("HCD") + .arg("--instrument").arg("QExactive") + .arg("--protocol").arg("TMT") + .arg("--enzyme-specificity").arg("fully") + .arg("--precursor-tol-ppm").arg("100") + .status() + .expect("named form exit"); + assert!(status_b.success(), "named CLI form failed"); + + let pin_a_content = std::fs::read_to_string(&pin_a).expect("read legacy pin"); + let pin_b_content = std::fs::read_to_string(&pin_b).expect("read named pin"); + + // Row order can vary between separate process invocations (Rayon scheduling); + // compare header + sorted data rows to verify equivalent search output. + let mut lines_a: Vec<&str> = pin_a_content.lines().collect(); + let mut lines_b: Vec<&str> = pin_b_content.lines().collect(); + assert!(!lines_a.is_empty() && !lines_b.is_empty(), "PIN files must not be empty"); + let header_a = lines_a.remove(0); + let header_b = lines_b.remove(0); + assert_eq!(header_a, header_b, "PIN headers must match"); + lines_a.sort_unstable(); + lines_b.sort_unstable(); + assert_eq!(lines_a, lines_b, + "legacy and named CLI forms must produce equivalent PIN output"); +} From 485277f41881ede1453ea7f235c0d89d899cdeeb Mon Sep 17 00:00:00 2001 From: Yasset Perez-Riverol Date: Sat, 23 May 2026 17:39:50 +0100 Subject: [PATCH 4/7] docs: rewrite README.md for post-cutover state MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace the legacy Java-tool README (193 lines, Java 17 + JAR + mvn) with a linear-narrative README for the Rust port (~190 lines, dual audience). Sections, top to bottom: 1. Title + tagline + badges (CI, release, license) 2. What is this? — one paragraph, names UCSD original 3. Why msgf-rust? — benchmark table vs Java on Astral / PXD001819 / TMT 4. Install — release archive, cargo install, build from source 5. Quick Start — minimal command, one paragraph on .pin row shape 6. Common workflows — tryptic DDA, TMT, TSV output, quantms integration 7. CLI summary — table of ~17 most-used flags 8. Auto-detection — activation/instrument detection from mzML 9. Parity vs Java MS-GF+ — short summary; pointer to DOCS.md §8d 10. Citation 11. License — UCSD-Noncommercial; pointer to java-legacy and java-legacy-original branches 12. Acknowledgments quantms operators have a labeled section in #6 + the CLI summary in #7. Researchers see the benchmark proof up front in #3. The full CLI reference, mods.txt grammar, PIN/TSV column docs, training notes, and Java→Rust migration table live in DOCS.md (separate commit). The Java→Rust flag mapping table lives in CLI_MIGRATION.md (separate commit). Co-authored-by: Cursor --- README.md | 254 +++++++++++++++++++++++------------------------------- 1 file changed, 109 insertions(+), 145 deletions(-) diff --git a/README.md b/README.md index ac2748d6..f57bc6da 100644 --- a/README.md +++ b/README.md @@ -1,193 +1,157 @@ -# MS-GF+ (bigbio fork for quantms) +# msgf-rust — peptide identification from MS/MS spectra -[![CI](https://github.com/bigbio/msgfplus/actions/workflows/ci.yml/badge.svg)](https://github.com/bigbio/msgfplus/actions/workflows/ci.yml) +[![CI](https://github.com/bigbio/msgf-rust/actions/workflows/ci.yml/badge.svg)](https://github.com/bigbio/msgf-rust/actions/workflows/ci.yml) +[![Release](https://img.shields.io/github/v/release/bigbio/msgf-rust)](https://github.com/bigbio/msgf-rust/releases) +[![License: UCSD-Noncommercial](https://img.shields.io/badge/license-UCSD--Noncommercial-blue)](LICENSE) -> **This is a lightweight fork of [MS-GF+](https://github.com/MSGFPlus/msgfplus) maintained by [bigbio](https://github.com/bigbio) for use in the [quantms](https://github.com/bigbio/quantms) pipeline.** It contains targeted performance improvements (streaming mzML parsing, reduced memory footprint) and CI/release automation. The primary maintained input formats in this fork are mzML and MGF; mzXML is not available in this fork. -> -> **For the full-featured, officially maintained version of MS-GF+** and the latest upstream features, please use the original repository: -> -> **[https://github.com/MSGFPlus/msgfplus](https://github.com/MSGFPlus/msgfplus)** +> **A Rust port of MS-GF+** — takes mzML/MGF spectra + FASTA in, produces Percolator-ready `.pin` out. Beats Java MS-GF+ on all three benchmark datasets at 1% FDR while running 14-330% faster. -## What is MS-GF+? +## What is this? -MS-GF+ (aka MSGF+ or MSGFPlus) performs peptide identification by scoring -MS/MS spectra against peptides derived from a protein sequence database. -It supports the HUPO PSI standard input file (mzML) plus MGF, and writes -Percolator `.pin` (default) or TSV output. -ProteomeXchange supports Complete data submissions using MS-GF+ search results. +msgf-rust is a from-scratch Rust reimplementation of [MS-GF+](https://github.com/MSGFPlus/msgfplus) (Kim & Pevzner, 2014), the canonical generating-function peptide-identification engine. It reads MS/MS spectra (mzML or MGF), searches them against a FASTA protein database, and emits Percolator-ready PIN rows (or a TSV) with per-PSM features for rescoring. The original Java implementation is preserved on the `java-legacy` branch. -MS-GF+ is developed by Sangtae Kim and the PNNL Proteomics team at the -Center for Computational Mass Spectrometry, University of California, San Diego. +## Why msgf-rust? -## What is different in this fork? +Three datasets, three results (all at 1% FDR via Percolator 3.7.1): -- **Streaming mzML parser** -- replaces the in-memory preload with a single-pass StAX parser, significantly reducing memory usage for large files -- **Spectrum input narrowed to mzML and MGF** -- mzXML, MS2, PKL, and `_dta.txt` are not supported in this fork -- **mzIdentML output removed** -- output is Percolator `.pin` (default) or TSV; feed `.pin` straight into Percolator for rescoring -- **Picocli-based CLI** -- declarative typed flags with auto-generated `-h/--help` -- **Java 17 minimum** -- updated from Java 8 -- **CI/CD** -- GitHub Actions for automated testing and releases +| Dataset | Java MS-GF+ PSMs | msgf-rust PSMs | Δ | Java wall | msgf-rust wall | Wall Δ | +|---|---:|---:|---:|---:|---:|---:| +| **Astral DDA** (LFQ_Astral_DDA_15min_50ng) | 35,818 | **36,170** | **+352 (+0.98%)** | 5:49 | 5:57 | within 2% | +| **PXD001819** (UPS1 yeast tryp) | 14,798 | 14,760 | -38 (-0.26%) | ~150s | **45.88s** | **3.3× faster** | +| **TMT** (a05058 PXD007683) | 10,166 | **11,108** | **+9.3%** | ~2:55 | **2:30** | **14% faster** | -## Requirements +What that means: on Astral we find more peptide hits than Java; on PXD001819 we match Java's hit count at 3.3× the speed; on TMT we find ~9% more PSMs at 14% less wall. The remaining feature-level divergences (lnEValue, MeanRelErrorTop7 normalization) are tracked in `DOCS.md` §8d as research follow-up — they don't gate cutover. -- Java Runtime 17 or higher (use 64-bit Java) -- At least 2 GB of memory (4 GB+ recommended); larger FASTA files require more memory +## Install -## Installation +**Option 1 — download a release archive** (recommended): -Download the latest release from the [Releases page](https://github.com/bigbio/msgfplus/releases). The zip contains `MSGFPlus.jar` with all dependencies bundled. +Grab the archive for your platform from the [Releases page](https://github.com/bigbio/msgf-rust/releases). Five platform builds are published per release: -## Quick Start +``` +msgf-rust--x86_64-unknown-linux-gnu.tar.gz +msgf-rust--aarch64-unknown-linux-gnu.tar.gz +msgf-rust--x86_64-apple-darwin.tar.gz +msgf-rust--aarch64-apple-darwin.tar.gz +msgf-rust--x86_64-pc-windows-msvc.zip +``` + +Each archive contains the `msgf-rust` binary, the `resources/` tree (39 bundled `.param` files + unimod.obo), and LICENSE/NOTICE/README. + +**Option 2 — `cargo install`:** ```bash -# Basic search (writes results.pin in Percolator format) -java -Xmx4G -jar MSGFPlus.jar \ - -s spectra.mzML \ - -d database.fasta \ - -o results.pin - -# TMT search with target-decoy analysis, Percolator-ready output -java -Xmx8G -jar MSGFPlus.jar \ - -s spectra.mzML \ - -d database.fasta \ - -tda 1 \ - -t 20ppm \ - -ti -1,2 \ - -inst 1 \ - -e 1 \ - -protocol 4 \ - -mod mods.txt \ - -o results.pin - -# Direct TSV output (skip Percolator) -java -Xmx4G -jar MSGFPlus.jar \ - -s spectra.mzML \ - -d database.fasta \ - -outputFormat tsv \ - -o results.tsv +cargo install --git https://github.com/bigbio/msgf-rust --bin msgf-rust ``` -## Parameters - -### Required +**Option 3 — build from source:** -| Flag | Name | Description | -|------|------|-------------| -| `-s` | SpectrumFile | Input spectrum file (`*.mzML`, `*.mgf`). Spectra should be centroided. | -| `-d` | DatabaseFile | Protein sequence database (`*.fasta`, `*.fa`, `*.faa`). | +```bash +git clone https://github.com/bigbio/msgf-rust +cd msgf-rust +cargo build --release +# Binary: target/release/msgf-rust +``` -### Core Search Parameters +Requires Rust 1.85+ (see `rust-toolchain.toml`). -| Flag | Name | Default | Description | -|------|------|---------|-------------| -| `-o` | OutputFile | `[input].pin` | Output file path (`.pin` Percolator format, default; `.tsv` if `-outputFormat tsv`). | -| `-conf` | ConfigurationFile | — | Configuration file; command-line options override config file settings. | -| `-t` | PrecursorMassTolerance | `20ppm` | Precursor mass tolerance (e.g., `2.5Da`, `20ppm`, or `0.5Da,2.5Da` for asymmetric). | -| `-ti` | IsotopeErrorRange | `0,1` | Range of allowed isotope peak errors (e.g., `-1,2`). | -| `-tda` | TDA | `0` | Target-decoy analysis: `0` = don't search decoy database, `1` = search decoy database. | -| `-decoy` | DecoyPrefix | `XXX` | Prefix for decoy protein names in the FASTA file. | +## Quick Start -### Fragmentation and Instrument +```bash +msgf-rust \ + --spectrum BSA.mgf \ + --database BSA.fasta \ + --output-pin out.pin +``` -| Flag | Name | Default | Description | -|------|------|---------|-------------| -| `-m` | FragmentationMethodID | `0` | `0` = As written in spectrum or CID if no info, `1` = CID, `2` = ETD, `3` = HCD, `4` = UVPD. | -| `-inst` | InstrumentID | `0` | `0` = Low-res LCQ/LTQ, `1` = Orbitrap/FTICR/Lumos (default for HCD), `2` = TOF, `3` = Q-Exactive. | +This runs a tryptic search at 20 ppm precursor tolerance with the bundled HCD_QExactive_Tryp scoring model, writes Percolator-format PSMs to `out.pin`, and prints per-phase timings to stderr. Feed `out.pin` directly into Percolator (Docker or native) to compute q-values. -### Enzyme and Digestion +A row in `out.pin` is one peptide–spectrum match with 28 columns: `SpecId`, `Label`, `ScanNr`, charge one-hot encoding, then features like `RawScore`, `lnSpecEValue`, `DeNovoScore`, ion-current ratios, peptide-length stats, etc. Full column reference: `DOCS.md` §3a. -| Flag | Name | Default | Description | -|------|------|---------|-------------| -| `-e` | EnzymeID | `1` | `0` = Unspecific, `1` = Trypsin, `2` = Chymotrypsin, `3` = Lys-C, `4` = Lys-N, `5` = Glu-C, `6` = Arg-C, `7` = Asp-N, `8` = alphaLP, `9` = No cleavage, `10` = TrypPlusC. | -| `-ntt` | NTT | `2` | Number of tolerable termini: `0` = non-specific, `1` = semi-specific, `2` = fully specific. | -| `-maxMissedCleavages` | MaxMissedCleavages | `-1` | Maximum missed cleavages (`-1` = no limit). | +## Common workflows -### Peptide Filtering +**Tryptic DDA + Percolator** (default): -| Flag | Name | Default | Description | -|------|------|---------|-------------| -| `-minLength` | MinPepLength | `6` | Minimum peptide length to consider. | -| `-maxLength` | MaxPepLength | `40` | Maximum peptide length to consider. | -| `-minCharge` | MinCharge | `2` | Minimum precursor charge (if not in spectrum file). | -| `-maxCharge` | MaxCharge | `3` | Maximum precursor charge (if not in spectrum file). | -| `-msLevel` | MSLevel | `2` | MS level(s) to search (e.g., `2` or `2,3` for MS2+MS3). | +```bash +msgf-rust --spectrum spectra.mzML --database db.fasta --output-pin out.pin +docker run --rm -v $(pwd):/data biocontainers/percolator:v3.7.1_cv1 \ + percolator -X /data/weights.txt /data/out.pin +``` -### Modifications and Protocol +**TMT 10-plex search with mods.txt:** -| Flag | Name | Default | Description | -|------|------|---------|-------------| -| `-mod` | ModificationFileName | — | Modification file path. If not specified, uses standard amino acids with fixed Carbamidomethyl C. | -| `-numMods` | NumMods | `3` | Maximum number of dynamic (variable) modifications per peptide. | -| `-protocol` | ProtocolID | `0` | `0` = Automatic, `1` = Phosphorylation, `2` = iTRAQ, `3` = iTRAQPhospho, `4` = TMT, `5` = Standard. | +```bash +msgf-rust \ + --spectrum tmt_spectra.mzML \ + --database hsapiens.fasta \ + --output-pin out.pin \ + --mods tmt_10plex_mods.txt \ + --protocol TMT \ + --fragmentation HCD \ + --instrument QExactive +``` -### Output and Performance +**Direct TSV output (skip Percolator):** -| Flag | Name | Default | Description | -|------|------|---------|-------------| -| `-n` | NumMatchesPerSpec | `1` | Number of matches per spectrum to report. Values >1 may skew FDR. | -| `-addFeatures` | AddFeatures | `0` | `0` = basic scores, `1` = additional features (enable for Percolator). | -| `-thread` | NumThreads | All cores | Number of concurrent threads. | -| `-tasks` | NumTasks | `0` | Override task count: `0` = auto, `>0` = exact count, `<0` = multiplier of threads. | -| `-verbose` | Verbose | `0` | `0` = total progress only, `1` = per-thread progress. | -| `-ccm` | ChargeCarrierMass | `1.00727649` | Mass of charge carrier (proton). | +```bash +msgf-rust --spectrum spectra.mzML --database db.fasta \ + --output-pin out.pin --output-tsv out.tsv +``` -### Advanced Parameters +**[quantms](https://github.com/bigbio/quantms) pipeline integration:** -| Flag | Name | Default | Description | -|------|------|---------|-------------| -| `-minNumPeaks` | MinNumPeaksPerSpectrum | `10` | Minimum number of peaks per spectrum. | -| `-iso` | NumIsoforms | `128` | Number of isoforms to consider per peptide. | -| `-ignoreMetCleavage` | IgnoreMetCleavage | `0` | `0` = consider N-term Met cleavage, `1` = ignore. | -| `-allowDenseCentroidedPeaks` | AllowDenseCentroidedPeaks | `0` | `0` = skip spectra failing density check, `1` = allow dense centroided spectra. | +Point quantms's PSM search step at `msgf-rust` and use the standard quantms post-processing. The `.pin` row format is the same; existing quantms scripts using legacy numeric flag values (`--fragmentation 3 --instrument 3 --protocol 4`) keep working without modification (see `CLI_MIGRATION.md`). -## Modification File Format +## CLI summary -Modifications are specified in a text file passed via `-mod`. Each line defines a static or dynamic modification: +Most-used flags (full reference in `DOCS.md` §1): -``` -# Format: Mass_or_Composition, Residues, ModType, Position, Name +| Flag | Purpose | Default | +|---|---|---| +| `--spectrum ` | Input mzML or MGF | (required) | +| `--database ` | Input FASTA | (required) | +| `--output-pin ` | Percolator PIN output | (required) | +| `--output-tsv ` | Optional TSV output | (off) | +| `--mods ` | mods.txt file (Cam-C + Ox-M built-in) | (off) | +| `--precursor-tol-ppm ` | Precursor mass tolerance | 20.0 | +| `--isotope-error-min/-max ` | Isotope error range | -1, 2 | +| `--charge-min/-max ` | Charge range when not in spectrum | 2, 3 | +| `--enzyme-specificity ` | NTT enforcement | fully | +| `--max-missed-cleavages ` | Missed cleavages | 1 | +| `--min/-max-length ` | Peptide length range | 6, 40 | +| `--min-peaks ` | Min peaks per spectrum to score | 10 | +| `--top-n ` | PSMs retained per spectrum | 10 | +| `--fragmentation ` | Frag method (auto-detect from mzML if `auto`) | auto | +| `--instrument ` | Instrument class | low-res | +| `--protocol ` | Search protocol | auto | +| `--param-file ` | Override bundled scoring model | (auto-pick) | +| `--threads ` | Worker threads | (logical CPUs) | -# Static modifications -StaticMod=C2H3N1O1, C, fix, any, Carbamidomethyl # Fixed alkylation -StaticMod=229.1629, *, fix, N-term, TMT6plex -StaticMod=229.1629, K, fix, any, TMT6plex +Run `msgf-rust --help` for the auto-generated help with full descriptions. -# Dynamic modifications -DynamicMod=O1, M, opt, any, Oxidation # Oxidized methionine -DynamicMod=HO3P, STY, opt, any, Phospho # Phosphorylation -DynamicMod=H-1N-1O1, NQ, opt, any, Deamidated # Deamidation +## Auto-detection -# Position options: any, N-term, C-term, Prot-N-term, Prot-C-term -``` +For mzML inputs, msgf-rust reads the activation block of the first MS2 spectrum and selects a bundled `.param` file accordingly. The detection covers HCD/CID/ETD/UVPD activation and LowRes/HighRes/TOF/QExactive instrument classes (via mzML CV params). The bundled model is then resolved from `(fragmentation, instrument, protocol)`. MGF files have no activation metadata, so they go through the CLI defaults (which can be overridden with explicit `--fragmentation` / `--instrument` flags). Full resolution table: `DOCS.md` §4. -See [`docs/examples/MSGFPlus_Params.txt`](docs/examples/MSGFPlus_Params.txt) for a complete example configuration file, and [`docs/examples/README.md`](docs/examples/README.md) for what else lives in that folder. Long-form usage topics (MzID→TSV, BuildSA, changelog, and so on) live under [`docs/README.md`](docs/README.md). +## Parity vs Java MS-GF+ -## Building from Source +PIN output columns are bit-exact with Java MS-GF+ on the agreement bucket (same scan + same top-1 peptide) for most features. Three residual divergences exist as deferred research: `lnEValue` (num_distinct semantics), `MeanRelErrorTop7` (error-stat normalization), and the BSA charge-3 SEV gap from the deconvolution-implementation difference (`known-divergences.md` item #3, kept on the development branch). None gate cutover; aggregate 1% FDR PSM counts beat Java on all three benchmark datasets. Full detail: `DOCS.md` §8d. -```bash -# Requires Java 17+ and Maven (same as CI) -mvn -B verify +## Citation -# The shaded JAR is produced at target/MSGFPlus.jar -``` +If you use msgf-rust in published work, please cite the original MS-GF+ paper: -## Publications +> Kim, S. and Pevzner, P.A. (2014). MS-GF+ makes progress towards a universal database search tool for proteomics. *Nature Communications*, 5:5277. -Kim S. and Pevzner P.A., -"MS-GF+ makes progress towards a universal database search tool for proteomics," -*Nat Commun.* 2014 Oct 31; 5:5277. -[doi: 10.1038/ncomms6277](https://doi.org/10.1038/ncomms6277) +And optionally this Rust port: -Kim S., Gupta N., and Pevzner P.A., -"Spectral Probabilities and Generating Functions of Tandem Mass Spectra: A Strike against Decoy Databases," -*J Proteome Res.* 2008 Aug; 7(8):3354-63. -[doi: 10.1021/pr8001244](https://doi.org/10.1021/pr8001244) +> bigbio (2026). msgf-rust: a Rust port of MS-GF+ for the quantms pipeline. https://github.com/bigbio/msgf-rust -## Contact +## License -For the official MS-GF+ tool: [MSGFPlus/msgfplus](https://github.com/MSGFPlus/msgfplus) +msgf-rust inherits the upstream MS-GF+ UCSD-Noncommercial license. The license restricts redistribution and commercial use; see `LICENSE` for the full text and `NOTICE` for attribution. The original Java implementation is preserved on the `java-legacy` branch (frozen at the bigbio-optimized version) and `java-legacy-original` branch (synced to upstream `MSGFPlus/msgfplus/master`). -PNNL Proteomics: proteomics@pnnl.gov -Sangtae Kim: sangtae.kim (at) gmail.com +## Acknowledgments -For this fork (quantms integration): [bigbio/msgfplus](https://github.com/bigbio/msgfplus) +- Sangtae Kim, Pavel Pevzner, and the PNNL Proteomics team at UCSD's Center for Computational Mass Spectrometry, for the original MS-GF+ engine and the bundled `.param` scoring models. +- The [bigbio](https://github.com/bigbio) maintainers and the [quantms](https://github.com/bigbio/quantms) team. From 5358ef6ef9da640866a4867fd0870abea2f48c50 Mon Sep 17 00:00:00 2001 From: Yasset Perez-Riverol Date: Sat, 23 May 2026 17:39:53 +0100 Subject: [PATCH 5/7] docs: add DOCS.md single-file reference MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add DOCS.md at repo root: the full power-user reference covering all flags, formats, build/test workflow, training notes, and Java→Rust migration. ~505 lines, navigated via a top-of-file table of contents. Sections: 1. CLI reference — every flag with type/default/description and accepted legacy form 2. Mods.txt format — grammar + 3 worked examples 3. Output formats — PIN columns, TSV columns, when to use which 4. Auto-detection — activation method detection from mzML + param-file resolution table 5. Building from source — Rust 1.85+, cargo build/test, the 7 CI-skipped tests and reasons 6. Training new .param files — current state (reuse Java's bundled files), roadmap (port ScoringParamGen), interim workflow (train on java-legacy, --param-file at the Rust binary) 7. Isobaric labeling — TMT and iTRAQ workflows, required mods entries, auto-selected param file 8. Java MS-GF+ → msgf-rust migration — flag rename table, behavior differences, known parity divergences 9. License and citation The DOCS.md design follows the linear-narrative pattern of README.md: no nested directories, no site generator, just one Cmd-F-friendly file. Co-authored-by: Cursor --- DOCS.md | 503 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 503 insertions(+) create mode 100644 DOCS.md diff --git a/DOCS.md b/DOCS.md new file mode 100644 index 00000000..63de6a69 --- /dev/null +++ b/DOCS.md @@ -0,0 +1,503 @@ +# msgf-rust documentation + +This is the full reference for the `msgf-rust` binary and its outputs. For a quick start and benchmark summary, see [`README.md`](README.md). For porting Java MS-GF+ command lines and numeric legacy flags, see [`CLI_MIGRATION.md`](CLI_MIGRATION.md). + +Run `msgf-rust --help` for auto-generated help derived from the same `Cli` struct documented below. + +--- + +## Contents + +1. [CLI reference](#1-cli-reference) +2. [Mods.txt format](#2-modstxt-format) +3. [Output formats](#3-output-formats) +4. [Auto-detection](#4-auto-detection) +5. [Building from source](#5-building-from-source) +6. [Training new `.param` files](#6-training-new-param-files) +7. [Isobaric labeling](#7-isobaric-labeling) +8. [Java MS-GF+ → msgf-rust migration](#8-java-ms-gf--msgf-rust-migration) +9. [License and citation](#9-license-and-citation) + +--- + +## 1. CLI reference + +All flags use kebab-case long options (`--flag-name`). Several flags also accept legacy Java MS-GF+ numeric values (see §8). The CLI is implemented in `crates/msgf-rust/src/bin/msgf-rust.rs`. + +### Required + +| Flag | Type | Default | Description | Legacy form | +|---|---|---|---|---| +| `--spectrum` | path | *(required)* | Input spectrum file. Extension `.mzML`/`.mzml` selects the mzML reader; any other extension (including `.mgf`) selects MGF. | Java `-s ` | +| `--database` | path | *(required)* | Target FASTA database. Decoys are generated automatically by reversing target sequences (see `--decoy-prefix`). | Java `-d ` | +| `--output-pin` | path | *(required)* | Output Percolator `.pin` file path. Always written unless the process exits with an error before the write phase. | Java `-o ` (when `-outputFormat pin`) | + +### Search parameters + +| Flag | Type | Default | Description | Legacy form | +|---|---|---|---|---| +| `--precursor-tol-ppm` | f64 | `20.0` | Symmetric precursor mass tolerance in parts per million. | Java `-t 20ppm` | +| `--charge-min` | u8 | `2` | Minimum precursor charge to try when the spectrum record does not specify charge. | *(no direct Java flag; set via param file in Java)* | +| `--charge-max` | u8 | `3` | Maximum precursor charge to try when charge is missing from the spectrum. | *(same)* | +| `--enzyme-specificity` | enum | `fully` | Enzymatic cleavage enforcement at peptide termini (Number of Tolerable Termini). `fully`: both termini must be cleavage sites (Java `-ntt 2`). `semi`: at least one terminus (Java `-ntt 1`). `non-specific`: neither required (Java `-ntt 0`). | `--ntt` alias; numeric `0`/`1`/`2` | +| `--max-missed-cleavages` | u32 | `1` | Maximum missed enzymatic cleavages allowed per candidate peptide. | Java `-maxMissedCleavages 1` | +| `--min-length` | u32 | `6` | Minimum peptide length in residues (excluding flanking context). | Java `-minLength 6` | +| `--max-length` | u32 | `40` | Maximum peptide length in residues. | Java `-maxLength 40` | +| `--top-n` | u32 | `10` | Maximum PSMs retained per spectrum (ranked by SpecEValue). | Java `-n 10` | +| `--isotope-error-min` | i8 | `-1` | Minimum isotope error offset to evaluate during precursor matching. | Java `-ti -1,2` (first value) | +| `--isotope-error-max` | i8 | `2` | Maximum isotope error offset to evaluate. | Java `-ti -1,2` (second value) | +| `--min-peaks` | u32 | `10` | Minimum number of MS2 peaks required to score a spectrum; spectra below this threshold are skipped. | Java `-minNumPeaks 10` | + +### Modifications + +| Flag | Type | Default | Description | Legacy form | +|---|---|---|---|---| +| `--mods` | path | *(off)* | Path to a Java-format `mods.txt` file describing fixed and variable modifications. When omitted, built-in defaults apply: Carbamidomethyl on C (fixed) and Oxidation on M (variable, max 3 per peptide). Composition strings (e.g. `C2H3N1O1`) are **not** supported — use numeric Da masses. | Java `-mod ` | +| | | | Hidden alias: `--mod` (singular). | | + +### Scoring + +| Flag | Type | Default | Description | Legacy form | +|---|---|---|---|---| +| `--fragmentation` | enum | `auto` | Fragmentation method for bundled `.param` resolution. Named: `auto`, `CID`, `ETD`, `HCD`, `UVPD`. `auto` on mzML triggers activation detection (§4); on MGF falls back to bundled defaults. | Java `-m`; numeric `0`=auto, `1`=CID, `2`=ETD, `3`=HCD, `4`=UVPD | +| `--instrument` | enum | `low-res` | Instrument class for bundled `.param` resolution. Named: `low-res`, `high-res`, `TOF`, `QExactive`. | Java `-inst`; numeric `0`=low-res, `1`=high-res, `2`=TOF, `3`=QExactive | +| `--protocol` | enum | `auto` | Search protocol suffix for bundled `.param` resolution. Named: `auto`, `phospho`, `iTRAQ`, `iTRAQ-phospho`, `TMT`, `standard`. | Java `-protocol`; numeric `0`=auto, `1`=phospho, `2`=iTRAQ, `3`=iTRAQ-phospho, `4`=TMT, `5`=standard | +| `--param-file` | path | *(auto)* | Explicit path to a `.param` scoring model file. When set, overrides all auto-detection and bundled resolution. Required when running a release binary outside the source tree if bundled resources are not present. | Java `-conf` / model path | + +**Bundled default when all scoring flags are at their defaults** (`--fragmentation auto --instrument low-res --protocol auto`): `HCD_QExactive_Tryp.param`. This preserves pre-auto-detect behaviour for MGF inputs and mzML files without activation metadata. + +**Resolution ladder** (when `--param-file` is not set): + +1. Try exact `{Frag}_{Inst}_Tryp{ProtocolSuffix}.param`. +2. If protocol-specific file missing, drop protocol suffix → `{Frag}_{Inst}_Tryp.param`. +3. Final fallback: `CID_TOF_Tryp.param` (HCD + TOF/HighRes), `ETD_LowRes_Tryp.param` (ETD), or `CID_LowRes_Tryp.param` (everything else). + +**Normalisation rules** (mirrors Java `NewScorerFactory`): + +- `auto` fragmentation → treated as `CID` for filename resolution (except mzML auto-detect path, §4). +- HCD + `low-res` instrument → upgraded to `QExactive`. + +Only tryptic enzyme models are bundled; other enzymes require `--param-file`. + +### Runtime + +| Flag | Type | Default | Description | Legacy form | +|---|---|---|---|---| +| `--threads` | usize | logical CPU count | Rayon worker threads for the search loop. Pool is initialised once per process. | Java `-thread N` | +| `--ms-level` | u8 | `2` | MS level to search. Non-matching spectra are filtered at load time. Meaningful for mzML only; MGF has no MS-level metadata and is always treated as MS2 (a warning is printed if `--ms-level` ≠ 2 on MGF). | *(no Java equivalent)* | +| `--max-spectra` | usize | `0` | Bench mode: process only the first N MS2 spectra. `0` = full input. When > 0, TSV output is skipped (PIN is still written). | *(no Java equivalent)* | +| `--decoy-prefix` | string | `XXX_` | Prefix prepended to reversed decoy protein accessions during index construction. | Java decoy tag in `-tda` workflows | + +### Output + +| Flag | Type | Default | Description | Legacy form | +|---|---|---|---|---| +| `--output-tsv` | path | *(off)* | Optional tab-separated PSM report (§3b). Skipped in bench mode (`--max-spectra > 0`). | Java `-outputFormat 1` with output path | + +**Environment variable:** set `MSGFRUST_RSS_PROBE=1` on Linux to print `VmRSS` checkpoints to stderr during long runs (debugging memory use). + +--- + +## 2. Mods.txt format + +msgf-rust reads the same modification file format as Java MS-GF+. The parser lives in `crates/model/src/modification.rs` and `crates/model/src/aa_set.rs`. + +### Grammar + +Each non-comment line is five comma-separated fields: + +```text +,,,, +``` + +| Field | Rule | +|---|---| +| `` | Numeric monoisotopic mass delta in Da. Composition strings (`C2H3N1O1`) are **not** supported in msgf-rust. | +| `` | Single uppercase ASCII letter, or `*` (wildcard). Multi-residue strings like `STY` are **not** supported — declare one line per residue. | +| `` | `fix` = fixed (static) modification; `opt` = variable modification. Case-insensitive. | +| `` | One of `any`, `N-term`, `C-term`, `Prot-N-term`, `Prot-C-term` (case-insensitive; hyphens optional). | +| `` | Human-readable modification name (used in logs; not written to mzIdentML — that format is not supported). | + +**Special directive:** a line `NumMods=N` sets the maximum number of variable modifications per peptide. Parsed separately and applied to `SearchParams.max_variable_mods_per_peptide`. Default when absent: `3`. + +**Comments:** lines whose first non-whitespace character is `#` are ignored. Inline `# ...` comments are stripped from the end of a line (Java `stripComment` semantics). Blank lines are ignored. + +**Conflicts:** a fixed and variable mod targeting the same `(residue, location)` slot is rejected at build time. + +### Example (a) — Carbamidomethyl C + Oxidation M + +```text +NumMods=3 +57.02146,C,fix,any,Carbamidomethyl +15.99491,M,opt,any,Oxidation +``` + +When `--mods` is omitted, msgf-rust uses these two modifications as built-in defaults. + +### Example (b) — TMT 10-plex on K and peptide N-term + +```text +NumMods=2 +57.02146,C,fix,any,Carbamidomethyl +229.162932,K,fix,any,TMT10plex +229.162932,*,fix,N-term,TMT10plex +``` + +Pair with `--protocol TMT --fragmentation HCD --instrument QExactive` to select `HCD_QExactive_Tryp_TMT.param` (§4, §7). + +### Example (c) — Phosphorylation on S, T, Y + +```text +NumMods=3 +57.02146,C,fix,any,Carbamidomethyl +79.966331,S,opt,any,Phospho +79.966331,T,opt,any,Phospho +79.966331,Y,opt,any,Phospho +``` + +Pair with `--protocol phospho` to prefer a `_Phosphorylation` protocol-suffixed `.param` file when bundled. + +--- + +## 3. Output formats + +msgf-rust writes Percolator `.pin` (always) and optionally `.tsv`. Implementation: `crates/output/src/pin.rs`, `crates/output/src/tsv.rs`. + +### 3a. PIN columns + +Tab-separated, one header row, one row per PSM. Rows are sorted best-first within each spectrum (lowest SpecEValue first). Charge one-hot columns are emitted for every integer charge in `[--charge-min, --charge-max]`; the table below uses the default range 2–3 (`charge2`, `charge3`). + +| Column | Type | Description | +|---|---|---| +| `SpecId` | string | `{specID}_{scan}_{rank}` — unique PSM identifier. | +| `Label` | int | `+1` target, `-1` decoy (by **source protein**, not peptide sequence). | +| `ScanNr` | int | MS2 scan number from the input file. | +| `ExpMass` | float | Experimental neutral precursor mass (Da): `precursor_mz × charge − charge × proton`. | +| `CalcMass` | float | Theoretical neutral peptide mass (includes H₂O). | +| `mass` | float | Duplicate of `ExpMass` (OpenMS PercolatorAdapter convention). | +| `RawScore` | int | Rounded MS-GF+ score (`MSGFScore`). | +| `DeNovoScore` | int | Best de novo graph score for the spectrum. | +| `lnSpecEValue` | float | `ln(SpecEValue)`; `-MAX` if non-positive. | +| `lnEValue` | float | `ln(EValue)` where EValue = SpecEValue × num_distinct peptides. | +| `isotope_error` | int | Winning isotope offset (−1…2 by default). | +| `peplen` | int | Peptide residue count **+ 2** (includes flanking pre/post residues). | +| `dm` | float | Precursor mass error (Da) after isotope correction. | +| `absdm` | float | Absolute value of `dm`. | +| `charge2` … `chargeK` | 0/1 | One-hot encoding of assigned precursor charge. | +| `enzN` | 0/1 | N-terminal boundary consistent with enzyme rules. | +| `enzC` | 0/1 | C-terminal boundary consistent with enzyme rules. | +| `enzInt` | int | Count of internal enzymatic cleavage positions in the peptide. | +| `NumMatchedMainIons` | int | Matched charge-1 b/y fragment positions. | +| `longest_b` | int | Longest contiguous matched b-ion run. | +| `longest_y` | int | Longest contiguous matched y-ion run. | +| `longest_y_pct` | float | `longest_y / peptide.length()` (6 decimal places). | +| `ExplainedIonCurrentRatio` | float | Matched b+y intensity / total MS2 intensity. | +| `NTermIonCurrentRatio` | float | Matched b-ion intensity / total MS2 intensity. | +| `CTermIonCurrentRatio` | float | Matched y-ion intensity / total MS2 intensity. | +| `MS2IonCurrent` | float | Sum of all MS2 peak intensities (not log-scaled). | +| `IsolationWindowEfficiency` | float | Always `0.0` (not available from parsed spectra). | +| `MeanErrorTop7` | float | Mean absolute Da error of top-7 most-intense matched ions. | +| `StdevErrorTop7` | float | Population stdev of absolute Da errors (top-7). | +| `MeanRelErrorTop7` | float | Mean signed ppm error of top-7 ions. | +| `StdevRelErrorTop7` | float | Population stdev of signed ppm errors (top-7). | +| `lnDeltaSpecEValue` | float | `ln(rank1 SpecEValue / rank2 SpecEValue)` for rank-1 PSMs; `0` otherwise. | +| `matchedIonRatio` | float | `NumMatchedMainIons / peptide.length()`. | +| `EdgeScore` | int | Per-bond DBScanScorer edge sum (IES + error score). **Rust-only additive column** — not present in Java MS-GF+ PIN output; placed before `Peptide` so legacy column-index parsers still find sequence at the tail. | +| `Peptide` | string | `pre.SEQUENCE.post` with `+mass` mod annotations. | +| `Proteins` | string | Protein accession(s); decoy accessions carry `--decoy-prefix`. Multiple accessions tab-separated when one peptide maps to several proteins. | + +### 3b. TSV columns + +Tab-separated human-readable report. The `Title` column appears **only for MGF** inputs (Java parity). + +**MGF header** (`is_mgf = true`): + +| Column | Type | Description | +|---|---|---| +| `#SpecFile` | string | Bare filename of the input spectrum file. | +| `SpecID` | string | Spectrum identifier (MGF title, or `scan=N`). | +| `ScanNum` | int | Scan number. | +| `Title` | string | MGF `TITLE=` field. | +| `FragMethod` | string | Activation method name (`HCD`, `CID`, …) or `UNKNOWN`. | +| `Precursor` | float | Precursor m/z (4 decimal places). | +| `IsotopeError` | int | Always `0` in current release (winning offset not threaded to TSV). | +| `PrecursorError(ppm)` | float | Mass error in ppm when tolerance is ppm mode; column named `PrecursorError(Da)` in Da mode. | +| `Charge` | int | Assigned precursor charge. | +| `Peptide` | string | Annotated peptide sequence with modifications. | +| `Protein` | string | Single protein accession (primary candidate). | +| `DeNovoScore` | int | De novo score. | +| `MSGFScore` | int | Rounded raw score. | +| `SpecEValue` | float | SpecEValue in `%.6e` notation. | +| `EValue` | float | Database E-value in `%.6e` notation. | + +**mzML header** — same as above **without** the `Title` column (14 columns total). + +Decoy PSMs are included in TSV output; downstream tools label them via Percolator or manual filtering. + +### 3c. PIN vs TSV — which to use + +Use **PIN** when the goal is FDR calibration or rescoring: Percolator, MS²Rescore, Mokapot, and quantms-style pipelines consume `.pin` directly and learn feature weights from the full Percolator feature set (including `EdgeScore`). Use **TSV** for spreadsheet inspection, custom reporting, or tools that expect Java MS-GF+'s flat PSM table. You can emit both in one run with `--output-pin` and `--output-tsv`. For production quantms workflows, PIN is the standard path; TSV is optional diagnostics. + +--- + +## 4. Auto-detection + +For mzML inputs, when `--fragmentation auto`, `--instrument low-res`, and `--protocol auto` (the CLI defaults), msgf-rust peeks the input file before loading the full dataset: + +1. **Activation method** — histogram of `` cvParams across the first 64 MS2 spectra; dominant method wins. Mixed methods trigger an stderr warning but the dominant method is still used file-wide. +2. **Instrument class** — scans `` / analyzer cvParams via `input::detect_instrument_type`; dominant analyzer among MS2 spectra wins. `None` → `low-res` (Java `LOW_RESOLUTION_LTQ` default). + +MGF files carry no activation or instrument metadata → auto-detect returns `None` → bundled default `HCD_QExactive_Tryp.param` unless explicit `--fragmentation` / `--instrument` flags override. + +Explicit `--fragmentation` (non-auto) or non-default `--instrument` disables the activation peek and uses flag-based resolution directly (§1). + +### Activation CV mapping (mzML `` cvParam accession → method) + +| CV accession | Name (PSI-MS) | msgf-rust method | Notes | +|---|---|---|---| +| `MS:1000133` | collision-induced dissociation | CID | | +| `MS:1000422` | beam-type collision-induced dissociation (HCD) | HCD | | +| `MS:1000598` | electron transfer dissociation | ETD | | +| `MS:1000599` | pulsed Q dissociation | CID | Java collapses PQD → CID (`NewScorerFactory`) | +| `MS:1000435` | photodissociation | UVPD | Java UVPD mapping | +| `MS:1000250` | electron capture dissociation | ETD | Mapped to ETD (no dedicated ECD variant) | + +### Instrument detection (analyzer cvParam → class) + +| Analyzer family | Examples | Instrument class | +|---|---|---| +| Ion trap / linear ion trap | `MS:1000264`, Velos, LTQ | `low-res` | +| Orbitrap / Fusion | `MS:1000480`, Fusion Lumos | `QExactive` | +| FT-ICR | `MS:1000480` (FT) | `high-res` | +| TOF | `MS:1000128` | `TOF` | + +### Bundled `.param` files (`resources/ionstat/`) + +39 scoring models ship with the binary (Tryp-centric unless noted): + +```text +CID_HighRes_NoCleavage.param CID_HighRes_Tryp.param +CID_LowRes_ArgC.param CID_LowRes_AspN.param +CID_LowRes_GluC.param CID_LowRes_LysC.param +CID_LowRes_LysN.param CID_LowRes_LysN_Phosphorylation.param +CID_LowRes_NoCleavage.param CID_LowRes_Tryp.param +CID_LowRes_Tryp_Phosphorylation.param CID_LowRes_aLP.param +CID_TOF_Tryp.param CID_TOF_aLP.param +ETD_HighRes_NoCleavage.param ETD_HighRes_Tryp.param +ETD_LowRes_ArgC.param ETD_LowRes_AspN.param +ETD_LowRes_GluC.param ETD_LowRes_LysC.param +ETD_LowRes_LysN.param ETD_LowRes_LysN_Phosphorylation.param +ETD_LowRes_Tryp.param ETD_LowRes_Tryp_Phosphorylation.param +ETD_LowRes_aLP.param +HCD_HighRes_NoCleavage.param HCD_HighRes_Tryp.param +HCD_HighRes_Tryp_Phosphorylation.param HCD_HighRes_Tryp_TMT.param +HCD_HighRes_Tryp_iTRAQ.param HCD_HighRes_Tryp_iTRAQPhospho.param +HCD_QExactive_Tryp.param HCD_QExactive_Tryp_Phosphorylation.param +HCD_QExactive_Tryp_TMT.param HCD_QExactive_Tryp_iTRAQ.param +HCD_QExactive_Tryp_iTRAQPhospho.param HCD_TOF_aLP.param +UVPD_QExactive_Tryp.param UVPD_QExactive_Tryp_TMT.param +``` + +**When auto-detection fails** (missing activation block, unknown CV term, or running outside the source tree without bundled resources): msgf-rust falls back to `HCD_QExactive_Tryp.param` for default-flag runs, or to the resolution ladder in §1 for explicit flags. If no bundled file resolves, the process exits with an error instructing you to pass `--param-file ` explicitly. + +--- + +## 5. Building from source + +**Requirements:** Rust **1.85+** (workspace pins **1.87.0** in `rust-toolchain.toml` because transitive dependencies use `edition = "2024"`). + +```bash +git clone https://github.com/bigbio/msgf-rust +cd msgf-rust +cargo build --release +# Binary: target/release/msgf-rust +``` + +Run the full workspace test suite: + +```bash +cargo test --release --workspace +``` + +**CI-skipped tests:** GitHub Actions (`.github/workflows/ci.yml`) skips seven tests that fail on a clean checkout or are tracked as follow-up work. The release binary is unaffected. + +| Skipped test | Reason | +|---|---| +| `charge_missing_spectrum_uses_per_charge_scored_spec` | `min_peaks` filter regression (pre-iter32 baseline) | +| `spectrum_without_charge_tries_charge_range` | same category | +| `known_peptide_appears_in_top_n` | same category | +| `read_bsa_canno_text_format` | Maven fixture under `target/test-classes/` not generated in CI | +| `read_tryp_pig_bov_revcat_csarr_cnlcp` | same | +| `tryp_pig_bov_revcat_full_set_loads` | same | +| `match_spectra_output_invariant_across_thread_counts` | Rayon tie-breaking nondeterminism when scores tie | + +Reproduce the CI test invocation: + +```bash +cargo test --release --workspace -- \ + --skip charge_missing_spectrum_uses_per_charge_scored_spec \ + --skip spectrum_without_charge_tries_charge_range \ + --skip known_peptide_appears_in_top_n \ + --skip read_bsa_canno_text_format \ + --skip read_tryp_pig_bov_revcat_csarr_cnlcp \ + --skip tryp_pig_bov_revcat_full_set_loads \ + --skip match_spectra_output_invariant_across_thread_counts +``` + +Release archives bundle the binary, all 39 `.param` files, and `unimod.obo` under `resources/` — see [`README.md`](README.md) §Install. + +--- + +## 6. Training new `.param` files + +msgf-rust loads Java MS-GF+ `.param` scoring models **without conversion**. The 39 bundled files in `resources/ionstat/` were copied from the Java distribution unchanged; the on-disk binary format is identical. + +Training **new** models (novel fragmentation chemistry, instrument class, or acquisition protocol) requires a scoring-parameter generator. Java MS-GF+'s **`ScoringParamGen`** is the canonical trainer. + +**Status in v0.1.0:** search and scoring are fully ported and benchmark-validated; **`ScoringParamGen` is not yet ported** to Rust. Track progress on the [GitHub issues](https://github.com/bigbio/msgf-rust/issues) page. + +**Interim workflows:** + +1. **Use bundled models** — covers HCD QExactive tryptic DDA, CID low-res ion trap, ETD, phosphorylation, TMT, and iTRAQ variants (§4 file list). +2. **Train on the `java-legacy` branch** — check out the preserved Java tree (`git checkout java-legacy`), run Java `ScoringParamGen` on representative training data, then point msgf-rust at the output: `--param-file /path/to/MyModel.param`. + +The Rust scorer reads any valid Java `.param` file via `Param::load_from_file`. + +--- + +## 7. Isobaric labeling + +TMT and iTRAQ searches require **both** protocol-aware scoring models **and** correct fixed modifications in `mods.txt`. Set `--protocol TMT` or `--protocol iTRAQ` (or legacy `--protocol 4` / `--protocol 2`) so the resolver prefers protocol-suffixed bundled files such as `HCD_QExactive_Tryp_TMT.param` or `HCD_QExactive_Tryp_iTRAQ.param`. + +### TMT (10-plex example) + +**Mod masses:** TMT10plex = **229.162932 Da** on lysine and peptide N-terminus (Unimod). Carbamidomethyl on C is standard. + +**mods.txt:** + +```text +NumMods=2 +57.02146,C,fix,any,Carbamidomethyl +229.162932,K,fix,any,TMT10plex +229.162932,*,fix,N-term,TMT10plex +``` + +**Command:** + +```bash +msgf-rust \ + --spectrum tmt_spectra.mzML \ + --database hsapiens.fasta \ + --output-pin out.pin \ + --mods tmt_10plex_mods.txt \ + --protocol TMT \ + --fragmentation HCD \ + --instrument QExactive +``` + +### iTRAQ (8-plex example) + +**Mod masses:** iTRAQ8plex = **304.20536 Da** on K and peptide N-terminus. + +**mods.txt:** + +```text +NumMods=2 +57.02146,C,fix,any,Carbamidomethyl +304.20536,K,fix,any,iTRAQ8plex +304.20536,*,fix,N-term,iTRAQ8plex +``` + +**Command:** + +```bash +msgf-rust \ + --spectrum itraq_spectra.mzML \ + --database hsapiens.fasta \ + --output-pin out.pin \ + --mods itraq_8plex_mods.txt \ + --protocol iTRAQ \ + --fragmentation HCD \ + --instrument QExactive +``` + +For phospho-enriched isobaric data use `--protocol iTRAQ-phospho` (legacy `--protocol 3`) and include phospho variable mods in `mods.txt` (§2 example c). + +--- + +## 8. Java MS-GF+ → msgf-rust migration + +msgf-rust accepts **both** canonical kebab-case flags with named enum values **and** legacy Java short flags / numeric IDs. Existing quantms scripts using `--fragmentation 3 --instrument 3 --protocol 4` continue to work. + +### 8a. Flag rename table + +| Java MS-GF+ | msgf-rust canonical | msgf-rust legacy alias | +|---|---|---| +| `-s ` | `--spectrum ` | — | +| `-d ` | `--database ` | — | +| `-o ` | `--output-pin ` | — | +| `-mod ` | `--mods ` | `--mod ` (hidden) | +| `-t 20ppm` | `--precursor-tol-ppm 20` | — | +| `-ti -1,2` | `--isotope-error-min -1 --isotope-error-max 2` | — | +| `-m 3` (HCD) | `--fragmentation HCD` | `--fragmentation 3` | +| `-inst 3` (QExactive) | `--instrument QExactive` | `--instrument 3` | +| `-protocol 4` (TMT) | `--protocol TMT` | `--protocol 4` | +| `-ntt 2` (fully specific) | `--enzyme-specificity fully` | `--ntt 2` | +| `-tda 1` | *(omit — decoys auto-generated)* | — | +| `-e 1` (Trypsin) | *(omit — Trypsin only; other enzymes need `--param-file`)* | — | +| `-outputFormat 1` (TSV) | `--output-tsv ` | — | +| `-thread N` | `--threads N` | — | +| `-minLength 6` | `--min-length 6` | — | +| `-maxLength 40` | `--max-length 40` | — | +| `-maxMissedCleavages 1` | `--max-missed-cleavages 1` | — | +| `-minNumPeaks 10` | `--min-peaks 10` | — | +| `-n 10` | `--top-n 10` | — | +| model path / `-conf` | `--param-file ` | — | + +### 8b. Numeric-legacy values + +Full legacy 0…N → named-value tables for `--fragmentation`, `--instrument`, `--protocol`, and `--enzyme-specificity` (`--ntt`) live in [`CLI_MIGRATION.md`](CLI_MIGRATION.md). clap accepts named values case-insensitively (`--fragmentation hcd` ≡ `HCD`). + +### 8c. Behavior differences + +| Area | Java MS-GF+ | msgf-rust | +|---|---|---| +| Spectrum inputs | mzML, MGF, mzXML, MS2, PKL, `_dta.txt`, … | **mzML and MGF only** | +| Identification output | PIN, TSV, mzIdentML | **PIN + optional TSV** (no mzIdentML) | +| Decoys | Separate target/decoy FASTA or `-tda` modes | **Always auto-generated** reversed decoys from target FASTA (`--decoy-prefix`) | +| Enzymes | Many via param file / CLI | **Trypsin only** in bundled models; other enzymes via `--param-file` | +| Mods file | Composition strings supported | **Numeric Da masses only** | +| Help | Picocli | clap-derived `--help` | +| Memory model | Loads full spectrum list | **Chunked streaming** (5000 spectra/chunk) for large mzML files | + +### 8d. Known parity divergences + +On PSMs where Java and Rust agree on scan + top-1 peptide (the "agreement bucket"), three PIN features still differ systematically. None block production use — aggregate 1% FDR PSM counts meet or beat Java on all three benchmark datasets (see [`README.md`](README.md)). + +| Feature | Divergence | Status | +|---|---|---| +| `lnEValue` | ~4 orders of magnitude mean shift (Rust more confident) | Deferred — `num_distinct` semantics differ (`known-divergences.md` #2) | +| `MeanRelErrorTop7` / `MeanErrorTop7` / `StdevRelErrorTop7` | >1% relative difference on ~99% of agreement-bucket PSMs | Deferred — error-stat normalization differs | +| BSA charge-3 SpecEValue (BSA.fasta + test.mgf fixture) | 1–4 OOM gap depending on deconvolution iteration | Known — deconvolution implementation divergence (`known-divergences.md` #3); kept as dev-branch smoke gate | + +Percolator's learned weights absorb these distribution shifts; rescored FDR results remain competitive or better than Java. + +--- + +## 9. License and citation + +msgf-rust is distributed under the **UCSD Noncommercial License** — the same terms as upstream MS-GF+. The license permits copying, modification, and distribution for **educational, research, and non-profit** purposes without fee, provided the copyright notice and liability paragraphs are retained. **Commercial use requires written permission** from the UCSD Technology Transfer Office (see `LICENSE` for contact details). + +The software is provided **"as is"** without warranty. See [`LICENSE`](LICENSE) for the full upstream text and [`NOTICE`](NOTICE) for port attribution. + +### Citation + +If you use msgf-rust in published work, cite the original MS-GF+ paper: + +> Kim, S. and Pevzner, P.A. (2014). MS-GF+ makes progress towards a universal database search tool for proteomics. *Nature Communications*, 5:5277. + +And optionally this Rust port: + +> bigbio (2026). msgf-rust: a Rust port of MS-GF+ for the quantms pipeline. https://github.com/bigbio/msgf-rust + +The original Java implementation is preserved on the `java-legacy` branch; upstream MS-GF+ lives at https://github.com/MSGFPlus/msgfplus. From 246887c04e8e84bc62c365722e0a10753284a3fa Mon Sep 17 00:00:00 2001 From: Yasset Perez-Riverol Date: Sat, 23 May 2026 17:39:54 +0100 Subject: [PATCH 6/7] =?UTF-8?q?docs:=20add=20CLI=5FMIGRATION.md=20(Java=20?= =?UTF-8?q?+=20numeric=20legacy=20=E2=86=92=20new=20names)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit One-page reference for porting Java MS-GF+ command lines or quantms scripts to msgf-rust. Covers: - Table A: Java flag → msgf-rust flag mapping (18 flags). - Table B: numeric-legacy → canonical named value mapping (one row per legacy ID across fragmentation, instrument, protocol, enzyme-specificity). - Three worked examples (plain tryptic DDA; TMT 10-plex; phospho STY) showing the Java MS-GF+ command line and the msgf-rust equivalent side-by-side. - Notes on behaviors that simply don't exist on the Rust side (no -tda flag, no -e enzyme flag, no mzXML/PKL/MS2 input, no mzIdentML output). msgf-rust silently accepts the legacy forms (--fragmentation 3, --mod, --ntt) for backward compatibility with quantms scripts. New canonical forms are documented for fresh users. Co-authored-by: Cursor --- CLI_MIGRATION.md | 153 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 153 insertions(+) create mode 100644 CLI_MIGRATION.md diff --git a/CLI_MIGRATION.md b/CLI_MIGRATION.md new file mode 100644 index 00000000..65fc3c67 --- /dev/null +++ b/CLI_MIGRATION.md @@ -0,0 +1,153 @@ +# Migrating to msgf-rust from Java MS-GF+ + +msgf-rust accepts both the canonical Rust-idiomatic CLI form (named values, kebab-case) and the legacy Java MS-GF+ form (numeric IDs and short flag names) silently — running scripts written against Java MS-GF+ unchanged is supported. + +This page is a quick-reference for porting commands. For the full CLI reference, see [`DOCS.md`](DOCS.md) §1. + +## Table A — Java MS-GF+ flag → msgf-rust flag + +| Java MS-GF+ | msgf-rust canonical | msgf-rust legacy alias | +|---|---|---| +| `-s ` | `--spectrum ` | — | +| `-d ` | `--database ` | — | +| `-o ` | `--output-pin ` | — | +| `-mod ` | `--mods ` | `--mod ` | +| `-t 20ppm` | `--precursor-tol-ppm 20` | — | +| `-ti -1,2` | `--isotope-error-min -1 --isotope-error-max 2` | — | +| `-m 3` (HCD) | `--fragmentation HCD` | `--fragmentation 3` | +| `-inst 3` (QExactive) | `--instrument QExactive` | `--instrument 3` | +| `-protocol 4` (TMT) | `--protocol TMT` | `--protocol 4` | +| `-ntt 2` (fully specific) | `--enzyme-specificity fully` | `--ntt 2` | +| `-tda 1` (target+decoy) | (omit — decoys always auto-generated) | — | +| `-e 1` (Trypsin) | (omit — Trypsin is the only enzyme) | — | +| `-outputFormat 1` (TSV) | `--output-tsv ` | — | +| `-thread N` | `--threads N` | — | +| `-minLength 6` | `--min-length 6` | — | +| `-maxLength 40` | `--max-length 40` | — | +| `-maxMissedCleavages 1` | `--max-missed-cleavages 1` | — | +| `-minNumPeaks 10` | `--min-peaks 10` | — | + +## Table B — Numeric-legacy → named values + +| Flag | Legacy numeric | Canonical named | +|---|---|---| +| `--fragmentation` | `0` | `auto` | +| `--fragmentation` | `1` | `CID` | +| `--fragmentation` | `2` | `ETD` | +| `--fragmentation` | `3` | `HCD` | +| `--fragmentation` | `4` | `UVPD` | +| `--instrument` | `0` | `low-res` | +| `--instrument` | `1` | `high-res` | +| `--instrument` | `2` | `TOF` | +| `--instrument` | `3` | `QExactive` | +| `--protocol` | `0` | `auto` | +| `--protocol` | `1` | `phospho` | +| `--protocol` | `2` | `iTRAQ` | +| `--protocol` | `3` | `iTRAQ-phospho` | +| `--protocol` | `4` | `TMT` | +| `--protocol` | `5` | `standard` | +| `--enzyme-specificity` (aliases: `--ntt`) | `0` | `non-specific` | +| `--enzyme-specificity` | `1` | `semi` | +| `--enzyme-specificity` | `2` | `fully` | + +clap parses named values case-insensitively, so `--fragmentation hcd` works the same as `--fragmentation HCD`. + +## Worked examples + +### (a) Plain Trypsin DDA, 20 ppm precursor tolerance + +**Java MS-GF+:** + +```bash +java -Xmx4G -jar MSGFPlus.jar \ + -s spectra.mzML \ + -d uniprot.fasta \ + -tda 1 \ + -t 20ppm \ + -ti -1,2 \ + -o results.pin +``` + +**msgf-rust (canonical):** + +```bash +msgf-rust \ + --spectrum spectra.mzML \ + --database uniprot.fasta \ + --precursor-tol-ppm 20 \ + --isotope-error-min -1 --isotope-error-max 2 \ + --output-pin results.pin +``` + +**msgf-rust (legacy-form, drop-in for existing quantms scripts):** + +The Java-style flags above don't translate verbatim — `-s`, `-d`, `-o` are Java-only. But the search-parameter flags do; for example, an existing quantms script that calls msgf-rust with `--fragmentation 3 --instrument 3 --protocol 4` keeps working unchanged. + +### (b) TMT 10-plex search + +**Java MS-GF+:** + +```bash +java -Xmx8G -jar MSGFPlus.jar \ + -s tmt_spectra.mzML \ + -d hsapiens.fasta \ + -tda 1 \ + -t 20ppm \ + -inst 3 \ + -m 3 \ + -protocol 4 \ + -mod tmt_mods.txt \ + -o results.pin +``` + +**msgf-rust:** + +```bash +msgf-rust \ + --spectrum tmt_spectra.mzML \ + --database hsapiens.fasta \ + --precursor-tol-ppm 20 \ + --instrument QExactive \ + --fragmentation HCD \ + --protocol TMT \ + --mods tmt_mods.txt \ + --output-pin results.pin +``` + +### (c) Phospho STY search + +**Java MS-GF+:** + +```bash +java -Xmx4G -jar MSGFPlus.jar \ + -s phospho.mzML \ + -d uniprot.fasta \ + -tda 1 \ + -t 10ppm \ + -inst 1 \ + -m 3 \ + -protocol 1 \ + -mod phospho_mods.txt \ + -o results.pin +``` + +**msgf-rust:** + +```bash +msgf-rust \ + --spectrum phospho.mzML \ + --database uniprot.fasta \ + --precursor-tol-ppm 10 \ + --instrument high-res \ + --fragmentation HCD \ + --protocol phospho \ + --mods phospho_mods.txt \ + --output-pin results.pin +``` + +## Notes + +- `-tda 1` (target+decoy database analysis) is always on in msgf-rust — decoys are generated by reversing target sequences at search time. The decoy prefix is configurable via `--decoy-prefix` (default `XXX_`). +- The Java `-e` enzyme flag is not exposed; Trypsin is hardcoded. For non-tryptic searches, use a custom `.param` file via `--param-file`. +- mzXML, MS2, PKL, and `_dta.txt` inputs are not supported. Use mzML or MGF. +- mzIdentML output is not supported. Use PIN (with Percolator) or TSV. From 2a68e2307b300af27bf997a3134ff20b6f1e82fe Mon Sep 17 00:00:00 2001 From: Yasset Perez-Riverol Date: Sat, 23 May 2026 17:40:00 +0100 Subject: [PATCH 7/7] docs: delete legacy docs/ tree (content migrated to DOCS.md) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The docs/ tree predated the Rust cutover and described the Java tool (mvn build, JAR distribution, Java CLI). Content that still applies has been migrated to root-level README.md, DOCS.md, and CLI_MIGRATION.md. Deleted (38 tracked files): - docs/msgfplus.md (full Java CLI reference — superseded by DOCS.md §1) - docs/msgfdb_modfile.md (mods.txt grammar — superseded by DOCS.md §2) - docs/output.md (PIN/TSV columns — superseded by DOCS.md §3) - docs/buildsa.md (Java standalone SA builder — Java-only utility) - docs/training-scoring-models.md (Java trainer — superseded by DOCS.md §6) - docs/isobariclabeling.md (TMT/iTRAQ — superseded by DOCS.md §7) - docs/troubleshooting.md (Java JVM tuning — Java-only) - docs/changelog.md (Java release notes — GitHub Releases tracks v0.1.0+) - docs/readme.md (Java tool overview — superseded by root README.md) - docs/benchmarks/ (3 PNG figures from Java perf comparison — stale) - docs/examples/ (Mods.txt + activation/enzyme/protocol samples — inline examples in DOCS.md instead) - docs/parameterfiles/ (15 Java -conf templates — no Rust equivalent) Preserved: - docs/superpowers/specs/ — design specs (engineering planning). - docs/superpowers/plans/ — implementation plans (engineering planning). - docs/parity-analysis/ (already gitignored since commit 5e9b63ac; no action needed). Co-authored-by: Cursor --- .../fig1_baseline_vs_currentdev.png | Bin 165778 -> 0 bytes docs/benchmarks/fig2_currentdev_vs_sage.png | Bin 160228 -> 0 bytes docs/benchmarks/fig3_psms_and_peptides.png | Bin 182051 -> 0 bytes docs/buildsa.md | 45 -- docs/changelog.md | 610 ------------------ docs/examples/MSGFPlus_Params.txt | 139 ---- docs/examples/Mods.txt | 75 --- docs/examples/activationMethods.txt | 14 - docs/examples/enzymes.txt | 32 - docs/examples/protocols.txt | 15 - docs/examples/pxd001819_example.pin | 31 - docs/examples/readme.md | 19 - docs/examples/test.tsv | 3 - docs/examples/test_Unrolled.tsv | 4 - docs/isobariclabeling.md | 101 --- docs/msgfdb_modfile.md | 61 -- docs/msgfplus.md | 358 ---------- docs/output.md | 166 ----- ...roOx_Stat_CysAlk_TMT_6Plex_20ppmParTol.txt | 98 --- ...etOx_Stat_CysAlk_TMT_6Plex_20ppmParTol.txt | 116 ---- ...Ox_Stat_CysAlk_iTRAQ_8Plex_20ppmParTol.txt | 98 --- ...yp_DynMetOx_Stat_TMT_6Plex_20ppmParTol.txt | 115 ---- ..._CustomAA_O_Hydroxyproline_20ppmParTol.txt | 111 ---- ...et_NQR_Deamide_Stat_CysAlk_20ppmParTol.txt | 116 ---- .../MSGFPlus_PartTryp_MetOx_20ppmParTol.txt | 114 ---- ..._PartTryp_MetOx_StatCysAlk_20ppmParTol.txt | 114 ---- ...GFPlus_PartTryp_StatCysAlk_20ppmParTol.txt | 114 ---- ...Tryp_Stat_CysAlk_TMT_6Plex_20ppmParTol.txt | 116 ---- ...etOx_Stat_CysAlk_TMT_6Plex_20ppmParTol.txt | 98 --- ...CysAlk_TMT_6Plex_Protocol1_20ppmParTol.txt | 124 ---- ..._MetOx_STYPhos_Stat_CysAlk_20ppmParTol.txt | 115 ---- .../MSGFPlus_Tryp_MetOx_15ppmParTol.txt | 114 ---- .../MSGFPlus_Tryp_MetOx_20ppmParTol.txt | 114 ---- ...Plus_Tryp_MetOx_StatCysAlk_20ppmParTol.txt | 114 ---- .../MSGFPlus_Tryp_NoMods_20ppmParTol.txt | 114 ---- docs/readme.md | 33 - docs/training-scoring-models.md | 181 ------ docs/troubleshooting.md | 124 ---- 38 files changed, 3916 deletions(-) delete mode 100644 docs/benchmarks/fig1_baseline_vs_currentdev.png delete mode 100644 docs/benchmarks/fig2_currentdev_vs_sage.png delete mode 100644 docs/benchmarks/fig3_psms_and_peptides.png delete mode 100644 docs/buildsa.md delete mode 100644 docs/changelog.md delete mode 100644 docs/examples/MSGFPlus_Params.txt delete mode 100644 docs/examples/Mods.txt delete mode 100644 docs/examples/activationMethods.txt delete mode 100644 docs/examples/enzymes.txt delete mode 100644 docs/examples/protocols.txt delete mode 100644 docs/examples/pxd001819_example.pin delete mode 100644 docs/examples/readme.md delete mode 100644 docs/examples/test.tsv delete mode 100644 docs/examples/test_Unrolled.tsv delete mode 100644 docs/isobariclabeling.md delete mode 100644 docs/msgfdb_modfile.md delete mode 100644 docs/msgfplus.md delete mode 100644 docs/output.md delete mode 100644 docs/parameterfiles/MSGFPlus_PartTryp_DynMetOx_ProOx_Stat_CysAlk_TMT_6Plex_20ppmParTol.txt delete mode 100644 docs/parameterfiles/MSGFPlus_PartTryp_DynMetOx_Stat_CysAlk_TMT_6Plex_20ppmParTol.txt delete mode 100644 docs/parameterfiles/MSGFPlus_PartTryp_DynMetOx_Stat_CysAlk_iTRAQ_8Plex_20ppmParTol.txt delete mode 100644 docs/parameterfiles/MSGFPlus_PartTryp_DynMetOx_Stat_TMT_6Plex_20ppmParTol.txt delete mode 100644 docs/parameterfiles/MSGFPlus_PartTryp_Dyn_MetOx_CustomAA_O_Hydroxyproline_20ppmParTol.txt delete mode 100644 docs/parameterfiles/MSGFPlus_PartTryp_Dyn_MetOx_NTermAcet_NQR_Deamide_Stat_CysAlk_20ppmParTol.txt delete mode 100644 docs/parameterfiles/MSGFPlus_PartTryp_MetOx_20ppmParTol.txt delete mode 100644 docs/parameterfiles/MSGFPlus_PartTryp_MetOx_StatCysAlk_20ppmParTol.txt delete mode 100644 docs/parameterfiles/MSGFPlus_PartTryp_StatCysAlk_20ppmParTol.txt delete mode 100644 docs/parameterfiles/MSGFPlus_PartTryp_Stat_CysAlk_TMT_6Plex_20ppmParTol.txt delete mode 100644 docs/parameterfiles/MSGFPlus_Tryp_DynMetOx_Stat_CysAlk_TMT_6Plex_20ppmParTol.txt delete mode 100644 docs/parameterfiles/MSGFPlus_Tryp_DynSTYPhos_Stat_CysAlk_TMT_6Plex_Protocol1_20ppmParTol.txt delete mode 100644 docs/parameterfiles/MSGFPlus_Tryp_Dyn_MetOx_STYPhos_Stat_CysAlk_20ppmParTol.txt delete mode 100644 docs/parameterfiles/MSGFPlus_Tryp_MetOx_15ppmParTol.txt delete mode 100644 docs/parameterfiles/MSGFPlus_Tryp_MetOx_20ppmParTol.txt delete mode 100644 docs/parameterfiles/MSGFPlus_Tryp_MetOx_StatCysAlk_20ppmParTol.txt delete mode 100644 docs/parameterfiles/MSGFPlus_Tryp_NoMods_20ppmParTol.txt delete mode 100644 docs/readme.md delete mode 100644 docs/training-scoring-models.md delete mode 100644 docs/troubleshooting.md diff --git a/docs/benchmarks/fig1_baseline_vs_currentdev.png b/docs/benchmarks/fig1_baseline_vs_currentdev.png deleted file mode 100644 index 56c5c2de9bbffff79a6864c633812abe3c6d8b76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 165778 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
m_d>t?GyvZm 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

;b5<*mh1hM2R3isanfHG zYmfGpDsj2Ps=LG@Zf>4OUMDW@w2|DHrdV#zT$V*35sAT0i4Dpr#Sz%7P+!}9+k5@B-QU4+uDWp|4&g9=vkQBDqOF4@RVI%mK#+RLh3{u_3k6Sr@!CiGRybfS{jc zOz4e_hc$RqItwkv(N)LhTcB1^hCFyi`QYaqXhw$6IcMGH?b5<7jy1zn_8j%yx55SC z*ZX=6L~T1NOH#ZsBP~jL%z#^Ijm*w_^A`^O82RE~3!>mxZfG#K-7`MN>1A%QC!rF&ZR8cU0o+;+ErcqEC3{}z{cp+_Hgx!s<+4ZCC! zdgF3Ory*qSgAS2ZC5hQVjlI(D=5bXQ9JATK{T*5(_C@yJ25M?e)$i!!F_(!YqAXx3QNqX1FEvs8Uev>VsFLxvxm(Z`&d9K$TSGwvV4atAU(RgANARp;cadV;}Rq z7pfk?x9yH}1}cg?xvag?rj_bv4@lM#Y7`p&m6K1{jtGWnpw84NwEe)xZr; zVHdMczsE+$NzB=V=b+=I+!@fCek_U^Y8#zfo=TEI~c1{$Em97G{`=V1sZaE8UyRDU`Wfbqtn?0 zfO(t3z5~;uAva9_R11s_2t!oMQ`YOpU$sv_>e(~4$NK2N@d6&q9}Vwl?9bOcF?%Xd z<~OHPl4evR(6sOUVs_DQ|IGFgIE#kST5Q9_abEm@_YK0BO3AP7rEkcivciN6zOeN^ zBX?K@RclZ3l0vxN-Oiqm5F4UCZc}+Cxp_6wJQrTeGe(M{W$t~JGq6Az51v7H{{Q1) zqJ~vx|0io1PKQ(ZZ!kc9a6I_#cB9&fII-T3{gv$v%AL>KVw1T}2_?^)=uj+);7f>V z?9?fha&AcNstfwoGQ?ihR4A$>(x^NvJ;fqWdROyESIN4=O8p8VN-dWbc7i#NpJJ=4 zs_eQUq7!uOVYnEpA2NZFi8~x{I9D~KF7eO4@1Ez z9wS0Q$3q4p&hDHyFYXq{C*ineW=uBhI-2c3sgMTRQI*x^;$M3yjfg+_<4XrXjbH@_klDPt?ep zsv0T}cg2fcAIcp0&y>Lr!D{Y`LLXqX-}^+(!8kCgtL5aC>8ph`S)`JO+t9@W#d@Qe zQYe>pU8!Ds$MG|6f;|_52h$R6anuA#+1G|BG_nkiZkPaN6NF8}!DLMm>4DiNqza--^b$2K>$4(NMW?{ z-9>~5$}sMCj;#Im*xz^l&vRRwjE{u!YTw~pvT|JH`;kkHNjD#)jkXvnza4+oVA_#- zQN*aQZ#CZy4&`CvwDWs!CqJqZwO8t}7_?J3+a<8$i>Ue|vzlkk&NjxW$MU2s-Ghz# z;~Olb6_hi3Z4Czt7IypW7;P(!8P-l?zN3F7B3Em7QfoX?(#)o4>%7MiewhK}4NjfX zwZC9`82>FG!*}Lqs|{sE9H-+Zj^!Ly9C>)l=XZ==vq&&s!S|ir-u#{SgG`lTJI(pO zZ8`J9`aN9nKdJ=}<~pcsRNr2A(ail~l1BJMyg{y1=EN0`XEnup+cI4gUu|sZy40%j zbMJjlrqE~sZBrUl;aehyZoi`;D~-InO~zZlhFiGjH(x%)Di{rpXTv_hjGo-FPH2cN z{}tO&si3Hwd5G&))9=g*qwOXq#J@v3NQOPV#;{O{@aH)PU*4dAj)1Ye8~x*5$O#xNO+)Xg?5T^=n{ubo zF&36$`}jjv`H}ra74ee_jXfg9@6@4+;ntl!X`+@AnWZ3KPYHRir}XPfW~Dm4(cUbC ze7r7^?54)xVOO!H^AG)Vr+!RBbjZGLXZczC-x=+Gti&J6KW}ntl%)0|ATuAy z#ccIph37rr&0OA3fL@N;`6|0Uir&dQXW0qu;T1yVyxZmMrJG;0&$@7D?OvU!?gpK8 zlR|u2A#&V`Ey==VNloKbqt3m_++$~XOr^8ppO4sd9BPQRshQFaM$`<~kDp_E+mu=~ zR;Y&8+?kPeQi}gD?0MNpZd`u>6|S#7*Pslni@fZv!nZfD~BGq)_`;|Y1|Fq2aXKQ3sEUaU0!Vp`rAnR>CSU}`VBuT%M%0_n}H zvmHmGb9Os~8rP*YoD2{>f7OD;D$K>2=YnHjlGhGPd51?Yo*nd@H4CT9xJGNS0Rpb{ zbEu5mbwF?~h057ZUR%+Tam$CReCv@r>yGv9iLCgtPFa5TWN!19pi2^}cSW!A>ZS(p znT0R-3z=U=Y_?N|&L*nO;oLJ$I*mFcaBqn;%6z@*HP3;cs3294zVbNiT;1mv5ds@7 zoqgDs>99DEwXHPCd^pnL8h2WBs<88%l5=venJ4ZX4$)3I(e>)iDWymC%u93Bm@Qk< zZgKBOPC^(@v2Rj(?{=1G)vw`e_nOzUPiQ<*J^Se7!#`hf2L@Sao^i_5yT|4%+ibM+ z$>}QgjPa@Zp3y)}_5=jS)v8LFVj@k!SXJ}Bx0B{nca6c-{^eF3tN}T=3ohSYNiv3m zk9JE=SAAG-sb~7BXODL2iN3>5&DUj{J&(P0e5JC}e~Uw&s zf-Q4>6M#%EDYwk(M=(OU)H_49p!R*#x)jIV{Tz0I9;pM0>@dr8pLXBY0H4{6c)cOLR?7h|K-JnyN z;#{Ao{dQ&FxQ9Of?1BinPm;~2hD@!UKc!9H;Sg)!t*^>+HeKc|X{~vtv8i(rTYrCB z?DDwd;`VBj-Np{-ucm5pyeGDNA4EC#jFT}zZ+7??zwb;|^-juayA^m(#DOm>sa?uz z`QBL7uLXzu$0K^(y1(ehi+eXU^LgF*6~?AJV%eI+q0Lr%fVVr5HSB5ad;PfT@5Y9z zc5z;9YTpY){nNE>#vpg3udUcnDoQA^Kv&%-bnxJJ#iUlbl^a|t{!rVakRQRVme=TJ z8>#8GM@2Hn(5j+HBD)5C%y5f{RqRMC_9>r-7jw%B*3$l}h_DM!b=66K`#6M={~ zbjT{2Z!(?`Iw#jf31M>-a{~EbWC7oxNV;-*7@Kn%#g##wr8;=yVw%Mr;E|Kybg z!N5%a`aszJtD#-850%T(E~_5#T(0vUh#&JCOk~+3dcLVqu<>RK@0V~p-!b8W$9D0nKjTg_cza=U}q)QaVO(+%)N++b&Tz+!)Dqm-#=viR0CK-=u zb)G|7rheh^tsdNY4QBghvk46z8qOjIHr?#= zai#X9e)1+?kAHg_+B2TAx9)Pvt?6;HseKE@YhFw#zuQL{SFo&1;EM7bS6}@$&P&R6 z?S2maK=uo*S8H5PgwLAnRvBjHzPDxc;p?X{hMk^0O{t*52~Jv|dp#*kHQHB{Lnk=VlOehQ?15`UqFS2~?a(S>2gMFa}(DA(og0 za0irhA!BEJNzi}KK}oey>zD1Ur}|zkI-hJ|JLe$hG+4R=-RU{B7o zg<|R%XAhpYdhUA;jwBQ^KwQ`tN%)sO0yMA}WVXDvK4P(F(}N9Auo> ze7A&kQ`boICmFaNA3E>S~Wu9}L`^urCRRQii#Ks6ud+K;!%;pBsaxTq#iTBfoR* zpwau?KOFN_Mq+edyfdi}*nW$HimSSJGqM_zEv_EVx|Mfyid^2nkMxzWk`3_Bvb0KG_zjeldcxNTEjU z*xR2^m1DhP)@ASdV#VBx&k>h}FL`~tz?K&R0-`$(;tw9%1?Dd2d8(9sZ^b*+H`*F4 z#eOdeSMnHB-l}eFyJ>k3dz%20Owm}sxOrICCh$Hsy5;^MLADd`oIBf1)si|D6Kndr zW}j^>eiSi0LrLtMyQ*FA{Fz+m!jXlTqFnda)b04}-F=(JrY?U?L%NcJ-*yOWHk49w z5m5wbrCYa!yZGv@yMT6|L_hFCpDNf%$^&Q?%8!{Q_pS=boPxpypykRvL5I>YfL!Of z(-$3C;9Q{}X&A`bKq}THVHl`S@74XqhF(=$eyA+)KfOPbj!g@YM*NZ<2B;Dsx!?MA zWF7MPSa%xfQDq9SKiw$#96{b7SYAmT7)4-^#PQV4@O&}e-Dei--&tqdG0UMn(*pLs zbI43yx>(0AQtmBrMX2W7e)`dj3zl&kYbag6N9`iuAts;6&!Zb)`HC&)I519^j21Gi za1TRVarlpm0bR9Fq%E3C9;5f21TsO{lr96x#5$2OG6~YfV3F;#6mK>AxA3sig3i@S zlW~tF3}jnKd{YCGV*hdTNUm!tNC?X9XY@=AvneJF`!Dp4@O=4b5*9rZQ`Js8Xpo|RyHqd? z#k@1Xgybq830s2;(FU@(TlqH$8!lJ^X0CNQ1I%h!_0gdpLL_tTQ#5Gi50_mssLRa} zrZ--{*^x3c4=y>lWXa5#Y$ey`tXw{GpWn@MVK)|Xu9TDW zd%W?i{=AJ_k4xX&czNL;hnU-Q6gbDk^EyOEbd!$lEE*~q?iW3OKtRw}QisDAu8|CN z79y|}DrS|?C^h7aw%SsF+&&){w1wGaZSklhH~{E<#FJp|PzMTA){!9;m7v>2 zaZ%j-(E74g<(on&L}F5ZQ9A)P2AOv6XvH0UvH>oF$~C)u;hJ5<;s$K&AiR=k5|4=% z){f;c*!eGerYLNgRC45ji*ZECgHl<+Q1?iDIcOZNxM`YTDaLR8zEwG36r6#M!H|ar zLU~{TMl__bPA!HQIw2Nybz;15HC*Ch*2RX|V!|a!HAyCSokV?-%`P5iJ-{xKT_0z9 z9IOz34;>}9dTzGJ5P$ZM=N^<4S0S~mlX&RE1NQTtL0;Ct{M8Z^Y%4uZ%f{_9$?q~D zoJQcO7sMQ-21x8wjJa@_8R9dBWf!z#Tr9R57aTOj_h-YL8Fm< z+B>xA}83%CKXf%g4uDeY>w@U~jH2VpC@u3)LH=XL$gpmx65YuQ~AnDFRd>}NOS9(Ubj6JPGn zFAv?LX4ha@s?I&?$zWnPhCTEYz^Fib2JUPZd?IW;7eL0}F+X}{IUXU~`IVnfv=q-^ z)4+jduAHE8m9!_2tQXAooDPYCHulK{qXEMihOA7hudr-8aRXBtSsT_t)9L+b=oY5& zl{Jcyx`Ze}{l#Jf9@-_WS+1P-9)c2;P+FFv=_lnY@JbD#!oxG9bDlz7*UAp1e`yys zcx$)W^L!$UZx=Rf+R}49%vlpf5>y>0_%b%VGd=3Y7E&yTedEk!;V+OceoCB%z_7L1 zqO2l@7(_BDX2l%ilk+NSOh;A8I{<3C%;|LES#;lPDh+^m%p z{8(Sw(%l5xB*)f0YSEclyrkAh$7Nm5-JQxi*ycx+oVLgMLGrP6a%DF z8U{pi2RdMeb1Nk<@o7&wmJ^*pSA9|uHU6G{uPpMJ}Hb}&?HkEi%vfs)!@gG zd9+@7;F`X#L)v7h-6^A&N{sIWltTHGG*eb#jGG5vuZ)J1a;zFUcWSHDRQ6!<7qB6C ziC&&}P{f}$o>wPb-Jg5|R5s?3Dbb<+Fc>_R@DY|J zmTLv`kcaSU6<0}J$T^j=&JRVGiRUhC{}H+y$s_8w#Na)%v03<KfRg6t)o=tT%BgWDB5Gxs z-^UiQ#@!!*c&Gyp#mY3cFWo%KG_y%9Te$?Gce9q>un)ntVW&TT9oU1?io(qi2+za0#QPPkhD21 z=nFgRAgG!+XPw$y&Z28{-SJ)8T^@_?9ebG|ZG1=O*R8nHH^onp1phCwRiuk?S&zjw z>nMuXB%Q9Dme}WZ*F3!IDj~K?vlYmH&Pp7CyHEOEllBZ_zi?*8#}Ek{A0cRW?p4ha zPe|&}z9^qdZRK$iDI3*|jRIC8lxC}9+Kk26*2h%_YH&u!oE2Ect7dTuxAVC#ZBE;_ z?bWPz;x@b*BJj#vnKJ6J$3Y0>C~SM9Djw1FTX4>UcDG}ebG*!6b&rFcWi1vD&DV^N zJv@?GNXG<-lJvAqFFEq9E8YcXzpmB}y>e(`j}->K^nGEj#J$U3BmI)ki7*(aT}g)@ zNm+DD_#NIbSG_i%I8z_eAk&dMG`AwY1Kb3qHI!H*%ce>v(0Qv249J!W27uwoVt81l za?Ekm^D>;sV>V?Y+PNZv3aoDxuRpwwavK4P^>(%po|6+2R305J`}ZGQuX}!8+U%!q z9<2jvpM1<@#mEoA9{n*NN5j-(7zU7P8zZ2>(E*C6zc=~rcy~=;noiwd*4JE9>G@1f z9_4Dx<^;QV;jlz85tk>MDqVR}%NAuS2j+qHRnl^lVuMhTYKgOW!t-&HbOy>SgnL+=%)T_UZ**Ff1HM(fCAvHL+wGzxTpTW)bE)5AJAik6yP zD{D%wFO96!!aGxV5H7cQ%b*vwey<+sJ~S-SVVx-?U}OJDeErWx*d@bm1(C9i7bd!f zzxmGZP6aMJujX>Q=qj;F7RcQw9k0pMxa5}p{5`{z;aT|y#lAQvMbu*~YE&R{{FjR6Kt{7XN>i88pb>lr&`z$Ea?c#FPl3#6SK3n*- zz+yXiem8E7XxK7^S0?!ho@Y|w*(bGqOZmSqIi?u1&1_3c@q4zSoKa*y1!bdCmU)+* z=GdeC;(jSaDs{E9#0>PsN5n&<^-}HdJN#j9rPCI7L6iO>&v*@=nW28fsS*P3~iV$CiD4PD8#|+sF8>A4A1L8 zxfhnY?`S0}CG|cW(;qf|bEul+=J8O!Ilzn31xp^-e7bZ&UNtg{R$BEy2{c3{$I{q` zrj(^TF&!bdP#Tvz}7eZ^+2bYsmGA0*7GKF_x0MM64$hCe>*3lwf|^5$z}J*w}RH zbh-E`J7Uda!IC_$1Qy|3YReCK-{EWVzDM;-%{&Y3cs1o!>T*>=ZoNA-+K}~^DP)~; ziC@xq&Kqi??)VfqabE=mI69@f>aC!ZwlS1AP7()6&7~u6Nw>^C)0wIDVWBWv!Zr@W z#w%wmU5<)%+blWT-2$5#rcvzg>6qM+h?drdpIY@dJugh{oG+PgNK@~Qt-aH=IlK&7 zz5&p@4SD)&vmt2L0oisZ%BGz-(7V#rK7gw6KK^wTH`S-pl`O>d#49tf<7atu7hEWe z)3>Z)#quM==7SM#D=(doZ0mk%&38e626gk|UrA5CS6&E)ph27bs_Wxb~f zItZkpFd%zYjbZ_ZD�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�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 WnX~xn7o|w of encodedLength="0" - -**2013-04-03 v9501** - -- Previously, spectra are ignored in the search if the number of peaks is less than 20 for all types spectra. Now, for TOF spectra (i.e. -inst 2), this number has been changed to 3. - -**2013-04-02 v9494** - -- The following features are added in the SpectrumIdentificationItem when "-addFeatures 1" - - MeanErrorAll: Mean of mass errors of explained fragment ion peaks - - StdevErrorAll: Standard deviation of mass errors of explained fragment ion peaks - - MeanErrorTop7: Mean of mass errors of 7 fragment ion peaks with highest intensities - - StdevErrorTop7: Standard deviation of mass errors of 7 fragment ion peaks with highest intensities - -**2013-03-25 v9436** - -- Added TMT scoring model for HCD/HighRes (-m 3 -inst 1) -- Bug fix: duplicate PeptideEvidence id in mzid output -- Bug fix: crashing while using user-trained scoring parameters - -**2013-03-05 v9324** - -- Added Q-Exactive unlabeled phosphorylation parameters -- Bug fix: recognizing ETD+SA spectra in mzML as CID - -**2013-02-27 v9324** - -- Minor bug fix: mistakenly assigning 3 mods to a N-term amino acid. - -**2013-02-15 v9312** - -- Added scoring parameter sets for Q-Exactive iTRAQ (-inst 3 -protocol 2) and iTRAQ phosphopeptide enriched (-inst 3 -protocol 3) samples. - -**2013-02-15 v9284** - -- When "-protocol" parameter is missing, MS-GF+ automatically selects an appropriate protocol depending on the modification file. -- In the mzid output, Enzyme has attributes "missedCleavages". - -**2013-02-14 v9249** - -- Scoring parameters for Q-Exactive (-inst 3) have been added. - -**2013-02-04 v9244** - -- A bug (crash with an exception) in edu.ucsd.msjava.ui.ScoringParamGen has been fixed. - -**2013-01-03 v9176** - -- "-ti" parameter accepts only two comma separated integers, i.e., "-ti 1" will be rejected. -- MzIDToTsv adds "Title" column to the tsv file if the input spectrum is the mgf format. - -**2012-12-19 v9107** - -- "No enzyme" (-e 1) was renamed to "unspecific cleavage". -- "No enzyme (peptidomics)" (-e 9) was renamed to "no cleavage". -- \...\ in the mzid output now shows right CVs for -e 1 and -e 9. -- The following bug has been fixed - - Precursor errors are negated when MzIDToTsv was run. - - C-term specific modifications do not show up in result files. - -**2012-12-10 v9014** - -- The following bug has been fixed - - Ignoring some spectra when -n value is larger than 1 - -**2012-11-30 v9012** - -- The following bugs have been fixed - - Profile spectra should be ignored but not. - - Peptides shorter than MinLength are reported. - - Redundant proteins are reported in the same line in tsv files - - Some SpectrumIdentificationResult elements have no SpectrumIdentificationItem element. - - Different PeptideEvident elements have the same ID. - -**2012-11-09 v8884** - -- Bug fix: crashing while reading mzML files converted from wiff - -**2012-11-09 v8873** - -- Fixed a bug of ignoring N-term peptide when N-term Met cleaved peptide exists. -- Add scan numbers for NIST mgf files - -**2012-10-30 v8806** - -- Fixed a bug in edu.ucsd.msjava.misc.MS2ToMgf - -**2012-10-29 v8792** - -- Fixed bugs to ignore N-term fixed mods in the output -- Added edu.ucsd.msjava.misc.MS2ToMgf - -**2012-10-11 v8719** - -- Fixed bugs reporting NaN as additional features when spectrum has charge 0 - -**2012-10-04 v8605** - -- Updates to handle multiple charge states in the ms2 format - -**2012-10-03 v8597** - -- Fixed the bug to erroneously report precursorMz in converted tsv files - -**2012-09-26 v8540** - -- Update MS2 parser to support -- Old MS2 format () is no longer supported - -**2012-09-20 v8490** - -- Fix the following bugs: - - Same PeptideEvidence occurs more than once - - SearchModification/SpecificityRules is always empty - - Unknown modification cvParam does not have cvRef - - SpectrumIdentificationResult has no SpectrumIdentificationItem -- MzIDToTsv -o TSVFile is now an optional parameter. - -**2012-09-18 v8477** - -- The extension of target/decoy concatenated database file has changed from .revConcat.fasta to .revCat.fasta. -- \*.revConcat.fasta: decoy proteins have prefix "REV\_" (used by MS-GFDB) -- \*.revCat.fasta: decoy proteins have prefix "XXX\_" (used by MS-GF+) - -**2012-09-18 v8472** - -- Bug fix: N-term or C-term residue-specific modifications (e.g. pyro-glu from Q) will have locations 1 (N-term) or length (C-term). -- Fix a bug to write SpectrumIdentificationResult twice for some spectra without precursor charges - -**2012-09-17 v8449** - -- Fix a bug in parsing Agilent mzML files - -**2012-09-13 v8442** - -- Fix the bug ignoring PSMs with IsotopeError=0, when MinIsotopeError was negative -- Change the '-ntt' parameter to set the minimum number of termini following the enzyme specificity rule -- Change the default value of '-ntt' from 1 to 2 -- Fix the bug to set "fixedMod=true" for variable modifications -- Fix the bug not showing fixed modifications in the peptide list -- Fix the bug to show the location of N-term modification as 1 instead of 0 -- Fix the bug to calculate massToChargeRatio as neutral masses instead of charged masses -- Replace the cvParam showing the dissociation method with a userParam named AssumedDissociationMethod in the SpectrumIdentificationItem - -**2012-08-30 v8299** - -- Provide MzID to TSV converter (edu.ucsd.msjava.ui.MzIDToTsv) -- Ignore profile spectra in the analysis -- Support JRE 1.6 - -**2012-08-29 v8297** - -- Fix minor bugs -- Add the scan number CV in the output - -**2012-08-27 v8283** - -- Fix minor bugs diff --git a/docs/examples/MSGFPlus_Params.txt b/docs/examples/MSGFPlus_Params.txt deleted file mode 100644 index 66282805..00000000 --- a/docs/examples/MSGFPlus_Params.txt +++ /dev/null @@ -1,139 +0,0 @@ -# SpectrumFile -# *.mzML or *.mgf -# Spectra should be centroided (see below for MSConvert example). Profile spectra will be ignored. -# Use of -s at the command line will override this filename -#SpectrumFile=InstrumentFile.mzML - -# FASTA file -# "*.fasta or *.fa or *.faa -# Use of -d at the command line will override this filename -#DatabaseFile=Proteins.fasta - -# Prefix for decoy proteins in the FASTA file -#DecoyPrefix=XXX - -# Precursor mass tolerance -# Examples: 2.5Da or 30ppm -# Use comma to set asymmetric values, for example "0.5Da,2.5Da" will set 0.5Da to the left (expMasstheoMass) -PrecursorMassTolerance=20ppm - -# Max Number of Dynamic (Variable) Modifications per peptide -# Default: 3 -# If this value is large, the search will be slow -NumMods=3 - -# Modifications (see below for examples) -StaticMod=C2H3N1O1, C, fix, any, Carbamidomethyl # Fixed Carbamidomethyl C (alkylation) -StaticMod=229.1629, *, fix, N-term, TMT6plex -StaticMod=229.1629, K, fix, any, TMT6plex - -DynamicMod=O1, M, opt, any, Oxidation # Oxidized methionine -DynamicMod=-187.152366, K, opt, any, AcNoTMT # Residue tagged by MSGF+ with static TMT6, but is actually acetylated and does not have TMT - -# Custom AA specification -#CustomAA=C3H5NO, U, custom, U, Selenocysteine # Custom amino acids can only have C, H, N, O, and S -#CustomAA=C6H11NO, X, custom, X, Leu_Ile # Leucine or Isoleucine - -# Fragmentation Method -# 0 means as written in the spectrum or CID if no info (Default) -# 1 means CID -# 2 means ETD -# 3 means HCD -FragmentationMethodID=0 - -# Instrument ID -# 0 means Low-res LCQ/LTQ (Default for CID and ETD); use InstrumentID=0 if analyzing a dataset with low-res CID and high-res HCD spectra -# 1 means High-res LTQ (Default for HCD; also appropriate for high res CID); use InstrumentID=1 for Orbitrap, Lumos, and QEHFX instruments -# 2 means TOF -# 3 means Q-Exactive -InstrumentID=1 - -# Enzyme ID -# 0 means unspecific cleavage (cleave after any residue) -# 1 means Trypsin (Default); optionally use this along with NTT=0 for a no-enzyme-specificity search of a tryptically digested sample -# 2: Chymotrypsin, 3: Lys-C, 4: Lys-N, 5: Glu-C, 6: Arg-C, 7: Asp-N, 8: alphaLP, 9: No Cleavage (for peptidomics), 10: TrypPlusC (cleave after K, R, or C) -EnzymeID=1 - -# Isotope error range -# Takes into account of the error introduced by choosing non-monoisotopic peak for fragmentation. -# Useful for accurate precursor ion masses -# Ignored if the parent mass tolerance is > 0.5Da or 500ppm -# The combination of -t and -ti determins the precursor mass tolerance. -# e.g. "-t 20ppm -ti -1,2" tests abs(exp-calc-n*1.00335Da)<20ppm for n=-1, 0, 1, 2. -IsotopeErrorRange=-1,2 - -# Number of tolerable termini -# The number of peptide termini that must have been cleaved by the enzyme (default 1) -# For trypsin, 2 means fully tryptic only, 1 means partially tryptic, and 0 means no-enzyme search -NTT=2 - -# Control N-terminal methionine cleavage -# 0 means to consider protein N-term Met cleavage (Default) -# 1 means to ignore protein N-term Met cleavage -IgnoreMetCleavage=0 - -# Target/Decoy search mode -# 0 means don't search decoy database (default) -# 1 means search decoy database to compute FDR (source FASTA file must be forward-only proteins) -TDA=1 - -# Number of concurrent threads to be executed -# Default: Number of available cores -# To use three threads use NumThreads=3 -NumThreads=All - -# Minimum peptide length to consider -# Default: 6 -MinPepLength=6 - -# Maximum peptide length to consider -# Default: 40 -MaxPepLength=50 - -# Minimum precursor charge to consider (if not specified in the spectrum file) -# Default: 2 -MinCharge=2 - -# Maximum precursor charge to consider (if not specified in the spectrum file) -# Default: 3 -MaxCharge=5 - -# Number of matches per spectrum to be reported -# If this value is greater than 1, the FDR values computed by MS-GF+ will be skewed by high-scoring 2nd and 3rd hits -NumMatchesPerSpec=1 - -# Mass of charge carrier -# Default: mass of proton -#ChargeCarrierMass=1.00727649 - -# Maximum missed cleavages -# Exclude peptides with more than this number of missed cleavages from the search, Default: -1 (no limit) -#MaxMissedCleavages=-1 - -# Minimum number of peaks per spectrum, Default: -# Default: 10 -#MinNumPeaksPerSpectrum=10 - -# Number of isoforms to consider per peptide -# Default: 128 -#NumIsoforms=128 - -# Amino Acid Modification Examples -# Specify static modifications using one or more StaticMod= entries -# Specify dynamic modifications using one or more DynamicMod= entries -# Modification format is: -# Mass or CompositionString, Residues, ModType, Position, Name (all five fields are required). -# CompositionString can only contain a limited set of elements, primarily C H N O S or P -# -# Examples: -# C2H3N1O1, C, fix, any, Carbamidomethyl # Fixed Carbamidomethyl C (alkylation) -# O1, M, opt, any, Oxidation # Oxidation M -# 15.994915, M, opt, any, Oxidation # Oxidation M (mass is used instead of CompositionString) -# H-1N-1O1, NQ, opt, any, Deamidated # Negative numbers are allowed. -# CH2, K, opt, any, Methyl # Methylation K -# C2H2O1, K, opt, any, Acetyl # Acetylation K -# HO3P, STY,opt, any, Phospho # Phosphorylation STY -# C2H3NO, *, opt, N-term, Carbamidomethyl # Variable Carbamidomethyl N-term -# H-2O-1, E, opt, N-term, Glu->pyro-Glu # Pyro-glu from E -# H-3N-1, Q, opt, N-term, Gln->pyro-Glu # Pyro-glu from Q -# C2H2O, *, opt, Prot-N-term, Acetyl # Acetylation Protein N-term diff --git a/docs/examples/Mods.txt b/docs/examples/Mods.txt deleted file mode 100644 index 12f4ddb8..00000000 --- a/docs/examples/Mods.txt +++ /dev/null @@ -1,75 +0,0 @@ -# This file is used to specify modifications -# Use # for comments, either at the start of a line or in the middle of line -# -# Max Number of Dynamic (Variable) Modifications per peptide -# If this value is large, the search will be slow -NumMods=3 - -# To input a modification, use the following command: -# Mass or CompositionStr, Residues, ModType, Position, Name (all the five fields are required). -# CompositionStr (C[Num]H[Num]N[Num]O[Num]S[Num]P[Num]Br[Num]Cl[Num]Fe[Num]) -# - C (Carbon), H (Hydrogen), N (Nitrogen), O (Oxygen), S (Sulfur), P (Phosphorus), Br (Bromine), Cl (Chlorine), Fe (Iron), and Se (Selenium) are allowed. -# - Negative numbers are allowed. -# - E.g. C2H2O1 (valid), H2C1O1 (invalid) -# Mass can be used instead of CompositionStr. It is important to specify accurate monoisotopic masses (integer masses are insufficient). -# - E.g. 15.994915 -# Residues: affected amino acids (must be upper letters) -# - Must be upper letters or * -# - Use * if this modification is applicable to any residue. -# - * should not be "anywhere" modification (e.g. "15.994915, *, opt, any, Oxidation" is not allowed.) -# - E.g. NQ, * -# ModType: "fix" for fixed modifications, "opt" for variable modifications, "custom" for custom amino acids (case insensitive) -# Position: position in the peptide where the modification can be attached. -# - One of the following five values should be used: -# - any (anywhere), N-term (peptide N-term), C-term (peptide C-term), Prot-N-term (protein N-term), Prot-C-term (protein C-term) -# - Case insensitive -# - "-" can be omitted -# - E.g. any, Any, Prot-n-Term, ProtNTerm are all valid -# Name: name of the modification (Unimod PSI-MS name) -# - For proper mzIdentML output, this name should be the same as the Unimod PSI-MS name -# - E.g. Phospho, Acetyl -# - Visit http://www.unimod.org to get PSI-MS names. - -# Static (fixed) modifications: -C2H3N1O1,C,fix,any,Carbamidomethyl # Fixed Carbamidomethyl C - -# Variable Modifications (default: none) -O1,M,opt,any,Oxidation # Oxidation M - -# Additional Modification Examples -# C2H3N1O1, C, fix, any, Carbamidomethyl # Fixed Carbamidomethyl C (alkylation) -# O1, M, opt, any, Oxidation # Oxidation M -# 15.994915, M, opt, any, Oxidation # Oxidation M (mass is used instead of CompositionStr) -# H-1N-1O1, NQ, opt, any, Deamidated # Negative numbers are allowed. -# CH2, K, opt, any, Methyl # Methylation K -# C2H2O1, K, opt, any, Acetyl # Acetylation K -# HO3P, STY,opt, any, Phospho # Phosphorylation STY -# C2H3NO, *, opt, N-term, Carbamidomethyl # Variable Carbamidomethyl N-term -# H-2O-1, E, opt, N-term, Glu->pyro-Glu # Pyro-glu from E -# H-3N-1, Q, opt, N-term, Gln->pyro-Glu # Pyro-glu from Q -# C2H2O, *, opt, Prot-N-term, Acetyl # Acetylation Protein N-term - -# Custom amino acids (default: none) -# Formula, letter symbol, custom, unused, name -# Formula: -# - Only supports empirical formulas of elements C H N O S. -# - If other elements are needed, or a specific mass is needed, they can be added as fixed modifications to the custom amino acid on following lines. -# - Warning: maximum 255 C, 255 H, 63 N, 63 O, 15 S -# Letter symbol: -# - Can be B, J, O, U, X, Z -# custom: -# - Special ModType "custom" to denote custom amino acids -# unused: -# - Field is currently not used internally, but the parser requires a value here -# name: -# - Name of custom amino acid -# - Not used internally or output to results, but the parser requires a value here -# -# NOTE: All modifications that affect the custom amino acid(s) must be specified below the custom amino acid(s). -# -# Example 1: -#C5H7N1O2S0,J,custom,P,Hydroxylation # Hydroxyproline -# -# Example 2: -#C3H5NO, U, custom, U, Selenocysteine # Custom amino acids can only have C, H, N, O, and S -#79.9166, U, fix, any, Se80 # Use a static mod to add Se diff --git a/docs/examples/activationMethods.txt b/docs/examples/activationMethods.txt deleted file mode 100644 index 767bef23..00000000 --- a/docs/examples/activationMethods.txt +++ /dev/null @@ -1,14 +0,0 @@ -# This file specifies additional fragmentation methods considered for MS-GFDB and MS-GF -# -# Format: ShortName,FullName -# - ShortName: abbreviation of the fragmentation method (e.g. CID) -# - FullName: full name of the fragmentation method (e.g. collision-induced dissociation) -# -# The following fragmentation methods are pre-configured: -# CID,collision-induced dissociation -# ETD,electron transfer dissociation -# HCD,high-energy collision-induced dissociation -# -# Specify one framentation method per line -# Example: -# FragMethod=PQD,pulsed q dissociation diff --git a/docs/examples/enzymes.txt b/docs/examples/enzymes.txt deleted file mode 100644 index 97f48445..00000000 --- a/docs/examples/enzymes.txt +++ /dev/null @@ -1,32 +0,0 @@ -# This file specifies additional enzymes considered for MS-GF+ -# -# To be loaded, this file must reside in a directory named params below the working directory -# For example, create file C:\Work\params\enzymes.txt when the working directory is C:\Work -# Or, on Linux, create file /home/user/work/params/enzymes.txt when the working directory is /home/user/work/ -# -# Format: ShortName,CleaveAt,Terminus,Description -# - ShortName: A unique short name of the enzyme (e.g. Tryp). No space is allowed. -# - CleaveAt: The residues cleaved by the enzyme (e.g. KR). Put "null" in case of no specificity. -# - Terminus: Whether the enzyme cleaves C-terminal (C) or N-terminal (N) -# - Description: Description of the enzyme -# -# The following enzymes are pre-configured, numbered 1 through 9 when using the -e argument at the command line -# Tryp,KR,C,Trypsin # 1 -# Chymotrypsin,FYWL,C,Chymotrypsin # 2 -# LysC,K,C,Lys-C # 3 -# LysN,K,N,Lys-N # 4 -# GluC,E,C,Glu-C # 5: glutamyl endopeptidase -# ArgC,R,C,Arg-C # 6 -# AspN,D,N,Asp-N # 7 -# aLP,null,C,alphaLP # 8 -# NoCleavage,null,C,no cleavage # 9: Endogenous peptides -# TrypPlusC,KRC,C,TrypPlusC # 10: Cleave after K, R, or C -# -# If you want to redefine a pre-configured enzyme (e.g. change CleaveAt of Asp-N to "DE"), specify the enzyme again. -# Specify one enzyme per line. -# New enzymes will continue the numbering at 10 -# -# Examples: -# CNBr,M,C,CNBr -# AspN,DE,N,Asp-N -# GluC,DE,C,Glu-C diff --git a/docs/examples/protocols.txt b/docs/examples/protocols.txt deleted file mode 100644 index e67ace21..00000000 --- a/docs/examples/protocols.txt +++ /dev/null @@ -1,15 +0,0 @@ -# This file specifies protocols considered for MS-GFDB and MS-GF -# -# Protocols are used to invoke user-defined scoring models. -# -# Format: ShortName,Description -# - ShortName: an unique short name of the protocol (e.g. Phosphorylation) -# - Description: description of the protocol -# -# The following protocols are pre-configured: -# Phosphorylation,Phospho-enriched sample -# -# Specify one protocol per line -# -# Example: -# KimLab,Hidden protocol used in the Kim lab diff --git a/docs/examples/pxd001819_example.pin b/docs/examples/pxd001819_example.pin deleted file mode 100644 index 04c57903..00000000 --- a/docs/examples/pxd001819_example.pin +++ /dev/null @@ -1,31 +0,0 @@ -SpecId Label ScanNr ExpMass CalcMass mass RawScore DeNovoScore lnSpecEValue lnEValue isotope_error peplen dm absdm charge2 charge3 charge4 enzN enzC enzInt NumMatchedMainIons longest_b longest_y longest_y_pct ExplainedIonCurrentRatio NTermIonCurrentRatio CTermIonCurrentRatio MS2IonCurrent IsolationWindowEfficiency MeanErrorTop7 StdevErrorTop7 MeanRelErrorTop7 StdevRelErrorTop7 lnDeltaSpecEValue matchedIonRatio Peptide Proteins -controllerType=0 controllerNumber=1 scan=40573_40573_1 1 40573 3812.94 3812.92 3812.94 206 244 -69.7718 -54.2034 0 39 0.00500488 0.00500488 0 1 0 1 1 1 29 28 33 0.9166667 0.68896955 0.21051878 0.47845078 340292.9 0 145.9309 106.23371 47.73164 174.07791 0.00000 0.743590 K.LKGVLGYTEDAVVSSDFLGDSHSSIFDASAGIQLSPK.F sp|P00359|G3P3_YEAST -controllerType=0 controllerNumber=1 scan=42594_42594_1 1 42594 3571.75 3571.74 3571.75 196 230 -69.1868 -53.6190 0 37 0.00292969 0.00292969 0 1 0 1 1 0 28 14 29 0.85294116 0.9115573 0.18597949 0.72557783 122593.33 0 91.25902 69.62624 8.492423 114.47227 0.00000 0.756757 K.GVLGYTEDAVVSSDFLGDSHSSIFDASAGIQLSPK.F sp|P00359|G3P3_YEAST -controllerType=0 controllerNumber=1 scan=26749_26749_1 1 26749 3354.55 3354.54 3354.55 221 270 -63.5180 -47.9513 0 34 0.00158691 0.00158691 0 1 0 1 1 0 26 10 20 0.6451613 0.98986566 0.23489049 0.75497514 1343492.1 0 164.25676 74.837585 143.334 109.71013 0.00000 0.764706 R.VISDDYVTSDSGTGIVHNAPAFGEEDNAAC+57.021LK.N sp|P09436|SYIC_YEAST -controllerType=0 controllerNumber=1 scan=40152_40152_1 1 40152 2337.34 2337.34 2337.34 195 201 -62.0690 -46.5056 0 26 0.00244141 0.00244141 0 1 0 0 1 0 32 22 22 0.95652175 0.8372513 0.27338445 0.56386685 1227482.2 0 105.06779 59.986107 53.997795 108.26732 0.00000 1.23077 M.+42.011SLSPVVVIGTGLAGLAAANELVNK.Y sp|P32614|FRDS_YEAST -controllerType=0 controllerNumber=1 scan=32325_32325_1 1 32325 2807.34 2807.34 2807.34 178 203 -59.5492 -43.9858 0 26 0.00164795 0.00164795 0 1 0 1 1 1 24 20 21 0.9130435 0.79629874 0.21344952 0.5828492 2079326.0 0 128.33765 83.34848 48.042576 145.29085 0.00000 0.923077 K.FSEQYPQADFYKLDVDELGDVAQK.N sp|P22217|TRX1_YEAST -controllerType=0 controllerNumber=1 scan=39902_39902_1 1 39902 2986.41 2986.40 2986.41 206 237 -58.8984 -43.3350 0 26 0.00384521 0.00384521 0 1 0 1 1 1 25 21 22 0.95652175 0.6899832 0.28557906 0.40440413 2682242.2 0 141.13326 89.75801 141.13326 89.75801 0.00000 0.961538 K.RYPIVSIEDPFAEDDWEAWSHFFK.T sp|P00924|ENO1_YEAST sp|P00925|ENO2_YEAST -controllerType=0 controllerNumber=1 scan=29596_29596_1 1 29596 2420.15 2420.15 2420.15 180 186 -58.1195 -42.5571 0 24 0.000671387 0.000671387 0 1 0 1 1 0 30 19 20 0.95238096 0.60961443 0.19055937 0.41905507 4207339.5 0 75.883675 106.160805 69.138756 110.67195 0.00000 1.25000 K.STSGNTHLGGQDFDTNLLEHFK.A sp|P11484|SSB1_YEAST sp|P40150|SSB2_YEAST -controllerType=0 controllerNumber=1 scan=28386_28386_1 1 28386 2499.07 2499.08 2499.07 267 271 -55.6898 -40.1269 0 25 -0.00415039 0.00415039 1 0 0 1 1 0 33 17 19 0.8636364 0.62446725 0.20483021 0.41963702 430415.06 0 104.97705 64.485016 74.15283 98.38626 0.00000 1.32000 K.YTYGDQSGSWESIEADGGSIYGR.Y sp|P53301|CRH1_YEAST -controllerType=0 controllerNumber=1 scan=32126_32126_1 1 32126 2208.12 2208.12 2208.12 244 264 -54.8544 -39.2926 0 23 0.000854492 0.000854492 1 0 0 1 1 0 32 16 18 0.9 0.62957793 0.1317803 0.49779764 1462784.2 0 41.793797 19.133928 11.846324 44.412758 0.00000 1.39130 K.VVITAPSSTAPMFVMGVNEEK.Y sp|P00358|G3P2_YEAST sp|P00359|G3P3_YEAST -controllerType=0 controllerNumber=1 scan=41576_41576_1 1 41576 2161.18 2161.17 2161.18 293 298 -54.8019 -39.2396 0 24 0.00231934 0.00231934 1 0 0 1 1 0 36 19 18 0.85714287 0.62674457 0.13377072 0.49297386 158509.48 0 53.75687 44.289654 36.484875 59.331512 0.00000 1.50000 K.FAIPAINVTSSSTAVAALEAAR.D sp|P14540|ALF_YEAST -controllerType=0 controllerNumber=1 scan=34258_34258_1 1 34258 2218.09 2218.09 2218.09 184 185 -54.6945 -39.1332 0 22 0.00219727 0.00219727 0 1 0 1 1 0 28 15 18 0.94736844 0.71118736 0.23075828 0.48042908 2804884.0 0 46.49113 34.76499 27.418613 51.168835 0.00000 1.27273 R.HELSSLADVYINDAFGTAHR.A sp|P00560|PGK_YEAST -controllerType=0 controllerNumber=1 scan=27636_27636_1 1 27636 2093.93 2093.94 2093.93 311 311 -54.3989 -38.8384 0 21 -0.00268555 0.00268555 1 0 0 1 1 0 32 16 16 0.8888889 0.5492638 0.14069147 0.4085723 530606.9 0 42.872612 45.38275 0.76929694 62.426464 0.00000 1.52381 K.QLSLWGADNDDDVSDVTDK.L sp|Q12230|LSP1_YEAST -controllerType=0 controllerNumber=1 scan=40045_40045_1 1 40045 3424.77 3424.76 3424.77 211 265 -54.3534 -38.7867 0 34 0.00415039 0.00415039 0 1 0 1 1 0 29 16 29 0.9354839 1.0661526 0.086776465 0.97937614 3765549.8 0 145.17981 67.08198 124.68849 100.149635 0.00000 0.852941 R.FQSSAIGALQESVEAYLVSLFEDTNLAAIHAK.R sp|P61830|H3_YEAST -controllerType=0 controllerNumber=1 scan=33305_33305_1 1 33305 3034.38 3034.40 3034.38 157 193 -54.3026 -38.7366 0 32 -0.00415039 0.00415039 0 1 0 1 1 0 29 14 18 0.62068963 0.5200236 0.13896137 0.38106224 1275485.8 0 118.00936 61.025 94.19812 93.6855 0.00000 0.906250 K.NVFAELTNMDEVHGGSPWGAGTIAGSDGSR.S sp|Q12335|PST2_YEAST -controllerType=0 controllerNumber=1 scan=11963_11963_1 1 11963 2325.19 2325.19 2325.19 198 220 -54.1684 -38.6050 0 26 -0.000976563 0.000976563 0 1 0 1 1 0 26 21 14 0.6086956 1.0116816 0.39903802 0.6126435 1657648.9 0 221.155 235.06569 12.7539015 322.49457 0.00000 1.00000 K.NAVSTKPTPPPAPEASAESGLSSK.V sp|P16862|PFKA2_YEAST -controllerType=0 controllerNumber=1 scan=23441_23441_1 1 23441 1998.92 1998.92 1998.92 264 274 -53.8727 -38.3121 0 21 0.000732422 0.000732422 1 0 0 1 1 0 32 16 16 0.8888889 0.62659514 0.1721794 0.45441574 1199542.1 0 83.13928 51.72123 80.21132 56.154877 0.00000 1.52381 R.WAGNANELNAAYAADGYAR.I sp|P06169|PDC1_YEAST sp|P16467|PDC5_YEAST sp|P26263|PDC6_YEAST -controllerType=0 controllerNumber=1 scan=33234_33234_1 1 33234 1989.01 1989.01 1989.01 272 272 -53.5686 -38.0081 0 21 0.000183105 0.000183105 1 0 0 1 1 0 33 16 17 0.9444444 0.8380451 0.10657824 0.7314669 4073213.8 0 53.113533 29.90064 53.113533 29.90064 0.00000 1.57143 K.LLGAPSEGGSSVFEVTYFK.G sp|P04802|SYDC_YEAST -controllerType=0 controllerNumber=1 scan=41913_41913_1 1 41913 2434.35 2434.35 2434.35 271 279 -53.3571 -37.7947 0 24 0.00231934 0.00231934 1 0 0 1 1 0 32 16 19 0.9047619 0.5229071 0.1973909 0.3255162 53808.582 0 75.993225 45.774395 14.800936 87.47112 0.00000 1.33333 R.VILFIGDGSLQLTVQEISTMIR.W sp|P06169|PDC1_YEAST sp|P16467|PDC5_YEAST sp|P26263|PDC6_YEAST -controllerType=0 controllerNumber=1 scan=37975_37975_1 1 37975 4167.11 4167.11 4167.11 152 236 -53.0145 -37.4464 0 38 0.00231934 0.00231934 0 1 0 1 1 0 23 16 30 0.85714287 0.88565934 0.10588009 0.77977926 622341.6 0 54.08456 66.595245 40.07185 75.85719 0.00000 0.605263 K.LDVVQTYNQDTVTGPLVPLVAIDAWEHAYYLQYQNK.K sp|P00447|SODM_YEAST -controllerType=0 controllerNumber=1 scan=9217_9217_1 1 9217 1739.81 1739.82 1739.81 181 185 -53.0070 -37.4479 0 19 -0.00201416 0.00201416 1 0 0 1 1 0 29 14 15 0.9375 0.7594508 0.12082657 0.63862425 605470.75 0 89.437126 64.85044 83.62743 72.18747 0.00000 1.52632 R.MTPSGHNWVSGQGAGPR.I sp|P16521|EF3A_YEAST -controllerType=0 controllerNumber=1 scan=8738_8738_1 -1 8738 874.514 874.511 874.514 101 104 -25.1606 -9.61163 0 11 0.00149536 0.00149536 1 0 0 1 0 0 15 7 8 1.0 0.38308302 0.11000744 0.27307558 5093718.5 0 199.07625 239.65031 -78.28511 301.5544 0.00000 1.36364 K.LSAAALEAK.P XXX_sp|P38862|ATG7_YEAST -controllerType=0 controllerNumber=1 scan=33620_33620_1 -1 33620 2801.56 2801.55 2801.56 79 205 -21.4820 -5.91725 0 29 0.00463867 0.00463867 0 1 0 1 1 2 23 12 16 0.61538464 0.5293653 0.15684128 0.37252402 1115579.0 0 169.27449 137.08595 146.28795 161.38849 0.00000 0.793103 K.NAKVAQILSPIDVVTGRSANIVYAGDK.M XXX_sp|P40054|SERA_YEAST XXX_sp|P40510|SER33_YEAST -controllerType=0 controllerNumber=1 scan=2744_2744_1 -1 2744 752.489 752.490 752.489 103 103 -20.9297 -5.38750 0 9 -0.000366211 0.000366211 1 0 0 1 1 0 11 5 6 1.0 0.5705097 0.23453604 0.33597362 1595328.4 0 260.32837 356.40573 197.51599 394.694 0.00000 1.22222 K.LVALAHK.F XXX_sp|P40163|YNU3_YEAST -controllerType=0 controllerNumber=1 scan=4437_4437_1 -1 4437 1109.58 1109.58 1109.58 68 97 -20.2529 -4.70388 0 11 0.00115967 0.00115967 0 1 0 1 1 2 13 7 8 1.0 0.46010917 0.02409948 0.4360097 1987535.0 0 628.521 430.40326 87.47681 756.72546 0.00000 1.18182 K.EHDTKGHKR.G XXX_sp|P53228|TAL2_YEAST -controllerType=0 controllerNumber=1 scan=8491_8491_1 -1 8491 1009.53 1009.53 1009.53 55 66 -19.8976 -4.35128 0 10 0.000213623 0.000213623 1 0 0 1 1 1 13 6 7 1.0 0.18060526 0.0897693 0.09083597 1283902.1 0 375.63843 234.51622 375.63843 234.51622 0.00000 1.30000 R.ERAYNTVR.D XXX_sp|P32874|HFA1_YEAST -controllerType=0 controllerNumber=1 scan=33400_33400_1 -1 33400 1894.01 1893.02 1894.01 44 106 -19.6630 -4.10390 1 19 -0.00193208 0.00193208 0 1 0 1 1 2 16 10 15 0.9375 0.39385116 0.08407742 0.30977374 1592894.9 0 350.90103 98.49905 113.861435 346.22125 0.00000 0.842105 K.VTEGDETTVTQVKVEKK.D XXX_sp|P40043|RGI1_YEAST -controllerType=0 controllerNumber=1 scan=40443_40443_1 -1 40443 1029.70 1028.69 1029.70 47 70 -19.4909 -3.94189 1 11 0.00204573 0.00204573 1 0 0 1 1 0 15 7 8 1.0 0.22533518 0.09830763 0.12702756 125590.49 0 84.193535 70.41255 -66.88574 87.0217 0.00000 1.36364 K.SSLILILLR.L XXX_sp|P47077|NOP9_YEAST -controllerType=0 controllerNumber=1 scan=1214_1214_1 -1 1214 978.560 978.560 978.560 48 63 -19.3381 -3.79176 0 10 0.000244141 0.000244141 1 0 0 1 1 1 13 6 7 1.0 0.30961916 0.06720163 0.24241753 177477.98 0 260.9864 284.70547 191.57854 335.36365 0.00000 1.30000 K.ITHDVHKK.L XXX_sp|Q12280|IQG1_YEAST -controllerType=0 controllerNumber=1 scan=23828_23828_1 -1 23828 1322.76 1321.75 1322.76 62 111 -19.1895 -3.63682 1 13 8.20814e-05 8.20814e-05 0 1 0 1 1 1 13 9 10 1.0 0.5899601 0.040647022 0.54931307 851380.56 0 439.1353 308.4516 -15.978577 536.4018 0.00000 1.00000 K.VLIKVPDNM+15.995FK.R XXX_sp|Q12099|FAL1_YEAST -controllerType=0 controllerNumber=1 scan=23136_23136_1 -1 23136 808.442 808.443 808.442 81 90 -18.8940 -3.35185 0 9 -0.000579834 0.000579834 1 0 0 1 1 0 11 5 6 1.0 0.40417928 0.13181764 0.27236164 380313.78 0 242.76575 178.91783 242.76575 178.91783 0.00000 1.22222 R.GFIDSLR.A XXX_sp|P39980|SIT1_YEAST diff --git a/docs/examples/readme.md b/docs/examples/readme.md deleted file mode 100644 index ffb4dca0..00000000 --- a/docs/examples/readme.md +++ /dev/null @@ -1,19 +0,0 @@ -# Example configuration and sample outputs - -Broader manuals (MS-GF+ CLI, BuildSA, changelog, …) are Markdown pages one level up: [`../readme.md`](../readme.md). - -This directory holds **small text examples** shipped with the repository: - -| File | Purpose | -|------|---------| -| `MSGFPlus_Params.txt` | Annotated MS-GF+ configuration / parameter reference (linked from the README and CLI help). | -| `enzymes.txt` | Example custom enzyme definitions (see CLI help for `params/enzymes.txt`). | -| `activationMethods.txt` | Example custom activation methods for `params/activationMethods.txt`. | -| `protocols.txt` | Example custom protocols for `params/protocols.txt`. | -| `Mods.txt` | Example modification file. | -| `pxd001819_example.pin` | **Sample Percolator `.pin` output** from a PXD001819 (yeast + UPS1 on LTQ Orbitrap Velos) search. Header + 20 target PSMs + 10 decoy PSMs, chosen for peptide-sequence diversity so every column is represented. Use this to inspect the `.pin` schema without running a full search. Full column reference in [`../output.md`](../output.md). | -| `test.tsv`, `test_Unrolled.tsv` | Example TSV exports for documentation. | - -**Not stored here:** tutorial spreadsheets, plots, or bundled FASTA/index files. Those are either removed as non-essential bloat or live under `src/test/resources/` for automated tests. - -To build a suffix-array index for your own database, run `BuildSA` (see `java … edu.ucsd.msjava.msdbsearch.BuildSA -h` after building the JAR). diff --git a/docs/examples/test.tsv b/docs/examples/test.tsv deleted file mode 100644 index 452db567..00000000 --- a/docs/examples/test.tsv +++ /dev/null @@ -1,3 +0,0 @@ -#SpecFile SpecID ScanNum FragMethod Precursor IsotopeError PrecursorError(ppm) Charge Peptide Protein DeNovoScore MSGFScore SpecEValue EValue QValue PepQValue -test.mgf index=0 26559 CID 1285.3457 1 -5.049801 3 IGAYLFVDMAHVAGLIAAGVYPNPVPHAHVVTSTTHK test(pre=K,post=T);test_isoform(pre=K,post=T) 299 244 1.4807088E-31 3.2871733E-29 0.0 0.0 -test.mgf index=1 -1 CID 870.11743 0 0.14029178 3 NLANPTSVILASIQM+15.995LEYLGMADK test2(pre=K,post=A) 156 136 2.2559852E-22 4.4217308E-20 0.0 0.0 diff --git a/docs/examples/test_Unrolled.tsv b/docs/examples/test_Unrolled.tsv deleted file mode 100644 index b2e1c2b8..00000000 --- a/docs/examples/test_Unrolled.tsv +++ /dev/null @@ -1,4 +0,0 @@ -#SpecFile SpecID ScanNum FragMethod Precursor IsotopeError PrecursorError(ppm) Charge Peptide Protein DeNovoScore MSGFScore SpecEValue EValue QValue PepQValue -test.mgf index=0 26559 CID 1285.3457 1 -5.049801 3 K.IGAYLFVDMAHVAGLIAAGVYPNPVPHAHVVTSTTHK.T test 299 244 1.4807088E-31 3.2871733E-29 0.0 0.0 -test.mgf index=0 26559 CID 1285.3457 1 -5.049801 3 K.IGAYLFVDMAHVAGLIAAGVYPNPVPHAHVVTSTTHK.T test_isoform 299 244 1.4807088E-31 3.2871733E-29 0.0 0.0 -test.mgf index=1 -1 CID 870.11743 0 0.14029178 3 K.NLANPTSVILASIQM+15.995LEYLGMADK.A test2 156 136 2.2559852E-22 4.4217308E-20 0.0 0.0 diff --git a/docs/isobariclabeling.md b/docs/isobariclabeling.md deleted file mode 100644 index 5c2242c7..00000000 --- a/docs/isobariclabeling.md +++ /dev/null @@ -1,101 +0,0 @@ -# Isobaric-labelling searches: TMT, TMTpro, iTRAQ - -[MS-GF+ Documentation home](readme.md) · [ChangeLog](changelog.md) - -MS-GF+ supports isobaric-labelled samples (TMT-6/10/11/16, TMTpro-18, iTRAQ-4/8) natively — **no code change is needed for new plex levels**. The label is expressed as a fixed (static) modification on the peptide N-terminus and on lysine, plus the matching `-protocol` flag so the scoring model is tuned for enriched spectra. - -This page collects the mod-file recipes users most often ask for. The numbers come from Unimod. - ---- - -## Command line - -```bash -java -Xmx8G -jar MSGFPlus.jar \ - -s spectra.mzML -d db.fasta \ - -mod Mods_TMTpro.txt \ - -protocol 4 \ - -tda 1 -t 10ppm -ti -1,2 -ntt 2 -inst 1 -m 3 -``` - -The `-protocol` values relevant to labelled samples: - -| `-protocol` | Use for | -|-------------|---------| -| 2 | iTRAQ-labelled samples | -| 3 | iTRAQ + phosphopeptide enrichment | -| 4 | TMT / TMTpro labelled samples | -| 0 | Automatic (inferred from modification names in the mod file; see below) | - -With `-protocol 0`, MS-GF+ detects the label from case-insensitive name prefixes (`itraq`, `tmt`, `phospho`) in the mod file. Naming the fixed mod `TMT6plex` or `iTRAQ8plex` is enough; you don't need to also pass `-protocol 4`. - ---- - -## Modification recipes - -Drop the appropriate block into your Mods.txt (see [examples/Mods.txt](examples/Mods.txt) for the full file format). Mass values are monoisotopic. - -### TMT-6plex / TMT-10plex / TMT-11plex - -Same reagent mass (229.162932) — the channels differ in isotope distribution but not monoisotopic mass. - -```text -229.162932, K, fix, any, TMT6plex # Fixed TMT on lysine -229.162932, *, fix, N-term, TMT6plex # Fixed TMT on peptide N-term -``` - -### TMT-16plex / TMTpro-16 and TMTpro-18 - -Both plex levels use the same reagent mass (304.207146). - -```text -304.207146, K, fix, any, TMTpro # Fixed TMTpro on lysine -304.207146, *, fix, N-term, TMTpro # Fixed TMTpro on peptide N-term -``` - -Use `-protocol 4` (same as TMT-6/10/11). - -### iTRAQ-4plex - -```text -144.102063, K, fix, any, iTRAQ4plex -144.102063, *, fix, N-term, iTRAQ4plex -``` - -### iTRAQ-8plex - -```text -304.205360, K, fix, any, iTRAQ8plex -304.205360, *, fix, N-term, iTRAQ8plex -``` - -⚠ **TMTpro-16/18 and iTRAQ-8 have the same nominal mass (≈304.2) but different monoisotopic masses** (304.207146 vs 304.205360). Use the correct Unimod value for your reagent. - ---- - -## Typical full Mods.txt for TMTpro + Carbamidomethyl + Ox-M - -```text -NumMods=3 - -# Isobaric label (fixed) -304.207146, K, fix, any, TMTpro -304.207146, *, fix, N-term, TMTpro - -# Alkylation (fixed) -C2H3N1O1, C, fix, any, Carbamidomethyl - -# Common variable mods -O1, M, opt, any, Oxidation -42.010565, *, opt, N-term, Acetyl -``` - ---- - -## Tips - -- For phospho-enriched, TMT-labelled samples use `-protocol 3` or include both `TMT*` and `Phospho` mods with `-protocol 0`. -- If you see unexpectedly few PSMs with a labelled dataset, the single most common cause is forgetting to add the N-terminal fixed mod (only lysine is set). MS-GF+ needs both. -- For correct mzIdentML output, keep the Unimod **PSI-MS name** in the last column (e.g. `TMTpro`, `iTRAQ8plex`), not a free-text description. - -Related upstream issue asking how to configure TMT-16: [#82](https://github.com/MSGFPlus/msgfplus/issues/82). diff --git a/docs/msgfdb_modfile.md b/docs/msgfdb_modfile.md deleted file mode 100644 index 8503bfd0..00000000 --- a/docs/msgfdb_modfile.md +++ /dev/null @@ -1,61 +0,0 @@ -# MS-GFDB Modification File Example - -This mod file was used by MS-GFDB, an old application that is no longer under development. -It was supserseded by [MS-GF+](msgfplus.md), which supports a [modification file](examples/Mods.txt) with additional features - -- [MS-GF+ Documentation home](readme.md) -- [MS-GFDB help page](ms-gfdb.md) - - -```text -# This file is used to specify modifications -# Use # for comments, either at the start of a line or in the middle of line - -# Max Number of Dynamic (Variable) Modifications per peptide (default 3). -# If this value is large, the search takes long. -NumMods=3 - -# To input a modification, use the following command: -# Mass or CompositionStr, Residues, ModType, Position, Name (all the five fields are required). -# CompositionStr (C[Num]H[Num]N[Num]O[Num]S[Num]P[Num]) -# - C (Carbon), H (Hydrogen), N (Nitrogen), O (Oxygen), S (Sulfer) and P (Phosphorus) are allowed. -# - Atom can be omitted. The sequence of atoms must be followed. -# - Negative numbers are allowed. -# - E.g. C2H2O1 (valid), H2C1O1 (invalid) -# Mass can be used instead of CompositionStr. It is important to specify accurate monoisotopic masses (integer masses are insufficient). -# - E.g. 15.994915 -# Residues: affected amino acids (must be upper letters) -# - Must be upper letters or * -# - Use * if this modification is applicable to any residue. -# - * should not be "anywhere" modification (e.g. "15.994915, *, opt, any, Oxidation" is not allowed.) -# - E.g. NQ, * -# ModType: "fix" for fixed modifications, "opt" for variable modifications (case insensitive) -# Position: position in the peptide where the modification can be attached. -# - One of the following five values should be used: -# - any (anywhere), N-term (peptide N-term), C-term (peptide C-term), Prot-N-term (protein N-term), Prot-C-term (protein C-term) -# - Case insensitive -# - "-" can be omitted -# - E.g. any, Any, Prot-n-Term, ProtNTerm are all valid -# Name: name of the modification (Unimod PSI-MS name) -# - E.g. Oxidation - -# Static (fixed) modifications: -C2H3N1O1,C,fix,any,Carbamidomethylation # Fixed Carbamidomethyl C - -# Variable Modifications (default: none) -O1,M,opt,any,Oxidation # Oxidation M - -# Additional Modification Examples -# C2H3N1O1,C,fix,any,Carbamidomethyl # Fixed Carbamidomethyl C (alkylation) -# O1,M,opt,any,Oxidation # Oxidation M -# 15.994915,M,opt,any,Oxidation # Oxidation M (mass is used instead of CompositionStr) -# H-1N-1O1,NQ,opt,any,Deamidated # Negative numbers are allowed. -# CH2,K,opt,any,Methyl # Methylation K -# C2H2O1,K,opt,any,Acetyl # Acetylation K -# HO3P,STY,opt,any,Phospho # Phosphorylation STY -# C2H3NO,*,opt,N-term,Carbamidomethyl # Variable Carbamidomethyl N-term -# H-2O-1,E,opt,N-term,Glu->pyro-Glu # Pyro-glu from E -# H-3N-1,Q,opt,N-term,Gln->pyro-Glu # Pyro-glu from Q -# C2H2O,*,opt,Prot-N-term,Acetyl # Acetylation Protein N-term - -``` diff --git a/docs/msgfplus.md b/docs/msgfplus.md deleted file mode 100644 index d3a8b3aa..00000000 --- a/docs/msgfplus.md +++ /dev/null @@ -1,358 +0,0 @@ -# MS-GF+ - -[MS-GF+ Documentation home](readme.md) · [ChangeLog](changelog.md "MS-GF+ ChangeLog") - - -```text -Usage: java -Xmx3500M -jar MSGFPlus.jar - -[-conf ConfigurationFile] (Configuration file path; options specified at the command line will override settings in the config file) - An example parameter file is at https://github.com/MSGFPlus/msgfplus/blob/master/docs/examples/MSGFPlus_Params.txt - Additional parameter files are at https://github.com/MSGFPlus/msgfplus/tree/master/docs/parameterfiles - -[-s SpectrumFile] (*.mzML or *.mgf) - Spectra should be centroided (see below for MSConvert example). Profile spectra will be ignored. - -[-d DatabaseFile] (*.fasta or *.fa or *.faa) - -[-decoy DecoyPrefix] (Prefix for decoy protein names; Default: XXX) - -[-o OutputFile (*.pin or *.tsv)] (Default: [SpectrumFileName].pin; extension is derived from `-outputFormat`) - -[-t PrecursorMassTolerance] (e.g. 2.5Da, 20ppm or 0.5Da,2.5Da; Default: 20ppm) - Use a comma to define asymmetric values. - E.g. "-t 0.5Da,2.5Da" will set 0.5Da to the left (ObservedPepMass < TheoreticalPepMass) - and 2.5Da to the right (ObservedPepMass > TheoreticalPepMass) - -[-ti IsotopeErrorRange] (Range of allowed isotope peak errors; Default: 0,1) - Takes into account the error introduced by choosing a non-monoisotopic peak for fragmentation. - The combination of -t and -ti determines the precursor mass tolerance. - E.g. "-t 20ppm -ti -1,2" tests abs(ObservedPepMass - TheoreticalPepMass - n * 1.00335Da) < 20ppm for n = -1, 0, 1, 2. - -[-thread NumThreads] (Number of concurrent threads to be executed; Default: Number of available cores) - This is best set to the number of physical cores in a single NUMA node. - Generally a single NUMA node is 1 physical processor. - The default will try to use hyperthreading cores, which can increase the amount of time this process will take. - This is because the part of Scoring param generation that is multithreaded is also I/O intensive. - -[-tasks NumTasks] (Override the number of tasks to use on the threads; Default: internally calculated based on inputs) - More tasks than threads will reduce the memory requirements of the search, but will be slower (how much depends on the inputs). - 1 <= tasks <= numThreads: will create one task per thread, which is the original behavior. - tasks = 0: use default calculation - minimum of: (threads*3) and (numSpectra/minSpectraPerThread). - tasks < 0: multiply number of threads by abs(tasks) to determine number of tasks (i.e., -2 means "2 * numThreads" tasks). - One task per thread will use the most memory, but will usually finish the fastest. - 2-3 tasks per thread will use comparably less memory, but may cause the search to take 1.5 to 2 times as long. - -[-minSpectraPerThread MinSpectraPerThread] (Minimum number of spectra to assign per thread/task; Default: 250) - Controls the per-thread workload floor used when auto-selecting numThreads and numTasks. - The effective thread count is capped at max(1, round(numSpectra / minSpectraPerThread)). - Lower this value to raise parallelism on small inputs on many-core hosts (see issue #52). - -[-verbose 0/1] (Console output message verbosity; Default: 0) - 0: Report total progress only - 1: Report total and per-thread progress/status - -[-tda 0/1] (Target decoy strategy; Default: 0) - 0: Don't use a decoy database - 1: Search with a decoy database (forward + reverse proteins) - -[-m FragmentationMethodID] (Fragmentation Method; Default: 0) - 0: As written in the spectrum or CID if no info - 1: CID - 2: ETD - 3: HCD - 4: UVPD - -[-inst InstrumentID] (Instrument ID; Default: 0) - 0: Low-res LCQ/LTQ - 1: Orbitrap/FTICR/Lumos - 2: TOF - 3: Q-Exactive - -[-e EnzymeID] (Enzyme ID; Default: 1) - 0: Unspecific cleavage - 1: Trypsin - 2: Chymotrypsin - 3: Lys-C - 4: Lys-N - 5: glutamyl endopeptidase - 6: Arg-C - 7: Asp-N - 8: alphaLP - 9: no cleavage - -[-protocol ProtocolID] (Protocol ID; Default: 0) - 0: Automatic - 1: Phosphorylation - 2: iTRAQ - 3: iTRAQPhospho - 4: TMT - 5: Standard - -[-ntt 0/1/2] (Number of Tolerable Termini; Default: 2) - When EnzymeID is 1 (trypsin), - 2: Only search for fully-tryptic peptides - 1: Search for semi-tryptic and fully-tryptic peptides - 0: Non-tryptic search - -[-mod ModificationFileName] (Modification file; Default: standard amino acids with fixed C+57; only if -mod is not specified) - -[-minLength MinPepLength] (Minimum peptide length to consider; Default: 6) - -[-maxLength MaxPepLength] (Maximum peptide length to consider; Default: 40) - -[-minCharge MinCharge] (Minimum precursor charge to consider if charges are not specified in the spectrum file; Default: 2) - -[-maxCharge MaxCharge] (Maximum precursor charge to consider if charges are not specified in the spectrum file; Default: 3) - -[-n NumMatchesPerSpec] (Number of matches per spectrum to be reported; Default: 1) - -[-addFeatures 0/1] (Include additional features in the output; enable this to post-process results with Percolator; Default: 0) - 0: Output basic scores only - 1: Output additional features - -[-ccm ChargeCarrierMass] (Mass of charge carrier; Default: mass of a proton, 1.00727649) - -[-ignoreMetCleavage 0/1] (N-terminal methionine cleavage behavior; Default: 0) - -[-maxMissedCleavages Count] (Exclude peptides with more than this number of missed cleavages from the search; Default: -1, meaning no limit) - -[-minNumPeaks Count] (Minimum number of ions a spectrum must have to be examined; Default: 10) - -[-iso NumIsoforms] (Number of isoforms to consider per peptide; Default: 128) - -[-numMods Count] (Maximum number of dynamic (variable) modifications per peptide; Default: 3) - -[-allowDenseCentroidedPeaks 0/1] (Default: 0 (disabled); 1: (for mzML input only) allows inclusion of spectra with high-density centroid data in the search) - MS-GF+ checks the distance between consecutive peaks in the spectrum, and if the median distance is less than 50 ppm, they are considered profile spectra regardless of the value provided in the mzML file. - This parameter allows overriding this check when the mzML file says the spectrum is centroided. - -``` - - -#### Examples: - -Example command (using a parameter file): - -`java -Xmx3500M -jar MSGFPlus.jar -s Dataset.mzML -d ProteinList.fasta -conf MSGFPlus_PartTryp_MetOx_20ppmParTol.txt` - -Example command (high-precision spectra, using arguments): - -`java -Xmx3500M -jar MSGFPlus.jar -s Dataset.mzML -d IPI_human_3.79.fasta -inst 1 -t 20ppm -ti -1,2 -ntt 2 -tda 1 -o PSMs.pin` - -Example command (low-precision spectra): - -`java -Xmx3500M -jar MSGFPlus.jar -s Dataset.mzML -d IPI_human_3.79.fasta -inst 0 -t 0.5Da,2.5Da -ntt 2 -tda 1 -o PSMs.pin` - -### Parameters: - -- **-s SpectrumFile** (\*.mzML or \*.mgf) - Required - - - Spectrum file name. This fork supports two spectrum file formats: `mzML` and `mgf`. Legacy formats (`mzXML`, `ms2`, `pkl`, `_dta.txt`) are not supported. - - We recommend `mzML` whenever possible. - - For Thermo .raw files, obtain a centroided .mzML using MSConvert, which is part of [ProteoWizard](http://proteowizard.sourceforge.net/). - - `MSConvert.exe --mzML --32 --filter "peakPicking true 1-" DatasetName.raw` - -- **-d DatabaseFile** (\*.fasta or \*.fa or \*.faa) - Required - - - Path to the protein database file. If the database file does not have auxiliary index files (\*.canno, \*.cnlcp, \*.csarr, and \*.cseq), MS-GF+ will create them. - - When "-tda 1" option is used, the database specified here must contain only target protein sequences. - - If multiple MS-GF+ processes access the same database file, it is strongly recommended to index the database prior to the database search by [running BuildSA](buildsa.md). - -- **-conf ConfigurationFile** - - Path to the configuration file (aka parameter file) that defines settings for MS-GF+ - - Options specified at the command line will override settings in the config file - - Example parameter file: [MSGFPlus_Params.txt](https://github.com/MSGFPlus/msgfplus/blob/master/docs/examples/MSGFPlus_Params.txt) - - See also these additional [example parameter files](https://github.com/MSGFPlus/msgfplus/tree/master/docs/parameterfiles) - -- **-decoy DecoyPrefix** - - Text to prepend to protein names when including decoy (reverse sequence) proteins in the .revCat.fasta file and related index files - - Defaults to XXX (though an underscore is also added, giving names like `XXX_Contaminant_TRYP_BOVIN`) - - Use `-decoy REV` to get names like `REV_Contaminant_TRYP_BOVIN` - - - -- **-o OutputFile** (\*.pin or \*.tsv) - - Filename where the output will be written. - - Default output format is Percolator `.pin` (see `-outputFormat` below). mzIdentML (`.mzid`) output has been removed; MS-GF+ now feeds downstream Percolator pipelines directly via `.pin`. - - The file extension must be `.pin` or `.tsv`. `.mzid` is no longer accepted (no backward-compatibility shim). - - By default, the output file name is "\[SpectrumFileName\].pin". - -- **-outputFormat** (Default: pin) - - `pin` — Percolator `.pin` format (default; feeds into Percolator for rescoring). - - `tsv` — tab-separated values (compatible with OpenMS `MSGFPlusAdapter`). - - Integer aliases: `0` → pin, `1` → tsv. Older values `2` (both) and `3` (pin, when mzid was `0`) are no longer accepted. - -- **-t PrecursorMassTolerance** (Default: 20ppm) - - Precursor mass tolerance in Da. or ppm. There must be no space between the number and the unit. E.g. `2.5Da` or `20ppm` - - To set asymmetric tolerances, use a comma to separate left (observed mass \< theoretical mass) and - right (observed mass \> theoretical mass) tolerances. - E.g. `0.5Da,2.5Da` - - It is recommended to use a tight tolerance rather than a loose tolerance (e.g. for Orbitrap data, 10ppm or 20ppm usually identifies more spectra than 50ppm). - -- **-ti IsotopeErrorRange** (Default: 0,1) - - Takes into account of the error introduced by choosing non-monoisotopic peak for fragmentation. - - If the precursor mass tolerance is equal to or larger than 0.5Da or 500ppm, this parameter will be ignored. - - The combination of -t and -ti determines the precursor mass tolerance. - - E.g. `-t 20ppm -ti -1,2` tests abs(ObservedPepMass - TheoreticalPepMass - n \* 1.00335Da) \< 20ppm for n = -1, 0, 1, 2 - -- **-thread NumOfThreads** (Default: Number of available cores) - - Number of concurrent threads to be executed together. - - Default value is the number of available logical cores (e.g. 8 for quad-core processor with hyper-threading support). - -- **-tasks NumTasks** (Default: internally calculated based on inputs) - - Use this to manually set the number of tasks to create for the search. - - More tasks than threads will reduce the memory requirements of the search, but will be slower (how much depends on the inputs). - - If the spectrum file is particularly large, a larger number of tasks will decrease the possibility of out of memory errors. - - If the fasta file being searched is larger than 10MB, more tasks will cause a noticeably longer search time. - - 1 \<= tasks \<= numThreads: will create one task per thread, which is the original behavior. - - tasks = 0: use default calculation - minimum of :(threads\*3), and (numSpectra/250). - - tasks \< 0: multiply number of threads by abs(tasks) to determine number of tasks (i.e., -2 =\> "2 \* numThreads" tasks). - - One task per thread will use the most memory, but will usually finish the fastest. - - 2-3 tasks per thread will use comparably less memory, but may cause the search to take 1.5 to 2 times as long with a 23MB fasta file. - -- **-verbose 0/1** (Default: 0) - - Changes the verbosity of the output - - If 0, only the overall progress is reported, creating the minimal useful output to console. - - If 1, you see all of the output of 0, but with additional console output from each thread and task. - - 1 will produce console output that matches the console output of older versions. - -- **-tda 0/1** (Default: 0) - - - Indicates whether to search normal (forward only) protein sequences, or a decoy file where the reversed protein sequences are appended to the normal protein sequences - - 0: Search the protein sequences as listed in the FASTA file (the target database) - - 1: Search a target-decoy database, allowing for the computation of QValues (FDR) - - QValue is defined as the minimum false discovery rate (FDR) at which the test may be called significant (ReversePeptideCount / ForwardPeptideCount) - - QValue(t) = (Number of DecoyPSMs with score equal or above t) ÷ (Number of TargetPSMs with score equal or above t) - - PSM: Peptide-Spectrum Match - - -log(SpecProb) is used as the score to compute QValue. - - If `-tda 1` is specified, MS-GF+ automatically creates a combined target/reversed database file (DBFileName.revConcat.fasta). - Thus, when specifying "-d" parameter, DatabaseFile must contain only target proteins. - - - -- **-m FragmentationMethodID** (Default: 0) - - Fragmentation method identifier (used to determine the scoring model). - - 0: As written in the spectrum or CID if no info (default) - - 1: CID - - 2: ETD - - 3: HCD - - 4: UVPD - - If the identifier is 0 and fragmentation method is written in the spectrum file (e.g. mzML files), MS-GF+ will recognize the fragmentation method and use a relevant scoring model. - - If the identifier is 0 and there is no fragmentation method information in the spectrum (e.g. mgf files), CID model will be used by default. - - If the identifier is non-zero and the spectrum has fragmentation method information, only the spectra that match with the identifier will be processed. - - If the identifier is non-zero and the spectrum has no fragmentation method information, MS-GF+ will process all spectra assuming the specified fragmentation method. -- **-inst InstrumentID** - - Identifier of the instrument used to generate MS/MS spectra (this parameter defines the the scoring model). - - 0: Low-res LCQ/LTQ (Default for CID and ETD) - - 1: Orbitrap/FTICR/Lumos (Default for HCD) - - 2: TOF - - 3: Q-Exactive - - For "hybrid" spectra with high-precision MS1 and low-precision MS2, use 0. - - For usual low-precision instruments (e.g. Thermo LTQ), use 0. - - If MS/MS fragment ion peaks are of high-precision (e.g. tolerance = 10ppm), use 2. - - For TOF instruments, use 2. - - For Q-Exactive HCD spectra, use 3. - - For other HCD spectra, use 1. -- **-e EnzymeID** (Default: 1) - - Enzyme identifier. - - 0: unspecific cleavage (cleave after any residue) - - 1: Trypsin (default) - - 2: Chymotrypsin - - 3: Lys-C - - 4: Lys-N - - 5: glutamyl endopeptidase (Glu-C) - - 6: Arg-C - - 7: Asp-N - - 8: alphaLP - - 9: no cleavage - - Use 9 for peptidomics studies - - Create file params\enzymes.txt (or params/enzymes.txt on Linux) below the working directory to define custom enzymes or override the cleavage residues for built-in enzymes - - For more info, see [enzymes.txt](examples/enzymes.txt) -- **-protocol ProtocolID** (Default: 0) - - Protocol identifier. Protocols are used to enable scoring parameters for enriched and/or labeled samples. - - 0: Automatic (Default) - - This will set the protocol based on the names of the modifications in Mods.txt - - It looks for names (case insensitive) that start with "itraq", "phospho", and "tmt" - - 1: Phosphorylation: for phosphopeptide enriched samples - - 2: iTRAQ: for iTRAQ-labeled samples - - 3: iTRAQPhospho: for phosphopeptide enriched and iTRAQ-labeled samples - - 4: TMT: for TMT-labeled samples - - 5: Standard: for samples not in the above categories (no protocol) -- **-ntt 0/1/2** (Default: 2) - - Number of tolerable termini (aka tryptic termini) - - This parameter is used to apply the enzyme cleavage specificity rule when searching the database. - - Specifies the minimum number of termini matching the enzyme specificity rule. - - For example, for trypsin, K.ACDEFGHR.C (NTT=2), G.ACDEFGHR.C (NTT=1), K.ACDEFGHI.C (NTT=1) and G.ACDEFGHR.C (NTT=0). - - `-ntt 2` will search for fully tryptic peptides only. - - By default, `-ntt 2` is used. - - Using `-ntt 1` or `-ntt 0` can make the search significantly slower. - - - -- **-mod ModificationFile** (Default: standard amino acids with fixed C+57, though only if `-mod` is not specified) - - Modification file name. ModificationFile contains the modifications to be considered in the search. - - If `-mod` is not specified, standard amino acids with fixed Carbamidomethylation C will be used. - - See an [example MS-GF+ modification file](examples/Mods.txt). -- **-minLength MinPepLength** (Default: 6) - - Minimum length of the peptide to be considered. -- **-maxLength MaxPepLength** (Default: 40) - - Maximum length of the peptide to be considered. -- **-minCharge MinPrecursorCharge** (Default: 2) - - Minimum precursor charge to consider. This parameter is used only for spectra with no charge. -- **-maxCharge MinPrecursorCharge** (Default: 3) - - Maximum precursor charge to consider. This parameter is used only for spectra with no charge. -- **-n NumMatchesPerSpec** (Default: 1) - - Number of peptide matches per spectrum to report. - - Expected false discovery rates (EFDRs) will be reported only when this value is 1. -- **-addFeatures 0/1** (Default: 0) - - If 0, only basic scores are reported. - - If 1, the following features are reported - - MS2IonCurrent: Summed intensity of all product ions - - ExplainedIonCurrentRatio: Summed intensity of all matched product ions (e.g. b, b-H2O, y, etc.) divided by MS2IonCurrent - - NTermIonCurrentRatio: Summed intensity of all matched prefix ions (e.g. b, b-H2O, etc.) divided by MS2IonCurrent - - CTermIonCurrentRatio: Summed intensity of all matched suffix ions (e.g. y, y-H2O, etc.) divided by MS2IonCurrent -- **-ccm ChargeCarrierMass** (Default: 1.00727649) - - Override the default charge carrier mass -- **-ignoreMetCleavage 0/1** (Default: 0) - - 0: consider cleavage of methionine from the protein's N-terminus, even when NTT=2 - - 1: disable N-terminal methionine cleavage -- **-maxMissedCleavages Count** (Default: -1, meaning no limit) - - Exclude peptides with more than this number of missed cleavages -- **-numMods Count** (Default: 3) - - Maximum number of dynamic (variable) modifications per peptide - - If this value is large and multiple dynamic modifications are defined, the search will be slow (depending on FASTA file size) - -### MS-GF+ output - -MS-GF+ writes results as a Percolator `.pin` file by default (or TSV with `-outputFormat tsv`). The `.pin` feeds directly into Percolator or a Percolator-compatible rescorer such as OpenMS `PercolatorAdapter`, which produces the final FDR-controlled PSM list. - -**Note:** mzIdentML (`.mzid`) output has been removed entirely, along with the legacy `MzIDToTsv` and `ScoringParamGen` tools that consumed it. If you need `.mzid`: -- Run Percolator on the `.pin` and use its XML output, OR -- Use an older MS-GF+ release (v2026.03.25 or earlier). - -Each row in the `.pin` has the per-PSM Percolator-standard columns plus the MS-GF+-specific features below. All score semantics are preserved from the old mzid output; the data format is the only change: - -- **RawScore**: MS-GF+ raw score of the peptide-spectrum match -- **DeNovoScore**: score of the optimal scoring peptide for the spectrum (not necessarily in the database); `RawScore ≤ DeNovoScore` -- **lnSpecEValue**: natural log of spectral E-value (spectrum level; lower = better) -- **lnEValue**: natural log of database E-value -- **lnDeltaSpecEValue**: log-ratio of rank-1 vs rank-2 SpecEValue (new in the mzid-removal release) -- **matchedIonRatio**: fraction of main ions matched, normalised by peptide length -- **enzN, enzC, enzInt**: OpenMS `PercolatorAdapter`-compatible enzymatic cleavage features -- Standard Percolator columns: `SpecId`, `Label` (1=target, -1=decoy), `ScanNr`, `ExpMass`, `CalcMass`, `charge2/3/4`, `peplen`, `dm`, `absdm`, `isotope_error`, plus the `Peptide` / `Proteins` columns at the end. - -FDR (PSM-level QValue, PepQValue) is produced downstream by Percolator, not by MS-GF+ itself. - - -| \#SpecFile | SpecID | ScanNum | FragMethod | Precursor | IsotopeError | PrecursorError(ppm) | Charge | Peptide | Protein | DeNovoScore | MSGFScore | SpecEValue | EValue | QValue | PepQValue | -|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----| -| test.mgf | index=0 | 26559 | CID | 1285.3457 | 1 | -5.049801 | 3 | K.IGAYLFVDMAHVAGLIAAGVYPNPVPHAHVVTSTTHK.T | test | 299 | 244 | 1.4807088E-31 | 3.2871733E-29 | 0.0 | 0.0 | -| test.mgf | index=0 | 26559 | CID | 1285.3457 | 1 | -5.049801 | 3 | K.IGAYLFVDMAHVAGLIAAGVYPNPVPHAHVVTSTTHK.T | test_isoform | 299 | 244 | 1.4807088E-31 | 3.2871733E-29 | 0.0 | 0.0 | -| test.mgf | index=1 | -1 | CID | 870.11743 | 0 | 0.14029178 | 3 | K.NLANPTSVILASIQM+15.995LEYLGMADK.A | test2 | 156 | 136 | 2.2559852E-22 | 4.4217308E-20 | 0.0 | 0.0 | - - -(Text file of this table: [test_Unrolled.tsv](examples/test_Unrolled.tsv)) diff --git a/docs/output.md b/docs/output.md deleted file mode 100644 index f091479c..00000000 --- a/docs/output.md +++ /dev/null @@ -1,166 +0,0 @@ -# MS-GF+ Output Formats - -[MS-GF+ Documentation home](readme.md) · [ChangeLog](changelog.md) - -MS-GF+ writes two output formats: Percolator `.pin` (default) and a tab-separated `.tsv`. The `.mzid` format has been removed; downstream tools should rescore the `.pin` with Percolator or consume the `.tsv` directly. - -Select the format with `-outputFormat`: - -| Flag | Format | Extension | Typical use | -|---|---|---|---| -| `-outputFormat pin` (default) | Percolator `.pin` | `.pin` | Feed to Percolator / MS²Rescore / Mokapot for FDR-calibrated rescoring | -| `-outputFormat tsv` | Tab-separated values | `.tsv` | Direct inspection / downstream tools that consume TSV | - -`-outputFormat` accepts the named values `pin` and `tsv` (case-insensitive). Numeric forms (`0`, `1`) accepted by older releases are no longer recognised — pass the named value instead. - -The output path (`-o`) must use the matching extension. If `-o` is omitted, MS-GF+ writes `.pin` (or `.tsv`) in the spectrum file's directory. - ---- - -## The `.pin` file (default) - -A Percolator input file — tab-separated, one header row followed by one row per peptide-spectrum match (PSM). The column schema matches OpenMS `PercolatorAdapter` so the same pin can be consumed by Percolator, MS²Rescore, or Mokapot without translation. - -### Row format - -``` -SpecId Label ScanNr ExpMass CalcMass mass RawScore DeNovoScore lnSpecEValue lnEValue isotope_error peplen dm absdm charge2 … chargeK enzN enzC enzInt NumMatchedMainIons longest_b longest_y longest_y_pct ExplainedIonCurrentRatio NTermIonCurrentRatio CTermIonCurrentRatio MS2IonCurrent IsolationWindowEfficiency MeanErrorTop7 StdevErrorTop7 MeanRelErrorTop7 StdevRelErrorTop7 lnDeltaSpecEValue matchedIonRatio Peptide Proteins -``` - -Rows are written in scoring order (rank-1 PSM per spectrum, unless `-n > 1`). - -### Column reference - -**Identity + label (positions 1–3)** - -| Column | Meaning | -|---|---| -| `SpecId` | Unique PSM id: `__`. SpecID comes from the spectrum file (nativeID for mzML). | -| `Label` | `1` for PSMs whose protein list contains at least one target, `-1` when every protein is a decoy. Percolator uses this to train the target/decoy classifier. | -| `ScanNr` | MS2 scan number from the spectrum file. | - -**Mass + charge features (positions 4–16)** - -| Column | Meaning | -|---|---| -| `ExpMass` | Experimental precursor mass (Da) = `precursorMz * charge`. | -| `CalcMass` | Theoretical peptide mass (Da) from the matched sequence. | -| `mass` | Duplicate of `ExpMass` — kept for OpenMS `PercolatorAdapter` layout parity. | -| `RawScore` | MS-GF+ `MSGFScore` (integer) — the sum-of-node-scores from the peptide's backbone graph. | -| `DeNovoScore` | MS-GF+ `DeNovoScore` — the best-path score through the spectrum graph ignoring peptide constraints. | -| `lnSpecEValue` | `log(SpecEValue)`. SpecEValue is MS-GF+'s exact E-value from the generating function. `-Double.MAX_VALUE` if non-positive. | -| `lnEValue` | `log(EValue)`. EValue is SpecEValue × number of distinct candidate peptides. | -| `isotope_error` | Rounded `(ExpMass − CalcMass) / 1.00335` — which isotope peak was fragmented (−2, −1, 0, 1, 2). | -| `peplen` | Peptide length *plus 2* (includes the flanking residues recorded in the suffix array). | -| `dm` | Mass delta `adjustedExpMz − theoMz` in Da (after isotope-error correction). | -| `absdm` | `abs(dm)`. | -| `charge2 … chargeK` | One-hot charge encoding over `params.getMinCharge()..getMaxCharge()`. | - -**Enzymatic-boundary features (positions 17–19)** - -| Column | Meaning | -|---|---| -| `enzN` | `1` if the peptide's N-terminal boundary is enzymatically valid (or a protein boundary); `0` otherwise. Rules mirror OpenMS `PercolatorInfile::isEnz_`. | -| `enzC` | `1` if the peptide's C-terminal boundary is enzymatically valid; `0` otherwise. | -| `enzInt` | Number of enzymatically cleavable positions *internal* to the peptide (≤ `peplen − 1`). For trypsin, typically `0` unless the PSM spans missed cleavages. | - -**Ion-structure features (positions 20–24)** - -| Column | Meaning | -|---|---| -| `NumMatchedMainIons` | Number of predicted main ions (b/y, any charge) matched to observed peaks. | -| `longest_b` | Longest consecutive run of matched b-ions along the backbone. | -| `longest_y` | Longest consecutive run of matched y-ions. Tends to be higher-weighted by Percolator than `longest_b` on tryptic data. | -| `longest_y_pct` | `longest_y / (peptide.size() − 1)` — fraction of peptide-bond positions covered by the longest y-ion run. | - -**Ion-current features (positions 25–29)** - -| Column | Meaning | -|---|---| -| `ExplainedIonCurrentRatio` | `NTermIonCurrentRatio + CTermIonCurrentRatio`. | -| `NTermIonCurrentRatio` | Summed intensity of matched b-ions, divided by total MS2 ion current for the spectrum. | -| `CTermIonCurrentRatio` | Same for y-ions. | -| `MS2IonCurrent` | Summed intensity of all observed peaks in the spectrum. | -| `IsolationWindowEfficiency` | Reserved (emitted as 0 in the current release). | - -**Fragment-mass-error features (positions 30–33)** - -Computed across the seven highest-intensity matched peaks in the spectrum. - -| Column | Meaning | -|---|---| -| `MeanErrorTop7` | Mean ppm error. | -| `StdevErrorTop7` | Stdev of ppm error. | -| `MeanRelErrorTop7` | Mean relative error (intensity-weighted). | -| `StdevRelErrorTop7` | Stdev of relative error. | - -`NaN` / `Infinity` values (produced when fewer than two ions are matched) are automatically rewritten to `0` so Percolator does not terminate on non-finite feature values. - -**Generating-function / rank features (positions 34–35)** - -| Column | Meaning | -|---|---| -| `lnDeltaSpecEValue` | `log(rank1_SpecEValue / rank2_SpecEValue)` for the rank-1 PSM of a spectrum; `0` otherwise or if the rank-2 candidate is missing. Larger (more negative) = more separation from the runner-up. | -| `matchedIonRatio` | `NumMatchedMainIons / peplen` — peptide-length-normalized ion-match density. | - -**Peptide + protein (positions 36+)** - -| Column | Meaning | -|---|---| -| `Peptide` | Percolator-style annotation: `flanking.PEPTIDE_WITH_MODS.flanking`. Modifications are written as `+mass` after the modified residue, or as `[+mass]-PEPTIDE` at peptide N-term. Fixed modifications ARE included. | -| `Proteins` | One column per matching protein accession (tab-separated). Prefixed with the decoy tag (default `XXX_`) when the match is a decoy. | - -### Example file - -A trimmed sample `.pin` from a PXD001819 search (20 target PSMs + 10 decoys, curated for peptide-sequence diversity so every feature column has data) is at [`examples/pxd001819_example.pin`](examples/pxd001819_example.pin). Open it in any TSV viewer to inspect the schema; the full MS-GF+ output on the same dataset has ~39 K rows. - -### Using the `.pin` with Percolator - -```bash -percolator --seed 42 \ - --results-psms out.target.psms.txt \ - --decoy-results-psms out.decoy.psms.txt \ - --weights out.weights.txt \ - --only-psms \ - run.pin -``` - -Percolator output is also tab-separated: `PSMId`, `score`, `q-value`, `posterior_error_prob`, `peptide`, `proteinIds`. Count PSMs at 1% FDR with `awk -F'\t' 'NR>1 && $3+0<=0.01 {c++} END {print c}' out.target.psms.txt`. - -### Peptide modification notation - -| Source | Example | -|---|---| -| Variable (on residue) | `K+229.163` (TMT6plex on K) | -| Variable (N-term) | `[+42.011]-PEPTIDE` (N-term acetyl) | -| Variable (C-term) | `PEPTIDE-[+0.984]` | -| Fixed (auto-applied to every occurrence) | rendered same as variable, e.g. `+57.021` after every C for carbamidomethyl | -| Stacked mods on one residue | `C+57.021+14.016` | - ---- - -## The `.tsv` file - -Tab-separated one-row-per-PSM table. Contains the same scoring columns as the pin plus an "#SpecFile" leading column identifying the source spectrum file. Useful when you want to inspect PSMs without running Percolator, or feed a downstream tool that accepts a flat PSM table. - -Column order: - -``` -#SpecFile SpecID ScanNum [Title] FragMethod Precursor IsotopeError PrecursorError(ppm) Charge Peptide Protein DeNovoScore MSGFScore SpecEValue EValue [QValue] [PepQValue] [additional features…] -``` - -- `Title` column is only present for MGF input. -- `QValue` / `PepQValue` only present when `-tda 1` (target-decoy search). -- Additional feature columns (same set as pin's extra features) are appended when `-addFeatures 1` is supplied. - ---- - -## Migrating from `.mzid` - -Previous MS-GF+ releases wrote `.mzid` (mzIdentML) by default. That output has been fully removed in the next release. To get equivalent FDR-calibrated PSM tables: - -1. Run MS-GF+ with default settings (produces `.pin`). -2. Rescore the `.pin` with Percolator (or MS²Rescore / Mokapot). -3. Load the resulting `out.target.psms.txt` with your downstream tool. - -For legacy `.mzid` post-processing, use MS-GF+ v2026.03.25 or earlier, or an external mzid toolchain. diff --git a/docs/parameterfiles/MSGFPlus_PartTryp_DynMetOx_ProOx_Stat_CysAlk_TMT_6Plex_20ppmParTol.txt b/docs/parameterfiles/MSGFPlus_PartTryp_DynMetOx_ProOx_Stat_CysAlk_TMT_6Plex_20ppmParTol.txt deleted file mode 100644 index 40b2a61a..00000000 --- a/docs/parameterfiles/MSGFPlus_PartTryp_DynMetOx_ProOx_Stat_CysAlk_TMT_6Plex_20ppmParTol.txt +++ /dev/null @@ -1,98 +0,0 @@ -# Precursor mass tolerance -# Examples: 2.5Da or 30ppm -# Use comma to set asymmetric values, for example "0.5Da,2.5Da" will set 0.5Da to the left (expMasstheoMass) -PrecursorMassTolerance=20ppm - -# Max Number of Dynamic (Variable) Modifications per peptide -# If this value is large, the search will be slow -NumMods=3 - -# Modifications (see below for examples) -StaticMod=229.1629, *, fix, N-term, TMT6plex -StaticMod=229.1629, K, fix, any, TMT6plex -StaticMod=C2H3N1O1, C, fix, any, Carbamidomethyl # Fixed Carbamidomethyl C (alkylation, +57.0215) - -DynamicMod=O1, MP, opt, any, Oxidation # Oxidized methionine and proline - -# Fragmentation Method -# 0 means as written in the spectrum or CID if no info (Default) -# 1 means CID -# 2 means ETD -# 3 means HCD -# 4 means UVPD -FragmentationMethodID=0 - -# Instrument ID -# 0 means Low-res LCQ/LTQ (Default for CID and ETD); use InstrumentID=0 if analyzing a dataset with low-res CID and high-res HCD spectra, or with only low-res HCD spectra -# 1 means High-res LTQ (Default for high res HCD; also appropriate for high res CID); use InstrumentID=1 for Orbitrap and Lumos instruments with high res MS2 spectra -# 2 means TOF -# 3 means Q-Exactive; use InstrumentID=3 for Q Exactive and QEHFX instruments -InstrumentID=1 - -# Enzyme ID -# 0 means unspecific cleavage (cleave after any residue) -# 1 means Trypsin (Default); optionally use this along with NTT=0 for a no-enzyme-specificity search of a tryptically digested sample -# 2: Chymotrypsin, 3: Lys-C, 4: Lys-N, 5: Glu-C, 6: Arg-C, 7: Asp-N, 8: alphaLP, 9: No Cleavage (for peptidomics), 10: TrypPlusC (cleave after K, R, or C) -EnzymeID=1 - -# Isotope error range -# Takes into account the error introduced by not choosing the monoisotopic peak for fragmentation. -# Useful for accurate precursor ion masses. -# Ignored if the parent mass tolerance is > 0.5Da or 500ppm. -# The combination of -t and -ti determines the precursor mass tolerance. -# e.g. "-t 20ppm -ti -1,2" tests abs(observed - theoretical - n * 1.00335Da) < 20ppm for n=-1, 0, 1, 2 -IsotopeErrorRange=-1,1 - -# Number of tolerable termini -# The number of peptide termini that must have been cleaved by the enzyme (default 1) -# For trypsin, 2 means fully tryptic only, 1 means partially tryptic, and 0 means no-enzyme search -NTT=1 - -# Control N-terminal methionine cleavage -# 0 means to consider protein N-term Met cleavage (Default) -# 1 means to ignore protein N-term Met cleavage -IgnoreMetCleavage=0 - -# Target/Decoy search mode -# 0 means don't search decoy database (default) -# 1 means search decoy database to compute FDR (source FASTA file must be forward-only proteins) -TDA=1 - -# Number of Threads (by default, uses all available cores) -NumThreads=All - -# Minimum peptide length to consider -MinPepLength=6 - -# Maximum peptide length to consider -MaxPepLength=50 - -# Minimum precursor charge to consider (if not specified in the spectrum) -MinCharge=2 - -# Maximum precursor charge to consider (if not specified in the spectrum) -MaxCharge=5 - -# Number of matches per spectrum to be reported -# If this value is greater than 1, the FDR values computed by MS-GF+ will be skewed by high-scoring 2nd and 3rd hits -NumMatchesPerSpec=1 - -# Amino Acid Modification Examples -# Specify static modifications using one or more StaticMod= entries -# Specify dynamic modifications using one or more DynamicMod= entries -# Modification format is: -# Mass or CompositionString, Residues, ModType, Position, Name (all five fields are required). -# CompositionString can only contain a limited set of elements, primarily C H N O S or P -# -# Examples: -# C2H3N1O1, C, fix, any, Carbamidomethyl # Fixed Carbamidomethyl C (alkylation) -# O1, M, opt, any, Oxidation # Oxidation M -# 15.994915, M, opt, any, Oxidation # Oxidation M (mass is used instead of CompositionString) -# H-1N-1O1, NQ, opt, any, Deamidated # Negative numbers are allowed. -# CH2, K, opt, any, Methyl # Methylation K -# C2H2O1, K, opt, any, Acetyl # Acetylation K -# HO3P, STY,opt, any, Phospho # Phosphorylation STY -# C2H3NO, *, opt, N-term, Carbamidomethyl # Variable Carbamidomethyl N-term -# H-2O-1, E, opt, N-term, Glu->pyro-Glu # Pyro-glu from E -# H-3N-1, Q, opt, N-term, Gln->pyro-Glu # Pyro-glu from Q -# C2H2O, *, opt, Prot-N-term, Acetyl # Acetylation Protein N-term diff --git a/docs/parameterfiles/MSGFPlus_PartTryp_DynMetOx_Stat_CysAlk_TMT_6Plex_20ppmParTol.txt b/docs/parameterfiles/MSGFPlus_PartTryp_DynMetOx_Stat_CysAlk_TMT_6Plex_20ppmParTol.txt deleted file mode 100644 index 9e2815fc..00000000 --- a/docs/parameterfiles/MSGFPlus_PartTryp_DynMetOx_Stat_CysAlk_TMT_6Plex_20ppmParTol.txt +++ /dev/null @@ -1,116 +0,0 @@ -# Precursor mass tolerance -# Examples: 2.5Da or 30ppm -# Use comma to set asymmetric values, for example "0.5Da,2.5Da" will set 0.5Da to the left (expMasstheoMass) -PrecursorMassTolerance=20ppm - -# Max Number of Dynamic (Variable) Modifications per peptide -# If this value is large, the search will be slow -NumMods=3 - -# Modifications (see below for examples) -StaticMod=229.1629, *, fix, N-term, TMT6plex -StaticMod=229.1629, K, fix, any, TMT6plex -StaticMod=C2H3N1O1, C, fix, any, Carbamidomethyl # Fixed Carbamidomethyl C (alkylation, +57.0215) - -DynamicMod=O1, M, opt, any, Oxidation # Oxidized methionine - -# Fragmentation Method -# 0 means as written in the spectrum or CID if no info (Default) -# 1 means CID -# 2 means ETD -# 3 means HCD -# 4 means UVPD -FragmentationMethodID=0 - -# Instrument ID -# 0 means Low-res LCQ/LTQ (Default for CID and ETD); use InstrumentID=0 if analyzing a dataset with low-res CID and high-res HCD spectra, or with only low-res HCD spectra -# 1 means High-res LTQ (Default for high res HCD; also appropriate for high res CID); use InstrumentID=1 for Orbitrap and Lumos instruments with high res MS2 spectra -# 2 means TOF -# 3 means Q-Exactive; use InstrumentID=3 for Q Exactive and QEHFX instruments -InstrumentID=1 - -# Enzyme ID -# 0 means unspecific cleavage (cleave after any residue) -# 1 means Trypsin (Default); optionally use this along with NTT=0 for a no-enzyme-specificity search of a tryptically digested sample -# 2: Chymotrypsin, 3: Lys-C, 4: Lys-N, 5: Glu-C, 6: Arg-C, 7: Asp-N, 8: alphaLP, 9: No Cleavage (for peptidomics), 10: TrypPlusC (cleave after K, R, or C) -EnzymeID=1 - -# Isotope error range -# Takes into account the error introduced by not choosing the monoisotopic peak for fragmentation. -# Useful for accurate precursor ion masses. -# Ignored if the parent mass tolerance is > 0.5Da or 500ppm. -# The combination of -t and -ti determines the precursor mass tolerance. -# e.g. "-t 20ppm -ti -1,2" tests abs(observed - theoretical - n * 1.00335Da) < 20ppm for n=-1, 0, 1, 2 -IsotopeErrorRange=-1,2 - -# Number of tolerable termini -# The number of peptide termini that must have been cleaved by the enzyme (default 1) -# For trypsin, 2 means fully tryptic only, 1 means partially tryptic, and 0 means no-enzyme search -NTT=1 - -# Control N-terminal methionine cleavage -# 0 means to consider protein N-term Met cleavage (Default) -# 1 means to ignore protein N-term Met cleavage -IgnoreMetCleavage=0 - -# Target/Decoy search mode -# 0 means don't search decoy database (default) -# 1 means search decoy database to compute FDR (source FASTA file must be forward-only proteins) -TDA=1 - -# Number of Threads (by default, uses all available cores) -NumThreads=All - -# Minimum peptide length to consider -MinPepLength=6 - -# Maximum peptide length to consider -MaxPepLength=50 - -# Minimum precursor charge to consider (if not specified in the spectrum) -MinCharge=2 - -# Maximum precursor charge to consider (if not specified in the spectrum) -MaxCharge=5 - -# Number of matches per spectrum to be reported -# If this value is greater than 1, the FDR values computed by MS-GF+ will be skewed by high-scoring 2nd and 3rd hits -NumMatchesPerSpec=1 - -# Mass of charge carrier -# Default: mass of proton -#ChargeCarrierMass=1.00727649 - -# Maximum missed cleavages -# Exclude peptides with more than this number of missed cleavages from the search, Default: -1 (no limit) -#MaxMissedCleavages=-1 - -# Minimum number of ions a spectrum must have to be examined -#MinNumPeaksPerSpectrum=10 - -# Number of isoforms to consider per peptide -# Default: 128 -#NumIsoforms=128 - -# Include additional features in the output (enable this to post-process results with Percolator) -#AddFeatures=1 - -# Amino Acid Modification Examples -# Specify static modifications using one or more StaticMod= entries -# Specify dynamic modifications using one or more DynamicMod= entries -# Modification format is: -# Mass or CompositionString, Residues, ModType, Position, Name (all five fields are required). -# CompositionString can only contain a limited set of elements, primarily C H N O S or P -# -# Examples: -# C2H3N1O1, C, fix, any, Carbamidomethyl # Fixed Carbamidomethyl C (alkylation) -# O1, M, opt, any, Oxidation # Oxidation M -# 15.994915, M, opt, any, Oxidation # Oxidation M (mass is used instead of CompositionString) -# H-1N-1O1, NQ, opt, any, Deamidated # Negative numbers are allowed. -# CH2, K, opt, any, Methyl # Methylation K -# C2H2O1, K, opt, any, Acetyl # Acetylation K -# HO3P, STY,opt, any, Phospho # Phosphorylation STY -# C2H3NO, *, opt, N-term, Carbamidomethyl # Variable Carbamidomethyl N-term -# H-2O-1, E, opt, N-term, Glu->pyro-Glu # Pyro-glu from E -# H-3N-1, Q, opt, N-term, Gln->pyro-Glu # Pyro-glu from Q -# C2H2O, *, opt, Prot-N-term, Acetyl # Acetylation Protein N-term diff --git a/docs/parameterfiles/MSGFPlus_PartTryp_DynMetOx_Stat_CysAlk_iTRAQ_8Plex_20ppmParTol.txt b/docs/parameterfiles/MSGFPlus_PartTryp_DynMetOx_Stat_CysAlk_iTRAQ_8Plex_20ppmParTol.txt deleted file mode 100644 index 18197dc5..00000000 --- a/docs/parameterfiles/MSGFPlus_PartTryp_DynMetOx_Stat_CysAlk_iTRAQ_8Plex_20ppmParTol.txt +++ /dev/null @@ -1,98 +0,0 @@ -# Precursor mass tolerance -# Examples: 2.5Da or 30ppm -# Use comma to set asymmetric values, for example "0.5Da,2.5Da" will set 0.5Da to the left (expMasstheoMass) -PrecursorMassTolerance=20ppm - -# Max Number of Dynamic (Variable) Modifications per peptide -# If this value is large, the search will be slow -NumMods=3 - -# Modifications (see below for examples) -StaticMod=304.205353, *, fix, N-term, iTRAQ8plex -StaticMod=304.205353, K, fix, any, iTRAQ8plex -StaticMod=C2H3N1O1, C, fix, any, Carbamidomethyl # Fixed Carbamidomethyl C (alkylation, +57.0215) - -DynamicMod=O1, M, opt, any, Oxidation # Oxidized methionine - -# Fragmentation Method -# 0 means as written in the spectrum or CID if no info (Default) -# 1 means CID -# 2 means ETD -# 3 means HCD -# 4 means UVPD -FragmentationMethodID=0 - -# Instrument ID -# 0 means Low-res LCQ/LTQ (Default for CID and ETD); use InstrumentID=0 if analyzing a dataset with low-res CID and high-res HCD spectra, or with only low-res HCD spectra -# 1 means High-res LTQ (Default for high res HCD; also appropriate for high res CID); use InstrumentID=1 for Orbitrap and Lumos instruments with high res MS2 spectra -# 2 means TOF -# 3 means Q-Exactive; use InstrumentID=3 for Q Exactive and QEHFX instruments -InstrumentID=1 - -# Enzyme ID -# 0 means unspecific cleavage (cleave after any residue) -# 1 means Trypsin (Default); optionally use this along with NTT=0 for a no-enzyme-specificity search of a tryptically digested sample -# 2: Chymotrypsin, 3: Lys-C, 4: Lys-N, 5: Glu-C, 6: Arg-C, 7: Asp-N, 8: alphaLP, 9: No Cleavage (for peptidomics), 10: TrypPlusC (cleave after K, R, or C) -EnzymeID=1 - -# Isotope error range -# Takes into account the error introduced by not choosing the monoisotopic peak for fragmentation. -# Useful for accurate precursor ion masses. -# Ignored if the parent mass tolerance is > 0.5Da or 500ppm. -# The combination of -t and -ti determines the precursor mass tolerance. -# e.g. "-t 20ppm -ti -1,2" tests abs(observed - theoretical - n * 1.00335Da) < 20ppm for n=-1, 0, 1, 2 -IsotopeErrorRange=-1,1 - -# Number of tolerable termini -# The number of peptide termini that must have been cleaved by the enzyme (default 1) -# For trypsin, 2 means fully tryptic only, 1 means partially tryptic, and 0 means no-enzyme search -NTT=1 - -# Control N-terminal methionine cleavage -# 0 means to consider protein N-term Met cleavage (Default) -# 1 means to ignore protein N-term Met cleavage -IgnoreMetCleavage=0 - -# Target/Decoy search mode -# 0 means don't search decoy database (default) -# 1 means search decoy database to compute FDR (source FASTA file must be forward-only proteins) -TDA=1 - -# Number of Threads (by default, uses all available cores) -NumThreads=All - -# Minimum peptide length to consider -MinPepLength=6 - -# Maximum peptide length to consider -MaxPepLength=50 - -# Minimum precursor charge to consider (if not specified in the spectrum) -MinCharge=2 - -# Maximum precursor charge to consider (if not specified in the spectrum) -MaxCharge=5 - -# Number of matches per spectrum to be reported -# If this value is greater than 1, the FDR values computed by MS-GF+ will be skewed by high-scoring 2nd and 3rd hits -NumMatchesPerSpec=1 - -# Amino Acid Modification Examples -# Specify static modifications using one or more StaticMod= entries -# Specify dynamic modifications using one or more DynamicMod= entries -# Modification format is: -# Mass or CompositionString, Residues, ModType, Position, Name (all five fields are required). -# CompositionString can only contain a limited set of elements, primarily C H N O S or P -# -# Examples: -# C2H3N1O1, C, fix, any, Carbamidomethyl # Fixed Carbamidomethyl C (alkylation) -# O1, M, opt, any, Oxidation # Oxidation M -# 15.994915, M, opt, any, Oxidation # Oxidation M (mass is used instead of CompositionString) -# H-1N-1O1, NQ, opt, any, Deamidated # Negative numbers are allowed. -# CH2, K, opt, any, Methyl # Methylation K -# C2H2O1, K, opt, any, Acetyl # Acetylation K -# HO3P, STY,opt, any, Phospho # Phosphorylation STY -# C2H3NO, *, opt, N-term, Carbamidomethyl # Variable Carbamidomethyl N-term -# H-2O-1, E, opt, N-term, Glu->pyro-Glu # Pyro-glu from E -# H-3N-1, Q, opt, N-term, Gln->pyro-Glu # Pyro-glu from Q -# C2H2O, *, opt, Prot-N-term, Acetyl # Acetylation Protein N-term diff --git a/docs/parameterfiles/MSGFPlus_PartTryp_DynMetOx_Stat_TMT_6Plex_20ppmParTol.txt b/docs/parameterfiles/MSGFPlus_PartTryp_DynMetOx_Stat_TMT_6Plex_20ppmParTol.txt deleted file mode 100644 index 69aa73ee..00000000 --- a/docs/parameterfiles/MSGFPlus_PartTryp_DynMetOx_Stat_TMT_6Plex_20ppmParTol.txt +++ /dev/null @@ -1,115 +0,0 @@ -# Precursor mass tolerance -# Examples: 2.5Da or 30ppm -# Use comma to set asymmetric values, for example "0.5Da,2.5Da" will set 0.5Da to the left (expMasstheoMass) -PrecursorMassTolerance=20ppm - -# Max Number of Dynamic (Variable) Modifications per peptide -# If this value is large, the search will be slow -NumMods=3 - -# Modifications (see below for examples) -StaticMod=229.1629, *, fix, N-term, TMT6plex -StaticMod=229.1629, K, fix, any, TMT6plex - -DynamicMod=O1, M, opt, any, Oxidation # Oxidized methionine - -# Fragmentation Method -# 0 means as written in the spectrum or CID if no info (Default) -# 1 means CID -# 2 means ETD -# 3 means HCD -# 4 means UVPD -FragmentationMethodID=0 - -# Instrument ID -# 0 means Low-res LCQ/LTQ (Default for CID and ETD); use InstrumentID=0 if analyzing a dataset with low-res CID and high-res HCD spectra, or with only low-res HCD spectra -# 1 means High-res LTQ (Default for high res HCD; also appropriate for high res CID); use InstrumentID=1 for Orbitrap and Lumos instruments with high res MS2 spectra -# 2 means TOF -# 3 means Q-Exactive; use InstrumentID=3 for Q Exactive and QEHFX instruments -InstrumentID=1 - -# Enzyme ID -# 0 means unspecific cleavage (cleave after any residue) -# 1 means Trypsin (Default); optionally use this along with NTT=0 for a no-enzyme-specificity search of a tryptically digested sample -# 2: Chymotrypsin, 3: Lys-C, 4: Lys-N, 5: Glu-C, 6: Arg-C, 7: Asp-N, 8: alphaLP, 9: No Cleavage (for peptidomics), 10: TrypPlusC (cleave after K, R, or C) -EnzymeID=1 - -# Isotope error range -# Takes into account the error introduced by not choosing the monoisotopic peak for fragmentation. -# Useful for accurate precursor ion masses. -# Ignored if the parent mass tolerance is > 0.5Da or 500ppm. -# The combination of -t and -ti determines the precursor mass tolerance. -# e.g. "-t 20ppm -ti -1,2" tests abs(observed - theoretical - n * 1.00335Da) < 20ppm for n=-1, 0, 1, 2 -IsotopeErrorRange=-1,2 - -# Number of tolerable termini -# The number of peptide termini that must have been cleaved by the enzyme (default 1) -# For trypsin, 2 means fully tryptic only, 1 means partially tryptic, and 0 means no-enzyme search -NTT=1 - -# Control N-terminal methionine cleavage -# 0 means to consider protein N-term Met cleavage (Default) -# 1 means to ignore protein N-term Met cleavage -IgnoreMetCleavage=0 - -# Target/Decoy search mode -# 0 means don't search decoy database (default) -# 1 means search decoy database to compute FDR (source FASTA file must be forward-only proteins) -TDA=1 - -# Number of Threads (by default, uses all available cores) -NumThreads=All - -# Minimum peptide length to consider -MinPepLength=6 - -# Maximum peptide length to consider -MaxPepLength=50 - -# Minimum precursor charge to consider (if not specified in the spectrum) -MinCharge=2 - -# Maximum precursor charge to consider (if not specified in the spectrum) -MaxCharge=5 - -# Number of matches per spectrum to be reported -# If this value is greater than 1, the FDR values computed by MS-GF+ will be skewed by high-scoring 2nd and 3rd hits -NumMatchesPerSpec=1 - -# Mass of charge carrier -# Default: mass of proton -#ChargeCarrierMass=1.00727649 - -# Maximum missed cleavages -# Exclude peptides with more than this number of missed cleavages from the search, Default: -1 (no limit) -#MaxMissedCleavages=-1 - -# Minimum number of ions a spectrum must have to be examined -#MinNumPeaksPerSpectrum=10 - -# Number of isoforms to consider per peptide -# Default: 128 -#NumIsoforms=128 - -# Include additional features in the output (enable this to post-process results with Percolator) -#AddFeatures=1 - -# Amino Acid Modification Examples -# Specify static modifications using one or more StaticMod= entries -# Specify dynamic modifications using one or more DynamicMod= entries -# Modification format is: -# Mass or CompositionString, Residues, ModType, Position, Name (all five fields are required). -# CompositionString can only contain a limited set of elements, primarily C H N O S or P -# -# Examples: -# C2H3N1O1, C, fix, any, Carbamidomethyl # Fixed Carbamidomethyl C (alkylation) -# O1, M, opt, any, Oxidation # Oxidation M -# 15.994915, M, opt, any, Oxidation # Oxidation M (mass is used instead of CompositionString) -# H-1N-1O1, NQ, opt, any, Deamidated # Negative numbers are allowed. -# CH2, K, opt, any, Methyl # Methylation K -# C2H2O1, K, opt, any, Acetyl # Acetylation K -# HO3P, STY,opt, any, Phospho # Phosphorylation STY -# C2H3NO, *, opt, N-term, Carbamidomethyl # Variable Carbamidomethyl N-term -# H-2O-1, E, opt, N-term, Glu->pyro-Glu # Pyro-glu from E -# H-3N-1, Q, opt, N-term, Gln->pyro-Glu # Pyro-glu from Q -# C2H2O, *, opt, Prot-N-term, Acetyl # Acetylation Protein N-term diff --git a/docs/parameterfiles/MSGFPlus_PartTryp_Dyn_MetOx_CustomAA_O_Hydroxyproline_20ppmParTol.txt b/docs/parameterfiles/MSGFPlus_PartTryp_Dyn_MetOx_CustomAA_O_Hydroxyproline_20ppmParTol.txt deleted file mode 100644 index 1066c9b3..00000000 --- a/docs/parameterfiles/MSGFPlus_PartTryp_Dyn_MetOx_CustomAA_O_Hydroxyproline_20ppmParTol.txt +++ /dev/null @@ -1,111 +0,0 @@ -# Precursor mass tolerance -# Examples: 2.5Da or 30ppm -# Use comma to set asymmetric values, for example "0.5Da,2.5Da" will set 0.5Da to the left (expMasstheoMass) -PrecursorMassTolerance=20ppm - -# Max Number of Dynamic (Variable) Modifications per peptide -# If this value is large, the search will be slow -NumMods=3 - -# Modifications (see below for examples) -StaticMod=None - -DynamicMod=O1, M, opt, any, Oxidation # Oxidized methionine - -# Custom amino acids -CustomAA=C5H7N1O2S0, O, custom, P, Hydroxylation # Hydroxyproline - -# Fragmentation Method -# 0 means as written in the spectrum or CID if no info (Default) -# 1 means CID -# 2 means ETD -# 3 means HCD -# 4 means UVPD -FragmentationMethodID=0 - -# Instrument ID -# 0 means Low-res LCQ/LTQ (Default for CID and ETD); use InstrumentID=0 if analyzing a dataset with low-res CID and high-res HCD spectra, or with only low-res HCD spectra -# 1 means High-res LTQ (Default for high res HCD; also appropriate for high res CID); use InstrumentID=1 for Orbitrap and Lumos instruments with high res MS2 spectra -# 2 means TOF -# 3 means Q-Exactive; use InstrumentID=3 for Q Exactive and QEHFX instruments -InstrumentID=1 - -# Enzyme ID -# 0 means unspecific cleavage (cleave after any residue) -# 1 means Trypsin (Default); optionally use this along with NTT=0 for a no-enzyme-specificity search of a tryptically digested sample -# 2: Chymotrypsin, 3: Lys-C, 4: Lys-N, 5: Glu-C, 6: Arg-C, 7: Asp-N, 8: alphaLP, 9: No Cleavage (for peptidomics), 10: TrypPlusC (cleave after K, R, or C) -EnzymeID=1 - -# Isotope error range -# Takes into account the error introduced by not choosing the monoisotopic peak for fragmentation. -# Useful for accurate precursor ion masses. -# Ignored if the parent mass tolerance is > 0.5Da or 500ppm. -# The combination of -t and -ti determines the precursor mass tolerance. -# e.g. "-t 20ppm -ti -1,2" tests abs(observed - theoretical - n * 1.00335Da) < 20ppm for n=-1, 0, 1, 2 -IsotopeErrorRange=-1,2 - -# Number of tolerable termini -# The number of peptide termini that must have been cleaved by the enzyme (default 1) -# For trypsin, 2 means fully tryptic only, 1 means partially tryptic, and 0 means no-enzyme search -NTT=1 - -# Control N-terminal methionine cleavage -# 0 means to consider protein N-term Met cleavage (Default) -# 1 means to ignore protein N-term Met cleavage -IgnoreMetCleavage=0 - -# Target/Decoy search mode -# 0 means don't search decoy database (default) -# 1 means search decoy database to compute FDR (source FASTA file must be forward-only proteins) -TDA=1 - -# Number of Threads (by default, uses all available cores) -NumThreads=All - -# Minimum peptide length to consider -MinPepLength=6 - -# Maximum peptide length to consider -MaxPepLength=50 - -# Minimum precursor charge to consider (if not specified in the spectrum) -MinCharge=2 - -# Maximum precursor charge to consider (if not specified in the spectrum) -MaxCharge=5 - -# Number of matches per spectrum to be reported -# If this value is greater than 1, the FDR values computed by MS-GF+ will be skewed by high-scoring 2nd and 3rd hits -NumMatchesPerSpec=1 - -# Amino Acid Modification Examples -# Specify static modifications using one or more StaticMod= entries -# Specify dynamic modifications using one or more DynamicMod= entries -# Modification format is: -# Mass or CompositionString, Residues, ModType, Position, Name (all five fields are required). -# CompositionString can only contain a limited set of elements, primarily C H N O S or P -# -# Examples: -# C2H3N1O1, C, fix, any, Carbamidomethyl # Fixed Carbamidomethyl C (alkylation) -# O1, M, opt, any, Oxidation # Oxidation M -# 15.994915, M, opt, any, Oxidation # Oxidation M (mass is used instead of CompositionString) -# H-1N-1O1, NQ, opt, any, Deamidated # Negative numbers are allowed. -# CH2, K, opt, any, Methyl # Methylation K -# C2H2O1, K, opt, any, Acetyl # Acetylation K -# HO3P, STY,opt, any, Phospho # Phosphorylation STY -# C2H3NO, *, opt, N-term, Carbamidomethyl # Variable Carbamidomethyl N-term -# H-2O-1, E, opt, N-term, Glu->pyro-Glu # Pyro-glu from E -# H-3N-1, Q, opt, N-term, Gln->pyro-Glu # Pyro-glu from Q -# C2H2O, *, opt, Prot-N-term, Acetyl # Acetylation Protein N-term - -# Custom amino acids examples -# Only supports empirical formulas of elements C H N O S. -# If other elements are needed, or a specific mass is needed, they can be added as fixed modifications on the custom AA -# Maximum atom counts: 255 C, 255 H, 63 N, 63 O, 15 S -# Format spec is: -# EmpiricalFormula, ResidueSymbol, custom, OriginalAA, Name (all five fields are required, though OriginalAA is not actually used for anything) -# -# Examples: -# C5H7N1O2S0,J,custom,P,Hydroxylation # Hydroxyproline -# C3H6N2O0S1,X,custom,C,Amidation # C-terminal amidation of Cys -# C5H5N1O1S0,Z,custom,E,Glu->pyro-Glu # N-terminal pyroGlu residue, from either Glu OR Gln diff --git a/docs/parameterfiles/MSGFPlus_PartTryp_Dyn_MetOx_NTermAcet_NQR_Deamide_Stat_CysAlk_20ppmParTol.txt b/docs/parameterfiles/MSGFPlus_PartTryp_Dyn_MetOx_NTermAcet_NQR_Deamide_Stat_CysAlk_20ppmParTol.txt deleted file mode 100644 index d25739b8..00000000 --- a/docs/parameterfiles/MSGFPlus_PartTryp_Dyn_MetOx_NTermAcet_NQR_Deamide_Stat_CysAlk_20ppmParTol.txt +++ /dev/null @@ -1,116 +0,0 @@ -# Precursor mass tolerance -# Examples: 2.5Da or 30ppm -# Use comma to set asymmetric values, for example "0.5Da,2.5Da" will set 0.5Da to the left (expMasstheoMass) -PrecursorMassTolerance=20ppm - -# Max Number of Dynamic (Variable) Modifications per peptide -# If this value is large, the search will be slow -NumMods=3 - -# Modifications (see below for examples) -StaticMod=C2H3N1O1, C, fix, any, Carbamidomethyl # Fixed Carbamidomethyl C (alkylation) - -DynamicMod=O1, M, opt, any, Oxidation # Oxidized methionine or tryptophan (+15.9949) -DynamicMod=C2H2O, *, opt, Prot-N-term, Acetyl # Acetylation Protein N-term (+42.0106) -DynamicMod=H-1N-1O1, NQR, opt, any, Deamidated # Deamidation of Glutamine (+0.984016) - -# Fragmentation Method -# 0 means as written in the spectrum or CID if no info (Default) -# 1 means CID -# 2 means ETD -# 3 means HCD -# 4 means UVPD -FragmentationMethodID=0 - -# Instrument ID -# 0 means Low-res LCQ/LTQ (Default for CID and ETD); use InstrumentID=0 if analyzing a dataset with low-res CID and high-res HCD spectra, or with only low-res HCD spectra -# 1 means High-res LTQ (Default for high res HCD; also appropriate for high res CID); use InstrumentID=1 for Orbitrap and Lumos instruments with high res MS2 spectra -# 2 means TOF -# 3 means Q-Exactive; use InstrumentID=3 for Q Exactive and QEHFX instruments -InstrumentID=1 - -# Enzyme ID -# 0 means unspecific cleavage (cleave after any residue) -# 1 means Trypsin (Default); optionally use this along with NTT=0 for a no-enzyme-specificity search of a tryptically digested sample -# 2: Chymotrypsin, 3: Lys-C, 4: Lys-N, 5: Glu-C, 6: Arg-C, 7: Asp-N, 8: alphaLP, 9: No Cleavage (for peptidomics), 10: TrypPlusC (cleave after K, R, or C) -EnzymeID=1 - -# Isotope error range -# Takes into account the error introduced by not choosing the monoisotopic peak for fragmentation. -# Useful for accurate precursor ion masses. -# Ignored if the parent mass tolerance is > 0.5Da or 500ppm. -# The combination of -t and -ti determines the precursor mass tolerance. -# e.g. "-t 20ppm -ti -1,2" tests abs(observed - theoretical - n * 1.00335Da) < 20ppm for n=-1, 0, 1, 2 -IsotopeErrorRange=-1,2 - -# Number of tolerable termini -# The number of peptide termini that must have been cleaved by the enzyme (default 1) -# For trypsin, 2 means fully tryptic only, 1 means partially tryptic, and 0 means no-enzyme search -NTT=1 - -# Control N-terminal methionine cleavage -# 0 means to consider protein N-term Met cleavage (Default) -# 1 means to ignore protein N-term Met cleavage -IgnoreMetCleavage=0 - -# Target/Decoy search mode -# 0 means don't search decoy database (default) -# 1 means search decoy database to compute FDR (source FASTA file must be forward-only proteins) -TDA=1 - -# Number of Threads (by default, uses all available cores) -NumThreads=All - -# Minimum peptide length to consider -MinPepLength=6 - -# Maximum peptide length to consider -MaxPepLength=50 - -# Minimum precursor charge to consider (if not specified in the spectrum) -MinCharge=2 - -# Maximum precursor charge to consider (if not specified in the spectrum) -MaxCharge=5 - -# Number of matches per spectrum to be reported -# If this value is greater than 1, the FDR values computed by MS-GF+ will be skewed by high-scoring 2nd and 3rd hits -NumMatchesPerSpec=1 - -# Mass of charge carrier -# Default: mass of proton -#ChargeCarrierMass=1.00727649 - -# Maximum missed cleavages -# Exclude peptides with more than this number of missed cleavages from the search, Default: -1 (no limit) -#MaxMissedCleavages=-1 - -# Minimum number of ions a spectrum must have to be examined -#MinNumPeaksPerSpectrum=10 - -# Number of isoforms to consider per peptide -# Default: 128 -#NumIsoforms=128 - -# Include additional features in the output (enable this to post-process results with Percolator) -#AddFeatures=1 - -# Amino Acid Modification Examples -# Specify static modifications using one or more StaticMod= entries -# Specify dynamic modifications using one or more DynamicMod= entries -# Modification format is: -# Mass or CompositionString, Residues, ModType, Position, Name (all five fields are required). -# CompositionString can only contain a limited set of elements, primarily C H N O S or P -# -# Examples: -# C2H3N1O1, C, fix, any, Carbamidomethyl # Fixed Carbamidomethyl C (alkylation) -# O1, M, opt, any, Oxidation # Oxidation M -# 15.994915, M, opt, any, Oxidation # Oxidation M (mass is used instead of CompositionString) -# H-1N-1O1, NQ, opt, any, Deamidated # Negative numbers are allowed. -# CH2, K, opt, any, Methyl # Methylation K -# C2H2O1, K, opt, any, Acetyl # Acetylation K -# HO3P, STY,opt, any, Phospho # Phosphorylation STY -# C2H3NO, *, opt, N-term, Carbamidomethyl # Variable Carbamidomethyl N-term -# H-2O-1, E, opt, N-term, Glu->pyro-Glu # Pyro-glu from E -# H-3N-1, Q, opt, N-term, Gln->pyro-Glu # Pyro-glu from Q -# C2H2O, *, opt, Prot-N-term, Acetyl # Acetylation Protein N-term diff --git a/docs/parameterfiles/MSGFPlus_PartTryp_MetOx_20ppmParTol.txt b/docs/parameterfiles/MSGFPlus_PartTryp_MetOx_20ppmParTol.txt deleted file mode 100644 index 8d56a5da..00000000 --- a/docs/parameterfiles/MSGFPlus_PartTryp_MetOx_20ppmParTol.txt +++ /dev/null @@ -1,114 +0,0 @@ -# Precursor mass tolerance -# Examples: 2.5Da or 30ppm -# Use comma to set asymmetric values, for example "0.5Da,2.5Da" will set 0.5Da to the left (expMasstheoMass) -PrecursorMassTolerance=20ppm - -# Max Number of Dynamic (Variable) Modifications per peptide -# If this value is large, the search will be slow -NumMods=3 - -# Modifications (see below for examples) -StaticMod=None - -DynamicMod=O1, M, opt, any, Oxidation # Oxidized methionine - -# Fragmentation Method -# 0 means as written in the spectrum or CID if no info (Default) -# 1 means CID -# 2 means ETD -# 3 means HCD -# 4 means UVPD -FragmentationMethodID=0 - -# Instrument ID -# 0 means Low-res LCQ/LTQ (Default for CID and ETD); use InstrumentID=0 if analyzing a dataset with low-res CID and high-res HCD spectra, or with only low-res HCD spectra -# 1 means High-res LTQ (Default for high res HCD; also appropriate for high res CID); use InstrumentID=1 for Orbitrap and Lumos instruments with high res MS2 spectra -# 2 means TOF -# 3 means Q-Exactive; use InstrumentID=3 for Q Exactive and QEHFX instruments -InstrumentID=1 - -# Enzyme ID -# 0 means unspecific cleavage (cleave after any residue) -# 1 means Trypsin (Default); optionally use this along with NTT=0 for a no-enzyme-specificity search of a tryptically digested sample -# 2: Chymotrypsin, 3: Lys-C, 4: Lys-N, 5: Glu-C, 6: Arg-C, 7: Asp-N, 8: alphaLP, 9: No Cleavage (for peptidomics), 10: TrypPlusC (cleave after K, R, or C) -EnzymeID=1 - -# Isotope error range -# Takes into account the error introduced by not choosing the monoisotopic peak for fragmentation. -# Useful for accurate precursor ion masses. -# Ignored if the parent mass tolerance is > 0.5Da or 500ppm. -# The combination of -t and -ti determines the precursor mass tolerance. -# e.g. "-t 20ppm -ti -1,2" tests abs(observed - theoretical - n * 1.00335Da) < 20ppm for n=-1, 0, 1, 2 -IsotopeErrorRange=-1,2 - -# Number of tolerable termini -# The number of peptide termini that must have been cleaved by the enzyme (default 1) -# For trypsin, 2 means fully tryptic only, 1 means partially tryptic, and 0 means no-enzyme search -NTT=1 - -# Control N-terminal methionine cleavage -# 0 means to consider protein N-term Met cleavage (Default) -# 1 means to ignore protein N-term Met cleavage -IgnoreMetCleavage=0 - -# Target/Decoy search mode -# 0 means don't search decoy database (default) -# 1 means search decoy database to compute FDR (source FASTA file must be forward-only proteins) -TDA=1 - -# Number of Threads (by default, uses all available cores) -NumThreads=All - -# Minimum peptide length to consider -MinPepLength=6 - -# Maximum peptide length to consider -MaxPepLength=50 - -# Minimum precursor charge to consider (if not specified in the spectrum) -MinCharge=2 - -# Maximum precursor charge to consider (if not specified in the spectrum) -MaxCharge=5 - -# Number of matches per spectrum to be reported -# If this value is greater than 1, the FDR values computed by MS-GF+ will be skewed by high-scoring 2nd and 3rd hits -NumMatchesPerSpec=1 - -# Mass of charge carrier -# Default: mass of proton -#ChargeCarrierMass=1.00727649 - -# Maximum missed cleavages -# Exclude peptides with more than this number of missed cleavages from the search, Default: -1 (no limit) -#MaxMissedCleavages=-1 - -# Minimum number of ions a spectrum must have to be examined -#MinNumPeaksPerSpectrum=10 - -# Number of isoforms to consider per peptide -# Default: 128 -#NumIsoforms=128 - -# Include additional features in the output (enable this to post-process results with Percolator) -#AddFeatures=1 - -# Amino Acid Modification Examples -# Specify static modifications using one or more StaticMod= entries -# Specify dynamic modifications using one or more DynamicMod= entries -# Modification format is: -# Mass or CompositionString, Residues, ModType, Position, Name (all five fields are required). -# CompositionString can only contain a limited set of elements, primarily C H N O S or P -# -# Examples: -# C2H3N1O1, C, fix, any, Carbamidomethyl # Fixed Carbamidomethyl C (alkylation) -# O1, M, opt, any, Oxidation # Oxidation M -# 15.994915, M, opt, any, Oxidation # Oxidation M (mass is used instead of CompositionString) -# H-1N-1O1, NQ, opt, any, Deamidated # Negative numbers are allowed. -# CH2, K, opt, any, Methyl # Methylation K -# C2H2O1, K, opt, any, Acetyl # Acetylation K -# HO3P, STY,opt, any, Phospho # Phosphorylation STY -# C2H3NO, *, opt, N-term, Carbamidomethyl # Variable Carbamidomethyl N-term -# H-2O-1, E, opt, N-term, Glu->pyro-Glu # Pyro-glu from E -# H-3N-1, Q, opt, N-term, Gln->pyro-Glu # Pyro-glu from Q -# C2H2O, *, opt, Prot-N-term, Acetyl # Acetylation Protein N-term diff --git a/docs/parameterfiles/MSGFPlus_PartTryp_MetOx_StatCysAlk_20ppmParTol.txt b/docs/parameterfiles/MSGFPlus_PartTryp_MetOx_StatCysAlk_20ppmParTol.txt deleted file mode 100644 index f53d8d80..00000000 --- a/docs/parameterfiles/MSGFPlus_PartTryp_MetOx_StatCysAlk_20ppmParTol.txt +++ /dev/null @@ -1,114 +0,0 @@ -# Precursor mass tolerance -# Examples: 2.5Da or 30ppm -# Use comma to set asymmetric values, for example "0.5Da,2.5Da" will set 0.5Da to the left (expMasstheoMass) -PrecursorMassTolerance=20ppm - -# Max Number of Dynamic (Variable) Modifications per peptide -# If this value is large, the search will be slow -NumMods=3 - -# Modifications (see below for examples) -StaticMod=C2H3N1O1, C, fix, any, Carbamidomethyl # Fixed Carbamidomethyl C (alkylation) - -DynamicMod=O1, M, opt, any, Oxidation # Oxidized methionine - -# Fragmentation Method -# 0 means as written in the spectrum or CID if no info (Default) -# 1 means CID -# 2 means ETD -# 3 means HCD -# 4 means UVPD -FragmentationMethodID=0 - -# Instrument ID -# 0 means Low-res LCQ/LTQ (Default for CID and ETD); use InstrumentID=0 if analyzing a dataset with low-res CID and high-res HCD spectra, or with only low-res HCD spectra -# 1 means High-res LTQ (Default for high res HCD; also appropriate for high res CID); use InstrumentID=1 for Orbitrap and Lumos instruments with high res MS2 spectra -# 2 means TOF -# 3 means Q-Exactive; use InstrumentID=3 for Q Exactive and QEHFX instruments -InstrumentID=1 - -# Enzyme ID -# 0 means unspecific cleavage (cleave after any residue) -# 1 means Trypsin (Default); optionally use this along with NTT=0 for a no-enzyme-specificity search of a tryptically digested sample -# 2: Chymotrypsin, 3: Lys-C, 4: Lys-N, 5: Glu-C, 6: Arg-C, 7: Asp-N, 8: alphaLP, 9: No Cleavage (for peptidomics), 10: TrypPlusC (cleave after K, R, or C) -EnzymeID=1 - -# Isotope error range -# Takes into account the error introduced by not choosing the monoisotopic peak for fragmentation. -# Useful for accurate precursor ion masses. -# Ignored if the parent mass tolerance is > 0.5Da or 500ppm. -# The combination of -t and -ti determines the precursor mass tolerance. -# e.g. "-t 20ppm -ti -1,2" tests abs(observed - theoretical - n * 1.00335Da) < 20ppm for n=-1, 0, 1, 2 -IsotopeErrorRange=-1,1 - -# Number of tolerable termini -# The number of peptide termini that must have been cleaved by the enzyme (default 1) -# For trypsin, 2 means fully tryptic only, 1 means partially tryptic, and 0 means no-enzyme search -NTT=1 - -# Control N-terminal methionine cleavage -# 0 means to consider protein N-term Met cleavage (Default) -# 1 means to ignore protein N-term Met cleavage -IgnoreMetCleavage=0 - -# Target/Decoy search mode -# 0 means don't search decoy database (default) -# 1 means search decoy database to compute FDR (source FASTA file must be forward-only proteins) -TDA=1 - -# Number of Threads (by default, uses all available cores) -NumThreads=All - -# Minimum peptide length to consider -MinPepLength=6 - -# Maximum peptide length to consider -MaxPepLength=50 - -# Minimum precursor charge to consider (if not specified in the spectrum) -MinCharge=2 - -# Maximum precursor charge to consider (if not specified in the spectrum) -MaxCharge=5 - -# Number of matches per spectrum to be reported -# If this value is greater than 1, the FDR values computed by MS-GF+ will be skewed by high-scoring 2nd and 3rd hits -NumMatchesPerSpec=1 - -# Mass of charge carrier -# Default: mass of proton -#ChargeCarrierMass=1.00727649 - -# Maximum missed cleavages -# Exclude peptides with more than this number of missed cleavages from the search, Default: -1 (no limit) -#MaxMissedCleavages=-1 - -# Minimum number of ions a spectrum must have to be examined -MinNumPeaksPerSpectrum=5 - -# Number of isoforms to consider per peptide -# Default: 128 -#NumIsoforms=128 - -# Include additional features in the output (enable this to post-process results with Percolator) -AddFeatures=1 - -# Amino Acid Modification Examples -# Specify static modifications using one or more StaticMod= entries -# Specify dynamic modifications using one or more DynamicMod= entries -# Modification format is: -# Mass or CompositionString, Residues, ModType, Position, Name (all five fields are required). -# CompositionString can only contain a limited set of elements, primarily C H N O S or P -# -# Examples: -# C2H3N1O1, C, fix, any, Carbamidomethyl # Fixed Carbamidomethyl C (alkylation) -# O1, M, opt, any, Oxidation # Oxidation M -# 15.994915, M, opt, any, Oxidation # Oxidation M (mass is used instead of CompositionString) -# H-1N-1O1, NQ, opt, any, Deamidated # Negative numbers are allowed. -# CH2, K, opt, any, Methyl # Methylation K -# C2H2O1, K, opt, any, Acetyl # Acetylation K -# HO3P, STY,opt, any, Phospho # Phosphorylation STY -# C2H3NO, *, opt, N-term, Carbamidomethyl # Variable Carbamidomethyl N-term -# H-2O-1, E, opt, N-term, Glu->pyro-Glu # Pyro-glu from E -# H-3N-1, Q, opt, N-term, Gln->pyro-Glu # Pyro-glu from Q -# C2H2O, *, opt, Prot-N-term, Acetyl # Acetylation Protein N-term diff --git a/docs/parameterfiles/MSGFPlus_PartTryp_StatCysAlk_20ppmParTol.txt b/docs/parameterfiles/MSGFPlus_PartTryp_StatCysAlk_20ppmParTol.txt deleted file mode 100644 index 121788fb..00000000 --- a/docs/parameterfiles/MSGFPlus_PartTryp_StatCysAlk_20ppmParTol.txt +++ /dev/null @@ -1,114 +0,0 @@ -# Precursor mass tolerance -# Examples: 2.5Da or 30ppm -# Use comma to set asymmetric values, for example "0.5Da,2.5Da" will set 0.5Da to the left (expMasstheoMass) -PrecursorMassTolerance=20ppm - -# Max Number of Dynamic (Variable) Modifications per peptide -# If this value is large, the search will be slow -NumMods=3 - -# Modifications (see below for examples) -StaticMod=C2H3N1O1, C, fix, any, Carbamidomethyl # Fixed Carbamidomethyl C (alkylation) - -DynamicMod=None - -# Fragmentation Method -# 0 means as written in the spectrum or CID if no info (Default) -# 1 means CID -# 2 means ETD -# 3 means HCD -# 4 means UVPD -FragmentationMethodID=0 - -# Instrument ID -# 0 means Low-res LCQ/LTQ (Default for CID and ETD); use InstrumentID=0 if analyzing a dataset with low-res CID and high-res HCD spectra, or with only low-res HCD spectra -# 1 means High-res LTQ (Default for high res HCD; also appropriate for high res CID); use InstrumentID=1 for Orbitrap and Lumos instruments with high res MS2 spectra -# 2 means TOF -# 3 means Q-Exactive; use InstrumentID=3 for Q Exactive and QEHFX instruments -InstrumentID=1 - -# Enzyme ID -# 0 means unspecific cleavage (cleave after any residue) -# 1 means Trypsin (Default); optionally use this along with NTT=0 for a no-enzyme-specificity search of a tryptically digested sample -# 2: Chymotrypsin, 3: Lys-C, 4: Lys-N, 5: Glu-C, 6: Arg-C, 7: Asp-N, 8: alphaLP, 9: No Cleavage (for peptidomics), 10: TrypPlusC (cleave after K, R, or C) -EnzymeID=1 - -# Isotope error range -# Takes into account the error introduced by not choosing the monoisotopic peak for fragmentation. -# Useful for accurate precursor ion masses. -# Ignored if the parent mass tolerance is > 0.5Da or 500ppm. -# The combination of -t and -ti determines the precursor mass tolerance. -# e.g. "-t 20ppm -ti -1,2" tests abs(observed - theoretical - n * 1.00335Da) < 20ppm for n=-1, 0, 1, 2 -IsotopeErrorRange=-1,1 - -# Number of tolerable termini -# The number of peptide termini that must have been cleaved by the enzyme (default 1) -# For trypsin, 2 means fully tryptic only, 1 means partially tryptic, and 0 means no-enzyme search -NTT=1 - -# Control N-terminal methionine cleavage -# 0 means to consider protein N-term Met cleavage (Default) -# 1 means to ignore protein N-term Met cleavage -IgnoreMetCleavage=0 - -# Target/Decoy search mode -# 0 means don't search decoy database (default) -# 1 means search decoy database to compute FDR (source FASTA file must be forward-only proteins) -TDA=1 - -# Number of Threads (by default, uses all available cores) -NumThreads=All - -# Minimum peptide length to consider -MinPepLength=6 - -# Maximum peptide length to consider -MaxPepLength=50 - -# Minimum precursor charge to consider (if not specified in the spectrum) -MinCharge=2 - -# Maximum precursor charge to consider (if not specified in the spectrum) -MaxCharge=5 - -# Number of matches per spectrum to be reported -# If this value is greater than 1, the FDR values computed by MS-GF+ will be skewed by high-scoring 2nd and 3rd hits -NumMatchesPerSpec=1 - -# Mass of charge carrier -# Default: mass of proton -#ChargeCarrierMass=1.00727649 - -# Maximum missed cleavages -# Exclude peptides with more than this number of missed cleavages from the search, Default: -1 (no limit) -#MaxMissedCleavages=-1 - -# Minimum number of ions a spectrum must have to be examined -#MinNumPeaksPerSpectrum=10 - -# Number of isoforms to consider per peptide -# Default: 128 -#NumIsoforms=128 - -# Include additional features in the output (enable this to post-process results with Percolator) -#AddFeatures=1 - -# Amino Acid Modification Examples -# Specify static modifications using one or more StaticMod= entries -# Specify dynamic modifications using one or more DynamicMod= entries -# Modification format is: -# Mass or CompositionString, Residues, ModType, Position, Name (all five fields are required). -# CompositionString can only contain a limited set of elements, primarily C H N O S or P -# -# Examples: -# C2H3N1O1, C, fix, any, Carbamidomethyl # Fixed Carbamidomethyl C (alkylation) -# O1, M, opt, any, Oxidation # Oxidation M -# 15.994915, M, opt, any, Oxidation # Oxidation M (mass is used instead of CompositionString) -# H-1N-1O1, NQ, opt, any, Deamidated # Negative numbers are allowed. -# CH2, K, opt, any, Methyl # Methylation K -# C2H2O1, K, opt, any, Acetyl # Acetylation K -# HO3P, STY,opt, any, Phospho # Phosphorylation STY -# C2H3NO, *, opt, N-term, Carbamidomethyl # Variable Carbamidomethyl N-term -# H-2O-1, E, opt, N-term, Glu->pyro-Glu # Pyro-glu from E -# H-3N-1, Q, opt, N-term, Gln->pyro-Glu # Pyro-glu from Q -# C2H2O, *, opt, Prot-N-term, Acetyl # Acetylation Protein N-term diff --git a/docs/parameterfiles/MSGFPlus_PartTryp_Stat_CysAlk_TMT_6Plex_20ppmParTol.txt b/docs/parameterfiles/MSGFPlus_PartTryp_Stat_CysAlk_TMT_6Plex_20ppmParTol.txt deleted file mode 100644 index e92b0217..00000000 --- a/docs/parameterfiles/MSGFPlus_PartTryp_Stat_CysAlk_TMT_6Plex_20ppmParTol.txt +++ /dev/null @@ -1,116 +0,0 @@ -# Precursor mass tolerance -# Examples: 2.5Da or 30ppm -# Use comma to set asymmetric values, for example "0.5Da,2.5Da" will set 0.5Da to the left (expMasstheoMass) -PrecursorMassTolerance=20ppm - -# Max Number of Dynamic (Variable) Modifications per peptide -# If this value is large, the search will be slow -NumMods=3 - -# Modifications (see below for examples) -StaticMod=229.1629, *, fix, N-term, TMT6plex -StaticMod=229.1629, K, fix, any, TMT6plex -StaticMod=C2H3N1O1, C, fix, any, Carbamidomethyl # Fixed Carbamidomethyl C (alkylation, +57.0215) - -DynamicMod=none - -# Fragmentation Method -# 0 means as written in the spectrum or CID if no info (Default) -# 1 means CID -# 2 means ETD -# 3 means HCD -# 4 means UVPD -FragmentationMethodID=0 - -# Instrument ID -# 0 means Low-res LCQ/LTQ (Default for CID and ETD); use InstrumentID=0 if analyzing a dataset with low-res CID and high-res HCD spectra, or with only low-res HCD spectra -# 1 means High-res LTQ (Default for high res HCD; also appropriate for high res CID); use InstrumentID=1 for Orbitrap and Lumos instruments with high res MS2 spectra -# 2 means TOF -# 3 means Q-Exactive; use InstrumentID=3 for Q Exactive and QEHFX instruments -InstrumentID=1 - -# Enzyme ID -# 0 means unspecific cleavage (cleave after any residue) -# 1 means Trypsin (Default); optionally use this along with NTT=0 for a no-enzyme-specificity search of a tryptically digested sample -# 2: Chymotrypsin, 3: Lys-C, 4: Lys-N, 5: Glu-C, 6: Arg-C, 7: Asp-N, 8: alphaLP, 9: No Cleavage (for peptidomics), 10: TrypPlusC (cleave after K, R, or C) -EnzymeID=1 - -# Isotope error range -# Takes into account the error introduced by not choosing the monoisotopic peak for fragmentation. -# Useful for accurate precursor ion masses. -# Ignored if the parent mass tolerance is > 0.5Da or 500ppm. -# The combination of -t and -ti determines the precursor mass tolerance. -# e.g. "-t 20ppm -ti -1,2" tests abs(observed - theoretical - n * 1.00335Da) < 20ppm for n=-1, 0, 1, 2 -IsotopeErrorRange=-1,2 - -# Number of tolerable termini -# The number of peptide termini that must have been cleaved by the enzyme (default 1) -# For trypsin, 2 means fully tryptic only, 1 means partially tryptic, and 0 means no-enzyme search -NTT=1 - -# Control N-terminal methionine cleavage -# 0 means to consider protein N-term Met cleavage (Default) -# 1 means to ignore protein N-term Met cleavage -IgnoreMetCleavage=0 - -# Target/Decoy search mode -# 0 means don't search decoy database (default) -# 1 means search decoy database to compute FDR (source FASTA file must be forward-only proteins) -TDA=1 - -# Number of Threads (by default, uses all available cores) -NumThreads=All - -# Minimum peptide length to consider -MinPepLength=6 - -# Maximum peptide length to consider -MaxPepLength=50 - -# Minimum precursor charge to consider (if not specified in the spectrum) -MinCharge=2 - -# Maximum precursor charge to consider (if not specified in the spectrum) -MaxCharge=5 - -# Number of matches per spectrum to be reported -# If this value is greater than 1, the FDR values computed by MS-GF+ will be skewed by high-scoring 2nd and 3rd hits -NumMatchesPerSpec=1 - -# Mass of charge carrier -# Default: mass of proton -#ChargeCarrierMass=1.00727649 - -# Maximum missed cleavages -# Exclude peptides with more than this number of missed cleavages from the search, Default: -1 (no limit) -#MaxMissedCleavages=-1 - -# Minimum number of ions a spectrum must have to be examined -#MinNumPeaksPerSpectrum=10 - -# Number of isoforms to consider per peptide -# Default: 128 -#NumIsoforms=128 - -# Include additional features in the output (enable this to post-process results with Percolator) -#AddFeatures=1 - -# Amino Acid Modification Examples -# Specify static modifications using one or more StaticMod= entries -# Specify dynamic modifications using one or more DynamicMod= entries -# Modification format is: -# Mass or CompositionString, Residues, ModType, Position, Name (all five fields are required). -# CompositionString can only contain a limited set of elements, primarily C H N O S or P -# -# Examples: -# C2H3N1O1, C, fix, any, Carbamidomethyl # Fixed Carbamidomethyl C (alkylation) -# O1, M, opt, any, Oxidation # Oxidation M -# 15.994915, M, opt, any, Oxidation # Oxidation M (mass is used instead of CompositionString) -# H-1N-1O1, NQ, opt, any, Deamidated # Negative numbers are allowed. -# CH2, K, opt, any, Methyl # Methylation K -# C2H2O1, K, opt, any, Acetyl # Acetylation K -# HO3P, STY,opt, any, Phospho # Phosphorylation STY -# C2H3NO, *, opt, N-term, Carbamidomethyl # Variable Carbamidomethyl N-term -# H-2O-1, E, opt, N-term, Glu->pyro-Glu # Pyro-glu from E -# H-3N-1, Q, opt, N-term, Gln->pyro-Glu # Pyro-glu from Q -# C2H2O, *, opt, Prot-N-term, Acetyl # Acetylation Protein N-term diff --git a/docs/parameterfiles/MSGFPlus_Tryp_DynMetOx_Stat_CysAlk_TMT_6Plex_20ppmParTol.txt b/docs/parameterfiles/MSGFPlus_Tryp_DynMetOx_Stat_CysAlk_TMT_6Plex_20ppmParTol.txt deleted file mode 100644 index fb506b44..00000000 --- a/docs/parameterfiles/MSGFPlus_Tryp_DynMetOx_Stat_CysAlk_TMT_6Plex_20ppmParTol.txt +++ /dev/null @@ -1,98 +0,0 @@ -# Precursor mass tolerance -# Examples: 2.5Da or 30ppm -# Use comma to set asymmetric values, for example "0.5Da,2.5Da" will set 0.5Da to the left (expMasstheoMass) -PrecursorMassTolerance=20ppm - -# Max Number of Dynamic (Variable) Modifications per peptide -# If this value is large, the search will be slow -NumMods=3 - -# Modifications (see below for examples) -StaticMod=229.1629, *, fix, N-term, TMT6plex -StaticMod=229.1629, K, fix, any, TMT6plex -StaticMod=C2H3N1O1, C, fix, any, Carbamidomethyl # Fixed Carbamidomethyl C (alkylation, +57.0215) - -DynamicMod=O1, M, opt, any, Oxidation # Oxidized methionine - -# Fragmentation Method -# 0 means as written in the spectrum or CID if no info (Default) -# 1 means CID -# 2 means ETD -# 3 means HCD -# 4 means UVPD -FragmentationMethodID=0 - -# Instrument ID -# 0 means Low-res LCQ/LTQ (Default for CID and ETD); use InstrumentID=0 if analyzing a dataset with low-res CID and high-res HCD spectra, or with only low-res HCD spectra -# 1 means High-res LTQ (Default for high res HCD; also appropriate for high res CID); use InstrumentID=1 for Orbitrap and Lumos instruments with high res MS2 spectra -# 2 means TOF -# 3 means Q-Exactive; use InstrumentID=3 for Q Exactive and QEHFX instruments -InstrumentID=1 - -# Enzyme ID -# 0 means unspecific cleavage (cleave after any residue) -# 1 means Trypsin (Default); optionally use this along with NTT=0 for a no-enzyme-specificity search of a tryptically digested sample -# 2: Chymotrypsin, 3: Lys-C, 4: Lys-N, 5: Glu-C, 6: Arg-C, 7: Asp-N, 8: alphaLP, 9: No Cleavage (for peptidomics), 10: TrypPlusC (cleave after K, R, or C) -EnzymeID=1 - -# Isotope error range -# Takes into account the error introduced by not choosing the monoisotopic peak for fragmentation. -# Useful for accurate precursor ion masses. -# Ignored if the parent mass tolerance is > 0.5Da or 500ppm. -# The combination of -t and -ti determines the precursor mass tolerance. -# e.g. "-t 20ppm -ti -1,2" tests abs(observed - theoretical - n * 1.00335Da) < 20ppm for n=-1, 0, 1, 2 -IsotopeErrorRange=-1,2 - -# Number of tolerable termini -# The number of peptide termini that must have been cleaved by the enzyme (default 1) -# For trypsin, 2 means fully tryptic only, 1 means partially tryptic, and 0 means no-enzyme search -NTT=2 - -# Control N-terminal methionine cleavage -# 0 means to consider protein N-term Met cleavage (Default) -# 1 means to ignore protein N-term Met cleavage -IgnoreMetCleavage=0 - -# Target/Decoy search mode -# 0 means don't search decoy database (default) -# 1 means search decoy database to compute FDR (source FASTA file must be forward-only proteins) -TDA=1 - -# Number of Threads (by default, uses all available cores) -NumThreads=All - -# Minimum peptide length to consider -MinPepLength=6 - -# Maximum peptide length to consider -MaxPepLength=50 - -# Minimum precursor charge to consider (if not specified in the spectrum) -MinCharge=2 - -# Maximum precursor charge to consider (if not specified in the spectrum) -MaxCharge=5 - -# Number of matches per spectrum to be reported -# If this value is greater than 1, the FDR values computed by MS-GF+ will be skewed by high-scoring 2nd and 3rd hits -NumMatchesPerSpec=1 - -# Amino Acid Modification Examples -# Specify static modifications using one or more StaticMod= entries -# Specify dynamic modifications using one or more DynamicMod= entries -# Modification format is: -# Mass or CompositionString, Residues, ModType, Position, Name (all five fields are required). -# CompositionString can only contain a limited set of elements, primarily C H N O S or P -# -# Examples: -# C2H3N1O1, C, fix, any, Carbamidomethyl # Fixed Carbamidomethyl C (alkylation) -# O1, M, opt, any, Oxidation # Oxidation M -# 15.994915, M, opt, any, Oxidation # Oxidation M (mass is used instead of CompositionString) -# H-1N-1O1, NQ, opt, any, Deamidated # Negative numbers are allowed. -# CH2, K, opt, any, Methyl # Methylation K -# C2H2O1, K, opt, any, Acetyl # Acetylation K -# HO3P, STY,opt, any, Phospho # Phosphorylation STY -# C2H3NO, *, opt, N-term, Carbamidomethyl # Variable Carbamidomethyl N-term -# H-2O-1, E, opt, N-term, Glu->pyro-Glu # Pyro-glu from E -# H-3N-1, Q, opt, N-term, Gln->pyro-Glu # Pyro-glu from Q -# C2H2O, *, opt, Prot-N-term, Acetyl # Acetylation Protein N-term diff --git a/docs/parameterfiles/MSGFPlus_Tryp_DynSTYPhos_Stat_CysAlk_TMT_6Plex_Protocol1_20ppmParTol.txt b/docs/parameterfiles/MSGFPlus_Tryp_DynSTYPhos_Stat_CysAlk_TMT_6Plex_Protocol1_20ppmParTol.txt deleted file mode 100644 index b85a4ca5..00000000 --- a/docs/parameterfiles/MSGFPlus_Tryp_DynSTYPhos_Stat_CysAlk_TMT_6Plex_Protocol1_20ppmParTol.txt +++ /dev/null @@ -1,124 +0,0 @@ -# Precursor mass tolerance -# Examples: 2.5Da or 30ppm -# Use comma to set asymmetric values, for example "0.5Da,2.5Da" will set 0.5Da to the left (expMasstheoMass) -PrecursorMassTolerance=20ppm - -# Max Number of Dynamic (Variable) Modifications per peptide -# If this value is large, the search will be slow -NumMods=3 - -# Modifications (see below for examples) -StaticMod=229.1629, *, fix, N-term, TMT6plex -StaticMod=229.1629, K, fix, any, TMT6plex -StaticMod=C2H3N1O1, C, fix, any, Carbamidomethyl # Fixed Carbamidomethyl C (alkylation, +57.0215) - -DynamicMod=HO3P, STY, opt, any, Phospho # Phosphorylation STY - -# Fragmentation Method -# 0 means as written in the spectrum or CID if no info (Default) -# 1 means CID -# 2 means ETD -# 3 means HCD -# 4 means UVPD -FragmentationMethodID=0 - -# Instrument ID -# 0 means Low-res LCQ/LTQ (Default for CID and ETD); use InstrumentID=0 if analyzing a dataset with low-res CID and high-res HCD spectra, or with only low-res HCD spectra -# 1 means High-res LTQ (Default for high res HCD; also appropriate for high res CID); use InstrumentID=1 for Orbitrap and Lumos instruments with high res MS2 spectra -# 2 means TOF -# 3 means Q-Exactive; use InstrumentID=3 for Q Exactive and QEHFX instruments -InstrumentID=1 - -# Enzyme ID -# 0 means unspecific cleavage (cleave after any residue) -# 1 means Trypsin (Default); optionally use this along with NTT=0 for a no-enzyme-specificity search of a tryptically digested sample -# 2: Chymotrypsin, 3: Lys-C, 4: Lys-N, 5: Glu-C, 6: Arg-C, 7: Asp-N, 8: alphaLP, 9: No Cleavage (for peptidomics), 10: TrypPlusC (cleave after K, R, or C) -EnzymeID=1 - -# Isotope error range -# Takes into account the error introduced by not choosing the monoisotopic peak for fragmentation. -# Useful for accurate precursor ion masses. -# Ignored if the parent mass tolerance is > 0.5Da or 500ppm. -# The combination of -t and -ti determines the precursor mass tolerance. -# e.g. "-t 20ppm -ti -1,2" tests abs(observed - theoretical - n * 1.00335Da) < 20ppm for n=-1, 0, 1, 2 -IsotopeErrorRange=-1,2 - -# Number of tolerable termini -# The number of peptide termini that must have been cleaved by the enzyme (default 1) -# For trypsin, 2 means fully tryptic only, 1 means partially tryptic, and 0 means no-enzyme search -NTT=2 - -# Control N-terminal methionine cleavage -# 0 means to consider protein N-term Met cleavage (Default) -# 1 means to ignore protein N-term Met cleavage -IgnoreMetCleavage=0 - -# Target/Decoy search mode -# 0 means don't search decoy database (default) -# 1 means search decoy database to compute FDR (source FASTA file must be forward-only proteins) -TDA=1 - -# Number of Threads (by default, uses all available cores) -NumThreads=All - -# Minimum peptide length to consider -MinPepLength=6 - -# Maximum peptide length to consider -MaxPepLength=50 - -# Minimum precursor charge to consider (if not specified in the spectrum) -MinCharge=2 - -# Maximum precursor charge to consider (if not specified in the spectrum) -MaxCharge=5 - -# Number of matches per spectrum to be reported -# If this value is greater than 1, the FDR values computed by MS-GF+ will be skewed by high-scoring 2nd and 3rd hits -NumMatchesPerSpec=1 - -# Scoring protocol to use; options are: -# 0=NoProtocol (Default) -# 1=Phosphorylation -# 2=iTRAQ -# 3=iTRAQPhospho -# MS-GF+ will auto-select the protocol based on the dynamic and static mods in place, so this generally does not need to be defined -Protocol=1 - -# Mass of charge carrier -# Default: mass of proton -#ChargeCarrierMass=1.00727649 - -# Maximum missed cleavages -# Exclude peptides with more than this number of missed cleavages from the search, Default: -1 (no limit) -#MaxMissedCleavages=-1 - -# Minimum number of ions a spectrum must have to be examined -#MinNumPeaksPerSpectrum=10 - -# Number of isoforms to consider per peptide -# Default: 128 -#NumIsoforms=128 - -# Include additional features in the output (enable this to post-process results with Percolator) -#AddFeatures=1 - -# Amino Acid Modification Examples -# Specify static modifications using one or more StaticMod= entries -# Specify dynamic modifications using one or more DynamicMod= entries -# Modification format is: -# Mass or CompositionString, Residues, ModType, Position, Name (all five fields are required). -# CompositionString can only contain a limited set of elements, primarily C H N O S or P -# -# Examples: -# C2H3N1O1, C, fix, any, Carbamidomethyl # Fixed Carbamidomethyl C (alkylation) -# O1, M, opt, any, Oxidation # Oxidation M -# 15.994915, M, opt, any, Oxidation # Oxidation M (mass is used instead of CompositionString) -# H-1N-1O1, NQ, opt, any, Deamidated # Negative numbers are allowed. -# CH2, K, opt, any, Methyl # Methylation K -# C2H2O1, K, opt, any, Acetyl # Acetylation K -# HO3P, STY,opt, any, Phospho # Phosphorylation STY -# C2H3NO, *, opt, N-term, Carbamidomethyl # Variable Carbamidomethyl N-term -# H-2O-1, E, opt, N-term, Glu->pyro-Glu # Pyro-glu from E -# H-3N-1, Q, opt, N-term, Gln->pyro-Glu # Pyro-glu from Q -# C2H2O, *, opt, Prot-N-term, Acetyl # Acetylation Protein N-term diff --git a/docs/parameterfiles/MSGFPlus_Tryp_Dyn_MetOx_STYPhos_Stat_CysAlk_20ppmParTol.txt b/docs/parameterfiles/MSGFPlus_Tryp_Dyn_MetOx_STYPhos_Stat_CysAlk_20ppmParTol.txt deleted file mode 100644 index 33c9e8ee..00000000 --- a/docs/parameterfiles/MSGFPlus_Tryp_Dyn_MetOx_STYPhos_Stat_CysAlk_20ppmParTol.txt +++ /dev/null @@ -1,115 +0,0 @@ -# Precursor mass tolerance -# Examples: 2.5Da or 30ppm -# Use comma to set asymmetric values, for example "0.5Da,2.5Da" will set 0.5Da to the left (expMasstheoMass) -PrecursorMassTolerance=20ppm - -# Max Number of Dynamic (Variable) Modifications per peptide -# If this value is large, the search will be slow -NumMods=3 - -# Modifications (see below for examples) -StaticMod=C2H3N1O1, C, fix, any, Carbamidomethyl # Fixed Carbamidomethyl C (alkylation) - -DynamicMod=O1, M, opt, any, Oxidation # Oxidized methionine -DynamicMod=HO3P, STY, opt, any, Phospho # Phosphorylation STY - -# Fragmentation Method -# 0 means as written in the spectrum or CID if no info (Default) -# 1 means CID -# 2 means ETD -# 3 means HCD -# 4 means UVPD -FragmentationMethodID=0 - -# Instrument ID -# 0 means Low-res LCQ/LTQ (Default for CID and ETD); use InstrumentID=0 if analyzing a dataset with low-res CID and high-res HCD spectra, or with only low-res HCD spectra -# 1 means High-res LTQ (Default for high res HCD; also appropriate for high res CID); use InstrumentID=1 for Orbitrap and Lumos instruments with high res MS2 spectra -# 2 means TOF -# 3 means Q-Exactive; use InstrumentID=3 for Q Exactive and QEHFX instruments -InstrumentID=1 - -# Enzyme ID -# 0 means unspecific cleavage (cleave after any residue) -# 1 means Trypsin (Default); optionally use this along with NTT=0 for a no-enzyme-specificity search of a tryptically digested sample -# 2: Chymotrypsin, 3: Lys-C, 4: Lys-N, 5: Glu-C, 6: Arg-C, 7: Asp-N, 8: alphaLP, 9: No Cleavage (for peptidomics), 10: TrypPlusC (cleave after K, R, or C) -EnzymeID=1 - -# Isotope error range -# Takes into account the error introduced by not choosing the monoisotopic peak for fragmentation. -# Useful for accurate precursor ion masses. -# Ignored if the parent mass tolerance is > 0.5Da or 500ppm. -# The combination of -t and -ti determines the precursor mass tolerance. -# e.g. "-t 20ppm -ti -1,2" tests abs(observed - theoretical - n * 1.00335Da) < 20ppm for n=-1, 0, 1, 2 -IsotopeErrorRange=-1,2 - -# Number of tolerable termini -# The number of peptide termini that must have been cleaved by the enzyme (default 1) -# For trypsin, 2 means fully tryptic only, 1 means partially tryptic, and 0 means no-enzyme search -NTT=2 - -# Control N-terminal methionine cleavage -# 0 means to consider protein N-term Met cleavage (Default) -# 1 means to ignore protein N-term Met cleavage -IgnoreMetCleavage=0 - -# Target/Decoy search mode -# 0 means don't search decoy database (default) -# 1 means search decoy database to compute FDR (source FASTA file must be forward-only proteins) -TDA=1 - -# Number of Threads (by default, uses all available cores) -NumThreads=All - -# Minimum peptide length to consider -MinPepLength=6 - -# Maximum peptide length to consider -MaxPepLength=50 - -# Minimum precursor charge to consider (if not specified in the spectrum) -MinCharge=2 - -# Maximum precursor charge to consider (if not specified in the spectrum) -MaxCharge=5 - -# Number of matches per spectrum to be reported -# If this value is greater than 1, the FDR values computed by MS-GF+ will be skewed by high-scoring 2nd and 3rd hits -NumMatchesPerSpec=1 - -# Mass of charge carrier -# Default: mass of proton -#ChargeCarrierMass=1.00727649 - -# Maximum missed cleavages -# Exclude peptides with more than this number of missed cleavages from the search, Default: -1 (no limit) -#MaxMissedCleavages=-1 - -# Minimum number of ions a spectrum must have to be examined -#MinNumPeaksPerSpectrum=10 - -# Number of isoforms to consider per peptide -# Default: 128 -#NumIsoforms=128 - -# Include additional features in the output (enable this to post-process results with Percolator) -#AddFeatures=1 - -# Amino Acid Modification Examples -# Specify static modifications using one or more StaticMod= entries -# Specify dynamic modifications using one or more DynamicMod= entries -# Modification format is: -# Mass or CompositionString, Residues, ModType, Position, Name (all five fields are required). -# CompositionString can only contain a limited set of elements, primarily C H N O S or P -# -# Examples: -# C2H3N1O1, C, fix, any, Carbamidomethyl # Fixed Carbamidomethyl C (alkylation) -# O1, M, opt, any, Oxidation # Oxidation M -# 15.994915, M, opt, any, Oxidation # Oxidation M (mass is used instead of CompositionString) -# H-1N-1O1, NQ, opt, any, Deamidated # Negative numbers are allowed. -# CH2, K, opt, any, Methyl # Methylation K -# C2H2O1, K, opt, any, Acetyl # Acetylation K -# HO3P, STY,opt, any, Phospho # Phosphorylation STY -# C2H3NO, *, opt, N-term, Carbamidomethyl # Variable Carbamidomethyl N-term -# H-2O-1, E, opt, N-term, Glu->pyro-Glu # Pyro-glu from E -# H-3N-1, Q, opt, N-term, Gln->pyro-Glu # Pyro-glu from Q -# C2H2O, *, opt, Prot-N-term, Acetyl # Acetylation Protein N-term diff --git a/docs/parameterfiles/MSGFPlus_Tryp_MetOx_15ppmParTol.txt b/docs/parameterfiles/MSGFPlus_Tryp_MetOx_15ppmParTol.txt deleted file mode 100644 index 74e4b66b..00000000 --- a/docs/parameterfiles/MSGFPlus_Tryp_MetOx_15ppmParTol.txt +++ /dev/null @@ -1,114 +0,0 @@ -# Precursor mass tolerance -# Examples: 2.5Da or 30ppm -# Use comma to set asymmetric values, for example "0.5Da,2.5Da" will set 0.5Da to the left (expMasstheoMass) -PrecursorMassTolerance=15ppm - -# Max Number of Dynamic (Variable) Modifications per peptide -# If this value is large, the search will be slow -NumMods=3 - -# Modifications (see below for examples) -StaticMod=None - -DynamicMod=O1, M, opt, any, Oxidation # Oxidized methionine - -# Fragmentation Method -# 0 means as written in the spectrum or CID if no info (Default) -# 1 means CID -# 2 means ETD -# 3 means HCD -# 4 means UVPD -FragmentationMethodID=0 - -# Instrument ID -# 0 means Low-res LCQ/LTQ (Default for CID and ETD); use InstrumentID=0 if analyzing a dataset with low-res CID and high-res HCD spectra, or with only low-res HCD spectra -# 1 means High-res LTQ (Default for high res HCD; also appropriate for high res CID); use InstrumentID=1 for Orbitrap and Lumos instruments with high res MS2 spectra -# 2 means TOF -# 3 means Q-Exactive; use InstrumentID=3 for Q Exactive and QEHFX instruments -InstrumentID=1 - -# Enzyme ID -# 0 means unspecific cleavage (cleave after any residue) -# 1 means Trypsin (Default); optionally use this along with NTT=0 for a no-enzyme-specificity search of a tryptically digested sample -# 2: Chymotrypsin, 3: Lys-C, 4: Lys-N, 5: Glu-C, 6: Arg-C, 7: Asp-N, 8: alphaLP, 9: No Cleavage (for peptidomics), 10: TrypPlusC (cleave after K, R, or C) -EnzymeID=1 - -# Isotope error range -# Takes into account the error introduced by not choosing the monoisotopic peak for fragmentation. -# Useful for accurate precursor ion masses. -# Ignored if the parent mass tolerance is > 0.5Da or 500ppm. -# The combination of -t and -ti determines the precursor mass tolerance. -# e.g. "-t 20ppm -ti -1,2" tests abs(observed - theoretical - n * 1.00335Da) < 20ppm for n=-1, 0, 1, 2 -IsotopeErrorRange=-1,1 - -# Number of tolerable termini -# The number of peptide termini that must have been cleaved by the enzyme (default 1) -# For trypsin, 2 means fully tryptic only, 1 means partially tryptic, and 0 means no-enzyme search -NTT=2 - -# Control N-terminal methionine cleavage -# 0 means to consider protein N-term Met cleavage (Default) -# 1 means to ignore protein N-term Met cleavage -IgnoreMetCleavage=0 - -# Target/Decoy search mode -# 0 means don't search decoy database (default) -# 1 means search decoy database to compute FDR (source FASTA file must be forward-only proteins) -TDA=1 - -# Number of Threads (by default, uses all available cores) -NumThreads=All - -# Minimum peptide length to consider -MinPepLength=6 - -# Maximum peptide length to consider -MaxPepLength=50 - -# Minimum precursor charge to consider (if not specified in the spectrum) -MinCharge=2 - -# Maximum precursor charge to consider (if not specified in the spectrum) -MaxCharge=5 - -# Number of matches per spectrum to be reported -# If this value is greater than 1, the FDR values computed by MS-GF+ will be skewed by high-scoring 2nd and 3rd hits -NumMatchesPerSpec=1 - -# Mass of charge carrier -# Default: mass of proton -#ChargeCarrierMass=1.00727649 - -# Maximum missed cleavages -# Exclude peptides with more than this number of missed cleavages from the search, Default: -1 (no limit) -#MaxMissedCleavages=-1 - -# Minimum number of ions a spectrum must have to be examined -#MinNumPeaksPerSpectrum=10 - -# Number of isoforms to consider per peptide -# Default: 128 -#NumIsoforms=128 - -# Include additional features in the output (enable this to post-process results with Percolator) -#AddFeatures=1 - -# Amino Acid Modification Examples -# Specify static modifications using one or more StaticMod= entries -# Specify dynamic modifications using one or more DynamicMod= entries -# Modification format is: -# Mass or CompositionString, Residues, ModType, Position, Name (all five fields are required). -# CompositionString can only contain a limited set of elements, primarily C H N O S or P -# -# Examples: -# C2H3N1O1, C, fix, any, Carbamidomethyl # Fixed Carbamidomethyl C (alkylation) -# O1, M, opt, any, Oxidation # Oxidation M -# 15.994915, M, opt, any, Oxidation # Oxidation M (mass is used instead of CompositionString) -# H-1N-1O1, NQ, opt, any, Deamidated # Negative numbers are allowed. -# CH2, K, opt, any, Methyl # Methylation K -# C2H2O1, K, opt, any, Acetyl # Acetylation K -# HO3P, STY,opt, any, Phospho # Phosphorylation STY -# C2H3NO, *, opt, N-term, Carbamidomethyl # Variable Carbamidomethyl N-term -# H-2O-1, E, opt, N-term, Glu->pyro-Glu # Pyro-glu from E -# H-3N-1, Q, opt, N-term, Gln->pyro-Glu # Pyro-glu from Q -# C2H2O, *, opt, Prot-N-term, Acetyl # Acetylation Protein N-term diff --git a/docs/parameterfiles/MSGFPlus_Tryp_MetOx_20ppmParTol.txt b/docs/parameterfiles/MSGFPlus_Tryp_MetOx_20ppmParTol.txt deleted file mode 100644 index 24659407..00000000 --- a/docs/parameterfiles/MSGFPlus_Tryp_MetOx_20ppmParTol.txt +++ /dev/null @@ -1,114 +0,0 @@ -# Precursor mass tolerance -# Examples: 2.5Da or 30ppm -# Use comma to set asymmetric values, for example "0.5Da,2.5Da" will set 0.5Da to the left (expMasstheoMass) -PrecursorMassTolerance=20ppm - -# Max Number of Dynamic (Variable) Modifications per peptide -# If this value is large, the search will be slow -NumMods=3 - -# Modifications (see below for examples) -StaticMod=None - -DynamicMod=O1, M, opt, any, Oxidation # Oxidized methionine - -# Fragmentation Method -# 0 means as written in the spectrum or CID if no info (Default) -# 1 means CID -# 2 means ETD -# 3 means HCD -# 4 means UVPD -FragmentationMethodID=0 - -# Instrument ID -# 0 means Low-res LCQ/LTQ (Default for CID and ETD); use InstrumentID=0 if analyzing a dataset with low-res CID and high-res HCD spectra, or with only low-res HCD spectra -# 1 means High-res LTQ (Default for high res HCD; also appropriate for high res CID); use InstrumentID=1 for Orbitrap and Lumos instruments with high res MS2 spectra -# 2 means TOF -# 3 means Q-Exactive; use InstrumentID=3 for Q Exactive and QEHFX instruments -InstrumentID=0 - -# Enzyme ID -# 0 means unspecific cleavage (cleave after any residue) -# 1 means Trypsin (Default); optionally use this along with NTT=0 for a no-enzyme-specificity search of a tryptically digested sample -# 2: Chymotrypsin, 3: Lys-C, 4: Lys-N, 5: Glu-C, 6: Arg-C, 7: Asp-N, 8: alphaLP, 9: No Cleavage (for peptidomics), 10: TrypPlusC (cleave after K, R, or C) -EnzymeID=1 - -# Isotope error range -# Takes into account the error introduced by not choosing the monoisotopic peak for fragmentation. -# Useful for accurate precursor ion masses. -# Ignored if the parent mass tolerance is > 0.5Da or 500ppm. -# The combination of -t and -ti determines the precursor mass tolerance. -# e.g. "-t 20ppm -ti -1,2" tests abs(observed - theoretical - n * 1.00335Da) < 20ppm for n=-1, 0, 1, 2 -IsotopeErrorRange=-1,2 - -# Number of tolerable termini -# The number of peptide termini that must have been cleaved by the enzyme (default 1) -# For trypsin, 2 means fully tryptic only, 1 means partially tryptic, and 0 means no-enzyme search -NTT=2 - -# Control N-terminal methionine cleavage -# 0 means to consider protein N-term Met cleavage (Default) -# 1 means to ignore protein N-term Met cleavage -IgnoreMetCleavage=0 - -# Target/Decoy search mode -# 0 means don't search decoy database (default) -# 1 means search decoy database to compute FDR (source FASTA file must be forward-only proteins) -TDA=1 - -# Number of Threads (by default, uses all available cores) -NumThreads=All - -# Minimum peptide length to consider -MinPepLength=6 - -# Maximum peptide length to consider -MaxPepLength=50 - -# Minimum precursor charge to consider (if not specified in the spectrum) -MinCharge=2 - -# Maximum precursor charge to consider (if not specified in the spectrum) -MaxCharge=5 - -# Number of matches per spectrum to be reported -# If this value is greater than 1, the FDR values computed by MS-GF+ will be skewed by high-scoring 2nd and 3rd hits -NumMatchesPerSpec=1 - -# Mass of charge carrier -# Default: mass of proton -#ChargeCarrierMass=1.00727649 - -# Maximum missed cleavages -# Exclude peptides with more than this number of missed cleavages from the search, Default: -1 (no limit) -#MaxMissedCleavages=-1 - -# Minimum number of ions a spectrum must have to be examined -#MinNumPeaksPerSpectrum=10 - -# Number of isoforms to consider per peptide -# Default: 128 -#NumIsoforms=128 - -# Include additional features in the output (enable this to post-process results with Percolator) -#AddFeatures=1 - -# Amino Acid Modification Examples -# Specify static modifications using one or more StaticMod= entries -# Specify dynamic modifications using one or more DynamicMod= entries -# Modification format is: -# Mass or CompositionString, Residues, ModType, Position, Name (all five fields are required). -# CompositionString can only contain a limited set of elements, primarily C H N O S or P -# -# Examples: -# C2H3N1O1, C, fix, any, Carbamidomethyl # Fixed Carbamidomethyl C (alkylation) -# O1, M, opt, any, Oxidation # Oxidation M -# 15.994915, M, opt, any, Oxidation # Oxidation M (mass is used instead of CompositionString) -# H-1N-1O1, NQ, opt, any, Deamidated # Negative numbers are allowed. -# CH2, K, opt, any, Methyl # Methylation K -# C2H2O1, K, opt, any, Acetyl # Acetylation K -# HO3P, STY,opt, any, Phospho # Phosphorylation STY -# C2H3NO, *, opt, N-term, Carbamidomethyl # Variable Carbamidomethyl N-term -# H-2O-1, E, opt, N-term, Glu->pyro-Glu # Pyro-glu from E -# H-3N-1, Q, opt, N-term, Gln->pyro-Glu # Pyro-glu from Q -# C2H2O, *, opt, Prot-N-term, Acetyl # Acetylation Protein N-term diff --git a/docs/parameterfiles/MSGFPlus_Tryp_MetOx_StatCysAlk_20ppmParTol.txt b/docs/parameterfiles/MSGFPlus_Tryp_MetOx_StatCysAlk_20ppmParTol.txt deleted file mode 100644 index 2862ebec..00000000 --- a/docs/parameterfiles/MSGFPlus_Tryp_MetOx_StatCysAlk_20ppmParTol.txt +++ /dev/null @@ -1,114 +0,0 @@ -# Precursor mass tolerance -# Examples: 2.5Da or 30ppm -# Use comma to set asymmetric values, for example "0.5Da,2.5Da" will set 0.5Da to the left (expMasstheoMass) -PrecursorMassTolerance=20ppm - -# Max Number of Dynamic (Variable) Modifications per peptide -# If this value is large, the search will be slow -NumMods=3 - -# Modifications (see below for examples) -StaticMod=C2H3N1O1, C, fix, any, Carbamidomethyl # Fixed Carbamidomethyl C (alkylation) - -DynamicMod=O1, M, opt, any, Oxidation # Oxidized methionine - -# Fragmentation Method -# 0 means as written in the spectrum or CID if no info (Default) -# 1 means CID -# 2 means ETD -# 3 means HCD -# 4 means UVPD -FragmentationMethodID=0 - -# Instrument ID -# 0 means Low-res LCQ/LTQ (Default for CID and ETD); use InstrumentID=0 if analyzing a dataset with low-res CID and high-res HCD spectra, or with only low-res HCD spectra -# 1 means High-res LTQ (Default for high res HCD; also appropriate for high res CID); use InstrumentID=1 for Orbitrap and Lumos instruments with high res MS2 spectra -# 2 means TOF -# 3 means Q-Exactive; use InstrumentID=3 for Q Exactive and QEHFX instruments -InstrumentID=1 - -# Enzyme ID -# 0 means unspecific cleavage (cleave after any residue) -# 1 means Trypsin (Default); optionally use this along with NTT=0 for a no-enzyme-specificity search of a tryptically digested sample -# 2: Chymotrypsin, 3: Lys-C, 4: Lys-N, 5: Glu-C, 6: Arg-C, 7: Asp-N, 8: alphaLP, 9: No Cleavage (for peptidomics), 10: TrypPlusC (cleave after K, R, or C) -EnzymeID=1 - -# Isotope error range -# Takes into account the error introduced by not choosing the monoisotopic peak for fragmentation. -# Useful for accurate precursor ion masses. -# Ignored if the parent mass tolerance is > 0.5Da or 500ppm. -# The combination of -t and -ti determines the precursor mass tolerance. -# e.g. "-t 20ppm -ti -1,2" tests abs(observed - theoretical - n * 1.00335Da) < 20ppm for n=-1, 0, 1, 2 -IsotopeErrorRange=-1,1 - -# Number of tolerable termini -# The number of peptide termini that must have been cleaved by the enzyme (default 1) -# For trypsin, 2 means fully tryptic only, 1 means partially tryptic, and 0 means no-enzyme search -NTT=2 - -# Control N-terminal methionine cleavage -# 0 means to consider protein N-term Met cleavage (Default) -# 1 means to ignore protein N-term Met cleavage -IgnoreMetCleavage=0 - -# Target/Decoy search mode -# 0 means don't search decoy database (default) -# 1 means search decoy database to compute FDR (source FASTA file must be forward-only proteins) -TDA=1 - -# Number of Threads (by default, uses all available cores) -NumThreads=All - -# Minimum peptide length to consider -MinPepLength=6 - -# Maximum peptide length to consider -MaxPepLength=50 - -# Minimum precursor charge to consider (if not specified in the spectrum) -MinCharge=2 - -# Maximum precursor charge to consider (if not specified in the spectrum) -MaxCharge=5 - -# Number of matches per spectrum to be reported -# If this value is greater than 1, the FDR values computed by MS-GF+ will be skewed by high-scoring 2nd and 3rd hits -NumMatchesPerSpec=1 - -# Mass of charge carrier -# Default: mass of proton -#ChargeCarrierMass=1.00727649 - -# Maximum missed cleavages -# Exclude peptides with more than this number of missed cleavages from the search, Default: -1 (no limit) -#MaxMissedCleavages=-1 - -# Minimum number of ions a spectrum must have to be examined -#MinNumPeaksPerSpectrum=10 - -# Number of isoforms to consider per peptide -# Default: 128 -#NumIsoforms=128 - -# Include additional features in the output (enable this to post-process results with Percolator) -#AddFeatures=1 - -# Amino Acid Modification Examples -# Specify static modifications using one or more StaticMod= entries -# Specify dynamic modifications using one or more DynamicMod= entries -# Modification format is: -# Mass or CompositionString, Residues, ModType, Position, Name (all five fields are required). -# CompositionString can only contain a limited set of elements, primarily C H N O S or P -# -# Examples: -# C2H3N1O1, C, fix, any, Carbamidomethyl # Fixed Carbamidomethyl C (alkylation) -# O1, M, opt, any, Oxidation # Oxidation M -# 15.994915, M, opt, any, Oxidation # Oxidation M (mass is used instead of CompositionString) -# H-1N-1O1, NQ, opt, any, Deamidated # Negative numbers are allowed. -# CH2, K, opt, any, Methyl # Methylation K -# C2H2O1, K, opt, any, Acetyl # Acetylation K -# HO3P, STY,opt, any, Phospho # Phosphorylation STY -# C2H3NO, *, opt, N-term, Carbamidomethyl # Variable Carbamidomethyl N-term -# H-2O-1, E, opt, N-term, Glu->pyro-Glu # Pyro-glu from E -# H-3N-1, Q, opt, N-term, Gln->pyro-Glu # Pyro-glu from Q -# C2H2O, *, opt, Prot-N-term, Acetyl # Acetylation Protein N-term diff --git a/docs/parameterfiles/MSGFPlus_Tryp_NoMods_20ppmParTol.txt b/docs/parameterfiles/MSGFPlus_Tryp_NoMods_20ppmParTol.txt deleted file mode 100644 index 58c6d970..00000000 --- a/docs/parameterfiles/MSGFPlus_Tryp_NoMods_20ppmParTol.txt +++ /dev/null @@ -1,114 +0,0 @@ -# Precursor mass tolerance -# Examples: 2.5Da or 30ppm -# Use comma to set asymmetric values, for example "0.5Da,2.5Da" will set 0.5Da to the left (expMasstheoMass) -PrecursorMassTolerance=20ppm - -# Max Number of Dynamic (Variable) Modifications per peptide -# If this value is large, the search will be slow -NumMods=3 - -# Modifications (see below for examples) -StaticMod=None - -DynamicMod=None - -# Fragmentation Method -# 0 means as written in the spectrum or CID if no info (Default) -# 1 means CID -# 2 means ETD -# 3 means HCD -# 4 means UVPD -FragmentationMethodID=0 - -# Instrument ID -# 0 means Low-res LCQ/LTQ (Default for CID and ETD); use InstrumentID=0 if analyzing a dataset with low-res CID and high-res HCD spectra, or with only low-res HCD spectra -# 1 means High-res LTQ (Default for high res HCD; also appropriate for high res CID); use InstrumentID=1 for Orbitrap and Lumos instruments with high res MS2 spectra -# 2 means TOF -# 3 means Q-Exactive; use InstrumentID=3 for Q Exactive and QEHFX instruments -InstrumentID=1 - -# Enzyme ID -# 0 means unspecific cleavage (cleave after any residue) -# 1 means Trypsin (Default); optionally use this along with NTT=0 for a no-enzyme-specificity search of a tryptically digested sample -# 2: Chymotrypsin, 3: Lys-C, 4: Lys-N, 5: Glu-C, 6: Arg-C, 7: Asp-N, 8: alphaLP, 9: No Cleavage (for peptidomics), 10: TrypPlusC (cleave after K, R, or C) -EnzymeID=1 - -# Isotope error range -# Takes into account the error introduced by not choosing the monoisotopic peak for fragmentation. -# Useful for accurate precursor ion masses. -# Ignored if the parent mass tolerance is > 0.5Da or 500ppm. -# The combination of -t and -ti determines the precursor mass tolerance. -# e.g. "-t 20ppm -ti -1,2" tests abs(observed - theoretical - n * 1.00335Da) < 20ppm for n=-1, 0, 1, 2 -IsotopeErrorRange=-1,1 - -# Number of tolerable termini -# The number of peptide termini that must have been cleaved by the enzyme (default 1) -# For trypsin, 2 means fully tryptic only, 1 means partially tryptic, and 0 means no-enzyme search -NTT=2 - -# Control N-terminal methionine cleavage -# 0 means to consider protein N-term Met cleavage (Default) -# 1 means to ignore protein N-term Met cleavage -IgnoreMetCleavage=0 - -# Target/Decoy search mode -# 0 means don't search decoy database (default) -# 1 means search decoy database to compute FDR (source FASTA file must be forward-only proteins) -TDA=1 - -# Number of Threads (by default, uses all available cores) -NumThreads=All - -# Minimum peptide length to consider -MinPepLength=6 - -# Maximum peptide length to consider -MaxPepLength=50 - -# Minimum precursor charge to consider (if not specified in the spectrum) -MinCharge=2 - -# Maximum precursor charge to consider (if not specified in the spectrum) -MaxCharge=5 - -# Number of matches per spectrum to be reported -# If this value is greater than 1, the FDR values computed by MS-GF+ will be skewed by high-scoring 2nd and 3rd hits -NumMatchesPerSpec=1 - -# Mass of charge carrier -# Default: mass of proton -#ChargeCarrierMass=1.00727649 - -# Maximum missed cleavages -# Exclude peptides with more than this number of missed cleavages from the search, Default: -1 (no limit) -#MaxMissedCleavages=-1 - -# Minimum number of ions a spectrum must have to be examined -#MinNumPeaksPerSpectrum=10 - -# Number of isoforms to consider per peptide -# Default: 128 -#NumIsoforms=128 - -# Include additional features in the output (enable this to post-process results with Percolator) -#AddFeatures=1 - -# Amino Acid Modification Examples -# Specify static modifications using one or more StaticMod= entries -# Specify dynamic modifications using one or more DynamicMod= entries -# Modification format is: -# Mass or CompositionString, Residues, ModType, Position, Name (all five fields are required). -# CompositionString can only contain a limited set of elements, primarily C H N O S or P -# -# Examples: -# C2H3N1O1, C, fix, any, Carbamidomethyl # Fixed Carbamidomethyl C (alkylation) -# O1, M, opt, any, Oxidation # Oxidation M -# 15.994915, M, opt, any, Oxidation # Oxidation M (mass is used instead of CompositionString) -# H-1N-1O1, NQ, opt, any, Deamidated # Negative numbers are allowed. -# CH2, K, opt, any, Methyl # Methylation K -# C2H2O1, K, opt, any, Acetyl # Acetylation K -# HO3P, STY,opt, any, Phospho # Phosphorylation STY -# C2H3NO, *, opt, N-term, Carbamidomethyl # Variable Carbamidomethyl N-term -# H-2O-1, E, opt, N-term, Glu->pyro-Glu # Pyro-glu from E -# H-3N-1, Q, opt, N-term, Gln->pyro-Glu # Pyro-glu from Q -# C2H2O, *, opt, Prot-N-term, Acetyl # Acetylation Protein N-term diff --git a/docs/readme.md b/docs/readme.md deleted file mode 100644 index 14fc1ecc..00000000 --- a/docs/readme.md +++ /dev/null @@ -1,33 +0,0 @@ -# MS-GF+ documentation (Markdown) - -Static HTML under `docs/` was replaced with these Markdown pages so they read well on GitHub and in editors. - -### Contacts - -- PNNL Proteomics: proteomics@pnnl.gov -- Sangtae Kim: sangtae.kim (at) gmail.com - -### Summary - -- MS-GF+ is an MS/MS database search tool that is sensitive (it identifies more peptides than other database search tools and as many peptides as spectral library search tools) and universal (works well for diverse types of spectra, different configurations of MS instruments and different experimental protocols). -- Input: HUPO PSI standard mzML and MGF only (mzXML, MS2, PKL, and `_dta.txt` are not supported in this fork). -- Output: Percolator `.pin` (default, for rescoring) or TSV. mzIdentML (`.mzid`) output has been removed — MS-GF+ now feeds downstream Percolator pipelines directly via `.pin`. See [Changelog](changelog.md) for migration notes. - -### Usage and help - -- [MS-GF+ usage](msgfplus.md) — [Change log](changelog.md) -- [Output formats — pin / tsv column reference](output.md) -- [MS-GF+ parameter files](https://github.com/MSGFPlus/msgfplus/tree/master/docs/parameterfiles) (config examples on the upstream repo) -- [Suffix array builder (BuildSA)](buildsa.md) -- [Isobaric labelling: TMT / TMTpro / iTRAQ recipes](isobariclabeling.md) -- [Troubleshooting & common errors](troubleshooting.md) - -### Publications - -**MS-GF+ makes progress towards a universal database search tool for proteomics.** -Sangtae Kim and Pavel A Pevzner. *Nat Commun.* 2014 Oct 31; 5:5277. doi: 10.1038/ncomms6277. -[PubMed ID 25358478](https://pubmed.ncbi.nlm.nih.gov/25358478/) - -**Spectral probabilities and generating functions of tandem mass spectra: a strike against decoy databases.** -Sangtae Kim, Nitin Gupta, and Pavel A Pevzner. *J Proteome Res.* 2008 Aug; 7(8):3354-63. doi: 10.1021/pr8001244. -[PubMed ID 18597511](https://pubmed.ncbi.nlm.nih.gov/18597511/) diff --git a/docs/training-scoring-models.md b/docs/training-scoring-models.md deleted file mode 100644 index cc12e827..00000000 --- a/docs/training-scoring-models.md +++ /dev/null @@ -1,181 +0,0 @@ -# Training MS-GF+ scoring models - -MS-GF+ ships with a set of pre-trained scoring models (`.param` files in -`src/main/resources/`) that cover the common combinations of activation -method, instrument type, enzyme, and protocol. The bundled set includes -HCD/QExactive/Tryp, HCD/HighRes/Tryp/TMT, and so on. If your data does -not match any of the bundled combinations, or if you want a model -specifically tuned for your instrument, you can train your own. - -This page describes the recovered training entry point on this fork and -the end-to-end workflow. - -## When to train a new model - -You need a custom model only when: - -- Your activation/instrument/enzyme/protocol combination has no bundled - `.param` file. Run a search with `-inst HighRes -m HCD -e Tryp` and - watch the startup log: if MS-GF+ falls back to a generic model, that's - the signal. -- Your instrument's fragmentation pattern differs materially from the - bundled training data (e.g. a new generation Astral run vs. a Q - Exactive of 2014). -- You want to compare an in-house trained model against the bundled one - to quantify the gain. - -For most users on standard tryptic HCD runs, the bundled model is fine -and Phase B's calibrated precursor-window tightening (the -`-precursorCal auto` flag) is the bigger lever. - -## What you need - -1. **Spectra**: one or more mzML or MGF files of MS/MS data from the - instrument and acquisition mode you want to train for. -2. **A protein database**: a FASTA covering the species in your - training data. -3. **A modifications file**: standard MS-GF+ `Mods.txt` format. -4. **A target/decoy MS-GF+ search of (1) against (2) at standard 1% - FDR**: this provides the annotated PSMs the trainer learns from. - The trainer needs **a few hundred** confidently identified PSMs to - produce a stable model; thousands is better. - -The mzID input that upstream MS-GF+ supported was removed from this -fork. The trainer now accepts only TSV PSM lists. The standard MS-GF+ -TSV writer (`DirectTSVWriter`, the one you get with the default search -output) produces TSVs that already match the trainer's expected format. - -## Workflow - -### Step 1 — Search your training data - -Run an MS-GF+ search the same way you would for any project, with -`-tda 1` (target-decoy on) so the output has a `QValue` column the -trainer can filter on. Use a precision tolerance appropriate for the -instrument; for high-resolution data, `-precursorCal auto` is -recommended so Phase B's calibration tightens the window before the -search. - -Example: - -```sh -java -Xmx16G -jar MSGFPlus.jar \ - -s training.mzML \ - -d training.fasta \ - -mod Mods.txt \ - -t 10ppm \ - -tda 1 \ - -inst HighRes \ - -m HCD \ - -e Tryp \ - -precursorCal auto \ - -addFeatures 1 \ - -o training.tsv -``` - -The output `training.tsv` is the input to the trainer. - -### Step 2 — Train the scoring model - -Invoke `ScoringParamGen` with the same activation method, instrument -type, enzyme, and protocol you used in step 1. The trainer pulls the -high-confidence PSMs (default `QValue ≤ 0.01`), looks up each PSM's -spectrum in the directory you supply, and writes a `.param` file in -the current working directory. - -```sh -java -Xmx4G -cp MSGFPlus.jar edu.ucsd.msjava.ui.ScoringParamGen \ - -i training.tsv \ - -d /path/to/spectra-directory \ - -m HCD \ - -inst HighRes \ - -e Tryp \ - -protocol Standard -``` - -The output filename is derived from the data type: e.g. for the -arguments above, `HCD_HighRes_Tryp_Standard.param`. - -### Step 3 — Use the model - -Drop the `.param` file into `src/main/resources/` (rebuilding the JAR) -or supply it via the appropriate parameter file. MS-GF+ will pick it up -when the search's `(activationMethod, instrumentType, enzyme, protocol)` -tuple matches the filename. - -## TSV input format - -`AnnotatedSpectra` (the trainer's TSV reader) requires these columns, -identified by header name (case-insensitive): - -| Column | Required | Description | -|---|---|---| -| `#SpecFile` | yes | Spectrum file name (matched by basename against `-d`). | -| `SpecID` | yes | Index or scan identifier; passed to `SpectraAccessor.getSpectrumById`. | -| `Peptide` | yes | Peptide sequence. May include `K.PEPTIDE.K` flanking residues; flankers are stripped. | -| `Charge` | yes | Integer charge state. | -| `FDR` / `EFDR` / `QValue` / `SpecQValue` | yes (any one) | Used to filter rows; default threshold is 0.01. | - -Extra columns are ignored. The `Peptide` field accepts standard MS-GF+ -modification syntax (e.g. `K.PEP+57.021M+15.995IDE.K`). The trainer -matches each PSM's `(SpecID, Charge)` against the spectrum file and -verifies that the peptide's theoretical mass is within 5 Da of the -spectrum's precursor mass; mismatches are reported and abort the run -(unless `-dropErrors 1` is supplied). - -## CLI reference - -``` -java -cp MSGFPlus.jar edu.ucsd.msjava.ui.ScoringParamGen [options] - -Required: - -i Training result TSV files (mzID input not supported in this build) - -d Directory holding the spectrum files referenced by the TSVs - -m Activation method (CID, ETD, HCD, UVPD, etc.) - -inst Instrument type (LowRes, HighRes, QExactive, etc.) - -e Enzyme name (Tryp, Chymotryp, LysC, AspN, etc.) - -Optional: - -protocol Protocol (default: NoProtocol/automatic) - -thread Worker threads for parsing PSMs (default: 1) - -dropErrors 0|1 Drop datasets with errors instead of failing (default: 0) - -mgf 0|1 Also emit aggregated .mgf (default: 0) -``` - -## Notes and limitations - -- **mzID input was removed**: the upstream MS-GF+ `ui/ScoringParamGen` - CLI accepted `.mzid` files via `MzIDParser`. That class was deleted - from this fork in commit `9bf01c8`. If your existing pipeline produces - mzID, pre-convert to TSV (e.g. with the upstream MS-GF+ JAR's - `MzIDToTsv`) before passing to the trainer. -- **No `params/ParamManager`**: the upstream CLI used the (now-removed) - `ParamManager` framework. The recovered entry point parses arguments - manually; option semantics match the upstream CLI, but the help text - is shorter. -- **Output goes to the current directory**: the `.param` file lands - wherever you launched the JVM. There is no `-o` option; supply the - intended output directory via `cd` before invoking, or copy the file - afterwards. -- **Minimum training data**: the trainer applies an internal dedup - (`(peptide, charge)` keyed, capped at 3 spectra per pair) before the - partition step. Empirically (see `TestScoringParamGenSmoke`), the - partition step refuses to fit under ~360 dedup-survived spectra at a - single charge, silently emitting an empty partition set and aborting - the model write. To stay above the floor, plan on **≥ 200 unique - peptide identifications across the dominant charge state**, and - preferably ≥ 500 unique peptides for a model with usable rank - distributions. - -## See also - -- The recovered code lives at: - - `src/main/java/edu/ucsd/msjava/ui/ScoringParamGen.java` - - `src/main/java/edu/ucsd/msjava/msscorer/ScoringParameterGeneratorWithErrors.java` - - `src/main/java/edu/ucsd/msjava/msscorer/ScoringParameterGenerator.java` - - `src/main/java/edu/ucsd/msjava/msutil/AnnotatedSpectra.java` - - `src/main/java/edu/ucsd/msjava/misc/TrainScoringParameters.java` -- The original upstream documentation page is still live at - ; the - command-line semantics here match it apart from the mzID input - caveat above. diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md deleted file mode 100644 index 1d499daa..00000000 --- a/docs/troubleshooting.md +++ /dev/null @@ -1,124 +0,0 @@ -# MS-GF+ Troubleshooting - -[MS-GF+ Documentation home](readme.md) · [ChangeLog](changelog.md) - -Common failure modes and how to work around them. If the issue is not listed here, open a ticket at . - ---- - -## Input spectra - -### "Skip spectrum X since it is not centroided" - -MS-GF+ requires centroided MS/MS spectra. Profile spectra are detected automatically and skipped. If every scan is skipped, the input is profile, not centroided. - -**Fix — pick the tool that matches your workflow.** - -- **ThermoRawFileParser** (used by nf-core/quantms, bigbio/quantms, SDRF-based pipelines). Centroids Thermo MS2 by default: - ```bash - ThermoRawFileParser.sh -i DatasetName.raw -f 2 -o . # -f 2 = indexed mzML; centroiding is on by default - ``` - Pass `-p` / `--noPeakPicking` only if you deliberately want profile output — that's the case that produces the error. - -- **MSConvert** (ProteoWizard, works on Thermo, Bruker, SCIEX, Waters, Agilent). Peak-picking is opt-in via the `peakPicking` filter: - ```bash - msconvert --mzML --32 --filter "peakPicking true 1-" DatasetName.raw - ``` - The `1-` argument peak-picks MS level 1 and up. Use `2-` if you only want to peak-pick MS2. - -- **OpenMS `FileConverter`** / **`PeakPickerHiRes`** — alternative if you already have an OpenMS pipeline. - -**Override** — if your mzML/mzXML is centroided but MS-GF+'s own profile detector (median distance between consecutive peaks < 50 ppm) disagrees, add `-allowDenseCentroidedPeaks 1`. - -### "ParseError in XML prolog" - -Usually a BOM or encoding mismatch in the mzML header. Common on Windows when files are copied between tools that rewrite the XML declaration. - -**Fix** — verify the file starts with `` and has no leading whitespace or BOM. `file -i spectrum.mzML` (Linux/macOS) will show the detected encoding; `head -c 3 spectrum.mzML | xxd` will show a BOM as `ef bb bf`. - -If the file was generated by MSConvert, re-run the conversion. If it was hand-edited, restore it from the original raw-file conversion. - -### "Negative MSGFScore" on MGF input - -Reported on some MGF files; see [issue #132](https://github.com/MSGFPlus/msgfplus/issues/132). Root cause is under investigation. As a workaround, convert the MGF to mzML via MSConvert and rerun the search; the negative-score pathway is specific to the MGF parser. - ---- - -## Database (FASTA) size - -MS-GF+ currently uses `int`-indexed suffix-array and byte-array structures for the FASTA. In practice, this caps the database at approximately **250–500 MB** depending on protein composition; larger files fail with `NegativeArraySizeException`, `ArrayIndexOutOfBoundsException`, or a silent truncation. - -Affected workflows: metaproteomics, proteogenomics, antibody-repertoire searches, and pan-microbial databases. - -**Workaround today** — split the FASTA into chunks ≤ 250 MB, run one MS-GF+ search per chunk, and concatenate the resulting `.pin` (or `.tsv`) files. For `.pin` outputs the header line repeats per chunk; drop duplicate header rows after the first, then feed the merged file to Percolator. - -**Planned fix** — 64-bit indexed FASTA storage is tracked as Priority 1 in the `bigbio/msgfplus` performance roadmap. See the investigation note in `.claude/investigations/` (not shipped). - -Related upstream issues: [#10](https://github.com/MSGFPlus/msgfplus/issues/10), [#43](https://github.com/MSGFPlus/msgfplus/issues/43), [#77](https://github.com/MSGFPlus/msgfplus/issues/77), [#124](https://github.com/MSGFPlus/msgfplus/issues/124). - ---- - -## Memory and heap - -MS-GF+ is memory-intensive. A reasonable rule of thumb for `-Xmx`: - -| FASTA size | Recommended `-Xmx` | -|------------|--------------------| -| ≤ 50 MB | `-Xmx4G` | -| 50–150 MB | `-Xmx8G` | -| 150–250 MB | `-Xmx16G` | -| > 250 MB | Split the FASTA (see above) | - -Multiply by ~1.5× when running with many threads and a wide isotope-error range (`-ti`) on Astral or TOF data, or when `-numMods` ≥ 5. - -If you hit `java.lang.OutOfMemoryError: Java heap space`, the fix is almost always (a) raise `-Xmx`, or (b) raise `-tasks` (more, smaller chunks): - -```bash -# Before: one task per thread, full memory per thread -java -Xmx8G -jar MSGFPlus.jar -s spectra.mzML -d db.fasta -thread 8 - -# After: 3 tasks per thread, lower per-task memory -java -Xmx8G -jar MSGFPlus.jar -s spectra.mzML -d db.fasta -thread 8 -tasks -3 -``` - -`-tasks -3` means "3 × numThreads tasks", which reduces memory per task at the cost of some wall time. - ---- - -## Thread utilisation - -By default MS-GF+ caps concurrent threads at `min(availableCores, numSpectra / 250)`. On a 20-core machine with ~1,000 spectra you will see only ~4 active threads. This is intentional to avoid I/O contention, but can surprise users with small input files on large hosts. - -**Override** — lower the per-thread spectrum floor with `-minSpectraPerThread N` (default 250). For example, to force ~20 threads on a 1,000-spectrum file: - -```bash -java -Xmx8G -jar MSGFPlus.jar -s small.mzML -d db.fasta -thread 20 -minSpectraPerThread 50 -``` - -Going below ~50 usually makes the search slower because per-thread setup overhead starts to dominate; benchmark your own data. - -**Alternative workaround** — process multiple mzML files in parallel as separate MS-GF+ processes. - -Related issue: [#52](https://github.com/MSGFPlus/msgfplus/issues/52). - ---- - -## OpenMS `MSGFPlusAdapter` hangs in TOPPAS on macOS - -Reported in [OpenMS #1764](https://github.com/OpenMS/OpenMS/issues/1764). The command line works; TOPPAS fails because of how it passes environment and quoted arguments. - -**Workaround** — run MS-GF+ directly from the command line and feed the resulting `.pin` (or `.tsv`) into OpenMS via `PercolatorAdapter` / `MSGFPlusAdapter`. - ---- - -## Reporting a bug - -When opening an issue, please include: - -- MS-GF+ version (`java -jar MSGFPlus.jar 2>&1 | head -1`) -- Java version (`java -version`) -- `-Xmx` used, physical RAM, and OS -- Command line you ran, with anonymised file paths -- Full console output (especially the last 50 lines before the failure) -- FASTA protein count and approximate size -- A minimal mzML / MGF file that reproduces the problem, if possible