{ "cells": [ { "cell_type": "markdown", "metadata": {}, "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": {}, "source": [ "\n", "< [*De Novo* Parametric Backbone Design](http://nbviewer.jupyter.org/github/RosettaCommons/PyRosetta.notebooks/blob/master/notebooks/06.06-Introduction-to-Parametric-backbone-design.ipynb) | [Contents](toc.ipynb) | [Index](index.ipynb) | [**Point Mutation Scan**](http://nbviewer.jupyter.org/github/RosettaCommons/PyRosetta.notebooks/blob/master/notebooks/06.08-Point-Mutation-Scan.ipynb) >

\"Open" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# *De Novo* Protein Design with PyRosetta\n", "Keywords:\n", "\n", "## Overview" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Make sure you are in the directory with the `.pdb` files:**\n", "\n", "`cd google_drive/MyDrive/student-notebooks/`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "*Warning*: This notebook uses `pyrosetta.distributed.viewer` code, which runs in `jupyter notebook` and might not run if you're using `jupyterlab`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "*Note:* This Jupyter notebook requires the PyRosetta distributed layer which is obtained by building PyRosetta with the `--serialization` flag or installing PyRosetta from the RosettaCommons conda channel (for more information, visit: http://www.pyrosetta.org/dow)." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "!pip install pyrosettacolabsetup\n", "import pyrosettacolabsetup; pyrosettacolabsetup.install_pyrosetta()\n", "import pyrosetta; pyrosetta.init()\n", "\n", "import Bio.Data.IUPACData as IUPACData\n", "import Bio.SeqUtils\n", "import logging\n", "logging.basicConfig(level=logging.INFO)\n", "import os\n", "import pyrosetta\n", "import pyrosetta.distributed\n", "import pyrosetta.distributed.viewer as viewer\n", "import site\n", "import sys\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Initialize PyRosetta:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "INFO:pyrosetta.rosetta:Found rosetta database at: /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pyrosetta-2019.33+release.1e60c63beb5-py3.6-macosx-10.6-intel.egg/pyrosetta/database; using it....\n", "INFO:pyrosetta.rosetta:PyRosetta-4 2019 [Rosetta PyRosetta4.Release.python36.mac 2019.33+release.1e60c63beb532fd475f0f704d68d462b8af2a977 2019-08-09T15:19:57] retrieved from: http://www.pyrosetta.org\n", "(C) Copyright Rosetta Commons Member Institutions. Created in JHU by Sergey Lyskov and PyRosetta Team.\n", "INFO:rosetta:\u001b[0mcore.init: \u001b[0mChecking for fconfig files in pwd and ./rosetta/flags\n", "INFO:rosetta:\u001b[0mcore.init: \u001b[0mReading fconfig.../Users/jadolfbr/.rosetta/flags/common\n", "INFO:rosetta:\u001b[0mcore.init: \u001b[0m\n", "INFO:rosetta:\u001b[0mcore.init: \u001b[0m\n", "INFO:rosetta:\u001b[0mcore.init: \u001b[0mRosetta version: PyRosetta4.Release.python36.mac r230 2019.33+release.1e60c63beb5 1e60c63beb532fd475f0f704d68d462b8af2a977 http://www.pyrosetta.org 2019-08-09T15:19:57\n", "INFO:rosetta:\u001b[0mcore.init: \u001b[0mcommand: PyRosetta -linmem_ig 10 -ignore_unrecognized_res 1 -mute core.select.residue_selector.SecondaryStructureSelector -mute core.select.residue_selector.PrimarySequenceNeighborhoodSelector -mute protocols.DsspMover -database /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pyrosetta-2019.33+release.1e60c63beb5-py3.6-macosx-10.6-intel.egg/pyrosetta/database\n", "INFO:rosetta:\u001b[0mbasic.random.init_random_generator: \u001b[0m'RNG device' seed mode, using '/dev/urandom', seed=-547485678 seed_offset=0 real_seed=-547485678\n", "INFO:rosetta:\u001b[0mbasic.random.init_random_generator: \u001b[0mRandomGenerator:init: Normal mode, seed=-547485678 RG_type=mt19937\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "PyRosetta-4 2019 [Rosetta PyRosetta4.Release.python36.mac 2019.33+release.1e60c63beb532fd475f0f704d68d462b8af2a977 2019-08-09T15:19:57] retrieved from: http://www.pyrosetta.org\n", "(C) Copyright Rosetta Commons Member Institutions. Created in JHU by Sergey Lyskov and PyRosetta Team.\n" ] } ], "source": [ "flags = \"\"\"\n", "-linmem_ig 10\n", "-ignore_unrecognized_res 1\n", "-mute core.select.residue_selector.SecondaryStructureSelector\n", "-mute core.select.residue_selector.PrimarySequenceNeighborhoodSelector\n", "-mute protocols.DsspMover\n", "\"\"\"\n", "pyrosetta.distributed.init(flags)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " Let's setup the pose of a *de novo* helical bundle from the PDB for downstream design: https://www.rcsb.org/structure/5J0J" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "INFO:rosetta:\u001b[0mcore.chemical.GlobalResidueTypeSet: \u001b[0mFinished initializing fa_standard residue type set. Created 980 residue types\n", "INFO:rosetta:\u001b[0mcore.chemical.GlobalResidueTypeSet: \u001b[0mTotal time to initialize 0.975747 seconds.\n", "INFO:rosetta:\u001b[0mcore.import_pose.import_pose: \u001b[0mFile '5J0J.clean.pdb' automatically determined to be of type PDB\n", "INFO:rosetta:\u001b[0mcore.io.pdb.pdb_reader: \u001b[0mParsing 0 .pdb records with unknown format to search for Rosetta-specific comments.\n", "INFO:rosetta:\u001b[0mcore.conformation.Conformation: \u001b[0m\u001b[1m[ WARNING ]\u001b[0m missing heavyatom: OXT on residue ALA:CtermProteinFull 70\n", "INFO:rosetta:\u001b[0mcore.conformation.Conformation: \u001b[0m\u001b[1m[ WARNING ]\u001b[0m missing heavyatom: OXT on residue ALA:CtermProteinFull 139\n", "INFO:rosetta:\u001b[0mcore.conformation.Conformation: \u001b[0m\u001b[1m[ WARNING ]\u001b[0m missing heavyatom: OXT on residue ALA:CtermProteinFull 210\n" ] } ], "source": [ "start_pose = pyrosetta.io.pose_from_file(\"inputs/5J0J.clean.pdb\")\n", "pose = start_pose.clone()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Design Strategy \n", "\n", "Minimize the crystal structure coordinates, then convert chain \"A\" to poly-alanine, and then perform one-sided protein-protein interface design designing chain A while only re-packing the homotrimer interface residues of chains B and C! Therefore, we are designing a homotrimer into a heterotrimer. Furthermore, prevent backbone torsions from minimizing and only minimize the side-chains of the homotrimer interface and all of chain A using the `FastDesign` mover! After design, repack and minimize all side-chains." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " Prior to and after design, we want to relax the protein with a scorefunction that packs the rotamers and minimizes the side-chain degrees of freedom while optimizing for realistic energies. If you were to allow backbone minimization (which you may optionally choose to), we would want use a Cartesian scorefunction (in this case, `ref2015_cart.wts`) which automatically sets `cart_bonded` scoreterm to a weight of 1.0, which helps to close chain breaks in the backbone. Similarly, you might want to also turn on the `coordinate_constraint` scoreterm to penalize deviations of the backbone coordinates from their initial coordinates during minimization. In this tutorial, we demonstrate that concept but will prevent backbone torsions from being minimized (however, feel free to turn on backbone minimization!):" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "INFO:rosetta:\u001b[0mcore.scoring.etable: \u001b[0mStarting energy table calculation\n", "INFO:rosetta:\u001b[0mcore.scoring.etable: \u001b[0msmooth_etable: changing atr/rep split to bottom of energy well\n", "INFO:rosetta:\u001b[0mcore.scoring.etable: \u001b[0msmooth_etable: spline smoothing lj etables (maxdis = 6)\n", "INFO:rosetta:\u001b[0mcore.scoring.etable: \u001b[0msmooth_etable: spline smoothing solvation etables (max_dis = 6)\n", "INFO:rosetta:\u001b[0mcore.scoring.etable: \u001b[0mFinished calculating energy tables.\n", "INFO:rosetta:\u001b[0mbasic.io.database: \u001b[0mDatabase file opened: scoring/score_functions/hbonds/ref2015_params/HBPoly1D.csv\n", "INFO:rosetta:\u001b[0mbasic.io.database: \u001b[0mDatabase file opened: scoring/score_functions/hbonds/ref2015_params/HBFadeIntervals.csv\n", "INFO:rosetta:\u001b[0mbasic.io.database: \u001b[0mDatabase file opened: scoring/score_functions/hbonds/ref2015_params/HBEval.csv\n", "INFO:rosetta:\u001b[0mbasic.io.database: \u001b[0mDatabase file opened: scoring/score_functions/hbonds/ref2015_params/DonStrength.csv\n", "INFO:rosetta:\u001b[0mbasic.io.database: \u001b[0mDatabase file opened: scoring/score_functions/hbonds/ref2015_params/AccStrength.csv\n", "INFO:rosetta:\u001b[0mbasic.io.database: \u001b[0mDatabase file opened: scoring/score_functions/rama/fd/all.ramaProb\n", "INFO:rosetta:\u001b[0mbasic.io.database: \u001b[0mDatabase file opened: scoring/score_functions/rama/fd/prepro.ramaProb\n", "INFO:rosetta:\u001b[0mbasic.io.database: \u001b[0mDatabase file opened: scoring/score_functions/omega/omega_ppdep.all.txt\n", "INFO:rosetta:\u001b[0mbasic.io.database: \u001b[0mDatabase file opened: scoring/score_functions/omega/omega_ppdep.gly.txt\n", "INFO:rosetta:\u001b[0mbasic.io.database: \u001b[0mDatabase file opened: scoring/score_functions/omega/omega_ppdep.pro.txt\n", "INFO:rosetta:\u001b[0mbasic.io.database: \u001b[0mDatabase file opened: scoring/score_functions/omega/omega_ppdep.valile.txt\n", "INFO:rosetta:\u001b[0mbasic.io.database: \u001b[0mDatabase file opened: scoring/score_functions/P_AA_pp/P_AA\n", "INFO:rosetta:\u001b[0mbasic.io.database: \u001b[0mDatabase file opened: scoring/score_functions/P_AA_pp/P_AA_n\n", "INFO:rosetta:\u001b[0mcore.scoring.P_AA: \u001b[0mshapovalov_lib::shap_p_aa_pp_smooth_level of 1( aka low_smooth ) got activated.\n", "INFO:rosetta:\u001b[0mbasic.io.database: \u001b[0mDatabase file opened: scoring/score_functions/P_AA_pp/shapovalov/10deg/kappa131/a20.prop\n", "INFO:rosetta:\u001b[0mcore.scoring.CartesianBondedEnergy: \u001b[0mInitializing IdealParametersDatabase with default Ks=300 , 80 , 20 , 10 , 40\n", "INFO:rosetta:\u001b[0mbasic.io.database: \u001b[0mDatabase file opened: scoring/score_functions/bondlength_bondangle/default-lengths.txt\n", "INFO:rosetta:\u001b[0mcore.scoring.CartesianBondedEnergy: \u001b[0mRead 757 bb-independent lengths.\n", "INFO:rosetta:\u001b[0mbasic.io.database: \u001b[0mDatabase file opened: scoring/score_functions/bondlength_bondangle/default-angles.txt\n", "INFO:rosetta:\u001b[0mcore.scoring.CartesianBondedEnergy: \u001b[0mRead 1456 bb-independent angles.\n", "INFO:rosetta:\u001b[0mbasic.io.database: \u001b[0mDatabase file opened: scoring/score_functions/bondlength_bondangle/default-torsions.txt\n", "INFO:rosetta:\u001b[0mcore.scoring.CartesianBondedEnergy: \u001b[0mRead 1 bb-independent torsions.\n", "INFO:rosetta:\u001b[0mbasic.io.database: \u001b[0mDatabase file opened: scoring/score_functions/bondlength_bondangle/default-improper.txt\n", "INFO:rosetta:\u001b[0mcore.scoring.CartesianBondedEnergy: \u001b[0mRead 2216 bb-independent improper tors.\n", "INFO:rosetta:\u001b[0mcore.scoring.CartesianBondedEnergy: \u001b[0mCreating new peptide-bonded energy container (210)\n", "INFO:rosetta:\u001b[0mbasic.io.database: \u001b[0mDatabase file opened: scoring/score_functions/elec_cp_reps.dat\n", "INFO:rosetta:\u001b[0mcore.scoring.elec.util: \u001b[0mRead 40 countpair representative atoms\n", "INFO:rosetta:\u001b[0mcore.pack.dunbrack.RotamerLibrary: \u001b[0mshapovalov_lib_fixes_enable option is true.\n", "INFO:rosetta:\u001b[0mcore.pack.dunbrack.RotamerLibrary: \u001b[0mshapovalov_lib::shap_dun10_smooth_level of 1( aka lowest_smooth ) got activated.\n", "INFO:rosetta:\u001b[0mcore.pack.dunbrack.RotamerLibrary: \u001b[0mBinary rotamer library selected: /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pyrosetta-2019.33+release.1e60c63beb5-py3.6-macosx-10.6-intel.egg/pyrosetta/database/rotamer/shapovalov/StpDwn_0-0-0/Dunbrack10.lib.bin\n", "INFO:rosetta:\u001b[0mcore.pack.dunbrack.RotamerLibrary: \u001b[0mUsing Dunbrack library binary file '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pyrosetta-2019.33+release.1e60c63beb5-py3.6-macosx-10.6-intel.egg/pyrosetta/database/rotamer/shapovalov/StpDwn_0-0-0/Dunbrack10.lib.bin'.\n", "INFO:rosetta:\u001b[0mcore.pack.dunbrack.RotamerLibrary: \u001b[0mDunbrack 2010 library took 0.255055 seconds to load from binary\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "The starting pose total_score is 2113.5810054254503\n" ] } ], "source": [ "relax_scorefxn = pyrosetta.create_score_function(\"ref2015_cart.wts\")\n", "relax_scorefxn.set_weight(pyrosetta.rosetta.core.scoring.ScoreType.coordinate_constraint, 1.0)\n", "print(\"The starting pose total_score is {}\".format(relax_scorefxn(start_pose)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " For *design*, if we allowed backbone minimzation we again would turn on the `coordinate_constraint` scoreterm to penalize deviations of the backbone coordinates from their initial coordinates during minimization. Additionally, we will use \"non-pairwise decomposable\" scoreterms to guide the packer trajectories (i.e. fixed backbone sequence design trajectories) in favor of our hypothetical design requirements to solve our biological problem. In this tutorial, we will make use of the following additional scoreterms during design:\n", "- `aa_composition`: This scoring term is intended for use during design, to penalize deviations from a desired residue type composition. Applies to any amino acid composition requirements specified by the user within a ResidueSelector. This scoreterm also applies to the `AddHelixSequenceConstraints` mover which sets up ideal sequence constraints for each helix in a pose or in a selection.\n", "- `voids_penalty`: This scoring term is intended for use during design, to penalize buried voids or cavities and to guide the packer to design solutions in which all buried volume is filled with side-chains.\n", "- `aa_repeat`: This wholebody scoring term is intended for use during design, to penalize long stretches in which the same residue type repeats over and over (e.g. poly-Q sequences). \n", "- `buried_unsatisfied_penalty`: This scoring term is intended for use during design, to provide a penalty for buried hydrogen bond donors or acceptors that are unsatisfied. \n", "- `netcharge`: This scoring term is intended for use during design, to penalize deviations from a desired net charge in a pose or in a selection.\n", "- `hbnet`: This scoring term is intended for use during design, to provide a bonus for hydrogen bond network formation." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "INFO:rosetta:\u001b[0mbasic.io.database: \u001b[0mDatabase file opened: scoring/score_functions/aa_repeat_energy/default_repeat_penalty_table.rpt_pen\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "The starting pose total_score is 23016.58100542545\n" ] } ], "source": [ "design_scorefxn = pyrosetta.create_score_function(\"ref2015_cart.wts\")\n", "design_scorefxn.set_weight(pyrosetta.rosetta.core.scoring.ScoreType.coordinate_constraint, 10.0)\n", "design_scorefxn.set_weight(pyrosetta.rosetta.core.scoring.ScoreType.aa_composition, 1.0)\n", "design_scorefxn.set_weight(pyrosetta.rosetta.core.scoring.ScoreType.voids_penalty, 0.25)\n", "design_scorefxn.set_weight(pyrosetta.rosetta.core.scoring.ScoreType.aa_repeat, 1.0)\n", "design_scorefxn.set_weight(pyrosetta.rosetta.core.scoring.ScoreType.buried_unsatisfied_penalty, 1.0)\n", "design_scorefxn.set_weight(pyrosetta.rosetta.core.scoring.ScoreType.hbnet, 1.0)\n", "design_scorefxn.set_weight(pyrosetta.rosetta.core.scoring.ScoreType.netcharge, 1.0)\n", "print(\"The starting pose total_score is {}\".format(design_scorefxn(start_pose)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " By using the `relax_scorefxn` before and after the `design_scorefxn`, we ensure that these \"non-pairwise decomposable\" scoreterms are not forcing unrealistic rotamers that would otherwise not be held in place without these additional scoreterms." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " Prior to any deviation from crystal structure coordinates, apply coordinate constraints to all of the backbone heavy atoms:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "INFO:rosetta:\u001b[0mprotocols.constraint_generator.AddConstraints: \u001b[0mAdding 843 constraints generated by ConstraintGenerator named contrain_all_backbone_atoms!\n" ] } ], "source": [ "true_selector = pyrosetta.rosetta.core.select.residue_selector.TrueResidueSelector() # Select all residues\n", "\n", "# Apply a virtual root onto the pose to prevent large lever-arm effects while minimizing with coordinate constraints\n", "virtual_root = pyrosetta.rosetta.protocols.simple_moves.VirtualRootMover()\n", "virtual_root.set_removable(True)\n", "virtual_root.set_remove(False)\n", "virtual_root.apply(pose)\n", "\n", "# Construct the CoordinateConstraintGenerator\n", "coord_constraint_gen = pyrosetta.rosetta.protocols.constraint_generator.CoordinateConstraintGenerator()\n", "coord_constraint_gen.set_id(\"contrain_all_backbone_atoms!\")\n", "coord_constraint_gen.set_ambiguous_hnq(False)\n", "coord_constraint_gen.set_bounded(False)\n", "coord_constraint_gen.set_sidechain(False)\n", "coord_constraint_gen.set_sd(1.0) # Sets a standard deviation of contrained atoms to (an arbitrary) 1.0 Angstroms RMSD. Set higher or lower for different results.\n", "coord_constraint_gen.set_ca_only(False)\n", "coord_constraint_gen.set_residue_selector(true_selector)\n", "\n", "# Apply the CoordinateConstraintGenerator using the AddConstraints mover\n", "add_constraints = pyrosetta.rosetta.protocols.constraint_generator.AddConstraints()\n", "add_constraints.add_generator(coord_constraint_gen)\n", "add_constraints.apply(pose)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " Prior to design, minimize with the `FastRelax` mover to optimize the pose within the `relax_scorefxn` scorefunction. Note: this takes ~1min 10s" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "INFO:rosetta:\u001b[0mprotocols.relax.RelaxScriptManager: \u001b[0mReading relax scripts list from database.\n", "INFO:rosetta:\u001b[0mprotocols.relax.RelaxScriptManager: \u001b[0mLooking for default.txt\n", "INFO:rosetta:\u001b[0mprotocols.relax.RelaxScriptManager: \u001b[0m================== Reading script file: /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pyrosetta-2019.33+release.1e60c63beb5-py3.6-macosx-10.6-intel.egg/pyrosetta/database/sampling/relax_scripts/default.txt ==================\n", "INFO:rosetta:\u001b[0mprotocols.relax.RelaxScriptManager: \u001b[0mrepeat %%nrepeats%%\n", "INFO:rosetta:\u001b[0mprotocols.relax.RelaxScriptManager: \u001b[0mramp_repack_min 0.02 0.01 1.0\n", "INFO:rosetta:\u001b[0mprotocols.relax.RelaxScriptManager: \u001b[0mramp_repack_min 0.250 0.01 0.5\n", "INFO:rosetta:\u001b[0mprotocols.relax.RelaxScriptManager: \u001b[0mramp_repack_min 0.550 0.01 0.0\n", "INFO:rosetta:\u001b[0mprotocols.relax.RelaxScriptManager: \u001b[0mramp_repack_min 1 0.00001 0.0\n", "INFO:rosetta:\u001b[0mprotocols.relax.RelaxScriptManager: \u001b[0maccept_to_best\n", "INFO:rosetta:\u001b[0mprotocols.relax.RelaxScriptManager: \u001b[0mendrepeat\n", "INFO:rosetta:\u001b[0mcore.scoring.CartesianBondedEnergy: \u001b[0mCreating new peptide-bonded energy container (211)\n", "INFO:rosetta:\u001b[0mcore.scoring.CartesianBondedEnergy: \u001b[0mAdding undefined angle VRT: X,ORIG,Y to DB with theta0 = 1.5708 , Ktheta = 80\n", "INFO:rosetta:\u001b[0mcore.scoring.CartesianBondedEnergy: \u001b[0mAdding undefined length VRT: ORIG,X, to DB with d0 = 1 , Kd = 300\n", "INFO:rosetta:\u001b[0mcore.scoring.CartesianBondedEnergy: \u001b[0mAdding undefined length VRT: ORIG,Y, to DB with d0 = 1 , Kd = 300\n", "INFO:rosetta:\u001b[0mprotocols.relax.FastRelax: \u001b[0mCMD: repeat 2113.58 0 0 0.55\n", "INFO:rosetta:\u001b[0mcore.pack.task: \u001b[0mPacker task: initialize from command line()\n", "INFO:rosetta:\u001b[0mcore.pack.pack_rotamers: \u001b[0mbuilt 0 rotamers at 0 positions.\n", "INFO:rosetta:\u001b[0mcore.pack.interaction_graph.interaction_graph_factory: \u001b[0mInstantiating LinearMemoryInteractionGraph\n", "INFO:rosetta:\u001b[0mprotocols.relax.FastRelax: \u001b[0mCMD: ramp_repack_min 362.9 0 0 0.011\n", "INFO:rosetta:\u001b[0mcore.pack.task: \u001b[0mPacker task: initialize from command line()\n", "INFO:rosetta:\u001b[0mcore.pack.pack_rotamers: \u001b[0mbuilt 0 rotamers at 0 positions.\n", "INFO:rosetta:\u001b[0mcore.pack.interaction_graph.interaction_graph_factory: \u001b[0mInstantiating LinearMemoryInteractionGraph\n", "INFO:rosetta:\u001b[0mprotocols.relax.FastRelax: \u001b[0mCMD: ramp_repack_min 420.396 0 0 0.1375\n", "INFO:rosetta:\u001b[0mcore.pack.task: \u001b[0mPacker task: initialize from command line()\n", "INFO:rosetta:\u001b[0mcore.pack.pack_rotamers: \u001b[0mbuilt 0 rotamers at 0 positions.\n", "INFO:rosetta:\u001b[0mcore.pack.interaction_graph.interaction_graph_factory: \u001b[0mInstantiating LinearMemoryInteractionGraph\n", "INFO:rosetta:\u001b[0mprotocols.relax.FastRelax: \u001b[0mCMD: ramp_repack_min 464.945 0 0 0.3025\n", "INFO:rosetta:\u001b[0mcore.pack.task: \u001b[0mPacker task: initialize from command line()\n", "INFO:rosetta:\u001b[0mcore.pack.pack_rotamers: \u001b[0mbuilt 0 rotamers at 0 positions.\n", "INFO:rosetta:\u001b[0mcore.pack.interaction_graph.interaction_graph_factory: \u001b[0mInstantiating LinearMemoryInteractionGraph\n", "INFO:rosetta:\u001b[0mprotocols.relax.FastRelax: \u001b[0mCMD: ramp_repack_min 517.258 0 0 0.55\n", "INFO:rosetta:\u001b[0mprotocols.relax.FastRelax: \u001b[0mMRP: 0 517.258 517.258 0 0\n", "INFO:rosetta:\u001b[0mprotocols.relax.FastRelax: \u001b[0mCMD: accept_to_best 517.258 0 0 0.55\n", "INFO:rosetta:\u001b[0mprotocols.relax.FastRelax: \u001b[0mCMD: endrepeat 517.258 0 0 0.55\n", "INFO:rosetta:\u001b[0mprotocols::checkpoint: \u001b[0mDeleting checkpoints of FastRelax\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 59.9 s, sys: 445 ms, total: 1min\n", "Wall time: 1min\n" ] } ], "source": [ "tf = pyrosetta.rosetta.core.pack.task.TaskFactory()\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", "tf.push_back(pyrosetta.rosetta.core.pack.task.operation.OperateOnResidueSubset(\n", " pyrosetta.rosetta.core.pack.task.operation.PreventRepackingRLT(), true_selector)) # Set to RestrictToRepackingRLT for slower/better results\n", "mm = pyrosetta.rosetta.core.kinematics.MoveMap()\n", "mm.set_bb(False) # Set to true if desired\n", "mm.set_chi(True)\n", "mm.set_jump(False)\n", "fast_relax = pyrosetta.rosetta.protocols.relax.FastRelax(scorefxn_in=relax_scorefxn, standard_repeats=1) # 2-5 repeats suggested for real applications\n", "fast_relax.cartesian(True)\n", "fast_relax.set_task_factory(tf)\n", "fast_relax.set_movemap(mm)\n", "fast_relax.minimize_bond_angles(True)\n", "fast_relax.minimize_bond_lengths(True)\n", "fast_relax.min_type(\"lbfgs_armijo_nonmonotone\")\n", "fast_relax.ramp_down_constraints(False)\n", "\n", "if not os.getenv(\"DEBUG\"):\n", " %time fast_relax.apply(pose)\n", "\n", "# Optionally, instead of running this you could reload the saved pose from a previously run trajectory:\n", "#pose = pyrosetta.pose_from_file(\"minimized_start_pose.pdb\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " Let's check the delta `total_score` per residue after minimizing in the `relax_scorefxn` scorefunction:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2.4514614619029005 kcal/(mol*res) - 10.064671454406906 kcal/(mol*res) = -7.6132099925040055 kcal/(mol*res)\n" ] } ], "source": [ "if not os.getenv(\"DEBUG\"):\n", " initial_score_res = relax_scorefxn(start_pose)/start_pose.size()\n", " final_score_res = relax_scorefxn(pose)/pose.size()\n", " delta_total_score_res = final_score_res - initial_score_res\n", " print(\"{0} kcal/(mol*res) - {1} kcal/(mol*res) = {2} kcal/(mol*res)\".format(final_score_res, initial_score_res, delta_total_score_res))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " We can see that the crystal structure coordinates were not quite optimal according to the `relax_scorefxn` scorefunction. So which model is correct?\n", "\n", "By how many Angstroms RMSD did the backbone Cα atoms move?" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "nbgrader": { "grade": true, "grade_id": "cell-8da10817eefb8d88", "locked": false, "points": 0, "schema_version": 3, "solution": true } }, "outputs": [ { "data": { "text/plain": [ "0.0" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "### BEGIN SOLUTION\n", "pyrosetta.rosetta.core.scoring.CA_rmsd(start_pose, pose)\n", "### END SOLUTION" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " For downstream analysis, we want to save the pose:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "minimized_start_pose = pose.clone()\n", "pyrosetta.dump_pdb(minimized_start_pose, \"outputs/minimized_start_pose.pdb\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## *De Novo* Protein Design\n", "\n", "Prior to designing chain A, first let's make chain A poly-alanine so that we can re-design the sidechains onto the backbone:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "INFO:rosetta:\u001b[0mprotocols.constraint_generator.RemoveConstraints: \u001b[0mRemoving 843 constraints from pose generated by contrain_all_backbone_atoms!\n" ] } ], "source": [ "# Since we will do direct pose manipulation, first remove the constraints\n", "remove_constraints = pyrosetta.rosetta.protocols.constraint_generator.RemoveConstraints()\n", "remove_constraints.add_generator(coord_constraint_gen)\n", "remove_constraints.apply(pose)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " Obtain chain A and convert it to poly-alanine" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "INFO:rosetta:\u001b[0mprotocols.grafting.util: \u001b[0mReturning 70 residues from 1 to 70\n", "INFO:rosetta:\u001b[0mprotocols.pose_creation.MakePolyXMover: \u001b[0mPose is converted to poly ALA\n" ] } ], "source": [ "keep_chA = pyrosetta.rosetta.protocols.grafting.simple_movers.KeepRegionMover(res_start=str(pose.chain_begin(1)), res_end=str(pose.chain_end(1)))\n", "keep_chA.apply(pose)\n", "polyA_chA = pyrosetta.rosetta.protocols.pose_creation.MakePolyXMover(aa=\"ALA\", keep_pro=0, keep_gly=0, keep_disulfide_cys=0)\n", "polyA_chA.apply(pose)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " Obtain chains B and C" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "INFO:rosetta:\u001b[0mprotocols.grafting.util: \u001b[0mReturning 140 residues from 71 to 210\n" ] } ], "source": [ "pose_chBC = minimized_start_pose.clone()\n", "keep_chBC = pyrosetta.rosetta.protocols.grafting.simple_movers.KeepRegionMover(res_start=str(pose_chBC.chain_begin(2)), res_end=str(pose_chBC.chain_end(3)-1))\n", "keep_chBC.apply(pose_chBC)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " Append chains B and C onto the poly-alanine version of chain A" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "pyrosetta.rosetta.core.pose.append_pose_to_pose(pose1=pose, pose2=pose_chBC, new_chain=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " Pose is now considered to have only 2 chains." ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pose.num_chains()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " Let's re-establish that there are 3 chains." ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "INFO:rosetta:\u001b[0mcore.scoring.ScoreFunctionFactory: \u001b[0mSCOREFUNCTION: \u001b[32mref2015\u001b[0m\n", "INFO:rosetta:\u001b[0mprotocols.simple_moves.SwitchChainOrderMover: \u001b[0mNumber of chains in pose: 2\n", "INFO:rosetta:\u001b[0mprotocols.simple_moves.SwitchChainOrderMover: \u001b[0mNow at chain: 1\n", "INFO:rosetta:\u001b[0mprotocols.simple_moves.SwitchChainOrderMover: \u001b[0mNow at chain: 2\n", "INFO:rosetta:\u001b[0mprotocols.simple_moves.SwitchChainOrderMover: \u001b[0mNew pose's foldtree FOLD_TREE EDGE 1 70 -1 EDGE 1 71 1 EDGE 71 210 -1\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "PDB file name: \n", " Pose Range Chain PDB Range | #Residues #Atoms\n", "\n", "0001 -- 0070 A 0001 -- 0070 | 0070 residues; 00703 atoms\n", "0071 -- 0139 B 0071 -- 0139 | 0069 residues; 01187 atoms\n", "0140 -- 0210 C 0140 -- 0210 | 0071 residues; 01223 atoms\n", " TOTAL | 0210 residues; 03113 atoms\n", "\n", "Now the number of chains = 3\n" ] } ], "source": [ "switch_chains = pyrosetta.rosetta.protocols.simple_moves.SwitchChainOrderMover()\n", "switch_chains.chain_order(\"12\")\n", "switch_chains.apply(pose)\n", "\n", "print(pose.pdb_info())\n", "print(\"Now the number of chains = {}\".format(pose.num_chains()))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " Re-apply backbone coordinate constraints:" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "INFO:rosetta:\u001b[0mprotocols.constraint_generator.AddConstraints: \u001b[0mAdding 843 constraints generated by ConstraintGenerator named contrain_all_backbone_atoms!\n" ] } ], "source": [ "virtual_root.apply(pose)\n", "add_constraints.apply(pose)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " Have a look at the new pose, chain A in which is ready to be designed!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " Next, we need to apply certain movers with our design specifications to activate certain non-pairwise decomposable scoreterms in the `design_scorefxn` scorefunction, that will be implemented when we run the `FastDesign` mover (or any downstream mover that calls the packer).\n", "\n", " We will frequently be using the following residue selectors:" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "chain_A = pyrosetta.rosetta.core.select.residue_selector.ChainSelector(\"A\")\n", "chain_BC = pyrosetta.rosetta.core.select.residue_selector.NotResidueSelector(chain_A)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " Apply the `AddCompositionConstraintMover` mover, which utilizes the `aa_composition` scoreterm. Applying the following mover to the pose imposes the design constraints that the ResidueSelector have 40% aliphatic or aromatic residues other than leucine (i.e. ALA, PHE, ILE, MET, PRO, VAL, TRP, or TYR), and 5% leucines. For documentation, see: https://www.rosettacommons.org/docs/latest/rosetta_basics/scoring/AACompositionEnergy" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "scrolled": true }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "INFO:rosetta:\u001b[0mprotocols.aa_composition.AddCompositionConstraintMover: \u001b[0mInitialized AACompositionConstraint object from file contents:\n", "\n", "PENALTY_DEFINITION\n", "OR_PROPERTIES AROMATIC ALIPHATIC\n", "NOT_TYPE LEU\n", "FRACT_DELTA_START -0.05\n", "FRACT_DELTA_END 0.05\n", "PENALTIES 1 0 1 # The above two lines mean that if we're 5% below or 5% above the desired content, we get a 1-point penalty.\n", "FRACTION 0.4 # Forty percent aromatic or aliphatic, but not leucine\n", "BEFORE_FUNCTION CONSTANT\n", "AFTER_FUNCTION CONSTANT\n", "END_PENALTY_DEFINITION\n", "\n", "PENALTY_DEFINITION\n", "TYPE LEU\n", "DELTA_START -1\n", "DELTA_END 1\n", "PENALTIES 1 0 1\n", "FRACTION 0.05 # Five percent leucine\n", "BEFORE_FUNCTION CONSTANT\n", "AFTER_FUNCTION CONSTANT\n", "END_PENALTY_DEFINITION\n" ] } ], "source": [ "add_composition_constraint = pyrosetta.rosetta.protocols.aa_composition.AddCompositionConstraintMover()\n", "add_composition_constraint.create_constraint_from_file_contents(\"\"\"\n", "PENALTY_DEFINITION\n", "OR_PROPERTIES AROMATIC ALIPHATIC\n", "NOT_TYPE LEU\n", "FRACT_DELTA_START -0.05\n", "FRACT_DELTA_END 0.05\n", "PENALTIES 1 0 1 # The above two lines mean that if we're 5% below or 5% above the desired content, we get a 1-point penalty.\n", "FRACTION 0.4 # Forty percent aromatic or aliphatic, but not leucine\n", "BEFORE_FUNCTION CONSTANT\n", "AFTER_FUNCTION CONSTANT\n", "END_PENALTY_DEFINITION\n", "\n", "PENALTY_DEFINITION\n", "TYPE LEU\n", "DELTA_START -1\n", "DELTA_END 1\n", "PENALTIES 1 0 1\n", "FRACTION 0.05 # Five percent leucine\n", "BEFORE_FUNCTION CONSTANT\n", "AFTER_FUNCTION CONSTANT\n", "END_PENALTY_DEFINITION\n", "\"\"\")\n", "add_composition_constraint.add_residue_selector(chain_A)\n", "add_composition_constraint.apply(pose)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " Apply the `AddHelixSequenceConstraints` mover, which utilizes the `aa_composition` scoreterm. By default, this mover adds five types of sequence constraints to the designable residues in each alpha helix in the pose. Any of these behaviours may be disabled or modified by invoking advanced options, but no advanced options need be set in most cases. The five types of sequence constraints are:\n", "\n", "- A strong sequence constraint requiring at least two negatively-charged residues in the first (N-terminal) three residues of each alpha-helix.\n", "\n", "- A strong sequence constraint requiring at least two positively-charged residues in the last (C-terminal) three residues of each alpha-helix.\n", "\n", "- A weak but strongly ramping sequence constraint penalizing helix-disfavoring residue types (by default, Asn, Asp, Ser, Gly, Thr, and Val) throughout each helix. (A single such residue is sometimes tolerated, but the penalty for having more than one residue in this category increases quadratically with the count of helix-disfavouring residues.)\n", "\n", "- A weak sequence constraint coaxing the helix to have 10% alanine. Because this constraint is weak, deviations from this value are tolerated, but this should prevent an excessive abundance of alanine residues.\n", "\n", "- A weak sequence constraint coaxing the helix to have at least 25% hydrophobic content. This constraint is also weak, so slightly less hydrophobic helices will be tolerated to some degree. Note that alanine is not considered to be \"hydrophobic\" within Rosetta. \n", "\n", "### For documentation, see: https://www.rosettacommons.org/docs/latest/rosetta_basics/scoring/AACompositionEnergy" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "INFO:rosetta:\u001b[0mprotocols.aa_composition.AddHelixSequenceConstraintsMover: \u001b[0mApplying sequence constraints for helix 1, running from residue 2 through residue 32.\n", "INFO:rosetta:\u001b[0mprotocols.aa_composition.AddHelixSequenceConstraintsMover: \u001b[0m\tAdding N-terminal sequence constraints to helix.\n", "INFO:rosetta:\u001b[0mprotocols.aa_composition.AddHelixSequenceConstraintsMover: \u001b[0m\tAdding C-terminal sequence constraints to helix.\n", "INFO:rosetta:\u001b[0mprotocols.aa_composition.AddHelixSequenceConstraintsMover: \u001b[0m\tAdding sequence constraints to helix penalizing helix-disfavouring residue types.\n", "INFO:rosetta:\u001b[0mprotocols.aa_composition.AddHelixSequenceConstraintsMover: \u001b[0m\tAdding sequence constraints to helix to control fractional alanine content.\n", "INFO:rosetta:\u001b[0mprotocols.aa_composition.AddHelixSequenceConstraintsMover: \u001b[0m\tAdding sequence constraints to helix to enforce a minimum hydrophobic content.\n", "INFO:rosetta:\u001b[0mprotocols.aa_composition.AddHelixSequenceConstraintsMover: \u001b[0mApplying sequence constraints for helix 2, running from residue 40 through residue 69.\n", "INFO:rosetta:\u001b[0mprotocols.aa_composition.AddHelixSequenceConstraintsMover: \u001b[0m\tAdding N-terminal sequence constraints to helix.\n", "INFO:rosetta:\u001b[0mprotocols.aa_composition.AddHelixSequenceConstraintsMover: \u001b[0m\tAdding C-terminal sequence constraints to helix.\n", "INFO:rosetta:\u001b[0mprotocols.aa_composition.AddHelixSequenceConstraintsMover: \u001b[0m\tAdding sequence constraints to helix penalizing helix-disfavouring residue types.\n", "INFO:rosetta:\u001b[0mprotocols.aa_composition.AddHelixSequenceConstraintsMover: \u001b[0m\tAdding sequence constraints to helix to control fractional alanine content.\n", "INFO:rosetta:\u001b[0mprotocols.aa_composition.AddHelixSequenceConstraintsMover: \u001b[0m\tAdding sequence constraints to helix to enforce a minimum hydrophobic content.\n" ] } ], "source": [ "add_helix_sequence_constraints = pyrosetta.rosetta.protocols.aa_composition.AddHelixSequenceConstraintsMover()\n", "add_helix_sequence_constraints.set_residue_selector(chain_A)\n", "add_helix_sequence_constraints.apply(pose)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note: the `aa_repeat` scoreterm works out-of-the-box, and does not need to be applied to the pose to work, it just needs to have a weight of >0 in the scorefunction used by the packer. It imposes a penalty for each stretch of repeating amino acids, with the penalty value depending nonlinearly on the length of the repeating stretch. By default, 1- or 2-residue stretches incur no penalty, 3-residue stretches incur a penalty of +1, 4-residue stretches incur a penalty of +10, and 5-residue stretches or longer incur a penalty of +100. Since the term is sequence-based, it is really only useful for design -- that is, it will impose an identical penalty for a fixed-sequence pose, regardless its conformation. This also means that the term has no conformational derivatives: the minimizer ignores it completely. The term is not pairwise-decomposible, but has been made packer-compatible, so it can direct the sequence composition during a packer run. For documentation, see: https://www.rosettacommons.org/docs/latest/rosetta_basics/scoring/Repeat-stretch-energy" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " Similarly, the `voids_penalty` scoreterm does not need to be applied to the pose to work, it just needs to have a weight of >0 in the scorefunction used by the packer. For documentation, see: https://www.rosettacommons.org/docs/latest/rosetta_basics/scoring/VoidsPenaltyEnergy" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " Similarly, the `buried_unsatisfied_penalty` scoreterm does not need to be applied to the pose to work, it just needs to have a weight of >0 in the scorefunction used by the packer. For documentation, see: https://www.rosettacommons.org/docs/latest/rosetta_basics/scoring/BuriedUnsatPenalty" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " Similarly, the `hbnet` scoreterm does not need to be applied to the pose to work, it just needs to have a weight of >0 (ideally between 1.0 to 10.0) in the scorefunction used by the packer. For documentation, see: https://www.rosettacommons.org/docs/latest/rosetta_basics/scoring/HBNetEnergy" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " Apply the `AddNetChargeConstraintMover` mover, which utilizes the `netcharge` scoreterm. In this case, we require that the net charge in chain A must be exactly 0." ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "INFO:rosetta:\u001b[0mprotocols.aa_composition.AddNetChargeConstraintMover: \u001b[0mInitialized NetChargeConstraint object from file contents:\n", "\n", "DESIRED_CHARGE 0 #Desired net charge is zero.\n", "PENALTIES_CHARGE_RANGE -1 1 #Penalties are listed in the observed net charge range of -1 to +1.\n", "PENALTIES 1 0 1 #The penalties are 1 for an observed charge of -1, 0 for an observed charge of 0, and 1 for an observed charge of +1.\n", "BEFORE_FUNCTION QUADRATIC #Ramp quadratically for observed net charges of -2 or less.\n", "AFTER_FUNCTION QUADRATIC #Ramp quadratically for observed net charges of +2 or greater.\n" ] } ], "source": [ "add_net_charge_constraint = pyrosetta.rosetta.protocols.aa_composition.AddNetChargeConstraintMover()\n", "add_net_charge_constraint.create_constraint_from_file_contents(\"\"\"\n", "DESIRED_CHARGE 0 #Desired net charge is zero.\n", "PENALTIES_CHARGE_RANGE -1 1 #Penalties are listed in the observed net charge range of -1 to +1.\n", "PENALTIES 1 0 1 #The penalties are 1 for an observed charge of -1, 0 for an observed charge of 0, and 1 for an observed charge of +1.\n", "BEFORE_FUNCTION QUADRATIC #Ramp quadratically for observed net charges of -2 or less.\n", "AFTER_FUNCTION QUADRATIC #Ramp quadratically for observed net charges of +2 or greater.\n", "\"\"\")\n", "add_net_charge_constraint.add_residue_selector(chain_A)\n", "add_net_charge_constraint.apply(pose)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " Specify a custom `relaxscript` that optimizes the `ramp_repack_min` weights to prevent too many alanines from being designed (demonstrated at Pre-RosettaCON 2018):" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " Specify TaskOperations to be applied to chain A. In this case, let's use the latest LayerDesign implementation (Note: this is still being actively developed) using the XmlObjects class." ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "INFO:rosetta:\u001b[0mprotocols.rosetta_scripts.RosettaScriptsParser: \u001b[0mGenerating XML Schema for rosetta_scripts...\n", "INFO:rosetta:\u001b[0mprotocols.rosetta_scripts.RosettaScriptsParser: \u001b[0m...done\n", "INFO:rosetta:\u001b[0mprotocols.rosetta_scripts.RosettaScriptsParser: \u001b[0mInitializing schema validator...\n", "INFO:rosetta:\u001b[0mprotocols.rosetta_scripts.RosettaScriptsParser: \u001b[0m...done\n", "INFO:rosetta:\u001b[0mprotocols.rosetta_scripts.RosettaScriptsParser: \u001b[0mValidating input script...\n", "INFO:rosetta:\u001b[0mprotocols.rosetta_scripts.RosettaScriptsParser: \u001b[0m...done\n", "INFO:rosetta:\u001b[0mprotocols.rosetta_scripts.RosettaScriptsParser: \u001b[0mParsed script:\n", "\n", "\t\n", "\t\t\n", "\t\t\n", "\t\t\n", "\t\t\n", "\t\t\n", "\t\t\n", "\t\t\n", "\t\t\t\n", "\t\t\n", "\t\t\n", "\t\t\t\n", "\t\t\n", "\t\t\n", "\t\t\t\n", "\t\t\n", "\t\t\n", "\t\t\t\n", "\t\t\n", "\t\n", "\t\n", "\t\t\n", "\t\t\t\n", "\t\t\t\n", "\t\t\t\n", "\t\t\t\n", "\t\t\t\n", "\t\t\t\n", "\t\t\t\n", "\t\t\t\n", "\t\t\t\n", "\t\t\t\n", "\t\t\t\n", "\t\t\t\n", "\t\t\t\n", "\t\t\n", "\t\n", "\t\n", "\n", "INFO:rosetta:\u001b[0mcore.scoring.ScoreFunctionFactory: \u001b[0mSCOREFUNCTION: \u001b[32mref2015\u001b[0m\n", "INFO:rosetta:\u001b[0mcore.scoring.etable: \u001b[0mStarting energy table calculation\n", "INFO:rosetta:\u001b[0mcore.scoring.etable: \u001b[0msmooth_etable: changing atr/rep split to bottom of energy well\n", "INFO:rosetta:\u001b[0mcore.scoring.etable: \u001b[0msmooth_etable: spline smoothing lj etables (maxdis = 6)\n", "INFO:rosetta:\u001b[0mcore.scoring.etable: \u001b[0msmooth_etable: spline smoothing solvation etables (max_dis = 6)\n", "INFO:rosetta:\u001b[0mcore.scoring.etable: \u001b[0mFinished calculating energy tables.\n", "INFO:rosetta:\u001b[0mbasic.io.database: \u001b[0mDatabase file opened: scoring/score_functions/PairEPotential/pdb_pair_stats_fine\n", "INFO:rosetta:\u001b[0mbasic.io.database: \u001b[0mDatabase file opened: scoring/score_functions/InterchainPotential/interchain_env_log.txt\n", "INFO:rosetta:\u001b[0mbasic.io.database: \u001b[0mDatabase file opened: scoring/score_functions/InterchainPotential/interchain_pair_log.txt\n", "INFO:rosetta:\u001b[0mbasic.io.database: \u001b[0mDatabase file opened: scoring/score_functions/EnvPairPotential/env_log.txt\n", "INFO:rosetta:\u001b[0mbasic.io.database: \u001b[0mDatabase file opened: scoring/score_functions/EnvPairPotential/cbeta_den.txt\n", "INFO:rosetta:\u001b[0mbasic.io.database: \u001b[0mDatabase file opened: scoring/score_functions/EnvPairPotential/pair_log.txt\n", "INFO:rosetta:\u001b[0mbasic.io.database: \u001b[0mDatabase file opened: scoring/score_functions/EnvPairPotential/cenpack_log.txt\n", "INFO:rosetta:\u001b[0mcore.scoring.ramachandran: \u001b[0mshapovalov_lib::shap_rama_smooth_level of 4( aka highest_smooth ) got activated.\n", "INFO:rosetta:\u001b[0mbasic.io.database: \u001b[0mDatabase file opened: scoring/score_functions/rama/shapovalov/kappa25/all.ramaProb\n", "INFO:rosetta:\u001b[0mcore.select.residue_selector.LayerSelector: \u001b[0mSetting LayerSelector to use sidechain neighbors to determine burial.\n", "INFO:rosetta:\u001b[0mcore.select.residue_selector.LayerSelector: \u001b[0mSet cutoffs for core and surface to 5.2 and 2, respectively, in LayerSelector.\n", "INFO:rosetta:\u001b[0mcore.select.residue_selector.LayerSelector: \u001b[0mSetting core=false boundary=false surface=true in LayerSelector.\n", "INFO:rosetta:\u001b[0mcore.select.residue_selector.LayerSelector: \u001b[0mSetting LayerSelector to use sidechain neighbors to determine burial.\n", "INFO:rosetta:\u001b[0mcore.select.residue_selector.LayerSelector: \u001b[0mSet cutoffs for core and surface to 5.2 and 2, respectively, in LayerSelector.\n", "INFO:rosetta:\u001b[0mcore.select.residue_selector.LayerSelector: \u001b[0mSetting LayerSelector to use sidechain neighbors to determine burial.\n", "INFO:rosetta:\u001b[0mcore.select.residue_selector.LayerSelector: \u001b[0mSet cutoffs for core and surface to 5.2 and 2, respectively, in LayerSelector.\n", "INFO:rosetta:\u001b[0mcore.select.residue_selector.LayerSelector: \u001b[0mSetting core=false boundary=true surface=false in LayerSelector.\n", "INFO:rosetta:\u001b[0mcore.select.residue_selector.LayerSelector: \u001b[0mSetting LayerSelector to use sidechain neighbors to determine burial.\n", "INFO:rosetta:\u001b[0mcore.select.residue_selector.LayerSelector: \u001b[0mSet cutoffs for core and surface to 5.2 and 2, respectively, in LayerSelector.\n", "INFO:rosetta:\u001b[0mcore.select.residue_selector.LayerSelector: \u001b[0mSetting LayerSelector to use sidechain neighbors to determine burial.\n", "INFO:rosetta:\u001b[0mcore.select.residue_selector.LayerSelector: \u001b[0mSet cutoffs for core and surface to 5.2 and 2, respectively, in LayerSelector.\n", "INFO:rosetta:\u001b[0mcore.select.residue_selector.LayerSelector: \u001b[0mSetting core=true boundary=false surface=false in LayerSelector.\n", "INFO:rosetta:\u001b[0mcore.select.residue_selector.LayerSelector: \u001b[0mSetting LayerSelector to use sidechain neighbors to determine burial.\n", "INFO:rosetta:\u001b[0mcore.select.residue_selector.LayerSelector: \u001b[0mSet cutoffs for core and surface to 5.2 and 2, respectively, in LayerSelector.\n", "INFO:rosetta:\u001b[0mprotocols.jd2.parser.TaskOperationLoader: \u001b[0mDefined TaskOperation named \"layer_design\" of type DesignRestrictions\n", "INFO:rosetta:\u001b[0mprotocols.rosetta_scripts.ParsedProtocol: \u001b[0mParsedProtocol mover with the following movers and filters\n" ] } ], "source": [ "layer_design_task = pyrosetta.rosetta.protocols.rosetta_scripts.XmlObjects.create_from_string(\"\"\"\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", "\"\"\").get_task_operation(\"layer_design\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " Also prepare a ResidueSelector for the heterotrimer interface within chains B and C, and the rest of chains B and C. We will use these with `RestrictAbsentCanonicalAASRLT`, `RestrictToRepackingRLT`, and `PreventRepackingRLT` TaskOperations:" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "interface = pyrosetta.rosetta.core.select.residue_selector.InterGroupInterfaceByVectorSelector()\n", "interface.group1_selector(chain_A)\n", "interface.group2_selector(chain_BC)\n", "chain_BC_interface = pyrosetta.rosetta.core.select.residue_selector.AndResidueSelector(interface, chain_BC)\n", "not_chain_BC_interface = pyrosetta.rosetta.core.select.residue_selector.NotResidueSelector(chain_BC_interface)\n", "chain_BC_not_interface = pyrosetta.rosetta.core.select.residue_selector.AndResidueSelector(not_chain_BC_interface, chain_BC)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " For minimization, we also need the following ResidueSelector:" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "chain_A_and_BC_interface = pyrosetta.rosetta.core.select.residue_selector.OrResidueSelector(chain_A, chain_BC_interface)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " Make sure each ResidueSelector selects the regions as desired (in the following case, the `ResidueSelector` `interface` is visualized:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "view = viewer.init(pose) \\\n", " + viewer.setStyle() \\\n", " + viewer.setStyle(residue_selector=interface, colorscheme=\"greyCarbon\")\n", "view()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " Create TaskFactory to be used with the `FastRelax` mover (We use this instead of the FastDesign mover as the constructor allows us to set a relax script):" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "INFO:rosetta:\u001b[0mcore.pack.task: \u001b[0mPacker task: initialize from command line()\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "#Packer_Task\n", "\n", "resid\tpack?\tdesign?\tallowed_aas\n", "1\tTRUE\tTRUE\tASP:NtermProteinFull,ASN:NtermProteinFull,SER:NtermProteinFull,THR:NtermProteinFull\n", "2\tTRUE\tTRUE\tGLU,HIS,HIS_D,LYS,PRO,GLN,ARG\n", "3\tTRUE\tTRUE\tGLU,HIS,HIS_D,LYS,GLN,ARG\n", "4\tTRUE\tTRUE\tALA,ASP,GLU,ILE,LYS,LEU,MET,ASN,GLN,ARG,SER,THR,VAL,TRP,TYR\n", "5\tTRUE\tTRUE\tGLU,HIS,HIS_D,LYS,GLN,ARG\n", "6\tTRUE\tTRUE\tGLU,HIS,HIS_D,LYS,GLN,ARG\n", "7\tTRUE\tTRUE\tALA,ASP,GLU,ILE,LYS,LEU,MET,ASN,GLN,ARG,SER,THR,VAL,TRP,TYR\n", "8\tTRUE\tTRUE\tALA,ASP,GLU,ILE,LYS,LEU,MET,ASN,GLN,ARG,SER,THR,VAL,TRP,TYR\n", "9\tTRUE\tTRUE\tGLU,HIS,HIS_D,LYS,GLN,ARG\n", "10\tTRUE\tTRUE\tGLU,HIS,HIS_D,LYS,GLN,ARG\n", "11\tTRUE\tTRUE\tALA,PHE,ILE,LEU,MET,VAL,TRP,TYR\n", "12\tTRUE\tTRUE\tGLU,HIS,HIS_D,LYS,GLN,ARG\n", "13\tTRUE\tTRUE\tGLU,HIS,HIS_D,LYS,GLN,ARG\n", "14\tTRUE\tTRUE\tALA,PHE,ILE,LEU,MET,VAL,TRP,TYR\n", "15\tTRUE\tTRUE\tALA,ASP,GLU,ILE,LYS,LEU,MET,ASN,GLN,ARG,SER,THR,VAL,TRP,TYR\n", "16\tTRUE\tTRUE\tGLU,HIS,HIS_D,LYS,GLN,ARG\n", "17\tTRUE\tTRUE\tGLU,HIS,HIS_D,LYS,GLN,ARG\n", "18\tTRUE\tTRUE\tALA,PHE,ILE,LEU,MET,VAL,TRP,TYR\n", "19\tTRUE\tTRUE\tGLU,HIS,HIS_D,LYS,GLN,ARG\n", "20\tTRUE\tTRUE\tGLU,HIS,HIS_D,LYS,GLN,ARG\n", "21\tTRUE\tTRUE\tALA,PHE,ILE,LEU,MET,VAL,TRP,TYR\n", "22\tTRUE\tTRUE\tALA,ASP,GLU,ILE,LYS,LEU,MET,ASN,GLN,ARG,SER,THR,VAL,TRP,TYR\n", "23\tTRUE\tTRUE\tGLU,HIS,HIS_D,LYS,GLN,ARG\n", "24\tTRUE\tTRUE\tGLU,HIS,HIS_D,LYS,GLN,ARG\n", "25\tTRUE\tTRUE\tALA,PHE,ILE,LEU,MET,VAL,TRP,TYR\n", "26\tTRUE\tTRUE\tGLU,HIS,HIS_D,LYS,GLN,ARG\n", "27\tTRUE\tTRUE\tGLU,HIS,HIS_D,LYS,GLN,ARG\n", "28\tTRUE\tTRUE\tALA,ASP,GLU,ILE,LYS,LEU,MET,ASN,GLN,ARG,SER,THR,VAL,TRP,TYR\n", "29\tTRUE\tTRUE\tALA,ASP,GLU,ILE,LYS,LEU,MET,ASN,GLN,ARG,SER,THR,VAL,TRP,TYR\n", "30\tTRUE\tTRUE\tGLU,HIS,HIS_D,LYS,GLN,ARG\n", "31\tTRUE\tTRUE\tGLU,HIS,HIS_D,LYS,GLN,ARG\n", "32\tTRUE\tTRUE\tALA,PHE,ILE,LEU,MET,VAL,TRP,TYR\n", "33\tTRUE\tTRUE\tASP,GLU,GLY,HIS,HIS_D,LYS,ASN,PRO,GLN,ARG,SER,THR\n", "34\tTRUE\tTRUE\tASP,GLU,GLY,HIS,HIS_D,LYS,ASN,PRO,GLN,ARG,SER,THR\n", "35\tTRUE\tTRUE\tASP,GLU,GLY,HIS,HIS_D,LYS,ASN,PRO,GLN,ARG,SER,THR\n", "36\tTRUE\tTRUE\tASP,GLU,GLY,HIS,HIS_D,LYS,ASN,PRO,GLN,ARG,SER,THR\n", "37\tTRUE\tTRUE\tASP,GLU,GLY,HIS,HIS_D,LYS,ASN,PRO,GLN,ARG,SER,THR\n", "38\tTRUE\tTRUE\tASP,GLU,GLY,HIS,HIS_D,LYS,ASN,PRO,GLN,ARG,SER,THR\n", "39\tTRUE\tTRUE\tASP,ASN,SER,THR\n", "40\tTRUE\tTRUE\tALA,ASP,GLU,ILE,LYS,LEU,MET,ASN,PRO,GLN,ARG,SER,THR,VAL,TRP,TYR\n", "41\tTRUE\tTRUE\tALA,ASP,GLU,ILE,LYS,LEU,MET,ASN,GLN,ARG,SER,THR,VAL,TRP,TYR\n", "42\tTRUE\tTRUE\tALA,ASP,GLU,ILE,LYS,LEU,MET,ASN,GLN,ARG,SER,THR,VAL,TRP,TYR\n", "43\tTRUE\tTRUE\tGLU,HIS,HIS_D,LYS,GLN,ARG\n", "44\tTRUE\tTRUE\tALA,ASP,GLU,ILE,LYS,LEU,MET,ASN,GLN,ARG,SER,THR,VAL,TRP,TYR\n", "45\tTRUE\tTRUE\tALA,PHE,ILE,LEU,MET,VAL,TRP,TYR\n", "46\tTRUE\tTRUE\tGLU,HIS,HIS_D,LYS,GLN,ARG\n", "47\tTRUE\tTRUE\tALA,ASP,GLU,ILE,LYS,LEU,MET,ASN,GLN,ARG,SER,THR,VAL,TRP,TYR\n", "48\tTRUE\tTRUE\tALA,ASP,GLU,ILE,LYS,LEU,MET,ASN,GLN,ARG,SER,THR,VAL,TRP,TYR\n", "49\tTRUE\tTRUE\tALA,ASP,GLU,ILE,LYS,LEU,MET,ASN,GLN,ARG,SER,THR,VAL,TRP,TYR\n", "50\tTRUE\tTRUE\tGLU,HIS,HIS_D,LYS,GLN,ARG\n", "51\tTRUE\tTRUE\tALA,PHE,ILE,LEU,MET,VAL,TRP,TYR\n", "52\tTRUE\tTRUE\tALA,PHE,ILE,LEU,MET,VAL,TRP,TYR\n", "53\tTRUE\tTRUE\tGLU,HIS,HIS_D,LYS,GLN,ARG\n", "54\tTRUE\tTRUE\tALA,ASP,GLU,ILE,LYS,LEU,MET,ASN,GLN,ARG,SER,THR,VAL,TRP,TYR\n", "55\tTRUE\tTRUE\tALA,PHE,ILE,LEU,MET,VAL,TRP,TYR\n", "56\tTRUE\tTRUE\tALA,ASP,GLU,ILE,LYS,LEU,MET,ASN,GLN,ARG,SER,THR,VAL,TRP,TYR\n", "57\tTRUE\tTRUE\tGLU,HIS,HIS_D,LYS,GLN,ARG\n", "58\tTRUE\tTRUE\tALA,PHE,ILE,LEU,MET,VAL,TRP,TYR\n", "59\tTRUE\tTRUE\tALA,PHE,ILE,LEU,MET,VAL,TRP,TYR\n", "60\tTRUE\tTRUE\tGLU,HIS,HIS_D,LYS,GLN,ARG\n", "61\tTRUE\tTRUE\tALA,ASP,GLU,ILE,LYS,LEU,MET,ASN,GLN,ARG,SER,THR,VAL,TRP,TYR\n", "62\tTRUE\tTRUE\tALA,ASP,GLU,ILE,LYS,LEU,MET,ASN,GLN,ARG,SER,THR,VAL,TRP,TYR\n", "63\tTRUE\tTRUE\tALA,ASP,GLU,ILE,LYS,LEU,MET,ASN,GLN,ARG,SER,THR,VAL,TRP,TYR\n", "64\tTRUE\tTRUE\tGLU,HIS,HIS_D,LYS,GLN,ARG\n", "65\tTRUE\tTRUE\tALA,PHE,ILE,LEU,MET,VAL,TRP,TYR\n", "66\tTRUE\tTRUE\tALA,PHE,ILE,LEU,MET,VAL,TRP,TYR\n", "67\tTRUE\tTRUE\tGLU,HIS,HIS_D,LYS,GLN,ARG\n", "68\tTRUE\tTRUE\tALA,ASP,GLU,ILE,LYS,LEU,MET,ASN,GLN,ARG,SER,THR,VAL,TRP,TYR\n", "69\tTRUE\tTRUE\tALA,ASP,GLU,ILE,LYS,LEU,MET,ASN,GLN,ARG,SER,THR,VAL,TRP,TYR\n", "70\tTRUE\tTRUE\tALA:CtermProteinFull,ASP:CtermProteinFull,GLU:CtermProteinFull,PHE:CtermProteinFull,GLY:CtermProteinFull,ILE:CtermProteinFull,LYS:CtermProteinFull,LEU:CtermProteinFull,MET:CtermProteinFull,ASN:CtermProteinFull,PRO:CtermProteinFull,GLN:CtermProteinFull,ARG:CtermProteinFull,SER:CtermProteinFull,THR:CtermProteinFull,VAL:CtermProteinFull,TRP:CtermProteinFull,TYR:CtermProteinFull\n", "71\tFALSE\tFALSE\t\n", "72\tFALSE\tFALSE\t\n", "73\tFALSE\tFALSE\t\n", "74\tFALSE\tFALSE\t\n", "75\tFALSE\tFALSE\t\n", "76\tFALSE\tFALSE\t\n", "77\tTRUE\tFALSE\tLEU\n", "78\tFALSE\tFALSE\t\n", "79\tFALSE\tFALSE\t\n", "80\tTRUE\tFALSE\tLEU\n", "81\tFALSE\tFALSE\t\n", "82\tFALSE\tFALSE\t\n", "83\tFALSE\tFALSE\t\n", "84\tTRUE\tFALSE\tLEU\n", "85\tFALSE\tFALSE\t\n", "86\tFALSE\tFALSE\t\n", "87\tTRUE\tFALSE\tLEU\n", "88\tTRUE\tFALSE\tARG\n", "89\tFALSE\tFALSE\t\n", "90\tFALSE\tFALSE\t\n", "91\tTRUE\tFALSE\tLEU\n", "92\tFALSE\tFALSE\t\n", "93\tFALSE\tFALSE\t\n", "94\tTRUE\tFALSE\tLEU\n", "95\tTRUE\tFALSE\tLYS\n", "96\tFALSE\tFALSE\t\n", "97\tFALSE\tFALSE\t\n", "98\tTRUE\tFALSE\tLEU\n", "99\tFALSE\tFALSE\t\n", "100\tFALSE\tFALSE\t\n", "101\tTRUE\tFALSE\tLEU\n", "102\tTRUE\tFALSE\tGLU\n", "103\tFALSE\tFALSE\t\n", "104\tFALSE\tFALSE\t\n", "105\tTRUE\tFALSE\tPRO\n", "106\tFALSE\tFALSE\t\n", "107\tFALSE\tFALSE\t\n", "108\tFALSE\tFALSE\t\n", "109\tFALSE\tFALSE\t\n", "110\tTRUE\tFALSE\tILE\n", "111\tFALSE\tFALSE\t\n", "112\tFALSE\tFALSE\t\n", "113\tTRUE\tFALSE\tVAL\n", "114\tFALSE\tFALSE\t\n", "115\tFALSE\tFALSE\t\n", "116\tFALSE\tFALSE\t\n", "117\tTRUE\tFALSE\tILE\n", "118\tFALSE\tFALSE\t\n", "119\tFALSE\tFALSE\t\n", "120\tTRUE\tFALSE\tALA\n", "121\tFALSE\tFALSE\t\n", "122\tFALSE\tFALSE\t\n", "123\tTRUE\tFALSE\tALA\n", "124\tFALSE\tFALSE\t\n", "125\tFALSE\tFALSE\t\n", "126\tFALSE\tFALSE\t\n", "127\tFALSE\tFALSE\t\n", "128\tFALSE\tFALSE\t\n", "129\tFALSE\tFALSE\t\n", "130\tFALSE\tFALSE\t\n", "131\tTRUE\tFALSE\tSER\n", "132\tFALSE\tFALSE\t\n", "133\tFALSE\tFALSE\t\n", "134\tFALSE\tFALSE\t\n", "135\tFALSE\tFALSE\t\n", "136\tFALSE\tFALSE\t\n", "137\tTRUE\tFALSE\tALA\n", "138\tTRUE\tFALSE\tLEU\n", "139\tFALSE\tFALSE\t\n", "140\tFALSE\tFALSE\t\n", "141\tFALSE\tFALSE\t\n", "142\tFALSE\tFALSE\t\n", "143\tFALSE\tFALSE\t\n", "144\tFALSE\tFALSE\t\n", "145\tFALSE\tFALSE\t\n", "146\tFALSE\tFALSE\t\n", "147\tFALSE\tFALSE\t\n", "148\tFALSE\tFALSE\t\n", "149\tFALSE\tFALSE\t\n", "150\tFALSE\tFALSE\t\n", "151\tFALSE\tFALSE\t\n", "152\tFALSE\tFALSE\t\n", "153\tFALSE\tFALSE\t\n", "154\tFALSE\tFALSE\t\n", "155\tFALSE\tFALSE\t\n", "156\tFALSE\tFALSE\t\n", "157\tFALSE\tFALSE\t\n", "158\tFALSE\tFALSE\t\n", "159\tFALSE\tFALSE\t\n", "160\tFALSE\tFALSE\t\n", "161\tFALSE\tFALSE\t\n", "162\tFALSE\tFALSE\t\n", "163\tFALSE\tFALSE\t\n", "164\tFALSE\tFALSE\t\n", "165\tFALSE\tFALSE\t\n", "166\tFALSE\tFALSE\t\n", "167\tFALSE\tFALSE\t\n", "168\tFALSE\tFALSE\t\n", "169\tFALSE\tFALSE\t\n", "170\tFALSE\tFALSE\t\n", "171\tFALSE\tFALSE\t\n", "172\tFALSE\tFALSE\t\n", "173\tFALSE\tFALSE\t\n", "174\tFALSE\tFALSE\t\n", "175\tFALSE\tFALSE\t\n", "176\tFALSE\tFALSE\t\n", "177\tFALSE\tFALSE\t\n", "178\tFALSE\tFALSE\t\n", "179\tFALSE\tFALSE\t\n", "180\tFALSE\tFALSE\t\n", "181\tTRUE\tFALSE\tILE\n", "182\tTRUE\tFALSE\tVAL\n", "183\tFALSE\tFALSE\t\n", "184\tFALSE\tFALSE\t\n", "185\tTRUE\tFALSE\tLEU\n", "186\tTRUE\tFALSE\tLYS\n", "187\tFALSE\tFALSE\t\n", "188\tTRUE\tFALSE\tILE\n", "189\tTRUE\tFALSE\tVAL\n", "190\tFALSE\tFALSE\t\n", "191\tFALSE\tFALSE\t\n", "192\tTRUE\tFALSE\tILE\n", "193\tTRUE\tFALSE\tGLU\n", "194\tFALSE\tFALSE\t\n", "195\tFALSE\tFALSE\t\n", "196\tTRUE\tFALSE\tVAL\n", "197\tFALSE\tFALSE\t\n", "198\tFALSE\tFALSE\t\n", "199\tFALSE\tFALSE\t\n", "200\tTRUE\tFALSE\tARG\n", "201\tFALSE\tFALSE\t\n", "202\tTRUE\tFALSE\tSER\n", "203\tTRUE\tFALSE\tALA\n", "204\tFALSE\tFALSE\t\n", "205\tFALSE\tFALSE\t\n", "206\tFALSE\tFALSE\t\n", "207\tTRUE\tFALSE\tLYS\n", "208\tFALSE\tFALSE\t\n", "209\tTRUE\tFALSE\tLEU\n", "210\tTRUE\tFALSE\tALA:CtermProteinFull\n", "211\tTRUE\tFALSE\tVRT\n", "\n" ] } ], "source": [ "tf.clear()\n", "tf = pyrosetta.rosetta.core.pack.task.TaskFactory()\n", "\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", "# Prevent repacking on chain_BC_not_interface\n", "tf.push_back(pyrosetta.rosetta.core.pack.task.operation.OperateOnResidueSubset(\n", " pyrosetta.rosetta.core.pack.task.operation.PreventRepackingRLT(), chain_BC_not_interface))\n", "\n", "# Repack only on chain_BC_interface\n", "tf.push_back(pyrosetta.rosetta.core.pack.task.operation.OperateOnResidueSubset(\n", " pyrosetta.rosetta.core.pack.task.operation.RestrictToRepackingRLT(), chain_BC_interface))\n", "\n", "# Enable design on chain_A\n", "aa_to_design = pyrosetta.rosetta.core.pack.task.operation.RestrictAbsentCanonicalAASRLT()\n", "aa_to_design.aas_to_keep(\"ACDEFGHIKLMNPQRSTVWY\")\n", "tf.push_back(pyrosetta.rosetta.core.pack.task.operation.OperateOnResidueSubset(\n", " aa_to_design, chain_A))\n", "\n", "# Apply layer design\n", "tf.push_back(layer_design_task)\n", "\n", "# Convert the task factory into a PackerTask\n", "packer_task = tf.create_task_and_apply_taskoperations(pose)\n", "# View the PackerTask\n", "print(packer_task)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The PackerTask looks as intended. Now setup the `MoveMapFactory`:" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "# Set up a MoveMapFactory\n", "mmf = pyrosetta.rosetta.core.select.movemap.MoveMapFactory()\n", "mmf.all_bb(setting=False) # Set to true if needed\n", "mmf.all_bondangles(setting=False)\n", "mmf.all_bondlengths(setting=False)\n", "mmf.all_chi(setting=True)\n", "mmf.all_jumps(setting=False)\n", "mmf.set_cartesian(setting=False)\n", "\n", "# Set movemap actions to turn on or off certain torsions, overriding the above defaults\n", "enable = pyrosetta.rosetta.core.select.movemap.move_map_action.mm_enable\n", "disable = pyrosetta.rosetta.core.select.movemap.move_map_action.mm_disable\n", "\n", "# Set custom minimizable torsions\n", "mmf.add_bondangles_action(action=enable, selector=chain_A_and_BC_interface)\n", "mmf.add_bondlengths_action(action=enable, selector=chain_A_and_BC_interface)\n", "mmf.add_chi_action(action=enable, selector=chain_A_and_BC_interface)\n", "\n", "mmf.add_bondangles_action(action=disable, selector=chain_BC_not_interface)\n", "mmf.add_bondlengths_action(action=disable, selector=chain_BC_not_interface)\n", "mmf.add_chi_action(action=disable, selector=chain_BC_not_interface)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " Now let's double-check some more `pose` information to verify that we are ready for `FastDesign`:" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "INFO:rosetta:\u001b[0mprotocols.fold_from_loops.DisplayPoseLabelsMover: \u001b[0mSEQUENCE AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYKIKETLKRLEDSLRELRRILEELKEMLERLEKNPDKDVIVEVLKVIVKAIEASVENQRISAENQKALATKYKIKETLKRLEDSLRELRRILEELKEMLERLEKNPDKDVIVEVLKVIVKAIEASVENQRISAENQKALAX\n", "INFO:rosetta:\u001b[0mprotocols.fold_from_loops.DisplayPoseLabelsMover: \u001b[0mSTRUCTURE LHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHLLLLLLLHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHLLLHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHLLLLHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHLLHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHLLLLHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHLL\n", "INFO:rosetta:\u001b[0mprotocols.fold_from_loops.DisplayPoseLabelsMover: \u001b[0mMVMP_BB ...................................................................................................................................................................................................................\n", "INFO:rosetta:\u001b[0mprotocols.fold_from_loops.DisplayPoseLabelsMover: \u001b[0mMVMP_CHI **********************************************************************..*...*..*...*..**..*..**..*..**..*....*..*...*..*..**..*...*..*..**.......................................**.**..**.**..**.**..**.**..**.***\n", "INFO:rosetta:\u001b[0mcore.pack.task: \u001b[0mPacker task: initialize from command line()\n", "INFO:rosetta:\u001b[0mprotocols.fold_from_loops.DisplayPoseLabelsMover: \u001b[0mDESIGN **********************************************************************---------------------------------------------------------------------------------------------------------------------------------------------\n", "INFO:rosetta:\u001b[0mprotocols.fold_from_loops.DisplayPoseLabelsMover: \u001b[0mREPACK **********************************************************************------*--*---*--**--*--**--*--**--*----*--*---*--*--*-------*-----**------------------------------------------**--**-**--**--*---*-**---*-***\n", "INFO:rosetta:\u001b[0mprotocols.fold_from_loops.DisplayPoseLabelsMover: \u001b[0mFOLDTREE 1********************************************************************C1****************************************************2*************************************************************************************C2/C\n", "INFO:rosetta:\u001b[0mprotocols.fold_from_loops.DisplayPoseLabelsMover: \u001b[0m\n", "INFO:rosetta:\u001b[0mprotocols.fold_from_loops.DisplayPoseLabelsMover: \u001b[0mFOLD_TREE EDGE 211 124 2 EDGE 124 71 -1 EDGE 124 210 -1 EDGE 71 1 1 EDGE 1 70 -1\n", "INFO:rosetta:\u001b[0mprotocols.fold_from_loops.DisplayPoseLabelsMover: \u001b[0mA[ALA:NtermProteinFull]AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA[ALA:CtermProteinFull]Y[TYR:NtermProteinFull]KIKETLKRLEDSLRELRRILEELKEMLERLEKNPDKDVIVEVLKVIVKAIEASVENQRISAENQKALA[ALA:CtermProteinFull]T[THR:NtermProteinFull]KYKIKETLKRLEDSLRELRRILEELKEMLERLEKNPDKDVIVEVLKVIVKAIEASVENQRISAENQKALA[ALA:CtermProteinFull]X\n", "INFO:rosetta:\u001b[0mprotocols.fold_from_loops.DisplayPoseLabelsMover: \u001b[0mPDB file name:\n", "INFO:rosetta:\u001b[0mprotocols.fold_from_loops.DisplayPoseLabelsMover: \u001b[0m Pose Range Chain PDB Range | #Residues #Atoms\n", "INFO:rosetta:\u001b[0mprotocols.fold_from_loops.DisplayPoseLabelsMover: \u001b[0m0001 -- 0070 A 0001 -- 0070 | 0070 residues; 00703 atoms\n", "INFO:rosetta:\u001b[0mprotocols.fold_from_loops.DisplayPoseLabelsMover: \u001b[0m0071 -- 0139 B 0071 -- 0139 | 0069 residues; 01187 atoms\n", "INFO:rosetta:\u001b[0mprotocols.fold_from_loops.DisplayPoseLabelsMover: \u001b[0m0140 -- 0210 C 0140 -- 0210 | 0071 residues; 01223 atoms\n", "INFO:rosetta:\u001b[0mprotocols.fold_from_loops.DisplayPoseLabelsMover: \u001b[0m0211 -- 0211 z 0001 -- 0001 | 0001 residues; 00003 atoms\n", "INFO:rosetta:\u001b[0mprotocols.fold_from_loops.DisplayPoseLabelsMover: \u001b[0m TOTAL | 0211 residues; 03116 atoms\n" ] } ], "source": [ "display_pose = pyrosetta.rosetta.protocols.fold_from_loops.movers.DisplayPoseLabelsMover()\n", "display_pose.tasks(tf)\n", "display_pose.movemap_factory(mmf)\n", "display_pose.apply(pose)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " We are ready to setup the `FastRelax` mover:" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "INFO:rosetta:\u001b[0mprotocols.relax.RelaxScriptManager: \u001b[0mscore12 : 16.2709\n", "INFO:rosetta:\u001b[0mprotocols.relax.RelaxScriptManager: \u001b[0mtalaris2013 : 9.41743\n", "INFO:rosetta:\u001b[0mprotocols.relax.RelaxScriptManager: \u001b[0mtalaris2014 : 9.34686\n", "INFO:rosetta:\u001b[0mprotocols.relax.RelaxScriptManager: \u001b[0mref2015 : 6.875\n", "INFO:rosetta:\u001b[0mprotocols.relax.RelaxScriptManager: \u001b[0mbeta_nov16 : 14.9379\n" ] } ], "source": [ "#fast_design = pyrosetta.rosetta.protocols.denovo_design.movers.FastDesign(scorefxn_in=design_scorefxn, standard_repeats=1) # 2-5 repeats suggested for real applications\n", "fast_design = pyrosetta.rosetta.protocols.relax.FastRelax(scorefxn_in=design_scorefxn, standard_repeats=1, script_file=\"KillA2019\")\n", "fast_design.cartesian(False)\n", "fast_design.set_task_factory(tf)\n", "fast_design.set_movemap_factory(mmf)\n", "fast_design.min_type(\"lbfgs_armijo_nonmonotone\")\n", "fast_design.ramp_down_constraints(False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that this takes ~37min 13s:" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "INFO:rosetta:\u001b[0mcore.import_pose.import_pose: \u001b[0mFile 'designed_pose.pdb' automatically determined to be of type PDB\n", "INFO:rosetta:\u001b[0mcore.io.pdb.pdb_reader: \u001b[0mParsing 219 .pdb records with unknown format to search for Rosetta-specific comments.\n" ] } ], "source": [ "if not os.getenv(\"DEBUG\"):\n", " %time fast_design.apply(pose)\n", " # Optionally, instead of running this you could reload the saved pose from a previously run trajectory:\n", " pose = pyrosetta.pose_from_file(\"expected_outputs/designed_pose.pdb\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " Save this pose for downstream reference:" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [], "source": [ "if not os.getenv(\"DEBUG\"):\n", " designed_pose = pose.clone()\n", " #pyrosetta.dump_pdb(designed_pose, \"outputs/designed_pose.pdb\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " Now that we have re-designed chain A, it is strongly recommended to use `FastRelax` with a Cartesian scorefunction to repack and minimize with a realistic scorefuction. Note: this takes ~6min 27s" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "INFO:rosetta:\u001b[0mcore.scoring.CartesianBondedEnergy: \u001b[0mCreating new peptide-bonded energy container (210)\n", "INFO:rosetta:\u001b[0mprotocols.relax.FastRelax: \u001b[0mCMD: repeat 197.55 0 0 0.55\n", "INFO:rosetta:\u001b[0mcore.pack.task: \u001b[0mPacker task: initialize from command line()\n", "INFO:rosetta:\u001b[0mcore.pack.pack_rotamers: \u001b[0mbuilt 12019 rotamers at 210 positions.\n", "INFO:rosetta:\u001b[0mcore.pack.interaction_graph.interaction_graph_factory: \u001b[0mInstantiating LinearMemoryInteractionGraph\n", "INFO:rosetta:\u001b[0mprotocols.relax.FastRelax: \u001b[0mCMD: ramp_repack_min -241.67 0 0 0.011\n", "INFO:rosetta:\u001b[0mcore.pack.task: \u001b[0mPacker task: initialize from command line()\n", "INFO:rosetta:\u001b[0mcore.pack.pack_rotamers: \u001b[0mbuilt 11198 rotamers at 210 positions.\n", "INFO:rosetta:\u001b[0mcore.pack.interaction_graph.interaction_graph_factory: \u001b[0mInstantiating LinearMemoryInteractionGraph\n", "INFO:rosetta:\u001b[0mprotocols.relax.FastRelax: \u001b[0mCMD: ramp_repack_min -114.155 0 0 0.1375\n", "INFO:rosetta:\u001b[0mcore.pack.task: \u001b[0mPacker task: initialize from command line()\n", "INFO:rosetta:\u001b[0mcore.pack.pack_rotamers: \u001b[0mbuilt 10597 rotamers at 210 positions.\n", "INFO:rosetta:\u001b[0mcore.pack.interaction_graph.interaction_graph_factory: \u001b[0mInstantiating LinearMemoryInteractionGraph\n", "INFO:rosetta:\u001b[0mprotocols.relax.FastRelax: \u001b[0mCMD: ramp_repack_min -64.8312 0 0 0.3025\n", "INFO:rosetta:\u001b[0mcore.pack.task: \u001b[0mPacker task: initialize from command line()\n", "INFO:rosetta:\u001b[0mcore.pack.pack_rotamers: \u001b[0mbuilt 10131 rotamers at 210 positions.\n", "INFO:rosetta:\u001b[0mcore.pack.interaction_graph.interaction_graph_factory: \u001b[0mInstantiating LinearMemoryInteractionGraph\n", "INFO:rosetta:\u001b[0mprotocols.relax.FastRelax: \u001b[0mCMD: ramp_repack_min -9.93185 0 0 0.55\n", "INFO:rosetta:\u001b[0mprotocols.relax.FastRelax: \u001b[0mMRP: 0 -9.93185 -9.93185 0 0\n", "INFO:rosetta:\u001b[0mprotocols.relax.FastRelax: \u001b[0mCMD: accept_to_best -9.93185 0 0 0.55\n", "INFO:rosetta:\u001b[0mprotocols.relax.FastRelax: \u001b[0mCMD: endrepeat -9.93185 0 0 0.55\n", "INFO:rosetta:\u001b[0mprotocols::checkpoint: \u001b[0mDeleting checkpoints of FastRelax\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 10min 9s, sys: 2.31 s, total: 10min 12s\n", "Wall time: 10min 11s\n" ] } ], "source": [ "tf.clear()\n", "tf = pyrosetta.rosetta.core.pack.task.TaskFactory()\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", "tf.push_back(pyrosetta.rosetta.core.pack.task.operation.OperateOnResidueSubset(\n", " pyrosetta.rosetta.core.pack.task.operation.RestrictToRepackingRLT(), true_selector))\n", "mm = pyrosetta.rosetta.core.kinematics.MoveMap()\n", "mm.set_bb(False) # Set to true if desired\n", "mm.set_chi(True)\n", "mm.set_jump(False)\n", "fast_relax = pyrosetta.rosetta.protocols.relax.FastRelax(scorefxn_in=relax_scorefxn, standard_repeats=1) # 2-5 repeats suggested for real applications\n", "fast_relax.cartesian(True)\n", "fast_relax.set_task_factory(tf)\n", "fast_relax.set_movemap(mm)\n", "fast_relax.minimize_bond_angles(True)\n", "fast_relax.minimize_bond_lengths(True)\n", "fast_relax.min_type(\"lbfgs_armijo_nonmonotone\") # Cartisian scorefunction\n", "fast_relax.ramp_down_constraints(False)\n", "\n", "# To run the FastRelax trajectory.\n", "if not os.getenv(\"DEBUG\"):\n", " %time fast_relax.apply(pose)\n", "\n", "#Or for speed, we will load the pose from a previous trajectory.\n", "pose = pyrosetta.pose_from_file(\"expected_outputs/designed_relaxed_pose.pdb\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " Save the pose for downstream analysis:" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "designed_relaxed_pose = pose.clone()\n", "pyrosetta.dump_pdb(designed_relaxed_pose, \"expected_outputs/designed_relaxed_pose.pdb\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " Let's compare sequences to see what happened:" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "KYKIKETLKRLEDSLRELRRILEELKEMLERLEKNPDKDVIVEVLKVIVKAIEASVENQRISAENQKALA\n", "DEHERRIMEERHRMEEKFHHEMERMHRKKHQRHQTTSKSEYEHMFETIMRMMEWFERSFERMQEMYRQRT\n" ] } ], "source": [ "print(minimized_start_pose.chain_sequence(1))\n", "print(designed_relaxed_pose.chain_sequence(1))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "View the resulting design!" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "chA = pyrosetta.rosetta.core.select.residue_selector.ChainSelector(\"A\")\n", "chB = pyrosetta.rosetta.core.select.residue_selector.ChainSelector(\"B\")\n", "chC = pyrosetta.rosetta.core.select.residue_selector.ChainSelector(\"C\")\n", "view = sum(\n", " [\n", " viewer.init(designed_relaxed_pose),\n", " viewer.setStyle(cartoon_color=\"lightgrey\", radius=0.25),\n", " viewer.setSurface(residue_selector=chA, colorscheme=\"orangeCarbon\", opacity=0.5, surface_type=\"VDW\"),\n", " viewer.setSurface(residue_selector=chB, color=\"greenCarbon\", opacity=0.5, surface_type=\"VDW\"),\n", " viewer.setSurface(residue_selector=chB, color=\"violetCarbon\", opacity=0.5, surface_type=\"VDW\"),\n", " viewer.setDisulfides(radius=0.25),\n", " viewer.setZoom(factor=1.5)\n", " ]\n", ")\n", "view()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Analysis:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " By how many Angstroms RMSD did the backbone Cα atoms move?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ " What is the delta `total_score` from `minimized_start_pose` to `designed_relaxed_pose`?" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ " What is the per-residue energy difference for each mutated position between `minimized_start_pose` and `designed_relaxed_pose`?" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ " Are the sequence constraints imposed by the `aa_repeat` scoreterm satisfied? Re-write the following python code that counts the number of residue types in chain A to check for the longest stretch of each residue type in the primary amino acid sequence in chain A:" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "A 0\n", "C 0\n", "D 0\n", "E 15\n", "F 4\n", "G 0\n", "H 4\n", "I 2\n", "K 4\n", "L 0\n", "M 10\n", "N 0\n", "P 0\n", "Q 4\n", "R 12\n", "S 3\n", "T 3\n", "V 0\n", "W 1\n", "Y 2\n" ] } ], "source": [ "for aa in IUPACData.protein_letters:\n", " aa_selector = pyrosetta.rosetta.core.select.residue_selector.ResidueNameSelector(str.upper(Bio.SeqUtils.seq3(aa)))\n", " aa_and_chain_A = pyrosetta.rosetta.core.select.residue_selector.AndResidueSelector(chain_A, aa_selector)\n", " sel_res_count_metric = pyrosetta.rosetta.core.simple_metrics.metrics.SelectedResidueCountMetric()\n", " sel_res_count_metric.set_residue_selector(aa_and_chain_A)\n", " print(aa, int(sel_res_count_metric.calculate(designed_relaxed_pose)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " Does chain A have 40% percent aromatic or aliphatic (but not leucine) and 5% leucine, satisfying the `aa_composition` scoreterm? For additional practice, re-write the following python implementation using PyRosetta ResidueSelectors and SimpleMetrics:" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The % aromatic residues in chain A is 27.142857142857142%\n", "The % leucine in chain A is 0.0%\n" ] } ], "source": [ "num_aro_ali = 0\n", "num_leucine = 0\n", "\n", "for aa in pose.chain_sequence(1):\n", " if aa in \"WYFAVIMP\":\n", " num_aro_ali += 1\n", " if aa == \"L\":\n", " num_leucine += 1\n", " \n", "print(\"The % aromatic residues in chain A is {0}%\".format((num_aro_ali*100)/len(pose.chain_sequence(1))))\n", "print(\"The % leucine in chain A is {0}%\".format((num_leucine*100)/len(pose.chain_sequence(1))))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " Are the sequence constraints imposed by the `AddHelixSequenceConstraints` mover with the `aa_composition` scoreterm satisfied?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " Uses sasa (solvent-accessible surface area) to asses whether there are there more or less voids in `designed_relaxed_pose` as compared to `minimized_start_pose`, satisfying the `voids_penalty` scoreterm." ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The sasa of minimized_start_pose is 10608.90320076503\n", "The sasa of designed_relaxed_pose is 11126.886879822758\n" ] } ], "source": [ "tf.clear()\n", "tf = pyrosetta.rosetta.core.pack.task.TaskFactory()\n", "tf.push_back(pyrosetta.rosetta.core.pack.task.operation.OperateOnResidueSubset(\n", " pyrosetta.rosetta.core.pack.task.operation.RestrictToRepackingRLT(), true_selector))\n", "sasa = pyrosetta.rosetta.protocols.simple_filters.TaskAwareSASAFilter()\n", "sasa.task_factory(tf)\n", "print(\"The sasa of minimized_start_pose is {}\".format(sasa.score(minimized_start_pose)))\n", "print(\"The sasa of designed_relaxed_pose is {}\".format(sasa.score(designed_relaxed_pose)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " Is the net charge of chain A equal to exactly zero, satisfying the `netcharge` scoreterm?" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "INFO:rosetta:\u001b[0mprotocols.grafting.util: \u001b[0mReturning 70 residues from 1 to 70\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.NetChargeFilter: \u001b[0mAA: -1 ASP 1\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.NetChargeFilter: \u001b[0mAA: -1 GLU 2\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.NetChargeFilter: \u001b[0mAA: -1 GLU 4\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.NetChargeFilter: \u001b[0mAA: +1 ARG 5\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.NetChargeFilter: \u001b[0mAA: +1 ARG 6\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.NetChargeFilter: \u001b[0mAA: -1 GLU 9\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.NetChargeFilter: \u001b[0mAA: -1 GLU 10\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.NetChargeFilter: \u001b[0mAA: +1 ARG 11\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.NetChargeFilter: \u001b[0mAA: +1 ARG 13\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.NetChargeFilter: \u001b[0mAA: -1 GLU 15\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.NetChargeFilter: \u001b[0mAA: -1 GLU 16\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.NetChargeFilter: \u001b[0mAA: +1 LYS 17\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.NetChargeFilter: \u001b[0mAA: -1 GLU 21\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.NetChargeFilter: \u001b[0mAA: -1 GLU 23\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.NetChargeFilter: \u001b[0mAA: +1 ARG 24\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.NetChargeFilter: \u001b[0mAA: +1 ARG 27\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.NetChargeFilter: \u001b[0mAA: +1 LYS 28\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.NetChargeFilter: \u001b[0mAA: +1 LYS 29\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.NetChargeFilter: \u001b[0mAA: +1 ARG 32\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.NetChargeFilter: \u001b[0mAA: +1 LYS 38\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.NetChargeFilter: \u001b[0mAA: -1 GLU 40\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.NetChargeFilter: \u001b[0mAA: -1 GLU 42\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.NetChargeFilter: \u001b[0mAA: -1 GLU 46\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.NetChargeFilter: \u001b[0mAA: +1 ARG 50\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.NetChargeFilter: \u001b[0mAA: -1 GLU 53\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.NetChargeFilter: \u001b[0mAA: -1 GLU 56\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.NetChargeFilter: \u001b[0mAA: +1 ARG 57\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.NetChargeFilter: \u001b[0mAA: -1 GLU 60\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.NetChargeFilter: \u001b[0mAA: +1 ARG 61\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.NetChargeFilter: \u001b[0mAA: -1 GLU 64\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.NetChargeFilter: \u001b[0mAA: +1 ARG 67\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.NetChargeFilter: \u001b[0mAA: +1 ARG 69\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.NetChargeFilter: \u001b[0mThe net charge is: 0\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "The net charge of chain A = 0\n", "The net charge of chain A = 0.0\n" ] } ], "source": [ "# One method to calculate net charge of chain A\n", "num_negative = 0\n", "num_positive = 0\n", "for aa in pose.chain_sequence(1):\n", " if aa in \"DE\":\n", " num_negative += 1\n", " if aa in \"KR\":\n", " num_positive += 1\n", "print(\"The net charge of chain A = {0}\".format(num_positive - num_negative))\n", "\n", "# Another method to calculate net charge of chain A\n", "test_pose = pose.clone()\n", "keep_chA = pyrosetta.rosetta.protocols.grafting.simple_movers.KeepRegionMover(res_start=str(test_pose.chain_begin(1)), res_end=str(test_pose.chain_end(1)))\n", "keep_chA.apply(test_pose)\n", "net_charge = pyrosetta.rosetta.protocols.simple_filters.NetChargeFilter()\n", "print(\"The net charge of chain A = {0}\".format(net_charge.score(test_pose)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " Are there any buried unsatisfied polar atoms, satisfying the `buried_unsatisfied_penalty` scoreterm?" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "INFO:rosetta:\u001b[0mprotocols.rosetta_scripts.RosettaScriptsParser: \u001b[0mGenerating XML Schema for rosetta_scripts...\n", "INFO:rosetta:\u001b[0mprotocols.rosetta_scripts.RosettaScriptsParser: \u001b[0m...done\n", "INFO:rosetta:\u001b[0mprotocols.rosetta_scripts.RosettaScriptsParser: \u001b[0mInitializing schema validator...\n", "INFO:rosetta:\u001b[0mprotocols.rosetta_scripts.RosettaScriptsParser: \u001b[0m...done\n", "INFO:rosetta:\u001b[0mprotocols.rosetta_scripts.RosettaScriptsParser: \u001b[0mValidating input script...\n", "INFO:rosetta:\u001b[0mprotocols.rosetta_scripts.RosettaScriptsParser: \u001b[0m...done\n", "INFO:rosetta:\u001b[0mprotocols.rosetta_scripts.RosettaScriptsParser: \u001b[0mParsed script:\n", "\n", "\t\n", "\t\t\n", "\t\n", "\t\n", "\t\t\n", "\t\t\n", "\t\n", "\t\n", "\n", "INFO:rosetta:\u001b[0mcore.scoring.ScoreFunctionFactory: \u001b[0mSCOREFUNCTION: \u001b[32mref2015\u001b[0m\n", "INFO:rosetta:\u001b[0mprotocols.jd2.parser.ScoreFunctionLoader: \u001b[0mdefined score function \"fa_default\" with weights \"ref2015\"\n", "INFO:rosetta:\u001b[0mcore.scoring.ScoreFunctionFactory: \u001b[0mSCOREFUNCTION: \u001b[32mref2015\u001b[0m\n", "INFO:rosetta:\u001b[0mprotocols.rosetta_scripts.RosettaScriptsParser: \u001b[0mDefined filter named \"uhb_sc\" of type BuriedUnsatHbonds\n", "INFO:rosetta:\u001b[0mcore.scoring.ScoreFunctionFactory: \u001b[0mSCOREFUNCTION: \u001b[32mref2015\u001b[0m\n", "INFO:rosetta:\u001b[0mprotocols.rosetta_scripts.RosettaScriptsParser: \u001b[0mDefined filter named \"uhb_bb\" of type BuriedUnsatHbonds\n", "INFO:rosetta:\u001b[0mprotocols.rosetta_scripts.ParsedProtocol: \u001b[0mParsedProtocol mover with the following movers and filters\n" ] } ], "source": [ "uhb = pyrosetta.rosetta.protocols.rosetta_scripts.XmlObjects.create_from_string(\"\"\"\n", "\n", " \n", "\n", "\n", " \n", " \n", "\n", "\"\"\")" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m/////////////////////////////////////////////////////////////////////////////////////////\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m USER HAS SPECIFIED CUSTOM REPORTING BEHAVIOR FOR # UNSATS\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m/////////////////////////////////////////////////////////////////////////////////////////\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m\n", "INFO:rosetta:\u001b[0mbasic.io.database: \u001b[0mDatabase file opened: scoring/score_functions/hbonds/sp2_elec_params/HBPoly1D.csv\n", "INFO:rosetta:\u001b[0mbasic.io.database: \u001b[0mDatabase file opened: scoring/score_functions/hbonds/sp2_elec_params/HBFadeIntervals.csv\n", "INFO:rosetta:\u001b[0mbasic.io.database: \u001b[0mDatabase file opened: scoring/score_functions/hbonds/sp2_elec_params/HBEval.csv\n", "INFO:rosetta:\u001b[0mprotocols.vardist_solaccess: \u001b[0mVarSolDistSasaCalculator::recompute\n", "INFO:rosetta:\u001b[0mprotocols.vardist_solaccess: \u001b[0mVarSolDistSasaCalculator::lookup\n", "INFO:rosetta:\u001b[0mprotocols.vardist_solaccess: \u001b[0mVarSolDistSasaCalculator::lookup\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m buried unsats in input pose:\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m all_heavy_atom_unsats = 14\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m bb_heavy_atom_unsats = 11\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m sc_heavy_atom_unsats = 3\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m countable_nonheavy_unsats = 10\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied HEAVY polar atom at residue 4: ILE N\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied Hpol polar atom at residue 4: ILE H\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied HEAVY polar atom at residue 32: LEU O\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied HEAVY polar atom at residue 41: ILE N\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied Hpol polar atom at residue 41: ILE H\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied HEAVY polar atom at residue 42: VAL N\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied Hpol polar atom at residue 42: VAL H\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied Hpol polar atom at residue 65: ASN 2HD2\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied HEAVY polar atom at residue 66: GLN O\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied HEAVY polar atom at residue 101: LEU O\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied HEAVY polar atom at residue 109: VAL N\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied Hpol polar atom at residue 109: VAL H\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied HEAVY polar atom at residue 110: ILE N\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied Hpol polar atom at residue 110: ILE H\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied HEAVY polar atom at residue 127: ASN OD1\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied Hpol polar atom at residue 134: ASN 1HD2\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied HEAVY polar atom at residue 172: LEU O\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied HEAVY polar atom at residue 180: VAL N\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied Hpol polar atom at residue 180: VAL H\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied HEAVY polar atom at residue 181: ILE N\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied Hpol polar atom at residue 181: ILE H\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied HEAVY polar atom at residue 198: ASN OD1\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied HEAVY polar atom at residue 205: ASN OD1\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied Hpol polar atom at residue 205: ASN 1HD2\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m/////////////////////////////////////////////////////////////////////////////////////////\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m USER HAS SPECIFIED CUSTOM REPORTING BEHAVIOR FOR # UNSATS\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m/////////////////////////////////////////////////////////////////////////////////////////\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m\n", "INFO:rosetta:\u001b[0mprotocols.vardist_solaccess: \u001b[0mVarSolDistSasaCalculator::recompute\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "The number of unsatisfied side-chain heavy atoms in minimized_start_pose is 3.0\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:rosetta:\u001b[0mprotocols.vardist_solaccess: \u001b[0mVarSolDistSasaCalculator::lookup\n", "INFO:rosetta:\u001b[0mprotocols.vardist_solaccess: \u001b[0mVarSolDistSasaCalculator::lookup\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m buried unsats in input pose:\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m all_heavy_atom_unsats = 14\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m bb_heavy_atom_unsats = 11\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m sc_heavy_atom_unsats = 3\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m countable_nonheavy_unsats = 10\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied HEAVY polar atom at residue 4: ILE N\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied Hpol polar atom at residue 4: ILE H\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied HEAVY polar atom at residue 32: LEU O\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied HEAVY polar atom at residue 41: ILE N\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied Hpol polar atom at residue 41: ILE H\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied HEAVY polar atom at residue 42: VAL N\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied Hpol polar atom at residue 42: VAL H\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied Hpol polar atom at residue 65: ASN 2HD2\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied HEAVY polar atom at residue 66: GLN O\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied HEAVY polar atom at residue 101: LEU O\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied HEAVY polar atom at residue 109: VAL N\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied Hpol polar atom at residue 109: VAL H\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied HEAVY polar atom at residue 110: ILE N\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied Hpol polar atom at residue 110: ILE H\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied HEAVY polar atom at residue 127: ASN OD1\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied Hpol polar atom at residue 134: ASN 1HD2\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied HEAVY polar atom at residue 172: LEU O\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied HEAVY polar atom at residue 180: VAL N\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied Hpol polar atom at residue 180: VAL H\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied HEAVY polar atom at residue 181: ILE N\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied Hpol polar atom at residue 181: ILE H\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied HEAVY polar atom at residue 198: ASN OD1\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied HEAVY polar atom at residue 205: ASN OD1\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied Hpol polar atom at residue 205: ASN 1HD2\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m/////////////////////////////////////////////////////////////////////////////////////////\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m USER HAS SPECIFIED CUSTOM REPORTING BEHAVIOR FOR # UNSATS\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m/////////////////////////////////////////////////////////////////////////////////////////\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m\n", "INFO:rosetta:\u001b[0mprotocols.vardist_solaccess: \u001b[0mVarSolDistSasaCalculator::recompute\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "The number of unsatisfied backbone heavy atoms in minimized_start_pose is 11.0\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:rosetta:\u001b[0mprotocols.vardist_solaccess: \u001b[0mVarSolDistSasaCalculator::lookup\n", "INFO:rosetta:\u001b[0mprotocols.vardist_solaccess: \u001b[0mVarSolDistSasaCalculator::lookup\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m buried unsats in input pose:\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m all_heavy_atom_unsats = 16\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m bb_heavy_atom_unsats = 9\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m sc_heavy_atom_unsats = 7\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m countable_nonheavy_unsats = 11\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied HEAVY polar atom at residue 4: GLU N\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied Hpol polar atom at residue 4: GLU H\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied HEAVY polar atom at residue 32: ARG N\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied Hpol polar atom at residue 32: ARG H\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied HEAVY polar atom at residue 41: TYR OH\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied HEAVY polar atom at residue 42: GLU N\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied Hpol polar atom at residue 42: GLU H\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied HEAVY polar atom at residue 56: GLU OE1\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied HEAVY polar atom at residue 66: TYR O\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied HEAVY polar atom at residue 101: LEU O\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied HEAVY polar atom at residue 110: ILE N\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied Hpol polar atom at residue 110: ILE H\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied HEAVY polar atom at residue 116: VAL N\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied Hpol polar atom at residue 116: VAL H\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied HEAVY polar atom at residue 127: ASN OD1\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied HEAVY polar atom at residue 127: ASN ND2\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied Hpol polar atom at residue 127: ASN 1HD2\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied Hpol polar atom at residue 127: ASN 2HD2\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied Hpol polar atom at residue 128: GLN 2HE2\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied HEAVY polar atom at residue 134: ASN OD1\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied HEAVY polar atom at residue 172: LEU O\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied HEAVY polar atom at residue 181: ILE N\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied Hpol polar atom at residue 181: ILE H\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied HEAVY polar atom at residue 198: ASN OD1\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied Hpol polar atom at residue 199: GLN 1HE2\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied HEAVY polar atom at residue 205: ASN OD1\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied Hpol polar atom at residue 205: ASN 1HD2\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m/////////////////////////////////////////////////////////////////////////////////////////\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m USER HAS SPECIFIED CUSTOM REPORTING BEHAVIOR FOR # UNSATS\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m/////////////////////////////////////////////////////////////////////////////////////////\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m\n", "INFO:rosetta:\u001b[0mprotocols.vardist_solaccess: \u001b[0mVarSolDistSasaCalculator::recompute\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "The number of unsatisfied side-chain heavy atoms in designed_relaxed_pose is 7.0\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:rosetta:\u001b[0mprotocols.vardist_solaccess: \u001b[0mVarSolDistSasaCalculator::lookup\n", "INFO:rosetta:\u001b[0mprotocols.vardist_solaccess: \u001b[0mVarSolDistSasaCalculator::lookup\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m buried unsats in input pose:\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m all_heavy_atom_unsats = 16\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m bb_heavy_atom_unsats = 9\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m sc_heavy_atom_unsats = 7\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m countable_nonheavy_unsats = 11\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied HEAVY polar atom at residue 4: GLU N\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied Hpol polar atom at residue 4: GLU H\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied HEAVY polar atom at residue 32: ARG N\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied Hpol polar atom at residue 32: ARG H\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied HEAVY polar atom at residue 41: TYR OH\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied HEAVY polar atom at residue 42: GLU N\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied Hpol polar atom at residue 42: GLU H\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied HEAVY polar atom at residue 56: GLU OE1\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied HEAVY polar atom at residue 66: TYR O\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied HEAVY polar atom at residue 101: LEU O\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied HEAVY polar atom at residue 110: ILE N\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied Hpol polar atom at residue 110: ILE H\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied HEAVY polar atom at residue 116: VAL N\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied Hpol polar atom at residue 116: VAL H\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied HEAVY polar atom at residue 127: ASN OD1\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied HEAVY polar atom at residue 127: ASN ND2\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied Hpol polar atom at residue 127: ASN 1HD2\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied Hpol polar atom at residue 127: ASN 2HD2\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied Hpol polar atom at residue 128: GLN 2HE2\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied HEAVY polar atom at residue 134: ASN OD1\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied HEAVY polar atom at residue 172: LEU O\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied HEAVY polar atom at residue 181: ILE N\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied Hpol polar atom at residue 181: ILE H\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied HEAVY polar atom at residue 198: ASN OD1\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied Hpol polar atom at residue 199: GLN 1HE2\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied HEAVY polar atom at residue 205: ASN OD1\n", "INFO:rosetta:\u001b[0mprotocols.simple_filters.BuriedUnsatHbondFilter: \u001b[0m Unsatisfied Hpol polar atom at residue 205: ASN 1HD2\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "The number of unsatisfied backbone heavy atoms in designed_relaxed_pose is 9.0\n" ] } ], "source": [ "print(\"The number of unsatisfied side-chain heavy atoms in minimized_start_pose is {}\".format(uhb.get_filter(\"uhb_sc\").score(minimized_start_pose)))\n", "print(\"The number of unsatisfied backbone heavy atoms in minimized_start_pose is {}\".format(uhb.get_filter(\"uhb_bb\").score(minimized_start_pose)))\n", "\n", "print(\"The number of unsatisfied side-chain heavy atoms in designed_relaxed_pose is {}\".format(uhb.get_filter(\"uhb_sc\").score(designed_relaxed_pose)))\n", "print(\"The number of unsatisfied backbone heavy atoms in designed_relaxed_pose is {}\".format(uhb.get_filter(\"uhb_bb\").score(designed_relaxed_pose)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " Inspect the tracer output from the `BuriedUnsatHbonds` filter, and inspect `designed_relaxed_pose` very closely in PyMol or py3Dmol. Would you agree with the `BuriedUnsatHbonds` filter? How does the number of buried unsatisfied heavy atoms compare to `minimized_start_pose`?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " Packer results are stochastic based on a random number generator, that is after running `pyrosetta.init()` you see:\n", ">rosetta:core.init.random: RandomGenerator:init: Normal mode, seed=937978431 RG_type=mt19937\n", "\n", "How do your results compare with your neighbors' results? Ideally you would run the same protocol hundreds of times, and filter them down using Rosetta filters that recaptiulate your design requirements to a number of designs that you can then experimentally validate to answer your biological question." ] }, { "cell_type": "markdown", "metadata": {}, "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": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "< [*De Novo* Parametric Backbone Design](http://nbviewer.jupyter.org/github/RosettaCommons/PyRosetta.notebooks/blob/master/notebooks/06.06-Introduction-to-Parametric-backbone-design.ipynb) | [Contents](toc.ipynb) | [Index](index.ipynb) | [**Point Mutation Scan**](http://nbviewer.jupyter.org/github/RosettaCommons/PyRosetta.notebooks/blob/master/notebooks/06.08-Point-Mutation-Scan.ipynb) >

\"Open" ] } ], "metadata": { "celltoolbar": "Create Assignment", "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.0" }, "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": 2 }