{ "cells": [ { "cell_type": "markdown", "id": "df10f709", "metadata": {}, "source": [ "# Tutorial 08 — Working with DNA and RNA\n", "\n", "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/uw-ipd/tmol/blob/master/docs/tutorial/08_nucleic_acids.ipynb)\n", "\n", "TMol represents proteins, DNA, and RNA in the same tensor-backed `PoseStack`. This tutorial loads DNA and RNA structures, inspects nucleic-acid score terms and chi sampling, and runs small local packing examples.\n", "\n", "## Learning objectives\n", "\n", "- Load DNA, RNA, and a protein–DNA complex from mmCIF.\n", "- Inspect nucleic-acid score terms and glycosidic chi sampling.\n", "- Run a chemically matched base-pair swap under a fixed protein shell.\n", "- Repack an RNA aptamer around a fixed small molecule.\n", "\n", "## Before you begin\n", "\n", "- **Prerequisites:** The core Tutorials 01–06; [07 — Ligands](07_ligand_and_params.ipynb) is recommended for the RNA–ligand section.\n", "- **Curriculum:** This is the final specialized path after 06 and completes the numbered Tutorials sequence.\n", "- **Related:** [Nucleic-acid workflow](../workflows/nucleic_acids.md) · [Scoring workflow](../user_guide/scoring.md)\n", "\n", "TMol provides lower-level DNA/RNA primitives rather than full RosettaDNA or Rosetta RNA protocols. Short seeded runs are smoke tests; assess sampling and convergence separately." ] }, { "cell_type": "markdown", "id": "34247444", "metadata": {}, "source": [ "## Setup\n", "\n", "The three structures are checked into the repository so the executed documentation never depends on a live structure download. CIF is the primary input because it preserves richer chemical and author metadata than PDB; the ligand-bearing aptamer additionally uses CIF chemical-component bonds during ligand preparation." ] }, { "cell_type": "code", "execution_count": 1, "id": "498c69a7", "metadata": {}, "outputs": [], "source": [ "try:\n", " import google.colab # noqa: F401\n", "except ImportError:\n", " IN_COLAB = False\n", "else:\n", " IN_COLAB = True\n", "\n", "if IN_COLAB:\n", " from urllib.request import urlopen\n", "\n", " exec(\n", " urlopen(\n", " \"https://raw.githubusercontent.com/uw-ipd/tmol/\"\n", " \"master/docs/tutorial/colab_setup.py\"\n", " ).read(),\n", " globals(),\n", " )\n", " setup_colab(\n", " [\n", " \"tmol/tests/data/cif/1BNA.cif\",\n", " \"tmol/tests/data/cif/1HDD.cif\",\n", " \"tmol/tests/data/cif/1EHT.cif\",\n", " ]\n", " )" ] }, { "cell_type": "code", "execution_count": 2, "id": "800dc23b", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "device=cpu; TMol=0.1.54\n" ] } ], "source": [ "from contextlib import redirect_stderr, redirect_stdout\n", "from io import StringIO\n", "from pathlib import Path\n", "\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import pandas as pd\n", "import torch\n", "from IPython.display import display\n", "from biotite.structure.io import load_structure\n", "\n", "import tmol\n", "from tmol.database import ParameterDatabase\n", "from tmol.io import pose_stack_from_biotite\n", "from tmol.ops import (\n", " build_sidechain_coord_mask,\n", " compute_block_adjacency,\n", " compute_block_centroids_and_furthest_dist,\n", " res_mask_to_coord_mask,\n", ")\n", "from tmol.optimization import run_cart_min\n", "from tmol.pack import PackerPalette, PackerTask, SetPackerTask, pack_rotamers\n", "from tmol.pack.rotamer import (\n", " FixedAAChiSampler,\n", " IncludeCurrentSampler,\n", " NaChiRotamerSampler,\n", ")\n", "from tmol.pack.rotamer.dunbrack import create_dunbrack_sampler_from_database\n", "from tmol.pose import PoseStackBuilder\n", "from tmol.score import ScoreType, beta2016_score_function\n", "\n", "SEED = 20260808\n", "np.random.seed(SEED)\n", "torch.manual_seed(SEED)\n", "if torch.cuda.is_available():\n", " torch.cuda.manual_seed_all(SEED)\n", "\n", "device = (\n", " torch.device(\"cuda\", torch.cuda.current_device())\n", " if torch.cuda.is_available()\n", " else torch.device(\"cpu\")\n", ")\n", "param_db = ParameterDatabase.get_default()\n", "score_function = beta2016_score_function(device, param_db=param_db)\n", "repo_root = Path.cwd()\n", "if not (repo_root / \"tmol/tests/data/cif/1BNA.cif\").exists():\n", " repo_root = Path(tmol.__file__).resolve().parents[1]\n", "\n", "\n", "def show_table(frame):\n", " try:\n", " from itables import show\n", " except ImportError:\n", " return display(frame)\n", " return show(frame)\n", "\n", "\n", "def build_pose(atom_array, *, prepare_ligands=False, return_context=False):\n", " diagnostics = StringIO()\n", " try:\n", " with redirect_stdout(diagnostics), redirect_stderr(diagnostics):\n", " return pose_stack_from_biotite(\n", " atom_array,\n", " device,\n", " param_db=param_db,\n", " no_optH=True,\n", " prepare_ligands=prepare_ligands,\n", " return_context=return_context,\n", " )\n", " except Exception:\n", " print(diagnostics.getvalue())\n", " raise\n", "\n", "\n", "def block_mask_for_chains(pose, chains):\n", " labels = np.asarray(pose.pdb_info.chain_labels)\n", " return torch.as_tensor(np.isin(labels, list(chains)), device=pose.device)\n", "\n", "\n", "def block_mask_for_name3(pose, names):\n", " mask = torch.zeros_like(pose.block_type_ind, dtype=torch.bool)\n", " for pose_index in range(pose.n_poses):\n", " for block_index in range(pose.max_n_blocks):\n", " if int(pose.block_type_ind64[pose_index, block_index]) < 0:\n", " continue\n", " mask[pose_index, block_index] = pose.block_type(\n", " pose_index, block_index\n", " ).name3 in names\n", " return mask\n", "\n", "\n", "NA_NAMES = {\"DA\", \"DC\", \"DG\", \"DT\", \"A\", \"C\", \"G\", \"U\"}\n", "PROTON_CHI_HYDROGENS = {\"HO2'\", \"HO3'\", \"HO5'\"}\n", "ELEMENT_BY_ATOM_TYPE = {\n", " atom_type.name: atom_type.element for atom_type in param_db.chemical.atom_types\n", "}\n", "\n", "\n", "def build_na_base_and_proton_chi_coord_mask(pose, block_mask):\n", " \"\"\"Select NA bases and hydroxyl proton-chi atoms, fixing sugar/phosphate.\"\"\"\n", " mask = torch.zeros_like(pose.real_atoms)\n", " for pose_index, block_index in torch.nonzero(block_mask, as_tuple=False).tolist():\n", " block_type = pose.block_type(pose_index, block_index)\n", " if block_type.name3 not in NA_NAMES:\n", " raise ValueError(f\"Expected a nucleotide, got {block_type.name3}\")\n", " offset = int(pose.block_coord_offset64[pose_index, block_index])\n", " for atom_index, atom in enumerate(block_type.atoms):\n", " name = atom.name\n", " is_sugar = \"'\" in name\n", " is_phosphate = (\n", " name == \"P\"\n", " or name.startswith(\"OP\")\n", " or (name.startswith(\"O\") and name.endswith(\"P\"))\n", " )\n", " if (not is_sugar and not is_phosphate) or name in PROTON_CHI_HYDROGENS:\n", " mask[pose_index, offset + atom_index] = True\n", " return mask\n", "\n", "\n", "def heavy_atom_coord_mask(pose, block_mask):\n", " mask = torch.zeros_like(pose.real_atoms)\n", " for pose_index, block_index in torch.nonzero(block_mask, as_tuple=False).tolist():\n", " block_type = pose.block_type(pose_index, block_index)\n", " offset = int(pose.block_coord_offset64[pose_index, block_index])\n", " for atom_index, atom in enumerate(block_type.atoms):\n", " if ELEMENT_BY_ATOM_TYPE.get(atom.atom_type) != \"H\":\n", " mask[pose_index, offset + atom_index] = True\n", " return mask\n", "\n", "\n", "def atom_coord_for_block(pose, block_index, atom_name, pose_index=0):\n", " block_type = pose.block_type(pose_index, block_index)\n", " matching = [\n", " atom_index\n", " for atom_index, atom in enumerate(block_type.atoms)\n", " if atom.name == atom_name\n", " ]\n", " if len(matching) != 1:\n", " raise ValueError(\n", " f\"Expected one {atom_name} in block {block_index} \"\n", " f\"({block_type.name3}); found {len(matching)}\"\n", " )\n", " offset = int(pose.block_coord_offset64[pose_index, block_index])\n", " return pose.coords[pose_index, offset + matching[0]]\n", "\n", "\n", "def named_atom_distance(pose, first_block, first_atom, second_block, second_atom):\n", " distance = torch.linalg.vector_norm(\n", " atom_coord_for_block(pose, first_block, first_atom)\n", " - atom_coord_for_block(pose, second_block, second_atom)\n", " )\n", " return float(distance.detach().cpu())\n", "\n", "\n", "def interface_geometry_diagnostics(pose, first_blocks, second_blocks, cutoff=2.0):\n", " first = pose.coords[heavy_atom_coord_mask(pose, first_blocks)]\n", " second = pose.coords[heavy_atom_coord_mask(pose, second_blocks)]\n", " distances = torch.cdist(first, second)\n", " return {\n", " \"minimum_intergroup_heavy_atom_distance_A\": float(distances.min().detach().cpu()),\n", " f\"intergroup_heavy_atom_pairs_below_{cutoff:g}A\": int(\n", " (distances < cutoff).sum().detach().cpu()\n", " ),\n", " }\n", "\n", "\n", "def covalent_bond_pairs(pose):\n", " \"\"\"Return unique intra- and inter-residue covalent coordinate-index pairs.\"\"\"\n", " pairs = set()\n", " for block_index in range(pose.max_n_blocks):\n", " if int(pose.block_type_ind64[0, block_index]) < 0:\n", " continue\n", " block_type = pose.block_type(0, block_index)\n", " offset = int(pose.block_coord_offset64[0, block_index])\n", " for first, second in block_type.bond_indices:\n", " first, second = int(first), int(second)\n", " if first < second:\n", " pairs.add((offset + first, offset + second))\n", " for connection_index, atom_index in enumerate(\n", " block_type.ordered_connection_atoms\n", " ):\n", " partner_block, partner_connection = pose.inter_residue_connections64[\n", " 0, block_index, connection_index\n", " ].tolist()\n", " if partner_block < 0:\n", " continue\n", " partner_type = pose.block_type(0, partner_block)\n", " partner_offset = int(pose.block_coord_offset64[0, partner_block])\n", " partner_atom = int(\n", " partner_type.ordered_connection_atoms[partner_connection]\n", " )\n", " pair = tuple(\n", " sorted((offset + int(atom_index), partner_offset + partner_atom))\n", " )\n", " pairs.add(pair)\n", " return sorted(pairs)\n", "\n", "\n", "def bond_length_change_diagnostics(before, after, scope_mask):\n", " \"\"\"Measure covalent bond-length drift from a pre-refinement reference.\"\"\"\n", " pairs = [\n", " pair\n", " for pair in covalent_bond_pairs(before)\n", " if bool(scope_mask[0, pair[0]] or scope_mask[0, pair[1]])\n", " ]\n", " first = torch.tensor([pair[0] for pair in pairs], device=before.device)\n", " second = torch.tensor([pair[1] for pair in pairs], device=before.device)\n", " before_lengths = torch.linalg.vector_norm(\n", " before.coords[0, first] - before.coords[0, second], dim=-1\n", " )\n", " after_lengths = torch.linalg.vector_norm(\n", " after.coords[0, first] - after.coords[0, second], dim=-1\n", " )\n", " changes = after_lengths - before_lengths\n", " return {\n", " \"covalent_bonds_touching_movable_atoms\": len(pairs),\n", " \"bond_length_RMS_change_A\": float(\n", " torch.sqrt(torch.mean(changes.square())).detach().cpu()\n", " ),\n", " \"maximum_absolute_bond_length_change_A\": float(\n", " changes.abs().max().detach().cpu()\n", " ),\n", " }\n", "\n", "\n", "print(f\"device={device}; TMol={tmol.__version__}\")" ] }, { "cell_type": "markdown", "id": "f636d490", "metadata": {}, "source": [ "## Three nucleic-acid systems\n", "\n", "1BNA provides canonical B-form DNA. The 1HDD structure contains two engrailed homeodomains bound to a DNA duplex; one homeodomain uses an N-terminal arm in the minor groove and a recognition helix in the major groove. The 1EHT NMR model is a 33-nt RNA aptamer surrounding theophylline. The overview below compares polymer-only poses; the later aptamer section reloads the full 1EHT CIF and prepares TEP." ] }, { "cell_type": "code", "execution_count": 3, "id": "d90e3476", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", " \n", " \n", " \n", " \n", " \n", "\n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", "\n", "\n", "
structureblocksDNA blocksRNA blocksfinite coordinates
B-form DNA — 1BNA24240True
engrailed homeodomain–DNA — 1HDD156420True
RNA aptamer without ligand — 1EHT33033True
\n", "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n", "
\n", " \n", "
\n", " \n", "
\n", "
\n", "
\n", "

3Dmol.js failed to load for some reason. Please check your browser console for error messages.

\n", "
\n", "\n", "
\n", "
\n", "
\n", "
\n", "

3Dmol.js failed to load for some reason. Please check your browser console for error messages.

\n", "
\n", "\n", "
\n", "
\n", "
\n", "
\n", "

3Dmol.js failed to load for some reason. Please check your browser console for error messages.

\n", "
\n", "\n", "
\n", "
\n", "
\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "cif_paths = {\n", " \"B-form DNA — 1BNA\": repo_root / \"tmol/tests/data/cif/1BNA.cif\",\n", " \"engrailed homeodomain–DNA — 1HDD\": repo_root / \"tmol/tests/data/cif/1HDD.cif\",\n", " \"theophylline RNA aptamer — 1EHT\": repo_root / \"tmol/tests/data/cif/1EHT.cif\",\n", "}\n", "atom_arrays = {\n", " label: load_structure(str(path), model=1, include_bonds=True)\n", " for label, path in cif_paths.items()\n", "}\n", "polymer_arrays = {\n", " label: atoms[~atoms.hetero]\n", " for label, atoms in atom_arrays.items()\n", "}\n", "\n", "poses = {\n", " \"B-form DNA — 1BNA\": build_pose(polymer_arrays[\"B-form DNA — 1BNA\"]),\n", " \"engrailed homeodomain–DNA — 1HDD\": build_pose(\n", " polymer_arrays[\"engrailed homeodomain–DNA — 1HDD\"]\n", " ),\n", " \"RNA aptamer without ligand — 1EHT\": build_pose(\n", " polymer_arrays[\"theophylline RNA aptamer — 1EHT\"]\n", " ),\n", "}\n", "overview_rows = []\n", "for label, pose in poses.items():\n", " name3s = [\n", " pose.block_type(0, block_index).name3\n", " for block_index in range(pose.max_n_blocks)\n", " if int(pose.block_type_ind64[0, block_index]) >= 0\n", " ]\n", " overview_rows.append(\n", " {\n", " \"structure\": label,\n", " \"blocks\": len(name3s),\n", " \"DNA blocks\": sum(name in {\"DA\", \"DC\", \"DG\", \"DT\"} for name in name3s),\n", " \"RNA blocks\": sum(name in {\"A\", \"C\", \"G\", \"U\"} for name in name3s),\n", " \"finite coordinates\": bool(torch.isfinite(pose.coords[pose.real_atoms]).all()),\n", " }\n", " )\n", "show_table(pd.DataFrame(overview_rows))\n", "display(tmol.switchable_view(poses))" ] }, { "cell_type": "markdown", "id": "d3ab4e6b", "metadata": {}, "source": [ "## Score terms that act on DNA and RNA\n", "\n", "`beta2016` includes the ordinary all-atom nonbonded terms—including anisotropic and isotropic `lk_ball` solvation—nucleic-acid cartbonded parameters, and the combined `na_torsion`/`na_torsion_well` model added for DNA and RNA. RNA 2′-OH geometry also contributes through `cart_hxltorsions`; canonical DNA lacks those hydroxyl-torsion rows. The table reports a curated set of weighted values from the same score function, including the small bridge-solvation terms, in TMol score units—not kcal/mol or thermodynamic free energies.\n", "\n", "The TMol repository does not identify a dedicated publication for its exact DNA/RNA nonbonded OptE fit. Cite the [general OptE documentation](https://docs.rosettacommons.org/docs/latest/application_documentation/utilities/opt-e-parallel-doc) and the TMol source rather than inferring a fit-specific paper.\n", "\n", "For the NA-only DNA and RNA poses, amino-acid-only backbone/reference/rotamer terms (`rama`, `omega`, `ref`, and the Dunbrack terms) are expected to be zero; `gen_torsions` is likewise unparameterized for canonical NA. The code asserts those expected gaps and retains their zero rows. They can be nonzero in the mixed protein–DNA pose, so the expectation column is scoped explicitly to NA-only systems." ] }, { "cell_type": "code", "execution_count": 4, "id": "186569ef", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", " \n", " \n", " \n", " \n", " \n", "\n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
structuretermweighted_valueNA-only expectation
0B-form DNA — 1BNAfa_ljatr-314.338593parameterized / applicability-dependent
1B-form DNA — 1BNAfa_ljrep35.431660parameterized / applicability-dependent
2B-form DNA — 1BNAfa_lk114.828514parameterized / applicability-dependent
3B-form DNA — 1BNAfa_elec-68.453705parameterized / applicability-dependent
4B-form DNA — 1BNAhbond-57.070004parameterized / applicability-dependent
5B-form DNA — 1BNAcart_lengths12.928965parameterized / applicability-dependent
6B-form DNA — 1BNAcart_angles42.472569parameterized / applicability-dependent
7B-form DNA — 1BNAcart_torsions2.415583parameterized / applicability-dependent
8B-form DNA — 1BNAcart_impropers0.000000zero (no canonical-NA parameterization)
9B-form DNA — 1BNAcart_hxltorsions0.000000parameterized / applicability-dependent
(59 more rows not shown)
\n", "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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9Rg1ahQiIiJw/vx5mJmZAQDWr1+P+Ph4/PTTTxgzZgwkEgmqV68uLnb6pc2bN8PJyQmTJk3Cpk2bsGLFCjg7O0NfX1+ss2vXLvzyyy/YsGEDJk+eDEEQMGXKFPH419eTpd3cYjI2Nsa1a9fQpEkTzJ8/H5MnT0ZoaCj+++8/hd9HIiIiIiKi7yURBEFQdhBFUUJCAvT19REfHw89PT2pYx8/fsSzZ89gY2MDTU1NJUVIRPTj4c9HIiquHDc7KjsEmdwdeFfZIRARFYi8ntG/xhEhRERERERERFRiMBFCRERERERERCUGEyFEREREREREVGIwEUJEREREREREJQYTIURERERERERUYjARQkREREREREQlBhMhRERERERERFRiMBFCRERERERERCUGEyFEREREREREVGIwEUIKM3v2bNSoUQMWFha4c+eOssMhIiIiIiIiykZN2QGUJBWm/luo1wtf0D5f9cePH489e/YAACQSCQwNDVG7dm3MmDEDdnZ2eZ574sQJLF26FP7+/ihfvjxMTEzkjluRGjZsiIiICEgkEmhoaKBcuXKoW7cuvLy84OTklK1uZGQkDh06hDp16ojlq1atwoEDBxAQECBV/59//sGMGTMwfvx4jB8/vhB681lycjJ27tyJDRs2IDIyEtevX4epqalUnax+A4CKigpMTEzg5uaG6dOnQ1dXV6peUegzERERERGRonBECIliY2NhaWmJwMBAXLlyBZs2bcKbN2/QokULpKen53nuvXv3YG9vD2dnZ1hYWEBdXb2Qos7b69ev0atXL1y5cgWnTp3C/PnzkZGRgfr162PFihXZ6r558wZTpkyRKk9ISMCbN2+ytb1mzRro6Ohg7dq1EAShILsh5aeffsKlS5fQq1cvvHz5Msf3JqvfgYGBuHjxIubPn4/du3dj2LBh2eoVhT4TEREREREpChMhJEVDQwMWFhawsLBAnTp1MHXqVERERCA8PDzXc4YPHw5vb2+EhITAwsICTZs2BQAIgoCVK1eiXr16sLW1RdeuXbNNmenbty9mzpyJiRMnolq1aujVqxcAoEKFCli3bh369u2LatWqoXHjxjh58iQePHiArl27wt7eHq1atUJISMg3+6SnpwcLCwvY2NjAxcUFa9aswdKlSzFhwgTcu3dPqu6AAQNw7tw5nDhxIs8279y5g+DgYBw8eBCv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sWOKjoOIiIiIiIiIqMDJlQhp06aNouMgIiIiIiIiIipwciVCsiQnJ+Pp06cQBAF2dnYoXbq0ouIiIiIiIiIiIlI4uRZLTUtLw4QJE2BoaIgaNWqgZs2aMDQ0xIQJE5CWlqboGImIiIiIiIiIFEKuESFTp07F/v374evriwYNGkAikeDKlSuYPn06AGDp0qUKDZKIiIiIiIiISBHkSoRs374dR48eRf369cUyW1tb2Nvbo3PnzkyEEBEREREREdEPSa6pMXFxcbC3t89WXqlSJcTFxX1vTEREREREREREBUKuREjNmjXx559/ZitfsWIFatSo8d1BEREREREREREVBLmmxixatAht27bFgQMHxOkxV69exePHj3H8+HGFBkhEREREBaPC1H+VHYJMwhe0V3YIRERUjMiVCHF1dcXDhw/x559/4t69e5BIJHB3d8fRo0dhZWWl6BiJiIiIqCSbra/sCL7Nhv8GJiIqKuRKhACAtbU1lixZoshYiIiIiIiIiIgKlFxrhKSmpiIgICBbeUBAANLS0r43JiIiIiIiIiKiAiFXImTmzJkICgrKVn716lXMnj37e2MiIiIiIiIiIioQciVCtmzZgkGDBmUrHzRoELZs2fK9MRERERERERERFQi5EiFJSUk5ToFJS0tDXFzc98ZERERERERERFQg5EqENGnSBL///jsyMzPFsszMTMyZMwdNmjRRWHBERERERERERIok164xCxcuRNOmTXH+/Hk0btwYgiDg0qVLeP36NS5cuKDoGImIiIiIiIiIFEKuESE1atTA7du30a5dOzx9+hTPnj1D+/btcfv2bdSoUUPRMRIRERERERERKYRcI0IAoEKFCli6dKn4Oj09HWpqcjdHRERERERERFTg5BoREhoaipkzZ4qvp0+fDi0tLdjZ2eH+/fsKC46IiIiIiIiISJHkSoSMGzcODRs2BAA8ffoUK1aswLZt2+Dm5oZJkyYpNEAiIiIiIiIiIkWRay7LhQsXsHPnTgDAiRMn0KlTJ/Tu3Rvu7u6ws7NTaIBERERERERERIoi14gQdXV1REdHAwD8/PzQokULAJ+30FVVVVVcdERERERERERECiTXiJDWrVujT58+qF+/Ps6cOYO///4bABAQECAmRYiIiIiIiIiIfjRyjQhZs2YNGjZsiMjISOzduxdmZmYAgOPHj2P27NmKjI+IiIiIiIiISGHkGhGir6+P5cuXZyv39fX97oCIiIiIiIiIiAqKXIkQZXrz5g2uXbsGNTU11KlTB+XKlctWJz09HRcuXEBUVBQcHR1RvXp1ueoQERERERERUfFSZBIhgiDAy8sLp0+fhpOTE5KTk3HlyhUsWbIEP//8s1gvNjYW7u7uiI2NhYODA86dOwcvLy+sWLEiX3WIiIiIiIiIqPgpUokQFxcXbNiwAWpqn8P29fXF8OHD0aZNG9jY2AAApk+fjpSUFNy9exc6Ojq4evUqGjZsiLZt26J169Yy1yEiIiIiIiKi4keuxVKVQUVFBYMGDRKTIADQsWNHZGRk4MGDBwA+J0t27doFLy8v6OjoAACcnZ3h7OyMHTt2yFyHiIiIiIiIiIonmUeExMXFydyogYGBHKHkn5+fH1RUVODg4AAAiIiIQHx8fLb1PhwcHHDz5k2Z6+QkNTUVqamp4uuEhARFdYOIiIiIiIiIConMiRBDQ0OZGxUEQa5g8iM0NBTjxo3D2LFjYWVlBQCIj48HkD0RU6ZMGfGYLHVyMn/+fHh7eysoeiIiIiIiIiJSBpmnxty6dUv8s2LFChgZGWHx4sUICAhAQEAAFi9eDCMjI6xcubIg4wUAvHjxAm5ubnB1dcXixYvFci0tLQDAhw8fpOonJiaKx2Spk5Np06YhPj5e/BMREaGQvhARERERERFR4ZF5RIiTk5P496FDh2Lfvn1wcXERy1xcXFCvXj1MmjQJY8eOVWiQX4qIiICrqytq1aqFXbt2Sa0ZYmVlBXV1dYSHh0udEx4eDltbW5nr5ERDQwMaGhoK6wcRERERERERFT65Fku9f/++VGIkS82aNXH//v3vjSlXkZGRcHV1Rc2aNbFnzx6oq6tLHS9VqhTc3d2xe/dusSwqKgpnzpxBhw4dZK5DRERERERERMWTXNvnli9fHn///TcmT54sVb5+/XqUL19eIYF97ePHj2jRogWSkpLQrl07bN++XTzWuHFj2NvbAwAWLlyIxo0bo1evXmjQoAE2bdoEJycnDBw4UKwvSx0iIiIiIiIiKn7kSoQsXboU3bt3x759+1CvXj0IgoDr16/j9u3bOHDggKJjBACkp6ejUaNGAIBLly5JHatYsaKYCHFwcMDt27exceNGPHr0CMOHD8eQIUOkRo/IUoeIiIiIiIiIih+JIOcWL2FhYVizZo04FaZatWoYPXo0bGxsFBrgjyohIQH6+vqIj4+Hnp6essMhIiIiyrcKU/9VdggyCdfsp+wQvsnRxkrZIcjk7sC7yg6BiKhA5OcZXa4RIcDnURhLly6V93QiIiIiIiIiokIn12KpAJCZmYnbt2/j4MGDYllqaqpCgiIiIiIiIiIiKghyjQh5/fo1unTpguvXryMzMxNZs2u6deuGsWPHonXr1goNkoiIiIiIiIqx2frKjkA2s+OVHQEpgFwjQsaNG4dKlSohPl76QzB16lT88ccfCgmMiIiIiIiIiEjR5BoRcvr0ady7dw86OjpS5TVr1kRQUJBCAiMiIiIiIiIiUjS5RoQkJyejVKlSAACJRCKWv3v3DpqamoqJjIiIiIiIiIhIweRKhDRp0gSbNm0C8H+JkLS0NEyfPh2urq4KC46IiIiIiIiISJHkmhqzePFiuLq64sSJExAEAT/99BPOnj2LhIQEXL58WdExEhERERERESmd42ZHZYfwTXcH3lV2CD88uUaE1KhRA7dv30bNmjXRvHlzhIeHo3v37ggODkaVKlUUHSMRERERERERkULINSJkyJAh8PHxwcKFC3M9RkRERERERET0o5FrRIivr2+O5YIgYOPGjd8VEBERERERERFRQcnXiJD09PQc/w4AmZmZuHjxIkxMTBQTGRERERERERGRguUrEaKurp7j3780Z86c74uIiIiIiIiIiKiA5CsRcvbsWQBA8+bNxb9nUVdXh7W1NSwsLBQXHRERERERERGRAuUrEeLq6goAuHv3LhwcHAoiHiIiIiIiIiKiAiPXrjFZSZDY2FjExsZmO25nZ/d9URERERERERERFQC5EiE3btyAh4cHHj58mONxQRC+KygiIiIiIiIiooIgVyJkxIgRqFu3Lnbs2AFDQ0NFx0REREREREREVCDkSoTcv38f/v7+0NfXV3Q8REREREREREQFRkWek2xsbPD+/XtFx0JEREREREREVKDkSoRMmTIFI0aMwLNnzxQdDxERERERERFRgZF5aoyamnTVjIwMVKxYESoqKpBIJFLH0tPTFRMdEREREREREZECyZwIOXbsWEHGQURERERERERU4GROhLRp06Yg4yAiIiIiIiIiKnBy7RoTFxeX6zENDQ1oaWnJGw8RERERERERUYGRKxFiaGiY53FTU1P89NNPmDNnTra1RYiIiIiIiIiIlEWuLMWKFSswf/58TJkyBbVr14ZEIsH169excOFCjB8/HgYGBpgzZw5Kly6NGTNmKDpmIiIiIiIiIiK5yJUI2bZtG/bt24cmTZqIZc2aNUPdunUxceJEBAUFwc7ODiNHjmQihIiIiIiIiIh+GCrynHT//n04OjpmK69Zsybu378PAHB2dsbLly+/LzoiIiIiIiIiIgWSKxFibm4OHx+fbOXr16+Hubk5AODRo0c5JkuIiIiIiIiIiJRFrqkxixcvRs+ePbFnzx7UrVsXgiDg+vXruHXrFvbu3QsA2Lp1K7y9vRUaLBEREREREcmuwtR/lR2CTMI1lR0BlSRyJUK6dOmCBw8eYM2aNXjw4AEkEgkaN26MHTt2wM7ODsDnBVWJiIiIiIiIiH4kcu9ta2dnh+XLlysyFiIiIiIiIiKiAiVzIuTjx48AAE1NTfHvudHU5LgmIiIiIiIiIvrxyLxYqpaWFrS0tKT+ntufomDjxo2oWbMmTE1N4e7ujlu3bik7JCIiIiIiIiIqYDKPCLlw4UKOfy+Kdu7ciZ9//hm+vr5o2LAhFi9ejBYtWuD+/fswMzNTdnhEREREREREVEBkToQ0adIkx78XRfPnz8dPP/0EDw8PAMCaNWtw6NAh/PXXX5gzZ46SoyMiIiIiIiKigiLz1JivZWZm4vbt2zh48KBYlpqaqpCgClJcXBzu3r2Lli1bimWqqqpo0aIFLl68qMTIiIiIiIiIiKigybVrzOvXr9GlSxdcv34dmZmZEAQBANCtWzeMHTsWrVu3VmiQivTq1SsAgImJiVR5uXLlcPPmzVzPS01NlUr0JCQkSP2XiIiIqKjJTE1WdggySZAIyg7hmzJSMpQdgkz4b9eSh99zxSoK3/WS+j3PT7/lSoSMGzcOlSpVwunTp6GrqyuWT506FTNmzPihEyFZVFSkB8OoqamJCZ2czJ8/H97e3tnKLS0tFR4bEREREf0ffWUHIJMHyg5AJvo/F427SSVP0flk/vjfdX7Pv02uRMjp06dx79496OjoSJXXrFkTQUFBCgmsoJQrVw4AEB0dLVX+9u1b8VhOpk2bhvHjx4uvExISYGlpiYiICOjp6RVMsD8oh1knlB2CTEK8f/yEHAA02NFA2SF8U2C/QGWHQEpQFL7rIZqDlR2CTBpYWyg7BJnwu05ERERFVdYzuizkSoQkJyejVKlSAACJRCKWv3v3DpqamvI0WWiMjIxQsWJFXLhwAV26dBHLz58/jx49euR6noaGBjQ0NLKV6+nplbhEiIpGaWWHIJOi8r6oaqkqO4RvKir3khSrKHzX9TQk3670AygK33OA33UiIiIqGeRaLLVJkybYtGkTgP9LhKSlpWH69OlwdXVVWHAF5X//+x98fHxw6dIlpKWlYf78+Xjz5g2GDx+u7NCIiIiIiIiIqADJNSJk8eLFcHV1xYkTJyAIAn766SecPXsWCQkJuHz5sqJjVLgxY8YgOjoa7dq1w4cPH1ChQgUcOnQI9vb2yg6NiIiIiIiIiAqQXCNCatSogdu3b6NmzZpo3rw5wsPD0b17dwQHB6NKlSqKjlHhJBIJ5syZg7i4OCQmJiI0NBRt2rRRdlhEREREREREVMDkGhFy+/Zt1KhRAwsXLlR0PIVKIpFAS0tL2WEQERERERERUSGRKxFSq1YtGBoaolmzZnB1dYWrqytq1KghtXAqEREREREREdGPRq6pMdHR0fDx8YGVlRU2btyIWrVqwcjICF27dsXKlSsVHSMRERERERERkULIlQgpU6aMmPS4ffs2njx5go4dO+Lo0aP45ZdfFBwiEREREREREZFiyDU1Jj4+HhcuXMDZs2cREBCAu3fvwtHREf/73/+KxPa5RERUTMyOV3YEstnsqOwIiIiIiOj/kysRUrZsWRgaGmLAgAGYPXs2mjVrBn19fUXHRkRERERERESkUHIlQjp06IDz589j69atiIiIQGRkJFxdXVG1alVFx0dEREREREREpDByJUIOHTqEzMxM3L59GwEBAfDz88Ovv/4KDQ0NuLq6YufOnYqOk4iICln4gvbKDoGIiIiISOHkSoQAgIqKCpycnKCmpgZVVVUAwL///ovdu3czEUJEREREREREPyS5EiGrV69GQEAAAgICEBsbi6pVq4ojQbhYavHH3xITERERERFRUSVXImTdunVwcXHBX3/9BVdXVxgbGys6LiIiIiIiIiIihZMrERISEqLoOIiIiIiIiIiICpyKsgMgIiIiIiIiIiosTIQQERERERERUYnBRAgRERERERERlRhMhBARERERERFRicFECBERERERERGVGEyEEBEREREREVGJwUQIEREREREREZUYTIQQERERERERUYnBRAgRERERERERlRhMhBARERERERFRicFECBERERERERGVGEyEEBEREREREVGJoabsAIiIiIq7uwPvKjsEIiIiIvr/OCKEiIiIiIiIiEoMJkKIiIiIiIiIqMRgIoSIiIiIiIiISgwmQoiIiIiIiIioxGAihIiIiIiIiIhKDCZCiIiIiIiIiKjEYCKEiIiIiIiIiEoMJkKIiIiIiIiIqMRgIoSIiIiIiIiISgw1ZQeQXzdu3MDly5ehpqaGxo0bo0aNGtnqxMfH48CBA4iKioKjoyPatWsHiUSS7zpEREREREREVLwUmREhmZmZaN68OUaMGIEnT57gxo0baNiwIaZPny5V78WLF3B0dMT69evx8uVLDBs2DN26dYMgCPmqQ0RERERERETFj0QoIk//giDg3LlzcHV1FcuOHDmCzp074/79+6hatSoAoG/fvggLC8OlS5egpqaGx48fo1q1ati5cyd69uwpc51vSUhIgL6+PuLj46Gnp6fw/lLJ4bjZUdkhfNPdgXeVHQIREREREVGu8vOMXmRGhEgkEqkkCAA4OzsDAMLDwwEAGRkZOHz4MDw9PaGm9nnWT6VKldCsWTPs27dP5jpEREREREREVDwVuTVCvrRr1y6UKlUKtWvXBvB5yktKSgrs7e2l6tnb2+Pq1asy18lJamoqUlNTxdcJCQmK6gYRERERERERFRKlJkIOHTqE4ODgPOuMHTsWZcqUyVZ+9epVTJ06Fd7e3jAxMQEAJCUlAQD09fWl6hoYGIjHZKmTk/nz58Pb2zvvDhERERERERHRD63ITI35UnBwMNq1a4ehQ4di6tSpYrmOjg6AzzvCfCkuLk48JkudnEybNg3x8fHin4iICIX0hYiIiIiIiIgKj1JHhHTp0gVdunTJ1zl37tyBm5sb+vbti1WrVkkds7S0hJaWFp48eYLWrVuL5U+ePEHlypVlrpMTDQ0NaGho5CtWIiIiIiIiIvqxFKkRIXfv3kXLli3Rp08frF69OttxNTU1dO7cGVu3bkV6ejoA4PHjxzh//jy6d+8ucx0iIiIiIiIiKp6KzPa5ycnJqFChAiQSCX7++WepY506dZJaMLVx48awtLRE3bp1ceDAAdSrVw8HDhyARCKRuc63cPtcUhRun0tERERERPR98vOMXqR2jRk5cuQ361hZWSEkJAT79+9HVFQU1q1bh/bt20slOGSpQ0RERERERETFT5EZEfKj4YgQUhSOCCEiIiIiIvo++XlGL1JrhBARERERERERfQ8mQoiIiIiIiIioxGAihIiIiIiIiIhKDCZCiIiIiIiIiKjEYCKEiIiIiIiIiEoMJkKIiIiIiIiIqMRgIoSIiIiIiIiISgwmQoiIiIiIiIioxGAihIiIiIiIiIhKDCZCiIiIiIiIiKjEYCKEiIiIiIiIiEoMJkKIiIiIiIiIqMRgIoSIiIiIiIiISgwmQoiIiIiIiIioxGAihIiIiIiIiIhKDDVlB0BU0t0deFfZIRAREREREZUYHBFCRERERERERCUGEyFEREREREREVGIwEUJEREREREREJQYTIURERERERERUYjARQkREREREREQlBhMhRERERERERFRiMBFCRERERERERCUGEyFEREREREREVGIwEUJEREREREREJQYTIURERERERERUYqgpO4CiShAEAEBCQoKSIyEiIiIiIiIq2bKezbOe1fPCRIicEhMTAQCWlpZKjoSIiIiIiIiIgM/P6vr6+nnWkQiypEsom8zMTLx69Qq6urqQSCTKDocKQUJCAiwtLREREQE9PT1lh0NEBYDfc6Lij99zopKB3/WSRxAEJCYmwtzcHCoqea8CwhEhclJRUYGFhYWywyAl0NPT4w9TomKO33Oi4o/fc6KSgd/1kuVbI0GycLFUIiIiIiIiIioxmAghIiIiIiIiohKDiRAiGWloaGDWrFnQ0NBQdihEVED4PScq/vg9JyoZ+F2nvHCxVCIiIiIiIiIqMTgihIiIiIiIiIhKDCZCiIiIiIiIiKjEYCKEiIiIiIiIiEoMJkKIiIgUyN/fH3/++aeywyAiIqIi6u+//0ZAQICywyjWmAghIiJSoBcvXmDmzJlITU1VdihERERUBCQnJ+PJkyfi64CAAKxcuVKJERV/TIQQEREpUM+ePZGamopjx44pOxQiIiIqAmbPno3+/fuLrz09PfHff/8hNjZWiVEVb0yEEClBWloazpw5g6NHjyIuLk7Z4RCRAunq6qJz587YsmWLskMhoh9MVFQUHj16pOwwiOgH069fP1y7dk38+dCqVSsYGBhg165dSo6s+GIihKiQXb16Ffb29pgxYwaOHDmCWbNmKTskIlIAPz8/uLq6ws7ODvfu3cPx48cRHR2t7LCISMlSUlLw9u1btG3bFhUrVkS1atXQrl07pKWlKTs0IvpBODk5wdHREVu3bgUAqKmpoW/fvuJrUjwmQogKUXx8PDp06ICRI0fi8uXL2LBhA+f/ERUDR48eRY8ePTB06FD4+fmhdevW+PTpE3bv3q3s0IhIic6ePYvy5cvDw8MDLVu2REJCAh4+fIjAwEBs2LBB2eER0Q/E09MT27ZtgyAI4uvAwECptUNIcSRC1p0mIpnFxcWhb9++WLt2LWxsbLIdj4mJwYULF6Curo6WLVtCU1MTALBr1y54eXkhKSkJKirMQxIVRW/fvoWhoSHU1dXFssaNG8PZ2RnLli0Ty3r06IHIyEgEBgYqI0wiUrDHjx/j8ePH6NChg8znJCcnw9TUFJUqVcL169fF8lmzZmH37t14+PBhQYRKRD+wtLQ0XLx4ETExMWjSpAnMzMwAAK9evYKlpSXOnDkDFxcXAED16tXRo0cPeHt7KzPkYolPYkRyMDAwQFhYGLZt25bt2Jw5c2Bvb481a9Zg3LhxqFu3LiIiIgAAiYmJUFdXh0QiKeyQieg7ZGZm4tSpU6hcuTJMTU1hbGyMU6dOicejoqJgbm4udc7//vc/XL16FY8fPy7scImoAPj7+2PIkCFIT0+XKk9PT8eKFSvg4OAAc3NzDBgwAO/evQMAlC5dGt26dYOqqqrUOQMGDMCjR4+kkiNEVPydPHkSFStWxNSpU7Fq1SpUrlwZ//77LwDA3NwcLVq0kJoOkzVKhBSPiRAiOXl4eGSbt7dhwwbs3r0bd+/exalTp3D//n1YWFhg/PjxAIBatWohISEBV69ezdZeQkJCocRNRPkzcOBAeHh4YMyYMVi/fj2Sk5Ph6emJgQMHIjk5GQBga2uLGzduSJ1Xv359AOD8XqJionfv3ujUqRMSExOlyj09PbF371789ddf2Lp1K27cuIEWLVqIW2h7enri5s2bePv2rXiOra0tGjZsyJ8PRMXcs2fPcPnyZQBAWFgYevfujU2bNiEoKAgXLlyAt7c3vLy8xJ8rnp6e2LdvHz5+/AgA6N+/P8LDw3Hx4kWl9aG4YiKESE6enp4IDQ2VSmr4+vpiypQpMDc3R0BAAIYNG4arV68iKSkJ6enpqFu3LurWrYvJkyeLP+AAYO/evVi+fLkyukFE3+Do6IidO3diypQpcHFxgaamJhYsWICUlBTs2bMHwOfE6MGDBxEZGSmeFxMTAwBS832JqOgqW7YsBg4ciE2bNollQUFB2LVrF3bv3o2mTZuiZcuW8PPzQ2hoKP7++28AQPPmzWFqaoodO3ZItefp6Yldu3ZlG2FCRMXHggUL4OPjAwDYsWMH3N3d4e7ujtDQUMycOROrVq2CsbExnj59CgDo3r070tPTceTIEQCApaUlXFxcmDQtAEyEEMmpQoUKaNKkidQPptjYWGzfvh02Njb45ZdfUL16ddy/fx/Hjx+HmpoaAOCff/7Bw4cPUb9+fUydOhXdu3fHjBkzMGrUKGV1hajEe/fuHf73v/+hRo0acHFxwYEDB8Rj/fr1g4qKCnR0dMQybW1t9OzZU/z+9+/fHw4ODujSpQtCQkLw9OlTDB8+HH369EFmZqY4PY6IiraoqCjMmDFDHMX59OlTqKurw8LCQqxjaWmJPn36iIslq6iooF+/ftkeZHr37g09PT2EhYUVXgeIqED17NkT7dq1E38BUr58ebx8+RLA5+eE+/fvo3HjxmjatCkSExOxf/9+hISEwMnJCcDnf1907do12/SYBw8eFHpfijsmQoi+4caNG+jVqxesrKxQr149qXUBsn6b8+nTJwCfFzR69OgRjh49iuDgYEyYMEFcAOn+/ftinZCQEHh4eODDhw9wd3dHcHAwjIyMCr9zRMXYtm3bsH379m/We/36NapXrw4VFRWsWLECzs7O6NGjBzZv3gzg85zdli1b4uTJk1LneXp6IiAgAJGRkVBRUcHJkydRrlw51KhRA3Xr1kX16tWxefNmPH/+HFZWVgXSRyIqGOnp6fjzzz/h6OgIU1NT9O/fHwDQoUMHaGpqYt++fQAAa2trfPr0Sfx/fBZnZ2ep9YEGDBiAmzdv4t69e2JZmTJl8OTJE1SqVKkQekREBeHKlSuIjo4WX1++fBkXL17E2rVrAUgnQqpXr4579+5h7NixiIyMxPLly1G7dm0AkPoZ4unpCT8/P3GtoUGDBuH8+fOF1aWSQyCiXB07dkwwMjIS/vzzTyEkJERYtWqVoK6uLly5ckUQBEF4//69oKGhIRw6dEgQBEE4dOiQAEA4duyYVDtr1qwRevToUejxE5VkM2bMEKpXr/7NekOGDBHatGkjVTZhwgTB0NBQSEpKEgRBELZs2SLo6+sLKSkpYp3MzEyhQoUKwoIFC6TOTUlJETIyMhTQAyIqTO/evROePn0qCIIgeHl5CfXr1xcCAwOFlJQU4eHDh+L3evjw4YKrq6sgCIKQnp4umJubC6NGjZJq6/fff8/282fMmDHCzZs3C6EnRFQY0tPThQYNGgjdu3cXy+rVqyf8/vvvgr6+vhAaGiocP35cMDAwEARBEGJjYwVdXV3h559/lmrnxo0bQqVKlcR/c6SnpwunT5/mvyUKGBMhRHmws7MT9u3bJwjC54ee8+fPCxUrVhTc3d3FOj169JD6AThgwABBXV1dGDFihODt7S00aNBAcHFxEeLi4go9fqKS7NGjRwIA4caNG0JYWJjQu3dvwdjYWHBychJOnTol1mvUqJEwbtw4qXPfvn0rqKioCHv37hUEQRCSkpIEbW1tYffu3VL1ZsyYIfTu3bvgO0NEBSIlJUWIjo4Wli5dKhgZGQmrV68WMjMzBQ0NDeHixYs5nnPp0iVBIpEIz58/FwRBEDZu3CioqKgIa9euFZKTk4WAgAChXLlywoYNGwqzK0SkBI8ePRK0tLSE7du3C4IgCJ07dxZ8fX2FX3/9VWjSpIkQHBwsABA+fPggCIIg7NixQ1BVVRXatGkj/PHHH0KfPn0ES0tLITAwUJndKJEkgsAV3IhyEh8fDwMDA5w6dQoXLlzA1q1bUbp0aXh6eqJ///7ifOCjR4+iZ8+eePPmDQwMDAAABw4cwMmTJ6Gurg43Nzd07txZiT0hKn5iY2OxfPlyzJgxAxoaGrnWc3Z2RrVq1eDv74/Ro0fD1dUVO3bswF9//QU/Pz+0aNECvXr1QkJCAvz8/KTOrVatGvr06YOZM2cC+DxU9f379zh27JhYJyMjI9u2mERUdLRr1w5RUVFIT0+Hn5+fOJ21Xr16MDExQdeuXRETE4N3797BwsICQ4cORenSpWFnZ4fBgwdj2rRpAIAVK1bA29sbcXFxsLW1xfTp0+Hl5aXMrhFRIVmxYgXmzJmDkJAQzJs3D2ZmZpg8eTLq1auH9u3bY/78+Xjy5Ans7OwAAMHBwdi2bRvi4+Ph5OSEgQMHSq1DRoWDiRAqVgRBwOnTp2FsbIyaNWt+V1vp6enQ1taGgYEB+vXrhwEDBqBWrVrZ6n369Anm5uaYN28ehg0b9l3XJCLZJCUlwcTEBP/88w969uyZa701a9Zg9OjR6Nevn9R6IR4eHrh37x5u3ryJ7du346effsKjR49QsWJFsY6VlRUmT56M0aNHAwACAgKwdetW+Pr6FlzHiKjApKenQ1VVFRKJRCzz9fXFkCFDsHHjRvz0009i+dOnTzF37lwkJCTAxMQEOjo62L59O9q2bQsfHx/Mnj0be/bskZrXn5mZiaSkJOjp6RVqv4hIsUJDQ5GWloZq1arJVF8QBLi6ukJHRweNGjXCy5cvsXbtWgQHB6NZs2ZITExEQEAAXFxcCjhyyg8ulkrFRnR0NOrXr4/x48fj1atXUscEQcCdO3dw8uRJxMXFydSempoa3NzcULFiRSxbtkwqCRIUFISFCxcCANTV1TF27Fhuj0lUiHR0dNClSxdxVfVjx47B3d0ddnZ2mDp1KjIzMwEAffr0gbq6ulSCAwAmTZqE4OBg3Lx5E7169UKlSpXQp08fvHr1CpmZmViwYAGSkpKkkiyurq5MghD9oJKTk/Ho0aMcjwUFBcHFxQUaGhowNDTErFmzxP9n9+zZE5qamlJb2gOAra0tNm3ahP3792Pt2rVYtGgRJkyYgGvXrgH4nEx9/Pix1IKoKioqTIIQFVEJCQl4/PgxateujQYNGsDR0RF9+/aV6d/3EokEmzZtwrlz5+Dn5yc+hzg5OWHixIkoXbo0MjIyCroLlF/KmpNDpGizZs0SWrRoIVUWFhYmzJgxQ6hQoYJgbW0t2NnZCQYGBrnO+/1aYGCgoKamJgwdOlR4+/atEBMTI6xcuVKoWLGicP/+/YLoBhHJ6Pjx44K6urqwYcMGoXr16sLu3buFHTt2CPr6+sKyZcvEep06dRI6deokdW5mZqago6MjbN26VRCEzz8r6tevL6iqqgqamppCgwYNuKghUREybdo0oWbNmoIgCMLHjx+FW7duCYIgCLdv3xa0tbWFf/75R4iJiRG2b98uaGpqCjNmzBDP7dWrl9C5c+dsbX769En8+40bN4QqVaoIixYtEsuio6MLpC9EVLi2bNkiWFlZCXXq1BH27NkjCIIgBAcHCxoaGuJagbJYs2aNAECoV6+eWPbp0ychISFB4THT92MihIqNRYsWCU5OTsK7d++E1atXC0lJScKRI0eE8ePHC8HBwWK9CRMmCLa2tkJ6erpM7f7777+Cra2tAEDQ0NAQunfvLq4qT0TKk56eLpiamgqqqqpCZGSkWL548WLBzMxM/I7v3btXUFdXF8LDw8U6Hz9+FEqVKpVth6eIiAghKiqqcDpARAoTEhIiABD69u0rlC1bVlzEuGfPnkKfPn2k6i5fvlzQ0NAQ3r59KwjC5x3iSpUqJcTExEjVW7t2rWBtbS3o6+sLdnZ2XPyUqAi4evWq4Ofnl69zXr16JaiqqgrdunWTKh86dKi4Q5QsMjMzhSFDhgirV6/O1/VJOTg1hoqFtLQ0ZGZmIjg4GPb29rhy5Qri4+PRsWNHLF26FDVr1kRcXBxWr16Nc+fO4enTp9kWRsxNu3btEBoaivfv3yMxMRH79u3LNsyeiAqfqqoq+vXrBz09PZQvX14sHzRoEKKjo+Hv7w8A6NixI7S1tdGzZ088f/4cSUlJ+OWXX2BjY4NWrVpJtWlhYYFy5coVaj+I6Pt5e3tDTU0NL1++RHBwMHbt2gUAePXqFUxMTKTqDhs2DIIg4L///gMAtG7dGvr6+ti9e7dUvZ9//hlhYWF4+fIlnjx5giFDhhROZ4hIbkePHsXEiROzlX/48AG//vorrK2tYWRkBC8vL3G6vJmZGVq2bClOq80ycOBAnDt3DhERETJdWyKRYMOGDRg1atR394MKHhMhVCzExsbi7NmzsLOzw9ChQ7Ft2zaYm5uLx//55x9UrFgRFy9exLx589CyZUtxbQFZGRgYQF1dXdGhE9F3yNrJ5cu1AYyMjNC6dWvxO66hoYFevXrh3r17cHZ2homJCaKionDixAl+p4mKifXr12PJkiUIDQ2V+v+/vb09goKCpOqWLl0alStXxrNnzwB8XhOsb9++2LZtW7Z2VVRUoK2tXbDBE5HCDBw4EO3atUNaWppYlpmZiTZt2uDevXs4cuQIdu/ejYCAALRv315cu8PT0xNnz56VWi+ocePGqFChgtRi61R8MBFCxYKpqSn8/PwwatQo7NixQyqjGxwcjKFDh+K///7Drl270KpVKzg4OODw4cNISEhQYtRE9L2cnJzg4OCQ7QHG09MTBw8eRFJSkvja3t4e4eHh+PDhAw4cOABra2tlhExEBcDAwAB9+/bF27dvcfr0abG8V69euHLlCgIDA8WyT58+4c2bN1I/A4YOHYoePXoUasxEpHh2dnZo3Lix1OLmR44cwc2bN7Ft2zbUrFkTLVu2xLFjxxAYGIg9e/YAALp27YqMjAwcPnxYqj0PD49v/vI0LS1NHGFGRQcTIVSs9O3bF2/evMHZs2fFspCQEJQpUwYNGjQQy65du4bU1FTs27cv17ayjk+aNKlAYyai7+Pp6Ylt27ZJrezeqVMnqKur48iRIwCAJk2aIDg4GJqamsoKk4gKWLly5dCqVSuph5a2bduiVatW6NGjB06ePIn79+9j8ODBMDAwQO/evcV6Dg4OGDdunDLCJiIFi4iIgLe3tzjaIzw8HGXKlIGOjo5Yp1q1amjTpo2YCNHW1kbXrl2zJT08PT2hpqaG2NjYbNe5fPkyfv75Z5ibm2PJkiWIj48vwF6RojERQsWKiYlJtn8ENWvWDPHx8Zg5cybOnj2Lvn37QiKR4Pfff8+2zZ0gCLhw4QKGDRsGc3Nz/P3336hRo0Zhd4OI8qF///548eIFLly4IJZpamriypUr6NOnjxIjIyJ5hIaGYs6cOWjRogVatWqFY8eOyXyup6cnDhw4gMTERLFs3759aN++Pfr16wd3d3doa2vj0qVLKF26dEGET0SFJCkpCb/99pu47sfo0aMBAH369EFsbCxOnjwJAKhQoQJevnyJd+/eSZ1fv359hIaGiq8HDBiAEydO4O3bt2KZvb09bt++jTJlygD4/PNp9uzZsLW1xdChQ2FtbY1bt27hzJkz0NfXL+gukwJJBEGGzZGJipCdO3di2LBhiIqKEv+Rs3//fnh7e0NVVRXdunXDxIkToaWlJZ6TmpqKuXPnYtu2bdDV1YWnpyf69+8vNc+YiH5cbdq0gbu7OyZMmKDsUIjoO/Tp00f8pUXTpk3x8OFDzJkzB35+fmjevPk3z//48SOsra3Rt29ftG3bFvv378f06dNRoUKFgg+eiArcs2fPoKqqCisrK7Ro0QI6OjpYsmQJ7OzsEB4eLm5o0LlzZ2hra2PHjh1ISkpC+fLl8csvv8Db21tsa+TIkQgNDRUTJpmZmRg9ejQmT56c68+MDh06wN7eHp6enqhdu3aB95cKDhMhVOykpKTAxMQE69atQ79+/WQ+b+7cuejYsSNq1qxZgNERUUHIyMiAqqqqssMgou/09OlTWFtbQ01NDcDnxdA7duwIVVVVnD9/XqY2jh8/junTp8PAwADt2rXD4MGDxd/mElHR8/79e2RmZmLevHnYsWMH/vzzT7i4uMDExATh4eE5rvm1b98+DBgwAFFRUdDV1cWSJUswffp0/P333+jatStOnz6NQYMGYc+ePWjbtq0SekXKxkQIFUtDhw6FmZkZ5syZo+xQiIiI6AspKSmYPXs2du/ejdTUVMycORM///yzVJ179+5h9uzZ8Pf3R4MGDeDn54fQ0FDY2toqKWoiUpbatWsjPT0d5cqVw4EDB6Cnp4fMzEzY2Nigfv36cHV1xdu3bxETE4NKlSphxIgREAQBpqamWL58OQYNGgQA+OOPP7B48WLEx8ejdu3a8Pb2Rvv27ZXbOVIaJkKIiIiIqMCdOnUKf/31F7S0tKClpYVRo0bhwoUL+OWXXxAUFIS6desCAC5cuIAOHTpgypQpGD16NHR0dGBgYIAJEyZg1qxZSu4FERWkpKQklC5dGioq/7eU5YIFCzBt2jT4+fmhdevWYnlISAiWL1+OtLQ0mJqaolSpUli3bh1GjhyJ33//HcOHD0doaKjUTlKCIODTp08oVapUofaLfjxMhBARERFRgbt37x4cHBzg7OwstZ1tx44doaWlJe7e0L17dxgbG2PdunUAPj+46OnpwdTUFE+ePMnzGqmpqUhMTISRkVHBdYSI5BIdHY2YmBhUrlw527GjR49i6tSpuH//PgwMDDBt2jRMnjwZwOddYCpUqIA9e/age/fueV5j/PjxePz4MY4dO4aLFy+iTZs2iIyMhIGBQUF0iYow7hpDRERERAWuevXqqFWrVrZFCAcPHoyjR4+KW0/q6ekhLCxMPL5o0SJUqFABT58+xc2bN7O1KwgCLl68iOHDh6N8+fLYvHlzgfaDiOQzdepUcWeX+Ph43Lp1CwDw33//YcCAAVi2bBmSkpKwePFi/Prrr/jzzz8BAJaWlnBxccGJEyeytZmSkgIASE9Px4kTJ7Bz504MHDgQANC4cWO8fv2aSRDKEUeEEBEREVGhWL58OZYtW4bnz5+LQ9/T0tJgZmaGRYsWYfDgwQgJCUHDhg1ha2uL9PR0aGho4MCBA0hNTUWlSpXEtp48eYJt27Zh69at0NbWFnd8K1++vLK6R0R5OHPmDNzd3dGlSxecOXMGXl5eWLp0KRo0aAAXFxcsXLhQrDtt2jRs2LABkZGR0NTUxKZNmzB+/Hi8efMGGhoaYr3ff/8dGzZsQGxsLKpXr46ZM2dy3Q+SCRMhRERERFQooqKiUL58eZw8eRItWrQQy0eOHIn79+8jICAAwOeh8OfOnUPFihXRsGFDSCQSqXYOHDiAUaNGoW/fvvD09EStWrUKsxtEJIcmTZrg2rVr6NChA3x9fcWRGhUqVMCoUaMwadIksW5ERASsrKxw8uRJuLu7IzExESYmJtiyZQt69Ogh1a4gCMjIyBB3myKSBRMhRERERFRo2rVrBxMTE2zatEksu3z5MlxcXPDq1SsYGxt/s420tDSoqqpy22yiIuTDhw+YP38+Dh8+jLt374rlrVu3ho6ODvbv3y9Vv0yZMli0aBGGDBkCAOjXrx+Sk5Nx6NChwgybiimuEUJEREREhcbT0xP79+9HcnKyWNaoUSNERETIlAQBgFKlSjEJQlTEZE1hCwkJQXBwsFjep08fHDlyRGox5JiYGCQkJMDGxkYs+9///pdtNAiRvDgihIiIiIgKTUpKCmrVqoWdO3dySgtRCVS/fn00bdoUS5cuBfB5odOGDRsiPj4ef/31F7S1tfHbb78hLS0NAQEB2abGESkCR4QQERERUaHR0tLCw4cPmQQhKsKuXbuGcePGoX79+nBzc8OZM2dkPtfT0xM7duzAp0+fAABqamrw8/NDo0aN4OHhgUGDBqFhw4bw8/NjEoQKDEeEEBERERERkUycnZ0RGxsLDw8P1K9fH4GBgVi4cCGCgoJQo0aNb54fGxsLKysr/PLLL3BycsLevXuxbt06GBoaFkL0RJ8xEUJEREREREQyCQ8PR4UKFcTXz58/h7u7O2rVqoXdu3fL1Ma+ffuwaNEimJmZoUOHDujfvz9Kly5dQBETZcdECBEREREREYliYmIwefJkHD58GKqqqliyZAk8PT2l6pw7dw7e3t4ICQlB3bp1cebMGbx580bcFpfoR8Y1QoiIiIiIiAg7d+5E37590aNHD5QvXx6XLl3CuHHj4OXlhdDQUKl6Xbt2hYeHByIjI7Fjxw6kpqZi7969SoyeSHYcEUJEREREREQICAhA8+bN0a1bN+zfv18sb9iwIWrXro01a9YAAOrVq4euXbti+vTpAD6v+1G2bFk0bdoU58+fz/Ma8fHxSE9PR9myZQuuI0TfwBEhREREREREBBcXF1hZWcHCwkKq3MvLC7t37xZ3eilTpgwePHgA4PP2t7/++itq166NS5cu4fXr19naTU9Px7Fjx9CrVy9YW1vjxIkTBd8ZojwwEUJERERERESQSCTo378/zp07J1Xes2dPJCUl4fjx4wCAGTNmYN++fXByckLFihXx/PlznD59Gs+ePYOZmZl43rVr1zB27FiUL18eCxcuhJubG8LDw9GvX79C7RfR1zg1hoiIiIiIiAAADx48QLVq1XDnzh04OjqK5T169IBEIhHXAQkPD8e1a9dQvXp1VKtWLVs7q1evxp9//gkPDw94eHjAxsam0PpA9C1MhBAREREREZGoXr16aN68ORYtWiSWHT58GIMGDcKbN2+goaHxzTY+ffoEdXX1ggyTSG5MhBAREREREZFo1apVWLhwISIiIqCi8nk1hfT0dCQnJ0NPT0/J0RF9P64RQkRERERERKI+ffrA0NAQL168EMvU1NSYBKFigyNCiIiIiIiIiKjE4IgQIiIiIiIiIioxmAghIiIiIiIiohKDiRAiIiIiIiIiKjGYCCEiIiIiIiKiEoOJECIiIiIiIiIqMZgIISIiIiIiIqISg4kQIiIiIiIiIioxmAghIiIiIiIiohKDiRAiIiIq0qKiorBr1y5lh0FERERFBBMhREREVKTdvXsXffv2VXYYREREVESoKTsAIiIiInnFxcUhICAAAMRRIXZ2dqhbty6Az6NFgoKCoKOjg9q1a0NfX18899WrV7h06RJ69OiBoKAgREREwM3NDeHh4YiPj0f9+vURHByM6OhoNG7cGGXKlEFycjIuXboEQRDQqFEj6OjoFHqfiYiI6PswEUJERERFVnx8PC5dugQAOHToEADA3d0ddevWxaJFi/DHH3+gQYMG+PjxI0JCQrBlyxa0a9cOAHDz5k30798fPj4+iI2Nha2tLerVq4dt27bhyJEjyMjIgL29PV6+fInIyEisXLkSc+bMgb29PcLDw5GWloZr166hTJkyyuo+ERERyYGJECIiIiqyrK2t8euvvyIgIEBqnZBTp05h4cKFuHnzJipWrAgA2L59OwYOHIhnz56JIzk+ffqEhg0bYvbs2VLthoWFIfD/tXfHKI1FURiA/wQ1jUgEO20FtYiEBKOFYOkKsgMLESzFRbgEwQ1YKTaSBQxIxGAjVqKFldhaiJliGJmgMMVImPi+r7uH+x7vdo+fc+/98SPNZjNvb2+p1+vZ2trKxcVFarVaXl9fs7i4mMPDw+zt7Q1tvQDAvxOEAADfztHRUZaWlnJ5eZlut5t+v58keXp6yvX1ddbW1t7n7u7ufni+0Wi8b68pl8tZWVlJtVpNrVZLkoyNjaXZbOb29nYIqwEAvpIgBAD4du7u7vL8/Jzj4+OBervdzvj4+Pt4YmLi060t09PTA+NKpfJp7eXl5Qu/GgAYBkEIAPDtTE1NZW5u7q/X6pZKpSF9EQDwv3B9LgAw0n6f9/Fnd8bm5mbOzs7y8PAwMPfx8fF9mwwAUEw6QgCAkbawsJDJycns7++n1Wplfn4+29vbOTk5yerqanZ2djIzM5Orq6t0Op3c3NzoBAGAAtMRAgCMtGq1mk6nk36/n9PT0/R6vVQqlZyfn+fg4CD39/fpdrtZXl5Or9dLufzr92d2djbtdvvD++r1ejY2NgZqjUYj6+vrA7VWqzVw6CoAMBpKff2hAAAAQEHoCAEAAAAKQxACAAAAFIYgBAAAACgMQQgAAABQGIIQAAAAoDAEIQAAAEBhCEIAAACAwhCEAAAAAIUhCAEAAAAKQxACAAAAFIYgBAAAACgMQQgAAABQGD8BD5OsrmlHs4YAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "term_rows = []\n", "for structure_label, pose in poses.items():\n", " scorer = score_function.render_whole_pose_scoring_module(pose)\n", " weighted = scorer(pose.coords, sum_terms=False, apply_weights=True)[:, 0]\n", " for score_type, value in zip(score_function.all_score_types(), weighted):\n", " term_rows.append(\n", " {\n", " \"structure\": structure_label,\n", " \"term\": score_type.name,\n", " \"weighted_value\": float(value.detach().cpu()),\n", " }\n", " )\n", "term_frame = pd.DataFrame(term_rows)\n", "na_active_terms = [\n", " \"fa_ljatr\",\n", " \"fa_ljrep\",\n", " \"fa_lk\",\n", " \"fa_elec\",\n", " \"hbond\",\n", " \"lk_ball_iso\",\n", " \"lk_ball\",\n", " \"lk_bridge\",\n", " \"lk_bridge_uncpl\",\n", " \"cart_lengths\",\n", " \"cart_angles\",\n", " \"cart_torsions\",\n", " \"cart_hxltorsions\",\n", " \"na_torsion\",\n", " \"na_torsion_well\",\n", "]\n", "na_inactive_terms = [\n", " \"gen_torsions\",\n", " \"cart_impropers\",\n", " \"rama\",\n", " \"omega\",\n", " \"ref\",\n", " \"dunbrack_rot\",\n", " \"dunbrack_rotdev\",\n", " \"dunbrack_semirot\",\n", "]\n", "na_only_structures = {\n", " \"B-form DNA — 1BNA\",\n", " \"RNA aptamer without ligand — 1EHT\",\n", "}\n", "expected_zero = term_frame[\n", " term_frame[\"structure\"].isin(na_only_structures)\n", " & term_frame[\"term\"].isin(na_inactive_terms)\n", "]\n", "assert np.allclose(expected_zero[\"weighted_value\"], 0.0)\n", "term_frame[\"NA-only expectation\"] = np.where(\n", " term_frame[\"term\"].isin(na_inactive_terms),\n", " \"zero (no canonical-NA parameterization)\",\n", " \"parameterized / applicability-dependent\",\n", ")\n", "key_terms = na_active_terms + na_inactive_terms\n", "show_table(term_frame[term_frame[\"term\"].isin(key_terms)])\n", "\n", "plot_frame = term_frame[\n", " term_frame[\"term\"].isin([\"hbond\", \"fa_elec\", \"na_torsion\", \"na_torsion_well\"])\n", "].pivot(index=\"term\", columns=\"structure\", values=\"weighted_value\")\n", "ax = plot_frame.plot.bar(figsize=(11, 4))\n", "ax.axhline(0, color=\"black\", linewidth=0.8)\n", "ax.set(ylabel=\"weighted score units\", title=\"Selected DNA/RNA score-term contributions\")\n", "ax.tick_params(axis=\"x\", rotation=20)\n", "plt.tight_layout()\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "10d2354c", "metadata": {}, "source": [ "## Deposited geometry and DNA/RNA glycosidic-chi sampling\n", "\n", "`NaChiRotamerSampler` reads the same fitted means and standard deviations used by the NA torsion score. DNA receives anti glycosidic-chi modes; RNA can additionally receive a syn mode when its fitted well is sufficiently favorable. Sugar pucker is read from the deposited input and is not changed by the current packer.\n", "\n", "The next cell measures deposited chi from each residue type's declared `chi1` atoms and classifies the deposited sugar with the score model's documented soft `pucker_weights()`. It reports the dominant 0–9 pucker bin and total north-state weight, then compares sampled chi candidates with the deposited angle. TMol does not currently expose a stable high-level pseudorotation phase/amplitude analysis API, so this tutorial does not call the sampler's private `_pucker_for_blocks()` helper or present its discrete model bin as a crystallographic pseudorotation angle. RNA candidate counts can also include combinations with sampled hydroxyl-proton chis." ] }, { "cell_type": "code", "execution_count": 5, "id": "c1150c9a", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", " \n", " \n", " \n", " \n", " \n", "\n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", "\n", "
polymerblock_indexauthor_labelname3deposited_chi_degreesdeposited_chi_syn_rangedominant_deposited_pucker_bindeposited_north_pucker_weight
0DNA5A:6DA-122.151367False50.000002
3RNA16A:17A-153.278702False20.999993
\n", "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n", "\n", " \n", " \n", " \n", " \n", " \n", "\n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
polymerblock_indexauthor_labelname3candidatecandidate_chi_degreescandidate_minus_deposited_chi_degreescandidate_syn_rangedeposited_chi_degreesdeposited_chi_syn_rangedominant_deposited_pucker_bindeposited_north_pucker_weight
DNA5A:6DA0245.9851998.136597False-122.151367False50.000002
DNA5A:6DA1260.98519923.136597False-122.151367False50.000002
DNA5A:6DA2230.985199-6.863403False-122.151367False50.000002
RNA16A:17A0199.036606-7.684692False-153.278702False20.999993
RNA16A:17A1199.036606-7.684692False-153.278702False20.999993
RNA16A:17A2199.036606-7.684692False-153.278702False20.999993
RNA16A:17A3199.036606-7.684692False-153.278702False20.999993
RNA16A:17A4199.036606-7.684692False-153.278702False20.999993
RNA16A:17A5199.036606-7.684692False-153.278702False20.999993
RNA16A:17A6199.036606-7.684692False-153.278702False20.999993
(101 more rows not shown)
\n", "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAxYAAAFyCAYAAABoREzCAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjExLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvctoD+AAAAAlwSFlzAAAPYQAAD2EBqD+naQAAZYhJREFUeJzt3Xd4U2X7B/Bv0jQdtOlidQJllcqQJYIiqxUQhIIgCCgoG14QVER83YqAisirIEuUIYL8UBARBcp6AdkU2TI7KB10pbtN8/z+6NvIIW3JbJP0+7kuLsjzPDm5c+6cQ+6c8ciEEAJERERERERmkFd3AEREREREZP9YWBARERERkdlYWBARERERkdlYWBARERERkdlYWBARERERkdlYWBARERERkdlYWBARERERkdlYWBARERERkdlYWBARERERkdlYWBDZmbt370Imk+GLL76ostd0dXXFjBkzDBqbkpIClUqFn3/+2eLLNta1a9cgk8mwatUqqyz/fve/l9u3b8PNzQ2///57lby+say57m2BtbYVe19vxmwX1bG/cRSWXne2lAtbioVsCwsLcmgajQYymUz3x8nJCd7e3mjZsiXGjBmDPXv2VHeIFpGQkACZTIavvvqqukPBW2+9haZNmyIqKqq6Q6l2gYGBmDRpEl599VVoNJrqDoeq0L37nnfffVevf8+ePZDJZFi/fn25z8/MzIS7uztkMhl2795t7XCrjC3tq6hqJCQkYNGiRejcuTPkcjlatmxZ3SGRFbGwoBph2LBhEEKgpKQEcXFxWL16NTw9PdG7d28MHToUxcXF1R2iwWrXrg0hhE3+Ynrnzh18++23+Ne//gWZTFbd4diEqVOn4uLFi9i2bVt1h0LVZOHChbhz545Rz/n+++9RWFgIf39/rFy50kqRPZgt72/IPkyePBlxcXH4/PPP0bRp0+oOh6yMhQXVOCqVCo888gi+/PJLrF+/Hv/3f/+HN954o7rDcgjffPMNFAoFhgwZUt2h2IwmTZqgU6dOWLZsWXWHQtWgV69eKC4uLveoRWVWrVqFvn37YubMmdi2bRtSU1OtFCGRdW3fvl13xII/ODk+FhZUoz333HN45JFHsGTJEuTk5Ojai4uLMW/ePISHh8PV1RW+vr4YNmwYbt26pRtz73nK69atQ9OmTeHq6oq2bdtix44deq+VmZmJl19+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cTG3jou5dVzMreNibh/MmHVjcGFxb7Fgy4WDId5++20MGzYMHTt2ROfOnfHZZ58BACZPnlzNkRERERER2SeLlGcFBQX4/fffcfnyZUsszuoGDx6M9evXY82aNRg0aBDUajUOHDiAOnXqVHdoRERERER2yaSLt3fu3IkNGzZg3bp1EEIgMjISR44cgUwmw48//ojBgwdbOk6LGzZsmO5UKCIiIiIiMo9JRyzefvttvPbaawCAo0eP4vr160hNTcXatWsxd+5ciwZIRERERES2z6TC4uLFi2jevDkAIDo6GoMGDYKvry8GDRqEK1euWDRAIiIiIiKyfSYVFnXr1sXp06chhMBPP/2EXr16AQDu3LmDevXqWTRAIiIiIiKyfSZdYzFx4kT06dMH/v7+KCwsRJ8+fQAAW7ZswZAhQywaIBERERER2T6TCos5c+agXbt2iI2NxYABA+Du7g6gdK6HN954w6IBEhERERGR7TOpsACA3r1767VNnz7drGCIiIiIiMg+mVxYlJSUYOfOnbh06RKEEAgPD8dTTz3FmQuJiIiIiGogkwqL2NhYPP3007h06RIaNGgAmUyG2NhYhIWFYfv27WjQoIGl4yQiIiIiIhtm0uGF6dOnIygoCHFxcbh27RquXr2K2NhYBAUF8XQoIiIiIqIayKQjFtHR0bh8+TL8/f11bf7+/lixYgXCwsIsFhwREREREdkHk45YyGQyCCH02rVaLa+xICIiIiKqgUyqAiIjIzF+/Hjcvn1b15aQkIBx48YhMjLSYsEREREREZF9MKmw+M9//oO7d+8iJCRE96dBgwZIT0/H4sWLLR0jERERERHZOJOusQgKCsKJEycQHR2NCxcuQCaTITw8HL169YJMJrN0jEREREREZONMnsdCJpMhIiICERERloyHiIiIiIjskEmnQiUkJGDhwoV67QsXLpRcd0FERERERDWDSYXFtGnT0LhxY732xo0b4+WXXzY7KCIiIiIisi8mFRZ79uxBz5499dp79uyJPXv2mB0UERERERHZF5MKi1q1auHGjRt67deuXYNSqTQ7KCIiIiIisi8mFRYDBw7ExIkTcf36dV3btWvXMHHiRERFRVkqNiIiIiIishMmFRYLFiyAXC5H06ZNERQUhMDAQDRr1gwKhQKffPKJpWMkIiIiIiIbZ9LtZr29vXH48GFER0fj9OnT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O92VL3RAZHg9bD6ZgE//uCLpe6pVfSwd2R5puYXlvtcrH/WBi9wJc346h2M30yV98we3wvBHQrDrQhLe+OmcpK9TI19smtgZxVptucv9c05P+Hu5Yf7vl/DbuSRJ36zezTG1RxMcv5mO8WtPSvqa1vXA7le6AQCGLT+KnPt29L9OexwtA72wbP91rDsaK+kb+3gjvN0/HJeTsvHM19JtzreWEqffjgQAjF97Um9nvualR9CtWR18fywOi6OvSvr6tvDDktAAq+4jylsu9xGlrLWPeO/pcPRv7on9V1Lxyua/JH1W20f4uePALO4jAOvuI8L9PbHmeCI2x0i3G2vtI6riewT3EaX7iJk/nnXs7xEW2kc8u1yam8rIhLi/PidDqNVqeHl54c9LcfDwVOnaq+aIRSbUajVUKhWPWDjsEQs1avt684jF/zjWEYtctAoNQFGJ4K+RDrSPqOephKwoF3JXDx6xcLB9hItChou37kDr7M4jFg62j/g7SY2UtAzJ9ylH+B5RxlL7iLM3EtG5RQiysrKgUqlQGRYWJiorLAxZyZam1WqRnp4OX19fyU6OHAPz67iYW8fF3Dou5tZxMbeGMeY7L9ciERERERGZjYUFERERERGZjYUFERERERGZjYUFERERERGZjYUFERERERGZjYUFERERERGZjYUFERERERGZjYUFERERERGZjYUFERERERGZjYUFERERERGZjYUFERERERGZjYUFERERERGZjYUFERERERGZjYUFERERERGZjYUFERERERGZjYUFERERERGZTVHdAdi7i4lZ8MgWusdebs4I9nVHQXEJrqXk6I1vGegFALiemoP8ohJJX5CPG7zdlUjLKcSdrAJJXy0XBRrVroUSrcCF21lQq3OhyneCXF5aGzav7wlnJzli03KRXaCRPLeeyhV1PF2QlVeM+Iw8SZ+rsxxN6noCAM7fztKLt0ldD7g6OyEhIw+ZecWSvtoeLqjv5YqcQg1u3c2V9CmcZAirrwIAXE5SQ1MiJP0Na9eCh4sCSVkFuJtTKOnzdndGkM+D1+G1lGwUFGslfcE+7vByd0ZqdiGS1dJ16OmqQAO/Wigu0eJKUrbeclv4q+Akl+Hm3VzkFkrXob+XK/w8XJCZV4SEjHxJn5vSCY3reACofB3Gp+chK1+6Dut6uqCuyhXZBcWITSvNjVarhVqd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Ef/973/Ftm3bBACxaNEi8d///ld3K2EhhDh06JBwdnYWs2bNEtu2bRNPPvmkaNiwocjKyjJqDOmTCVHJlL9kc86dO4fPP/8ccXFxaNq0KV5//XWEhoZWd1hkhCNHjuD1118vt2/dunVo1KiR7vEPP/yAjRs3Ij8/Hz169MDMmTPh6upaVaGSBYwcORJdu3bFpEmTJO0HDhzA119/jdTUVDz88MN44403UKdOnWqKkgx1+/ZtfPLJJ7hw4QLq1auHoUOHIioqSjLm8uXL+Oyzz3Djxg2EhobitddeQ1hYWPUETAY7fvw4Vq5cidjYWPj4+ODJJ5/EmDFjJNfGpKSkYP78+Th79izq1q2LKVOmoGvXrtUYNd1v165d+OCDD/TaR48ejfHjx+se//nnn/jqq6+QlJSEli1b4o033oC/v7/kOYaMISkWFkREREREZDZeY0FERERERGZjYUFERERERGZjYUFERERERGZjYUFERERERGZjYUFERERERGZjYUFERERERGZjYUFERERERGZjYUFERDbt999/x9WrV3WPt2/fjhs3bhj1HCIisj4WFkREZNNee+01/PHHH7rH06ZNw969e416jiF++eUX3Lx506QYiYiIhQUREdmZp59+Go0bN7b4cqdMmYIDBw5YfLlERDWForoDICIi+1BcXIzjx48jIyMDHTt2RL169XR9e/bswd27dyGTyeDv74+2bdvC09NT8vyff/4Z7du3h4uLC2JiYuDh4YFHH30UTk5OknHJyck4evQoAgIC0KZNG704nnzySTRo0MCo5zwovj/++AP5+fk4duwYXF1d4eTkhKFDhwIAioqKcPToUWRlZSE8PNwqRQ0RkSNgYUFERA905swZDB48GHK5HGFhYZg2bRo+/PBDjBo1CgBw4MABXL16FUII3LhxA3FxcdiyZQsef/xx3TLGjx+PDh064OrVqwgPD8epU6fQpEkT7Nu3T1dc7NixA88++yxat24NhUKBnJwcZGRkSGKZNm0a3nrrLYSGhhr8nAfFt2/fPuTn5+P06dPIyMiAUqnE0KFDERMTg6ioKPj6+iIwMBBHjx7FM888g2XLllltXRMR2S1BRERUiYKCAhEcHCzGjBkjNBqNEEKI/Px88fvvv1f4nLlz54qWLVtK2vz8/MQjjzwicnNzhRBCJCcni1q1aomffvpJt8zAwEDx7rvv6p7z6aefCgDiyy+/1LU1aNBArFy50qjnGBJfYGCg+Pbbb3WPi4qKRMOGDcWiRYt0bSkpKcLf31/88MMPFS6biKim4hELIiKq1N69exEfH4/58+frjiy4urqid+/eknFxcXG4dOkSMjMz4ezsjPPnzyMvLw/u7u66MaNHj9Y9rlu3Llq0aIErV64AAA4dOoTExES8+uqruvHTpk3DO++8U2FsxjzHkPjutW/fPsTGxqJu3br4v//7PwghIIRA48aNsW/fPgwfPvxBq46IqEZhYUFERJWKi4uDSqWSXFNxv2nTpuHbb79Fx44dUbt2beTn5wMAUlNTJddD+Pr6Sp7n4uKCgoIC3ev4+flJrn1wcXFBQEBApbEZ8hxD47vXrVu3oFQq8csvv0jaAwMD0axZswpjIiKqqVhYEBFRpby9vZGTk4PCwkK4uLjo9Z8+fRpLlizB1atXdRc2Hz16FDt27IAQwuDX8fPzg1qthlarhVz+z00L779ewtjnmBqfSqVCUVERVq1aBQ8PD4PfBxFRTcXbzRIRUaW6desGhUKB77//XtKempoKAEhKSoKbm5vkl///+7//M/p1OnbsCAD47bffdG0HDhxAenq6Wc8xND4PDw/d0RMA6N69O5RKJVasWCEZV1JSguTkZEPfFhFRjcEjFkREVKn69evj008/xeTJk3Hu3DmEh4fjyJEjqF27Nj799FN07twZHh4eePbZZ9G/f38cO3YMmzdvNvp1AgICMHPmTDz//PN44403oFAosHjx4kqPFhjyHEPj69ChA1avXg13d3e4ublh6NCh+OKLLzBt2jRcvnwZnTp1QkJCArZs2YKPP/4Y/fv3N/o9EhE5Mh6xICKiB5o+fTr27dsHADh+/Dh69OiBTz75BADg4+ODo0ePokmTJti/fz9CQkJw8OBBDBs2DLVq1dItY/DgwXrXM0RERKBly5a6x/PmzcPixYtx+fJlpKWl4ddff8WkSZMk1zTcP0Heg55jaHz/+c9/MGDAAERHR2P79u0AgEmTJuH48ePw9fXFwYMHAQCbN29mUUFEVA6ZMOYEWCIiIiIionLwiAUREREREZmNhQUREREREZmNhQUREREREZmNhQUREREREZmNhQUREREREZmNhQUREREREZmNhQUREREREZmNhQUREREREZmNhQUREREREZmNhQUREREREZmNhQUREREREZmNhQUREREREZnt/wGWIf7XUFLQJQAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from tmol.numeric import coord_dihedrals\n", "from tmol.score.na_torsion import (\n", " NORTH_PUCKERS,\n", " SYN_RANGE,\n", " pucker_weights,\n", " sugar_ring_atoms,\n", ")\n", "\n", "\n", "def deposited_na_geometry(pose, block_index, sampler):\n", " block_type = pose.block_type(0, block_index)\n", " offset = int(pose.block_coord_offset64[0, block_index])\n", " chi_atoms = [int(uaid[0]) for uaid in block_type.torsion_to_uaids[\"chi1\"]]\n", " chi_xyz = pose.coords[0, offset + torch.tensor(chi_atoms, device=device)].double()\n", " deposited_chi = float(\n", " torch.rad2deg(\n", " coord_dihedrals(\n", " chi_xyz[0:1], chi_xyz[1:2], chi_xyz[2:3], chi_xyz[3:4]\n", " )[0]\n", " )\n", " .detach()\n", " .cpu()\n", " )\n", " ring_atoms = sugar_ring_atoms(block_type, ELEMENT_BY_ATOM_TYPE)\n", " if ring_atoms is None:\n", " raise RuntimeError(f\"No complete sugar ring for block {block_index}\")\n", " ring_xyz = pose.coords[\n", " 0, offset + torch.tensor(ring_atoms, device=device)\n", " ].unsqueeze(0)\n", " weights = pucker_weights(ring_xyz, sampler.params.pucker_temperature)[0]\n", " return {\n", " \"deposited_chi_degrees\": deposited_chi,\n", " \"deposited_chi_syn_range\": bool(\n", " SYN_RANGE[0] <= deposited_chi % 360.0 <= SYN_RANGE[1]\n", " ),\n", " \"dominant_deposited_pucker_bin\": int(torch.argmax(weights).item()),\n", " \"deposited_north_pucker_weight\": float(\n", " weights[list(NORTH_PUCKERS)].sum().detach().cpu()\n", " ),\n", " }\n", "\n", "\n", "def sampled_na_chis(label, pose, block_index):\n", " sampler = NaChiRotamerSampler.from_database(\n", " param_db, device, chi_sample_level=1, sample_syn=True\n", " )\n", " task = PackerTask(pose, PackerPalette())\n", " task.restrict_to_repacking()\n", " enabled = torch.zeros_like(pose.block_type_ind, dtype=torch.bool)\n", " enabled[:, block_index] = True\n", " task.disable_packing_by_block_mask(~enabled)\n", " task.add_conformer_sampler(sampler)\n", " set_task = SetPackerTask.from_packer_task(task)\n", " _, _, _, chis = sampler.sample_chi_for_poses(pose, set_task)\n", " values = chis[:, 0].detach().cpu().numpy()\n", " deposited = deposited_na_geometry(pose, block_index, sampler)\n", " offsets = (\n", " values - deposited[\"deposited_chi_degrees\"] + 180.0\n", " ) % 360.0 - 180.0\n", " author_label = (\n", " f\"{pose.pdb_info.chain_labels[0, block_index]}:\"\n", " f\"{pose.pdb_info.residue_labels[0, block_index]}\"\n", " f\"{pose.pdb_info.residue_insertion_codes[0, block_index]}\"\n", " )\n", " return pd.DataFrame(\n", " {\n", " \"polymer\": label,\n", " \"block_index\": block_index,\n", " \"author_label\": author_label,\n", " \"name3\": pose.block_type(0, block_index).name3,\n", " \"candidate\": np.arange(len(values)),\n", " \"candidate_chi_degrees\": values,\n", " \"candidate_minus_deposited_chi_degrees\": offsets,\n", " \"candidate_syn_range\": (values >= SYN_RANGE[0]) & (values <= SYN_RANGE[1]),\n", " **deposited,\n", " }\n", " )\n", "\n", "\n", "rotamer_frame = pd.concat(\n", " [\n", " sampled_na_chis(\"DNA\", poses[\"B-form DNA — 1BNA\"], 5),\n", " sampled_na_chis(\"RNA\", poses[\"RNA aptamer without ligand — 1EHT\"], 16),\n", " ],\n", " ignore_index=True,\n", ")\n", "show_table(\n", " rotamer_frame[\n", " [\n", " \"polymer\",\n", " \"block_index\",\n", " \"author_label\",\n", " \"name3\",\n", " \"deposited_chi_degrees\",\n", " \"deposited_chi_syn_range\",\n", " \"dominant_deposited_pucker_bin\",\n", " \"deposited_north_pucker_weight\",\n", " ]\n", " ].drop_duplicates()\n", ")\n", "show_table(rotamer_frame)\n", "fig, ax = plt.subplots(figsize=(8, 3.8))\n", "for label, values in rotamer_frame.groupby(\"polymer\"):\n", " ax.scatter(\n", " values[\"candidate\"], values[\"candidate_chi_degrees\"], label=label, s=55\n", " )\n", " ax.axhline(\n", " values[\"deposited_chi_degrees\"].iloc[0], linestyle=\"--\", linewidth=1\n", " )\n", "ax.axhspan(SYN_RANGE[0], SYN_RANGE[1], alpha=0.12, color=\"tab:orange\", label=\"syn range\")\n", "ax.set(\n", " xlabel=\"candidate\",\n", " ylabel=\"glycosidic chi (degrees)\",\n", " title=\"Deposited (dashed) and sampled NA chi at sample level 1\",\n", ")\n", "ax.grid(alpha=0.25)\n", "ax.legend()\n", "plt.tight_layout()\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "9db6fd8f", "metadata": {}, "source": [ "## Swap a Watson–Crick pair at a homeodomain–DNA recognition site\n", "\n", "The engrailed homeodomain recognizes the internal TAAT subsite through a minor-groove N-terminal arm and a major-groove recognition helix. The workflow identifies which adenine at chain A residues 12–13 has the more favorable weighted protein–DNA `hbond` contribution. It then chooses an opposite-strand thymine by minimizing the **two-orientation** pair value `M[DA, DT] + M[DT, DA]`, rather than assuming a residue-number mapping. This score-based heuristic is not a general Watson–Crick base-pair detector; the named A–T distances below verify that it selects the intended deposited 1HDD pair. The comparison is the chemically matched pair swap DA·DT→DT·DA—not a single-strand mismatch.\n", "\n", "For both pair identities, TMol rebuilds both nucleotides with `NaChiRotamerSampler`, repacks the same nearby protein side-chain shell, and Cartesian-minimizes a deliberately narrower atom mask: both bases and declared hydroxyl proton-chi hydrogens may move, while the sugar–phosphate atoms and protein main chain remain fixed. This avoids treating C1′, C2′, or O4′ as general Cartesian side-chain degrees of freedom.\n", "\n", "The reported `target_pair_protein_hbond` and full `protein_DNA_interaction` sum both block-pair matrix orientations. `protein_DNA_favorable_hbond_block_pairs` is the full-interface count of DNA–protein residue pairs whose combined weighted `hbond` contribution is below −0.1; it is a residue-pair score count, not an atom-level hydrogen-bond count. Named A–T heavy-atom distances—A(N6)···T(O4) and A(N1)···T(N3)—supply direct Watson–Crick geometry diagnostics before and after Cartesian minimization. Interface distances/clash counts and covalent bond drift remain separate geometry checks.\n", "\n", "> **Task restriction is intentional.** `restrict_identities_per_pose()` constructs one keep mask from `per_block_considered_block_types_is_orig`, replaces both pair positions in that mask, and intersects `per_block_is_block_type_allowed` exactly once. Every other position remains at its original identity. Do **not** call `restrict_to_repacking()` on this design task: that additional mask would remove the swapped identities. This helper narrows inspected `PackerTask` fields; it is not a built-in DNA-specificity protocol.\n", "\n", "This is one low-sample local trajectory (`chi_sample_level=1`) sized for a documentation smoke test. On CUDA, repeated PyTorch seeds can probe search variability; on CPU the packer uses an unexposed C RNG, so outcomes are not controlled replicates. It illustrates one structural response, not converged specificity. Repeat independent packer runs before drawing conclusions." ] }, { "cell_type": "code", "execution_count": 6, "id": "8f8e0235", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "selected pair: block 12 chain A residue 13 DA · block 30 chain B residue 31 DT; two-orientation pair hbond -2.560\n" ] }, { "data": { "text/html": [ "\n", "\n", " \n", " \n", " \n", " \n", " \n", "\n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", "
target_DApaired_DTpair_selection_metricpair_hbond_scoreshared_nearby_protein_blocks
A:13B:31two-orientation weighted hbond-2.56014222
\n", "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "homeodomain_pose = poses[\"engrailed homeodomain–DNA — 1HDD\"]\n", "DNA_NAMES = {\"DA\", \"DC\", \"DG\", \"DT\"}\n", "dna_mask = block_mask_for_name3(homeodomain_pose, DNA_NAMES)\n", "real_mask = homeodomain_pose.block_type_ind >= 0\n", "protein_mask = real_mask & ~dna_mask\n", "\n", "block_scorer = score_function.render_block_pair_scoring_module(homeodomain_pose)\n", "by_term = block_scorer(\n", " homeodomain_pose.coords, sum_terms=False, apply_weights=True\n", ")\n", "hbond_index = score_function.all_score_types().index(ScoreType.hbond)\n", "hbond_matrix = by_term[hbond_index, 0]\n", "protein_blocks = torch.nonzero(protein_mask[0], as_tuple=False).flatten()\n", "chain_labels = np.asarray(homeodomain_pose.pdb_info.chain_labels[0]).astype(str)\n", "residue_labels = np.asarray(homeodomain_pose.pdb_info.residue_labels[0]).astype(str)\n", "core_adenine_mask = (\n", " dna_mask[0]\n", " & block_mask_for_name3(homeodomain_pose, {\"DA\"})[0]\n", " & torch.as_tensor(\n", " (chain_labels == \"A\") & np.isin(residue_labels, [\"12\", \"13\"]),\n", " device=device,\n", " )\n", ")\n", "core_adenines = torch.nonzero(core_adenine_mask, as_tuple=False).flatten()\n", "if len(core_adenines) != 2:\n", " raise RuntimeError(\"Expected the two adenines in the 1HDD TAAT subsite\")\n", "target_hbond_scores = torch.stack(\n", " [\n", " hbond_matrix[block_index, protein_blocks].sum()\n", " + hbond_matrix[protein_blocks, block_index].sum()\n", " for block_index in core_adenines\n", " ]\n", ")\n", "target_block = int(core_adenines[torch.argmin(target_hbond_scores)].item())\n", "target_name3 = homeodomain_pose.block_type(0, target_block).name3\n", "target_chain = str(homeodomain_pose.pdb_info.chain_labels[0, target_block])\n", "target_residue = str(homeodomain_pose.pdb_info.residue_labels[0, target_block])\n", "if target_name3 != \"DA\":\n", " raise RuntimeError(f\"Expected target DA, found {target_name3}\")\n", "\n", "opposite_thymine_mask = (\n", " dna_mask[0]\n", " & block_mask_for_name3(homeodomain_pose, {\"DT\"})[0]\n", " & torch.as_tensor(chain_labels != target_chain, device=device)\n", ")\n", "opposite_thymines = torch.nonzero(\n", " opposite_thymine_mask, as_tuple=False\n", ").flatten()\n", "if len(opposite_thymines) == 0:\n", " raise RuntimeError(\"No opposite-strand DT candidates were found\")\n", "target_to_thymine_hbond = (\n", " hbond_matrix[target_block, opposite_thymines]\n", " + hbond_matrix[opposite_thymines, target_block]\n", ")\n", "paired_block = int(\n", " opposite_thymines[torch.argmin(target_to_thymine_hbond)].item()\n", ")\n", "paired_name3 = homeodomain_pose.block_type(0, paired_block).name3\n", "paired_chain = str(homeodomain_pose.pdb_info.chain_labels[0, paired_block])\n", "paired_residue = str(homeodomain_pose.pdb_info.residue_labels[0, paired_block])\n", "assert paired_name3 == \"DT\" and paired_chain != target_chain\n", "paired_hbond_score = float(target_to_thymine_hbond.min().detach().cpu())\n", "print(\n", " f\"selected pair: block {target_block} chain {target_chain} residue \"\n", " f\"{target_residue} {target_name3} · block {paired_block} chain \"\n", " f\"{paired_chain} residue {paired_residue} {paired_name3}; \"\n", " f\"two-orientation pair hbond {paired_hbond_score:.3f}\"\n", ")\n", "\n", "centroids, radii = compute_block_centroids_and_furthest_dist(homeodomain_pose)\n", "adjacency = compute_block_adjacency(centroids, radii)\n", "local_blocks = (\n", " adjacency[:, target_block] | adjacency[:, paired_block]\n", ").clone()\n", "local_blocks[:, target_block] = True\n", "local_blocks[:, paired_block] = True\n", "local_protein_blocks = local_blocks & protein_mask\n", "show_table(\n", " pd.DataFrame(\n", " [\n", " {\n", " \"target_DA\": f\"{target_chain}:{target_residue}\",\n", " \"paired_DT\": f\"{paired_chain}:{paired_residue}\",\n", " \"pair_selection_metric\": \"two-orientation weighted hbond\",\n", " \"pair_hbond_score\": paired_hbond_score,\n", " \"shared_nearby_protein_blocks\": int(local_protein_blocks.sum()),\n", " }\n", " ]\n", " )\n", ")" ] }, { "cell_type": "code", "execution_count": 7, "id": "a6e54b2a", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", " \n", " \n", " \n", " \n", " \n", "\n", "
\n", " \n", " \n", " \n", " \n", " \n", "\n", "\n", "
pair_identitymovable_pair_base_and_proton_chi_atomsmovable_shared_protein_sidechain_atomsCartesian_movable_atoms_total
DA·DT28337365
DT·DA28337365
\n", "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/3dmoljs_load.v0": "
\n

3Dmol.js failed to load for some reason. Please check your browser console for error messages.

\n
\n", "text/html": [ "
\n", "

3Dmol.js failed to load for some reason. Please check your browser console for error messages.

\n", "
\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "def restrict_identities_per_pose(task, requested_names_by_block):\n", " \"\"\"Apply all per-pose identity requests in one monotonic intersection.\"\"\"\n", " keep = task.per_block_considered_block_types_is_orig.detach().clone()\n", " considered = task.per_block_considered_block_types\n", " for block_index, names in requested_names_by_block.items():\n", " if len(names) != task.per_block_is_block_type_allowed.shape[0]:\n", " raise ValueError(\"Each identity list must contain one name per pose\")\n", " for pose_index, name3 in enumerate(names):\n", " considered_here = considered[\n", " pose_index, block_index\n", " ].detach().cpu().tolist()\n", " requested = torch.tensor(\n", " [\n", " index >= 0\n", " and task.pbt.active_block_types[index].name3 == name3\n", " for index in considered_here\n", " ],\n", " dtype=torch.bool,\n", " device=task.device,\n", " )\n", " if not torch.any(requested):\n", " raise ValueError(\n", " f\"{name3} is not available at block {block_index}\"\n", " )\n", " keep[pose_index, block_index] = requested\n", " task.per_block_is_block_type_allowed = torch.logical_and(\n", " task.per_block_is_block_type_allowed, keep\n", " )\n", "\n", "\n", "def add_protein_and_na_samplers(task):\n", " task.add_conformer_sampler(\n", " create_dunbrack_sampler_from_database(param_db, device)\n", " )\n", " task.add_conformer_sampler(FixedAAChiSampler())\n", " task.add_conformer_sampler(\n", " NaChiRotamerSampler.from_database(param_db, device, chi_sample_level=1)\n", " )\n", " task.add_conformer_sampler(IncludeCurrentSampler())\n", "\n", "\n", "variant_labels = [\"DA·DT\", \"DT·DA\"]\n", "target_variants = [\"DA\", \"DT\"]\n", "paired_variants = [\"DT\", \"DA\"]\n", "mutation_batch = PoseStackBuilder.from_poses(\n", " [homeodomain_pose] * len(variant_labels), device\n", ")\n", "mutation_task = PackerTask(mutation_batch, PackerPalette())\n", "restrict_identities_per_pose(\n", " mutation_task,\n", " {\n", " target_block: target_variants,\n", " paired_block: paired_variants,\n", " },\n", ")\n", "# Do not call restrict_to_repacking(): it would intersect away swapped identities.\n", "non_pair = torch.ones(\n", " mutation_batch.max_n_blocks, dtype=torch.bool, device=device\n", ")\n", "non_pair[[target_block, paired_block]] = False\n", "assert torch.equal(\n", " mutation_task.per_block_is_block_type_allowed[:, non_pair],\n", " mutation_task.per_block_considered_block_types_is_orig[:, non_pair],\n", ")\n", "for block_index, requested_names in {\n", " target_block: target_variants,\n", " paired_block: paired_variants,\n", "}.items():\n", " for pose_index, requested_name3 in enumerate(requested_names):\n", " considered = mutation_task.per_block_considered_block_types[\n", " pose_index, block_index\n", " ]\n", " allowed = mutation_task.per_block_is_block_type_allowed[\n", " pose_index, block_index\n", " ]\n", " allowed_name3s = {\n", " mutation_task.pbt.active_block_types[int(block_type_index)].name3\n", " for block_type_index in considered[allowed].detach().cpu().tolist()\n", " if block_type_index >= 0\n", " }\n", " assert allowed_name3s == {requested_name3}\n", "\n", "local_design_region = local_protein_blocks.clone()\n", "local_design_region[:, target_block] = True\n", "local_design_region[:, paired_block] = True\n", "packing_region = local_design_region.expand(len(variant_labels), -1).clone()\n", "mutation_task.disable_packing_by_block_mask(~packing_region)\n", "add_protein_and_na_samplers(mutation_task)\n", "\n", "torch.manual_seed(SEED)\n", "packed_variants = pack_rotamers(mutation_batch, score_function, mutation_task)\n", "\n", "# Minimize both bases/proton-chi atoms plus the same nearby protein shell.\n", "# The nucleotide sugar-phosphates and protein main chain remain fixed.\n", "pair_by_pose = torch.zeros_like(\n", " packed_variants.block_type_ind, dtype=torch.bool\n", ")\n", "pair_by_pose[:, target_block] = True\n", "pair_by_pose[:, paired_block] = True\n", "protein_region = local_protein_blocks.expand(len(variant_labels), -1)\n", "na_coord_mask = build_na_base_and_proton_chi_coord_mask(\n", " packed_variants, pair_by_pose\n", ")\n", "protein_coord_mask = build_sidechain_coord_mask(\n", " packed_variants\n", ") & res_mask_to_coord_mask(packed_variants, protein_region)\n", "coord_mask = na_coord_mask | protein_coord_mask\n", "show_table(\n", " pd.DataFrame(\n", " {\n", " \"pair_identity\": variant_labels,\n", " \"movable_pair_base_and_proton_chi_atoms\": na_coord_mask.sum(dim=1)\n", " .detach()\n", " .cpu()\n", " .numpy(),\n", " \"movable_shared_protein_sidechain_atoms\": protein_coord_mask.sum(dim=1)\n", " .detach()\n", " .cpu()\n", " .numpy(),\n", " \"Cartesian_movable_atoms_total\": coord_mask.sum(dim=1)\n", " .detach()\n", " .cpu()\n", " .numpy(),\n", " }\n", " )\n", ")\n", "try:\n", " dna_scope_viewer = tmol.view(\n", " packed_variants.split(0),\n", " highlighted=coord_mask[0, packed_variants.real_atoms[0]],\n", " highlight_color=\"#7b2cbf\",\n", " )\n", " dna_scope_viewer.show()\n", "except ImportError:\n", " print(\"Install py3Dmol to inspect the DNA refinement mask.\")\n", "\n", "refined_variants = run_cart_min(\n", " packed_variants,\n", " score_function,\n", " coord_mask=coord_mask,\n", " optimizer_kwargs={\"max_iter\": 30},\n", ")" ] }, { "cell_type": "code", "execution_count": 8, "id": "ce9d224e", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", " \n", " \n", " \n", " \n", " \n", "\n", "
\n", " \n", " \n", " \n", " \n", " \n", "\n", "\n", "\n", "\n", "
pair_identitystageA_N6_donor_to_T_O4_acceptor_AA_N1_acceptor_to_T_N3_donor_A
DA·DTpacked; before Cartesian minimization3.1851222.697436
DA·DTafter Cartesian minimization2.9799102.763156
DT·DApacked; before Cartesian minimization4.2899877.188266
DT·DAafter Cartesian minimization3.1544916.249359
\n", "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n", "\n", " \n", " \n", " \n", " \n", " \n", "\n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", "\n", "
pair_identitytotal_scoreprotein_DNA_interactionprotein_DNA_hbondtarget_pair_protein_hbondprotein_DNA_favorable_hbond_block_pairsminimum_intergroup_heavy_atom_distance_Aintergroup_heavy_atom_pairs_below_2Acovalent_bonds_touching_movable_atomsbond_length_RMS_change_Amaximum_absolute_bond_length_change_Adelta_total_scoredelta_protein_DNA_interactiondelta_protein_DNA_hbonddelta_target_pair_protein_hbondscore_sanity_check
1DT·DA1698.101685-105.298096-13.472448-0.352772112.44574903730.0260130.14499871.231201-1.8833773.9438863.727356passed
0DA·DT1626.870483-103.414719-17.416334-4.080127122.44574903730.0213700.1001210.0000000.0000000.0000000.000000passed
\n", "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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Z88epdso2y8RERFpnkzkHq21SFJSEszNzZGYmMgzQoiIiAqhNBxDb968iRYtWqBt27Zwc3PDxo0bYWFhgRMnTqBMmTIAgGHDhiEiIgI3btxQuo0ydT6kuN7fKlMOqa0voo/dw/mdNR0CEWlAYY6hPCOEiIiItEqdOnVw7do1NGzYEI8ePcLYsWMRGhoql6xo1aoVevXqVag2ytQhIiIizeMZIZ/or1lERESawGNo8eIZIURFxzNCiLQTzwghIiIiIiIiIsoDEyFEREREREREpDWYCCEiIiIiIiIircFECBERERERERFpDSZCiIiIiIiIiEhrMBFCRERERERERFqDiRAiIiIiIiIi0hpMhBARERERERGR1tDTdAClSZUphzQdAlGJeTi/s6ZDICIiIiIiKjSeEUJEREREREREWoOJECIiIiIiIiLSGkyEEBEREREREZHWYCKEiIiIiIiIiLQGEyFEREREREREpDWYCCEiIiIiIiIircFECBERERERERFpDSZCiIiIiIiIiEhrMBFCRERERERERFqDiRAiIiIiIiIi0hpMhBARERERERGR1tDTdAAAkJqairS0NFhaWn6wbnx8PJKTk+XK9PX1UalSpeIKj4iIiIiIiIhKCY2eEXL27Fm0bdsWlSpVQtWqVVGpUiX8+uuvBbaZOnUq6tatC09PT+kxZMiQEoqYiIiIiIiIiD5lGk2EhIWFYe7cuYiPj8erV6+wcOFCjBw5EmfPni2wnbe3Nx4+fCg9jh07VkIRExERkTr99ddf6NevH1xdXaWy5cuX49WrV5oLioiIiEo1jSZCpk6dCjc3N+jovA2jX79+0NPTw7///vvBts+fP0dqampxh0hERETFZPv27ejVqxdsbW0RGRkplWdkZGDhwoUajIyIiIhKM40vlpqamoqHDx/i2rVrCAgIgJ2dHXx8fApss2fPHtSqVQvm5uZo1qwZLly4UELREhERkbrMmTMHO3bswPLly+XKe/Togc2bN2soKiIiIirtNJ4IiYyMhKenJ9zd3bFlyxYsWbIENjY2+dZ3dXXF1atXkZCQgISEBNSuXRteXl6Ijo7Ot016ejqSkpLkHkRERKRZd+7cQevWrQEAMplMKi9XrhyeP3+uqbCIiIiolNN4IqR169Z4+PAhkpOTsXLlSnzxxRc4evRovvWHDBmCevXqAQBMTEywevVq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/PEHDh48iHbt2mHOnDlMhBAREVGemAQhIiIiTcj/xvYFOHv2LHr16qVQ3qdPH5w7dw4A0KtXL9y+fbto0REREVGpFRMTgyFDhqBGjRqwsbFReBAREREVB5XOCNHV1cWZM2fg7e0tV3769Gno6uoCABISEmBnZ1f0CImIiKhUGjZsGKKjo/HNN98U611iiIiIiN6lUiLkq6++gq+vL0aNGgUXFxcIIXDp0iWsWrUKEydOBAD8/PPPGDVqlFqDJSIiotLj5MmTuHXrFn84ISIiohKlUiJk5syZcHR0xLJly7BixQoAQM2aNbF8+XIMHjwYwNtb0JUvX15tgRIREVHpYmtrCyMjI02HQURERFpGpUQIAAwePBiDBw+GEAIymUxhO5MgREREVBA/Pz/MmTMHixcvho6OSsuWERERERWayomQXHklQYiIiIjy0rJlS+l5ZmYmIiMjERwcjKpVqyrMKcLDw0s6PCIiItICSidC3NzcAAARERHS8/xEREQULSoiIiIqldq3by/3+v2F14mIiIiKm9KJkC5duuT5nIiIiEhZs2bN0nQIREREpOWUToRMmzYtz+dERERERERERJ+KIq8R8vLlS1haWqojFiIiItIitWrVynebgYEBqlWrhiFDhsDHx6cEoyIiIqLSTqUl2tPT0zFx4kRYWlrCyspKKvf398etW7fUFhwRERGVXt26dcO9e/fQoEEDDBkyBEOHDkX9+vVx7949eHp6wsLCAr1798b27ds1HSoRERGVIiqdERIUFITQ0FBs3boVnTt3lso7deqE77//Htu2bVNbgERERFQ6Xb16FevXr4efn59c+aZNm7Bt2zYcOXIEnp6emDdvHvr27auhKImIiKi0UemMkN9//x1btmxBp06d5MpbtWqFI0eOqCUwIiIiKt3Onz+Pbt26KZR3795dugNd9+7dcffu3ZIOjYiIiEoxlRIh0dHRqFKlCgBAJpNJ5UIIZGRkqCUwIiIiKt309fVx4sQJhfKwsDAYGBgAAF68eAFHR8cSjoyIiIhKM5UujalduzZOnjwJb29vuUTI+vXr0bBhQ3XFRkRERKVYQEAA+vXrB39/f7i4uEAIgUuXLmHt2rWYPn06AGD58uX48ssvNRwpERERlSYqJUJmzJgBPz8/TJo0CQCwceNGHD16FDt27MCBAwfUGiARERGVToGBgahatSqW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3LmIiIjAjRs3kJmZiSZNmmDkyJGoW7cuHj9+jNmzZ6NBgwbo16+fBveEiIiIVJGYmAhzc/MPlhXk/PnzePDgQYF1unTpAhMTE5VifN+6detQoUIFdO3aVa7c19cXS5YskRaAXbp0KYYPH44mTZqgXr16efbFy3eJiIhKnkYTIW3atMHx48excuVKnDp1CvXq1cNvv/0GMzMzqY6TkxNSU1MBAPr6+jh27BiWL1+OAwcOwNLSEgEBARg5ciT09fU1tRtERESkgjVr1iAyMhJr1qyRK58wYQJatGiBoUOHKtXP33//jZMnTxZYp02bNmpJhGRmZmLz5s3w9/eHnp78NMrT01PudUBAAGbPno0jR47kmwjh5btEREQlT6OJEADw8PCAh4dHvtsDAwPlXtvZ2WHhwoXFHRYREREVswULFuDPP/9UKA8MDETnzp2VToSMHj0ao0ePVnd4edq/fz/i4uLg7++vVH1TU1O8ePEi3+28fJeIiKjkldy96oiIiIjeERUVlediohYWFnj06FHJB/SOCxcu4OjRowrl69atQ5s2bVC9enW58pycHDx//lyu7NKlS3j06JF0e10iIiL6OGj8jBAiIiLSTvXr18eWLVvw9ddfy5Vv2rSpwEXQi+rBgwc4f/48EhISAAChoaGIiYmBs7MznJ2dAQCrV69GREQEOnbsKLWLiorCsWPHsHXrVoU+s7Oz0bp1a3h7e0vrmK1YsQKdO3dGr169im1fiIiIqPCYCCEiIiKNmD59Onr27ImLFy/Cw8MDQgicOnUKwcHB2L17d7GN+/jxY/zxxx8AgL59++L27du4ffs29PT0pERIs2bNYGlpKdfu5s2b6NevH3r06KHQZ5kyZXDx4kVs3LgRERERsLS0xMaNGxUWVCUiIiLNkwkhhKaDKGlJSUkwNzdHYmKi3MKsRVVlyiG19UX0sXs4v7OmQyAiDVD3MfTw4cOYM2cOLl++DABo1KgRpk6dik6dOhW5708R5yhERcc5CpF2KswxlGeEEBERkcZ06tRJa5MeREREpBlcLJWIiIiIiIiItAYTIURERERERESkNZgIISIiIiIiIiKtwUQIEREREREREWkNJkKIiIiIiIiISGswEUJEREREREREWoOJECIiIiIiIiLSGkyEEBEREREREZHWYCKEiIiIiIiIiLQGEyFEREREREREpDWYCCEi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/b+lV69eYc+ePahfv770t9SwYUPs3LkTycnJUjsrKyu4u7srrLiuzBhERJrEOQrRp4FzFCoM3jWGPgqXLl0CANStW1fpNlZWVnmuzK5M/xs2bICVlRU2btyoUHfPnj15rjhNRIp/S1u3boWxsTF27NiBHTt2SPUMDQ2xbds2jBgxAgDQokWLQv29WllZoUKFCmqOnoio8DhHIfo0cI5ChcFECGlcSkoKFixYAA8PD1SrVq1E+v/tt98wbdo0jB07Vq7ud999h7Vr13KSQZSH9PR0zJ07F02aNEH9+vUBAOvWrcP48eMRGBgoV3fu3LlYu3atNMlQ1sOHD7F+/XoMGTIEMplMbbETEamCcxSiTwPnKFRYTIRQifv7778RFxeHlJQUXL9+HatXr4auri42b95cIv2fOnUKt2/fRvfu3RXadu/eHfPnz8f9+/eLZcJD9Cm5evUq0tLSkJqain/++Qdr1qxBeno6jhw5AuDt39rly5exdetWhbbdu3fH1KlTcf36ddSrVy/P/nNycqRfYF69eoXz589j1apVaNasGWbPnl18O0ZElA/OUYg+DZyjUFExEUIlxszMDO7u7vj5558hk8lgbGwMR0dHfP/99+jRowcMDAwU2shkMri7u6N8+fJq6//ixYvo378/7O3tFfpo2rQpvL29cebMGU4ySGsZGxvD3d0d69evh0wmQ9myZeHg4IDAwED06tVLuob2/Pnz6NmzJ2rXrq3QR506ddCzZ0+cO3cuz0lGpUqV0LhxY0yZMgW6urowNTXFZ599hm3btqF9+/Z5/tKS+zdubGys/p0mIq3GOQrRp4FzFFIXmRBCaDoIIiIiIiIiIqKSwLvGEBEREREREZHWYCKEiIiIiIiIiLQGEyFEREREREREpDWYCCEiIiIiIiIircFECBERERERERFpDSZCiIiIiIiIiEhrMBFCRERERERERFqDiRAiUruoqCjs2bNH6foPHjzA/v37izGivBU2zsK0i4mJwc6dO1UNTe3xEBEREecoAOcoRAATIURKiYuLQ3BwMJKTk+XKz507hx07dijUP3bsGC5evKhU348fP8bevXvVEmdxePToEQ4dOoQjR47g3r17SrWJiIjA0KFDlR7j5MmTGDNmjKohqqywcRam3ZUrVzBgwABVQ8tXXv9e3o/nY/83RURE6sM5CucohW3HOQoREyFE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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n", "
\n", " \n", "
\n", " \n", "
\n", "
pair/protein hbond Δ +0.000; interface Δ +0.000
\n", "
\n", "

3Dmol.js failed to load for some reason. Please check your browser console for error messages.

\n", "
\n", "\n", "
\n", "
\n", "
pair/protein hbond Δ +3.727; interface Δ -1.883
\n", "
\n", "

3Dmol.js failed to load for some reason. Please check your browser console for error messages.

\n", "
\n", "\n", "
\n", "
\n", "
\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "def protein_dna_metrics(pose, target_pair_indices):\n", " dna = block_mask_for_name3(pose, DNA_NAMES)[0]\n", " real = pose.block_type_ind[0] >= 0\n", " protein = real & ~dna\n", " scorer = score_function.render_block_pair_scoring_module(pose)\n", " term_matrices = scorer(pose.coords, sum_terms=False, apply_weights=True)[:, 0]\n", " hbond = term_matrices[hbond_index]\n", " total = term_matrices.sum(dim=0)\n", " dna_indices = torch.nonzero(dna, as_tuple=False).flatten()\n", " protein_indices = torch.nonzero(protein, as_tuple=False).flatten()\n", " target_pair_indices = torch.as_tensor(\n", " target_pair_indices, dtype=torch.long, device=pose.device\n", " )\n", " pair_hbond = hbond[dna_indices[:, None], protein_indices[None, :]]\n", " pair_hbond = pair_hbond + hbond[\n", " protein_indices[:, None], dna_indices[None, :]\n", " ].T\n", " cross_total = total[dna_indices[:, None], protein_indices[None, :]].sum()\n", " cross_total += total[\n", " protein_indices[:, None], dna_indices[None, :]\n", " ].sum()\n", " target_pair_hbond = hbond[\n", " target_pair_indices[:, None], protein_indices[None, :]\n", " ].sum()\n", " target_pair_hbond += hbond[\n", " protein_indices[:, None], target_pair_indices[None, :]\n", " ].sum()\n", " whole_scorer = score_function.render_whole_pose_scoring_module(pose)\n", " return {\n", " \"total_score\": float(whole_scorer(pose.coords).detach().cpu()[0]),\n", " \"protein_DNA_interaction\": float(cross_total.detach().cpu()),\n", " \"protein_DNA_hbond\": float(pair_hbond.sum().detach().cpu()),\n", " \"target_pair_protein_hbond\": float(target_pair_hbond.detach().cpu()),\n", " \"protein_DNA_favorable_hbond_block_pairs\": int(\n", " (pair_hbond < -0.1).sum().detach().cpu()\n", " ),\n", " }\n", "\n", "\n", "def watson_crick_distances(pose):\n", " pair_names = {\n", " target_block: pose.block_type(0, target_block).name3,\n", " paired_block: pose.block_type(0, paired_block).name3,\n", " }\n", " adenine_blocks = [\n", " block for block, name3 in pair_names.items() if name3 == \"DA\"\n", " ]\n", " thymine_blocks = [\n", " block for block, name3 in pair_names.items() if name3 == \"DT\"\n", " ]\n", " if len(adenine_blocks) != 1 or len(thymine_blocks) != 1:\n", " raise RuntimeError(f\"Expected one DA and one DT, found {pair_names}\")\n", " adenine_block = adenine_blocks[0]\n", " thymine_block = thymine_blocks[0]\n", " return {\n", " \"A_N6_donor_to_T_O4_acceptor_A\": named_atom_distance(\n", " pose, adenine_block, \"N6\", thymine_block, \"O4\"\n", " ),\n", " \"A_N1_acceptor_to_T_N3_donor_A\": named_atom_distance(\n", " pose, adenine_block, \"N1\", thymine_block, \"N3\"\n", " ),\n", " }\n", "\n", "\n", "variant_poses = {}\n", "variant_rows = []\n", "watson_crick_rows = []\n", "for pose_index, variant_label in enumerate(variant_labels):\n", " packed_variant = packed_variants.split(pose_index)\n", " variant_pose = refined_variants.split(pose_index)\n", " variant_poses[variant_label] = variant_pose\n", " assert packed_variant.block_type(0, target_block).name3 == target_variants[\n", " pose_index\n", " ]\n", " assert packed_variant.block_type(0, paired_block).name3 == paired_variants[\n", " pose_index\n", " ]\n", " for stage, pose in (\n", " (\"packed; before Cartesian minimization\", packed_variant),\n", " (\"after Cartesian minimization\", variant_pose),\n", " ):\n", " watson_crick_rows.append(\n", " {\n", " \"pair_identity\": variant_label,\n", " \"stage\": stage,\n", " **watson_crick_distances(pose),\n", " }\n", " )\n", " variant_dna = block_mask_for_name3(variant_pose, DNA_NAMES)\n", " variant_protein = (variant_pose.block_type_ind >= 0) & ~variant_dna\n", " geometry = interface_geometry_diagnostics(\n", " variant_pose, variant_dna, variant_protein\n", " )\n", " geometry.update(\n", " bond_length_change_diagnostics(\n", " packed_variant,\n", " variant_pose,\n", " coord_mask[pose_index : pose_index + 1],\n", " )\n", " )\n", " variant_rows.append(\n", " {\n", " \"pair_identity\": variant_label,\n", " **protein_dna_metrics(\n", " variant_pose, [target_block, paired_block]\n", " ),\n", " **geometry,\n", " }\n", " )\n", "\n", "watson_crick_frame = pd.DataFrame(watson_crick_rows)\n", "show_table(watson_crick_frame)\n", "\n", "mutation_frame = pd.DataFrame(variant_rows)\n", "reference = mutation_frame.loc[\n", " mutation_frame[\"pair_identity\"] == \"DA·DT\"\n", "].iloc[0]\n", "for metric in (\n", " \"total_score\",\n", " \"protein_DNA_interaction\",\n", " \"protein_DNA_hbond\",\n", " \"target_pair_protein_hbond\",\n", "):\n", " mutation_frame[f\"delta_{metric}\"] = mutation_frame[metric] - reference[metric]\n", "if mutation_frame[\"delta_total_score\"].abs().max() > 100:\n", " raise RuntimeError(\n", " \"The local refinement changed the total score by more than 100 units; \"\n", " \"inspect the model before interpreting interface metrics.\"\n", " )\n", "mutation_frame[\"score_sanity_check\"] = \"passed\"\n", "mutation_frame = mutation_frame.sort_values(\n", " \"delta_target_pair_protein_hbond\", ascending=False\n", ")\n", "show_table(mutation_frame)\n", "\n", "fig, axes = plt.subplots(1, 2, figsize=(11, 4))\n", "axes[0].bar(\n", " mutation_frame[\"pair_identity\"],\n", " mutation_frame[\"delta_target_pair_protein_hbond\"],\n", ")\n", "axes[0].axhline(0, color=\"black\", linewidth=0.8)\n", "axes[0].set(\n", " xlabel=\"Watson–Crick pair identity\",\n", " ylabel=\"change in weighted hbond term\",\n", " title=\"Target pair ↔ protein hbond response\",\n", ")\n", "axes[1].bar(\n", " mutation_frame[\"pair_identity\"],\n", " mutation_frame[\"delta_protein_DNA_interaction\"],\n", ")\n", "axes[1].axhline(0, color=\"black\", linewidth=0.8)\n", "axes[1].set(\n", " xlabel=\"Watson–Crick pair identity\",\n", " ylabel=\"change in weighted interface score\",\n", " title=\"Whole protein–DNA interface response\",\n", ")\n", "plt.tight_layout()\n", "plt.show()\n", "\n", "display(\n", " tmol.switchable_view(\n", " variant_poses,\n", " notes={\n", " row[\"pair_identity\"]: (\n", " f\"pair/protein hbond Δ \"\n", " f\"{row['delta_target_pair_protein_hbond']:+.3f}; \"\n", " f\"interface Δ {row['delta_protein_DNA_interaction']:+.3f}\"\n", " )\n", " for _, row in mutation_frame.iterrows()\n", " },\n", " )\n", ")" ] }, { "cell_type": "markdown", "id": "bb0dd7c6", "metadata": {}, "source": [ "**Expected observations.** Positive hbond or interface deltas mean that the swapped, locally refined pair is less favorable than the equivalently refined starting pair under the displayed TMol score component. This single seeded comparison makes one structural response visible; it does not establish specificity, convergence, or an uncertainty interval. Repeat independent seeds and, where appropriate, starting structures before interpreting a sequence preference.\n", "\n", "## RNA aptamer with a fixed small molecule\n", "\n", "The 1EHT CIF contains explicit TEP chemical-component bonds and hydrogens. `prepare_ligands=True` creates ligand parameters and returns the extended database in the build context. The ligand is disabled in the `PackerTask`: only nearby RNA blocks receive low-level NA chi candidates. Cartesian minimization uses the same explicit base/proton-chi mask as the DNA example, fixing the RNA sugar–phosphate heavy atoms and sugar-bound carbon hydrogens. Theophylline coordinates remain fixed throughout this CPU-practical, single-seed example, and the code retains a direct coordinate assertion.\n", "\n", "The deposited 1EHT binding-site annotation names residues U6, A7, C8, C22, U24, and A28. The final table finds each annotated residue's nearest named **base** heavy-atom contact to TEP in the input, then measures that **same atom pair** after refinement. This is a concise recognition-pocket motif check using available atom names; it is not an invented hydrogen-bond classifier or a ligand-pose sampling claim. Interface heavy-atom contacts and covalent bond-length drift provide additional geometry diagnostics alongside the scores." ] }, { "cell_type": "code", "execution_count": 9, "id": "a5f7e975", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", " \n", " \n", " \n", " \n", " \n", "\n", "
\n", " \n", " \n", " \n", " \n", "\n", "
RNA_pocket_blocksCartesian_movable_RNA_base_and_proton_chi_atomsmovable_ligand_atoms
182510
\n", "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/3dmoljs_load.v0": "
\n

3Dmol.js failed to load for some reason. Please check your browser console for error messages.

\n
\n", "text/html": [ "
\n", "

3Dmol.js failed to load for some reason. Please check your browser console for error messages.

\n", "
\n", "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n", "\n", " \n", " \n", " \n", " \n", " \n", "\n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", "\n", "\n", "\n", "\n", "\n", "
annotated_RNA_residueRNA_atomTEP_atominput_distance_Arefined_same_pair_distance_Ainput_direct_contact_le_4A
A:6 UN1O64.8094634.790088False
A:7 AN3N73.8624203.742735True
A:8 CN4N93.0304003.144679True
A:22 CO2N73.2788712.933394True
A:24 UN3N93.1619673.116646True
A:28 AN7N92.8124653.117323True
\n", "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n", "\n", " \n", " \n", " \n", " \n", " \n", "\n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", "\n", "
stageRNA_TEP_interactionRNA_TEP_hbondmax_ligand_motion_Aminimum_intergroup_heavy_atom_distance_Aintergroup_heavy_atom_pairs_below_2Abond_length_RMS_change_from_input_Amaximum_absolute_bond_length_change_from_input_A
input-19.521891-0.6104450.0000002.79844200.0000000.000000
RNA repacked + minimized; TEP fixed-25.594023-2.7172720.0000022.79844300.0194160.056396
\n", "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n", "
\n", " \n", "
\n", " \n", "
\n", "
RNA–TEP interaction -19.522
\n", "
\n", "

3Dmol.js failed to load for some reason. Please check your browser console for error messages.

\n", "
\n", "\n", "
\n", "
\n", "
RNA–TEP interaction -25.594; max ligand motion 0.000002 Å
\n", "
\n", "

3Dmol.js failed to load for some reason. Please check your browser console for error messages.

\n", "
\n", "\n", "
\n", "
\n", "
\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from openbabel import openbabel as ob\n", "\n", "aptamer_array = atom_arrays[\"theophylline RNA aptamer — 1EHT\"]\n", "openbabel_output_level = ob.obErrorLog.GetOutputLevel()\n", "ob.obErrorLog.SetOutputLevel(ob.obError)\n", "try:\n", " aptamer_pose, aptamer_context = build_pose(\n", " aptamer_array, prepare_ligands=True, return_context=True\n", " )\n", "finally:\n", " ob.obErrorLog.SetOutputLevel(openbabel_output_level)\n", "aptamer_sfxn = beta2016_score_function(\n", " device, param_db=aptamer_context.parameter_database\n", ")\n", "ligand_mask = block_mask_for_name3(aptamer_pose, {\"TEP\"})\n", "rna_mask = block_mask_for_name3(aptamer_pose, {\"A\", \"C\", \"G\", \"U\"})\n", "if int(ligand_mask.sum()) != 1:\n", " raise RuntimeError(\"Expected exactly one TEP ligand block\")\n", "ligand_block = int(torch.nonzero(ligand_mask[0], as_tuple=False)[0])\n", "\n", "centroids, radii = compute_block_centroids_and_furthest_dist(aptamer_pose)\n", "aptamer_adjacency = compute_block_adjacency(centroids, radii)\n", "pocket_rna = aptamer_adjacency[:, ligand_block] & rna_mask\n", "\n", "aptamer_task = PackerTask(aptamer_pose, PackerPalette())\n", "aptamer_task.restrict_to_repacking()\n", "aptamer_task.disable_packing_by_block_mask(~pocket_rna)\n", "aptamer_task.add_conformer_sampler(\n", " NaChiRotamerSampler.from_database(\n", " aptamer_context.parameter_database,\n", " device,\n", " chi_sample_level=1,\n", " sample_syn=True,\n", " )\n", ")\n", "aptamer_task.add_conformer_sampler(IncludeCurrentSampler())\n", "\n", "torch.manual_seed(SEED)\n", "packed_aptamer = pack_rotamers(aptamer_pose, aptamer_sfxn, aptamer_task)\n", "aptamer_coord_mask = build_na_base_and_proton_chi_coord_mask(\n", " packed_aptamer, pocket_rna\n", ")\n", "movable_ligand_atoms = int(\n", " (\n", " aptamer_coord_mask\n", " & res_mask_to_coord_mask(packed_aptamer, ligand_mask)\n", " )\n", " .sum()\n", " .item()\n", ")\n", "assert movable_ligand_atoms == 0\n", "show_table(\n", " pd.DataFrame(\n", " [\n", " {\n", " \"RNA_pocket_blocks\": int(pocket_rna.sum().item()),\n", " \"Cartesian_movable_RNA_base_and_proton_chi_atoms\": int(\n", " aptamer_coord_mask.sum().item()\n", " ),\n", " \"movable_ligand_atoms\": movable_ligand_atoms,\n", " }\n", " ]\n", " )\n", ")\n", "try:\n", " aptamer_scope_viewer = tmol.view(\n", " packed_aptamer,\n", " highlighted=aptamer_coord_mask[0, packed_aptamer.real_atoms[0]],\n", " highlight_color=\"#7b2cbf\",\n", " )\n", " aptamer_scope_viewer.show()\n", "except ImportError:\n", " print(\"Install py3Dmol to inspect the RNA refinement mask.\")\n", "\n", "refined_aptamer = run_cart_min(\n", " packed_aptamer,\n", " aptamer_sfxn,\n", " coord_mask=aptamer_coord_mask,\n", " optimizer_kwargs={\"max_iter\": 10},\n", ")\n", "\n", "\n", "def ligand_rna_metrics(pose):\n", " ligand = block_mask_for_name3(pose, {\"TEP\"})[0]\n", " rna = block_mask_for_name3(pose, {\"A\", \"C\", \"G\", \"U\"})[0]\n", " scorer = aptamer_sfxn.render_block_pair_scoring_module(pose)\n", " matrices = scorer(pose.coords, sum_terms=False, apply_weights=True)[:, 0]\n", " hb_index = aptamer_sfxn.all_score_types().index(ScoreType.hbond)\n", " ligand_indices = torch.nonzero(ligand, as_tuple=False).flatten()\n", " rna_indices = torch.nonzero(rna, as_tuple=False).flatten()\n", " total = matrices.sum(dim=0)\n", " interaction = total[ligand_indices[:, None], rna_indices[None, :]].sum()\n", " interaction += total[rna_indices[:, None], ligand_indices[None, :]].sum()\n", " hbond = matrices[hb_index]\n", " hbond_interaction = hbond[ligand_indices[:, None], rna_indices[None, :]].sum()\n", " hbond_interaction += hbond[rna_indices[:, None], ligand_indices[None, :]].sum()\n", " return float(interaction.detach().cpu()), float(hbond_interaction.detach().cpu())\n", "\n", "\n", "interaction_before, hbond_before = ligand_rna_metrics(aptamer_pose)\n", "interaction_after, hbond_after = ligand_rna_metrics(refined_aptamer)\n", "ligand_coord_mask = res_mask_to_coord_mask(aptamer_pose, ligand_mask)\n", "ligand_coords_before = aptamer_pose.coords[ligand_coord_mask]\n", "ligand_coords_after = refined_aptamer.coords[ligand_coord_mask]\n", "ligand_motion = float(\n", " torch.linalg.vector_norm(ligand_coords_after - ligand_coords_before, dim=-1)\n", " .max()\n", " .detach()\n", " .cpu()\n", ")\n", "if ligand_motion > 1e-3:\n", " raise RuntimeError(\n", " f\"The fixed TEP ligand moved by {ligand_motion:.6f} Å; check the coordinate mask\"\n", " )\n", "input_geometry = interface_geometry_diagnostics(\n", " aptamer_pose, ligand_mask, rna_mask\n", ")\n", "refined_geometry = interface_geometry_diagnostics(\n", " refined_aptamer, ligand_mask, rna_mask\n", ")\n", "bond_geometry = bond_length_change_diagnostics(\n", " aptamer_pose, refined_aptamer, aptamer_coord_mask\n", ")\n", "\n", "# The deposited _struct_site_gen table names these six recognition-pocket residues.\n", "recognition_site = {\n", " \"6\": \"U\",\n", " \"7\": \"A\",\n", " \"8\": \"C\",\n", " \"22\": \"C\",\n", " \"24\": \"U\",\n", " \"28\": \"A\",\n", "}\n", "aptamer_chain_labels = np.asarray(\n", " aptamer_pose.pdb_info.chain_labels[0]\n", ").astype(str)\n", "aptamer_residue_labels = np.asarray(\n", " aptamer_pose.pdb_info.residue_labels[0]\n", ").astype(str)\n", "aptamer_elements = {\n", " atom_type.name: atom_type.element\n", " for atom_type in aptamer_context.parameter_database.chemical.atom_types\n", "}\n", "ligand_heavy_names = [\n", " atom.name\n", " for atom in aptamer_pose.block_type(0, ligand_block).atoms\n", " if aptamer_elements.get(atom.atom_type) != \"H\"\n", "]\n", "recognition_contact_rows = []\n", "for residue_label, expected_name3 in recognition_site.items():\n", " candidates = torch.nonzero(\n", " rna_mask[0]\n", " & torch.as_tensor(\n", " (aptamer_chain_labels == \"A\")\n", " & (aptamer_residue_labels == residue_label),\n", " device=device,\n", " ),\n", " as_tuple=False,\n", " ).flatten()\n", " if len(candidates) != 1:\n", " raise RuntimeError(\n", " f\"Expected one annotated RNA residue A:{residue_label}\"\n", " )\n", " rna_block = int(candidates[0])\n", " observed_name3 = aptamer_pose.block_type(0, rna_block).name3\n", " if observed_name3 != expected_name3:\n", " raise RuntimeError(\n", " f\"A:{residue_label} is {observed_name3}, expected {expected_name3}\"\n", " )\n", " rna_heavy_names = [\n", " atom.name\n", " for atom in aptamer_pose.block_type(0, rna_block).atoms\n", " if aptamer_elements.get(atom.atom_type) != \"H\"\n", " and \"'\" not in atom.name\n", " and atom.name != \"P\"\n", " and not atom.name.startswith(\"OP\")\n", " and not (atom.name.startswith(\"O\") and atom.name.endswith(\"P\"))\n", " ]\n", " if not rna_heavy_names:\n", " raise RuntimeError(f\"No named base heavy atoms for A:{residue_label}\")\n", " named_pairs = [\n", " (\n", " named_atom_distance(\n", " aptamer_pose,\n", " rna_block,\n", " rna_atom,\n", " ligand_block,\n", " ligand_atom,\n", " ),\n", " rna_atom,\n", " ligand_atom,\n", " )\n", " for rna_atom in rna_heavy_names\n", " for ligand_atom in ligand_heavy_names\n", " ]\n", " input_distance, rna_atom, ligand_atom = min(named_pairs)\n", " refined_distance = named_atom_distance(\n", " refined_aptamer,\n", " rna_block,\n", " rna_atom,\n", " ligand_block,\n", " ligand_atom,\n", " )\n", " recognition_contact_rows.append(\n", " {\n", " \"annotated_RNA_residue\": (\n", " f\"A:{residue_label} {observed_name3}\"\n", " ),\n", " \"RNA_atom\": rna_atom,\n", " \"TEP_atom\": ligand_atom,\n", " \"input_distance_A\": input_distance,\n", " \"refined_same_pair_distance_A\": refined_distance,\n", " \"input_direct_contact_le_4A\": input_distance <= 4.0,\n", " }\n", " )\n", "recognition_contact_frame = pd.DataFrame(recognition_contact_rows)\n", "show_table(recognition_contact_frame)\n", "\n", "aptamer_frame = pd.DataFrame(\n", " [\n", " {\n", " \"stage\": \"input\",\n", " \"RNA_TEP_interaction\": interaction_before,\n", " \"RNA_TEP_hbond\": hbond_before,\n", " \"max_ligand_motion_A\": 0.0,\n", " **input_geometry,\n", " \"bond_length_RMS_change_from_input_A\": 0.0,\n", " \"maximum_absolute_bond_length_change_from_input_A\": 0.0,\n", " },\n", " {\n", " \"stage\": \"RNA repacked + minimized; TEP fixed\",\n", " \"RNA_TEP_interaction\": interaction_after,\n", " \"RNA_TEP_hbond\": hbond_after,\n", " \"max_ligand_motion_A\": ligand_motion,\n", " **refined_geometry,\n", " \"bond_length_RMS_change_from_input_A\": bond_geometry[\n", " \"bond_length_RMS_change_A\"\n", " ],\n", " \"maximum_absolute_bond_length_change_from_input_A\": bond_geometry[\n", " \"maximum_absolute_bond_length_change_A\"\n", " ],\n", " },\n", " ]\n", ")\n", "show_table(aptamer_frame)\n", "display(\n", " tmol.switchable_view(\n", " {\"input aptamer\": aptamer_pose, \"refined RNA pocket\": refined_aptamer},\n", " notes={\n", " \"input aptamer\": f\"RNA–TEP interaction {interaction_before:.3f}\",\n", " \"refined RNA pocket\": (\n", " f\"RNA–TEP interaction {interaction_after:.3f}; \"\n", " f\"max ligand motion {ligand_motion:.6f} Å\"\n", " ),\n", " },\n", " )\n", ")" ] }, { "cell_type": "markdown", "id": "nmr-ensemble-intro", "metadata": {}, "source": [ "## Conformational uncertainty across the complete 1EHT NMR ensemble\n", "\n", "The deposited 1EHT entry contains ten models with identical chemistry. Model 1 above supports a controlled local-refinement example; the experiment below asks a different question by scoring all ten deposited starting conformations without refinement. The first pose reuses `aptamer_pose`, and models 2–10 reuse its ligand-aware build context. One `PoseStack` and one rendered block-pair scorer expose conformational variation without repeating ligand preparation.\n", "\n", "The table reports both-orientation RNA–TEP interaction and hbond scores, the closest recognition-pocket heavy-atom distance, and the number of recognition-pocket/ligand heavy-atom pairs within 4 Å. NMR model number is an ensemble label, not a time coordinate or statistical weight.\n" ] }, { "cell_type": "code", "execution_count": 10, "id": "nmr-ensemble-code", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", " \n", " \n", " \n", " \n", " \n", "\n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
NMR_modelRNA_TEP_interactionRNA_TEP_hbondclosest_recognition_pocket_heavy_distance_Arecognition_pocket_heavy_pairs_le_4A
1-19.521893-0.6104452.798442130
2-17.440742-1.4913952.66831289
3-16.5182480.0000002.74155981
4-16.414392-0.4988492.851621113
5-13.169446-0.6774362.766894101
6-18.531498-1.4100292.896141130
7-14.884745-0.4493972.874888105
8-16.924568-0.6410572.969506114
9-15.772234-1.0879202.719331109
10-17.564898-0.5814823.075090109
\n", "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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HwCwYFAraGvyMhARERERERGpAu/A1eC/5+8jM78YrW2MMdy9sbrDISIiIiIiImowmAhRsZSsAmy98AAAsHBwK2hqSNQbEBEREREREVEDwkSIim04G428ohK4O5hhUFsbdYdDREREREREpDKF+YVIepCM7Gc5aotBS22v3ICUSAVcjU3D3aRM7AyKAwB84t0aEgl7gxAREREREdGrLys9G78v248TWwOQn1sAJ4/GMNQ1wpuLxqKzdweVxsJEiJKduJmIZUduIzEjX9ymo6mBrPwiNUZFREREREREpBpZ6dmY1/0LPIpOgrRECsm/U0TcvRKFz1/7Gp9sm41Bb/VRWTwcGqNEJ24mYubOEJkkCAAUlkgxc2cITtxMVFNkRERERERERKqxa/kBMQnyPKlUAARg7fu/qHSoDBMhSlIiFbDsyG0IVZRZduQ2SqRVlSAiIiIiIiKqv4oKi3Bsy5lySRCZMgXFOLPrvMpiYiJESa7GppXrCfI8AUBiRj6uxqapLigiIiIiIiIiFUp/koG8rMrvjQFAU0sDD+8kqCgiJkKUJrmaC13TckRERERERET1jb6RXrVlBEGAgbG+CqIpxUSIkjQyrv5i16QcERERERERUX1jbG4E977toKFZefqhpFiK3v/pprKYmAhRki7OFrAz1UNlC+RKANiZ6qGLs4UqwyIiIiIiIiJSqUlfjoUgFVDRDbKGpgY6ebujpUczlcXDRIiSaGpIsGR4WwDlr3XZ4yXD20JTo7JUCREREREREVH916GfKz7/Yx509XUBCaClrSn2EPEc7I4v9y1UaTxaKn21BmaIqx02TvLAsiO3ZSZOtTXVw5LhbTHE1U6N0RERERERERGpRt/xPdDlNQ+c3X0BD+8+gkljA3z0cye07Ki6niBlmAhRsiGudhjU1hZXY9OQnJWPRsalw2HYE4SIiIiIiIgaEgNjfQx7dxCkUimSk5PRqFEjtcTBRIgKaGpI0K25pbrDICIiIiIiImrwOEcIERERERERETUYTIQQERERERERUYPBRAgRERERERERNRhMhBARERERERFRg8FECBERERERERE1GFw1pgKCIAAAMjMz1RxJ3SCVSpGVlQU9PT1oaDB3pkqse/VgvasP6149lFXvZX9Hy/6uUsVq0+7gZ0V5WLfKwXpVHtat8rBulUcZdVuTdgcTIRXIysoCADg4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PA4cOIA1a9aISwl36tQJ//3vf6GpqQlDQ0Po6+vD2tq6RivYPa+iyVJtbW3lXqmuphwcHKo9z169ekFDQwM+Pj4YMmQILl68WG4oTZlJkybh3XffRW5ursxcMWWmT5+Or7/+Gjo6OpgwYUKVsY0YMQLe3t74/PPP0bRpU+zevRtxcXEyPS/s7e1ha2uLZcuWYfDgwXBwcICPjw82btyIfv36YebMmUhMTMSqVauwbt06uefHqKl169YhIyMD9vb22LBhA7p06SJOsCrPecjrq6++Qnx8PAYNGgQDAwNs2bIFvXv3rjQJsm/fvip/YCpbLlgRSkpK8Pvvv1c4SbCDgwM8PDywdetWrF69WmGv2VAwEUJEREREdYaxsTHGjx9f7ubK2toaISEh+P3333H16lUYGBjgtddew7hx48Qytra2CA0NxZYtWxAcHAx7e3v4+fmJE1A3adIEN27cwH//+1+cP38e9vb2CA0NRcuWLcVjNG/eHFevXsUvv/yC4OBgeHt7o3v37ti8ebNYxsXFRVxytkyTJk1kYmnRooXMUA43Nzf4+fnh2LFjCAsLg6mpabky8sQnz2tXplmzZti+fTv27t2LpKQkbNiwAW+++WaNXr+6On4xvoULF8LAwAA7duyAm5sb5s2bhx49emDfvn04f/48mjdvDj8/P5lel5s2bcLPP/+MU6dOiT1NqhoW061bt0qH65QtX/xibwE3NzcxETJs2DCZuUyqM3bsWJmeHADg7e0t0zOiuvO0trbGlStX8Msvv+DcuXNwcXHB2bNn8e2335abRHPkyJE4evQoTE1NK0ygOTk5oUOHDnBxcRFXVKrMgAED4O/vjwMHDuDKlSuYNGkSPvroIwQEBIhltLS0cOrUKWzbtg1Hjx6Fh4cHevbsiVOnTmHLli24du0ajIyMcPz4cZlVSywsLDB+/HiZiVqtra0xfvx4mV4sdnZ2cq3KFxgYiP379yM4OBhTpkzB7NmzxZ5K8pyHiYkJxo8fLzPs7cX4AGDjxo04duyY2JN66tSpmDx5cqVx+fn5oaSkpNL9LVu2lHu+OzMzM4wfP77SuW+io6PRu3dvjB07tsL9CxcuRFBQkFyvRbIkwvOD0Iio3lu7di2MjY0xffp0dYdCRERU7wiCgIyMDJkbyiFDhsDa2vqlV4VRp1WrVmHnzp3iUsP1SdOmTfHLL79UuzxwQ/X48WM4OTnh1KlTSuvlokrBwcHo3Lkz0tPTq03sENUWe4QQvWIqGqpBRERE8hEEAf369cOYMWPQqFEj/P333wgKCsI///yj7tAapNTUVHTv3v2VuMFXtLy8PBw8eBDbtm2Dl5cX64ioBspPg0tERERE1EBpaGjg8OHDkEqluHLlijgpddlKHPVVRUNq6gMrKyv88ccfNV5lpiHIy8vDkSNH0L59+0pX9quPKhvCQqRIHBpDRERERERERA0Ge4QQERERERERUYPBRAgRERERERERNRhMhBARERERERFRg8FECBERERERERE1GEyEEBEREREREVGDwUQIERERERERETUYTIQQERERERERUYPBRAgRERERERERNRhMhBARERERERFRg/H/7TCO2PJ0gHgAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n", "
\n", " \n", "
\n", " \n", "
\n", "
RNA–TEP interaction -19.522; contacts ≤4 Å 130
\n", "
\n", "

3Dmol.js failed to load for some reason. Please check your browser console for error messages.

\n", "
\n", "\n", "
\n", "
\n", "
RNA–TEP interaction -16.518; contacts ≤4 Å 81
\n", "
\n", "

3Dmol.js failed to load for some reason. Please check your browser console for error messages.

\n", "
\n", "\n", "
\n", "
\n", "
RNA–TEP interaction -13.169; contacts ≤4 Å 101
\n", "
\n", "

3Dmol.js failed to load for some reason. Please check your browser console for error messages.

\n", "
\n", "\n", "
\n", "
\n", "
\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "aptamer_ensemble_arrays = load_structure(\n", " str(cif_paths[\"theophylline RNA aptamer — 1EHT\"]),\n", " include_bonds=True,\n", ")\n", "if aptamer_ensemble_arrays.stack_depth() != 10:\n", " raise RuntimeError(\"Expected ten deposited 1EHT NMR models\")\n", "ensemble_poses = [aptamer_pose]\n", "for model_index in range(1, aptamer_ensemble_arrays.stack_depth()):\n", " diagnostics = StringIO()\n", " try:\n", " with redirect_stdout(diagnostics), redirect_stderr(diagnostics):\n", " ensemble_poses.append(\n", " pose_stack_from_biotite(\n", " aptamer_ensemble_arrays[model_index],\n", " device,\n", " context=aptamer_context,\n", " no_optH=True,\n", " )\n", " )\n", " except Exception:\n", " print(diagnostics.getvalue())\n", " raise\n", "\n", "aptamer_ensemble = PoseStackBuilder.from_poses(ensemble_poses, device)\n", "ensemble_ligand = block_mask_for_name3(aptamer_ensemble, {\"TEP\"})\n", "ensemble_rna = block_mask_for_name3(aptamer_ensemble, {\"A\", \"C\", \"G\", \"U\"})\n", "ensemble_pair_mask = (ensemble_ligand[:, :, None] & ensemble_rna[:, None, :]) | (\n", " ensemble_rna[:, :, None] & ensemble_ligand[:, None, :]\n", ")\n", "ensemble_scorer = aptamer_sfxn.render_block_pair_scoring_module(aptamer_ensemble)\n", "with torch.no_grad():\n", " ensemble_matrices = ensemble_scorer(\n", " aptamer_ensemble.coords,\n", " sum_terms=False,\n", " apply_weights=True,\n", " )\n", "ensemble_interactions = (ensemble_matrices.sum(dim=0) * ensemble_pair_mask).sum(\n", " dim=(1, 2)\n", ")\n", "ensemble_hbond_index = aptamer_sfxn.all_score_types().index(ScoreType.hbond)\n", "ensemble_hbonds = (ensemble_matrices[ensemble_hbond_index] * ensemble_pair_mask).sum(\n", " dim=(1, 2)\n", ")\n", "\n", "ensemble_elements = {\n", " atom_type.name: atom_type.element\n", " for atom_type in aptamer_context.parameter_database.chemical.atom_types\n", "}\n", "\n", "\n", "def heavy_coordinate_indices(pose, pose_index, block_mask):\n", " \"\"\"Return coordinate indices for heavy atoms in selected blocks.\"\"\"\n", " indices = []\n", " pose_block_mask = (\n", " block_mask[pose_index] if block_mask.ndim == 2 else block_mask\n", " )\n", " for block_index in (\n", " torch.nonzero(pose_block_mask, as_tuple=False).flatten().tolist()\n", " ):\n", " block_type = pose.block_type(pose_index, block_index)\n", " offset = int(pose.block_coord_offset64[pose_index, block_index])\n", " indices.extend(\n", " offset + atom_index\n", " for atom_index, atom in enumerate(block_type.atoms)\n", " if ensemble_elements.get(atom.atom_type) != \"H\"\n", " )\n", " return torch.as_tensor(indices, device=device, dtype=torch.long)\n", "\n", "\n", "ensemble_rows = []\n", "recognition_labels = set(recognition_site)\n", "for pose_index in range(aptamer_ensemble.n_poses):\n", " chain_labels = np.asarray(\n", " aptamer_ensemble.pdb_info.chain_labels[pose_index]\n", " ).astype(str)\n", " residue_labels = np.asarray(\n", " aptamer_ensemble.pdb_info.residue_labels[pose_index]\n", " ).astype(str)\n", " recognition_blocks = ensemble_rna[pose_index] & torch.as_tensor(\n", " (chain_labels == \"A\") & np.isin(residue_labels, list(recognition_labels)),\n", " device=device,\n", " )\n", " ligand_indices = heavy_coordinate_indices(\n", " aptamer_ensemble, pose_index, ensemble_ligand\n", " )\n", " pocket_indices = heavy_coordinate_indices(\n", " aptamer_ensemble, pose_index, recognition_blocks\n", " )\n", " distances = torch.cdist(\n", " aptamer_ensemble.coords[pose_index, ligand_indices],\n", " aptamer_ensemble.coords[pose_index, pocket_indices],\n", " )\n", " ensemble_rows.append(\n", " {\n", " \"NMR_model\": pose_index + 1,\n", " \"RNA_TEP_interaction\": float(\n", " ensemble_interactions[pose_index].detach().cpu()\n", " ),\n", " \"RNA_TEP_hbond\": float(ensemble_hbonds[pose_index].detach().cpu()),\n", " \"closest_recognition_pocket_heavy_distance_A\": float(\n", " distances.min().detach().cpu()\n", " ),\n", " \"recognition_pocket_heavy_pairs_le_4A\": int(\n", " (distances <= 4.0).sum().item()\n", " ),\n", " }\n", " )\n", "\n", "ensemble_frame = pd.DataFrame(ensemble_rows)\n", "show_table(ensemble_frame)\n", "\n", "fig, axes = plt.subplots(1, 2, figsize=(11, 4))\n", "axes[0].plot(\n", " ensemble_frame[\"NMR_model\"],\n", " ensemble_frame[\"RNA_TEP_interaction\"],\n", " marker=\"o\",\n", ")\n", "axes[0].set(\n", " xlabel=\"deposited NMR model\",\n", " ylabel=\"weighted RNA–TEP interaction\",\n", " title=\"Interaction score across starting conformers\",\n", ")\n", "axes[1].scatter(\n", " ensemble_frame[\"recognition_pocket_heavy_pairs_le_4A\"],\n", " ensemble_frame[\"RNA_TEP_interaction\"],\n", " c=ensemble_frame[\"NMR_model\"],\n", " cmap=\"viridis\",\n", ")\n", "axes[1].set(\n", " xlabel=\"recognition-pocket/TEP heavy-atom pairs ≤ 4 Å\",\n", " ylabel=\"weighted RNA–TEP interaction\",\n", " title=\"Geometry and score vary together imperfectly\",\n", ")\n", "for axis in axes:\n", " axis.grid(alpha=0.3)\n", "plt.tight_layout()\n", "plt.show()\n", "\n", "lowest_model = int(ensemble_frame[\"RNA_TEP_interaction\"].idxmin())\n", "highest_model = int(ensemble_frame[\"RNA_TEP_interaction\"].idxmax())\n", "distance_from_median = (\n", " ensemble_frame[\"RNA_TEP_interaction\"]\n", " - ensemble_frame[\"RNA_TEP_interaction\"].median()\n", ").abs()\n", "middle_model = int(distance_from_median.idxmin())\n", "selected_models = list(dict.fromkeys([lowest_model, middle_model, highest_model]))\n", "display(\n", " tmol.switchable_view(\n", " {\n", " f\"NMR model {index + 1}\": aptamer_ensemble.split(index)\n", " for index in selected_models\n", " },\n", " notes={\n", " f\"NMR model {index + 1}\": (\n", " f\"RNA–TEP interaction \"\n", " f\"{ensemble_frame.loc[index, 'RNA_TEP_interaction']:.3f}; \"\n", " f\"contacts ≤4 Å \"\n", " f\"{ensemble_frame.loc[index, 'recognition_pocket_heavy_pairs_le_4A']}\"\n", " )\n", " for index in selected_models\n", " },\n", " )\n", ")" ] }, { "cell_type": "markdown", "id": "nmr-ensemble-observations", "metadata": {}, "source": [ "**Expected observations.** The ten deposited conformers need not have identical contacts or scores even though their sequence and parameterization match. A favorable interaction value can coexist with a different contact count because the score includes more than distance-threshold contacts. This ensemble measures sensitivity to deposited starting conformations; it is not a Boltzmann ensemble, uncertainty interval for refinement, or ligand-affinity prediction.\n" ] }, { "cell_type": "markdown", "id": "98f2ce51", "metadata": {}, "source": [ "## Rosetta and PyRosetta comparison\n", "\n", "Rosetta has protocol layers beyond the primitives demonstrated here: RosettaDNA base-pair mutation/design machinery, specialized RNA score functions and fragment assembly, FARFAR/FARFAR2, stepwise modeling, RNA threading, and docking. TMol currently provides canonical DNA/RNA chemistry, the combined NA torsion model, NA chi rotamers, all-atom scoring, packing, and generic Cartesian/kinematic minimization in a batched PyTorch representation.\n", "\n", "Two implementation details matter when translating a Rosetta workflow:\n", "\n", "- The TMol NA packer changes glycosidic chi and sampled hydroxyl proton chis. It reads sugar pucker from the input rather than sampling pucker, so it is not a complete nucleotide conformational search. The explicit Cartesian masks above move base/proton-chi atoms while fixing sugar–phosphate atoms; they do not perform discrete pucker sampling.\n", "- The protein–DNA pair-swap and model-1 aptamer refinement are single-seed, local, fixed-sugar–phosphate calculations. The separate ten-model aptamer analysis measures sensitivity to deposited starting conformations without refining them. Its NMR models are not statistical replicates. None of these examples invokes RosettaDNA specificity optimization, RNA fragment assembly, docking, or ligand-pose sampling.\n", "\n", "The closest PyRosetta starting point is [14.00 RNA Basics](https://nbviewer.org/github/RosettaCommons/PyRosetta.notebooks/blob/master/notebooks/14.00-RNA-Basics.ipynb). For broader Rosetta scoring context, the [Rosetta scoring tutorial](https://docs.rosettacommons.org/demos/latest/tutorials/scoring/scoring) and [Rosetta Energy Function workshop slides](https://meilerlab.org/wp-content/uploads/2023/12/Rosetta_Energy_Function.pdf) explain the weighted-term model and Rosetta's specialized score-function families. The [Rosetta-to-TMol crosswalk](rosetta_crosswalk.md) records which analogies stop at these lower-level primitives.\n", "\n", "## Where to go next\n", "\n", "This completes the core API Tutorials. Continue to [Case Study 09 — Map and Test a Protein Interface](09_protein_interface_hotspot_scan.ipynb) or [Case Study 10 — Ligand Pose Sensitivity and Local Rescue](10_ligand_pose_sensitivity.ipynb) for integrated scientific questions, or use the [Task index](recipe_index.md) for concise lookup." ] }, { "cell_type": "markdown", "id": "9d332113", "metadata": {}, "source": [ "## Exercises\n", "\n", "1. Change the homeodomain target from the strongest protein-hbond-scored adenine to the next-ranked site, identify its paired thymine with the same two-orientation rule, and compare pair swaps.\n", "2. On CUDA, repeat three PyTorch packer seeds at `chi_sample_level=1`; then expand the level only if runtime permits, reporting candidate count, runtime, interface-score spread, and Watson–Crick distance spread. On CPU, do not treat different torch seeds as controlled replicates because the packer uses an unexposed C RNG.\n", "3. Keep both DNA identities fixed and repack only the same nearby protein shell to separate sequence and conformational effects.\n", "4. In the aptamer, vary the RNA-pocket definition while asserting that TEP coordinates and the named recognition-pocket atom pairs remain unchanged.\n", "5. Locally refine all ten 1EHT models with one matched protocol, then compare the input ensemble spread with the endpoint spread without treating models as statistical replicates." ] }, { "cell_type": "markdown", "id": "f51fa2a4", "metadata": {}, "source": [ "## References\n", "\n", "- [Rosetta-to-TMol crosswalk](rosetta_crosswalk.md)\n", "- Kissinger et al., [Crystal structure of an engrailed homeodomain–DNA complex](https://doi.org/10.1016/0092-8674(90)90453-L)\n", "- Zimmermann et al., [Interlocking structural motifs mediate molecular discrimination by a theophylline-binding RNA](https://doi.org/10.1038/nsb0897-644)\n", "- [RCSB 1HDD](https://www.rcsb.org/structure/1HDD) and [RCSB 1EHT](https://www.rcsb.org/structure/1EHT)\n", "- [PyRosetta RNA Basics](https://nbviewer.org/github/RosettaCommons/PyRosetta.notebooks/blob/master/notebooks/14.00-RNA-Basics.ipynb)\n", "- [Rosetta additional energy terms, including DNA/RNA terms](https://docs.rosettacommons.org/docs/latest/rosetta_basics/scoring/score-types-additional)" ] } ], "metadata": { "accelerator": "GPU", "colab": { "gpuType": "T4" }, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "name": "python", "version": "3" } }, "nbformat": 4, "nbformat_minor": 5 }