Repository files navigation

AF2Dock

Preprint: https://doi.org/10.1101/2025.11.28.691195

Installation

First, install openfold following instructions on this page. Current repo is tested with this version of openfold.

(Notes from Jan 2026: I needed to remove flash-attn from the environment.yml file to successfully set up the enviroment.)

Then, in the enviroment with openfold, install AF2Dock as follows:

git clone https://github.com/Graylab/AF2Dock.git
cd AF2Dock
pip install .

If you run into issue installing fastpdb (required by pinder), follow instructions on the pinderrepo page to download the rust toolchain.

To use cuEquivariance, install additional packages as follows at the end:

pip install cuequivariance_ops_torch_cu12 cuequivariance_torch

(Notes from Jan 2026: Currently, triangle_multiplicative_updates from cuEquivariance does not work out of the box. It gives me error on typing, as pytorch 2.5 does not seem to support using list for typing. I needed to manually patch the triangle_multiplicative_update.py and attention_pair_bias_torch.py files in cuequivariance_ops_torch by replacing list typing with List and add from typing import List at the start of the files for it to work. Related issue.)

Inference

Model weights are uploaded to Zenodo. They can be downloaded with the scripts/download_weights.py script as follows:

python scripts/download_weights.py --model-name AF2Dock_base

Run prediction with a single set of input structures:

python predict.py \
output_dir \
--rec_struc_path path/to/receptor/structure \
--lig_struc_path path/to/ligand/structure \
--num_samples 40 \
--num_steps 10 \
--checkpoint_path path/to/model/weights

Or supply the input as a csv file (example in data/example_input):

python predict.py \
output_dir \
--input_csv path/to/csv/file \
--num_samples 40 \
--num_steps 10 \
--checkpoint_path path/to/model/weights

When using input strucutures that have missing residues, an a3m file containing the alignment of resolved residues with the full sequence for each chain is required as an input. And example is available as data/example_input/ab_8tbq_1_r_pred_wo_cdrh3.a3m.

Code for computing success rates and bootstrapping are available as jupyter notebooks in notebooks. To run tests on the PINDER-AF2 benchmark, first cache the ESM embeddings using scripts/compute_pinder_ESM_embeddings.py and then run scripts/test_pinder.py. To run predictions and tests with single-sequence AF-M, use scripts/predict_afm.py and scripts/test_pinder_afm.py.

Training

To train using the PINDER training set, first cache the ESM embeddings using scripts/compute_pinder_ESM_embeddings.py and obtain the three-body interactions using scripts/find_train_three_body_interactions.py.

Then train as follows (training from scratch in this case):

python train.py \
output_dir \
--cached_esm_embedding_folder path/to/cached/esm \
--pinder_entity_seq_cluster_pkl data/pinder_entity_seq_cluster.pkl \
--three_body_interactions_pkl path/to/three/body/results \
--resume_from_jax_params path/to/afm/weights \
--af_params freeze \
--list_of_samples_to_exclude data/train_samples_to_exclude.txt \
--gpus 4 \
--num_nodes 1 \
--precision bf16 \
--max_epochs 100 \
--log_every_n_steps 8 \
--accumulate_grad_batches 16 \
--val_check_interval 0.1 \
--limit_val_batches 0.15 \
--num_sanity_val_steps 2 \

Certain settings such as the percentages of holo/apo/predicted structures need to be specified in a json file with the --experiment_config_json argument. For instance, use the following json file for completely holo inputs:

{
"data.train.pinder_cate_prob.holo": 1.0,
"data.train.pinder_cate_prob.apo": 0.0,
"data.train.pinder_cate_prob.pred": 0.0
}

About

No description, website, or topics provided.

Resources

Stars

15 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

AF2Dock

Preprint: https://doi.org/10.1101/2025.11.28.691195

Installation

First, install openfold following instructions on this page. Current repo is tested with this version of openfold.

(Notes from Jan 2026: I needed to remove flash-attn from the environment.yml file to successfully set up the enviroment.)

Then, in the enviroment with openfold, install AF2Dock as follows:

git clone https://github.com/Graylab/AF2Dock.git
cd AF2Dock
pip install .

If you run into issue installing fastpdb (required by pinder), follow instructions on the pinderrepo page to download the rust toolchain.

