Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@ All notable changes to MuMDIA are recorded here. The format follows
`0.1.0` is the first tagged release of the Rust engine. The superseded
Python implementation remains available at the tag `legacy-python-v1`.

`0.3.0` raises the DeepLC floor to 4.4.0, so every environment must be rebuilt
before upgrading. It also adds multi-head retention-time calibration, off by
default.

`0.2.0` is a minor rather than a patch release: it changes behaviour a user can
see. The default MS2PIP model is `HCDch2`, configurations with out-of-range
numeric values are refused at load instead of running, both TSV reports gain two
Expand All @@ -23,6 +27,20 @@ than a number. Both are recorded in every run's `manifest.json`.

## [Unreleased]

### Fixed

- Nine desktop test fixtures used a fixed temporary directory and deleted it on entry, so
two `cargo test` runs on one machine raced and one lost its files mid-test. They are
unique per process, like every other temporary fixture in the workspace (`docs/14`). Hit
twice while preparing releases; two concurrent runs now both pass.

## [0.3.0] - 2026-09-09

Multi-head retention-time calibration and the DeepLC 4.4.0 floor it needs, plus
the sha2 0.11 bump. `rt_im_train.multihead_calibration` is off by default;
turning it on measured +4.8% stripped peptides on the HYE AIF benchmark and
+14.3% on HYE Astral, at an unchanged empirical decoy fraction.

### Added

- `rt_im_train.multihead_calibration` (default 0, off): calibrate the DeepLC base model
Expand Down
2 changes: 1 addition & 1 deletion bench/pb_eval.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ def main() -> int:
a = ap.parse_args()

