Skip to content

Comet v2026.03.0

Latest

Choose a tag to compare

@jke000 jke000 released this 01 Oct 23:32
· 2 commits to master since this release
fa08489

Comet 2026.03 rev. 0 (v2026.03.0)

This release brings terminal and protein-terminal variable modifications, and the position restrictions of variable_modNN, to indexed (PI and FI) database searches. It adds Comet's internal decoys to fragment ion index (FI) searches and a .NET 8 build of the real-time search wrapper. PI and FI searches are substantially faster and use less memory, and the release includes a broad set of correctness and memory-safety fixes. Existing .idx files must be rebuilt (see Breaking Changes).

Parameter documentation: https://uwpr.github.io/Comet/parameters/parameters_202603/

New Features

  • Protein-terminal variable modifications. The residue field of variable_modNN accepts two new codes, ^ (protein N-terminus only) and $ (protein C-terminus only), alongside n/c (any peptide N-/C-terminus), e.g. variable_mod01 = 42.010565 ^ 0 1 -1 0 0 0.0 for protein N-terminal acetylation. Terminal and protein-terminal variable modifications work in FASTA, PI and FI searches alike and count toward max_variable_mods_in_peptide (#130).
  • Variable modification position restrictions in indexed searches. The fifth and sixth fields of variable_modNN (distance from a terminus, which terminus) were applied by FASTA searches only; FI and PI searches ignored them. They are now honored on every search path, e.g. N-terminal pyroglutamate variable_mod03 = -17.026549 Q 0 1 0 2 0 0.0 is applied only to a peptide N-terminal Q. Peptide-terminus restrictions, -2 and protein-terminus distance 0 are exact everywhere. A protein-terminus distance greater than 0 is applied by FI/PI searches only to peptides at that protein terminus, with a warning, since the index does not record a peptide's position within its protein. n 0 0 and c 0 1 are equivalent to ^ and $ (#134).
  • Internal decoys in FI searches. decoy_search = 1 or 2 now works for FI searches: each target peptide in the index gets a pseudo-reversed decoy with its own fragment postings. The index holds half as many unmodified peptides as a target-decoy FASTA and search speed is unchanged. For .idx searches the decoy mode is the value the index was built with (#129).
  • CometWrapperCore, a .NET 8 (net8.0) build of the C++/CLI real-time search wrapper alongside the existing .NET Framework CometWrapper, including Thermo .raw support. CometWrapperCore.dll and Ijwhost.dll are published as Windows release assets (#127, by @mhoopmann).

Bug Fixes

  • Real-time search decoy labeling: internal-decoy hits returned by the real-time search interface for indexed databases carried the target's protein names and were indistinguishable from real identifications; they are now labeled with decoy_prefix (#129).
  • PI decoy classification: every internal-decoy candidate in a PI search of a pre-built .idx was misclassified as a target (#128).
  • .idx header completeness: decoy_prefix, num_enzyme_termini, allowed_missed_cleavage and clip_nterm_methionine are stored in the .idx header, so a search-time params mismatch can no longer corrupt the target/decoy split or misreport enzyme metadata in pepXML/mzIdentML output (#128).
  • Deterministic .idx builds: building the same .idx twice now produces identical files, also across x86 and ARM builds. Peptides repeated within one protein could be represented by either copy depending on thread timing, and the mass sort used a non-transitive tolerance comparison (#134).
  • AScorePro and position-restricted modifications: AScorePro could relocalize a position-restricted modification onto a residue the search does not allow, e.g. N-terminal pyroglutamate onto an internal Q. Such peptidoforms are skipped and the reported MOB and site scores are computed among the allowed ones (#134).
  • Distance-restricted variable modifications in FASTA searches, inherited from 2026.02: an n or c modification with a distance restriction could shift the site assignments of later modifications of the same entry; binary modifications with a protein-C or peptide-C restriction were never applied; a binary modification under -2 counted the C-terminal residue as a site and so never generated the valid form; members of one binary group were judged by the first member's restriction instead of their own; a c modification with a protein N-terminus restriction was tested against the wrong position; an n modification with a peptide C-terminus restriction (e.g. n 0 1 8 3, a peptide-length limit) was never placed. Undefined fifth/sixth field values (distance below -2, or a distance rule with a terminus outside 0-3) are now rejected with an error (#134).
  • Protein attribution of protein-terminus-restricted modifications (FI/PI): a shared peptide carrying such a modification was reported against every protein containing it; it is now reported only against the proteins in which it sits at that terminus, matching FASTA searches (#134).
  • index_search_type scope: the parameter only selects which index type to auto-build when database_name names an .idx file that does not exist yet (0 = peptide index, 1 = fragment ion index); it was being read as a search-mode switch (issue #132). comet -p no longer writes it; comet -q writes index_search_type = -1 (not set). An explicit 0 or 1 that cannot be honored (FASTA/PEFF database, or an existing .idx of the other type) produces a warning. Note that params files written by v2026.02.2's comet -p contain index_search_type = 1, so a FASTA search with such a file prints one warning line until the line is deleted (#134).
  • FI static protein-terminal masses: FI searches never applied add_Nterm_protein/add_Cterm_protein to peptides at a protein terminus (#130).
  • E-value: restored the wider initial fit window in the E-value linear regression, recovering PSMs in low-resolution searches (#126, by @rrad42).
  • Wrong-result and crash fixes from a code review of the search engine (#128), including: modification-count caps bypassed for variable_mod10-15 and in FI/PI searches; stale precursor neutral-loss and start-position state in FI/PI; decoy neutral-loss ladders; AScorePro enabled alongside variable_mod10-15, which corrupted modification sites (now an error; AScorePro supports variable_mod01-09); off-by-one heap reads/writes; double-free hazards in CometWrapper; unknown precursor charge (0) in real-time search now rejected instead of searched as 1+; robustness against corrupt .idx, MSP, mzIdentML and PEFF input.
  • Parameter file parsing: add_U_selenocysteine is now read (the code expected a different name); the spectral library MS level parameter name is fixed; a non-numeric mass_offsets entry no longer hangs the parser; an undefined search_enzyme_number, search_enzyme2_number or sample_enzyme_number is an error instead of a silent default; very long parameter values no longer overflow a buffer (#128).
  • PEFF parsing (#133, issue #132): annotation identifiers (# HasAnnotationIdentifiers=true, e.g. \ModResPsi=(1:25|MOD:00798|half cystine)) were read as the position, so labeled modifications landed on the wrong residue and labeled variants were dropped; modification names containing parentheses were split, and a name ending in ) dropped that and every later modification on the protein; a \VariantSimple entry with an empty residue field inherited the previous entry's residue; peff_verbose_output warnings now report one clean line per ignored entry.

Performance

Measured on the human canonical proteome, Met-oxidation and Met-oxidation + STY-phosphorylation, versus v2026.02.2 (docs/20260917_v2026023_vs_v2026022.md):

  • PI searches are 1.7-2.7x faster (batch and real-time), with identical results.
  • FI in-memory index regeneration is 2-3x faster and scales with threads (phospho: ~65 s to 37 s at 4 threads, 25 s at 8); the FI search phase is 30-40% faster in batch.
  • Lower memory throughout: FI phospho peak 20.0 GB to 18.3 GB; PI phospho 7.9 GB to 5.2 GB (2.8 GB with internal decoys); .idx build peak 1.1 GB to 0.55 GB. The in-memory index uses a compact 13-byte-per-variant layout, pooled raw-peptide and modification tables, and a streaming .idx reader.
  • Three of the four target-decoy configurations are PSM-for-PSM identical to v2026.02.2; FI phospho changes 0.4% of rank-1 peptides (1% FDR PSMs -0.8% by xcorr, +0.7% by E-value).
  • Honoring position restrictions in indexed searches: a phospho search with N-terminal pyroglutamate from Q/E and internal decoys identifies 10.8% more PSMs at 1% FDR by xcorr (3.2% by E-value) than when the restriction is ignored.

Breaking Changes

  • .idx format v5. Existing .idx files must be rebuilt; older formats are rejected with a clear error. Indexes built by pre-release builds of this release load but carry no position restrictions; rebuild them too.

Known Limitations

  • Internal decoys reverse the peptide and move each modification with its residue, so a decoy's N-terminal pyroglutamate ends up on an internal residue. Targets and decoys stay mass-matched, but position-restricted modifications appear more often on decoys (about 2:1 for pyroglutamate), as in 2026.02.

Tools and Build

  • CI workflows updated to Node 24 (#131).
  • tools/qvalue.py locates columns by header name, so it works on PEFF search output.
  • New regression tests T26-T60 in tests/unit/run_tests.py; CometUnitTests has 77 cases; tests/regression/run_regression.py covers FI with internal decoys.

Pull Requests

  • E-value: restore the wider initial fit window in the linear regression, which recovers PSMs after FDR filtering (reported for low-resolution searches) by @rrad42 in #126
  • Add CometWrapperCore: .NET 8 (net8.0) sibling of CometWrapper by @mhoopmann in #127
  • Correctness fixes, memory-safety hardening, RTS/FI performance by @jke000 in #128
  • Support Comet's internal decoys in FI searches; fix RTS decoy labeling and AScorePro consistency fixes by @jke000 in #129
  • Terminal and protein-terminal variable modifications via ModificationsPermuter (FI & PI); .idx format v5 by @jke000 in #130
  • Update CI workflows to use Node 24 for various actions by @jke000 in #131
  • PEFF issue132 by @jke000 in #133
  • Variable-mod position restrictions on all search paths; deterministic .idx builds by @jke000 in #134

New Contributors

Full Changelog: v2026.02.2...v2026.03.0