@@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77
88## [ Unreleased]
99
10+ ## [ 4.0.0] - 2026-07-17
11+
1012### Added
1113
1214- ` annotate_spectra() ` in ` parse_spectra.py ` : annotates all PSM spectra once before feature
@@ -30,8 +32,21 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
3032 engine internals.
3133- ` ristretto-ms ` dependency: a lean, dependency-light (numpy/scikit-learn/pandas)
3234 reimplementation of the Percolator/Käll semi-supervised rescoring algorithm.
33- - GUI: rescoring model selector (svm/lda); GUI runs now also write an HTML log file
34- (` <prefix>.log.html ` ), matching the CLI.
35+ - New ` ms2 ` feature generator backed by ` ms2rescore-rs ` , providing direct-spectrum features
36+ including matched-ion counts and percentages, hyperscore, and intensity-ratio features for
37+ the a, b, c, x, y, and z ion series.
38+ - Configurable IM2Deep CCS reference datasets. CSV, compressed CSV, and Parquet files are
39+ supported and must contain ` peptidoform ` and ` CCS ` columns.
40+ - Mumble integration as an optional dependency (` ms2rescore[mumble] ` ) for generating
41+ mass-shift candidate peptidoforms before rescoring.
42+ - Intermediate-file recovery: the current PSM state is written to
43+ ` <prefix>.intermediate.tsv ` when feature generation or rescoring fails.
44+ - Feature generators are skipped when all of their output features are already present,
45+ allowing interrupted runs to resume without recomputing completed features.
46+ - Full per-feature-generator test coverage for the basic, DeepLC, IM2Deep, MS2, and MS²PIP
47+ feature generators, together with end-to-end rescoring integration tests.
48+ - GUI: rescoring model selector (svm/lda); centralized fragmentation-model and fragment-tolerance
49+ controls; GUI runs now also write an HTML log file (` <prefix>.log.html ` ), matching the CLI.
3550
3651### Changed
3752
@@ -41,7 +56,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
4156 are passed via ` psm.spectrum ` .
4257- MS2: migrated from ` ms2_features_from_ms2spectra ` to ` score_ms2_spectra ` API. Feature set
4358 expanded to cover all ion series (a, b, c, x, y, z).
44- - Dependencies bumped: ` ms2pip>=4.2.0b1 ` , ` ms2rescore_rs>=0.5.0b1 ` . Added ` pyarrow>=14 ` .
59+ - DeepLC migrated to the v4 functional API, with dataset-wide prediction and selection of the
60+ best multitask prediction head independently for each run.
61+ - IM2Deep migrated to the v2 functional API, with dataset-wide prediction and per-run linear
62+ CCS calibration.
63+ - Dependencies bumped: ` deeplc>=4.0.0b1 ` , ` im2deep>=2.0.1 ` , ` ms2pip>=4.2.0 ` ,
64+ ` ms2rescore_rs>=0.5.0 ` , and ` ristretto-ms>=0.3.0 ` . Added ` pyarrow>=14 ` .
4565- numpy 2.0 compatibility in ` charts.py ` (` np.trapz ` → ` np.trapezoid ` ).
4666- Rescoring engine replaced: mokapot → ristretto. Rescoring can no longer be skipped -- it
4767 always runs.
@@ -60,6 +80,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
6080 Mumble), not a statistically rigorous FDR-controlled count.
6181- Protein-level rollups use ristretto's picked-protein competition (Savitski et al. 2015) when
6282 ` id_decoy_pattern ` is set.
83+ - Python 3.11 or newer is now required.
6384
6485### Removed
6586
@@ -68,6 +89,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
6889 ` tolerance_mode ` in the top-level configuration (default: ` 0.02 Da ` ).
6990- [ BREAKING] ` spectrum_path ` , ` spectrum_id_pattern ` , ` mass_mode ` , and ` processes ` parameters
7091 removed from ` MS2FeatureGenerator ` . Spectra are provided via centralized ` annotate_spectra() ` .
92+ - [ BREAKING] ` ionmob ` feature generator removed. Ion-mobility prediction and CCS calibration are
93+ now provided by the IM2Deep v2 feature generator.
94+ - [ BREAKING] ` maxquant ` feature generator removed. Its relevant spectrum-derived features are
95+ now provided by the ` ms2 ` feature generator.
7196- [ BREAKING] Mokapot rescoring engine and the ` mokapot ` dependency removed, along with the
7297 ` ms2rescore.rescoring_engines ` module.
7398- [ BREAKING] ` rescoring_engine ` configuration option removed (mokapot-specific: ` fasta_file ` ,
@@ -81,8 +106,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
81106 TSV already carries all rescoring features.
82107- [ BREAKING] Ability to skip rescoring via configuration removed. ` rescoring: null ` is now
83108 rejected by config validation instead of being silently ignored; rescoring always runs.
84- - [ BREAKING] ` ms2rescore.utils ` (public) renamed to ` ms2rescore._utils ` (internal) and merged
85- with the new rescoring integration layer -- no longer part of the public API surface.
109+ - [ BREAKING] The public ` ms2rescore.utils ` module removed. General internal utilities now reside
110+ in ` ms2rescore._utils ` , while private ristretto integration helpers reside in
111+ ` ms2rescore._ristretto_utils ` ; neither module is part of the public API surface.
86112
87113### Fixed
88114
@@ -92,15 +118,30 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
92118 ms2rescore via centralized per-PSM ` annotate_spectra() ` .
93119- DeepLC RT features incorrectly assigned across PSMs: missing ` sort_index() ` after q-value sort
94120 for calibration caused PSMs to receive another PSM's RT predictions.
121+ - Multi-run MS²PIP crash caused by observed-spectrum deduplication using ` spectrum_id ` alone.
122+ Spectra are now keyed by ` (run, spectrum_id) ` , preventing collisions between runs that reuse
123+ native scan identifiers.
124+ - Missing precursor m/z or search-engine scores produced ` NaN ` basic features instead of the
125+ documented ` 0 ` values because float ` NaN ` values were not detected by the existing ` None `
126+ checks.
127+ - DeepLC multitask models always used prediction head 0 instead of selecting the head that best
128+ matched each run.
129+ - Mumble-generated candidate PSMs leaked into DeepLC and IM2Deep calibration-set selection
130+ because they inherited the original PSM's score and q-value. Generated candidates are now
131+ excluded using ` get_original_hit_mask() ` .
132+ - Configured IM2Deep reference datasets were incorrectly reported as missing because the
133+ file-existence check was inverted.
95134- ` processes=-1 ` (ms2rescore default) passed to DeepLC ` num_threads ` , which requires a positive
96135 integer or ` None ` .
97136- Q-value NaN check in ` parse_psms.py ` failed when ` qvalue ` array contained ` None ` values.
98- - ` BrokenExecutor ` not caught in mokapot rescoring engine.
99137- Fragment mass tolerance fallback defaults in ` core.py ` incorrectly set to ` 20.0 ppm ` instead
100138 of ` 0.02 Da ` .
139+ - Empty or partial ` rescoring ` configuration dictionaries could raise ` KeyError ` instead of
140+ falling back to ristretto defaults.
101141- GUI runs never wrote an HTML log file (` <prefix>.log.html ` ), unlike CLI runs -- the GUI's
102142 logging setup only ever attached a plain text-file handler.
103143
144+
104145## [ 3.3.0a1] - 2026-04-09
105146
106147### Added
0 commit comments