user_input = {
"software_version": "0.2.0", "search_engine": "MuMDIA", "search_engine_version": "0.2.0",
"software_version": "0.3.0", "search_engine": "MuMDIA", "search_engine_version": "0.3.0",
"ident_fdr_psm": 0.01, "ident_fdr_peptide": 0.01, "ident_fdr_protein": 0.01,
"enable_match_between_runs": True, "precursor_mass_tolerance": "20 ppm",
"fragment_mass_tolerance": "20 ppm", "enzyme": "Trypsin", "allowed_miscleavages": 1,
Expand Down
2 changes: 1 addition & 1 deletion desktop/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion desktop/src-tauri/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "mumdia-console"
version = "0.2.0"
version = "0.3.0"
edition = "2021"
description = "Desktop interface for the MuMDIA DIA search engine"
license = "Apache-2.0"
Expand Down
13 changes: 9 additions & 4 deletions desktop/src-tauri/src/diann.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1607,7 +1607,11 @@ mod tests {

#[test]
fn the_predicted_parquet_is_found_by_name_or_by_search() {
let dir = std::env::temp_dir().join("mumdia-diann-test-lib");
// Unique per process, like every other temp fixture in the workspace: a fixed name
// plus the delete-on-entry below races a second `cargo test` on one machine
// (docs/14). Hit twice during the 0.2.0 and 0.3.0 releases.
let dir =
std::env::temp_dir().join(format!("mumdia-diann-test-lib-{}", std::process::id()));
let _ = std::fs::remove_dir_all(&dir);
std::fs::create_dir_all(&dir).unwrap();

Expand Down Expand Up @@ -1900,7 +1904,7 @@ mod tests {
// `.speclib`; only an empirical one is Parquet. Without recognising the
// `.speclib`, a successful prediction was reported as "DIA-NN finished but
// wrote no Parquet library" and the user was left with a file nothing reads.
let dir = std::env::temp_dir().join("mumdia-diann-speclib");
let dir = std::env::temp_dir().join(format!("mumdia-diann-speclib-{}", std::process::id()));
let _ = std::fs::remove_dir_all(&dir);
std::fs::create_dir_all(&dir).unwrap();

Expand Down Expand Up @@ -2011,7 +2015,8 @@ mod tests {
// search, and the engine then either rejected the library or accepted a
// partial decoy population -- with no eviction and no way to force a rebuild.
// The marker is written last, after both tables are complete.
let dir = std::env::temp_dir().join("mumdia-diann-halfcache");
let dir =
std::env::temp_dir().join(format!("mumdia-diann-halfcache-{}", std::process::id()));
let _ = std::fs::remove_dir_all(&dir);
std::fs::create_dir_all(&dir).unwrap();

Expand Down Expand Up @@ -2104,7 +2109,7 @@ mod tests {
// `pop()` returned `lib_precursors_targets.parquet` and MuMDIA's own schema
// table was imported as the DIA-NN library, reporting success on a library
// that did not match the FASTA.
let dir = std::env::temp_dir().join("mumdia-diann-anchor");
let dir = std::env::temp_dir().join(format!("mumdia-diann-anchor-{}", std::process::id()));
let _ = std::fs::remove_dir_all(&dir);
std::fs::create_dir_all(&dir).unwrap();

Expand Down
6 changes: 5 additions & 1 deletion desktop/src-tauri/src/run.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1530,7 +1530,11 @@ mod multifile_tests {
// the results screen blank after every experiment. And the counts it does
// yield are experiment-wide: the grouped q columns are grouped across the whole
// experiment, so a per-file reading of them is diluted by ~1/n_runs.
let dir = std::env::temp_dir().join("mumdia-results-experiment");
// Unique per process, like every other temp fixture in the workspace: a fixed name
// plus the delete-on-entry below races a second `cargo test` on one machine
// (docs/14). Hit twice during the 0.2.0 and 0.3.0 releases.
let dir =
std::env::temp_dir().join(format!("mumdia-results-experiment-{}", std::process::id()));
let _ = std::fs::remove_dir_all(&dir);
std::fs::create_dir_all(&dir).unwrap();

Expand Down
12 changes: 8 additions & 4 deletions desktop/src-tauri/src/thermo.rs
Original file line number Diff line number Diff line change
Expand Up @@ -789,7 +789,10 @@ mod tests {
// The collision. A Waters `.raw` directory sent to ThermoRawFileParser fails
// with something unhelpful, and the interface would have offered the wrong
// Install button.
let d = std::env::temp_dir().join("mumdia-thermo-waters");
// Unique per process, like every other temp fixture in the workspace: a fixed name
// plus the delete-on-entry below races a second `cargo test` on one machine
// (docs/14). Hit twice during the 0.2.0 and 0.3.0 releases.
let d = std::env::temp_dir().join(format!("mumdia-thermo-waters-{}", std::process::id()));
let _ = std::fs::remove_dir_all(&d);
std::fs::create_dir_all(d.join("waters.raw")).unwrap();
let p = d.join("waters.raw");
Expand All @@ -802,7 +805,7 @@ mod tests {

#[test]
fn a_d_directory_is_labelled_by_its_contents() {
let d = std::env::temp_dir().join("mumdia-thermo-dlabel");
let d = std::env::temp_dir().join(format!("mumdia-thermo-dlabel-{}", std::process::id()));
let _ = std::fs::remove_dir_all(&d);
let tims = d.join("tims.d");
std::fs::create_dir_all(&tims).unwrap();
Expand All @@ -825,7 +828,8 @@ mod tests {
fn a_zip_entry_that_escapes_the_target_is_refused() {
// A zip is untrusted input even from a trusted publisher. Without the
// `enclosed_name` check this entry would be written outside the target.
let dir = std::env::temp_dir().join("mumdia-thermo-traversal");
let dir =
std::env::temp_dir().join(format!("mumdia-thermo-traversal-{}", std::process::id()));
let _ = std::fs::remove_dir_all(&dir);
std::fs::create_dir_all(&dir).unwrap();
let archive = dir.join("evil.zip");
Expand Down Expand Up @@ -858,7 +862,7 @@ mod tests {

#[test]
fn a_normal_zip_round_trips_with_its_directory_structure() {
let dir = std::env::temp_dir().join("mumdia-thermo-unzip");
let dir = std::env::temp_dir().join(format!("mumdia-thermo-unzip-{}", std::process::id()));
let _ = std::fs::remove_dir_all(&dir);
std::fs::create_dir_all(&dir).unwrap();
let archive = dir.join("ok.zip");
Expand Down
2 changes: 1 addition & 1 deletion desktop/src-tauri/tauri.conf.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"$schema": "https://schema.tauri.app/config/2",
"productName": "MuMDIA",
"version": "0.2.0",
"version": "0.3.0",
"identifier": "be.ugent.compomics.mumdia.console",
"build": {
"frontendDist": "../ui"
Expand Down
2 changes: 1 addition & 1 deletion docs/14_build_test_deploy_gotchas.md
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ mzML, FASTA, and library Parquets remain user data and must be mounted.

**Build configuration.** The workspace declares three members
(`Cargo.toml:3`) sharing one `[workspace.package]` (`Cargo.toml:5-23`): version
`0.2.0`, `edition = "2021"`, `rust-version = "1.96"`, license `Apache-2.0`, plus
`0.3.0`, `edition = "2021"`, `rust-version = "1.96"`, license `Apache-2.0`, plus
the crates.io metadata (description, repository, homepage, keywords, categories)
and `publish = false`. The declared MSRV deliberately tracks
`rust-toolchain.toml` (channel `1.96.1`), which is the only Rust version CI
Expand Down
6 changes: 3 additions & 3 deletions rust/mumdia/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion rust/mumdia/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ resolver = "2"
members = ["crates/mumdia-core", "crates/mumdia-io", "crates/mumdia"]

[workspace.package]
version = "0.2.0"
version = "0.3.0"
edition = "2021"
# Tracks rust-toolchain.toml, which is the only Rust version CI builds and tests.
# A lower floor may well work, but claiming one we do not verify is a guess; lower
Expand Down
30 changes: 15 additions & 15 deletions sbom.cdx.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,16 @@
"metadata": {
"component": {
"type": "application",
"bom-ref": "pkg:cargo/mumdia@0.2.0",
"bom-ref": "pkg:cargo/mumdia@0.3.0",
"name": "mumdia",
"version": "0.2.0",
"version": "0.3.0",
"description": "Clean-room Rust DIA proteomics search engine",
"licenses": [
{
"expression": "Apache-2.0"
}
],
"purl": "pkg:cargo/mumdia@0.2.0"
"purl": "pkg:cargo/mumdia@0.3.0"
},
"tools": [
{
Expand Down Expand Up @@ -1905,10 +1905,10 @@
},
{
"type": "library",
"bom-ref": "pkg:cargo/mumdia-core@0.2.0",
"bom-ref": "pkg:cargo/mumdia-core@0.3.0",
"name": "mumdia-core",
"version": "0.2.0",
"purl": "pkg:cargo/mumdia-core@0.2.0",
"version": "0.3.0",
"purl": "pkg:cargo/mumdia-core@0.3.0",
"description": "Typed configuration, mass model, artifact schemas, and run manifest for MuMDIA",
"licenses": [
{
Expand All @@ -1924,10 +1924,10 @@
},
{
"type": "library",
"bom-ref": "pkg:cargo/mumdia-io@0.2.0",
"bom-ref": "pkg:cargo/mumdia-io@0.3.0",
"name": "mumdia-io",
"version": "0.2.0",
"purl": "pkg:cargo/mumdia-io@0.2.0",
"version": "0.3.0",
"purl": "pkg:cargo/mumdia-io@0.3.0",
"description": "Parquet/JSON artifact layer, content hashing, and logging for MuMDIA",
"licenses": [
{
Expand Down Expand Up @@ -4126,7 +4126,7 @@
]
},
{
"ref": "pkg:cargo/mumdia-core@0.2.0",
"ref": "pkg:cargo/mumdia-core@0.3.0",
"dependsOn": [
"pkg:cargo/serde@1.0.228",
"pkg:cargo/serde_json@1.0.150",
Expand All @@ -4135,12 +4135,12 @@
]
},
{
"ref": "pkg:cargo/mumdia-io@0.2.0",
"ref": "pkg:cargo/mumdia-io@0.3.0",
"dependsOn": [
"pkg:cargo/anyhow@1.0.103",
"pkg:cargo/arrow@59.0.0",
"pkg:cargo/blake3@1.8.5",
"pkg:cargo/mumdia-core@0.2.0",
"pkg:cargo/mumdia-core@0.3.0",
"pkg:cargo/parquet@59.0.0",
"pkg:cargo/serde@1.0.228",
"pkg:cargo/serde_json@1.0.150",
Expand All @@ -4150,15 +4150,15 @@
]
},
{
"ref": "pkg:cargo/mumdia@0.2.0",
"ref": "pkg:cargo/mumdia@0.3.0",
"dependsOn": [
"pkg:cargo/anyhow@1.0.103",
"pkg:cargo/arrow@59.0.0",
"pkg:cargo/blake3@1.8.5",
"pkg:cargo/clap@4.6.1",
"pkg:cargo/mimalloc@0.1.52",
"pkg:cargo/mumdia-core@0.2.0",
"pkg:cargo/mumdia-io@0.2.0",
"pkg:cargo/mumdia-core@0.3.0",
"pkg:cargo/mumdia-io@0.3.0",
"pkg:cargo/mzdata@0.65.5",
"pkg:cargo/parquet@59.0.0",
"pkg:cargo/rayon@1.12.0",
Expand Down