To use cuEquivariance, install additional packages as follows at the end:

pip install cuequivariance_ops_torch_cu12 cuequivariance_torch

(Notes from Jan 2026: Currently, triangle_multiplicative_updates from cuEquivariance does not work out of the box. It gives me error on typing, as pytorch 2.5 does not seem to support using list for typing. I needed to manually patch the triangle_multiplicative_update.py and attention_pair_bias_torch.py files in cuequivariance_ops_torch by replacing list typing with List and add from typing import List at the start of the files for it to work. Related issue.)

Inference

Model weights are uploaded to Zenodo. They can be downloaded with the scripts/download_weights.py script as follows:

python scripts/download_weights.py --model-name AF2Dock_base

Run prediction with a single set of input structures:

python predict.py \
output_dir \
--rec_struc_path path/to/receptor/structure \
--lig_struc_path path/to/ligand/structure \
--num_samples 40 \
--num_steps 10 \
--checkpoint_path path/to/model/weights

Or supply the input as a csv file (example in data/example_input):

python predict.py \
output_dir \
--input_csv path/to/csv/file \
--num_samples 40 \
--num_steps 10 \
--checkpoint_path path/to/model/weights

When using input strucutures that have missing residues, an a3m file containing the alignment of resolved residues with the full sequence for each chain is required as an input. And example is available as data/example_input/ab_8tbq_1_r_pred_wo_cdrh3.a3m.

Code for computing success rates and bootstrapping are available as jupyter notebooks in notebooks. To run tests on the PINDER-AF2 benchmark, first cache the ESM embeddings using scripts/compute_pinder_ESM_embeddings.py and then run scripts/test_pinder.py. To run predictions and tests with single-sequence AF-M, use scripts/predict_afm.py and scripts/test_pinder_afm.py.

Training

To train using the PINDER training set, first cache the ESM embeddings using scripts/compute_pinder_ESM_embeddings.py and obtain the three-body interactions using scripts/find_train_three_body_interactions.py.

Then train as follows (training from scratch in this case):

python train.py \
output_dir \
--cached_esm_embedding_folder path/to/cached/esm \
--pinder_entity_seq_cluster_pkl data/pinder_entity_seq_cluster.pkl \
--three_body_interactions_pkl path/to/three/body/results \
--resume_from_jax_params path/to/afm/weights \
--af_params freeze \
--list_of_samples_to_exclude data/train_samples_to_exclude.txt \
--gpus 4 \
--num_nodes 1 \
--precision bf16 \
--max_epochs 100 \
--log_every_n_steps 8 \
--accumulate_grad_batches 16 \
--val_check_interval 0.1 \
--limit_val_batches 0.15 \
--num_sanity_val_steps 2 \

Certain settings such as the percentages of holo/apo/predicted structures need to be specified in a json file with the --experiment_config_json argument. For instance, use the following json file for completely holo inputs:

{
"data.train.pinder_cate_prob.holo": 1.0,
"data.train.pinder_cate_prob.apo": 0.0,
"data.train.pinder_cate_prob.pred": 0.0
}

About

No description, website, or topics provided.

Resources

Stars

15 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

AF2Dock

Preprint: https://doi.org/10.1101/2025.11.28.691195

Installation

First, install openfold following instructions on this page. Current repo is tested with this version of openfold.

(Notes from Jan 2026: I needed to remove flash-attn from the environment.yml file to successfully set up the enviroment.)

Then, in the enviroment with openfold, install AF2Dock as follows:

git clone https://github.com/Graylab/AF2Dock.git
cd AF2Dock
pip install .

If you run into issue installing fastpdb (required by pinder), follow instructions on the pinderrepo page to download the rust toolchain.

To use cuEquivariance, install additional packages as follows at the end:

pip install cuequivariance_ops_torch_cu12 cuequivariance_torch

(Notes from Jan 2026: Currently, triangle_multiplicative_updates from cuEquivariance does not work out of the box. It gives me error on typing, as pytorch 2.5 does not seem to support using list for typing. I needed to manually patch the triangle_multiplicative_update.py and attention_pair_bias_torch.py files in cuequivariance_ops_torch by replacing list typing with List and add from typing import List at the start of the files for it to work. Related issue.)

