diff --git a/.github/actions/nf-test/action.yml b/.github/actions/nf-test/action.yml index 243e78238..bf44d9612 100644 --- a/.github/actions/nf-test/action.yml +++ b/.github/actions/nf-test/action.yml @@ -54,13 +54,9 @@ runs: conda-solver: libmamba conda-remove-defaults: true - # TODO Skip failing conda tests and document their failures - # https://github.com/nf-core/modules/issues/7017 - name: Run nf-test shell: bash env: - NFT_DIFF: ${{ env.NFT_DIFF }} - NFT_DIFF_ARGS: ${{ env.NFT_DIFF_ARGS }} NFT_WORKDIR: ${{ env.NFT_WORKDIR }} run: | nf-test test \ diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index f2d7d1dd7..8b0f88c36 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -13,7 +13,7 @@ jobs: steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 with: python-version: "3.13" diff --git a/.github/workflows/linting_comment.yml b/.github/workflows/linting_comment.yml index 7e8050fb8..d43797d9d 100644 --- a/.github/workflows/linting_comment.yml +++ b/.github/workflows/linting_comment.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Download lint results - uses: dawidd6/action-download-artifact@4c1e823582f43b179e2cbb49c3eade4e41f992e2 # v10 + uses: dawidd6/action-download-artifact@ac66b43f0e6a346234dd65d4d0c8fbb31cb316e5 # v11 with: workflow: linting.yml workflow_conclusion: completed diff --git a/.github/workflows/nf-test.yml b/.github/workflows/nf-test.yml index f03aea0c0..e7b58449b 100644 --- a/.github/workflows/nf-test.yml +++ b/.github/workflows/nf-test.yml @@ -1,12 +1,5 @@ name: Run nf-test on: - push: - paths-ignore: - - "docs/**" - - "**/meta.yml" - - "**/*.md" - - "**/*.png" - - "**/*.svg" pull_request: paths-ignore: - "docs/**" @@ -35,7 +28,7 @@ jobs: nf-test-changes: name: nf-test-changes runs-on: # use self-hosted runners - - runs-on=$-nf-test-changes + - runs-on=${{ github.run_id }}-nf-test-changes - runner=4cpu-linux-x64 outputs: shard: ${{ steps.set-shards.outputs.shard }} @@ -69,7 +62,7 @@ jobs: needs: [nf-test-changes] if: ${{ needs.nf-test-changes.outputs.total_shards != '0' }} runs-on: # use self-hosted runners - - runs-on=$-nf-test + - runs-on=${{ github.run_id }}-nf-test - runner=4cpu-linux-x64 strategy: fail-fast: false @@ -85,7 +78,7 @@ jobs: - isMain: false profile: "singularity" NXF_VER: - - "24.04.2" + - "24.10.5" - "latest-everything" env: NXF_ANSI_LOG: false @@ -97,23 +90,39 @@ jobs: fetch-depth: 0 - name: Run nf-test + id: run_nf_test uses: ./.github/actions/nf-test + continue-on-error: ${{ matrix.NXF_VER == 'latest-everything' }} env: - NFT_DIFF: ${{ env.NFT_DIFF }} - NFT_DIFF_ARGS: ${{ env.NFT_DIFF_ARGS }} NFT_WORKDIR: ${{ env.NFT_WORKDIR }} with: profile: ${{ matrix.profile }} shard: ${{ matrix.shard }} total_shards: ${{ env.TOTAL_SHARDS }} + + - name: Report test status + if: ${{ always() }} + run: | + if [[ "${{ steps.run_nf_test.outcome }}" == "failure" ]]; then + echo "::error::Test with ${{ matrix.NXF_VER }} failed" + # Add to workflow summary + echo "## ❌ Test failed: ${{ matrix.profile }} | ${{ matrix.NXF_VER }} | Shard ${{ matrix.shard }}/${{ env.TOTAL_SHARDS }}" >> $GITHUB_STEP_SUMMARY + if [[ "${{ matrix.NXF_VER }}" == "latest-everything" ]]; then + echo "::warning::Test with latest-everything failed but will not cause workflow failure. Please check if the error is expected or if it needs fixing." + fi + if [[ "${{ matrix.NXF_VER }}" != "latest-everything" ]]; then + exit 1 + fi + fi + confirm-pass: needs: [nf-test] if: always() runs-on: # use self-hosted runners - - runs-on=$-confirm-pass + - runs-on=${{ github.run_id }}-confirm-pass - runner=2cpu-linux-x64 steps: - - name: One or more tests failed + - name: One or more tests failed (excluding latest-everything) if: ${{ contains(needs.*.result, 'failure') }} run: exit 1 @@ -132,11 +141,3 @@ jobs: echo "DEBUG: toJSON(needs) = ${{ toJSON(needs) }}" echo "DEBUG: toJSON(needs.*.result) = ${{ toJSON(needs.*.result) }}" echo "::endgroup::" - - - name: Clean Workspace # Purge the workspace in case it's running on a self-hosted runner - if: always() - run: | - ls -la ./ - rm -rf ./* || true - rm -rf ./.??* || true - ls -la ./ diff --git a/.github/workflows/release-announcements.yml b/.github/workflows/release-announcements.yml index 4abaf4843..0f7324956 100644 --- a/.github/workflows/release-announcements.yml +++ b/.github/workflows/release-announcements.yml @@ -30,7 +30,7 @@ jobs: bsky-post: runs-on: ubuntu-latest steps: - - uses: zentered/bluesky-post-action@4aa83560bb3eac05dbad1e5f221ee339118abdd2 # v0.2.0 + - uses: zentered/bluesky-post-action@6461056ea355ea43b977e149f7bf76aaa572e5e8 # v0.3.0 with: post: | Pipeline release! ${{ github.repository }} v${{ github.event.release.tag_name }} - ${{ github.event.release.name }}! diff --git a/.gitignore b/.gitignore index a42ce0162..c162b2451 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ testing/ testing* *.pyc null/ +.nf* diff --git a/.nf-core.yml b/.nf-core.yml index c0836010b..eda30c3c5 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -3,7 +3,7 @@ lint: - .github/workflows/linting.yml - .github/CONTRIBUTING.md multiqc_config: false -nf_core_version: 3.3.1 +nf_core_version: 3.3.2 repository_type: pipeline template: author: Athanasios Baltzis, Jose Espinosa-Carrasco, Harshil Patel diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 9d0b248d3..bb41beec1 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -4,7 +4,7 @@ repos: hooks: - id: prettier additional_dependencies: - - prettier@3.5.0 + - prettier@3.6.2 - repo: https://github.com/pre-commit/pre-commit-hooks rev: v5.0.0 hooks: diff --git a/CHANGELOG.md b/CHANGELOG.md index 2b420ee5b..1d98455cf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,45 +40,77 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [[PR #306](https://github.com/nf-core/proteinfold/pull/306)] - extract_output.py -> extract_metrics.py so pLDDT, MSA, PAE emitted as raw data .tsv files - [[PR #307](https://github.com/nf-core/proteinfold/pull/307)] - Update Boltz-1 boilerplate and formatting. - [[PR #314](https://github.com/nf-core/proteinfold/pull/314)] - Fix extract metrics for broken modules. +- [[PR #312](https://github.com/nf-core/proteinfold/pull/312)] - pTM & ipTM metrics now extracted - [[PR #315](https://github.com/nf-core/proteinfold/pull/315)] - Add global db flag. - [[#263](https://github.com/nf-core/proteinfold/issues/263)] - Removed broken colabfold options (`auto` and `alphafold2`) - [[PR #316](https://github.com/nf-core/proteinfold/pull/316)] - Add process_gpu label to modules which use GPU. - [[PR #319](https://github.com/nf-core/proteinfold/pull/319)] - Update boltz workflow to accept YAML as input. - [[PR #322](https://github.com/nf-core/proteinfold/pull/322)] - Updates and reorganises the reference database directory structure. +- [[PR #329](https://github.com/nf-core/proteinfold/pull/329)] - Updates Boltz module to include Boltz-2. - [[PR #332](https://github.com/nf-core/proteinfold/pull/332)] - Fix rare superposition bug in reports. - [[PR #333](https://github.com/nf-core/proteinfold/pull/333)] - Updates the RFAA dockerfile for better versioning and smaller image size. - [[PR #335](https://github.com/nf-core/proteinfold/pull/335)] - Update pipeline template to [nf-core/tools 3.3.1](https://github.com/nf-core/tools/releases/tag/3.3.1). +- [[PR #346](https://github.com/nf-core/proteinfold/pull/346)] - Update pipeline template to [nf-core/tools 3.3.2](https://github.com/nf-core/tools/releases/tag/3.3.2). +- [[PR #351](https://github.com/nf-core/proteinfold/pull/351)] - add chain-wise (i)pTM values and summary file for AF3-generation codes. +- [[PR #355](https://github.com/nf-core/proteinfold/pull/355)] - Remove unneccesary params from Boltz and Helixfold3 modes. +- [[PR #356](https://github.com/nf-core/proteinfold/pull/356)] - Update AF2 defaults to use split mode and monomer_ptm model. +- [[PR #357](https://github.com/nf-core/proteinfold/pull/357)] - Update ColabFold module and image. +- [[PR #359](https://github.com/nf-core/proteinfold/pull/359)] - Harmonize parameters across modes. +- [[PR #360](https://github.com/nf-core/proteinfold/pull/360)] - Rename some DBs paths in the run modules so they are equal to those when DBs are downloaded. +- [[PR #362](https://github.com/nf-core/proteinfold/pull/355)] - Update boltz Dockerfile and image pinning specific version (2.0.3). +- [[#364](https://github.com/nf-core/proteinfold/issues/364)] - Move Dockerfiles to its corresponding module. +- [[PR #370](https://github.com/nf-core/proteinfold/pull/370)] - Fix extract chain metrics. +- [[#367](https://github.com/nf-core/proteinfold/issues/367)] - Boltz post-processing crashes. +- [[#368](https://github.com/nf-core/proteinfold/issues/368)] - Helixfold3 iPTM output missing when dealing with monomers make the process to fail. ### Parameters -| Old parameter | New parameter | -| ---------------------------- | ------------------------------ | -| | `--pdb_obsolete_path` | -| `--small_bfd_link` | `--alphafold2_small_bfd_link` | -| `--mgnify_link` | `--alphafold2_mgnify_link` | -| `--pdb_mmcif_link` | `--alphafold2_pdb_mmcif_link` | -| `--uniref30_alphafold2_link` | `--alphafold2_uniref30_link` | -| `--uniref90_link` | `--alphafold2_uniref90_link` | -| `--pdb_seqres_link` | `--alphafold2_pdb_seqres_link` | -| `--small_bfd_path` | `--alphafold2_small_bfd_path` | -| `--mgnify_path_alphafold2` | `--alphafold2_mgnify_path` | -| `--pdb_mmcif_path` | `--alphafold2_pdb_mmcif_path` | -| `--uniref30_alphafold2_path` | `--alphafold2_uniref30_path` | -| `--uniref90_path` | `--alphafold2_uniref90_path` | -| `--pdb_seqres_path` | `--alphafold2_pdb_seqres_path` | -| `--uniprot_path` | `--alphafold2_uniprot_path` | -| | `--alphafold3_small_bfd_link` | -| | `--alphafold3_mgnify_link` | -| | `--alphafold3_uniref90_link` | -| | `--alphafold3_pdb_seqres_link` | -| | `--uniprot_link` | -| | `--alphafold3_small_bfd_path` | -| | `--alphafold3_params_path` | -| | `--alphafold3_mgnify_path` | -| | `--alphafold3_pdb_mmcif_path` | -| | `--alphafold3_uniref90_path` | -| | `--alphafold3_pdb_seqres_path` | -| | `--alphafold3_uniprot_path` | +| Old parameter | New parameter | +| ---------------------------- | -------------------------------- | +| | `--alphafold2_pdb_obsolete_path` | +| `--small_bfd_link` | `--alphafold2_small_bfd_link` | +| `--mgnify_link` | `--alphafold2_mgnify_link` | +| `--pdb_mmcif_link` | `--alphafold2_pdb_mmcif_link` | +| `--uniref30_alphafold2_link` | `--alphafold2_uniref30_link` | +| `--uniref90_link` | `--alphafold2_uniref90_link` | +| `--pdb_seqres_link` | `--alphafold2_pdb_seqres_link` | +| `--small_bfd_path` | `--alphafold2_small_bfd_path` | +| `--mgnify_path_alphafold2` | `--alphafold2_mgnify_path` | +| `--pdb_mmcif_path` | `--alphafold2_pdb_mmcif_path` | +| `--uniref30_alphafold2_path` | `--alphafold2_uniref30_path` | +| `--uniref90_path` | `--alphafold2_uniref90_path` | +| `--pdb_seqres_path` | `--alphafold2_pdb_seqres_path` | +| `--uniprot_path` | `--alphafold2_uniprot_path` | +| | `--alphafold3_small_bfd_link` | +| | `--alphafold3_mgnify_link` | +| | `--alphafold3_uniref90_link` | +| | `--alphafold3_pdb_seqres_link` | +| | `--alphafold3_uniprot_link` | +| | `--alphafold3_small_bfd_path` | +| | `--alphafold3_params_path` | +| | `--alphafold3_mgnify_path` | +| | `--alphafold3_pdb_mmcif_path` | +| | `--alphafold3_uniref90_path` | +| | `--alphafold3_pdb_seqres_path` | +| | `--alphafold3_uniprot_path` | +| | `--boltz_model` | +| | `--boltz_out_dir` | +| | `--boltz_output_format` | +| | `--boltz_use_msa_server` | +| | `--boltz_msa_server_url` | +| | `--boltz_use_potentials` | +| | `--boltz_write_full_pae` | +| | `--boltz2_aff_path` | +| | `--boltz2_conf_path` | +| | `--boltz2_mols_path` | +| | `--boltz_model_path` | +| | `--boltz_ccd_path` | +| | `--boltz_db` | +| | `--boltz2_aff_link` | +| | `--boltz2_conf_link` | +| | `--boltz2_mols_link` | +| | `--boltz_model_link` | +| | `--boltz_ccd_link` | > **NB:** Parameter has been **updated** if both old and new parameter information is present. > **NB:** Parameter has been **added** if just the new parameter information is present. @@ -161,8 +193,8 @@ Thank you to everyone else that has contributed by reporting bugs, enhancements | `--uniprot_sprot` | `--uniprot_sprot_link` | | `--uniprot_trembl` | `--uniprot_trembl_link` | | `--uniclust30_path` | `--uniref30_alphafold2_path` | -| `--uniref30` | `--uniref30_colabfold_link` | -| `--uniref30_path` | `--uniref30_colabfold_path` | +| `--uniref30` | `--colabfold_uniref30_link` | +| `--uniref30_path` | `--colabfold_uniref30_path` | | `--num_recycle` | `--num_recycles_colabfold` | | | `--num_recycles_esmfold` | | | `--uniref30_alphafold2_link` | diff --git a/README.md b/README.md index 3d8ea77d3..f6f90ce91 100644 --- a/README.md +++ b/README.md @@ -5,12 +5,11 @@ -[![GitHub Actions CI Status](https://github.com/nf-core/proteinfold/actions/workflows/ci.yml/badge.svg)](https://github.com/nf-core/proteinfold/actions/workflows/ci.yml) +[![GitHub Actions CI Status](https://github.com/nf-core/proteinfold/actions/workflows/nf-test.yml/badge.svg)](https://github.com/nf-core/proteinfold/actions/workflows/nf-test.yml) [![GitHub Actions Linting Status](https://github.com/nf-core/proteinfold/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/proteinfold/actions/workflows/linting.yml)[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/proteinfold/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.13135393-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.13135393) -[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com) -[![Nextflow](https://img.shields.io/badge/version-%E2%89%A524.04.2-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/) -[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.3.1-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.3.1) +[![Nextflow](https://img.shields.io/badge/version-%E2%89%A524.10.5-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/) +[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.3.2-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.3.2) [![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/) [![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/) [![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/) @@ -117,7 +116,6 @@ The pipeline takes care of downloading the databases and parameters required by --input samplesheet.csv \ --outdir \ --mode colabfold \ - --colabfold_server local \ --colabfold_db \ --num_recycles_colabfold 3 \ --use_amber \ @@ -134,8 +132,8 @@ The pipeline takes care of downloading the databases and parameters required by --input samplesheet.csv \ --outdir \ --mode colabfold \ - --colabfold_server webserver \ - --host_url \ + --use_msa_server \ + --msa_server_url \ --colabfold_db \ --num_recycles_colabfold 3 \ --use_amber \ diff --git a/bin/extract_metrics.py b/bin/extract_metrics.py index 4ea1d0e03..f14b4aab8 100755 --- a/bin/extract_metrics.py +++ b/bin/extract_metrics.py @@ -6,11 +6,28 @@ #import torch moved to a conditional import since too bulky import if not used import numpy as np import csv -from utils import plddt_from_struct_b_factor +import string +from utils import plddt_from_struct_b_factor, get_chain_ids -# TODO: add extraction of other values, iPTM, etc +# TODO: Issue #309, make into a poper separate process, it its own module so that dependencies can be managed better +# TODO: Need a sense of ranking, so that metrics can be traced back to correct model structure, even if they're not in sequential order. The enumerates() here are not sufficient. +# Needs to be program-dependent, (see item below). # TODO: look into have a --prog argument that could set filenames etc, logically seperate it? -# {id}_{prog}_{metric}.tsv might be easier for MultiQC to parse a complex workdir, than without the .prog +# {name}_{prog}_{metric}.tsv might be easier for MultiQC to parse a complex workdir, than without the .prog +# TODO: read --prog from ${meta.model} in the NextFlow pipes. This also allows case switching in a proper EXTRACT_METRICS process. +# E.g. in main.nf of EXTACT_METRICS process, we could have: +# match ${meta.mode}: +# case 'alphafold2': +# ... +# case 'rosettafold_all_atom': +# ... +#... +# ^ overwrought with duplication, but can catch program specific weirdness, and lower barrier to adding new programs in the future. + +# TODO: Chain-wise iPTM since the relevant interface might not always be the average of all. +# Would complete Issue #308 +# Proposed format is pair-interfaces in rows, structure inference number in cols: https://github.com/nf-core/proteinfold/pull/312#issuecomment-2917709432 +# KR - changed to have both sides of the matrix, because it's not symmetrical (see comment in Issue #306) # Mapping of characters to integers for MSA parsing. # 20 is for unknown characters, and 21 is for gaps. @@ -47,12 +64,54 @@ def format_msa_rows(msa_data): def format_pae_rows(pae_data): return [[f"{num:.4f}" for num in row] for row in pae_data] +def format_iptm_rows(chain_pair_entries, chain_ids=None): + """ + Format iPTM data into a list of rows for writing to a TSV file. + Each row contains: the chain-pair in uppercase, e.g. "A:B", "B:A", A:C", etc. and then the iPTM value formatted to 4 decimal places. + """ + def idx_to_letter(idx): + """ Convert the index integer of the matrix to a letter representation that wraps to double representation, e.g. 0 -> A, 1 -> B, ..., 25 -> Z, 26 -> AA, 27 -> AB, etc. + This is somewhat compatible with how protein structure chain names are numbered by biochemists. + But we should move away from fixed-format PDB files -- we have nothing to lose but our chains.""" + result = "" + while idx >= 0: + result = string.ascii_uppercase[idx % 26] + result + idx = idx // 26 - 1 + if idx < 0: + break + return result + + if chain_ids: + #would be better with some model_id sorting + iptm_rows = [[""]+[f"{chain_ids[idx[0]]}:{chain_ids[idx[1]]}" for idx, val in next(iter(chain_pair_entries.values()))]] + else: + iptm_rows = [[""]+[f"{idx_to_letter(idx[0])}:{idx_to_letter(idx[1])}" for idx, val in next(iter(chain_pair_entries.values()))]] + + for model_idx, chain_pair_entries_values in chain_pair_entries.items(): + iptm_rows.append([model_idx]+[f"{val:.4f}" for idx, val in chain_pair_entries_values]) + + return [list(row) for row in zip(*iptm_rows)] + + +def chain_iptm_matrix_to_pairs(iptm_matrix): + """ + Convert a chain-wise iPTM matrix to pair values by taking off-diagonal elements. + """ + # From AlphaFold3 output docs: + # 'chain_pair_iptm': An [num_chains, num_chains] array. + # Off-diagonal element (i, j) of the array contains the ipTM restricted to tokens from chains i and j. + # Diagonal element (i, i) contains the pTM restricted to chain i. + return [(idx, val) for idx, val in np.ndenumerate(iptm_matrix) if idx[0] != idx[1]] + +def chainwise_iptm_matrix_to_ptms(iptm_matrix): + return [(idx, val) for idx, val in np.ndenumerate(iptm_matrix) if idx[0] == idx[1]] + def write_tsv(file_path, rows): with open(file_path, 'w') as out_f: writer = csv.writer(out_f, delimiter='\t') writer.writerows(rows) -def extract_structs_plddt_to_tsv(id, structures): +def extract_structs_plddt_to_tsv(name, structures): """ Write out a tsv file contain pLDDTs for reading by MultiQC in nf-core/proteinfold Uses utils function with BioPython PDB package to extract residue pLDDT values from the b-factor column. @@ -68,47 +127,87 @@ def extract_structs_plddt_to_tsv(id, structures): plddt_rows = [["Positions"] + rank_names] res_id_col = list(range(len(plddt_cols[0]))) plddt_rows.extend(zip(res_id_col, *plddt_cols)) # Combine lists column-wise to make rows - write_tsv(f"{id}_plddt.tsv", plddt_rows) + write_tsv(f"{name}_plddt.tsv", plddt_rows) -def read_pkl(id, pkl_files): +def read_pkl(name, pkl_files): """ Adapted from the Galaxy AlphaFold tool (https://github.com/usegalaxy-au/tools-au/blob/de94df520c8dc7b8652aedb92e90f6ebb312f95f/tools/alphafold/scripts/outputs.py), originally authored by @neoformit and @graceahall and funded by Australian Biocommons and QCIF Australia. """ + ptm_data = {} + iptm_data = {} for pkl_file in pkl_files: print(f"Processing {pkl_file}") data = pickle.load(open(pkl_file, "rb")) # Process MSA data if pkl_file.endswith("final_features.pkl"): # HelixFold3 - This one must be first - write_tsv(f"{id}_msa.tsv", format_msa_rows(data["feat"]["msa"])) + write_tsv(f"{name}_msa.tsv", format_msa_rows(data["feat"]["msa"])) elif pkl_file.endswith("features.pkl"): # AlphaFold2.3 # TODO: AlphaFold2.3 fills end rows with 0s in AlpahFold muliter for an alanine nf-core/proteinfold Issue #300 - write_tsv(f"{id}_msa.tsv", format_msa_rows(data["msa"])) + write_tsv(f"{name}_msa.tsv", format_msa_rows(data["msa"])) # AlphaFold2.3 non-summary, for each pkl. TODO: Need to either read in ranking_debug.json to get the ranking order, or do it later in the workflow. else: model_id = os.path.basename(pkl_file).replace("result_model_", "").replace(".pkl", "") - write_tsv(f"{id}_{model_id}_lddt.tsv", format_msa_rows(data["plddt"])) if 'predicted_aligned_error' not in data.keys(): print(f"No PAE output in {pkl_file}, it was likely a monomer calculation") - write_tsv(f"{id}_{model_id}_pae.tsv", None) else: - write_tsv(f"{id}_{model_id}_pae.tsv", format_pae_rows(data["predicted_aligned_error"])) + write_tsv(f"{name}_{model_id}_pae.tsv", format_pae_rows(data["predicted_aligned_error"])) + + if 'ptm' not in data.keys(): + print(f"No pTM/iPTM output in {pkl_file}, it was likely a monomer calculation") + else: + #with open(f"{name}_{model_id}_ptm.tsv", 'w') as f: + # f.write(f"{np.round(data['ptm'],3)}\n") + #with open(f"{name}_{model_id}_iptm.tsv", 'w') as f: + # f.write(f"{np.round(data['iptm'],3)}\n") + ptm_data[f"{model_id}"] = f"{np.round(data['ptm'],3)}\n" + iptm_data[f"{model_id}"] = f"{np.round(data.get('iptm',0.),3)}\n" + if ptm_data: + ptm_rows = [[k, v.strip()] for k, v in ptm_data.items()] + write_tsv(f"{name}_ptm.tsv", ptm_rows) + + if iptm_data: + iptm_rows = [[k, v.strip()] for k, v in iptm_data.items()] + write_tsv(f"{name}_iptm.tsv", iptm_rows) + + -def read_a3m(id, a3m_files): +def read_a3m(name, a3m_files): # ColabFold, RosettaFold-All-Atom, Boltz-1 for a3m_file in a3m_files: int_seqs = a3m_to_int(a3m_file) - write_tsv(f"{id}_msa.tsv", format_msa_rows(int_seqs)) + write_tsv(f"{name}_msa.tsv", format_msa_rows(int_seqs)) -def read_npz(id, npz_files): +def read_npz(name, npz_files): for idx, npz_file in enumerate(npz_files): data = np.load(npz_file) #Boltz PAE files if --write_full_pae is used if npz_file.split('/')[-1].startswith('pae') and npz_file.endswith('.npz'): - write_tsv(f"{id}_{idx}_pae.tsv", format_pae_rows(data["pae"])) + model_id = os.path.basename(npz_file).split('_model_')[-1].split('.npz')[0] + write_tsv(f"{name}_{model_id}_pae.tsv", format_pae_rows(data["pae"])) + +def read_csv(name, csv_files): + for idx, csv_file in enumerate(csv_files): + if not os.path.isfile(csv_file): return #TODO: Fix temporary workaround + model_id = os.path.basename(csv_file).split('_')[-1].split('.csv')[0] + msa_lines = [] + with open(csv_file) as f: + f.readline() + for line in f: + msa_lines.append(''.join(c for c in line.strip('\n').split(',')[1] if not c.islower())) + msa_rows = [[str(AA_to_int.get(residue, 20)) for residue in line] for line in msa_lines] + write_tsv(f"{name}_msa.tsv", msa_rows) + break # only 1 csv + +def read_json(name, json_files): + ptm_data = {} + iptm_data = {} + chain_pair_iptm_data = {} # For iPTM data to be converted into formatted pairs with non-self elements + chain_pair_entries = {} + chainwise_ptms = {} + chain_ids = [] -def read_json(id, json_files): for idx, json_file in enumerate(json_files): with open(json_file, 'r') as f: data = json.load(f) @@ -117,12 +216,74 @@ def read_json(id, json_files): unpaired_MSAs = data['sequences'][0]['protein']['unpairedMsa'] msa_lines = [''.join(c for c in line if not c.islower()) for line in unpaired_MSAs.split("\n") if line.strip() and not line.startswith(">")] msa_rows = [[str(AA_to_int.get(residue, 20)) for residue in line] for line in msa_lines] - write_tsv(f"{id}_msa.tsv", msa_rows) + write_tsv(f"{name}_msa.tsv", msa_rows) #AF3 output with PAE info, or HF3 PAE data. TODO: Need to make sure the workflow points to [protein]/[protein]_rank1/all_results.json - elif "pae" in data: - write_tsv(f"{id}_{idx}_pae.tsv", format_pae_rows(data["pae"])) -def read_pt(id, pt_files): + # TODO: I think I need to capture model_id and inference_id -- MUST FIX since this is so fragile and will be different for different programs. + #if '_alphafold2_ptm_model_' in json_file: # ColabFold, multimer or monomer + ## Might want to cut more if I just want ${meta.id}_[metric].tsv + # model_id = os.path.basename(json_file) + # print(model_id) + if 'all_results' in json_file: # Individual predictions in HF3 + model_id = int(os.path.dirname(json_file).split('-rank')[-1]) #Use re-ranked output + if 'predictions' in json_file: # Boltz-1 confidences in predictions/[protein]/confidence_[protein]_model_*.json + # TODO: haven't tested this for multiple models with --diffusion_samples + model_id = os.path.basename(json_file).split('_model_')[-1].split('.json')[0] + if 'summary_confidences' in json_file: #Prevent crash when model_id is not defined + model_id = os.path.basename(json_file).split('summary_confidences_')[-1].split('.json')[0] + + if "pae" not in data.keys(): + print(f"No PAE output in {json_file}, it was likely a monomer calculation") + else: + write_tsv(f"{name}_{model_id}_pae.tsv", format_pae_rows(data["pae"])) + + if 'ptm' not in data.keys(): + print(f"No pTM/iPTM output in {json_file}, it was likely a monomer calculation") + #This message should change - currently called on boltz files not expected to contain ptm + else: + ptm_data[model_id] = f"{np.round(data['ptm'],3)}\n" + + if 'iptm' not in data.keys(): + print(f"No pTM/iPTM output in {json_file}, it was likely a monomer calculation") + else: + iptm_data[model_id] = f"{np.round(data['iptm'],3)}\n" + + if 'chain_pair_iptm' not in data.keys() and 'pair_chains_iptm' not in data.keys(): + print(f"No chain-wise iPTM output in {json_file}, it was likely a monomer calculation") + else: + if 'chain_pair_iptm' in data.keys(): + chain_pair_iptm_data = data['chain_pair_iptm'] + chain_iptm_matrix = np.array(chain_pair_iptm_data) + elif 'pair_chains_iptm' in data.keys(): #Boltz key + chain_pair_iptm_data = data['pair_chains_iptm'] + # casting to int works for sorting boltz - need to carefully check other modes + chain_iptm_matrix = np.array([[chain_pair_iptm_data[row][col] for col in sorted(chain_pair_iptm_data[row], key=int)] for row in sorted(chain_pair_iptm_data, key=int)]) + basename = os.path.basename(json_file) + dirname = os.path.dirname(json_file) + pdb_name = ".".join(basename[11:].split('.')[:-1])+'.pdb' #TODO: Fix magic number + chain_ids = get_chain_ids(os.path.join(dirname,pdb_name)) + else: + raise ValueError("No chain-wise iPTM data found in the JSON file.") + + chain_pair_entries[model_id] = chain_iptm_matrix_to_pairs(chain_iptm_matrix) + chainwise_ptms[model_id] = chainwise_iptm_matrix_to_ptms(chain_iptm_matrix) + + if chainwise_ptms: + write_tsv(f"{name}_chainwise_ptm.tsv", format_iptm_rows(chainwise_ptms, chain_ids=chain_ids)) + + if chain_pair_entries: + write_tsv(f"{name}_chainwise_iptm.tsv", format_iptm_rows(chain_pair_entries, chain_ids=chain_ids)) + + if ptm_data: + ptm_rows = [[k, v.strip()] for k, v in sorted(ptm_data.items(), key=lambda x: x[0])] + write_tsv(f"{name}_ptm.tsv", ptm_rows) + + if iptm_data: + iptm_rows = [[k, v.strip()] for k, v in sorted(iptm_data.items(), key=lambda x: x[0])] + write_tsv(f"{name}_iptm.tsv", iptm_rows) + + +def read_pt(name, pt_files): import torch # moved to a conditional import since too bulky import if not used for pt_file in pt_files: with open(pt_file, 'rb') as f: # TODO: point to [protein]_aux.pt @@ -130,24 +291,26 @@ def read_pt(id, pt_files): if 'pae' in data: # The pt file contains a tensor that needs to be cast as an array # Squeeze leading dimension (batch?) - write_tsv(f"{id}_pae.tsv", format_pae_rows(np.squeeze(data["pae"].numpy()))) + write_tsv(f"{name}_pae.tsv", format_pae_rows(np.squeeze(data["pae"].numpy()))) def main(): parser = argparse.ArgumentParser() parser.add_argument("--pkls", dest="pkls", required=False, nargs="+") # For reading both HelixFold3 and AlphaFold2 MSA formats parser.add_argument("--npzs", dest="npzs", required=False, nargs="+") # For reading the Boltz-1 PAE formats. TODO: Boltz-1 MSA not implemented (go straight to .a3m file), implement - parser.add_argument("--a3ms", dest="a3ms", required=False, nargs="+") # For reading the RosettaFold-All-Atom, ColabFold, and Boltz-1 MSA formats + parser.add_argument("--a3ms", dest="a3ms", required=False, nargs="+") # For reading the RosettaFold-All-Atom, ColabFold MSA formats + parser.add_argument("--csvs", dest="csvs", required=False, nargs="+") # For reading boltz csvs parser.add_argument("--jsons", dest="jsons", required=False, nargs="+") # For reading the AF3 MSA & PAE, HF3 PAE parser.add_argument("--pts", dest="pts", required=False, nargs="+") # For read RFAA pytorch model to get PAE data parser.add_argument("--structs", dest="structs", required=False, nargs="+") parser.add_argument("--name", default="untitled", dest="name") # might need a --name $meta.id - parser.add_argument("--output_dir", default=".", dest="output_dir") args = parser.parse_args() if args.pkls: read_pkl(args.name, args.pkls) if args.a3ms: read_a3m(args.name, args.a3ms) + if args.csvs: + read_csv(args.name, args.csvs) if args.npzs: read_npz(args.name, args.npzs) if args.jsons: diff --git a/bin/utils.py b/bin/utils.py index 8540fd4ca..60f2f1cd8 100755 --- a/bin/utils.py +++ b/bin/utils.py @@ -49,6 +49,19 @@ def plddt_from_struct_b_factor_adhoc(struct_file): return res_plddts +def get_chain_ids(struct_file): + from Bio import PDB + if str(struct_file).endswith(".pdb"): + parser = PDB.PDBParser(QUIET=True) + structure = parser.get_structure(id=id, file=struct_file) + elif str(struct_file).endswith(".cif"): + parser = PDB.MMCIFParser(QUIET=True) + structure = parser.get_structure(structure_id=id, filename=struct_file) + else: + raise ValueError(f"{struct_file} is neither a PDB or mmCIF file!") + + return [chain.id for chain in structure.get_chains()] + def plddt_from_struct_b_factor_biopython(struct_file): """ diff --git a/conf/base.config b/conf/base.config index 78bd99e3d..e97c7627b 100644 --- a/conf/base.config +++ b/conf/base.config @@ -64,5 +64,6 @@ process { } withLabel: process_gpu { ext.use_gpu = { workflow.profile.contains('gpu') } + accelerator = { workflow.profile.contains('gpu') ? 1 : null } } } diff --git a/conf/dbs.config b/conf/dbs.config index 03243a892..ed595beec 100644 --- a/conf/dbs.config +++ b/conf/dbs.config @@ -14,31 +14,31 @@ params { uniref30_prefix = "UniRef30_2023_02" // AlphaFold2 links - bfd_link = 'https://storage.googleapis.com/alphafold-databases/casp14_versions/bfd_metaclust_clu_complete_id30_c90_final_seq.sorted_opt.tar.gz' - alphafold2_small_bfd_link = 'https://storage.googleapis.com/alphafold-databases/reduced_dbs/bfd-first_non_consensus_sequences.fasta.gz' - alphafold2_params_link = 'https://storage.googleapis.com/alphafold/alphafold_params_2022-12-06.tar' - alphafold2_mgnify_link = 'https://storage.googleapis.com/alphafold-databases/v2.3/mgy_clusters_2022_05.fa.gz' - pdb70_link = 'http://wwwuser.gwdg.de/~compbiol/data/hhsuite/databases/hhsuite_dbs/old-releases/pdb70_from_mmcif_200916.tar.gz' - alphafold2_pdb_mmcif_link = 'rsync.rcsb.org::ftp_data/structures/divided/mmCIF/' //Other sources available: 'rsync.rcsb.org::ftp_data/structures/divided/mmCIF/' ftp.pdbj.org::ftp_data/structures/divided/mmCIF/ rsync.ebi.ac.uk::pub/databases/pdb/data/structures/divided/mmCIF/ - pdb_obsolete_link = 'https://files.wwpdb.org/pub/pdb/data/status/obsolete.dat' - alphafold2_uniref30_link = 'https://storage.googleapis.com/alphafold-databases/v2.3/UniRef30_2021_03.tar.gz' - alphafold2_uniref90_link = 'https://ftp.ebi.ac.uk/pub/databases/uniprot/uniref/uniref90/uniref90.fasta.gz' - alphafold2_pdb_seqres_link = 'https://files.wwpdb.org/pub/pdb/derived_data/pdb_seqres.txt' - uniprot_sprot_link = 'https://ftp.ebi.ac.uk/pub/databases/uniprot/current_release/knowledgebase/complete/uniprot_sprot.fasta.gz' - uniprot_trembl_link = 'https://ftp.ebi.ac.uk/pub/databases/uniprot/current_release/knowledgebase/complete/uniprot_trembl.fasta.gz' + alphafold2_bfd_link = 'https://storage.googleapis.com/alphafold-databases/casp14_versions/bfd_metaclust_clu_complete_id30_c90_final_seq.sorted_opt.tar.gz' + alphafold2_small_bfd_link = 'https://storage.googleapis.com/alphafold-databases/reduced_dbs/bfd-first_non_consensus_sequences.fasta.gz' + alphafold2_params_link = 'https://storage.googleapis.com/alphafold/alphafold_params_2022-12-06.tar' + alphafold2_mgnify_link = 'https://ftp.ebi.ac.uk/pub/databases/metagenomics/peptide_database/2024_04/mgy_clusters.fa.gz' + alphafold2_pdb70_link = 'https://wwwuser.gwdguser.de/~compbiol/data/hhsuite/databases/hhsuite_dbs/pdb70_from_mmcif_220313.tar.gz' + alphafold2_pdb_mmcif_link = 'rsync.rcsb.org::ftp_data/structures/divided/mmCIF/' //Other sources available: 'rsync.rcsb.org::ftp_data/structures/divided/mmCIF/' ftp.pdbj.org::ftp_data/structures/divided/mmCIF/ rsync.ebi.ac.uk::pub/databases/pdb/data/structures/divided/mmCIF/ + alphafold2_pdb_obsolete_link = 'https://files.wwpdb.org/pub/pdb/data/status/obsolete.dat' + alphafold2_uniref30_link = 'https://wwwuser.gwdguser.de/~compbiol/uniclust/2023_02/UniRef30_2023_02_hhsuite.tar.gz' + alphafold2_uniref90_link = 'https://ftp.ebi.ac.uk/pub/databases/uniprot/uniref/uniref90/uniref90.fasta.gz' + alphafold2_pdb_seqres_link = 'https://files.wwpdb.org/pub/pdb/derived_data/pdb_seqres.txt' + alphafold2_uniprot_sprot_link = 'https://ftp.ebi.ac.uk/pub/databases/uniprot/current_release/knowledgebase/complete/uniprot_sprot.fasta.gz' + alphafold2_uniprot_trembl_link = 'https://ftp.ebi.ac.uk/pub/databases/uniprot/current_release/knowledgebase/complete/uniprot_trembl.fasta.gz' // Alphafold2 paths - bfd_path = "${params.alphafold2_db}/bfd/*" - alphafold2_small_bfd_path = "${params.alphafold2_db}/small_bfd/*" - alphafold2_params_path = "${params.alphafold2_db}/params/${params.alphafold2_params_prefix}/*" - alphafold2_mgnify_path = "${params.alphafold2_db}/mgnify/*" - pdb70_path = "${params.alphafold2_db}/pdb70/*" - alphafold2_pdb_mmcif_path = "${params.alphafold2_db}/pdb_mmcif/mmcif_files" - pdb_obsolete_path = "${params.alphafold2_db}/pdb_mmcif/obsolete.dat" - alphafold2_uniref30_path = "${params.alphafold2_db}/uniref30/*" - alphafold2_uniref90_path = "${params.alphafold2_db}/uniref90/*" - alphafold2_pdb_seqres_path = "${params.alphafold2_db}/pdb_seqres/*" - alphafold2_uniprot_path = "${params.alphafold2_db}/uniprot/*" + alphafold2_bfd_path = "${params.alphafold2_db}/bfd/*" + alphafold2_small_bfd_path = "${params.alphafold2_db}/small_bfd/*" + alphafold2_params_path = "${params.alphafold2_db}/params/${params.alphafold2_params_prefix}/*" + alphafold2_mgnify_path = "${params.alphafold2_db}/mgnify/*" + alphafold2_pdb70_path = "${params.alphafold2_db}/pdb70/**" + alphafold2_pdb_mmcif_path = "${params.alphafold2_db}/pdb_mmcif/mmcif_files" + alphafold2_pdb_obsolete_path = "${params.alphafold2_db}/pdb_mmcif/obsolete.dat" + alphafold2_uniref30_path = "${params.alphafold2_db}/uniref30/*" + alphafold2_uniref90_path = "${params.alphafold2_db}/uniref90/*" + alphafold2_pdb_seqres_path = "${params.alphafold2_db}/pdb_seqres/*" + alphafold2_uniprot_path = "${params.alphafold2_db}/uniprot/*" // Alphafold3 links alphafold3_small_bfd_link = 'https://storage.googleapis.com/alphafold-databases/v3.0/bfd-first_non_consensus_sequences.fasta.zst' @@ -46,7 +46,7 @@ params { alphafold3_pdb_mmcif_link = 'https://storage.googleapis.com/alphafold-databases/v3.0/pdb_2022_09_28_mmcif_files.tar.zst' alphafold3_uniref90_link = 'https://storage.googleapis.com/alphafold-databases/v3.0/uniref90_2022_05.fa.zst' alphafold3_pdb_seqres_link = 'https://storage.googleapis.com/alphafold-databases/v3.0/pdb_seqres_2022_09_28.fasta.zst' - uniprot_link = 'https://storage.googleapis.com/alphafold-databases/v3.0/uniprot_all_2021_04.fa.zst' + alphafold3_uniprot_link = 'https://storage.googleapis.com/alphafold-databases/v3.0/uniprot_all_2021_04.fa.zst' // Alphafold3 paths alphafold3_small_bfd_path = "${params.alphafold3_db}/small_bfd/*" @@ -60,17 +60,23 @@ params { // Boltz links boltz_ccd_link = 'https://huggingface.co/boltz-community/boltz-1/resolve/main/ccd.pkl' boltz_model_link = 'https://huggingface.co/boltz-community/boltz-1/resolve/main/boltz1_conf.ckpt' + boltz2_aff_link = 'https://huggingface.co/boltz-community/boltz-2/resolve/main/boltz2_aff.ckpt' + boltz2_conf_link = 'https://huggingface.co/boltz-community/boltz-2/resolve/main/boltz2_conf.ckpt' + boltz2_mols_link = 'https://huggingface.co/boltz-community/boltz-2/resolve/main/mols.tar' // Boltz paths boltz_ccd_path = "${params.boltz_db}/params/ccd.pkl" boltz_model_path = "${params.boltz_db}/params/boltz1_conf.ckpt" + boltz2_aff_path = "${params.boltz_db}/params/boltz2_aff.ckpt" + boltz2_conf_path = "${params.boltz_db}/params/boltz2_conf.ckpt" + boltz2_mols_path = "${params.boltz_db}/params/mols/" // Colabfold links colabfold_db_link = 'http://wwwuser.gwdg.de/~compbiol/colabfold/colabfold_envdb_202108.tar.gz' colabfold_uniref30_link = 'https://wwwuser.gwdg.de/~compbiol/colabfold/uniref30_2302.tar.gz' // Colabfold paths - colabfold_db_path = "${params.colabfold_db}/colabfold_envdb/*" + colabfold_envdb_path = "${params.colabfold_db}/colabfold_envdb/*" colabfold_uniref30_path = "${params.colabfold_db}/colabfold_uniref30/*" // Are all these params options needed? colabfold_alphafold2_params_tags = [ @@ -81,19 +87,19 @@ params { ] // RoseTTAFold_All_Atom links - uniref30_rosettafold_all_atom_link = 'http://wwwuser.gwdg.de/~compbiol/uniclust/2020_06/UniRef30_2020_06_hhsuite.tar.gz' - pdb100_rosettafold_all_atom_link = 'https://files.ipd.uw.edu/pub/RoseTTAFold/pdb100_2021Mar03.tar.gz' - bfd_rosettafold_all_atom_link = 'https://bfd.mmseqs.com/bfd_metaclust_clu_complete_id30_c90_final_seq.sorted_opt.tar.gz' - rfaa_paper_weights_link = 'http://files.ipd.uw.edu/pub/RF-All-Atom/weights/RFAA_paper_weights.pt' + rosettafold_all_atom_uniref30_link = 'https://wwwuser.gwdguser.de/~compbiol/uniclust/2023_02/UniRef30_2023_02_hhsuite.tar.gz' + rosettafold_all_atom_pdb100_link = 'https://files.ipd.uw.edu/pub/RoseTTAFold/pdb100_2021Mar03.tar.gz' + rosettafold_all_atom_bfd_link = 'https://bfd.mmseqs.com/bfd_metaclust_clu_complete_id30_c90_final_seq.sorted_opt.tar.gz' + rosettafold_all_atom_paper_weights_link = 'http://files.ipd.uw.edu/pub/RF-All-Atom/weights/RFAA_paper_weights.pt' // RoseTTAFold_All_Atom paths - uniref30_rosettafold_all_atom_path = "${params.rosettafold_all_atom_db}/uniref30/*" - pdb100_rosettafold_all_atom_path = "${params.rosettafold_all_atom_db}/pdb100/*" - bfd_rosettafold_all_atom_path = "${params.rosettafold_all_atom_db}/bfd/*" - rfaa_paper_weights_path = "${params.rosettafold_all_atom_db}/params/RFAA_paper_weights.pt" + rosettafold_all_atom_uniref30_path = "${params.rosettafold_all_atom_db}/uniref30/*" + rosettafold_all_atom_pdb100_path = "${params.rosettafold_all_atom_db}/pdb100/*" + rosettafold_all_atom_bfd_path = "${params.rosettafold_all_atom_db}/bfd/*" + rosettafold_all_atom_paper_weights_path = "${params.rosettafold_all_atom_db}/params/RFAA_paper_weights.pt" // Helixfold3 links - helixfold3_uniclust30_link = 'https://storage.googleapis.com/alphafold-databases/casp14_versions/uniclust30_2018_08_hhsuite.tar.gz' + helixfold3_uniclust30_link = 'https://wwwuser.gwdguser.de/~compbiol/uniclust/2023_02/UniRef30_2023_02_hhsuite.tar.gz' helixfold3_ccd_preprocessed_link = 'https://paddlehelix.bd.bcebos.com/HelixFold3/CCD/ccd_preprocessed_etkdg.pkl.gz' helixfold3_rfam_link = 'https://paddlehelix.bd.bcebos.com/HelixFold3/MSA/Rfam-14.9_rep_seq.fasta' helixfold3_init_models_link = 'https://paddlehelix.bd.bcebos.com/HelixFold3/params/HelixFold3-params-240814.zip' @@ -103,9 +109,11 @@ params { helixfold3_uniprot_trembl_link = 'ftp://ftp.ebi.ac.uk/pub/databases/uniprot/current_release/knowledgebase/complete/uniprot_trembl.fasta.gz' helixfold3_pdb_seqres_link = 'https://files.wwpdb.org/pub/pdb/derived_data/pdb_seqres.txt' helixfold3_uniref90_link = 'ftp://ftp.uniprot.org/pub/databases/uniprot/uniref/uniref90/uniref90.fasta.gz' - helixfold3_mgnify_link = 'https://storage.googleapis.com/alphafold-databases/casp14_versions/mgy_clusters_2018_12.fa.gz' + // TODO should be updated to 2022_05 as in alphafold2? + helixfold3_mgnify_link = 'https://ftp.ebi.ac.uk/pub/databases/metagenomics/peptide_database/2024_04/mgy_clusters.fa.gz' helixfold3_pdb_mmcif_link = 'rsync.rcsb.org::ftp_data/structures/divided/mmCIF/' helixfold3_obsolete_link = 'https://files.rcsb.org/pub/pdb/data/status/obsolete.dat' + helixfold3_maxit_src_link = 'https://proteinfold-dataset.s3.amazonaws.com/test-data/db/helixfold3/maxit-v11.200-prod-src.tar.gz' // Helixfold3 paths helixfold3_uniclust30_path = "${params.helixfold3_db}/uniref30/*" diff --git a/conf/modules.config b/conf/modules.config index c6b1078eb..05fad7044 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -30,7 +30,7 @@ process { withName: 'UNTAR' { ext.args2 = '--no-same-owner' publishDir = [ - path: {"${params.outdir}/DBs/${params.mode}/${params.alphafold2_mode}"}, + path: {"${params.outdir}/DBs/${params.mode}"}, mode: 'symlink', saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] diff --git a/conf/modules_alphafold2.config b/conf/modules_alphafold2.config index 691d4ac8c..0a1b00a57 100644 --- a/conf/modules_alphafold2.config +++ b/conf/modules_alphafold2.config @@ -17,7 +17,7 @@ process { withName: 'GUNZIP|COMBINE_UNIPROT|DOWNLOAD_PDBMMCIF|ARIA2_PDB_SEQRES' { publishDir = [ - path: {"${params.outdir}/DBs/alphafold2/${params.alphafold2_mode}"}, + path: {"${params.outdir}/DBs/alphafold2"}, mode: 'symlink', saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] @@ -36,14 +36,20 @@ process { accelerator = params.use_gpu? 1 : 0 ext.args = [ params.use_gpu ? '--use_gpu_relax=true' : '--use_gpu_relax=false', - params.max_template_date ? "--max_template_date ${params.max_template_date}" : '', - params.random_seed ? "--random_seed=${params.random_seed}" : '' + params.alphafold2_max_template_date ? "--max_template_date ${params.alphafold2_max_template_date}" : '', + params.alphafold2_random_seed ? "--random_seed=${params.alphafold2_random_seed}" : '' ].join(' ').trim() publishDir = [ [ - path: { "${params.outdir}/alphafold2/${params.alphafold2_mode}" }, + path: { "${params.outdir}/alphafold2/${params.alphafold2_mode}/${meta.id}" }, mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + saveAs: { filename -> + if(filename.endsWith('_pae.tsv')){ + "paes/$filename" + } else if(filename.equals('versions.yml')){ + null + } else { filename } + }, pattern: '*.*' ], [ @@ -58,9 +64,9 @@ process { process { withName: 'RUN_ALPHAFOLD2_MSA' { - ext.args = params.max_template_date ? "--max_template_date ${params.max_template_date}" : '' + ext.args = params.alphafold2_max_template_date ? "--max_template_date ${params.alphafold2_max_template_date}" : '' publishDir = [ - path: { "${params.outdir}/alphafold2_${params.alphafold2_mode}" }, + path: { "${params.outdir}/alphafold2/${params.alphafold2_mode}" }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -71,9 +77,15 @@ process { ext.args = params.use_gpu ? '--use_gpu_relax=true' : '--use_gpu_relax=false' publishDir = [ [ - path: { "${params.outdir}/alphafold2/${params.alphafold2_mode}" }, + path: { "${params.outdir}/alphafold2/${params.alphafold2_mode}/${meta.id}" }, mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + saveAs: { filename -> + if(filename.endsWith('_pae.tsv')){ + "paes/$filename" + } else if(filename.equals('versions.yml')){ + null + } else { filename } + }, pattern: '*.*' ], [ diff --git a/conf/modules_boltz.config b/conf/modules_boltz.config index ed2fb1eab..5a6ba59ad 100644 --- a/conf/modules_boltz.config +++ b/conf/modules_boltz.config @@ -12,16 +12,31 @@ process { withName: 'RUN_BOLTZ' { - ext.args = '--write_full_pae --output_format pdb --use_msa_server' + ext.args = [ + params.boltz_model ? "--model ${params.boltz_model}" : "", + params.use_msa_server ? "--use_msa_server" : "", + params.msa_server_url ? "--msa_server_url ${params.msa_server_url}" : "", + params.boltz_use_potentials ? "--use_potentials" : "", + "--write_full_pae", + ].findAll{ it }.join(' ').trim() + publishDir = [ [ - path: { "${params.outdir}/boltz/default" }, + + path: { "${params.outdir}/boltz/${meta.id}" }, + mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, + saveAs: { filename -> + if(filename.endsWith('_pae.tsv')){ + "paes/$filename" + } else if(filename.equals('versions.yml')){ + null + } else { filename } + }, pattern: '*.*' ], [ - path: { "${params.outdir}/boltz/default/top_ranked_structures" }, + path: { "${params.outdir}/boltz/${meta.id}/top_ranked_structures" }, mode: 'copy', saveAs: { "${meta.id}.pdb" }, pattern: '*.pdb' diff --git a/conf/modules_colabfold.config b/conf/modules_colabfold.config index 92deaf093..f0bbda83f 100644 --- a/conf/modules_colabfold.config +++ b/conf/modules_colabfold.config @@ -20,23 +20,24 @@ process { } } +// TODO: Differentiate between local and server MSA? process { withName: 'COLABFOLD_BATCH' { ext.args = [ - params.use_gpu ? '--use-gpu-relax' : '', - params.use_amber ? '--amber' : '', - params.use_templates ? '--templates' : '', - params.colabfold_server == 'webserver' && params.host_url ? "--host-url ${params.host_url}" : '' + params.use_gpu ? '--use-gpu-relax' : '', + params.colabfold_use_amber ? '--amber' : '', + params.colabfold_use_templates ? '--templates' : '', + params.use_msa_server && params.msa_server_url ? "--host-url ${params.msa_server_url}" : '' ].join(' ').trim() publishDir = [ [ - path: { "${params.outdir}/colabfold/${params.colabfold_server}" }, + path: { "${params.outdir}/colabfold/" }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, pattern: '*.*' ], [ - path: { "${params.outdir}/colabfold/${params.colabfold_server}/top_ranked_structures" }, + path: { "${params.outdir}/colabfold/top_ranked_structures" }, mode: 'copy', saveAs: { "${meta.id}.pdb" }, pattern: '*_relaxed_rank_001*.pdb' @@ -59,7 +60,7 @@ process { ] } withName: 'MMSEQS_COLABFOLDSEARCH' { - ext.args = { params.db_load_mode ? "--db-load-mode ${params.db_load_mode}" : '' } + ext.args = { params.colabfold_db_load_mode ? "--db-load-mode ${params.colabfold_db_load_mode}" : '' } publishDir = [ enabled: false ] diff --git a/conf/modules_helixfold3.config b/conf/modules_helixfold3.config index f3011a11e..77f356d1d 100644 --- a/conf/modules_helixfold3.config +++ b/conf/modules_helixfold3.config @@ -25,20 +25,25 @@ process { ext.args = [ params.helixfold3_max_template_date ? "--max_template_date=${params.helixfold3_max_template_date}" : "--max_template_date=2038-01-19", - params.model_name ? "--model_name ${params.model_name}" : "--model_name allatom_demo", - params.preset ? "--preset ${params.preset}" : "--preset 'reduced_dbs'", - params.init_model ? "--init_model ${params.init_model}" : "--init_model './init_models/HelixFold3-240814.pdparams'", - params.logging_level ? "--logging_level ${params.logging_level}" : "--logging_level 'ERROR'", - params.precision ? "--precision ${params.precision}" : "--precision 'bf16'", - params.infer_times ? "--infer_times ${params.infer_times}" : "--infer_times 4" + "--model_name allatom_demo", + params.helixfold3_full_dbs ? "--preset 'full_dbs'" : "--preset 'reduced_dbs'", + "--logging_level 'ERROR'", + params.helixfold3_precision ? "--precision ${params.helixfold3_precision}" : "--precision 'bf16'", + params.helixfold3_infer_times ? "--infer_times ${params.helixfold3_infer_times}" : "--infer_times 4" ].join(' ').trim() publishDir = [ - path: { "${params.outdir}/helixfold3/" }, - mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - pattern: '*.*' - ] + path: { "${params.outdir}/helixfold3/${meta.id}" }, + mode: 'copy', + saveAs: { filename -> + if(filename.endsWith('_pae.tsv')){ + "paes/$filename" + } else if(filename.equals('versions.yml')){ + null + } else { filename } + }, + pattern: '*.*' + ] } withName: 'NFCORE_PROTEINFOLD:HELIXFOLD3:MULTIQC' { diff --git a/conf/test_boltz.config b/conf/test_boltz.config index f4978df3c..682419f50 100644 --- a/conf/test_boltz.config +++ b/conf/test_boltz.config @@ -26,9 +26,7 @@ params { // Input data for full test of boltz mode = 'boltz' - colabfold_server = 'local' colabfold_model_preset = 'alphafold2_ptm' input = params.pipelines_testdata_base_path + 'proteinfold/testdata/samplesheet/v1.2/samplesheet.csv' colabfold_db = 's3://proteinfold-dataset/test-data/db/colabfold_mini' - boltz_use_msa_server = false } diff --git a/conf/test_colabfold_download.config b/conf/test_colabfold_download.config index 8d2f9547b..f3b527b5f 100644 --- a/conf/test_colabfold_download.config +++ b/conf/test_colabfold_download.config @@ -27,7 +27,7 @@ params { // Input data to test colabfold analysis mode = 'colabfold' - colabfold_server = 'webserver' + use_msa_server = true input = params.pipelines_testdata_base_path + 'proteinfold/testdata/samplesheet/v1.2/samplesheet.csv' } diff --git a/conf/test_colabfold_local.config b/conf/test_colabfold_local.config index 7186ccd5b..3019f1963 100644 --- a/conf/test_colabfold_local.config +++ b/conf/test_colabfold_local.config @@ -25,7 +25,6 @@ params { // Input data to test colabfold with the colabfold webserver analysis mode = 'colabfold' - colabfold_server = 'local' colabfold_db = "${projectDir}/assets/dummy_db_dir" input = params.pipelines_testdata_base_path + 'proteinfold/testdata/samplesheet/v1.2/samplesheet.csv' } diff --git a/conf/test_colabfold_webserver.config b/conf/test_colabfold_webserver.config index 29faf98f0..e2273b359 100644 --- a/conf/test_colabfold_webserver.config +++ b/conf/test_colabfold_webserver.config @@ -23,9 +23,9 @@ params { config_profile_name = 'Test profile' config_profile_description = 'Minimal test dataset to check pipeline function' - // Input data to test colabfold with a local server analysis + // Input data to test colabfold with a webserver analysis mode = 'colabfold' - colabfold_server = 'webserver' + use_msa_server = true colabfold_db = "${projectDir}/assets/dummy_db_dir" input = params.pipelines_testdata_base_path + 'proteinfold/testdata/samplesheet/v1.2/samplesheet.csv' } diff --git a/conf/test_full_boltz.config b/conf/test_full_boltz.config index 999454f04..d3710bc84 100644 --- a/conf/test_full_boltz.config +++ b/conf/test_full_boltz.config @@ -16,9 +16,7 @@ params { // Input data for full test of boltz mode = 'boltz' - colabfold_server = 'local' colabfold_model_preset = 'alphafold2_ptm' input = params.pipelines_testdata_base_path + 'proteinfold/testdata/samplesheet/v1.2/samplesheet.csv' colabfold_db = 's3://proteinfold-dataset/test-data/db/colabfold_mini' - boltz_use_msa_server = false } diff --git a/conf/test_full_colabfold_local.config b/conf/test_full_colabfold_local.config index 9d146bfe6..7f1a41e16 100644 --- a/conf/test_full_colabfold_local.config +++ b/conf/test_full_colabfold_local.config @@ -17,7 +17,6 @@ params { // Input data to test colabfold with a local server analysis mode = 'colabfold' - colabfold_server = 'local' colabfold_model_preset = 'alphafold2_ptm' input = params.pipelines_testdata_base_path + 'proteinfold/testdata/samplesheet/v1.2/samplesheet.csv' colabfold_db = 's3://proteinfold-dataset/test-data/db/colabfold_mini' diff --git a/conf/test_full_colabfold_webserver.config b/conf/test_full_colabfold_webserver.config index ca54564db..949adbf65 100644 --- a/conf/test_full_colabfold_webserver.config +++ b/conf/test_full_colabfold_webserver.config @@ -16,8 +16,8 @@ params { // Input data for full test of colabfold with Colabfold server mode = 'colabfold' - colabfold_server = 'webserver' + use_msa_server = true colabfold_model_preset = 'alphafold2_ptm' input = params.pipelines_testdata_base_path + 'proteinfold/testdata/samplesheet/v1.2/samplesheet.csv' - colabfold_db = 's3://proteinfold-dataset/test-data/db/colabfold_mini' + colabfold_db = 's3://proteinfold-dataset/test-data/db/colabfold_mini' } diff --git a/conf/test_full_colabfold_webserver_multimer.config b/conf/test_full_colabfold_webserver_multimer.config index b539faf52..d6d41bb4d 100644 --- a/conf/test_full_colabfold_webserver_multimer.config +++ b/conf/test_full_colabfold_webserver_multimer.config @@ -16,7 +16,7 @@ params { // Input data for full test of colabfold with Colabfold server mode = 'colabfold' - colabfold_server = 'webserver' + use_msa_server = true colabfold_model_preset = 'alphafold2_multimer_v3' input = params.pipelines_testdata_base_path + 'proteinfold/testdata/samplesheet/v1.2/samplesheet_multimer.csv' colabfold_db = 's3://proteinfold-dataset/test-data/db/colabfold_mini' diff --git a/conf/test_split_fasta.config b/conf/test_split_fasta.config index 4d2bd9ae9..f9463eb68 100644 --- a/conf/test_split_fasta.config +++ b/conf/test_split_fasta.config @@ -25,7 +25,6 @@ params { // Input data to test colabfold with the colabfold webserver analysis mode = 'colabfold' - colabfold_server = 'local' split_fasta = true colabfold_db = "${projectDir}/assets/dummy_db_dir" input = params.pipelines_testdata_base_path + 'proteinfold/testdata/samplesheet/v1.2/samplesheet_multimer.csv' diff --git a/dockerfiles/Dockerfile_nfcore-proteinfold_boltz b/dockerfiles/Dockerfile_nfcore-proteinfold_boltz deleted file mode 100644 index 527ef86d9..000000000 --- a/dockerfiles/Dockerfile_nfcore-proteinfold_boltz +++ /dev/null @@ -1,16 +0,0 @@ -FROM python:3.9-slim - -LABEL authors="Ziad Al-Bkhetan " \ - title="nfcore/proteinfold_boltz" \ - Version="1.2.0dev" \ - description="Docker image containing all software requirements to run boltz using the nf-core/proteinfold pipeline" - -RUN apt-get update && \ - apt-get install -y --no-install-recommends \ - build-essential \ - procps \ - && rm -rf /var/lib/apt/lists/* - -RUN pip install boltz - -CMD ["boltz"] diff --git a/dockerfiles/Dockerfile_nfcore-proteinfold_colabfold b/dockerfiles/Dockerfile_nfcore-proteinfold_colabfold deleted file mode 100644 index c45ad4ecc..000000000 --- a/dockerfiles/Dockerfile_nfcore-proteinfold_colabfold +++ /dev/null @@ -1,40 +0,0 @@ -FROM nvidia/cuda:12.6.2-cudnn-runtime-ubuntu24.04 - -LABEL authors="Athanasios Baltzis, Jose Espinosa-Carrasco, Leila Mansouri" \ - title="nfcore/proteinfold_colabfold" \ - Version="1.2.0dev" \ - description="Docker image containing all software requirements to run the COLABFOLD_BATCH module using the nf-core/proteinfold pipeline" - -ENV PATH="/localcolabfold/colabfold-conda/bin:$PATH" -ENV LD_LIBRARY_PATH="/localcolabfold/colabfold-conda/lib:/usr/local/cuda/lib64" -ENV PYTHONPATH="/localcolabfold/colabfold-conda/lib" -ENV PATH="/MMseqs2/build/bin:$PATH" - -# Use bash to support string substitution. -RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A4B469963BF863CC -RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y \ - build-essential \ - cuda-command-line-tools-12-6 \ - git \ - hmmer \ - kalign \ - tzdata \ - wget \ - curl \ - cmake \ - && rm -rf /var/lib/apt/lists/* - -RUN cd / \ - && wget https://raw.githubusercontent.com/YoshitakaMo/localcolabfold/07e87ed/install_colabbatch_linux.sh \ - && sed -i "/colabfold.download/d" install_colabbatch_linux.sh \ - # Avoid error running on cpus - # https://github.com/YoshitakaMo/localcolabfold/issues/238#issuecomment-2203777538 - && sed -i "/==0.4.28/d" install_colabbatch_linux.sh \ - && bash install_colabbatch_linux.sh - -## Updated -RUN /localcolabfold/colabfold-conda/bin/python3.10 -m pip install tensorflow-cpu==2.17.0 - -# #Silence download of the AlphaFold2 params -RUN sed -i "s|download_alphafold_params(|#download_alphafold_params(|g" /localcolabfold/colabfold-conda/lib/python3.10/site-packages/colabfold/batch.py -RUN sed -i "s|if args\.num_models|#if args\.num_models|g" /localcolabfold/colabfold-conda/lib/python3.10/site-packages/colabfold/batch.py diff --git a/dockerfiles/Dockerfile_nfcore-proteinfold_helixfold3 b/dockerfiles/Dockerfile_nfcore-proteinfold_helixfold3 deleted file mode 100644 index 6e8f2ddbe..000000000 --- a/dockerfiles/Dockerfile_nfcore-proteinfold_helixfold3 +++ /dev/null @@ -1,47 +0,0 @@ -ARG CUDA=12.8.1 -FROM nvidia/cuda:${CUDA}-cudnn-devel-ubuntu22.04 AS builder -# FROM directive resets ARGS, so we specify again (the value is retained if -# previously set). -ARG CUDA - -LABEL Author="j.caley@unsw.edu.au, Jose Espinosa-Carrasco" \ - title="nfcore/proteinfold_helixfold3" \ - Version="1.2.0dev" \ - description="Docker image containing all software requirements to run the RUN_HELIXFOLD3 module using the nf-core/proteinfold pipeline" - -RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends -y wget git && \ - wget -q -P /tmp "https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-$(uname)-$(uname -m).sh" && \ - bash /tmp/Miniforge3-$(uname)-$(uname -m).sh -b -p /conda && \ - git clone --single-branch --branch dev --depth 1 --no-checkout https://github.com/PaddlePaddle/PaddleHelix.git /app/helixfold3 && \ - cd /app/helixfold3 && \ - git sparse-checkout init --cone && \ - git sparse-checkout set apps/protein_folding/helixfold3 && \ - git checkout dev && \ - mv apps/protein_folding/helixfold3/* . && \ - rm -rf /tmp/Miniforge3-$(uname)-$(uname -m).sh /var/lib/apt/lists/* /root/.cache apps && \ - apt-get remove --purge -y wget git && apt-get autoremove -y && apt-get clean -y - -COPY environment_nfcore-proteinfold_helixfold3.yaml /app/helixfold3/environment.yaml - -ENV PATH="/conda/bin:$PATH" - -RUN mamba env create --file=/app/helixfold3/environment.yaml && \ - mamba install -y -c bioconda aria2 hmmer==3.3.2 kalign2==2.04 hhsuite==3.3.0 -n helixfold && \ - mamba install -y -c conda-forge openbabel -n helixfold && \ - mamba clean --all --force-pkgs-dirs -y && \ - rm -rf /root/.cache - -FROM nvidia/cuda:${CUDA}-cudnn-devel-ubuntu22.04 -# FROM directive resets ARGS, so we specify again (the value is retained if -# previously set). -ARG CUDA - -COPY --from=builder /app /app -COPY --from=builder /conda /conda - -ENV PATH="/conda/bin:/app/helixfold3:./maxit_src/bin:/conda/envs/helixfold/bin:$PATH" \ - RCSBROOT="./maxit_src" \ - MAXIT_SRC="./maxit_src" \ - PYTHON_BIN="/conda/envs/helixfold/bin/python3.9" \ - ENV_BIN="/conda/envs/helixfold/bin" \ - OBABEL_BIN="/conda/envs/helixfold/bin" diff --git a/dockerfiles/Dockerfile_nfcore-proteinfold_rosettafold_all_atom b/dockerfiles/Dockerfile_nfcore-proteinfold_rosettafold_all_atom deleted file mode 100644 index 649b66155..000000000 --- a/dockerfiles/Dockerfile_nfcore-proteinfold_rosettafold_all_atom +++ /dev/null @@ -1,51 +0,0 @@ -ARG CUDA=12.6.0 -FROM nvidia/cuda:${CUDA}-runtime-ubuntu24.04 AS builder -# FROM directive resets ARGS, so we specify again (the value is retained if -# previously set). -ARG CUDA - -LABEL Author="j.caley@unsw.edu.au" \ - title="nfcore/proteinfold_rosettafold_all_atom" \ - Version="1.2.0dev" \ - description="Docker image containing all software requirements to run the RUN_ROSETTAFOLD_ALL_ATOM module using the nf-core/proteinfold pipeline" - -ENV PYTHONPATH="/app/RoseTTAFold-All-Atom" \ - PATH="/conda/bin:/app/RoseTTAFold-All-Atom:$PATH" \ - DGLBACKEND="pytorch" \ - LD_LIBRARY_PATH="/conda/lib:/usr/local/cuda-$(cut -f1,2 -d. <<< ${CUDA})/lib64:$LD_LIBRARY_PATH" - -RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends -y wget git && \ - wget -q -P /tmp "https://github.com/conda-forge/miniforge/releases/download/24.11.0-0/Miniforge3-$(uname)-$(uname -m).sh" && \ - bash /tmp/Miniforge3-$(uname)-$(uname -m).sh -b -p /conda && \ - rm -rf /tmp/Miniforge3-$(uname)-$(uname -m).sh /var/lib/apt/lists/* /root/.cache && \ - git clone --single-branch --depth 1 https://github.com/Australian-Structural-Biology-Computing/RoseTTAFold-All-Atom.git /app/RoseTTAFold-All-Atom && \ - cd /app/RoseTTAFold-All-Atom && \ - git fetch --depth 1 origin e8f94d6d6ddfb07da2119bcfa94359bc6912fd29 && \ - git checkout e8f94d6d6ddfb07da2119bcfa94359bc6912fd29 && \ - /conda/bin/mamba env create --file=environment.yaml && \ - /conda/bin/mamba run -n RFAA bash -c \ - "python /app/RoseTTAFold-All-Atom/rf2aa/SE3Transformer/setup.py install && \ - bash /app/RoseTTAFold-All-Atom/install_dependencies.sh" && \ - /conda/bin/mamba clean --all --force-pkgs-dirs -y && \ - cd /app/RoseTTAFold-All-Atom && \ - wget https://ftp.ncbi.nlm.nih.gov/blast/executables/legacy.NOTSUPPORTED/2.2.26/blast-2.2.26-x64-linux.tar.gz && \ - mkdir -p blast-2.2.26 && \ - tar -xf blast-2.2.26-x64-linux.tar.gz -C blast-2.2.26 && \ - cp -r blast-2.2.26/blast-2.2.26/ blast-2.2.26_bk && \ - rm -r blast-2.2.26 && \ - mv blast-2.2.26_bk/ blast-2.2.26 && \ - rm -rf /root/.cache *.tar.gz && \ - apt-get remove --purge -y wget git && apt-get autoremove -y && apt-get clean -y - -FROM nvidia/cuda:${CUDA}-base-ubuntu24.04 -# FROM directive resets ARGS, so we specify again (the value is retained if -# previously set). -ARG CUDA - -COPY --from=builder /app /app -COPY --from=builder /conda /conda - -ENV PYTHONPATH="/app/RoseTTAFold-All-Atom" \ - PATH="/conda/bin:/app/RoseTTAFold-All-Atom:$PATH" \ - DGLBACKEND="pytorch" \ - LD_LIBRARY_PATH="/conda/lib:/usr/local/cuda-$(cut -f1,2 -d. <<< ${CUDA})/lib64:$LD_LIBRARY_PATH" diff --git a/docs/usage.md b/docs/usage.md index 6d6f51b70..a8c35b765 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -179,14 +179,13 @@ To provide the predownloaded AlphaFold3 databases and parameters you can specify ``` -Colabfold mode using use your own custom MMSeqs2 API server (`--colabfold_server local`) can be run using the following command: +Colabfold mode can be used with local database search using the following command: ```bash nextflow run nf-core/proteinfold \ --input samplesheet.csv \ --outdir \ --mode colabfold \ - --colabfold_server local \ --colabfold_db \ --num_recycles_colabfold 3 \ --use_amber \ @@ -203,8 +202,8 @@ nextflow run nf-core/proteinfold \ --input samplesheet.csv \ --outdir \ --mode colabfold - --colabfold_server webserver \ - --host_url \ + --use_msa_server \ + --msa_server_url \ --colabfold_db \ --num_recycles_colabfold 3 \ --use_amber \ @@ -391,10 +390,7 @@ nextflow run nf-core/proteinfold \ ```console ## Optional parameters with default values: --helixfold3_max_template_date=2038-01-19 - --model_name allatom_demo --preset 'reduced_dbs' - --init_model './init_models/HelixFold3-240814.pdparams' - --logging_level 'ERROR' --precision 'bf16' --infer_times 4 ``` @@ -574,3 +570,30 @@ We recommend adding the following line to your environment to limit this (typica ```bash NXF_OPTS='-Xms1g -Xmx4g' ``` + +## Boltz mode + +To run the pipeline in Boltz mode, use the following command: + +```bash +nextflow run nf-core/proteinfold \ + --input samplesheet.csv \ + --outdir \ + --mode boltz \ + --boltz_use_msa_server \ + --use_gpu \ + -profile +``` + +### Boltz parameter descriptions + +| Parameter | Default | Description | +| ------------------------ | ------- | --------------------------------------------------- | +| `--boltz_model` | `null` | The model to use for prediction. Default is Boltz-2 | +| `--use_msa_server` | `null` | Use MSA server to generate MSAs (flag) | +| `--msa_server_url` | `null` | MSA server URL | +| `--boltz_use_potentials` | `null` | Use inference time potentials (flag) | + +> You can override any of these parameters via the command line or a params file. + +--- diff --git a/main.nf b/main.nf index ea0618619..afe65f15b 100644 --- a/main.nf +++ b/main.nf @@ -97,30 +97,30 @@ workflow NFCORE_PROTEINFOLD { // PREPARE_ALPHAFOLD2_DBS ( params.alphafold2_db, - params.full_dbs, - params.bfd_path, + params.alphafold2_full_dbs, + params.alphafold2_bfd_path, params.alphafold2_small_bfd_path, params.alphafold2_params_path, params.alphafold2_mgnify_path, - params.pdb70_path, + params.alphafold2_pdb70_path, params.alphafold2_pdb_mmcif_path, - params.pdb_obsolete_path, + params.alphafold2_pdb_obsolete_path, params.alphafold2_uniref30_path, params.alphafold2_uniref90_path, params.alphafold2_pdb_seqres_path, params.alphafold2_uniprot_path, - params.bfd_link, + params.alphafold2_bfd_link, params.alphafold2_small_bfd_link, params.alphafold2_params_link, params.alphafold2_mgnify_link, - params.pdb70_link, + params.alphafold2_pdb70_link, params.alphafold2_pdb_mmcif_link, - params.pdb_obsolete_link, + params.alphafold2_pdb_obsolete_link, params.alphafold2_uniref30_link, params.alphafold2_uniref90_link, params.alphafold2_pdb_seqres_link, - params.uniprot_sprot_link, - params.uniprot_trembl_link + params.alphafold2_uniprot_sprot_link, + params.alphafold2_uniprot_trembl_link ) ch_versions = ch_versions.mix(PREPARE_ALPHAFOLD2_DBS.out.versions) @@ -130,7 +130,7 @@ workflow NFCORE_PROTEINFOLD { ALPHAFOLD2 ( ch_samplesheet, ch_versions, - params.full_dbs, + params.alphafold2_full_dbs, params.alphafold2_mode, params.alphafold2_model_preset, PREPARE_ALPHAFOLD2_DBS.out.params, @@ -185,7 +185,7 @@ workflow NFCORE_PROTEINFOLD { params.alphafold3_pdb_mmcif_link, params.alphafold3_uniref90_link, params.alphafold3_pdb_seqres_link, - params.uniprot_link + params.alphafold3_uniprot_link ) ch_versions = ch_versions.mix(PREPARE_ALPHAFOLD3_DBS.out.versions) @@ -239,14 +239,14 @@ workflow NFCORE_PROTEINFOLD { // PREPARE_COLABFOLD_DBS ( params.colabfold_db, - params.colabfold_server, + params.use_msa_server, params.colabfold_alphafold2_params_path, - params.colabfold_db_path, + params.colabfold_envdb_path, params.colabfold_uniref30_path, params.colabfold_alphafold2_params_link, params.colabfold_db_link, params.colabfold_uniref30_link, - params.create_colabfold_index + params.colabfold_create_index ) ch_versions = ch_versions.mix(PREPARE_COLABFOLD_DBS.out.versions) @@ -260,7 +260,7 @@ workflow NFCORE_PROTEINFOLD { PREPARE_COLABFOLD_DBS.out.params, PREPARE_COLABFOLD_DBS.out.colabfold_db, PREPARE_COLABFOLD_DBS.out.uniref30, - params.num_recycles_colabfold + params.colabfold_num_recycles ) ch_multiqc = ch_multiqc.mix(COLABFOLD.out.multiqc_report) @@ -305,7 +305,7 @@ workflow NFCORE_PROTEINFOLD { ch_samplesheet, ch_versions, PREPARE_ESMFOLD_DBS.out.params, - params.num_recycles_esmfold + params.esmfold_num_recycles ) ch_multiqc = ch_multiqc.mix(ESMFOLD.out.multiqc_report.collect()) @@ -323,14 +323,14 @@ workflow NFCORE_PROTEINFOLD { // PREPARE_ROSETTAFOLD_ALL_ATOM_DBS ( params.rosettafold_all_atom_db, - params.bfd_rosettafold_all_atom_path, - params.uniref30_rosettafold_all_atom_path, - params.pdb100_rosettafold_all_atom_path, - params.rfaa_paper_weights_path, - params.bfd_rosettafold_all_atom_link, - params.uniref30_rosettafold_all_atom_link, - params.pdb100_rosettafold_all_atom_link, - params.rfaa_paper_weights_link + params.rosettafold_all_atom_bfd_path, + params.rosettafold_all_atom_uniref30_path, + params.rosettafold_all_atom_pdb100_path, + params.rosettafold_all_atom_paper_weights_path, + params.rosettafold_all_atom_bfd_link, + params.rosettafold_all_atom_uniref30_link, + params.rosettafold_all_atom_pdb100_link, + params.rosettafold_all_atom_paper_weights_link ) ch_versions = ch_versions.mix(PREPARE_ROSETTAFOLD_ALL_ATOM_DBS.out.versions) @@ -373,6 +373,7 @@ workflow NFCORE_PROTEINFOLD { params.helixfold3_mgnify_link, params.helixfold3_pdb_mmcif_link, params.helixfold3_obsolete_link, + params.helixfold3_maxit_src_link, params.helixfold3_uniclust30_path, params.helixfold3_ccd_preprocessed_path, params.helixfold3_rfam_path, @@ -431,23 +432,30 @@ workflow NFCORE_PROTEINFOLD { // if (params.mode.toLowerCase().split(",").contains("boltz")) { PREPARE_BOLTZ_DBS( + params.boltz_db, params.boltz_ccd_path, params.boltz_model_path, + params.boltz2_aff_path, + params.boltz2_conf_path, + params.boltz2_mols_path, params.boltz_ccd_link, - params.boltz_model_link + params.boltz_model_link, + params.boltz2_aff_link, + params.boltz2_conf_link, + params.boltz2_mols_link ) ch_versions = ch_versions.mix(PREPARE_BOLTZ_DBS.out.versions) PREPARE_COLABFOLD_DBS ( params.colabfold_db, - params.colabfold_server, + params.use_msa_server, params.colabfold_alphafold2_params_path, - params.colabfold_db_path, - params.uniref30_colabfold_path, + params.colabfold_envdb_path, + params.colabfold_uniref30_path, params.colabfold_alphafold2_params_link, params.colabfold_db_link, - params.uniref30_colabfold_link, - params.create_colabfold_index + params.colabfold_uniref30_link, + params.colabfold_create_index ) ch_versions = ch_versions.mix(PREPARE_COLABFOLD_DBS.out.versions) @@ -456,9 +464,12 @@ workflow NFCORE_PROTEINFOLD { ch_versions, PREPARE_BOLTZ_DBS.out.boltz_ccd, PREPARE_BOLTZ_DBS.out.boltz_model, + PREPARE_BOLTZ_DBS.out.boltz2_aff, + PREPARE_BOLTZ_DBS.out.boltz2_conf, + PREPARE_BOLTZ_DBS.out.boltz2_mols, PREPARE_COLABFOLD_DBS.out.colabfold_db, PREPARE_COLABFOLD_DBS.out.uniref30, - params.boltz_use_msa_server + params.use_msa_server ) ch_multiqc = ch_multiqc.mix(BOLTZ.out.multiqc_report) ch_versions = ch_versions.mix(BOLTZ.out.versions) diff --git a/modules.json b/modules.json index e9f8e89a3..326168768 100644 --- a/modules.json +++ b/modules.json @@ -43,6 +43,11 @@ "git_sha": "5caf7640a9ef1d18d765d55339be751bb0969dfa", "installed_by": ["modules"], "patch": "modules/nf-core/untar/untar.diff" + }, + "unzip": { + "branch": "master", + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "installed_by": ["modules"] } } }, diff --git a/modules/local/colabfold_batch/Dockerfile b/modules/local/colabfold_batch/Dockerfile new file mode 100644 index 000000000..243784833 --- /dev/null +++ b/modules/local/colabfold_batch/Dockerfile @@ -0,0 +1,5 @@ +FROM ghcr.io/sokrypton/colabfold:1.5.5-cuda12.2.2 + +RUN mamba install -y -n colabfold -c conda-forge -c bioconda mmseqs2=18.8cc5c && \ + mamba clean -afy && \ + mmseqs version diff --git a/modules/local/colabfold_batch/main.nf b/modules/local/colabfold_batch/main.nf index ba4264e76..d417a57ef 100644 --- a/modules/local/colabfold_batch/main.nf +++ b/modules/local/colabfold_batch/main.nf @@ -29,10 +29,11 @@ process COLABFOLD_BATCH { error("Local COLABFOLD_BATCH module does not support Conda. Please use Docker / Singularity / Podman instead.") } def args = task.ext.args ?: '' - def VERSION = '1.5.2' // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. """ - ln -r -s params/alphafold_params_*/* params/ + ln -s \$(realpath params/alphafold_params_*/*) params/ + touch params/download_finished.txt + colabfold_batch \\ $args \\ --num-recycle ${numRec} \\ @@ -42,21 +43,18 @@ process COLABFOLD_BATCH { \$PWD for i in `find *.png -maxdepth 0`; do cp \$i \${i%'.png'}_mqc.png; done if [ ! -e `find *_relaxed_rank_001_*.pdb` ]; then - #for i in `find *_relaxed_rank_001*.pdb`; do cp \$i `echo \$i | sed "s|_relaxed_rank_|\t|g" | cut -f1`"_colabfold.pdb"; done cp *_relaxed_rank_001*.pdb ${meta.id}_colabfold.pdb else - #for i in `find *_unrelaxed_rank_001*.pdb`; do cp \$i `echo \$i | sed "s|_unrelaxed_rank_|\t|g" | cut -f1`"_colabfold.pdb"; done cp *_unrelaxed_rank_001*.pdb ${meta.id}_colabfold.pdb fi cat <<-END_VERSIONS > versions.yml "${task.process}": - colabfold_batch: $VERSION + colabfold_batch: \$(conda run -n colabfold pip list | grep "^colabfold" | awk '{print \$2}') END_VERSIONS """ stub: - def VERSION = '1.5.2' // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. """ touch ./"${meta.id}"_colabfold.pdb touch ./"${meta.id}"_mqc.png @@ -68,7 +66,7 @@ process COLABFOLD_BATCH { cat <<-END_VERSIONS > versions.yml "${task.process}": - colabfold_batch: $VERSION + colabfold_batch: \$(conda run -n colabfold pip list | grep "^colabfold" | awk '{print \$2}') END_VERSIONS """ } diff --git a/modules/local/data_convertor/boltz_fasta/main.nf b/modules/local/data_convertor/boltz_fasta/main.nf index 038965fa1..59f99c88a 100644 --- a/modules/local/data_convertor/boltz_fasta/main.nf +++ b/modules/local/data_convertor/boltz_fasta/main.nf @@ -24,31 +24,76 @@ process BOLTZ_FASTA { #!/usr/bin/env python3 import os, sys import string + import re #def safe_filename(file: str) -> str: # return "".join([c if c.isalnum() or c in ["_", ".", "-"] else "_" for c in file]) + ".a3m" all_combinations = list(string.ascii_uppercase) + list(string.ascii_lowercase) + [str(x) for x in range(0, 10)] msa_files = [${msa_files}] - seq_type = "protein" + ENTITY_TYPES = ["protein", "ccd", "smiles", "dna", "rna"] + + def infer_entity_type(header, sequence): + header_lower = header.lower() + for entity in ENTITY_TYPES: + if entity in header_lower: + return entity + seq = sequence.strip() + seq_set = set(seq) + # RNA: only A,C,U,G,N + if len(seq_set - set("ACUGN")) == 0: + return "rna" + # DNA: only A,C,T,G,N + if len(seq_set - set("ACTGN")) == 0: + return "dna" + # Protein: only 20 AA, not just A,C,T,G,U,N + protein_letters = set("ACDEFGHIKLMNPQRSTVWY") + if len(seq_set - protein_letters) == 0 and not (seq_set <= set("ACUGTN")): + return "protein" + # SMILES: fallback + if re.fullmatch(r"[A-Za-z0-9@+\\-\\[\\]\\(\\)=#\\\$%]+", seq): + return "smiles" + return "unknown" + os.makedirs("output_fasta", exist_ok=True) counter = 0 with open("${fasta}", "r") as f: lines = f.readlines() + msa = "" fasta_data = "" + seq_lines = [] + header = None + for line in lines: line = line.strip() if line.startswith(">"): - if len(msa_files) > 0: - msa = f"|{os.path.basename(msa_files[counter])}" - if msa[1:] not in msa_files: - print(f"Can not find msa file {os.path.basename(msa_files[counter])}") - exit(1) - - fasta_data += f">{all_combinations[counter]}|{seq_type}{msa}\\n" - counter += 1 + # Write previous entry if exists + if header is not None: + sequence = "".join(seq_lines) + entity_type = infer_entity_type(header, sequence) + msa = "" + if len(msa_files) > 0: + msa = f"|{os.path.basename(msa_files[counter])}" + if msa[1:] not in msa_files: + print(f"Can not find msa file {os.path.basename(msa_files[counter])}") + exit(1) + fasta_data += f">{all_combinations[counter]}|{entity_type}{msa}\\n{sequence}\\n" + counter += 1 + header = line + seq_lines = [] else: - fasta_data += f"{line}\\n" + seq_lines.append(line) + # Write last entry + if header is not None: + sequence = "".join(seq_lines) + entity_type = infer_entity_type(header, sequence) + msa = "" + if len(msa_files) > 0: + msa = f"|{os.path.basename(msa_files[counter])}" + if msa[1:] not in msa_files: + print(f"Can not find msa file {os.path.basename(msa_files[counter])}") + exit(1) + fasta_data += f">{all_combinations[counter]}|{entity_type}{msa}\\n{sequence}\\n" if len(fasta_data) > 0: with open(f"output_fasta/${meta.id}.fasta", "w") as outfile: diff --git a/modules/local/mmseqs_colabfoldsearch/main.nf b/modules/local/mmseqs_colabfoldsearch/main.nf index 2df5bf852..0cc123ab1 100644 --- a/modules/local/mmseqs_colabfoldsearch/main.nf +++ b/modules/local/mmseqs_colabfoldsearch/main.nf @@ -6,8 +6,8 @@ process MMSEQS_COLABFOLDSEARCH { input: tuple val(meta), path(fasta) - path colabfold_db - path uniref30 + path ('db/*') + path ('db/*') output: tuple val(meta), path("**.a3m"), emit: a3m @@ -22,14 +22,9 @@ process MMSEQS_COLABFOLDSEARCH { error("Local MMSEQS_COLABFOLDSEARCH module does not support Conda. Please use Docker / Singularity / Podman instead.") } def args = task.ext.args ?: '' - def VERSION = '1.5.2' // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. """ - mkdir ./db - ln -r -s $uniref30/uniref30_* ./db - ln -r -s $colabfold_db/colabfold_envdb* ./db - - /localcolabfold/colabfold-conda/bin/colabfold_search \\ + colabfold_search \\ $args \\ --threads $task.cpus ${fasta} \\ ./db \\ @@ -37,19 +32,22 @@ process MMSEQS_COLABFOLDSEARCH { cat <<-END_VERSIONS > versions.yml "${task.process}": - colabfold_search: $VERSION + colabfold_search: \$(conda run -n colabfold pip list | grep "^colabfold" | awk '{print \$2}') + alphafold_colabfold: \$(conda run -n colabfold pip list | grep "^alphafold-colabfold" | awk '{print \$2}') + mmseqs: \$(mmseqs version) END_VERSIONS """ stub: - def VERSION = '1.5.2' // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. """ mkdir results touch results/${meta.id}.a3m cat <<-END_VERSIONS > versions.yml "${task.process}": - colabfold_search: $VERSION + colabfold_search: \$(conda run -n colabfold pip list | grep "^colabfold" | awk '{print \$2}') + alphafold_colabfold: \$(conda run -n colabfold pip list | grep "^alphafold-colabfold" | awk '{print \$2}') + mmseqs: \$(mmseqs version) END_VERSIONS """ } diff --git a/dockerfiles/Dockerfile_nfcore-proteinfold_alphafold2_standard b/modules/local/run_alphafold2/Dockerfile similarity index 100% rename from dockerfiles/Dockerfile_nfcore-proteinfold_alphafold2_standard rename to modules/local/run_alphafold2/Dockerfile diff --git a/modules/local/run_alphafold2/main.nf b/modules/local/run_alphafold2/main.nf index 1be123bed..7c9ea2aef 100644 --- a/modules/local/run_alphafold2/main.nf +++ b/modules/local/run_alphafold2/main.nf @@ -32,9 +32,9 @@ process RUN_ALPHAFOLD2 { tuple val(meta), path ("${meta.id}_plddt.tsv") , emit: multiqc tuple val(meta), path ("${meta.id}_msa.tsv") , emit: msa // TODO: alphafold2_model_preset == "monomer" the pae file won't exist. - // Default is monomer_ptm which does calculate metrics. Good default, metrics worth it for minor performance loss - // Nevertheless PAE has to be optional since not all alphafold2 NN models are handled to generate PAE tuple val(meta), path ("${meta.id}_*_pae.tsv") , optional: true, emit: paes + tuple val(meta), path ("${meta.id}_ptm.tsv") , optional: true, emit: ptms + tuple val(meta), path ("${meta.id}_iptm.tsv") , optional: true, emit: iptms path "versions.yml" , emit: versions when: @@ -42,6 +42,7 @@ process RUN_ALPHAFOLD2 { script: // Exit if running this module with -profile conda / -profile mamba + // Note: --pkls ${fasta.baseName}/*.pkl redundantly processes the features.pkl file. Just providing conceptual reminder of file types for future refactor if (workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1) { error("Local RUN_ALPHAFOLD2 module does not support Conda. Please use Docker / Singularity / Podman instead.") } @@ -59,6 +60,7 @@ process RUN_ALPHAFOLD2 { then sed -i "/^\\w*0/d" pdb_seqres/pdb_seqres.txt fi if [ -d params/alphafold_params_* ]; then ln -r -s params/alphafold_params_*/* params/; fi + mgnify_db_path=\$(ls -v ./mgnify/mgy_clusters*.fa | tail -n 1) python3 /app/alphafold/run_alphafold.py \ --fasta_paths=${fasta} \ --model_preset=${alphafold2_model_preset} \ @@ -66,7 +68,7 @@ process RUN_ALPHAFOLD2 { --output_dir=\$PWD \ --data_dir=\$PWD \ --uniref90_database_path=./uniref90/uniref90.fasta \ - --mgnify_database_path=./mgnify/mgy_clusters.fa \ + --mgnify_database_path=\$mgnify_db_path \ --template_mmcif_dir=./mmcif_files \ --obsolete_pdbs_path=./obsolete_pdb/obsolete.dat \ $args @@ -74,7 +76,7 @@ process RUN_ALPHAFOLD2 { cp "${fasta.baseName}"/ranked_0.pdb ./"${meta.id}"_alphafold2.pdb extract_metrics.py --name ${meta.id} \\ - --pkls ${fasta.baseName}/features.pkl \\ + --pkls ${fasta.baseName}/features.pkl ${fasta.baseName}/*.pkl \\ --structs ${fasta.baseName}/ranked*.pdb cat <<-END_VERSIONS > versions.yml @@ -89,6 +91,8 @@ process RUN_ALPHAFOLD2 { touch "${meta.id}_plddt.tsv" touch "${meta.id}_msa.tsv" touch "${meta.id}_0_pae.tsv" + touch "${meta.id}_ptm.tsv" + touch "${meta.id}_iptm.tsv" mkdir "${fasta.baseName}" touch "${fasta.baseName}/ranked_0.pdb" touch "${fasta.baseName}/ranked_1.pdb" diff --git a/dockerfiles/Dockerfile_nfcore-proteinfold_alphafold2_msa b/modules/local/run_alphafold2_msa/Dockerfile similarity index 100% rename from dockerfiles/Dockerfile_nfcore-proteinfold_alphafold2_msa rename to modules/local/run_alphafold2_msa/Dockerfile diff --git a/dockerfiles/Dockerfile_nfcore-proteinfold_alphafold2_pred b/modules/local/run_alphafold2_pred/Dockerfile similarity index 100% rename from dockerfiles/Dockerfile_nfcore-proteinfold_alphafold2_pred rename to modules/local/run_alphafold2_pred/Dockerfile diff --git a/modules/local/run_alphafold2_pred/main.nf b/modules/local/run_alphafold2_pred/main.nf index 0c390c15d..2eea1ac4c 100644 --- a/modules/local/run_alphafold2_pred/main.nf +++ b/modules/local/run_alphafold2_pred/main.nf @@ -22,6 +22,7 @@ process RUN_ALPHAFOLD2_PRED { path ('uniref90/*') path ('pdb_seqres/*') path ('uniprot/*') + // TODO: do we ever really want to be dragging arounda meta2? Can't we just augment meta fields for tracebility? tuple val(meta2), path(features) output: @@ -32,9 +33,9 @@ process RUN_ALPHAFOLD2_PRED { // TODO: re-label multiqc -> plddt so multiqc channel can take in all metrics tuple val(meta), path ("${meta.id}_plddt.tsv") , emit: multiqc // TODO: alphafold2_model_preset == "monomer" the pae file won't exist. - // Default is monomer_ptm which does calculate metrics. Good default, metrics worth it for minor performance loss - // Nevertheless PAE has to be optional since not all alphafold2 NN models are handled to generate PAE tuple val(meta), path ("${meta.id}_*_pae.tsv") , optional: true, emit: paes + tuple val(meta), path ("${meta.id}_ptm.tsv") , optional: true, emit: ptms + tuple val(meta), path ("${meta.id}_iptm.tsv") , optional: true, emit: iptms path "versions.yml" , emit: versions when: @@ -42,24 +43,24 @@ process RUN_ALPHAFOLD2_PRED { script: // Exit if running this module with -profile conda / -profile mamba + // Note: --pkls ${fasta.baseName}/*.pkl redundantly processes the features.pkl file. The use of input: features makes the conceptural separation clear if (workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1) { error("Local RUN_ALPHAFOLD2_PRED module does not support Conda. Please use Docker / Singularity / Podman instead.") } def args = task.ext.args ?: '' """ if [ -d params/alphafold_params_* ]; then ln -r -s params/alphafold_params_*/* params/; fi - python3 /app/alphafold/run_predict.py \ - --fasta_paths=${fasta} \ - --model_preset=${alphafold2_model_preset} \ - --output_dir=\$PWD \ - --data_dir=\$PWD \ - --msa_path=${features} \ - $args + python3 /app/alphafold/run_predict.py \\ + --fasta_paths=${fasta} \\ + --model_preset=${alphafold2_model_preset} \\ + --output_dir=\$PWD \\ + --data_dir=\$PWD \\ + --msa_path=${features} $args cp "${fasta.baseName}"/ranked_0.pdb ./"${meta.id}"_alphafold2.pdb extract_metrics.py --name ${meta.id} \\ - --pkls ${features} \\ + --pkls ${features} ${fasta.baseName}/*.pkl \\ --structs ${fasta.baseName}/ranked*.pdb cat <<-END_VERSIONS > versions.yml diff --git a/dockerfiles/Dockerfile_nfcore-proteinfold_alphafold3_standard b/modules/local/run_alphafold3/Dockerfile similarity index 100% rename from dockerfiles/Dockerfile_nfcore-proteinfold_alphafold3_standard rename to modules/local/run_alphafold3/Dockerfile diff --git a/modules/local/run_boltz/Dockerfile b/modules/local/run_boltz/Dockerfile new file mode 100644 index 000000000..0ef3a4fb4 --- /dev/null +++ b/modules/local/run_boltz/Dockerfile @@ -0,0 +1,25 @@ +FROM python:3.12-slim + +LABEL authors="Ziad Al-Bkhetan " \ + title="nfcore/proteinfold_boltz" \ + Version="1.2.0dev" \ + description="Docker image containing all software requirements to run boltz using the nf-core/proteinfold pipeline" + +RUN apt-get update && \ + apt-get install -y --no-install-recommends \ + build-essential \ + procps \ + && apt-get autoremove -y \ + && rm -rf /var/lib/apt/lists/* + +RUN pip install --no-cache-dir boltz==2.0.3 + +## To update to version 2.2.0, uncomment the following lines, though still was complaining +## about triton version, thought the error msg state to be sure of using 3.3.0 +# RUN pip install --no-cache-dir \ +# cuequivariance_ops_cu12==0.5.1\ +# cuequivariance_ops_torch_cu12==0.5.1 \ +# cuequivariance_torch==0.5.1 \ +# triton==3.3.0 + +CMD ["boltz"] diff --git a/modules/local/run_boltz/main.nf b/modules/local/run_boltz/main.nf index 550384c71..4b91ef91b 100644 --- a/modules/local/run_boltz/main.nf +++ b/modules/local/run_boltz/main.nf @@ -13,15 +13,28 @@ process RUN_BOLTZ { path (files) path ('boltz1_conf.ckpt') path ('ccd.pkl') + path ('boltz2_aff.ckpt') + path ('boltz2_conf.ckpt') + path ('mols') output: + // TODO: rename npz into different emit channels as to not conflict with raw (.tsv) PAE etc. As in PR #306 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 ("${meta.id}_plddt.tsv") , emit: multiqc + // TODO: support cif as well like with HelixFold3 + tuple val(meta), path ("${meta.id}_boltz.pdb") , emit: top_ranked_pdb + tuple val(meta), path ("boltz_results_*/predictions/*/*.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 + tuple val(meta), path ("${meta.id}_plddt.tsv") , emit: plddt_raw + tuple val(meta), path ("${meta.id}_msa.tsv") , optional: true, emit: msa_raw + tuple val(meta), path ("${meta.id}_*_pae.tsv") , emit: pae_raw + tuple val(meta), path ("${meta.id}_ptm.tsv") , emit: ptm_raw + tuple val(meta), path ("${meta.id}_iptm.tsv") , optional: true, emit: iptm_raw + tuple val(meta), path ("${meta.id}_chainwise_ptm.tsv") , emit: summary_chainwise_ptm_raw + tuple val(meta), path ("${meta.id}_chainwise_iptm.tsv") , optional: true, emit: chainwise_iptm_raw path "versions.yml", emit: versions @@ -30,18 +43,31 @@ process RUN_BOLTZ { script: // Exit if running this module with -profile conda / -profile mamba + + // TODO: "boltz_results_*" dir should be be further specified using --out_dir when running Boltz, and being able to go "boltz_results_${meta.id}" instead of "boltz_results_*" + // TODO: MSA processing for Boltz is not solid yet. They can come from webserver, local mmseq, or a custom paired .csv (see docs below) + // https://github.com/jwohlwend/boltz/blob/main/docs/prediction.md#yaml-format + // TODO: what I really need to do is add a function to read /processed/msa/*.npz and convert it to a .tsv file + + // TODO: Boltz is the example to do chain-wise summary files. This will be better if model_id was properly written per prog and EXTRACT_METRICs was a process 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 version = "2.0.3" def args = task.ext.args ?: '' """ - boltz predict "${fasta}" ${args} --cache ./ --write_full_pae --output_format pdb - cp boltz_results_*/predictions/*/*.pdb ./${meta.id}_boltz.pdb + export NUMBA_CACHE_DIR=/tmp + export HOME=/tmp - 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 + boltz predict "${fasta}" --output_format "pdb" ${args} --cache ./ + cp boltz_results_*/predictions/${meta.id}/*_0.pdb ./${meta.id}_boltz.pdb + + extract_metrics.py --name ${meta.id} \\ + --structs boltz_results_*/predictions/${meta.id}/*.pdb \\ + --jsons boltz_results_*/predictions/${meta.id}/confidence_*_model_*.json \\ + --npzs boltz_results_*/predictions/${meta.id}/pae_*_model_*.npz \\ + --csvs boltz_results_*/msa/${meta.id}_*.csv cat <<-END_VERSIONS > versions.yml "${task.process}": @@ -50,20 +76,27 @@ process RUN_BOLTZ { """ stub: - def version = "0.4.1" + def version = "2.0.3" """ 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 + + touch "${meta.id}_boltz.pdb" + touch "${meta.id}_plddt.tsv" + touch "${meta.id}_msa.tsv" + touch "${meta.id}_0_pae.tsv" + touch "${meta.id}_0_ptm.tsv" + touch "${meta.id}_0_iptm.tsv" + touch "${meta.id}_chainwise_ptm.tsv" + touch "${meta.id}_chainwise_iptm.tsv" cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/dockerfiles/Dockerfile_nfcore-proteinfold_esmfold b/modules/local/run_esmfold/Dockerfile similarity index 88% rename from dockerfiles/Dockerfile_nfcore-proteinfold_esmfold rename to modules/local/run_esmfold/Dockerfile index b775faeaa..80b2261d5 100644 --- a/dockerfiles/Dockerfile_nfcore-proteinfold_esmfold +++ b/modules/local/run_esmfold/Dockerfile @@ -30,13 +30,13 @@ RUN wget -q -P /tmp "https://github.com/conda-forge/miniforge/releases/latest/do RUN /conda/bin/conda install --quiet -y conda==24.11.1 pip python=3.9 \ && conda clean --all --force-pkgs-dirs --yes -RUN cd / && /conda/bin/conda update -qy conda \ +RUN cd / && /conda/bin/conda update -qy conda \ && /conda/bin/conda install -y -c conda-forge pip python -RUN /conda/bin/pip install --no-cache-dir git+https://github.com/facebookresearch/esm.git -RUN /conda/bin/pip install --no-cache-dir "fair-esm[esmfold]" +RUN /conda/bin/pip install --no-cache-dir git+https://github.com/facebookresearch/esm.git +RUN /conda/bin/pip install --no-cache-dir "fair-esm[esmfold]" RUN /conda/bin/pip install --no-cache-dir torch==2.0.0 torchvision==0.15.0 --upgrade --force-reinstall --index-url https://download.pytorch.org/whl/cu118 -RUN /conda/bin/pip install --no-cache-dir \ +RUN /conda/bin/pip install --no-cache-dir \ pytorch_lightning==1.9.5 \ biopython==1.85 \ ## https://github.com/facebookresearch/esm/issues/621#issuecomment-1741684707 @@ -51,7 +51,7 @@ RUN /conda/bin/pip install --no-cache-dir \ typing-extensions==4.12.2 \ wandb==0.12.21 -RUN /conda/bin/pip install --no-cache-dir 'dllogger @ git+https://github.com/NVIDIA/dllogger.git' +RUN /conda/bin/pip install --no-cache-dir 'dllogger @ git+https://github.com/NVIDIA/dllogger.git' ## https://github.com/aqlaboratory/insilico_design_pipeline/blob/main/README.md#additional-notes RUN git clone https://github.com/aqlaboratory/openfold.git && \ diff --git a/modules/local/run_esmfold/main.nf b/modules/local/run_esmfold/main.nf index 006a125ba..e42f02138 100644 --- a/modules/local/run_esmfold/main.nf +++ b/modules/local/run_esmfold/main.nf @@ -43,6 +43,7 @@ process RUN_ESMFOLD { $args mv *.pdb ${meta.id}_esmfold.pdb + extract_metrics.py --name ${meta.id} \\ --structs ${meta.id}_esmfold.pdb diff --git a/modules/local/run_helixfold3/Dockerfile b/modules/local/run_helixfold3/Dockerfile index 6e8f2ddbe..16c19c3b3 100644 --- a/modules/local/run_helixfold3/Dockerfile +++ b/modules/local/run_helixfold3/Dockerfile @@ -12,11 +12,11 @@ LABEL Author="j.caley@unsw.edu.au, Jose Espinosa-Carrasco" \ RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends -y wget git && \ wget -q -P /tmp "https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-$(uname)-$(uname -m).sh" && \ bash /tmp/Miniforge3-$(uname)-$(uname -m).sh -b -p /conda && \ - git clone --single-branch --branch dev --depth 1 --no-checkout https://github.com/PaddlePaddle/PaddleHelix.git /app/helixfold3 && \ + git clone --filter=blob:none --no-checkout https://github.com/PaddlePaddle/PaddleHelix.git /app/helixfold3 && \ cd /app/helixfold3 && \ git sparse-checkout init --cone && \ git sparse-checkout set apps/protein_folding/helixfold3 && \ - git checkout dev && \ + git checkout 705c2974a833cdc3a4420f4e3379da596091c97f && \ mv apps/protein_folding/helixfold3/* . && \ rm -rf /tmp/Miniforge3-$(uname)-$(uname -m).sh /var/lib/apt/lists/* /root/.cache apps && \ apt-get remove --purge -y wget git && apt-get autoremove -y && apt-get clean -y diff --git a/dockerfiles/environment_nfcore-proteinfold_helixfold3.yaml b/modules/local/run_helixfold3/environment.yaml similarity index 100% rename from dockerfiles/environment_nfcore-proteinfold_helixfold3.yaml rename to modules/local/run_helixfold3/environment.yaml diff --git a/modules/local/run_helixfold3/environment_nfcore-proteinfold_helixfold3.yaml b/modules/local/run_helixfold3/environment_nfcore-proteinfold_helixfold3.yaml deleted file mode 100644 index e277fcef3..000000000 --- a/modules/local/run_helixfold3/environment_nfcore-proteinfold_helixfold3.yaml +++ /dev/null @@ -1,35 +0,0 @@ -name: helixfold -channels: - - conda-forge - - bioconda - - nvidia - - biocore - -dependencies: - - python=3.9 - - cuda-toolkit=12.0 - - cudnn=8.4.0 - - nccl=2.14 - - libgcc - - libgomp - - pip - - aria2 - - hmmer==3.4 - - kalign2==2.04 - - hhsuite==3.3.0 - - openbabel - - pip: - - paddlepaddle-gpu==2.6.1 -f https://www.paddlepaddle.org.cn/whl/linux/mkl/avx/stable.html - - absl-py==0.13.0 - - biopython==1.79 - - chex==0.0.7 - - dm-haiku==0.0.4 - - dm-tree==0.1.6 - - docker==5.0.0 - - immutabledict==2.0.0 - - jax==0.2.14 - - ml-collections==0.1.0 - - pandas==1.3.4 - - scipy==1.9.0 - - rdkit-pypi==2022.9.5 - - posebusters diff --git a/modules/local/run_helixfold3/main.nf b/modules/local/run_helixfold3/main.nf index c0e2864a4..9d5cd337b 100644 --- a/modules/local/run_helixfold3/main.nf +++ b/modules/local/run_helixfold3/main.nf @@ -27,11 +27,13 @@ process RUN_HELIXFOLD3 { output: tuple val(meta), path ("${meta.id}_helixfold3.pdb") , emit: top_ranked_pdb tuple val(meta), path ("${meta.id}_helixfold3.cif") , emit: main_cif - tuple val(meta), path ("${meta.id}/ranked*.pdb") , emit: pdb + tuple val(meta), path ("${meta.id}-ranked*.pdb") , emit: pdb tuple val(meta), path ("${meta.id}_plddt.tsv") , emit: multiqc tuple val(meta), path ("${meta.id}_msa.tsv") , emit: msa // If ${meta.id}-rank*/all_results.json" doesn't have PAE vales in the key, this will be empty - tuple val(meta), path ("${meta.id}_*_pae.tsv") , optional: true, emit: paes + tuple val(meta), path ("${meta.id}_*_pae.tsv") , emit: paes + tuple val(meta), path ("${meta.id}_ptm.tsv") , emit: ptms + tuple val(meta), path ("${meta.id}_iptm.tsv") , optional: true, emit: iptms path ("versions.yml") , emit: versions when: @@ -44,6 +46,9 @@ process RUN_HELIXFOLD3 { } def args = task.ext.args ?: '' """ + init_model_path=\$(ls ./init_models/*.pdparams | head -n 1) + mgnify_db_path=\$(ls -v ./mgnify/mgy_clusters*.fa | tail -n 1) + mamba run --name helixfold python3.9 /app/helixfold3/inference.py \\ --maxit_binary "./maxit_src/bin/maxit" \\ --jackhmmer_binary_path "jackhmmer" \\ @@ -63,9 +68,11 @@ process RUN_HELIXFOLD3 { --obsolete_pdbs_path="./obsolete.dat" \\ --ccd_preprocessed_path="./ccd_preprocessed_etkdg.pkl.gz" \\ --uniref90_database_path "./uniref90/uniref90.fasta" \\ - --mgnify_database_path "./mgnify/mgy_clusters.fa" \\ + --mgnify_database_path "\$mgnify_db_path" \\ --input_json="${fasta}" \\ - --output_dir="\$PWD" $args + --output_dir="\$PWD" \\ + --init_model "\$init_model_path" \\ + $args cp "${fasta.baseName}/${fasta.baseName}-rank1/predicted_structure.pdb" "./${meta.id}_helixfold3.pdb" cp "${fasta.baseName}/${fasta.baseName}-rank1/predicted_structure.cif" "./${meta.id}_helixfold3.cif" @@ -76,8 +83,9 @@ process RUN_HELIXFOLD3 { --jsons ${fasta.baseName}/${fasta.baseName}-rank*/all_results.json [ ! -d ${meta.id} ] && mkdir ${meta.id} - for i in 1 2 3 4 5 - do cp "${fasta.baseName}/${fasta.baseName}-rank\$i/predicted_structure.pdb" "${meta.id}/ranked_\$i.pdb" + for i in 1 2 3 4 5; do + cp "${fasta.baseName}/${fasta.baseName}-rank\$i/predicted_structure.pdb" "${meta.id}-ranked_\$i.pdb" + done cat <<-END_VERSIONS > versions.yml @@ -92,13 +100,19 @@ process RUN_HELIXFOLD3 { touch "${meta.id}_helixfold3.pdb" touch "${meta.id}_plddt.tsv" touch "${meta.id}_msa.tsv" - touch "${meta.id}_0_pae.tsv" + touch "${meta.id}_ptm.tsv" + touch "${meta.id}_iptm.tsv" + touch "${meta.id}_1_pae.tsv" + touch "${meta.id}_2_pae.tsv" + touch "${meta.id}_3_pae.tsv" + touch "${meta.id}_4_pae.tsv" + touch "${meta.id}_5_pae.tsv" mkdir "${meta.id}" - touch "${meta.id}/ranked_1.pdb" - touch "${meta.id}/ranked_2.pdb" - touch "${meta.id}/ranked_3.pdb" - touch "${meta.id}/ranked_4.pdb" - touch "${meta.id}/ranked_5.pdb" + touch "${meta.id}-ranked_1.pdb" + touch "${meta.id}-ranked_2.pdb" + touch "${meta.id}-ranked_3.pdb" + touch "${meta.id}-ranked_4.pdb" + touch "${meta.id}-ranked_5.pdb" cat <<-END_VERSIONS > versions.yml diff --git a/modules/local/run_rosettafold_all_atom/Dockerfile b/modules/local/run_rosettafold_all_atom/Dockerfile index 42c0c90f7..649b66155 100644 --- a/modules/local/run_rosettafold_all_atom/Dockerfile +++ b/modules/local/run_rosettafold_all_atom/Dockerfile @@ -1,30 +1,33 @@ -FROM nvidia/cuda:12.6.0-cudnn-devel-ubuntu24.04 +ARG CUDA=12.6.0 +FROM nvidia/cuda:${CUDA}-runtime-ubuntu24.04 AS builder +# FROM directive resets ARGS, so we specify again (the value is retained if +# previously set). +ARG CUDA LABEL Author="j.caley@unsw.edu.au" \ title="nfcore/proteinfold_rosettafold_all_atom" \ - Version="0.9.0" \ + Version="1.2.0dev" \ description="Docker image containing all software requirements to run the RUN_ROSETTAFOLD_ALL_ATOM module using the nf-core/proteinfold pipeline" ENV PYTHONPATH="/app/RoseTTAFold-All-Atom" \ PATH="/conda/bin:/app/RoseTTAFold-All-Atom:$PATH" \ DGLBACKEND="pytorch" \ - LD_LIBRARY_PATH="/conda/lib:/usr/local/cuda-12.6/lib64:$LD_LIBRARY_PATH" + LD_LIBRARY_PATH="/conda/lib:/usr/local/cuda-$(cut -f1,2 -d. <<< ${CUDA})/lib64:$LD_LIBRARY_PATH" RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends -y wget git && \ - wget -q -P /tmp "https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-$(uname)-$(uname -m).sh" && \ + wget -q -P /tmp "https://github.com/conda-forge/miniforge/releases/download/24.11.0-0/Miniforge3-$(uname)-$(uname -m).sh" && \ bash /tmp/Miniforge3-$(uname)-$(uname -m).sh -b -p /conda && \ - rm -rf /tmp/Miniforge3-$(uname)-$(uname -m).sh /var/lib/apt/lists/* && \ - apt-get autoremove -y && apt-get clean -y - -RUN git clone --single-branch --depth 1 https://github.com/Australian-Structural-Biology-Computing/RoseTTAFold-All-Atom.git /app/RoseTTAFold-All-Atom && \ + rm -rf /tmp/Miniforge3-$(uname)-$(uname -m).sh /var/lib/apt/lists/* /root/.cache && \ + git clone --single-branch --depth 1 https://github.com/Australian-Structural-Biology-Computing/RoseTTAFold-All-Atom.git /app/RoseTTAFold-All-Atom && \ cd /app/RoseTTAFold-All-Atom && \ + git fetch --depth 1 origin e8f94d6d6ddfb07da2119bcfa94359bc6912fd29 && \ + git checkout e8f94d6d6ddfb07da2119bcfa94359bc6912fd29 && \ /conda/bin/mamba env create --file=environment.yaml && \ /conda/bin/mamba run -n RFAA bash -c \ "python /app/RoseTTAFold-All-Atom/rf2aa/SE3Transformer/setup.py install && \ bash /app/RoseTTAFold-All-Atom/install_dependencies.sh" && \ - /conda/bin/mamba clean --all --force-pkgs-dirs -y - -RUN cd /app/RoseTTAFold-All-Atom && \ + /conda/bin/mamba clean --all --force-pkgs-dirs -y && \ + cd /app/RoseTTAFold-All-Atom && \ wget https://ftp.ncbi.nlm.nih.gov/blast/executables/legacy.NOTSUPPORTED/2.2.26/blast-2.2.26-x64-linux.tar.gz && \ mkdir -p blast-2.2.26 && \ tar -xf blast-2.2.26-x64-linux.tar.gz -C blast-2.2.26 && \ @@ -32,4 +35,17 @@ RUN cd /app/RoseTTAFold-All-Atom && \ rm -r blast-2.2.26 && \ mv blast-2.2.26_bk/ blast-2.2.26 && \ rm -rf /root/.cache *.tar.gz && \ - apt-get autoremove -y && apt-get remove --purge -y wget git && apt-get clean -y + apt-get remove --purge -y wget git && apt-get autoremove -y && apt-get clean -y + +FROM nvidia/cuda:${CUDA}-base-ubuntu24.04 +# FROM directive resets ARGS, so we specify again (the value is retained if +# previously set). +ARG CUDA + +COPY --from=builder /app /app +COPY --from=builder /conda /conda + +ENV PYTHONPATH="/app/RoseTTAFold-All-Atom" \ + PATH="/conda/bin:/app/RoseTTAFold-All-Atom:$PATH" \ + DGLBACKEND="pytorch" \ + LD_LIBRARY_PATH="/conda/lib:/usr/local/cuda-$(cut -f1,2 -d. <<< ${CUDA})/lib64:$LD_LIBRARY_PATH" diff --git a/modules/nf-core/multiqc/environment.yml b/modules/nf-core/multiqc/environment.yml index a27122ce1..812fc4c5e 100644 --- a/modules/nf-core/multiqc/environment.yml +++ b/modules/nf-core/multiqc/environment.yml @@ -1,5 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json channels: - conda-forge - bioconda dependencies: - - bioconda::multiqc=1.27 + - bioconda::multiqc=1.29 diff --git a/modules/nf-core/multiqc/main.nf b/modules/nf-core/multiqc/main.nf index 297cbb066..21cb62cdf 100644 --- a/modules/nf-core/multiqc/main.nf +++ b/modules/nf-core/multiqc/main.nf @@ -3,8 +3,8 @@ process MULTIQC { tag "$meta.model" conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/multiqc:1.27--pyhdfd78af_0' : - 'biocontainers/multiqc:1.27--pyhdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/multiqc:1.29--pyhdfd78af_0' : + 'biocontainers/multiqc:1.29--pyhdfd78af_0' }" input: tuple val(meta), path(multiqc_files) diff --git a/modules/nf-core/multiqc/meta.yml b/modules/nf-core/multiqc/meta.yml index b16c18792..ce30eb732 100644 --- a/modules/nf-core/multiqc/meta.yml +++ b/modules/nf-core/multiqc/meta.yml @@ -15,57 +15,71 @@ tools: licence: ["GPL-3.0-or-later"] identifier: biotools:multiqc input: - - - multiqc_files: - type: file - description: | - List of reports / files recognised by MultiQC, for example the html and zip output of FastQC - - - multiqc_config: - type: file - description: Optional config yml for MultiQC - pattern: "*.{yml,yaml}" - - - extra_multiqc_config: - type: file - description: Second optional config yml for MultiQC. Will override common sections - in multiqc_config. - pattern: "*.{yml,yaml}" - - - multiqc_logo: + - multiqc_files: + type: file + description: | + List of reports / files recognised by MultiQC, for example the html and zip output of FastQC + ontologies: [] + - multiqc_config: + type: file + description: Optional config yml for MultiQC + pattern: "*.{yml,yaml}" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML + - extra_multiqc_config: + type: file + description: Second optional config yml for MultiQC. Will override common sections + in multiqc_config. + pattern: "*.{yml,yaml}" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML + - multiqc_logo: + type: file + description: Optional logo file for MultiQC + pattern: "*.{png}" + ontologies: [] + - replace_names: + type: file + description: | + Optional two-column sample renaming file. First column a set of + patterns, second column a set of corresponding replacements. Passed via + MultiQC's `--replace-names` option. + pattern: "*.{tsv}" + ontologies: + - edam: http://edamontology.org/format_3475 # TSV + - sample_names: + type: file + description: | + Optional TSV file with headers, passed to the MultiQC --sample_names + argument. + pattern: "*.{tsv}" + ontologies: + - edam: http://edamontology.org/format_3475 # TSV +output: + report: + - "*multiqc_report.html": type: file - description: Optional logo file for MultiQC - pattern: "*.{png}" - - - replace_names: + description: MultiQC report file + pattern: "multiqc_report.html" + ontologies: [] + data: + - "*_data": + type: directory + description: MultiQC data dir + pattern: "multiqc_data" + plots: + - "*_plots": type: file - description: | - Optional two-column sample renaming file. First column a set of - patterns, second column a set of corresponding replacements. Passed via - MultiQC's `--replace-names` option. - pattern: "*.{tsv}" - - - sample_names: + description: Plots created by MultiQC + pattern: "*_data" + ontologies: [] + versions: + - versions.yml: type: file - description: | - Optional TSV file with headers, passed to the MultiQC --sample_names - argument. - pattern: "*.{tsv}" -output: - - report: - - "*multiqc_report.html": - type: file - description: MultiQC report file - pattern: "multiqc_report.html" - - data: - - "*_data": - type: directory - description: MultiQC data dir - pattern: "multiqc_data" - - plots: - - "*_plots": - type: file - description: Plots created by MultiQC - pattern: "*_data" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML authors: - "@abhi18av" - "@bunop" diff --git a/modules/nf-core/multiqc/tests/main.nf.test.snap b/modules/nf-core/multiqc/tests/main.nf.test.snap index 7a42646aa..028cb199b 100644 --- a/modules/nf-core/multiqc/tests/main.nf.test.snap +++ b/modules/nf-core/multiqc/tests/main.nf.test.snap @@ -2,14 +2,14 @@ "multiqc_versions_single": { "content": [ [ - "versions.yml:md5,8f3b8c1cec5388cf2708be948c9fa42f" + "versions.yml:md5,c1fe644a37468f6dae548d98bc72c2c1" ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.4" + "nextflow": "25.04.2" }, - "timestamp": "2025-01-27T09:29:57.631982377" + "timestamp": "2025-05-22T11:50:41.182332996" }, "multiqc_stub": { "content": [ @@ -17,25 +17,25 @@ "multiqc_report.html", "multiqc_data", "multiqc_plots", - "versions.yml:md5,8f3b8c1cec5388cf2708be948c9fa42f" + "versions.yml:md5,c1fe644a37468f6dae548d98bc72c2c1" ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.4" + "nextflow": "25.04.2" }, - "timestamp": "2025-01-27T09:30:34.743726958" + "timestamp": "2025-05-22T11:51:22.448739369" }, "multiqc_versions_config": { "content": [ [ - "versions.yml:md5,8f3b8c1cec5388cf2708be948c9fa42f" + "versions.yml:md5,c1fe644a37468f6dae548d98bc72c2c1" ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.4" + "nextflow": "25.04.2" }, - "timestamp": "2025-01-27T09:30:21.44383553" + "timestamp": "2025-05-22T11:51:06.198928424" } } diff --git a/modules/nf-core/unzip/environment.yml b/modules/nf-core/unzip/environment.yml new file mode 100644 index 000000000..246158953 --- /dev/null +++ b/modules/nf-core/unzip/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - conda-forge::p7zip=16.02 diff --git a/modules/nf-core/unzip/main.nf b/modules/nf-core/unzip/main.nf new file mode 100644 index 000000000..a0c02109c --- /dev/null +++ b/modules/nf-core/unzip/main.nf @@ -0,0 +1,49 @@ +process UNZIP { + tag "$archive" + label 'process_single' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/p7zip:16.02' : + 'biocontainers/p7zip:16.02' }" + + input: + tuple val(meta), path(archive) + + output: + tuple val(meta), path("${prefix}/"), emit: unzipped_archive + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + if ( archive instanceof List && archive.name.size > 1 ) { error "[UNZIP] error: 7za only accepts a single archive as input. Please check module input." } + prefix = task.ext.prefix ?: ( meta.id ? "${meta.id}" : archive.baseName) + """ + 7za \\ + x \\ + -o"${prefix}"/ \\ + $args \\ + $archive + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + 7za: \$(echo \$(7za --help) | sed 's/.*p7zip Version //; s/(.*//') + END_VERSIONS + """ + + stub: + def args = task.ext.args ?: '' + if ( archive instanceof List && archive.name.size > 1 ) { error "[UNZIP] error: 7za only accepts a single archive as input. Please check module input." } + prefix = task.ext.prefix ?: ( meta.id ? "${meta.id}" : archive.baseName) + """ + mkdir "${prefix}" + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + 7za: \$(echo \$(7za --help) | sed 's/.*p7zip Version //; s/(.*//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/unzip/meta.yml b/modules/nf-core/unzip/meta.yml new file mode 100644 index 000000000..ba1eb9129 --- /dev/null +++ b/modules/nf-core/unzip/meta.yml @@ -0,0 +1,50 @@ +name: unzip +description: Unzip ZIP archive files +keywords: + - unzip + - decompression + - zip + - archiving +tools: + - unzip: + description: p7zip is a quick port of 7z.exe and 7za.exe (command line version + of 7zip, see www.7-zip.org) for Unix. + homepage: https://sourceforge.net/projects/p7zip/ + documentation: https://sourceforge.net/projects/p7zip/ + tool_dev_url: https://sourceforge.net/projects/p7zip" + licence: ["LGPL-2.1-or-later"] + identifier: "" +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - archive: + type: file + description: ZIP file + pattern: "*.zip" + ontologies: + - edam: http://edamontology.org/format_3987 # ZIP format +output: + unzipped_archive: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - ${prefix}/: + type: directory + description: Directory contents of the unzipped archive + pattern: "${archive.baseName}/" + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML +authors: + - "@jfy133" +maintainers: + - "@jfy133" diff --git a/modules/nf-core/unzip/tests/main.nf.test b/modules/nf-core/unzip/tests/main.nf.test new file mode 100644 index 000000000..238b68d8b --- /dev/null +++ b/modules/nf-core/unzip/tests/main.nf.test @@ -0,0 +1,54 @@ +nextflow_process { + + name "Test Process UNZIP" + script "../main.nf" + process "UNZIP" + + tag "modules" + tag "modules_nfcore" + tag "unzip" + + test("generic [tar] [tar_gz]") { + + when { + process { + """ + input[0] = [ + [ id: 'hello' ], + file(params.modules_testdata_base_path + 'generic/tar/hello.tar.gz', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("generic [tar] [tar_gz] stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id: 'hello' ], + file(params.modules_testdata_base_path + 'generic/tar/hello.tar.gz', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/nf-core/unzip/tests/main.nf.test.snap b/modules/nf-core/unzip/tests/main.nf.test.snap new file mode 100644 index 000000000..cdd2ab164 --- /dev/null +++ b/modules/nf-core/unzip/tests/main.nf.test.snap @@ -0,0 +1,76 @@ +{ + "generic [tar] [tar_gz] stub": { + "content": [ + { + "0": [ + [ + { + "id": "hello" + }, + [ + + ] + ] + ], + "1": [ + "versions.yml:md5,52c55ce814e8bc9edc5a6c625ed794b8" + ], + "unzipped_archive": [ + [ + { + "id": "hello" + }, + [ + + ] + ] + ], + "versions": [ + "versions.yml:md5,52c55ce814e8bc9edc5a6c625ed794b8" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-30T19:16:37.11550986" + }, + "generic [tar] [tar_gz]": { + "content": [ + { + "0": [ + [ + { + "id": "hello" + }, + [ + "hello.tar:md5,80c66db79a773bc87b3346035ff9593e" + ] + ] + ], + "1": [ + "versions.yml:md5,52c55ce814e8bc9edc5a6c625ed794b8" + ], + "unzipped_archive": [ + [ + { + "id": "hello" + }, + [ + "hello.tar:md5,80c66db79a773bc87b3346035ff9593e" + ] + ] + ], + "versions": [ + "versions.yml:md5,52c55ce814e8bc9edc5a6c625ed794b8" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-30T19:16:25.120242571" + } +} \ No newline at end of file diff --git a/nextflow.config b/nextflow.config index 3125eae31..643c39a17 100644 --- a/nextflow.config +++ b/nextflow.config @@ -11,46 +11,48 @@ params { // Input options input = null - mode = 'alphafold2' // {alphafold2, colabfold, esmfold, rosettafold_all_atom, helixfold3, boltz} + mode = 'alphafold2' // {alphafold2, colabfold, esmfold, rosettafold_all_atom, alphafold3, helixfold3, boltz} use_gpu = false split_fasta = false db = null + use_msa_server = false + msa_server_url = null + uniref30_prefix = null // Alphafold2 parameters - alphafold2_mode = "standard" - max_template_date = "2038-01-19" - full_dbs = false // true full_dbs, false reduced_dbs - alphafold2_model_preset = "monomer" // for AF2 {monomer (default), monomer_casp14, monomer_ptm, multimer} - alphafold2_db = null - random_seed = null + alphafold2_mode = 'split_msa_prediction' // {standard, split_msa_prediction} + alphafold2_max_template_date = '2038-01-19' + alphafold2_full_dbs = false // true full_dbs, false reduced_dbs + alphafold2_model_preset = 'monomer_ptm' // for AF2 {monomer, monomer_casp14, monomer_ptm, multimer} + alphafold2_db = null + alphafold2_random_seed = null // Alphafold2 links - bfd_link = null - alphafold2_small_bfd_link = null - alphafold2_params_link = null - alphafold2_mgnify_link = null - pdb70_link = null - alphafold2_pdb_mmcif_link = null - pdb_obsolete_link = null - alphafold2_uniref30_link = null - alphafold2_uniref90_link = null - alphafold2_pdb_seqres_link = null - uniprot_sprot_link = null - uniprot_trembl_link = null - uniref30_prefix = null + alphafold2_bfd_link = null + alphafold2_small_bfd_link = null + alphafold2_params_link = null + alphafold2_mgnify_link = null + alphafold2_pdb70_link = null + alphafold2_pdb_mmcif_link = null + alphafold2_pdb_obsolete_link = null + alphafold2_uniref30_link = null + alphafold2_uniref90_link = null + alphafold2_pdb_seqres_link = null + alphafold2_uniprot_sprot_link = null + alphafold2_uniprot_trembl_link = null // Alphafold2 paths - bfd_path = null - alphafold2_small_bfd_path = null - alphafold2_params_path = null - alphafold2_mgnify_path = null - pdb70_path = null - alphafold2_pdb_mmcif_path = null - pdb_obsolete_path = null - alphafold2_uniref30_path = null - alphafold2_uniref90_path = null - alphafold2_pdb_seqres_path = null - alphafold2_uniprot_path = null + alphafold2_bfd_path = null + alphafold2_small_bfd_path = null + alphafold2_params_path = null + alphafold2_mgnify_path = null + alphafold2_pdb70_path = null + alphafold2_pdb_mmcif_path = null + alphafold2_pdb_obsolete_path = null + alphafold2_uniref30_path = null + alphafold2_uniref90_path = null + alphafold2_pdb_seqres_path = null + alphafold2_uniprot_path = null // Alphafold3 parameters alphafold3_db = null @@ -61,7 +63,7 @@ params { alphafold3_pdb_mmcif_link = null alphafold3_uniref90_link = null alphafold3_pdb_seqres_link = null - uniprot_link = null + alphafold3_uniprot_link = null // Alphafold3 paths alphafold3_small_bfd_path = null @@ -72,39 +74,46 @@ params { alphafold3_pdb_seqres_path = null alphafold3_uniprot_path = null + // Boltz parameters + boltz_model = null + boltz_use_potentials = false + // Boltz links boltz_ccd_link = null boltz_model_link = null + boltz2_aff_link = null + boltz2_conf_link = null + boltz2_mols_link = null // Boltz paths boltz_db = null boltz_ccd_path = null boltz_model_path = null - boltz_use_msa_server = true + boltz2_aff_path = null + boltz2_conf_path = null + boltz2_mols_path = null // Colabfold parameters - colabfold_server = "webserver" - colabfold_model_preset = "alphafold2_ptm" // {'alphafold2_ptm', 'alphafold2_multimer_v1', 'alphafold2_multimer_v2', 'alphafold2_multimer_v3'} - num_recycles_colabfold = 3 - use_amber = true - colabfold_db = null - db_load_mode = 0 - host_url = null - use_templates = true - create_colabfold_index = false + colabfold_model_preset = "alphafold2_ptm" // {'alphafold2_ptm', 'alphafold2_multimer_v1', 'alphafold2_multimer_v2', 'alphafold2_multimer_v3'} + colabfold_num_recycles = 3 + colabfold_use_amber = true + colabfold_db = null + colabfold_db_load_mode = 0 + colabfold_use_templates = true + colabfold_create_index = false // Colabfold links colabfold_db_link = null colabfold_uniref30_link = null // Colabfold paths - colabfold_db_path = null + colabfold_envdb_path = null colabfold_uniref30_path = null // Esmfold parameters esmfold_db = null esmfold_model_preset = "monomer" - num_recycles_esmfold = 4 + esmfold_num_recycles = 4 // Esmfold links esmfold_3B_v1 = null @@ -118,25 +127,22 @@ params { rosettafold_all_atom_db = null // RoseTTAFold_All_Atom links - uniref30_rosettafold_all_atom_link = null - pdb100_rosettafold_all_atom_link = null - bfd_rosettafold_all_atom_link = null - rfaa_paper_weights_link = null + rosettafold_all_atom_uniref30_link = null + rosettafold_all_atom_pdb100_link = null + rosettafold_all_atom_bfd_link = null + rosettafold_all_atom_paper_weights_link = null // RoseTTAFold_All_Atom paths - uniref30_rosettafold_all_atom_path = null - pdb100_rosettafold_all_atom_path = null - bfd_rosettafold_all_atom_path = null - rfaa_paper_weights_path = null + rosettafold_all_atom_uniref30_path = null + rosettafold_all_atom_pdb100_path = null + rosettafold_all_atom_bfd_path = null + rosettafold_all_atom_paper_weights_path = null // Helixfold3 parameters helixfold3_db = null - model_name = null - preset = null - init_model = null - logging_level = null - precision = null - infer_times = null + helixfold3_full_dbs = false // true full_dbs, false reduced_dbs + helixfold3_precision = "bf16" + helixfold3_infer_times = 4 helixfold3_max_template_date = "2038-01-19" // Helixfold3 links @@ -152,7 +158,8 @@ params { helixfold3_uniref90_link = null helixfold3_mgnify_link = null helixfold3_pdb_mmcif_link = null - helixfold3_pdb_obsolete_link = null + helixfold3_obsolete_link = null + helixfold3_maxit_src_link = null // Helixfold3 paths helixfold3_uniclust30_path = null @@ -417,7 +424,6 @@ dag { manifest { name = 'nf-core/proteinfold' - author = """Athanasios Baltzis, Jose Espinosa-Carrasco, Harshil Patel""" // The author field is deprecated from Nextflow version 24.10.0, use contributors instead contributors = [ [ name: 'Athanasios Baltzis', @@ -448,7 +454,7 @@ manifest { description = """Protein 3D structure prediction pipeline""" mainScript = 'main.nf' defaultBranch = 'master' - nextflowVersion = '!>=24.04.2' + nextflowVersion = '!>=24.10.5' version = '1.2.0dev' doi = '10.5281/zenodo.7629996' } @@ -457,7 +463,7 @@ manifest { // Temporary fix for CI to pass with nextflow edge version until fix // TODO: Update schema version again when fixed plugins { - id 'nf-schema@2.3.0' // Validation of pipeline parameters and creation of an input channel from a sample sheet + id 'nf-schema@2.4.2' // Validation of pipeline parameters and creation of an input channel from a sample sheet } validation { @@ -494,6 +500,8 @@ validation { if (params.mode.toLowerCase().split(",").contains("alphafold2")) { params.alphafold2_db = params.alphafold2_db ?: params.db } +if (params.mode.toLowerCase().split(",").contains("alphafold3")) + { params.alphafold3_db = params.alphafold3_db ?: params.db } if (params.mode.toLowerCase().split(",").contains("colabfold")) { params.colabfold_db = params.colabfold_db ?: params.db } if (params.mode.toLowerCase().split(",").contains("esmfold")) diff --git a/nextflow_schema.json b/nextflow_schema.json index d190ef946..6b7b1dd48 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -76,6 +76,18 @@ "description": "UniRef major release", "enum": ["UniRef30_2023_02", "UniRef30_2022_02", "UniRef30_2021_03"], "fa_icon": "fas fa-database" + }, + "use_msa_server": { + "type": "boolean", + "description": "Use the cloud MSA server", + "icon": "fas folder-open" + }, + "msa_server_url": { + "type": "string", + "description": "Specify your custom MMSeqs2 API server url", + "fa_icon": "fas fa-link", + "format": "uri", + "errorMessage": "Please provide a valid URL for the MMSeqs2 API server" } } }, @@ -85,7 +97,7 @@ "fa_icon": "fas fa-dna", "description": "AlphaFold2 options.", "properties": { - "max_template_date": { + "alphafold2_max_template_date": { "type": "string", "default": "2038-01-19", "description": "Maximum date of the PDB templates used by 'AlphaFold2' mode", @@ -93,27 +105,28 @@ "pattern": "^\\d{4}-\\d{2}-\\d{2}$", "errorMessage": "Date must be in YYYY-MM-DD format" }, - "full_dbs": { + "alphafold2_full_dbs": { "type": "boolean", "description": "If true uses the full version of the BFD database otherwise, otherwise it uses its reduced version, small bfd", "fa_icon": "fas fa-battery-full" }, "alphafold2_mode": { "type": "string", - "default": "standard", + "default": "split_msa_prediction", "description": "Specifies the mode in which AlphaFold2 will be run", "enum": ["standard", "split_msa_prediction"], "fa_icon": "fas fa-exchange-alt" }, "alphafold2_model_preset": { "type": "string", - "default": "monomer", + "default": "monomer_ptm", "description": "Model preset for 'AlphaFold2' mode", "enum": ["monomer", "monomer_casp14", "monomer_ptm", "multimer"], "fa_icon": "fas fa-stream" }, - "random_seed": { - "type": "string" + "alphafold2_random_seed": { + "type": "string", + "description": "Random seed to control stochastic alphafold inference." }, "alphafold2_params_prefix": { "type": "string", @@ -129,35 +142,12 @@ } } }, - "alphafold3_options": { - "title": "Alphafold3 options", - "type": "object", - "fa_icon": "fas fa-dna", - "description": "Alphafold3 options.", - "properties": { - "alphafold3_db": { - "type": "string", - "format": "path", - "exists": true, - "description": "Specifies the DB and PARAMS path used by 'AlphaFold3' mode", - "fa_icon": "fas fa-database", - "errorMessage": "Please provide a valid path to AlphaFold3 database" - } - } - }, "colabfold_options": { "title": "ColabFold options", "type": "object", "fa_icon": "fas fa-coins", "description": "ColabFold options.", "properties": { - "colabfold_server": { - "type": "string", - "default": "webserver", - "description": "Specifies the MSA server used by ColabFold", - "enum": ["webserver", "local"], - "fa_icon": "fas fa-server" - }, "colabfold_model_preset": { "type": "string", "default": "alphafold2_ptm", @@ -170,7 +160,7 @@ ], "fa_icon": "fas fa-stream" }, - "num_recycles_colabfold": { + "colabfold_num_recycles": { "type": "integer", "default": 3, "description": "Number of recycles for ColabFold", @@ -179,33 +169,26 @@ "maximum": 20, "errorMessage": "Number of recycles must be a whole number between 1 and 20" }, - "use_amber": { + "colabfold_use_amber": { "type": "boolean", "default": true, "description": "Use Amber minimization to refine the predicted structures", "fa_icon": "fas fa-compress-alt" }, - "db_load_mode": { + "colabfold_db_load_mode": { "type": "integer", "description": "Specify the way that MMSeqs2 will load the required databases in memory", "fa_icon": "fas fa-download", "enum": [0, 1, 2, 3], "errorMessage": "DB load mode must be 0, 1, 2, or 3" }, - "host_url": { - "type": "string", - "description": "Specify your custom MMSeqs2 API server url", - "fa_icon": "fas fa-link", - "format": "uri", - "errorMessage": "Please provide a valid URL for the MMSeqs2 API server" - }, - "use_templates": { + "colabfold_use_templates": { "type": "boolean", "default": true, "description": "Use PDB templates", "fa_icon": "fas fa-paste" }, - "create_colabfold_index": { + "colabfold_create_index": { "type": "boolean", "description": "Create databases indexes when running colabfold_local mode", "fa_icon": "fas fa-bezier-curve" @@ -218,7 +201,7 @@ "fa_icon": "fas fa-coins", "description": "ESMFold options.", "properties": { - "num_recycles_esmfold": { + "esmfold_num_recycles": { "type": "integer", "default": 4, "description": "Specifies the number of recycles used by ESMFold", @@ -242,11 +225,13 @@ "fa_icon": "fas fa-database", "description": "Boltz options.", "properties": { - "boltz_use_msa_server": { + "boltz_use_potentials": { "type": "boolean", - "description": "Use the cloud MSA server", - "icon": "fas folder-open", - "default": true + "description": "run Boltz-2 using inference time potentials" + }, + "boltz_model": { + "type": "string", + "description": "Sets the model to use for prediction. Default is boltz2" } } }, @@ -287,27 +272,26 @@ "description": "HelixFold3 options", "default": "", "properties": { - "model_name": { - "type": "string" - }, - "preset": { - "type": "string" - }, - "init_model": { - "type": "string" - }, - "logging_level": { - "type": "string" + "helixfold3_full_dbs": { + "type": "boolean", + "description": "If true uses the full version of the BFD database otherwise, otherwise it uses its reduced version, small bfd" }, - "precision": { - "type": "string" + "helixfold3_precision": { + "type": "string", + "enum": ["bf16", "fp32"], + "description": "The numerical precision used by the HelixFold3 model.", + "default": "bf16" }, - "infer_times": { - "type": "string" + "helixfold3_infer_times": { + "type": "integer", + "default": 4, + "minimum": 1, + "description": "Number of independent predictions made with the HelixFold3 model" }, "helixfold3_max_template_date": { "type": "string", - "default": "2038-01-19" + "default": "2038-01-19", + "description": "No PDB template released after this date will be used to guide predictions." } } }, @@ -383,7 +367,7 @@ "fa_icon": "fas fa-database", "description": "Parameters used to provide the links to the DBs and parameters public resources to AlphaFold2.", "properties": { - "bfd_link": { + "alphafold2_bfd_link": { "type": "string", "default": "https://storage.googleapis.com/alphafold-databases/casp14_versions/bfd_metaclust_clu_complete_id30_c90_final_seq.sorted_opt.tar.gz", "description": "Link to BFD dababase", @@ -403,13 +387,13 @@ }, "alphafold2_mgnify_link": { "type": "string", - "default": "https://storage.googleapis.com/alphafold-databases/v2.3/mgy_clusters_2022_05.fa.gz", + "default": "https://ftp.ebi.ac.uk/pub/databases/metagenomics/peptide_database/2024_04/mgy_clusters.fa.gz", "description": "Link to the MGnify database", "fa_icon": "fas fa-link" }, - "pdb70_link": { + "alphafold2_pdb70_link": { "type": "string", - "default": "http://wwwuser.gwdg.de/~compbiol/data/hhsuite/databases/hhsuite_dbs/old-releases/pdb70_from_mmcif_200916.tar.gz", + "default": "https://wwwuser.gwdguser.de/~compbiol/data/hhsuite/databases/hhsuite_dbs/pdb70_from_mmcif_220313.tar.gz", "description": "Link to the PDB70 database", "fa_icon": "fas fa-link" }, @@ -419,7 +403,7 @@ "description": "Link to the PDB mmCIF database", "fa_icon": "fas fa-link" }, - "pdb_obsolete_link": { + "alphafold2_pdb_obsolete_link": { "type": "string", "default": "https://files.wwpdb.org/pub/pdb/data/status/obsolete.dat", "description": "Link to the PDB obsolete database", @@ -427,7 +411,7 @@ }, "alphafold2_uniref30_link": { "type": "string", - "default": "https://storage.googleapis.com/alphafold-databases/v2.3/UniRef30_2021_03.tar.gz", + "default": "https://wwwuser.gwdguser.de/~compbiol/uniclust/2023_02/UniRef30_2023_02_hhsuite.tar.gz", "description": "Link to the Uniclust30 database", "fa_icon": "fas fa-link" }, @@ -443,13 +427,13 @@ "description": "Link to the PDB SEQRES database", "fa_icon": "fas fa-link" }, - "uniprot_sprot_link": { + "alphafold2_uniprot_sprot_link": { "type": "string", "default": "https://ftp.ebi.ac.uk/pub/databases/uniprot/current_release/knowledgebase/complete/uniprot_sprot.fasta.gz", "description": "Link to the SwissProt UniProt database", "fa_icon": "fas fa-link" }, - "uniprot_trembl_link": { + "alphafold2_uniprot_trembl_link": { "type": "string", "default": "https://ftp.ebi.ac.uk/pub/databases/uniprot/current_release/knowledgebase/complete/uniprot_trembl.fasta.gz", "description": "Link to the TrEMBL UniProt database", @@ -471,7 +455,7 @@ "fa_icon": "fas fa-database", "errorMessage": "Please provide a valid path to AlphaFold2 database" }, - "bfd_path": { + "alphafold2_bfd_path": { "type": "string", "description": "Path to BFD dababase", "fa_icon": "fas fa-folder-open", @@ -495,11 +479,11 @@ "fa_icon": "fas fa-folder-open", "default": "null/mgnify/*" }, - "pdb70_path": { + "alphafold2_pdb70_path": { "type": "string", "description": "Path to the PDB70 database", "fa_icon": "fas fa-folder-open", - "default": "null/pdb70/*" + "default": "null/pdb70/**" }, "alphafold2_pdb_mmcif_path": { "type": "string", @@ -507,7 +491,7 @@ "fa_icon": "fas fa-folder-open", "default": "null/pdb_mmcif/mmcif_files" }, - "pdb_obsolete_path": { + "alphafold2_pdb_obsolete_path": { "type": "string", "description": "Path to the PDB obsolete file", "fa_icon": "fas fa-folder-open", @@ -545,6 +529,14 @@ "fa_icon": "fas fa-database", "description": "Parameters used to provide the links to the DBs and parameters public resources to Alphafold3.", "properties": { + "alphafold3_db": { + "type": "string", + "format": "path", + "exists": true, + "description": "Specifies the DB and PARAMS path used by 'AlphaFold3' mode", + "fa_icon": "fas fa-database", + "errorMessage": "Please provide a valid path to AlphaFold3 database" + }, "alphafold3_small_bfd_link": { "type": "string", "default": "https://storage.googleapis.com/alphafold-databases/v3.0/bfd-first_non_consensus_sequences.fasta.zst", @@ -575,7 +567,7 @@ "description": "Link to the PDB SEQRES database", "fa_icon": "fas fa-link" }, - "uniprot_link": { + "alphafold3_uniprot_link": { "type": "string", "default": "https://storage.googleapis.com/alphafold-databases/v3.0/uniprot_all_2021_04.fa.zst", "description": "Link to the UniProt database", @@ -672,7 +664,7 @@ "fa_icon": "fas fa-folder-open", "errorMessage": "Please provide a valid path to ColabFold database" }, - "colabfold_db_path": { + "colabfold_envdb_path": { "type": "string", "description": "Link to the ColabFold database", "fa_icon": "fas fa-folder-open", @@ -761,6 +753,21 @@ "description": "Link to download model file", "icon": "fas fa-link", "default": "https://huggingface.co/boltz-community/boltz-1/resolve/main/boltz1_conf.ckpt" + }, + "boltz2_aff_link": { + "type": "string", + "default": "https://huggingface.co/boltz-community/boltz-2/resolve/main/boltz2_aff.ckpt", + "description": "Link to download boltz affinity file" + }, + "boltz2_conf_link": { + "type": "string", + "default": "https://huggingface.co/boltz-community/boltz-2/resolve/main/boltz2_conf.ckpt", + "description": "Link to download boltz-2 conf file" + }, + "boltz2_mols_link": { + "type": "string", + "default": "https://huggingface.co/boltz-community/boltz-2/resolve/main/mols.tar", + "description": "Link to download boltz-2 mols" } } }, @@ -786,6 +793,21 @@ "description": "Path to boltz Model file", "icon": "fas folder-open", "default": "null/params/boltz1_conf.ckpt" + }, + "boltz2_aff_path": { + "type": "string", + "default": "null/params/boltz2_aff.ckpt", + "description": "Path to boltz affinity file" + }, + "boltz2_conf_path": { + "type": "string", + "default": "null/params/boltz2_conf.ckpt", + "description": "Path to boltz-2 conf file" + }, + "boltz2_mols_path": { + "type": "string", + "default": "null/params/mols/", + "description": "Path to boltz-2 mols" } } }, @@ -903,21 +925,25 @@ "description": "Parameters used to provide the paths to the DBs and parameters for RoseTTAFold All Atom.", "default": "", "properties": { - "uniref30_rosettafold_all_atom_link": { + "rosettafold_all_atom_uniref30_link": { "type": "string", - "default": "http://wwwuser.gwdg.de/~compbiol/uniclust/2020_06/UniRef30_2020_06_hhsuite.tar.gz" + "default": "https://wwwuser.gwdguser.de/~compbiol/uniclust/2023_02/UniRef30_2023_02_hhsuite.tar.gz", + "description": "Link to the UniRef30 database for RoseTTAFold All Atom" }, - "bfd_rosettafold_all_atom_link": { + "rosettafold_all_atom_bfd_link": { "type": "string", - "default": "https://bfd.mmseqs.com/bfd_metaclust_clu_complete_id30_c90_final_seq.sorted_opt.tar.gz" + "default": "https://bfd.mmseqs.com/bfd_metaclust_clu_complete_id30_c90_final_seq.sorted_opt.tar.gz", + "description": "Link to the BFD database for RoseTTAFold All Atom" }, - "pdb100_rosettafold_all_atom_link": { + "rosettafold_all_atom_pdb100_link": { "type": "string", - "default": "https://files.ipd.uw.edu/pub/RoseTTAFold/pdb100_2021Mar03.tar.gz" + "default": "https://files.ipd.uw.edu/pub/RoseTTAFold/pdb100_2021Mar03.tar.gz", + "description": "Link to the PDB100 database for RoseTTAFold All Atom" }, - "rfaa_paper_weights_link": { + "rosettafold_all_atom_paper_weights_link": { "type": "string", - "default": "http://files.ipd.uw.edu/pub/RF-All-Atom/weights/RFAA_paper_weights.pt" + "default": "http://files.ipd.uw.edu/pub/RF-All-Atom/weights/RFAA_paper_weights.pt", + "description": "Link to the RoseTTAFold All Atom paper weights" } } }, @@ -928,23 +954,28 @@ "default": "", "properties": { "rosettafold_all_atom_db": { - "type": "string" + "type": "string", + "description": "Path to RoseTTAFold All Atom database" }, - "uniref30_rosettafold_all_atom_path": { + "rosettafold_all_atom_uniref30_path": { "type": "string", - "default": "null/uniref30/*" + "default": "null/uniref30/*", + "description": "Path to UniRef30 database for RoseTTAFold All Atom" }, - "bfd_rosettafold_all_atom_path": { + "rosettafold_all_atom_bfd_path": { "type": "string", - "default": "null/bfd/*" + "default": "null/bfd/*", + "description": "Path to BFD database for RoseTTAFold All Atom" }, - "pdb100_rosettafold_all_atom_path": { + "rosettafold_all_atom_pdb100_path": { "type": "string", - "default": "null/pdb100/*" + "default": "null/pdb100/*", + "description": "Path to PDB100 database for RoseTTAFold All Atom" }, - "rfaa_paper_weights_path": { + "rosettafold_all_atom_paper_weights_path": { "type": "string", - "default": "null/params/RFAA_paper_weights.pt" + "default": "null/params/RFAA_paper_weights.pt", + "description": "Path to RoseTTAFold All Atom paper weights" } } }, @@ -955,59 +986,73 @@ "default": "", "properties": { "helixfold3_db": { - "type": "string" + "type": "string", + "description": "Path to HelixFold3 database" }, "helixfold3_init_models_path": { "type": "string", - "default": "null/params/HelixFold3-240814.pdparams" + "default": "null/params/HelixFold3-240814.pdparams", + "description": "Path to HelixFold3 init models" }, "helixfold3_uniclust30_path": { "type": "string", - "default": "null/uniref30/*" + "default": "null/uniref30/*", + "description": "Path to UniRef30 database for HelixFold3" }, "helixfold3_ccd_preprocessed_path": { "type": "string", - "default": "null/params/ccd_preprocessed_etkdg.pkl.gz" + "default": "null/params/ccd_preprocessed_etkdg.pkl.gz", + "description": "Path to CCD preprocessed file for HelixFold3" }, "helixfold3_rfam_path": { "type": "string", - "default": "null/rfam/Rfam-14.9_rep_seq.fasta" + "default": "null/rfam/Rfam-14.9_rep_seq.fasta", + "description": "Path to Rfam database for HelixFold3" }, "helixfold3_bfd_path": { "type": "string", - "default": "null/bfd/*" + "default": "null/bfd/*", + "description": "Path to BFD database for HelixFold3" }, "helixfold3_small_bfd_path": { "type": "string", - "default": "null/small_bfd/*" + "default": "null/small_bfd/*", + "description": "Path to reduced BFD database for HelixFold3" }, "helixfold3_uniprot_path": { "type": "string", - "default": "null/uniprot/*" + "default": "null/uniprot/*", + "description": "Path to UniProt database for HelixFold3" }, "helixfold3_pdb_seqres_path": { "type": "string", - "default": "null/pdb_seqres/*" + "default": "null/pdb_seqres/*", + "description": "Path to PDB SEQRES database for HelixFold3" }, "helixfold3_uniref90_path": { "type": "string", - "default": "null/uniref90/*" + "default": "null/uniref90/*", + "description": "Path to UniRef90 database for HelixFold3" }, "helixfold3_mgnify_path": { "type": "string", - "default": "null/mgnify/*" + "default": "null/mgnify/*", + "description": "Path to MGnify database for HelixFold3" }, "helixfold3_pdb_mmcif_path": { "type": "string", - "default": "null/pdb_mmcif/mmcif_files" + "default": "null/pdb_mmcif/mmcif_files", + "description": "Path to PDB mmCIF database for HelixFold3" }, "helixfold3_maxit_src_path": { "type": "string", - "default": "null/maxit-v11.200-prod-src" + "default": "null/maxit-v11.200-prod-src", + "description": "Path to Maxit Suite for HelixFold3" }, "helixfold3_obsolete_path": { "type": "string", - "default": "null/pdb_mmcif/obsolete.dat" + "default": "null/pdb_mmcif/obsolete.dat", + "description": "Path to obsolete PDB file for HelixFold3" } } }, @@ -1019,58 +1064,73 @@ "properties": { "helixfold3_init_models_link": { "type": "string", - "default": "https://paddlehelix.bd.bcebos.com/HelixFold3/params/HelixFold3-params-240814.zip" + "default": "https://paddlehelix.bd.bcebos.com/HelixFold3/params/HelixFold3-params-240814.zip", + "description": "Link to HelixFold3 init models" }, "helixfold3_uniclust30_link": { "type": "string", - "default": "https://storage.googleapis.com/alphafold-databases/casp14_versions/uniclust30_2018_08_hhsuite.tar.gz" + "default": "https://wwwuser.gwdguser.de/~compbiol/uniclust/2023_02/UniRef30_2023_02_hhsuite.tar.gz", + "description": "Link to UniRef30 database for HelixFold3" }, "helixfold3_ccd_preprocessed_link": { "type": "string", - "default": "https://paddlehelix.bd.bcebos.com/HelixFold3/CCD/ccd_preprocessed_etkdg.pkl.gz" + "default": "https://paddlehelix.bd.bcebos.com/HelixFold3/CCD/ccd_preprocessed_etkdg.pkl.gz", + "description": "Link to CCD preprocessed file for HelixFold3" }, "helixfold3_rfam_link": { "type": "string", - "default": "https://paddlehelix.bd.bcebos.com/HelixFold3/MSA/Rfam-14.9_rep_seq.fasta" + "default": "https://paddlehelix.bd.bcebos.com/HelixFold3/MSA/Rfam-14.9_rep_seq.fasta", + "description": "Link to Rfam database for HelixFold3" }, "helixfold3_bfd_link": { "type": "string", - "default": "https://storage.googleapis.com/alphafold-databases/casp14_versions/bfd_metaclust_clu_complete_id30_c90_final_seq.sorted_opt.tar.gz" + "default": "https://storage.googleapis.com/alphafold-databases/casp14_versions/bfd_metaclust_clu_complete_id30_c90_final_seq.sorted_opt.tar.gz", + "description": "Link to BFD database for HelixFold3" }, "helixfold3_small_bfd_link": { "type": "string", - "default": "https://storage.googleapis.com/alphafold-databases/reduced_dbs/bfd-first_non_consensus_sequences.fasta.gz" + "default": "https://storage.googleapis.com/alphafold-databases/reduced_dbs/bfd-first_non_consensus_sequences.fasta.gz", + "description": "Link to reduced BFD database for HelixFold3" }, "helixfold3_pdb_seqres_link": { "type": "string", - "default": "https://files.wwpdb.org/pub/pdb/derived_data/pdb_seqres.txt" + "default": "https://files.wwpdb.org/pub/pdb/derived_data/pdb_seqres.txt", + "description": "Link to PDB SEQRES database for HelixFold3" }, "helixfold3_uniref90_link": { "type": "string", - "default": "ftp://ftp.uniprot.org/pub/databases/uniprot/uniref/uniref90/uniref90.fasta.gz" + "default": "ftp://ftp.uniprot.org/pub/databases/uniprot/uniref/uniref90/uniref90.fasta.gz", + "description": "Link to UniRef90 database for HelixFold3" }, "helixfold3_mgnify_link": { "type": "string", - "default": "https://storage.googleapis.com/alphafold-databases/casp14_versions/mgy_clusters_2018_12.fa.gz" + "default": "https://ftp.ebi.ac.uk/pub/databases/metagenomics/peptide_database/2024_04/mgy_clusters.fa.gz", + "description": "Link to MGnify database for HelixFold3" }, "helixfold3_pdb_mmcif_link": { "type": "string", - "default": "rsync.rcsb.org::ftp_data/structures/divided/mmCIF/" + "default": "rsync.rcsb.org::ftp_data/structures/divided/mmCIF/", + "description": "Link to PDB mmCIF database for HelixFold3" }, "helixfold3_uniprot_sprot_link": { "type": "string", - "default": "ftp://ftp.ebi.ac.uk/pub/databases/uniprot/current_release/knowledgebase/complete/uniprot_sprot.fasta.gz" + "default": "ftp://ftp.ebi.ac.uk/pub/databases/uniprot/current_release/knowledgebase/complete/uniprot_sprot.fasta.gz", + "description": "Link to UniProt SwissProt database for HelixFold3" }, "helixfold3_uniprot_trembl_link": { "type": "string", - "default": "ftp://ftp.ebi.ac.uk/pub/databases/uniprot/current_release/knowledgebase/complete/uniprot_trembl.fasta.gz" - }, - "helixfold3_pdb_obsolete_link": { - "type": "string" + "default": "ftp://ftp.ebi.ac.uk/pub/databases/uniprot/current_release/knowledgebase/complete/uniprot_trembl.fasta.gz", + "description": "Link to UniProt TrEMBL database for HelixFold3" }, "helixfold3_obsolete_link": { "type": "string", - "default": "https://files.rcsb.org/pub/pdb/data/status/obsolete.dat" + "default": "https://files.rcsb.org/pub/pdb/data/status/obsolete.dat", + "description": "Link to obsolete PDB file for HelixFold3" + }, + "helixfold3_maxit_src_link": { + "type": "string", + "default": "https://proteinfold-dataset.s3.amazonaws.com/test-data/db/helixfold3/maxit-v11.200-prod-src.tar.gz", + "description": "Link to Maxit Suite for HelixFold3" } } } @@ -1082,9 +1142,6 @@ { "$ref": "#/$defs/alphafold2_options" }, - { - "$ref": "#/$defs/alphafold3_options" - }, { "$ref": "#/$defs/colabfold_options" }, diff --git a/nf-test.config b/nf-test.config index 889df7601..3a1fff59f 100644 --- a/nf-test.config +++ b/nf-test.config @@ -9,7 +9,7 @@ config { configFile "tests/nextflow.config" // ignore tests coming from the nf-core/modules repo - ignore 'modules/nf-core/**/*', 'subworkflows/nf-core/**/*' + ignore 'modules/nf-core/**/tests/*', 'subworkflows/nf-core/**/tests/*' // run all test with defined profile(s) from the main nextflow.config profile "test" diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index 47e8fba94..9980ec684 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -22,8 +22,8 @@ "@id": "./", "@type": "Dataset", "creativeWorkStatus": "InProgress", - "datePublished": "2025-06-03T11:01:48+00:00", - "description": "

