All workflows

Molecular dynamics

Protein-Ligand Docking with fpocket

Find the binding cavity on the receptor with fpocket, then dock the ligand with AutoDock Vina. Horus runs the biobb_vs stages in Docker and the rest in a native conda environment.

fpocketAutoDock VinaOpenBabelBioExcel biobbbiobb_vs

What this workflow does

This workflow docks one ligand against one protein target. It finds the docking box from the receptor itself. The target is p38-alpha MAP kinase (PDB 3HEC). The ligand is the kinase inhibitor Imatinib (PDB ligand code STI).

The workflow downloads the receptor and strips the ligands, the ions and the water. It then runs fpocket on the clean protein. fpocket reports every cavity on the surface. The workflow filters the cavities by volume and selects one pocket. It builds a docking box around that pocket.

The workflow prepares the receptor and the ligand as PDBQT files. It runs AutoDock Vina inside the box. It extracts the top pose and superposes that pose on the receptor. The final file is a complete protein-ligand complex.

The fpocket route is useful when you have no homolog cluster and no annotated binding site. You dock against the structure in front of you.

The compute problem

The workflow mixes tools with very different install profiles. fpocket and AutoDock Vina are compiled binaries. OpenBabel is a compiled library. The biobb wrappers are pure Python. A single environment must satisfy all of them.

The biobb_vs package has no osx-arm64 conda build. On an Apple Silicon machine, the cavity detection stages and the box stage cannot install natively. The download stage and the OpenBabel conversion stages install without a problem.

The stages also have different costs. The download stages need a network and one second. The fpocket run needs a CPU and a few seconds. The AutoDock Vina run needs several CPU cores and the largest share of the wall time. The exhaustiveness setting drives that cost.

How Horus solves it

Horus assigns an executor to each stage. The biobb_vs stages run inside the quay.io/biocontainers/biobb_vs Linux image. The download stages, the OpenBabel stages and the structure utility stages run in the native conda environment. Docker pulls the image on the first run.

The runtime.command string never changes. Only the executor: field selects where the stage runs. The same workflow file runs on an x86 Linux box with one executor and on a Mac with two.

The AutoDock Vina stage is the stage you want to move. Point its executor: field at an SSH host with many cores and raise the exhaustiveness. Horus moves the receptor PDBQT and the ligand PDBQT to that host. Horus brings the poses back. The cavity detection stages stay local, because they are cheap.

Without this routing, you install fpocket, AutoDock Vina and OpenBabel on every machine that must run the screen. You then copy the PDBQT files by hand.

Pipeline

fetch_pdb                    Download 3HEC structure from PDB
   │
extract_protein               Extract protein structure (remove ligands, ions, water)
   │
   ├─ fpocket_run              Compute protein cavities with fpocket
   │     │
   │  fpocket_filter           Filter cavities by volume (800-2000 ų)
   │     │
   │  fpocket_select           Extract selected pocket cavity (pocket 6)
   │     │
   │  box                      Generate docking box around cavity (offset 12 Å)
   │
   └─ str_check_add_hydrogens  Prepare receptor protein for docking (PDB → PDBQT)
   │
ideal_sdf                     Download Imatinib (STI) small molecule as SDF
   │
babel_convert_sdf_to_pdb       Convert small molecule from SDF to PDB format
   │
babel_convert_pdb_to_pdbqt     Prepare ligand for docking (PDB → PDBQT, partial charges)
   │
autodock_vina_run              Run AutoDock Vina docking
   │
extract_model_pdbqt            Extract docking pose (model 1) from Vina output
   │
babel_convert_pdbqt_to_pdb     Convert docking pose from PDBQT to PDB format
   │
cat_pdb                        Superpose ligand docking pose onto target protein structure

Inputs and outputs

Inputs

This workflow has no file inputs. It fetches the 3HEC receptor and the Imatinib ligand at run time. It computes the candidate cavities on the receptor with fpocket.

Outputs land in results/:

  • download.pdb, pdb_protein.pdb: the fetched and cleaned receptor.
  • fpocket_all_pockets.zip, fpocket_summary.json: every detected cavity.
  • fpocket_filter_pockets.zip: the cavities that pass the volume filter.
  • fpocket_cavity.pdb, fpocket_pocket.pqr: the selected pocket.
  • box.pdb: the docking box around the selected cavity.
  • prep_receptor.pdbqt, prep_ligand.pdbqt: the docking-ready structures.
  • output_vina.pdbqt: every AutoDock Vina pose with its score.
  • output_structure.pdb: the final protein-ligand complex.

To change the target, edit configs/fetch_pdb.yaml. To change the ligand, edit configs/ideal_sdf.yaml. To change the pocket, edit configs/fpocket_select.yaml.

Run the workflow

Install the horus-runtime 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

The first run builds the conda environment. This takes a few minutes. Later runs reuse the cached environment at ../.horus_conda_env.

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.