From ba5627d1ceeb3211879f90ea7375f7d60b3b4624 Mon Sep 17 00:00:00 2001 From: Henry Webel Date: Fri, 27 Feb 2026 16:09:32 +0100 Subject: [PATCH 01/20] :art: update schema --- nextflow_schema.json | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index 5356bcc3..845705d6 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -453,7 +453,6 @@ "onsite_add_decoys": { "type": "boolean", "description": "Add decoy modifications for validation", - "default": false, "fa_icon": "fas fa-shield-alt", "help_text": "When enabled, adds decoy modifications for validation. For AScore/PhosphoRS, adds --add-decoys flag. For LucXor, adds PhosphoDecoy(A) to target modifications.", "hidden": true @@ -495,14 +494,12 @@ "onsite_disable_split_by_charge": { "type": "boolean", "description": "Disable splitting PSMs by charge state for lucxor", - "default": false, "fa_icon": "fas fa-ban", "hidden": true }, "onsite_compute_all_scores": { "type": "boolean", "description": "Compute all scores for all candidate sites", - "default": false, "fa_icon": "fas fa-calculator", "hidden": true }, @@ -656,7 +653,6 @@ "type": "boolean", "description": "Force save fine-tuning model", "help_text": "When enabled, Force save fine-tuning model even if retrained model is not better than pretrained model", - "default": false, "fa_icon": "far fa-check-square" }, "epoch_to_train_ms2": { @@ -869,10 +865,10 @@ "help_text": "The normalization is done by using the Median of Ratios. Also the ratios the medians is provided as control measure." }, "reference_channel": { - "type": "string", + "type": "number", "description": "The reference channel, e.g. for calculating ratios.", "fa_icon": "fas fa-list-ol", - "default": "126" + "default": 126.0 }, "iso_debug": { "type": "integer", @@ -1151,7 +1147,7 @@ "description": "Controls the protein inference mode", "fa_icon": "fas fa-list-ol", "enum": [0, 1, 2], - "default": 2 + "default": 2.0 }, "species_genes": { "type": "boolean", @@ -1225,7 +1221,6 @@ "enable_diann_mztab": { "type": "boolean", "description": "Export the DIA-NN and DIA results to mzTab", - "default": false, "fa_icon": "far fa-check-square" } }, From 3b1fbb3d207d72e0a26e0a128e168a44220a6c50 Mon Sep 17 00:00:00 2001 From: Henry Webel Date: Mon, 2 Mar 2026 15:09:48 +0100 Subject: [PATCH 02/20] :wrench: update schema again using command: nf-core pipelines schema build --- nextflow_schema.json | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index 845705d6..1ae66add 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -372,25 +372,25 @@ "type": "number", "description": "The minimum precursor m/z for the in silico library generation or library-free search", "fa_icon": "fas fa-filter", - "default": 400.0 + "default": 400 }, "max_pr_mz": { "type": "number", "description": "The maximum precursor m/z for the in silico library generation or library-free search", "fa_icon": "fas fa-filter", - "default": 2400.0 + "default": 2400 }, "min_fr_mz": { "type": "number", "description": "The minimum fragment m/z for the in silico library generation or library-free search", "fa_icon": "fas fa-filter", - "default": 100.0 + "default": 100 }, "max_fr_mz": { "type": "number", "description": "The maximum fragment m/z for the in silico library generation or library-free search", "fa_icon": "fas fa-filter", - "default": 1800.0 + "default": 1800 }, "db_debug": { "type": "integer", @@ -826,26 +826,26 @@ "min_precursor_intensity": { "type": "number", "description": "Minimum intensity of the precursor to be extracted", - "default": 1.0, + "default": 1, "fa_icon": "fas fa-sliders-h" }, "min_precursor_purity": { "type": "number", "description": "Minimum fraction of the total intensity. 0.0:1.0", - "default": 0.0, + "default": 0, "fa_icon": "fas fa-sliders-h", "help_text": "Minimum fraction of the total intensity in the isolation window of the precursor spectrum" }, "min_reporter_intensity": { "type": "number", "description": "Minimum intensity of the individual reporter ions to be extracted.", - "default": 0.0, + "default": 0, "fa_icon": "fas fa-sliders-h" }, "precursor_isotope_deviation": { "type": "number", "description": "Maximum allowed deviation (in ppm) between theoretical and observed isotopic peaks of the precursor peak", - "default": 10.0, + "default": 10, "fa_icon": "fas fa-sliders-h" }, "isotope_correction": { @@ -865,10 +865,10 @@ "help_text": "The normalization is done by using the Median of Ratios. Also the ratios the medians is provided as control measure." }, "reference_channel": { - "type": "number", + "type": "string", "description": "The reference channel, e.g. for calculating ratios.", "fa_icon": "fas fa-list-ol", - "default": 126.0 + "default": 126 }, "iso_debug": { "type": "integer", @@ -1079,7 +1079,7 @@ "lfq_intensity_threshold": { "type": "number", "description": "The minimum intensity for a feature to be considered for quantification. (default: '1000')", - "default": 1000.0, + "default": 1000, "fa_icon": "fas fa-filter", "help_text": "The minimum intensity for a feature to be considered for quantification. (default: '1000')" }, @@ -1147,7 +1147,7 @@ "description": "Controls the protein inference mode", "fa_icon": "fas fa-list-ol", "enum": [0, 1, 2], - "default": 2.0 + "default": 2 }, "species_genes": { "type": "boolean", From d742c8953a2efe4ae0fbb515aa0439b1d17bd432 Mon Sep 17 00:00:00 2001 From: Henry Webel Date: Mon, 2 Mar 2026 15:10:08 +0100 Subject: [PATCH 03/20] :wrench: bump schema version --- .nf-core.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.nf-core.yml b/.nf-core.yml index 95b21c0d..b7f1d81d 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -23,7 +23,7 @@ lint: modules_config: false multiqc_config: false nextflow_config: false -nf_core_version: 3.5.1 +nf_core_version: 3.5.2 repository_type: pipeline template: author: Yasset Perez-Riverol From b380102e20066130a37b5009b45d09f70188db37 Mon Sep 17 00:00:00 2001 From: Henry Webel Date: Mon, 2 Mar 2026 15:17:50 +0100 Subject: [PATCH 04/20] :bug: not sure how to resolve the schema builder error --- nextflow_schema.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index 1ae66add..57239d55 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -865,7 +865,7 @@ "help_text": "The normalization is done by using the Median of Ratios. Also the ratios the medians is provided as control measure." }, "reference_channel": { - "type": "string", + "type": "number", "description": "The reference channel, e.g. for calculating ratios.", "fa_icon": "fas fa-list-ol", "default": 126 From cba22292d913c4f28a5601f64dcb8398ced88857 Mon Sep 17 00:00:00 2001 From: Henry Webel Date: Tue, 3 Mar 2026 10:47:28 +0100 Subject: [PATCH 05/20] :bug: set reference channel to string - let's hope the next nf-core tools schema builder does not complain --- nextflow_schema.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index dea0ce89..844880ce 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -871,10 +871,10 @@ "help_text": "The normalization is done by using the Median of Ratios. Also the ratios the medians is provided as control measure." }, "reference_channel": { - "type": "number", + "type": "string", "description": "The reference channel, e.g. for calculating ratios.", "fa_icon": "fas fa-list-ol", - "default": 126 + "default": "126" }, "iso_debug": { "type": "integer", From d095ea83ecf6ce5c9da6088c3070f4c98c7f3250 Mon Sep 17 00:00:00 2001 From: Henry Webel Date: Thu, 12 Mar 2026 19:38:37 +0100 Subject: [PATCH 06/20] :wrench: update to fetch SDRF and FASTA files from maintained repo --- conf/tests/test_full_dia.config | 2 +- conf/tests/test_full_lfq.config | 4 ++-- conf/tests/test_full_tmt.config | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/conf/tests/test_full_dia.config b/conf/tests/test_full_dia.config index 61b53189..d67b9ad2 100644 --- a/conf/tests/test_full_dia.config +++ b/conf/tests/test_full_dia.config @@ -25,7 +25,7 @@ params { outdir = './results_dia_full' // Input data - input = 'https://raw.githubusercontent.com/nf-core/test-datasets/quantms/testdata-aws/dia_full/PXD004684.sdrf.tsv' + input = 'https://raw.githubusercontent.com/bigbio/quantms-test-datasets/quantms/testdata-aws/dia_full/PXD004684.sdrf.tsv' database = 'https://raw.githubusercontent.com/bigbio/quantms-test-datasets/quantms/testdata/dia_ci/REF_EColi_K12_UPS1_combined.fasta' min_pr_mz = 450 max_pr_mz = 1080 diff --git a/conf/tests/test_full_lfq.config b/conf/tests/test_full_lfq.config index 4fd77979..3c5a8057 100644 --- a/conf/tests/test_full_lfq.config +++ b/conf/tests/test_full_lfq.config @@ -25,8 +25,8 @@ params { outdir = "./results_lfq_full" // Input data - input = 'https://raw.githubusercontent.com/nf-core/test-datasets/quantms/testdata-aws/lfq_full/PXD001819.sdrf.tsv' - database = 'https://raw.githubusercontent.com/nf-core/test-datasets/quantms/testdata-aws/lfq_full/yeast_2021_04_reviewed.fasta' + input = 'https://raw.githubusercontent.com/bigbio/quantms-test-datasets/quantms/testdata-aws/lfq_full/PXD001819.sdrf.tsv' + database = 'https://raw.githubusercontent.com/bigbio/quantms-test-datasets/quantms/testdata-aws/lfq_full/yeast_2021_04_reviewed.fasta' search_engines = "msgf,comet" add_decoys = true protein_level_fdr_cutoff = 0.01 diff --git a/conf/tests/test_full_tmt.config b/conf/tests/test_full_tmt.config index f834f1ac..fbf93358 100644 --- a/conf/tests/test_full_tmt.config +++ b/conf/tests/test_full_tmt.config @@ -25,8 +25,8 @@ params { outdir = "./results_iso_full" // Input data for full size test - input = 'https://raw.githubusercontent.com/nf-core/test-datasets/quantms/testdata-aws/tmt_full/PXD005486.sdrf.tsv' - database = 'https://raw.githubusercontent.com/nf-core/test-datasets/quantms/testdata-aws/tmt_full/uniprot_E_coli_13spiked_reviewed_2021_04.fasta' + input = 'https://raw.githubusercontent.com/bigbio/quantms-test-datasets/quantms/testdata-aws/tmt_full/PXD005486.sdrf.tsv' + database = 'https://raw.githubusercontent.com/bigbio/quantms-test-datasets/quantms/testdata-aws/tmt_full/uniprot_E_coli_13spiked_reviewed_2021_04.fasta' search_engines = "comet,msgf" protein_level_fdr_cutoff = 0.01 psm_level_fdr_cutoff = 0.01 From 8ba3db2d1ca98ba8732299151935391d9863c5ea Mon Sep 17 00:00:00 2001 From: Henry Webel Date: Fri, 13 Mar 2026 11:24:32 +0100 Subject: [PATCH 07/20] :art: replace remaining links to nf-core/test-datasets --- .github/PULL_REQUEST_TEMPLATE.md | 2 +- nextflow_schema.json | 2 +- tests/nextflow.config | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 32eca5fd..5cd685fc 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -16,7 +16,7 @@ Learn more about contributing: [CONTRIBUTING.md](https://github.com/bigbio/quant - [ ] This comment contains a description of changes (with reason). - [ ] If you've fixed a bug or added code that should be tested, add tests! - [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/bigbio/quantms/tree/master/.github/CONTRIBUTING.md) -- [ ] If necessary, also make a PR on the bigbio/quantms _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository. +- [ ] If necessary, also make a PR on the bigbio/quantms _branch_ on the [bigbio/quantms-test-datasets](https://github.com/bigbio/quantms-test-datasets) repository. - [ ] Make sure your code lints (`nf-core pipelines lint`). - [ ] Ensure the test suite passes (`nextflow run . -profile test,docker --outdir `). - [ ] Check for unexpected warnings in debug mode (`nextflow run . -profile debug,test,docker --outdir `). diff --git a/nextflow_schema.json b/nextflow_schema.json index 844880ce..9f25cc2d 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -1505,7 +1505,7 @@ "type": "string", "fa_icon": "far fa-check-circle", "description": "Base URL or local path to location of pipeline test dataset files", - "default": "https://raw.githubusercontent.com/nf-core/test-datasets/", + "default": "https://raw.githubusercontent.com/bigbio/quantms-test-datasets/", "hidden": true }, "trace_report_suffix": { diff --git a/tests/nextflow.config b/tests/nextflow.config index 07d8a65a..c8731282 100644 --- a/tests/nextflow.config +++ b/tests/nextflow.config @@ -7,8 +7,8 @@ // TODO nf-core: Specify any additional parameters here // Or any resources requirements params { - modules_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/' - pipelines_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/refs/heads/quantms' + modules_testdata_base_path = 'https://raw.githubusercontent.com/bigbio/quantms-test-datasets/modules/data/' + pipelines_testdata_base_path = 'https://raw.githubusercontent.com/bigbio/quantms-test-datasets/refs/heads/quantms' } aws.client.anonymous = true // fixes S3 access issues on self-hosted runners From 8c9a7788612451c6beb040d27e4964412ea1f660 Mon Sep 17 00:00:00 2001 From: Henry Webel Date: Fri, 13 Mar 2026 12:37:07 +0100 Subject: [PATCH 08/20] :art: change last occurence... plus some comment udpates --- conf/tests/test_latest_dia.config | 2 +- nextflow.config | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/conf/tests/test_latest_dia.config b/conf/tests/test_latest_dia.config index eefa5ed8..11ec190b 100644 --- a/conf/tests/test_latest_dia.config +++ b/conf/tests/test_latest_dia.config @@ -40,7 +40,7 @@ process { } withLabel: diann { - container = 'ghcr.io/bigbio/diann:2.1.0' // This docker container is private in for quantms + container = 'ghcr.io/bigbio/diann:2.1.0' // This docker container is in a private registry for bigbio } resourceLimits = [ diff --git a/nextflow.config b/nextflow.config index bdd88169..4f536a94 100644 --- a/nextflow.config +++ b/nextflow.config @@ -56,12 +56,12 @@ params { shuffle_max_attempts = 30 shuffle_sequence_identity_threshold = 0.5 - //// Peak picking if used + // Peak picking if used openms_peakpicking = false peakpicking_inmemory = false peakpicking_ms_levels = null // means all/auto - //// Conversion and mzml statistics flags + // Conversion and mzml statistics flags reindex_mzml = true mzml_statistics = false mzml_features = false @@ -271,7 +271,7 @@ params { help_full = false show_hidden = false version = false - pipelines_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/' + pipelines_testdata_base_path = 'https://raw.githubusercontent.com/bigbio/quantms-test-datasets/' trace_report_suffix = new java.util.Date().format( 'yyyy-MM-dd_HH-mm-ss') // Config options From 51d4c84e6fc37e4267855a1b16df402b0d31bda8 Mon Sep 17 00:00:00 2001 From: Henry Webel Date: Fri, 13 Mar 2026 13:55:21 +0100 Subject: [PATCH 09/20] :sparkles: switch to nf-core/modules for thermorawfileparser --- modules.json | 5 +++++ subworkflows/local/file_preparation/main.nf | 6 +++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/modules.json b/modules.json index 12808036..83e876e5 100644 --- a/modules.json +++ b/modules.json @@ -25,6 +25,11 @@ "branch": "master", "git_sha": "8deffd6a402233ebf905c66dbf804bd4c2637946", "installed_by": ["modules"] + }, + "thermorawfileparser": { + "branch": "master", + "git_sha": "daaecc3478d6f6ad9cb8f48ec7d657ab6c67877f", + "installed_by": ["modules"] } } }, diff --git a/subworkflows/local/file_preparation/main.nf b/subworkflows/local/file_preparation/main.nf index a0f77028..07e05924 100644 --- a/subworkflows/local/file_preparation/main.nf +++ b/subworkflows/local/file_preparation/main.nf @@ -2,7 +2,7 @@ // Raw file conversion and mzml indexing // -include { THERMORAWFILEPARSER } from '../../../modules/bigbio/thermorawfileparser/main' +include { THERMORAWFILEPARSER } from '../../../modules/nf-core/thermorawfileparser/main' include { TDF2MZML } from '../../../modules/local/utils/tdf2mzml/main' include { DECOMPRESS } from '../../../modules/local/utils/decompress_dotd/main' include { MZML_INDEXING } from '../../../modules/local/openms/mzml_indexing/main' @@ -85,8 +85,8 @@ workflow FILE_PREPARATION { // 'log': Path(*.txt)} // Where meta is the same as the input meta - ch_versions = ch_versions.mix(THERMORAWFILEPARSER.out.versions) - ch_results = ch_results.mix(THERMORAWFILEPARSER.out.convert_files) + ch_versions = ch_versions.mix(THERMORAWFILEPARSER.out.versions_thermorawfileparser) + ch_results = ch_results.mix(THERMORAWFILEPARSER.out.spectra) ch_results.map{ it -> [it[0], it[1]] }.set{ indexed_mzml_bundle } From cbd5d6f810cfaac6a0d396c027d4e2b56489c59b Mon Sep 17 00:00:00 2001 From: Henry Webel Date: Fri, 13 Mar 2026 15:19:05 +0100 Subject: [PATCH 10/20] :bug: topic channel vs yaml files - can it be modified for one channel only? --- subworkflows/local/file_preparation/main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/file_preparation/main.nf b/subworkflows/local/file_preparation/main.nf index 07e05924..fc971a77 100644 --- a/subworkflows/local/file_preparation/main.nf +++ b/subworkflows/local/file_preparation/main.nf @@ -85,7 +85,7 @@ workflow FILE_PREPARATION { // 'log': Path(*.txt)} // Where meta is the same as the input meta - ch_versions = ch_versions.mix(THERMORAWFILEPARSER.out.versions_thermorawfileparser) + // ch_versions = ch_versions.mix(THERMORAWFILEPARSER.out.versions_thermorawfileparser) ch_results = ch_results.mix(THERMORAWFILEPARSER.out.spectra) ch_results.map{ it -> [it[0], it[1]] }.set{ indexed_mzml_bundle } From 142cb001427de42206ee1f3b63803aad3a8de497 Mon Sep 17 00:00:00 2001 From: Henry Webel Date: Mon, 16 Mar 2026 08:25:45 +0100 Subject: [PATCH 11/20] :bug: add nf-core/thermorawfileparser --- .../thermorawfileparser/environment.yml | 6 ++ modules/nf-core/thermorawfileparser/main.nf | 50 +++++++++++ modules/nf-core/thermorawfileparser/meta.yml | 71 ++++++++++++++++ .../thermorawfileparser/tests/main.nf.test | 59 +++++++++++++ .../tests/main.nf.test.snap | 84 +++++++++++++++++++ 5 files changed, 270 insertions(+) create mode 100644 modules/nf-core/thermorawfileparser/environment.yml create mode 100644 modules/nf-core/thermorawfileparser/main.nf create mode 100644 modules/nf-core/thermorawfileparser/meta.yml create mode 100644 modules/nf-core/thermorawfileparser/tests/main.nf.test create mode 100644 modules/nf-core/thermorawfileparser/tests/main.nf.test.snap diff --git a/modules/nf-core/thermorawfileparser/environment.yml b/modules/nf-core/thermorawfileparser/environment.yml new file mode 100644 index 00000000..4142d123 --- /dev/null +++ b/modules/nf-core/thermorawfileparser/environment.yml @@ -0,0 +1,6 @@ +channels: + - conda-forge + - bioconda +dependencies: + - "bioconda::thermorawfileparser=1.4.5" + - "conda-forge::mono=6.12.0.90" diff --git a/modules/nf-core/thermorawfileparser/main.nf b/modules/nf-core/thermorawfileparser/main.nf new file mode 100644 index 00000000..bb790b1c --- /dev/null +++ b/modules/nf-core/thermorawfileparser/main.nf @@ -0,0 +1,50 @@ +process THERMORAWFILEPARSER { + tag "$meta.id" + label 'process_low' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/thermorawfileparser:1.4.5--h05cac1d_1' : + 'biocontainers/thermorawfileparser:1.4.5--h05cac1d_1' }" + + input: + tuple val(meta), path(raw) + + output: + tuple val(meta), path("*.{mzML,mzML.gz,mgf,mgf.gz,parquet,parquet.gz}"), emit: spectra + tuple val("${task.process}"), val('thermorawfileparser'), eval("ThermoRawFileParser.sh --version"), emit: versions_thermorawfileparser, topic: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def suffix = args.contains("--format 0") || args.contains("-f 0") ? "mgf" : + args.contains("--format 1") || args.contains("-f 1") ? "mzML" : + args.contains("--format 2") || args.contains("-f 2") ? "mzML" : + args.contains("--format 3") || args.contains("-f 3") ? "parquet" : + "mzML" + suffix = args.contains("--gzip")? "${suffix}.gz" : "${suffix}" + + """ + ThermoRawFileParser.sh \\ + -i $raw \\ + -b ${prefix}.${suffix} \\ + $args + """ + + stub: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def suffix = args.contains("--format 0") || args.contains("-f 0") ? "mgf" : + args.contains("--format 1") || args.contains("-f 1") ? "mzML" : + args.contains("--format 2") || args.contains("-f 2") ? "mzML" : + args.contains("--format 3") || args.contains("-f 3") ? "parquet" : + "mzML" + suffix = args.contains("--gzip")? "${suffix}.gz" : "${suffix}" + + """ + touch ${prefix}.${suffix} + """ +} diff --git a/modules/nf-core/thermorawfileparser/meta.yml b/modules/nf-core/thermorawfileparser/meta.yml new file mode 100644 index 00000000..ecd33189 --- /dev/null +++ b/modules/nf-core/thermorawfileparser/meta.yml @@ -0,0 +1,71 @@ +name: "thermorawfileparser" +description: Parses a Thermo RAW file containing mass spectra to an open file + format +keywords: + - raw + - mzml + - mgf + - parquet + - parser + - proteomics +tools: + - thermorawfileparser: + description: "Wrapper around the .net (C#) ThermoFisher ThermoRawFileReader library + for running on Linux with mono" + homepage: "https://github.com/compomics/ThermoRawFileParser/blob/master/README.md" + documentation: "https://github.com/compomics/ThermoRawFileParser/blob/master/README.md" + tool_dev_url: "https://github.com/compomics/ThermoRawFileParser" + doi: "10.1021/acs.jproteome.9b00328" + licence: ["Apache Software"] + identifier: biotools:ThermoRawFileParser + +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - raw: + type: file + description: Thermo RAW file + pattern: "*.{raw,RAW}" + ontologies: [] +output: + spectra: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - "*.{mzML,mzML.gz,mgf,mgf.gz,parquet,parquet.gz}": + type: file + description: Mass spectra in open format + pattern: "*.{mzML,mzML.gz,mgf,mgf.gz,parquet,parquet.gz}" + ontologies: [] + versions_thermorawfileparser: + - - ${task.process}: + type: string + description: The process the versions were collected from + - thermorawfileparser: + type: string + description: The name of the tool + - ThermoRawFileParser.sh --version: + type: eval + description: The expression to obtain the version of the tool + +topics: + versions: + - - ${task.process}: + type: string + description: The process the versions were collected from + - thermorawfileparser: + type: string + description: The name of the tool + - ThermoRawFileParser.sh --version: + type: eval + description: The expression to obtain the version of the tool + +authors: + - "@jonasscheid" +maintainers: + - "@jonasscheid" diff --git a/modules/nf-core/thermorawfileparser/tests/main.nf.test b/modules/nf-core/thermorawfileparser/tests/main.nf.test new file mode 100644 index 00000000..90f8aa1b --- /dev/null +++ b/modules/nf-core/thermorawfileparser/tests/main.nf.test @@ -0,0 +1,59 @@ +nextflow_process { + + name "Test Process THERMORAWFILEPARSER" + script "../main.nf" + process "THERMORAWFILEPARSER" + + tag "modules" + tag "modules_nfcore" + tag "thermorawfileparser" + + test("proteomics - parse - raw") { + + when { + process { + """ + input[0] = [ + [ id:'test'], // meta map + file(params.modules_testdata_base_path + 'proteomics/msspectra/PXD012083_e005640_II.raw', checkIfExists: true) + ] + """ + } + } + + then { + // The source file path is written at the top of the file, and the checksum at the bottom by the tool, the rest should be identical + def lines = file(process.out.spectra[0][1]).readLines() + assertAll( + { assert process.success }, + { assert snapshot(lines[21..50]).match() } + ) + } + + } + + test("proteomics - parse - raw - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test'], // meta map + file(params.modules_testdata_base_path + 'proteomics/msspectra/PXD012083_e005640_II.raw', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + +} diff --git a/modules/nf-core/thermorawfileparser/tests/main.nf.test.snap b/modules/nf-core/thermorawfileparser/tests/main.nf.test.snap new file mode 100644 index 00000000..a9ad37eb --- /dev/null +++ b/modules/nf-core/thermorawfileparser/tests/main.nf.test.snap @@ -0,0 +1,84 @@ +{ + "proteomics - parse - raw": { + "content": [ + [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.4" + }, + "timestamp": "2025-02-14T11:00:45.572003942" + }, + "proteomics - parse - raw - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.mzML:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + "THERMORAWFILEPARSER", + "thermorawfileparser", + "1.4.5" + ] + ], + "spectra": [ + [ + { + "id": "test" + }, + "test.mzML:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + [ + "THERMORAWFILEPARSER", + "thermorawfileparser", + "1.4.5" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.04.8" + }, + "timestamp": "2026-01-27T17:25:10.402558587" + } +} \ No newline at end of file From c0b3371d6172df6f8f9660297c8313e73ddabb56 Mon Sep 17 00:00:00 2001 From: Henry Webel Date: Mon, 16 Mar 2026 12:43:51 +0100 Subject: [PATCH 12/20] :bug: patch module to adhere to custom mzml_id - create diff for local changes to nf-core module video: https://www.youtube.com/watch?v=7pu6Ikhi1eU docs: https://nf-co.re/docs/nf-core-tools/modules/patch --- modules.json | 3 ++- modules/nf-core/thermorawfileparser/main.nf | 4 +-- .../thermorawfileparser.diff | 26 +++++++++++++++++++ 3 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 modules/nf-core/thermorawfileparser/thermorawfileparser.diff diff --git a/modules.json b/modules.json index 83e876e5..7d688145 100644 --- a/modules.json +++ b/modules.json @@ -29,7 +29,8 @@ "thermorawfileparser": { "branch": "master", "git_sha": "daaecc3478d6f6ad9cb8f48ec7d657ab6c67877f", - "installed_by": ["modules"] + "installed_by": ["modules"], + "patch": "modules/nf-core/thermorawfileparser/thermorawfileparser.diff" } } }, diff --git a/modules/nf-core/thermorawfileparser/main.nf b/modules/nf-core/thermorawfileparser/main.nf index bb790b1c..e1520911 100644 --- a/modules/nf-core/thermorawfileparser/main.nf +++ b/modules/nf-core/thermorawfileparser/main.nf @@ -1,5 +1,5 @@ process THERMORAWFILEPARSER { - tag "$meta.id" + tag "$meta.mzml_id" label 'process_low' conda "${moduleDir}/environment.yml" @@ -19,7 +19,7 @@ process THERMORAWFILEPARSER { script: def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" + def prefix = task.ext.prefix ?: "${meta.mzml_id}" def suffix = args.contains("--format 0") || args.contains("-f 0") ? "mgf" : args.contains("--format 1") || args.contains("-f 1") ? "mzML" : args.contains("--format 2") || args.contains("-f 2") ? "mzML" : diff --git a/modules/nf-core/thermorawfileparser/thermorawfileparser.diff b/modules/nf-core/thermorawfileparser/thermorawfileparser.diff new file mode 100644 index 00000000..99e6acbc --- /dev/null +++ b/modules/nf-core/thermorawfileparser/thermorawfileparser.diff @@ -0,0 +1,26 @@ +Changes in component 'nf-core/thermorawfileparser' +'modules/nf-core/thermorawfileparser/environment.yml' is unchanged +'modules/nf-core/thermorawfileparser/meta.yml' is unchanged +Changes in 'thermorawfileparser/main.nf': +--- modules/nf-core/thermorawfileparser/main.nf ++++ modules/nf-core/thermorawfileparser/main.nf +@@ -1,5 +1,5 @@ + process THERMORAWFILEPARSER { +- tag "$meta.id" ++ tag "$meta.mzml_id" + label 'process_low' + + conda "${moduleDir}/environment.yml" +@@ -19,7 +19,7 @@ + + script: + def args = task.ext.args ?: '' +- def prefix = task.ext.prefix ?: "${meta.id}" ++ def prefix = task.ext.prefix ?: "${meta.mzml_id}" + def suffix = args.contains("--format 0") || args.contains("-f 0") ? "mgf" : + args.contains("--format 1") || args.contains("-f 1") ? "mzML" : + args.contains("--format 2") || args.contains("-f 2") ? "mzML" : + +'modules/nf-core/thermorawfileparser/tests/main.nf.test.snap' is unchanged +'modules/nf-core/thermorawfileparser/tests/main.nf.test' is unchanged +************************************************************ From 8155b05842f4782c77e2ad6c082b9d651a7531e2 Mon Sep 17 00:00:00 2001 From: Henry Webel Date: Mon, 16 Mar 2026 21:49:17 +0100 Subject: [PATCH 13/20] :art: add back in Thermorawfileparser version --- workflows/quantms.nf | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/workflows/quantms.nf b/workflows/quantms.nf index d4ef36bf..75e3d9c1 100644 --- a/workflows/quantms.nf +++ b/workflows/quantms.nf @@ -164,7 +164,26 @@ workflow QUANTMS { // Other subworkflow will return null when performing another subworkflow due to unknown reason. ch_versions = ch_versions.filter { v -> v != null } - softwareVersionsToYAML(ch_versions) + // see https://nf-co.re/docs/tutorials/migrate_to_topics/update_pipelines + // which is used in https://github.com/nf-core/demo/blob/1.1.0/workflows/demo.nf + def topic_versions = channel.topic("versions") + .distinct() + .branch { entry -> + versions_file: entry instanceof Path + versions_tuple: true + } + def topic_versions_string = topic_versions.versions_tuple + .map { process, tool, version -> + [ process[process.lastIndexOf(':')+1..-1], " ${tool}: ${version}" ] + } + .groupTuple(by:0) + .map { process, tool_versions -> + tool_versions.unique().sort() + "${process}:\n${tool_versions.join('\n')}" + } + + softwareVersionsToYAML(ch_versions.mix(topic_versions.versions_file)) + .mix(topic_versions_string) .collectFile( storeDir: "${params.outdir}/pipeline_info", name: 'nf_core_' + 'quantms_software_' + 'mqc_' + 'versions.yml', From 025a90f0c3b944bb4d17235d9392fc0fee3b6037 Mon Sep 17 00:00:00 2001 From: Henry Webel Date: Mon, 23 Mar 2026 08:35:34 +0100 Subject: [PATCH 14/20] :sparkles: switch back to update bigbio Use nf-core to point to bigbio modules repo: nf-core modules --git-remote https://github.com/bigbio/nf-modules.git update thermorawfileparser nf-core modules --git-remote https://github.com/bigbio/nf-modules.git patch thermorawfileparser --- modules.json | 27 +++--- .../thermorawfileparser/environment.yml | 1 - modules/bigbio/thermorawfileparser/main.nf | 79 ++++++++------- modules/bigbio/thermorawfileparser/meta.yml | 96 ++++++++++++------- .../thermorawfileparser/tests/main.nf.test | 11 ++- .../tests/main.nf.test.snap | 56 ++++++----- .../thermorawfileparser.diff | 36 +++++++ .../thermorawfileparser/environment.yml | 6 -- modules/nf-core/thermorawfileparser/main.nf | 50 ---------- modules/nf-core/thermorawfileparser/meta.yml | 71 -------------- .../thermorawfileparser/tests/main.nf.test | 59 ------------ .../tests/main.nf.test.snap | 84 ---------------- .../thermorawfileparser.diff | 26 ----- subworkflows/local/file_preparation/main.nf | 2 +- 14 files changed, 196 insertions(+), 408 deletions(-) create mode 100644 modules/bigbio/thermorawfileparser/thermorawfileparser.diff delete mode 100644 modules/nf-core/thermorawfileparser/environment.yml delete mode 100644 modules/nf-core/thermorawfileparser/main.nf delete mode 100644 modules/nf-core/thermorawfileparser/meta.yml delete mode 100644 modules/nf-core/thermorawfileparser/tests/main.nf.test delete mode 100644 modules/nf-core/thermorawfileparser/tests/main.nf.test.snap delete mode 100644 modules/nf-core/thermorawfileparser/thermorawfileparser.diff diff --git a/modules.json b/modules.json index 7d688145..77a77422 100644 --- a/modules.json +++ b/modules.json @@ -12,8 +12,9 @@ }, "thermorawfileparser": { "branch": "main", - "git_sha": "a1a4a11ff508b2b5c23c9fb21c51c3327b748d4d", - "installed_by": ["modules"] + "git_sha": "53f2d78652a7040e3d44610286471642b1e1b55b", + "installed_by": ["modules"], + "patch": "modules/bigbio/thermorawfileparser/thermorawfileparser.diff" } } } @@ -24,13 +25,9 @@ "multiqc": { "branch": "master", "git_sha": "8deffd6a402233ebf905c66dbf804bd4c2637946", - "installed_by": ["modules"] - }, - "thermorawfileparser": { - "branch": "master", - "git_sha": "daaecc3478d6f6ad9cb8f48ec7d657ab6c67877f", - "installed_by": ["modules"], - "patch": "modules/nf-core/thermorawfileparser/thermorawfileparser.diff" + "installed_by": [ + "modules" + ] } } }, @@ -39,17 +36,23 @@ "utils_nextflow_pipeline": { "branch": "master", "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] }, "utils_nfcore_pipeline": { "branch": "master", "git_sha": "271e7fc14eb1320364416d996fb077421f3faed2", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] }, "utils_nfschema_plugin": { "branch": "master", "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] } } } diff --git a/modules/bigbio/thermorawfileparser/environment.yml b/modules/bigbio/thermorawfileparser/environment.yml index 63b8fc64..dbe6ffe5 100644 --- a/modules/bigbio/thermorawfileparser/environment.yml +++ b/modules/bigbio/thermorawfileparser/environment.yml @@ -1,4 +1,3 @@ -name: thermorawfileparser channels: - conda-forge - bioconda diff --git a/modules/bigbio/thermorawfileparser/main.nf b/modules/bigbio/thermorawfileparser/main.nf index 31ce4d0b..ac6a16f8 100644 --- a/modules/bigbio/thermorawfileparser/main.nf +++ b/modules/bigbio/thermorawfileparser/main.nf @@ -1,62 +1,67 @@ process THERMORAWFILEPARSER { - tag "$meta.mzml_id" + tag "${meta.mzml_id}" label 'process_low' label 'process_single' label 'error_retry' conda "${moduleDir}/environment.yml" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/thermorawfileparser:1.4.5--h05cac1d_1' : - 'biocontainers/thermorawfileparser:1.4.5--h05cac1d_1' }" + container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container + ? 'https://depot.galaxyproject.org/singularity/thermorawfileparser:1.4.5--h05cac1d_1' + : 'biocontainers/thermorawfileparser:1.4.5--h05cac1d_1'}" - stageInMode { - if (task.attempt == 1) { - if (task.executor == "awsbatch") { - 'symlink' - } else { - 'link' - } - } else if (task.attempt == 2) { - if (task.executor == "awsbatch") { - 'copy' - } else { - 'symlink' - } - } else { - 'copy' - } - } input: - tuple val(meta), path(rawfile) + tuple val(meta), path(raw) output: - tuple val(meta), path("*.{mzML,mgf,parquet}"), emit: convert_files - path "versions.yml", emit: versions - path "*.log", emit: log + tuple val(meta), path("*.{mzML,mzML.gz,mgf,mgf.gz,parquet,parquet.gz}"), emit: spectra + tuple val("${task.process}"), val('thermorawfileparser'), eval("ThermoRawFileParser.sh --version"), emit: versions_thermorawfileparser, topic: versions + path "*.log", emit: log + + when: + task.ext.when == null || task.ext.when script: def args = task.ext.args ?: '' + // Detect existing format options in any supported syntax: -f=2, -f 2, --format=2, + // or --format 2. + def hasFormatArg = (args =~ /(^|\s)(-f(=|\s)\d+|--format(=|\s)\d+)/).find() // Default to indexed mzML format (-f=2) if not specified in args - def formatArg = args.contains('-f=') ? '' : '-f=2' + def formatArg = hasFormatArg ? '' : '-f=2' + def prefix = task.ext.prefix ?: "${meta.mzml_id}" + def suffix = args.contains("--format 0") || args.contains("-f 0") + ? "mgf" + : args.contains("--format 1") || args.contains("-f 1") + ? "mzML" + : args.contains("--format 2") || args.contains("-f 2") + ? "mzML" + : args.contains("--format 3") || args.contains("-f 3") + ? "parquet" + : "mzML" + suffix = args.contains("--gzip") ? "${suffix}.gz" : "${suffix}" """ - ThermoRawFileParser.sh -i='${rawfile}' ${formatArg} ${args} -o=./ 2>&1 | tee '${rawfile.baseName}_conversion.log' - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - ThermoRawFileParser: \$(ThermoRawFileParser.sh --version) - END_VERSIONS + ThermoRawFileParser.sh \\ + -i='${raw}' \\ + ${formatArg} ${args} \\ + -o=./ 2>&1 | tee '${prefix}_conversion.log' """ stub: - def prefix = task.ext.prefix ?: "${meta.mzml_id}" def args = task.ext.args ?: '' - // Determine output format from args, default to mzML - // Format 0 = MGF, formats 1-2 = mzML, format 3 = Parquet, format 4 = None - def outputExt = (args =~ /-f=0\b/).find() ? 'mgf' : 'mzML' + def prefix = task.ext.prefix ?: "${meta.mzml_id}" + def suffix = args.contains("--format 0") || args.contains("-f 0") + ? "mgf" + : args.contains("--format 1") || args.contains("-f 1") + ? "mzML" + : args.contains("--format 2") || args.contains("-f 2") + ? "mzML" + : args.contains("--format 3") || args.contains("-f 3") + ? "parquet" + : "mzML" + suffix = args.contains("--gzip") ? "${suffix}.gz" : "${suffix}" """ - touch '${prefix}.${outputExt}' + touch '${prefix}.${suffix}' touch '${prefix}_conversion.log' cat <<-END_VERSIONS > versions.yml diff --git a/modules/bigbio/thermorawfileparser/meta.yml b/modules/bigbio/thermorawfileparser/meta.yml index b6f99c9a..48b7d342 100644 --- a/modules/bigbio/thermorawfileparser/meta.yml +++ b/modules/bigbio/thermorawfileparser/meta.yml @@ -1,10 +1,12 @@ name: thermorawfileparser -description: Convert RAW file to mzML or MGF files +description: Convert RAW file to mzML or MGF files format keywords: - raw - - mzML - - MGF - - OpenMS + - mzml + - mgf + - parquet + - parser + - proteomics tools: - thermorawfileparser: description: | @@ -14,36 +16,66 @@ tools: - `-L` or `--msLevel=VALUE` to select MS levels (e.g., `-L=1,2` or `--msLevel=1-3`) homepage: https://github.com/compomics/ThermoRawFileParser documentation: https://github.com/compomics/ThermoRawFileParser + tool_dev_url: https://github.com/compomics/ThermoRawFileParser + doi: "10.1021/acs.jproteome.9b00328" + licence: + - "Apache Software" + identifier: biotools:ThermoRawFileParser input: - - meta: - type: map - description: | - Groovy Map containing sample information - - rawfile: - type: file - description: | - Thermo RAW file - pattern: "*.{raw,RAW}" + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - raw: + type: file + description: Thermo RAW file + pattern: "*.{raw,RAW}" + ontologies: [] output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'sample1', mzml_id:'UPS1_50amol_R3' ] - - convert_files: - type: file - description: | - Converted files in mzML or MGF format depending on the format parameter (-f). - Format options: 0 for MGF, 1 for mzML, 2 for indexed mzML (default), 3 for Parquet, 4 for None. - pattern: "*.{mzML,mgf,parquet}" - - log: - type: file - description: log file - pattern: "*.log" - - versions: - type: file - description: File containing software version - pattern: "versions.yml" + spectra: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - "*.{mzML,mzML.gz,mgf,mgf.gz,parquet,parquet.gz}": + type: file + description: Mass spectra in open format + pattern: "*.{mzML,mzML.gz,mgf,mgf.gz,parquet,parquet.gz}" + ontologies: [] + versions_thermorawfileparser: + - - ${task.process}: + type: string + description: The process the versions were collected from + - thermorawfileparser: + type: string + description: The name of the tool + - ThermoRawFileParser.sh --version: + type: eval + description: The expression to obtain the version of the tool + log: + - "*.log": + type: file + description: Log file from the conversion process + pattern: "*.log" + ontologies: [] +topics: + versions: + - - ${task.process}: + type: string + description: The process the versions were collected from + - thermorawfileparser: + type: string + description: The name of the tool + - ThermoRawFileParser.sh --version: + type: eval + description: The expression to obtain the version of the tool authors: + - "@jonasscheid" + - "@daichengxin" + - "@ypriverol" +maintainers: + - "@jonasscheid" - "@daichengxin" - "@ypriverol" diff --git a/modules/bigbio/thermorawfileparser/tests/main.nf.test b/modules/bigbio/thermorawfileparser/tests/main.nf.test index 355fbb15..c1f8ce95 100644 --- a/modules/bigbio/thermorawfileparser/tests/main.nf.test +++ b/modules/bigbio/thermorawfileparser/tests/main.nf.test @@ -22,8 +22,8 @@ nextflow_process { then { assert process.success - assert snapshot(process.out.versions).match("versions") - assert new File(process.out.convert_files[0][1]).name == 'TMT_Erwinia_1uLSike_Top10HCD_isol2_45stepped_60min_01.mzML' + assert snapshot(process.out.versions_thermorawfileparser).match("versions") + assert new File(process.out.spectra[0][1]).name == 'TMT_Erwinia_1uLSike_Top10HCD_isol2_45stepped_60min_01.mzML' assert process.out.log.size() == 1 } } @@ -36,7 +36,7 @@ nextflow_process { process { """ input[0] = [ - [ id: 'test', mzml_id: 'test_sample' ], + [ id: 'test_sample', mzml_id: 'test_sample' ], file(params.test_data['proteomics']['msspectra']['ups1_50amol_r3'], checkIfExists: false) ] """ @@ -45,8 +45,9 @@ nextflow_process { then { assert process.success - assert snapshot(process.out.versions).match("versions_stub") - assert new File(process.out.convert_files[0][1]).name == 'test_sample.mzML' + assert snapshot(process.out.versions_thermorawfileparser).match("versions_stub") + assert new File(process.out.spectra[0][1]).name == 'test_sample.mzML' + assert snapshot(process.out).match() assert process.out.log.size() == 1 } } diff --git a/modules/bigbio/thermorawfileparser/tests/main.nf.test.snap b/modules/bigbio/thermorawfileparser/tests/main.nf.test.snap index 6562491e..f194dbb4 100644 --- a/modules/bigbio/thermorawfileparser/tests/main.nf.test.snap +++ b/modules/bigbio/thermorawfileparser/tests/main.nf.test.snap @@ -1,26 +1,34 @@ { - "versions": { - "content": [ - [ - "versions.yml:md5,dc9625538c025d615109ef8cac3a86ab" - ] - ], - "meta": { - "nf-test": "0.9.3", - "nextflow": "25.04.8" + "versions_stub": { + "content": [ + [ + [ + "THERMORAWFILEPARSER", + "thermorawfileparser", + "1.4.5" + ] + ] + ], + "timestamp": "2026-03-20T12:41:22.8183", + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } }, - "timestamp": "2025-12-11T06:27:00.000000" - }, - "versions_stub": { - "content": [ - [ - "versions.yml:md5,dc9625538c025d615109ef8cac3a86ab" - ] - ], - "meta": { - "nf-test": "0.9.3", - "nextflow": "25.04.8" - }, - "timestamp": "2025-12-11T06:27:00.000000" - } -} + "versions": { + "content": [ + [ + [ + "THERMORAWFILEPARSER", + "thermorawfileparser", + "1.4.5" + ] + ] + ], + "timestamp": "2026-03-20T12:36:30.88531", + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" + } + } +} \ No newline at end of file diff --git a/modules/bigbio/thermorawfileparser/thermorawfileparser.diff b/modules/bigbio/thermorawfileparser/thermorawfileparser.diff new file mode 100644 index 00000000..da405999 --- /dev/null +++ b/modules/bigbio/thermorawfileparser/thermorawfileparser.diff @@ -0,0 +1,36 @@ +Changes in component 'bigbio/thermorawfileparser' +'modules/bigbio/thermorawfileparser/environment.yml' is unchanged +'modules/bigbio/thermorawfileparser/meta.yml' is unchanged +Changes in 'thermorawfileparser/main.nf': +--- modules/bigbio/thermorawfileparser/main.nf ++++ modules/bigbio/thermorawfileparser/main.nf +@@ -1,5 +1,5 @@ + process THERMORAWFILEPARSER { +- tag "${meta.id}" ++ tag "${meta.mzml_id}" + label 'process_low' + label 'process_single' + label 'error_retry' +@@ -27,7 +27,7 @@ + def hasFormatArg = (args =~ /(^|\s)(-f(=|\s)\d+|--format(=|\s)\d+)/).find() + // Default to indexed mzML format (-f=2) if not specified in args + def formatArg = hasFormatArg ? '' : '-f=2' +- def prefix = task.ext.prefix ?: "${meta.id}" ++ def prefix = task.ext.prefix ?: "${meta.mzml_id}" + def suffix = args.contains("--format 0") || args.contains("-f 0") + ? "mgf" + : args.contains("--format 1") || args.contains("-f 1") +@@ -48,7 +48,7 @@ + + stub: + def args = task.ext.args ?: '' +- def prefix = task.ext.prefix ?: "${meta.id}" ++ def prefix = task.ext.prefix ?: "${meta.mzml_id}" + def suffix = args.contains("--format 0") || args.contains("-f 0") + ? "mgf" + : args.contains("--format 1") || args.contains("-f 1") + +'modules/bigbio/thermorawfileparser/tests/main.nf.test.snap' is unchanged +'modules/bigbio/thermorawfileparser/tests/nextflow.config' is unchanged +'modules/bigbio/thermorawfileparser/tests/main.nf.test' is unchanged +************************************************************ diff --git a/modules/nf-core/thermorawfileparser/environment.yml b/modules/nf-core/thermorawfileparser/environment.yml deleted file mode 100644 index 4142d123..00000000 --- a/modules/nf-core/thermorawfileparser/environment.yml +++ /dev/null @@ -1,6 +0,0 @@ -channels: - - conda-forge - - bioconda -dependencies: - - "bioconda::thermorawfileparser=1.4.5" - - "conda-forge::mono=6.12.0.90" diff --git a/modules/nf-core/thermorawfileparser/main.nf b/modules/nf-core/thermorawfileparser/main.nf deleted file mode 100644 index e1520911..00000000 --- a/modules/nf-core/thermorawfileparser/main.nf +++ /dev/null @@ -1,50 +0,0 @@ -process THERMORAWFILEPARSER { - tag "$meta.mzml_id" - label 'process_low' - - conda "${moduleDir}/environment.yml" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/thermorawfileparser:1.4.5--h05cac1d_1' : - 'biocontainers/thermorawfileparser:1.4.5--h05cac1d_1' }" - - input: - tuple val(meta), path(raw) - - output: - tuple val(meta), path("*.{mzML,mzML.gz,mgf,mgf.gz,parquet,parquet.gz}"), emit: spectra - tuple val("${task.process}"), val('thermorawfileparser'), eval("ThermoRawFileParser.sh --version"), emit: versions_thermorawfileparser, topic: versions - - when: - task.ext.when == null || task.ext.when - - script: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.mzml_id}" - def suffix = args.contains("--format 0") || args.contains("-f 0") ? "mgf" : - args.contains("--format 1") || args.contains("-f 1") ? "mzML" : - args.contains("--format 2") || args.contains("-f 2") ? "mzML" : - args.contains("--format 3") || args.contains("-f 3") ? "parquet" : - "mzML" - suffix = args.contains("--gzip")? "${suffix}.gz" : "${suffix}" - - """ - ThermoRawFileParser.sh \\ - -i $raw \\ - -b ${prefix}.${suffix} \\ - $args - """ - - stub: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" - def suffix = args.contains("--format 0") || args.contains("-f 0") ? "mgf" : - args.contains("--format 1") || args.contains("-f 1") ? "mzML" : - args.contains("--format 2") || args.contains("-f 2") ? "mzML" : - args.contains("--format 3") || args.contains("-f 3") ? "parquet" : - "mzML" - suffix = args.contains("--gzip")? "${suffix}.gz" : "${suffix}" - - """ - touch ${prefix}.${suffix} - """ -} diff --git a/modules/nf-core/thermorawfileparser/meta.yml b/modules/nf-core/thermorawfileparser/meta.yml deleted file mode 100644 index ecd33189..00000000 --- a/modules/nf-core/thermorawfileparser/meta.yml +++ /dev/null @@ -1,71 +0,0 @@ -name: "thermorawfileparser" -description: Parses a Thermo RAW file containing mass spectra to an open file - format -keywords: - - raw - - mzml - - mgf - - parquet - - parser - - proteomics -tools: - - thermorawfileparser: - description: "Wrapper around the .net (C#) ThermoFisher ThermoRawFileReader library - for running on Linux with mono" - homepage: "https://github.com/compomics/ThermoRawFileParser/blob/master/README.md" - documentation: "https://github.com/compomics/ThermoRawFileParser/blob/master/README.md" - tool_dev_url: "https://github.com/compomics/ThermoRawFileParser" - doi: "10.1021/acs.jproteome.9b00328" - licence: ["Apache Software"] - identifier: biotools:ThermoRawFileParser - -input: - - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. `[ id:'sample1', single_end:false ]` - - raw: - type: file - description: Thermo RAW file - pattern: "*.{raw,RAW}" - ontologies: [] -output: - spectra: - - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. `[ id:'sample1', single_end:false ]` - - "*.{mzML,mzML.gz,mgf,mgf.gz,parquet,parquet.gz}": - type: file - description: Mass spectra in open format - pattern: "*.{mzML,mzML.gz,mgf,mgf.gz,parquet,parquet.gz}" - ontologies: [] - versions_thermorawfileparser: - - - ${task.process}: - type: string - description: The process the versions were collected from - - thermorawfileparser: - type: string - description: The name of the tool - - ThermoRawFileParser.sh --version: - type: eval - description: The expression to obtain the version of the tool - -topics: - versions: - - - ${task.process}: - type: string - description: The process the versions were collected from - - thermorawfileparser: - type: string - description: The name of the tool - - ThermoRawFileParser.sh --version: - type: eval - description: The expression to obtain the version of the tool - -authors: - - "@jonasscheid" -maintainers: - - "@jonasscheid" diff --git a/modules/nf-core/thermorawfileparser/tests/main.nf.test b/modules/nf-core/thermorawfileparser/tests/main.nf.test deleted file mode 100644 index 90f8aa1b..00000000 --- a/modules/nf-core/thermorawfileparser/tests/main.nf.test +++ /dev/null @@ -1,59 +0,0 @@ -nextflow_process { - - name "Test Process THERMORAWFILEPARSER" - script "../main.nf" - process "THERMORAWFILEPARSER" - - tag "modules" - tag "modules_nfcore" - tag "thermorawfileparser" - - test("proteomics - parse - raw") { - - when { - process { - """ - input[0] = [ - [ id:'test'], // meta map - file(params.modules_testdata_base_path + 'proteomics/msspectra/PXD012083_e005640_II.raw', checkIfExists: true) - ] - """ - } - } - - then { - // The source file path is written at the top of the file, and the checksum at the bottom by the tool, the rest should be identical - def lines = file(process.out.spectra[0][1]).readLines() - assertAll( - { assert process.success }, - { assert snapshot(lines[21..50]).match() } - ) - } - - } - - test("proteomics - parse - raw - stub") { - - options "-stub" - - when { - process { - """ - input[0] = [ - [ id:'test'], // meta map - file(params.modules_testdata_base_path + 'proteomics/msspectra/PXD012083_e005640_II.raw', checkIfExists: true) - ] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot(process.out).match() } - ) - } - - } - -} diff --git a/modules/nf-core/thermorawfileparser/tests/main.nf.test.snap b/modules/nf-core/thermorawfileparser/tests/main.nf.test.snap deleted file mode 100644 index a9ad37eb..00000000 --- a/modules/nf-core/thermorawfileparser/tests/main.nf.test.snap +++ /dev/null @@ -1,84 +0,0 @@ -{ - "proteomics - parse - raw": { - "content": [ - [ - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " " - ] - ], - "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.4" - }, - "timestamp": "2025-02-14T11:00:45.572003942" - }, - "proteomics - parse - raw - stub": { - "content": [ - { - "0": [ - [ - { - "id": "test" - }, - "test.mzML:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "1": [ - [ - "THERMORAWFILEPARSER", - "thermorawfileparser", - "1.4.5" - ] - ], - "spectra": [ - [ - { - "id": "test" - }, - "test.mzML:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "versions": [ - [ - "THERMORAWFILEPARSER", - "thermorawfileparser", - "1.4.5" - ] - ] - } - ], - "meta": { - "nf-test": "0.9.3", - "nextflow": "25.04.8" - }, - "timestamp": "2026-01-27T17:25:10.402558587" - } -} \ No newline at end of file diff --git a/modules/nf-core/thermorawfileparser/thermorawfileparser.diff b/modules/nf-core/thermorawfileparser/thermorawfileparser.diff deleted file mode 100644 index 99e6acbc..00000000 --- a/modules/nf-core/thermorawfileparser/thermorawfileparser.diff +++ /dev/null @@ -1,26 +0,0 @@ -Changes in component 'nf-core/thermorawfileparser' -'modules/nf-core/thermorawfileparser/environment.yml' is unchanged -'modules/nf-core/thermorawfileparser/meta.yml' is unchanged -Changes in 'thermorawfileparser/main.nf': ---- modules/nf-core/thermorawfileparser/main.nf -+++ modules/nf-core/thermorawfileparser/main.nf -@@ -1,5 +1,5 @@ - process THERMORAWFILEPARSER { -- tag "$meta.id" -+ tag "$meta.mzml_id" - label 'process_low' - - conda "${moduleDir}/environment.yml" -@@ -19,7 +19,7 @@ - - script: - def args = task.ext.args ?: '' -- def prefix = task.ext.prefix ?: "${meta.id}" -+ def prefix = task.ext.prefix ?: "${meta.mzml_id}" - def suffix = args.contains("--format 0") || args.contains("-f 0") ? "mgf" : - args.contains("--format 1") || args.contains("-f 1") ? "mzML" : - args.contains("--format 2") || args.contains("-f 2") ? "mzML" : - -'modules/nf-core/thermorawfileparser/tests/main.nf.test.snap' is unchanged -'modules/nf-core/thermorawfileparser/tests/main.nf.test' is unchanged -************************************************************ diff --git a/subworkflows/local/file_preparation/main.nf b/subworkflows/local/file_preparation/main.nf index fc971a77..0212c6a0 100644 --- a/subworkflows/local/file_preparation/main.nf +++ b/subworkflows/local/file_preparation/main.nf @@ -2,7 +2,7 @@ // Raw file conversion and mzml indexing // -include { THERMORAWFILEPARSER } from '../../../modules/nf-core/thermorawfileparser/main' +include { THERMORAWFILEPARSER } from '../../../modules/bigbio/thermorawfileparser/main' include { TDF2MZML } from '../../../modules/local/utils/tdf2mzml/main' include { DECOMPRESS } from '../../../modules/local/utils/decompress_dotd/main' include { MZML_INDEXING } from '../../../modules/local/openms/mzml_indexing/main' From 5107b295dd3a52aeb2e3067221179f66ae2cf3c2 Mon Sep 17 00:00:00 2001 From: Henry Webel Date: Mon, 23 Mar 2026 10:23:51 +0100 Subject: [PATCH 15/20] :art: format file --- workflows/quantms.nf | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/workflows/quantms.nf b/workflows/quantms.nf index 75e3d9c1..8e634b26 100644 --- a/workflows/quantms.nf +++ b/workflows/quantms.nf @@ -167,23 +167,23 @@ workflow QUANTMS { // see https://nf-co.re/docs/tutorials/migrate_to_topics/update_pipelines // which is used in https://github.com/nf-core/demo/blob/1.1.0/workflows/demo.nf def topic_versions = channel.topic("versions") - .distinct() - .branch { entry -> - versions_file: entry instanceof Path - versions_tuple: true - } + .distinct() + .branch { entry -> + versions_file: entry instanceof Path + versions_tuple: true + } def topic_versions_string = topic_versions.versions_tuple - .map { process, tool, version -> - [ process[process.lastIndexOf(':')+1..-1], " ${tool}: ${version}" ] - } - .groupTuple(by:0) - .map { process, tool_versions -> - tool_versions.unique().sort() - "${process}:\n${tool_versions.join('\n')}" - } + .map { process, tool, version -> + [process[process.lastIndexOf(':') + 1..-1], " ${tool}: ${version}"] + } + .groupTuple(by: 0) + .map { process, tool_versions -> + tool_versions.unique().sort() + "${process}:\n${tool_versions.join('\n')}" + } softwareVersionsToYAML(ch_versions.mix(topic_versions.versions_file)) - .mix(topic_versions_string) + .mix(topic_versions_string) .collectFile( storeDir: "${params.outdir}/pipeline_info", name: 'nf_core_' + 'quantms_software_' + 'mqc_' + 'versions.yml', From 8466288e2966346ef067e217fe07c64994eb32d6 Mon Sep 17 00:00:00 2001 From: Henry Webel Date: Mon, 23 Mar 2026 11:03:19 +0100 Subject: [PATCH 16/20] :art: format run: pip install pre-commit pre-commit install pre-commit run --all-files --- modules.json | 16 ++++------------ .../thermorawfileparser/thermorawfileparser.diff | 2 +- 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/modules.json b/modules.json index 77a77422..bdf0345a 100644 --- a/modules.json +++ b/modules.json @@ -25,9 +25,7 @@ "multiqc": { "branch": "master", "git_sha": "8deffd6a402233ebf905c66dbf804bd4c2637946", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] } } }, @@ -36,23 +34,17 @@ "utils_nextflow_pipeline": { "branch": "master", "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] }, "utils_nfcore_pipeline": { "branch": "master", "git_sha": "271e7fc14eb1320364416d996fb077421f3faed2", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] }, "utils_nfschema_plugin": { "branch": "master", "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] } } } diff --git a/modules/bigbio/thermorawfileparser/thermorawfileparser.diff b/modules/bigbio/thermorawfileparser/thermorawfileparser.diff index da405999..05f21ecd 100644 --- a/modules/bigbio/thermorawfileparser/thermorawfileparser.diff +++ b/modules/bigbio/thermorawfileparser/thermorawfileparser.diff @@ -21,7 +21,7 @@ Changes in 'thermorawfileparser/main.nf': ? "mgf" : args.contains("--format 1") || args.contains("-f 1") @@ -48,7 +48,7 @@ - + stub: def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" From e3daf3bdbd4b7926504df58cf4ff6ec11763d516 Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Fri, 27 Mar 2026 16:13:29 +0100 Subject: [PATCH 17/20] Fix typo in openms_peak_picker processOption value (#689) * Initial plan * fix: correct typo inmermory -> inmemory in openms_peak_picker Co-authored-by: enryH <2833836+enryH@users.noreply.github.com> Agent-Logs-Url: https://github.com/bigbio/quantms/sessions/ef73a74e-d614-4f35-b4af-4c6994dd711d --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: enryH <2833836+enryH@users.noreply.github.com> Co-authored-by: Yasset Perez-Riverol --- modules/local/openms/openms_peak_picker/main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/openms/openms_peak_picker/main.nf b/modules/local/openms/openms_peak_picker/main.nf index 06d965e1..61999b17 100644 --- a/modules/local/openms/openms_peak_picker/main.nf +++ b/modules/local/openms/openms_peak_picker/main.nf @@ -19,7 +19,7 @@ process OPENMS_PEAK_PICKER { def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.mzml_id}" - in_mem = params.peakpicking_inmemory ? "inmermory" : "lowmemory" + in_mem = params.peakpicking_inmemory ? "inmemory" : "lowmemory" lvls = params.peakpicking_ms_levels ? "-algorithm:ms_levels ${params.peakpicking_ms_levels}" : "" """ From 3344e87ff3315463115effcb235f0a01bae5cb2a Mon Sep 17 00:00:00 2001 From: Yasset Perez-Riverol Date: Fri, 3 Apr 2026 07:57:13 +0100 Subject: [PATCH 18/20] feat: expose FDR conservative parameter for FalseDiscoveryRate Add `fdr_conservative` parameter (default true for backward compatibility) that controls whether the FDR estimation uses the conservative formula (D+1)/T or the tighter (D+1)/(T+D). The conservative formula provides an upper bound on the true FDR but can be overly conservative, especially at low FDR thresholds. Keich & Noble (2025, Nature Methods) showed that (D+1)/T is useful for guaranteeing FDR control but inflates q-values by ~20-40% in the borderline range compared to (D+1)/(T+D). In benchmarking against ProteomeDiscoverer, we found that 429 PD-confirmed peptides with Percolator PEP < 0.01 were filtered out because the conservative FDR formula inflated their q-values above the 1% threshold. Setting fdr_conservative=false may recover a portion of these peptides while maintaining valid FDR control. Co-Authored-By: Claude Opus 4.6 (1M context) --- modules/local/openms/false_discovery_rate/main.nf | 1 + nextflow.config | 1 + nextflow_schema.json | 7 +++++++ 3 files changed, 9 insertions(+) diff --git a/modules/local/openms/false_discovery_rate/main.nf b/modules/local/openms/false_discovery_rate/main.nf index f0cf7e2e..37a872dd 100644 --- a/modules/local/openms/false_discovery_rate/main.nf +++ b/modules/local/openms/false_discovery_rate/main.nf @@ -28,6 +28,7 @@ process FALSE_DISCOVERY_RATE { -FDR:PSM ${params.run_fdr_cutoff} \\ -algorithm:add_decoy_peptides \\ -algorithm:add_decoy_proteins \\ + -algorithm:conservative ${params.fdr_conservative} \\ $args \\ 2>&1 | tee ${id_file.baseName}_fdr.log diff --git a/nextflow.config b/nextflow.config index 4f536a94..920f5685 100644 --- a/nextflow.config +++ b/nextflow.config @@ -31,6 +31,7 @@ params { run_fdr_cutoff = 0.10 protein_level_fdr_cutoff = 0.01 psm_level_fdr_cutoff = 0.01 + fdr_conservative = true // Use (D+1)/T formula (true) or (D+1)/(T+D) (false) for FDR estimation psm_clean = false // Debug level diff --git a/nextflow_schema.json b/nextflow_schema.json index 9f25cc2d..0797e2ba 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -966,6 +966,13 @@ "fa_icon": "fas fa-filter", "help_text": "After applying protein-level FDR cutoff, this additionally filters PSMs to be used for quantification and reporting." }, + "fdr_conservative": { + "type": "boolean", + "description": "Use conservative FDR formula (D+1)/T instead of (D+1)/(T+D). Default: true", + "default": true, + "fa_icon": "fas fa-shield-alt", + "help_text": "When true, uses the conservative formula (D+1)/T for FDR estimation, which provides an upper bound on the true FDR. When false, uses (D+1)/(T+D) which gives a tighter estimate. See Keich & Noble (2025, Nature Methods) for details on FDR estimation methods." + }, "protein_inference_debug": { "type": "integer", "description": "Debug level for the protein inference step. Increase for verbose logging", From 48937afd57e80ee6bc23833c0aab16bc973d425f Mon Sep 17 00:00:00 2001 From: Yasset Perez-Riverol Date: Fri, 3 Apr 2026 21:03:29 +0100 Subject: [PATCH 19/20] chore: update quantms-rescoring container to 0.0.16 Co-Authored-By: Claude Opus 4.6 (1M context) --- modules/local/utils/msrescore_features/main.nf | 4 ++-- modules/local/utils/msrescore_fine_tuning/main.nf | 4 ++-- modules/local/utils/psm_clean/main.nf | 4 ++-- modules/local/utils/spectrum_features/main.nf | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/modules/local/utils/msrescore_features/main.nf b/modules/local/utils/msrescore_features/main.nf index c98a1655..e054cfad 100644 --- a/modules/local/utils/msrescore_features/main.nf +++ b/modules/local/utils/msrescore_features/main.nf @@ -3,8 +3,8 @@ process MSRESCORE_FEATURES { label 'process_high' container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'oras://ghcr.io/bigbio/quantms-rescoring-sif:0.0.15' : - 'ghcr.io/bigbio/quantms-rescoring:0.0.15' }" + 'oras://ghcr.io/bigbio/quantms-rescoring-sif:0.0.16' : + 'ghcr.io/bigbio/quantms-rescoring:0.0.16' }" input: tuple val(meta), path(idxml), path(mzml), path(model_weight), val(search_engine) diff --git a/modules/local/utils/msrescore_fine_tuning/main.nf b/modules/local/utils/msrescore_fine_tuning/main.nf index c7d1d839..aa7ae59b 100644 --- a/modules/local/utils/msrescore_fine_tuning/main.nf +++ b/modules/local/utils/msrescore_fine_tuning/main.nf @@ -3,8 +3,8 @@ process MSRESCORE_FINE_TUNING { label 'process_high' container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'oras://ghcr.io/bigbio/quantms-rescoring-sif:0.0.15' : - 'ghcr.io/bigbio/quantms-rescoring:0.0.15' }" + 'oras://ghcr.io/bigbio/quantms-rescoring-sif:0.0.16' : + 'ghcr.io/bigbio/quantms-rescoring:0.0.16' }" input: tuple val(meta), path(idxml), path(mzml), val(groupkey), path(ms2_model_dir) diff --git a/modules/local/utils/psm_clean/main.nf b/modules/local/utils/psm_clean/main.nf index e83b98ab..3417b0e6 100644 --- a/modules/local/utils/psm_clean/main.nf +++ b/modules/local/utils/psm_clean/main.nf @@ -3,8 +3,8 @@ process PSM_CLEAN { label 'process_high' container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'oras://ghcr.io/bigbio/quantms-rescoring-sif:0.0.15' : - 'ghcr.io/bigbio/quantms-rescoring:0.0.15' }" + 'oras://ghcr.io/bigbio/quantms-rescoring-sif:0.0.16' : + 'ghcr.io/bigbio/quantms-rescoring:0.0.16' }" input: tuple val(meta), path(idxml), path(mzml) diff --git a/modules/local/utils/spectrum_features/main.nf b/modules/local/utils/spectrum_features/main.nf index 87dbb4ce..baaa989b 100644 --- a/modules/local/utils/spectrum_features/main.nf +++ b/modules/local/utils/spectrum_features/main.nf @@ -3,8 +3,8 @@ process SPECTRUM_FEATURES { label 'process_low' container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'oras://ghcr.io/bigbio/quantms-rescoring-sif:0.0.15' : - 'ghcr.io/bigbio/quantms-rescoring:0.0.15' }" + 'oras://ghcr.io/bigbio/quantms-rescoring-sif:0.0.16' : + 'ghcr.io/bigbio/quantms-rescoring:0.0.16' }" input: tuple val(meta), path(id_file), val(search_engine), path(ms_file) From 831eb6b5983127580875dba9e0cf4b2f4e13d79e Mon Sep 17 00:00:00 2001 From: Yasset Perez-Riverol Date: Sat, 4 Apr 2026 10:22:55 +0100 Subject: [PATCH 20/20] feat: expose Biosaur2 as alternative seeding algorithm for LFQ Add `lfq_seeding_algorithm` parameter (default 'multiplex') to select the feature detection seeding algorithm in ProteomicsLFQ. The 'biosaur2' option uses the Biosaur2 algorithm recently added to OpenMS (PR #8385), which provides hill-based trace linking with built-in mass calibration. No Biosaur2-specific parameters are exposed since ProteomicsLFQ already tunes the defaults internally (mini=500, minlh=3, pasefminlh=2). Co-Authored-By: Claude Opus 4.6 (1M context) --- modules/local/openms/proteomicslfq/main.nf | 1 + nextflow.config | 1 + nextflow_schema.json | 7 +++++++ 3 files changed, 9 insertions(+) diff --git a/modules/local/openms/proteomicslfq/main.nf b/modules/local/openms/proteomicslfq/main.nf index de4004e8..35509bb5 100644 --- a/modules/local/openms/proteomicslfq/main.nf +++ b/modules/local/openms/proteomicslfq/main.nf @@ -48,6 +48,7 @@ process PROTEOMICSLFQ { ${feature_with_id_min_score} \\ ${feature_without_id_min_score} \\ -mass_recalibration ${params.mass_recalibration} \\ + -Seeding:algorithm ${params.lfq_seeding_algorithm} \\ -Seeding:intThreshold ${params.lfq_intensity_threshold} \\ -protein_quantification ${params.protein_quant} \\ -alignment_order ${params.alignment_order} \\ diff --git a/nextflow.config b/nextflow.config index 920f5685..7083a0a9 100644 --- a/nextflow.config +++ b/nextflow.config @@ -185,6 +185,7 @@ params { protein_inference_method = 'aggregation' protein_quant = 'unique_peptides' quantification_method = 'feature_intensity' + lfq_seeding_algorithm = 'multiplex' // Feature seeding: 'multiplex' (default) or 'biosaur2' mass_recalibration = false alignment_order = 'star' quantify_decoys = false diff --git a/nextflow_schema.json b/nextflow_schema.json index 0797e2ba..03521dbc 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -1064,6 +1064,13 @@ "enum": ["feature_intensity", "spectral_counting"], "fa_icon": "fas fa-list-ol" }, + "lfq_seeding_algorithm": { + "type": "string", + "description": "Feature detection seeding algorithm for ProteomicsLFQ. 'multiplex' uses FeatureFinderMultiplex (default), 'biosaur2' uses the Biosaur2 algorithm.", + "default": "multiplex", + "enum": ["multiplex", "biosaur2"], + "fa_icon": "fas fa-seedling" + }, "mass_recalibration": { "type": "boolean", "description": "Recalibrates masses based on precursor mass deviations to correct for instrument biases. (default: 'false')",