Inference

Model weights are uploaded to Zenodo. They can be downloaded with the scripts/download_weights.py script as follows:

python scripts/download_weights.py --model-name AF2Dock_base

Run prediction with a single set of input structures:

python predict.py \
output_dir \
--rec_struc_path path/to/receptor/structure \
--lig_struc_path path/to/ligand/structure \
--num_samples 40 \
--num_steps 10 \
--checkpoint_path path/to/model/weights

Or supply the input as a csv file (example in data/example_input):

python predict.py \
output_dir \
--input_csv path/to/csv/file \
--num_samples 40 \
--num_steps 10 \
--checkpoint_path path/to/model/weights

When using input strucutures that have missing residues, an a3m file containing the alignment of resolved residues with the full sequence for each chain is required as an input. And example is available as data/example_input/ab_8tbq_1_r_pred_wo_cdrh3.a3m.

Code for computing success rates and bootstrapping are available as jupyter notebooks in notebooks. To run tests on the PINDER-AF2 benchmark, first cache the ESM embeddings using scripts/compute_pinder_ESM_embeddings.py and then run scripts/test_pinder.py. To run predictions and tests with single-sequence AF-M, use scripts/predict_afm.py and scripts/test_pinder_afm.py.

Training

To train using the PINDER training set, first cache the ESM embeddings using scripts/compute_pinder_ESM_embeddings.py and obtain the three-body interactions using scripts/find_train_three_body_interactions.py.

Then train as follows (training from scratch in this case):

python train.py \
output_dir \
--cached_esm_embedding_folder path/to/cached/esm \
--pinder_entity_seq_cluster_pkl data/pinder_entity_seq_cluster.pkl \
--three_body_interactions_pkl path/to/three/body/results \
--resume_from_jax_params path/to/afm/weights \
--af_params freeze \
--list_of_samples_to_exclude data/train_samples_to_exclude.txt \
--gpus 4 \
--num_nodes 1 \
--precision bf16 \
--max_epochs 100 \
--log_every_n_steps 8 \
--accumulate_grad_batches 16 \
--val_check_interval 0.1 \
--limit_val_batches 0.15 \
--num_sanity_val_steps 2 \

Certain settings such as the percentages of holo/apo/predicted structures need to be specified in a json file with the --experiment_config_json argument. For instance, use the following json file for completely holo inputs:

{
"data.train.pinder_cate_prob.holo": 1.0,
"data.train.pinder_cate_prob.apo": 0.0,
"data.train.pinder_cate_prob.pred": 0.0
}

About

No description, website, or topics provided.

Resources

Stars

15 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

AF2Dock

Preprint: https://doi.org/10.1101/2025.11.28.691195

Installation

First, install openfold following instructions on this page. Current repo is tested with this version of openfold.

(Notes from Jan 2026: I needed to remove flash-attn from the environment.yml file to successfully set up the enviroment.)

Then, in the enviroment with openfold, install AF2Dock as follows:

git clone https://github.com/Graylab/AF2Dock.git
cd AF2Dock
pip install .

If you run into issue installing fastpdb (required by pinder), follow instructions on the pinderrepo page to download the rust toolchain.

To use cuEquivariance, install additional packages as follows at the end:

pip install cuequivariance_ops_torch_cu12 cuequivariance_torch

(Notes from Jan 2026: Currently, triangle_multiplicative_updates from cuEquivariance does not work out of the box. It gives me error on typing, as pytorch 2.5 does not seem to support using list for typing. I needed to manually patch the triangle_multiplicative_update.py and attention_pair_bias_torch.py files in cuequivariance_ops_torch by replacing list typing with List and add from typing import List at the start of the files for it to work. Related issue.)

Inference

Model weights are uploaded to Zenodo. They can be downloaded with the scripts/download_weights.py script as follows:

python scripts/download_weights.py --model-name AF2Dock_base

Run prediction with a single set of input structures:

python predict.py \
output_dir \
--rec_struc_path path/to/receptor/structure \
--lig_struc_path path/to/ligand/structure \
--num_samples 40 \
--num_steps 10 \
--checkpoint_path path/to/model/weights

Or supply the input as a csv file (example in data/example_input):

