{ "cells": [ { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "JdmDoI8U8RvW" }, "source": [ "\n", "*This notebook contains material from [PyRosetta](https://RosettaCommons.github.io/PyRosetta.notebooks);\n", "content is available [on Github](https://github.com/RosettaCommons/PyRosetta.notebooks.git).*" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "2gfBr3ZVNLQE" }, "source": [ "\n", "< [*De Novo* Protein Design with PyRosetta](http://nbviewer.jupyter.org/github/RosettaCommons/PyRosetta.notebooks/blob/master/notebooks/06.07-Introduction-to-DeNovo-protein-design.ipynb) | [Contents](toc.ipynb) | [Index](index.ipynb) | [Docking](http://nbviewer.jupyter.org/github/RosettaCommons/PyRosetta.notebooks/blob/master/notebooks/07.00-Protein-Docking.ipynb) >

\"Open" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "tfY7I5ms8Rvf" }, "source": [ "# **Point Mutation Scan**\n", "\n", "Keywords: FastRelax, ResidueSelector, NeighborhoodResidueSelector, TaskFactory, TaskOperation, RestrictToRepackingRLT, RestrictAbsentCanonicalAASRLT, NoRepackDisulfides, OperateOnResidueSubset, RigidBodyTransMover, ggplot2\n", "\n", "## Overview\n", "The purpose of this section is to create a protocol using what you have learned in the previous sections. In this tutorial, we will prepare an antibody-antigen bound structure, make point mutations on the antibody, records changes in binding enregy, and generate a heatmap demonstrating energy differences. This method is widely used in antibody interface design for either improving binding affinity or expanding the binding range. \n", "\n", "\n", "\n", "## Protocol\n", "The whole protocol is broken down by eight steps.\n", "\n", "**Step 1.** Prepare the structure with FastRelax()\n", "\n", "**Step 2.** Write the function to perform the mutation PackMover()\n", "\n", "**Step 3.** Write the function to unbind the antibody-antigen bound structure unbind()\n", "\n", "**Step 4.** Write the function to get wildtype amino acid\n", "\n", "**Step 5.** Write the function to properly mutate and pack a specific residue and output energy metrics\n", "\n", "**Step 6.** Loop through interface positions mutating them into 20 amino acids with output files\n", "\n", "**Step 7.** Summarize all input files for binding energy analysis\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "i7Ft-iITfib-" }, "source": [ "## **Section Contributors:**\n", "Yuanhan Wu (The Wistar Institute)\n", "\n", "Daniel Kulp (The Wistar Institute)\n", "\n", "Jared Adolf-Bryfogle (Scripps; Institute for Protein Innovation)\n", "\n", "Ajasja Ljubetič (University of Washington)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "NQBxdWtegQpX" }, "source": [ "### Set up notebook" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 85 }, "colab_type": "code", "executionInfo": { "elapsed": 4889, "status": "ok", "timestamp": 1583520330814, "user": { "displayName": "Yuanhan Wu", "photoUrl": "", "userId": "03333451059275340958" }, "user_tz": 300 }, "id": "-1bN0zDc8Rvj", "outputId": "975250d0-77d4-43a9-aba8-5c255f4d67f9" }, "outputs": [], "source": [ "!pip install pyrosettacolabsetup\n", "import pyrosettacolabsetup; pyrosettacolabsetup.install_pyrosetta()\n", "import pyrosetta; pyrosetta.init()\n" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "193kixKl8Rvx" }, "source": [ "**Make sure you are in the directory with the pdb files:**\n", "\n", "`cd google_drive/MyDrive/student-notebooks/`" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "JkMqBiLZ-i7K" }, "source": [ "### Loading structures " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 768 }, "colab_type": "code", "executionInfo": { "elapsed": 1449, "status": "ok", "timestamp": 1583520334457, "user": { "displayName": "Yuanhan Wu", "photoUrl": "", "userId": "03333451059275340958" }, "user_tz": 300 }, "id": "CUe-0OB78Rv0", "outputId": "0fedc288-0355-4947-d81d-a154c16322c0" }, "outputs": [], "source": [ "from pyrosetta import * \n", "init()\n", "pose = pose_from_pdb(\"inputs/1jhl.clean.pdb\")\n", "testPose = Pose()\n", "testPose.assign(pose)\n", "print(testPose)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "qTi7EVQn8Rv6" }, "source": [ "## **Step 1. Prepare the starting structure with FastRelax()**\n", "\n", "Properly relaxing a structure is crucial in design with Rosetta. A non relaxed structure may not overcome bad global energy well and therefore skew the following analysis on binding energy.\n", "\n", "A FastRelax() is used to relax the structrue. While we want to put the sturcture in its lowest energy state, we want to keep the backbone information from the crystal structure as much as possible (lowest RMSD). Therefore, we apply constrain_relax_to_start_coords(True) to FastRelax().\n", "\n", "Since FastRelax() is taking up a huge amount of resource, running it seems to crash the notebook, we commented out the \"apply\" part (the part that perform the relax) and print out the relaxMover() instead. We uploaded the relaxed structure to the input folder for furthre analysis.\n", "\n", "Coordinate constrained relax is a general prep. For a more advanced version of this preparation method, see the [ pareto-optimal method by Nivon, Morreti, and Baker ](https://journals.plos.org/plosone/article?id=10.1371/journal.pone.0059004)\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 85 }, "colab_type": "code", "executionInfo": { "elapsed": 274, "status": "ok", "timestamp": 1583520337756, "user": { "displayName": "Yuanhan Wu", "photoUrl": "", "userId": "03333451059275340958" }, "user_tz": 300 }, "id": "Fajoeayb8Rv7", "outputId": "e8a5826d-1f24-4a75-cead-b26402321408" }, "outputs": [], "source": [ "from pyrosetta.rosetta.protocols.relax import FastRelax\n", "\n", "relax = FastRelax()\n", "scorefxn = get_fa_scorefxn()\n", "relax.set_scorefxn(scorefxn)\n", "relax = rosetta.protocols.relax.FastRelax()\n", "relax.constrain_relax_to_start_coords(True)\n", "print(relax)\n", "#relax.apply(testPose)\n", "#testPose.dump_pdb('test.relax.pdb')" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "-ZuDYWJECc3p" }, "source": [ "### Writing Function in Python\n", "\n", "Functions are good ways to organize your code. Starting from this section I am introducing serveral functions to facilitate the protocol.\n", "\n", "To define a function in python, a \"def\" key word is used. A function can either returns a value or simply executing code blocks. A defined function can be called in main function or other sections of code too." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "C5z5OqAc8RwP" }, "source": [ "## **Step 2. Write the function for mutation**\n", "\n", "This function utilizes the **ResidueSelectorMover()** as demonstrated by previous tutorials. Mutated position is allowed to be designed and repacked while the neighborhood residues are limited to repacked only. The final mutation will be performed with a **PackMover()**." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 1000 }, "colab_type": "code", "executionInfo": { "elapsed": 3655, "status": "ok", "timestamp": 1583520344105, "user": { "displayName": "Yuanhan Wu", "photoUrl": "", "userId": "03333451059275340958" }, "user_tz": 300 }, "id": "VRirfC0d8RwQ", "outputId": "72303409-9834-4420-9186-5eb599d3f6a3" }, "outputs": [], "source": [ "from pyrosetta.rosetta.core.pack.task import *\n", "from pyrosetta.rosetta.protocols import *\n", "from pyrosetta.rosetta.core.select import *\n", "\n", "def pack(pose, posi, amino, scorefxn):\n", "\n", " # Select Mutate Position\n", " mut_posi = pyrosetta.rosetta.core.select.residue_selector.ResidueIndexSelector()\n", " mut_posi.set_index(posi)\n", " #print(pyrosetta.rosetta.core.select.get_residues_from_subset(mut_posi.apply(pose)))\n", "\n", " # Select Neighbor Position\n", " nbr_selector = pyrosetta.rosetta.core.select.residue_selector.NeighborhoodResidueSelector()\n", " nbr_selector.set_focus_selector(mut_posi)\n", " nbr_selector.set_include_focus_in_subset(True)\n", " #print(pyrosetta.rosetta.core.select.get_residues_from_subset(nbr_selector.apply(pose)))\n", "\n", " # Select No Design Area\n", " not_design = pyrosetta.rosetta.core.select.residue_selector.NotResidueSelector(mut_posi)\n", " #print(pyrosetta.rosetta.core.select.get_residues_from_subset(not_design.apply(pose)))\n", "\n", " # The task factory accepts all the task operations\n", " tf = pyrosetta.rosetta.core.pack.task.TaskFactory()\n", "\n", " # These are pretty standard\n", " tf.push_back(pyrosetta.rosetta.core.pack.task.operation.InitializeFromCommandline())\n", " tf.push_back(pyrosetta.rosetta.core.pack.task.operation.IncludeCurrent())\n", " tf.push_back(pyrosetta.rosetta.core.pack.task.operation.NoRepackDisulfides())\n", "\n", " # Disable Packing\n", " prevent_repacking_rlt = pyrosetta.rosetta.core.pack.task.operation.PreventRepackingRLT()\n", " prevent_subset_repacking = pyrosetta.rosetta.core.pack.task.operation.OperateOnResidueSubset(prevent_repacking_rlt, nbr_selector, True )\n", " tf.push_back(prevent_subset_repacking)\n", "\n", " # Disable design\n", " tf.push_back(pyrosetta.rosetta.core.pack.task.operation.OperateOnResidueSubset(\n", " pyrosetta.rosetta.core.pack.task.operation.RestrictToRepackingRLT(),not_design))\n", "\n", " # Enable design\n", " aa_to_design = pyrosetta.rosetta.core.pack.task.operation.RestrictAbsentCanonicalAASRLT()\n", " aa_to_design.aas_to_keep(amino)\n", " tf.push_back(pyrosetta.rosetta.core.pack.task.operation.OperateOnResidueSubset(aa_to_design, mut_posi))\n", " \n", " # Create Packer\n", " packer = pyrosetta.rosetta.protocols.minimization_packing.PackRotamersMover()\n", " packer.task_factory(tf)\n", "\n", " #Perform The Move\n", " if not os.getenv(\"DEBUG\"):\n", " packer.apply(pose)\n", "\n", "#Load the previously-relaxed pose.\n", "relaxPose = pose_from_pdb(\"inputs/1jhl.relax.pdb\")\n", "\n", "#Clone it\n", "original = relaxPose.clone()\n", "scorefxn = get_score_function()\n", "print(\"\\nOld Energy:\", scorefxn(original),\"\\n\")\n", "pack(relaxPose, 130, 'A', scorefxn)\n", "print(\"\\nNew Energy:\", scorefxn(relaxPose),\"\\n\")\n", "\n", "#Set relaxPose back to original\n", "relaxPose = original.clone()\n" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "-scBuqg08RwW" }, "source": [ "### **Step 3. unbind()**\n", "This function is for binding energy analysis. To compute a binding energy, we need to score the total energy of a bound state structure, separate (unbind) the antigen and antibody and then score the unbound state total energy. The binding energy is given by **bound energy** - **unbound energy**. You can also use the **InterfaceAnalyzerMover (IAM)** , located in `rosetta.protocols.analysis`.\n", "\n", "- Benefits to unbind over IAM:\n", " - Quicker\n", " - Simpler\n", " \n", "- Disadvantages to unbind over IAM:\n", " - Specific foldtree needs to used, with a specific jump. For IAM - it is now foldtree independent, so you only need to know the chainIDs on each side of the interface. " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 190 }, "colab_type": "code", "executionInfo": { "elapsed": 394, "status": "ok", "timestamp": 1583520348703, "user": { "displayName": "Yuanhan Wu", "photoUrl": "", "userId": "03333451059275340958" }, "user_tz": 300 }, "id": "iuqAC4i58RwX", "outputId": "9629cbe2-54a3-44a7-cfc9-38c40d92d357" }, "outputs": [], "source": [ "from pyrosetta.rosetta.protocols import *\n", "\n", "def unbind(pose, partners):\n", " STEP_SIZE = 100\n", " JUMP = 2\n", " docking.setup_foldtree(pose, partners, Vector1([-1,-1,-1]))\n", " trans_mover = rigid.RigidBodyTransMover(pose,JUMP)\n", " trans_mover.step_size(STEP_SIZE)\n", " trans_mover.apply(pose)\n", "\n", "\n", "##Reset the original pose\n", "relaxPose = original.clone()\n", "\n", "scorefxn = get_score_function()\n", "bound_score = scorefxn(relaxPose)\n", "print(\"\\nBound State Score\",bound_score,\"\\n\")\n", "unbind(relaxPose, \"HL_A\")\n", "unbound_score = scorefxn(relaxPose)\n", "\n", "print(\"\\nUnbound State Score\", unbound_score,\"\\n\")\n", "print('dG', bound_score - unbound_score, 'Rosetta Energy Units (REU)')\n" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "KxTre0Bw8Rwg" }, "source": [ "## **Step 4. wildtype()**\n", "\n", "An important metrics for evaluating binding improvement is the ratio of mutant binding energy to wild type binding energy. This function returns the wild type amino acids in a given position. " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 34 }, "colab_type": "code", "executionInfo": { "elapsed": 358, "status": "ok", "timestamp": 1583520351607, "user": { "displayName": "Yuanhan Wu", "photoUrl": "", "userId": "03333451059275340958" }, "user_tz": 300 }, "id": "9jm9EKUe8Rwh", "outputId": "38996659-0b3a-4fbc-8e02-c82956165d29" }, "outputs": [], "source": [ "def wildtype(aatype = 'AA.aa_gly'):\n", " AA = ['G','A','L','M','F','W','K','Q','E','S','P'\n", " ,'V','I','C','Y','H','R','N','D','T']\n", "\n", " AA_3 = ['AA.aa_gly','AA.aa_ala','AA.aa_leu','AA.aa_met','AA.aa_phe','AA.aa_trp'\n", " ,'AA.aa_lys','AA.aa_gln','AA.aa_glu', 'AA.aa_ser','AA.aa_pro','AA.aa_val'\n", " ,'AA.aa_ile','AA.aa_cys','AA.aa_tyr','AA.aa_his','AA.aa_arg','AA.aa_asn'\n", " ,'AA.aa_asp','AA.aa_thr']\n", "\n", " for i in range(0, len(AA_3)):\n", " if(aatype == AA_3[i]):\n", " return AA[i]\n", "\n", "print(wildtype(str(relaxPose.aa(130))))\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Setp 4a. Exploration. \n", "\n", "We can also use some utility functions instead of this function. \n", "\n", "We can use the sequence STRING returned. Note that strings are indexed at 0 in Rosetta. " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "\n", "print(relaxPose.sequence())\n", "print(\"\\n\",relaxPose.sequence()[129])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now lets get some information fromt the ResidueType object that holds chemical information. \n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(relaxPose.residue_type(130))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finally, lets get the residue from the type" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "resT = relaxPose.residue_type(130)\n", "\n", "print(resT.base_name())\n", "print(resT.name3())\n", "print(resT.name1())" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "HzVlvWse8Rwp" }, "source": [ "## **Step 5. Integrate functions for mutate and output**" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 326 }, "colab_type": "code", "executionInfo": { "elapsed": 2264, "status": "ok", "timestamp": 1583520355487, "user": { "displayName": "Yuanhan Wu", "photoUrl": "", "userId": "03333451059275340958" }, "user_tz": 300 }, "id": "RV4M9rco8Rwq", "outputId": "2c5c0147-4023-44c2-f0ab-eecf4a4c8ebf" }, "outputs": [], "source": [ "def mutate(pose, posi, amino, partners):\n", " #main function for mutation\n", " CSV_PREFIX = 'notec'\n", " PDB_PREFIX = 'notep'\n", "\n", " #Initiate test pose\n", " testPose = Pose()\n", " testPose.assign(pose)\n", "\n", " #Initiate energy function\n", " scorefxn = get_fa_scorefxn()\n", " unbind(testPose, partners)\n", " native_ub = scorefxn(testPose)\n", " testPose.assign(pose)\n", " \n", " #Variables initiation\n", " content = ''\n", " name = CSV_PREFIX + str(posi)+str(amino) + '.csv'\n", " pdbname = PDB_PREFIX + str(posi)+str(amino) + '.pdb'\n", " wt = wildtype(str(pose.aa(posi)))\n", "\n", " pack(testPose, posi, amino, scorefxn)\n", " testPose.dump_pdb(pdbname)\n", " bound = scorefxn(testPose)\n", " unbind(testPose, partners)\n", " unbound = scorefxn(testPose)\n", " binding = unbound - bound\n", " testPose.assign(pose)\n", "\n", " if (wt == amino):\n", " wt_energy = binding\n", " else:\n", " pack(testPose, posi, wt, scorefxn)\n", " wtbound = scorefxn(testPose)\n", " unbind(testPose, partners)\n", " wtunbound = scorefxn(testPose)\n", " wt_energy = wtunbound - wtbound\n", " testPose.assign(pose)\n", "\n", " content=(content+str(pose.pdb_info().pose2pdb(posi))+','+str(amino)+','\n", " +str(native_ub)+','+str(bound)+','+str(unbound)+','+str(binding)+','\n", " +str(wt_energy)+','+str(wt)+','+str(binding/wt_energy)+'\\n')\n", "\n", " f = open(name,'w+')\n", " f.write(content)\n", " f.close()\n", "\n", "mutate(relaxPose, 130, 'A', 'HL_A')\n" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "6eaD1Qmo8Rwt" }, "source": [ "## **Step 6. Loop through interface positions**\n", "\n", "The following code loop through all heavy chain and light chain positions mutating them into all 20 amino acids. The actual run may again crash the notebook. \n", "\n", "You may output the data however you wish. pose.scores() will have the data, maps and pandas Dataframes can also be used. Here, we will simply output energy information of each mutation in form of csv files and cat them into one file for future analysis. An output file is uploaded to the input folder for the R analysis. \n", "\n", "In real work setting, parallelization can be achieve. Please see the PyRosetta in Parellel chapter. For this task, you not necessarily need to finish the whole loop. We have a finished version in the inputs folder.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 1000 }, "colab_type": "code", "executionInfo": { "elapsed": 234651, "status": "ok", "timestamp": 1583520593140, "user": { "displayName": "Yuanhan Wu", "photoUrl": "", "userId": "03333451059275340958" }, "user_tz": 300 }, "id": "xBR7u2b12th1", "outputId": "942e5882-0c8e-46a9-de58-c8666dfe012a" }, "outputs": [], "source": [ "#NOTE - This takes a very long time!! \n", "# You may skip this block to continue the tutorial with pre-configured outputs.\n", "if not os.getenv(\"DEBUG\"):\n", " for i in [92,85,68,53,5,45,44,42,32,31,22,108,100]:\n", " print(\"\\nMutating Position: \",str(i),\"\\n\")\n", " for j in ['G','A','L','M','F','W','K','Q','E','S','P','V','I','C','Y','H','R','N','D','T']:\n", " mutate(relaxPose, i, j, 'HL_A')" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "_t7PqsI2rtR4" }, "source": [ "Merging output csv files for binding energy analysis in R" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "iCJ5MTrX2zEt" }, "source": [ "## **Analysis of binding data**\n", "After gathering summarized binding energy information, we use pandas for filtering and visualization. We filtered out lower unbound energy structures, those that have higher unbound state total energy than native and make a heatmap from the filtered data. In case you don't want to finish the for loop at Step 8, we uploaded a finished version of merged output csv to the inputs folder named \"note_output.csv\"." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": {}, "colab_type": "code", "id": "0AgWCFvhxsnf" }, "outputs": [], "source": [ "#import modules need for analysis\n", "import pandas as pd\n", "%matplotlib inline\n", "import matplotlib.pyplot as plt \n", "import seaborn as sns" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 255 }, "colab_type": "code", "executionInfo": { "elapsed": 326, "status": "ok", "timestamp": 1583520671800, "user": { "displayName": "Yuanhan Wu", "photoUrl": "", "userId": "03333451059275340958" }, "user_tz": 300 }, "id": "sSuEU5sL3HM0", "outputId": "1a1c9762-354a-4a39-91a5-8865f716490f" }, "outputs": [], "source": [ "csv_file_name = 'inputs/note_output.csv'" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 627 }, "colab_type": "code", "executionInfo": { "elapsed": 1057, "status": "ok", "timestamp": 1583520676206, "user": { "displayName": "Yuanhan Wu", "photoUrl": "", "userId": "03333451059275340958" }, "user_tz": 300 }, "id": "Yhza0hnjxyUO", "outputId": "2958d5ad-464a-44b5-f3fe-1b82168c2f12" }, "outputs": [], "source": [ "#Generating heatmaps\n", "\n", "UNBOUND_CUTOFF = -995\n", "RATIO_CUTOFF = 1.001\n", "\n", "#load the data into a pandas dataframe\n", "df = pd.read_csv(csv_file_name, names='Position Amino.Acid Native Bound Unbound Binding WT_Binding WT Ratio'.split(), index_col=False )\n", "#Add wildtype AA to position (for display)\n", "df['Position_WT_aa'] = df.Position + ' (' + df.WT + ')' \n", "\n", "#filter values\n", "df = df.query(f'Unbound<{UNBOUND_CUTOFF} and Ratio>{RATIO_CUTOFF}')\n", "\n", "# convert from tidy format (https://en.wikipedia.org/wiki/Tidy_data) to a wider format\n", "df = pd.pivot_table(df, values='Ratio', \n", " index=['Position_WT_aa'], \n", " columns='Amino.Acid')\n", "\n", "#plot the heatmap\n", "f, ax = plt.subplots(figsize=(10, 10))\n", "sns.heatmap(df, cmap='coolwarm', linewidths= 1, linecolor='lightgray')\n", "plt.xlabel('Amino acid mutation');\n", "plt.ylabel('Position chain and wild type AA');\n", "sns.set_context(\"talk\") #make labels bigger" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "qwh88WH88Ry3" }, "source": [ "# See Also\n", "\n", "Note these may not be available in PyRosetta through code or even by xml (remodel), but they are extremely useful tools when doing denovo protein design - and you should be aware of them.\n", "\n", "- **RosettaRemodel**\n", " - https://www.rosettacommons.org/docs/latest/application_documentation/design/rosettaremodel\n", " \n", " \n", "- **Sewing**\n", "\n", " - https://www.rosettacommons.org/docs/latest/scripting_documentation/RosettaScripts/composite_protocols/sewing/SEWING\n", " \n", " \n", "- **Parametric Design**\n", " - Previous Workshop!" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": {}, "colab_type": "code", "id": "LS-hp8ED8Ry4" }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "g9zM5zSF8Ry5" }, "source": [ "\n", "< [*De Novo* Protein Design with PyRosetta](http://nbviewer.jupyter.org/github/RosettaCommons/PyRosetta.notebooks/blob/master/notebooks/06.07-Introduction-to-DeNovo-protein-design.ipynb) | [Contents](toc.ipynb) | [Index](index.ipynb) | [Docking](http://nbviewer.jupyter.org/github/RosettaCommons/PyRosetta.notebooks/blob/master/notebooks/07.00-Protein-Docking.ipynb) >

\"Open" ] } ], "metadata": { "colab": { "collapsed_sections": [], "name": "06.08-Point-Mutation-Scan.ipynb", "provenance": [ { "file_id": "1PzHopHLzecnVu79L-A-cxq60KZ5flA2v", "timestamp": 1581890019994 } ] }, "kernelspec": { "display_name": "Python 3", "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.6.1" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": {}, "toc_section_display": true, "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 1 }