\n \n \n \"nf-core/proteinfold\"\n \n

\n\n[![GitHub Actions CI Status](https://github.com/nf-core/proteinfold/actions/workflows/ci.yml/badge.svg)](https://github.com/nf-core/proteinfold/actions/workflows/ci.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/proteinfold/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/proteinfold/actions/workflows/linting.yml)[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/proteinfold/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.13135393-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.13135393)\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Nextflow](https://img.shields.io/badge/version-%E2%89%A524.04.2-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)\n[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.3.1-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.3.1)\n[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/)\n[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/)\n[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/)\n[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/nf-core/proteinfold)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23proteinfold-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/proteinfold)[![Follow on Bluesky](https://img.shields.io/badge/bluesky-%40nf__core-1185fe?labelColor=000000&logo=bluesky)](https://bsky.app/profile/nf-co.re)[![Follow on Mastodon](https://img.shields.io/badge/mastodon-nf__core-6364ff?labelColor=FFFFFF&logo=mastodon)](https://mstdn.science/@nf_core)[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core)\n\n## Introduction\n\n**nf-core/proteinfold** is a bioinformatics best-practice analysis pipeline for Protein 3D structure prediction.\n\nThe pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool to run tasks across multiple compute infrastructures in a very portable manner. It uses Docker/Singularity containers making installation trivial and results highly reproducible. The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementation of this pipeline uses one container per process which makes it much easier to maintain and update software dependencies. Where possible, these processes have been submitted to and installed from [nf-core/modules](https://github.com/nf-core/modules) in order to make them available to all nf-core pipelines, and to everyone within the Nextflow community!\n\nOn release, automated continuous integration tests run the pipeline on a full-sized dataset on the AWS cloud infrastructure. This ensures that the pipeline runs on AWS, has sensible resource allocation defaults set to run on real-world datasets, and permits the persistent storage of results to benchmark between pipeline releases and other analysis sources. The results obtained from the full-sized test can be viewed on the [nf-core website](https://nf-co.re/proteinfold/results).\n\n## Pipeline summary\n\n![Alt text](docs/images/nf-core-proteinfold_metro_map_1.1.0.png?raw=true \"nf-core-proteinfold 1.1.0 metro map\")\n\n1. Choice of protein structure prediction method:\n\n i. [AlphaFold2](https://github.com/deepmind/alphafold) - Regular AlphaFold2 (MSA computation and model inference in the same process)\n\n ii. [AlphaFold2 split](https://github.com/luisas/alphafold_split) - AlphaFold2 MSA computation and model inference in separate processes\n\n iii. [AlphaFold3](https://github.com/deepmind/alphafold) - Regular AlphaFold3 (MSA computation and model inference in the same process)\n\n iv. [ColabFold](https://github.com/sokrypton/ColabFold) - MMseqs2 API server followed by ColabFold\n\n v. [ColabFold](https://github.com/sokrypton/ColabFold) - MMseqs2 local search followed by ColabFold\n\n vi. [ESMFold](https://github.com/facebookresearch/esm) - Regular ESM\n\n vii. [RoseTTAFold-All-Atom](https://github.com/baker-laboratory/RoseTTAFold-All-Atom/) - Regular RFAA\n\n viii. [HelixFold3](https://github.com/PaddlePaddle/PaddleHelix/tree/dev/apps/protein_folding/helixfold3) - Regular HF3\n\n ix. [Boltz](https://github.com/jwohlwend/boltz/) - Regular Boltz-1\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\nNow, you can run the pipeline using:\n\n```bash\nnextflow run nf-core/proteinfold \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\nThe pipeline takes care of downloading the databases and parameters required by AlphaFold2, Colabfold, ESMFold or RoseTTAFold-All-Atom. In case you have already downloaded the required files, you can skip this step by providing the path to the databases using the corresponding parameter [`--alphafold2_db`], [`--colabfold_db`], [`--esmfold_db`] or ['--rosettafold_all_atom_db']. Please refer to the [usage documentation](https://nf-co.re/proteinfold/usage) to check the directory structure you must provide for each database.\n\n- The typical command to run AlphaFold2 mode is shown below:\n\n ```console\n nextflow run nf-core/proteinfold \\\n --input samplesheet.csv \\\n --outdir \\\n --mode alphafold2 \\\n --alphafold2_db \\\n --full_dbs \\\n --alphafold2_model_preset monomer \\\n --use_gpu \\\n -profile \n ```\n\n- Here is the command to run AlphaFold2 splitting the MSA from the prediction execution:\n\n ```console\n nextflow run nf-core/proteinfold \\\n --input samplesheet.csv \\\n --outdir \\\n --mode alphafold2 \\\n --alphafold2_mode split_msa_prediction \\\n --alphafold2_db \\\n --full_dbs \\\n --alphafold2_model_preset monomer \\\n --use_gpu \\\n -profile \n ```\n\n- The AlphaFold3 mode can be run using the command below:\n\n ```console\n nextflow run nf-core/proteinfold \\\n --input samplesheet.csv \\\n --outdir \\\n --mode alphafold3 \\\n --alphafold3_db \\\n --use_gpu \\\n -profile \n ```\n\n > [!WARNING]\n > The AlphaFold3 weights are not provided by this pipeline. Users must obtain the weights directly from DeepMind according to their [terms of use](https://github.com/deepmind/alphafold/blob/main/WEIGHTS_TERMS_OF_USE.md) and [prohibited use policy](https://github.com/deepmind/alphafold/blob/main/WEIGHTS_PROHIBITED_USE_POLICY.md). Please ensure you comply with all terms and conditions before using AlphaFold3. For more information about AlphaFold3 usage and requirements, please refer to the [official AlphaFold3 repository](https://github.com/deepmind/alphafold).\n\n- Below, the command to run colabfold_local mode:\n\n ```console\n nextflow run nf-core/proteinfold \\\n --input samplesheet.csv \\\n --outdir \\\n --mode colabfold \\\n --colabfold_server local \\\n --colabfold_db \\\n --num_recycles_colabfold 3 \\\n --use_amber \\\n --colabfold_model_preset \"alphafold2_ptm\" \\\n --use_gpu \\\n --db_load_mode 0\n -profile \n ```\n\n- The typical command to run colabfold_webserver mode would be:\n\n ```console\n nextflow run nf-core/proteinfold \\\n --input samplesheet.csv \\\n --outdir \\\n --mode colabfold \\\n --colabfold_server webserver \\\n --host_url \\\n --colabfold_db \\\n --num_recycles_colabfold 3 \\\n --use_amber \\\n --colabfold_model_preset \"alphafold2_ptm\" \\\n --use_gpu \\\n -profile \n ```\n\n [!WARNING]\n\n > If you aim to carry out a large amount of predictions using the colabfold_webserver mode, please setup and use your own custom MMSeqs2 API Server. You can find instructions [here](https://github.com/sokrypton/ColabFold/tree/main/MsaServer).\n\n- The esmfold mode can be run using the command below:\n\n ```console\n nextflow run nf-core/proteinfold \\\n --input samplesheet.csv \\\n --outdir \\\n --mode esmfold \\\n --esmfold_model_preset \\\n --esmfold_db \\\n --num_recycles_esmfold 4 \\\n --use_gpu \\\n -profile \n ```\n\n- The rosettafold_all_atom mode can be run using the command below:\n\n ```console\n nextflow run nf-core/proteinfold \\\n --input samplesheet.csv \\\n --outdir \\\n --mode rosettafold_all_atom \\\n --rosettafold_all_atom_db \\\n --use_gpu \\\n -profile \n ```\n\n- The helixfold3 mode can be run using the command below:\n\n ```console\n nextflow run nf-core/proteinfold \\\n --input samplesheet.csv \\\n --outdir \\\n --mode helixfold3 \\\n --helixfold3_db \\\n --use_gpu \\\n -profile \n ```\n\n- The boltz mode can be run using the command below:\n\n ```console\n nextflow run nf-core/proteinfold \\\n --input samplesheet.csv \\\n --outdir \\\n --mode boltz \\\n --boltz_ccd_path \\\n --boltz_model_path \\\n --use_gpu \\\n -profile \n ```\n\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/usage/getting_started/configuration#custom-configuration-files).\n\nFor more details and further functionality, please refer to the [usage documentation](https://nf-co.re/proteinfold/usage) and the [parameter documentation](https://nf-co.re/proteinfold/parameters).\n\n## Pipeline output\n\nTo see the results of an example test run with a full size dataset refer to the [results](https://nf-co.re/proteinfold/results) tab on the nf-core website pipeline page.\nFor more details about the output files and reports, please refer to the\n[output documentation](https://nf-co.re/proteinfold/output).\n\n## Credits\n\nnf-core/proteinfold was originally written by Athanasios Baltzis ([@athbaltzis](https://github.com/athbaltzis)), Jose Espinosa-Carrasco ([@JoseEspinosa](https://github.com/JoseEspinosa)), Luisa Santus ([@luisas](https://github.com/luisas)) and Leila Mansouri ([@l-mansouri](https://github.com/l-mansouri)) from [The Comparative Bioinformatics Group](https://www.crg.eu/en/cedric_notredame) at [The Centre for Genomic Regulation, Spain](https://www.crg.eu/) under the umbrella of the [BovReg project](https://www.bovreg.eu/) and Harshil Patel ([@drpatelh](https://github.com/drpatelh)) from [Seqera Labs, Spain](https://seqera.io/).\n\nMany thanks to others who have helped out and contributed along the way too, including (but not limited to): Norman Goodacre and Waleed Osman from Interline Therapeutics ([@interlinetx](https://github.com/interlinetx)), Martin Steinegger ([@martin-steinegger](https://github.com/martin-steinegger)) and Raoul J.P. Bonnal ([@rjpbonnal](https://github.com/rjpbonnal))\n\nWe would also like to thanks to the AWS Open Data Sponsorship Program for generously providing the resources necessary to host the data utilized in the testing, development, and deployment of nf-core proteinfold.\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\nFor further information or help, don't hesitate to get in touch on the [Slack `#proteinfold` channel](https://nfcore.slack.com/channels/proteinfold) (you can join with [this invite](https://nf-co.re/join/slack)).\n\n## Citations\n\nIf you use nf-core/proteinfold for your analysis, please cite it using the following doi: [10.5281/zenodo.7437038](https://doi.org/10.5281/zenodo.7437038)\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nYou can cite the `nf-core` publication as follows:\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).\n", + "datePublished": "2025-07-08T11:39:36+00:00", + "description": "

\n \n \n \"nf-core/proteinfold\"\n \n

\n\n[![GitHub Actions CI Status](https://github.com/nf-core/proteinfold/actions/workflows/nf-test.yml/badge.svg)](https://github.com/nf-core/proteinfold/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/proteinfold/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/proteinfold/actions/workflows/linting.yml)[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/proteinfold/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.13135393-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.13135393)\n\n[![Nextflow](https://img.shields.io/badge/version-%E2%89%A524.10.5-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)\n[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.3.2-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.3.2)\n[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/)\n[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/)\n[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/)\n[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/nf-core/proteinfold)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23proteinfold-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/proteinfold)[![Follow on Bluesky](https://img.shields.io/badge/bluesky-%40nf__core-1185fe?labelColor=000000&logo=bluesky)](https://bsky.app/profile/nf-co.re)[![Follow on Mastodon](https://img.shields.io/badge/mastodon-nf__core-6364ff?labelColor=FFFFFF&logo=mastodon)](https://mstdn.science/@nf_core)[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core)\n\n## Introduction\n\n**nf-core/proteinfold** is a bioinformatics best-practice analysis pipeline for Protein 3D structure prediction.\n\nThe pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool to run tasks across multiple compute infrastructures in a very portable manner. It uses Docker/Singularity containers making installation trivial and results highly reproducible. The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementation of this pipeline uses one container per process which makes it much easier to maintain and update software dependencies. Where possible, these processes have been submitted to and installed from [nf-core/modules](https://github.com/nf-core/modules) in order to make them available to all nf-core pipelines, and to everyone within the Nextflow community!\n\nOn release, automated continuous integration tests run the pipeline on a full-sized dataset on the AWS cloud infrastructure. This ensures that the pipeline runs on AWS, has sensible resource allocation defaults set to run on real-world datasets, and permits the persistent storage of results to benchmark between pipeline releases and other analysis sources. The results obtained from the full-sized test can be viewed on the [nf-core website](https://nf-co.re/proteinfold/results).\n\n## Pipeline summary\n\n![Alt text](docs/images/nf-core-proteinfold_metro_map_1.1.0.png?raw=true \"nf-core-proteinfold 1.1.0 metro map\")\n\n1. Choice of protein structure prediction method:\n\n i. [AlphaFold2](https://github.com/deepmind/alphafold) - Regular AlphaFold2 (MSA computation and model inference in the same process)\n\n ii. [AlphaFold2 split](https://github.com/luisas/alphafold_split) - AlphaFold2 MSA computation and model inference in separate processes\n\n iii. [AlphaFold3](https://github.com/deepmind/alphafold) - Regular AlphaFold3 (MSA computation and model inference in the same process)\n\n iv. [ColabFold](https://github.com/sokrypton/ColabFold) - MMseqs2 API server followed by ColabFold\n\n v. [ColabFold](https://github.com/sokrypton/ColabFold) - MMseqs2 local search followed by ColabFold\n\n vi. [ESMFold](https://github.com/facebookresearch/esm) - Regular ESM\n\n vii. [RoseTTAFold-All-Atom](https://github.com/baker-laboratory/RoseTTAFold-All-Atom/) - Regular RFAA\n\n viii. [HelixFold3](https://github.com/PaddlePaddle/PaddleHelix/tree/dev/apps/protein_folding/helixfold3) - Regular HF3\n\n ix. [Boltz](https://github.com/jwohlwend/boltz/) - Regular Boltz-1\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\nNow, you can run the pipeline using:\n\n```bash\nnextflow run nf-core/proteinfold \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\nThe pipeline takes care of downloading the databases and parameters required by AlphaFold2, Colabfold, ESMFold or RoseTTAFold-All-Atom. In case you have already downloaded the required files, you can skip this step by providing the path to the databases using the corresponding parameter [`--alphafold2_db`], [`--colabfold_db`], [`--esmfold_db`] or ['--rosettafold_all_atom_db']. Please refer to the [usage documentation](https://nf-co.re/proteinfold/usage) to check the directory structure you must provide for each database.\n\n- The typical command to run AlphaFold2 mode is shown below:\n\n ```console\n nextflow run nf-core/proteinfold \\\n --input samplesheet.csv \\\n --outdir \\\n --mode alphafold2 \\\n --alphafold2_db \\\n --full_dbs \\\n --alphafold2_model_preset monomer \\\n --use_gpu \\\n -profile \n ```\n\n- Here is the command to run AlphaFold2 splitting the MSA from the prediction execution:\n\n ```console\n nextflow run nf-core/proteinfold \\\n --input samplesheet.csv \\\n --outdir \\\n --mode alphafold2 \\\n --alphafold2_mode split_msa_prediction \\\n --alphafold2_db \\\n --full_dbs \\\n --alphafold2_model_preset monomer \\\n --use_gpu \\\n -profile \n ```\n\n- The AlphaFold3 mode can be run using the command below:\n\n ```console\n nextflow run nf-core/proteinfold \\\n --input samplesheet.csv \\\n --outdir \\\n --mode alphafold3 \\\n --alphafold3_db \\\n --use_gpu \\\n -profile \n ```\n\n > [!WARNING]\n > The AlphaFold3 weights are not provided by this pipeline. Users must obtain the weights directly from DeepMind according to their [terms of use](https://github.com/deepmind/alphafold/blob/main/WEIGHTS_TERMS_OF_USE.md) and [prohibited use policy](https://github.com/deepmind/alphafold/blob/main/WEIGHTS_PROHIBITED_USE_POLICY.md). Please ensure you comply with all terms and conditions before using AlphaFold3. For more information about AlphaFold3 usage and requirements, please refer to the [official AlphaFold3 repository](https://github.com/deepmind/alphafold).\n\n- Below, the command to run colabfold_local mode:\n\n ```console\n nextflow run nf-core/proteinfold \\\n --input samplesheet.csv \\\n --outdir \\\n --mode colabfold \\\n --colabfold_db \\\n --num_recycles_colabfold 3 \\\n --use_amber \\\n --colabfold_model_preset \"alphafold2_ptm\" \\\n --use_gpu \\\n --db_load_mode 0\n -profile \n ```\n\n- The typical command to run colabfold_webserver mode would be:\n\n ```console\n nextflow run nf-core/proteinfold \\\n --input samplesheet.csv \\\n --outdir \\\n --mode colabfold \\\n --use_msa_server \\\n --msa_server_url \\\n --colabfold_db \\\n --num_recycles_colabfold 3 \\\n --use_amber \\\n --colabfold_model_preset \"alphafold2_ptm\" \\\n --use_gpu \\\n -profile \n ```\n\n [!WARNING]\n\n > If you aim to carry out a large amount of predictions using the colabfold_webserver mode, please setup and use your own custom MMSeqs2 API Server. You can find instructions [here](https://github.com/sokrypton/ColabFold/tree/main/MsaServer).\n\n- The esmfold mode can be run using the command below:\n\n ```console\n nextflow run nf-core/proteinfold \\\n --input samplesheet.csv \\\n --outdir \\\n --mode esmfold \\\n --esmfold_model_preset \\\n --esmfold_db \\\n --num_recycles_esmfold 4 \\\n --use_gpu \\\n -profile \n ```\n\n- The rosettafold_all_atom mode can be run using the command below:\n\n ```console\n nextflow run nf-core/proteinfold \\\n --input samplesheet.csv \\\n --outdir \\\n --mode rosettafold_all_atom \\\n --rosettafold_all_atom_db \\\n --use_gpu \\\n -profile \n ```\n\n- The helixfold3 mode can be run using the command below:\n\n ```console\n nextflow run nf-core/proteinfold \\\n --input samplesheet.csv \\\n --outdir \\\n --mode helixfold3 \\\n --helixfold3_db \\\n --use_gpu \\\n -profile \n ```\n\n- The boltz mode can be run using the command below:\n\n ```console\n nextflow run nf-core/proteinfold \\\n --input samplesheet.csv \\\n --outdir \\\n --mode boltz \\\n --boltz_ccd_path \\\n --boltz_model_path \\\n --use_gpu \\\n -profile \n ```\n\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/usage/getting_started/configuration#custom-configuration-files).\n\nFor more details and further functionality, please refer to the [usage documentation](https://nf-co.re/proteinfold/usage) and the [parameter documentation](https://nf-co.re/proteinfold/parameters).\n\n## Pipeline output\n\nTo see the results of an example test run with a full size dataset refer to the [results](https://nf-co.re/proteinfold/results) tab on the nf-core website pipeline page.\nFor more details about the output files and reports, please refer to the\n[output documentation](https://nf-co.re/proteinfold/output).\n\n## Credits\n\nnf-core/proteinfold was originally written by Athanasios Baltzis ([@athbaltzis](https://github.com/athbaltzis)), Jose Espinosa-Carrasco ([@JoseEspinosa](https://github.com/JoseEspinosa)), Luisa Santus ([@luisas](https://github.com/luisas)) and Leila Mansouri ([@l-mansouri](https://github.com/l-mansouri)) from [The Comparative Bioinformatics Group](https://www.crg.eu/en/cedric_notredame) at [The Centre for Genomic Regulation, Spain](https://www.crg.eu/) under the umbrella of the [BovReg project](https://www.bovreg.eu/) and Harshil Patel ([@drpatelh](https://github.com/drpatelh)) from [Seqera Labs, Spain](https://seqera.io/).\n\nMany thanks to others who have helped out and contributed along the way too, including (but not limited to): Norman Goodacre and Waleed Osman from Interline Therapeutics ([@interlinetx](https://github.com/interlinetx)), Martin Steinegger ([@martin-steinegger](https://github.com/martin-steinegger)) and Raoul J.P. Bonnal ([@rjpbonnal](https://github.com/rjpbonnal))\n\nWe would also like to thanks to the AWS Open Data Sponsorship Program for generously providing the resources necessary to host the data utilized in the testing, development, and deployment of nf-core proteinfold.\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\nFor further information or help, don't hesitate to get in touch on the [Slack `#proteinfold` channel](https://nfcore.slack.com/channels/proteinfold) (you can join with [this invite](https://nf-co.re/join/slack)).\n\n## Citations\n\nIf you use nf-core/proteinfold for your analysis, please cite it using the following doi: [10.5281/zenodo.7437038](https://doi.org/10.5281/zenodo.7437038)\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nYou can cite the `nf-core` publication as follows:\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).\n", "hasPart": [ { "@id": "main.nf" @@ -99,7 +99,7 @@ }, "mentions": [ { - "@id": "#97ee32f4-c70e-40dd-972c-ef911da3cede" + "@id": "#3e40ea74-c4ab-45b1-beb5-accf31043a86" } ], "name": "nf-core/proteinfold" @@ -132,7 +132,7 @@ } ], "dateCreated": "", - "dateModified": "2025-06-03T11:01:48Z", + "dateModified": "2025-07-08T11:39:36Z", "dct:conformsTo": "https://bioschemas.org/profiles/ComputationalWorkflow/1.0-RELEASE/", "keywords": [ "nf-core", @@ -148,11 +148,6 @@ "license": [ "MIT" ], - "maintainer": [ - { - "@id": "#drpatelhh@gmail.com" - } - ], "name": [ "nf-core/proteinfold" ], @@ -180,14 +175,14 @@ "url": { "@id": "https://www.nextflow.io/" }, - "version": "!>=24.04.2" + "version": "!>=24.10.5" }, { - "@id": "#97ee32f4-c70e-40dd-972c-ef911da3cede", + "@id": "#3e40ea74-c4ab-45b1-beb5-accf31043a86", "@type": "TestSuite", "instance": [ { - "@id": "#30e6ae55-7030-44bd-845c-db16063cb2c1" + "@id": "#401a0219-0d1e-4d19-a6af-901d59fc4e4c" } ], "mainEntity": { @@ -196,7 +191,7 @@ "name": "Test suite for nf-core/proteinfold" }, { - "@id": "#30e6ae55-7030-44bd-845c-db16063cb2c1", + "@id": "#401a0219-0d1e-4d19-a6af-901d59fc4e4c", "@type": "TestInstance", "name": "GitHub Actions workflow for testing nf-core/proteinfold", "resource": "repos/nf-core/proteinfold/actions/workflows/nf-test.yml", diff --git a/subworkflows/local/aria2_uncompress.nf b/subworkflows/local/aria2_uncompress.nf index 77eb8dea5..51ff9019e 100644 --- a/subworkflows/local/aria2_uncompress.nf +++ b/subworkflows/local/aria2_uncompress.nf @@ -4,6 +4,7 @@ include { UNTAR } from '../../modules/nf-core/untar/main' include { GUNZIP } from '../../modules/nf-core/gunzip/main' include { ARIA2 } from '../../modules/nf-core/aria2/main' +include { UNZIP } from '../../modules/nf-core/unzip/main' include { ZSTD_DECOMPRESS } from '../../modules/local/zstd_decompress/main.nf' workflow ARIA2_UNCOMPRESS { @@ -19,12 +20,25 @@ workflow ARIA2_UNCOMPRESS { ) ch_db = Channel.empty() - if (source_url.toString().endsWith('.tar') || source_url.toString().endsWith('.tar.gz') || source_url.toString().endsWith('.tar.zst')) { + if (source_url.toString().endsWith('.pkl.gz')) { + ch_db = ARIA2.out.downloaded_file.map { it[1] } + } else if (source_url.toString().endsWith('.tar') || source_url.toString().endsWith('.tar.gz') || source_url.toString().endsWith('.tar.zst')) { ch_db = UNTAR (ARIA2.out.downloaded_file).untar.map{ it[1] } } else if (source_url.toString().endsWith('.gz')) { ch_db = GUNZIP (ARIA2.out.downloaded_file).gunzip.map { it[1] } } else if (source_url.toString().endsWith('.zst')) { ch_db = ZSTD_DECOMPRESS (ARIA2.out.downloaded_file).decompressed.map { it[1] } + } else if (source_url.toString().endsWith('.zip')) { + ch_db = UNZIP (ARIA2.out.downloaded_file) + .unzipped_archive + .map { meta, dir -> + def nestedDir = dir.listFiles()[0] + // Find the .pdparams file + def pdparamsFile = nestedDir.listFiles().find { it.getName().endsWith('.pdparams') } + [ pdparamsFile ] + } + } else { + ch_db = ARIA2.out.downloaded_file.map { it[1] } } emit: diff --git a/subworkflows/local/prepare_alphafold2_dbs.nf b/subworkflows/local/prepare_alphafold2_dbs.nf index f28cb1268..cf4ebbbce 100644 --- a/subworkflows/local/prepare_alphafold2_dbs.nf +++ b/subworkflows/local/prepare_alphafold2_dbs.nf @@ -23,7 +23,7 @@ workflow PREPARE_ALPHAFOLD2_DBS { take: alphafold2_db // directory: path to alphafold2 DBs - full_dbs // boolean: Use full databases (otherwise reduced version) + alphafold2_full_dbs // boolean: Use full databases (otherwise reduced version) bfd_path // directory: /path/to/bfd/ small_bfd_path // directory: /path/to/small_bfd/ alphafold2_params_path // directory: /path/to/alphafold2/params/ @@ -55,7 +55,7 @@ workflow PREPARE_ALPHAFOLD2_DBS { if (alphafold2_db) { - if (full_dbs) { + if (alphafold2_full_dbs) { ch_bfd = Channel.value(file(bfd_path)) ch_small_bfd = Channel.value(file("${projectDir}/assets/dummy_db")) } @@ -75,7 +75,7 @@ workflow PREPARE_ALPHAFOLD2_DBS { ch_uniprot = Channel.value(file(uniprot_path)) } else { - if (full_dbs) { + if (alphafold2_full_dbs) { ARIA2_BFD( bfd_link ) diff --git a/subworkflows/local/prepare_boltz_dbs.nf b/subworkflows/local/prepare_boltz_dbs.nf index 83588cb12..e571c8ae4 100644 --- a/subworkflows/local/prepare_boltz_dbs.nf +++ b/subworkflows/local/prepare_boltz_dbs.nf @@ -4,21 +4,35 @@ include { ARIA2 as ARIA2_BOLTZ_CCD - ARIA2 as ARIA2_BOLTZ_MODEL } from '../../modules/nf-core/aria2/main' + ARIA2 as ARIA2_BOLTZ_MODEL + ARIA2 as ARIA2_BOLTZ2_AFF + ARIA2 as ARIA2_BOLTZ2_CONF + ARIA2 as ARIA2_MOLS +} from '../../modules/nf-core/aria2/main' workflow PREPARE_BOLTZ_DBS { take: + boltz_db boltz_ccd boltz_model + boltz2_aff + boltz2_conf + boltz2_mols boltz_ccd_link boltz_model_link + boltz2_aff_link + boltz2_conf_link + boltz2_mols_link main: ch_versions = Channel.empty() - if (boltz_ccd) { - ch_boltz_ccd = Channel.value(file(boltz_ccd)) - ch_boltz_model = Channel.value(file(boltz_model)) + if (boltz_db) { + ch_boltz_ccd = Channel.value(file(boltz_ccd)) + ch_boltz_model = Channel.value(file(boltz_model)) + ch_boltz2_aff = Channel.value(file(boltz2_aff)) + ch_boltz2_conf = Channel.value(file(boltz2_conf)) + ch_boltz2_mols = Channel.value(file(boltz2_mols)) } else { ARIA2_BOLTZ_CCD( [ @@ -37,10 +51,40 @@ workflow PREPARE_BOLTZ_DBS { ) ch_boltz_model = ARIA2_BOLTZ_MODEL.out.downloaded_file.map{ it[1] } ch_versions = ch_versions.mix(ARIA2_BOLTZ_MODEL.out.versions) + + ARIA2_BOLTZ2_AFF( + [ + [:], + boltz2_aff_link + ] + ) + ch_boltz2_aff = ARIA2_BOLTZ2_AFF.out.downloaded_file.map{ it[1] } + ch_versions = ch_versions.mix(ARIA2_BOLTZ2_AFF.out.versions) + + ARIA2_BOLTZ2_CONF( + [ + [:], + boltz2_conf_link + ] + ) + ch_boltz2_conf = ARIA2_BOLTZ2_CONF.out.downloaded_file.map{ it[1] } + ch_versions = ch_versions.mix(ARIA2_BOLTZ2_CONF.out.versions) + + ARIA2_MOLS( + [ + [:], + boltz2_mols_link + ] + ) + ch_boltz2_mols = ARIA2_MOLS.out.downloaded_file.map{ it[1] } + ch_versions = ch_versions.mix(ARIA2_MOLS.out.versions) } emit: boltz_ccd = ch_boltz_ccd boltz_model = ch_boltz_model + boltz2_aff = ch_boltz2_aff + boltz2_conf = ch_boltz2_conf + boltz2_mols = ch_boltz2_mols versions = ch_versions } diff --git a/subworkflows/local/prepare_colabfold_dbs.nf b/subworkflows/local/prepare_colabfold_dbs.nf index 8d6ecf1d8..aafb1b989 100644 --- a/subworkflows/local/prepare_colabfold_dbs.nf +++ b/subworkflows/local/prepare_colabfold_dbs.nf @@ -14,14 +14,14 @@ workflow PREPARE_COLABFOLD_DBS { take: colabfold_db // directory: path/to/colabfold/DBs and params - colabfold_server // string: Specifies the server to use for colabfold + use_msa_server // bool: Specifies whether to use web msa server colabfold_alphafold2_params_path // directory: /path/to/colabfold/alphafold2/params/ - colabfold_db_path // directory: /path/to/colabfold/db/ + colabfold_envdb_path // directory: /path/to/colabfold/db/ colabfold_uniref30_path // directory: /path/to/uniref30/colabfold/ colabfold_alphafold2_params_link // string: Specifies the link to download colabfold alphafold2 params colabfold_db_link // string: Specifies the link to download colabfold db colabfold_uniref30_link // string: Specifies the link to download uniref30 - create_colabfold_index // boolean: Create index for colabfold db + colabfold_create_index // boolean: Create index for colabfold db main: ch_params = Channel.empty() @@ -31,8 +31,8 @@ workflow PREPARE_COLABFOLD_DBS { if (colabfold_db) { ch_params = Channel.value(file(colabfold_alphafold2_params_path, type: 'any')) - if (colabfold_server == 'local') { - ch_colabfold_db = Channel.value(file(colabfold_db_path, type: 'any')) + if (!use_msa_server) { + ch_colabfold_db = Channel.value(file(colabfold_envdb_path, type: 'any')) ch_uniref30 = Channel.value(file(colabfold_uniref30_path, type: 'any')) } } @@ -43,7 +43,7 @@ workflow PREPARE_COLABFOLD_DBS { ch_params = ARIA2_COLABFOLD_PARAMS.out.db ch_versions = ch_versions.mix(ARIA2_COLABFOLD_PARAMS.out.versions) - if (params.colabfold_server == 'local') { + if (!use_msa_server) { ARIA2_COLABFOLD_DB ( colabfold_db_link ) @@ -55,7 +55,7 @@ workflow PREPARE_COLABFOLD_DBS { ch_colabfold_db = MMSEQS_TSV2EXPROFILEDB_COLABFOLDDB.out.db_exprofile ch_versions = ch_versions.mix(MMSEQS_TSV2EXPROFILEDB_COLABFOLDDB.out.versions) - if (params.create_colabfold_index) { + if (params.colabfold_create_index) { MMSEQS_CREATEINDEX_COLABFOLDDB ( MMSEQS_TSV2EXPROFILEDB_COLABFOLDDB.out.db_exprofile ) @@ -74,7 +74,7 @@ workflow PREPARE_COLABFOLD_DBS { ch_uniref30 = MMSEQS_TSV2EXPROFILEDB_UNIPROT30.out.db_exprofile ch_versions = ch_versions.mix(MMSEQS_TSV2EXPROFILEDB_UNIPROT30.out.versions) - if (create_colabfold_index) { + if (colabfold_create_index) { MMSEQS_CREATEINDEX_UNIPROT30 ( MMSEQS_TSV2EXPROFILEDB_UNIPROT30.out.db_exprofile ) diff --git a/subworkflows/local/prepare_helixfold3_dbs.nf b/subworkflows/local/prepare_helixfold3_dbs.nf index b61fbb365..156b2da1f 100644 --- a/subworkflows/local/prepare_helixfold3_dbs.nf +++ b/subworkflows/local/prepare_helixfold3_dbs.nf @@ -14,11 +14,12 @@ include { ARIA2_UNCOMPRESS as ARIA2_UNIREF90 ARIA2_UNCOMPRESS as ARIA2_MGNIFY ARIA2_UNCOMPRESS as ARIA2_INIT_MODELS + ARIA2_UNCOMPRESS as ARIA2_MAXIT } from './aria2_uncompress' include { ARIA2 as ARIA2_PDB_SEQRES } from '../../modules/nf-core/aria2/main' -include { COMBINE_UNIPROT } from '../../modules/local/combine_uniprot' -include { DOWNLOAD_PDBMMCIF } from '../../modules/local/download_pdbmmcif' +include { COMBINE_UNIPROT } from '../../modules/local/combine_uniprot' +include { DOWNLOAD_PDBMMCIF } from '../../modules/local/download_pdbmmcif' workflow PREPARE_HELIXFOLD3_DBS { @@ -37,6 +38,7 @@ workflow PREPARE_HELIXFOLD3_DBS { helixfold3_mgnify_link helixfold3_pdb_mmcif_link helixfold3_obsolete_link + helixfold3_maxit_src_link helixfold3_uniclust30_path helixfold3_ccd_preprocessed_path helixfold3_rfam_path @@ -100,7 +102,7 @@ workflow PREPARE_HELIXFOLD3_DBS { DOWNLOAD_PDBMMCIF( helixfold3_pdb_mmcif_link - ) + ) ch_helixfold3_mmcif_files = DOWNLOAD_PDBMMCIF.out.ch_db ch_versions = ch_versions.mix(DOWNLOAD_PDBMMCIF.out.versions) @@ -123,7 +125,6 @@ workflow PREPARE_HELIXFOLD3_DBS { ch_helixfold3_pdb_seqres = ARIA2_PDB_SEQRES.out.downloaded_file.map{ it[1] } ch_versions = ch_versions.mix(ARIA2_PDB_SEQRES.out.versions) - ARIA2_UNIPROT_SPROT( helixfold3_uniprot_sprot_link ) @@ -138,6 +139,10 @@ workflow PREPARE_HELIXFOLD3_DBS { ) ch_helixfold3_uniprot = COMBINE_UNIPROT.out.ch_db ch_versions = ch_versions.mix(COMBINE_UNIPROT.out.versions) + + ARIA2_MAXIT(helixfold3_maxit_src_link) + ch_helixfold3_maxit_src = ARIA2_MAXIT.out.db + ch_versions = ch_versions.mix(ARIA2_MAXIT.out.versions) } emit: diff --git a/subworkflows/local/prepare_rosettafold_all_atom_dbs.nf b/subworkflows/local/prepare_rosettafold_all_atom_dbs.nf index 341204ea2..77bfd11ec 100644 --- a/subworkflows/local/prepare_rosettafold_all_atom_dbs.nf +++ b/subworkflows/local/prepare_rosettafold_all_atom_dbs.nf @@ -16,38 +16,38 @@ workflow PREPARE_ROSETTAFOLD_ALL_ATOM_DBS { take: rosettafold_all_atom_db - bfd_rosettafold_all_atom_path // directory: /path/to/bfd/ - uniref30_rosettafold_all_atom_path // directory: /path/to/uniref30/rosettafold_all_atom/ - pdb100_rosettafold_all_atom_path - rfaa_paper_weights_path - bfd_rosettafold_all_atom_link - uniref30_rosettafold_all_atom_link - pdb100_rosettafold_all_atom_link - rfaa_paper_weights_link + rosettafold_all_atom_bfd_path // directory: /path/to/bfd/ + rosettafold_all_atom_uniref30_path // directory: /path/to/uniref30/rosettafold_all_atom/ + rosettafold_all_atom_pdb100_path + rosettafold_all_atom_paper_weights_path + rosettafold_all_atom_bfd_link + rosettafold_all_atom_uniref30_link + rosettafold_all_atom_pdb100_link + rosettafold_all_atom_paper_weights_link main: ch_versions = Channel.empty() if (rosettafold_all_atom_db) { - ch_bfd = Channel.value(file(bfd_rosettafold_all_atom_path)) - ch_uniref30 = Channel.value(file(uniref30_rosettafold_all_atom_path)) - ch_pdb100 = Channel.value(file(pdb100_rosettafold_all_atom_path)) - ch_rfaa_paper_weights = Channel.value(file(rfaa_paper_weights_path)) + ch_bfd = Channel.value(file(rosettafold_all_atom_bfd_path)) + ch_uniref30 = Channel.value(file(rosettafold_all_atom_uniref30_path)) + ch_pdb100 = Channel.value(file(rosettafold_all_atom_pdb100_path)) + ch_rfaa_paper_weights = Channel.value(file(rosettafold_all_atom_paper_weights_path)) } else { - ARIA2_BFD(bfd_rosettafold_all_atom_link) + ARIA2_BFD(rosettafold_all_atom_bfd_link) ch_bfd = ARIA2_BFD.out.db ch_versions = ch_versions.mix(ARIA2_BFD.out.versions) - ARIA2_UNIREF30(uniref30_rosettafold_all_atom_link) + ARIA2_UNIREF30(rosettafold_all_atom_uniref30_link) ch_uniref30 = ARIA2_UNIREF30.out.db ch_versions = ch_versions.mix(ARIA2_UNIREF30.out.versions) - ARIA2_PDB100(pdb100_rosettafold_all_atom_link) + ARIA2_PDB100(rosettafold_all_atom_pdb100_link) ch_pdb100 = ARIA2_PDB100.out.db ch_versions = ch_versions.mix(ARIA2_PDB100.out.versions) - ARIA2_WEIGHTS(rfaa_paper_weights_link) + ARIA2_WEIGHTS(rosettafold_all_atom_paper_weights_link) ch_rfaa_paper_weights = ARIA2_WEIGHTS.out.db ch_versions = ch_versions.mix(ARIA2_WEIGHTS.out.versions) } diff --git a/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config b/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config index 478fb8a05..443e828cf 100644 --- a/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config +++ b/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config @@ -1,5 +1,5 @@ plugins { - id "nf-schema@2.1.0" + id "nf-schema@2.4.2" } validation { diff --git a/tests/.nftignore b/tests/.nftignore index dcdf312a7..16409f40c 100644 --- a/tests/.nftignore +++ b/tests/.nftignore @@ -1,4 +1,5 @@ .DS_Store +multiqc/multiqc_data/BETA-multiqc.parquet multiqc/multiqc_data/multiqc.log multiqc/multiqc_data/multiqc_data.json multiqc/multiqc_data/multiqc_sources.txt diff --git a/tests/alphafold2_download.nf.test.snap b/tests/alphafold2_download.nf.test.snap index b15bc48e5..e4afb1871 100644 --- a/tests/alphafold2_download.nf.test.snap +++ b/tests/alphafold2_download.nf.test.snap @@ -1,7 +1,7 @@ { "-profile test_alphafold2_download": { "content": [ - 21, + 23, { "ARIA2": { "aria2": null @@ -15,6 +15,13 @@ "DOWNLOAD_PDBMMCIF": { "awk": null }, + "GENERATE_REPORT": { + "python": "3.12.7", + "generate_report.py": "Python 3.12.7" + }, + "RUN_ALPHAFOLD2": { + "python": null + }, "Workflow": { "nf-core/proteinfold": "v1.2.0dev" } @@ -22,19 +29,40 @@ [ "DBs", "DBs/alphafold2", - "DBs/alphafold2/standard", - "DBs/alphafold2/standard/UniRef30_2021_03", - "DBs/alphafold2/standard/alphafold_params_2022-12-06", - "DBs/alphafold2/standard/bfd-first_non_consensus_sequences.fasta", - "DBs/alphafold2/standard/mgy_clusters_2022_05.fa", - "DBs/alphafold2/standard/mmcif_files", - "DBs/alphafold2/standard/obsolete.dat", - "DBs/alphafold2/standard/pdb70_from_mmcif_200916", - "DBs/alphafold2/standard/pdb_seqres.txt", - "DBs/alphafold2/standard/uniprot.fasta", - "DBs/alphafold2/standard/uniprot_sprot.fasta", - "DBs/alphafold2/standard/uniprot_trembl.fasta", - "DBs/alphafold2/standard/uniref90.fasta", + "DBs/alphafold2/UniRef30_2023_02_hhsuite", + "DBs/alphafold2/alphafold_params_2022-12-06", + "DBs/alphafold2/bfd-first_non_consensus_sequences.fasta", + "DBs/alphafold2/mgy_clusters.fa", + "DBs/alphafold2/mmcif_files", + "DBs/alphafold2/obsolete.dat", + "DBs/alphafold2/pdb70_from_mmcif_220313", + "DBs/alphafold2/pdb_seqres.txt", + "DBs/alphafold2/uniprot.fasta", + "DBs/alphafold2/uniprot_sprot.fasta", + "DBs/alphafold2/uniprot_trembl.fasta", + "DBs/alphafold2/uniref90.fasta", + "alphafold2", + "alphafold2/standard", + "alphafold2/standard/T1024", + "alphafold2/standard/T1024/T1024.1", + "alphafold2/standard/T1024/T1024.1/ranked_0.pdb", + "alphafold2/standard/T1024/T1024.1/ranked_1.pdb", + "alphafold2/standard/T1024/T1024.1/ranked_2.pdb", + "alphafold2/standard/T1024/T1024.1/ranked_3.pdb", + "alphafold2/standard/T1024/T1024.1/ranked_4.pdb", + "alphafold2/standard/T1024/T1024_alphafold2.pdb", + "alphafold2/standard/T1024/T1024_iptm.tsv", + "alphafold2/standard/T1024/T1024_msa.tsv", + "alphafold2/standard/T1024/T1024_plddt.tsv", + "alphafold2/standard/T1024/T1024_ptm.tsv", + "alphafold2/standard/T1024/paes", + "alphafold2/standard/T1024/paes/T1024_0_pae.tsv", + "alphafold2/standard/top_ranked_structures", + "alphafold2/standard/top_ranked_structures/T1024.pdb", + "generate", + "generate/test_LDDT.html", + "generate/test_alphafold2_report.html", + "generate/test_seq_coverage.png", "multiqc", "multiqc/alphafold2_multiqc_data", "multiqc/alphafold2_multiqc_plots", @@ -50,7 +78,7 @@ "file.txt:md5,d41d8cd98f00b204e9800998ecf8427e" ], "bfd-first_non_consensus_sequences.fasta:md5,d41d8cd98f00b204e9800998ecf8427e", - "mgy_clusters_2022_05.fa:md5,d41d8cd98f00b204e9800998ecf8427e", + "mgy_clusters.fa:md5,d41d8cd98f00b204e9800998ecf8427e", [ ], @@ -63,6 +91,21 @@ "uniprot_sprot.fasta:md5,d41d8cd98f00b204e9800998ecf8427e", "uniprot_trembl.fasta:md5,d41d8cd98f00b204e9800998ecf8427e", "uniref90.fasta:md5,d41d8cd98f00b204e9800998ecf8427e", + "ranked_0.pdb:md5,d41d8cd98f00b204e9800998ecf8427e", + "ranked_1.pdb:md5,d41d8cd98f00b204e9800998ecf8427e", + "ranked_2.pdb:md5,d41d8cd98f00b204e9800998ecf8427e", + "ranked_3.pdb:md5,d41d8cd98f00b204e9800998ecf8427e", + "ranked_4.pdb:md5,d41d8cd98f00b204e9800998ecf8427e", + "T1024_alphafold2.pdb:md5,d41d8cd98f00b204e9800998ecf8427e", + "T1024_iptm.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", + "T1024_msa.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", + "T1024_plddt.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", + "T1024_ptm.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", + "T1024_0_pae.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", + "T1024.pdb:md5,d41d8cd98f00b204e9800998ecf8427e", + "test_LDDT.html:md5,d41d8cd98f00b204e9800998ecf8427e", + "test_alphafold2_report.html:md5,d41d8cd98f00b204e9800998ecf8427e", + "test_seq_coverage.png:md5,d41d8cd98f00b204e9800998ecf8427e", "alphafold2_multiqc_report.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], @@ -70,6 +113,6 @@ "nf-test": "0.9.2", "nextflow": "24.10.5" }, - "timestamp": "2025-07-01T22:40:17.147742" + "timestamp": "2025-08-06T17:23:19.626138" } } \ No newline at end of file diff --git a/tests/alphafold2_split.nf.test.snap b/tests/alphafold2_split.nf.test.snap index abf117fa9..dee05380e 100644 --- a/tests/alphafold2_split.nf.test.snap +++ b/tests/alphafold2_split.nf.test.snap @@ -20,34 +20,37 @@ [ "alphafold2", "alphafold2/split_msa_prediction", + "alphafold2/split_msa_prediction/T1024", "alphafold2/split_msa_prediction/T1024.1", - "alphafold2/split_msa_prediction/T1024.1/ranked_0.pdb", - "alphafold2/split_msa_prediction/T1024.1/ranked_1.pdb", - "alphafold2/split_msa_prediction/T1024.1/ranked_2.pdb", - "alphafold2/split_msa_prediction/T1024.1/ranked_3.pdb", - "alphafold2/split_msa_prediction/T1024.1/ranked_4.pdb", - "alphafold2/split_msa_prediction/T1024_0_pae.tsv", - "alphafold2/split_msa_prediction/T1024_alphafold2.pdb", - "alphafold2/split_msa_prediction/T1024_msa.tsv", - "alphafold2/split_msa_prediction/T1024_plddt.tsv", + "alphafold2/split_msa_prediction/T1024.1/features.pkl", + "alphafold2/split_msa_prediction/T1024/T1024.1", + "alphafold2/split_msa_prediction/T1024/T1024.1/ranked_0.pdb", + "alphafold2/split_msa_prediction/T1024/T1024.1/ranked_1.pdb", + "alphafold2/split_msa_prediction/T1024/T1024.1/ranked_2.pdb", + "alphafold2/split_msa_prediction/T1024/T1024.1/ranked_3.pdb", + "alphafold2/split_msa_prediction/T1024/T1024.1/ranked_4.pdb", + "alphafold2/split_msa_prediction/T1024/T1024_alphafold2.pdb", + "alphafold2/split_msa_prediction/T1024/T1024_msa.tsv", + "alphafold2/split_msa_prediction/T1024/T1024_plddt.tsv", + "alphafold2/split_msa_prediction/T1024/paes", + "alphafold2/split_msa_prediction/T1024/paes/T1024_0_pae.tsv", + "alphafold2/split_msa_prediction/T1026", "alphafold2/split_msa_prediction/T1026.1", - "alphafold2/split_msa_prediction/T1026.1/ranked_0.pdb", - "alphafold2/split_msa_prediction/T1026.1/ranked_1.pdb", - "alphafold2/split_msa_prediction/T1026.1/ranked_2.pdb", - "alphafold2/split_msa_prediction/T1026.1/ranked_3.pdb", - "alphafold2/split_msa_prediction/T1026.1/ranked_4.pdb", - "alphafold2/split_msa_prediction/T1026_0_pae.tsv", - "alphafold2/split_msa_prediction/T1026_alphafold2.pdb", - "alphafold2/split_msa_prediction/T1026_msa.tsv", - "alphafold2/split_msa_prediction/T1026_plddt.tsv", + "alphafold2/split_msa_prediction/T1026.1/features.pkl", + "alphafold2/split_msa_prediction/T1026/T1026.1", + "alphafold2/split_msa_prediction/T1026/T1026.1/ranked_0.pdb", + "alphafold2/split_msa_prediction/T1026/T1026.1/ranked_1.pdb", + "alphafold2/split_msa_prediction/T1026/T1026.1/ranked_2.pdb", + "alphafold2/split_msa_prediction/T1026/T1026.1/ranked_3.pdb", + "alphafold2/split_msa_prediction/T1026/T1026.1/ranked_4.pdb", + "alphafold2/split_msa_prediction/T1026/T1026_alphafold2.pdb", + "alphafold2/split_msa_prediction/T1026/T1026_msa.tsv", + "alphafold2/split_msa_prediction/T1026/T1026_plddt.tsv", + "alphafold2/split_msa_prediction/T1026/paes", + "alphafold2/split_msa_prediction/T1026/paes/T1026_0_pae.tsv", "alphafold2/split_msa_prediction/top_ranked_structures", "alphafold2/split_msa_prediction/top_ranked_structures/T1024.pdb", "alphafold2/split_msa_prediction/top_ranked_structures/T1026.pdb", - "alphafold2_split_msa_prediction", - "alphafold2_split_msa_prediction/T1024.1", - "alphafold2_split_msa_prediction/T1024.1/features.pkl", - "alphafold2_split_msa_prediction/T1026.1", - "alphafold2_split_msa_prediction/T1026.1/features.pkl", "generate", "generate/test_LDDT.html", "generate/test_alphafold2_report.html", @@ -60,28 +63,28 @@ "pipeline_info/nf_core_proteinfold_software_mqc_versions.yml" ], [ + "features.pkl:md5,d41d8cd98f00b204e9800998ecf8427e", "ranked_0.pdb:md5,d41d8cd98f00b204e9800998ecf8427e", "ranked_1.pdb:md5,d41d8cd98f00b204e9800998ecf8427e", "ranked_2.pdb:md5,d41d8cd98f00b204e9800998ecf8427e", "ranked_3.pdb:md5,d41d8cd98f00b204e9800998ecf8427e", "ranked_4.pdb:md5,d41d8cd98f00b204e9800998ecf8427e", - "T1024_0_pae.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", "T1024_alphafold2.pdb:md5,d41d8cd98f00b204e9800998ecf8427e", "T1024_msa.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", "T1024_plddt.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", + "T1024_0_pae.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", + "features.pkl:md5,d41d8cd98f00b204e9800998ecf8427e", "ranked_0.pdb:md5,d41d8cd98f00b204e9800998ecf8427e", "ranked_1.pdb:md5,d41d8cd98f00b204e9800998ecf8427e", "ranked_2.pdb:md5,d41d8cd98f00b204e9800998ecf8427e", "ranked_3.pdb:md5,d41d8cd98f00b204e9800998ecf8427e", "ranked_4.pdb:md5,d41d8cd98f00b204e9800998ecf8427e", - "T1026_0_pae.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", "T1026_alphafold2.pdb:md5,d41d8cd98f00b204e9800998ecf8427e", "T1026_msa.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", "T1026_plddt.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", + "T1026_0_pae.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", "T1024.pdb:md5,d41d8cd98f00b204e9800998ecf8427e", "T1026.pdb:md5,d41d8cd98f00b204e9800998ecf8427e", - "features.pkl:md5,d41d8cd98f00b204e9800998ecf8427e", - "features.pkl:md5,d41d8cd98f00b204e9800998ecf8427e", "test_LDDT.html:md5,d41d8cd98f00b204e9800998ecf8427e", "test_alphafold2_report.html:md5,d41d8cd98f00b204e9800998ecf8427e", "test_seq_coverage.png:md5,d41d8cd98f00b204e9800998ecf8427e", @@ -92,6 +95,6 @@ "nf-test": "0.9.2", "nextflow": "24.10.5" }, - "timestamp": "2025-07-01T22:36:22.635126" + "timestamp": "2025-07-24T16:54:30.453984448" } } \ No newline at end of file diff --git a/tests/alphafold3.nf.test.snap b/tests/alphafold3.nf.test.snap index acbd1db24..7a6fcc263 100644 --- a/tests/alphafold3.nf.test.snap +++ b/tests/alphafold3.nf.test.snap @@ -109,6 +109,6 @@ "nf-test": "0.9.2", "nextflow": "24.10.5" }, - "timestamp": "2025-07-01T23:02:05.225476" + "timestamp": "2025-07-24T16:54:38.626994903" } } \ No newline at end of file diff --git a/tests/colabfold_download.nf.test.snap b/tests/colabfold_download.nf.test.snap index 14bfe7a8e..72885e708 100644 --- a/tests/colabfold_download.nf.test.snap +++ b/tests/colabfold_download.nf.test.snap @@ -7,7 +7,7 @@ "aria2": null }, "COLABFOLD_BATCH": { - "colabfold_batch": "1.5.2" + "colabfold_batch": null }, "GENERATE_REPORT": { "python": "3.12.7", @@ -20,23 +20,21 @@ [ "DBs", "DBs/colabfold", - "DBs/colabfold/standard", - "DBs/colabfold/standard/alphafold_params_2021-07-14", + "DBs/colabfold/alphafold_params_2021-07-14", "colabfold", - "colabfold/webserver", - "colabfold/webserver/T1024_colabfold.pdb", - "colabfold/webserver/T1024_coverage.png", - "colabfold/webserver/T1024_mqc.png", - "colabfold/webserver/T1024_relaxed_rank_01.pdb", - "colabfold/webserver/T1024_relaxed_rank_02.pdb", - "colabfold/webserver/T1024_relaxed_rank_03.pdb", - "colabfold/webserver/T1026_colabfold.pdb", - "colabfold/webserver/T1026_coverage.png", - "colabfold/webserver/T1026_mqc.png", - "colabfold/webserver/T1026_relaxed_rank_01.pdb", - "colabfold/webserver/T1026_relaxed_rank_02.pdb", - "colabfold/webserver/T1026_relaxed_rank_03.pdb", - "colabfold/webserver/top_ranked_structures", + "colabfold/T1024_colabfold.pdb", + "colabfold/T1024_coverage.png", + "colabfold/T1024_mqc.png", + "colabfold/T1024_relaxed_rank_01.pdb", + "colabfold/T1024_relaxed_rank_02.pdb", + "colabfold/T1024_relaxed_rank_03.pdb", + "colabfold/T1026_colabfold.pdb", + "colabfold/T1026_coverage.png", + "colabfold/T1026_mqc.png", + "colabfold/T1026_relaxed_rank_01.pdb", + "colabfold/T1026_relaxed_rank_02.pdb", + "colabfold/T1026_relaxed_rank_03.pdb", + "colabfold/top_ranked_structures", "generate", "generate/test_LDDT.html", "generate/test_alphafold2_report.html", @@ -71,8 +69,8 @@ ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.5" + "nextflow": "25.04.6" }, - "timestamp": "2025-07-01T23:16:36.210501" + "timestamp": "2025-08-07T11:02:16.287892882" } } \ No newline at end of file diff --git a/tests/colabfold_local.nf.test.snap b/tests/colabfold_local.nf.test.snap index 93e1052b4..df7853ebb 100644 --- a/tests/colabfold_local.nf.test.snap +++ b/tests/colabfold_local.nf.test.snap @@ -4,14 +4,16 @@ 7, { "COLABFOLD_BATCH": { - "colabfold_batch": "1.5.2" + "colabfold_batch": null }, "GENERATE_REPORT": { "python": "3.12.7", "generate_report.py": "Python 3.12.7" }, "MMSEQS_COLABFOLDSEARCH": { - "colabfold_search": "1.5.2" + "colabfold_search": null, + "alphafold_colabfold": null, + "mmseqs": null }, "Workflow": { "nf-core/proteinfold": "v1.2.0dev" @@ -19,20 +21,19 @@ }, [ "colabfold", - "colabfold/local", - "colabfold/local/T1024_colabfold.pdb", - "colabfold/local/T1024_coverage.png", - "colabfold/local/T1024_mqc.png", - "colabfold/local/T1024_relaxed_rank_01.pdb", - "colabfold/local/T1024_relaxed_rank_02.pdb", - "colabfold/local/T1024_relaxed_rank_03.pdb", - "colabfold/local/T1026_colabfold.pdb", - "colabfold/local/T1026_coverage.png", - "colabfold/local/T1026_mqc.png", - "colabfold/local/T1026_relaxed_rank_01.pdb", - "colabfold/local/T1026_relaxed_rank_02.pdb", - "colabfold/local/T1026_relaxed_rank_03.pdb", - "colabfold/local/top_ranked_structures", + "colabfold/T1024_colabfold.pdb", + "colabfold/T1024_coverage.png", + "colabfold/T1024_mqc.png", + "colabfold/T1024_relaxed_rank_01.pdb", + "colabfold/T1024_relaxed_rank_02.pdb", + "colabfold/T1024_relaxed_rank_03.pdb", + "colabfold/T1026_colabfold.pdb", + "colabfold/T1026_coverage.png", + "colabfold/T1026_mqc.png", + "colabfold/T1026_relaxed_rank_01.pdb", + "colabfold/T1026_relaxed_rank_02.pdb", + "colabfold/T1026_relaxed_rank_03.pdb", + "colabfold/top_ranked_structures", "generate", "generate/test_LDDT.html", "generate/test_alphafold2_report.html", @@ -64,8 +65,8 @@ ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.5" + "nextflow": "25.04.6" }, - "timestamp": "2025-07-01T23:12:47.221555" + "timestamp": "2025-08-07T11:02:26.46180193" } } \ No newline at end of file diff --git a/tests/colabfold_webserver.nf.test.snap b/tests/colabfold_webserver.nf.test.snap index 4a5e2548f..a0d492f9c 100644 --- a/tests/colabfold_webserver.nf.test.snap +++ b/tests/colabfold_webserver.nf.test.snap @@ -4,7 +4,7 @@ 5, { "COLABFOLD_BATCH": { - "colabfold_batch": "1.5.2" + "colabfold_batch": null }, "GENERATE_REPORT": { "python": "3.12.7", @@ -16,20 +16,19 @@ }, [ "colabfold", - "colabfold/webserver", - "colabfold/webserver/T1024_colabfold.pdb", - "colabfold/webserver/T1024_coverage.png", - "colabfold/webserver/T1024_mqc.png", - "colabfold/webserver/T1024_relaxed_rank_01.pdb", - "colabfold/webserver/T1024_relaxed_rank_02.pdb", - "colabfold/webserver/T1024_relaxed_rank_03.pdb", - "colabfold/webserver/T1026_colabfold.pdb", - "colabfold/webserver/T1026_coverage.png", - "colabfold/webserver/T1026_mqc.png", - "colabfold/webserver/T1026_relaxed_rank_01.pdb", - "colabfold/webserver/T1026_relaxed_rank_02.pdb", - "colabfold/webserver/T1026_relaxed_rank_03.pdb", - "colabfold/webserver/top_ranked_structures", + "colabfold/T1024_colabfold.pdb", + "colabfold/T1024_coverage.png", + "colabfold/T1024_mqc.png", + "colabfold/T1024_relaxed_rank_01.pdb", + "colabfold/T1024_relaxed_rank_02.pdb", + "colabfold/T1024_relaxed_rank_03.pdb", + "colabfold/T1026_colabfold.pdb", + "colabfold/T1026_coverage.png", + "colabfold/T1026_mqc.png", + "colabfold/T1026_relaxed_rank_01.pdb", + "colabfold/T1026_relaxed_rank_02.pdb", + "colabfold/T1026_relaxed_rank_03.pdb", + "colabfold/top_ranked_structures", "generate", "generate/test_LDDT.html", "generate/test_alphafold2_report.html", @@ -61,8 +60,8 @@ ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.5" + "nextflow": "25.04.6" }, - "timestamp": "2025-07-01T23:18:10.011715" + "timestamp": "2025-08-07T11:02:35.349046908" } } \ No newline at end of file diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index 4808716a6..315be886e 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -17,26 +17,34 @@ [ "alphafold2", "alphafold2/standard", - "alphafold2/standard/T1024.1", - "alphafold2/standard/T1024.1/ranked_0.pdb", - "alphafold2/standard/T1024.1/ranked_1.pdb", - "alphafold2/standard/T1024.1/ranked_2.pdb", - "alphafold2/standard/T1024.1/ranked_3.pdb", - "alphafold2/standard/T1024.1/ranked_4.pdb", - "alphafold2/standard/T1024_0_pae.tsv", - "alphafold2/standard/T1024_alphafold2.pdb", - "alphafold2/standard/T1024_msa.tsv", - "alphafold2/standard/T1024_plddt.tsv", - "alphafold2/standard/T1026.1", - "alphafold2/standard/T1026.1/ranked_0.pdb", - "alphafold2/standard/T1026.1/ranked_1.pdb", - "alphafold2/standard/T1026.1/ranked_2.pdb", - "alphafold2/standard/T1026.1/ranked_3.pdb", - "alphafold2/standard/T1026.1/ranked_4.pdb", - "alphafold2/standard/T1026_0_pae.tsv", - "alphafold2/standard/T1026_alphafold2.pdb", - "alphafold2/standard/T1026_msa.tsv", - "alphafold2/standard/T1026_plddt.tsv", + "alphafold2/standard/T1024", + "alphafold2/standard/T1024/T1024.1", + "alphafold2/standard/T1024/T1024.1/ranked_0.pdb", + "alphafold2/standard/T1024/T1024.1/ranked_1.pdb", + "alphafold2/standard/T1024/T1024.1/ranked_2.pdb", + "alphafold2/standard/T1024/T1024.1/ranked_3.pdb", + "alphafold2/standard/T1024/T1024.1/ranked_4.pdb", + "alphafold2/standard/T1024/T1024_alphafold2.pdb", + "alphafold2/standard/T1024/T1024_iptm.tsv", + "alphafold2/standard/T1024/T1024_msa.tsv", + "alphafold2/standard/T1024/T1024_plddt.tsv", + "alphafold2/standard/T1024/T1024_ptm.tsv", + "alphafold2/standard/T1024/paes", + "alphafold2/standard/T1024/paes/T1024_0_pae.tsv", + "alphafold2/standard/T1026", + "alphafold2/standard/T1026/T1026.1", + "alphafold2/standard/T1026/T1026.1/ranked_0.pdb", + "alphafold2/standard/T1026/T1026.1/ranked_1.pdb", + "alphafold2/standard/T1026/T1026.1/ranked_2.pdb", + "alphafold2/standard/T1026/T1026.1/ranked_3.pdb", + "alphafold2/standard/T1026/T1026.1/ranked_4.pdb", + "alphafold2/standard/T1026/T1026_alphafold2.pdb", + "alphafold2/standard/T1026/T1026_iptm.tsv", + "alphafold2/standard/T1026/T1026_msa.tsv", + "alphafold2/standard/T1026/T1026_plddt.tsv", + "alphafold2/standard/T1026/T1026_ptm.tsv", + "alphafold2/standard/T1026/paes", + "alphafold2/standard/T1026/paes/T1026_0_pae.tsv", "alphafold2/standard/top_ranked_structures", "alphafold2/standard/top_ranked_structures/T1024.pdb", "alphafold2/standard/top_ranked_structures/T1026.pdb", @@ -57,19 +65,23 @@ "ranked_2.pdb:md5,d41d8cd98f00b204e9800998ecf8427e", "ranked_3.pdb:md5,d41d8cd98f00b204e9800998ecf8427e", "ranked_4.pdb:md5,d41d8cd98f00b204e9800998ecf8427e", - "T1024_0_pae.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", "T1024_alphafold2.pdb:md5,d41d8cd98f00b204e9800998ecf8427e", + "T1024_iptm.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", "T1024_msa.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", "T1024_plddt.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", + "T1024_ptm.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", + "T1024_0_pae.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", "ranked_0.pdb:md5,d41d8cd98f00b204e9800998ecf8427e", "ranked_1.pdb:md5,d41d8cd98f00b204e9800998ecf8427e", "ranked_2.pdb:md5,d41d8cd98f00b204e9800998ecf8427e", "ranked_3.pdb:md5,d41d8cd98f00b204e9800998ecf8427e", "ranked_4.pdb:md5,d41d8cd98f00b204e9800998ecf8427e", - "T1026_0_pae.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", "T1026_alphafold2.pdb:md5,d41d8cd98f00b204e9800998ecf8427e", + "T1026_iptm.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", "T1026_msa.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", "T1026_plddt.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", + "T1026_ptm.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", + "T1026_0_pae.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", "T1024.pdb:md5,d41d8cd98f00b204e9800998ecf8427e", "T1026.pdb:md5,d41d8cd98f00b204e9800998ecf8427e", "test_LDDT.html:md5,d41d8cd98f00b204e9800998ecf8427e", @@ -80,8 +92,8 @@ ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.5" + "nextflow": "25.04.6" }, - "timestamp": "2025-07-01T21:48:12.396129" + "timestamp": "2025-08-04T15:08:38.134028321" } } \ No newline at end of file diff --git a/tests/esmfold.nf.test.snap b/tests/esmfold.nf.test.snap index 8e36e840a..8a17769bd 100644 --- a/tests/esmfold.nf.test.snap +++ b/tests/esmfold.nf.test.snap @@ -51,6 +51,6 @@ "nf-test": "0.9.2", "nextflow": "24.10.5" }, - "timestamp": "2025-07-01T23:19:34.656166" + "timestamp": "2025-07-24T16:55:17.861762289" } } \ No newline at end of file diff --git a/tests/nextflow.config b/tests/nextflow.config index 84568cfca..9b4ef8173 100644 --- a/tests/nextflow.config +++ b/tests/nextflow.config @@ -6,7 +6,9 @@ // 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/' -params.pipelines_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/refs/heads/proteinfold' +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/proteinfold' +} aws.client.anonymous = true // fixes S3 access issues on self-hosted runners diff --git a/tests/split_fasta.nf.test.snap b/tests/split_fasta.nf.test.snap index bd71c415f..72efbb9d3 100644 --- a/tests/split_fasta.nf.test.snap +++ b/tests/split_fasta.nf.test.snap @@ -4,14 +4,16 @@ 7, { "COLABFOLD_BATCH": { - "colabfold_batch": "1.5.2" + "colabfold_batch": null }, "GENERATE_REPORT": { "python": "3.12.7", "generate_report.py": "Python 3.12.7" }, "MMSEQS_COLABFOLDSEARCH": { - "colabfold_search": "1.5.2" + "colabfold_search": null, + "alphafold_colabfold": null, + "mmseqs": null }, "Workflow": { "nf-core/proteinfold": "v1.2.0dev" @@ -19,20 +21,19 @@ }, [ "colabfold", - "colabfold/local", - "colabfold/local/H1065_N4-Cytosine_Methyltransferase_Serratia_marcescens_subunit_1_127_residues_colabfold.pdb", - "colabfold/local/H1065_N4-Cytosine_Methyltransferase_Serratia_marcescens_subunit_1_127_residues_coverage.png", - "colabfold/local/H1065_N4-Cytosine_Methyltransferase_Serratia_marcescens_subunit_1_127_residues_mqc.png", - "colabfold/local/H1065_N4-Cytosine_Methyltransferase_Serratia_marcescens_subunit_1_127_residues_relaxed_rank_01.pdb", - "colabfold/local/H1065_N4-Cytosine_Methyltransferase_Serratia_marcescens_subunit_1_127_residues_relaxed_rank_02.pdb", - "colabfold/local/H1065_N4-Cytosine_Methyltransferase_Serratia_marcescens_subunit_1_127_residues_relaxed_rank_03.pdb", - "colabfold/local/H1065_N4-Cytosine_Methyltransferase_Serratia_marcescens_subunit_2_98_residues_colabfold.pdb", - "colabfold/local/H1065_N4-Cytosine_Methyltransferase_Serratia_marcescens_subunit_2_98_residues_coverage.png", - "colabfold/local/H1065_N4-Cytosine_Methyltransferase_Serratia_marcescens_subunit_2_98_residues_mqc.png", - "colabfold/local/H1065_N4-Cytosine_Methyltransferase_Serratia_marcescens_subunit_2_98_residues_relaxed_rank_01.pdb", - "colabfold/local/H1065_N4-Cytosine_Methyltransferase_Serratia_marcescens_subunit_2_98_residues_relaxed_rank_02.pdb", - "colabfold/local/H1065_N4-Cytosine_Methyltransferase_Serratia_marcescens_subunit_2_98_residues_relaxed_rank_03.pdb", - "colabfold/local/top_ranked_structures", + "colabfold/H1065_N4-Cytosine_Methyltransferase_Serratia_marcescens_subunit_1_127_residues_colabfold.pdb", + "colabfold/H1065_N4-Cytosine_Methyltransferase_Serratia_marcescens_subunit_1_127_residues_coverage.png", + "colabfold/H1065_N4-Cytosine_Methyltransferase_Serratia_marcescens_subunit_1_127_residues_mqc.png", + "colabfold/H1065_N4-Cytosine_Methyltransferase_Serratia_marcescens_subunit_1_127_residues_relaxed_rank_01.pdb", + "colabfold/H1065_N4-Cytosine_Methyltransferase_Serratia_marcescens_subunit_1_127_residues_relaxed_rank_02.pdb", + "colabfold/H1065_N4-Cytosine_Methyltransferase_Serratia_marcescens_subunit_1_127_residues_relaxed_rank_03.pdb", + "colabfold/H1065_N4-Cytosine_Methyltransferase_Serratia_marcescens_subunit_2_98_residues_colabfold.pdb", + "colabfold/H1065_N4-Cytosine_Methyltransferase_Serratia_marcescens_subunit_2_98_residues_coverage.png", + "colabfold/H1065_N4-Cytosine_Methyltransferase_Serratia_marcescens_subunit_2_98_residues_mqc.png", + "colabfold/H1065_N4-Cytosine_Methyltransferase_Serratia_marcescens_subunit_2_98_residues_relaxed_rank_01.pdb", + "colabfold/H1065_N4-Cytosine_Methyltransferase_Serratia_marcescens_subunit_2_98_residues_relaxed_rank_02.pdb", + "colabfold/H1065_N4-Cytosine_Methyltransferase_Serratia_marcescens_subunit_2_98_residues_relaxed_rank_03.pdb", + "colabfold/top_ranked_structures", "generate", "generate/test_LDDT.html", "generate/test_alphafold2_report.html", @@ -64,8 +65,8 @@ ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.5" + "nextflow": "25.04.6" }, - "timestamp": "2025-07-01T23:20:10.322018" + "timestamp": "2025-08-07T11:03:04.097369625" } } \ No newline at end of file diff --git a/workflows/alphafold2.nf b/workflows/alphafold2.nf index d070b6581..74f163ac1 100644 --- a/workflows/alphafold2.nf +++ b/workflows/alphafold2.nf @@ -28,7 +28,7 @@ workflow ALPHAFOLD2 { take: ch_samplesheet // channel: samplesheet read in from --input ch_versions // channel: [ path(versions.yml) ] - full_dbs // boolean: Use full databases (otherwise reduced version) + alphafold2_full_dbs // boolean: Use full databases (otherwise reduced version) alphafold2_mode // string: Mode to run Alphafold2 in alphafold2_model_preset // string: Specifies the model preset to use for Alphafold2 ch_alphafold2_params // channel: path(alphafold2_params) @@ -66,7 +66,7 @@ workflow ALPHAFOLD2 { // RUN_ALPHAFOLD2 ( ch_samplesheet, - full_dbs, + alphafold2_full_dbs, alphafold2_model_preset, ch_alphafold2_params, ch_bfd, @@ -100,7 +100,7 @@ workflow ALPHAFOLD2 { // RUN_ALPHAFOLD2_MSA ( ch_samplesheet, - full_dbs, + alphafold2_full_dbs, alphafold2_model_preset, ch_alphafold2_params, ch_bfd, diff --git a/workflows/boltz.nf b/workflows/boltz.nf index 9b8d0a8d8..a2fc7718f 100644 --- a/workflows/boltz.nf +++ b/workflows/boltz.nf @@ -48,6 +48,9 @@ workflow BOLTZ { ch_versions // channel: [ path(versions.yml) ] ch_boltz_ccd // channel: [ path(boltz_ccd) ] ch_boltz_model // channel: [ path(model) ] + ch_boltz2_aff // channel: [ path(boltz2_aff) ] + ch_boltz2_conf // channel: [ path(boltz2_conf) ] + ch_mols // channel: [ path(mols) ] ch_colabfold_db // channel: [ path(colabfold_db) ] ch_uniref30 // channel: [ path(uniref30) ] msa_server @@ -70,17 +73,16 @@ workflow BOLTZ { ] } ) - ) - .map{ - def meta = it[0].clone() - meta.cnt = it[2] - [meta, it[1]] - } - .branch{ - multimer: it[0].cnt > 1 - monomer: it[0].cnt == 1 - } - .set{ch_input} + .map{ + def meta = it[0].clone() + meta.cnt = it[2] + [meta, it[1]] + } + .branch{ + multimer: it[0].cnt > 1 + monomer: it[0].cnt == 1 + } + .set{ch_input} if (!msa_server){ MULTIFASTA_TO_CSV( @@ -127,7 +129,10 @@ workflow BOLTZ { ch_boltz_input.map{[it[0], it[1]]}, ch_boltz_input.map{it[2]}, ch_boltz_model, - ch_boltz_ccd + ch_boltz_ccd, + ch_boltz2_aff, + ch_boltz2_conf, + ch_mols ) RUN_BOLTZ diff --git a/workflows/colabfold.nf b/workflows/colabfold.nf index 2b751e66d..c356984f9 100644 --- a/workflows/colabfold.nf +++ b/workflows/colabfold.nf @@ -37,11 +37,12 @@ workflow COLABFOLD { main: ch_multiqc_report = Channel.empty() - if (params.colabfold_server == 'webserver') { + if (params.use_msa_server) { // // MODULE: Run colabfold // - if (params.colabfold_model_preset != 'alphafold2_ptm' && params.colabfold_model_preset != 'alphafold2') { + if (colabfold_model_preset != 'alphafold2_ptm' && colabfold_model_preset != 'alphafold2') { + //Multimer mode MULTIFASTA_TO_CSV( ch_samplesheet ) @@ -67,11 +68,12 @@ workflow COLABFOLD { ch_versions = ch_versions.mix(COLABFOLD_BATCH.out.versions) } - } else if (params.colabfold_server == 'local') { + } else { // // MODULE: Run mmseqs // if (params.colabfold_model_preset != 'alphafold2_ptm' && params.colabfold_model_preset != 'alphafold2') { + //Multimer mode MULTIFASTA_TO_CSV( ch_samplesheet )