diff --git a/cookbook/assets/abfe-cycle.png b/cookbook/assets/abfe-cycle.png new file mode 120000 index 0000000..c23d1d8 --- /dev/null +++ b/cookbook/assets/abfe-cycle.png @@ -0,0 +1 @@ +../../abfe_tutorial/abfe-cycle.png \ No newline at end of file diff --git a/cookbook/assets/rbfe-cycle.png b/cookbook/assets/rbfe-cycle.png new file mode 100644 index 0000000..4c518d2 Binary files /dev/null and b/cookbook/assets/rbfe-cycle.png differ diff --git a/cookbook/assets/septop_cycle.png b/cookbook/assets/septop_cycle.png new file mode 120000 index 0000000..49442dd --- /dev/null +++ b/cookbook/assets/septop_cycle.png @@ -0,0 +1 @@ +../../openmm_septop/septop_cycle.png \ No newline at end of file diff --git a/cookbook/assets/tyk2_lig_ejm_31_openfold_portal.png b/cookbook/assets/tyk2_lig_ejm_31_openfold_portal.png new file mode 100644 index 0000000..7527e14 Binary files /dev/null and b/cookbook/assets/tyk2_lig_ejm_31_openfold_portal.png differ diff --git a/cookbook/openfold3_to_openfe.ipynb b/cookbook/openfold3_to_openfe.ipynb index e048e05..2888ccc 100644 --- a/cookbook/openfold3_to_openfe.ipynb +++ b/cookbook/openfold3_to_openfe.ipynb @@ -3,7 +3,12 @@ { "cell_type": "markdown", "id": "35354229", - "metadata": {}, + "metadata": { + "slideshow": { + "slide_type": "slide" + }, + "tags": [] + }, "source": [ "      \n", "\n", @@ -13,106 +18,154 @@ { "cell_type": "markdown", "id": "0d905dc8-e11b-4088-82f5-2c2cefef3973", - "metadata": {}, + "metadata": { + "slideshow": { + "slide_type": "slide" + }, + "tags": [] + }, "source": [ - "## Introduction\n", - "\n", - "This notebook offers a brief preview of some of the steps you may need to go through to calculate binding affinities using [OpenFE](https://docs.openfree.energy/en/latest/) with [OpenFold3](https://openfold-3.readthedocs.io/en/latest/) generated structures.\n", + "## Overview\n", "\n", - "Notably, we will demonstrate how to generate a set of predictions, clean them up for use in molecular dynamics simulations, and then apply them to both relative binding free energy (RBFE) and absolute binding free energy (ABFE) methods." + "1. Predict structures using OpenFold3\n", + "2. Clean and process the predicted structures for use in the following OpenFE protocols:\n", + " - Absolute Binding Free Energy Protocol (ABFE)\n", + " - Relative Binding Free Energy Protocols (RBFEs)\n", + " - Separated Topology\n", + " - Hybrid Topology\n" ] }, { "cell_type": "markdown", "id": "ada5c811-8603-4473-8040-7fd370b4a1cf", - "metadata": {}, + "metadata": { + "slideshow": { + "slide_type": "fragment" + }, + "tags": [] + }, "source": [ "
\n", "⚠️ Important Note:\n", - " Please note that this notebook does not offer an exhaustive look into everything you may need to do when parsing OpenFold3 inputs into OpenFE. Where possible, we offer insights into some of the other hurdles you may face, but you are likely to encounter more in production settings.\n", + " We will not cover everything needed to use OpenFold3 inputs in OpenFE! We will offer insights into some common considerations, but expect more in production settings.\n", "
" ] }, { "cell_type": "markdown", - "id": "1e89d5ef-e362-4335-9cbb-9752341b29f9", - "metadata": {}, + "id": "2fea29c3", + "metadata": { + "slideshow": { + "slide_type": "slide" + }, + "tags": [] + }, "source": [ - "## Overview\n", - "\n", - "In this example notebook we demonstrate how to predict and run simulations for different ligands bound to tyrosine kinase 2 (TYK2). The dataset comes from the [Wang et al. JACS 2015 dataset](https://pubs.acs.org/doi/10.1021/ja512751q).\n", - "\n", - "
\n", - "\n", - "\n", - "**The tutorial is broken into the following steps:**\n", - "\n", - "1. Running cofolding with OpenFold3 on a set of TYK2 ligands\n", - "\n", - "2. Processing the OpenFold3 output for use with OpenFE\n", - "\n", - " a) Choosing a reference protein structure\n", - "\n", - " b) Aligning & extracting the necessary ligands & protein structures.\n", - "\n", - " c) Fixing & protonating the reference protein structure.\n", - "\n", - "\n", - "3. Loading structures into OpenFE Components\n", - "\n", - "4. Creating a free energy transformation with 3 protocol options\n", - "\n", - " a) Absolute Binding Free Energy Transformation\n", - "\n", - " b) SepTop Relative Binding Free Energy Transformation\n", - "\n", - " c) Hybrid Topology Relative Binding Free Energy Transformation" + "## 1. Run cofolding with OpenFold3 on a set of TYK2 ligands" ] }, { "cell_type": "markdown", - "id": "2fea29c3", - "metadata": {}, + "id": "6c14eb39-036b-44d3-93e3-b29a635a7e2b", + "metadata": { + "slideshow": { + "slide_type": "fragment" + }, + "tags": [] + }, "source": [ - "## 1. Run cofolding with OpenFold3 on a set of TYK2 ligands\n", + "We will show how to predict and set up simulations for different ligands bound to tyrosine kinase 2 (TYK2).The dataset comes from the [Wang et al. JACS 2015 dataset](https://pubs.acs.org/doi/10.1021/ja512751q).\n", "\n", - "### Preparing the Input JSON for OpenFold\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "ef3bdb1f-504a-4311-8e0a-c28265b006cb", + "metadata": { + "slideshow": { + "slide_type": "slide" + }, + "tags": [] + }, + "source": [ + "### Preparing the input JSON for OpenFold\n", "\n", - "First we need to create an input JSON file for OpenFold. This step requires assembling two key pieces of information:\n", + "This step requires assembling two key pieces of information:\n", "\n", "- Ligand SMILES strings\n", - "- Protein sequence (extracted from the PDB file)\n", + "- Protein sequence (extracted from the PDB file)\n" + ] + }, + { + "cell_type": "markdown", + "id": "2cfa0d3a-9eb5-4ddc-854f-b278469ae2e1", + "metadata": { + "slideshow": { + "slide_type": "fragment" + }, + "tags": [] + }, + "source": [ + "The SDF file `tyk2_ligands.sdf` contains all ligands for this exercise.\n", "\n", - "In this workflow, we begin with an SDF file containing the ligands.\n", - "We extract the SMILES representation for each ligand and store them in a dictionary alongside their ligand identifiers." + "For each ligand, extract SMILES representation store in a dictionary alongside its ligand identifier." ] }, { "cell_type": "code", "execution_count": 1, + "id": "65af114c-b151-4bcd-b1b5-448abbe43fc5", + "metadata": { + "slideshow": { + "slide_type": "skip" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "import warnings\n", + "# don't show warnings that are expected and not an issue\n", + "warnings.filterwarnings(action=\"ignore\", message=r\"Unit cell dimensions not found\") \n", + "from typing import Iterable" + ] + }, + { + "cell_type": "code", + "execution_count": 2, "id": "08962d91-a334-4c89-adf1-19be6f2bdb16", "metadata": { - "scrolled": true + "scrolled": true, + "slideshow": { + "slide_type": "fragment" + }, + "tags": [] }, "outputs": [], "source": [ - "ligands_file = \"assets/tyk2_ligands.sdf\"\n", "from rdkit.Chem.Descriptors3D import Asphericity\n", "from rdkit import Chem\n", "\n", - "ligands_dict = {}\n", + "ligands_file = \"assets/tyk2_ligands.sdf\"\n", + "\n", + "ligand_smiles = {}\n", "sppl = Chem.SDMolSupplier(ligands_file, removeHs=True)\n", "for mol in sppl:\n", " smi = Chem.MolToSmiles(mol)\n", " name = mol.GetProp(\"_Name\")\n", - " ligands_dict[name] = smi" + " ligand_smiles[name] = smi" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "id": "1c55bfeb-c1bc-4af8-98da-43ff8c1de141", - "metadata": {}, + "metadata": { + "slideshow": { + "slide_type": "fragment" + }, + "tags": [] + }, "outputs": [ { "data": { @@ -129,27 +182,37 @@ " 'lig_jmc_28': 'C[C@@H]1C[C@@H]1C(=O)Nc1cc(NC(=O)c2c(Cl)cccc2Cl)ccn1'}" ] }, - "execution_count": 2, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "ligands_dict" + "ligand_smiles" ] }, { "cell_type": "markdown", "id": "80da7967-8046-44e4-aef7-c81ac6712f98", - "metadata": {}, + "metadata": { + "slideshow": { + "slide_type": "slide" + }, + "tags": [] + }, "source": [ - "We then create the JSON file that will be the OpenFold input." + "Next we create the JSON file that will be the OpenFold input." ] }, { "cell_type": "markdown", "id": "b3f0be0c-144c-4e96-9310-a8778111291c", - "metadata": {}, + "metadata": { + "slideshow": { + "slide_type": "fragment" + }, + "tags": [] + }, "source": [ "
\n", " Note: In this example, we did not use the full FASTA sequence from UNIPROT for TYK2, but rather the sequence of the crystallographic structure.\n", @@ -158,9 +221,14 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "id": "25a8ba0c-311c-476e-9913-9b39611c708d", - "metadata": {}, + "metadata": { + "slideshow": { + "slide_type": "fragment" + }, + "tags": [] + }, "outputs": [], "source": [ "import json\n", @@ -175,7 +243,7 @@ "# Build the queries dictionary\n", "queries = {}\n", "\n", - "for name, smiles in ligands_dict.items():\n", + "for name, smiles in ligand_smiles.items():\n", " queries[name] = {\n", " \"chains\": [\n", " protein_info,\n", @@ -195,490 +263,1069 @@ { "cell_type": "markdown", "id": "a2546f36-2ca2-4793-ad4b-19b6e76574ae", - "metadata": {}, + "metadata": { + "slideshow": { + "slide_type": "slide" + }, + "tags": [] + }, "source": [ - "### Running OpenFold\n", - "\n", - "#### Defining the output settings\n", + "### Generating Structures with OpenFold\n", "\n", - "By default OpenFold3 outputs `.mmcif` files, but OpenFE requires `.pdb` files. We can ask OpenFold to generate this instead by defining it in the output settings.\n", + "#### Defining the OpenFold settings\n", "\n", - "To do this, create an `output_settings.yml` file to specify .pdb as the output file format:\n", + "We define the following settings in a `settings.yaml` file to be passed to OpenFold:\n", "\n", "```\n", - "output_writer_settings:\n", - " # change output format to pdb (default: mmcif):\n", - " structure_format: pdb\n", - "```\n", - "\n", + "model_update:\n", + " presets:\n", + " - predict\n", + " - low_mem\n", + " custom:\n", + " settings:\n", + " memory:\n", + " eval:\n", + " use_cueq_triangle_kernels: true\n", + " use_deepspeed_evo_attention: false\n", + "\n", + "\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "1557d01d-6a84-4531-83b8-b879a50a0ac6", + "metadata": { + "slideshow": { + "slide_type": "fragment" + }, + "tags": [] + }, + "source": [ "#### Running OpenFold\n", "\n", - "With all these inputs, you can now run OpenFold:\n", + "With all these inputs, you can now run **OpenFold3**:\n", "\n", - "`run_openfold predict --query_json=queries.json --runner_yaml output_settings.yml`" + "`run_openfold predict --query_json=queries.json --runner_yaml settings.yaml`" ] }, { "cell_type": "markdown", - "id": "b4adde29-282a-45f6-96a6-c8de0700a266", - "metadata": {}, + "id": "9c1ab9ee-71f5-4587-bea1-35097621c039", + "metadata": { + "slideshow": { + "slide_type": "slide" + }, + "tags": [] + }, "source": [ - "## 2. Processing the OpenFold3 output for use with OpenFE\n", + "#### Evaluating OpenFold output\n", "\n", + "confidence scores for each ligand are at ``assets/of3_tyk2_output/{lig_name}/seed_42/*confidences.json``\n" + ] + }, + { + "cell_type": "markdown", + "id": "73368db9-350f-4851-922a-01469736dcc7", + "metadata": { + "slideshow": { + "slide_type": "fragment" + }, + "tags": [] + }, + "source": [ + "If you are using the OpenFold portal, you can view the confidence scores interactively, where darker regions have higher confidence scores:\n", + "\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "9481baf0-9f31-41f2-acf2-ec9b62552345", + "metadata": { + "slideshow": { + "slide_type": "fragment" + }, + "tags": [] + }, + "source": [ "
\n", "⚠️ Important Note:\n", - " Here we use the first model for each complex predicted by OpenFold3. In practice you would filter through all predicted models, possibly using pose busters (github.com/maabuu/posebusters) and some other scoring metrics to identify the most plausible inputs.\n", + " Here we use the first model for each complex predicted by OpenFold3. In practice you would filter through all predicted models using confidence scores, and possibly using pose busters (github.com/maabuu/posebusters).\n", "
" ] }, { "cell_type": "markdown", - "id": "eaf920be-9e16-402b-9fc5-8e1d4f3712cf", - "metadata": {}, + "id": "721074db-8266-4c3e-b592-64220e0cfd8f", + "metadata": { + "slideshow": { + "slide_type": "slide" + }, + "tags": [] + }, "source": [ - "### Preparing & extracting the structures\n", - "\n", - "Now that we have a set of predicted structures, we must extract the relevant information from the PDB files.\n", - "This means:\n", - "\n", - "a) Choosing a reference protein structure which will be used for all binding affinity predictions\n", - "\n", - " - This is necessary for RBFE simulations, where a single structure must be kept constant throughout the transformations. Note that for ABFE simulations, this step can be avoided.\n", - " - For the sake of this demonstration, we will be choosing the predicted structure that is bound to the ligand occupying the largest volume. The idea here being that hopefully the binding site of that structure can accomodate all the other ligands. We note that in practice this is not always true.\n", - "\n", - "b) Aligning the structures to the reference & extracting the necessary structures\n", - "\n", - " - This is so that we can extract the ligands and use them with the chosen structure.\n", - "\n", - "c) Fixing & protonating the reference protein structure.\n", - "\n", - "\n", - "#### a) Choosing a reference protein structure\n", + "## 2. Running OpenFE Protocols with OpenFold structures" + ] + }, + { + "cell_type": "markdown", + "id": "249ec515-cfad-4f49-8dba-ee2438b1adf4", + "metadata": { + "slideshow": { + "slide_type": "fragment" + }, + "tags": [] + }, + "source": [ + "We will demonstrate how to use OpenFold generated structures with three different OpenFE protocols:\n", + "Absolute Binding Free Energy (ABFE), Separated Topologies RBFE, and Hybrid Topology RBFE.\n" + ] + }, + { + "cell_type": "markdown", + "id": "6419b4ec-6513-47ca-bb66-0eb17a7224c3", + "metadata": { + "slideshow": { + "slide_type": "slide" + }, + "tags": [] + }, + "source": [ + "### Creating an Absolute Binding Free Energy (ABFE) Transformation" + ] + }, + { + "cell_type": "markdown", + "id": "fd51d74c-5cdf-445a-8a89-7ff365bc1e1c", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "d34aab3e-8275-46ab-abc6-2a588224d889", + "metadata": { + "slideshow": { + "slide_type": "fragment" + }, + "tags": [] + }, + "source": [ + "The ABFE protocol requires the least amount of post-processing of the OpenFold outputs.\n", "\n", - "As mentioned above, we will select a reference protein structure for all simulations going forward. To do this, we naively select the structure bound to a ligand with the largest volume.\n", + "For the sake of simplicity, we will only create a Transformation for `lig_jmc_27`, but this process is generalizable to the rest of the ligands in the series.\n" + ] + }, + { + "cell_type": "markdown", + "id": "cdeee4e3-ce8c-4151-9ef7-5a6017ac3dcb", + "metadata": { + "slideshow": { + "slide_type": "slide" + }, + "tags": [] + }, + "source": [ + "#### Loading and assigning partial charges to the ligand(s)\n", "\n", - "Here we load in all the structures into MDAnalysis, extract the ligands into RDKit molecules using their initial SMILES definitions as bond/formal charge templates, and then get the ligand with the largest volume using the `Asphericity` 3D descriptor." + "Load the ligands as openfe `SmallMoleculeComponent`s so that they can be understood by the OpenFE ecosystem." ] }, { "cell_type": "code", - "execution_count": 4, - "id": "25ef33bf-fb1a-45da-96e4-004f77ef7d34", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Extracting ligand from lig_ejm_50_seed_42_sample_1_model.pdb\n", - "Extracting ligand from lig_jmc_23_seed_42_sample_1_model.pdb\n", - "Extracting ligand from lig_ejm_43_seed_42_sample_1_model.pdb\n", - "Extracting ligand from lig_ejm_42_seed_42_sample_1_model.pdb\n", - "Extracting ligand from lig_ejm_31_seed_42_sample_1_model.pdb\n", - "Extracting ligand from lig_ejm_47_seed_42_sample_1_model.pdb\n", - "Extracting ligand from lig_jmc_27_seed_42_sample_1_model.pdb\n", - "Extracting ligand from lig_ejm_46_seed_42_sample_1_model.pdb\n", - "Extracting ligand from lig_ejm_48_seed_42_sample_1_model.pdb\n", - "Extracting ligand from lig_jmc_28_seed_42_sample_1_model.pdb\n", - "\n", - "Largest ligand is lig_jmc_27 with volume 0.5209626577896912\n" - ] - } - ], + "execution_count": 5, + "id": "8e22e331-c533-4557-b1fb-ef570c0c054c", + "metadata": { + "slideshow": { + "slide_type": "fragment" + }, + "tags": [] + }, + "outputs": [], "source": [ "import pathlib\n", "import MDAnalysis as mda\n", - "from MDAnalysis.analysis import align\n", + "from MDAnalysis.core.groups import AtomGroup\n", "from rdkit import Chem, rdBase\n", "from rdkit.Chem import AllChem\n", - "from rdkit.Chem.Descriptors3D import Asphericity\n", - "import warnings\n", - "\n", - "# don't show warnings that are expected and not an issue\n", - "warnings.filterwarnings(action=\"ignore\", message=r\"Unit cell dimensions not found\") \n", "\n", - "# gather all the complexes and align to a single structure\n", - "# which has the largest ligand by volume \n", - "of_results_root = pathlib.Path(\"assets/of3_tyk2_output/\")\n", "output_root = pathlib.Path(\"openfold_to_openfe\")\n", - "temp_dir = pathlib.Path(output_root,\"temp_ligands\")\n", - "temp_dir.mkdir(exist_ok=True,parents=True)\n", - "# load all the output pdbs and calculate ligand volumes\n", - "ligand_volumes = {}\n", - "\n", - "for output_file in of_results_root.glob(\"*/*/*.pdb\"):\n", - " ligand_name = output_file.name.split('_seed')[0]\n", - " print(f\"Extracting ligand from {output_file.name}\")\n", - " with warnings.catch_warnings(): \n", - " warnings.simplefilter(\"ignore\")\n", - " u = mda.Universe(str(output_file))\n", - " ligand = u.select_atoms(\"resname LIG\")\n", - " # write the ligand to a temporary file\n", - " ligand.write(str(temp_dir / f\"{ligand_name}.pdb\"))\n", - " # now load back with rdkit\n", - " rdkit_mol = Chem.MolFromPDBFile(str(temp_dir / f\"{ligand_name}.pdb\"), removeHs=True)\n", - " # now use a template from the SMILES definitions to make sure the bond orders are correct\n", - " template_mol = Chem.MolFromSmiles(ligands_dict[ligand_name])\n", - " # don't show rdkit's \"WARNING: More than one matching pattern found - picking one\" for every ligand\n", - " with rdBase.BlockLogs(): \n", - " rdkit_mol = AllChem.AssignBondOrdersFromTemplate(template_mol, rdkit_mol)\n", - " # calculate the volume\n", - " vsa = Asphericity(rdkit_mol)\n", - " ligand_volumes[ligand_name] = vsa\n", "\n", - "# find the ligand with the largest volume\n", - "largest_ligand = max(ligand_volumes, key=ligand_volumes.get)\n", - "print(f\"\\nLargest ligand is {largest_ligand} with volume {ligand_volumes[largest_ligand]}\")" + "abfe_out_dir = pathlib.Path(output_root, \"abfe_prep/\")\n", + "abfe_out_dir.mkdir(exist_ok=True, parents=True)\n", + "\n", + "tmp_ligand_dir = pathlib.Path(output_root, \"temp_ligands\")\n", + "tmp_ligand_dir.mkdir(exist_ok=True)" ] }, { "cell_type": "markdown", - "id": "6056e755-0da0-4712-b4ae-7a721c94851d", - "metadata": {}, + "id": "5ec171f2-b162-4801-b3d2-204768770e55", + "metadata": { + "slideshow": { + "slide_type": "slide" + }, + "tags": [] + }, "source": [ - "#### b) Aligning & extracting the necessary structures\n", - "\n", - "Next we align all the models back to the reference structure. We then extract all the ligands and the protein atoms from the reference." + "Extract the ligand cofolded with the protein from the output .pdb:" ] }, { "cell_type": "code", - "execution_count": 5, - "id": "26c10e11-f001-44e5-87a4-2939ead048a8", + "execution_count": 6, + "id": "307df5ab-d79e-4592-b3ad-57334574249d", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Aligning lig_ejm_50_seed_42_sample_1_model.pdb to lig_jmc_27_seed_42_sample_1_model.pdb\n", - "Aligning lig_jmc_23_seed_42_sample_1_model.pdb to lig_jmc_27_seed_42_sample_1_model.pdb\n", - "Aligning lig_ejm_43_seed_42_sample_1_model.pdb to lig_jmc_27_seed_42_sample_1_model.pdb\n", - "Aligning lig_ejm_42_seed_42_sample_1_model.pdb to lig_jmc_27_seed_42_sample_1_model.pdb\n", - "Aligning lig_ejm_31_seed_42_sample_1_model.pdb to lig_jmc_27_seed_42_sample_1_model.pdb\n", - "Aligning lig_ejm_47_seed_42_sample_1_model.pdb to lig_jmc_27_seed_42_sample_1_model.pdb\n", - "Aligning lig_jmc_27_seed_42_sample_1_model.pdb to lig_jmc_27_seed_42_sample_1_model.pdb\n", - "Aligning lig_ejm_46_seed_42_sample_1_model.pdb to lig_jmc_27_seed_42_sample_1_model.pdb\n", - "Aligning lig_ejm_48_seed_42_sample_1_model.pdb to lig_jmc_27_seed_42_sample_1_model.pdb\n", - "Aligning lig_jmc_28_seed_42_sample_1_model.pdb to lig_jmc_27_seed_42_sample_1_model.pdb\n" - ] - } - ], + "outputs": [], "source": [ - "reference_pdb = pathlib.Path(of_results_root, largest_ligand, \"seed_42\", f\"{largest_ligand}_seed_42_sample_1_model.pdb\")\n", - "other_pdbs = of_results_root.glob(\"*/*/*_seed_42_sample_1_model.pdb\")\n", - "output_dir = pathlib.Path(\"openfold_to_openfe/p_aligned/\")\n", - "output_dir.mkdir(exist_ok=True)\n", + "def extract_protein_ligand(pdb_path:pathlib.Path)->(AtomGroup, AtomGroup):\n", + " pdb_universe = mda.Universe(pdb_path)\n", + " protein = pdb_universe.select_atoms(\"protein\")\n", + " ligand = pdb_universe.select_atoms(\"resname LIG\")\n", "\n", - "ref = mda.Universe(reference_pdb)\n", - "for pdb in other_pdbs:\n", - " print(f\"Aligning {pdb.name} to {reference_pdb.name}\")\n", - " ligand = pdb.name.split('_seed')[0]\n", - " mob = mda.Universe(pdb)\n", + " return (protein, ligand)\n", "\n", - " # Align mobile → reference using protein backbone\n", - " ref_prot = ref.select_atoms(\"protein and backbone\")\n", - " mob_prot = mob.select_atoms(\"protein and backbone\")\n", - " \n", - " # Perform alignment in-place\n", - " align.alignto(mob_prot, ref_prot)\n", - " aligned_ligand = mob.select_atoms(\"resname LIG\")\n", - " aligned_ligand.write(f'{output_dir}/{ligand}.pdb')\n", + "def prep_ligand(sdf_in:pathlib.Path, sdf_out:pathlib.Path, name:str, template_smiles:str)->None:\n", + " print(f\"Preparing {name}\")\n", " # load back into rdkit to add hydrogens\n", - " rdkit_mol = Chem.MolFromPDBFile(f'{output_dir}/{ligand}.pdb', removeHs=True)\n", + " rdkit_mol = Chem.MolFromPDBFile(str(sdf_in), removeHs=True)\n", + " \n", " # use the template to assign bond orders\n", - " template_mol = Chem.MolFromSmiles(ligands_dict[ligand])\n", + " template_mol = Chem.MolFromSmiles(template_smiles)\n", " with rdBase.BlockLogs(): \n", " rdkit_mol = AllChem.AssignBondOrdersFromTemplate(template_mol, rdkit_mol)\n", + " \n", " # Add hydrogens\n", " rdkit_mol = AllChem.AddHs(rdkit_mol, addCoords=True)\n", + " \n", " # Set the molecule name\n", - " rdkit_mol.SetProp('_Name', f\"{ligand}\")\n", + " rdkit_mol.SetProp('_Name', f\"{name}\")\n", + " \n", " # write to sdf\n", - " Chem.MolToMolFile(rdkit_mol, output_dir / f\"{ligand}_prepped.sdf\")\n", - "\n", - " # For the reference pdb, save the protein alone\n", - " if pdb.name.split('_seed')[0] == largest_ligand:\n", - " full_protein = mob.select_atoms(\"protein\")\n", - " full_protein.write(f'{output_dir}/protein.pdb')" - ] - }, - { - "cell_type": "markdown", - "id": "fe3ca792-4615-4be3-8a41-feb0819e968d", - "metadata": {}, - "source": [ - "
\n", - "⚠️ Important Note:\n", - "

