{ "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", "< [Running Rosetta in Parallel](http://nbviewer.jupyter.org/github/RosettaCommons/PyRosetta.notebooks/blob/master/notebooks/16.00-Running-PyRosetta-in-Parallel.ipynb) | [Contents](toc.ipynb) | [Index](index.ipynb) | [Distributed computation example: miniprotein design](http://nbviewer.jupyter.org/github/RosettaCommons/PyRosetta.notebooks/blob/master/notebooks/16.02-PyData-miniprotein-design.ipynb) >

\"Open" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Distributed analysis example: exhaustive ddG PSSM\n", "\n", "## Notes\n", "This tutorial will walk you through how to generate an exhaustive ddG PSSM in PyRosetta using the PyData stack for analysis and distributed computing.\n", "\n", "This Jupyter notebook uses parallelization and is not meant to be executed within a Google Colab environment.\n", "\n", "## Setup\n", "Please see setup instructions in Chapter 16.00\n", "\n", "## Citation\n", "[Integration of the Rosetta Suite with the Python Software Stack via reproducible packaging and core programming interfaces for distributed simulation](https://doi.org/10.1002/pro.3721)\n", "\n", "Alexander S. Ford, Brian D. Weitzner, Christopher D. Bahl\n", "\n", "## Manual\n", "Documentation for the `pyrosetta.distributed` namespace can be found here: https://nbviewer.jupyter.org/github/proteininnovation/Rosetta-PyData_Integration/blob/master/distributed_overview.ipynb" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "!pip install pyrosettacolabsetup\n", "import pyrosettacolabsetup; pyrosettacolabsetup.install_pyrosetta()\n", "import pyrosetta; pyrosetta.init()\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import logging\n", "logging.basicConfig(level=logging.INFO)" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import pandas\n", "import seaborn\n", "import matplotlib" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "import Bio.SeqUtils\n", "import Bio.Data.IUPACData as IUPACData" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "import pyrosetta\n", "import pyrosetta.distributed.io as io\n", "import pyrosetta.distributed.packed_pose as packed_pose\n", "import pyrosetta.distributed.tasks.rosetta_scripts as rosetta_scripts\n", "import pyrosetta.distributed.tasks.score as score" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'3.7.6'" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import os,sys,platform\n", "\n", "platform.python_version()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Create test pose, initialize rosetta and pack" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "input_protocol = \"\"\"\n", "\n", " \n", " \n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", "\"\"\"" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "scrolled": true }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "INFO:pyrosetta.distributed:maybe_init performing pyrosetta initialization: {'extra_options': '-out:levels all:warning', 'silent': True}\n", "INFO:pyrosetta.rosetta:Found rosetta database at: /Users/jadolfbr/anaconda3/envs/PyRosetta.notebooks/lib/python3.7/site-packages/pyrosetta/database; using it....\n", "INFO:pyrosetta.rosetta:PyRosetta-4 2019 [Rosetta PyRosetta4.conda.mac.python37.Release 2019.50+release.91b7a940f06ab065a81d9ce3046b08eef0de0b31 2019-12-12T23:03:24] retrieved from: http://www.pyrosetta.org\n", "(C) Copyright Rosetta Commons Member Institutions. Created in JHU by Sergey Lyskov and PyRosetta Team.\n" ] } ], "source": [ "input_relax = rosetta_scripts.SingleoutputRosettaScriptsTask(input_protocol)\n", "# Syntax check via setup\n", "input_relax.setup()" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "raw_input_pose = score.ScorePoseTask()(io.pose_from_sequence(\"TESTESTEST\"))\n", "input_pose = input_relax(raw_input_pose)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Perform exhaustive point mutation and pack" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "def mutate_residue(input_pose, res_index, new_aa, res_label = None):\n", " import pyrosetta.rosetta.core.pose as pose\n", " \n", " work_pose = packed_pose.to_pose(input_pose)\n", " \n", " # Annotate strucure with reslabel, for use in downstream protocol\n", " # Add parameters as score, for use in downstream analysis\n", " if res_label:\n", " work_pose.pdb_info().add_reslabel(res_index, res_label)\n", " pose.setPoseExtraScore(work_pose, \"mutation_index\", res_index)\n", " pose.setPoseExtraScore(work_pose, \"mutation_aa\", new_aa)\n", " \n", " if len(new_aa) == 1:\n", " new_aa = str.upper(Bio.SeqUtils.seq3(new_aa))\n", " assert new_aa in map(str.upper, IUPACData.protein_letters_3to1)\n", " \n", " protocol = \"\"\"\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", " \"\"\" % locals()\n", " \n", " return rosetta_scripts.SingleoutputRosettaScriptsTask(protocol)(work_pose)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "refine = \"\"\"\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", "refine_mutation = rosetta_scripts.SingleoutputRosettaScriptsTask(refine)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Mutation and pack" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Job distribution via `multiprocessing`" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "scrolled": true }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "INFO:root:mutating\n" ] } ], "source": [ "from multiprocessing import Pool\n", "import itertools\n", "with pyrosetta.distributed.utility.log.LoggingContext(logging.getLogger(\"rosetta\"), level=logging.WARN):\n", " with Pool() as p:\n", " work = [\n", " (input_pose, i, aa, \"mutation\")\n", " for i, aa in itertools.product(range(1, len(packed_pose.to_pose(input_pose).residues) + 1), IUPACData.protein_letters)\n", " ]\n", " logging.info(\"mutating\")\n", " mutations = p.starmap(mutate_residue, work)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Job distribution via `dask`" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "INFO:root:refining\n" ] } ], "source": [ "if not os.getenv(\"DEBUG\"):\n", " import dask.distributed\n", " cluster = dask.distributed.LocalCluster(n_workers=1, threads_per_worker=1)\n", " client = dask.distributed.Client(cluster)\n", "\n", " refinement_tasks = [client.submit(refine_mutation, mutant) for mutant in mutations]\n", " logging.info(\"refining\")\n", " refinements = [task.result() for task in refinement_tasks]\n", "\n", " client.close()\n", " cluster.close()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Analysis of delta score" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "scrolled": false }, "outputs": [], "source": [ "if not os.getenv(\"DEBUG\"):\n", " result_frame = pandas.DataFrame.from_records(packed_pose.to_dict(refinements))\n", " result_frame[\"delta_total_score\"] = result_frame[\"total_score\"] - input_pose.scores[\"total_score\"] \n", " result_frame[\"mutation_index\"] = list(map(int, result_frame[\"mutation_index\"]))" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "

" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "if not os.getenv(\"DEBUG\"):\n", " matplotlib.rcParams['figure.figsize'] = [24.0, 8.0]\n", " seaborn.heatmap(\n", " result_frame.pivot(\"mutation_aa\", \"mutation_index\", \"delta_total_score\"),\n", " cmap=\"RdBu_r\", center=0, vmax=50)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "< [Running Rosetta in Parallel](http://nbviewer.jupyter.org/github/RosettaCommons/PyRosetta.notebooks/blob/master/notebooks/16.00-Running-PyRosetta-in-Parallel.ipynb) | [Contents](toc.ipynb) | [Index](index.ipynb) | [Distributed computation example: miniprotein design](http://nbviewer.jupyter.org/github/RosettaCommons/PyRosetta.notebooks/blob/master/notebooks/16.02-PyData-miniprotein-design.ipynb) >

\"Open" ] } ], "metadata": { "_draft": { "nbviewer_url": "https://gist.github.com/a3118b776957d03bc4c789493bb541fe" }, "gist": { "data": { "description": "pyrosetta_distributed_mutation_demo.ipynb", "public": true }, "id": "a3118b776957d03bc4c789493bb541fe" }, "kernelspec": { "display_name": "Python [conda env:PyRosetta.notebooks]", "language": "python", "name": "conda-env-PyRosetta.notebooks-py" }, "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.7.6" }, "toc": { "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "toc_cell": false, "toc_position": {}, "toc_section_display": "block", "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 2 }