python predict.py \
output_dir \
--input_csv path/to/csv/file \
--num_samples 40 \
--num_steps 10 \
--checkpoint_path path/to/model/weights

When using input strucutures that have missing residues, an a3m file containing the alignment of resolved residues with the full sequence for each chain is required as an input. And example is available as data/example_input/ab_8tbq_1_r_pred_wo_cdrh3.a3m.

Code for computing success rates and bootstrapping are available as jupyter notebooks in notebooks. To run tests on the PINDER-AF2 benchmark, first cache the ESM embeddings using scripts/compute_pinder_ESM_embeddings.py and then run scripts/test_pinder.py. To run predictions and tests with single-sequence AF-M, use scripts/predict_afm.py and scripts/test_pinder_afm.py.

Training

To train using the PINDER training set, first cache the ESM embeddings using scripts/compute_pinder_ESM_embeddings.py and obtain the three-body interactions using scripts/find_train_three_body_interactions.py.

Then train as follows (training from scratch in this case):

python train.py \
output_dir \
--cached_esm_embedding_folder path/to/cached/esm \
--pinder_entity_seq_cluster_pkl data/pinder_entity_seq_cluster.pkl \
--three_body_interactions_pkl path/to/three/body/results \
--resume_from_jax_params path/to/afm/weights \
--af_params freeze \
--list_of_samples_to_exclude data/train_samples_to_exclude.txt \
--gpus 4 \
--num_nodes 1 \
--precision bf16 \
--max_epochs 100 \
--log_every_n_steps 8 \
--accumulate_grad_batches 16 \
--val_check_interval 0.1 \
--limit_val_batches 0.15 \
--num_sanity_val_steps 2 \

Certain settings such as the percentages of holo/apo/predicted structures need to be specified in a json file with the --experiment_config_json argument. For instance, use the following json file for completely holo inputs:

{
"data.train.pinder_cate_prob.holo": 1.0,
"data.train.pinder_cate_prob.apo": 0.0,
"data.train.pinder_cate_prob.pred": 0.0
}

About

No description, website, or topics provided.

Resources

Stars

15 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

AF2Dock

Preprint: https://doi.org/10.1101/2025.11.28.691195

Installation

First, install openfold following instructions on this page. Current repo is tested with this version of openfold.

(Notes from Jan 2026: I needed to remove flash-attn from the environment.yml file to successfully set up the enviroment.)

Then, in the enviroment with openfold, install AF2Dock as follows:

git clone https://github.com/Graylab/AF2Dock.git
cd AF2Dock
pip install .

If you run into issue installing fastpdb (required by pinder), follow instructions on the pinderrepo page to download the rust toolchain.

To use cuEquivariance, install additional packages as follows at the end:

pip install cuequivariance_ops_torch_cu12 cuequivariance_torch

(Notes from Jan 2026: Currently, triangle_multiplicative_updates from cuEquivariance does not work out of the box. It gives me error on typing, as pytorch 2.5 does not seem to support using list for typing. I needed to manually patch the triangle_multiplicative_update.py and attention_pair_bias_torch.py files in cuequivariance_ops_torch by replacing list typing with List and add from typing import List at the start of the files for it to work. Related issue.)

Inference

Model weights are uploaded to Zenodo. They can be downloaded with the scripts/download_weights.py script as follows:

python scripts/download_weights.py --model-name AF2Dock_base

Run prediction with a single set of input structures:

python predict.py \
output_dir \
--rec_struc_path path/to/receptor/structure \
--lig_struc_path path/to/ligand/structure \
--num_samples 40 \
--num_steps 10 \
--checkpoint_path path/to/model/weights

Or supply the input as a csv file (example in data/example_input):

python predict.py \
output_dir \
--input_csv path/to/csv/file \
--num_samples 40 \
--num_steps 10 \
--checkpoint_path path/to/model/weights

When using input strucutures that have missing residues, an a3m file containing the alignment of resolved residues with the full sequence for each chain is required as an input. And example is available as data/example_input/ab_8tbq_1_r_pred_wo_cdrh3.a3m.

