From 004ba760a3e1d0ffd84a6524e25622a1f1eaf40c Mon Sep 17 00:00:00 2001 From: jscgh Date: Fri, 16 May 2025 10:00:40 +1000 Subject: [PATCH 1/8] Adds process_gpu label --- conf/base.config | 3 +++ modules/local/colabfold_batch/main.nf | 1 + modules/local/run_alphafold2/main.nf | 1 + modules/local/run_alphafold2_pred/main.nf | 1 + modules/local/run_esmfold/main.nf | 1 + modules/local/run_helixfold3/main.nf | 1 + modules/local/run_rosettafold_all_atom/main.nf | 1 + 7 files changed, 9 insertions(+) diff --git a/conf/base.config b/conf/base.config index 685dac802..1ed1ed0b2 100644 --- a/conf/base.config +++ b/conf/base.config @@ -52,6 +52,9 @@ process { withLabel:process_high_memory { memory = { 200.GB * task.attempt } } + withLabel:process_gpu { + accelerator = 1 + } withLabel:error_ignore { errorStrategy = 'ignore' } diff --git a/modules/local/colabfold_batch/main.nf b/modules/local/colabfold_batch/main.nf index 193a43aff..3694b0ee9 100644 --- a/modules/local/colabfold_batch/main.nf +++ b/modules/local/colabfold_batch/main.nf @@ -1,6 +1,7 @@ process COLABFOLD_BATCH { tag "$meta.id" label 'process_medium' + label 'process_gpu' container "nf-core/proteinfold_colabfold:dev" diff --git a/modules/local/run_alphafold2/main.nf b/modules/local/run_alphafold2/main.nf index 0cb976a08..b9ba40994 100644 --- a/modules/local/run_alphafold2/main.nf +++ b/modules/local/run_alphafold2/main.nf @@ -4,6 +4,7 @@ process RUN_ALPHAFOLD2 { tag "$meta.id" label 'process_medium' + label 'process_gpu' container "nf-core/proteinfold_alphafold2_standard:dev" diff --git a/modules/local/run_alphafold2_pred/main.nf b/modules/local/run_alphafold2_pred/main.nf index f6b20732c..ec5349e4a 100644 --- a/modules/local/run_alphafold2_pred/main.nf +++ b/modules/local/run_alphafold2_pred/main.nf @@ -4,6 +4,7 @@ process RUN_ALPHAFOLD2_PRED { tag "$meta.id" label 'process_medium' + label 'process_gpu' container "nf-core/proteinfold_alphafold2_pred:dev" diff --git a/modules/local/run_esmfold/main.nf b/modules/local/run_esmfold/main.nf index e2f76e739..96ea4985a 100644 --- a/modules/local/run_esmfold/main.nf +++ b/modules/local/run_esmfold/main.nf @@ -1,6 +1,7 @@ process RUN_ESMFOLD { tag "$meta.id" label 'process_medium' + label 'process_gpu' container "nf-core/proteinfold_esmfold:dev" diff --git a/modules/local/run_helixfold3/main.nf b/modules/local/run_helixfold3/main.nf index a16e9af10..b30d96648 100644 --- a/modules/local/run_helixfold3/main.nf +++ b/modules/local/run_helixfold3/main.nf @@ -4,6 +4,7 @@ process RUN_HELIXFOLD3 { tag "$meta.id" label 'process_medium' + label 'process_gpu' container "nf-core/proteinfold_helixfold3:dev" diff --git a/modules/local/run_rosettafold_all_atom/main.nf b/modules/local/run_rosettafold_all_atom/main.nf index 782e2bf44..ebac1d3e6 100644 --- a/modules/local/run_rosettafold_all_atom/main.nf +++ b/modules/local/run_rosettafold_all_atom/main.nf @@ -4,6 +4,7 @@ process RUN_ROSETTAFOLD_ALL_ATOM { tag "$meta.id" label 'process_medium' + label 'process_gpu' container "nf-core/proteinfold_rosettafold_all_atom:dev" From 72e569be296bb9c2fd07810eaab57edae1d19ddb Mon Sep 17 00:00:00 2001 From: jscgh Date: Fri, 16 May 2025 10:08:30 +1000 Subject: [PATCH 2/8] Formatting --- .pre-commit-config.yaml | 11 +++++- conf/test_colabfold_local.config | 1 - conf/test_esmfold.config | 1 - conf/test_helixfold3.config | 1 - .../Dockerfile_nfcore-proteinfold_boltz | 2 - modules/nf-core/aria2/aria2.diff | 2 +- modules/nf-core/aria2/tests/main.nf.test.snap | 2 +- .../easysearch/foldseek-easysearch.diff | 10 ++--- .../easysearch/tests/main.nf.test.snap | 2 +- .../createindex/tests/main.nf.test.snap | 2 +- modules/nf-core/multiqc/multiqc.diff | 16 ++++---- .../nf-core/multiqc/tests/main.nf.test.snap | 2 +- modules/nf-core/untar/tests/main.nf.test.snap | 6 +-- modules/nf-core/untar/untar.diff | 8 ++-- nextflow_schema.json | 38 ++++++++++--------- subworkflows/local/aria2_uncompress.nf | 1 - subworkflows/local/prepare_boltz_dbs.nf | 2 - .../tests/main.function.nf.test.snap | 2 +- .../tests/main.function.nf.test.snap | 2 +- .../tests/main.workflow.nf.test.snap | 2 +- .../nf-core/utils_nfschema_plugin/main.nf | 1 - .../tests/nextflow.config | 2 +- 22 files changed, 59 insertions(+), 57 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 1dec86502..46494d01b 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -4,10 +4,17 @@ repos: hooks: - id: prettier additional_dependencies: - - prettier@3.2.5 + - prettier@3.5.3 + + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v5.0.0 + hooks: + - id: trailing-whitespace + - id: end-of-file-fixer + - id: check-added-large-files - repo: https://github.com/editorconfig-checker/editorconfig-checker.python - rev: "3.1.2" + rev: "3.2.1" hooks: - id: editorconfig-checker alias: ec diff --git a/conf/test_colabfold_local.config b/conf/test_colabfold_local.config index 32705b7e1..7186ccd5b 100644 --- a/conf/test_colabfold_local.config +++ b/conf/test_colabfold_local.config @@ -35,4 +35,3 @@ process { container = 'biocontainers/gawk:5.1.0' } } - diff --git a/conf/test_esmfold.config b/conf/test_esmfold.config index 956508211..344ea1bf9 100644 --- a/conf/test_esmfold.config +++ b/conf/test_esmfold.config @@ -34,4 +34,3 @@ process { container = 'quay.io/biocontainers/gawk:5.1.0' } } - diff --git a/conf/test_helixfold3.config b/conf/test_helixfold3.config index d493c9b14..a8b3e4d5e 100644 --- a/conf/test_helixfold3.config +++ b/conf/test_helixfold3.config @@ -34,4 +34,3 @@ process { container = 'biocontainers/gawk:5.1.0' } } - diff --git a/dockerfiles/Dockerfile_nfcore-proteinfold_boltz b/dockerfiles/Dockerfile_nfcore-proteinfold_boltz index f5fdbd420..527ef86d9 100644 --- a/dockerfiles/Dockerfile_nfcore-proteinfold_boltz +++ b/dockerfiles/Dockerfile_nfcore-proteinfold_boltz @@ -14,5 +14,3 @@ RUN apt-get update && \ RUN pip install boltz CMD ["boltz"] - - diff --git a/modules/nf-core/aria2/aria2.diff b/modules/nf-core/aria2/aria2.diff index e22fe2cfc..15f7de50f 100644 --- a/modules/nf-core/aria2/aria2.diff +++ b/modules/nf-core/aria2/aria2.diff @@ -6,7 +6,7 @@ Changes in module 'nf-core/aria2' - tag "$meta.id" + tag "$source_url" label 'process_single' - + conda "${moduleDir}/environment.yml" ************************************************************ diff --git a/modules/nf-core/aria2/tests/main.nf.test.snap b/modules/nf-core/aria2/tests/main.nf.test.snap index 96911f636..6af00d29a 100644 --- a/modules/nf-core/aria2/tests/main.nf.test.snap +++ b/modules/nf-core/aria2/tests/main.nf.test.snap @@ -57,4 +57,4 @@ ], "timestamp": "2023-12-14T17:34:22.216677" } -} \ No newline at end of file +} diff --git a/modules/nf-core/foldseek/easysearch/foldseek-easysearch.diff b/modules/nf-core/foldseek/easysearch/foldseek-easysearch.diff index 81e919640..f48b9c8e8 100644 --- a/modules/nf-core/foldseek/easysearch/foldseek-easysearch.diff +++ b/modules/nf-core/foldseek/easysearch/foldseek-easysearch.diff @@ -3,13 +3,13 @@ Changes in module 'nf-core/foldseek/easysearch' +++ modules/nf-core/foldseek/easysearch/main.nf @@ -12,7 +12,8 @@ tuple val(meta_db), path(db) - + output: - tuple val(meta), path("${meta.id}.m8"), emit: aln + tuple val(meta), path("${meta.id}.m8"), emit: aln, optional: true + tuple val(meta), path("${meta.id}_${meta.model.toLowerCase()}_foldseek.html"), emit: report, optional: true path "versions.yml" , emit: versions - + when: @@ -21,12 +22,17 @@ script: @@ -29,13 +29,13 @@ Changes in module 'nf-core/foldseek/easysearch' + ${output_file} \\ tmpFolder \\ ${args} - + @@ -42,6 +48,7 @@ - + """ touch ${prefix}.m8 + touch ${prefix}.html - + cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/foldseek/easysearch/tests/main.nf.test.snap b/modules/nf-core/foldseek/easysearch/tests/main.nf.test.snap index 819648dd0..e8aeb1c9f 100644 --- a/modules/nf-core/foldseek/easysearch/tests/main.nf.test.snap +++ b/modules/nf-core/foldseek/easysearch/tests/main.nf.test.snap @@ -28,4 +28,4 @@ ], "timestamp": "2024-07-02T13:55:57.915188646" } -} \ No newline at end of file +} diff --git a/modules/nf-core/mmseqs/createindex/tests/main.nf.test.snap b/modules/nf-core/mmseqs/createindex/tests/main.nf.test.snap index f18d49dd1..b808fd41d 100644 --- a/modules/nf-core/mmseqs/createindex/tests/main.nf.test.snap +++ b/modules/nf-core/mmseqs/createindex/tests/main.nf.test.snap @@ -59,4 +59,4 @@ }, "timestamp": "2025-01-20T17:15:56.186115" } -} \ No newline at end of file +} diff --git a/modules/nf-core/multiqc/multiqc.diff b/modules/nf-core/multiqc/multiqc.diff index fc7636411..d1b0c7d1c 100644 --- a/modules/nf-core/multiqc/multiqc.diff +++ b/modules/nf-core/multiqc/multiqc.diff @@ -101,14 +101,14 @@ Changes in module 'nf-core/multiqc' --- modules/nf-core/multiqc/main.nf +++ modules/nf-core/multiqc/main.nf @@ -3,14 +3,16 @@ - + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/multiqc:1.21--pyhdfd78af_0' : - 'biocontainers/multiqc:1.21--pyhdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/multiqc:1.25.1--pyhdfd78af_0' : + 'biocontainers/multiqc:1.25.1--pyhdfd78af_0' }" - + input: - path multiqc_files, stageAs: "?/*" + tuple val(meta), path(multiqc_files) @@ -117,11 +117,11 @@ Changes in module 'nf-core/multiqc' path(multiqc_logo) + path(replace_names) + path(sample_names) - + output: path "*multiqc_report.html", emit: report @@ -23,16 +25,22 @@ - + script: def args = task.ext.args ?: '' + def prefix = task.ext.prefix ? "--filename ${task.ext.prefix}.html" : "--filename ${meta.model}_multiqc_report.html" @@ -142,7 +142,7 @@ Changes in module 'nf-core/multiqc' + $replace \\ + $samples \\ . - + cat <<-END_VERSIONS > versions.yml @@ -44,7 +52,7 @@ stub: @@ -151,7 +151,7 @@ Changes in module 'nf-core/multiqc' - touch multiqc_plots + mkdir multiqc_plots touch multiqc_report.html - + cat <<-END_VERSIONS > versions.yml --- modules/nf-core/multiqc/environment.yml @@ -226,11 +226,11 @@ Changes in module 'nf-core/multiqc' @@ -8,6 +8,8 @@ tag "modules_nfcore" tag "multiqc" - + + config "./nextflow.config" + test("sarscov2 single-end [fastqc]") { - + when { @@ -17,6 +19,8 @@ input[1] = [] diff --git a/modules/nf-core/multiqc/tests/main.nf.test.snap b/modules/nf-core/multiqc/tests/main.nf.test.snap index 7b7c13220..7a42646aa 100644 --- a/modules/nf-core/multiqc/tests/main.nf.test.snap +++ b/modules/nf-core/multiqc/tests/main.nf.test.snap @@ -38,4 +38,4 @@ }, "timestamp": "2025-01-27T09:30:21.44383553" } -} \ No newline at end of file +} diff --git a/modules/nf-core/untar/tests/main.nf.test.snap b/modules/nf-core/untar/tests/main.nf.test.snap index 64550292f..e5b8e55d3 100644 --- a/modules/nf-core/untar/tests/main.nf.test.snap +++ b/modules/nf-core/untar/tests/main.nf.test.snap @@ -4,7 +4,7 @@ [ [ [ - + ], [ "hello.txt:md5,e59ff97941044f85df5297e1c302d260" @@ -23,7 +23,7 @@ [ [ [ - + ], [ "hash.k2d:md5,8b8598468f54a7087c203ad0190555d9", @@ -39,4 +39,4 @@ }, "timestamp": "2024-02-28T11:49:33.795172" } -} \ No newline at end of file +} diff --git a/modules/nf-core/untar/untar.diff b/modules/nf-core/untar/untar.diff index 0fac85e4f..608306fbf 100644 --- a/modules/nf-core/untar/untar.diff +++ b/modules/nf-core/untar/untar.diff @@ -11,7 +11,7 @@ Changes in module 'nf-core/untar' + untar = archive.toString().endsWith('tar.gz')? archive.toString() - '.tar.gz' : archive.toString() - '.tar' """ mkdir output - + @@ -30,14 +30,14 @@ if [[ \$(tar -tzf ${archive} | grep -o -P "^.*?\\/" | uniq | wc -l) -eq 1 ]]; then tar \\ @@ -31,12 +31,12 @@ Changes in module 'nf-core/untar' $args2 @@ -52,7 +52,7 @@ """ - + stub: - untar = archive.toString() - '.tar.gz' + untar = archive.toString().endsWith('tar.gz')? archive.toString() - '.tar.gz' : archive.toString() - '.tar' """ touch $untar - -************************************************************ \ No newline at end of file + +************************************************************ diff --git a/nextflow_schema.json b/nextflow_schema.json index c97bdd59b..a5cc1b765 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -223,10 +223,10 @@ } }, "boltz_options": { - "title": "Boltz DBs and model paths options", + "title": "Boltz options", "type": "object", "fa_icon": "fas fa-database", - "description": "Paths used to provide model paths and weight paths to Boltz", + "description": "Boltz options.", "properties": { "boltz_use_msa_server": { "type": "boolean", @@ -625,21 +625,23 @@ } } }, - "boltz_dbs_and_parameters_links_options": { - "title": "Boltz DBs and model paths options", + "boltz_dbs_and_model_links_options": { + "title": "Boltz DBs and model links options", "type": "object", "fa_icon": "fas fa-database", - "description": "Paths used to provide model paths and weight paths to Boltz", + "description": "Links used to provide model links and weight links to Boltz", "properties": { "boltz_ccd_link": { "type": "string", "description": "Link to download CCD file", - "icon": "fas fa-link" + "icon": "fas fa-link", + "default": "https://huggingface.co/boltz-community/boltz-1/resolve/main/ccd.pkl" }, "boltz_model_link": { "type": "string", "description": "Link to download model file", - "icon": "fas fa-link" + "icon": "fas fa-link", + "default": "https://huggingface.co/boltz-community/boltz-1/resolve/main/boltz1.ckpt" } } }, @@ -657,12 +659,14 @@ "boltz_ccd_path": { "type": "string", "description": "Path to CCD file", - "icon": "fas folder-open" + "icon": "fas folder-open", + "default": "null/ccd.pkl" }, "boltz_model_path": { "type": "string", "description": "Path to boltz Model file", - "icon": "fas folder-open" + "icon": "fas folder-open", + "default": "null/boltz1.ckpt" } } }, @@ -959,6 +963,9 @@ { "$ref": "#/$defs/esmfold_options" }, + { + "$ref": "#/$defs/boltz_options" + }, { "$ref": "#/$defs/foldseek_options" }, @@ -993,22 +1000,19 @@ "$ref": "#/$defs/esmfold_parameters_paths_options" }, { - "$ref": "#/$defs/generic_options" - }, - { - "$ref": "#/$defs/rosettafold_all_atom_dbs_and_parameters_links_options" + "$ref": "#/$defs/boltz_dbs_and_model_links_options" }, { - "$ref": "#/$defs/rosettafold_all_atom_dbs_and_parameters_paths_options" + "$ref": "#/$defs/boltz_dbs_and_parameters_paths_options" }, { - "$ref": "#/$defs/boltz_options" + "$ref": "#/$defs/generic_options" }, { - "$ref": "#/$defs/boltz_dbs_and_parameters_paths_options" + "$ref": "#/$defs/rosettafold_all_atom_dbs_and_parameters_links_options" }, { - "$ref": "#/$defs/boltz_dbs_and_parameters_links_options" + "$ref": "#/$defs/rosettafold_all_atom_dbs_and_parameters_paths_options" }, { "$ref": "#/$defs/helixfold3_dbs_and_parameters_paths_options" diff --git a/subworkflows/local/aria2_uncompress.nf b/subworkflows/local/aria2_uncompress.nf index 09a27ff0d..4444e9930 100644 --- a/subworkflows/local/aria2_uncompress.nf +++ b/subworkflows/local/aria2_uncompress.nf @@ -30,4 +30,3 @@ workflow ARIA2_UNCOMPRESS { db = ch_db // channel: [ db ] versions = ARIA2.out.versions // channel: [ versions.yml ] } - diff --git a/subworkflows/local/prepare_boltz_dbs.nf b/subworkflows/local/prepare_boltz_dbs.nf index d24ac8d1d..83588cb12 100644 --- a/subworkflows/local/prepare_boltz_dbs.nf +++ b/subworkflows/local/prepare_boltz_dbs.nf @@ -44,5 +44,3 @@ workflow PREPARE_BOLTZ_DBS { boltz_model = ch_boltz_model versions = ch_versions } - - diff --git a/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.function.nf.test.snap b/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.function.nf.test.snap index e3f0baf47..846287c41 100644 --- a/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.function.nf.test.snap +++ b/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.function.nf.test.snap @@ -17,4 +17,4 @@ }, "timestamp": "2024-02-28T12:02:12.425833" } -} \ No newline at end of file +} diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test.snap b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test.snap index 02c670141..b13b31121 100644 --- a/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test.snap +++ b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test.snap @@ -133,4 +133,4 @@ }, "timestamp": "2024-02-28T12:03:21.714424" } -} \ No newline at end of file +} diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.workflow.nf.test.snap b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.workflow.nf.test.snap index 859d1030f..84ee1e1d1 100644 --- a/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.workflow.nf.test.snap +++ b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.workflow.nf.test.snap @@ -16,4 +16,4 @@ }, "timestamp": "2024-02-28T12:03:25.726491" } -} \ No newline at end of file +} diff --git a/subworkflows/nf-core/utils_nfschema_plugin/main.nf b/subworkflows/nf-core/utils_nfschema_plugin/main.nf index 4994303ea..93de2a524 100644 --- a/subworkflows/nf-core/utils_nfschema_plugin/main.nf +++ b/subworkflows/nf-core/utils_nfschema_plugin/main.nf @@ -43,4 +43,3 @@ workflow UTILS_NFSCHEMA_PLUGIN { emit: dummy_emit = true } - diff --git a/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config b/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config index 0907ac58f..478fb8a05 100644 --- a/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config +++ b/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config @@ -5,4 +5,4 @@ plugins { validation { parametersSchema = "${projectDir}/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow_schema.json" monochromeLogs = true -} \ No newline at end of file +} From dad9ad644daccd9188a327628b5355dcb1304b71 Mon Sep 17 00:00:00 2001 From: jscgh Date: Sat, 7 Jun 2025 12:24:20 +1000 Subject: [PATCH 3/8] Fix typo --- conf/base.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/base.config b/conf/base.config index a8adf57c4..1ed1ed0b2 100644 --- a/conf/base.config +++ b/conf/base.config @@ -52,7 +52,7 @@ process { withLabel:process_high_memory { memory = { 200.GB * task.attempt } } - withLabled:process_gpu { + withLabel:process_gpu { accelerator = 1 } withLabel:error_ignore { From cfb1d67e6312072ef745f3dcee13d7b89681a2d2 Mon Sep 17 00:00:00 2001 From: nbtm-sh Date: Fri, 20 Jun 2025 15:23:07 +1000 Subject: [PATCH 4/8] feat(mmseqs_gpu): added module file for workflows --- modules/local/mmseqs_gpu/main.nf | 91 ++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 modules/local/mmseqs_gpu/main.nf diff --git a/modules/local/mmseqs_gpu/main.nf b/modules/local/mmseqs_gpu/main.nf new file mode 100644 index 000000000..b803e68d3 --- /dev/null +++ b/modules/local/mmseqs_gpu/main.nf @@ -0,0 +1,91 @@ +process PREPARE_MMSEQS_DB { + tag "$meta.id" + label "process_medium" + + container "/srv/scratch/sbf/containers/mmseqs-gpu.sif" + + input: + tuple val(meta), path(fasta) + + output: + tuple val(meta), path("querydb") + + script: + """ + mkdir "querydb" + /app/mmseqs/bin/mmseqs createdb "${fasta}" ./querydb/${meta.id} + """ +} + +process SEARCH_MMSEQS_GPU { + tag "$meta.id" + label "process_medium" + label "process_gpu" + + container "/srv/scratch/sbf/containers/mmseqs-gpu.sif" + + input: + tuple val(meta), path(fasta) + path ("querydb") + path ("mmseqs-gpu") + + output: + path ("pdb100_${meta.id}_hits.a3m") + path ("colabfold_${meta.id}_hits.a3m") + path ("uniref30_${meta.id}_hits.a3m") + + script: + """ + mkdir "msas" + /app/mmseqs/bin/mmseqs search \ + --gpu 1 \ + ./querydb/${meta.id} \ + ./mmseqs-gpu/colabfold_envdb_202108_db \ + ./msas/colabfold_${meta.id} \ + ./tmp + + /app/mmseqs/bin/mmseqs search \ + --gpu 1 \ + ./querydb/${meta.id} \ + ./mmseqs-gpu/pdb100_230517 \ + ./msas/pdb100_${meta.id} \ + ./tmp + + /app/mmseqs/bin/mmseqs search \ + --gpu 1 \ + ./querydb/${meta.id} \ + ./mmseqs-gpu/uniref30_2302_db \ + ./msas/uniref30_${meta.id} \ + ./tmp + + # Convert to a3m files + mkdir "msa_inter" + mkdir "tmp_out" + /app/mmseqs/bin/mmseqs result2msa \ + ./querydb/${meta.id} \ + ./mmseqs-gpu/colabfold_envdb_202108_db \ + ./msas/colabfold_${meta.id} \ + ./msa_inter/colabfold_${meta.id} + /app/mmseqs/bin/mmseqs unpackdb \ + ./msa_inter/colabfold_${meta.id} ./tmp_out/colabfold_${meta.id} + mv ./tmp_out/colabfold_${meta.id}/0 ./colabfold_${meta.id}_hits.a3m + + /app/mmseqs/bin/mmseqs result2msa \ + ./querydb/${meta.id} \ + ./mmseqs-gpu/pdb100_230517 \ + ./msas/pdb100_${meta.id} \ + ./msa_inter/pdb100_${meta.id} + /app/mmseqs/bin/mmseqs unpackdb \ + ./msa_inter/pdb100_${meta.id} ./tmp_out/pdb100_${meta.id} + mv ./tmp_out/pdb100_${meta.id}/0 ./pdb100_${meta.id}_hits.a3m + + /app/mmseqs/bin/mmseqs result2msa \ + ./querydb/${meta.id} \ + ./mmseqs-gpu/uniref30_2302_db \ + ./msas/uniref30_${meta.id} \ + ./msa_inter/uniref_30${meta.id} + /app/mmseqs/bin/mmseqs unpackdb \ + ./msa_inter/uniref30_${meta.id} ./tmp_out/uniref30_${meta.id} + mv ./tmp_out/uniref30_${meta.id}/0 ./uniref30_${meta.id}_hits.a3m + """ +} From 907e58b5a5725249a733eedaf5f66c525c8262fc Mon Sep 17 00:00:00 2001 From: nbtm-sh Date: Thu, 3 Jul 2025 16:47:17 +1000 Subject: [PATCH 5/8] feat(boltz): inital commit --- modules/local/mmseqs_gpu/main.nf | 36 +---------- modules/local/run_boltz_mmseqs_gpu/main.nf | 73 ++++++++++++++++++++++ modules/local/samplesheetutils/main.nf | 21 +++++++ workflows/boltz.nf | 40 +++++++++--- 4 files changed, 127 insertions(+), 43 deletions(-) create mode 100644 modules/local/run_boltz_mmseqs_gpu/main.nf create mode 100644 modules/local/samplesheetutils/main.nf diff --git a/modules/local/mmseqs_gpu/main.nf b/modules/local/mmseqs_gpu/main.nf index b803e68d3..312054af5 100644 --- a/modules/local/mmseqs_gpu/main.nf +++ b/modules/local/mmseqs_gpu/main.nf @@ -30,9 +30,7 @@ process SEARCH_MMSEQS_GPU { path ("mmseqs-gpu") output: - path ("pdb100_${meta.id}_hits.a3m") - path ("colabfold_${meta.id}_hits.a3m") - path ("uniref30_${meta.id}_hits.a3m") + tuple val(meta), path ("colabfold_${meta.id}_hits.a3m") script: """ @@ -44,20 +42,6 @@ process SEARCH_MMSEQS_GPU { ./msas/colabfold_${meta.id} \ ./tmp - /app/mmseqs/bin/mmseqs search \ - --gpu 1 \ - ./querydb/${meta.id} \ - ./mmseqs-gpu/pdb100_230517 \ - ./msas/pdb100_${meta.id} \ - ./tmp - - /app/mmseqs/bin/mmseqs search \ - --gpu 1 \ - ./querydb/${meta.id} \ - ./mmseqs-gpu/uniref30_2302_db \ - ./msas/uniref30_${meta.id} \ - ./tmp - # Convert to a3m files mkdir "msa_inter" mkdir "tmp_out" @@ -69,23 +53,5 @@ process SEARCH_MMSEQS_GPU { /app/mmseqs/bin/mmseqs unpackdb \ ./msa_inter/colabfold_${meta.id} ./tmp_out/colabfold_${meta.id} mv ./tmp_out/colabfold_${meta.id}/0 ./colabfold_${meta.id}_hits.a3m - - /app/mmseqs/bin/mmseqs result2msa \ - ./querydb/${meta.id} \ - ./mmseqs-gpu/pdb100_230517 \ - ./msas/pdb100_${meta.id} \ - ./msa_inter/pdb100_${meta.id} - /app/mmseqs/bin/mmseqs unpackdb \ - ./msa_inter/pdb100_${meta.id} ./tmp_out/pdb100_${meta.id} - mv ./tmp_out/pdb100_${meta.id}/0 ./pdb100_${meta.id}_hits.a3m - - /app/mmseqs/bin/mmseqs result2msa \ - ./querydb/${meta.id} \ - ./mmseqs-gpu/uniref30_2302_db \ - ./msas/uniref30_${meta.id} \ - ./msa_inter/uniref_30${meta.id} - /app/mmseqs/bin/mmseqs unpackdb \ - ./msa_inter/uniref30_${meta.id} ./tmp_out/uniref30_${meta.id} - mv ./tmp_out/uniref30_${meta.id}/0 ./uniref30_${meta.id}_hits.a3m """ } diff --git a/modules/local/run_boltz_mmseqs_gpu/main.nf b/modules/local/run_boltz_mmseqs_gpu/main.nf new file mode 100644 index 000000000..7ad9b18c9 --- /dev/null +++ b/modules/local/run_boltz_mmseqs_gpu/main.nf @@ -0,0 +1,73 @@ +/* + * Run Boltz + */ +process RUN_BOLTZ_MMSEQS_GPU { + tag "$meta.id" + label 'process_medium' + label 'process_gpu' + + container "nf-core/proteinfold_boltz:dev" + + input: + tuple val(meta), path(yaml_samplesheet) + path (files) + path ('boltz1_conf.ckpt') + path ('ccd.pkl') + + output: + tuple val(meta), path ("boltz_results_*/processed/msa/*.npz") , emit: msa + tuple val(meta), path ("boltz_results_*/processed/structures/*.npz") , emit: structures + tuple val(meta), path ("boltz_results_*/predictions/*/confidence*.json") , emit: confidence + tuple val(meta), path ("${meta.id}_plddt_mqc.tsv") , emit: multiqc + tuple val(meta), path ("*boltz.pdb") , emit: pdb + tuple val(meta), path ("boltz_results_*/predictions/*/plddt_*model_0.npz") , emit: plddt + tuple val(meta), path ("boltz_results_*/predictions/*/pae_*model_0.npz") , emit: pae + + path "versions.yml", emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + // Exit if running this module with -profile conda / -profile mamba + if (workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1) { + error("Local RUN_BOLTZ module does not support Conda. Please use Docker / Singularity / Podman instead.") + } + def version = "0.4.1" + def args = task.ext.args ?: '' + + """ + boltz predict "${yaml_samplesheet}" --cache ./ --write_full_pae --output_format pdb + cp boltz_results_*/predictions/*/*.pdb ./${meta.id}_boltz.pdb + + echo -e Atom_serial_number"\\t"Atom_name"\\t"Residue_name"\\t"Residue_sequence_number"\\t"pLDDT > ${meta.id}_plddt_mqc.tsv + awk '{print \$2"\\t"\$3"\\t"\$4"\\t"\$6"\\t"\$11}' boltz_results_*/predictions/*/*.pdb | grep -v 'N/A' | uniq >> ${meta.id}_plddt_mqc.tsv + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + boltz: $version + END_VERSIONS + """ + + stub: + def version = "0.4.1" + """ + mkdir -p boltz_results_${meta.id}/processed/msa/ + mkdir -p boltz_results_${meta.id}/processed/structures/ + mkdir -p boltz_results_${meta.id}/predictions/${meta.id}/ + + touch ${meta.id}_boltz.pdb + touch boltz_results_${meta.id}/processed/msa/${meta.id}.npz + touch boltz_results_${meta.id}/processed/structures/${meta.id}.npz + touch boltz_results_${meta.id}/predictions/${meta.id}/confidence_${meta.id}.json + touch boltz_results_${meta.id}/predictions/${meta.id}/${meta.id}.pdb + touch boltz_results_${meta.id}/predictions/${meta.id}/plddt_${meta.id}_model_0.npz + touch boltz_results_${meta.id}/predictions/${meta.id}/pae_${meta.id}_model_0.npz + touch ${meta.id}_plddt_mqc.tsv + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + boltz: $version + END_VERSIONS + """ +} diff --git a/modules/local/samplesheetutils/main.nf b/modules/local/samplesheetutils/main.nf new file mode 100644 index 000000000..b88295a6a --- /dev/null +++ b/modules/local/samplesheetutils/main.nf @@ -0,0 +1,21 @@ +process SAMPLESHEET_BOLTZ_MSA { + tag "$meta.id" + label "process_medium" + + container "/srv/scratch/sbf/containers/samplesheet-utils-1.3.sif" + + input: + tuple val(meta), path(fasta), path(msa) + + output: + tuple val(meta), path("samplesheet.yaml"), emit: formatted_yaml + + script: + """ + create-samplesheet \ + --directory ./ \ + --msa-dir ./ \ + --output-file samplesheet.yaml \ + --yaml + """ +} diff --git a/workflows/boltz.nf b/workflows/boltz.nf index 1a8f4c17b..6e1648842 100644 --- a/workflows/boltz.nf +++ b/workflows/boltz.nf @@ -22,6 +22,8 @@ include { BOLTZ_FASTA } from '../modules/local/data_convertor/boltz_fasta' include { SPLIT_MSA } from '../modules/local/msa_manager/split_msa' include { MMSEQS_COLABFOLDSEARCH } from '../modules/local/mmseqs_colabfoldsearch' include { MULTIFASTA_TO_CSV } from '../modules/local/multifasta_to_csv' +include { PREPARE_MMSEQS_DB } from '../modules/local/mmseqs_gpu' +include { SEARCH_MMSEQS_GPU } from '../modules/local/mmseqs_gpu' // // SUBWORKFLOW: Consisting entirely of nf-core/modules // @@ -51,6 +53,8 @@ workflow BOLTZ { ch_colabfold_db // channel: [ path(colabfold_db) ] ch_uniref30 // channel: [ path(uniref30) ] msa_server + mmseqs_gpu_msa // If true, run normal pipeline + ch_colabfold_db_gpu main: ch_samplesheet.join( @@ -99,16 +103,36 @@ workflow BOLTZ { .set{ch_prepare_fasta} } - BOLTZ_FASTA( + if (!mmseqs_gpu_msa) { + BOLTZ_FASTA( + ch_prepare_fasta + ) + + RUN_BOLTZ( + BOLTZ_FASTA.out.formatted_fasta.map{[it[0], it[1]]}, + BOLTZ_FASTA.out.formatted_fasta.map{it[2]}, + ch_boltz_model, + ch_boltz_ccd + ) + } else { + PREPARE_MMSEQS_DB( ch_prepare_fasta ) - - RUN_BOLTZ( - BOLTZ_FASTA.out.formatted_fasta.map{[it[0], it[1]]}, - BOLTZ_FASTA.out.formatted_fasta.map{it[2]}, - ch_boltz_model, - ch_boltz_ccd - ) + SEARCH_MMSEQS_GPU( + ch_prepared_fasta + PREPARE_MMSEQS_GPU.out.formatted_yaml, + mmseqs_gpu_msa + ) + SAMPLESHEET_BOLTZ_MSA( + SEARCH_MMSEQS_GPU.out.join(ch_prepared_fasta).map{it[0], it[2], it[1]} + ) + RUN_BOLTZ( + SAMPLESHEET_BOLTZ_MSA.out, + [], + ch_boltz_model, + ch_boltz_ccd + ) + } RUN_BOLTZ .out From 64f7e949555667a0d58e4c6ca22959a71b9a77e2 Mon Sep 17 00:00:00 2001 From: nbtm-sh Date: Mon, 7 Jul 2025 10:26:09 +1000 Subject: [PATCH 6/8] feat(inputs): add inputs for mmseqs --- main.nf | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/main.nf b/main.nf index d228164ac..44e412ba6 100644 --- a/main.nf +++ b/main.nf @@ -458,7 +458,9 @@ workflow NFCORE_PROTEINFOLD { PREPARE_BOLTZ_DBS.out.boltz_model, PREPARE_COLABFOLD_DBS.out.colabfold_db, PREPARE_COLABFOLD_DBS.out.uniref30, - params.boltz_use_msa_server + params.boltz_use_msa_server, + true, + params.colabfold_db_gpu ) ch_multiqc = ch_multiqc.mix(BOLTZ.out.multiqc_report) ch_versions = ch_versions.mix(BOLTZ.out.versions) From 82db9be7eb4e8cac06d823068482c6be22489ba6 Mon Sep 17 00:00:00 2001 From: nbtm-sh Date: Mon, 7 Jul 2025 10:26:33 +1000 Subject: [PATCH 7/8] feat(inputs): Change inputs for mmseqs gpu --- modules/local/mmseqs_gpu/main.nf | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/modules/local/mmseqs_gpu/main.nf b/modules/local/mmseqs_gpu/main.nf index 312054af5..0053ee8a1 100644 --- a/modules/local/mmseqs_gpu/main.nf +++ b/modules/local/mmseqs_gpu/main.nf @@ -25,8 +25,7 @@ process SEARCH_MMSEQS_GPU { container "/srv/scratch/sbf/containers/mmseqs-gpu.sif" input: - tuple val(meta), path(fasta) - path ("querydb") + tuple val(meta), path(fasta), path(querydb) path ("mmseqs-gpu") output: @@ -37,7 +36,7 @@ process SEARCH_MMSEQS_GPU { mkdir "msas" /app/mmseqs/bin/mmseqs search \ --gpu 1 \ - ./querydb/${meta.id} \ + ./${querydb}/${meta.id} \ ./mmseqs-gpu/colabfold_envdb_202108_db \ ./msas/colabfold_${meta.id} \ ./tmp From 47aeeeba70332cced54a02176cccfe5ae52e1471 Mon Sep 17 00:00:00 2001 From: nbtm-sh Date: Mon, 7 Jul 2025 10:26:47 +1000 Subject: [PATCH 8/8] feat(boltz-mmseqs): Use mmseqs-gpu in boltz --- workflows/boltz.nf | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/workflows/boltz.nf b/workflows/boltz.nf index 6e1648842..077b23eba 100644 --- a/workflows/boltz.nf +++ b/workflows/boltz.nf @@ -24,6 +24,7 @@ include { MMSEQS_COLABFOLDSEARCH } from '../modules/local/mmseqs_colabfoldsearch include { MULTIFASTA_TO_CSV } from '../modules/local/multifasta_to_csv' include { PREPARE_MMSEQS_DB } from '../modules/local/mmseqs_gpu' include { SEARCH_MMSEQS_GPU } from '../modules/local/mmseqs_gpu' +include { SAMPLESHEET_BOLTZ_MSA } from '../modules/local/samplesheetutils/' // // SUBWORKFLOW: Consisting entirely of nf-core/modules // @@ -116,15 +117,17 @@ workflow BOLTZ { ) } else { PREPARE_MMSEQS_DB( - ch_prepare_fasta + ch_samplesheet ) + PREPARE_MMSEQS_DB.out.view() + ch_samplesheet.join(PREPARE_MMSEQS_DB.out).view() SEARCH_MMSEQS_GPU( - ch_prepared_fasta - PREPARE_MMSEQS_GPU.out.formatted_yaml, - mmseqs_gpu_msa + ch_samplesheet.join(PREPARE_MMSEQS_DB.out), + ch_colabfold_db_gpu, ) + SEARCH_MMSEQS_GPU.out.view() SAMPLESHEET_BOLTZ_MSA( - SEARCH_MMSEQS_GPU.out.join(ch_prepared_fasta).map{it[0], it[2], it[1]} + ch_samplesheet.join(SEARCH_MMSEQS_GPU.out) ) RUN_BOLTZ( SAMPLESHEET_BOLTZ_MSA.out,