{"id":44964527,"url":"https://github.com/bioinfomachinelearning/multicom_ligand","last_synced_at":"2026-02-18T14:10:02.499Z","repository":{"id":274316597,"uuid":"922541554","full_name":"BioinfoMachineLearning/MULTICOM_ligand","owner":"BioinfoMachineLearning","description":"Comprehensive ensembling of protein-ligand structure and affinity prediction methods (CASP16)","archived":false,"fork":false,"pushed_at":"2025-09-13T17:30:34.000Z","size":98810,"stargazers_count":7,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-09-23T13:10:25.163Z","etag":null,"topics":["binding-affinity","deep-learning","diffusion-model","drug-discovery","flow-matching","pose-prediction","protein-ligand-interactions"],"latest_commit_sha":null,"homepage":"","language":"Jupyter Notebook","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/BioinfoMachineLearning.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":"citation.bib","codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-01-26T13:50:19.000Z","updated_at":"2025-09-13T17:25:02.000Z","dependencies_parsed_at":"2025-09-13T04:27:17.724Z","dependency_job_id":null,"html_url":"https://github.com/BioinfoMachineLearning/MULTICOM_ligand","commit_stats":null,"previous_names":["bioinfomachinelearning/multicom_ligand"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/BioinfoMachineLearning/MULTICOM_ligand","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BioinfoMachineLearning%2FMULTICOM_ligand","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BioinfoMachineLearning%2FMULTICOM_ligand/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BioinfoMachineLearning%2FMULTICOM_ligand/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BioinfoMachineLearning%2FMULTICOM_ligand/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/BioinfoMachineLearning","download_url":"https://codeload.github.com/BioinfoMachineLearning/MULTICOM_ligand/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BioinfoMachineLearning%2FMULTICOM_ligand/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29581634,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-18T13:56:48.962Z","status":"ssl_error","status_checked_at":"2026-02-18T13:54:34.145Z","response_time":162,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["binding-affinity","deep-learning","diffusion-model","drug-discovery","flow-matching","pose-prediction","protein-ligand-interactions"],"created_at":"2026-02-18T14:10:01.700Z","updated_at":"2026-02-18T14:10:02.488Z","avatar_url":"https://github.com/BioinfoMachineLearning.png","language":"Jupyter Notebook","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n# MULTICOM_ligand\n\n[![Paper](http://img.shields.io/badge/arXiv-2405.14108-B31B1B.svg)](https://onlinelibrary.wiley.com/doi/10.1002/prot.26827)\n[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.11477766.svg)](https://doi.org/10.5281/zenodo.11477766)\n[![PyPI version](https://badge.fury.io/py/multicom_ligand.svg)](https://badge.fury.io/py/multicom_ligand)\n[![Project Status: Active – The project has reached a stable, usable state and is being actively developed.](https://www.repostatus.org/badges/latest/active.svg)](https://www.repostatus.org/#active)\n[![Docs](https://assets.readthedocs.org/static/projects/badges/passing-flat.svg)](https://bioinfomachinelearning.github.io/MULTICOM_ligand/)\n\u003ca href=\"https://hydra.cc/\"\u003e\u003cimg alt=\"Config: Hydra\" src=\"https://img.shields.io/badge/config-hydra-89b8cd\"\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/psf/black\"\u003e\u003cimg alt=\"Code style: black\" src=\"https://img.shields.io/badge/code%20style-black-000000.svg\"\u003e\u003c/a\u003e\n[![License: MIT](https://img.shields.io/badge/license-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\n\u003cimg src=\"./img/MULTICOM_ligand.png\" width=\"600\"\u003e\n\n\u003c/div\u003e\n\n## Description\n\nComprehensive ensembling of protein-ligand structure and affinity prediction methods\n\n[Documentation](https://bioinfomachinelearning.github.io/MULTICOM_ligand/)\n\n## Contents\n\n- [Installation](#installation)\n- [Tutorials](#tutorials)\n- [How to prepare MULTICOM_ligand data](#how-to-prepare-multicom-ligand-data)\n- [Available inference methods](#available-inference-methods)\n- [How to run inference with individual methods](#how-to-run-inference-with-individual-methods)\n- [How to run inference with a method ensemble](#how-to-run-inference-with-a-method-ensemble)\n- [How to create comparative plots of inference results](#how-to-create-comparative-plots-of-inference-results)\n- [For developers](#for-developers)\n- [Acknowledgements](#acknowledgements)\n- [Citing this work](#citing-this-work)\n- [Bonus](#bonus)\n\n## Installation\n\n\u003cdetails\u003e\n\n### Portable installation\n\nTo reuse modules and utilities within `MULTICOM_ligand` in other projects, one can simply use `pip`\n\n```bash\npip install multicom_ligand\n```\n\n### Full installation\n\nTo reproduce, customize, or extend the `MULTICOM_ligand` benchmark, we recommend fully installing `MULTICOM_ligand` using `mamba` as follows:\n\nFirst, install `mamba` for dependency management (as a fast alternative to Anaconda)\n\n```bash\nwget \"https://github.com/conda-forge/miniforge/releases/download/24.11.3-0/Miniforge3-$(uname)-$(uname -m).sh\"\nbash Miniforge3-$(uname)-$(uname -m).sh  # accept all terms and install to the default location\nrm Miniforge3-$(uname)-$(uname -m).sh  # (optionally) remove installer after using it\nsource ~/.bashrc  # alternatively, one can restart their shell session to achieve the same result\n```\n\nInstall dependencies for each method's environment (as desired)\n\n```bash\n# clone project\nsudo apt-get install git-lfs  # NOTE: run this if you have not already installed `git-lfs`\ngit lfs install\ngit clone https://github.com/BioinfoMachineLearning/MULTICOM_ligand --recursive\ncd MULTICOM_ligand\n\n# create conda environments (~80 GB total)\n# - MULTICOM_ligand environment # (~15 GB)\nmamba env create -f environments/multicom_ligand_environment.yaml\nconda activate MULTICOM_ligand  # NOTE: one still needs to use `conda` to (de)activate environments\npip3 install -e .\npip3 install numpy==1.26.4 --no-dependencies\npip3 install prody==2.4.1 --no-dependencies\n# - casp15_ligand_scoring environment (~3 GB)\nmamba env create -f environments/casp15_ligand_scoring_environment.yaml\nconda activate casp15_ligand_scoring  # NOTE: one still needs to use `conda` to (de)activate environments\npip3 install -e .\n# - DiffDock environment (~13 GB)\nmamba env create -f environments/diffdock_environment.yaml --prefix forks/DiffDock/DiffDock/\nconda activate forks/DiffDock/DiffDock/ \u0026\u0026 pip3 install pyg-lib -f https://data.pyg.org/whl/torch-2.1.0+cu118.html  # NOTE: one still needs to use `conda` to (de)activate environments\n# - FABind environment (~6 GB)\nmamba env create -f environments/fabind_environment.yaml --prefix forks/FABind/FABind/\nconda activate forks/FABind/FABind/  # NOTE: one still needs to use `conda` to (de)activate environments\n# - DynamicBind environment (~13 GB)\nmamba env create -f environments/dynamicbind_environment.yaml --prefix forks/DynamicBind/DynamicBind/\nconda activate forks/DynamicBind/DynamicBind/ \u0026\u0026 pip3 install pyg-lib -f https://data.pyg.org/whl/torch-2.1.0+cu118.html  # NOTE: one still needs to use `conda` to (de)activate environments\n# - NeuralPLexer environment (~14 GB)\nmamba env create -f environments/neuralplexer_environment.yaml --prefix forks/NeuralPLexer/NeuralPLexer/\nconda activate forks/NeuralPLexer/NeuralPLexer/  # NOTE: one still needs to use `conda` to (de)activate environments\ncd forks/NeuralPLexer/ \u0026\u0026 pip3 install -e . \u0026\u0026 cd ../../\n# - RoseTTAFold-All-Atom environment (~14 GB) - NOTE: after running these commands, follow the installation instructions in `forks/RoseTTAFold-All-Atom/README.md` starting at Step 4 (with `forks/RoseTTAFold-All-Atom/` as the current working directory)\nmamba env create -f environments/rfaa_environment.yaml --prefix forks/RoseTTAFold-All-Atom/RFAA/\nconda activate forks/RoseTTAFold-All-Atom/RFAA/  # NOTE: one still needs to use `conda` to (de)activate environments\ncd forks/RoseTTAFold-All-Atom/rf2aa/SE3Transformer/ \u0026\u0026 pip3 install --no-cache-dir -r requirements.txt \u0026\u0026 python3 setup.py install \u0026\u0026 cd ../../../../\n# - AutoDock Vina Tools environment (~1 GB)\nmamba env create -f environments/adfr_environment.yaml --prefix forks/Vina/ADFR/\nconda activate forks/Vina/ADFR/  # NOTE: one still needs to use `conda` to (de)activate environments\n# - P2Rank (~0.5 GB)\nwget -P forks/P2Rank/ https://github.com/rdk/p2rank/releases/download/2.4.2/p2rank_2.4.2.tar.gz\ntar -xzf forks/P2Rank/p2rank_2.4.2.tar.gz -C forks/P2Rank/\nrm forks/P2Rank/p2rank_2.4.2.tar.gz\n```\n\nDownload checkpoints (~8.25 GB total)\n\n```bash\n# DynamicBind checkpoint (~0.25 GB)\ncd forks/DynamicBind/\nwget https://zenodo.org/records/10137507/files/workdir.zip\nunzip workdir.zip\nrm workdir.zip\ncd ../../\n\n# NeuralPLexer checkpoint (~6.5 GB)\ncd forks/NeuralPLexer/\nwget https://zenodo.org/records/10373581/files/neuralplexermodels_downstream_datasets_predictions.zip\nunzip neuralplexermodels_downstream_datasets_predictions.zip\nrm neuralplexermodels_downstream_datasets_predictions.zip\ncd ../../\n\n# RoseTTAFold-All-Atom checkpoint (~1.5 GB)\ncd forks/RoseTTAFold-All-Atom/\nwget http://files.ipd.uw.edu/pub/RF-All-Atom/weights/RFAA_paper_weights.pt\ncd ../../\n```\n\n\u003c/details\u003e\n\n## Tutorials\n\n\u003cdetails\u003e\n\nWe provide a two-part tutorial series of Jupyter notebooks to provide users with examples\nof how to extend `MULTICOM_ligand`, as outlined below.\n\n1. [Adding a new dataset](https://github.com/BioinfoMachineLearning/MULTICOM_ligand/blob/main/notebooks/adding_new_dataset_tutorial.ipynb)\n2. [Adding a new method](https://github.com/BioinfoMachineLearning/MULTICOM_ligand/blob/main/notebooks/adding_new_method_tutorial.ipynb)\n\n\u003c/details\u003e\n\n## How to prepare `MULTICOM_ligand` data\n\n\u003cdetails\u003e\n\n### Downloading Astex, PoseBusters, DockGen, and CASP15 data\n\n```bash\n# fetch, extract, and clean-up preprocessed Astex Diverse, PoseBusters Benchmark, DockGen, and CASP15 data (~3 GB) #\nwget https://zenodo.org/records/11477766/files/astex_diverse_set.tar.gz\nwget https://zenodo.org/records/11477766/files/posebusters_benchmark_set.tar.gz\nwget https://zenodo.org/records/11477766/files/dockgen_set.tar.gz\nwget https://zenodo.org/records/11477766/files/casp15_set.tar.gz\ntar -xzf astex_diverse_set.tar.gz\ntar -xzf posebusters_benchmark_set.tar.gz\ntar -xzf dockgen_set.tar.gz\ntar -xzf casp15_set.tar.gz\nrm astex_diverse_set.tar.gz\nrm posebusters_benchmark_set.tar.gz\nrm dockgen_set.tar.gz\nrm casp15_set.tar.gz\n```\n\n### Downloading benchmark method predictions\n\n```bash\n# fetch, extract, and clean-up benchmark method predictions to reproduce paper results (~19 GB) #\n# DiffDock predictions and results\nwget https://zenodo.org/records/11477766/files/diffdock_benchmark_method_predictions.tar.gz\ntar -xzf diffdock_benchmark_method_predictions.tar.gz\nrm diffdock_benchmark_method_predictions.tar.gz\n# FABind predictions and results\nwget https://zenodo.org/records/11477766/files/fabind_benchmark_method_predictions.tar.gz\ntar -xzf fabind_benchmark_method_predictions.tar.gz\nrm fabind_benchmark_method_predictions.tar.gz\n# DynamicBind predictions and results\nwget https://zenodo.org/records/11477766/files/dynamicbind_benchmark_method_predictions.tar.gz\ntar -xzf dynamicbind_benchmark_method_predictions.tar.gz\nrm dynamicbind_benchmark_method_predictions.tar.gz\n# NeuralPLexer predictions and results\nwget https://zenodo.org/records/11477766/files/neuralplexer_benchmark_method_predictions.tar.gz\ntar -xzf neuralplexer_benchmark_method_predictions.tar.gz\nrm neuralplexer_benchmark_method_predictions.tar.gz\n# RoseTTAFold-All-Atom predictions and results\nwget https://zenodo.org/records/11477766/files/rfaa_benchmark_method_predictions.tar.gz\ntar -xzf rfaa_benchmark_method_predictions.tar.gz\nrm rfaa_benchmark_method_predictions.tar.gz\n# TULIP predictions and results\nwget https://zenodo.org/records/11477766/files/tulip_benchmark_method_predictions.tar.gz\ntar -xzf tulip_benchmark_method_predictions.tar.gz\nrm tulip_benchmark_method_predictions.tar.gz\n# AutoDock Vina predictions and results\nwget https://zenodo.org/records/11477766/files/vina_benchmark_method_predictions.tar.gz\ntar -xzf vina_benchmark_method_predictions.tar.gz\nrm vina_benchmark_method_predictions.tar.gz\n# Astex Diverse, PoseBusters Benchmark (w/ pocket-only results), DockGen, and CASP15 consensus ensemble predictions and results\nwget https://zenodo.org/records/11477766/files/astex_diverse_ensemble_benchmark_method_predictions.tar.gz\nwget https://zenodo.org/records/11477766/files/posebusters_benchmark_ensemble_benchmark_method_predictions.tar.gz\nwget https://zenodo.org/records/11477766/files/dockgen_ensemble_benchmark_method_predictions.tar.gz\nwget https://zenodo.org/records/11477766/files/casp15_ensemble_benchmark_method_predictions.tar.gz\ntar -xzf astex_diverse_ensemble_benchmark_method_predictions.tar.gz\ntar -xzf posebusters_benchmark_ensemble_benchmark_method_predictions.tar.gz\ntar -xzf dockgen_ensemble_benchmark_method_predictions.tar.gz\ntar -xzf casp15_ensemble_benchmark_method_predictions.tar.gz\nrm astex_diverse_ensemble_benchmark_method_predictions.tar.gz\nrm posebusters_benchmark_ensemble_benchmark_method_predictions.tar.gz\nrm dockgen_ensemble_benchmark_method_predictions.tar.gz\nrm casp15_ensemble_benchmark_method_predictions.tar.gz\n```\n\n**NOTE:** One can reproduce the _pocket-only_ experiments with the PoseBusters Benchmark set by adding the argument `pocket_only_baseline=true` to each command below used to run PoseBusters Benchmark dataset inference with all the baseline methods, since the pocket-only versions of the dataset's holo-aligned predicted protein structures have also been included in the downloadable Zenodo archive `posebusters_benchmark_set.tar.gz` referenced above. However, be aware that one then needs to _rename_ any existing directories containing PoseBusters Benchmark dataset inference results for each baseline method, to prevent these existing inference directories from being merged with new pocket-only results. Please see the config files within `configs/data/`, `configs/model/`, and `configs/analysis/` for more details.\n\n### Downloading sequence databases (required only for RoseTTAFold-All-Atom inference)\n\n```bash\n# acquire multiple sequence alignment databases for RoseTTAFold-All-Atom (~2.5 TB)\ncd forks/RoseTTAFold-All-Atom/\n\n# uniref30 [46G]\nwget http://wwwuser.gwdg.de/~compbiol/uniclust/2020_06/UniRef30_2020_06_hhsuite.tar.gz\nmkdir -p UniRef30_2020_06\ntar xfz UniRef30_2020_06_hhsuite.tar.gz -C ./UniRef30_2020_06\n\n# BFD [272G]\nwget https://bfd.mmseqs.com/bfd_metaclust_clu_complete_id30_c90_final_seq.sorted_opt.tar.gz\nmkdir -p bfd\ntar xfz bfd_metaclust_clu_complete_id30_c90_final_seq.sorted_opt.tar.gz -C ./bfd\n\n# structure templates (including *_a3m.ffdata, *_a3m.ffindex)\nwget https://files.ipd.uw.edu/pub/RoseTTAFold/pdb100_2021Mar03.tar.gz\ntar xfz pdb100_2021Mar03.tar.gz\n\ncd ../../\n```\n\n### Predicting apo protein structures using ESMFold\n\nFirst create all the corresponding FASTA files for each protein sequence\n\n```bash\npython3 multicom_ligand/data/components/esmfold_fasta_preparation.py dataset=posebusters_benchmark\npython3 multicom_ligand/data/components/esmfold_fasta_preparation.py dataset=astex_diverse\n```\n\nTo generate the apo version of each protein structure,\ncreate ESMFold-ready versions of the combined FASTA files\nprepared above by the script `esmfold_fasta_preparation.py`\nfor the PoseBusters Benchmark and Astex Diverse sets, respectively\n\n```bash\npython3 multicom_ligand/data/components/esmfold_sequence_preparation.py dataset=posebusters_benchmark\npython3 multicom_ligand/data/components/esmfold_sequence_preparation.py dataset=astex_diverse\n```\n\nThen, predict each apo protein structure using ESMFold's batch\ninference script\n\n```bash\npython3 multicom_ligand/data/components/esmfold_batch_structure_prediction.py -i data/posebusters_benchmark_set/posebusters_benchmark_esmfold_sequences.fasta -o data/posebusters_benchmark_set/posebusters_benchmark_esmfold_structures --skip-existing\npython3 multicom_ligand/data/components/esmfold_batch_structure_prediction.py -i data/astex_diverse_set/astex_diverse_esmfold_sequences.fasta -o data/astex_diverse_set/astex_diverse_esmfold_structures --skip-existing\n```\n\n**NOTE:** Having a CUDA-enabled device available when running ESMFold is highly recommended\n\n**NOTE:** ESMFold may not be able to predict apo protein structures for a handful of exceedingly-long (e.g., \u003e2000 token) input sequences\n\nLastly, align each apo protein structure to its corresponding\nholo protein structure counterpart in the PoseBusters Benchmark\nor Astex Diverse set, taking ligand conformations into account\nduring each alignment\n\n```bash\npython3 multicom_ligand/data/components/esmfold_apo_to_holo_alignment.py dataset=posebusters_benchmark num_workers=1\npython3 multicom_ligand/data/components/esmfold_apo_to_holo_alignment.py dataset=astex_diverse num_workers=1\n```\n\n**NOTE:** The preprocessed DockGen and CASP15 data available via [Zenodo](https://doi.org/10.5281/zenodo.11477766) provide pre-holo-aligned predicted protein structures for these respective datasets.\n\n\u003c/details\u003e\n\n## Available inference methods\n\n\u003cdetails\u003e\n\n### Methods available individually\n\n#### Fixed Protein Methods\n\n| Name            | Source                                                                | Astex Benchmarked | PoseBusters Benchmarked | DockGen Benchmarked | CASP Benchmarked |\n| --------------- | --------------------------------------------------------------------- | ----------------- | ----------------------- | ------------------- | ---------------- |\n| `DiffDock`      | [Corso et al.](https://openreview.net/forum?id=UfBIxpTK10)            | ✓                 | ✓                       | ✓                   | ✓                |\n| `FABind`        | [Pei et al.](https://openreview.net/forum?id=PnWakgg1RL)              | ✓                 | ✓                       | ✓                   | ✗                |\n| `AutoDock Vina` | [Eberhardt et al.](https://pubs.acs.org/doi/10.1021/acs.jcim.1c00203) | ✓                 | ✓                       | ✓                   | ✓                |\n| `TULIP`         |                                                                       | ✓                 | ✓                       | ✗                   | ✓                |\n\n#### Flexible Protein Methods\n\n| Name                   | Source                                                                | Astex Benchmarked | PoseBusters Benchmarked | DockGen Benchmarked | CASP Benchmarked |\n| ---------------------- | --------------------------------------------------------------------- | ----------------- | ----------------------- | ------------------- | ---------------- |\n| `DynamicBind`          | [Lu et al.](https://www.nature.com/articles/s41467-024-45461-2)       | ✓                 | ✓                       | ✓                   | ✓                |\n| `NeuralPLexer`         | [Qiao et al.](https://www.nature.com/articles/s42256-024-00792-z)     | ✓                 | ✓                       | ✓                   | ✓                |\n| `RoseTTAFold-All-Atom` | [Krishna et al.](https://www.science.org/doi/10.1126/science.adl2528) | ✓                 | ✓                       | ✓                   | ✓                |\n\n### Methods available for ensembling\n\n#### Fixed Protein Methods\n\n| Name            | Source                                                                | Astex Benchmarked | PoseBusters Benchmarked | DockGen Benchmarked | CASP Benchmarked |\n| --------------- | --------------------------------------------------------------------- | ----------------- | ----------------------- | ------------------- | ---------------- |\n| `DiffDock`      | [Corso et al.](https://openreview.net/forum?id=UfBIxpTK10)            | ✓                 | ✓                       | ✓                   | ✓                |\n| `AutoDock Vina` | [Eberhardt et al.](https://pubs.acs.org/doi/10.1021/acs.jcim.1c00203) | ✓                 | ✓                       | ✓                   | ✓                |\n| `TULIP`         |                                                                       | ✓                 | ✓                       | ✗                   | ✓                |\n\n#### Flexible Protein Methods\n\n| Name                   | Source                                                                | Astex Benchmarked | PoseBusters Benchmarked | DockGen Benchmarked | CASP Benchmarked |\n| ---------------------- | --------------------------------------------------------------------- | ----------------- | ----------------------- | ------------------- | ---------------- |\n| `DynamicBind`          | [Lu et al.](https://www.nature.com/articles/s41467-024-45461-2)       | ✓                 | ✓                       | ✓                   | ✓                |\n| `NeuralPLexer`         | [Qiao et al.](https://www.nature.com/articles/s42256-024-00792-z)     | ✓                 | ✓                       | ✓                   | ✓                |\n| `RoseTTAFold-All-Atom` | [Krishna et al.](https://www.science.org/doi/10.1126/science.adl2528) | ✓                 | ✓                       | ✓                   | ✓                |\n\n**NOTE**: Have a new method to add? Please let us know by creating a pull request. We would be happy to work with you to integrate new methodology into this benchmark!\n\n\u003c/details\u003e\n\n## How to run inference with individual methods\n\n\u003cdetails\u003e\n\n### How to run inference with `DiffDock`\n\nPrepare CSV input files\n\n```bash\npython3 multicom_ligand/data/diffdock_input_preparation.py dataset=posebusters_benchmark\npython3 multicom_ligand/data/diffdock_input_preparation.py dataset=astex_diverse\npython3 multicom_ligand/data/diffdock_input_preparation.py dataset=dockgen\npython3 multicom_ligand/data/diffdock_input_preparation.py dataset=casp15 input_data_dir=\"$PWD\"/data/casp15_set/targets input_protein_structure_dir=\"$PWD\"/data/casp15_set/predicted_structures\n```\n\nRun inference on each dataset\n\n```bash\npython3 multicom_ligand/models/diffdock_inference.py dataset=posebusters_benchmark repeat_index=1\n...\npython3 multicom_ligand/models/diffdock_inference.py dataset=astex_diverse repeat_index=1\n...\npython3 multicom_ligand/models/diffdock_inference.py dataset=dockgen repeat_index=1\n...\npython3 multicom_ligand/models/diffdock_inference.py dataset=casp15 batch_size=1 repeat_index=1\n...\n```\n\nRelax the generated ligand structures inside of their respective protein pockets\n\n```bash\npython3 multicom_ligand/models/inference_relaxation.py method=diffdock dataset=posebusters_benchmark remove_initial_protein_hydrogens=true assign_partial_charges_manually=true num_processes=1 repeat_index=1\n...\npython3 multicom_ligand/models/inference_relaxation.py method=diffdock dataset=astex_diverse remove_initial_protein_hydrogens=true assign_partial_charges_manually=true num_processes=1 repeat_index=1\n...\npython3 multicom_ligand/models/inference_relaxation.py method=diffdock dataset=dockgen remove_initial_protein_hydrogens=true assign_partial_charges_manually=true num_processes=1 repeat_index=1\n...\n```\n\n**NOTE**: Increase `num_processes` according to your available CPU/GPU resources to improve throughput\n\nAnalyze inference results for each dataset\n\n```bash\npython3 multicom_ligand/analysis/inference_analysis.py method=diffdock dataset=posebusters_benchmark repeat_index=1\n...\npython3 multicom_ligand/analysis/inference_analysis.py method=diffdock dataset=astex_diverse repeat_index=1\n...\npython3 multicom_ligand/analysis/inference_analysis.py method=diffdock dataset=dockgen repeat_index=1\n...\n```\n\nAnalyze inference results for the CASP15 dataset\n\n```bash\n# first assemble (unrelaxed and post ranking-relaxed) CASP15-compliant prediction submission files for scoring\npython3 multicom_ligand/models/ensemble_generation.py ensemble_methods=\\[diffdock\\] input_csv_filepath=data/test_cases/casp15/ensemble_inputs.csv output_dir=data/test_cases/casp15/top_diffdock_ensemble_predictions_1 skip_existing=true relax_method_ligands_post_ranking=false export_file_format=casp15 export_top_n=5 combine_casp_output_files=true max_method_predictions=40 method_top_n_to_select=40 resume=true ensemble_benchmarking=true ensemble_benchmarking_dataset=casp15 cuda_device_index=0 ensemble_benchmarking_repeat_index=1\npython3 multicom_ligand/models/ensemble_generation.py ensemble_methods=\\[diffdock\\] input_csv_filepath=data/test_cases/casp15/ensemble_inputs.csv output_dir=data/test_cases/casp15/top_diffdock_ensemble_predictions_1 skip_existing=true relax_method_ligands_post_ranking=true export_file_format=casp15 export_top_n=5 combine_casp_output_files=true max_method_predictions=40 method_top_n_to_select=40 resume=true ensemble_benchmarking=true ensemble_benchmarking_dataset=casp15 cuda_device_index=0 ensemble_benchmarking_repeat_index=1\n# NOTE: the suffixes for both `output_dir` and `ensemble_benchmarking_repeat_index` should be modified to e.g., 2, 3, ...\n...\n# now score the CASP15-compliant submissions using the official CASP scoring pipeline\npython3 multicom_ligand/analysis/inference_analysis_casp.py method=diffdock dataset=casp15 repeat_index=1\n...\n```\n\n### How to run inference with `FABind`\n\nPrepare CSV input files\n\n```bash\npython3 multicom_ligand/data/fabind_input_preparation.py dataset=posebusters_benchmark\npython3 multicom_ligand/data/fabind_input_preparation.py dataset=astex_diverse\npython3 multicom_ligand/data/fabind_input_preparation.py dataset=dockgen\n```\n\nRun inference on each dataset\n\n```bash\npython3 multicom_ligand/models/fabind_inference.py dataset=posebusters_benchmark repeat_index=1\n...\npython3 multicom_ligand/models/fabind_inference.py dataset=astex_diverse repeat_index=1\n...\npython3 multicom_ligand/models/fabind_inference.py dataset=dockgen repeat_index=1\n...\n```\n\nRelax the generated ligand structures inside of their respective protein pockets\n\n```bash\npython3 multicom_ligand/models/inference_relaxation.py method=fabind dataset=posebusters_benchmark remove_initial_protein_hydrogens=true assign_partial_charges_manually=true num_processes=1 repeat_index=1\n...\npython3 multicom_ligand/models/inference_relaxation.py method=fabind dataset=astex_diverse remove_initial_protein_hydrogens=true assign_partial_charges_manually=true num_processes=1 repeat_index=1\n...\npython3 multicom_ligand/models/inference_relaxation.py method=fabind dataset=dockgen remove_initial_protein_hydrogens=true assign_partial_charges_manually=true num_processes=1 repeat_index=1\n...\n```\n\n**NOTE**: Increase `num_processes` according to your available CPU/GPU resources to improve throughput\n\nAnalyze inference results for each dataset\n\n```bash\npython3 multicom_ligand/analysis/inference_analysis.py method=fabind dataset=posebusters_benchmark repeat_index=1\n...\npython3 multicom_ligand/analysis/inference_analysis.py method=fabind dataset=astex_diverse repeat_index=1\n...\npython3 multicom_ligand/analysis/inference_analysis.py method=fabind dataset=dockgen repeat_index=1\n...\n```\n\n### How to run inference with `DynamicBind`\n\nPrepare CSV input files\n\n```bash\npython3 multicom_ligand/data/dynamicbind_input_preparation.py dataset=posebusters_benchmark\npython3 multicom_ligand/data/dynamicbind_input_preparation.py dataset=astex_diverse\npython3 multicom_ligand/data/dynamicbind_input_preparation.py dataset=dockgen\npython3 multicom_ligand/data/dynamicbind_input_preparation.py dataset=casp15 input_data_dir=\"$PWD\"/data/casp15_set/targets\n```\n\nRun inference on each dataset\n\n```bash\npython3 multicom_ligand/models/dynamicbind_inference.py dataset=posebusters_benchmark repeat_index=1\n...\npython3 multicom_ligand/models/dynamicbind_inference.py dataset=astex_diverse repeat_index=1\n...\npython3 multicom_ligand/models/dynamicbind_inference.py dataset=dockgen repeat_index=1\n...\npython3 multicom_ligand/models/dynamicbind_inference.py dataset=casp15 batch_size=1 input_data_dir=\"$PWD\"/data/casp15_set/predicted_structures repeat_index=1\n...\n```\n\nRelax the generated ligand structures inside of their respective protein pockets\n\n```bash\npython3 multicom_ligand/models/inference_relaxation.py method=dynamicbind dataset=posebusters_benchmark remove_initial_protein_hydrogens=true assign_partial_charges_manually=true num_processes=1 repeat_index=1\n...\npython3 multicom_ligand/models/inference_relaxation.py method=dynamicbind dataset=astex_diverse remove_initial_protein_hydrogens=true assign_partial_charges_manually=true num_processes=1 repeat_index=1\n...\npython3 multicom_ligand/models/inference_relaxation.py method=dynamicbind dataset=dockgen remove_initial_protein_hydrogens=true assign_partial_charges_manually=true num_processes=1 repeat_index=1\n...\n```\n\n**NOTE**: Increase `num_processes` according to your available CPU/GPU resources to improve throughput\n\nAnalyze inference results for each dataset\n\n```bash\npython3 multicom_ligand/analysis/inference_analysis.py method=dynamicbind dataset=posebusters_benchmark repeat_index=1\n...\npython3 multicom_ligand/analysis/inference_analysis.py method=dynamicbind dataset=astex_diverse repeat_index=1\n...\npython3 multicom_ligand/analysis/inference_analysis.py method=dynamicbind dataset=dockgen repeat_index=1\n...\n```\n\nAnalyze inference results for the CASP15 dataset\n\n```bash\n# first assemble (unrelaxed and post ranking-relaxed) CASP15-compliant prediction submission files for scoring\npython3 multicom_ligand/models/ensemble_generation.py ensemble_methods=\\[dynamicbind\\] input_csv_filepath=data/test_cases/casp15/ensemble_inputs.csv output_dir=data/test_cases/casp15/top_dynamicbind_ensemble_predictions_1 skip_existing=true relax_method_ligands_post_ranking=false export_file_format=casp15 export_top_n=5 combine_casp_output_files=true max_method_predictions=40 method_top_n_to_select=40 resume=true ensemble_benchmarking=true ensemble_benchmarking_dataset=casp15 cuda_device_index=0 ensemble_benchmarking_repeat_index=1\npython3 multicom_ligand/models/ensemble_generation.py ensemble_methods=\\[dynamicbind\\] input_csv_filepath=data/test_cases/casp15/ensemble_inputs.csv output_dir=data/test_cases/casp15/top_dynamicbind_ensemble_predictions_1 skip_existing=true relax_method_ligands_post_ranking=true export_file_format=casp15 export_top_n=5 combine_casp_output_files=true max_method_predictions=40 method_top_n_to_select=40 resume=true ensemble_benchmarking=true ensemble_benchmarking_dataset=casp15 cuda_device_index=0 ensemble_benchmarking_repeat_index=1\n# NOTE: the suffixes for both `output_dir` and `ensemble_benchmarking_repeat_index` should be modified to e.g., 2, 3, ...\n...\n# now score the CASP15-compliant submissions using the official CASP scoring pipeline\npython3 multicom_ligand/analysis/inference_analysis_casp.py method=dynamicbind dataset=casp15 repeat_index=1\n...\n```\n\n### How to run inference with `NeuralPLexer`\n\nPrepare CSV input files\n\n```bash\npython3 multicom_ligand/data/neuralplexer_input_preparation.py dataset=posebusters_benchmark\npython3 multicom_ligand/data/neuralplexer_input_preparation.py dataset=astex_diverse\npython3 multicom_ligand/data/neuralplexer_input_preparation.py dataset=dockgen\npython3 multicom_ligand/data/neuralplexer_input_preparation.py dataset=casp15 input_data_dir=\"$PWD\"/data/casp15_set/targets input_receptor_structure_dir=\"$PWD\"/data/casp15_set/predicted_structures\n```\n\nRun inference on each dataset\n\n```bash\npython3 multicom_ligand/models/neuralplexer_inference.py dataset=posebusters_benchmark repeat_index=1\n...\npython3 multicom_ligand/models/neuralplexer_inference.py dataset=astex_diverse repeat_index=1\n...\npython3 multicom_ligand/models/neuralplexer_inference.py dataset=dockgen repeat_index=1\n...\npython3 multicom_ligand/models/neuralplexer_inference.py dataset=casp15 repeat_index=1\n...\n```\n\nRelax the generated ligand structures inside of their respective protein pockets\n\n```bash\npython3 multicom_ligand/models/inference_relaxation.py method=neuralplexer dataset=posebusters_benchmark num_processes=1 remove_initial_protein_hydrogens=true assign_partial_charges_manually=true cache_files=false repeat_index=1\n...\npython3 multicom_ligand/models/inference_relaxation.py method=neuralplexer dataset=astex_diverse num_processes=1 remove_initial_protein_hydrogens=true assign_partial_charges_manually=true cache_files=false repeat_index=1\n...\npython3 multicom_ligand/models/inference_relaxation.py method=neuralplexer dataset=dockgen num_processes=1 remove_initial_protein_hydrogens=true assign_partial_charges_manually=true cache_files=false repeat_index=1\n...\n```\n\n**NOTE**: Increase `num_processes` according to your available CPU/GPU resources to improve throughput\n\nAlign predicted protein-ligand structures to ground-truth complex structures\n\n```bash\npython3 multicom_ligand/analysis/complex_alignment.py method=neuralplexer dataset=posebusters_benchmark repeat_index=1\n...\npython3 multicom_ligand/analysis/complex_alignment.py method=neuralplexer dataset=astex_diverse repeat_index=1\n...\npython3 multicom_ligand/analysis/complex_alignment.py method=neuralplexer dataset=dockgen repeat_index=1\n...\n```\n\nAnalyze inference results for each dataset\n\n```bash\npython3 multicom_ligand/analysis/inference_analysis.py method=neuralplexer dataset=posebusters_benchmark repeat_index=1\n...\npython3 multicom_ligand/analysis/inference_analysis.py method=neuralplexer dataset=astex_diverse repeat_index=1\n...\npython3 multicom_ligand/analysis/inference_analysis.py method=neuralplexer dataset=dockgen repeat_index=1\n...\n```\n\nAnalyze inference results for the CASP15 dataset\n\n```bash\n# first assemble (unrelaxed and post ranking-relaxed) CASP15-compliant prediction submission files for scoring\npython3 multicom_ligand/models/ensemble_generation.py ensemble_methods=\\[neuralplexer\\] input_csv_filepath=data/test_cases/casp15/ensemble_inputs.csv output_dir=data/test_cases/casp15/top_neuralplexer_ensemble_predictions_1 skip_existing=true relax_method_ligands_post_ranking=false export_file_format=casp15 export_top_n=5 combine_casp_output_files=true max_method_predictions=40 method_top_n_to_select=40 resume=true ensemble_benchmarking=true ensemble_benchmarking_dataset=casp15 cuda_device_index=0 ensemble_benchmarking_repeat_index=1\npython3 multicom_ligand/models/ensemble_generation.py ensemble_methods=\\[neuralplexer\\] input_csv_filepath=data/test_cases/casp15/ensemble_inputs.csv output_dir=data/test_cases/casp15/top_neuralplexer_ensemble_predictions_1 skip_existing=true relax_method_ligands_post_ranking=true export_file_format=casp15 export_top_n=5 combine_casp_output_files=true max_method_predictions=40 method_top_n_to_select=40 resume=true ensemble_benchmarking=true ensemble_benchmarking_dataset=casp15 cuda_device_index=0 ensemble_benchmarking_repeat_index=1\n# NOTE: the suffixes for both `output_dir` and `ensemble_benchmarking_repeat_index` should be modified to e.g., 2, 3, ...\n...\n# now score the CASP15-compliant submissions using the official CASP scoring pipeline\npython3 multicom_ligand/analysis/inference_analysis_casp.py method=neuralplexer dataset=casp15 repeat_index=1\n...\n```\n\n### How to run inference with `RoseTTAFold-All-Atom`\n\nPrepare CSV input files\n\n```bash\npython3 multicom_ligand/data/rfaa_input_preparation.py dataset=posebusters_benchmark\npython3 multicom_ligand/data/rfaa_input_preparation.py dataset=astex_diverse\npython3 multicom_ligand/data/rfaa_input_preparation.py dataset=dockgen\npython3 multicom_ligand/data/rfaa_input_preparation.py dataset=casp15 input_data_dir=\"$PWD\"/data/casp15_set/targets\n```\n\nRun inference on each dataset\n\n```bash\nconda activate forks/RoseTTAFold-All-Atom/RFAA/\npython3 multicom_ligand/models/rfaa_inference.py dataset=posebusters_benchmark run_inference_directly=true\npython3 multicom_ligand/models/rfaa_inference.py dataset=astex_diverse run_inference_directly=true\npython3 multicom_ligand/models/rfaa_inference.py dataset=dockgen run_inference_directly=true\npython3 multicom_ligand/models/rfaa_inference.py dataset=casp15 run_inference_directly=true\nconda deactivate\n```\n\nExtract predictions into separate files for proteins and ligands\n\n```bash\npython3 multicom_ligand/data/rfaa_output_extraction.py dataset=posebusters_benchmark\npython3 multicom_ligand/data/rfaa_output_extraction.py dataset=astex_diverse\npython3 multicom_ligand/data/rfaa_output_extraction.py dataset=dockgen\npython3 multicom_ligand/data/rfaa_output_extraction.py dataset=casp15\n```\n\nRelax the generated ligand structures inside of their respective protein pockets\n\n```bash\npython3 multicom_ligand/models/inference_relaxation.py method=rfaa dataset=posebusters_benchmark num_processes=1 remove_initial_protein_hydrogens=true\npython3 multicom_ligand/models/inference_relaxation.py method=rfaa dataset=astex_diverse num_processes=1 remove_initial_protein_hydrogens=true\npython3 multicom_ligand/models/inference_relaxation.py method=rfaa dataset=dockgen num_processes=1 remove_initial_protein_hydrogens=true\n```\n\n**NOTE**: Increase `num_processes` according to your available CPU/GPU resources to improve throughput\n\nAlign predicted protein-ligand structures to ground-truth complex structures\n\n```bash\npython3 multicom_ligand/analysis/complex_alignment.py method=rfaa dataset=posebusters_benchmark\npython3 multicom_ligand/analysis/complex_alignment.py method=rfaa dataset=astex_diverse\npython3 multicom_ligand/analysis/complex_alignment.py method=rfaa dataset=dockgen\n```\n\nAnalyze inference results for each dataset\n\n```bash\npython3 multicom_ligand/analysis/inference_analysis.py method=rfaa dataset=posebusters_benchmark\npython3 multicom_ligand/analysis/inference_analysis.py method=rfaa dataset=astex_diverse\npython3 multicom_ligand/analysis/inference_analysis.py method=rfaa dataset=dockgen\n```\n\nAnalyze inference results for the CASP15 dataset\n\n```bash\n# first assemble (unrelaxed and post ranking-relaxed) CASP15-compliant prediction submission files for scoring\npython3 multicom_ligand/models/ensemble_generation.py ensemble_methods=\\[rfaa\\] input_csv_filepath=data/test_cases/casp15/ensemble_inputs.csv output_dir=data/test_cases/casp15/top_rfaa_ensemble_predictions_1 skip_existing=true relax_method_ligands_post_ranking=false export_file_format=casp15 export_top_n=5 combine_casp_output_files=true max_method_predictions=40 method_top_n_to_select=40 resume=true ensemble_benchmarking=true ensemble_benchmarking_dataset=casp15 cuda_device_index=0 ensemble_benchmarking_repeat_index=1\npython3 multicom_ligand/models/ensemble_generation.py ensemble_methods=\\[rfaa\\] input_csv_filepath=data/test_cases/casp15/ensemble_inputs.csv output_dir=data/test_cases/casp15/top_rfaa_ensemble_predictions_1 skip_existing=true relax_method_ligands_post_ranking=true export_file_format=casp15 export_top_n=5 combine_casp_output_files=true max_method_predictions=40 method_top_n_to_select=40 resume=true ensemble_benchmarking=true ensemble_benchmarking_dataset=casp15 cuda_device_index=0 ensemble_benchmarking_repeat_index=1\n# NOTE: the suffixes for both `output_dir` and `ensemble_benchmarking_repeat_index` should be modified to e.g., 2, 3, ...\n...\n# now score the CASP15-compliant submissions using the official CASP scoring pipeline\npython3 multicom_ligand/analysis/inference_analysis_casp.py method=rfaa dataset=casp15 targets=\"[T1124, T1127v2, T1146, T1152, T1158v1, T1158v2, T1158v3, T1158v4, T1186, T1187, T1188]\" repeat_index=1\n...\n```\n\n### How to run inference with `AutoDock Vina`\n\nPrepare CSV input files\n\n```bash\ncp forks/DiffDock/inference/diffdock_posebusters_benchmark_inputs.csv forks/Vina/inference/vina_posebusters_benchmark_inputs.csv\ncp forks/DiffDock/inference/diffdock_astex_diverse_inputs.csv forks/Vina/inference/vina_astex_diverse_inputs.csv\ncp forks/DiffDock/inference/diffdock_dockgen_inputs.csv forks/Vina/inference/vina_dockgen_inputs.csv\ncp forks/DiffDock/inference/diffdock_casp15_inputs.csv forks/Vina/inference/vina_casp15_inputs.csv\n```\n\nRun inference on each dataset\n\n```bash\npython3 multicom_ligand/models/vina_inference.py dataset=posebusters_benchmark method=diffdock repeat_index=1 # NOTE: DiffDock-L's binding pockets are recommended as the default Vina input\n...\npython3 multicom_ligand/models/vina_inference.py dataset=astex_diverse method=diffdock repeat_index=1\n...\npython3 multicom_ligand/models/vina_inference.py dataset=dockgen method=diffdock repeat_index=1\n...\npython3 multicom_ligand/models/vina_inference.py dataset=casp15 method=diffdock repeat_index=1\n...\n```\n\nCopy Vina's predictions to the corresponding inference directory for each repeat\n\n```bash\nmkdir -p forks/Vina/inference/vina_diffdock_posebusters_benchmark_outputs_1 \u0026\u0026 cp -r data/test_cases/posebusters_benchmark/vina_diffdock_posebusters_benchmark_outputs_1/* forks/Vina/inference/vina_diffdock_posebusters_benchmark_outputs_1\n...\nmkdir -p forks/Vina/inference/vina_diffdock_astex_diverse_outputs_1 \u0026\u0026 cp -r data/test_cases/astex_diverse/vina_diffdock_astex_diverse_outputs_1/* forks/Vina/inference/vina_diffdock_astex_diverse_outputs_1\n...\nmkdir -p forks/Vina/inference/vina_diffdock_dockgen_outputs_1 \u0026\u0026 cp -r data/test_cases/dockgen/vina_diffdock_dockgen_outputs_1/* forks/Vina/inference/vina_diffdock_dockgen_outputs_1\n...\nmkdir -p forks/Vina/inference/vina_diffdock_casp15_outputs_1 \u0026\u0026 cp -r data/test_cases/casp15/vina_diffdock_casp15_outputs_1/* forks/Vina/inference/vina_diffdock_casp15_outputs_1\n...\n```\n\nRelax the generated ligand structures inside of their respective protein pockets\n\n```bash\npython3 multicom_ligand/models/inference_relaxation.py method=vina vina_binding_site_method=diffdock dataset=posebusters_benchmark remove_initial_protein_hydrogens=true assign_partial_charges_manually=true num_processes=1 repeat_index=1\n...\npython3 multicom_ligand/models/inference_relaxation.py method=vina vina_binding_site_method=diffdock dataset=astex_diverse remove_initial_protein_hydrogens=true assign_partial_charges_manually=true num_processes=1 repeat_index=1\n...\npython3 multicom_ligand/models/inference_relaxation.py method=vina vina_binding_site_method=diffdock dataset=dockgen remove_initial_protein_hydrogens=true assign_partial_charges_manually=true num_processes=1 repeat_index=1\n...\n```\n\n**NOTE**: Increase `num_processes` according to your available CPU/GPU resources to improve throughput\n\nAnalyze inference results for each dataset\n\n```bash\npython3 multicom_ligand/analysis/inference_analysis.py method=vina vina_binding_site_method=diffdock dataset=posebusters_benchmark repeat_index=1\n...\npython3 multicom_ligand/analysis/inference_analysis.py method=vina vina_binding_site_method=diffdock dataset=astex_diverse repeat_index=1\n...\npython3 multicom_ligand/analysis/inference_analysis.py method=vina vina_binding_site_method=diffdock dataset=dockgen repeat_index=1\n...\n```\n\nAnalyze inference results for the CASP15 dataset\n\n```bash\n# assemble (unrelaxed and post ranking-relaxed) CASP15-compliant prediction submission files for scoring\npython3 multicom_ligand/models/ensemble_generation.py ensemble_methods=\\[vina\\] vina_binding_site_methods=\\[diffdock\\] input_csv_filepath=data/test_cases/casp15/ensemble_inputs.csv output_dir=data/test_cases/casp15/top_vina_diffdock_ensemble_predictions_1 skip_existing=true relax_method_ligands_post_ranking=false export_file_format=casp15 export_top_n=5 combine_casp_output_files=true max_method_predictions=40 method_top_n_to_select=40 resume=true ensemble_benchmarking=true ensemble_benchmarking_dataset=casp15 cuda_device_index=0 ensemble_benchmarking_repeat_index=1\npython3 multicom_ligand/models/ensemble_generation.py ensemble_methods=\\[vina\\] vina_binding_site_methods=\\[diffdock\\] input_csv_filepath=data/test_cases/casp15/ensemble_inputs.csv output_dir=data/test_cases/casp15/top_vina_diffdock_ensemble_predictions_1 skip_existing=true relax_method_ligands_post_ranking=true export_file_format=casp15 export_top_n=5 combine_casp_output_files=true max_method_predictions=40 method_top_n_to_select=40 resume=true ensemble_benchmarking=true ensemble_benchmarking_dataset=casp15 cuda_device_index=0 ensemble_benchmarking_repeat_index=1\n# NOTE: the suffixes for both `output_dir` and `ensemble_benchmarking_repeat_index` should be modified to e.g., 2, 3, ...\n...\n# now score the CASP15-compliant submissions using the official CASP scoring pipeline\npython3 multicom_ligand/analysis/inference_analysis_casp.py method=vina vina_binding_site_method=diffdock dataset=casp15 repeat_index=1\n...\n```\n\n### How to run inference with `TULIP`\n\nGather all template ligands generated by `TULIP` via its dedicated [GitHub repository](https://github.com/BioinfoMachineLearning/tulip) and collate the resulting ligand fragment SDF files\n\n```bash\npython3 multicom_ligand/data/tulip_output_extraction.py dataset=posebusters_benchmark\npython3 multicom_ligand/data/tulip_output_extraction.py dataset=astex_diverse\npython3 multicom_ligand/data/tulip_output_extraction.py dataset=casp15\n```\n\nRelax the generated ligand structures inside of their respective protein pockets\n\n```bash\npython3 multicom_ligand/models/inference_relaxation.py method=tulip dataset=posebusters_benchmark remove_initial_protein_hydrogens=true assign_partial_charges_manually=true num_processes=1\n...\npython3 multicom_ligand/models/inference_relaxation.py method=tulip dataset=astex_diverse remove_initial_protein_hydrogens=true assign_partial_charges_manually=true num_processes=1\n...\n```\n\n**NOTE**: Increase `num_processes` according to your available CPU/GPU resources to improve throughput\n\nAnalyze inference results for each dataset\n\n```bash\npython3 multicom_ligand/analysis/inference_analysis.py method=tulip dataset=posebusters_benchmark\n...\npython3 multicom_ligand/analysis/inference_analysis.py method=tulip dataset=astex_diverse\n...\n```\n\nAnalyze inference results for the CASP15 dataset\n\n```bash\n# then assemble (unrelaxed and post ranking-relaxed) CASP15-compliant prediction submission files for scoring\npython3 multicom_ligand/models/ensemble_generation.py ensemble_methods=\\[tulip\\] input_csv_filepath=data/test_cases/casp15/ensemble_inputs.csv output_dir=data/test_cases/casp15/top_tulip_ensemble_predictions_1 skip_existing=true relax_method_ligands_post_ranking=false export_file_format=casp15 export_top_n=5 combine_casp_output_files=true max_method_predictions=40 method_top_n_to_select=40 resume=true ensemble_benchmarking=true ensemble_benchmarking_dataset=casp15 cuda_device_index=0 ensemble_benchmarking_repeat_index=1\npython3 multicom_ligand/models/ensemble_generation.py ensemble_methods=\\[tulip\\] input_csv_filepath=data/test_cases/casp15/ensemble_inputs.csv output_dir=data/test_cases/casp15/top_tulip_ensemble_predictions_1 skip_existing=true relax_method_ligands_post_ranking=true export_file_format=casp15 export_top_n=5 combine_casp_output_files=true max_method_predictions=40 method_top_n_to_select=40 resume=true ensemble_benchmarking=true ensemble_benchmarking_dataset=casp15 cuda_device_index=0 ensemble_benchmarking_repeat_index=1\n# NOTE: the suffixes for both `output_dir` and `ensemble_benchmarking_repeat_index` should be modified to e.g., 2, 3, ...\n...\n# now score the CASP15-compliant submissions using the official CASP scoring pipeline\npython3 multicom_ligand/analysis/inference_analysis_casp.py method=tulip dataset=casp15 targets='[H1135, H1171v1, H1171v2, H1172v1, H1172v2, H1172v3, H1172v4, T1124, T1127v2, T1152, T1158v1, T1158v2, T1158v3, T1158v4, T1186, T1187]'\n...\n```\n\n\u003c/details\u003e\n\n## How to run inference with a method ensemble\n\n\u003cdetails\u003e\n\nUsing an `ensemble` of methods, generate predictions for a new protein target using each method and (e.g., consensus-)rank the pool of predictions (n.b., see the function `execute_steps` within `scripts/execute_casp16_ensemble_generation_strategy.py` for more details regarding `MULTICOM_ligand`'s usage during CASP16)\n\n```bash\n# generate each method's prediction script for a target\n# NOTE: to predict input ESMFold protein structures when they are not already locally available in `data/ensemble_proteins/`, e.g., on a SLURM cluster first run e.g., `srun --partition=gpu --gres=gpu:A100:1 --mem=59G --time=01:00:00 --pty bash` to ensure a GPU is available for inference\npython3 multicom_ligand/models/ensemble_generation.py input_csv_filepath=data/test_cases/5S8I_2LY/ensemble_inputs.csv output_dir=data/test_cases/5S8I_2LY/top_consensus_ensemble_predictions_1 max_method_predictions=40 ensemble_ranking_method=consensus resume=false ensemble_methods='[diffdock, dynamicbind, neuralplexer, rfaa]'\n# ...\n# now, manually run each desired method's generated prediction script, with the exception of AutoDock Vina which uses other methods' predictions\n# ...\npython3 multicom_ligand/models/ensemble_generation.py input_csv_filepath=data/test_cases/5S8I_2LY/ensemble_inputs.csv output_dir=data/test_cases/5S8I_2LY/top_consensus_ensemble_predictions_1 max_method_predictions=40 ensemble_ranking_method=consensus resume=true generate_vina_scripts=true vina_binding_site_methods=[diffdock]\n# now, manually run AutoDock Vina's generated prediction script for each binding site prediction method\n#...\n# lastly, organize each method's predictions together\npython3 multicom_ligand/models/ensemble_generation.py input_csv_filepath=data/test_cases/5S8I_2LY/ensemble_inputs.csv output_dir=data/test_cases/5S8I_2LY/top_consensus_ensemble_predictions_1 max_method_predictions=40 ensemble_ranking_method=consensus resume=true generate_vina_scripts=false vina_binding_site_methods=[diffdock]\n```\n\nBenchmark (ensemble-)ranked predictions across each test dataset\n\n```bash\n# benchmark using the PoseBusters Benchmark dataset e.g., after generating 40 complexes per target with each method\npython3 multicom_ligand/models/ensemble_generation.py input_csv_filepath=data/test_cases/posebusters_benchmark/ensemble_inputs.csv output_dir=data/test_cases/posebusters_benchmark/top_consensus_ensemble_predictions_1 max_method_predictions=40 export_top_n=1 export_file_format=null skip_existing=true relax_method_ligands_post_ranking=false resume=true cuda_device_index=0 ensemble_methods='[diffdock, dynamicbind, neuralplexer, rfaa, tulip, vina]' ensemble_benchmarking=true ensemble_benchmarking_dataset=posebusters_benchmark ensemble_ranking_method=consensus ensemble_benchmarking_repeat_index=1\npython3 multicom_ligand/models/ensemble_generation.py input_csv_filepath=data/test_cases/posebusters_benchmark/ensemble_inputs.csv output_dir=data/test_cases/posebusters_benchmark/top_consensus_ensemble_predictions_1 max_method_predictions=40 export_top_n=1 export_file_format=null skip_existing=true relax_method_ligands_post_ranking=true resume=true cuda_device_index=0 ensemble_methods='[diffdock, dynamicbind, neuralplexer, rfaa, tulip, vina]' ensemble_benchmarking=true ensemble_benchmarking_dataset=posebusters_benchmark ensemble_ranking_method=consensus ensemble_benchmarking_repeat_index=1\n...\n# benchmark using the Astex Diverse dataset e.g., after generating 40 complexes per target with each method\npython3 multicom_ligand/models/ensemble_generation.py input_csv_filepath=data/test_cases/astex_diverse/ensemble_inputs.csv output_dir=data/test_cases/astex_diverse/top_consensus_ensemble_predictions_1 max_method_predictions=40 export_top_n=1 export_file_format=null skip_existing=true relax_method_ligands_post_ranking=false resume=true cuda_device_index=0 ensemble_methods='[diffdock, dynamicbind, neuralplexer, rfaa, tulip, vina]' ensemble_benchmarking=true ensemble_benchmarking_dataset=astex_diverse ensemble_ranking_method=consensus ensemble_benchmarking_repeat_index=1\npython3 multicom_ligand/models/ensemble_generation.py input_csv_filepath=data/test_cases/astex_diverse/ensemble_inputs.csv output_dir=data/test_cases/astex_diverse/top_consensus_ensemble_predictions_1 max_method_predictions=40 export_top_n=1 export_file_format=null skip_existing=true relax_method_ligands_post_ranking=true resume=true cuda_device_index=0 ensemble_methods='[diffdock, dynamicbind, neuralplexer, rfaa, tulip, vina]' ensemble_benchmarking=true ensemble_benchmarking_dataset=astex_diverse ensemble_ranking_method=consensus ensemble_benchmarking_repeat_index=1\n...\n# benchmark using the DockGen dataset e.g., after generating 40 complexes per target with each method\npython3 multicom_ligand/models/ensemble_generation.py input_csv_filepath=data/test_cases/dockgen/ensemble_inputs.csv output_dir=data/test_cases/dockgen/top_consensus_ensemble_predictions_1 max_method_predictions=40 export_top_n=1 export_file_format=null skip_existing=true relax_method_ligands_post_ranking=false resume=true cuda_device_index=0 ensemble_methods='[diffdock, dynamicbind, neuralplexer, rfaa, vina]' ensemble_benchmarking=true ensemble_benchmarking_dataset=dockgen ensemble_ranking_method=consensus ensemble_benchmarking_repeat_index=1\npython3 multicom_ligand/models/ensemble_generation.py input_csv_filepath=data/test_cases/dockgen/ensemble_inputs.csv output_dir=data/test_cases/dockgen/top_consensus_ensemble_predictions_1 max_method_predictions=40 export_top_n=1 export_file_format=null skip_existing=true relax_method_ligands_post_ranking=true resume=true cuda_device_index=0 ensemble_methods='[diffdock, dynamicbind, neuralplexer, rfaa, vina]' ensemble_benchmarking=true ensemble_benchmarking_dataset=dockgen ensemble_ranking_method=consensus ensemble_benchmarking_repeat_index=1\n...\n# benchmark using the CASP15 dataset e.g., after generating 40 complexes per target with each method\npython3 multicom_ligand/models/ensemble_generation.py input_csv_filepath=data/test_cases/casp15/ensemble_inputs.csv output_dir=data/test_cases/casp15/top_consensus_ensemble_predictions_1 combine_casp_output_files=true max_method_predictions=40 export_top_n=5 export_file_format=casp15 skip_existing=true relax_method_ligands_post_ranking=false resume=true cuda_device_index=0 ensemble_methods='[diffdock, dynamicbind, neuralplexer, rfaa, tulip, vina]' ensemble_benchmarking=true ensemble_benchmarking_dataset=casp15 ensemble_ranking_method=consensus ensemble_benchmarking_repeat_index=1\npython3 multicom_ligand/models/ensemble_generation.py input_csv_filepath=data/test_cases/casp15/ensemble_inputs.csv output_dir=data/test_cases/casp15/top_consensus_ensemble_predictions_1 combine_casp_output_files=true max_method_predictions=40 export_top_n=5 export_file_format=casp15 skip_existing=true relax_method_ligands_post_ranking=true resume=true cuda_device_index=0 ensemble_methods='[diffdock, dynamicbind, neuralplexer, rfaa, tulip, vina]' ensemble_benchmarking=true ensemble_benchmarking_dataset=casp15 ensemble_ranking_method=consensus ensemble_benchmarking_repeat_index=1\n...\n# analyze benchmarking results for the PoseBusters Benchmark dataset\npython3 multicom_ligand/analysis/inference_analysis.py method=ensemble dataset=posebusters_benchmark repeat_index=1\n...\n# analyze benchmarking results for the Astex Diverse dataset\npython3 multicom_ligand/analysis/inference_analysis.py method=ensemble dataset=astex_diverse repeat_index=1\n...\n# analyze benchmarking results for the DockGen dataset\npython3 multicom_ligand/analysis/inference_analysis.py method=ensemble dataset=dockgen repeat_index=1\n...\n# analyze benchmarking results for the CASP15 dataset\npython3 multicom_ligand/analysis/inference_analysis_casp.py method=ensemble dataset=casp15 ensemble_ranking_method=consensus repeat_index=1\n...\n```\n\nTo benchmark ensemble ranking using the above commands, you must have already run the corresponding `*_inference.py` script for each method described in the section [How to run inference with individual methods](#how-to-run-inference-with-individual-methods) (with the exception of `FABind`, which will not referenced during CASP15 benchmarking)\n\n**NOTE**: In addition to having `consensus` as an available value for `ensemble_ranking_method`, one can also set `ensemble_ranking_method=ff` to have the method ensemble's top-ranked predictions selected using the criterion of \"minimum (molecular dynamics) force field energy\" (albeit while incurring a very large runtime complexity)\n\n\u003c/details\u003e\n\n## How to create comparative plots of inference results\n\n\u003cdetails\u003e\n\nExecute (and customize as desired) notebooks to prepare paper-ready result plots\n\n```bash\njupyter notebook notebooks/posebusters_astex_inference_results_plotting.ipynb\njupyter notebook notebooks/posebusters_pocket_only_inference_results_plotting.ipynb\njupyter notebook notebooks/dockgen_inference_results_plotting.ipynb\njupyter notebook notebooks/casp15_inference_results_plotting.ipynb\n```\n\n\u003c/details\u003e\n\n## For developers\n\n\u003cdetails\u003e\n\n### Dependency management\n\nWe use `mamba` to manage the project's underlying dependencies. Notably, to update the dependencies listed in a particular `environments/*_environment.yml` file:\n\n```bash\nmamba env export \u003e env.yaml # e.g., run this after installing new dependencies locally within a given `conda` environment\ndiff environments/multicom_ligand_environment.yaml env.yaml # note the differences and copy accepted changes back into e.g., `environments/multicom_ligand_environment.yaml`\nrm env.yaml # clean up temporary environment file\n```\n\n### Code formatting\n\nWe use `pre-commit` to automatically format the project's code. To set up `pre-commit` (one time only) for automatic code linting and formatting upon each execution of `git commit`:\n\n```bash\npre-commit install\n```\n\nTo manually reformat all files in the project as desired:\n\n```bash\npre-commit run -a\n```\n\n### Documentation\n\nWe `sphinx` to maintain the project's code documentation. To build a local version of the project's `sphinx` documentation web pages:\n\n```bash\n# assuming you are located in the `MULTICOM_ligand` top-level directory\npip install -r docs/.docs.requirements # one-time only\nrm -rf docs/build/ \u0026\u0026 sphinx-build docs/source/ docs/build/ # NOTE: errors can safely be ignored\n```\n\n\u003c/details\u003e\n\n## Acknowledgements\n\n`MULTICOM_ligand` builds upon the source code and data from the following projects:\n\n- [AutoDock-Vina](https://github.com/ccsb-scripps/AutoDock-Vina)\n- [casp15_ligand](https://git.scicore.unibas.ch/schwede/casp15_ligand)\n- [DiffDock](https://github.com/gcorso/DiffDock)\n- [FABind](https://github.com/QizhiPei/FABind)\n- [DynamicBind](https://github.com/luwei0917/DynamicBind)\n- [FlowDock](https://github.com/BioinfoMachineLearning/FlowDock)\n- [lightning-hydra-template](https://github.com/ashleve/lightning-hydra-template)\n- [NeuralPLexer](https://github.com/zrqiao/NeuralPLexer)\n- [posebusters](https://github.com/maabuu/posebusters)\n- [posebusters_em](https://github.com/maabuu/posebusters_em)\n- [PoseBench](https://github.com/BioinfoMachineLearning/PoseBench)\n- [ProteinWorkshop](https://github.com/a-r-j/ProteinWorkshop)\n- [RoseTTAFold-All-Atom](https://github.com/baker-laboratory/RoseTTAFold-All-Atom)\n- [tulip](https://github.com/BioinfoMachineLearning/tulip)\n\nWe thank all their contributors and maintainers!\n\n## Citing this work\n\nIf you use the code or benchmark method predictions associated with this repository or otherwise find this work useful, please cite:\n\n```bibtex\n@article{morehead2025protein,\n  title={Protein-Ligand Structure and Affinity Prediction in CASP16 Using a Geometric Deep Learning Ensemble and Flow Matching},\n  author={Morehead, Alex and Liu, Jian and Neupane, Pawan and Giri, Nabin and Cheng, Jianlin},\n  journal={Proteins: Structure, Function, and Bioinformatics},\n  year={2025},\n  publisher={Wiley Online Library},\n  note={presented at CASP16 as a top-5 ligand prediction method},\n}\n```\n\n## Bonus\n\n\u003cdetails\u003e\n\nLastly, thanks to Stable Diffusion for generating this quaint representation of what my brain looked like after assembling this codebase. 💣\n\n\u003cdiv align=\"center\"\u003e\n\n\u003cimg src=\"./img/WorkBench.jpeg\" width=\"600\"\u003e\n\n\u003c/div\u003e\n\n\u003c/details\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbioinfomachinelearning%2Fmulticom_ligand","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbioinfomachinelearning%2Fmulticom_ligand","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbioinfomachinelearning%2Fmulticom_ligand/lists"}