All workflows

Molecular dynamics

Protein-Ligand Docking (Cluster90 Binding Site)

Dock Imatinib into p38-alpha MAP kinase with AutoDock Vina. A PDB Cluster90 analysis of homologous structures locates the binding site and defines the docking box.

AutoDock VinaOpenBabelBioExcel biobbDockerconda

What this workflow does

This workflow docks one ligand against one protein target with AutoDock Vina. The target is p38-α MAP kinase (PDB: 3HEC). The ligand is Imatinib, the FDA-approved kinase inhibitor with PDB ligand code STI.

The workflow does not assume the binding site. It downloads a PDB Cluster90 collection of structures that share at least 90% sequence identity with the target. It then finds where co-crystallized ligands cluster across those homologs. That consensus position becomes the binding site, and the workflow builds a cavity box around it.

The workflow then prepares both partners for docking. It converts the ligand from SDF to PDB to PDBQT with OpenBabel. It protonates the receptor and writes it as PDBQT. AutoDock Vina then docks the ligand into the box. The final stages extract the top pose and merge it with the receptor into one complex PDB.

The compute problem

Docking has an asymmetric cost profile that a single machine handles badly.

The setup stages are network bound. fetch_pdb, pdb_cluster_zip, and ideal_sdf all wait on the RCSB. pdb_cluster_zip downloads a whole homolog collection. The wall time here is latency, not FLOPs.

The bindingsite and box stages read the collection and do geometry. They need one CPU core and a few seconds.

The autodock_vina_run stage is the compute. Vina is CPU-parallel. It scales with core count and does not use a GPU. One ligand against one box takes seconds. A screening library of 100,000 ligands against the same box is the real use case, and it wants a many-core node or a cluster queue.

The conversion stages after the docking are trivial. They format text.

How Horus solves it

Horus assigns an executor per stage. Keep the download and conversion stages local, where they cost nothing but network wait. Send autodock_vina_run to a many-core node. You change one executor: field. The runtime.command string does not change.

This routing matters more here than in an MD workflow. Vina wants cores, not a GPU. So the right target for a docking screen is a large CPU node, not the GPU box you use for mdrun. Horus lets the same collection of workflows use both, without two different runtimes.

The biobb_vs package has no osx-arm64 conda package. On Apple Silicon, the binding site, box, and Vina stages run inside a quay.io/biocontainers/biobb_vs linux/amd64 image through the Docker executor. Horus pulls the image on the first run. The OpenBabel and biobb_io stages keep running natively in the conda environment, because those packages have arm64 builds.

Horus also caches finished stages. The Cluster90 download does not repeat when you change the ligand code and rerun.

Pipeline

create_results_folder      Create results folder
   │
fetch_pdb                   Download 3HEC structure from PDB
   │
   ├─ extract_molecule       Extract protein structure from downloaded PDB
   │
   └─ pdb_cluster_zip        Download PDB Cluster90 collection for 3HEC
         │
      bindingsite             Extract binding site from Cluster90 collection
         │
      box                     Generate cavity box around binding site
         │
ideal_sdf                   Download Imatinib (STI) small molecule as SDF
   │
babel_convert_sdf2pdb        Convert small molecule from SDF to PDB format
   │
babel_convert_pdb2pdbqt      Prepare ligand for docking (PDB to PDBQT)
   │
str_check_add_hydrogens      Prepare receptor protein for docking (PDB to PDBQT)
   │
autodock_vina_run            Run AutoDock Vina docking
   │
extract_model_pdbqt          Extract top docking pose from Vina output
   │
babel_convert_pdbqt2pdb      Convert docking pose from PDBQT to PDB format
   │
cat_pdb                      Combine protein and docked ligand into final structure

Inputs and outputs

Inputs

This workflow has no file inputs. It fetches the 3HEC receptor, its PDB Cluster90 collection, and the Imatinib (STI) ligand.

Outputs land in results/:

  • download.pdb, pdb_protein.pdb: the fetched receptor structure.
  • pdb_cluster.zip: the Cluster90 collection used to locate the binding site.
  • bindingsite.pdb, box.pdb: the inferred binding site and the docking box.
  • ideal.sdf, ligand.pdb, prep_ligand.pdbqt: the ligand, ready to dock.
  • prep_receptor.pdbqt: the receptor, ready to dock.
  • output_vina.pdbqt, output_vina.log: all the Vina poses and their scores.
  • output_model.pdbqt, output_model.pdb: the top-ranked pose.
  • output_structure.pdb: the final assembled protein-ligand complex.

Set the target PDB code in configs/fetch_pdb.yaml and the ligand code in configs/ideal_sdf.yaml. Set the box padding in configs/box.yaml.

Run the workflow

Install the horus-runtime and the plugins one time:

uv sync

If you do not have uv, install it first:

curl -LsSf https://astral.sh/uv/install.sh | sh

You can also install the packages with pip:

pip install horus-runtime horus-environments

Then run the workflow:

uv run horus run workflow.yaml

On Apple Silicon, start Docker before you run the workflow. Horus pulls the biobb_vs image on the first run.

References

Run this workflow

The workflow is open source. Clone the pantheon repository and run it with the horus-runtime engine. To run it on managed compute without a cluster of your own, join the Temple Compute OS waitlist.