The data-driven peptide search engine of the quantms ecosystem. Built and maintained by the quantms team.
andes is a peptide database search engine for shotgun proteomics. Spectra (mzML, MGF, native
Thermo .raw, Bruker timsTOF .d) and a FASTA go in; a Percolator-ready .pin comes out. The
scoring model is picked per file from its metadata. Opt-in modes recover co-isolated peptides
(--chimeric), search secondary modifications (--refine) and identify intact
N-glycopeptides (--glyco). To our knowledge it is the first proteomics search engine designed
and built end-to-end with AI coding agents, under human direction.
PSMs on three public reference datasets for andes, Comet 2025.01 and Java MS-GF+ v20240326, all rescored the same way. On low-res LFQ (UPS1), Java MS-GF+ reported 15,904 PSMs in an earlier session.
| Engine | Astral (high-res HCD) | TMT a05058 (low-res CID) | UPS1 (low-res LFQ) |
|---|---|---|---|
andes 2051616b (2026-10-23) |
52,169 | 13,516 | 16,225 |
| Comet 2025.01 (2026-10-05) | 31,435 | 10,504 | 14,734 |
| Java MS-GF+ v20240326 † | 26,542 | 10,651 | 15,904 |
| andes wall time | 114–117 s | 40–47 s | 30–48 s |
| Comet wall time | 215 s | 76 s | 46 s |
Metric and provenance. PSMs at Percolator q ≤ 0.01, one method for every row (plain
FASTA, andes XXX_ decoys, Percolator 3.7.1 --seed 42 -Y, same 8-core VM, 8 threads); seeds 1
and 2 give andes counts within 1.2% of seed 42. † Java MS-GF+ was not re-run; its counts are
from an earlier session. Error rates (entrapment, three Percolator seeds; T/E measured per
database): andes's nominal 1% is 0.89–1.08% true FDP on Astral (peptide-level shuffled
entrapment), 0.67–0.76% on TMT a05058, 0.80–0.99% on phospho, and 2.07–2.19% on UPS1 against its
natural E. coli entrapment (0.91–0.98% against a peptide-level shuffle). timsTOF, high-res TMT,
glyco and quantification results:
docs/benchmarks/.
Time, CPU and memory (same VM, 8 threads, /usr/bin/time; andes 2026-10-23 at 2051616b,
two runs on the standard sets, one on phospho; Comet 2026-10-06, one run, same rescoring).
| dataset | engine | PSMs @ q≤0.01 | wall | CPU time | peak memory |
|---|---|---|---|---|---|
| Astral | andes | 52,169 | 114–117 s | 569–636 s | 4.8 GB |
| Comet 2025.01 | 31,435 | 217 s | 1,594 s | 8.1 GB | |
| TMT a05058 | andes | 13,516 | 40–47 s | 200–216 s | 1.7 GB |
| Comet 2025.01 | 10,504 | 77 s | 568 s | 2.9 GB | |
| UPS1 | andes | 16,225 | 30–48 s | 162–166 s | 1.3 GB |
| Comet 2025.01 | 14,734 | 42 s | 309 s | 2.9 GB | |
| Phospho (PXD007653) | andes | 38,623 | 337 s | 2,160 s | 7.9 GB |
| Comet 2025.01 | 33,984 | 1,096 s | 8,399 s | 6.0 GB |
Phospho is searched against mouse proteins with a whole-protein shuffled entrapment, the database both rows used; Comet's count read 1.77% true FDP on that design, and andes's reads 0.80–0.99% on the peptide-level design that replaced it. Wall times vary 5–15% between sessions (UPS1 30 and 48 s in two runs); CPU time is steadier.
flowchart TD
SPEC["Spectra<br/>mzML · MGF · Thermo .raw · Bruker .d"] --> SEARCH
FASTA["FASTA, targets only<br/>decoys generated for you"] --> SEARCH
SEARCH["Search<br/>one model chosen per file<br/>candidates scored per spectrum"]
SEARCH --> PIN["PIN<br/>one row per PSM"]
SEARCH -->|"--glyco"| GPIN["Glyco PIN<br/>one glycoPSM per scan"]
PIN --> PERC["Percolator<br/>owns the FDR"]
GPIN --> PERC
PERC --> OUT["PSMs at q ≤ 0.01"]
- Pick the model from the file's activation, resolution and isobaric label (one of 17 bundled models).
- Build candidates: digest the FASTA and generate decoys. The candidate index goes
out-of-core (cached in
--index-cache-dir, by default next to the output) so candidates can be retrieved by the fragment-ion index; on low-res data only the 150 most intense peaks of each spectrum vote.--glycobuilds its own sequon-only candidate table from the same out-of-core index. - Score: low-res by the generating-function rank score, high-res by the fused strong score, plus GBDT fragment-intensity features. High-res searches score only the 100 candidates whose fragment ions best match the spectrum (Astral: +22% PSMs at an equal true FDP; phospho: 164 s instead of 99 minutes).
- Optional passes
--chimeric,--refineand the separate--glycopipeline (below). - Rescore with Percolator, run by you or by
--rescore. andes computes no production FDR. - Quantify the confident PSMs on request: reporter ions (
--tmt) or MS1 features (--lfq).
Full parameter reference: DOCS.md.
Option 1 — release archive (recommended):
andes-<version>-x86_64-unknown-linux-gnu.tar.gz
andes-<version>-aarch64-unknown-linux-gnu.tar.gz
andes-<version>-x86_64-apple-darwin.tar.gz
andes-<version>-aarch64-apple-darwin.tar.gz
andes-<version>-x86_64-pc-windows-msvc.zip
Each archive holds the binary, the 17-model store in resources/models/, and LICENSE/NOTICE/README.
Option 2 — cargo install:
cargo install --git https://github.com/bigbio/andes --bin andesOption 3 — build from source:
git clone https://github.com/bigbio/andes
cd andes
cargo build --release
# Binary: target/release/andesRequires Rust 1.85+ (see rust-toolchain.toml).
andes \
--spectrum spectra.mzML \
--database proteins.fasta \
--output-pin out.pinThis runs a tryptic search with no configuration: for mzML, .raw and .d the model is chosen
from the file metadata, and the precursor tolerance defaults to 20ppm. Feed out.pin to
Percolator for q-values.
MGF has no instrument metadata. andes reads the fragment resolution from the peaks of the first 1,000 spectra (13C isotope pairs at 1.00335/z within 10 ppm, compared with chance) and selects the high-res HCD model when they show high resolution. When the peaks do not decide it assumes CID / low-res / 0.5 Da and warns.
--fragmentation <CID\|ETD\|HCD\|UVPD>and--fragment-tol-ppm/--fragment-tol-daoverride the inference.
Each PIN row is one PSM. RankScore orders candidates within a spectrum; RawScore is the
score Percolator weights most. All columns are in DOCS.md §3a.
The final tolerances and a per-modification PSM tally go to stderr and <stem>.statistics.log
(DOCS.md §3d).
Tryptic DDA + Percolator (default):
andes --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.pinTMT 10-plex search with mods.txt (mods file format: DOCS.md §2):
andes \
--spectrum tmt_spectra.mzML \
--database hsapiens.fasta \
--output-pin out.pin \
--mods tmt_10plex_mods.txt \
--protocol TMTUniProt XML database. --database uniprot_sprot_human.xml.gz searches like the UniProt
FASTA. It also offers opt-in uses of UniProt's annotation. A mod declared sites=annotated
in the mods file is placed only where UniProt annotates that modification.
--uniprot-variants searches natural sequence variants as their own entries, with the change in
the accession. --uniprot-isoforms adds the described isoforms, and --uniprot-chains the
peptides at the new termini of mature chains (after signal peptide or propeptide removal).
Annotation is filtered by evidence (--uniprot-evidence); see
DOCS.md §1a. With rescoring, variant calls are checked
against knockoff variants (below).
andes --spectrum spectra.mzML --database uniprot_sprot_human.xml.gz \
--mods phospho_annotated_mods.txt --uniprot-variants --output-pin out.pinPEFF databases. --database x.peff reads a PSI Extended FASTA file. Its variant,
modification and processing header keys become claims built like UniProt's
(DOCS.md §1a).
Site claims (experimental). Annotated modification sites are checked against knockoff
sites: the same modification on matched residues no annotation names. With rescoring, each site
gets a site q-value and <stem>.sites.tsv lists the accepted ones. The estimate errs towards
rejecting true claims; it is most useful with freely placed mods
(DOCS.md §1a). Each site also gets its
occupancy and the probability of each modification it may carry (acetyl 0.71, trimethyl 0.29),
from the competing explanations of each spectrum, diagnostic ions and neutral losses
(DOCS.md).
Annotation files. --annotations claims.annotations.parquet adds claims about the proteins
of any database, FASTA included: sequence edits (variant entries), modification sites, mature
chains. The claims can come from variant catalogues, a sample's own variant calls or site
databases, one row per claim, with a checksum of the sequence each was written against. They are
built into entries exactly like UniProt's own, so knockoffs, the class FDR and the proteoform table
apply unchanged. The flag can be repeated, and equal claims are merged. The columns are listed in
DOCS.md §1a.
andes --spectrum spectra.mzML --database human.fasta \
--annotations cosmic.annotations.parquet --annotations sample.annotations.parquet \
--rescore --output-pin out.pinTSV and Parquet output:
# TSV for inspection; QPX .idparquet bundle for quantms
andes --spectrum spectra.mzML --database db.fasta \
--output-pin out.pin --output-tsv out.tsv --output-parquet out.idparquetIn-process rescoring. --rescore runs Percolator (--percolator-bin, else percolator on
$PATH, else the pinned Docker image). --rescore-native is a built-in
cross-validated semi-supervised linear rescorer with target-decoy competition (Percolator's
algorithm, as -Y), a fallback when Percolator is not available. Both add a q-value and PEP to the outputs and write <stem>.q<fdr>.tsv (targets at
q ≤ --fdr, default 0.01, e.g. --rescore --fdr 0.01). --fdr and --pep do nothing
without one of them.
Protein groups. Every rescored run also writes <stem>.protein_groups.tsv: protein groups
by parsimony over protein families (a canonical entry with its isoform, variant and chain
entries is one family), each with a protein q-value from picked target-decoy competition.
--protein-fdr 0.01 keeps only PSMs of groups at that level in the filtered TSV, and only their
families in the proteoform table; no quantification is needed
(DOCS.md).
Quantification (--tmt, --lfq). andes quantifies the confident PSMs in the same run:
--tmt tmt10 reads the reporter ions of every identified MS2 (or its SPS-MS3 with
--tmt-level 3), applies the kit's impurity matrix (--tmt-correction) and reports the
precursor isolation purity; --lfq integrates the isotope chromatograms of every identified
precursor from the MS1 scans with an experimental decoy-based feature q-value estimate. Both write
versioned Parquet tables (<stem>.tmt.parquet, <stem>.lfq.parquet) and, with --output-parquet, the QPX
quantms.feature.parquet that quantms consumes. Normalization and protein roll-up stay
downstream (DOCS.md §10). --lfq --mbr adds match between runs
over two or more inputs: every confident precursor is measured in every run, and transfers carry
an internal quant-quality q-value (<stem>.mbr.parquet). The same stages run one at a time with
andes quant library|extract|finalize over a --quant-dir, for pipelines that spread runs
over machines. On the ProteoBench label-free DDA modules (six runs each; measured 2026-10-23 at
2051616b with default settings), andes quantified 65,012 precursors in at least 3 runs on
QExactive (PXD028735) at transfer q 0.01, with a median |ε| of 0.163 and a CV of 0.118 using
quantity_normalized (71,243 at q 0.05; the default is 0.01; the raw quantity reads |ε| 0.228,
CV 0.246). On the same module FragPipe 23.0 reports 63,701 at 0.200 / 0.156 and Sage
0.15.0-beta.2 81,933 at 0.388 / 0.393, without filtering transferred quantities. On Astral
(PXD070049) andes quantified 37,352 at |ε| 0.193 and CV 0.113; FragPipe 23.0 reports 39,057 at
0.212 / 0.127, Sage 0.14.6 30,319 at 0.167 / 0.070 and DIA-NN 2.6.0 93,237 at 0.277 / 0.159.
Leaderboard snapshot 2026-07-16, one andes seed. On a 500-run study (PXD042233) the per-run
pipeline took 146 CPU hours end to end and quantified 243,895 precursors in at least 3 runs
(benchmarks).
andes --spectrum tmt_run.mzML --database human.fasta --mods tmt10_mods.txt \
--rescore --tmt tmt10 --tmt-correction lot.txt --output-parquet run.idparquet
andes --spectrum run1.mzML --spectrum run2.mzML --database human.fasta --rescore --lfq
andes --spectrum run1.mzML --spectrum run2.mzML --database human.fasta --rescore --lfq --mbrquantms. Point the search step at andes. Use named
flag values; legacy numeric values are rejected (DOCS.md §8).
andes picks a model by (activation, instrument, enzyme, protocol), automatically for mzML,
.raw and .d. --fragmentation is needed only for MGF; --protocol <auto\|TMT\|iTRAQ\|iTRAQ-phospho\|phospho\|standard> selects a labelled or enriched model;
--model <slug> loads one model by id (e.g. hcd_qexactive_tryp_tmt). The enzyme comes from
--enzyme (default trypsin). An uncovered regime uses the nearest model.
All 17 models are trained by andes on public PRIDE data; the store contains no MS-GF+-derived model data.
model_id |
activation / instrument / enzyme / protocol | Training data (public PRIDE) | Benchmark |
|---|---|---|---|
hcd_astral_tryp |
HCD / OrbitrapAstral / Trypsin / Automatic | PXD046453 | Astral |
hcd_qexactive_tryp |
HCD / QExactive / Trypsin / Automatic | ProteomeTools (PXD009449) | global default model |
hcd_qexactive_tryp_tmt |
HCD / QExactive / Trypsin / TMT | PXD010429 | — |
hcd_qexactive_tryp_itraq |
HCD / QExactive / Trypsin / iTRAQ | public PRIDE (see manifest) | — |
hcd_qexactive_tryp_phosphorylation |
HCD / QExactive / Trypsin / Phosphorylation | public PRIDE (see manifest) | — |
hcd_highres_tryp_tmt |
HCD / HighRes / Trypsin / TMT | PXD010429 | — |
hcd_highres_nocleavage |
HCD / HighRes / NoCleavage / Automatic | ProteomeTools (PXD009449) | — |
hcd_highres_nocleavage_phosphorylation |
HCD / HighRes / NoCleavage / Phosphorylation | ProteomeTools (PXD009449) | — |
cid_lowres_tryp |
CID / LowRes / Trypsin / Automatic | PXD009875 + PXD000865 | UPS1 (low-res) |
cid_lowres_tryp_tmt |
CID / LowRes / Trypsin / TMT | PXD016999 + PXD014502 + PXD017092 | TMT a05058 (low-res) |
cid_lowres_lysc |
CID / LowRes / LysC / Automatic | PXD000865 | ⚠ limited training data |
cid_lowres_argc |
CID / LowRes / ArgC / Automatic | public PRIDE (see manifest) | ⚠ limited training data |
cid_lowres_gluc |
CID / LowRes / GluC / Automatic | public PRIDE (see manifest) | ⚠ limited training data |
etd_highres_tryp |
ETD / HighRes / Trypsin / Automatic | public PRIDE (see manifest) | — |
etd_highres_tryp_phosphorylation |
ETD / HighRes / Trypsin / Phosphorylation | public PRIDE (see manifest) | — |
etd_lowres_tryp_phosphorylation |
ETD / LowRes / Trypsin / Phosphorylation | public PRIDE (see manifest) | — |
uvpd_qexactive_tryp |
UVPD / QExactive / Trypsin / Automatic | public PRIDE (see manifest) | — |
"see manifest": the accession is tracked in the training manifest, not yet pinned here. ⚠ limited training data: few PSMs were available, so treat these models as best-effort.
To train your own, see TRAIN.md.
With --chimeric (mzML or Thermo .raw), pass 1 is the normal search, keeping the same top-N
candidates per scan (--top-n, default 10); pass 2 takes the best one as the primary peptide,
finds co-isolated precursors in the MS1 isolation window and searches the residual spectrum for
a second peptide. Keeping the alternatives (rather than only the best candidate) took Astral from
60,435 to 66,405 PSMs and 26,717 to 29,400 peptides at an equal entrapment true FDP of 1%. On
phospho the alternatives first cost about 1% of peptides (15,084 → 14,904): most of them were the
same phosphopeptide with the phosphate on another site. The PIN now keeps one row per peptide and
modification multiset per precursor (see DOCS.md §3a), and phospho with --chimeric
reaches 39,470–39,592 PSMs and 15,107–15,156 peptides, above top-1 (39,404–39,489 / 15,046–15,084).
On UPS1 (with entrapment) PSMs at q ≤ 0.01 rose from 15,838 to 17,112 (+8.0%) with entrapment
hits flat (166 → 167). On high-res data --chimeric runs on the default out-of-core path with
fragment-ion retrieval. On Astral with an entrapment database (Percolator, three seeds), at an
equal 1% true FDP, it gives 60,403–60,435 PSMs against 43,076–43,145 without --chimeric
(+40%) and 57,003–57,054 with --chimeric on the former in-RAM candidate path. Distinct peptides stay flat
(26,432–26,454 vs 26,513–26,534): the second-peptide rows mostly re-identify peptides found
elsewhere, which deepens PSM counts rather than coverage. At nominal q ≤ 0.01 the true FDP is
1.18% (1.05% without --chimeric).
--refine searches the spectra pass 1 missed against confident proteins with a fixed tier of
five chemistries (oxidation, deamidation, two pyro-Glu losses, protein N-terminal acetyl). It
does not discover new modifications and runs on high-resolution data only. On Astral it gives
40,028 PSMs (+4.3%), but its Pass-2 PSMs (IsRefinement = 1) sit at ~2.8% FDP under a
merged 1% threshold; threshold them separately for 1% on modified PSMs (DOCS.md).
Aim. A PSM on a UniProt variant entry claims that the sample carries that variant. Most false claims are not random matches. They are a canonical peptide that a common modification or an isotope error makes look like the variant: N→D and Q→E look like deamidation, G→A and D→E like methylation, and a one-isotope mis-pick fits a +1 Da substitution. Decoys model only random matches, so a decoy-based q-value does not see this error. Measured against donor genotypes, 65% of the variant PSMs accepted at a class q-value ≤ 0.01 were variants no donor carries, and 96% of the deamidation-like ones were. Knockoff variants give the variant claim a null that makes the same mistakes.
How it works.
-
Knockoff entries. Each single-residue variant X→Y of a canonical sequence, from
--uniprot-variantsor--annotations, gets up to--knockoffs(default 4) knockoff entries. A knockoff is the same substitution at another position of the same sequence that holds X, where:- the next residue matches: the same residue when X is N, Q, K or R or either next residue is P or G, otherwise the same residue class;
- the N-x-S/T sequon status is the same;
- the position lies in another enzymatic span whose length is within 3 residues of the real one's and between 6 and 50;
- every variant UniProt lists for the protein is at least 10 residues away.
The positions are chosen at random but reproducibly, from the accession and the variant id. A knockoff is almost certainly absent from the sample. A modification or an isotope error that mimics the real substitution mimics the knockoff equally well. Knockoffs are variant entries: they get decoys, PIN flags and Percolator scores exactly like real variants (
sp|P04637_KO1_D21H_VAR_005851_D7H|P53_HUMANmovesVAR_005851_D7Hto position 21). -
Knockoff q-value. After Percolator and the class FDR, variant-class PSMs are split by substitution class (deamidation-like, methyl-like, oxidation-like, other). Within a class, the knockoff PSMs above a score estimate how many real variant PSMs above it are false. A knockoff PSM counts 1/k for a variant with k knockoffs, and the estimate starts at 1/K for a finite-sample margin, with K the most knockoffs any variant has:
FDP(t) = (1/K + Σ 1/k over knockoff PSMs ≥ t) / (real PSMs ≥ t whose variant has knockoffs)
A real PSM's knockoff q-value is the smallest FDP over the thresholds at or below its score. Its reported q-value is the largest of the global, class and knockoff q-values. With claims from several sources, each substitution class is split further by prior tier (
sample,common,curated,catalogue; seeDOCS.md§1a), so a sample's own variants and catalogue variants do not share one estimate. -
Untested variants. A variant with no position that qualifies for a knockoff has no null, so its PSMs are not accepted. Measured against genotypes, those variants are false several times more often than the tested ones, so the tested variants' estimate cannot be lent to them.
-
Reporting. Variant-class PSMs (every protein a variant entry) are accepted at
--proteoform-fdr, every other PSM at--fdr. Knockoff PSMs stay in the PIN as targets; they are left out of the QPX bundle. They are never in the filtered TSV, quantification, MBR or the proteoform table, and knockoff accessions are dropped from other rows' protein lists.
Input and parameters. Variants from a UniProt XML database (--uniprot-variants) or from
annotation files (--annotations), and --rescore.
| Flag | Default | Effect |
|---|---|---|
--knockoffs |
4 |
Knockoffs per single-residue variant. 0 turns them off and leaves variant PSMs to the class FDR alone. |
--proteoform-fdr |
the larger of --fdr and 0.05 |
q-value cutoff for variant-class PSMs in the filtered TSV, the proteoform table and quantification. |
--uniprot-evidence |
experimental |
Minimum evidence for a variant to be searched (curated was used below). |
The run log gives, per substitution class, the knockoff entries made, the variant PSMs accepted before and after the knockoff q-values, how many were tested, and the estimated false share:
UniProt XML: 39142 knockoff variant entries (44773 single-residue variants with no position for a knockoff)
Rescore: variant PSMs at q<=0.05 per substitution class, before -> after knockoff q-values:
deamidation-like 1201 -> 0 (147 tested; knockoffs 150.6, false share 1.02), methyl-like 212 -> 89 ...
andes --spectrum run1.mzML --spectrum run2.mzML --database uniprot_sprot_human.xml.gz \
--uniprot-variants --uniprot-evidence curated --rescore --output-pin variants.pinCurrent benchmark.
Genotype truth. PXD022787 (four donors, one TMT10 set, 69 runs, ion-trap MS2) was searched against reviewed human UniProt with curated variants. The donor-haplotype tags of the personal protein FASTA deposited with the dataset label each reported variant as carried or absent. The true FDP below counts the labelled PSMs whose variant no donor haplotype carries:
| Setting | Variant PSMs reported | Absent / labelled | True FDP | Variants reported (true FDP) |
|---|---|---|---|---|
| No knockoffs, class q ≤ 0.01 | 2,452 | 1,075 / 1,653 | 65% | 552 (33%) |
| No knockoffs, class q ≤ 0.05 | 3,886 | 1,872 / 2,622 | 71% | 840 (45%) |
Knockoffs, --proteoform-fdr 0.05 |
201 | 4 / 160 | 2.5% | 83 (3.4%) |
Knockoffs, --proteoform-fdr 0.10 |
307 | 14 / 233 | 6.0% | 126 (8.2%) |
Only 0.55% of the knockoffs turned out to be a real donor variant, so the null is clean.
Prior tiers. The same EN-TEx runs were searched against a FASTA of reviewed human UniProt plus
an annotation file holding UniProt's 83,472 single-residue variants. In one arm, the variants a
donor carries were given a sample genotype (tier sample), as a sample's own variant calls
would be. In the other, every variant was in one tier. At --proteoform-fdr 0.05:
| Setting | Carried variant PSMs (variants) | Donor-absent PSMs (variants) | True FDP, PSMs | True FDP, variants |
|---|---|---|---|---|
| One tier | 218 (83) | 13 (7) | 5.6% | 7.8% |
| Tiers split | 329 (122) | 8 (3) | 2.4% | 2.4% |
Separate tiers recover half again as many carried variants and stay below the 5% target, which
one shared tier does not. A variant peptide that a reference protein holds once I and L are taken
as equal (for example a V→L variant spelling a paralog's …VIDEVR as …VLDEVR) is reported for
that reference, not as the variant. Without that step, one such tubulin peptide alone gave 42
false variant PSMs here.
Cost on the rest of the search. Knockoffs grow the variant entries by about 60%. PSMs at
q ≤ 0.01 change by −0.43% on pooled Astral DDA (PXD070049, 21 runs: 1,003,367 → 999,103) and by
−0.30% on the TMT set. Search time is unchanged. On the Astral set, 129 variant-class PSMs are
reported at --proteoform-fdr 0.05.
Limits.
- About 30% of single-residue variants can be given a knockoff, so most variants are not reported.
- Multi-residue variants, indels, isoform-borne variants, isoforms and mature chains get no knockoffs. Variant-class PSMs of those are not accepted while knockoffs are on; isoform and chain PSMs keep the class FDR.
- The calibration is measured on one genotyped dataset with low-resolution MS2. Small counts make the deamidation- and oxidation-like classes the least certain.
--glyco identifies the backbone and the glycan composition from one MS2 scan.
andes --spectrum sample.mzML \
--database proteins.fasta \
--decoy-strategy sequon \
--glyco --glyco-species human \
--output-pin results.pin- A glycan database is required:
--glyco-species(human,mouse,mouse-large,high-mannose) or your own.gdbwith--glyco-glycan-gdb. - Output is only
results.glyco.pin;--output-tsv,--output-parquet,--rescoreand--refineare rejected. Run Percolator on it with--trainFDR 0.05. - Use
--decoy-strategy sequon; the other generated decoys carry fewer sequons than their targets, which makes q-values anti-conservative. - Search each fraction separately, concatenate the
.glyco.pinfiles (one header) and run Percolator once: one fraction has too few decoys for a stable 1%. - HCD/CID and ETD/EThcD/AI-ETD are supported; c/z fragments localize the glycosite. The site is
reported as
@N<pos>only for a single N-X-S/T sequon, otherwise@N?.
On one mouse-liver fraction (PXD005553) andes reports 6,992–7,072 glycoPSMs at 1% at
0.61–1.35% true FDP (three peptide-level entrapment databases × three seeds, 2026-10-23),
confirming 88.2–88.4% of the depositors' (pGlyco2) and 89.3–89.7% of a reanalysis's
(MSFragger-Glyco) identifications, in about 6 minutes and 5.6 GB on 8 threads (docs/benchmarks/).
--glyco-peptide-first finds ~2% more at ~13x the run time.
Memory: --glyco runs on the out-of-core candidate index and holds in memory only the
candidates that carry an N-X-S/T sequon (3.2 of 28.0 million on the mouse fraction above), so
that run peaks at 4.5 GB with output identical to the former in-RAM path (20.0 GB). All flags:
DOCS.md §9.
Pass --spectrum sample.raw. Output is identical to the equivalent mzML (checked scan-for-scan
on a 2.4 GB Orbitrap Astral run). Release archives (macOS x64/arm64, Windows x64, Linux x64)
bundle a .NET 8 runtime. From source, install the
.NET 8 runtime and build with rustc ≥ 1.88:
RUSTUP_TOOLCHAIN=stable cargo build --release -p andes --features thermo.
andes uses a bundled dotnet/ next to the binary, else DOTNET_ROOT or a system install;
containers can start from mcr.microsoft.com/dotnet/runtime:8.0. RawFileReader is under
Thermo's license (crates/input/THERMO_LICENSE.txt).
Pass --spectrum sample.d (a directory). The pure-Rust
timsrust reader needs no vendor runtime; build with
--features timstof (rustc ≥ 1.88):
cargo build --release -p andes --features timstof
andes --spectrum sample.d --database human.fasta --output-pin out.pinScope: DDA-PASEF, MS2 only; ion mobility is not scored; --chimeric and --precursor-cal
fall back to a normal search.
If you use andes in published work, please cite:
bigbio (2026). andes: a data-driven peptide search engine for the quantms ecosystem. https://github.com/bigbio/andes
andes is released under the Apache License 2.0 — see LICENSE for the full text and NOTICE for attribution.
