{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# PYROSETTA.DISTRIBUTED - RosettaScripts/Python Interface Integration" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Integration Components\n", "The python software ecosystem relies on a small set of shared core interfaces utilizing primitive language-native data structures, pure function invocation, and object serialization to provide loosely coupled interoperability between independent software components. Our component, the `pyrosetta.distributed` namespace, utilizes established elements of the Rosetta internal architecture: the Pose model & score representation, RosettaScript protocols, and Pose serialization. \n", "\n", "The adoption of a small set of core interfaces supports integration with an array of scientific computing tools, including support for interactive development environments, common record-oriented data formats, statistical analysis and machine learning packages, and multiple distributed computing packages. The pyrosetta.distributed package provides example integrations with several preferred packages for data analysis (Pandas), distributed computing (Dask), and interactive development (Jupyter Notebook), but is loosely coupled to allow later integration with additional libraries." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "PyRosetta-4 2019 [Rosetta PyRosetta4.conda.linux.CentOS.python37.Release 2019.22+release.d8f9b4a90a8f2caa32948bacdb6e551591facd5f 2019-05-30T13:47:16] retrieved from: http://www.pyrosetta.org\n", "(C) Copyright Rosetta Commons Member Institutions. Created in JHU by Sergey Lyskov and PyRosetta Team.\n" ] } ], "source": [ "import pyrosetta.distributed\n", "\n", "# Distributed components perform default initialization on-demand, but \n", "# can be request custom initialization via\n", "pyrosetta.distributed.maybe_init()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Data Structures (pyrosetta.distributed.packed_pose)\n", "“Primitive” datatypes form a primary interface between many python libraries and, though not strictly defined, typically include the built-in scalar types (string, int, bool, float, ...), key-value dicts, and lists. Libraries operating on more complex user-defined classes often expose routines interconverting to and from primitive datatypes, and primitive datatypes can be efficiently serialized in multiple formats.\n", "For interaction between Rosetta protocol components and external libraries, we developed the `pyrosetta.distributed.packed_pose` namespace. This implements an isomorphism between the Pose object and dict-like records of the molecular model and scores. The Pose class represents a mutable, full-featured molecular model with non-trivial memory footprint. A Pose may be inexpensively interconverted to a compact binary encoding via recently developed cereal-based serialization in the suite. This serialized format is used to implement the `PackedPose` class, an immutable record containing model scores and the encoded model, which is isomorphic to a dict-based record. Adaptor functions within the packed_pose namespace freely adapt between collections of Pose (`packed_pose.to_pose`), PackedPose (`packed_pose.to_packed`), dict-records (`packed_pose.to_dict`) and pandas.DataFrame objects. (Fig 2.A)" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "dict_keys(['pickled_pose'])" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import pyrosetta.distributed.packed_pose as packed_pose\n", "import pyrosetta.distributed.io as io\n", "import requests\n", "import pandas\n", "\n", "ubq = io.pose_from_pdbstring(requests.get(\"https://files.rcsb.org/download/1UBQ.pdb\").text)\n", "\n", "# Packed pose structures interconvert between multiple datatypes.\n", "display(ubq)\n", "display(packed_pose.to_pose(ubq))\n", "display(packed_pose.to_dict(ubq).keys())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A dict-record and DataFrame interface provides zero-friction integration with a wide variety of data analysis tools and storage formats. For example, the record-oriented format can be passed through statsmodels or scikit-learn based filtering and analysis and written to any json-encoded text file, avro record-oriented storage, or parquet column-oriented storage. The pyrosetta.distributed.io namespace implements functions that mirror the pyrosetta.io namespace, providing conversion between PackedPose and the PDB, MMCIF & Rosetta silent-file formats.\n", "Critically, the PackedPose record format can also be transparently serialized, stored with a minimal memory footprint, and transmitted between processes in a distributed computing context. This allows a distributed system to process PackedPose records as plain data, storing and transmitting a large number of model decoys while only unpacking a small working set into heavyweight Pose objects. " ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
pickled_pose
0gANjcHlyb3NldHRhLnJvc2V0dGEuY29yZS5wb3NlClBvc2...
1gANjcHlyb3NldHRhLnJvc2V0dGEuY29yZS5wb3NlClBvc2...
2gANjcHlyb3NldHRhLnJvc2V0dGEuY29yZS5wb3NlClBvc2...
3gANjcHlyb3NldHRhLnJvc2V0dGEuY29yZS5wb3NlClBvc2...
4gANjcHlyb3NldHRhLnJvc2V0dGEuY29yZS5wb3NlClBvc2...
\n", "
" ], "text/plain": [ " pickled_pose\n", "0 gANjcHlyb3NldHRhLnJvc2V0dGEuY29yZS5wb3NlClBvc2...\n", "1 gANjcHlyb3NldHRhLnJvc2V0dGEuY29yZS5wb3NlClBvc2...\n", "2 gANjcHlyb3NldHRhLnJvc2V0dGEuY29yZS5wb3NlClBvc2...\n", "3 gANjcHlyb3NldHRhLnJvc2V0dGEuY29yZS5wb3NlClBvc2...\n", "4 gANjcHlyb3NldHRhLnJvc2V0dGEuY29yZS5wb3NlClBvc2..." ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Collections of packed pose structures interconvert to pandas DataFrame.\n", "\n", "frame_poses = pandas.DataFrame.from_records([packed_pose.to_dict(ubq) for _ in range(5)])\n", "display(frame_poses)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[,\n", " ,\n", " ,\n", " ,\n", " ]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "packed_poses = packed_pose.to_packed(frame_poses)\n", "display(packed_poses)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Protocol Components (pyrosetta.distributed.tasks)\n", "\n", "RosettaScripts uses an XML-based DSL to tersely encode molecular modeling protocols with a pipeline-like dataflow. The rosetta_scripts interpreter functions by parsing, XSD-validating and initializing a single RosettaScripts protocol. It then applies this protocol to input structures repeatedly to produce simulation output. Recent work has expanded support for more complex dataflow, including multi-stage operations and additional logic; however, RosettaScripts is not intended to be a general purpose programming language. \n", "\n", "The pyrosetta.distributed.tasks namespace encapsulates the RosettaScripts interface, allowing the DSL to be utilized within python processes. Protocol components are represented as ‘task’ objects containing an XML encoded script. Task objects are serializable via the standard pickle interface, and they use a simple caching strategy to perform on-demand initialization of the underlying protocol object as needed for task application." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "SingleoutputRosettaScriptsTask(protocol_xml = '\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n ')" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "ScorePoseTask(patch = None, weights = None)" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "{'fa_atr': -397.6465926658618,\n", " 'fa_rep': 103.70704606947386,\n", " 'fa_sol': 242.95183729178729,\n", " 'fa_intra_rep': 355.46866408199486,\n", " 'fa_intra_sol_xover4': 16.826406860919942,\n", " 'lk_ball_wtd': -8.755571649079277,\n", " 'fa_elec': -113.09090558288852,\n", " 'pro_close': 1.906104764589372,\n", " 'hbond_sr_bb': -18.828056617518506,\n", " 'hbond_lr_bb': -23.131565839644882,\n", " 'hbond_bb_sc': -7.389119588161401,\n", " 'hbond_sc': -1.5490919363291988,\n", " 'dslf_fa13': 0.0,\n", " 'omega': 4.283688243517373,\n", " 'fa_dun': 412.2840241807293,\n", " 'p_aa_pp': -21.346309331921773,\n", " 'yhh_planarity': 0.0,\n", " 'ref': 11.884429999999998,\n", " 'rama_prepro': -16.216376041300332,\n", " 'total_score': 32.67775729376015}" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import pyrosetta.distributed.tasks.score as score\n", "import pyrosetta.distributed.tasks.rosetta_scripts as rosetta_scripts\n", "\n", "# A blank RosettaScripts task\n", "blank_task = rosetta_scripts.SingleoutputRosettaScriptsTask(\"\"\"\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \"\"\")\n", "display(blank_task)\n", "\n", "# A simple scoring task\n", "score_task = score.ScorePoseTask()\n", "display(score_task)\n", "\n", "# The results of filters and scores are available as the PackedPose \"scores\"\n", "scored_ubq = score_task(ubq)\n", "display(scored_ubq.scores)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Task components accept any valid pose-equivalent data structure and return immutable PackedPose data structures by (1) deserializing the input into a short-lived Pose object, (2) applying the parsed protocol to the Pose and (3) serializing the resulting model as a PackedPose. Two task classes, SingleOutputRosettaScriptsTask and MultipleOutputRosettaScriptsTask define either a one-to-one function returning a single output, or a one-to-many protocol component returning a lazy iterator of outputs. All tasks operate as “pure functions”, returning a modified copy rather than directly manipulating input data structures. (Fig 2.B)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "relaxed score: -234.77631712424798\n", "delta score: -267.45407441800813\n" ] } ], "source": [ "relax_task = rosetta_scripts.SingleoutputRosettaScriptsTask(\"\"\"\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\"\"\")\n", "\n", "# Protocol execution does not change the input pose.\n", "# A modified copy is returned.\n", "relaxed_ubq = relax_task(scored_ubq)\n", "\n", "print(f\"relaxed score: {relaxed_ubq.scores['total_score']}\")\n", "print(f\"delta score: {relaxed_ubq.scores['total_score'] - scored_ubq.scores['total_score']}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Interactive Analysis and Notebook-based Computing\n", "Notebook-based interactive analysis, typified by the Jupyter project,18 has become a dominant tool in modern data science software development. In this model, data, code, output, and visualization are combined in a single document which is viewed and edited through a browser-based interface to a remote execution environment.\n", "\n", "To facilitate interactive analysis, we extended the PyRosetta Pose interface to expose total, residue one-body, and residue-pair two-body terms of the Rosetta score function as NumPy structured arrays. Combined with the pandas.DataFrame representation offered in pyrosetta.distributed.packed_pose, this provides an expressive interface for interactive model analysis and selection." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "dtype([('fa_atr', '" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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//57ysvLGTp0aJfWAnDJJZfw6aefYrFYSE1NvaD7qlQqNBpNm9K51tZWPv7447NuW1FRwYMPPsiUKVN46623+PnPf86jjz7K6NGjGTJkSJfXL4QQQoi2JPAjhBBC9EPZ2dmYzWZMJhM1NTXs37+fDRs2oNFoeOGFFxwZMwCPP/44q1at4vbbb2fJkiVERUVRX19PTk4OmZmZPPfcc+d8HnvJ2Guvvcbs2bNRq9UkJyczY8YMtFotv/71r7njjjswGAy899576HS6Dtfe0NDAT37yExYuXEhCQgIBAQFkZGSwbds2R9ZNQEAADz30EI899hi33XYbN954IxERERQWFnLs2DF+97vfoVarefDBB3nggQe46667WLZsGQaDgTfeeAOdTsf999/fqfeyO++P3dKlS/nss88c5VEzZszo8D6XXHKJY3qXfdT8G2+8cd7yts64+uqr+eSTT7jzzjtZuXIlKSkpaLVaysrK2LNnD5dffvk5s5vmzJnDW2+9xf3338+yZcuoq6vjjTfeaBPgAzCbzdx///2oVCqeeeYZNBoNTz31FNdeey333Xcf7777ruM+t956K/v27ePo0aPdel1CCCFEfyWBHyGEEKIfevjhhwHrSPHg4GASExNZtWoVN9xwQ5ugD1gbAK9bt46XX36ZP//5z+h0OkJDQ0lMTGTBggXnfZ6FCxdy8OBB3n33Xf7973+jKArffPMNiYmJPP/88zz77LPce++9hIaGsnDhQm677TZWrVp13sf08fEhJSWFjz76iOLiYkwmE4MGDWLVqlXccccdjtvdcMMNREZG8vrrr/PYY4+hKAqDBw/m2muvddxm0aJF+Pn58eqrr3Lfffeh0WhITU3lnXfeYeLEiZ16L7vz/tjNmDGDQYMGUVpayurVq9tkzJzLo48+ipeXF6+++irNzc2MHj2a559/nn/961+des5z0Wg0vPTSS7zzzjt89NFHvPrqq2g0GqKjo5kyZYojmNee6dOn8+c//5nXXnuN1atXExUVxY033ugozbN77rnn2L9/P2+++aajz1BISAj/+Mc/WLFiBX/7298ct7dYLJjN5m69JiGEEKI/Uylnju4QQgghhBBCCCGEEB5DxrkLIYQQQgghhBBCeCgJ/AghhBBCCCGEEEJ4KAn8CCGEEEIIIYQQQngoCfwIIYQQQgghhBBCeCgJ/AghhBBC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TXHGGWdERMQLXvCCOOWUU+LTn/50XHLJJZ2+Tei6Qi3xM/2Mn2q1Or7VS6sXAAAADUolkly2bFkUi8Xax/fcc0+tMiiRy+Xi5S9/edxxxx1TtoXBzi43VsGTzPCZSrkyfva1egEAANCorkWSpVIpNm/eHP/8z/8cN998c7zpTW+qPbd27dqIiDjggAMmvGb58uWxefPmWLduXbduE7qmVvFTmT6xWaxLChnuDAAAQKM63uoVEfHQQw/Fb/zGb9Q+Puuss+LNb35z7eMNGzZEX19fLFy4cMLrlixZEhERzzzzTOy5555N/d05wTJNSs5Op85QX18uIiLKlUrkp6nmqY6M/3nhwnxkM+b87Ew6fYaY25wfWuUM0SpniFY4P7TKGWqfhhM/GzdujMcee2zG6/bdd9/o6+uLiIi99torvvrVr8aWLVvi3/7t3+Lqq6+ObDYb5513Xu36zBQBbdLiNdVzszU01N/0ayGic2do8eBoojObzcWyZYumvKacGftml83ErrsMduQ+6Dzfh2iF80OrnCFa5QzRCueHVjlDrWs48XP77bfHBRdcMON1N998cxx66KEREdHX1xcrV66MiIgXvvCFMTAwEB/72Mfi93//92P33XePoaGhGBkZiZGRkViwYEHtPTZs2BAR45U/zdiwYWuUZ9iaBFPJ5bIxNNTfsTNU3DY652rL8LZ4+unNU17zxFNbImJ0vs9019C7On2GmNucH1rlDNEqZ4hWOD+0yhnasaGh/llXQzWc+Dn11FPj1FNPbfim6h122GFRLpfj0Ucfjd133z2WL18eEaOzflasWFG7bu3atbFo0aLYY489mv67yuXKDofnwkw6dYaStq1icfr3Hx4pRcTofB/neOfl+xCtcH5olTNEq5whWuH80CpnqHWpNMt9//vfj0wmE/vss09ERBx11FGxePHiuOWWW2rXlMvluPXWW+OEE05oqdULelV+bKtXcQfZ62TVe3ItAAAANKKjw503btwYa9asiVe+8pXx7Gc/O0qlUnz3u9+N66+/Pn7v934vdtttt4gYbQU766yz4pJLLolddtklVqxYETfccEM88sgjcfHFF3fyFiE1yZauHZUtJkkhq9wBAABoRkcTPwsWLIj9998/PvvZz8a6deti4cKFsd9++8WHP/zhePWrXz3h2tNPPz2q1Wpcf/318cQTT8RBBx0U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/Z5Te8/h4eGoVCrx1reeHUuXLovHHlsXf/M318Z733t+XHrpp5v6vB599H/i/e9/d7zkJb8ZZ555TlQq1Xjggf+OjRs31q754hf/Ji6//NJYtepV8da3nh2lUim+//1/j2eeeTr23HOvWLful3H22Wtir732ive970NRLlfi2muvjHPOWR2f/eyXYtmyZbX3+upX/zYOP/y5ccEFfxLFYikiRpM+5577tjjmmBfFhz98UQwPb42rr74i3v3ud8ZVV322qc8LAAAAepnET51qtRoXff6eeODR9andw6/usyQueP1Rs07+POtZ+8TSpcvil7/83zj88JW1x//kT94dhxyyIj7ykYtqjw0NDcWHP/z+uOeef4+jjnp+POc5+0dExAEHLI9DDllRu27ZsmVx/vkX1D4ulUqx1157x9lnr46HH34o9tvv2Q1/Xv/93/dFqVSKd77zXTEwsCgiIl74wmNrz2/atCmuvfaqeOUrfzve9a731R4//vgX1/78la98MUqlYlx88adqSZ7DDjs8Xve6344bb/xKnHHG2+o+1yVx4YV/OeG/46c//ck45JBD48/+7K9qj++///I47bTXxXe+c9eEyiMAAACYCwx33t4c2KK9ZcuWuP/+/46TTnrphMdPPPElkcvl4t57/2PG97jttn+Mt7zlD+KlLz0+XvziY+Lss1dHRMQjjzzc1D0tX35g5HK5+NCH3h933fXt2LRp04Tnf/Sje2N4eDhWrXrVtO/xn//5H3HUUUdPqOzZc8+94vDDnzvpczrmmBdNSPoMDw/HD3/4n3HiiS+JcrkcpVIpSqVS7Lffs2PXXXeLn/70J019XgAAANDLVPzUyWQyccHrj9qpWr2msmnTxqhWq7HrrrtOeDyfz8eSJUtjw4YdVzTdcce34sILPxivfOVvx1vfenYMDS2NJ598It773vNj27aRpu5pv/2eHX/xF5fE9ddfF+973x9HJpOJF77w2HjHO94de+65Z+2edttt92nfY+PGDXHggQdNenzXXXeNhx9+aMJj9cmh5LXlcjkuvfTiuPTSiye9x2OPrWvm0wIAAICeJvGznUwmEwv6du6NSoODiyOTycRTTz054fFSqRTr1z8TQ0NLdvj6b33rG3HggQdNaLn6wQ++3/J9HXPMr8Uxx/xabN68Kb773e/EZZddHBdd9OH467++onZPTzzx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iB/84Adx9tlnx6te9ap4z3veE/fcc09ceOGF0dfXF6997WtT/gxI2/r16+N5z3tenHbaaTE0NBT3339/XHbZZXH//ffHtddeGxHOELN3+eWXR7lcnvS4n2PM5DOf+UwsXry49vEee+xR+7Pzw0wuu+yy+OxnPxtnnnlmHHHEEbF+/fq48847a887Q+zIBz/4wdi0adOExz73uc/F17/+9Tj22GMjwhlqi+occ+WVV1aPOOKI6pNPPll77O/+7u+qBx10UPWBBx5I8c7oReVyufbnd7/73dVXvOIVk6552cteVj3vvPMmPHb66adXX/va13b8/uht9d9nEn/2Z39WXblyZXVkZKRarVarZ5xxRvV3fud3Jlzz/ve/v/qiF71owvmDxJe//OXqQQcdVP3lL39ZrVadIWbngQceqB555JHVv/3bv60edNBB1Xvvvbf2nJ9jTOdrX/ta9aCDDpry51nC+WFHHnjggeqhhx5avfPOO6e9xhmiUSeddFJ1zZo1tY+dodbNuVavb3/723HsscfGLrvsUnvsN3/zN6Ovry/uuOOOFO+MXpTN7vhL4JFHHokHH3xwUgvYqlWr4t57742nnnqqk7dHj6v/PpM49NBDY2RkJJ555pnYtm1bfPe7341XvOIVE6455ZRT4vHHH4+f/OQn3bpVdiJLly6NiIhSqeQMMWsf/ehH43Wve13sv//+Ex73c4xWOD/M5MYbb4x999132qoLZ4hG3XPPPfE///M/ccopp0SEM9Qucy7xs3bt2li+fPmEx/r6+mK//faLtWvXpnRX7KwefPDBiIg44IADJjy+fPnyqFartech8f3vfz+WLl0au+66azz88MNRLBYnnZ9f/dVfjYjwPYmacrkcIyMj8eMf/zg+9alPxYknnhjPetaznCFm5bbbbov77rsvzjnnnEnP+TnGbKxatSoOPfTQOPnkk+PKK6+stQw6P8zkP//zP+Oggw6KT33qU3HsscfG4YcfHm94wxvipz/9aUQ4QzTuH/7hH6K/vz9OPvnkiHCG2mVOzvgZGhqa9PjQ0FCsX78+hTtiZ5acme3P1JIlSyY8DxERP/zhD+PGG2+Mc845J3K53LTnJ/nY+SFx4oknxrp16yIi4vjjj4+LL744Iqb/HuQMkdi6dWv8+Z//ebzzne+MwcHBSc/7OcaO7L777nHuuefGEUccEZlM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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Pose energies are available under the energies *_energies_array accessor functions.\n", "\n", "source_energies = scored_ubq.pose.energies()\n", "relaxed_energies = relaxed_ubq.pose.energies()\n", "display(relaxed_energies.residue_onebody_energies_array().dtype)\n", "\n", "source_frame = pandas.DataFrame.from_records(source_energies.residue_total_energies_array())\n", "relaxed_frame = pandas.DataFrame.from_records(relaxed_energies.residue_total_energies_array())\n", "\n", "delta = relaxed_frame - source_frame\n", "delta.index.name=\"residue index\"\n", "delta[[\"total_score\"]].plot(title=\"Delta score via relax.\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We also integrated existing documentation into the pyrosetta.distributed.docs namespace to allow introspection-based exploration of Mover and Filter " ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['BuriedUnsatHbonds',\n", " 'CalculatorFilter',\n", " 'ChainBreak',\n", " 'ChainCountFilter',\n", " 'ChainExists']" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "INFORMATION ABOUT FILTER \"ChainBreak\":\n", "\n", "DESCRIPTION:\n", "\n", "Measures the number of chainBreaks in the pose\n", "\n", "USAGE:\n", "\n", "\n", "\n", "\n", "OPTIONS:\n", "\n", "\"ChainBreak\" tag:\n", "\n", "\tthreshold (int,\"1\"): Number of chainbreaks allowed\n", "\n", "\tchain_num (int,\"1\"): which chain should we check for\n", "\n", "\ttolerance (real,\"0.13\"): the allowed angstrom deviation from the mean optimal bond length\n", "\n", "\tname (string): The name given to this instance.\n", "\n", "\tconfidence (real,\"1.0\"): Probability that the pose will be filtered out if it does not pass this Filter\n", "\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import pyrosetta.distributed.docs as docs\n", "display(dir(docs.filters)[15:20])\n", "display(docs.filters.ChainBreak)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "RosettaScripts components. Existing tools for web-based biomolecular visualization, such as `py3dmol` and `NGLview` extend this interface to a fully-featured biomolecular simulation, analysis, and visualization environment. (Fig 5)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

\n
\n", "text/html": [ "
\n", "

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", " jupyter labextension install jupyterlab_3dmol

\n", "
\n", "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import py3Dmol\n", "view = py3Dmol.view(linked=False, width=600, height=600)\n", "view.addModel( io.to_pdbstring(relaxed_ubq), \"pdb\")\n", "view.setStyle({'stick':{}})\n", "view.addStyle({'cartoon':{}})\n", "view.zoomTo()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Multithreaded and Distributed Execution\n", "Remote notebook execution has the distinct advantage of allowing a user to access computational resources far beyond the capabilities of a single workstation. By using tools such as Dask via the integrations described above, a remote notebook interface can be used to manage a distributed simulation spanning hundreds of cores for rapid model analysis, and it offers a viable alternative to traditional batch-based computing for some classes of simulation. " ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "import dask\n", "import dask.distributed\n", "\n", "# Establish a single-node cluster of worker processes.\n", "# See dask.distributed documentation for multi-node cluster tools.\n", "cluster = dask.distributed.Client(dask.distributed.LocalCluster())\n", "print(cluster)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Rosetta-based simulations frequently involve execution of a large number of independent monte-carlo sampling trajectories that all begin from a single starting structure; in other words, they are “embarrassingly” or “trivially” parallel. The Rosetta suite implements a job distribution framework to manage I/O and task scheduling for parallelizable workloads of this type; this allows the rosetta_scripts interpreter to operate as a single process or within MPI, BOINC, and other distributed computing frameworks. Semantics of the RosettaScripts language have also evolved to incorporate non-trivial forms of parallelism, including support for multi-stage scatter/gather protocols. Though fully functional, this framework is optimized for operation as a standalone application and does not provide straightforward integration with third party tools or generalized program logic.\n", "\n", "The combination of immutable data structures and pure function interfaces implemented in the pyrosetta.distributed namespace provides an alternative approach to job parallelization by integrating RosettaScripts as a submodule that is compatible with dask.distributed and other task-based distributed computing frameworks. By virtue of reliance on standard python primitives, the `pyrosetta.distributed` namespace is not tightly coupled to a single execution engine. Single-node scheduling may be managed via the standard `multiprocessing` or `concurrent.futures` interfaces, providing a zero-dependency solution for small-scale sampling or analysis tasks. Execution via MPI-based HPC deployments may be managed via the `mpi4py` interface.\n", "\n", "To support effective distributed execution, the pyrosetta.distributed namespace is intended to be installed via a build configuration of PyRosetta, provided by conda packages described above, supporting multithreaded execution. This variant utilizes existing work establishing thread-safety in the suite, and it releases the CPython global interpreter lock when calling compiled Rosetta interfaces. This enables multi-core concurrent execution of independent modeling trajectories via python-managed threads, as well as python-level operations such as network I/O and process heartbeats to occur concurrently with long-running Rosetta API calls." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[Delayed('SingleoutputRosettaScriptsTask(protocol_xml = \\'\\\\n \\\\n \\\\n \\\\n \\\\n \\\\n \\\\n \\\\n \\\\n \\\\n \\\\n \\\\n\\')-bc7d516c-6955-4e22-a22e-48a279f4c541'),\n", " Delayed('SingleoutputRosettaScriptsTask(protocol_xml = \\'\\\\n \\\\n \\\\n \\\\n \\\\n \\\\n \\\\n \\\\n \\\\n \\\\n \\\\n \\\\n\\')-5885becc-e258-42e7-bdba-8acf92ec2727'),\n", " Delayed('SingleoutputRosettaScriptsTask(protocol_xml = \\'\\\\n \\\\n \\\\n \\\\n \\\\n \\\\n \\\\n \\\\n \\\\n \\\\n \\\\n \\\\n\\')-2f0c494e-0885-4f39-9f30-236c4c42115a')]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# A \"delayed\" task is distributed on the worker clusters\n", "delayed_relax = dask.delayed(rosetta_scripts.SingleoutputRosettaScriptsTask(\"\"\"\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\"\"\"))\n", "relax_tasks = [delayed_relax(ubq) for _ in range(64)]\n", "display(relax_tasks[:3])" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "# Persist, beginning computation on the distributed cluster.\n", "relax_tasks, = dask.persist(relax_tasks)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "top - 21:42:52 up 3:06, 0 users, load average: 0.12, 0.08, 0.30\n", "Tasks: 636 total, 7 running, 629 sleeping, 0 stopped, 0 zombie\n", "%Cpu(s): 1.0 us, 0.0 sy, 0.0 ni, 98.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st\n", "KiB Mem : 19383412+total, 18696489+free, 3417512 used, 3451716 buff/cache\n", "KiB Swap: 0 total, 0 free, 0 used. 18897763+avail Mem \n", "\n", " PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND\n", "20246 lexaf 20 0 1614576 442568 198956 R 81.2 0.2 0:01.59 python\n", "20250 lexaf 20 0 1615360 441368 198936 R 81.2 0.2 0:01.59 python\n", "20252 lexaf 20 0 1613520 439736 198764 S 81.2 0.2 0:01.60 python\n", "20254 lexaf 20 0 1610652 437384 198760 S 81.2 0.2 0:01.60 python\n", "20260 lexaf 20 0 1614328 442196 198952 R 81.2 0.2 0:01.58 python\n", "20248 lexaf 20 0 1616860 439768 198928 R 75.0 0.2 0:01.59 python\n", "20256 lexaf 20 0 1613540 441372 198936 R 75.0 0.2 0:01.58 python\n", "20258 lexaf 20 0 1614572 442544 198892 R 75.0 0.2 0:01.58 python\n", " 9338 root 20 0 0 0 0 S 18.8 0.0 0:11.11 socknal_sd+\n", " 9372 root 20 0 0 0 0 S 6.2 0.0 0:00.24 ptlrpcd_02+\n", "11121 root 20 0 0 0 0 S 6.2 0.0 0:00.29 ldlm_bl_04\n", "14254 root 20 0 0 0 0 S 6.2 0.0 0:00.15 ldlm_bl_08\n", "20173 lexaf 20 0 3570384 912656 235400 S 6.2 0.5 0:22.89 ZMQbg/1\n" ] } ], "source": [ "# Multi-threaded worker processes begin a distributed relax.\n", "!top -bn1 | head -n 20" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "# Compute, pulling results from workers when completed.\n", "relax_results, = dask.compute(relax_tasks)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \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", "
fa_atrfa_repfa_solfa_intra_repfa_intra_sol_xover4lk_ball_wtdfa_elecpro_closehbond_sr_bbhbond_lr_bb...hbond_scdslf_fa13omegafa_dunp_aa_ppyhh_planarityreframa_preprototal_scorepickled_pose
0-414.53354887.017880240.935466171.63462113.561212-8.316931-138.8021210.137294-21.396509-24.637263...-9.8425930.014.882225141.846081-28.8108770.00167111.88443-25.225484-236.875258gANjcHlyb3NldHRhLnJvc2V0dGEuY29yZS5wb3NlClBvc2...
1-417.61603689.665402250.540932172.23560014.865754-8.941395-143.7299470.115414-22.292130-25.138046...-11.7095810.013.564104147.703490-26.7798530.00514611.88443-24.831541-233.748825gANjcHlyb3NldHRhLnJvc2V0dGEuY29yZS5wb3NlClBvc2...
2-416.03769686.559167241.219787171.87216113.114300-9.171195-133.3307780.140058-21.338510-24.602856...-9.8473750.014.890717137.678186-28.6456640.00162211.88443-25.542342-236.950268gANjcHlyb3NldHRhLnJvc2V0dGEuY29yZS5wb3NlClBvc2...
3-413.65253286.523066241.708757173.25391013.964998-8.175880-139.5442560.134523-21.332893-24.553072...-9.8700900.014.423985139.206573-28.5248400.00467611.88443-25.556470-237.413003gANjcHlyb3NldHRhLnJvc2V0dGEuY29yZS5wb3NlClBvc2...
4-405.05786583.600478250.550884164.49279814.157138-10.255674-143.1074070.130500-21.819339-24.785927...-10.5756840.010.606302132.080317-26.9933730.00950311.88443-24.741133-232.844306gANjcHlyb3NldHRhLnJvc2V0dGEuY29yZS5wb3NlClBvc2...
..................................................................
59-412.84965582.278599256.142183170.45700612.826256-8.202753-141.3289950.075621-21.420823-24.372237...-9.5894710.014.844322123.350891-27.3653440.00134211.88443-28.595809-241.388086gANjcHlyb3NldHRhLnJvc2V0dGEuY29yZS5wb3NlClBvc2...
60-417.56496585.638752251.586095167.49423814.068854-7.520947-146.3427240.112407-21.603107-24.666775...-12.0796060.015.722080128.969237-27.4883740.00352211.88443-25.949225-250.929621gANjcHlyb3NldHRhLnJvc2V0dGEuY29yZS5wb3NlClBvc2...
61-406.71830981.164953250.565289167.86135414.206585-7.785318-145.6537550.138510-21.896157-25.440506...-10.8263150.013.309296127.432946-27.1710710.00176911.88443-25.857702-244.112752gANjcHlyb3NldHRhLnJvc2V0dGEuY29yZS5wb3NlClBvc2...
62-405.33871781.308925242.362518170.44091313.111082-8.250842-138.9328860.111431-21.123840-25.344347...-13.2520320.014.103101133.353189-26.2219170.00049511.88443-23.497958-238.356824gANjcHlyb3NldHRhLnJvc2V0dGEuY29yZS5wb3NlClBvc2...
63-421.35582888.145221253.151362167.47235614.056122-8.470014-146.6580220.105385-21.711494-24.673435...-12.0783740.015.877242132.712699-27.7562110.00686811.88443-26.570178-249.290683gANjcHlyb3NldHRhLnJvc2V0dGEuY29yZS5wb3NlClBvc2...
\n", "

64 rows × 21 columns

\n", "
" ], "text/plain": [ " fa_atr fa_rep fa_sol fa_intra_rep fa_intra_sol_xover4 \\\n", "0 -414.533548 87.017880 240.935466 171.634621 13.561212 \n", "1 -417.616036 89.665402 250.540932 172.235600 14.865754 \n", "2 -416.037696 86.559167 241.219787 171.872161 13.114300 \n", "3 -413.652532 86.523066 241.708757 173.253910 13.964998 \n", "4 -405.057865 83.600478 250.550884 164.492798 14.157138 \n", ".. ... ... ... ... ... \n", "59 -412.849655 82.278599 256.142183 170.457006 12.826256 \n", "60 -417.564965 85.638752 251.586095 167.494238 14.068854 \n", "61 -406.718309 81.164953 250.565289 167.861354 14.206585 \n", "62 -405.338717 81.308925 242.362518 170.440913 13.111082 \n", "63 -421.355828 88.145221 253.151362 167.472356 14.056122 \n", "\n", " lk_ball_wtd fa_elec pro_close hbond_sr_bb hbond_lr_bb ... \\\n", "0 -8.316931 -138.802121 0.137294 -21.396509 -24.637263 ... \n", "1 -8.941395 -143.729947 0.115414 -22.292130 -25.138046 ... \n", "2 -9.171195 -133.330778 0.140058 -21.338510 -24.602856 ... \n", "3 -8.175880 -139.544256 0.134523 -21.332893 -24.553072 ... \n", "4 -10.255674 -143.107407 0.130500 -21.819339 -24.785927 ... \n", ".. ... ... ... ... ... ... \n", "59 -8.202753 -141.328995 0.075621 -21.420823 -24.372237 ... \n", "60 -7.520947 -146.342724 0.112407 -21.603107 -24.666775 ... \n", "61 -7.785318 -145.653755 0.138510 -21.896157 -25.440506 ... \n", "62 -8.250842 -138.932886 0.111431 -21.123840 -25.344347 ... \n", "63 -8.470014 -146.658022 0.105385 -21.711494 -24.673435 ... \n", "\n", " hbond_sc dslf_fa13 omega fa_dun p_aa_pp yhh_planarity \\\n", "0 -9.842593 0.0 14.882225 141.846081 -28.810877 0.001671 \n", "1 -11.709581 0.0 13.564104 147.703490 -26.779853 0.005146 \n", "2 -9.847375 0.0 14.890717 137.678186 -28.645664 0.001622 \n", "3 -9.870090 0.0 14.423985 139.206573 -28.524840 0.004676 \n", "4 -10.575684 0.0 10.606302 132.080317 -26.993373 0.009503 \n", ".. ... ... ... ... ... ... \n", "59 -9.589471 0.0 14.844322 123.350891 -27.365344 0.001342 \n", "60 -12.079606 0.0 15.722080 128.969237 -27.488374 0.003522 \n", "61 -10.826315 0.0 13.309296 127.432946 -27.171071 0.001769 \n", "62 -13.252032 0.0 14.103101 133.353189 -26.221917 0.000495 \n", "63 -12.078374 0.0 15.877242 132.712699 -27.756211 0.006868 \n", "\n", " ref rama_prepro total_score \\\n", "0 11.88443 -25.225484 -236.875258 \n", "1 11.88443 -24.831541 -233.748825 \n", "2 11.88443 -25.542342 -236.950268 \n", "3 11.88443 -25.556470 -237.413003 \n", "4 11.88443 -24.741133 -232.844306 \n", ".. ... ... ... \n", "59 11.88443 -28.595809 -241.388086 \n", "60 11.88443 -25.949225 -250.929621 \n", "61 11.88443 -25.857702 -244.112752 \n", "62 11.88443 -23.497958 -238.356824 \n", "63 11.88443 -26.570178 -249.290683 \n", "\n", " pickled_pose \n", "0 gANjcHlyb3NldHRhLnJvc2V0dGEuY29yZS5wb3NlClBvc2... \n", "1 gANjcHlyb3NldHRhLnJvc2V0dGEuY29yZS5wb3NlClBvc2... \n", "2 gANjcHlyb3NldHRhLnJvc2V0dGEuY29yZS5wb3NlClBvc2... \n", "3 gANjcHlyb3NldHRhLnJvc2V0dGEuY29yZS5wb3NlClBvc2... \n", "4 gANjcHlyb3NldHRhLnJvc2V0dGEuY29yZS5wb3NlClBvc2... \n", ".. ... \n", "59 gANjcHlyb3NldHRhLnJvc2V0dGEuY29yZS5wb3NlClBvc2... \n", "60 gANjcHlyb3NldHRhLnJvc2V0dGEuY29yZS5wb3NlClBvc2... \n", "61 gANjcHlyb3NldHRhLnJvc2V0dGEuY29yZS5wb3NlClBvc2... \n", "62 gANjcHlyb3NldHRhLnJvc2V0dGEuY29yZS5wb3NlClBvc2... \n", "63 gANjcHlyb3NldHRhLnJvc2V0dGEuY29yZS5wb3NlClBvc2... \n", "\n", "[64 rows x 21 columns]" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
fa_atrfa_repfa_solfa_intra_repfa_intra_sol_xover4lk_ball_wtdfa_elecpro_closehbond_sr_bbhbond_lr_bbhbond_bb_schbond_scdslf_fa13omegafa_dunp_aa_ppyhh_planarityreframa_preprototal_score
count64.00000064.00000064.00000064.00000064.00000064.00000064.00000064.00000064.00000064.00000064.00000064.00000064.064.00000064.00000064.00000064.0000006.400000e+0164.00000064.000000
mean-412.39838784.666632248.952723170.86271813.487279-8.242926-141.8909990.120264-21.631658-24.815269-12.999627-10.9334930.014.296867131.351531-27.5257430.0124381.188443e+01-25.539245-241.352149
std5.0920302.4582254.8473165.3444700.7014800.8264973.7702030.0456770.4160490.4488411.4573421.3336510.02.0642107.3133660.8967680.0631181.790399e-151.2688655.138987
min-421.89695779.929049240.367470161.35766312.286200-10.388430-150.2252410.059318-22.643724-25.658065-16.354001-14.2176830.08.937707115.768251-29.9413820.0000021.188443e+01-29.497474-253.163619
25%-416.17772882.952851245.247657167.17025712.843353-8.705077-144.7551540.092470-21.936929-25.122118-13.891951-12.0754590.012.979226125.540210-27.9272360.0013171.188443e+01-26.209107-244.884977
50%-412.69855584.353729249.709019170.46130413.616494-8.236696-142.3953100.112472-21.694169-24.795306-13.215612-10.6854790.014.532800131.981932-27.4479000.0027301.188443e+01-25.549406-241.091948
75%-407.81440186.110133251.954614174.03360514.086546-7.673382-139.7328800.132240-21.382692-24.576877-11.952388-9.8535090.015.829100136.166153-26.8384870.0060901.188443e+01-24.869320-237.144055
max-400.18579990.215249257.739908185.31301514.865754-6.772219-131.3054150.338816-20.472891-22.606144-9.671601-7.8054680.018.443958147.703490-26.1368420.5071801.188443e+01-21.722543-230.463111
\n", "
" ], "text/plain": [ " fa_atr fa_rep fa_sol fa_intra_rep fa_intra_sol_xover4 \\\n", "count 64.000000 64.000000 64.000000 64.000000 64.000000 \n", "mean -412.398387 84.666632 248.952723 170.862718 13.487279 \n", "std 5.092030 2.458225 4.847316 5.344470 0.701480 \n", "min -421.896957 79.929049 240.367470 161.357663 12.286200 \n", "25% -416.177728 82.952851 245.247657 167.170257 12.843353 \n", "50% -412.698555 84.353729 249.709019 170.461304 13.616494 \n", "75% -407.814401 86.110133 251.954614 174.033605 14.086546 \n", "max -400.185799 90.215249 257.739908 185.313015 14.865754 \n", "\n", " lk_ball_wtd fa_elec pro_close hbond_sr_bb hbond_lr_bb \\\n", "count 64.000000 64.000000 64.000000 64.000000 64.000000 \n", "mean -8.242926 -141.890999 0.120264 -21.631658 -24.815269 \n", "std 0.826497 3.770203 0.045677 0.416049 0.448841 \n", "min -10.388430 -150.225241 0.059318 -22.643724 -25.658065 \n", "25% -8.705077 -144.755154 0.092470 -21.936929 -25.122118 \n", "50% -8.236696 -142.395310 0.112472 -21.694169 -24.795306 \n", "75% -7.673382 -139.732880 0.132240 -21.382692 -24.576877 \n", "max -6.772219 -131.305415 0.338816 -20.472891 -22.606144 \n", "\n", " hbond_bb_sc hbond_sc dslf_fa13 omega fa_dun p_aa_pp \\\n", "count 64.000000 64.000000 64.0 64.000000 64.000000 64.000000 \n", "mean -12.999627 -10.933493 0.0 14.296867 131.351531 -27.525743 \n", "std 1.457342 1.333651 0.0 2.064210 7.313366 0.896768 \n", "min -16.354001 -14.217683 0.0 8.937707 115.768251 -29.941382 \n", "25% -13.891951 -12.075459 0.0 12.979226 125.540210 -27.927236 \n", "50% -13.215612 -10.685479 0.0 14.532800 131.981932 -27.447900 \n", "75% -11.952388 -9.853509 0.0 15.829100 136.166153 -26.838487 \n", "max -9.671601 -7.805468 0.0 18.443958 147.703490 -26.136842 \n", "\n", " yhh_planarity ref rama_prepro total_score \n", "count 64.000000 6.400000e+01 64.000000 64.000000 \n", "mean 0.012438 1.188443e+01 -25.539245 -241.352149 \n", "std 0.063118 1.790399e-15 1.268865 5.138987 \n", "min 0.000002 1.188443e+01 -29.497474 -253.163619 \n", "25% 0.001317 1.188443e+01 -26.209107 -244.884977 \n", "50% 0.002730 1.188443e+01 -25.549406 -241.091948 \n", "75% 0.006090 1.188443e+01 -24.869320 -237.144055 \n", "max 0.507180 1.188443e+01 -21.722543 -230.463111 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "relax_result_frame = pandas.DataFrame.from_records(packed_pose.to_dict(relax_results))\n", "display(relax_result_frame)\n", "display(relax_result_frame.describe())" ] } ], "metadata": { "kernelspec": { "display_name": "Python [rosetta_pydata_integration] *", "language": "python", "name": "conda-env-rosetta_pydata_integration-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.4" } }, "nbformat": 4, "nbformat_minor": 2 }