Code for computing success rates and bootstrapping are available as jupyter notebooks in notebooks. To run tests on the PINDER-AF2 benchmark, first cache the ESM embeddings using scripts/compute_pinder_ESM_embeddings.py and then run scripts/test_pinder.py. To run predictions and tests with single-sequence AF-M, use scripts/predict_afm.py and scripts/test_pinder_afm.py.

Training

To train using the PINDER training set, first cache the ESM embeddings using scripts/compute_pinder_ESM_embeddings.py and obtain the three-body interactions using scripts/find_train_three_body_interactions.py.

Then train as follows (training from scratch in this case):

python train.py \
output_dir \
--cached_esm_embedding_folder path/to/cached/esm \
--pinder_entity_seq_cluster_pkl data/pinder_entity_seq_cluster.pkl \
--three_body_interactions_pkl path/to/three/body/results \
--resume_from_jax_params path/to/afm/weights \
--af_params freeze \
--list_of_samples_to_exclude data/train_samples_to_exclude.txt \
--gpus 4 \
--num_nodes 1 \
--precision bf16 \
--max_epochs 100 \
--log_every_n_steps 8 \
--accumulate_grad_batches 16 \
--val_check_interval 0.1 \
--limit_val_batches 0.15 \
--num_sanity_val_steps 2 \

Certain settings such as the percentages of holo/apo/predicted structures need to be specified in a json file with the --experiment_config_json argument. For instance, use the following json file for completely holo inputs:

{
"data.train.pinder_cate_prob.holo": 1.0,
"data.train.pinder_cate_prob.apo": 0.0,
"data.train.pinder_cate_prob.pred": 0.0
}

About

No description, website, or topics provided.

Resources

Stars

15 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

AF2Dock

Preprint: https://doi.org/10.1101/2025.11.28.691195

Installation

First, install openfold following instructions on this page. Current repo is tested with this version of openfold.

(Notes from Jan 2026: I needed to remove flash-attn from the environment.yml file to successfully set up the enviroment.)

Then, in the enviroment with openfold, install AF2Dock as follows:

git clone https://github.com/Graylab/AF2Dock.git
cd AF2Dock
pip install .

If you run into issue installing fastpdb (required by pinder), follow instructions on the pinderrepo page to download the rust toolchain.

To use cuEquivariance, install additional packages as follows at the end:

pip install cuequivariance_ops_torch_cu12 cuequivariance_torch

(Notes from Jan 2026: Currently, triangle_multiplicative_updates from cuEquivariance does not work out of the box. It gives me error on typing, as pytorch 2.5 does not seem to support using list for typing. I needed to manually patch the triangle_multiplicative_update.py and attention_pair_bias_torch.py files in cuequivariance_ops_torch by replacing list typing with List and add from typing import List at the start of the files for it to work. Related issue.)

Inference

Model weights are uploaded to Zenodo. They can be downloaded with the scripts/download_weights.py script as follows:

python scripts/download_weights.py --model-name AF2Dock_base

Run prediction with a single set of input structures:

python predict.py \
output_dir \
--rec_struc_path path/to/receptor/structure \
--lig_struc_path path/to/ligand/structure \
--num_samples 40 \
--num_steps 10 \
--checkpoint_path path/to/model/weights

Or supply the input as a csv file (example in data/example_input):

python predict.py \
output_dir \
--input_csv path/to/csv/file \
--num_samples 40 \
--num_steps 10 \
--checkpoint_path path/to/model/weights

When using input strucutures that have missing residues, an a3m file containing the alignment of resolved residues with the full sequence for each chain is required as an input. And example is available as data/example_input/ab_8tbq_1_r_pred_wo_cdrh3.a3m.

Code for computing success rates and bootstrapping are available as jupyter notebooks in notebooks. To run tests on the PINDER-AF2 benchmark, first cache the ESM embeddings using scripts/compute_pinder_ESM_embeddings.py and then run scripts/test_pinder.py. To run predictions and tests with single-sequence AF-M, use scripts/predict_afm.py and scripts/test_pinder_afm.py.

Training

To train using the PINDER training set, first cache the ESM embeddings using scripts/compute_pinder_ESM_embeddings.py and obtain the three-body interactions using scripts/find_train_three_body_interactions.py.

Then train as follows (training from scratch in this case):

