Skip to content

OpenMS integration upgrade: direct vendor input, ProSE default, in-process Percolator, distributed LFQ feature finding - #740

Draft
jpfeuffer wants to merge 12 commits into
bigbio:devfrom
jpfeuffer:jpfeuffer-openms-integration-upgrade
Draft

jpfeuffer wants to merge 12 commits into
bigbio:devfrom
jpfeuffer:jpfeuffer-openms-integration-upgrade

Conversation

@jpfeuffer

@jpfeuffer jpfeuffer commented Oct 8, 2026 •

Copy link
Copy Markdown
Collaborator

Description

OpenMS integration upgrade (closes #739 for the distributed feature finding part).

  • Direct vendor input
  • ProSE is the default search engine (--search_engines prose)
  • Bruker .d needs no Bruker SDK. OpenMS computes m/z from the .d MzCalibration table with per-frame temperature correction ([FIX,IO] BrukerTimsFile: compute m/z from the MzCalibration table OpenMS/OpenMS#10469, merged) and 1/K0 with the rational TimsCalibration model. On a public timsTOF Pro HeLa run this matched the SDK's tims_index_to_mz exactly (max 0.0000 ppm over 81,181 peaks). quantms has no SDK check, so .d input works on amd64 and arm64. If a user supplies an SDK (OPENMS_BRUKER_SDK_PATH, [FIX,IO] BrukerTimsFile: use an optional Bruker SDK for m/z too (follow-up to #10469) OpenMS/OpenMS#10460), OpenMS uses it; the image does not ship one. Only TDF .d is supported (not TSF/BAF).
  • Percolator runs in-process for Comet/Sage/MS-GF+ (-use_subprocess false, with a log check). Peptide/protein-level FDR still requires the external binary; this is an OpenMS limitation and is documented.
  • Distributed LFQ feature finding
    • One PROTEOMICSLFQ_DETECT task per run (-detect_only -feat_dir) writes .featureParquet checkpoints. A combining PROTEOMICSLFQ task (-feat_dir) then does alignment, linking, inference, FDR and quantification.
    • Feature-finding args are shared, so the checkpoint fingerprints match.
    • The FASTA is copied with a fixed mtime, because checkpoints stamp the database by size and mtime.
    • With -resume, changing FDR/inference/quant params re-runs only the combine task.
    • New --lfq_distributed_featurefinding (default true).
  • Batching (0a404f7)
    • ProSE searches all runs that share search settings and database in one task per compatible group by default. The group key is structured: enzyme, mods, tolerances, charges, instrument/PeptDeep settings and database. The fragment index is built once per task.
      • Optional, mutually exclusive: --prose_batch_size N (max runs per task) or --prose_batches N (balanced task count per group, capped at the group size).
      • Each run keeps its own PeptDeep calibration, Percolator model and PSM FDR. Search protein FDR is disabled (-Search:FDR:protein 0), and model transfer or pooling between runs is rejected, so results do not depend on batching.
      • The task verifies every output: hits > 0, Percolator scores and a PEP for every hit, its own input referenced, and PeptDeep features when enabled.
      • Outputs are mapped back to the per-run channels; duplicate run IDs or file stems are an error.
    • ProteomicsLFQ detection keeps one run per task by default and streams as soon as each run's IDs are ready. Optional --lfq_feature_batch_size N or --lfq_feature_batches N puts several runs into one -detect_only call. Combine is unchanged.
    • Trade-off: a batch is the retry and -resume unit. A change to any run or to the batch composition reruns the whole batch, and memory scales with the batch. Invalid values (both given, 0, negative, fractional, boolean) fail at startup.
  • Parquet: dropped the unused mzTab intermediates from ProteomicsLFQ and IsobaricWorkflow; QPX/idparquet are the artifacts.
  • ConsensusID removed ([REMOVE] ConsensusID and the ConsensusIDAlgorithm classes OpenMS/OpenMS#10619): quantms no longer invokes it (multi-engine results are combined by quantms-rescoring). The retired consensusid_algorithm, min_consensus_support, consensusid_considered_top_hits and consensusid_debug params now fail at startup with an explicit message instead of an nf-schema warning. While adding this, validateInputParameters() turned out never to be called (so the existing ms2features_range check was dead); main.nf now calls it.
  • New test_lfq_prose profile (PXD007058 phospho RAW files, no conversion) added to CI. The profiles that need mzML now set convert_raw = true.

Dependencies (OpenMS PRs, all from jpfeuffer/OpenMS)

All modules are pinned by digest to the official OpenMS dev build develop-2026.10.28-f940a46542 (containerdeploy run 40679593583, develop @ f940a46542 = merge of OpenMS/OpenMS#10450, run_tests=true, all jobs passed; tools report Revision: f940a46):

  • Docker ghcr.io/openms/openms-tools-thirdparty@sha256:c9b4b871f8c5edcc588ffa7759eb709eb827713e44c003066b6436bae5899637 (amd64 e31f0ab1…, arm64 ad6e78d1…)
  • SIF oras://ghcr.io/openms/openms-tools-thirdparty-sif@sha256:0cdb19e52d3ff534390ffdedcb19c242fe30ae3b3dcd0e47c1ca1788030a8cac (same run, built from that Docker tag)

The mutable latest nightly predated #10450, so a dedicated build was made. It contains every PR below, plus OpenMS/OpenMS#10714 and #10745. Compared with the previous pin (2026-10-27 nightly, bd790fca41), only ProSE's interface changed (new -out, Search:percolator:max_train_psms); every other tool's INI is identical. Follow-up: bigbio/quantms-containers#32 retags this exact index (multi-arch) and SIF as ghcr.io/bigbio/openms-tools-thirdparty:2026.10.28; #740 switches to that tag once it is merged.

PR Status Purpose
OpenMS/OpenMS#9975 (timosachsenberg) merged ProSE PeptDeep (ONNX) prediction-based rescoring features
OpenMS/OpenMS#10450 merged ProSE native -out *.idparquet (used)
OpenMS/OpenMS#10745 (timosachsenberg) merged ProSE per-file outputs equal the merged split
OpenMS/OpenMS#10578 merged ProSE rescoring moved into ProSEAlgorithm, -rescore → -Search:rescore
OpenMS/OpenMS#10462 merged Docker: ONNX Runtime 1.30.0 (WITH_ONNX=ON), PeptDeep models; no Bruker SDK
OpenMS/OpenMS#10460 merged Optional, user-supplied Bruker SDK for m/z + 1/K0 on top of #10469 (not needed by quantms)
OpenMS/OpenMS#10486 merged ProteomicsLFQ: protein_quantification in the feature-checkpoint fingerprint (fixes #10481); quantms still passes the mode to detection, since a mismatch is now refused
OpenMS/OpenMS#10469 merged Bruker .d: SDK-free m/z from the MzCalibration table
OpenMS/OpenMS#10461 merged PeptDeep hard-fail (no ONNX / missing model / 0 predicted PSMs)
OpenMS/OpenMS#10465 merged Install the versioned ONNX Runtime library
OpenMS/OpenMS#10449 merged ProSE in-process rescoring (flag later replaced by #10578)
OpenMS/OpenMS#10453 merged ProteomicsLFQ duplicate features for ProSE positional isomers (QPX export)
OpenMS/OpenMS#10452 merged Thermo RAW via symlinks (workaround removed)
OpenMS/OpenMS#10455 merged IsobaricWorkflow reads .raw/.d (follow-up: direct vendor input for TMT/iTRAQ)
OpenMS/OpenMS#10454 merged Protein abundances 0 for run stems containing dots
OpenMS/OpenMS#10457 merged IdXMLFile builds without OpenMP

Review fixes (d75cc3f)

  • Distributed detection receives -protein_quantification through the shared feature args, so detection and combine use the same mode and -resume re-detects when --protein_quant changes (ProteomicsLFQ checkpoints lose theoretical peptide uniqueness when changing protein quantification mode OpenMS/OpenMS#10481). Verified with --protein_quant strictly_unique_peptides.
  • ProSE honours --run_fdr_cutoff after its internal rescoring and rejects values <= 0, since ProSE reads 0 as "off".
  • --decoy_string is forwarded as -Search:decoy_prefix and matched as either prefix or suffix. A new nf-test covers both positions, and a negative control without the flag fails.
  • --fdr_level other than psm_level_fdrs is rejected at startup with ProSE.

Notes / blockers

  • External publication: the pin is an OpenMS-registry digest until Retag OpenMS dev build develop-2026.10.28-f940a46542 as openms-tools-thirdparty:2026.10.28 quantms-containers#32 is merged and the bigbio retag exists. All OpenMS PRs are merged.
  • CI: the earlier Singularity test_lfq failures were caused by GitHub raw returning HTTP 504 for BSA1_F2.mzML during the unchanged upstream input-existence check. Both Nextflow versions failed at the same moment, in both attempts. They were not caused by this PR. On HEAD 1afcff8 every CI check passes: all Docker and Singularity profiles on 25.10.4 and latest-everything, pre-commit, and nf-core lint.
  • Thermo: the image redistributes the Thermo RawFileReader under Thermo's license.

Validation

With the official dev build f940a46542 (c0b659c, test_localize threshold fix 843a60d), macOS arm64 (native arm64 image), Nextflow 25.10.4:

  • Image: ProSE Revision: f940a46. -out accepts idXML/idparquet, -out_idxml is a deprecated alias, and -out_merged accepts idparquet. libonnxruntime.so.1 is linked, peptdeep_{ms2,rt,ccs}_dynamic.onnx are present, ConsensusID is absent, and there is no Bruker SDK. All module flags were checked against the build's INIs.
  • test_lfq_prose,docker (Thermo RAW read directly through the staged symlink, ProSE, distributed LFQ, QPX, pmultiqc): passed (9 tasks, 6m22s). Per run:
    • Predicted features added: 1171 / 1171 PSMs (1144 / 1144), NCE=26
    • Rescoring … PSMs in-process with 33 features.
    • Percolator : rescored 1 / 1 file(s)
    • native *_prose.idparquet bundle (psms/proteins/protein_groups/search_params), no idXML
    • detect: 1 run(s) detected; combine: Feature checkpoints: 2 reused, 0 detected.
    • Outputs: QPX parquet, h5mu, MSstats input, pmultiqc report.
  • test_lfq,docker --search_engines comet (Comet → in-process PercolatorAdapter → distributed LFQ → QPX): passed (29 tasks), which also exercises the new validateInputParameters() call.
  • ProSE nf-test (modules/local/openms/prose/tests/main.nf.test, custom QMSD_ prefix and _QMSD suffix decoys, native idparquet): 2/2 passed.
  • Retired params: --consensusid_algorithm best --min_consensus_support 1 exits 1 with the explicit message.
  • Zero hits: ProSE on a RAW against a non-matching DB exits 0, writes an empty idparquet bundle and logs Skipping Percolator rescoring … Only 0 PSMs / Percolator : rescored 0 / 1 file(s). The quantms module then fails explicitly ("did not rescore"); this is intended.
  • Vendor reads through symlinks: FileConverter read a symlinked .raw and a symlinked Bruker .d (timsTOF Pro HeLa, 57,003 spectra, MzCalibration table … per-frame temperature correction, rational 1/K0, no SDK). On amd64 the MzCalibration m/z previously matched the SDK exactly (0.0000 ppm, 81,181 peaks).
  • Batching (0a404f7), local Docker, pinned image:
    • New function nf-tests: 20/20 passed.
    • PROSE module nf-tests: 3/3 passed. This includes a 2-run batch: one index build, rescored 2 / 2, and per-run PeptDeep features (170/170, 161/161).
    • test_lfq_prose on local RAWs, default (1 ProSE task for 2 runs) vs --prose_batch_size 1: per-run idparquet PSMs, proteins and search params are identical apart from run_identifier/date timestamps. msstats and QPX feature/psm are identical; QPX pg is identical up to row order and pg_id.
    • --lfq_feature_batch_size 2: 1 detect task, outputs identical.
    • Resume: a protein-FDR-only change keeps ProSE and detection cached. --feature_with_id_min_score reruns detection only.
    • A single ProSE batch with one Thermo RAW and one Bruker .d: exit 0, rescored 2 / 2, PeptDeep features on every PSM (189/189, 498/498).
    • test_lfq (Comet + Sage + PSM_CLEAN, PSM_CLEAN on the host because the rescoring image pull kept failing): passed.
    • No speed claim: the index build takes 0.41 s on the test DB.
  • nextflow lint and pre-commit on the changed files: clean. The pre-existing exceptions are the non-executable outdir hook and a channel lint error in the untouched nf-core utils_nfcore_pipeline, which is identical to dev.
  • test_localize (Comet+MS-GF+ → PSM_CLEAN merge → in-process Percolator → ONSITE), mzML pre-converted with FileConverter and PSM_CLEAN 0.0.24 run on the host: passed. On CI (c0b659c) rep2 failed with High-scoring PSMs for training: 0. On this tiny dataset Percolator falls back to its default vector (Found 0 test set PSMs with q<0.01. Resetting score vector), which also happens with the external percolator binary and with the Oct 9 image. All PEPs are then roughly constant (0.666 / 0.673 / 0.676 on arm64, amd64 and external), so ONSITE's 1-PEP > 0.3 cut flipped between platforms. 843a60d lowers the profile's onsite_modeling_score_threshold to 0.01 and documents why. This profile is a smoke test for localization.
  • CI test_dda_id_fine_tuning failure (run 40698624889) verified as a PRIDE FTP Connection reset while staging the RAW input, not related to this PR.
  • Not run locally: the PSM_CLEAN container image (5.8 GB, amd64-only) and the Singularity profiles. CI covers both.

PR checklist

  • This comment contains a description of changes (with reason).
  • If you've fixed a bug or added code that should be tested, add tests! (test_lfq_prose profile + CI matrix)
  • If you've added a new tool - have you followed the pipeline conventions in the contribution docs
  • If necessary, also make a PR on the bigbio/quantms branch on the nf-core/test-datasets repository. (not needed: uses existing quantms-test-datasets)
  • Make sure your code lints (nf-core pipelines lint). (only pre-existing failures)
  • Ensure the test suite passes (nextflow run . -profile test,docker --outdir <OUTDIR>). (see Validation; needs the official OpenMS image pin before merge)
  • Check for unexpected warnings in debug mode (nextflow run . -profile debug,test,docker --outdir <OUTDIR>). (not run)
  • Usage Documentation in docs/usage.md is updated.
  • Output Documentation in docs/output.md is updated.
  • CHANGELOG.md is updated.
  • README.md is updated (including new tool citations and authors/contributors).

@coderabbitai

coderabbitai Bot commented Oct 8, 2026 •

Copy link
Copy Markdown
Contributor

Important

Draft PR not reviewed

Draft PRs are not automatically reviewed by default.

  • Trigger a manual review

To automatically review draft PRs, update your CodeRabbit configuration:

reviews:
  auto_review:
    drafts: true
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

github-actions Bot commented Oct 8, 2026 •

Copy link
Copy Markdown

nf-core pipelines lint overall result: Passed ✅ ⚠️

Posted for pipeline commit 0a404f7

+| ✅ 117 tests passed       |+
#| ❔  18 tests were ignored |#
#| ❔   1 tests had warnings |#
!| ❗   7 tests had warnings |!
Details

❗ Test warnings:

  • pipeline_todos - TODO string in nextflow.config: Optionally, you can add a pipeline-specific nf-core config at https://github.com/nf-core/configs
  • pipeline_todos - TODO string in CONTRIBUTING.md: Add any pipeline specific contribution guidelines here, such as coding styles, procedures, checklists etc.
  • pipeline_todos - TODO string in base.config: Check the defaults for all processes
  • pipeline_todos - TODO string in base.config: Customise requirements for specific processes.
  • pipeline_todos - TODO string in nextflow.config: Specify any additional parameters here
  • pipeline_if_empty_null - ifEmpty(null) found in /home/runner/work/quantms/quantms/subworkflows/local/id/main.nf: _ ch_software_versions = ch_software_versions.mix(PHOSPHO_SCORING.out.versions.ifEmpty(null))
    _
  • pipeline_if_empty_null - ifEmpty(null) found in /home/runner/work/quantms/quantms/subworkflows/local/dda_id/main.nf: _ ch_software_versions = ch_software_versions.mix(PHOSPHO_SCORING.out.versions.ifEmpty(null))
    _

❔ Tests ignored:

❔ Tests fixed:

✅ Tests passed:

Run details

  • nf-core/tools version 4.1.0
  • Run at 2026-10-28 17:03:36

jpfeuffer and others added 5 commits October 9, 2026 08:26
…r, distributed LFQ feature finding

- Read Thermo .raw and Bruker .d directly with OpenMS (no conversion by default);
  --convert_raw keeps ThermoRawFileParser for mzML-only steps, with explicit errors otherwise.
- Add OpenMS ProSE as default search engine with internal Percolator rescoring
  (no separate rescoring step; fails if ProSE did not rescore), idparquet output.
- Enforce in-process PercolatorAdapter rescoring for Comet/Sage/MS-GF+.
- Distribute ProteomicsLFQ feature finding per run with -detect_only/-feat_dir
  feature checkpoints and a combining ProteomicsLFQ task (bigbio#739); new
  --lfq_distributed_featurefinding parameter.
- Drop unused mzTab intermediates from ProteomicsLFQ and IsobaricWorkflow.
- Add test_lfq_prose profile and CI matrix entries; update schema and docs.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…K m/z enforcement

ProSE now runs with -Search:peptdeep:enable (new --prose_peptdeep, default true,
and --prose_peptdeep_instrument) and fails if no predicted features were added.
Modules reading Bruker .d input fail unless OpenMS used the Bruker TDF SDK for
m/z calibration (open-source approximation is up to ~37 ppm off).

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…h direct idparquet output

Pins all OpenMS modules to ghcr.io/jpfeuffer/openms-tools-thirdparty:quantms-onnx-bruker
(ONNX Runtime, PeptDeep models, Bruker TDF SDK; OpenMS #9975, #10449, #10450, #10452-#10455,
-out, removing the external percolator binary and the IDFileConverter step.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@jpfeuffer
jpfeuffer force-pushed the jpfeuffer-openms-integration-upgrade branch from 9ee9d10 to a3e87c9 Compare October 9, 2026 06:29
jpfeuffer and others added 2 commits October 9, 2026 08:29
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

@timosachsenberg timosachsenberg left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed 1afcff8 against the OpenMS implementation used by the pinned image and current OpenMS develop. Four correctness issues need attention before merging.

The checkpoint/strict-uniqueness issue belongs in OpenMS; I opened OpenMS/OpenMS#10481 with the cause, a reproducer based on the existing TOPP fixtures, the metadata/memory/output tradeoffs, and the regression tests. The other three findings can be addressed in quantms.

Validation here is source-level; I have not run the pipeline or the OpenMS reproducer locally.

Comment thread modules/local/openms/prose/main.nf Resolved
Comment thread workflows/quantms.nf Resolved
Comment thread modules/local/openms/prose/main.nf Resolved
@chunxubioinfor

Copy link
Copy Markdown

HI @jpfeuffer , I was trying to update it but saw you have already worked on it. Thank you for picking this up so quickly!

I tested the distributed LFQ part of this PR on real data and wanted to share the results in case they're useful.

Setup

  • PR head 1afcff89 with your quantms-onnx-v2 image.
  • PXD001819: 3 Thermo .raw runs
  • --search_engines comet.
  • Apptainer on a shared 64-core box, capped at 16 CPUs / 96 GB, with detect tasks set to 4 CPUs so the LFQ stage has the same 12-CPU budget in both modes.
  • The only change between the two runs is lfq_distributed_featurefinding false vs true. The second run uses -resume.

Results

  • Both runs completed end to end and the distributed proteomicsLFQ functions perfectly!!
  • LFQ stage timing and memory:
distributed off distributed on
wall 468 s (1 task, 12 CPU) 177 s: slowest detect task 171 s + combine 6.4 s
peak RSS 4.8 GB 3.3 GB per detect task, 0.24 GB combine

So it would indeed save lots of time if we scale up. :) Thank you!

…/decoy params)

- Pass -protein_quantification to distributed detection via shared feature args
  (OpenMS#10481); -resume re-detects when --protein_quant changes
- ProSE: honour --run_fdr_cutoff (reject <= 0), forward --decoy_string as
  -Search:decoy_prefix, reject non-PSM --fdr_level at startup
- nf-test for custom decoy prefix/suffix with ProSE

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copy link
Copy Markdown

Heads-up from the OpenMS side for when the image pin moves to an official OpenMS build. OpenMS/OpenMS#10578 moves ProSE's Percolator rescoring into ProSEAlgorithm. It turns rescoring on by default through the new parameter -Search:rescore (default true) and removes the -rescore flag. ProSE built from that PR stops at the old flag:

Unknown option(s) '[-rescore]' given. Aborting!

It exits with code 6.

  • Change needed: once the image includes #10578, drop -rescore from modules/local/openms/prose/main.nf (line 53). Rescoring stays on by default; pass -Search:rescore true if you want it explicit.
  • Log check: the Percolator +: rescored 1 / 1 file check still matches the report line ProSE prints with #10578.
  • No command line works with both images: the current pin (quantms-onnx-v2, built before #10578) still needs -rescore, and it doesn't know -Search:rescore. So the flag has to change together with the pin bump.

Generated by Claude Code

- Pin all OpenMS modules (Docker and SIF) by digest to the OpenMS nightly
  of 2026-10-27 (develop bd790fca41): includes #9975, #10462, #10469,
  #10578, #10486 and the ProteomicsLFQ/Percolator/QPX fixes; no Bruker SDK.
  Follow-up: switch to the bigbio retag 2026.10.27
  (bigbio/quantms-containers#32).
- ProSE: -rescore was removed (OpenMS#10578); pass -Search:rescore true.
  ProSE -out .idparquet (OpenMS#10450) is not merged, so write -out_idxml
  and convert to .idparquet with IDFileConverter in the same task.
- Remove stale ConsensusID mentions (docs, schema help, test_localize).

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@jpfeuffer

Copy link
Copy Markdown
Collaborator Author

Re your heads-up (#740 (comment)): thanks, done in efd3a89, together with the pin bump.

  • The pin moves to the official nightly of 2026-10-27 (develop bd790fca41, includes [API,PARAM,TEST] ProSE: Percolator rescoring in ProSEAlgorithm, on by default OpenMS/OpenMS#10578), by digest for Docker and SIF. Retag OpenMS dev build develop-2026.10.28-f940a46542 as openms-tools-thirdparty:2026.10.28 quantms-containers#32 retags it as 2026.10.27, and this PR switches to that tag once it is merged.
  • -rescore is gone; the module now passes -Search:rescore true explicitly. The Percolator +: rescored 1 / 1 file check still matches: [ProSE] Percolator : rescored 1 / 1 file(s).
  • Because #10450 isn't merged, ProSE writes -out_idxml and the same task converts it to .idparquet. That conversion goes away once #10450 lands. Per your comment, #10450 is rebased onto develop and verified to compose with #10745; please merge #10745 first.
  • Validated on the nightly:
    • ProSE nf-test with custom prefix and suffix decoys passes.
    • test_lfq_prose passes: PeptDeep 1171/1171 PSMs, 33 features, rescored 1/1, both LFQ checkpoints reused.
    • test_lfq passes with Comet and in-process Percolator.
    • .d reads without the SDK on arm64.

- Repin all OpenMS modules to develop-2026.10.28-f940a46542 (containerdeploy
  run 40679593583; Docker index c9b4b871..., SIF 0cdb19e5...), which contains
  OpenMS#9975, #10462, #10745 and #10450.
- ProSE: -out *_prose.idparquet natively; drop the interim idXML +
  IDFileConverter step.
- Remove the vendor-file readlink workaround; the image reads symlinked
  .raw and .d inputs directly.
- ConsensusID (removed in OpenMS#10619): fail on retired consensusid_* /
  min_consensus_support params, and actually call validateInputParameters.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@jpfeuffer
jpfeuffer force-pushed the jpfeuffer-openms-integration-upgrade branch from 86400d7 to c0b659c Compare October 28, 2026 12:34
… PEPs

Percolator falls back to its default vector on the tiny CI phospho dataset
(also with the external binary and the Oct 9 image), yielding near-constant
PEPs around 0.67-0.75; a 1-PEP threshold of 0.3 flipped between platforms.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@jpfeuffer

Copy link
Copy Markdown
Collaborator Author

Progress update: ProSE / ProteomicsLFQ batching (work in progress)

State: the pushed head is still 843a60df. The batching work is local and uncommitted (13 files, +413/−68, plus a new nf-test file). It is not pushed yet, so CI on this PR does not cover it yet.

What is implemented (local)

  • ProSE: by default, all runs that share search settings and database are searched in one task per compatible group. The grouping key is structured and covers enzyme, modifications, tolerances, instrument settings and database.
    • Optional controls, mutually exclusive: --prose_batch_size N or --prose_batches N.
    • The module passes multiple -in and the matching per-run -out .idparquet, and sets -Search:FDR:protein 0, so protein FDR is not pooled across a batch.
    • Results are mapped back to the existing per-run channels by file stem. Duplicate run IDs or duplicate stems within a batch raise an error.
  • Per-run checks inside each ProSE batch:
    • files_failed: 0 and rescored N / N.
    • Any model transfer or pooling between runs is rejected.
    • Each output has hits > 0, is Percolator-scored, has a PEP for every hit, references its own input and, when PeptDeep is enabled, has predicted features (ms2_cosine).
  • ProteomicsLFQ distributed detection:
    • Defaults to one run per task, streamed without waiting for all runs.
    • Optional --lfq_feature_batch_size N or --lfq_feature_batches N puts several runs into one -detect_only call.
    • The task checks that the checkpoint count and the logged detected+reused count both equal the number of runs.
    • The combine step is unchanged.
  • Parameter validation rejects size and count given together, zero, negative, fractional and boolean values.
  • Schema, nextflow.config, usage/output docs, CHANGELOG and meta.yml are updated.

Validation done locally (completed)

  • nextflow lint passes on all 21 changed files. The prettier, whitespace and EOF hooks pass. Two pre-commit hooks fail, as they did before these changes: a non-executable .hooks/block_pipeline_outdir.sh and an nf-core utils channel lint error.
  • New function nf-tests: 20/20 pass. They cover defaults, size and count, uneven batches, count > N, per-group batching, invalid options, duplicate IDs and stems, path strings, and output-to-run mapping.
  • PROSE module nf-tests in Docker with the pinned image: 3/3 pass, including a 2-run batch. That batch builds the index once, calibrates and rescores each run on its own, and logs per-run predicted features (170/170 and 161/161).
  • End-to-end test_lfq_prose on local RAWs, Docker, pinned image sha256:c9b4b871…:
    • Default (1 ProSE batch of 2) compared with --prose_batch_size 1: per-run idparquet PSMs, proteins and search params are identical; the only differences are run_identifier and date timestamps. msstats, QPX feature and QPX psm are identical; QPX pg is identical up to row order and pg_id.
    • --lfq_feature_batch_size 2 gives 1 detect task (2 detected) and identical msstats and QPX outputs.
    • Resume: changing only protein FDR leaves ProSE and detection cached. Changing feature_with_id_min_score reruns detection, and ProSE stays cached.
  • Tool-level mixed vendor batch, Thermo RAW + Bruker timsTOF .d in one ProSE call, using the pipeline's generated command:
    • Exit 0, one index build, rescored 2 / 2.
    • Per run: RAW 189 PSMs, all with predicted features; .d 498 PSMs, all with predicted features (MzCalibration m/z, no SDK).

Running / not done

  • The test_lfq (Comet + PSM_CLEAN) regression is still running locally with no errors so far. Its first attempt failed on a transient GitHub raw fetch.
  • Singularity is not available locally, so SIF coverage will only come from CI.
  • Speed: there are no meaningful ProSE batching measurements. On this 2-run test dataset the index build takes 0.41 s, so I am not claiming a speedup. Wall time was 6.7 s for 1 task of 2 runs vs 3.5 s + 3.8 s for 2 tasks; peak RSS was 949 MB vs 328 and 364 MB. Earlier external evidence for distributed LFQ detection: 468 s → 177 s on 3 RAWs with equal CPUs.
  • Next: finish the regression, commit, push, update the PR body, and check CI.

Known unrelated CI note: the test_dda_id_fine_tuning failure in run 40698624889 is a PRIDE FTP "Connection reset" during RAW staging, not an OpenMS or pipeline issue.

…teomicsLFQ detection batches

ProSE searches all runs sharing search settings and database in one task by default
(--prose_batch_size / --prose_batches), with per-run rescoring, PSM FDR and predicted
features verified for every output; search protein FDR disabled, model transfer rejected.
Distributed ProteomicsLFQ feature detection can batch runs (--lfq_feature_batch_size /
--lfq_feature_batches); default stays one run per task.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@jpfeuffer

Copy link
Copy Markdown
Collaborator Author

Follow-up: the batching changes are now pushed as 0a404f7, and the PR body is updated. The local Comet/Sage test_lfq regression passed. PSM_CLEAN ran from a host venv because pulling the rescoring image kept failing locally, so this run did not exercise that container. CI on 0a404f7 is running. template_version is failing again, as it did before this push.

@jpfeuffer

Copy link
Copy Markdown
Collaborator Author

@timosachsenberg something is wrong. Prose is slower than MSGF PLUS COMET PLUS LOCALIZATION PLUS EXTERNAL PERCOLATOR RESCORING.

@jpfeuffer

Copy link
Copy Markdown
Collaborator Author

Ok looks like it is PRIDE server that is slow AF @ypriverol

@jpfeuffer

Copy link
Copy Markdown
Collaborator Author

@ypriverol CI timing analysis for test_lfq_prose vs test_localize on 0a404f7.

ProSE is not slower. Most of the wall time in both profiles is spent downloading the two ~190 MB PXD007058 RAW files from PRIDE FTP.

test_localize (MSGF+, Comet, PSM_CLEAN, Percolator, onsite) test_lfq_prose
PRIDE RAW download rep1 ~4 min, rep2 ~9 min ~13 min; rep2 was cut off 3× (Read data length does not match expected size) before succeeding
Search + rescoring rep1: Comet 22 s + MSGF+ 32 s + PSM_CLEAN 2 min 15 s + Percolator + onsite ≈ 3.5 min ProSE (built-in PeptDeep + Percolator): 11.8 s for both files
After last download ~3 min ~2.5 min (SUMMARY_PIPELINE ~1 min)
  • Earlier per-run ProSE CI runs with fast downloads finished in 6.5–8.5 min in total.
  • With the default single ProSE batch, the search waits for both files before it starts, so it cannot overlap rep1 with the rep2 download. That costs under a minute here.
  • In the ProSE runs there was also a 1–3 min gap with no log output before the downloads started (~25 s in older runs). I suspect slow PRIDE responses, but this is not confirmed.

The test_dda_id_fine_tuning (25.10.4) failure has the same cause: PRIDE truncated the rep2 download (407 KB of 195 MB) during THERMORAWFILEPARSER staging, before anything ran on that file. No code change was made and no check was relaxed.

Proposed follow-up: stop downloading these RAWs from PRIDE in CI (cache them or use a smaller mirror in quantms-test-datasets). Optionally, ProSE could also start searching per file while other files are still downloading.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

3 participants