{ "cells": [ { "cell_type": "markdown", "id": "f13dda63", "metadata": {}, "source": [ "# Tutorial 03 — Scoring and Analysis\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/03_scoring_and_analysis.ipynb)\n", "\n", "This tutorial creates a `beta2016` score function, scores a pose, and inspects score terms and block-pair contributions. It also demonstrates coordinate gradients and ligand-fragment accounting.\n", "\n", "## Learning objectives\n", "\n", "- Compare whole-pose, per-term, and block-pair scores.\n", "- Inspect one block pair and one fragmented ligand.\n", "- Differentiate a score with PyTorch autograd.\n", "\n", "## Before you begin\n", "\n", "- **Prerequisites:** [01 — Working with TMol](01_working_with_tmol.ipynb) and [02 — GPU batching](02_gpu_batching.ipynb).\n", "- **Curriculum:** This completes the 01 → 02 → 03 foundation. Next, take [04 — Packing](04_packing_and_mutation_scan.ipynb) and [05 — Minimization](05_minimization_constraints_kinematics.ipynb) in either order; complete both before 06.\n", "- **Related:** [Scoring workflow](../user_guide/scoring.md) · [Scoring API](../api/score.rst)\n", "\n", "TMol reports score units, not kcal/mol. This tutorial uses `beta2016_score_function()`; TMol does not provide `ref2015`, centroid residue types, or centroid/full-atom switching. The examples run on CPU; CUDA is useful for larger batches." ] }, { "cell_type": "markdown", "id": "1ad58cc5", "metadata": {}, "source": [ "## Setup\n", "\n", "This setup fixes seeds, loads a 30-residue 1UBQ slice for the general scoring examples, and defines a table helper that uses `itables` when it is installed. The fragment section later uses a second checked-in fixture: a prepared ACE protein–inhibitor complex in CIF format plus its matching deterministic ligand parameter file." ] }, { "cell_type": "code", "execution_count": 1, "id": "ebbef011", "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/1UBQ.cif\",\n", " \"tmol/tests/data/protein_ligand_test/ace.tmol.nomin.cif\",\n", " \"tmol/tests/data/protein_ligand_test/ace.xtal-lig.mmff94.tmol\",\n", " ]\n", " )" ] }, { "cell_type": "code", "execution_count": 2, "id": "f010d31e", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "device=cpu; input=1UBQ.cif; blocks=30\n" ] } ], "source": [ "from collections import deque\n", "from contextlib import redirect_stderr, redirect_stdout\n", "from io import StringIO\n", "from pathlib import Path\n", "\n", "import biotite.structure as struc\n", "import matplotlib.pyplot as plt\n", "import networkx as nx\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 atom_records_from_pose_stack, pose_stack_from_biotite\n", "from tmol.ligand import FRAGMENT_ID_ANNOTATION, load_params_file\n", "from tmol.score import (\n", " ScoreFunction,\n", " ScoreType,\n", " beta2016_score_function,\n", " calculate_fragment_interactions,\n", ")\n", "\n", "SEED = 20260807\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", "repo_root = Path.cwd()\n", "if not (repo_root / \"tmol/tests/data/cif/1UBQ.cif\").exists():\n", " repo_root = Path(tmol.__file__).resolve().parents[1]\n", "cif_path = repo_root / \"tmol/tests/data/cif/1UBQ.cif\"\n", "atom_array = load_structure(str(cif_path), model=1, include_bonds=True)\n", "protein_slice = atom_array[(atom_array.chain_id == \"A\") & (atom_array.res_id <= 30)]\n", "pose_diagnostics = StringIO()\n", "try:\n", " with redirect_stdout(pose_diagnostics), redirect_stderr(pose_diagnostics):\n", " # Optimize hydrogen coordinates before interpreting all-atom scores.\n", " pose_stack = pose_stack_from_biotite(protein_slice, device, no_optH=False)\n", "except Exception:\n", " print(pose_diagnostics.getvalue())\n", " raise\n", "score_function = beta2016_score_function(device)\n", "\n", "\n", "def show_table(frame):\n", " try:\n", " from itables import show\n", " except ImportError:\n", " display(frame)\n", " return None\n", " return show(frame)\n", "\n", "print(f\"device={device}; input={cif_path.name}; blocks={pose_stack.max_n_blocks}\")" ] }, { "cell_type": "markdown", "id": "28d65c69", "metadata": {}, "source": [ "## Whole-pose weighted and unweighted terms\n", "\n", "`render_whole_pose_scoring_module()` binds the score function to this pose layout. With the current scorer API, `sum_terms=False` retains the score-term axis and `apply_weights=False` returns raw term values. The default call sums weighted terms into one score per pose. These weighted values are TMol score units: beta2016-weighted term sums, not kcal/mol, thermodynamic free energies, or values guaranteed to match Rosetta score units numerically." ] }, { "cell_type": "code", "execution_count": 3, "id": "59c77a81", "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", "
termweightunweightedweighted
0fa_ljatr1.00-126.778610-126.778610
2fa_lk1.0099.10749199.107491
14dunbrack_rotdev0.69106.81349973.701317
16lk_ball_iso-0.38137.684586-52.320141
17lk_ball0.9256.54421252.020676
3fa_elec1.00-41.767223-41.767223
6cart_angles0.5074.37353537.186768
15dunbrack_semirot0.7827.91169221.771118
4hbond1.00-19.797235-19.797235
1fa_ljrep0.5535.31578419.423681
(14 more rows not shown)
\n", "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "weighted term sum: 87.9629\n", "whole-pose total: 87.9629\n" ] } ], "source": [ "whole_scorer = score_function.render_whole_pose_scoring_module(pose_stack)\n", "weighted_terms = whole_scorer(\n", " pose_stack.coords, sum_terms=False, apply_weights=True\n", ")\n", "unweighted_terms = whole_scorer(\n", " pose_stack.coords, sum_terms=False, apply_weights=False\n", ")\n", "total = whole_scorer(pose_stack.coords)\n", "score_types = score_function.all_score_types()\n", "weights = score_function.weights_tensor().detach().cpu().numpy()\n", "\n", "term_frame = pd.DataFrame(\n", " {\n", " \"term\": [score_type.name for score_type in score_types],\n", " \"weight\": weights,\n", " \"unweighted\": unweighted_terms[:, 0].detach().cpu().numpy(),\n", " \"weighted\": weighted_terms[:, 0].detach().cpu().numpy(),\n", " }\n", ")\n", "term_frame[\"abs_weighted\"] = term_frame[\"weighted\"].abs()\n", "term_frame = term_frame.sort_values(\"abs_weighted\", ascending=False).drop(\n", " columns=\"abs_weighted\"\n", ")\n", "show_table(term_frame)\n", "print(f\"weighted term sum: {weighted_terms[:, 0].sum().item():.4f}\")\n", "print(f\"whole-pose total: {total[0].item():.4f}\")" ] }, { "cell_type": "markdown", "id": "d08c6a85", "metadata": {}, "source": [ "## Build a focused score function and set a weight to zero\n", "\n", "`beta2016_score_function()` is a complete preset, but a `ScoreFunction` can also start empty. Setting a nonzero weight loads the implementation that covers that score type. Setting the weight back to zero removes that term's contribution from the weighted score; callers should not depend on the implementation being unloaded.\n", "\n", "The example scores repulsion and hydrogen bonding, then sets the hydrogen-bond weight to zero and rescoring the same coordinates. This is useful for debugging and controlled experiments, not a replacement for a validated full score function." ] }, { "cell_type": "code", "execution_count": 4, "id": "cac4f2c4", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", " \n", " \n", " \n", " \n", " \n", "\n", "
\n", " \n", " \n", " \n", " \n", "\n", "\n", "
stageactive_score_typesscore_units
fa_ljrep + hbondfa_ljatr, fa_ljrep, fa_lk, hbond-0.373554
hbond deactivatedfa_ljatr, fa_ljrep, fa_lk19.423681
\n", "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "focused_score_function = ScoreFunction(ParameterDatabase.get_default(), device)\n", "focused_score_function.set_weight(ScoreType.fa_ljrep, 0.55)\n", "focused_score_function.set_weight(ScoreType.hbond, 1.0)\n", "focused_scorer = focused_score_function.render_whole_pose_scoring_module(\n", " pose_stack\n", ")\n", "focused_score = float(focused_scorer(pose_stack.coords).detach().cpu()[0])\n", "active_before = [term.name for term in focused_score_function.all_score_types()]\n", "\n", "focused_score_function.set_weight(ScoreType.hbond, 0.0)\n", "active_after = [term.name for term in focused_score_function.all_score_types()]\n", "repulsion_only_scorer = focused_score_function.render_whole_pose_scoring_module(\n", " pose_stack\n", ")\n", "repulsion_only_score = float(\n", " repulsion_only_scorer(pose_stack.coords).detach().cpu()[0]\n", ")\n", "assert float(focused_score_function.get_weight(ScoreType.hbond)) == 0.0\n", "\n", "show_table(\n", " pd.DataFrame(\n", " [\n", " {\n", " \"stage\": \"fa_ljrep + hbond\",\n", " \"active_score_types\": \", \".join(active_before),\n", " \"score_units\": focused_score,\n", " },\n", " {\n", " \"stage\": \"hbond deactivated\",\n", " \"active_score_types\": \", \".join(active_after),\n", " \"score_units\": repulsion_only_score,\n", " },\n", " ]\n", " )\n", ")" ] }, { "cell_type": "markdown", "id": "2b4970cd", "metadata": {}, "source": [ "**Expected observations.** Raw and weighted columns differ wherever a term's weight is not one. The weighted column must sum to the default whole-pose result within floating-point tolerance. A large magnitude is not automatically an error: bonded, solvation, electrostatic, and reference contributions have different scales and cancellation is common. Hydrogen coordinates were optimized during pose construction because these scores are interpreted scientifically.\n", "\n", "## Directed accounting and a selected nonbonded pair\n", "\n", "`render_block_pair_scoring_module()` returns weighted block-pair values with shape `[n_poses, n_blocks, n_blocks]` when `sum_terms=True`. Keeping `sum_terms=False` adds a leading score-term axis.\n", "\n", "The all-term tensor is an accounting representation, not a symmetric contact map. One-body and intra-block contributions lie on the diagonal. Inter-block two-body contributions are evaluated once per unordered block pair and stored in one directed entry (normally the upper triangle), so `M[i, j]` need not equal `M[j, i]`. Use `M[i, j] + M[j, i]` for an off-diagonal residue-pair interaction.\n", "\n", "For a chemically clearer example, the ranking below uses only weighted `fa_ljatr`, `fa_ljrep`, `fa_lk`, `fa_elec`, and `hbond` values and excludes every block pair listed in `inter_residue_connections`. The full all-term matrix is still retained for total-score accounting. The optional per-block profile assigns each off-diagonal all-term pair equally to its two blocks; it is an explicit analytical convention, not a cached residue energy." ] }, { "cell_type": "code", "execution_count": 5, "id": "a437fc3b", "metadata": {}, "outputs": [ { "data": { "image/png": "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IiKDwRZQIiIiIhVJpFJIdDizji7rNiQl4y6JiIiIyGCwBZSIiIhIVRLJ+02X9ZcAbAElIiIiokLFFlAiIiIiVUklgC77aXIUPBERERGR9rEFlIiIiEhV7AOqFWwBJSIiIqJCxRZQIiIiIhVxHlDtKBl3SUREREQGgy2gRERERKqSSN9vuqy/BCgZd0lEREREBoMtoERERESqkkh0O1dnCRkFzwSUSoSXwVEalbe0sdCofGpymkblTUxNNCoPABlpGRrXQUREpA1MQImIiIhUJJFIIdFhP01d1m1ISsZdEhEREZHBYAsoERERkaqkOu4DyrXgiYiIiIi0jwkoERERkapy5gHV5WZggoOD8eeff8pfL1++HHXr1sXYsWORliZukK3h3SURERERGYwvv/wSLi4uAIDr169jxYoV6NevH65evYrvvvtOVJ1MQImIiIhUJZHofjMgcXFxePLkCZo0aQIAOHjwIEaOHImFCxdi7dq1OHnypKh6mYASERERkVKpqakQBAGCIAAAzp49i44dOwIASpUqhdTUVFH1chQ8ERERkaqk0vebLus3IOXLl4eNjQ1mz56NcuXK4dGjR/jss88AADdu3EDjxo1F1csElIiIiIiUkkgk2L17NyZPnozExERs374dlpaWyMzMxNatW3HkyBFR9TIBJSIiIlKVrkeqG9go+Li4OISEhODmzZsK+01MTHD+/Hn8/fffcHd3V7tew7pLIiIiIjIYkZGRWLp0aZ7Hli1bJqpetoASERERqYorIcmFhoaiTJkyosoyASUiIiIiBS9evED37t2RkZGB0NBQfPLJJwrHMzMzERISgkWLFomqnwkoERERkaokEh33ATWMFtDSpUtj1KhRePPmDfz9/TFq1CiF4+bm5qhRowbatm0rqn4moEQqSEkUN89ZDgsrc43KJ8YlaVQeAIxN+OtORESqsbOzw5QpU5CQkIBmzZqhe/fuWq2f/yIRERERqUrXqxUZSAtojlKlSmk9+QSYgBIRERHRB168eIHOnTvDw8MDP/74Izp37pznuR4eHjh27Jja1zCIBDQ5ORlXrlxBpUqVULlyZbXK3r17F9HR0ejQoYPS4zKZDPfu3UN6ejo8PT1hbq7Zo1AiIiIqwUrASkh2dnaYOHEi7Ozs5D/nd64YBpGA7tq1C1999RVatGiBixcvqlTml19+wdq1a/Hq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RsFXrFgR+/fv13q9eusD6ufnh86dOyttcfT29sbx48fx+vVrALkHIR09ehS//vorZDIZevfuDU9PT/kWFham8jlERERERVlISAjmzp2LTz75BNOnT1d6TmRkJMaMGYN69eqhXbt2+PXXXws5ytz01gK6bt06ODo6Kj32+eef4+bNm7CysgKAXAOH2rZtizt37igtm1OnKucQERERqUMme7/psn5VPXnyBJ07d8aIESNQunRpvHr1Ktc5aWlpaNu2LSpUqIANGzYgMDAQX375JTIyMuSDwPVBbwlo3bp18zxmYmICT09P+euPH5/b2toqHFdGlXOIiIiIiqpKlSohODgYUqkUV65cUXrOr7/+ihcvXuDq1asoXbo0WrVqhSdPnuDrr7/WawKq93lAiYiIiIoKQ5oH1MTEBFJp/qncuXPn0LRpU5QuXVq+r2vXrggNDcXz589Fvgua43qURERUaLKzNXt26ehmr1H5txFxGpXXVFam8oVQ1JEUq9kiKTb2thrHQLr38WI4YmfqCQsLg5OTk8K+8uXLAwDCw8P1NkibLaBEREREKiqsFlA3NzeFxXFWrFghKt7s7OxcK0DmJLJZWVkavReaYAsoERERkYEJCwtDqVKl5K/FzlNub2+P6OhohX05r+3tNXuioAm2gBIRERGpSIb/Ww1JJ9v/v06pUqUUNrEJaKNGjXDz5k1kZ2fL912+fBnW1taoUaOG5m+ISExAiYiIiIqpoUOHIikpCd9++y0A4PXr1/j+++8xfPhwva7+yEfwRERERCoSBAGCDpcrUrfuTz/9FOnp6QgPD4dUKkWNGjVQtmxZ/PvvvwDe9yXdv38/Ro0ahTVr1iAhIQHe3t5YvXq1LsJXGRNQIiIioiJq//79kH00e72xsWJ617VrV4SHhyMsLAy2traws7MrzBCVYgJKREREpCJDWwu+WrVqKp1nZGSEihUrqh+QjrAPKBEREREVKraAEhEREalI0PFa8IIO6zYkbAElIiIiokLFFlAiIiIiFRlaH9Ciii2gRERERFSo2AJKREREpKKcFYt0WX9JwBZQIiIiIipUbAElIiIiUhH7gGoHE1AiIioyXoe81ai8o5u9RuXfRcZrVN7C2kKj8gCQYWykUfnUpFSNyptbmmtUXiKVaFSeigcmoEREREQqEmQCBB121NRl3YaEfUCJiIiIqFCxBZSIiIhIRRwFrx1sASUiIiKiQsUWUCIiIiIVcRS8drAFlIiIiIgKFVtAiYiIiFQkkwmQ6bCjpi7rNiRsASUiIiKiQsUWUCIiIiIVsQ+odrAFlIiIiIgKFVtAiYiIiFTEFlDtYAsoERERERUqtoASERERqUgmCJDpsJlSl3UbEraAEhEREVGhYgsoERERkYoE2ftNl/WXBExAiYioxIgKe6dR+TKOthqVT01K16g8AAh6nqg8I02zezCzNNdSJFSUMQElIiIiUpEAAYIO+2kKYB9QIiIiIiKtM4gW0PT0dNy/fx/Ozs5wdnZWuVxmZiaePXsGBwcHODg45Dr+8OFDpKamKuwrV64cKlSooHHMREREVPIIMkDGPqAaM4gE9JdffsHIkSPRrl07/PPPPwWeHxMTg6+//hq7du1C+fLlERERgbp162Lnzp3w8PCQn9enTx+kpqaibNmy8n0+Pj6YOXOmTu6DiIiIiApmEAmon58fBg4ciH379uH58+cKSaQyoaGhqFatGiIiImBhYYGkpCR4e3tjwIABuH79usK5M2fOxMSJE3UZPhEREZUQgqDjPqCcB7RwPHr0CNevX8fq1avRsmVL+Pv75zonODgYwcHB8tf16tXDxIkTYWFhAQCwtrbGqFGjcOPGDaSkpCiUTUxMxP379xEbG6vbGyEiIiIileg9AfXz84OXlxdcXV0xZswY7NixA9nZ2Qrn+Pr6wtfXN9967t69i3LlysHS0lJh/5IlS9CvXz84Ozvjs88+w/Pnz7V+D0RERFQyyATdbyWBXhPQzMxM7N69G6NHjwYA9O3bF2lpaTh+/LjCedWqVUO1atXyrOfGjRtYv3495s+fr7B/6tSpiImJQVBQEMLCwiCTydC7d29kZWUprSc9PR0JCQkKGxERERFpl177gB4+fBhpaWkoX748bt68CQBo27Yt/P390a1bN/l5GzZsyLOOR48eoWvXrvjiiy8wadIkhWNjx46V/+zg4IA1a9agSZMmePDgATw9PXPVtWLFCixZskTDuyIiIqLiSpAJOl0MQN8LDRQWvSagfn5+cHBwwIQJExT2//fff4iKioKjo2O+5YOCgtCuXTt069YNW7duLfB6OVM8hYeHK01A586di2nTpslfJyQkwM3NTYU7ISIiIiJV6S0BffnyJU6fPo3//vsPtWvXVjjWsGFD7NixA7NnzwYA+QCkqlWrys95/PgxPvvsM3h5ecHPzw8SiUShjrS0NJibKy73lTPFU82aNZXGZGZmBjMzM81ujIiIiIotQXi/6bL+kkBvfUC3b98ODw+PXMknAHh7e2Pbtm3y1x8PQgoNDUW7du1QqVIljB8/Hrdv38bNmzdx8+ZNpKe/X6P22rVr6NChA/bs2YPz58/j22+/xaRJkzBmzBhUrlxZ9zdIRERERErprQX0/v37GDNmjNJjffr0waFDh/Do0SPUrFkz1wCkZ8+ewcnJCRkZGfjqq68Ujh06dAiurq5o06YNTE1NsXXrVjx//hyurq7Yvn07evfurbN7IiIiouJNJhMg02E/TV3WbUj0loAeOHAgz2M1a9aUD0oCcg9CateuncLxvDRr1gzNmjUTHyQRERERaZ1BrIREREREVBRwJSTt0PtE9ERERERUsrAFlIiISEUxUfEalS/jaKtxDJkZyhdTKSwfr1aorvjoONFlszKTNLq2Ngiy95su6y8J2AJKRERERIWKLaBEREREKpIJAmQ67Kepy7oNCVtAiYiIiKhQsQWUiIiISEUcBa8dbAElIiIiokLFFlAiIiIiFXElJO1gCygRERERFSq2gBIRERGpSBDeb7qsvyRgCygRERERFSq2gBIRERGpSBAECDrsp8lR8EREREREOsAWUCIiIiIVCTpeCYktoEREREREOsAWUCIiIiIVCTId9wHlPKBERERERNrHFlAiIqJCEhMVr3Ed5pZmGpWXGmnW9pSRlqFReefKzuKvnZ6o0bW1gS2g2sEWUCIiIiIqVGwBJSIiIlKRTHi/6bL+koAtoERERERUqNgCSkRERKQi9gHVDraAEhEREVGhYgsoERERkYoEQdDpakVcCYmIiIiISAfYAkpERESkIpkMkOmwn6ZMprOqDQpbQImIiIioULEFlIiIiEhF7AOqHWwBJSIiIqJCxRZQIiIiIhVxHlDtYAsoERERERUqtoASERERqYgtoNrBFlAiIiIiKlRsASUiIipC0lLSNSpvV7aUliIRR5MWPkNoHZRBgEyHI9Vl0P89Fga2gBIRERFRoWILKBEREZGK2AdUOwwiAX3+/DlWr16Ntm3bYsCAASqVSU5OxoEDB3D//n04ODigR48eqFWrlsI5MpkMR48exfXr15GRkYHatWtjwIABMDc318VtEBEREZEKDOIR/JYtW7B7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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "per-term block-pair shape: (24, 1, 30, 30)\n", "summed block-pair shape: (1, 30, 30)\n", "matrix sum: 87.96295 whole-pose score: 87.962890625\n" ] }, { "data": { "text/html": [ "\n", "\n", " \n", " \n", " \n", " \n", " \n", "\n", "
\n", " \n", " \n", " \n", " \n", " \n", "\n", "\n", "\n", "\n", "\n", "
termstored_i_to_jstored_j_to_itwo_orientation_sum
fa_ljatr-3.3014560.0-3.301456
fa_ljrep0.0897630.00.089763
fa_lk3.8247650.03.824765
fa_elec-4.5355570.0-4.535557
hbond-2.5082300.0-2.508230
\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", "
blockpdb_labelequal_split_all_term_score_units
1818A:19-2.777947
1616A:17-1.963329
2121A:22-1.699825
2525A:26-1.579815
22A:3-1.560023
44A:5-1.553674
2020A:21-1.336094
1111A:12-1.168918
66A:7-0.746334
55A:6-0.256000
(20 more rows not shown)
\n", "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Most favorable noncovalently connected pair by the five selected terms: blocks 4, 12 (A:5, A:13); two-orientation weighted score -6.431 score units\n" ] }, { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "
\n", "
\n", "
\n", "
\n", " pick a selection · drag to rotate · scroll to zoom · click a highlighted atom to label it\n", "
\n", "
\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "block_scorer = score_function.render_block_pair_scoring_module(pose_stack)\n", "block_pair_by_term = block_scorer(\n", " pose_stack.coords, sum_terms=False, apply_weights=True\n", ")\n", "block_pair_total = block_scorer(\n", " pose_stack.coords, sum_terms=True, apply_weights=True\n", ")\n", "\n", "matrix = block_pair_total[0].detach().cpu().numpy()\n", "chain_labels = np.asarray(pose_stack.pdb_info.chain_labels[0]).astype(str)\n", "residue_labels = np.asarray(pose_stack.pdb_info.residue_labels[0]).astype(str)\n", "insertion_codes = np.asarray(\n", " pose_stack.pdb_info.residue_insertion_codes[0]\n", ").astype(str)\n", "block_labels = np.asarray(\n", " [\n", " f\"{chain}:{residue}{insertion}\"\n", " for chain, residue, insertion in zip(\n", " chain_labels, residue_labels, insertion_codes\n", " )\n", " ]\n", ")\n", "\n", "fig, ax = plt.subplots(figsize=(7, 6))\n", "image = ax.imshow(matrix, cmap=\"coolwarm\", aspect=\"equal\")\n", "tick_step = max(1, len(block_labels) // 10)\n", "tick_positions = np.arange(0, len(block_labels), tick_step)\n", "ax.set_xticks(tick_positions, block_labels[tick_positions], rotation=90)\n", "ax.set_yticks(tick_positions, block_labels[tick_positions])\n", "ax.set(\n", " title=\"Directed beta2016 block-pair storage (all terms)\",\n", " xlabel=\"author chain:residue label\",\n", " ylabel=\"author chain:residue label\",\n", ")\n", "fig.colorbar(image, ax=ax, label=\"weighted beta2016 score units\")\n", "plt.tight_layout()\n", "plt.show()\n", "\n", "print(\"per-term block-pair shape:\", tuple(block_pair_by_term.shape))\n", "print(\"summed block-pair shape:\", tuple(block_pair_total.shape))\n", "print(\"matrix sum:\", matrix.sum(), \"whole-pose score:\", total[0].item())\n", "np.testing.assert_allclose(matrix.sum(), total[0].item(), rtol=1e-4, atol=1e-3)\n", "\n", "# Rank only direct nonbonded terms, combining both directed storage locations.\n", "nonbonded_score_types = [\n", " ScoreType.fa_ljatr,\n", " ScoreType.fa_ljrep,\n", " ScoreType.fa_lk,\n", " ScoreType.fa_elec,\n", " ScoreType.hbond,\n", "]\n", "nonbonded_term_indices = [score_types.index(term) for term in nonbonded_score_types]\n", "nonbonded_directed = (\n", " block_pair_by_term[nonbonded_term_indices, 0].detach().cpu().numpy()\n", ")\n", "nonbonded_two_orientation = nonbonded_directed + nonbonded_directed.transpose(0, 2, 1)\n", "nonbonded_pair_matrix = nonbonded_two_orientation.sum(axis=0)\n", "\n", "# Exclude directly covalently connected blocks using the pose's chemical graph.\n", "n_blocks = matrix.shape[0]\n", "covalently_connected = np.zeros((n_blocks, n_blocks), dtype=bool)\n", "connection_partners = (\n", " pose_stack.inter_residue_connections64[0, :, :, 0].detach().cpu().numpy()\n", ")\n", "for block_index, partners in enumerate(connection_partners):\n", " for partner in partners:\n", " if 0 <= partner < n_blocks:\n", " covalently_connected[block_index, partner] = True\n", " covalently_connected[partner, block_index] = True\n", "candidate_mask = np.triu(np.ones_like(covalently_connected), k=1)\n", "candidate_mask &= ~covalently_connected\n", "ranked_nonbonded = np.where(candidate_mask, nonbonded_pair_matrix, np.inf)\n", "pair_i, pair_j = np.unravel_index(\n", " np.argmin(ranked_nonbonded), ranked_nonbonded.shape\n", ")\n", "\n", "pair_term_breakdown = pd.DataFrame(\n", " {\n", " \"term\": [term.name for term in nonbonded_score_types],\n", " \"stored_i_to_j\": nonbonded_directed[:, pair_i, pair_j],\n", " \"stored_j_to_i\": nonbonded_directed[:, pair_j, pair_i],\n", " \"two_orientation_sum\": nonbonded_two_orientation[:, pair_i, pair_j],\n", " }\n", ")\n", "show_table(pair_term_breakdown)\n", "\n", "# Optional analytical profile: diagonal once, every all-term off-diagonal pair half each.\n", "all_term_two_orientation = matrix + matrix.T\n", "np.fill_diagonal(all_term_two_orientation, 0.0)\n", "equal_split_profile = np.diag(matrix) + 0.5 * all_term_two_orientation.sum(axis=1)\n", "np.testing.assert_allclose(equal_split_profile.sum(), matrix.sum(), atol=1e-3)\n", "equal_split_frame = pd.DataFrame(\n", " {\n", " \"block\": np.arange(n_blocks),\n", " \"pdb_label\": block_labels,\n", " \"equal_split_all_term_score_units\": equal_split_profile,\n", " }\n", ").sort_values(\"equal_split_all_term_score_units\")\n", "show_table(equal_split_frame)\n", "\n", "\n", "def deposited_mask_for_block(block_index):\n", " mask = (\n", " (protein_slice.chain_id.astype(str) == chain_labels[block_index])\n", " & (protein_slice.res_id.astype(str) == residue_labels[block_index])\n", " )\n", " insertion = insertion_codes[block_index]\n", " if insertion:\n", " mask &= protein_slice.ins_code.astype(str) == insertion\n", " return mask\n", "\n", "\n", "pair_masks = {\n", " f\"block {pair_i} / {block_labels[pair_i]}\": deposited_mask_for_block(pair_i),\n", " f\"block {pair_j} / {block_labels[pair_j]}\": deposited_mask_for_block(pair_j),\n", " \"selected nonbonded pair\": deposited_mask_for_block(pair_i)\n", " | deposited_mask_for_block(pair_j),\n", "}\n", "print(\n", " f\"Most favorable noncovalently connected pair by the five selected terms: \"\n", " f\"blocks {pair_i}, {pair_j} ({block_labels[pair_i]}, {block_labels[pair_j]}); \"\n", " f\"two-orientation weighted score \"\n", " f\"{nonbonded_pair_matrix[pair_i, pair_j]:.3f} score units\"\n", ")\n", "try:\n", " display(tmol.selection_gallery(protein_slice, pair_masks))\n", "except ImportError as exc:\n", " print(\"Interactive residue-pair gallery unavailable:\", exc)" ] }, { "cell_type": "markdown", "id": "af56cd81", "metadata": {}, "source": [ "**Expected observations.** Summing every stored all-term matrix entry reproduces the weighted whole-pose score within numerical tolerance. Diagonal entries include one-body/self contributions; an inter-block two-body contribution appears once in one of the two off-diagonal orientations. The selected pair is ranked only after adding both orientations of the five stated nonbonded terms and removing directly covalently connected candidates. Its table makes that focused term breakdown explicit.\n", "\n", "The equal-split profile also sums to the whole-pose score, but it is only one declared attribution rule: each off-diagonal all-term interaction contributes half to each partner while a diagonal contribution stays with its block. A naive row sum misses interactions stored in the opposite orientation, and neither profile is a cached per-residue energy table." ] }, { "cell_type": "markdown", "id": "d6e85127", "metadata": {}, "source": [ "## Ligand-fragment interactions in one connected complex\n", "\n", "The next workflow uses the checked-in `ace.tmol.nomin.cif` protein–small-molecule complex and its matching `ace.xtal-lig.mmff94.tmol` parameters. This is the same deterministic CIF-plus-parameters path exercised by TMol's ligand regression tests: no stochastic conformer generation is needed. Tutorial 07 covers ligand preparation; this section assumes the checked-in CIF and `.tmol` chemistry are already authoritative.\n", "\n", "Concrete API and input requirements:\n", "\n", "1. Load a Biotite `AtomArray` with bond information. The ligand atom/residue names must match a prepared ligand definition (here, residue `LG1` in the checked-in `.tmol` file).\n", "2. **Before pose construction**, add one integer `tmol_fragment_id` per atom. Use `0` outside fragmented residues and positive IDs for every atom of the ligand. At least two IDs must occur.\n", "3. Each fragment must be connected, contain at least three heavy atoms, and have at most four inter-fragment connections. No atom may participate in two cuts, no four-atom bonded path may cross two cuts, and cuts through hbond/lk-ball acceptor frame geometry are rejected.\n", "4. Build with `prepare_ligands=True`, the matching parameter file, and `return_context=True`. The annotation causes the connected ligand to become fragment block types with explicit inter-block connections.\n", "5. Construct `beta2016_score_function` from `context.parameter_database`, the same ligand-extended `ParameterDatabase` used for the pose. The default database does not contain the generated fragment scoring parameters.\n", "6. Supply `calculate_fragment_interactions` a boolean partner mask with shape `[n_poses, max_n_blocks]`, on the pose device, that excludes every ligand fragment block. Here it selects amino-acid polymer blocks only.\n", "\n", "The result is a **fragment–partner interaction score decomposition from one connected complex**. It is not a binding free energy or thermodynamic ddG: no separated state, solvent correction, reorganization, packing, or minimization is evaluated. Fragment–fragment energies remain separate in the block-pair tensor and are not attributed to either fragment." ] }, { "cell_type": "code", "execution_count": 6, "id": "0ef4de0d", "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", "
fragmentregionheavy atomsheavy-atom count
1amide/pyrrolidine coreC1, C5, C6, C7, C8, N2, O17
2central carboxylateC3, O2, O33
3pyrrolidine carboxylateC9, O4, O53
4central linker scaffoldC10, C11, C14, C15, C2, C4, N17
5terminal aminoethyl groupC12, C13, N33
6phenyl ringC16, C17, C18, C19, C20, C216
\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", "
cut bondfragment Afragment B
C1–C214
C3–C424
C5–C913
C11–C1245
C15–C1646
\n", "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "ligand_data_dir = repo_root / \"tmol/tests/data/protein_ligand_test\"\n", "complex_cif_path = ligand_data_dir / \"ace.tmol.nomin.cif\"\n", "ligand_params_path = ligand_data_dir / \"ace.xtal-lig.mmff94.tmol\"\n", "\n", "complex_array = load_structure(\n", " str(complex_cif_path), model=1, include_bonds=True\n", ")\n", "if isinstance(complex_array, struc.AtomArrayStack):\n", " complex_array = complex_array[0]\n", "\n", "ligand_name = \"LG1\"\n", "is_ligand = complex_array.res_name == ligand_name\n", "assert is_ligand.any(), f\"{ligand_name} was not found in {complex_cif_path.name}\"\n", "preparation = load_params_file(ligand_params_path)[0]\n", "restype = preparation.residue_type\n", "\n", "# Functional-group-sized cuts validated by the fragmented-ligand regression test.\n", "cut_bonds = (\n", " (\"C1\", \"C2\"), # amide/pyrrolidine arm from the central scaffold\n", " (\"C3\", \"C4\"), # central carboxylate from its substituted carbon\n", " (\"C5\", \"C9\"), # pyrrolidine carboxylate from the ring\n", " (\"C11\", \"C12\"), # terminal aminoethyl group from the alkyl linker\n", " (\"C15\", \"C16\"), # phenyl ring from the ethyl linker\n", ")\n", "\n", "\n", "def components_after_cuts(residue_type, cuts):\n", " \"\"\"Connected components of prepared ligand chemistry after conceptual cuts.\"\"\"\n", " removed = {frozenset(cut) for cut in cuts}\n", " adjacency = {atom.name: set() for atom in residue_type.atoms}\n", " for atom_a, atom_b, *_ in residue_type.bonds:\n", " if frozenset((atom_a, atom_b)) not in removed:\n", " adjacency[atom_a].add(atom_b)\n", " adjacency[atom_b].add(atom_a)\n", "\n", " components = []\n", " unseen = set(adjacency)\n", " while unseen:\n", " queue = deque([next(iter(unseen))])\n", " component = set()\n", " while queue:\n", " atom_name = queue.popleft()\n", " if atom_name in component:\n", " continue\n", " component.add(atom_name)\n", " queue.extend(adjacency[atom_name] - component)\n", " unseen -= component\n", " components.append(component)\n", "\n", " atom_order = {atom.name: index for index, atom in enumerate(residue_type.atoms)}\n", " components.sort(key=lambda component: min(atom_order[name] for name in component))\n", " return components\n", "\n", "\n", "components = components_after_cuts(restype, cut_bonds)\n", "fragment_for_atom = {\n", " atom_name: fragment_id\n", " for fragment_id, component in enumerate(components, start=1)\n", " for atom_name in component\n", "}\n", "fragment_region = {\n", " 1: \"amide/pyrrolidine core\",\n", " 2: \"central carboxylate\",\n", " 3: \"pyrrolidine carboxylate\",\n", " 4: \"central linker scaffold\",\n", " 5: \"terminal aminoethyl group\",\n", " 6: \"phenyl ring\",\n", "}\n", "assert set(fragment_region) == set(range(1, len(components) + 1))\n", "\n", "fragment_ids = np.zeros(complex_array.array_length(), dtype=np.int32)\n", "for atom_index in np.flatnonzero(is_ligand):\n", " atom_name = str(complex_array.atom_name[atom_index])\n", " fragment_ids[atom_index] = fragment_for_atom[atom_name]\n", "assert np.all(fragment_ids[is_ligand] > 0)\n", "\n", "annotated_complex = complex_array.copy()\n", "annotated_complex.set_annotation(FRAGMENT_ID_ANNOTATION, fragment_ids)\n", "\n", "atom_type_by_name = {atom.name: atom.atom_type for atom in restype.atoms}\n", "fragment_definition_frame = pd.DataFrame(\n", " [\n", " {\n", " \"fragment\": fragment_id,\n", " \"region\": fragment_region[fragment_id],\n", " \"heavy atoms\": \", \".join(\n", " name\n", " for name in sorted(component)\n", " if not atom_type_by_name[name].upper().startswith(\"H\")\n", " ),\n", " \"heavy-atom count\": sum(\n", " not atom_type_by_name[name].upper().startswith(\"H\")\n", " for name in component\n", " ),\n", " }\n", " for fragment_id, component in enumerate(components, start=1)\n", " ]\n", ")\n", "cut_frame = pd.DataFrame(\n", " [\n", " {\n", " \"cut bond\": f\"{atom_a}–{atom_b}\",\n", " \"fragment A\": fragment_for_atom[atom_a],\n", " \"fragment B\": fragment_for_atom[atom_b],\n", " }\n", " for atom_a, atom_b in cut_bonds\n", " ]\n", ")\n", "show_table(fragment_definition_frame)\n", "show_table(cut_frame)" ] }, { "cell_type": "markdown", "id": "2d719bf3", "metadata": {}, "source": [ "### What is being cut?\n", "\n", "The five selected single bonds separate recognizable functional-group-sized regions while leaving every fragment connected and above the three-heavy-atom minimum. Conceptually, the fragment graph is:\n", "\n", "```text\n", "F3 pyrrolidine carboxylate -- C9–C5 -- F1 amide/pyrrolidine -- C1–C2 -- F4 central scaffold -- C11–C12 -- F5 aminoethyl\n", " | |\n", " C3–C4 C15–C16\n", " | |\n", " F2 central carboxylate F6 phenyl ring\n", "```\n", "\n", "Thus the five fragment-graph edges are F3–F1, F1–F4, F2–F4, F4–F5, and F4–F6; in particular, the central carboxylate F2 attaches to the central scaffold F4, not to F1.\n", "\n", "The diagram depicts **conceptual partition boundaries**, not broken chemistry in the scored complex. TMol prepares `LG1` as one molecule, creates one fragment block per connected component, and installs paired connections across every listed bond. Bonded separation and bonded terms can therefore traverse those explicit inter-block links." ] }, { "cell_type": "code", "execution_count": 7, "id": "ccb92d36", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA94AAAHqCAYAAADyGZa5AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjExLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvctoD+AAAAAlwSFlzAAAPYQAAD2EBqD+naQAAZ/xJREFUeJzt3Xl8FPX9x/H37G7uOyEkkHAq9yFYEVBRVKqgqFDPYsUiHlTrUaulVqnan209sGrVeta71APrVbwvxIqKB3IKyp1AIAe5r83u9/dHTCQkhCRkMnu8no8Hj4fOzM58djK7M+/9fuc7ljHGCAAAAAAA2MLldAEAAAAAAIQygjcAAAAAADYieAMAAAAAYCOCNwAAAAAANiJ4AwAAAABgI4I3AAAAAAA2IngDAAAAAGAjgjcAAAAAADYieAMAAAAAYCOCN4AmqqqqdNlllykrK0uWZemMM85wuiSEgOrqalmWpVtuuaVLXxusHn30UVmWpc2bNzuy/TfffFOWZenDDz90ZPsIPxMnTtRRRx3ldBn7NWrUKE2ePNnpMpr5xS9+oezsbKfLANAKgjfgkOjoaE2dOnW/y9XW1uqhhx7Scccdp27duikqKkrZ2dk64ogjdMstt2jLli1Nlt+xY4fuvfdeTZgwQS6XS3379m1XXffcc48ee+wxvfHGGzLGaOHChe16fSgrLi6WZVm69dZbnS4lIHXl/gnkv8V9990ny7KUk5PjdClAh40bN04TJ050ugzbhcv7BOA8j9MFANi3Xbt26aSTTlJOTo5uvvlmPfnkk8rIyFBBQYHeeOMN3XLLLVq4cKGWL1/e+Jorr7xSGRkZ+stf/qKrrrpKhYWF7drm4sWLNXLkSI0cObKT3w3CWXR0tIwxXf7aYHXhhRfqwgsvdLoMAADQSQjeQAA7++yztWHDBn355Zfq379/4/SePXtq9uzZ+vnPf66//vWvTV7z/PPPN/63ZVnt3mZBQYHi4uI6XjQAAACAJuhqDgSoDz74QB9++KGuuuqqJqF7T7Gxsfq///u/Ttnehx9+KMuy9MUXX2jx4sWyLEuWZendd99VXl6eLMvS3XffrZdeekkjR45UZGSknn32WUlScnJy4/IRERHq27evrrzySpWWljbZRkFBgc4//3ylpqYqKSlJZ599toqKitStW7cmrXt7bm/hwoUaMmSI4uLidNxxx2njxo2SpBdeeEFDhw5VdHS0xowZo6+//rrZe/L5fPrb3/6mESNGKDo6WikpKTr99NP13XfftbitRYsWNS47dOhQvfLKK43LLV++XCkpKZKk6667rvH9/vKXv2x1v/p8Pt19990aNWqUYmNj1bNnT82cObPJLQLl5eW65ppr1LdvX0VGRiorK0uXXHKJCgoK2l1ne5dt637a33vZ3/7Z+z7t2tpapaentziGgN/vV+/evXXyySe3+NrWtlVbW6vMzExNmzat2Xrr6uqUnZ2tk046aZ9/r/0d6zk5OZo9e7Z69uypyMhI9evXT/PmzVNtba0k6ZprrtHll18uSerVq1eTz5Ek/fe//22cZlmW4uLiNGbMGD355JNN6mjpHu/58+fLsizl5eVp7ty56t69u+Li4jR16tQWu7Xvr9YGH3/8sY444gjFxMSod+/euuuuu/a5f/bW1vcjSdu2bdNFF12k3r17Nx6P8+fPb6yn4f1t375d11xzjTIzMxUREdFkn4waNUrR0dFKTk7WSSedpC+//LLJNpYsWaKf/vSn6tatmxITEzV27Fg9/fTTTXpMtGWZfXnzzTc1adIkJScnKzExUccdd1yz++DbUmfDfcIbN27UiSeeqLi4OPXo0UN//OMfW6yjLdt98803ddxxxykxMVExMTEaN26cFi1a1OJ2V69erYkTJyo2NlbZ2dn64x//KJ/P17hcZmamPvvssybngszMzMb5e39nNzjnnHOa3d50zjnnNK7D7XYrPT1d06dP15o1a1rb1a3a3/5oa337e5+t2d8+bNDZx4MxRrfeeqv69u2rmJgYjR8/XsuWLWuxxgM51gHYwABwRFRUlDn55JP3OX/u3LlGklm6dGmHt/GTn/zE9OnTp92vOeaYY5pM27Fjh5FkTjvtNDNr1iyzadMms3r1avPhhx82e31ZWZl5++23TZ8+fczpp5/eOL22ttaMHj3a9OrVy3zwwQemtLTUvPXWW+bMM880qampZvbs2c22N23aNHPZZZeZ3Nxcs3nzZjNmzBgzYsQI8+qrr5o5c+aYbdu2ma1bt5px48aZfv36Ga/X26SWM8880yQnJ5unnnrKFBUVmY0bN5rp06ebbt26mW3btjXZ1hlnnGEuvvhis3nzZrNz505zzjnnmIiICLNly5bG9e3evdtIMn/961/btC/9fr+ZPn26SUhIMA899JDZsWOH2blzp3nmmWfM3LlzjTHGeL1ec8QRR5j09HTz3//+15SUlJjFixebfv36mUGDBpnS0tJ219meZdu6n9ryXlrbP1VVVUaS+b//+7/GaVdddZWJiIgwu3btarLsG2+8YSSZF198cZ+vbW1b119/vXG73Wbr1q1Npi9cuNBIMgsXLtzn36y1Y33z5s0mIyPDjB8/3ixbtsyUl5eb9957z2RnZzc51u+9914jqXHf7Yvf7zc7duwwt956q3G5XOY///lP47xHHnnESDKbNm1qnHbHHXcYSWb27NnmqaeeMsXFxebzzz832dnZ5vjjj2+y7rbWumzZMhMVFWWmT59uNmzYYHbu3GnmzZtnpk2bZiSZDz74oNX30Nb3s3HjRpOenm5Gjx5tlixZYkpLS83atWvNtddea95+++0m72/GjBnm8ccfN0VFReahhx4yxhgzb94843K5zG233Wby8/PN+vXrzcknn2yio6PNZ599ZowxZuvWrSY2NtbMmTPH5ObmmoqKCvPFF1+Y888/36xZs6bNy+zLAw88YCzLMpdffrn57rvvTGlpqfnggw/MtGnTGpdpS53GGHPIIYeY8ePHm+nTp5svv/zSlJSUmPvuu89IMo8//ni7t/vII48Yy7LM3LlzzdatW01BQYG57bbbjMvlavwcNWx37NixZvLkyebLL780xcXF5oknnjDR0dHm4osvbrLdsWPHNjsXNEhLS2vynd3g7LPPbvWcU1NTY1asWGEmT55ssrKyTFFRUeO8Y445xhx55JH7fG179kd76mvtfbakPfvQjuPhd7/7nYmIiDD333+/KSoqMqtWrTKTJ082xx57rMnKympc7kCOdQD2IHgDDtlf8P75z39uJJmcnJwOb6Ozg/dBBx1kfD5fm9bzxBNPGEmmoKDAGGPM008/bSSZRYsWNVnu2WefbQwTe29vxIgRxu/3N05//fXXjSRz+OGHN5n+1ltvGUnmrbfeapy2aNGiFi9aKioqTEZGhrnsssuabGvYsGFN1rlr1y7jdrvNzTff3DitvcH75ZdfNpLMww8/vM9lFixYYCSZBQsWNJm+ZMmSJttqT53tWbat+6kt76W9wXvVqlVGkrnzzjubLHvGGWeY9PR0U1tbu8/XtratrVu3GrfbbW644YYm048//vgm621Ja8f6z3/+c5OcnGzy8/ObTG/YNw0/krU1eO9p0qRJZvLkyY3/31rw/stf/tLktffcc4+RZDZs2NDuWqdMmWIyMjJMVVVVk+UmT57c7uDd2vs544wzTHx8vNm5c+c+X9Pw/ubNm9dkel5enomIiDAzZ85sMr2iosJ079698fuq4YeV1atX73MbbVmmJYWFhSYuLs787Gc/2+cyba3TmPqg5fF4mvzNjDFmzJgxZvz48e3abnFxsUlISDBnn312s3lnnHGGOeigg5ps1+VymXXr1jVZ7oYbbjCWZTWZbkfwbpCXl2ckmWeeeaZxWluCd1v2R3vr60jwbss+tON4aFhnw/dyg9zcXBMVFdUkeHf0WAdgH7qaAwHK7KMr2Lvvvtuka6dlWfr++++7pKapU6fK5Wr+tbF48WJNmTJF3bp1k9vtbtLFuKG2Dz74QBEREc0ew3LKKafsc3uTJ09ucp/64MGDJUlHHnlkk+lDhgyRpMZu6JL02muvyeVy6Wc/+1mTdcbGxmr8+PFavHhxk+knnXRSk3Wmp6ere/fuTdbZXq+//rokacaMGftc5r333pNlWZo+fXqT6UcddZQyMjL03nvvdbjOtizb1v3UlvfSXsOGDdPYsWP12GOPNU4rLCzUq6++qpkzZzbpZtwevXr10imnnKJHH31UXq9XkrR+/Xq9//77Ou+889q03paO9ddee00TJ05Ut27dmkw//vjjJanZMdUSn8+n+fPna/To0YqLi2vSFb2tn+OGLvgNhg8fLqn58b+/Wo0x+uCDD3TCCScoOjq6yXItddU/kPfzxhtvaNKkSerevft+13nqqac2+f8lS5bI6/W2eIxOmTJFH3/8sWpqajRs2DC53W7NmTNHr7/+usrLy5utuy3LtGTx4sWqqKho9fhva50NhgwZ0uw2ouHDhzf5O7Zlux9++KHKysp05plnNps3adIkbdiwQbm5uY3TBg0apIEDBzZZbtq0aY3HQ2fbtm2bZs+erd69eysyMrJJd+72nrvasj+6Qlv2oR3Hw0cffSSv19vsM9KzZ0+NGTOmybSOHusA7EPwBgJUnz59JNVftOxp0qRJMvW9VXT99dd3aU1ZWVnNpn3xxReaNGmSunXrpo8//liVlZVNHkPWEHwKCwuVlpbWLMzExsYqPj6+xe316NGjyf8nJCS0Or24uLhxWl5envx+v1JTU+XxeOR2u+VyueRyufTyyy83G+1973VKUmJiYpN1tteuXbuUlJTU6mB1hYWFSkpKahZ8pPr7D/e8z7u9dbZl2bbup7a8l4648MILtXr1an322WeSpKefflq1tbW64IILDmi9l156qfLy8vTSSy9Jkh544AEZYzR79uw2vX7vY72iokLl5eV65ZVXGvdTw75qOP7a8gSBuXPn6g9/+IMuv/xybdy4UXV1dTLGaNq0aY2flf3Z+++amJgo6cfjv621VlRUqLq6WhkZGc220dK0jr6fiooKVVRUtPj90ZK9l2vYry3de5uZmSmfz6fi4mINHjxYr7zyirxer0455RQlJyfriCOO0BNPPNG4fFuWacmuXbtarK0jdTZoy+ezLdvNy8uTVD8Y596f4Tlz5jSpTWr5b9swbe/vm/ba+wfjqqoqHX300Vq2bJn+/e9/q7CwUH6/vzEEtvWYb9CW/dGe+jqqLfvQjuOhYZ1t+cx29FgHYB+CNxCgTjzxREnSW2+95XAlP2qppXDBggWS6geQGTx4sKKioiRJmzZtarJcWlpa40XXniorK/f5S/y+RmVvy2jtDc88r6ysVF1dnXw+n/x+v/x+v4wx2r59e7vX2V7p6ekqKSlRRUXFPpdJTU1VSUmJqqurm83buXNnsxbL9tTZmfupLe+lI8455xzFx8c3tno/9thjGj9+vIYOHXpA6500aZIGDhyof/zjH6qqqtKTTz6pcePGtXm9ex/rsbGxiomJ0bnnntu4nxr2VcMPYbfffvt+1/vUU0/pjDPO0AUXXKCMjAy53W5JzT8vrdnf37WttcbFxSk6Olo7d+5sto6WpnX0/cTGxio2NrZJq2tr9t73qamp+6xp586dcrvdSk5OllTfG2Dp0qUqKirSa6+9ph49emjWrFl69NFHG1/TlmX2lp6eLkmtvof21Cm17fPZlu02fEcsWrSoxc+wMabJ4yFb+3unpaXttyZJSkpKUllZWbPpe9e5ZMkSbd68WbfeequOPPJIJSQkyLKsdh3ve2rL/mhPfR3Vln1ox/HQsO62fmY7cqwDsA/BGwhQxx57rI4++mjdc889TUbADkQNrSwNjDF65plnmixz7LHHyuv16u23324yfe9RdzvLKaecopqaGr388sudts7Y2FhZltWke2Brpk6dKunHHydacvzxx8sY02y08U8++UR5eXmNXYPt0tb91Jb30t79I0nx8fE666yz9Oyzz+rDDz/UypUr29Qqvb9tWZalX/3qV1q8eLFuuOEG7d69u82t3fta39SpU/XOO+9o9+7drS7b0CtgX7U1/DjVYMWKFVqxYkWHa9tbW2u1LEsTJ07UO++806zWlka/35f9vR/LsnTyySfrvffea2yxbI8JEyYoIiKisfdCg6qqKr3xxhs66qijmtWQlJSkKVOm6IUXXlBMTIw++uijZuttyzINjj32WMXFxbV6/Hekzv1py3YblnnuuefatM5169Y1e2JBw9/7uOOOa5wWFxe3z2P4oIMO0qpVq5pM27Fjh7766qsWl9/7fT/11FNtqnVvbdkf7a2vtfe5L23Zh3YcDxMmTJDH49Frr73WZPqOHTv2ObK51L5jHYB9CN5AAHvuuefUp08fjR8/Xg8//LBycnLk9XqVn5+vd955p/H+Xztaa9vqlFNOUXV1tX73u9+puLhYmzZt0vnnn68BAwY0We6ss87S6NGjNWfOHC1evFhlZWV655139OKLLza2DHSmU089VWeddZbmzJmjRx99VDt27FB5ebmWL1+uefPmdegxbJGRkRowYIAWL1683/Al1e+b6dOn67e//a0eeeQR7dy5U7t27dKCBQv0+9//XpJ05plnauzYsbriiiv0+uuvq6ysTB9//LHOO+88HXzwwbr00kvbXWd7tHU/teW9tHf/NJg9e7ZKS0s1c+ZMxcfH6+yzz97va9qyrV/+8peKjY3V3/72N8XFxbVpva25/fbb5XK5dPLJJ2vJkiUqKyvTzp079e677+r0009vfKRdwz3XixYtavborlNPPVXPP/+83nrrLVVUVGjJkiW6+OKLdcwxxxxQbR2t9eabb1ZRUZF+8YtfaPPmzcrPz9fNN9/c5kDQ1vdz2223KTo6uvHe1vLycq1bt06/+93v9M4777S6jczMTF177bV6+umndeedd6qwsFDff/+9zj77bBUXF+vWW2+VVN/r5vLLL9fnn3+u0tJSlZSU6MEHH1RVVZWOPfbYNi/TkpSUFM2fP18vvfSSrrjiCm3YsEFlZWVavHhx4/gMba2zPdqy3dTUVN1999168skn9dvf/lbff/+9qqur9d133+nRRx9tdo/xmDFjdOWVV2r58uUqLS3VM888o/nz52v27NlN7lsePny41qxZo++++65ZF+2LLrpIa9as0Z133qnS0lKtXLlSl156qcaPH99kubFjx6p79+666aabtHHjRhUWFuree+9t8fF3nbU/2lPf/t7nvrRlH9pxPGRmZuqqq67Sww8/rAcffFC7d+/WmjVrdOGFF+qII45osmxHj3UANuq6cdwA7CkqKspIavHfno8Gqq6uNvfff7855phjTGpqqomIiDCZmZnm0EMPNZdffrn59NNPm6y34TFkLf1raZTXvbU2qvldd93V4muefPJJM3jwYBMdHW0GDhxoHn74YfPaa68ZSWbJkiWNy+Xn55vzzjvPJCcnm4SEBHPWWWeZgoICk5CQYC699NL9bi8/P99IMnfccUeT6fsa4drn85kHHnjAjBkzxsTFxZmEhARz6KGHmr/85S+msLBwv+9t0KBB5rTTTmsy7cMPPzSjRo0ykZGRRpI5//zzW9wnDerq6swdd9xhhg0bZqKiokzPnj3NzJkzmzzSq7S01PzmN78xvXv3Nh6Px2RmZpoLL7ywyQjQ7amzve+pLfupre9lX/unpZHJ9zR06FAjyVxwwQXN5u3rtW35W1x00UVGkpk1a1aL293b/o71HTt2mMsuu8z07dvXREREmJ49e5rJkyebl156qcko6H/84x9Nz549jcvlMpLMO++8Y4yp/1tfcsklJiMjw8TFxZnjjjvOrFixotloy62Nar73SOXLli0zkswLL7zQoVo//PBDM3bsWBMVFWWys7PNHXfc0fhIt/2Nat7W92OMMVu2bDGzZs0yPXr0MFFRUWbYsGFm/vz5pqamptX31+DBBx80I0eONJGRkSYxMdFMnjzZfP75543zy8vLzf3332/GjRtnEhMTTUpKihk/frx5+umn27VMaxYtWmQmTpxo4uPjTVJSkjnuuOOaPVZxf3UaUz+K9Yknnths/VdeeaWJiorq0Hbff/99c9JJJ5nU1FQTFRVlBg0aZC655BKzdu3aZttdsWKFmTBhgomOjjY9e/Y0119/fbPHMebl5ZnJkyebhIQEI8lkZGQ0mf/nP//Z9OzZ00RHR5ujjz7arFq1qsW/+xdffGGOPvpoExcXZ7p3724uv/xyU1ZWZiSZ66+/vnG5tj5OrK37o6317e997q09+9CYzj8efD6f+fOf/2x69+5toqKizOGHH26WLl1qzj333Cajmh/osQ6g81nGdNJIEwDQASUlJUpOTtaf/vQnzZs3z+lyEGKuueYa3Xnnnfr444915JFHOl0O4KhRo0YpMzNTb775ptOlAEDYoas5AEe9+OKLktTpXW0BY4yef/55DRkyhNANAAAc5XG6AADh4/bbb1ePHj00adIkRUVF6e2339a1116rSZMm6eijj3a6PIQQn8+nBx54QNu2bWs20B8AAEBXo8UbQJeZMWOG3n//fY0fP16ZmZn6/e9/r1mzZnXqyOPAf//7X3k8Ht144436/e9/r3PPPdfpkgAAQJjjHm8AAAAAAGxEizcAAAAAADYieAMAAAAAYCOCNwAAAAAANiJ4AwAAAABgI4I3AAAAAAA2IngDAAAAAGAjgjcAAAAAADbyOF0AAABAsCioKtC3Rd9qd/Vu1fhqVOOrkc/vU5Q7SlGeKMV4YtQ/qb/6J/WX2+V2ulwAQIAgeAMAALSgsKpQqwtXa03hGq0uWK2VBStVWF3YZBlLlizLkt/4m0yPdEVqUOogjeg2QkPThmpY2jD1S+pHGAeAMGUZY4zTRQAAAAQCr8+rd7e+qwVrF2h5/nJJkttyyxgjv/ytv7gFHsujOlMnSUqKTNJZg87SmQPPVI/4Hp1ZNgAgwBG8AQBA2NtRvkMvrH9Bz697XiW1JXJZrmat2J3BZblkjNHEXhN1zuBzNK7HOLkshtwBgFBH8AYAAGFrdeFqPbj8QS3OWdxil3G7uC23fManrPgszRw6U2cNOkseF3cAAkCoIngDAICwU+ur1QPfPKDHVj4my7LkMz5H6rBkychoaNpQ/fWov6p/cn9H6gAA2IvgDQAAwsqqglX6/ZLfa2vpVhkFxmWQ23LLsiz9etSvdf6w82n9BoAQQ/AGAABhYc9Wblnqsm7l7UXrNwCEHoI3AAAIedvLt2vOu3O0uWRzwLRy70tD6/e8cfP0swE/c7ocAEAnIHgDAICQtrFko2a/NVu7q3c7di93R139k6s1a/gsp8sAABwggjcAAAhZ3xZ9q9lvzVaFtyLoQneDi0ZcpMtHXy7LspwuBQDQQTw4EgAAhKSGlu5yb3nQhm5JemTlI3p4xcNOlwEAOAAEbwAAEHJyy3N1wZsXqMJbEbCDqLXHfcvv04K1C5wuAwDQQXQ1BwAAIaW6rlpnvHqGcspzgrqluyX/OP4fmpA9wekyAADtRIs3AAAIKfd9fZ+2lm0NudDtkks3/O8GldaWOl0KAKCdCN4AACBkLN+1XE+teSrgHxnWEX75VVxTrNs/v93pUgAA7UTwBgAAIaG6rlrXLbkupEf/9hu/Xtnwij7K+cjpUgAA7UDwBgAAIeG+r+9TbnluSAym1hpLlub9bx5dzgEgiBC8AQBA0AvlLuZ7MzIqrinWbZ/f5nQpAIA2IngDAICgd//y+0O6i/ne/MavVze8qq2lW50uBQDQBgRvAAAQ1LaUbtGnOz4N+S7me3Nbbj2/7nmnywAAtAHBGwAABLXn1z0vt+V2uowu5zM+Lfxuoarrqp0uBQCwHwRvAAAQtKrqqvTidy+G3DO726rCW6E3N7/pdBkAgP0geAMAgKD15qY3VeGtcLoMx1iytGDtAqfLAADsB8EbAAAErQVrF8gVxpczRkZri9ZqVcEqp0sBALQifM9UAAAgqG0r26Zvd38rv8JrULW9uS233tr8ltNlAABaQfAGAABBaXXhaqdLCAg+49OK/BVOlwEAaIXH6QIAAAA6Yk3hGnksj+pMXaev21vsVdlXZa0uEzc4TlE9o5pMqyurU9WmKtUV18kd51Zk90hF94ru9Pr2trZorfzGL5dFmwoABCKCNwAACEqrClbZErolqXZXrbY/tb3VZXrO6tkYvKs2V2nnwp0qX1OuvXu+x/SPUc+ZPRXTN8aWWqX60d23lW1Tn8Q+tm0DANBxBG8AABB0jDFaU7imazbmllImpDSbvGdrd+X3lSpfVS7LbSluZJxc0S6VryiXv9qvqo1V2jx/swbeNlDuOPueN76mcA3BGwACFMEbAAAEnZzynC57jJjL41LWL7P2u1zsgFhlX5StyO6RkqTq3GptuHGDTJ2Rr9yn0uWlSjmyeYDvDB7LozWFazSl3xRb1g8AODAEbwAAEHS6rLW7jeIGxyllYopcnh/vsY7OilZ072hVbaySJPkr7Rt9vc7UaWXBStvWDwA4MARvAAAQdIqqi2TJkpGxfVvGZ1T0flGz6clHJzcG7ejs5gOoGWNUV/zjPejRfe0dZK2gqsDW9QMAOo7gDQAAgk5NXY1clks+47N9W6bOtDjQWtLYpFavpArfLpS3yCtJih8Rr7gBcXaVKEmqrqu2df0AgI4jeAMAgKBT46uRJatrNraPwdWsiJa3b4xRwaIC7XxxpyQppl+Mev2ql60lSlKtr9b2bQAAOobgDQAAgk5XtHQ3aOvgapLkq/Qp55EclX1d/wzw+OHx6nVZL7lj7BvNvHHbXbhPAADtQ/AGAABBJ9Id2SX3d7dH1dYqbbtvm2p31UqWlD41Xd2nd5fl6pqW+Uh3ZJdsBwDQfgRvAAAQdKLcUQEVvMvXlGvL3VtkautrShiVoIiUCO3+cHfjMtG9oxV7cKxtNUS5o/a/EADAEQRvAAAQdGI8MfIb+x7P1V7VW6obQ7cklX1d1tjdvEHa5DRbg3e0x95R0wEAHUfwBgAAQadvYl9b1+9J9ihlYv2Aaq4I136Wrm/Nblh+X2IPsi90uyyXBiQPsG39AIADQ/AGAABBZ0jaEFuf4x3VParNA6pJUvyweMUPi7ellrYaljbM0e0DAPZt/z/hAgAABJi4iDhlJ2Q7XUbA8Bu/hnUjeANAoCJ4AwCAoDQyfaTclv2P6QoWg1MHO10CAGAfCN4AACAoDU0dKmMCZ2RzJ/WM66mEyASnywAA7APBGwAABKWhaUPlV+CMbO4Ul+XSyPSRTpcBAGgFwRsAAASloWlDFemKdLoMxxljdFjGYU6XAQBoBcEbAAAEpdiIWJ1y0Clhf593hCtCJ/U/yekyAACtIHgDAICgdc7gc+QzPqfLcIzbcuvUg0/l/m4ACHAEbwAAELQGpw7W8G7D5bLC85LGZ3w6e9DZTpcBANiP8DxLAQCAkDFj8Az5TfgNsuayXBrRbQSPEQOAIEDwBgAAQe2EvieEZVdrv/FrxpAZTpcBAGgDgjcAAAhqUe4onTPonLDqbm7JUkp0ik7oc4LTpQAA2iB8zlAAACBkXTjiQmXGZoZN+DYyumn8TYp08zg1AAgG4XF2AgAAIS02IlZ/PurPYXGvt8ty6aR+J+m43sc5XQoAoI0I3gAAICQclnmYzh1yrlwhfHljyVJiZKL+MPYPTpcCAGiH0D0zAQCAsHPF6CuUGRe6Xc6NjG4+4mYlRSU5XQoAoB1C86wEAADCUih3OaeLOQAEL4I3AAAIKYdlHqZLD7nU6TI6ldtyKzs+my7mABCkCN4AACDkzDlkjmYMDo1nXLstt9Ji0vTPE/9JF3MACFIEbwAAEHIsy9Lcw+dqav+pTpdyQNyWWwmRCXrsxMeUGZfpdDkAgA4ieAMAgJDksly65chbdPqA050upUPcllup0al65qRn1Cexj9PlAAAOgGWMMU4XAQAAYBdjjO768i49vvpxp0tpM7flVs/4nrR0A0CIIHgDAICQZ4zRy9+/rL9+/lfV+mrlMz6nS2qRJUtGRif0OUE3jLtBKdEpTpcEAOgEBG8AABA28iryNO9/8/Tpjk+dLqUZt+VWXEScbhx/o07oe4LT5QAAOhHBGwAAhBVjjF76/iXd+vmtAdH6vWcr9/XjrldqdKqj9QAAOh/BGwAAhKU9W7/dlrvLA3hD4E6MTKSVGwBCHMEbAACELWOMVhSs0LPfPqs3N70pn/HJyN5Lo4aQPyB5gH4x9Bea3HeyYiNibd0mAMBZBG8AAABJRdVFevn7l7Vg7QLtrNzZqa3glixJktvl1pS+U3TO4HM0otsIWZbVKesHAAQ2gjcAAMAefH6f/rf9f3pnyztakb9Cm0s3y2/8smTJZbn2G8b3Xi4lKkXDuw3X4ZmH67SDT2OkcgAIQwRvAACAVlTXVWvd7nVaU7hGawrXaGX+ShVVF6nWX6vyqnLJkuSTkhOSFeOO0YCUARrebbiGpg3V0LSh6h7b3em3AABwGMEbAACgg7Kzs5Wbm6usrCzl5OQ4XQ4AIEC5nC4AAAAAAIBQRvAGAAAAAMBGBG8AAAAAAGxE8AYAAAAAwEYEbwAAAAAAbETwBgAAAADARgRvAAAAAABsRPAGAAAAAMBGBG8AAAAAAGxE8AYAAAAAwEYEbwAAAAAAbETwBgAAAADARgRvAAAAAABsRPAGAAAAAMBGBG8AAAAAAGxE8AYAAAAAwEYEbwAAAAAAbETwBgAAAADARgRvAAAAAABsRPAGAAAAAMBGBG8AAAAAAGxE8AYAAAAAwEYEbwAAAAAAbETwBgAAAADARgRvAAAAAABsRPAGAAAAAMBGBG8AAAAAAGxE8AYAAAAAwEYEbwAAAAAAbETwBgAAAADARgRvAAAAAABsRPAGAAAAAMBGljHGOF0EAABAMKqrq5MxRpZlyePxOF0OACBAEbwBAAAAALARXc0BAAAAALARwRsAAAAAABsRvAEAAAAAsBGjgAAAAHRAdXW1HnnkEb399tsqLCxURkaGTjnlFM2cOZOB1gAATdDiDQAA0E5lZWU66qijNG/ePLndbo0ePVp1dXW67LLLNGXKFHm9XqdLBAAEEH6OBQAAaKebbrpJlmVp3bp1ysjIaJy+adMmTZo0Sffcc4+uueYaBysEAAQSHicGAADQTtnZ2XrhhRc0fvz4ZvNefPFF3XrrrVq2bJkDlQEAAhHBGwAAoB28Xq9iYmJUUVGhqKioZvNzcnI0atQoFRQUOFAdACAQcY83AABAO0RERCghIWGf93FXV1crLS2ti6sCAAQygjcAAEA7HX744fr8889bnPfZZ59p7NixXVwRACCQEbwBAADa6cYbb9SCBQtanLdw4UJdf/31XVwRACCQcY83AAAAAAA2osUbAACgnXJycnTfffe1OO/jjz8W7RoAgD0RvAEAANrpuuuuU3Z2dovz/vWvf+lf//pXF1cEAAhkdDUHAABoB2OMUlNTlZOTo7i4OFVWVmrEiBHasGGDJOmLL77Q5ZdfrqVLlzpcKQAgUNDiDQAA0A7GGFVWVio6OlqSVFlZqW3btjV2L+/du7c2btzoZIkAgABD8AYAAGgHl8ul3r1763//+58k6ZNPPpEkvfvuu5Kk1157Tf3793esPgBA4PE4XQAAAECwufDCC3XmmWfqhBNO0Ouvv657771XP/vZz5SVlaUNGzbo2WefdbpEAEAA4R5vAACAdjLG6L777tMnn3yiqVOn6txzz9U333yjDz74QGPHjtX48eOdLhEAEEAI3gAAAAAA2Ih7vAEAADqosrJSgwYNcroMAECAI3gDAAB0kN/vV25urtNlAAACHMEbAAAAAAAbEbwBAAAAALARwRsAAAAAABsRvAEAADooJiZGzzzzjNNlAAACHI8TAwAAAADARh6nCwAAAAhG1dXVeuSRR/T222+rsLBQGRkZOuWUUzRz5kx5PFxiAQB+RFdzAACAdiorK9NRRx2lefPmye12a/To0aqrq9Nll12mKVOmyOv1Ol0iACCA8HMsAABAO910002yLEvr1q1TRkZG4/RNmzZp0qRJuueee3TNNdc4WCEAIJBwjzcAAEA7ZWdn64UXXtD48eObzXvxxRd16623atmyZQ5UBgAIRARvAACAdvB6vYqJiVFFRYWioqKazc/JydGoUaNUUFDgQHUAgEDEPd4AAADtEBERoYSEhH3ex11dXa20tLQurgoAEMgI3gAAAO10+OGH6/PPP29x3meffaaxY8d2cUUAgEBG8AYAAGinG2+8UQsWLGhx3sKFC3X99dd3cUUAgEDGPd4AAAAAANiIFm8AAIAOqKysVHZ2ts4991wVFRU5XQ4AIIARvAEAADrA7/dr9+7dGjBggEaPHq3//ve/TpcEAAhQdDUHAADogPLycmVmZqq8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J0V7ur53i/FyTrfTt99+q9zc3P1eFwTb9hctWqQjjjiiU9eJ5nz+rvux8JVXSvXKK017+h5xRKz+9H8t3++/e3f9d0dlhdGqVdVatapaa9ZU66rfpNtWo2VZ8vu65nahQBFewbvWL8sK2AbvJlZtWaqXPn1Iv5j4O7ld9g16UVfLxfi+NNxHnZGR0epyDz744wA6mzZt0llnnaXZs2frpZdeUmVlZeO92g0iIiKUlpbWpvUPGDBAhx56qK644grNnz9fFRUVuvnmmyU1DeP4kTGmS4N3sKjmgnyfdu/erSFDhhzQOvLz8+XzNd3HKSkpioqKavf6169fr/POO0+33367evfuwnuEg0x98LYUCCOm+vw+XfbqzfIZn26f8jv1S8l2pA7DD2y2aut1wYGorq5WcXFxk2lut1vp6em2bP/mm2/WN998o88//7zT1omW+X3VTpfQRFS0penTE3XssfHq0zdSVVV+vbiwRC+8UD9A7X//W6appyTq4IPt+hHRkt8fWPvEbmEVvH1deDEeF52o285/qU3LnnHkZTrjyMtUWVOu9blf699L/qaK6lIt++5dHZQ5QkcNbflRJZ1hx/Y8ZWc7c4EQSK655hpdeumljS3MkhoHJNmyZYuGDx/epvX069dPf/rTnzRt2jR5vV4999xzuu6665osM2rUKL355pttWr/L5dJrr72m6667Tqeffrri4+N1+eWX64ILLmjxxHv11Vfr+eefb1OtIctyyXPuA122uZTjLlLimNO6bHsdddVvr9WV3y9xugzH5eTkNJvWo0cPbdmy5YDWe/zxx2vXrl1Npj3xxBOaPHlyu9a/Zs0aTZo0Sb/5zW901VVXtbhMfn6+Ro8efUD1hoILR56u84dNU4Tb/kuZ2IgYrbv6rX3O9/rrtLO8fpCgX71yo371yo3Nlpm/5J+av+Sfev7n92h8b3v+fsWFu3U45/ROccEFF+jGG29sMuL3nuftfv362bLdt956q9n91r169dKyZcs6ffs33XSTHnvsMX344YfKymr+yMm6ujrddttteuCBrjunhrJ7/h6p5OSuG1xtf4OjTZwYr4kTf7wFLS7OpUvmpGnZskpt3lw/GPXqVdU2B29avEOWq4tGOe6o2Kh4jeo/Qau3fqql696UJG3NX2/rNr11tcrNzbV1G8GgrKz5IHOHHnqoevXqpYcfflh/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AAC0g9vtVrdu3fTVV181Tvvkk0+UlZXlYFUAgEDGPd4AAADtNGPGDJ1zzjm64YYbVFNToxtvvFG/+c1vnC4LABCgCN4AAADt1HAP97XXXiuPx6Pzzz+/MXjHxMRo4cKFDlcIAAgk3OMNAAAAAICNuMcbAACgg2pra/WXv/zF6TIAAAGOFm8AAIAOYgRzAEBb0OINAAAAAICNCN4AAAAAANiI4A0AAAAAgI0I3gAAAB3k8Xj005/+1OkyAAABjsHVAAAAAACwkcfpAgAAAIJVUVGRlixZosLCQmVkZOjoo49WQkKC02UBAAIMwRsAAKAD7rrrLl1//fWqqqpSZGSkamtrlZSUpL///e+aOXOm0+UBAAII93gDAAC008KFC/XHP/5Rt99+u/Lz81VTU6O8vDxdc801uvjii7VkyRKnSwQABBDu8QYAAGinww8/XLNmzdKvfvWrZvPmzZunFStW6JVXXnGgMgBAICJ4AwAAtIMxRhEREdq5c6fS0tKazV+5cqWmTJminJwcB6oDAAQiupoDAAC0g9/vV0REhJKTk1ucn56eLr/f37VFAQACGsEbAACgHdxut/r27auNGze2OH/9+vUaNGhQF1cFAAhkBG8AAIB2mjNnjh588MEW5z344IOaM2dOF1cEAAhk3OMNAADQTrW1tfrmm280ZsyYZvOWLl2qcePGybIsByoDAAQigjcAAAAAADaiqzkAAEA71NbW6sYbb9zn/Orqak2fPr0LKwIABDpavAEAANqhvLxcmZmZKi8v79B8AED48ThdAAAAQLDxer26++67W5xXW1vbtcUAAAIeLd4AAADtUF5ersTERA0cOHCfy8TFxenLL7/swqoAAIGM4A0AANAOdCUHALQXg6sBAAC0g2VZSk5OdroMAEAQocUbAAAAAAAbMbgaAABAB9XU1Oj7779XeXm5unfvrn79+jldEgAgANHVHAAAoJ2qq6t12WWXKTU1VcOHD9e4cePUv39/HXzwwXr11VedLg8AEGBo8QYAAGinSy+9VCtXrtQjjzwir9er+fPna86cOaqqqtL555+vZ599VieeeKLTZQIAAgT3eAMAALSDMUZxcXHasGGDevToIUn6+uuvNXPmTK1cuVJPPvmkHn30US1ZssThSgEAgYKu5gAAAO3g9/slSampqY3T0tPTVVhYKEk64YQT9O233zpSGwAg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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fragment_graph = nx.Graph()\n", "fragment_graph.add_nodes_from(fragment_region)\n", "for atom_a, atom_b in cut_bonds:\n", " fragment_graph.add_edge(\n", " fragment_for_atom[atom_a],\n", " fragment_for_atom[atom_b],\n", " bond=f\"{atom_a}–{atom_b}\",\n", " )\n", "fragment_positions = {\n", " 3: (-2.0, 0.0),\n", " 1: (-1.0, 0.0),\n", " 4: (0.0, 0.0),\n", " 5: (1.2, 0.0),\n", " 2: (0.0, 1.0),\n", " 6: (0.0, -1.0),\n", "}\n", "fragment_colors = plt.cm.tab10(np.linspace(0, 1, len(fragment_region)))\n", "fig, ax = plt.subplots(figsize=(10, 5))\n", "nx.draw_networkx_nodes(\n", " fragment_graph,\n", " fragment_positions,\n", " node_color=fragment_colors,\n", " node_size=2400,\n", " ax=ax,\n", ")\n", "nx.draw_networkx_edges(fragment_graph, fragment_positions, width=2, ax=ax)\n", "nx.draw_networkx_labels(\n", " fragment_graph,\n", " fragment_positions,\n", " labels={fragment_id: f\"F{fragment_id}\" for fragment_id in fragment_region},\n", " font_weight=\"bold\",\n", " ax=ax,\n", ")\n", "nx.draw_networkx_edge_labels(\n", " fragment_graph,\n", " fragment_positions,\n", " edge_labels=nx.get_edge_attributes(fragment_graph, \"bond\"),\n", " font_size=9,\n", " ax=ax,\n", ")\n", "ax.set_title(\"LG1 fragment connectivity retained across conceptual cut bonds\")\n", "ax.axis(\"off\")\n", "plt.tight_layout()\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "c5925b1e", "metadata": {}, "source": [ "### Build the connected fragment-block pose\n", "\n", "`tmol_fragment_id` is already present on `annotated_complex` before this call. `pose_stack_from_biotite` first prepares the complete ligand from the checked-in definition, then expands it into `LG1.1` through `LG1.6` blocks and attaches an explicit pair of connections for each conceptual cut.\n", "\n", "The fixture contains deposited, already prepared hydrogens matching the frozen parameter file, so this deterministic path uses `no_optH=True` and disables proton-chi sampling, as in the regression test. For generated or incompletely hydrogenated inputs, use an appropriately validated hydrogen-preparation/optimization protocol instead." ] }, { "cell_type": "code", "execution_count": 8, "id": "684f242c", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "fragment blocks=6; protein partner blocks=574; annotated cut bonds=5\n" ] } ], "source": [ "fragment_pose, fragment_context = pose_stack_from_biotite(\n", " annotated_complex,\n", " device,\n", " param_db=ParameterDatabase.get_default(),\n", " prepare_ligands=True,\n", " ligand_params_files=[str(ligand_params_path)],\n", " no_optH=True,\n", " sample_proton_chi=False,\n", " return_context=True,\n", ")\n", "fragment_mapping = fragment_pose.split_block_mapping\n", "fragment_entries = sorted(\n", " (entry for entry in fragment_mapping.entries if entry.pose_ind == 0),\n", " key=lambda entry: entry.block_ind,\n", ")\n", "assert len(fragment_entries) == len(fragment_region)\n", "fragment_id_by_block = {\n", " entry.block_ind: fragment_id\n", " for fragment_id, entry in enumerate(fragment_entries, start=1)\n", "}\n", "\n", "fragment_block_mask = torch.zeros_like(\n", " fragment_pose.block_type_ind, dtype=torch.bool\n", ")\n", "for entry in fragment_mapping.entries:\n", " fragment_block_mask[entry.pose_ind, entry.block_ind] = True\n", "\n", "# Select protein polymer blocks explicitly; do not use the complement blindly.\n", "protein_partner_mask = torch.zeros_like(fragment_block_mask)\n", "for pose_index in range(fragment_pose.n_poses):\n", " for block_index in range(fragment_pose.max_n_blocks):\n", " block_type_index = int(\n", " fragment_pose.block_type_ind64[pose_index, block_index].item()\n", " )\n", " if block_type_index < 0:\n", " continue\n", " block_type = fragment_pose.packed_block_types.active_block_types[\n", " block_type_index\n", " ]\n", " polymer = block_type.properties.polymer\n", " protein_partner_mask[pose_index, block_index] = (\n", " polymer.is_polymer and polymer.polymer_type == \"amino_acid\"\n", " )\n", "\n", "assert protein_partner_mask.dtype == torch.bool\n", "assert protein_partner_mask.shape == fragment_pose.block_type_ind.shape\n", "assert protein_partner_mask.device == fragment_pose.device\n", "assert not torch.any(protein_partner_mask & fragment_block_mask)\n", "assert torch.any(protein_partner_mask)\n", "\n", "# Scoring must use the exact ligand-extended database returned by this build.\n", "fragment_score_function = beta2016_score_function(\n", " device,\n", " param_db=fragment_context.parameter_database,\n", ")\n", "\n", "print(\n", " f\"fragment blocks={int(fragment_block_mask.sum())}; \"\n", " f\"protein partner blocks={int(protein_partner_mask.sum())}; \"\n", " f\"annotated cut bonds={len(cut_bonds)}\"\n", ")" ] }, { "cell_type": "markdown", "id": "970f113b", "metadata": {}, "source": [ "### Calculate weighted fragment–protein interactions\n", "\n", "`calculate_fragment_interactions()` scores the connected pose once and sums both stored orientations between each split block and the selected protein blocks. Its `SplitBlockEntry` records keep each score column aligned with a pose and block index.\n", "\n", "The table reports weighted TMol score units. Summing fragment columns recovers the connected ligand-versus-protein cross-mask score; it is still not a binding free energy." ] }, { "cell_type": "code", "execution_count": 9, "id": "16715460", "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", "\n", "\n", "\n", "\n", "\n", "
fragmentregionpose blockweighted totalfa_ljatrfa_ljrepfa_lkfa_elechbondcart_lengthscart_anglescart_torsionscart_improperscart_hxltorsionsdisulfideramaomegadunbrack_rotdunbrack_rotdevdunbrack_semirotlk_ball_isolk_balllk_bridgelk_bridge_uncplrefgen_torsionsna_torsionna_torsion_well
F1amide/pyrrolidine core574-8.7480-8.63170.77372.2328-2.2899-1.38160.00.00.00.00.00.00.00.00.00.00.0-1.59672.14550.00000.00000.00.00.00.0
F2central carboxylate5754.7783-3.78610.08018.0684-0.2244-1.63430.00.00.00.00.00.00.00.00.00.00.0-3.22705.50180.00000.00000.00.00.00.0
F3pyrrolidine carboxylate576-3.6570-3.10020.05526.4262-5.7848-1.88660.00.00.00.00.00.00.00.00.00.00.0-2.62923.3871-0.0165-0.10820.00.00.00.0
F4central linker scaffold577-3.3711-10.89231.22923.80251.78000.00000.00.00.00.00.00.00.00.00.00.00.0-2.58773.29740.00000.00000.00.00.00.0
F5terminal aminoethyl group578-4.1776-2.52730.06430.7697-2.38630.00000.00.00.00.00.00.00.00.00.00.00.0-0.69680.8410-0.0439-0.19830.00.00.00.0
F6phenyl ring579-5.3081-3.73980.0858-1.2742-0.26410.00000.00.00.00.00.00.00.00.00.00.00.0-0.13420.01840.00000.00000.00.00.00.0
\n", "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Fragment–fragment interactions (separate; not attributed above):\n" ] }, { "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", "
fragment pairseparate weighted interaction
F1–F2-0.3553
F1–F37.1155
F1–F45.4605
F1–F5-0.2495
F1–F60.0000
F2–F30.0000
F2–F412.8556
F2–F50.0000
F2–F6-0.0973
F3–F40.0901
(5 more rows not shown)
\n", "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fragment_interactions = calculate_fragment_interactions(\n", " fragment_pose,\n", " protein_partner_mask,\n", " sfxn=fragment_score_function,\n", " sum_terms=False,\n", ")\n", "fragment_score_types = fragment_score_function.all_score_types()\n", "fragment_term_names = [score_type.name for score_type in fragment_score_types]\n", "fragment_score_matrix = (\n", " fragment_interactions.scores[:, 0, :].detach().cpu().numpy()\n", ")\n", "assert fragment_score_matrix.shape == (\n", " len(fragment_term_names),\n", " len(fragment_interactions.mapping),\n", ")\n", "\n", "fragment_rows = []\n", "for column, record in enumerate(fragment_interactions.mapping):\n", " fragment_id = fragment_id_by_block[record.block_ind]\n", " row = {\n", " \"fragment\": f\"F{fragment_id}\",\n", " \"region\": fragment_region[fragment_id],\n", " \"pose block\": record.block_ind,\n", " \"weighted total\": fragment_score_matrix[:, column].sum(),\n", " }\n", " row.update(\n", " {\n", " term_name: fragment_score_matrix[term_index, column]\n", " for term_index, term_name in enumerate(fragment_term_names)\n", " }\n", " )\n", " fragment_rows.append(row)\n", "fragment_interaction_frame = pd.DataFrame(fragment_rows)\n", "show_table(fragment_interaction_frame.round(4))\n", "\n", "# Independent block-pair check: all fragment↔protein entries equal the API sum.\n", "fragment_block_scorer = (\n", " fragment_score_function.render_block_pair_scoring_module(fragment_pose)\n", ")\n", "fragment_block_pair_terms = fragment_block_scorer(\n", " fragment_pose.coords, sum_terms=False, apply_weights=True\n", ")\n", "fragment_protein_cross_mask = (\n", " fragment_block_mask.unsqueeze(2) & protein_partner_mask.unsqueeze(1)\n", ") | (\n", " protein_partner_mask.unsqueeze(2) & fragment_block_mask.unsqueeze(1)\n", ")\n", "direct_ligand_protein_terms = (\n", " fragment_block_pair_terms\n", " * fragment_protein_cross_mask.unsqueeze(0)\n", ").sum(dim=(2, 3))\n", "torch.testing.assert_close(\n", " fragment_interactions.scores.sum(dim=2),\n", " direct_ligand_protein_terms,\n", " rtol=1e-5,\n", " atol=1e-5,\n", ")\n", "\n", "# Keep fragment–fragment interactions in a separate diagnostic table.\n", "fragment_fragment_rows = []\n", "for column_a, record_a in enumerate(fragment_interactions.mapping):\n", " for column_b, record_b in enumerate(fragment_interactions.mapping):\n", " if column_b <= column_a:\n", " continue\n", " block_a, block_b = record_a.block_ind, record_b.block_ind\n", " pair_terms = (\n", " fragment_block_pair_terms[:, 0, block_a, block_b]\n", " + fragment_block_pair_terms[:, 0, block_b, block_a]\n", " )\n", " fragment_a = fragment_id_by_block[block_a]\n", " fragment_b = fragment_id_by_block[block_b]\n", " fragment_fragment_rows.append(\n", " {\n", " \"fragment pair\": f\"F{fragment_a}–F{fragment_b}\",\n", " \"separate weighted interaction\": float(pair_terms.sum().detach().cpu()),\n", " }\n", " )\n", "fragment_fragment_frame = pd.DataFrame(fragment_fragment_rows)\n", "print(\"Fragment–fragment interactions (separate; not attributed above):\")\n", "show_table(fragment_fragment_frame.round(4))" ] }, { "cell_type": "code", "execution_count": 10, "id": "2b5745d9", "metadata": { "tags": [ "collapse-code" ] }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA/EAAALxCAYAAAAUtiYhAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjExLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvctoD+AAAAAlwSFlzAAAPYQAAD2EBqD+naQAAw71JREFUeJzs3Xd4VMX79/HPBkICCQmB0AklQOid0HsvFqpEEEWqUhRBRRAFBCk2UEQFwQpIxy9NAZFeQ0dBOgRpUlNICJDs8we/7MOSQnazJZu8X9e1F9k5M3Puc3YT9t6ZM8dgNBqNAgAAAAAA6Z6bswMAAAAAAACpQxIPAAAAAICLIIkHAAAAAMBFkMQDAAAAAOAiSOIBAAAAAHARJPEAAAAAALgIkngAAAAAAFwESTwAAAAAAC6CJB6AS/vggw80YsSIVNV9/fXX9emnnz6xLL2y5FiPHj2qt99+WyEhIRoyZIidI8vYXOk9Yk8Z9TxYelz9+vXTjBkz7BKLPfuG/SxatEhdunRRfHy8s0MBkElkdXYAQGZz+/ZtLVu2THv37lV4eLjy5cunkiVLqkuXLipQoICzw7OLgQMHKigoSEOHDrV531u2bNHt27dTVXft2rWqWLHiE8vSq9Qe6+nTp1W9enWFhISoY8eO8vX1tX9wLsTS92Na3yP2fP/bWkqxutLviiWSOq6UzsPKlSt1//59q/dnz76tMWHCBB08eFC9evXSU089lWLd48ePa8WKFTp+/Lju3bungIAAVapUSR06dJCnp6ckKTIyUi+//HKyfVSoUEHjxo2z6TGkxbx587R8+XItWbLE6j6OHj2qpUuXKj4+Xm5urjk+ZovzAMBxSOIBB/rxxx/12muvqVSpUnruuecUEBCg//77T7/88oveeOMNffPNN+rTp4+zw7S5NWvW6ObNm84OI0lffPGFfHx8nB2GTS1YsED379/XzJkz5eHh4exw0h1L349pfY+k5/f/41KKNSP+rkhJH5c9X7P09H64fv26xo8fr7i4OF2+fDnZJP7evXt6/fXXNXv2bD3zzDNq0aKFfHx8dPz4cY0YMUKDBw/Wzp07Vbp0acXGxmrp0qVq2bKl+vfvn6ivvHnz2vuwLHLkyBEtXbo0TX0899xzqlixorJkyWKjqBzPFucBgOOQxAMOsmjRIvXq1UtvvPGGPv30UxkMBtO2oUOH6ttvv9Xly5edGGHm1KpVK2eHYHMXLlxQzpw5SeBtJCO+R6yRUc9DRj2u1Pjxxx9lNBo1efJkvfXWWzp69KjKly+fqF7fvn21YMECrVy5Um3atDHb9s4772jAgAEKDw83Kw8MDFSXLl3sGn96Ub58+STPGwDYC0k84ACxsbEaOnSoypcvr48//tgsgU/Qr18/RUZGmpWdPHlSP//8s06fPi1vb281bdpUXbt2Nfu2v1+/fqpatar69OmjmTNnau/evcqbN6/69euncuXKJdpHautKD0dpfvrpJx06dEiSFBwcrJdfflleXl5m9W7cuKG5c+fq0KFDypo1q+rUqaOePXvK3d1dXbp00bVr17R9+3bTB7oSJUro448/tng/e/fu1c8//6xbt26pTp066tu37xPP/ZO8/vrrKlq0qIYPH25WvmfPHs2dO1e3b9827Wvy5Mm6c+eOpkyZYqo3ZswY/f3335KkLFmyKG/evGrWrJk6duxo9jpbeu6tOdbo6Gi9+OKL2rdvn6Kjo03n+6WXXtLTTz9tiuHll1/W7NmzFRoaqjZt2qhHjx6pPg5Lzk3C/nr16qVvvvlGhw4dUlBQkF577TX5+PgoKipKs2bN0sGDB1W4cGG9/vrrSV5Skpr3R2rPb2rej49L6j1iy/1Zcnxpfe3S8rua3O+Krf9O3b59Wz/++KP+/vtvGY1GVaxYUb169UrxspAvvvhC//zzj7766itT2eLFi7Vw4UJ169ZNXbt2NZW/8sorKl++vF577bUkjyu175G7d++m6nf5UbbuO7V/O5MzZ84cdezYUUOGDNFHH32k2bNn67PPPjOrs3PnTv38888aPnx4ogReknLkyKEff/xRMTExqdrnk5w5c0Zvv/223nzzTfn7+2vmzJm6fPmyKleurFdeecVs1sSjdQsUKKBZs2bpzJkzGjt2rMqWLas7d+7o559/1p49e/TgwQNVqFBBL7/8svLlyydJmjZtmn799VdJMvvC4YsvvlChQoUkSXFxcVq+fLn+/PNP3b59WyVKlNBLL72koKAgU/1FixaZHgnT6X/44QetW7dO8+fP17p167R48WLFx8erXbt26ty58xPPw6Pt//e//2nlypWSpKefflrPPvusWd3169dr5syZkiSDwSBvb29VrVpVPXv2VO7cuZPs8/fff9fy5cuVJUsWBQUFpXgeLD2W1Jyz5GJ59HcYQPJc88IdwMVs2bJFly9f1vPPP5/idLucOXOafl6yZIkqVqyoPXv2qEmTJipUqJD69++vZs2a6e7du6Z6K1eu1M6dO9WtWzeFh4ercePG2rlzp2rVqqXTp0+b9W9J3e3btysoKEiLFi1SzZo1VatWLX377beqUaOG/vvvP7NjK126tL7//nuVL19etWvX1o4dO9S+fXtJUkhIiLy8vFSsWDGFhIQoJCRErVu3tng/P//8s2rXrq2wsDA1btxYYWFh6t69u4WvRGJr167Vzp07zcp++OEH1alTR5cuXVLjxo3177//qkePHtqyZYs2bNhgVrdZs2am43rmmWfk7e2t3r17q3fv3mb1LDn31h6ru7u7QkJCVLJkSdPPISEhKlOmjCmGHTt2qEOHDrp586aCg4N16dIli47DknOTsL/nnntO9+7dU7169fTDDz+oRYsWioiIUMeOHRUTE6P69etr6dKlatiwoe7du2fWR2rfH6k9v096PyYlqfeIrfZnyfGl9bVL6+9qUufB1n+nrl27pipVqmj+/PmqVq2a6tevr7CwMNWsWTPRl5yPypIli77++mvTOZGk2bNna+nSpZo9e7ap7MKFC5o5c6ayZv3/YxiPH1dq3iMPHjxI1e/y42zZd2rfO8nZtm2bjh07poEDB8rDw0O9e/fWTz/9pNjYWLN6CxYskCS98MILyfbl5uaW6i8OnuTmzZtaunSp1q5dqz59+qhYsWKqWrWqvvzyS9WsWVPXrl1Lsu5LL72k/Pnzq0iRIrpx44YuXryoqlWrauLEiSpXrpxq166tRYsWqVy5ctq7d68kqW7duqYvRxJej5CQENP/xZGRkWrcuLEGDBigfPnyqVWrVjp//rwqV65sSqol82viExw8eFDLli3T9OnTNXfuXNWtW1fZsmVTly5d9Pnnnz/xPCS0nzx5spYuXap69erJy8tLnTp1SrRYacmSJU2xd+3aVZUrV9acOXNUpUoV3bhxI1GfH330kebOnauaNWsqIiLiiefBkmNJ7TlLLhYAqWQEYHdTp041SjIuW7YsVfVv3Lhh9Pb2NrZp08YYHx9vKt+6datRknH06NGmsvz58xtz5Mhh3LNnj6ksPDzc6O3tbXz11VfN+k1t3Tt37hgLFChgbNSokfHBgwem8qioKGPhwoWNL774otFoNBojIyONefPm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2fzQPwsODramWYdgMpk0evRoffvtt9q+fbuqVauWq3qff/65vv32W0VEROjgwYOKiIhQvXr1NHLkSEnSokWLzGVv3bqlMWPGaMCAAffd19Aa0dHRGj9+vPbs2aMmTZro5s2bmj17tq5du6aAgAANHTpUaWlpunTpknx8fDR9+nQ9+eSTOnbsWLaLR6SlpSktLc18npiYaPe4AQAAAOBehw8f1pUrVyRJERERFve+/fZb1atXT5JUrlw5+fn5SZKaNm2q4cOHa86cOTp69KiCgoL08ssv2323tb/85S/6+9//rhIlSqhjx44qVaqUjh07prfeekseHh6qX7++fv/9d7m4uOS6U9yqJP7QoUMaPHiwDhw4kOV9Kxa8dwi3b9/WgAEDdOjQIW3fvl0VKlTIdd0nn3zS/D+o+vXra+TIkVqwYIE5ic+QlJSkq1evasCAAZo3b54uXbpk98UCr169Kjc3N4WGhkqSSpYsqfHjx0u6uxXDpk2btHv3bpUuXVrS3VECixYt0ieffKI33ngjyzanT5+uKVOm2DVOAAAAAEWE4STDsGGbOFvq3kfr1q119uzZ+5b75ptvLM67dOmiLl265FdYkqThw4crPj5eY8aMUUJCgvl6mzZttGHDBrm5uSkpKUmrV6+Wk1PuPiOrkvjhw4erWrVqmj9//n333StOpkyZIldXV8XExMjf3z9PdevUqWNxXq9ePb333nvm86+//lpjx47VhQsX5OfnZ56fce7cObsn8S1atFCXLl1UvXp1de3aVREREerVq5f8/Px09OhRc3wZnJ2dVa9ePR07dizbNsePH68xY8aYzxMTExUSEmLXuAEAAAAUjj+vMG9t/QeRk5OTxo8fr5deeknHjh1TYmKiKlWqZJErNW3aNE9tWpXEHz58WJs2bTL31D4oBg0apFWrVunNN9/UvHnz8lT33j0OU1NTzSsxxsfHq1+/fpozZ46GDRsmFxcXnT17ViEhIRbz5u3F2dlZq1ev1u+//67Nmzfr888/12uvvaZdu3aZV0O8deuWxcqIaWlpOa6UmN3+jgAAAADwoCtZsqTq169vl7asSuIrVqyoxMTEBy6Jr169uqKiotSuXTs5OTlp7ty5ua77448/Wpz/97//NX+Jx44dU1pamgYOHCgXFxdJ0tatW+0W973S09Pl4uKimjVrqmbNmnrhhRcUFham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WYmJifr1119Vs2ZNPfzww/eNMzfv++d3SU1N1eHDh+Xv769mzZpJko4eParo6GhVqVJFderUydR2SkqKdu7cqZSUFNWrV08hISF5+pzWrFkjwzC0bds2Xb9+XV5eXurevXuOnxMAAI6IJB4AgFwYOHCgVq1apaCgIEnSxx9/rBdeeEHNmzdXSkqKSpQoof3792vx4sXq3bu3JOm7777T5cuXZTKZ9PvvvyshIUHr169X3bp1JUnp6enq16+funXrpqNHj6pGjRrauXOn2rRpo6+++sr87H//+98aMWKEmjVrZn5WWlpatrGuW7dOly9fliStXr1anTp1Ur169dSvXz916dJFMTExatiwoQYNGqSHH374vnHm5n0z3qVNmza6cOGCqlevrq1bt6pHjx4qX768vv32W1WpUkVRUVF68803NW7cOHPb27ZtU9++fVW5cmX5+flpx44dGjVqlN56661cf04bNmyQYRjauXOnYmNjVbZsWZJ4AEDxZAAAgEw8PDyMdevWZXl+6dIlw8vLy1iwYIH5/muvvWZIMlauXJltm6NHjzY6dOhgPr99+7YhyejSpYtx69YtwzAMIyYmxnB2djZ27NhhGIZhXLlyxShVqpTFs/72t7/d91lt27Y1Xn/99UzPatOmjZGamprju98bZ27eN6P9bt26Gbdv3zYMwzDWrVtnSDJ69epl3LlzxzAMw1i+fLnh6elpjuH69euGn5+fsXz5cnPbJ0+eNEqVKmVERUXl+nMyDMNwcXExNmzYkOO7AQDg6JgTDwBAHm3cuFFubm4aPny4+dqrr76aZdkTJ05ow4YNWrFihXx8fLRnz55MZZ599lm5ublJkqpXr66goCDFxMRIutvD7OLiYvGs1157zerYn3vuOXl4eOQpzry87zPPPCNX17sD/Vq0aGF+PxcXF/O1lJQUxcXFSbo7DD4tLU2urq5auXKlVq5cqb1796pixYqKioqyaDunzwkAgAcFw+kBAMijuLg4BQcHmxNTSfL395e3t7f53GQy6emnn9b69ev1yCOPyM/PT1evXlViYqLS0tIsEmk/Pz+L9j08PJSamirp7jZx9z6rbNmy8vLysir2wMBAi/PcxJmb981QpkwZi/fI7lrG+506dUqurq5atWqVRTu1a9dWaGioxbWcPicAAB4UJPEAAOSRn5+frl+/bnHt1q1bSk5ONp9v3LhR69at04kTJ/TQQw9Jujs/ffPmzTIMI9fP8vf317Vr1zI96+bNm1bF7uTkZHGemzhz877W8vHxkWEYWr58eabYAABAZgynBwAgj1q2bKlz585Z7Bu/bt06i+T84sWL8vPzMyfGkjL1NudGq1atdP78ef3888/ma19//XWe/hCQk9zEmZv3tVZkZKSSkpK0fPlyi+tpaWmKj4/PU1ve3t70zAMAij164gEAyKN69eqpf//+6tGjh8aOHauUlBQtWLBA7u7u5t7kDh066MUXX9SQIUP06KOPavPmzdqwYUOen1WnTh0NGjRIPXr00KuvvqqUlBTNnz9f7u7udnmX3MSZm/e1Vq1atTR58mQNHTpUe/bsUd26dRUbG6svv/xSS5Yskb+/f67batKkiebOnasbN27I19eX1ekBAMUSPfEAAGShT58+qlChQrbnixcv1vjx43XgwAGlpKTo+++/l2EYKlWqlCQpNDRUu3fvVpkyZfTf//5XjRo10nfffae+ffua55Y7Ozurb9++Fr3gkvTYY4+patWq5vOPP/5YEydO1MGDB5WamqqtW7dq8ODBFnup3ysiIsJiP/nsnpWbOHPzvlm17+bmpr59+yogIMB8zdPTU3379lXp0qXN1958801t2bJFLi4u2r59u0qWLKlNmzaZ95jP7ee0bNkytWjRQps2bdJ3332X7WcDAIAjczLsNR4PAIAHyNWrVy0WWtu4caMee+wxnTt3TuXKlSvEyPLHg/a+AAAUVQynBwDACnPnzlVsbKxatWqluLg4zZ49Wy+++GKxTWgftPcFAKCooiceAAArmEwmLV++3Dz8OyIiQt26dSvssPLNg/a+AAAUVSTxAAAAAAA4CBa2AwAAAADAQZDEAwAAAADgIEjiAQAAAABwECTxAAAAAAA4CJJ4AAAAAAAcBEk8AAAAAAAOgiQeAAAAAAAHQRIPAAAAAICDIIkHAAAAAMBB/H9tu5Cebqg84AAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "
\n", "
\n", "
\n", "
\n", " pick a selection · drag to rotate · scroll to zoom · click a highlighted atom to label it\n", "
\n", "
\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fragment_labels = [\n", " f\"F{fragment_id_by_block[record.block_ind]}\"\n", " for record in fragment_interactions.mapping\n", "]\n", "fragment_totals = fragment_score_matrix.sum(axis=0)\n", "active_term_mask = np.max(np.abs(fragment_score_matrix), axis=1) > 1e-8\n", "active_fragment_terms = fragment_score_matrix[active_term_mask]\n", "active_fragment_term_names = np.asarray(fragment_term_names)[active_term_mask]\n", "heatmap_limit = max(float(np.max(np.abs(active_fragment_terms))), 1e-8)\n", "\n", "fig, (total_ax, term_ax) = plt.subplots(\n", " 2,\n", " 1,\n", " figsize=(10, 4 + 0.38 * len(active_fragment_term_names)),\n", " gridspec_kw={\"height_ratios\": [1, 2]},\n", " constrained_layout=True,\n", ")\n", "total_colors = np.where(fragment_totals >= 0, \"tab:red\", \"tab:blue\")\n", "total_ax.bar(fragment_labels, fragment_totals, color=total_colors)\n", "total_ax.axhline(0, color=\"black\", linewidth=0.8)\n", "total_ax.set(\n", " ylabel=\"weighted score units\",\n", " title=\"Connected-ligand fragment interactions with the ACE protein partner\",\n", ")\n", "\n", "term_image = term_ax.imshow(\n", " active_fragment_terms,\n", " cmap=\"coolwarm\",\n", " vmin=-heatmap_limit,\n", " vmax=heatmap_limit,\n", " aspect=\"auto\",\n", ")\n", "term_ax.set_xticks(np.arange(len(fragment_labels)), fragment_labels)\n", "term_ax.set_yticks(\n", " np.arange(len(active_fragment_term_names)), active_fragment_term_names\n", ")\n", "term_ax.set(xlabel=\"ligand fragment\", ylabel=\"weighted beta2016 term\")\n", "fig.colorbar(term_image, ax=term_ax, label=\"weighted score units\", shrink=0.85)\n", "plt.show()\n", "\n", "# Interactive pocket viewer: one button per fragment in the bound complex, each\n", "# captioned with that fragment's weighted interaction total with the protein\n", "# partner -- the same one-complex interaction score plotted above.\n", "fragment_total_by_id = {\n", " fragment_id_by_block[record.block_ind]: float(fragment_totals[column])\n", " for column, record in enumerate(fragment_interactions.mapping)\n", "}\n", "whole_ligand_total = float(fragment_totals.sum())\n", "fragment_pocket_selections = {\"all LG1\": is_ligand}\n", "fragment_pocket_notes = {\n", " \"all LG1\": (\n", " f\"whole connected ligand · summed fragment interaction \"\n", " f\"{whole_ligand_total:+.2f} score units\"\n", " )\n", "}\n", "for fragment_id in fragment_region:\n", " key = f\"F{fragment_id}: {fragment_region[fragment_id]}\"\n", " fragment_pocket_selections[key] = is_ligand & (fragment_ids == fragment_id)\n", " fragment_pocket_notes[key] = (\n", " f\"weighted fragment–protein interaction \"\n", " f\"{fragment_total_by_id[fragment_id]:+.2f} score units \"\n", " f\"(one bound complex; no state subtraction)\"\n", " )\n", "try:\n", " try:\n", " fragment_viewer = tmol.selection_gallery(\n", " complex_array,\n", " fragment_pocket_selections,\n", " notes=fragment_pocket_notes,\n", " )\n", " except TypeError as exc:\n", " if \"notes\" not in str(exc):\n", " raise\n", " # The current release wheel predates selection captions but still\n", " # supports the interactive fragment buttons and shared 3D viewer.\n", " fragment_viewer = tmol.selection_gallery(\n", " complex_array,\n", " fragment_pocket_selections,\n", " )\n", " display(fragment_viewer)\n", "except ImportError as exc:\n", " print(\"Interactive fragment pocket viewer unavailable:\", exc)" ] }, { "cell_type": "markdown", "id": "1daf464c", "metadata": {}, "source": [ "The interactive pocket viewer above colors each ligand fragment inside the bound complex, and its caption reports that fragment's weighted interaction total with the protein partner — the same one-complex score shown in the bar plot. Selecting **all LG1** reports the summed whole-ligand interaction. These captions make the per-fragment attribution legible in three dimensions, but remain weighted score units from one complex, not binding free energies.\n", "\n", "**Expected observations.** Different connected regions of the same bound ligand can have favorable and unfavorable weighted interactions with the selected protein blocks, and different score terms can dominate each region. The independent cross-mask assertion verifies the attribution against the underlying directed block-pair tensor.\n", "\n", "These values answer “which fragment–protein block-pair terms contribute to this one complex?” They do not answer “how much binding free energy does this fragment provide?” Fragment–fragment entries are displayed separately and never folded into a fragment's protein-partner column. The remainder of the notebook returns to the original 1UBQ `pose_stack` for differentiation and coordinate sensitivity.\n", "\n", "## Differentiate and reweight an interface\n", "\n", "Because whole-pose and block-pair scoring modules consume coordinate tensors, ordinary PyTorch autograd provides derivatives. Clone and detach first so the tutorial never mutates a pose's coordinate storage.\n", "\n", "The first calculation differentiates the ordinary 1UBQ total. The second returns to the connected ligand pose and multiplies both stored ligand↔protein orientations by 1.5 before reducing the block-pair matrix. That factor defines a deliberate analytical/training objective; it does not alter beta2016 parameters and does not turn the one-complex interaction into a binding free energy." ] }, { "cell_type": "code", "execution_count": 11, "id": "63ee223a", "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", "\n", "
chainresidueres_nameatomgradient_norm
203A13ILEN72.344444
207A13ILECB61.870312
204A13ILECA51.022690
38A3ILEC37.618317
237A15LEUCA35.370716
236A15LEUN33.712692
77A5VALC33.463181
238A15LEUC33.092995
208A13ILECG132.718456
191A12THRC28.827141
(10 more rows not shown)
\n", "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "finite gradients: True\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "1.5× ligand–protein block-pair objective: -159.6520538330078\n", "reweighted interface coordinate-gradient norm: 628.92041015625\n" ] } ], "source": [ "differentiable_coords = pose_stack.coords.detach().clone().requires_grad_(True)\n", "differentiable_total = whole_scorer(differentiable_coords).sum()\n", "differentiable_total.backward()\n", "atom_gradient_norm = differentiable_coords.grad[0].norm(dim=-1)\n", "real_gradient_norm = atom_gradient_norm[pose_stack.real_atoms[0]]\n", "\n", "records = atom_records_from_pose_stack(pose_stack)\n", "gradient_frame = pd.DataFrame(\n", " {\n", " \"chain\": records[\"chain\"],\n", " \"residue\": records[\"resi\"],\n", " \"res_name\": records[\"resn\"],\n", " \"atom\": records[\"atomn\"],\n", " \"gradient_norm\": real_gradient_norm.detach().cpu().numpy(),\n", " }\n", ").sort_values(\"gradient_norm\", ascending=False)\n", "show_table(gradient_frame.head(20))\n", "print(\"finite gradients:\", torch.isfinite(real_gradient_norm).all().item())\n", "\n", "# Reweight the chemically defined ligand↔protein block-pair interface before\n", "# reduction. Both directed storage orientations receive the same multiplier.\n", "interface_coords = fragment_pose.coords.detach().clone().requires_grad_(True)\n", "interface_matrix = fragment_block_scorer(interface_coords)\n", "interface_weights = torch.ones_like(interface_matrix)\n", "interface_weights = torch.where(\n", " fragment_protein_cross_mask,\n", " torch.full_like(interface_weights, 1.5),\n", " interface_weights,\n", ")\n", "reweighted_interface_objective = (interface_matrix * interface_weights).sum()\n", "reweighted_interface_objective.backward()\n", "interface_gradient = interface_coords.grad[fragment_pose.real_atoms]\n", "assert torch.isfinite(interface_gradient).all()\n", "print(\n", " \"1.5× ligand–protein block-pair objective:\",\n", " float(reweighted_interface_objective.detach().cpu()),\n", ")\n", "print(\n", " \"reweighted interface coordinate-gradient norm:\",\n", " float(torch.linalg.vector_norm(interface_gradient).detach().cpu()),\n", ")" ] }, { "cell_type": "markdown", "id": "93c98363", "metadata": {}, "source": [ "## Perturb one nonlocal contact as a sensitivity diagnostic\n", "\n", "The next cell finds the closest heavy-atom pair between blocks separated by at least three sequence positions. It clones coordinates and moves one atom by only 0.10 Å along the interatomic direction. This one-sided perturbation is solely a **score-sensitivity diagnostic**: it is not a finite-difference estimate of a physical response and not a chemically valid conformational move. Bonded and nonbonded terms may both respond." ] }, { "cell_type": "code", "execution_count": 12, "id": "2c6f7938", "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", "
termweighted_beforeweighted_afterdelta
5cart_lengths6.9052877.6485300.743243
3fa_elec-41.767223-41.4462090.321014
4hbond-19.797235-19.968584-0.171349
1fa_ljrep19.42368119.271950-0.151731
2fa_lk99.10749199.018791-0.088699
7cart_torsions8.6722278.607414-0.064813
17lk_ball52.02067651.978092-0.042583
16lk_ball_iso-52.320141-52.2849160.035225
6cart_angles37.18676837.159943-0.026825
0fa_ljatr-126.778610-126.7731170.005493
(5 more rows not shown)
\n", "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "contact blocks 0 and 16; initial heavy-atom distance 2.564 Å\n" ] }, { "data": { "text/html": [ "\n", "
\n", " \n", "
\n", " \n", "
\n", "
closest selected contact: 2.564 Å
\n", "
\n", "

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

\n", "
\n", "\n", "
\n", "
\n", "
One contact atom moved along the interatomic direction
\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": [ "pbt = pose_stack.packed_block_types\n", "heavy_indices_by_block = []\n", "for block_index in range(pose_stack.max_n_blocks):\n", " block_type_index = int(pose_stack.block_type_ind64[0, block_index].item())\n", " block_type = pbt.active_block_types[block_type_index]\n", " offset = int(pose_stack.block_coord_offset64[0, block_index].item())\n", " local_heavy = torch.nonzero(\n", " pbt.atom_is_hydrogen[block_type_index, : len(block_type.atoms)] == 0,\n", " as_tuple=False,\n", " ).flatten()\n", " heavy_indices_by_block.append(local_heavy + offset)\n", "\n", "best_distance = float(\"inf\")\n", "best_contact = None\n", "for block_i in range(pose_stack.max_n_blocks):\n", " for block_j in range(block_i + 3, pose_stack.max_n_blocks):\n", " atoms_i = heavy_indices_by_block[block_i]\n", " atoms_j = heavy_indices_by_block[block_j]\n", " distances = torch.cdist(\n", " pose_stack.coords[0, atoms_i], pose_stack.coords[0, atoms_j]\n", " )\n", " flat_index = int(torch.argmin(distances).item())\n", " local_i = flat_index // distances.shape[1]\n", " local_j = flat_index % distances.shape[1]\n", " distance = float(distances[local_i, local_j].item())\n", " if distance < best_distance:\n", " best_distance = distance\n", " best_contact = (\n", " block_i,\n", " block_j,\n", " int(atoms_i[local_i].item()),\n", " int(atoms_j[local_j].item()),\n", " )\n", "\n", "block_i, block_j, atom_i, atom_j = best_contact\n", "perturbed_coords = pose_stack.coords.detach().clone()\n", "direction = perturbed_coords[0, atom_j] - perturbed_coords[0, atom_i]\n", "perturbed_coords[0, atom_j] += 0.10 * direction / torch.linalg.vector_norm(direction)\n", "\n", "before_terms = whole_scorer(\n", " pose_stack.coords, sum_terms=False, apply_weights=True\n", ")[:, 0]\n", "after_terms = whole_scorer(\n", " perturbed_coords, sum_terms=False, apply_weights=True\n", ")[:, 0]\n", "perturbation_frame = pd.DataFrame(\n", " {\n", " \"term\": [score_type.name for score_type in score_types],\n", " \"weighted_before\": before_terms.detach().cpu().numpy(),\n", " \"weighted_after\": after_terms.detach().cpu().numpy(),\n", " \"delta\": (after_terms - before_terms).detach().cpu().numpy(),\n", " }\n", ").sort_values(\"delta\", key=np.abs, ascending=False)\n", "show_table(perturbation_frame.head(15))\n", "print(\n", " f\"contact blocks {block_i} and {block_j}; initial heavy-atom distance \"\n", " f\"{best_distance:.3f} Å\"\n", ")\n", "\n", "perturbed_pose = pose_stack.clone()\n", "perturbed_pose.coords.copy_(perturbed_coords)\n", "try:\n", " display(\n", " tmol.switchable_view(\n", " {\"original\": pose_stack, \"0.10 Å perturbation\": perturbed_pose},\n", " notes={\n", " \"original\": f\"closest selected contact: {best_distance:.3f} Å\",\n", " \"0.10 Å perturbation\": \"One contact atom moved along the interatomic direction\",\n", " },\n", " )\n", " )\n", "except ImportError as exc:\n", " print(\"Interactive coordinate comparison unavailable:\", exc)" ] }, { "cell_type": "markdown", "id": "e889a45e", "metadata": {}, "source": [ "**Expected observations.** A 0.10 Å change should produce finite, nonzero score deltas. The largest responding terms depend on the chosen contact and local geometry. Interpret only the local sensitivity of the score function—not chemical plausibility, relaxation behavior, or an experimentally measurable energy change.\n", "\n", "## Plot dominant weighted terms" ] }, { "cell_type": "code", "execution_count": 13, "id": "2a304904", "metadata": { "tags": [ "collapse-code" ] }, "outputs": [ { "data": { "image/png": "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IuDVq1eoV68e5syZg9evX+P7778HAISGhuL169d48+YNLl++jJs3b2LOnDkaH0+lUqFnz564evUqzp07B2dn5yzbKJVKtRcRERERlVwMFsVAeno6rKysMGbMGOzfv1+jvuLj49G+fXtER0fj1KlTsLa2zrLdggULoFAopJejo6NGxyUiIiKioo3Bogj7/fffUaVKFcjlclhZWWHYsGEIDw/XqM/+/fvj9evXOHr0KBQKRbbtZsyYgbi4OOml6XGJiIiIqGhjsCii/P39MWrUKCxcuBAJCQlITEzE9u3b1b6X4kP07dsXt27dwuHDh3NsJ5fLYWpqqvYiIiIiopJLT9sF0Ie5cuUKKlSogK5du0rr/Pz8NO7Xx8cH9evXR//+/SGTydCtWzeN+yQiIiKi4o93LIooNzc33L17F/v27cPz58+xadMmLFu2rED67tOnDzZs2IB+/fph7969BdInERERERVvvGNRRJQqVQoGBgbScosWLbBw4UJMnjwZr169Qs2aNfHdd9/h22+/zXOfxsbG0NN7+yMgk8lgbGwMXV1dAG+HRAkhMGzYMBgZGaFdu3YFej5EREREVLzIhBBC20VQ0adUKqFQKBAXF8f5FkREH1HG799LFSqi9P/94xARFV9Vg4M+6vHy8xmPdyyKqZSUFKhUqiy36erqwsjI6CNXRERERETFGedYFFOrVq2CjY1Nlq8WLVpouzwiIiIiKmZ4x6KYGjt2LMaOHavtMoiIiIiohOAdCyIiIiIi0hiDBRERERERaYzBgoiIiIiINMY5FkRERMVA5atX+LhvItIq3rEgIiIiIiKNMVgQEREREZHGGCyIiIiIiEhjDBZERERERKQxBgsiIiIiItIYnwpFRERUDITUqYvSurraLoOo0FUNDtJ2CZQN3rEgIiIiIiKNMVgQEREREZHGGCyIiIiIiEhjDBZERERERKQxBgsiIiIiItIYgwUREREREWms0IPFjBkzMHfu3ALvd/jw4fjll18KvN+icvzc1K9fH2fOnNF2GURERERUQhR6sAgPD0dERESB9/vw4UM8e/aswPv9lI+flpaG6tWr4/Lly7m2vXPnDpRK5UeoioiIiIiIQ6GKFCEEAgMDkZCQoO1SiIiIiIjUFGiwEEJg2bJlaNy4Mby8vLB8+XIIIdTa9OjRA3/88YfauilTpqgNlxo+fDh++ukn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Cg8ePMC9e/fQunVrnDx5Mk/77dmzB69fv0bHjh0RGBiIW7duoWzZsqhYsSIOHz78wfvs3r0br169wooVK2BoaAgAqFy5Mrp3755lnwsWLIBCoZBejo6OH3AViIiIiKi44BwLLZg1axZ++eUXWFpawszMDImJiXj69Gme9g0KCkJycjL69++vtl4mk0EI8cH7hISEwNXVFaampnmqY8aMGZg4caK0rFQqGS6IiIiISjAGi4/s2LFj+OWXX+Dv7w83NzcAb+8oZHdn4H1yuRwWFhb5mvuQl32MjIzy9b0Xcrkccrk8z+2JiIiIqHjjUKiP7O7du3BxcZFCBQAcP348z/s3b94cT548wfnz5zNtU6lUH7xP06ZN8ejRI9y6dUtte3Jycp5rIyIiIqKSi8HiI2vSpAmCg4OxePFinD9/Ht988w3++OOPPO/v4eGBnj17onv37li3bh3Onz+PzZs3o1mzZrh8+fIH79OyZUt07twZnTt3xpYtW3D69GnMnDkTS5cuLYjTJiIiIqJijkOhClmlSpVgY2MjLbu7u2PXrl1YvXo1du3ahZo1a2LTpk34/vvv89zn33//jQ0bNmDv3r34/fffUblyZSxatAiNGzeW2tSsWRMmJib52mfnzp1YsWIFNm7ciPT0dLRr105tHgURERERUXZkIrsZv0T5oFQqoVAoEBcXl+cJ4ET06XOefkjbJVAu0lWJCP+lF3//ElGhyM9nPN6x+MRERUUhIiIiy21GRkaoXLnyR66IiIiIiCh3DBafmH///TfbeQ0VKlTArl27PnJFRERERES5Y7D4xAwcOBADBw7UdhlERERERPnCp0IREREREZHGGCyIiIiIiEhjDBZERERERKQxzrEgIqJshS3sqO0SKBdKpRKKX7RdBRER71gQEREREVEBYLAgIiIiIiKNMVgQEREREZHGGCyIiIiIiEhjDBZERERERKQxPhWKiIioGAipUxeldXW1XUaJUzU4SNslEH0yeMeCiIiIiIg0xmBBREREREQaY7AgIiIiIiKNMVgQEREREZHGGCyIiIiIiEhjDBZERERERKQxBotiTE9PDydPntR2GURERERUAjBYaCAtLQ16eno4ffq0tkvJUlpaGtLT07VdBhERERGVAAwWGhBCIC0tDUIIbZdCRERERKRVJSJYxMbG4ssvv4S9vT0sLS3Rv39/REVFSdsdHBygp6cHAwMDlC9fHlOnTkVSUpK0PSEhAXp6evjtt9/QoEEDGBsbY/ny5bCxsQEAtG7dGnp6eqhevXquteT1WCtWrICHhwcsLCxQpUoV7N69W62foKAgtGjRAiYmJqhevTrWr18PMzMzHD58ONtjv3r1CiNGjICNjQ0sLCzQpk0bXL9+Xa3NggULUL58eSgUCjRt2hRnzpzJ9ZyIiIiIiIp9sEhNTYWnpycCAgJw8OBB3L17Fx06dMDff/8ttXn06BGSkpIQHx+PnTt34siRI5g3b560PePOxIIFC/Djjz/i5cuXGDNmDCIiIgAAx44dQ1JSEgICAnKtJ6/HWrx4Mb7//ns8fPgQQ4cORf/+/REZGSmdk7e3N6ytrREcHIydO3di9erViIuLy3boU1paGtq1a4fXr1/Dz88PoaGhaNu2LVq3bo3nz58DAPbu3YuffvoJW7ZsQUREBJYsWYL169fn/6ITERERUYlT7IPFwYMHERAQgB07dsDd3R2Wlpbo27cvxo4dK7XR1dWFnp4e5HI5ateujTlz5mDHjh2Z+po1axZatGgBQ0NDyGQy6Orqqu2fsZyTvB7r22+/RZMmTaBQKDB58mTo6uri8uXLAIADBw7g6dOnWLt2Lezt7VG1alWsWLEix+P++++/CA4Oxp9//gkXFxeYm5tj6tSpcHJyku6GPHjwAC4uLmjUqBFKly6NBg0aYNOmTVn2p1KpoFQq1V5EREREVHIV+2Bx7do1uLq6wtHRMds2u3fvRsOGDWFhYQE9PT307t0bjx8/ztQuL0OdcpPXY1WqVEn6s0wmg5mZGWJjYwG8HQZVoUIFmJmZSW1q164NHZ3s384rV65AqVTCxMQEcrkccrkcBgYGCAgIwIMHDwAA3bp1w5MnT9CkSRP89NNPmYZJvWvBggVQKBTSK6frS0RERETFX7EPFsDbD+bZuXr1Kvr27Ysvv/wSwcHBSExMxJ49e5CampqprYGBgUZ15OdYWdX87iTx97fndI7A26FQ5cuXx+vXr5GQkICEhAQkJiYiOTkZP/74IwDAxcUF9+7dw6hRoxASEgJPT0+0b98+y/pmzJiBuLg46RUeHp6na0BERERExVOxDxa1atXCgwcP8PTp0yy3+/v7o2LFihg0aBCsrKxgYGCAa9eu5alvHR0d6Ojo5PmRrpoc612VK1fG/fv31YYf3bhxI8c6Mq7Do0ePoKenp/Z6906Hqakp+vXrh/Xr1+P69es4cuQI/P39M/Unl8thamqq9iIiIiKikqvYBwtvb29UqVIF/fr1Q3BwMBISErBnzx6sXLkSwNshR/fv38epU6egUqlw4MAB/Pzzz3nqW0dHBw4ODrh06VKewoUmx3pX586dUbZsWYwePRovX77Eo0ePMG7cuBz36dKlC2rWrAkfHx9cv34dKpUKQUFBmDBhAs6ePQsAWLx4MVauXImIiAikpKTA19cXenp6HOZERERERLkq9sFCX18fx48fh729PRo0aABbW1v8/fff+PzzzwEAnp6emDp1Knr06IHSpUtj3rx5uX5If9fixYuxatUqyOXyXOdgaHqsDAYGBti/fz+Cg4NhY2ODVq1aoVevXtDX14dcLs9yHz09PZw4cQK1a9eGl5cXTExM0LNnT7i4uKBhw4YAgIEDByIoKAj169eHiYkJli5dip07d8LJySnfNRIRERFRySIT/Ha3TDIe+aqnpyetS01NVVt+X3p6OoQQeXoy1IccKy0tDTo6OtnOpQgKCsJnn32Gu3fvomLFilI/urq6uc6/KAhKpRIKhQJxcXEcFkVE9BFl/P69VKEiSufz/0GkuarBQdougahQ5eczXrG/Y/EhZDJZpg/2OYUK4O2wqPyGivwc6/2AsHTpUpw6dQpJSUkICQnBiBEj0KhRIylUZPTzMUIFERERERGDRQFaunRpponRGa9atWoV6LE6dOiAH374AWXLlkWLFi3g7OyMffv2FegxiIiIiIjyikOhClDGsKasvPuFesURh0IREWkHh0JpF4dCUXGXn894OY/voXzJalgTEREREVFJwKFQRERERESkMQYLIiIiIiLSGMftEBERFQOVr17hHDci0iresSAiIiIiIo0xWBARERERkcYYLIiIiIiISGMMFkREREREpDEGCyIiIiIi0hifCkVERFQMhNSpWyy/eZvfbE1UdPCOBRERERERaYzBgoiIiIiINMZgQUREREREGmOwICIiIiIijTFYEBERERGRxhgsiIiIiIhIYxoHi/nz52PRokUFUYuaCRMmYPXq1QXeb1E5/oeYOXMmfv75Z22XQUREREQlkMbBIiQkBPfu3SuIWtTcunULYWFhBd5vUTn+h7hz5w5CQ0M17ictLQ1NmzbF9evXC6AqIiIiIioJ+AV5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4uzZs1keZ8aMGZg4caK0rFQqGS6IiIiISjAGi49EpVJhzJgx2Lp1qzQkKSkpCaVKlYIQosCOI5PJ1JZNTEygp6enNiQrO69evcq0bGFhkWVbuVwOuVz+wXUSERERUfHCoVAfycuXL5GcnIxq1apJ6/bu3VugoSIrXl5eiIqKwr59+9TWq1SqTF/at3//funPycnJOHToEJo0aVKo9RERERFR8cA7Fh+JnZ0d6tSpgyFDhuDLL7/EgwcPsGrVKujq6hbqcWvXro2pU6eiT58+GDt2LD777DM8ePAA27dvx19//aX2pX379+/HqFGjUKdOHWzZsgU6Ojr4+uuvC7U+IiIiIioeeMeikFSpUgWtW7dWW3f06FG0bdsWx44dQ0JCAs6cOYM+ffrA3t4+T302btwY7u7uauveHfrUvHlzuLm5Zdpv0aJFOHToEN68eYMTJ05AX18fx48fR+3atdXa7dixAy4uLjh79iwaNGgAf39/mJiY5PWUiYiIiKgEk4nCHotDhaZ169Zo0qQJvvvuO436ef36NUxMTODn54eGDRt+UB9KpRIKhQJxcXEwNTXVqB4iIsq7jN+/lypUROlCvgtemKoGB2m7BCLKQn4+43Eo1CciISEB//77b7bb27dvLz0KNioqCjt37oSfnx9mzZr1sUokIiIiIsoWg8UnIj4+Htu2bct2e9OmTaVg8eLFC1y6dAkbN25Eq1atND62np4eunfvDktLS437IiIiIqKSiUOhqEBwKBQRkXZwKBQRFab8fMbj5G0iIiIiItIYgwUREREREWmMwYKIiIiIiDTGydtERETFQOWrVzjHjYi0incsiIiIiIhIYwwWRERERESkMQYLIiIiIiLSGIMFERERERFpjMGCiIiIiIg0xqdCERERFQMhdeoW2W/e5rduExUPvGNBREREREQaY7AgIiIiIiKNMVgQEREREZHGGCyIiIiIiEhjDBZERERERKSxYhMsoqOj8fLlywLv9/nz54iNjS3wfovK8YmIiIiI8qLYBIvx48dj2rRpBd5vv379sGjRogLv91M/flhYGJKSkj76cYmIiIioaCo2wYIKTmpqKlxcXODv76/tUoiIiIioiCjSweLly5fZ/qv606dPoVQq1dZFRUWpDZd6d5hRYmIiXr9+nePxXr9+jbi4uEzr3+0nJiYGz58/l+oLCwtDWFgY4uPj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EZHGGCwoS5GRkejZsydcXFxQu3ZtbZdDRERERJ84fo8FZenbb79FbGwsfH19YWxsrO1yiIiIiOgTx2BBWbpz5w7atm0LZ2dnbZdCREREREUAh0IVY7169cLMmTMxfvx4VKpUCd27dwcAJCYmYubMmahevToqVaqE3r17IzQ0VNrPwcEBFy9exI8//ggbGxt899132joFIiIiIioieMeiGIuJicHChQsxd+5cHD58GBYWFhBCoEuXLjAwMMDGjRthZmaG9evXo2nTpggKCoKZmRmuXr2KDh06wNPTE+PHj+dQKCIiIiLKFYNFMdesWTPMnTtXWj5+/Dj8/f3x4sULGBkZAQAWLVqEgwcPYvv27Rg5ciSsra2hr6+P0qVLw8bGJst+VSoVVCqVtKxUKgv3RIiIiIjok8ZgUcy5u7urLfv5+SEpKQkVK1aEEAIAIIRATEwM7t+/n+d+FyxYgHnz5hVorURERERUdDFYFHOGhoZqyyqVCk5OTjh37lymtvkZ8jRjxgxMnDhRWlYqlXB0dPzwQomIiIioSGOwKGGqV6+ORYsWIS0tDfb29h/cj1wuh1wuL8DKiIiIiKgo41OhSphu3bqhfPny6N+/P8LDwwEAL168wPfffw9/f38tV0dERERERRWDRQkjl8tx8uRJmJubo0KFCjA1NUXNmjWhUqng5uam7fKIiIiIqIjiUKhibOfOndDX18+03t7eHnv27EFKSgoSExOhUCgytTl8+DCHOhERERFRnjFYFGPm5uY5btfX188yVACAhYVFYZRERERERMUUh0IREREREZHGGCyIiIiIiEhjDBZERERERKQxBgsiIiIiItIYgwUREREREWmMT4UiIiLKp7CFHbVdgkSpVELxi7arICLiHQsiIiIiIioADBZERERERKQxBgsiIiIiItIYgwUREREREWmMwYKIiIiIiDTGYEFERERERBpjsCAiIiIiIo0xWBARERERkcYYLIiIiIiISGMMFkREREREpDEGCyIiIiIi0hiDBRERERERaYzBgoiIiIiINMZgQUREREREGmOwICIiIiIijTFYEBERERGRxvS0XQAVD0IIAIBSqdRyJUREJUvG713+/iWiwpDxuyXjs15OGCyoQMTHxwMAHB0dtVwJEVHJxN+/RFSY4uPjoVAocmwjE3mJH0S5SE9Px9OnT2FiYgKZTKbtckok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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "dominant = term_frame.reindex(term_frame[\"weighted\"].abs().sort_values().index).tail(12)\n", "fig, ax = plt.subplots(figsize=(8, 5))\n", "colors = np.where(dominant[\"weighted\"] >= 0, \"tab:red\", \"tab:blue\")\n", "ax.barh(dominant[\"term\"], dominant[\"weighted\"], color=colors)\n", "ax.axvline(0, color=\"black\", linewidth=0.8)\n", "ax.set(\n", " xlabel=\"weighted beta2016 score units\",\n", " title=\"Largest beta2016 term contributions\",\n", ")\n", "plt.tight_layout()\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "4dcfc12b", "metadata": {}, "source": [ "## Rosetta comparison\n", "\n", "Rosetta can switch a pose between centroid and full-atom representations and stores evaluated energies in a pose-associated `Energies` object. TMol's current implementation is **all-atom only**. It renders a scorer for a `PoseStack` layout and returns tensors directly; it does not maintain Rosetta's per-residue `Energies` cache.\n", "\n", "Consequently, recompute a whole-pose or block-pair tensor when coordinates change, keep the score-function weights/options with the analysis, and do not call a block-pair matrix a cached per-residue decomposition. The [Rosetta-to-TMol crosswalk](rosetta_crosswalk.md) collects these distinctions.\n", "\n", "See the full official [Rosetta scoring tutorial](https://docs.rosettacommons.org/demos/latest/tutorials/scoring/scoring), [analysis tutorial](https://docs.rosettacommons.org/demos/latest/tutorials/analysis/Analysis), [full-atom versus centroid tutorial](https://docs.rosettacommons.org/demos/latest/tutorials/full_atom_vs_centroid/fullatom_centroid), [PyRosetta score-function basics](https://nbviewer.org/github/RosettaCommons/PyRosetta.notebooks/blob/master/notebooks/03.01-Score-Function-Basics.ipynb), and [analyzing energy between residues](https://nbviewer.org/github/RosettaCommons/PyRosetta.notebooks/blob/master/notebooks/03.02-Analyzing-energy-between-residues.ipynb).\n", "\n", "## Next: choose a sampling branch\n", "\n", "Tutorials [04 — Packing and a Small Mutation Scan](04_packing_and_mutation_scan.ipynb) and [05 — Minimization, constraints, and kinematics](05_minimization_constraints_kinematics.ipynb) are parallel after this notebook: 04 changes discrete identities/conformers, while 05 changes continuous Cartesian or internal coordinates. Complete both before FastRelax composes them in tutorial 06." ] }, { "cell_type": "markdown", "id": "9150a7d5", "metadata": {}, "source": [ "## Exercises\n", "\n", "1. Confirm numerically that `block_pair_by_term.sum((2, 3))` matches `weighted_terms`.\n", "2. Build an unweighted block-pair tensor and inspect how one selected nonbonded term changes after the perturbation.\n", "3. Select a submatrix by `pdb_info` chain, residue, and insertion-code labels rather than by assuming file order.\n", "4. Compare the equal-split profile with an alternative declared attribution convention without calling either a cached residue energy.\n", "5. Repeat the gradient analysis after cloning and perturbing a different contact; compare cosine similarity between gradients." ] }, { "cell_type": "markdown", "id": "477063e8", "metadata": {}, "source": [ "## References\n", "\n", "- [Rosetta-to-TMol crosswalk](rosetta_crosswalk.md)\n", "- Park et al., [Simultaneous Optimization of Biomolecular Energy Functions on Features from Small Molecules and Macromolecules](https://pubmed.ncbi.nlm.nih.gov/27766851/)\n", "- Alford et al., [The Rosetta All-Atom Energy Function for Macromolecular Modeling and Design](https://pubmed.ncbi.nlm.nih.gov/28430426/)\n", "- [Rosetta scoring tutorial](https://docs.rosettacommons.org/demos/latest/tutorials/scoring/scoring)\n", "- [Rosetta Energy Function workshop slides](https://meilerlab.org/wp-content/uploads/2023/12/Rosetta_Energy_Function.pdf)\n", "- [Rosetta full-atom versus centroid](https://docs.rosettacommons.org/demos/latest/tutorials/full_atom_vs_centroid/fullatom_centroid)\n", "- [PyRosetta score-function basics](https://nbviewer.org/github/RosettaCommons/PyRosetta.notebooks/blob/master/notebooks/03.01-Score-Function-Basics.ipynb)" ] } ], "metadata": { "accelerator": "GPU", "colab": { "gpuType": "T4" }, "language_info": { "name": "python" } }, "nbformat": 4, "nbformat_minor": 5 }