python train.py \
output_dir \
--cached_esm_embedding_folder path/to/cached/esm \
--pinder_entity_seq_cluster_pkl data/pinder_entity_seq_cluster.pkl \
--three_body_interactions_pkl path/to/three/body/results \
--resume_from_jax_params path/to/afm/weights \
--af_params freeze \
--list_of_samples_to_exclude data/train_samples_to_exclude.txt \
--gpus 4 \
--num_nodes 1 \
--precision bf16 \
--max_epochs 100 \
--log_every_n_steps 8 \
--accumulate_grad_batches 16 \
--val_check_interval 0.1 \
--limit_val_batches 0.15 \
--num_sanity_val_steps 2 \

Certain settings such as the percentages of holo/apo/predicted structures need to be specified in a json file with the --experiment_config_json argument. For instance, use the following json file for completely holo inputs:

{
"data.train.pinder_cate_prob.holo": 1.0,
"data.train.pinder_cate_prob.apo": 0.0,
"data.train.pinder_cate_prob.pred": 0.0
}

About

No description, website, or topics provided.

Resources

Stars

15 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

AF2Dock

Preprint: https://doi.org/10.1101/2025.11.28.691195

Installation

First, install openfold following instructions on this page. Current repo is tested with this version of openfold.

(Notes from Jan 2026: I needed to remove flash-attn from the environment.yml file to successfully set up the enviroment.)

Then, in the enviroment with openfold, install AF2Dock as follows:

git clone https://github.com/Graylab/AF2Dock.git
cd AF2Dock
pip install .

If you run into issue installing fastpdb (required by pinder), follow instructions on the pinderrepo page to download the rust toolchain.

To use cuEquivariance, install additional packages as follows at the end:

pip install cuequivariance_ops_torch_cu12 cuequivariance_torch

(Notes from Jan 2026: Currently, triangle_multiplicative_updates from cuEquivariance does not work out of the box. It gives me error on typing, as pytorch 2.5 does not seem to support using list for typing. I needed to manually patch the triangle_multiplicative_update.py and attention_pair_bias_torch.py files in cuequivariance_ops_torch by replacing list typing with List and add from typing import List at the start of the files for it to work. Related issue.)

Inference

Model weights are uploaded to Zenodo. They can be downloaded with the scripts/download_weights.py script as follows:

python scripts/download_weights.py --model-name AF2Dock_base

Run prediction with a single set of input structures:

python predict.py \
output_dir \
--rec_struc_path path/to/receptor/structure \
--lig_struc_path path/to/ligand/structure \
--num_samples 40 \
--num_steps 10 \
--checkpoint_path path/to/model/weights

Or supply the input as a csv file (example in data/example_input):

python predict.py \
output_dir \
--input_csv path/to/csv/file \
--num_samples 40 \
--num_steps 10 \
--checkpoint_path path/to/model/weights

When using input strucutures that have missing residues, an a3m file containing the alignment of resolved residues with the full sequence for each chain is required as an input. And example is available as data/example_input/ab_8tbq_1_r_pred_wo_cdrh3.a3m.

Code for computing success rates and bootstrapping are available as jupyter notebooks in notebooks. To run tests on the PINDER-AF2 benchmark, first cache the ESM embeddings using scripts/compute_pinder_ESM_embeddings.py and then run scripts/test_pinder.py. To run predictions and tests with single-sequence AF-M, use scripts/predict_afm.py and scripts/test_pinder_afm.py.

Training

To train using the PINDER training set, first cache the ESM embeddings using scripts/compute_pinder_ESM_embeddings.py and obtain the three-body interactions using scripts/find_train_three_body_interactions.py.

Then train as follows (training from scratch in this case):

python train.py \
output_dir \
--cached_esm_embedding_folder path/to/cached/esm \
--pinder_entity_seq_cluster_pkl data/pinder_entity_seq_cluster.pkl \
--three_body_interactions_pkl path/to/three/body/results \
--resume_from_jax_params path/to/afm/weights \
--af_params freeze \
--list_of_samples_to_exclude data/train_samples_to_exclude.txt \
--gpus 4 \
--num_nodes 1 \
--precision bf16 \
--max_epochs 100 \
--log_every_n_steps 8 \
--accumulate_grad_batches 16 \
--val_check_interval 0.1 \
--limit_val_batches 0.15 \
--num_sanity_val_steps 2 \

