{ "cells": [ { "cell_type": "markdown", "id": "14ced224-37a3-4916-b87d-a0c497e418b9", "metadata": {}, "source": [ "### What is ProCapNet?\n", "Author: Jacob Schreiber \\" ] }, { "cell_type": "markdown", "id": "9927cd5a-c532-46ee-91bb-9678e367d6ae", "metadata": {}, "source": [ "#### Introduction\n", "\n", "ProCapNet is an extension of the BPNet modeling framework to transcription *initiation*. Note that this is not the same as transcription, which is sometimes directly predicted by other methods, but rather is measured by assays that specifically terminate at the initiation step of transcription. A reason for this is that steady-state transcript abundance is influenced by many factors outside the local genomic window (e.g., presence of other molecules in the cell) and so may not be the best target from sequence-only prediction.\n", "\n", "As you might expect, ProCapNet is trained to predict the readout from ProCap experiments. Architecturally, ProCapNet is the same as a BPNet model, but parameter-wise is more similar to a ChromBPNet model, in that it has 512 filters instead of the standard 64. It uses the same number of layers and the same dilation patterns as the other BPNet models." ] }, { "cell_type": "markdown", "id": "18df192c-aba8-440d-a38f-22752253de75", "metadata": {}, "source": [ "##### Loading ProCapNet models\n", "\n", "Using ProCapNet is almost identical to using a standard BPNet model except with one notable difference: because the ProCapNet codebase is based off an earlier version of bpnet-lite, the trained models are already in torch. This means that you can either use `torch.load` if you have the full model, or the code below if you only have the state dictionary. Make sure that you remember to set the number of control tracks to 0 because those are not used here." ] }, { "cell_type": "code", "execution_count": 1, "id": "2e0ae66e-8a07-4d22-8511-714afd23510a", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "BPNet(\n", " (iconv): Conv1d(4, 512, kernel_size=(21,), stride=(1,), padding=(10,))\n", " (irelu): ReLU()\n", " (rconvs): ModuleList(\n", " (0): Conv1d(512, 512, kernel_size=(3,), stride=(1,), padding=(2,), dilation=(2,))\n", " (1): Conv1d(512, 512, kernel_size=(3,), stride=(1,), padding=(4,), dilation=(4,))\n", " (2): Conv1d(512, 512, kernel_size=(3,), stride=(1,), padding=(8,), dilation=(8,))\n", " (3): Conv1d(512, 512, kernel_size=(3,), stride=(1,), padding=(16,), dilation=(16,))\n", " (4): Conv1d(512, 512, kernel_size=(3,), stride=(1,), padding=(32,), dilation=(32,))\n", " (5): Conv1d(512, 512, kernel_size=(3,), stride=(1,), padding=(64,), dilation=(64,))\n", " (6): Conv1d(512, 512, kernel_size=(3,), stride=(1,), padding=(128,), dilation=(128,))\n", " (7): Conv1d(512, 512, kernel_size=(3,), stride=(1,), padding=(256,), dilation=(256,))\n", " )\n", " (rrelus): ModuleList(\n", " (0-7): 8 x ReLU()\n", " )\n", " (fconv): Conv1d(512, 2, kernel_size=(75,), stride=(1,), padding=(37,))\n", " (linear): Linear(in_features=512, out_features=1, bias=True)\n", ")" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import torch\n", "import tarfile\n", "\n", "from io import BytesIO\n", "from bpnetlite import BPNet\n", "\n", "with tarfile.open(\"ENCFF976FHE.tar.gz\", \"r:gz\") as tar:\n", " model_tar = tar.extractfile(\"./fold_0/ENCSR261KBX.procapnet_model.fold0.state_dict.torch\").read()\n", " model_state_dict = torch.load(BytesIO(model_tar))\n", "\n", "model = BPNet(n_filters=512, n_control_tracks=0).cuda()\n", "model.load_state_dict(model_state_dict)\n", "model" ] }, { "cell_type": "markdown", "id": "2f4488d4-e7ff-417c-a90c-c71a88b312e6", "metadata": {}, "source": [ "#### Predictions\n", "\n", "Now that we have loaded the model into PyTorch, we can use it the same as any other model. Let's investigate predictions at a gene to demonstrate." ] }, { "cell_type": "code", "execution_count": 2, "id": "b0d8377d-eca7-4bee-88db-517ce70d6823", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "torch.Size([1, 4, 2114])" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pyfaidx\n", "from tangermeme.utils import one_hot_encode\n", "\n", "chrom, mid = \"chrX\", 73_852_753\n", "start, end = mid - 1057, mid + 1057\n", "\n", "X = pyfaidx.Fasta(\"../../../../common/hg38.fa\")[chrom][start:end].seq.upper()\n", "X = one_hot_encode(X)[None].float().cuda()\n", "X.shape" ] }, { "cell_type": "markdown", "id": "c11aa4ed-faf0-4fea-b3f4-ed13c777625a", "metadata": {}, "source": [ "Just the same as before, we can use the `predict` function to generate logits and log counts. Because ProCapNet makes predictions for a phenomena that is stranded and usually asymetric across strands, you may need to apply the softmax on a reshaped version of the data like below." ] }, { "cell_type": "code", "execution_count": 3, "id": "30e20aaa-e32e-4a3c-9c17-07c4d4820dc7", "metadata": {}, "outputs": [], "source": [ "from tangermeme.predict import predict\n", "\n", "y_logits, y_logcounts = predict(model, X)\n", "y_logits = torch.softmax(y_logits.reshape(1, -1), dim=-1).reshape(*y_logits.shape)" ] }, { "cell_type": "markdown", "id": "28880637-3b59-4d49-89f0-2a0f1d8faad8", "metadata": {}, "source": [ "Then we can plot these predictions as before." ] }, { "cell_type": "code", "execution_count": 4, "id": "ff95306c-d519-4af4-8f7a-90a18e5fab5b", "metadata": {}, "outputs": [ { "data": { "image/png": "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AgCYN28eHj16hNmzZ8PExARubm4q+zs4OMDc3LxIOxERkTEw9FlZRERE9HYaF90xMTE4c+YMlixZIs5fP3fuHGbOnImYmBhMnz5d7WN17NgR6enpWLx4MVJSUuDm5oZly5ahWrVqAIDU1FQkJydrGiIRERERERGRQdC46P7zzz+xcOFCNG3aVGxr1aoVzM3NMXLkSI2KbgDo27cv+vbtW+y2mJiYN+47YsQIjBgxQqPzERERlRUc6SYiIir7NL65OTc3t9iFzhwcHJCbm6uVoIiIiIiIiIiMgcZFt6+vLxYuXIi8vDyxLTc3F7GxsfD19dVmbEREROUaR7qJiIjKPo2nl0+aNAmDBg1Cy5Yt4eHhAYlEgmvXrsHc3BwrV67URYxEREREREREZZLGRbe7uzv27duHHTt24NatWxAEAZ06dUKXLl1gYWGhixiJiIjKjZdHtznSTUREVPZpVHTL5XJ8/PHHWLp0KXr37q2rmIiIiIiIiIiMgkb3dMtkMuTn50MikegqHiIionKNI91ERETGReOF1EJDQ7F8+XIUFBToIh4iIiIiIiIio6HxPd0XL17EyZMncezYMbi7u8PS0lJle2xsrNaCIyIiIiIiIirLNC66K1SogPbt2+siFiIionKP08uJiIiMi8ZFd3R0tC7iICIiIrDoJiIiMjZqF91KpRKrVq3CgQMHUFBQgObNm2PYsGEwNzfXZXxEREREREREZZbaC6ktX74c8+bNg5WVFZycnBAXF4eZM2fqMjYiIqJyhyPdRERExkXtke6tW7di8uTJ6Nu3LwDgyJEjGDZsGCIjI/kRYkRERERERETFUHukOykpCa1btxYft2jRAoIgICUlRSeBEREREREREZV1ahfdcrkcFhYW4mOJRAKZTIb8/HydBEZERFQecXo5ERGRcdFo9fIffvhB5XO55XI5lixZAltbW7Ft4sSJ2ouOiIiIiIiIqAxTu+hu0qQJbt++rdLm5+eHe/fuiY95bzcREVHJcKSbiIjIuKhddK9du1aXcRAREREREREZHbXv6SYiIiLd40g3ERGRcWHRTURERERERKQjLLqJiIgMCEe6iYiIjAuLbiIiIiIiIiIdYdFNRERkQDjSTUREZFzUWr08MTFR7QN6eHi8czBERERERERExkStortbt26QSCQQBOGtn8V97do1rQRGRERUHnGkm4iI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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%matplotlib inline\n", "from matplotlib import pyplot as plt\n", "import seaborn; seaborn.set_style('whitegrid')\n", "\n", "plt.figure(figsize=(10, 2.5))\n", "plt.plot(y_logits[0, 0], c='0.3', label=\"+ strand\")\n", "plt.plot(y_logits[0, 1], c='0.7', label=\"- strand\")\n", "\n", "plt.title(\"ProCapNet Profile Predictions\")\n", "plt.ylabel(\"Predicted Probability\")\n", "plt.xlabel(\"Position\")\n", "\n", "plt.legend()\n", "plt.tight_layout()\n", "seaborn.despine(bottom=True, left=True)\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "5f7233a6-ea0f-4bf2-9947-27eb4225360a", "metadata": {}, "source": [ "Unlike the BPNet and ChromBPNet models, the phenomena being predicted by ProCapNet models is much more punctate and spikey. Although there certainly are places where transcription initiation is fuzzier, many genes have high values at an individual basepair like we see here, rather than peaks that can span hundreds of bp." ] }, { "cell_type": "markdown", "id": "abd237aa-776a-4222-a9b1-98f8610cc518", "metadata": {}, "source": [ "#### Attributions\n", "\n", "Because the model is in PyTorch, just like the other models, we can run attribution methods on ProCapNet just as easily as the other methods. The only consideration here is that the attributions for the profile predictions might become more relevant because the precise positioning of the predicted spikes, and the asymmetry of the strands, may guide the specific features that you look to interpret." ] }, { "cell_type": "code", "execution_count": 5, "id": "7a462d0f-516f-4835-a8a7-ed82cbdf6cde", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/jmschrei/github/tangermeme/tangermeme/deep_lift_shap.py:460: RuntimeWarning: Convergence deltas too high: tensor([1.0266e-03, 7.5245e-04, 1.1840e-03, 4.1962e-05, 1.1387e-03, 7.5054e-04,\n", " 9.6321e-05, 7.5865e-04, 1.1668e-03, 1.0285e-03, 1.0390e-03, 7.7343e-04,\n", " 1.1735e-03, 9.5510e-04, 1.2088e-03, 1.1396e-04, 4.5633e-04, 1.0700e-03,\n", " 1.0843e-03, 9.2235e-03], device='cuda:0', grad_fn=)\n", " warnings.warn(\"Convergence deltas too high: \" +\n", "100%|███████████████████████████████████████████████████████████████████████████████████| 20/20 [00:03<00:00, 5.31it/s]\n" ] } ], "source": [ "from bpnetlite.bpnet import ProfileWrapper\n", "from bpnetlite.attribute import deep_lift_shap\n", "\n", "X_attr = deep_lift_shap(ProfileWrapper(model), X, verbose=True)" ] }, { "cell_type": "markdown", "id": "2e22caa3-741a-4493-89f1-863cb95dad42", "metadata": {}, "source": [ "And we can visualize these just as before, with a focus on the nucleotides just under the predicted spike." ] }, { "cell_type": "code", "execution_count": 6, "id": "08551110-8fc5-4cea-ac4b-6d16775ced25", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA+kAAADtCAYAAADDRDT0AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAcqRJREFUeJzt3Xd4FOXax/HvpkMCKSSh9xJKQu9IEVTUYwEUxYYVBbtHRYp6REWUI/oqWAA5NlBRmqAoTVEBpQhIV3oNIZ30MrvvH0OWbOoGEjbl97muvbK788zMvZvJZO55msVms9kQEREREREREZdzc3UAIiIiIiIiImJSki4iIiIiIiJSTihJFxERERERESknlKSLiIiIiIiIlBNK0kVERERERETKCSXpIiIiIiIiIuWEknQRERERERGRckJJuoiIiIiIiEg5oSRdREREREREpJxQki4ildKiRYsICwuzPyIiIujTpw933XUXM2fOJDY21tUhOsiJd+fOnYWWOXHiBGFhYcyZM8f+3saNGx0+Z+7H448/zrhx4wpdnvsxbtw4h32tWbOGtm3bEhcXB0BkZCQvvfQSgwcPpn379nTv3p3rr7+e559/nsjISPt606dPJywszL5eXtdddx133XVXgcvi4uIIDw8v8nvI+3nCw8MZPHgw7777LhkZGYV+d3mtWbOGsLAwevToQWZmZr7lUVFRTJ8+nb179+Zb9ssvvzB9+nSn95UjLCzMYT1nfuclVVTcOb+b8mrPnj3ceeeddOnShbCwMD755BNXh1SonL/FnEfr1q3p0aMHo0aNYtu2bWWyz59++onRo0fTu3dvwsPD6d69O3fffTdLly4lKyurTPYJjp/1+++/z7e8uL/5omzdupXp06dz9uzZ0gjV7sCBA0yfPp0TJ044VX78+PGEh4fz999/51s2a9YswsLC+Omnn+zvhYWF8fLLLzuUK+4cmfeYKerhbNwiUnl5uDoAEZGyNGXKFJo1a0Z2djaxsbH8+eefzJ49m//973+8/fbb9O7d29Uhlop///vf9OjRw+G9gIAA3NzcGDFihP293bt38/LLL+crHxQU5LDuypUr6dq1K0FBQZw+fZqhQ4dSs2ZN7r33Xpo2bUpycjIHDhzghx9+4Pjx49StW/eiP0PuZGPBggVEREQUWM7Hx4dPP/0UgMTERL7//nvee+89Dh06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VPHlykRQZ7h8Jfg1cVEAUu5Uqw8xG8znx765tPv2qGbOhy0iVYaSdBERkSquYUPYtw+OHoWvvnJ1NKaQEDNJNwzIyoLUVFdHJFVa9foQuwk23AHRv7k6GhGp5JSki4iIVHENGphzpV9zDXz6qaujMdWvbybnu3bBunWQlubqiKRKq97Q/Hn0C01pJSJlTkm6iIhIFde4sTlw9N69Zs11eVCvnhnT22/Da6+5Ohqp8vzDweLu6ihEpIpQki4iIlLF1agBrVu7OgpHnp5mk/dPP4XVq10djVR5HtXNwQQB/Jq5NhYRqfSUpIuIiAi33Wb+LE/JeliYqyMQyaXtBAhoD2FPujoSEanklKSLiIgIjz0GHTrApEmujuS8nj3PP3dXS2NxtdC+cM1f4BPi6khEpJJTki4iIiIEBMD27dCtm6sjOe/++81+6Z07m/GJiIhUBR6uDkBERESkIGFh8NJLMGiQqyMRERG5dCw2m+aREBERERERESkP1NxdREREREREpJxQki4iIiIiIiJSTihJFxERERERESknlKSLiIiIiIiIlBNK0kVERERERETKCSXpIiIiIiIiIuWEknQRERERERGRckJJuoiIiIiIiEg5oSRdREREREREpJxQki4iIiIiIiJSTlTZJH3evHkMHDiQiIgIhg0bxpYtW1wdksgFmT59OmFhYQ6PPn362JfbbDamT5/OZZddRvv27bnrrrvYv3+/CyMWKd7mzZsZPXo0l112GWFhYaxevdphuTPHdWZmJq+88go9evSgY8eOjB49mtOnT1/KjyFSrOKO9XHjxuU7x99yyy0OZXSsS3k2c+ZMbrrpJjp16kSvXr14+OGHOXTokEMZndNFHFXJJH358uVMmTKFMWPGsGTJErp06cKoUaM4deqUq0MTuSAtW7Zk3bp19seyZcvsy2bPns3HH3/Miy++yIIFCwgODubee+8lOTnZhRGLFC01NZWwsDBefPHFApc7c1xPnjyZVatW8fbbb/PFF1+QmprKQw89hGEYl+pjiBSruGMdoG/fvg7n+FmzZjks17Eu5dmmTZu44447+Prrr/n4448xDIP777+f1NRUexmd00XysFVBN998s+3FF190eO/qq6+2vfnmmy6KSOTCvfvuu7YbbrihwGVWq9XWp08f28yZM+3vZWRk2Lp06WL78ssvL1WIIhelVatWtlWrVtlfO3Ncnz171tauXTvb999/by9z+vRpW+vWrW2//vrrpQtepATyHus2m8323HPP2caMGVPoOjrWpaKJjY21tWrVyrZp0yabzaZzukhBqlxNemZmJrt37+ayyy5zeL9Pnz5s27bNRVGJXJyjR49y2WWXMXDgQJ566imOHz8OwIkTJ4iOjnY43r28vOjWrZuOd6mwnDmud+3aRVZWlkPXj9q1a9OyZUsd+1LhbNq0iV69ejF48GCef/55YmNj7ct0rEtFk5SUBIC/vz+gc7pIQTxcHcClFh8fj2EY1KpVy+H94OBgoqOjXRSVyIVr3749b7zxBk2aNCE2NpYPPviAESNG8N1339mP6YKOd3XvkIrKmeM6JiYGT09P+0Vg7jIxMTGXJlCRUtCvXz+uvvpq6tWrx4kTJ3jnnXe4++67WbRoEV5eXjrWpUKx2WxMmTKFLl260KpVK0DndJGCVLkkPYfFYnF4bbPZ8r0nUhH079/f4XXHjh258sorWbJkCR06dAAKPt5FKroLOa517EtFc+2119qft2rVivDwcAYOHMjatWu56qqrCl1Px7qURy+//DL//PMPX3zxRb5lOqeLnFflmrsHBgbi7u6e765bbGwswcHBLopKpPRUr16dVq1aceTIEUJCQgB0vEul4sxxHRwcTFZWFomJiYWWEamIQkNDqVevHkeOHAF0rEvF8corr/DTTz/x6aefUqdOHfv7OqeL5FflknQvLy/atWvH+vXrHd7fsGEDnTp1clFUIqUnMzOTgwcPEhISQoMGDQgJCXE43jMzM9m8ebOOd6mwnDmuw8PD8fT0dChz5swZ9u/fr2NfKrT4+HgiIyMJDQ0FdKxL+Wez2Xj55ZdZuXIln376KQ0bNnRYrnO6SH5Vsrn7vffey9ixYwkPD6dTp07Mnz+fyMhIRowY4erQRErsjTfe4PLLL6du3brExcXxwQcfkJyczNChQ7FYLIwcOZKZM2fSpEkTGjduzMyZM/Hx8eG6665zdegihUpJSeHYsWP21ydOnGDv3r34+/tTr169Yo/rGjVqcNNNN/HGG28QGBiIv78/b7zxBq1ataJ3796u+lgi+RR1rPv7+zNjxgyuuuoqQkJCOHnyJG+//TaBgYFcccUVgI51Kf8mTZrEd999x/vvv4+vr6+9D3qNGjXw8fFx6lpFx7lUNRZbFe3MMW/ePObMmcOZM2do1aoV48ePp1u3bq4OS6TEnnrqKTZv3kxCQgKBgYF07NiRJ554ghYtWgDmHewZM2Ywf/58EhMT6dChAy+++KJ9wBaR8mjjxo2MHDky3/tDhw7l9ddfd+q4zsjIYOrUqXz33Xekp6fTq1cv/vOf/1C3bt1L+VFEilTUsf7SSy/xyCOPsGfPHpKSkggJCaFHjx488cQTDsexjnUpz8LCwgp8f8qUKQwbNgxw7lpFx7lUJVU2SRcREREREREpb6pcn3QRERERERGR8kpJuoiIiIiIiEg5oSRdREREREREpJxQki4iIiIiIiJSTihJFxERERERESknlKSLiIiIiIiIlBNK0kVERERERETKCSXpIiIiIiIiIuWEknQREREp0okTJwgLC2Pv3r1FlrvrrruYPHnyJYpKRESkcrLYbDabq4MQERGRizdu3DgWL14MgIeHB3Xq1OGqq67iscceo3r16he8XcMwiIuLIzAwEA8PDzZu3MjIkSPZvHkzNWvWtJdLSEjAw8MDPz+/i/4sIiIiVZWHqwMQERGR0tO3b1+mTJlCdnY2W7Zs4fnnnyc1NZVJkyZd8Dbd3d0JCQkptlxAQMAF70NERERMau4uIiJSiXh5eRESEkLdunW5/vrruf7661mzZg2ZmZm8+uqr9OrVi4iICG677TZ27NhhXy8xMZGnn36anj170r59e6666ioWLlwIODZ3P3HiBCNHjgSgW7duhIWFMW7cOCB/c/fExETGjh1Lt27d6NChAw888ABHjhyxL1+0aBFdu3blt99+45prrqFTp07cf//9nDlz5hJ8UyIiIuWTknQREZFKzMfHh6ysLKZOncqKFSt4/fXXWbx4MY0bN+aBBx4gISEBgHfeeYeDBw8ye/Zsli9fzksvvURgYGC+7dWtW5fp06cD8OOPP7Ju3TomTpxY4L7HjRvHrl27+OCDD5g/fz42m40HH3yQrKwse5n09HT+97//MXXqVObOnUtkZCRvvPFG6X8RIiIiFYSSdBERkUpqx44dLFu2jB49evDVV18xduxY+vfvT4sWLXjllVfw9vZmwYIFAJw6dYo2bdoQERFBgwYN6N27NwMHDsy3TXd3d/z9/QGoVasWISEh1KhRI1+5I0eO8NNPP/Hqq6/StWtXWrduzZtvvklUVBSrV6+2l8vKymLSpElERETQrl077rjjDv74448y+kZERETKP/VJFxERqUTWrl1Lp06dyM7OJjs7m0GDBnHXXXexYsUKOnfubC/n6elJ+/btOXjwIAC33XYbjz/+OHv27KFPnz5cccUVDuVL6uDBg3h4eNChQwf7e4GBgTRt2tS+T4Bq1arRqFEj++vQ0FBiY2MveL8iIiIVnZJ0ERGRSqRHjx689NJLeHh4EBoaiqenJ/v27QPAYrE4lLXZbPb3+vfvz88//8zatWvZsGED99xzD3fccQfPPffcBcVR2OQxufcJ5ij0uVkslkLXFRERqQrU3F1ERKQSqVatGo0bN6Z+/fp4enoC0KhRIzw9Pfnzzz/t5bKysti1axfNmze3vxcUFMSwYcN48803mTBhAvPnzy9wHznbNQyj0DhatGhBdnY2f/31l/29+Ph4jhw54rBPERERcaSadBERkUquevXq3HbbbUydOhV/f3/q1avHRx99RHp6OjfffDNgDhzXrl07WrZsSWZmJmvXri00ma5fvz4Wi4W1a9fSv39/vL298fX1dSjTpEkTBg0axAsvvMCkSZPw8/PjzTffpHbt2gwaNKjMP7OIiEhFpSRdRESkCnjmmWew2WyMHTuWlJQUwsPD+eijj+yDwHl6evLWW29x8uRJfHx86NKlC2+99VaB26pduzaPPfYY06ZNY/z48QwZMoTXX389X7kpU6YwefJkRo8eTVZWFl27dmXWrFn2mngRERHJz2JTxy8RERERERGRckF90kVERERERETKCSXpIiIiIiIiIuWEknQRERERERGRckJJuoiIiIiIiEg5oSRdREREREREpJxQki4iIiIiIiJSTihJFxERERERESknlKSLiIiIiIiIlBNK0kVERERERETKCSXpIiIiIiIiIuWEknQRERERERGRcuL/AUjGNpvc7mBsAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from tangermeme.plot import plot_logo\n", "\n", "plt.figure(figsize=(12, 2))\n", "plot_logo(X_attr[0, :, 1057-150:1057+100])\n", "plt.xlabel(\"Position\")\n", "plt.ylabel(\"Attribution\")\n", "plt.title(\"DeepLIFT/SHAP Attributions from ProCapNet at XIST\")\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "9e0a446c-9608-4dcb-a858-ecd2b133a798", "metadata": {}, "source": [ "#### Design of a promoter active on a specified strand\n", "\n", "A conceptually cool thing you can do with ProCapNets is design transcription initiation in a strand-specific manner. Although in practice, one is likely to want to be careful about which strand to choose and what the downstream implications of such edits might be, in this demonstration we will just do something for fun. Specifically, we will try to flip the strand that is predicted to have transcription initiation in the above example.\n", "\n", "To do so, we need to write a simple wrapper that returns some notion of how strong the predictions are on each strand. Remember that ProCapNet only makes predictions as a single number, which is the log count of the total reads across *both* strands, so we cannot use that directly for design. In this wrapper, we just take the logsumexp of the predicted logits in each strand and use that as a notion of how strong each strand is to each other." ] }, { "cell_type": "code", "execution_count": 7, "id": "991e3f43-bf37-4bbd-a2bb-00b34ae2f8b5", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "tensor([[-3.3399, -0.0361]])" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from ledidi import ledidi\n", "\n", "class StrandWrapper(torch.nn.Module):\n", " def __init__(self, model):\n", " super().__init__()\n", " self.model = model\n", "\n", " def forward(self, X):\n", " profile, _ = self.model(X)\n", " profile = torch.logsumexp(profile, dim=-1)\n", " profile = profile - torch.logsumexp(profile, dim=-1)[:, None]\n", " return profile\n", "\n", "wrapper = StrandWrapper(model)\n", "\n", "predict(wrapper, X)" ] }, { "cell_type": "markdown", "id": "68e2018d-42da-4cc6-a039-10c7c84170db", "metadata": {}, "source": [ "The predictions showed a spike in the negative strand and here we see that the negative strand (the second value) is much stronger than the positive strand (the first value).\n", "\n", "Let's try to flip that and also make it much stronger. We will simultaneously try to make the positive strand more positive and the negative strand much more negative. For speed, and because we want to edit a sequence that we already have, we will use Ledidi to do the design." ] }, { "cell_type": "code", "execution_count": 8, "id": "dcfd5839-8cce-4e49-9cbb-a7d775956c40", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "iter=I\tinput_loss=0.0\toutput_loss=37.29\ttotal_loss=37.29\ttime=0.0\n", "iter=100\tinput_loss=38.25\toutput_loss=0.2827\ttotal_loss=4.108\ttime=2.218\n", "iter=200\tinput_loss=36.25\toutput_loss=0.3084\ttotal_loss=3.933\ttime=1.146\n", "iter=300\tinput_loss=35.69\toutput_loss=0.09708\ttotal_loss=3.666\ttime=1.145\n", "iter=F\tinput_loss=32.5\toutput_loss=0.1415\ttotal_loss=3.392\ttime=5.196\n" ] } ], "source": [ "y_bar = torch.tensor([[0.0, -8.0]])\n", "\n", "X_bar = ledidi(wrapper, X, y_bar, verbose=True)" ] }, { "cell_type": "markdown", "id": "396f97b5-3a7c-47ec-b353-1162eb9d67b3", "metadata": {}, "source": [ "Seems like we were able to flip predicted transcription initiation and get quite close to our goal (low output loss)! And that we actually do not need that many edits to achieve it. Let's confirm that the predictions match what we expected." ] }, { "cell_type": "code", "execution_count": 9, "id": "4365780c-6410-443a-a673-012f16b325ac", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "tensor([[-4.2439e-04, -7.7654e+00],\n", " [-5.5885e-04, -7.4903e+00],\n", " [-4.2439e-04, -7.7647e+00],\n", " [-3.4618e-04, -7.9679e+00],\n", " [-7.3719e-04, -7.2126e+00],\n", " [-7.8487e-04, -7.1498e+00],\n", " [-4.9019e-04, -7.6218e+00],\n", " [-4.1866e-04, -7.7791e+00],\n", " [-4.1389e-04, -7.7911e+00],\n", " [-5.6171e-04, -7.4855e+00],\n", " [-5.1880e-04, -7.5650e+00],\n", " [-7.8964e-04, -7.1438e+00],\n", " [-6.0177e-04, -7.4154e+00],\n", " [-5.3215e-04, -7.5389e+00],\n", " [-6.0558e-04, -7.4091e+00],\n", " [-6.7520e-04, -7.3010e+00]])" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "predict(wrapper, X_bar)" ] }, { "cell_type": "markdown", "id": "98fd6708-9841-4b78-884c-895a4ba97166", "metadata": {}, "source": [ "Great! Seems like the first column of values are all quite small and near zero, whereas the second column of values are all closer to -8.\n", "\n", "We can do a final confirmation that the design worked well by plotting the predicted logits according to the *original model*, and not the wrapped one. This ensures that the wrapper is not doing something weird." ] }, { "cell_type": "code", "execution_count": 10, "id": "841636a3-47b8-4394-8403-a2fd498c2e07", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA90AAADwCAYAAAAdFAfzAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAARehJREFUeJzt3Xl8THf////nyB5byEJsraUSRCQNtVebqLVVolxUk9pL0ZaiiqotV9CiRblsTVG1FNEWV1tUP7VdlNorrarWWiL2hqzn94df5muaqBlmZKSP++3mdmXe533OeZ3JK9PrNe/3+xyTYRiGAAAAAACA3RXK7wAAAAAAACioKLoBAAAAAHAQim4AAAAAAByEohsAAAAAAAeh6AYAAAAAwEEougEAAAAAcBCKbgAAAAAAHISiGwAAAAAAB6HoBgAAAADAQSi6AQB2s2rVKgUFBZn/Va9eXY8//rjefPNNnT171u7nS09P18cff6zOnTurTp06CgkJUePGjfXqq69q586ddj/frXKutWbNmjp16lSu7TExMXr66afv6thffPGFPvroI6v7x8TEWLzvoaGhatOmjT766CNlZ2ffVQy3s337dkVHRyssLExBQUHasGGD+b04efKkud+wYcMUGRlpt/Pe79zKS2RkpIYNG2Z+vWPHDgUFBWnHjh02HeeHH37Q9OnTdeXKlVzbYmJiFBMTc8+xAgCch2t+BwAAKHji4+NVqVIl3bhxQ7t27dLs2bO1c+dOffHFF/L29rbLOS5cuKCePXvq559/VnR0tHr06CEfHx+dPXtWGzduVNeuXbVq1SoFBwfb5Xy3k56ervfee0/vvPOO3Y65Zs0aHTlyRF27drV6n/Lly+vdd9+VJKWkpGjp0qWKj49XcnKyhgwZYpe4DMPQa6+9pocfflizZs2Sl5eXKlasqKysLC1btkwBAQF2Oc/fuR+5Za0aNWpo2bJlqlKlik377dmzRzNmzFC7du1UrFgxi21vv/22PUMEADgBim4AgN098sgjqlmzpiSpXr16ysrK0syZM7Vhwwa1adMmz32uX78uLy8vq8/xxhtv6KefftK8efNUv359i22tW7dW165dcxU0jtC4cWOtWbNGPXr0cHiB/3c8PT0VFhZmfv3444+rZcuWWrx4sV577TW5ubnl2scwDKWlpcnT09Oqc5w7d06XLl1S06ZNc73nJUuWvKf4rXU/cstaRYoUsXjP7cHWAh4A4PyYXg4AcLicwuT06dOSbk49Dg8P108//aTu3bsrPDzcPKp76dIljR49Wo0bN1ZISIiioqI0depUpaenm4938OBBfffdd2rfvn2u4i9HaGioypQpI+nmqPjo0aPVqlUrhYeHq379+oqNjdWuXbss9jl58qSCgoI0d+5czZo1S0888YRq1qyp6Ohobd++Pc/z9OzZUz4+PlaNdBuGocWLF+vZZ59VaGio6tSpo1deeUUnTpww94mJidG3336rU6dOWUyntpWbm5tq1Kih69ev68KFC5KkoKAgjR07VkuWLFHLli1Vs2ZNJSYmSpJ27dqlF198UeHh4apVq5Y6deqkb7/91ny86dOn6/HHH5ckvfvuuwoKCjJPH89revndXr+tbMmt9PR0zZw5Uy1atFBISIjq1aunN9980/z+5MjIyNCkSZPUsGFD1apVS507d9b+/ftznft208v37dunPn36qG7duqpZs6aaNm2quLg4STffx0mTJkmSoqKizL/fnGPkNb3cmr8J6f/9flevXq2WLVuqVq1aatOmjTZt2mTR78KFC3rrrbfUpEkT8/vQqVMnbdu2zdq3HQBgA0a6AQAO9/vvv0uyHA3NyMhQ37591alTJ/Xq1UtZWVlKS0tTbGysTpw4oQEDBigoKEi7du3SnDlzdPjwYc2ZM0eStHXrVklS06ZNrTr/pUuXJEn9+/eXn5+fUlNTtX79esXExOijjz5S3bp1LfovXrxYZcqU0fDhw5Wdna158+apV69eWrRokcLDwy36Fi5cWH379lVcXJy2b99+2y8BJGnUqFFKTExUTEyMBg8erMuXL+uDDz5Qp06d9Nlnn8nPz09vv/223nrrLZ04cUIzZsyw6vpu58SJE3J1dVXx4sXNbRs2bNCuXbvUr18/+fn5ydfXVzt37lT37t1VtWpVxcXFyd3dXUuWLFGfPn00ZcoUtWrVSh06dFBwcLD69+9vXq/u7u5uUzzWXL+trM2t7Oxsvfzyy9q9e7d69OihRx99VKdOndL06dO1f/9+rVy50jzi/9Zbb2n16tXq3r27GjZsqCNHjqh///76888/7xjP5s2b1bdvX1WqVEnDhg1TYGCgTp06Zc7ZDh066PLly1q0aJFmzJghf39/Sbcf4bb2byLHt99+qwMHDuiVV16Rt7e35s2bp/79++vLL79U+fLlJUlDhgzRjz/+qIEDB+rhhx/WlStX9OOPP5r/TgAA9kXRDQCwu+zsbGVmZiotLU3ff/+9Zs2apcKFC1vcWCsjI0P9+vVT+/btzW1Lly7VTz/9pPfee08tW7aUJDVs2FDe3t569913tXXrVjVs2NA8qlmuXDmr4qlUqZJGjx5tfp2VlaVGjRrp1KlTWrRoUa6iOysrSwkJCfLw8JAkNWrUSFFRUZo2bZoSEhJyHb9Tp05auHCh3n33Xa1YsUImkylXn71792r58uUaNmyYunXrZm6vXbu2mjdvroSEBA0ZMkRVqlRRsWLF5O7ubvPU5czMTEk3RzIXLVqkQ4cOqUWLFhbTx1NTU/XFF19YFOL/+te/VKxYMS1atEiFCxeWJD355JNq27atJk6cqJYtW6p06dLm4wcGBtocm7XXfyd3m1tr167V5s2bNX36dDVr1szcHhwcrOeee06rVq3S888/r6NHjyoxMVFdu3bV0KFDJd3MQV9fXw0ePPiO8Y0dO1aBgYH69NNPzfkjyRxL6dKlFRgYKEmqVq3aHXM4MTHRqr+JHGlpaUpISFCRIkUk3Vx33rhxY/33v/9V7969Jd28kVuHDh3UsWNH837WfoEFALAd08sBAHbXsWNH1ahRQ48++qheeukl+fn5ae7cublGMps3b27x+n//+5+8vb3VokULi/bo6GhJuu0Ub2ssWbJE7dq1U82aNVW9enXVqFFD27dv19GjR3P1bdasmUXBVKRIET355JP6/vvvlZWVlau/u7u7XnvtNR08eFD//e9/8zz/pk2bZDKZ1KZNG2VmZpr/+fn5KTg4+J7vtn7kyBHVqFHDXGQlJCTomWee0fjx4y361atXz6LgTk1N1b59+9S8eXNzwS1JLi4uatOmjf744w/9+uuv9xSbZL/rv9vc2rRpk4oVK6Ynn3zS4vzVqlWTv7+/+fw507yfeeYZi/1btmwpV9e/H6s4duyYjh8/rueee84if+6FrX8TdevWNRfcksyzGW69w35oaKgSExM1c+ZM7d27VxkZGXaJFQCQN0a6AQB2N3HiRFWuXFmurq7y9fXN867WXl5eFsWBdHMauJ+fX66RYl9fX7m6upqnv+as1T558qQqVap0x3gSEhI0YcIEderUSa+++qpKlCihQoUK6f3338+zoMxrmrOfn58yMjKUmpqqokWL5treunVrffjhh5o6daqeeuqpXNtTUlJkGIYaNGiQZ4w5U3/vVoUKFTRlyhSZTCZ5eHioXLlyed48LGc6c44rV67IMIxc7ZLMvzd7TDu21/XfbW6lpKToypUrCgkJyfO4Fy9elPT/rvWv74erq6t8fHz+NracteGlSpWy5lKsYu3fRI68YnR3d1daWpr59dSpUzVr1iytWLFC77//vry9vfXUU09pyJAheeYBAODeUHQDAOyucuXK5jtM305eU7B9fHy0b98+GYZhsT0lJUWZmZkqUaKEpJvTvadMmaINGzaYb+71dz7//HM99thjGjNmjEX77dbonj9/Ps82Nze32z6WymQyafDgwerWrZuWL1+ea3uJEiVkMpm0ePHiPNdC27o++q88PDzu+J7nxHmrYsWKqVChQkpOTs7V99y5c5Jkft/vhb2u/25zq0SJEvLx8dG8efPy3CdnlD+naE1OTrYonjMzM+/45UPOunJ7Pjfc2r8JW5QsWVIjRozQiBEjdPr0aX3zzTeaPHmyUlJSNH/+fLvFDgC4ienlAACnUb9+faWmpmrDhg0W7atXrzZvl26uU3388ce1cuXK2045P3DggHntt8lkylXUJSUlae/evXnu+/XXX1uMDF67dk2bNm1S7dq15eLictv4GzRooIYNG+qDDz7IVdA/8cQTMgxDZ8+eVc2aNXP9u/UO5e7u7rpx48Ztz2NP3t7eqlWrltavX29xzuzsbH3++ecqXbq0KlaseM/nseX6HeGJJ57QpUuXlJ2dnef5c2ZM5Kzv/+KLLyz2/+9//2te0347FStWVIUKFbRy5cpcdxa/VU4u3ppjt2Pt38TdKlOmjF544QU1aNBAP/744z0dCwCQN0a6AQBOo23btlq8eLHeeOMNnTp1SlWrVtXu3bs1e/ZsNWnSxGJq8sSJE9WzZ0/16tVL7du31+OPP67ixYvr3Llz2rRpk9auXatVq1apTJkyeuKJJzRz5kxNmzZNderU0bFjxzRz5kyVK1cuzzXaLi4u6tatm7p166bs7GzNnTtX165d04ABA+54DYMHD1Z0dLRSUlL0yCOPmNsjIiL0r3/9S8OHD9fBgwdVp04deXl5KTk5Wbt371bVqlX1/PPPS5KqVq2qr7/+Wp988olCQkJkMpmsGsW+W4MGDVL37t0VGxur7t27y83NTZ988omOHDlinrJ+r2y5fkdo3bq1vvjiC/Xu3VsxMTEKDQ2Vm5ub/vjjD+3YsUNRUVF66qmnVLlyZbVp00YLFiyQq6urGjRooCNHjmj+/Pm5pqznZdSoUerbt686duyorl27KjAwUGfOnNHmzZs1efJkSTd/v5K0YMECtWvXTq6urqpYsWKex7flb8IaV69eVWxsrJ5++mlVqlRJhQsX1oEDB7R58+Y8l0UAAO4dRTcAwGl4eHho4cKFmjp1qubNm6eLFy+qVKlS6t69u/r372/Rt2TJklqyZImWL1+utWvXas2aNbpx44ZKliypsLAwzZo1S8HBwZKkPn366Pr161qxYoXmzZunKlWqaPTo0dqwYUOeN/Dq0qWL0tLSNH78eHPxPHv2bEVERNzxGqpXr67WrVtrzZo1ubaNHTtWtWrV0rJly7RkyRJlZ2crICBAjz76qEJDQ839YmNjdeTIEU2dOlVXr16VYRj66aefbH07rfbYY4/po48+0vTp0/Xmm28qOztbwcHBmjVrlp588km7ncfa63cEFxcXzZo1SwsXLtRnn32mOXPmyMXFRaVLl1adOnXMhbAkxcXFyc/PT4mJiVq0aJGqVaum6dOna9CgQXc8T+PGjfXxxx/rgw8+0Pjx45WWlqbSpUtb3F29bt26eumll5SYmKhPP/1U2dnZWrhwYa676Eu2/U1Yw8PDQ6Ghofrss8906tQpZWZmKjAwUL169VLPnj1tPh4A4M5MhmEY+R0EAADO4OTJk4qKitLQoUPVo0eP/A4HAAAUAKzpBgAAAADAQSi6AQAAAABwEKaXAwAAAADgIIx0AwAAAADgIBTdAAAAAAA4CEU3AAAAAAAOQtENAAAAAICDUHQ/wLKzs7V//35lZ2fndyiAJHISzom8hLMhJ+GMyEs4m4KUkxTdDzDDMJSRkSFuQA9nQU7CGZGXcDbkJJwReQlnU5BykqIbAAAAAAAHoegGAAAAAMBBKLoBAAAAAHAQim4AAAAAABzENb8DAAAAgP0cP35c27ZtU9u2beXp6Znf4QD4i6ysLGVkZOR3GE4vKytLknTjxg25uLjkSwxubm52ObfNRfeOHTtUt27dez4xAAAA7K9///6SpGvXrqlnz575HA2AHIZh6I8//tClS5fyO5QHgmEYcnV11e+//y6TyZRvcfj4+Kh06dL3FIPNRXfPnj1VqlQpRUdHq127dgoMDLzrkwMAAMAxfv755/wOAcAtcgrugIAAeXt752sh+SAwDEPXr1+Xl5dXvrxXhmEoNTVV586dk6R7qnttLro3b96szz//XImJiZoxY4bq16+v9u3bq2nTpnJ3d7/rQAAAAACgIMrKyjIX3L6+vvkdzgPBMAxlZ2fL09Mz376g8PLykiSdO3dOAQEBdz3V3OYbqfn4+Cg2NlaJiYlauXKlKlasqLFjx6px48YaP368kpKS7ioQAAAA2A+jaIDzyFnD7e3tnc+RwFY5v7N7WYd/T3cvr1atmnr16qUuXbooNTVVK1euVHR0tJ5//nkdOXLkXg4NAAAAAAUKX4Y9eOzxO7urojsjI0NffvmlevXqpcjISG3ZskWjRo3S1q1btXHjRgUGBurVV1+95+AAAAAAAHiQ2byme9y4cVqzZo0kqU2bNhoyZIiqVq1q3u7t7a3XX39dkZGR9osSAAAAAAAHiIyMVGxsrLp27eqQ49tcdP/yyy9666231KxZs9veOC0gIEALFy685+AAAAAAAAXT9OnTtWHDBn322Wf5HYpD2Ty9vH///mrRokWugjszM1Pff/+9JMnV1VWPPfaYfSIEAAAAADiFmJgYrVq16r6e815uYuYMbC66Y2Njdfny5VztV69eVWxsrF2CAgAAwL3hhk0AnMGOHTv03HPPKSwsTLVr11anTp106tQprVq1SjNmzFBSUpKCgoIUFBRkLuaDgoK0dOlSDRw4UOHh4Zo1a5aysrI0fPhwRUZGKjQ0VM2bN9eCBQsszjVs2DC9/PLLmj9/vho1aqS6detqzJgxFkV7SkqK+vTpo9DQUEVGRurzzz93+Htg8/RywzDy/BC/dOmS+TlmAAAAAIC/ZxiG0tLS7us5PTw87tuXcpmZmerXr586dOigKVOmKCMjQ/v375fJZFKrVq105MgRbd68WQkJCZKkokWLmvedPn26+vXrp5EjR8rFxUXZ2dkqXbq03nvvPZUoUUJ79uzRqFGj5O/vr1atWpn327Fjh/z9/bVgwQIdP35cAwcOVLVq1dSxY0dJNwvzP/74QwsWLJCbm5vGjx+vlJQUh74PVhfd/fv3l3TzW9Nhw4ZZTC/PysrSTz/9pPDwcPtHCAAAAAAFjGEYeuONN5SUlHRfz1utWjVNmDDhvhTe165d09WrV/Xkk0+qQoUKkqTKlSubt3t7e8vFxUX+/v659n366afVtm1beXt7m2N95ZVXzNvLly+vPXv26Msvv7QouosXL65Ro0bJxcVFlStXVpMmTbR9+3Z17NhRx44d03fffafly5erVq1akqS4uDiL/R3B6qI751sHwzBUuHBheXp6mre5ubkpLCxMHTp0sH+EAAAAAFAAPQjLQP7zn/9o9uzZ5tc3btzQ3r17NW7cOHPb3LlzVbt27Vz7+vj4KDo6Wj169FDDhg1Vv359tWzZUgEBAXc8b0hISK62JUuW6NNPP9Xp06eVlpamjIwMBQcHW/SpUqWKXFxczK/9/f31888/S5KOHj0qV1dXi2NXrlxZxYoVu2M898Lqojs+Pl6SVLZsWXXv3l3e3t4OCwoAAAAACjKTyaQJEyY4/fTyTp06qWXLlubXgwcPVrNmzdSsWTNzW6lSpW67f3x8vGJiYrR582b997//1XvvvaeEhASFhYX97Xn/unR53bp1io+P1xtvvKHw8HAVLlxY8+fP1759+yz6ubpalrgmk0mGYeRqu59sXtOdM80cAAAAAHD3TCaTxQxiZ+Tj4yMfHx/za09PT/n6+uqhhx6y+hjVq1dX9erV9dJLL+lf//qX1qxZo7CwMLm5uSk7O9uqY+zevVvh4eHq0qWLue348eNWxyBJlSpVUmZmpg4ePKjQ0FBJ0q+//qorV67YdBxbWVV0t2vXTh999JGKFy+utm3b/u03A4mJiXYLDgAAAADwYDpx4oSWL1+uyMhIBQQE6NixY/rtt9/07LPPSro5i/rkyZM6fPiwSpUqpSJFiuR6NHWOChUqaPXq1dq8ebPKlSunzz77TAcOHFC5cuWsjqdSpUpq3LixRo4cqXHjxsnFxUX//ve/Hf7Fh1VFd1RUlPnimzZt6tCAAAAAAAAPPi8vL/36669KTEzUpUuXFBAQoC5duqhTp06SpObNm2v9+vWKjY3VlStXFB8fr+jo6DyP1blzZyUlJWngwIEymUxq3bq1nn/+eX333Xc2xRQfH6+RI0fqhRdekJ+fn1599VVNmzbtnq/175iMv05wxwMjKytLe/fuVVhYmMXNAoD8Qk7CGZGXcDaOzsk2bdpIujmdc8KECXY/PgomPisd68aNGzp27JgqVqzo9NPJnYVhGEpNTbW4e3l+sMfvrpCdYwIAAAAAAP8/q6aX16lTx+pvF3bu3HlPAQEAAODePQiPIgKAfwKriu7hw4c7Og4AAAAAAAocq+9eDgAAAAAAbGNV0X3t2jUVKVLE/PPfyekHAAAAAMA/ndVrurds2SJfX1/Vrl07zzVChmHIZDLp8OHDdg8SAAAAAIAHkVVF94IFC1S8eHFJ0sKFCx0aEAAAAAAABYVVRfdjjz2W588AAABwTty9HACcg1VF919dvnxZK1as0NGjR2UymVS5cmVFR0fLx8fHzuEBAAAAAPDgKmTrDjt37lRkZKQWLVqkK1eu6PLly1q0aJGioqJ4RjcAAAAAwOnExMQoLi4uX85tc9E9duxYtWrVShs3btSMGTM0Y8YMbdiwQa1bt9bYsWMdESMAAAAA4AG0atUq1a5dO7/DyFc2F93Hjx9Xt27d5OLiYm5zcXFR165ddfz4cbsGBwAAgLvDmm4AD5L09PT8DsFhbC66q1evrl9//TVX+6+//qpq1arZJSgAAAAAwIMhKSlJMTExCg8P16OPPqro6GgdOHBAO3bs0JtvvqmrV68qKChIQUFBmj59uiQpMjJSM2fO1LBhwxQREaG33npLkvTOO++oefPmCgsL0zPPPKP3339fGRkZ5nNNnz5dzz77rFavXq3IyEhFRERo4MCBunbtmrlPamqqhg4dqvDwcDVq1Egffvjh/X1D/sKqG6klJSWZf46NjVVcXJx+//131apVS5K0b98+LV68WIMHD3ZMlAAAAABQwBiGoaysrPt6ThcXF7vPhBk8eLCqVaum0aNHy8XFRYcPH5abm5vCw8M1fPhwTZs2TV9++aUkydvb27zf/Pnz9fLLL6tv377mtsKFCys+Pl7+/v46cOCA4uLiVLhwYfXq1cvc5/jx49q4caP+85//6MqVK3rttdc0d+5cDRw4UJI0adIk7dixQzNmzJCfn5+mTp2qgwcPKjg42K7XbS2riu62bdvKZDLJMAxz2zvvvJOr3+uvv65WrVrZFMDixYs1f/58JScn65FHHtHw4cP/ds7/zp07NWHCBB05ckQBAQHq2bOnOnfunGfftWvXatCgQYqKitLMmTNtigsAAAAAHMUwDG3btk0XL168r+ctUaKEGjRoYNfC+/Tp0+rRo4cqV64sSXr44YfN24oWLSqTySR/f/9c+9WrV089evSwaHv55Zcl3Xx/SpYsqdOnT2vdunUWRbdhGIqPj1eRIkUkSW3atNH27ds1cOBA/fnnn1qxYoUmTZqkhg0bSpImTJigJk2a2O16bWVV0b1x40aHnHzdunWKj4/X22+/rUcffVRLly5Vr169tHbtWpUpUyZX/xMnTqh3797q0KGD3nnnHf3www8aM2aMSpYsqebNm1v0PXXqlCZOnPiPX7QPAAAAAHfj888/19tvv21+PXfu3Dzrq27dumnkyJH67LPP1KBBA7Vo0UIVKlS44/FDQkJytX355ZdasGCBjh8/rj///FNZWVnm4jpH2bJlLdoCAgKUkpIi6WbNmJGRobCwMPN2Hx8fVaxY8Y7xOIpVRXfZsmUdcvKEhAS1b99eHTp0kCSNGDFCW7Zs0ZIlS/T666/n6r906VIFBgZqxIgRkqTKlSvrwIED+vDDDy2K7qysLA0ePFgDBgzQ7t27deXKFYfEDwAAAAB3w2QyqUGDBk49vTwyMtK8pFiSSpUqlWe/AQMG6Omnn9b//d//6bvvvtO0adM0depUPfXUU397fC8vL4vXe/fu1aBBgzRgwAA1bNhQbm5u+uabb5SQkGDRz9U1dxmbMyv71tnZzsKqojsvv/zyi06fPm2xqF2SoqKirNo/PT1dhw4dUu/evS3aGzZsqD179uS5z969e81TBHI0btxYK1euVEZGhtzc3CRJH3zwgUqWLKkOHTpo9+7d1l4SAAAAANw3JpMpzwLSWRQpUiTXKPPtVKxYURUrVlTXrl01aNAgrVy5Uk899ZTc3Nys/mLhhx9+UJkyZdS3b18ZhqHU1FSdPn3appgrVKggNzc37d271zx7+vLly/rtt99Up04dm45lLzb/hk+cOKF+/frp559/tljnnfNtyeHDh606zsWLF5WVlSVfX1+Ldj8/PyUnJ+e5z/nz5+Xn52fR5uvrq8zMTF28eFEBAQHavXu3VqxYodWrV9t4ZZays7Od8luSW+Uk7/3+dgy4HXISzoi8hLO5XzmZHzdowoOLz0rHysrKkmEY5n8FyY0bNzRp0iQ1b95c5cqV09mzZ3XgwAE1a9ZMhmGoTJkySk1N1bZt2xQcHCxPT095eXnlOTJdoUIFnTlzRmvWrFFISIg2bNig9evXW/S73Yh2znvr7e2t9u3b65133pGPj498fX313nvvmetVW9//nONmZWXl+fdx66O0b8fmojsuLk7lypXTRx99pKioKK1YsUIXL17UxIkT9cYbb9h6uFxTGwzD+NvpDnn1z2m/du2ahgwZonHjxqlkyZI2x3KrgwcP5hrFd1YHDhzI7xAAC+QknBF5CWfj6Jy8du2a9u7d69BzoODhs9JxXF1ddf36dWVnZ+d3KHaVkZGhlJQUvfHGG0pJSZGPj48iIyPVo0cPpaamKjg4WM8995wGDhyoS5cuqXfv3urTp48Mw1B6erpSU1PNx6pfv76ef/55jRs3Tunp6WrUqJF69uyp2bNnm/tlZGQoOzvbYr/09HTzyLgk9e/fX1euXFHfvn1VuHBhvfDCC7p8+bIyMjIs9rNGWlqaMjIyLJ7odauIiIg7HsNk2Fjq161bVwsWLFBwcLAiIiL06aefqlKlStq+fbsmTpxo9Qhzenq6wsLC9P7771vM9R8/frySkpL08ccf59qnS5cuqlatmkaOHGluW79+vV577TXt3btXv/zyi9q2bWvxbUNOUhcqVEhffvmlVQv6c/Zz9m+hsrKydODAAdWsWdOqb1gARyMn4YzISzgbR+dku3btJN28QdG4cePsfnwUTHxWOtaNGzf0+++/q2LFivL09MzvcB4IhmHo+vXr8vLysvsjzmxx48YNHTt2TA899FCevzuHjHRnZ2ercOHCkm7ebv7cuXOqVKmSypYtq2PHjll9HHd3d9WoUUNbt261KLq3bdt223XhYWFh2rRpk0Xbli1bFBISIjc3N1WqVElffPGFxfb33ntPf/75p0aMGKHSpUtbHV+hQoWs7pvfXFxc+HCEUyEn4YzISzgbR+ekyWQi52EzPisdI+fmZTn/YL38fs9yzn8vfxs2F92PPPKIfvrpJ5UvX161atXSvHnz5ObmpuXLl6t8+fI2Hatbt24aOnSoQkJCFB4ermXLlunMmTPq1KmTJGny5Mk6e/asJk2aJEnq1KmTFi9erPj4eHXs2FF79uzRypUrNXnyZEmSh4eHqlatanGOYsWKSVKudgAAAAAAHM3mortv3766fv26JOm1117TSy+9pC5dusjHx0dTp0616VitWrXSxYsXNXPmTJ07d05Vq1bVnDlzzI8oS05O1pkzZ8z9y5cvrzlz5ig+Pl6LFy9WQECARowYkesZ3QAAAP90jKYBgHOwuehu3Lix+efy5ctr3bp1unTpkooXL35XH+5dunRRly5d8tw2YcKEXG2PPfaYEhMTrT5+XscAAAAAAOB+uKeHwp05c0Ymk8mmtdIAAAAAAPxT2Fx0Z2ZmasaMGVq0aJH5duve3t564YUX1L9/f7m5udk9SAAAAAB40BW0x4X9E9jjd2Zz0T127Fht2LBBQ4YMUVhYmCRp7969mjFjhi5evKixY8fec1AAAAC4N6zpBpyHu7u7ChUqpNOnT8vf31/u7u78jd6BYRhKS0tToUKF8uW9ynmOeHJysgoVKiR3d/e7PpbNRffatWs1ZcoUNWnSxNwWHByswMBADRo0iKIbAAAgnxiGkd8hAMhDoUKFVLFiRZ05c0anT5/O73AeCIZhKCMjQ25ubvn6BYW3t7cqVKhwT4+Utrno9vDwULly5XK1lytXjqnlAAAA+YiiG3Be7u7uqlChgjIzM5WVlZXf4Ti9rKwsJSUlqUqVKvn27HgXFxe5urrec9Fvc9H9/PPPa+bMmYqPjzcPsaenp2vWrFl64YUX7ikYAAAA3D2KbsC5mUwmubm5MVhphZwvJjw9PfOt6LYXq4ru/v37W7zetm2bHn/8cQUHB0uSkpKSlJGRofr169s/QgAAAFiFmzQBgPOxquguWrSoxevmzZtbvA4MDLRfRAAAAAAAFBBWFd3x8fGOjgMAAAD3iJFuAHA+Nq/pznHhwgX9+uuvMplMqlixokqWLGnPuAAAAGAj1nQDgPOxuehOTU3VuHHj9Nlnn5m/TXVxcdGzzz6rt956S15eXnYPEgAAAHdG0Q0Azsfmh41NmDBB33//vWbNmqVdu3Zp165dmjlzpr7//ntNmDDBETECAADAChTdAOB8bC66v/rqK8XFxalJkyYqUqSIihQpoiZNmmjcuHH66quvHBEjAAAArHDrmu57fa4sAMA+bC66b9y4IT8/v1ztvr6+unHjhl2CAgAAgO0Y6QYA52Nz0R0WFqZp06YpLS3N3Hbjxg3NmDFDYWFh9owNAAAANqDoBgDnY/ON1IYPH65evXrp8ccfV3BwsEwmkw4fPiwPDw/Nnz/fETECAADAChTdAOB8bC66g4KC9PXXX+vzzz/Xr7/+KsMw1Lp1az3zzDPy9PR0RIwAAACwwq1ruinAAcA52FR0Z2RkqEWLFpo9e7Y6duzoqJgAAABwjyi6AcA52LSm283NTenp6dwNEwAAwAkx0g0AzsfmG6nFxMRo7ty5yszMdEQ8AAAAuEu3FtoU3QDgHGxe071v3z5t375dW7ZsUVBQkLy8vCy2z5gxw27BAQAAwHoU3QDgfGwuuosVK6bmzZs7IhYAAADcA4puAHA+Nhfd8fHxjogDAAAA94g13QDgfKwuurOzs/Xhhx9qw4YNyszMVIMGDdSvXz95eHg4Mj4AAABYiZFuAHA+Vt9Ibe7cuZo8ebK8vb3l7++vhIQEjR8/3pGxAQAAwAYU3QDgfKwe6V61apVGjhypLl26SJK+++479evXT2PHjuURYgAAAE6AohsAnI/VI92nT5/Wk08+aX7duHFjGYahc+fOOSQwAAAA2IaiGwCcj9VFd0ZGhjw9Pc2vTSaT3NzclJ6e7pDAAAAAYBuKbgBwPjbdvfy9996zeC53RkaGZs2apaJFi5rb3nzzTftFBwAAAKtRdAOA87G66K5Tp46OHTtm0RYeHq4TJ06YX7O2GwAAIP/c+siwW38GAOQfq4vuRYsWOTIOAAAA3CNGtwHA+Vi9phsAAADO7daim5FuAHAOFN0AAAAFBCPdAOB8KLoBAAAKCEa6AcD5UHQDAAAUEIx0A4DzoegGAAAoILh7OQA4H6vuXp6UlGT1AYODg+86GAAAANw9RroBwPlYVXS3bdtWJpNJhmHc8Vnchw8ftktgAAAAsA1rugHA+VhVdG/cuNH88+HDhzVx4kT16NFDYWFhkqS9e/cqISFBQ4YMcUiQAAAAuLNbi25GvQHAOVhVdJctW9b886uvvqqRI0eqSZMm5rbg4GAFBgbq/fffV9OmTe0fJQAAAO7o1tFtim4AcA4230jt559/Vrly5XK1lytXTr/88otdggIAAMC9oegGAOdgc9FduXJlzZw5U2lpaea29PR0zZw5U5UrV7ZrcAAAALAeI90A4Hysml5+qzFjxqhPnz5q0qSJ+U7lSUlJMplMmj17ts0BLF68WPPnz1dycrIeeeQRDR8+XLVr175t/507d2rChAk6cuSIAgIC1LNnT3Xu3Nm8ffny5Vq9erWOHDkiSapRo4YGDRqk0NBQm2MDAAB4kLCmGwCcj80j3aGhodq4caMGDhyooKAgVa1aVYMGDdLGjRttLmzXrVun+Ph49e3bV6tXr1ZERIR69eql06dP59n/xIkT6t27tyIiIrR69Wr16dNHcXFx+uqrr8x9duzYodatW2vhwoVaunSpAgMD1b17d509e9bWSwUAAHigUHQDgPOxeaRbkry8vPSvf/3rnk+ekJCg9u3bq0OHDpKkESNGaMuWLVqyZIlef/31XP1ziugRI0ZIujnV/cCBA/rwww/VvHlzSdLkyZMt9hk/fry++uorbd++XW3btr3nmAEAAJwVRTcAOB+bR7olafXq1ercubMaNWqkU6dOSZI++ugjbdiwwepjpKen69ChQ2rUqJFFe8OGDbVnz54899m7d68aNmxo0da4cWMdPHhQGRkZee5z/fp1ZWZmqnjx4lbHBgAA8CBiTTcAOB+bR7o/+eQTTZs2TS+++KJmzZpl/nAvVqyYFixYYPUjwy5evKisrCz5+vpatPv5+Sk5OTnPfc6fPy8/Pz+LNl9fX2VmZurixYsKCAjItc/kyZNVqlQpNWjQwKq4cmRnZzv9f6yysrIs/hfIb+QknBF5CWfjyJy89ZiGYZD3sBqflXA2D0pOuri43LGPzUX3xx9/rPHjx6tp06aaM2eOuT0kJEQTJ0609XAymUwWrw3DyNV2p/55tUvS3LlztXbtWi1cuFAeHh42xfV3o+fO5sCBA/kdAmCBnIQzIi/hbByRk0ePHjX/nJ6err1799r9HCjY+KyEs3H2nIyIiLhjH5uL7pMnT6patWq52t3d3XX9+nWrj1OiRAm5uLjo/PnzFu0pKSm5RrNz5DUKfuHCBbm6usrHx8eiff78+Zo9e7YSEhLMd1m3RUhIyAMx0n3gwAHVrFnTqm9YAEcjJ+GMyEs4G0fm5K0DBq6urgoLC7Pr8VFw8VkJZ1OQctLmortcuXI6fPiwypYta9H+3XffqUqVKlYfx93dXTVq1NDWrVv11FNPmdu3bdumqKioPPcJCwvTpk2bLNq2bNmikJAQubm5mdvmzZunWbNmaf78+apZs6bVMd2qUKG7Wu6eL1xcXB74RETBQk7CGZGXcDaOzknDMMh52IzPSjibgpCTNhfdPXr00NixY5Weni5J2r9/v9asWaM5c+Zo/PjxNh2rW7duGjp0qEJCQhQeHq5ly5bpzJkz6tSpk6Sb67HPnj2rSZMmSZI6deqkxYsXKz4+Xh07dtSePXu0cuVKizuWz507V++//74mT56ssmXLmkfGvb29VbhwYVsvFwAA4IHk7DP2AOCfwuaiu3379srKytI777yj69ev6/XXX1epUqU0fPhwtW7d2qZjtWrVShcvXtTMmTN17tw5Va1aVXPmzDGPoicnJ+vMmTPm/uXLl9ecOXMUHx+vxYsXKyAgQCNGjDA/LkySlixZooyMDL3yyisW5+rfv78GDBhg6+UCAAA8MLh7OQA4n7t6TnfHjh3VsWNHXbhwQYZh5LoDuS26dOmiLl265LltwoQJudoee+wxJSYm3vZ433zzzV3HAgAA8CDjOd0A4HxsXrgcGxurK1euSJJKlixpLrivXbum2NhY+0YHAAAAq1F0A4Dzsbno3rlzZ56P0kpLS9Pu3bvtEhQAAABsR9ENAM7H6unlSUlJ5p9/+eUXi0d3ZWdna/PmzSpVqpR9owMAAIDVbl3TfevPAID8Y3XR3bZtW5lMJplMJr344ou5tnt6emrkyJF2DQ4AAAAAgAeZ1UX3xo0bZRiGmjZtqk8//VQlS5Y0b3Nzc5Ovr+8D//w0AACABxkj3QDgfKwuunMe43XrNHMAAAA4D9ZxA4DzsflGarNnz9aKFStyta9YsUJz5syxS1AAAACw3a1FNyPdAOAcbC66ly1bpkqVKuVqf+SRR7R06VK7BAUAAADbMdINAM7H5qI7OTlZ/v7+udpLlixpcUdzAAAA3F+s6QYA52Nz0R0YGKgffvghV/vu3bsVEBBgl6AAAABgu7+OdDPyDQD5z+obqeV47rnn9O9//1uZmZmqV6+eJGn79u1655131L17d7sHCAAAAOvkVXSbTKZ8igYAIN1F0d2rVy9dvnxZY8aMUUZGhiTJw8NDPXv21EsvvWT3AAEAAGAdRroBwPnYXHSbTCYNGTJEL7/8so4ePSpPT089/PDDcnd3d0R8AAAAsBJFNwA4H5uL7hyFCxdWaGioPWMBAADAPaDoBgDnY1XR3b9/f02YMEFFihRR//79/7bvjBkz7BIYAAAAbEPRDQDOx6qiu2jRonn+DAAAAOfx18eEUXQDQP6zquiOj4/P82cAAAA4D0a6AcD52PycbgAAADgnim4AcD5WjXS3bdvW6mc8JiYm3lNAAAAAuDsU3QDgfKwqups2bWr+OS0tTZ988omqVKmisLAwSdK+fft05MgRPf/88w4JEgAAAHdG0Q0Azsfqu5fnGDFihGJiYvTaa69Z9Jk2bZrOnDlj1+AAAABgPYpuAHA+Nq/p/vLLL9W2bdtc7W3atNHXX39tj5gAAABwF7h7OQA4H5uLbk9PT+3evTtX++7du+Xh4WGXoAAAAGA7RroBwPlYNb38Vi+++KJGjx6tQ4cOqVatWpJuruleuXKl+vXrZ/cAAQAAYB2KbgBwPjYX3b1791a5cuW0cOFCrVmzRpJUqVIlxcfHq1WrVnYPEAAAANb5a5H91+nmAID7z+aiW5JatWpFgQ0AAOBkKLIBwPnYvKZbkq5cuaJPP/1UU6ZM0aVLlyRJhw4d0tmzZ+0ZGwAAAO4BRTgA5D+bR7qTkpLUrVs3FS1aVKdOnVKHDh3k4+Oj9evX6/Tp05o0aZIj4gQAAMAdUGQDgPOxeaR7woQJateunb7++mu5u7ub2x9//HHt2rXLrsEBAADAeqzpBgDnY3PRfeDAAXXq1ClXe6lSpZScnGyXoAAAAGA7imwAcD42F90eHh66du1arvZjx46pZMmSdgkKAAAAtktLS7N4TREOAPnP5qI7KipKH3zwgTIyMsxtp0+f1uTJk9WsWTO7BgcAAADrXb9+3eI1z+kGgPxnc9H9xhtv6MKFC2rQoIHS0tIUExOjZs2aqXDhwho4cKAjYgQAAIAVKLoBwPnYfPfyIkWKaMmSJdq+fbt+/PFHZWdnq0aNGmrQoIEj4gMAAICVKLoBwPnYVHRnZmYqNDRUq1evVv369VW/fn1HxQUAAAAbUXQDgPOxaXq5q6urypQpw005AAAAnNCNGzcsXlN0A0D+s3lNd9++fTV58mRdunTJAeEAAADgbjHSDQDOx+Y13YsWLdLvv/+uxo0bq0yZMvL29rbYnpiYaLfgAAAAYD2KbgBwPjYX3VFRUTKZTI6IBQAAAPeAohsAnI/NRfeAAQMcEQcAAADuQWZmpjIyMiTdvA9PZmYmRTcAOAGr13Rfv35dY8aMUePGjVW/fn29/vrrunDhgiNjAwAAgJVuvYmal5eXJEa6AcAZWF10T5s2TYmJiXriiSfUunVrbd26VaNHj3ZgaAAAALBWztRyV1dXubm5SaLoBgBnYHXRvX79esXFxWncuHEaOXKk5syZo40bNyorK+ueAli8eLEiIyNVs2ZNRUdHa9euXX/bf+fOnYqOjlbNmjUVFRWlJUuW5Orz1VdfqVWrVgoJCVGrVq20fv36e4oRAADA2eUU3V5eXub771B0A0D+s7ro/uOPP1S7dm3z69DQULm4uOjcuXN3ffJ169YpPj5effv21erVqxUREaFevXrp9OnTefY/ceKEevfurYiICK1evVp9+vRRXFycvvrqK3OfPXv2aODAgXr22Wf12Wef6dlnn9Vrr72mffv23XWcAAAAzi41NVUSRTcAOBuri+6srCzzVKUcLi4uyszMvOuTJyQkqH379urQoYMqV66sESNGqHTp0nmOXkvS0qVLFRgYqBEjRqhy5crq0KGDoqOj9eGHH5r7LFiwQA0aNNBLL72kypUr66WXXlK9evW0YMGCu44TAADA2f3www+SKLoBwNlYffdywzA0bNgwubu7m9vS09M1evRo8806JGnGjBlWHS89PV2HDh1S7969LdobNmyoPXv25LnP3r171bBhQ4u2xo0ba+XKlcrIyJCbm5v27t2rrl275upT0Iru9PR0/d///Z/OnDmjkydP8hg3J/RP/D86hmHo8uXLOnHihFPn5D/xd/OgcMTvxjAMXblyRb///rtNeUmeOK8H/XeTk5PHjh2z22fln3/+qcOHD6tGjRry8fFRdna2AgICtGHDBh06dMh8nlvP58yf07j/DMPQpUuXdOrUKXIDTsFkMqlIkSL5HYZdWF10t2vXLldbmzZt7vrEFy9eVFZWlnx9fS3a/fz8lJycnOc+58+fl5+fn0Wbr6+vMjMzdfHiRQUEBOj8+fO5junr63vbY95Odna2U/9Hfdu2bUpLS1PJkiXzOxTAwl///gBn8Nf/dgD5zdPT067H8/DwyDUwAdjCZDLx/yvhdI4dO6YGDRrkdxh/y8XF5Y59rC664+Pj7ymY2/nrN2mGYfztt2t59f9ru63HzMvBgwfNz7p0RoUKFVJycjLfRAJitAZwFvwt5i8vLy+5u7vL09NTLi4uunDhgvnmas48kAAAeTEMQ/7+/jpw4EB+h/K3IiIi7tjH6qLb3kqUKCEXFxedP3/eoj0lJeW2IxJ5jYJfuHBBrq6u8vHxMff56zEvXLhg8yhHSEiI0/8Hql69ejpw4IBq1qxp1TcsgKNlZWWRk3A65CWcDTkJZ0RewtkUpJzMt6Lb3d1dNWrU0NatW/XUU0+Z27dt26aoqKg89wkLC9OmTZss2rZs2aKQkBDzTd7CwsK0detWi3XdW7ZsUXh4uE3xFSpk9T3m8p2Li8sDn4goWMhJOCPyEs6GnIQzIi/hbApCTuZrZdmtWzetWLFCK1as0NGjR/Xvf/9bZ86cUadOnSRJkydP1tChQ839O3XqpNOnTys+Pl5Hjx7VihUrtHLlSnXv3t3cJzY2Vlu3btWcOXN09OhRzZkzR9u3b9eLL754368PAAAAAPDPlm8j3ZLUqlUrXbx4UTNnztS5c+dUtWpVzZkzR2XLlpUkJScn68yZM+b+5cuX15w5cxQfH6/FixcrICBAI0aMUPPmzc19Hn30UU2ZMkXvvfeepk2bpvLly2vq1KmqVavWfb8+AAAAAMA/W74W3ZLUpUsXdenSJc9tEyZMyNX22GOPKTEx8W+P2aJFC7Vo0cIu8QEAAAAAcLcenIXLAAAAAAA8YEyGs9+iGwAAAACABxQj3QAAAAAAOAhFNwAAAAAADkLRDQAAAACAg1B0AwAAAADgIBTdAAAAAAA4CEU3AAAAAAAOQtENAAAAAICDUHQDAAAAAOAgFN0AAAAAADgIRfcDavHixYqMjFTNmjUVHR2tXbt25XdIKKBmz56t9u3bKzw8XPXr19fLL7+sX3/91aKPYRiaPn26GjVqpNDQUMXExOjIkSMWfdLT0zVu3DjVrVtXYWFh6tOnj/7444/7eSkooGbPnq2goCDFxcWZ28hJ5IezZ89q8ODBqlu3rmrVqqVnn31WBw8eNG8nL3G/ZWZmaurUqYqMjFRoaKiioqI0Y8YMZWdnm/uQl3Ck77//Xn369FGjRo0UFBSkDRs2WGy3V/5dvnxZQ4YMUUREhCIiIjRkyBBduXLF4ddnLYruB9C6desUHx+vvn37avXq1YqIiFCvXr10+vTp/A4NBdDOnTvVpUsXLV++XAkJCcrKylKPHj2Umppq7jN37lwlJCRo1KhRWrFihfz8/NStWzddu3bN3CcuLk7r16/X1KlT9cknnyg1NVUvvfSSsrKy8uOyUEDs379fy5YtU1BQkEU7OYn77fLly+rcubPc3Nw0d+5crV27VsOGDVOxYsXMfchL3G9z587V0qVLNWrUKK1bt05DhgzR/PnztWjRIos+5CUcJTU1VUFBQRo1alSe2+2Vf6+//rqSkpI0b948zZs3T0lJSRo6dKjDr89qBh44zz33nDFq1CiLthYtWhjvvvtuPkWEf5KUlBSjatWqxs6dOw3DMIzs7GyjYcOGxuzZs8190tLSjIiICGPJkiWGYRjGlStXjBo1ahhr16419/njjz+M4OBg47vvvru/F4AC49q1a0azZs2MrVu3Gi+88IIxfvx4wzDISeSPd955x+jcufNtt5OXyA+9e/c23nzzTYu2/v37G4MHDzYMg7zE/VW1alVj/fr15tf2yr9ffvnFqFq1qrF3715znz179hhVq1Y1jh496ujLsgoj3Q+Y9PR0HTp0SI0aNbJob9iwofbs2ZNPUeGf5OrVq5Kk4sWLS5JOnjyp5ORki5x0d3dXnTp1zDl58OBBZWRkqGHDhuY+pUqV0iOPPELe4q6NHTtWTZo0UYMGDSzayUnkh2+++UYhISF65ZVXVL9+fbVt21bLly83bycvkR8iIiL0v//9T8eOHZMkJSUlaffu3WrSpIkk8hL5y175t2fPHhUtWlS1atUy9wkLC1PRokWdJkdd8zsA2ObixYvKysqSr6+vRbufn5+Sk5PzKSr8UxiGofj4eEVERKhq1aqSZM67vHIyZ8nD+fPn5ebmZi7Ub+1z/vz5+xA5Cpq1a9fqxx9/1IoVK3JtIyeRH06cOKElS5aoW7du6tOnj/bv36/x48fL3d1dbdu2JS+RL3r16qWrV6+qZcuWcnFxUVZWlgYOHKinn35aEp+XyF/2yr/z58/nOkbOcZ0lRym6H1Amk8nitWEYudoAexs7dqx+/vlnffLJJ7m25ZWTd2JNH+Cvzpw5o7i4OH344Yfy8PC4bT9yEveTYRgKCQnRoEGDJEnVq1fXL7/8oiVLlqht27bmfuQl7qd169bp888/1+TJk1WlShUdPnxY8fHxCggIULt27cz9yEvkJ0flnzPVR0wvf8CUKFFCLi4uub61SUlJkZ+fXz5FhX+CcePG6ZtvvtGCBQtUunRpc7u/v78k/W1O+vn5KSMjQ5cvX75tH8Bahw4dUkpKiqKjo1W9enVVr15dO3fu1KJFi1S9enVzTpGTuJ/8/f1VuXJli7ZKlSqZR2v4rER+mDRpknr37q3WrVsrKChIbdu21YsvvqjZs2dLIi+Rv+yVf35+fkpJScl1/AsXLuQ5Ap4fKLofMO7u7qpRo4a2bt1q0b5t2zaFh4fnU1QoyAzD0NixY/X1119rwYIFKl++vMX2cuXKyd/f3yIn09PT9f3335tzMiQkRG5ubhZ9zp07pyNHjpC3sFm9evX0xRdfaPXq1eZ/ISEheuaZZ7R69WqVL1+enMR99+ijj5rXzeb47bffVLZsWUl8ViJ/3LhxI9dIn4uLi3mUkLxEfrJX/oWHh+vq1avav3+/uc++fft09epVp8lRppc/gLp166ahQ4cqJCRE4eHhWrZsmc6cOaNOnTrld2gogMaMGaM1a9Zo5syZKly4sHn9TdGiReXp6SmTyaTY2FjNnj1bDz/8sB566CHNnj1bnp6e5jVjRYsWVfv27TVx4kSVKFFCxYsX18SJE1W1atVcN8EC7qRIkSLmewrk8Pb2lo+Pj7mdnMT99uKLL6pz5876z3/+o5YtW2r//v1avny5xo4dK0l8ViJfPPnkk/rPf/6jMmXKmKeXJyQkqH379pLISzjen3/+qePHj5tfnzx5UocPH1bx4sVVpkwZu+Rf5cqV1bhxY40cOdL8mfvWW2/pySefVKVKle7/RefBZLAg44G0ePFizZ8/X+fOnVPVqlX15ptvqk6dOvkdFgqgvz7/OEd8fLyio6Ml3RwNnzFjhpYtW6bLly+rVq1aGjVqlEVhlJaWpkmTJmnNmjW6ceOG6tevr7fffluBgYH35TpQsMXExCg4OFgjRoyQRE4if2zatElTpkzRb7/9pnLlyqlbt27q2LGjeTt5ifvt2rVrev/997VhwwalpKQoICBArVu3Vr9+/eTu7i6JvIRj7dixQ7Gxsbna27VrpwkTJtgt/y5duqTx48frm2++kSRFRkZq1KhRKlasmOMv0goU3QAAAAAAOAhrugEAAAAAcBCKbgAAAAAAHISiGwAAAAAAB6HoBgAAAADAQSi6AQAAAABwEIpuAAAAAAAchKIbAAAAAAAHoegGAAAAAMBBKLoBAECeTp48qaCgIB0+fPhv+8XExCguLu4+RQUAwIPFZBiGkd9BAACAuzds2DAlJiZKklxdXVW6dGk1a9ZMAwYMkLe3910fNysrSxcuXFCJEiXk6uqqHTt2KDY2Vt9//72KFStm7nfp0iW5urqqSJEi93wtAAAUNK75HQAAALh3jRs3Vnx8vDIzM7Vr1y6NHDlSqampGjNmzF0f08XFRf7+/nfs5+Pjc9fnAACgoGN6OQAABYC7u7v8/f0VGBioZ555Rs8884w2btyo9PR0jR8/XvXr11fNmjXVuXNn7d+/37zf5cuX9frrr6tevXoKDQ1Vs2bNtHLlSkmW08tPnjyp2NhYSVKdOnUUFBSkYcOGSco9vfzy5csaOnSo6tSpo1q1aqlnz5767bffzNtXrVql2rVra/PmzWrZsqXCw8PVo0cPnTt37j68UwAA3F8U3QAAFECenp7KyMjQpEmT9NVXX2nChAlKTEzUQw89pJ49e+rSpUuSpPfff19Hjx7V3LlztW7dOo0ePVolSpTIdbzAwEBNnz5dkvTll19qy5YtGjFiRJ7nHjZsmA4ePKhZs2Zp2bJlMgxDvXv3VkZGhrnPjRs39OGHH2rSpEn6+OOPdebMGU2cONH+bwQAAPmMohsAgAJm//79+uKLL1S3bl0tXbpUQ4cOVZMmTVSlShWNGzdOHh4eWrFihSTp9OnTqlatmmrWrKly5cqpQYMGioyMzHVMFxcXFS9eXJLk6+srf39/FS1aNFe/3377Td98843Gjx+v2rVrKzg4WO+++67Onj2rDRs2mPtlZGRozJgxqlmzpmrUqKEuXbrof//7n4PeEQAA8g9rugEAKAC+/fZbhYeHKzMzU5mZmYqKilJMTIy++uorPfroo+Z+bm5uCg0N1dGjRyVJnTt31iuvvKIff/xRDRs2VNOmTS362+ro0aNydXVVrVq1zG0lSpRQxYoVzeeUJC8vL1WoUMH8OiAgQCkpKXd9XgAAnBVFNwAABUDdunU1evRoubq6KiAgQG5ubkpKSpIkmUwmi76GYZjbmjRpok2bNunbb7/Vtm3b1LVrV3Xp0kVvvPHGXcVxu4ei3HpO6eZd1m9lMpluuy8AAA8yppcDAFAAeHl56aGHHlLZsmXl5uYmSapQoYLc3Ny0e/duc7+MjAwdPHhQlStXNreVLFlS0dHRevfddzV8+HAtW7Ysz3PkHDcrK+u2cVSpUkWZmZnat2+fue3ixYv67bffLM4JAMA/BSPdAAAUUN7e3urcubMmTZqk4sWLq0yZMpo3b55u3Lih5557TtLNG6nVqFFDjzzyiNLT0/Xtt9/etjguW7asTCaTvv32WzVp0kQeHh4qXLiwRZ+HH35YUVFReuuttzRmzBgVKVJE7777rkqVKqWoqCiHXzMAAM6GohsAgAJs8ODBMgxDQ4cO1Z9//qmQkBDNmzfPfFM0Nzc3TZkyRadOnZKnp6ciIiI0ZcqUPI9VqlQpDRgwQJMnT9abb76ptm3basKECbn6xcfHKy4uTn369FFGRoZq166tOXPmmEfKAQD4JzEZLKACAAAAAMAhWNMNAAAAAICDUHQDAAAAAOAgFN0AAAAAADgIRTcAAAAAAA5C0Q0AAAAAgINQdAMAAAAA4CAU3QAAAAAAOAhFNwAAAAAADkLRDQAAAACAg1B0AwAAAADgIBTdAAAAAAA4CEU3AAAAAAAO8v8BI5L8IWYIIjUAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "y_logits, y_logcounts = predict(model, X_bar)\n", "y_logits = torch.softmax(y_logits.reshape(1, -1), dim=-1).reshape(*y_logits.shape)\n", "\n", "plt.figure(figsize=(10, 2.5))\n", "plt.plot(y_logits[0, 0], c='0.3', label=\"+ strand\")\n", "plt.plot(y_logits[0, 1], c='0.7', label=\"- strand\")\n", "\n", "plt.title(\"ProCapNet Profile Predictions\")\n", "plt.ylabel(\"Predicted Probability\")\n", "plt.xlabel(\"Position\")\n", "\n", "plt.legend()\n", "plt.tight_layout()\n", "seaborn.despine(bottom=True, left=True)\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "6050d270-07d0-4517-a6d6-1d72d40eb6b2", "metadata": {}, "source": [ "Perfect. Now we see a sharp spike on the positive strand, and this peak is much sharper than the original predictions on the endogenous sequence." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.13.5" } }, "nbformat": 4, "nbformat_minor": 5 }