\n", - " Here simply we assign ligand protonation states to those we defined at the start of this exercise. Additionally, below we will assign protein protonation states using PDBFixer at pH 7 without accounting for the ligand.

\n", - " In practice more care would be taken when protonating the complexes, using more complex tools such as Maestro or OpenEye's Spruce. For example, ligand protonation states may change depending on the chemical environment they are bound to.\n", - "
" + " Chem.MolToMolFile(rdkit_mol, sdf_out)\n", + " print(f\"Prepared ligand written to {sdf_out}\")" ] }, { - "cell_type": "markdown", - "id": "10b42b56-2f47-4215-8397-fcf7473c4860", - "metadata": {}, + "cell_type": "code", + "execution_count": 7, + "id": "6a6a999f-f961-4909-add8-e8c3bc804c99", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Preparing lig_jmc_27\n", + "Prepared ligand written to openfold_to_openfe/abfe_prep/lig_jmc_27_prepped.sdf\n" + ] + } + ], "source": [ - "#### c) Fixing & protonating the reference protein structure\n", + "ligand_name = 'lig_jmc_27'\n", + "pdb_path = pathlib.Path(f\"assets/of3_tyk2_output/{ligand_name}/seed_42/{ligand_name}_seed_42_sample_1_model.pdb\")\n", + "\n", + "protein, ligand = extract_protein_ligand(pdb_path)\n", + "\n", + "protein.write(f'{abfe_out_dir}/protein.pdb')\n", + "ligand.write(f'{abfe_out_dir}/{ligand_name}.pdb')\n", + "\n", + "prepped_ligand_path = abfe_out_dir / f\"{ligand_name}_prepped.sdf\"\n", + "prep_ligand(\n", + " abfe_out_dir/f\"{ligand_name}.pdb\",\n", + " prepped_ligand_path,\n", + " ligand_name,\n", + " ligand_smiles[ligand_name]\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "30816423-6c25-47bb-a90c-4870e85567c1", + "metadata": { + "slideshow": { + "slide_type": "slide" + }, + "tags": [] + }, + "source": [ + "#### Fixing & protonating the protein structure\n", "\n", "The PDB contains the heavy atoms of the protein but is missing hydrogens and caps. Here we call PDBFixer to add hydrogens at pH 7 and add protein caps." ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 8, "id": "ea82c47d-9794-424c-8d27-a9c6e69d29e8", - "metadata": {}, + "metadata": { + "slideshow": { + "slide_type": "fragment" + }, + "tags": [] + }, "outputs": [], "source": [ "# now run the reference protein through pdbfixer\n", - "! pdbfixer openfold_to_openfe/p_aligned/protein.pdb --add-atoms=all --add-residues --output=openfold_to_openfe/p_aligned/protein_fixed.pdb" + "! pdbfixer assets/of3_tyk2_output/lig_jmc_27/seed_42/lig_jmc_27_seed_42_sample_1_model.pdb --add-atoms=all --add-residues --output=openfold_to_openfe/lig_jmc_27_seed_42_sample_1_model_fixed.pdb" ] }, { "cell_type": "markdown", - "id": "89e52270-514c-4b21-8179-07c7319ff468", - "metadata": {}, + "id": "3072cbd5-e273-4d44-aff4-e3c94bc53476", + "metadata": { + "slideshow": { + "slide_type": "fragment" + }, + "tags": [] + }, "source": [ - "## 3. Creating OpenFE components from the inputs\n", - "\n", - "Now we can create OpenFE components from the files we prepared above.\n", - "\n", - "### Loading ligands and assigning partial charges\n", - "\n", - "First we load the ligands and assign them partial charges using OpenFF's NAGL model." + "
\n", + "⚠️ Note:\n", + " In practice more care would be taken when protonating the complexes, using more complex tools such as Maestro or OpenEye's Spruce.\n", + " \n", + "For example, ligand protonation states may change depending on the chemical environment they are bound to.\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "93d67ad4-6c06-4555-8760-06294e45f05f", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "#### Loading the OpenFE Components" + ] + }, + { + "cell_type": "markdown", + "id": "eaa991f1-3ecf-4f15-b637-4538a0078b7e", + "metadata": { + "slideshow": { + "slide_type": "fragment" + }, + "tags": [] + }, + "source": [ + "Now we can define the protein, ligand, and solvent in OpenFE." ] }, { "cell_type": "code", - "execution_count": 7, - "id": "fc97de03", - "metadata": {}, + "execution_count": 9, + "id": "97da58c4-b4da-478a-918a-a487e5c7317b", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "import openfe" + ] + }, + { + "cell_type": "markdown", + "id": "ca1b4341-f636-45d8-9b20-ed313cc95213", + "metadata": { + "slideshow": { + "slide_type": "fragment" + }, + "tags": [] + }, + "source": [ + "Load the protein as an OpenFE ``ProteinComponent``" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "88bbbbca-4f6a-4496-bea9-f621ffd8183e", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "ProteinComponent(name=tyk2)" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "protein = openfe.ProteinComponent.from_pdb_file(\"openfold_to_openfe/lig_jmc_27_seed_42_sample_1_model_fixed.pdb\", name=\"tyk2\")\n", + "protein" + ] + }, + { + "cell_type": "markdown", + "id": "b1b544a9-9b92-43f3-8b88-7af9205621b5", + "metadata": { + "slideshow": { + "slide_type": "fragment" + }, + "tags": [] + }, + "source": [ + "Load the ligand as an openfe ``SmallMoleculeComponent``" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "c4dca30b-bafb-4d03-80c4-83684655ddcf", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "ligand = openfe.SmallMoleculeComponent.from_sdf_file(prepped_ligand_path)" + ] + }, + { + "cell_type": "markdown", + "id": "f0cd4185-3491-4bcb-9b4d-d160d84ad40e", + "metadata": { + "slideshow": { + "slide_type": "fragment" + }, + "tags": [] + }, + "source": [ + "Assign partial charges to the ligands:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "0b78ec14-9ef9-4068-84ab-3271e6780d40", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "Generating charges: 100%|███████████████████████| 10/10 [00:05<00:00, 1.85it/s]\n" + "Generating charges: 100%|█████████████████████████| 1/1 [00:00<00:00, 1.84it/s]\n" ] } ], "source": [ - "import glob\n", - "import openfe\n", "from openfe.protocols.openmm_utils.omm_settings import OpenFFPartialChargeSettings\n", "from openfe.protocols.openmm_utils.charge_generation import bulk_assign_partial_charges\n", "\n", - "# Load all the ligands\n", - "ligand_sdfs = glob.glob('openfold_to_openfe/p_aligned/*_prepped.sdf')\n", - "ligands = []\n", - "for l in ligand_sdfs:\n", - " ligand = openfe.SmallMoleculeComponent.from_sdf_file(l)\n", - " ligands.append(ligand)\n", - "\n", "# Generate partial charges\n", "charge_settings = OpenFFPartialChargeSettings(partial_charge_method=\"nagl\")\n", "\n", "charged_ligands = bulk_assign_partial_charges(\n", - " molecules=ligands,\n", + " molecules=[ligand],\n", " overwrite=False,\n", " method=charge_settings.partial_charge_method,\n", " toolkit_backend=charge_settings.off_toolkit_backend,\n", " generate_n_conformers=1,\n", - " nagl_model=None,\n", - " processors=1\n", + " nagl_model=\"openff-gnn-am1bcc-1.0.0.pt\",\n", + " processors=1,\n", ")" ] }, { "cell_type": "markdown", - "id": "0d1e9f9d-ebe0-4fd5-be6f-fe03f7db75ee", - "metadata": {}, + "id": "4d11803b-6d4b-4507-8c98-6ff40f75680e", + "metadata": { + "slideshow": { + "slide_type": "fragment" + }, + "tags": [] + }, "source": [ - "Then we can load the reference protein to a ProteinComponent." + "We must also define a SolventComponent which we will use to define our Transformations." ] }, { "cell_type": "code", - "execution_count": 8, - "id": "88bbbbca-4f6a-4496-bea9-f621ffd8183e", - "metadata": {}, + "execution_count": 13, + "id": "30373ee0-d777-4828-b89a-5a8fdbc56c41", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, "outputs": [ { - "name": "stderr", + "data": { + "text/plain": [ + "SolventComponent(name=O, Na+, Cl-)" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "solvent = openfe.SolventComponent()\n", + "solvent" + ] + }, + { + "cell_type": "markdown", + "id": "e1ef09d2-ec8b-4577-8510-c67cb89fc5b5", + "metadata": { + "slideshow": { + "slide_type": "slide" + }, + "tags": [] + }, + "source": [ + "#### Creating the ABFE ``Transformation``" + ] + }, + { + "cell_type": "markdown", + "id": "695c61c4-3fa6-4e1a-939f-5349e6829627", + "metadata": { + "slideshow": { + "slide_type": "fragment" + }, + "tags": [] + }, + "source": [ + "Create the `ChemicalSystems` defining the end states of the simulation:" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "987a1657-82d0-4310-9fe7-4eecd289632a", + "metadata": { + "slideshow": { + "slide_type": "fragment" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", "output_type": "stream", "text": [ - "/Users/atravitz/micromamba/envs/openfe-notebooks/lib/python3.12/site-packages/gufe/components/explicitmoleculecomponent.py:59: UserWarning: Molecule (name='tyk2') doesn't have any hydrogen atoms present. If this is unexpected, consider loading the molecule with `removeHs=False`\n", - " warnings.warn(\n" + "ChemicalSystem(name=complex, components={'ligand': SmallMoleculeComponent(name=lig_jmc_27), 'protein': ProteinComponent(name=tyk2), 'solvent': SolventComponent(name=O, Na+, Cl-)})\n", + "\n", + "ChemicalSystem(name=solvent, components={'protein': ProteinComponent(name=tyk2), 'solvent': SolventComponent(name=O, Na+, Cl-)})\n" ] } ], "source": [ - "protein = openfe.ProteinComponent.from_pdb_file(\"openfold_to_openfe/p_aligned/protein.pdb\", name=\"tyk2\")" + "# Create the two end states\n", + "\n", + "# state A is the complex\n", + "stateA = openfe.ChemicalSystem({\n", + " 'ligand': ligand,\n", + " 'protein': protein,\n", + " 'solvent': solvent,\n", + "}, name=\"complex\")\n", + "\n", + "# state B is the system without the ligand\n", + "stateB = openfe.ChemicalSystem({\n", + " 'protein': protein,\n", + " 'solvent': solvent,\n", + "}, name=\"solvent\")\n", + "\n", + "print(stateA)\n", + "print(\"\")\n", + "print(stateB)" ] }, { "cell_type": "markdown", - "id": "7936a780-99a5-4bcb-addf-64646b9f3a4d", - "metadata": {}, + "id": "e32fb4ef-dbf5-4a9a-90c4-b64d9e5af6ce", + "metadata": { + "slideshow": { + "slide_type": "slide" + }, + "tags": [] + }, "source": [ - "Finally, let's also define a SolventComponent which we will use to define our Transformations." + "Next we create the Protocol. We use the default settings, except to help us execute in parallel we set the number of repeats to 1." ] }, { "cell_type": "code", - "execution_count": 9, - "id": "30373ee0-d777-4828-b89a-5a8fdbc56c41", - "metadata": {}, + "execution_count": 15, + "id": "037cb959-8f0c-4a09-844a-30e39590eabf", + "metadata": { + "slideshow": { + "slide_type": "fragment" + }, + "tags": [] + }, "outputs": [], "source": [ - "solvent = openfe.SolventComponent()" + "from openfe.protocols.openmm_afe import AbsoluteBindingProtocol\n", + "\n", + "settings = AbsoluteBindingProtocol.default_settings()\n", + "settings.protocol_repeats = 1\n", + "protocol = AbsoluteBindingProtocol(settings=settings)" ] }, { "cell_type": "markdown", - "id": "8a83aff9-a356-4a3f-aeed-cc3a0e989cf5", - "metadata": {}, + "id": "6bf8af4c-9894-4af3-84f8-2ed3830120ad", + "metadata": { + "slideshow": { + "slide_type": "fragment" + }, + "tags": [] + }, + "source": [ + "Finally we create the `Transformation` object." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "ef7a9ebf-e0d7-4dda-aac5-d4428b120814", + "metadata": { + "slideshow": { + "slide_type": "fragment" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "abfe_transformation = openfe.Transformation(\n", + " stateA=stateA,\n", + " stateB=stateB,\n", + " mapping=None,\n", + " protocol=protocol, # use protocol created above\n", + " name=f\"{ligand.name}\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "34ec9c8d-cb7f-4cad-9794-b73629a11246", + "metadata": { + "slideshow": { + "slide_type": "fragment" + }, + "tags": [] + }, + "source": [ + "This transformation can now be run using `openfe quickrun`." + ] + }, + { + "cell_type": "markdown", + "id": "df8cb66d-c201-4a22-b87a-a1e5501d4be4", + "metadata": { + "slideshow": { + "slide_type": "slide" + }, + "tags": [] + }, + "source": [ + "### Preparing OpenFold outputs for Relative Binding Free Energies" + ] + }, + { + "cell_type": "markdown", + "id": "9dd96548-7190-4851-b1ed-fb2d8c1bd87b", + "metadata": { + "slideshow": { + "slide_type": "fragment" + }, + "tags": [] + }, "source": [ - "## 4. Creating a Binding Free Energy Transformation\n", + "RBFE transformations require additional preparation, including:\n", "\n", - "### 4a) Absolute Binding Free Energy\n", - "Using these inputs, we can create ABFE Transformations. For the sake of simplicity, we will only create a Transformation for `lig_jmc_27`, but this process is generalizable to the rest of the ligands in the series.\n", + "a) Choosing a reference protein structure which will be used for all binding affinity predictions\n", + "\n", + " - This is necessary for RBFE simulations, where a single structure must be kept constant throughout the transformations.\n", + " - For the sake of this demonstration, we will be choosing the predicted structure that is bound to the ligand occupying the largest volume. The idea here being that hopefully the binding site of that structure can accomodate all the other ligands. We note that in practice this is not always true.\n", + "\n", + "b) Aligning the structures to the reference & extracting the necessary structures\n", + "\n", + " - This is so that we can extract the ligands from all predictions and use them with the chosen reference structure.\n", "\n", - "First we create the `ChemicalSystems` defining the end states of the simulation:" + "c) Fixing & protonating the reference protein structure, as we did above for the ABFE protein structure.\n" + ] + }, + { + "cell_type": "markdown", + "id": "02a82dbd-5a01-43c5-af33-654b706a5721", + "metadata": { + "slideshow": { + "slide_type": "slide" + }, + "tags": [] + }, + "source": [ + "#### a) Choosing a reference protein structure\n", + "\n", + "As mentioned above, we will select a reference protein structure for all simulations going forward. To do this, we naively select the structure bound to a ligand with the largest volume.\n", + "\n", + "Here we load in all the structures into MDAnalysis, extract the ligands into RDKit molecules using their initial SMILES definitions as bond/formal charge templates, and then get the ligand with the largest volume using the `Asphericity` 3D descriptor." ] }, { "cell_type": "code", - "execution_count": 10, - "id": "c405e50c-1df3-4bef-8278-393550e1fc6a", + "execution_count": 17, + "id": "c7b239c1-eaf3-466e-84ef-0700eab300e6", + "metadata": { + "slideshow": { + "slide_type": "fragment" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "import pathlib\n", + "import MDAnalysis as mda\n", + "from MDAnalysis.analysis import align\n", + "from rdkit.Chem import AllChem\n", + "from rdkit.Chem.Descriptors3D import Asphericity\n", + "import warnings\n", + "\n", + "def find_largest_ligand(ligand_sdfs:Iterable[pathlib.Path])->(str,float):\n", + " \"\"\"gather all the complexes and align to a single structure which has the largest ligand by volume\"\"\"\n", + " ligand_volumes = {}\n", + " for lig_sdf in ligand_sdfs:\n", + " ligand_name = lig_sdf.name.split('_seed')[0]\n", + " print(f\"Calculating volume of {lig_sdf.name}\")\n", + " _, ligand = extract_protein_ligand(lig_sdf)\n", + " # write the ligand to a temporary file\n", + " ligand.write(str(tmp_ligand_dir / f\"{ligand_name}.pdb\"))\n", + " # now load back with rdkit\n", + " rdkit_mol = Chem.MolFromPDBFile(str(tmp_ligand_dir / f\"{ligand_name}.pdb\"), removeHs=True)\n", + " # now use a template from the SMILES definitions to make sure the bond orders are correct\n", + " template_mol = Chem.MolFromSmiles(ligand_smiles[ligand_name])\n", + " # don't show rdkit's \"WARNING: More than one matching pattern found - picking one\" for every ligand\n", + " with rdBase.BlockLogs(): \n", + " rdkit_mol = AllChem.AssignBondOrdersFromTemplate(template_mol, rdkit_mol)\n", + " # calculate the volume\n", + " vsa = Asphericity(rdkit_mol)\n", + " ligand_volumes[ligand_name] = vsa\n", + " largest_ligand = max(ligand_volumes, key=ligand_volumes.get)\n", + " return largest_ligand, ligand_volumes[largest_ligand]" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "eb57e727-60f0-4945-861a-56032817f309", "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "SmallMoleculeComponent(name=lig_jmc_27)" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "Calculating volume of lig_ejm_50_seed_42_sample_1_model.pdb\n", + "Calculating volume of lig_jmc_23_seed_42_sample_1_model.pdb\n", + "Calculating volume of lig_ejm_43_seed_42_sample_1_model.pdb\n", + "Calculating volume of lig_ejm_42_seed_42_sample_1_model.pdb\n", + "Calculating volume of lig_ejm_31_seed_42_sample_1_model.pdb\n", + "Calculating volume of lig_ejm_47_seed_42_sample_1_model.pdb\n", + "Calculating volume of lig_jmc_27_seed_42_sample_1_model.pdb\n", + "Calculating volume of lig_ejm_46_seed_42_sample_1_model.pdb\n", + "Calculating volume of lig_ejm_48_seed_42_sample_1_model.pdb\n", + "Calculating volume of lig_jmc_28_seed_42_sample_1_model.pdb\n", + "\n", + "Largest ligand_name is lig_jmc_27 with volume 0.521\n" + ] } ], "source": [ - "# choose the first ligand\n", - "ligand = [l for l in charged_ligands if l.name == 'lig_jmc_27'][0]\n", - "ligand" + "of3_results_root = pathlib.Path(\"assets/of3_tyk2_output/\")\n", + "largest_ligand, largest_vol= find_largest_ligand(of3_results_root.glob(\"*/*/*.pdb\"))\n", + "print(f\"\\nLargest ligand_name is {largest_ligand} with volume {largest_vol:.3f}\")" + ] + }, + { + "cell_type": "markdown", + "id": "5c7639ea-8081-4bc1-bf67-2afc1f495230", + "metadata": {}, + "source": [ + "Choose the corresponding protein as the reference protein" ] }, { "cell_type": "code", - "execution_count": 11, - "id": "987a1657-82d0-4310-9fe7-4eecd289632a", + "execution_count": 19, + "id": "a18f49cb-a504-410b-8d49-481d272666f3", + "metadata": {}, + "outputs": [], + "source": [ + "reference_pdb = pathlib.Path(of3_results_root, largest_ligand, \"seed_42\", f\"{largest_ligand}_seed_42_sample_1_model.pdb\")" + ] + }, + { + "cell_type": "markdown", + "id": "193dc76a-6e43-4e25-8b9d-5c0e4a79c3e9", + "metadata": { + "slideshow": { + "slide_type": "slide" + }, + "tags": [] + }, + "source": [ + "#### b) Aligning & extracting the necessary structures\n", + "\n", + "Next we align all the models back to the reference structure. We then extract all the ligands and the protein atoms from the reference." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "26c10e11-f001-44e5-87a4-2939ead048a8", + "metadata": { + "slideshow": { + "slide_type": "fragment" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "def align_proteins_to_ref(all_pdbs, ref_pdb, out_dir):\n", + " ref_u = mda.Universe(reference_pdb)\n", + " ref_prot = ref_u.select_atoms(\"protein and backbone\")\n", + " for pdb in all_pdbs:\n", + " print(f\"Aligning {pdb.name} to {reference_pdb.name}\")\n", + " ligand_name = pdb.name.split('_seed')[0]\n", + " mobile_u = mda.Universe(pdb)\n", + " \n", + " # Align mobile → reference using protein backbone\n", + " mobile_protein = mobile_u.select_atoms(\"protein and backbone\")\n", + " \n", + " # Perform alignment in-place\n", + " align.alignto(mobile_protein, ref_prot)\n", + " aligned_ligand = mobile_u.select_atoms(\"resname LIG\")\n", + " aligned_ligand.write(f'{out_dir}/{ligand_name}.pdb')\n", + " # load back into rdkit to add hydrogens\n", + " rdkit_mol = Chem.MolFromPDBFile(f'{out_dir}/{ligand_name}.pdb', removeHs=True)\n", + " # use the template to assign bond orders\n", + " template_mol = Chem.MolFromSmiles(ligand_smiles[ligand_name])\n", + " with rdBase.BlockLogs(): \n", + " rdkit_mol = AllChem.AssignBondOrdersFromTemplate(template_mol, rdkit_mol)\n", + " # Add hydrogens\n", + " rdkit_mol = AllChem.AddHs(rdkit_mol, addCoords=True)\n", + " # Set the molecule name\n", + " rdkit_mol.SetProp('_Name', f\"{ligand_name}\")\n", + " # write to sdf\n", + " Chem.MolToMolFile(rdkit_mol, out_dir / f\"{ligand_name}_prepped.sdf\")\n", + " \n", + " # For the reference pdb, save the protein alone\n", + " if pdb.name.split('_seed')[0] == largest_ligand:\n", + " full_protein = mobile_u.select_atoms(\"protein\")\n", + " full_protein.write(f'{out_dir}/protein.pdb')\n", + " \n", + " print(f\"\\nStructures aligned and written to {out_dir}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "73573473-ad11-423c-9b9f-bef57a5046ac", "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "(ChemicalSystem(name=state_A, components={'ligand': SmallMoleculeComponent(name=lig_jmc_27), 'protein': ProteinComponent(name=tyk2), 'solvent': SolventComponent(name=O, Na+, Cl-)}),\n", - " ChemicalSystem(name=state_B, components={'protein': ProteinComponent(name=tyk2), 'solvent': SolventComponent(name=O, Na+, Cl-)}))" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "Aligning lig_ejm_50_seed_42_sample_1_model.pdb to lig_jmc_27_seed_42_sample_1_model.pdb\n", + "Aligning lig_jmc_23_seed_42_sample_1_model.pdb to lig_jmc_27_seed_42_sample_1_model.pdb\n", + "Aligning lig_ejm_43_seed_42_sample_1_model.pdb to lig_jmc_27_seed_42_sample_1_model.pdb\n", + "Aligning lig_ejm_42_seed_42_sample_1_model.pdb to lig_jmc_27_seed_42_sample_1_model.pdb\n", + "Aligning lig_ejm_31_seed_42_sample_1_model.pdb to lig_jmc_27_seed_42_sample_1_model.pdb\n", + "Aligning lig_ejm_47_seed_42_sample_1_model.pdb to lig_jmc_27_seed_42_sample_1_model.pdb\n", + "Aligning lig_jmc_27_seed_42_sample_1_model.pdb to lig_jmc_27_seed_42_sample_1_model.pdb\n", + "Aligning lig_ejm_46_seed_42_sample_1_model.pdb to lig_jmc_27_seed_42_sample_1_model.pdb\n", + "Aligning lig_ejm_48_seed_42_sample_1_model.pdb to lig_jmc_27_seed_42_sample_1_model.pdb\n", + "Aligning lig_jmc_28_seed_42_sample_1_model.pdb to lig_jmc_27_seed_42_sample_1_model.pdb\n", + "\n", + "Structures aligned and written to openfold_to_openfe/p_aligned\n" + ] } ], "source": [ - "# Create the two end states\n", - "\n", - "# state A is the complex\n", - "stateA = openfe.ChemicalSystem({\n", - " 'ligand': ligand,\n", - " 'protein': protein,\n", - " 'solvent': solvent,\n", - "}, name=\"state_A\")\n", - "\n", - "# state B is the system without the ligand\n", - "stateB = openfe.ChemicalSystem({\n", - " 'protein': protein,\n", - " 'solvent': solvent,\n", - "}, name=\"state_B\")\n", + "p_aligned_dir = pathlib.Path(\"openfold_to_openfe/p_aligned/\")\n", + "p_aligned_dir.mkdir(exist_ok=True)\n", "\n", - "stateA, stateB" + "all_pdbs = of3_results_root.glob(\"*/*/*_seed_42_sample_1_model.pdb\")\n", + "align_proteins_to_ref(all_pdbs, reference_pdb, p_aligned_dir)" ] }, { "cell_type": "markdown", - "id": "b576d9b0-b81e-4dc1-8bf0-26fc1585b757", - "metadata": {}, + "id": "6bf56d93-222a-4651-b8cf-f451f0360878", + "metadata": { + "slideshow": { + "slide_type": "slide" + }, + "tags": [] + }, "source": [ - "Next we create the Protocol. We use the default settings, except to help us execute in parallel we set the number of repeats to 1." + "#### c) Fixing & protonating the reference protein structure\n", + "\n", + "The PDB contains the heavy atoms of the protein but is missing hydrogens and caps. Here we call PDBFixer to add hydrogens at pH 7 and add protein caps." ] }, { "cell_type": "code", - "execution_count": 12, - "id": "037cb959-8f0c-4a09-844a-30e39590eabf", - "metadata": {}, + "execution_count": 22, + "id": "fdfd428e-42af-49d3-9857-7a1b086f9ab2", + "metadata": { + "slideshow": { + "slide_type": "fragment" + }, + "tags": [] + }, "outputs": [], "source": [ - "from openfe.protocols.openmm_afe import AbsoluteBindingProtocol\n", - "\n", - "settings = AbsoluteBindingProtocol.default_settings()\n", - "settings.protocol_repeats = 1\n", - "protocol = AbsoluteBindingProtocol(settings=settings)" + "# now run the reference protein through pdbfixer\n", + "! pdbfixer openfold_to_openfe/p_aligned/protein.pdb --add-atoms=all --add-residues --output=openfold_to_openfe/p_aligned/protein_fixed.pdb" ] }, { "cell_type": "markdown", - "id": "8a643c9b-5510-4ae4-9b10-0af779821e66", - "metadata": {}, + "id": "1153dbd0-998a-4f3f-8e47-a950c806d1dd", + "metadata": { + "slideshow": { + "slide_type": "slide" + }, + "tags": [] + }, "source": [ - "Finally we create the `Transformation` object." + "#### d) Loading and assigning partial charges to the aligned ligands" ] }, { "cell_type": "code", - "execution_count": 13, - "id": "ef7a9ebf-e0d7-4dda-aac5-d4428b120814", - "metadata": {}, - "outputs": [], + "execution_count": 23, + "id": "992d53f3-d086-4283-9d6a-055be01588ad", + "metadata": { + "slideshow": { + "slide_type": "fragment" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Generating charges: 100%|███████████████████████| 10/10 [00:05<00:00, 1.81it/s]\n" + ] + } + ], "source": [ - "abfe_transformation = openfe.Transformation(\n", - " stateA=stateA,\n", - " stateB=stateB,\n", - " mapping=None,\n", - " protocol=protocol, # use protocol created above\n", - " name=f\"{ligand.name}\"\n", + "import glob\n", + "import openfe\n", + "from openfe.protocols.openmm_utils.omm_settings import OpenFFPartialChargeSettings\n", + "from openfe.protocols.openmm_utils.charge_generation import bulk_assign_partial_charges\n", + "\n", + "# Load all the ligands\n", + "ligand_sdfs = glob.glob('openfold_to_openfe/p_aligned/*_prepped.sdf')\n", + "ligands = []\n", + "for l in ligand_sdfs:\n", + " ligand = openfe.SmallMoleculeComponent.from_sdf_file(l)\n", + " ligands.append(ligand)\n", + "\n", + "# Generate partial charges\n", + "charge_settings = OpenFFPartialChargeSettings(partial_charge_method=\"nagl\")\n", + "\n", + "charged_ligands = bulk_assign_partial_charges(\n", + " molecules=ligands,\n", + " overwrite=False,\n", + " method=charge_settings.partial_charge_method,\n", + " toolkit_backend=charge_settings.off_toolkit_backend,\n", + " generate_n_conformers=1,\n", + " nagl_model=None,\n", + " processors=1\n", ")" ] }, { "cell_type": "markdown", - "id": "f89a9800-9d25-470c-845f-87479095806e", - "metadata": {}, + "id": "cc023ddb-d32a-4f78-bea1-a4f9efddf902", + "metadata": { + "slideshow": { + "slide_type": "slide" + }, + "tags": [] + }, "source": [ - "This transformation can now be run using `openfe quickrun`." + "### Creating a Separated Topologies RBFE Transformation" ] }, { "cell_type": "markdown", - "id": "f9e4f4a1-ed28-4d33-b73b-865dc5023b93", - "metadata": {}, + "id": "97f84495-88c8-49fe-987f-25ca25cdf210", + "metadata": { + "slideshow": { + "slide_type": "fragment" + }, + "tags": [] + }, "source": [ - "### 4b) Separated Topologies Relative Binding Free Energy Transformation\n", - "\n", - "We can instead build a SepTop RBFE Transformation. Here we will do the transformation between `lig_jmc_27` and `lig_ejm_46`." + "
\n" + ] + }, + { + "cell_type": "markdown", + "id": "a90d2205-1c68-4349-95b1-e20f607d4a86", + "metadata": { + "slideshow": { + "slide_type": "slide" + }, + "tags": [] + }, + "source": [ + "We can now SepTop RBFE Transformation. Here we will do the transformation between `lig_jmc_27` and `lig_ejm_46`." ] }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 24, "id": "7ad01abd-097c-466d-9a3f-74a67e4d9015", - "metadata": {}, + "metadata": { + "slideshow": { + "slide_type": "fragment" + }, + "tags": [] + }, "outputs": [], "source": [ "ligandA = [l for l in charged_ligands if l.name == 'lig_jmc_27'][0]\n", @@ -687,9 +1334,14 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 25, "id": "71d4ff18-a837-443d-bc02-69554e7d76cf", - "metadata": {}, + "metadata": { + "slideshow": { + "slide_type": "fragment" + }, + "tags": [] + }, "outputs": [], "source": [ "# Create the two end states\n", @@ -711,17 +1363,27 @@ }, { "cell_type": "markdown", - "id": "ebde65ab-8a9c-4426-a0c4-91aefd6dea68", - "metadata": {}, + "id": "54484f2f-347b-498e-b5e2-60e8c8db446a", + "metadata": { + "slideshow": { + "slide_type": "slide" + }, + "tags": [] + }, "source": [ "Next we create the Protocol. We use the default settings, except to help us execute in parallel we set the number of repeats to 1." ] }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 26, "id": "3e343c11-b693-4700-b1ea-2fa7951afa88", - "metadata": {}, + "metadata": { + "slideshow": { + "slide_type": "fragment" + }, + "tags": [] + }, "outputs": [], "source": [ "from openfe.protocols.openmm_septop import SepTopProtocol\n", @@ -733,9 +1395,14 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 27, "id": "a531a0cb-3eda-4d25-89d8-347f470d40ea", - "metadata": {}, + "metadata": { + "slideshow": { + "slide_type": "fragment" + }, + "tags": [] + }, "outputs": [], "source": [ "septop_transformation = openfe.Transformation(\n", @@ -749,27 +1416,95 @@ }, { "cell_type": "markdown", - "id": "d59f5d1b-f078-49c2-9965-9cb8abc64a71", - "metadata": {}, + "id": "db4344c5-c300-4b6e-aa0a-a7cae9c6380f", + "metadata": { + "slideshow": { + "slide_type": "fragment" + }, + "tags": [] + }, "source": [ "This transformation can now be run using `openfe quickrun`." ] }, { "cell_type": "markdown", - "id": "316727a4-aa8b-43dd-916d-b73244ee829a", - "metadata": {}, + "id": "6e16e781-c6dc-4a62-85a7-0bc59678e916", + "metadata": { + "slideshow": { + "slide_type": "slide" + }, + "tags": [] + }, + "source": [ + "### Creating a Hybrid Topology Relative Binding Free Energy Transformation\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "884c5615-b2d4-4dde-b949-7760733ec10a", + "metadata": { + "slideshow": { + "slide_type": "fragment" + }, + "tags": [] + }, "source": [ - "### 4c) Creating a Hybrid Topology Relative Binding Free Energy Transformation\n", + "Finally we create a Hybrid Topology RBFE Transformation.\n", + "\n", + "In addition to aligning the protein structures, we must also align the ligands.\n", "\n", - "Finally we create a Hybrid Topology RBFE Transformation. Again, as per the SepTop example above, we will do the transformation between `lig_jmc_27` and `lig_ejm_46`." + "We will again use the transformation between `lig_jmc_27` and `lig_ejm_46` as an example." ] }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 28, + "id": "25ef33bf-fb1a-45da-96e4-004f77ef7d34", + "metadata": { + "slideshow": { + "slide_type": "fragment" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Calculating volume of lig_ejm_50_seed_42_sample_1_model.pdb\n", + "Calculating volume of lig_jmc_23_seed_42_sample_1_model.pdb\n", + "Calculating volume of lig_ejm_43_seed_42_sample_1_model.pdb\n", + "Calculating volume of lig_ejm_42_seed_42_sample_1_model.pdb\n", + "Calculating volume of lig_ejm_31_seed_42_sample_1_model.pdb\n", + "Calculating volume of lig_ejm_47_seed_42_sample_1_model.pdb\n", + "Calculating volume of lig_jmc_27_seed_42_sample_1_model.pdb\n", + "Calculating volume of lig_ejm_46_seed_42_sample_1_model.pdb\n", + "Calculating volume of lig_ejm_48_seed_42_sample_1_model.pdb\n", + "Calculating volume of lig_jmc_28_seed_42_sample_1_model.pdb\n", + "\n", + "Largest ligand_name is lig_jmc_27 with volume 0.521\n" + ] + } + ], + "source": [ + "of3_results_root = pathlib.Path(\"assets/of3_tyk2_output/\")\n", + "largest_ligand, largest_vol= find_largest_ligand(of3_results_root.glob(\"*/*/*.pdb\"))\n", + "print(f\"\\nLargest ligand_name is {largest_ligand} with volume {largest_vol:.3f}\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 29, "id": "31d18f6d-b938-4de3-9b2f-3c6e9bedd827", - "metadata": {}, + "metadata": { + "slideshow": { + "slide_type": "fragment" + }, + "tags": [] + }, "outputs": [], "source": [ "ligandA = [l for l in charged_ligands if l.name == 'lig_jmc_27'][0]\n", @@ -779,7 +1514,12 @@ { "cell_type": "markdown", "id": "dfbf86dd-1162-4cf5-998a-2b2c01e6080c", - "metadata": {}, + "metadata": { + "slideshow": { + "slide_type": "slide" + }, + "tags": [] + }, "source": [ "Because the ligands are not guaranteed to be aligned, care must be taken to make sure that there is some core overlap between the ligands. Here we naively use the atom aligner in Kartograf to re-align the ligands." ] @@ -787,7 +1527,12 @@ { "cell_type": "markdown", "id": "eb09cf7b-e9e9-4f98-b9a5-7f6cfc9c146b", - "metadata": {}, + "metadata": { + "slideshow": { + "slide_type": "fragment" + }, + "tags": [] + }, "source": [ "
\n", "⚠️ Important Note:\n", @@ -797,9 +1542,14 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 30, "id": "b5186710-f89e-4c86-998f-4e9fe076a2d8", - "metadata": {}, + "metadata": { + "slideshow": { + "slide_type": "fragment" + }, + "tags": [] + }, "outputs": [], "source": [ "from kartograf.atom_aligner import align_mol_shape\n", @@ -812,16 +1562,26 @@ { "cell_type": "markdown", "id": "d8617ab9-77c3-4103-a9fe-233262f19b74", - "metadata": {}, + "metadata": { + "slideshow": { + "slide_type": "fragment" + }, + "tags": [] + }, "source": [ "With these aligned ligands, we can get a mapping between the two." ] }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 31, "id": "c8db1e94-c146-4daf-bdb2-4383b4fcd0d6", - "metadata": {}, + "metadata": { + "slideshow": { + "slide_type": "fragment" + }, + "tags": [] + }, "outputs": [ { "name": "stderr", @@ -846,7 +1606,7 @@ }, { "data": { - "image/png": "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", + "image/png": "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", "text/plain": [ "" ] @@ -866,16 +1626,26 @@ { "cell_type": "markdown", "id": "aeb15ac9-9999-4bb9-b5e3-bda5dda01dc9", - "metadata": {}, + "metadata": { + "slideshow": { + "slide_type": "slide" + }, + "tags": [] + }, "source": [ "Next we define the end state `ChemicalSystem`s" ] }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 32, "id": "7d3c436c-fd93-4a3e-9933-e43b00783931", - "metadata": {}, + "metadata": { + "slideshow": { + "slide_type": "fragment" + }, + "tags": [] + }, "outputs": [], "source": [ "# Complex transformation ChemicalSystems\n", @@ -897,9 +1667,14 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 33, "id": "b161b5b6-7718-4a47-b834-e3d88082bb31", - "metadata": {}, + "metadata": { + "slideshow": { + "slide_type": "fragment" + }, + "tags": [] + }, "outputs": [], "source": [ "# Solvent transformation ChemicalSystems\n", @@ -920,16 +1695,26 @@ { "cell_type": "markdown", "id": "fe4f8dd1-ffdc-4167-97ca-a24b86002613", - "metadata": {}, + "metadata": { + "slideshow": { + "slide_type": "slide" + }, + "tags": [] + }, "source": [ "Then we create the Protocols for both the solvent and complex phases." ] }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 34, "id": "3bbd3d6d-35f0-490f-8fdd-4debc7874e23", - "metadata": {}, + "metadata": { + "slideshow": { + "slide_type": "fragment" + }, + "tags": [] + }, "outputs": [], "source": [ "from openfe.protocols.openmm_rfe import RelativeHybridTopologyProtocol\n", @@ -950,16 +1735,26 @@ { "cell_type": "markdown", "id": "9030db1c-35fe-4213-930c-b967832d9c7d", - "metadata": {}, + "metadata": { + "slideshow": { + "slide_type": "slide" + }, + "tags": [] + }, "source": [ "Finally we create the Transformations" ] }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 35, "id": "8b374e77-64fb-48a1-b9ae-9b1dba74ebb5", - "metadata": {}, + "metadata": { + "slideshow": { + "slide_type": "fragment" + }, + "tags": [] + }, "outputs": [], "source": [ "transformation_complex = openfe.Transformation(\n", @@ -982,7 +1777,12 @@ { "cell_type": "markdown", "id": "f08aaff4-97d0-4f53-bb32-1c7e247432aa", - "metadata": {}, + "metadata": { + "slideshow": { + "slide_type": "fragment" + }, + "tags": [] + }, "source": [ "This transformation can now be run using `openfe quickrun`." ] @@ -990,13 +1790,26 @@ { "cell_type": "markdown", "id": "6cae5156-f80f-4520-baee-4199774d441a", - "metadata": {}, + "metadata": { + "slideshow": { + "slide_type": "slide" + }, + "tags": [] + }, "source": [ - "## 5. Creating networks and running the simulations\n", + "## 5. Running the ``Transformation`` simulations\n", "\n", "In practice, one would create entire network of Transformations, and then run all the simulations.\n", "This notebook will not cover these aspects. To find out more about this, please see the [OpenFE Tutorials](https://docs.openfree.energy/en/latest/tutorials/index.html)." ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fab60c32-e717-43b3-b8e7-81d2e2aaa9c9", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { @@ -1015,7 +1828,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.13" + "version": "3.11.15" }, "widgets": { "application/vnd.jupyter.widget-state+json": { diff --git a/environment.yaml b/environment.yaml index 6b1d00b..1bdcad7 100644 --- a/environment.yaml +++ b/environment.yaml @@ -14,5 +14,5 @@ dependencies: - pytest-cov - pytest-xdist - python - - openfe==1.11.0 + - openfe==1.11.1 - openff-interchange-base != 0.5.1 # https://github.com/openforcefield/openff-interchange/issues/1450