Certain settings such as the percentages of holo/apo/predicted structures need to be specified in a json file with the --experiment_config_json argument. For instance, use the following json file for completely holo inputs:

{
"data.train.pinder_cate_prob.holo": 1.0,
"data.train.pinder_cate_prob.apo": 0.0,
"data.train.pinder_cate_prob.pred": 0.0
}

About

No description, website, or topics provided.

Resources

Stars

15 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

AF2Dock

Preprint: https://doi.org/10.1101/2025.11.28.691195

Installation

First, install openfold following instructions on this page. Current repo is tested with this version of openfold.

(Notes from Jan 2026: I needed to remove flash-attn from the environment.yml file to successfully set up the enviroment.)

Then, in the enviroment with openfold, install AF2Dock as follows:

git clone https://github.com/Graylab/AF2Dock.git
cd AF2Dock
pip install .

If you run into issue installing fastpdb (required by pinder), follow instructions on the pinderrepo page to download the rust toolchain.

To use cuEquivariance, install additional packages as follows at the end:

pip install cuequivariance_ops_torch_cu12 cuequivariance_torch

(Notes from Jan 2026: Currently, triangle_multiplicative_updates from cuEquivariance does not work out of the box. It gives me error on typing, as pytorch 2.5 does not seem to support using list for typing. I needed to manually patch the triangle_multiplicative_update.py and attention_pair_bias_torch.py files in cuequivariance_ops_torch by replacing list typing with List and add from typing import List at the start of the files for it to work. Related issue.)

Inference

Model weights are uploaded to Zenodo. They can be downloaded with the scripts/download_weights.py script as follows:

python scripts/download_weights.py --model-name AF2Dock_base

Run prediction with a single set of input structures:

python predict.py \
output_dir \
--rec_struc_path path/to/receptor/structure \
--lig_struc_path path/to/ligand/structure \
--num_samples 40 \
--num_steps 10 \
--checkpoint_path path/to/model/weights

Or supply the input as a csv file (example in data/example_input):

python predict.py \
output_dir \
--input_csv path/to/csv/file \
--num_samples 40 \
--num_steps 10 \
--checkpoint_path path/to/model/weights

When using input strucutures that have missing residues, an a3m file containing the alignment of resolved residues with the full sequence for each chain is required as an input. And example is available as data/example_input/ab_8tbq_1_r_pred_wo_cdrh3.a3m.

Code for computing success rates and bootstrapping are available as jupyter notebooks in notebooks. To run tests on the PINDER-AF2 benchmark, first cache the ESM embeddings using scripts/compute_pinder_ESM_embeddings.py and then run scripts/test_pinder.py. To run predictions and tests with single-sequence AF-M, use scripts/predict_afm.py and scripts/test_pinder_afm.py.

Training

To train using the PINDER training set, first cache the ESM embeddings using scripts/compute_pinder_ESM_embeddings.py and obtain the three-body interactions using scripts/find_train_three_body_interactions.py.

Then train as follows (training from scratch in this case):

python train.py \
output_dir \
--cached_esm_embedding_folder path/to/cached/esm \
--pinder_entity_seq_cluster_pkl data/pinder_entity_seq_cluster.pkl \
--three_body_interactions_pkl path/to/three/body/results \
--resume_from_jax_params path/to/afm/weights \
--af_params freeze \
--list_of_samples_to_exclude data/train_samples_to_exclude.txt \
--gpus 4 \
--num_nodes 1 \
--precision bf16 \
--max_epochs 100 \
--log_every_n_steps 8 \
--accumulate_grad_batches 16 \
--val_check_interval 0.1 \
--limit_val_batches 0.15 \
--num_sanity_val_steps 2 \

Certain settings such as the percentages of holo/apo/predicted structures need to be specified in a json file with the --experiment_config_json argument. For instance, use the following json file for completely holo inputs:

{
"data.train.pinder_cate_prob.holo": 1.0,
"data.train.pinder_cate_prob.apo": 0.0,
"data.train.pinder_cate_prob.pred": 0.0
}

About

No description, website, or topics provided.

Resources

Stars

15 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages