{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# COMP 364: Molecular Structures with BioPython\n", "\n", "\n", "Last week we learned about tools to deal with biological sequences with `BioPython`.\n", "\n", "Sequence analysis is very important, but ultimately, biological function is determined by structure.\n", "\n", "Here is the (partial) sequence for a dopamine transporter protein:\n", "\n", "```\n", "DERETWSGKVDFLLSVIGFAVDLANVWRFPYLCYKNGGGAFLVPYGIMLAVGGIPLFYMELALGQHNRKGAITCWGRLVP\n", "LFKGIGYAVVLIAFYVDFYYNVIIAWSLRFFFASFTNSLPWTSCNNIWNTPNCRPFEGHVEGFQSAASEYFNRYILELNR\n", "SEGIHDLGAIKWDMALCLLIVYLICYFSLWKGISTSGKVVWFTALFPYAVLLILLIRGLTLPGSFLGIQYYLTPNFSAIY\n", "KAEVWVDAATQVFFSLGPGFGVLLAYASYNKYHNNVYKDALLTSFINSATSFIAGFVIFSVLGYMAHTLGVRIEDVATEG\n", "PGLVFVVYPAAIATMPASTFWALIFFMMLATLGLDSSFGGSEAIITALSDEFPKIKRNRELFVAGLFSLYFVVGLASCTQ\n", "GGFYFFHLLDRYAAGYSILVAVFFEAIAVSWIYGTNRFSEDIRDMIGFPPGRYWQVCWRFVAPIFLLFITVYGLIGYEPL\n", "TYADYVYPSWANALGWCIAGSSVVMIPAVAIFKLLSTPGSLRQRFTILTTPWRDQ\n", "```\n", "\n", "This protein's job is to take the dopamine neurotransmitter out of the neuron's synapses and terminate that feel-good positive response we get from dopamine.\n", "\n", "This big string of text doesn't tell us much about how it can actually do this.\n", "\n", "Structural biologists are able to determine what that sequence looks like when it takes its natural shape in the cell.\n", "\n", "Here is that sequence's [structure](http://www.rcsb.org/pdb/ngl/ngl.do?pdbid=4XP1&bionumber=1) in 3D.\n", "\n", "Clearly there is a lot more information coded in the sequence that we need to consider.\n", "\n", "Today I'll walk you through extracting some useful information from this particular protein using BioPython's `PDB` module." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### What is a structure?\n", "\n", "Biomolecules such as proteins, RNA, DNA, and chemicals (such as dopamine) are made up of atoms.\n", "\n", "Each atom occupies a point in 4 dimensions: X, Y, Z, and time. For now we will forget about time and only deal with fixed shapshots of atoms.\n", "\n", "Structural biologists isolate molecules in the lab, and using tools such as X-ray crystallography can obtain the X, Y, and Z coordinates of all the atoms in the molecule.\n", "\n", "![](http://i0.wp.com/cen.xraycrystals.org/wp-content/uploads/2014/07/09232-cover1-BFormDNAcxd.jpg?resize=250%2C288)\n", "\n", "This is the famous X-ray diffraction pattern of DNA used by Watson & Crick & Franklin to solve the double helix structure of DNA.\n", "\n", "Other notable structure solving technologies: electron microscopy, cryo-electron microscopy, Nuclear Magnetic Resonance (NMR).\n", "\n", "We don't have to worry about how they did it, but for many years now, solved structures (3D positions of biomolecules atoms) have been deposited in the [RCSB PDB Database](http://www.rcsb.org/pdb/home/home.do)\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Downloading a Structure File from the PDB database\n", "\n", "Every entry in the database has a unique ID code.\n", "\n", "The dopamine transporter we are interested in is: 4XP1\n", "\n", "The main file format for sequences is `FASTA`, for structures it is `PDB` or `mmCIF`.\n", "\n", "BioPython.PDB has parsers for both.\n", "\n", "[Here](http://biopython.org/wiki/The_Biopython_Structural_Bioinformatics_FAQ) is the main BioPython.PDB reference page.\n", "\n", "We can automatically download a structure from the database using the `PDBList` object's method `retrieve_pdb_file`." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Structure exists: '/Users/carlosgonzalezoliver/Projects/Notebooks/COMP_364/L27/xp/4xp1.cif' \n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "WARNING: The default download format has changed from PDB to PDBx/mmCif\n" ] }, { "data": { "text/plain": [ "'/Users/carlosgonzalezoliver/Projects/Notebooks/COMP_364/L27/xp/4xp1.cif'" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from Bio.PDB import *\n", "\n", "pdbl = PDBList()\n", "pdbl.retrieve_pdb_file('4XP1')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "That warning tells us that the PDB format is deprecated and that the new default is mmCIF.\n", "\n", "We'll go into what that looks like in a little bit." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we should have a folder containing `4XP1.cif` in our working directory." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['.ipynb_checkpoints', '4xp1.cif', 'L27.ipynb', 'obsolete', 'xp']" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import os\n", "os.listdir()" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['4xp1.cif']" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "os.listdir('xp')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Parsing Structure files" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": true }, "outputs": [], "source": [ "parser = MMCIFParser()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The first argument to the instance method `get_structure` is an optional name for the molecule, and the second argument is the path to the structure file." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/carlosgonzalezoliver/anaconda/envs/py36/lib/python3.6/site-packages/Bio/PDB/StructureBuilder.py:84: PDBConstructionWarning: WARNING: Chain A is discontinuous at line 7477.\n", " PDBConstructionWarning)\n", "/Users/carlosgonzalezoliver/anaconda/envs/py36/lib/python3.6/site-packages/Bio/PDB/StructureBuilder.py:84: PDBConstructionWarning: WARNING: Chain L is discontinuous at line 7658.\n", " PDBConstructionWarning)\n", "/Users/carlosgonzalezoliver/anaconda/envs/py36/lib/python3.6/site-packages/Bio/PDB/StructureBuilder.py:84: PDBConstructionWarning: WARNING: Chain A is discontinuous at line 7659.\n", " PDBConstructionWarning)\n", "/Users/carlosgonzalezoliver/anaconda/envs/py36/lib/python3.6/site-packages/Bio/PDB/StructureBuilder.py:84: PDBConstructionWarning: WARNING: Chain L is discontinuous at line 7674.\n", " PDBConstructionWarning)\n", "/Users/carlosgonzalezoliver/anaconda/envs/py36/lib/python3.6/site-packages/Bio/PDB/StructureBuilder.py:84: PDBConstructionWarning: WARNING: Chain H is discontinuous at line 7677.\n", " PDBConstructionWarning)\n" ] } ], "source": [ "structure = parser.get_structure('4XP1', 'xp/4xp1.cif')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we have extracted all the structural information from the file.\n", "\n", "Let's take a peek at the attributes." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "add, child_dict, child_list, copy, detach_child, detach_parent, full_id, get_atoms, get_chains, get_full_id, get_id, get_iterator, get_level, get_list, get_models, get_parent, get_residues, has_id, header, id, insert, level, parent, set_parent, transform, xtra\n" ] } ], "source": [ "def cleandir(obj):\n", " print(\", \".join([a for a in dir(obj) if not a.startswith(\"_\")]))\n", "cleandir(structure)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Structure objects are organized in a specific hierarchy of objects.\n", "\n", "![](http://biopython.org/wiki/Smcra.png)\n", "\n", "We're just going to focus on the core elements which are: Model --> Chain --> Residue --> Atom.\n", "\n", "Each structure file can contain multiple \"models\" of the same molecule.\n", "\n", "Each model contains several \"chains\" or strands of protein/RNA/DNA/.\n", "\n", "Each \"chain\" is made up of residues, or amino acids/DNA bases/RNA bases.\n", "\n", "Each residue is made up of Atoms." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Visualizing structures in jupyter Notebooks" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There is a very nice \"widget\" for notebooks that lets us visualize structure objects.\n", "\n", "```\n", "conda config --add channels conda-forge\n", "conda install nglview -c bioconda\n", "# might need: jupyter-nbextension enable nglview --py --sys-prefix\n", "```\n", "\n", "To do more advanced manipulations, it is better to use standalone tools such as [Chimera](https://www.cgl.ucsf.edu/chimera/) and [pyMOL](https://pymol.org/2/).\n", "\n", "Let's view our dopamine transporter protein bound to dopamine." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import nglview as nv" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": true }, "outputs": [], "source": [ "view = nv.show_biopython(structure)\n", "view.clear_representations()\n", "#view as ball and stick (atom and bond)\n", "view.add_ball_and_stick()" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "180cbfac7d824c8ca406d415c761cf6f", "version_major": 2, "version_minor": 0 }, "text/plain": [ "A Jupyter Widget" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "view" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As expected, we see a bunch of atoms in 3D space. \n", "\n", "This can often be hard to look at so we usually visualize this with what's known as a \"ribbon\" representation." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "180cbfac7d824c8ca406d415c761cf6f", "version_major": 2, "version_minor": 0 }, "text/plain": [ "A Jupyter Widget" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "view.clear_representations()\n", "#add ribbons\n", "view.add_cartoon('protein')\n", "#add ball and stick for non-rotien\n", "view.add_ball_and_stick('not protein')\n", "view" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "Individual atoms are not shown and instead, each chain is visualized as a continuous ribbon. \n", "\n", "We can see here that we have 3 different chains and a couple of ligands.\n", "\n", "Let's see how we can get a handle on the different components.\n", "\n", "How many models are there in this structure? It looks like there is only one transporter protein so we should only have a single model." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "model \n" ] } ], "source": [ "for model in structure:\n", " print(f\"model {model}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ok we have one model. \n", "\n", "But we should have several chains as we saw above." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "chain , Chain ID: A\n", "chain , Chain ID: L\n", "chain , Chain ID: H\n" ] } ], "source": [ "model = structure[0] #since we only have one model\n", "for chain in model:\n", " print(f\"chain {chain}, Chain ID: {chain.id}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ok as we guessed, we have 3 chains: A, L, and H.\n", "\n", "We can go one step further and get all the residues in a chain.\n", "\n", "We can access individual chains like keys in a dictionary from a model." ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": true }, "outputs": [], "source": [ "chain_A = model['A']" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Residue name: ASP, number: 25\n", "Residue name: GLU, number: 26\n", "Residue name: ARG, number: 27\n", "Residue name: GLU, number: 28\n", "Residue name: THR, number: 29\n", "Residue name: TRP, number: 30\n", "Residue name: SER, number: 31\n", "Residue name: GLY, number: 32\n", "Residue name: LYS, number: 33\n", "Residue name: VAL, number: 34\n", "Residue name: ASP, number: 35\n", "Residue name: PHE, number: 36\n", "Residue name: LEU, number: 37\n", "Residue name: LEU, number: 38\n", "Residue name: SER, number: 39\n", "Residue name: VAL, number: 40\n", "Residue name: ILE, number: 41\n", "Residue name: GLY, number: 42\n", "Residue name: PHE, number: 43\n", "Residue name: ALA, number: 44\n", "Residue name: VAL, number: 45\n", "Residue name: ASP, number: 46\n", "Residue name: LEU, number: 47\n", "Residue name: ALA, number: 48\n", "Residue name: ASN, number: 49\n", "Residue name: VAL, number: 50\n", "Residue name: TRP, number: 51\n", "Residue name: ARG, number: 52\n", "Residue name: PHE, number: 53\n", "Residue name: PRO, number: 54\n", "Residue name: TYR, number: 55\n", "Residue name: LEU, number: 56\n", "Residue name: CYS, number: 57\n", "Residue name: TYR, number: 58\n", "Residue name: LYS, number: 59\n", "Residue name: ASN, number: 60\n", "Residue name: GLY, number: 61\n", "Residue name: GLY, number: 62\n", "Residue name: GLY, number: 63\n", "Residue name: ALA, number: 64\n", "Residue name: PHE, number: 65\n", "Residue name: LEU, number: 66\n", "Residue name: VAL, number: 67\n", "Residue name: PRO, number: 68\n", "Residue name: TYR, number: 69\n", "Residue name: GLY, number: 70\n", "Residue name: ILE, number: 71\n", "Residue name: MET, number: 72\n", "Residue name: LEU, number: 73\n", "Residue name: ALA, number: 74\n", "Residue name: VAL, number: 75\n", "Residue name: GLY, number: 76\n", "Residue name: GLY, number: 77\n", "Residue name: ILE, number: 78\n", "Residue name: PRO, number: 79\n", "Residue name: LEU, number: 80\n", "Residue name: PHE, number: 81\n", "Residue name: TYR, number: 82\n", "Residue name: MET, number: 83\n", "Residue name: GLU, number: 84\n", "Residue name: LEU, number: 85\n", "Residue name: ALA, number: 86\n", "Residue name: LEU, number: 87\n", "Residue name: GLY, number: 88\n", "Residue name: GLN, number: 89\n", "Residue name: HIS, number: 90\n", "Residue name: ASN, number: 91\n", "Residue name: ARG, number: 92\n", "Residue name: LYS, number: 93\n", "Residue name: GLY, number: 94\n", "Residue name: ALA, number: 95\n", "Residue name: ILE, number: 96\n", "Residue name: THR, number: 97\n", "Residue name: CYS, number: 98\n", "Residue name: TRP, number: 99\n", "Residue name: GLY, number: 100\n", "Residue name: ARG, number: 101\n", "Residue name: LEU, number: 102\n", "Residue name: VAL, number: 103\n", "Residue name: PRO, number: 104\n", "Residue name: LEU, number: 105\n", "Residue name: PHE, number: 106\n", "Residue name: LYS, number: 107\n", "Residue name: GLY, number: 108\n", "Residue name: ILE, number: 109\n", "Residue name: GLY, number: 110\n", "Residue name: TYR, number: 111\n", "Residue name: ALA, number: 112\n", "Residue name: VAL, number: 113\n", "Residue name: VAL, number: 114\n", "Residue name: LEU, number: 115\n", "Residue name: ILE, number: 116\n", "Residue name: ALA, number: 117\n", "Residue name: PHE, number: 118\n", "Residue name: TYR, number: 119\n", "Residue name: VAL, number: 120\n", "Residue name: ASP, number: 121\n", "Residue name: PHE, number: 122\n", "Residue name: TYR, number: 123\n", "Residue name: TYR, number: 124\n", "Residue name: ASN, number: 125\n", "Residue name: VAL, number: 126\n", "Residue name: ILE, number: 127\n", "Residue name: ILE, number: 128\n", "Residue name: ALA, number: 129\n", "Residue name: TRP, number: 130\n", "Residue name: SER, number: 131\n", "Residue name: LEU, number: 132\n", "Residue name: ARG, number: 133\n", "Residue name: PHE, number: 134\n", "Residue name: PHE, number: 135\n", "Residue name: PHE, number: 136\n", "Residue name: ALA, number: 137\n", "Residue name: SER, number: 138\n", "Residue name: PHE, number: 139\n", "Residue name: THR, number: 140\n", "Residue name: ASN, number: 141\n", "Residue name: SER, number: 142\n", "Residue name: LEU, number: 143\n", "Residue name: PRO, number: 144\n", "Residue name: TRP, number: 145\n", "Residue name: THR, number: 146\n", "Residue name: SER, number: 147\n", "Residue name: CYS, number: 148\n", "Residue name: ASN, number: 149\n", "Residue name: ASN, number: 150\n", "Residue name: ILE, number: 151\n", "Residue name: TRP, number: 152\n", "Residue name: ASN, number: 153\n", "Residue name: THR, number: 154\n", "Residue name: PRO, number: 155\n", "Residue name: ASN, number: 156\n", "Residue name: CYS, number: 157\n", "Residue name: ARG, number: 158\n", "Residue name: PRO, number: 159\n", "Residue name: PHE, number: 160\n", "Residue name: GLU, number: 161\n", "Residue name: GLY, number: 203\n", "Residue name: HIS, number: 204\n", "Residue name: VAL, number: 205\n", "Residue name: GLU, number: 206\n", "Residue name: GLY, number: 207\n", "Residue name: PHE, number: 208\n", "Residue name: GLN, number: 209\n", "Residue name: SER, number: 210\n", "Residue name: ALA, number: 211\n", "Residue name: ALA, number: 212\n", "Residue name: SER, number: 213\n", "Residue name: GLU, number: 214\n", "Residue name: TYR, number: 215\n", "Residue name: PHE, number: 216\n", "Residue name: ASN, number: 217\n", "Residue name: ARG, number: 218\n", "Residue name: TYR, number: 219\n", "Residue name: ILE, number: 220\n", "Residue name: LEU, number: 221\n", "Residue name: GLU, number: 222\n", "Residue name: LEU, number: 223\n", "Residue name: ASN, number: 224\n", "Residue name: ARG, number: 225\n", "Residue name: SER, number: 226\n", "Residue name: GLU, number: 227\n", "Residue name: GLY, number: 228\n", "Residue name: ILE, number: 229\n", "Residue name: HIS, number: 230\n", "Residue name: ASP, number: 231\n", "Residue name: LEU, number: 232\n", "Residue name: GLY, number: 233\n", "Residue name: ALA, number: 234\n", "Residue name: ILE, number: 235\n", "Residue name: LYS, number: 236\n", "Residue name: TRP, number: 237\n", "Residue name: ASP, number: 238\n", "Residue name: MET, number: 239\n", "Residue name: ALA, number: 240\n", "Residue name: LEU, number: 241\n", "Residue name: CYS, number: 242\n", "Residue name: LEU, number: 243\n", "Residue name: LEU, number: 244\n", "Residue name: ILE, number: 245\n", "Residue name: VAL, number: 246\n", "Residue name: TYR, number: 247\n", "Residue name: LEU, number: 248\n", "Residue name: ILE, number: 249\n", "Residue name: CYS, number: 250\n", "Residue name: TYR, number: 251\n", "Residue name: PHE, number: 252\n", "Residue name: SER, number: 253\n", "Residue name: LEU, number: 254\n", "Residue name: TRP, number: 255\n", "Residue name: LYS, number: 256\n", "Residue name: GLY, number: 257\n", "Residue name: ILE, number: 258\n", "Residue name: SER, number: 259\n", "Residue name: THR, number: 260\n", "Residue name: SER, number: 261\n", "Residue name: GLY, number: 262\n", "Residue name: LYS, number: 263\n", "Residue name: VAL, number: 264\n", "Residue name: VAL, number: 265\n", "Residue name: TRP, number: 266\n", "Residue name: PHE, number: 267\n", "Residue name: THR, number: 268\n", "Residue name: ALA, number: 269\n", "Residue name: LEU, number: 270\n", "Residue name: PHE, number: 271\n", "Residue name: PRO, number: 272\n", "Residue name: TYR, number: 273\n", "Residue name: ALA, number: 274\n", "Residue name: VAL, number: 275\n", "Residue name: LEU, number: 276\n", "Residue name: LEU, number: 277\n", "Residue name: ILE, number: 278\n", "Residue name: LEU, number: 279\n", "Residue name: LEU, number: 280\n", "Residue name: ILE, number: 281\n", "Residue name: ARG, number: 282\n", "Residue name: GLY, number: 283\n", "Residue name: LEU, number: 284\n", "Residue name: THR, number: 285\n", "Residue name: LEU, number: 286\n", "Residue name: PRO, number: 287\n", "Residue name: GLY, number: 288\n", "Residue name: SER, number: 289\n", "Residue name: PHE, number: 290\n", "Residue name: LEU, number: 291\n", "Residue name: GLY, number: 292\n", "Residue name: ILE, number: 293\n", "Residue name: GLN, number: 294\n", "Residue name: TYR, number: 295\n", "Residue name: TYR, number: 296\n", "Residue name: LEU, number: 297\n", "Residue name: THR, number: 298\n", "Residue name: PRO, number: 299\n", "Residue name: ASN, number: 300\n", "Residue name: PHE, number: 301\n", "Residue name: SER, number: 302\n", "Residue name: ALA, number: 303\n", "Residue name: ILE, number: 304\n", "Residue name: TYR, number: 305\n", "Residue name: LYS, number: 306\n", "Residue name: ALA, number: 307\n", "Residue name: GLU, number: 308\n", "Residue name: VAL, number: 309\n", "Residue name: TRP, number: 310\n", "Residue name: VAL, number: 311\n", "Residue name: ASP, number: 312\n", "Residue name: ALA, number: 313\n", "Residue name: ALA, number: 314\n", "Residue name: THR, number: 315\n", "Residue name: GLN, number: 316\n", "Residue name: VAL, number: 317\n", "Residue name: PHE, number: 318\n", "Residue name: PHE, number: 319\n", "Residue name: SER, number: 320\n", "Residue name: LEU, number: 321\n", "Residue name: GLY, number: 322\n", "Residue name: PRO, number: 323\n", "Residue name: GLY, number: 324\n", "Residue name: PHE, number: 325\n", "Residue name: GLY, number: 326\n", "Residue name: VAL, number: 327\n", "Residue name: LEU, number: 328\n", "Residue name: LEU, number: 329\n", "Residue name: ALA, number: 330\n", "Residue name: TYR, number: 331\n", "Residue name: ALA, number: 332\n", "Residue name: SER, number: 333\n", "Residue name: TYR, number: 334\n", "Residue name: ASN, number: 335\n", "Residue name: LYS, number: 336\n", "Residue name: TYR, number: 337\n", "Residue name: HIS, number: 338\n", "Residue name: ASN, number: 339\n", "Residue name: ASN, number: 340\n", "Residue name: VAL, number: 341\n", "Residue name: TYR, number: 342\n", "Residue name: LYS, number: 343\n", "Residue name: ASP, number: 344\n", "Residue name: ALA, number: 345\n", "Residue name: LEU, number: 346\n", "Residue name: LEU, number: 347\n", "Residue name: THR, number: 348\n", "Residue name: SER, number: 349\n", "Residue name: PHE, number: 350\n", "Residue name: ILE, number: 351\n", "Residue name: ASN, number: 352\n", "Residue name: SER, number: 353\n", "Residue name: ALA, number: 354\n", "Residue name: THR, number: 355\n", "Residue name: SER, number: 356\n", "Residue name: PHE, number: 357\n", "Residue name: ILE, number: 358\n", "Residue name: ALA, number: 359\n", "Residue name: GLY, number: 360\n", "Residue name: PHE, number: 361\n", "Residue name: VAL, number: 362\n", "Residue name: ILE, number: 363\n", "Residue name: PHE, number: 364\n", "Residue name: SER, number: 365\n", "Residue name: VAL, number: 366\n", "Residue name: LEU, number: 367\n", "Residue name: GLY, number: 368\n", "Residue name: TYR, number: 369\n", "Residue name: MET, number: 370\n", "Residue name: ALA, number: 371\n", "Residue name: HIS, number: 372\n", "Residue name: THR, number: 373\n", "Residue name: LEU, number: 374\n", "Residue name: GLY, number: 375\n", "Residue name: VAL, number: 376\n", "Residue name: ARG, number: 377\n", "Residue name: ILE, number: 378\n", "Residue name: GLU, number: 379\n", "Residue name: ASP, number: 380\n", "Residue name: VAL, number: 381\n", "Residue name: ALA, number: 382\n", "Residue name: THR, number: 383\n", "Residue name: GLU, number: 384\n", "Residue name: GLY, number: 385\n", "Residue name: PRO, number: 386\n", "Residue name: GLY, number: 387\n", "Residue name: LEU, number: 388\n", "Residue name: VAL, number: 389\n", "Residue name: PHE, number: 390\n", "Residue name: VAL, number: 391\n", "Residue name: VAL, number: 392\n", "Residue name: TYR, number: 393\n", "Residue name: PRO, number: 394\n", "Residue name: ALA, number: 395\n", "Residue name: ALA, number: 396\n", "Residue name: ILE, number: 397\n", "Residue name: ALA, number: 398\n", "Residue name: THR, number: 399\n", "Residue name: MET, number: 400\n", "Residue name: PRO, number: 401\n", "Residue name: ALA, number: 402\n", "Residue name: SER, number: 403\n", "Residue name: THR, number: 404\n", "Residue name: PHE, number: 405\n", "Residue name: TRP, number: 406\n", "Residue name: ALA, number: 407\n", "Residue name: LEU, number: 408\n", "Residue name: ILE, number: 409\n", "Residue name: PHE, number: 410\n", "Residue name: PHE, number: 411\n", "Residue name: MET, number: 412\n", "Residue name: MET, number: 413\n", "Residue name: LEU, number: 414\n", "Residue name: ALA, number: 415\n", "Residue name: THR, number: 416\n", "Residue name: LEU, number: 417\n", "Residue name: GLY, number: 418\n", "Residue name: LEU, number: 419\n", "Residue name: ASP, number: 420\n", "Residue name: SER, number: 421\n", "Residue name: SER, number: 422\n", "Residue name: PHE, number: 423\n", "Residue name: GLY, number: 424\n", "Residue name: GLY, number: 425\n", "Residue name: SER, number: 426\n", "Residue name: GLU, number: 427\n", "Residue name: ALA, number: 428\n", "Residue name: ILE, number: 429\n", "Residue name: ILE, number: 430\n", "Residue name: THR, number: 431\n", "Residue name: ALA, number: 432\n", "Residue name: LEU, number: 433\n", "Residue name: SER, number: 434\n", "Residue name: ASP, number: 435\n", "Residue name: GLU, number: 436\n", "Residue name: PHE, number: 437\n", "Residue name: PRO, number: 438\n", "Residue name: LYS, number: 439\n", "Residue name: ILE, number: 440\n", "Residue name: LYS, number: 441\n", "Residue name: ARG, number: 442\n", "Residue name: ASN, number: 443\n", "Residue name: ARG, number: 444\n", "Residue name: GLU, number: 445\n", "Residue name: LEU, number: 446\n", "Residue name: PHE, number: 447\n", "Residue name: VAL, number: 448\n", "Residue name: ALA, number: 449\n", "Residue name: GLY, number: 450\n", "Residue name: LEU, number: 451\n", "Residue name: PHE, number: 452\n", "Residue name: SER, number: 453\n", "Residue name: LEU, number: 454\n", "Residue name: TYR, number: 455\n", "Residue name: PHE, number: 456\n", "Residue name: VAL, number: 457\n", "Residue name: VAL, number: 458\n", "Residue name: GLY, number: 459\n", "Residue name: LEU, number: 460\n", "Residue name: ALA, number: 461\n", "Residue name: SER, number: 462\n", "Residue name: CYS, number: 463\n", "Residue name: THR, number: 464\n", "Residue name: GLN, number: 465\n", "Residue name: GLY, number: 466\n", "Residue name: GLY, number: 467\n", "Residue name: PHE, number: 468\n", "Residue name: TYR, number: 469\n", "Residue name: PHE, number: 470\n", "Residue name: PHE, number: 471\n", "Residue name: HIS, number: 472\n", "Residue name: LEU, number: 473\n", "Residue name: LEU, number: 474\n", "Residue name: ASP, number: 475\n", "Residue name: ARG, number: 476\n", "Residue name: TYR, number: 477\n", "Residue name: ALA, number: 478\n", "Residue name: ALA, number: 479\n", "Residue name: GLY, number: 480\n", "Residue name: TYR, number: 481\n", "Residue name: SER, number: 482\n", "Residue name: ILE, number: 483\n", "Residue name: LEU, number: 484\n", "Residue name: VAL, number: 485\n", "Residue name: ALA, number: 486\n", "Residue name: VAL, number: 487\n", "Residue name: PHE, number: 488\n", "Residue name: PHE, number: 489\n", "Residue name: GLU, number: 490\n", "Residue name: ALA, number: 491\n", "Residue name: ILE, number: 492\n", "Residue name: ALA, number: 493\n", "Residue name: VAL, number: 494\n", "Residue name: SER, number: 495\n", "Residue name: TRP, number: 496\n", "Residue name: ILE, number: 497\n", "Residue name: TYR, number: 498\n", "Residue name: GLY, number: 499\n", "Residue name: THR, number: 500\n", "Residue name: ASN, number: 501\n", "Residue name: ARG, number: 502\n", "Residue name: PHE, number: 503\n", "Residue name: SER, number: 504\n", "Residue name: GLU, number: 505\n", "Residue name: ASP, number: 506\n", "Residue name: ILE, number: 507\n", "Residue name: ARG, number: 508\n", "Residue name: ASP, number: 509\n", "Residue name: MET, number: 510\n", "Residue name: ILE, number: 511\n", "Residue name: GLY, number: 512\n", "Residue name: PHE, number: 513\n", "Residue name: PRO, number: 514\n", "Residue name: PRO, number: 515\n", "Residue name: GLY, number: 516\n", "Residue name: ARG, number: 517\n", "Residue name: TYR, number: 518\n", "Residue name: TRP, number: 519\n", "Residue name: GLN, number: 520\n", "Residue name: VAL, number: 521\n", "Residue name: CYS, number: 522\n", "Residue name: TRP, number: 523\n", "Residue name: ARG, number: 524\n", "Residue name: PHE, number: 525\n", "Residue name: VAL, number: 526\n", "Residue name: ALA, number: 527\n", "Residue name: PRO, number: 528\n", "Residue name: ILE, number: 529\n", "Residue name: PHE, number: 530\n", "Residue name: LEU, number: 531\n", "Residue name: LEU, number: 532\n", "Residue name: PHE, number: 533\n", "Residue name: ILE, number: 534\n", "Residue name: THR, number: 535\n", "Residue name: VAL, number: 536\n", "Residue name: TYR, number: 537\n", "Residue name: GLY, number: 538\n", "Residue name: LEU, number: 539\n", "Residue name: ILE, number: 540\n", "Residue name: GLY, number: 541\n", "Residue name: TYR, number: 542\n", "Residue name: GLU, number: 543\n", "Residue name: PRO, number: 544\n", "Residue name: LEU, number: 545\n", "Residue name: THR, number: 546\n", "Residue name: TYR, number: 547\n", "Residue name: ALA, number: 548\n", "Residue name: ASP, number: 549\n", "Residue name: TYR, number: 550\n", "Residue name: VAL, number: 551\n", "Residue name: TYR, number: 552\n", "Residue name: PRO, number: 553\n", "Residue name: SER, number: 554\n", "Residue name: TRP, number: 555\n", "Residue name: ALA, number: 556\n", "Residue name: ASN, number: 557\n", "Residue name: ALA, number: 558\n", "Residue name: LEU, number: 559\n", "Residue name: GLY, number: 560\n", "Residue name: TRP, number: 561\n", "Residue name: CYS, number: 562\n", "Residue name: ILE, number: 563\n", "Residue name: ALA, number: 564\n", "Residue name: GLY, number: 565\n", "Residue name: SER, number: 566\n", "Residue name: SER, number: 567\n", "Residue name: VAL, number: 568\n", "Residue name: VAL, number: 569\n", "Residue name: MET, number: 570\n", "Residue name: ILE, number: 571\n", "Residue name: PRO, number: 572\n", "Residue name: ALA, number: 573\n", "Residue name: VAL, number: 574\n", "Residue name: ALA, number: 575\n", "Residue name: ILE, number: 576\n", "Residue name: PHE, number: 577\n", "Residue name: LYS, number: 578\n", "Residue name: LEU, number: 579\n", "Residue name: LEU, number: 580\n", "Residue name: SER, number: 581\n", "Residue name: THR, number: 582\n", "Residue name: PRO, number: 583\n", "Residue name: GLY, number: 584\n", "Residue name: SER, number: 585\n", "Residue name: LEU, number: 586\n", "Residue name: ARG, number: 587\n", "Residue name: GLN, number: 588\n", "Residue name: ARG, number: 589\n", "Residue name: PHE, number: 590\n", "Residue name: THR, number: 591\n", "Residue name: ILE, number: 592\n", "Residue name: LEU, number: 593\n", "Residue name: THR, number: 594\n", "Residue name: THR, number: 595\n", "Residue name: PRO, number: 596\n", "Residue name: TRP, number: 597\n", "Residue name: ARG, number: 598\n", "Residue name: ASP, number: 599\n", "Residue name: GLN, number: 600\n", "Residue name: NA, number: 701\n", "Residue name: NA, number: 702\n", "Residue name: CL, number: 703\n", "Residue name: MAL, number: 704\n", "Residue name: MAL, number: 705\n", "Residue name: NAG, number: 706\n", "Residue name: P4G, number: 707\n", "Residue name: LDP, number: 708\n", "Residue name: EDO, number: 709\n", "Residue name: Y01, number: 710\n", "Residue name: CLR, number: 711\n", "Residue name: HOH, number: 801\n", "Residue name: HOH, number: 802\n", "Residue name: HOH, number: 803\n", "Residue name: HOH, number: 804\n", "Residue name: HOH, number: 805\n", "Residue name: HOH, number: 806\n", "Residue name: HOH, number: 807\n", "Residue name: HOH, number: 808\n", "Residue name: HOH, number: 809\n", "Residue name: HOH, number: 810\n", "Residue name: HOH, number: 811\n", "Residue name: HOH, number: 812\n", "Residue name: HOH, number: 813\n", "Residue name: HOH, number: 814\n", "Residue name: HOH, number: 815\n" ] } ], "source": [ "for res in chain_A:\n", " print(f\"Residue name: {res.resname}, number: {res.id[1]}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we see that each chain is made up of `Residue` objects.\n", "\n", "Finally, each residue should be made up of atoms.\n", "\n", "Let's get residue 56 from Chain A." ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": true }, "outputs": [], "source": [ "res = chain_A[56]" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "print(res)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "N\n", "CA\n", "C\n", "O\n", "CB\n", "CG\n", "CD1\n", "CD2\n" ] } ], "source": [ "for atom in res:\n", " print(f\"{atom.name}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Putting it all together, we can print every atom in every chain." ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ] } ], "source": [ "for model in structure:\n", " for chain in model:\n", " for residue in chain:\n", " for atom in residue:\n", " print(atom)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Mini project: find the dopamine binding pockets\n", "\n", "Let's say I want to design a drug that binds to the transporter and blocks it from binding to dopamine.\n", "\n", "This should have the effect of making people happier because dopamine now won't be removed from the synapses.\n", "\n", "Actually, that's exactly what many antidepressants and narcotics (cocaine, amphetamines) do.\n", "\n", "In order to do this, we need to know which residues dopamine binds so we can design a chemical that targets these kinds of residues.\n", "\n", "## mmCIF annotations\n", "\n", "mmCIF files are like dictionaries with key:value pairs.\n", "\n", "When we parsed the file above, we really only got the structure info, but there is a lot more information that we can access by parsing a little differently.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "MMCIF files have a ton of information and they look like this:\n", "\n", "```\n", "# \n", "loop_\n", "_pdbx_nonpoly_scheme.asym_id \n", "_pdbx_nonpoly_scheme.entity_id \n", "_pdbx_nonpoly_scheme.mon_id \n", "_pdbx_nonpoly_scheme.ndb_seq_num \n", "_pdbx_nonpoly_scheme.pdb_seq_num \n", "_pdbx_nonpoly_scheme.auth_seq_num \n", "_pdbx_nonpoly_scheme.pdb_mon_id \n", "_pdbx_nonpoly_scheme.auth_mon_id \n", "_pdbx_nonpoly_scheme.pdb_strand_id \n", "_pdbx_nonpoly_scheme.pdb_ins_code \n", "D 4 NA 1 701 701 NA NA A . \n", "E 4 NA 1 702 702 NA NA A . \n", "F 5 CL 1 703 704 CL CL A . \n", "G 6 MAL 1 704 1 MAL MAL A . \n", "H 6 MAL 1 705 2 MAL MAL A . \n", "I 7 NAG 1 706 1 NAG NAG A . \n", "J 8 P4G 1 707 1 P4G P4G A . \n", "K 9 LDP 1 708 2 LDP LDP A . \n", "```\n", "\n", "This happens to be an entry for \"non-polymer\" entities aka ligands/chemicals.\n", "\n", "There are 10 `_pdbx_nonpoly_scheme..` headers. Each corresponds to a label for the columns in the entries below.\n", "\n", "So `_pdbx_nonpoly_scheme.mon_id` corresponds to the third column which is the `id` of the ligand.\n", "\n", "The `loop_` means, when parsing, loop over all the rows for each column label to make a list.\n", "\n", "For example: `_pdbx_nonpoly_scheme.asym_id ` after looping would map to: `['D', 'E', 'F', 'G', ...]`\n", "\n", "We're interested in `LDP` which is dopamine, but we see that there are others.\n", "\n", "BioPython lets us parse this information into a dictionary." ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": true }, "outputs": [], "source": [ "struc_dict = MMCIF2Dict.MMCIF2Dict('xp/4xp1.cif')" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "dict_keys(['data_', '_entry.id', '_audit_conform.dict_name', '_audit_conform.dict_version', '_audit_conform.dict_location', '_database_2.database_id', '_database_2.database_code', '_pdbx_database_related.db_name', '_pdbx_database_related.details', '_pdbx_database_related.db_id', '_pdbx_database_related.content_type', '_pdbx_database_status.status_code', '_pdbx_database_status.status_code_sf', '_pdbx_database_status.status_code_mr', '_pdbx_database_status.entry_id', '_pdbx_database_status.recvd_initial_deposition_date', '_pdbx_database_status.SG_entry', '_pdbx_database_status.deposit_site', '_pdbx_database_status.process_site', '_pdbx_database_status.status_code_cs', '_pdbx_database_status.methods_development_category', '_pdbx_database_status.pdb_format_compatible', '_audit_author.name', '_audit_author.pdbx_ordinal', '_citation.abstract', '_citation.abstract_id_CAS', '_citation.book_id_ISBN', '_citation.book_publisher', '_citation.book_publisher_city', '_citation.book_title', '_citation.coordinate_linkage', '_citation.country', '_citation.database_id_Medline', '_citation.details', '_citation.id', '_citation.journal_abbrev', '_citation.journal_id_ASTM', '_citation.journal_id_CSD', '_citation.journal_id_ISSN', '_citation.journal_full', '_citation.journal_issue', '_citation.journal_volume', '_citation.language', '_citation.page_first', '_citation.page_last', '_citation.title', '_citation.year', '_citation.database_id_CSD', '_citation.pdbx_database_id_DOI', '_citation.pdbx_database_id_PubMed', '_citation.unpublished_flag', '_citation_author.citation_id', '_citation_author.name', '_citation_author.ordinal', '_cell.length_a', '_cell.length_b', '_cell.length_c', '_cell.angle_alpha', '_cell.angle_beta', '_cell.angle_gamma', '_cell.entry_id', '_cell.Z_PDB', '_cell.pdbx_unique_axis', '_symmetry.space_group_name_H-M', '_symmetry.entry_id', '_symmetry.Int_Tables_number', '_symmetry.pdbx_full_space_group_name_H-M', '_symmetry.cell_setting', '_entity.id', '_entity.type', '_entity.src_method', '_entity.pdbx_description', '_entity.formula_weight', '_entity.pdbx_number_of_molecules', '_entity.pdbx_ec', '_entity.pdbx_mutation', '_entity.pdbx_fragment', '_entity.details', '_entity_poly.entity_id', '_entity_poly.type', '_entity_poly.nstd_linkage', '_entity_poly.nstd_monomer', '_entity_poly.pdbx_seq_one_letter_code', '_entity_poly.pdbx_seq_one_letter_code_can', '_entity_poly.pdbx_strand_id', '_entity_poly.pdbx_target_identifier', '_entity_poly_seq.entity_id', '_entity_poly_seq.num', '_entity_poly_seq.mon_id', '_entity_poly_seq.hetero', '_entity_src_gen.entity_id', '_entity_src_gen.pdbx_src_id', '_entity_src_gen.pdbx_alt_source_flag', '_entity_src_gen.pdbx_seq_type', '_entity_src_gen.pdbx_beg_seq_num', '_entity_src_gen.pdbx_end_seq_num', '_entity_src_gen.gene_src_common_name', '_entity_src_gen.gene_src_genus', '_entity_src_gen.pdbx_gene_src_gene', '_entity_src_gen.gene_src_species', '_entity_src_gen.gene_src_strain', '_entity_src_gen.gene_src_tissue', '_entity_src_gen.gene_src_tissue_fraction', '_entity_src_gen.gene_src_details', '_entity_src_gen.pdbx_gene_src_fragment', '_entity_src_gen.pdbx_gene_src_scientific_name', '_entity_src_gen.pdbx_gene_src_ncbi_taxonomy_id', '_entity_src_gen.pdbx_gene_src_variant', '_entity_src_gen.pdbx_gene_src_cell_line', '_entity_src_gen.pdbx_gene_src_atcc', '_entity_src_gen.pdbx_gene_src_organ', '_entity_src_gen.pdbx_gene_src_organelle', '_entity_src_gen.pdbx_gene_src_cell', '_entity_src_gen.pdbx_gene_src_cellular_location', '_entity_src_gen.host_org_common_name', '_entity_src_gen.pdbx_host_org_scientific_name', '_entity_src_gen.pdbx_host_org_ncbi_taxonomy_id', '_entity_src_gen.host_org_genus', '_entity_src_gen.pdbx_host_org_gene', '_entity_src_gen.pdbx_host_org_organ', '_entity_src_gen.host_org_species', '_entity_src_gen.pdbx_host_org_tissue', '_entity_src_gen.pdbx_host_org_tissue_fraction', '_entity_src_gen.pdbx_host_org_strain', '_entity_src_gen.pdbx_host_org_variant', '_entity_src_gen.pdbx_host_org_cell_line', '_entity_src_gen.pdbx_host_org_atcc', '_entity_src_gen.pdbx_host_org_culture_collection', '_entity_src_gen.pdbx_host_org_cell', '_entity_src_gen.pdbx_host_org_organelle', '_entity_src_gen.pdbx_host_org_cellular_location', '_entity_src_gen.pdbx_host_org_vector_type', '_entity_src_gen.pdbx_host_org_vector', '_entity_src_gen.host_org_details', '_entity_src_gen.expression_system_id', '_entity_src_gen.plasmid_name', '_entity_src_gen.plasmid_details', '_entity_src_gen.pdbx_description', '_struct_ref.id', '_struct_ref.db_name', '_struct_ref.db_code', '_struct_ref.pdbx_db_accession', '_struct_ref.pdbx_db_isoform', '_struct_ref.entity_id', '_struct_ref.pdbx_seq_one_letter_code', '_struct_ref.pdbx_align_begin', '_struct_ref_seq.align_id', '_struct_ref_seq.ref_id', '_struct_ref_seq.pdbx_PDB_id_code', '_struct_ref_seq.pdbx_strand_id', '_struct_ref_seq.seq_align_beg', '_struct_ref_seq.pdbx_seq_align_beg_ins_code', '_struct_ref_seq.seq_align_end', '_struct_ref_seq.pdbx_seq_align_end_ins_code', '_struct_ref_seq.pdbx_db_accession', '_struct_ref_seq.db_align_beg', '_struct_ref_seq.pdbx_db_align_beg_ins_code', '_struct_ref_seq.db_align_end', '_struct_ref_seq.pdbx_db_align_end_ins_code', '_struct_ref_seq.pdbx_auth_seq_align_beg', '_struct_ref_seq.pdbx_auth_seq_align_end', '_struct_ref_seq_dif.align_id', '_struct_ref_seq_dif.pdbx_pdb_id_code', '_struct_ref_seq_dif.mon_id', '_struct_ref_seq_dif.pdbx_pdb_strand_id', '_struct_ref_seq_dif.seq_num', '_struct_ref_seq_dif.pdbx_pdb_ins_code', '_struct_ref_seq_dif.pdbx_seq_db_name', '_struct_ref_seq_dif.pdbx_seq_db_accession_code', '_struct_ref_seq_dif.db_mon_id', '_struct_ref_seq_dif.pdbx_seq_db_seq_num', '_struct_ref_seq_dif.details', '_struct_ref_seq_dif.pdbx_auth_seq_num', '_struct_ref_seq_dif.pdbx_ordinal', '_chem_comp.id', '_chem_comp.type', '_chem_comp.mon_nstd_flag', '_chem_comp.name', '_chem_comp.pdbx_synonyms', '_chem_comp.formula', '_chem_comp.formula_weight', '_exptl.absorpt_coefficient_mu', '_exptl.absorpt_correction_T_max', '_exptl.absorpt_correction_T_min', '_exptl.absorpt_correction_type', '_exptl.absorpt_process_details', '_exptl.entry_id', '_exptl.crystals_number', '_exptl.details', '_exptl.method', '_exptl.method_details', '_exptl_crystal.colour', '_exptl_crystal.density_diffrn', '_exptl_crystal.density_Matthews', '_exptl_crystal.density_method', '_exptl_crystal.density_percent_sol', '_exptl_crystal.description', '_exptl_crystal.F_000', '_exptl_crystal.id', '_exptl_crystal.preparation', '_exptl_crystal.size_max', '_exptl_crystal.size_mid', '_exptl_crystal.size_min', '_exptl_crystal.size_rad', '_exptl_crystal.colour_lustre', '_exptl_crystal.colour_modifier', '_exptl_crystal.colour_primary', '_exptl_crystal.density_meas', '_exptl_crystal.density_meas_esd', '_exptl_crystal.density_meas_gt', '_exptl_crystal.density_meas_lt', '_exptl_crystal.density_meas_temp', '_exptl_crystal.density_meas_temp_esd', '_exptl_crystal.density_meas_temp_gt', '_exptl_crystal.density_meas_temp_lt', '_exptl_crystal.pdbx_crystal_image_url', '_exptl_crystal.pdbx_crystal_image_format', '_exptl_crystal.pdbx_mosaicity', '_exptl_crystal.pdbx_mosaicity_esd', '_exptl_crystal_grow.apparatus', '_exptl_crystal_grow.atmosphere', '_exptl_crystal_grow.crystal_id', '_exptl_crystal_grow.details', '_exptl_crystal_grow.method', '_exptl_crystal_grow.method_ref', '_exptl_crystal_grow.pH', '_exptl_crystal_grow.pressure', '_exptl_crystal_grow.pressure_esd', '_exptl_crystal_grow.seeding', '_exptl_crystal_grow.seeding_ref', '_exptl_crystal_grow.temp', '_exptl_crystal_grow.temp_details', '_exptl_crystal_grow.temp_esd', '_exptl_crystal_grow.time', '_exptl_crystal_grow.pdbx_details', '_exptl_crystal_grow.pdbx_pH_range', '_diffrn.ambient_environment', '_diffrn.ambient_temp', '_diffrn.ambient_temp_details', '_diffrn.ambient_temp_esd', '_diffrn.crystal_id', '_diffrn.crystal_support', '_diffrn.crystal_treatment', '_diffrn.details', '_diffrn.id', '_diffrn.ambient_pressure', '_diffrn.ambient_pressure_esd', '_diffrn.ambient_pressure_gt', '_diffrn.ambient_pressure_lt', '_diffrn.ambient_temp_gt', '_diffrn.ambient_temp_lt', '_diffrn_detector.details', '_diffrn_detector.detector', '_diffrn_detector.diffrn_id', '_diffrn_detector.type', '_diffrn_detector.area_resol_mean', '_diffrn_detector.dtime', '_diffrn_detector.pdbx_frames_total', '_diffrn_detector.pdbx_collection_time_total', '_diffrn_detector.pdbx_collection_date', '_diffrn_radiation.collimation', '_diffrn_radiation.diffrn_id', '_diffrn_radiation.filter_edge', '_diffrn_radiation.inhomogeneity', '_diffrn_radiation.monochromator', '_diffrn_radiation.polarisn_norm', '_diffrn_radiation.polarisn_ratio', '_diffrn_radiation.probe', '_diffrn_radiation.type', '_diffrn_radiation.xray_symbol', '_diffrn_radiation.wavelength_id', '_diffrn_radiation.pdbx_monochromatic_or_laue_m_l', '_diffrn_radiation.pdbx_wavelength_list', '_diffrn_radiation.pdbx_wavelength', '_diffrn_radiation.pdbx_diffrn_protocol', '_diffrn_radiation.pdbx_analyzer', '_diffrn_radiation.pdbx_scattering_type', '_diffrn_radiation_wavelength.id', '_diffrn_radiation_wavelength.wavelength', '_diffrn_radiation_wavelength.wt', '_diffrn_source.current', '_diffrn_source.details', '_diffrn_source.diffrn_id', '_diffrn_source.power', '_diffrn_source.size', '_diffrn_source.source', '_diffrn_source.target', '_diffrn_source.type', '_diffrn_source.voltage', '_diffrn_source.take-off_angle', '_diffrn_source.pdbx_wavelength_list', '_diffrn_source.pdbx_wavelength', '_diffrn_source.pdbx_synchrotron_beamline', '_diffrn_source.pdbx_synchrotron_site', '_reflns.d_resolution_high', '_reflns.pdbx_number_measured_all', '_reflns.number_obs', '_reflns.pdbx_Rmerge_I_obs', '_reflns.pdbx_netI_over_sigmaI', '_reflns.pdbx_chi_squared', '_reflns.percent_possible_obs', '_reflns.Rmerge_F_obs', '_reflns.observed_criterion_sigma_I', '_reflns.pdbx_Rrim_I_all', '_reflns.B_iso_Wilson_estimate', '_reflns.pdbx_diffrn_id', '_reflns.pdbx_ordinal', '_reflns.entry_id', '_reflns.observed_criterion_sigma_F', '_reflns.d_resolution_low', '_reflns.number_all', '_reflns.pdbx_Rsym_value', '_reflns.pdbx_redundancy', '_reflns_shell.pdbx_diffrn_id', '_reflns_shell.pdbx_ordinal', '_reflns_shell.d_res_high', '_reflns_shell.d_res_low', '_reflns_shell.number_measured_obs', '_reflns_shell.number_measured_all', '_reflns_shell.number_unique_obs', '_reflns_shell.pdbx_rejects', '_reflns_shell.Rmerge_I_obs', '_reflns_shell.meanI_over_sigI_obs', '_reflns_shell.pdbx_Rsym_value', '_reflns_shell.pdbx_chi_squared', '_reflns_shell.pdbx_redundancy', '_reflns_shell.percent_possible_obs', '_reflns_shell.pdbx_netI_over_sigmaI_obs', '_reflns_shell.number_possible', '_reflns_shell.number_unique_all', '_reflns_shell.Rmerge_F_all', '_reflns_shell.Rmerge_F_obs', '_reflns_shell.Rmerge_I_all', '_reflns_shell.meanI_over_sigI_all', '_reflns_shell.percent_possible_all', '_reflns_shell.pdbx_Rrim_I_all', '_reflns_shell.pdbx_Rpim_I_all', '_reflns_shell.pdbx_CC_half', '_refine.entry_id', '_refine.pdbx_refine_id', '_refine.ls_d_res_high', '_refine.ls_d_res_low', '_refine.pdbx_ls_sigma_F', '_refine.pdbx_data_cutoff_high_absF', '_refine.pdbx_data_cutoff_low_absF', '_refine.ls_percent_reflns_obs', '_refine.ls_number_reflns_obs', '_refine.ls_number_reflns_all', '_refine.pdbx_ls_cross_valid_method', '_refine.ls_matrix_type', '_refine.pdbx_R_Free_selection_details', '_refine.details', '_refine.ls_R_factor_all', '_refine.ls_R_factor_obs', '_refine.ls_R_factor_R_work', '_refine.ls_wR_factor_R_work', '_refine.ls_R_factor_R_free', '_refine.ls_wR_factor_R_free', '_refine.ls_percent_reflns_R_free', '_refine.ls_number_reflns_R_free', '_refine.ls_number_reflns_R_work', '_refine.ls_R_factor_R_free_error', '_refine.B_iso_mean', '_refine.solvent_model_param_bsol', '_refine.solvent_model_param_ksol', '_refine.pdbx_isotropic_thermal_model', '_refine.aniso_B[1][1]', '_refine.aniso_B[2][2]', '_refine.aniso_B[3][3]', '_refine.aniso_B[1][2]', '_refine.aniso_B[1][3]', '_refine.aniso_B[2][3]', '_refine.correlation_coeff_Fo_to_Fc', '_refine.correlation_coeff_Fo_to_Fc_free', '_refine.overall_SU_R_Cruickshank_DPI', '_refine.pdbx_overall_SU_R_free_Cruickshank_DPI', '_refine.pdbx_overall_SU_R_Blow_DPI', '_refine.pdbx_overall_SU_R_free_Blow_DPI', '_refine.overall_SU_R_free', '_refine.pdbx_overall_ESU_R', '_refine.pdbx_overall_ESU_R_Free', '_refine.overall_SU_ML', '_refine.overall_SU_B', '_refine.solvent_model_details', '_refine.pdbx_solvent_vdw_probe_radii', '_refine.pdbx_solvent_ion_probe_radii', '_refine.pdbx_solvent_shrinkage_radii', '_refine.ls_number_parameters', '_refine.ls_number_restraints', '_refine.pdbx_starting_model', '_refine.pdbx_method_to_determine_struct', '_refine.pdbx_stereochemistry_target_values', '_refine.pdbx_stereochem_target_val_spec_case', '_refine.overall_FOM_work_R_set', '_refine.B_iso_max', '_refine.B_iso_min', '_refine.pdbx_overall_phase_error', '_refine.occupancy_max', '_refine.occupancy_min', '_refine.pdbx_diffrn_id', '_refine.pdbx_TLS_residual_ADP_flag', '_refine.pdbx_ls_sigma_I', '_refine.pdbx_data_cutoff_high_rms_absF', '_refine.ls_R_factor_R_free_error_details', '_refine_hist.cycle_id', '_refine_hist.pdbx_refine_id', '_refine_hist.d_res_high', '_refine_hist.d_res_low', '_refine_hist.pdbx_number_atoms_ligand', '_refine_hist.number_atoms_solvent', '_refine_hist.number_atoms_total', '_refine_hist.pdbx_number_residues_total', '_refine_hist.pdbx_B_iso_mean_ligand', '_refine_hist.pdbx_B_iso_mean_solvent', '_refine_hist.pdbx_number_atoms_protein', '_refine_hist.pdbx_number_atoms_nucleic_acid', '_refine_ls_restr.pdbx_refine_id', '_refine_ls_restr.type', '_refine_ls_restr.number', '_refine_ls_restr.dev_ideal', '_refine_ls_restr.dev_ideal_target', '_refine_ls_restr.weight', '_refine_ls_restr.pdbx_restraint_function', '_refine_ls_shell.d_res_high', '_refine_ls_shell.d_res_low', '_refine_ls_shell.pdbx_total_number_of_bins_used', '_refine_ls_shell.percent_reflns_obs', '_refine_ls_shell.number_reflns_R_work', '_refine_ls_shell.R_factor_all', '_refine_ls_shell.R_factor_R_work', '_refine_ls_shell.R_factor_R_free', '_refine_ls_shell.percent_reflns_R_free', '_refine_ls_shell.number_reflns_R_free', '_refine_ls_shell.R_factor_R_free_error', '_refine_ls_shell.number_reflns_all', '_refine_ls_shell.number_reflns_obs', '_refine_ls_shell.pdbx_refine_id', '_refine_ls_shell.R_factor_obs', '_struct.entry_id', '_struct.title', '_struct.pdbx_descriptor', '_struct.pdbx_model_details', '_struct.pdbx_formula_weight', '_struct.pdbx_formula_weight_method', '_struct.pdbx_model_type_details', '_struct.pdbx_CASP_flag', '_struct_keywords.entry_id', '_struct_keywords.text', '_struct_keywords.pdbx_keywords', '_struct_asym.id', '_struct_asym.pdbx_blank_PDB_chainid_flag', '_struct_asym.pdbx_modified', '_struct_asym.entity_id', '_struct_asym.details', '_struct_conf.conf_type_id', '_struct_conf.id', '_struct_conf.pdbx_PDB_helix_id', '_struct_conf.beg_label_comp_id', '_struct_conf.beg_label_asym_id', '_struct_conf.beg_label_seq_id', '_struct_conf.pdbx_beg_PDB_ins_code', '_struct_conf.end_label_comp_id', '_struct_conf.end_label_asym_id', '_struct_conf.end_label_seq_id', '_struct_conf.pdbx_end_PDB_ins_code', '_struct_conf.beg_auth_comp_id', '_struct_conf.beg_auth_asym_id', '_struct_conf.beg_auth_seq_id', '_struct_conf.end_auth_comp_id', '_struct_conf.end_auth_asym_id', '_struct_conf.end_auth_seq_id', '_struct_conf.pdbx_PDB_helix_class', '_struct_conf.details', '_struct_conf.pdbx_PDB_helix_length', '_struct_conf_type.id', '_struct_conf_type.criteria', '_struct_conf_type.reference', '_struct_conn.id', '_struct_conn.conn_type_id', '_struct_conn.pdbx_leaving_atom_flag', '_struct_conn.pdbx_PDB_id', '_struct_conn.ptnr1_label_asym_id', '_struct_conn.ptnr1_label_comp_id', '_struct_conn.ptnr1_label_seq_id', '_struct_conn.ptnr1_label_atom_id', '_struct_conn.pdbx_ptnr1_label_alt_id', '_struct_conn.pdbx_ptnr1_PDB_ins_code', '_struct_conn.pdbx_ptnr1_standard_comp_id', '_struct_conn.ptnr1_symmetry', '_struct_conn.ptnr2_label_asym_id', '_struct_conn.ptnr2_label_comp_id', '_struct_conn.ptnr2_label_seq_id', '_struct_conn.ptnr2_label_atom_id', '_struct_conn.pdbx_ptnr2_label_alt_id', '_struct_conn.pdbx_ptnr2_PDB_ins_code', '_struct_conn.ptnr1_auth_asym_id', '_struct_conn.ptnr1_auth_comp_id', '_struct_conn.ptnr1_auth_seq_id', '_struct_conn.ptnr2_auth_asym_id', '_struct_conn.ptnr2_auth_comp_id', '_struct_conn.ptnr2_auth_seq_id', '_struct_conn.ptnr2_symmetry', '_struct_conn.pdbx_ptnr3_label_atom_id', '_struct_conn.pdbx_ptnr3_label_seq_id', '_struct_conn.pdbx_ptnr3_label_comp_id', '_struct_conn.pdbx_ptnr3_label_asym_id', '_struct_conn.pdbx_ptnr3_label_alt_id', '_struct_conn.pdbx_ptnr3_PDB_ins_code', '_struct_conn.details', '_struct_conn.pdbx_dist_value', '_struct_conn.pdbx_value_order', '_struct_conn_type.id', '_struct_conn_type.criteria', '_struct_conn_type.reference', '_struct_mon_prot_cis.pdbx_id', '_struct_mon_prot_cis.label_comp_id', '_struct_mon_prot_cis.label_seq_id', '_struct_mon_prot_cis.label_asym_id', '_struct_mon_prot_cis.label_alt_id', '_struct_mon_prot_cis.pdbx_PDB_ins_code', '_struct_mon_prot_cis.auth_comp_id', '_struct_mon_prot_cis.auth_seq_id', '_struct_mon_prot_cis.auth_asym_id', '_struct_mon_prot_cis.pdbx_label_comp_id_2', '_struct_mon_prot_cis.pdbx_label_seq_id_2', '_struct_mon_prot_cis.pdbx_label_asym_id_2', '_struct_mon_prot_cis.pdbx_PDB_ins_code_2', '_struct_mon_prot_cis.pdbx_auth_comp_id_2', '_struct_mon_prot_cis.pdbx_auth_seq_id_2', '_struct_mon_prot_cis.pdbx_auth_asym_id_2', '_struct_mon_prot_cis.pdbx_PDB_model_num', '_struct_mon_prot_cis.pdbx_omega_angle', '_struct_sheet.id', '_struct_sheet.type', '_struct_sheet.number_strands', '_struct_sheet.details', '_struct_sheet_order.sheet_id', '_struct_sheet_order.range_id_1', '_struct_sheet_order.range_id_2', '_struct_sheet_order.offset', '_struct_sheet_order.sense', '_struct_sheet_range.sheet_id', '_struct_sheet_range.id', '_struct_sheet_range.beg_label_comp_id', '_struct_sheet_range.beg_label_asym_id', '_struct_sheet_range.beg_label_seq_id', '_struct_sheet_range.pdbx_beg_PDB_ins_code', '_struct_sheet_range.end_label_comp_id', '_struct_sheet_range.end_label_asym_id', '_struct_sheet_range.end_label_seq_id', '_struct_sheet_range.pdbx_end_PDB_ins_code', '_struct_sheet_range.beg_auth_comp_id', '_struct_sheet_range.beg_auth_asym_id', '_struct_sheet_range.beg_auth_seq_id', '_struct_sheet_range.end_auth_comp_id', '_struct_sheet_range.end_auth_asym_id', '_struct_sheet_range.end_auth_seq_id', '_pdbx_struct_sheet_hbond.sheet_id', '_pdbx_struct_sheet_hbond.range_id_1', '_pdbx_struct_sheet_hbond.range_id_2', '_pdbx_struct_sheet_hbond.range_1_label_atom_id', '_pdbx_struct_sheet_hbond.range_1_label_comp_id', '_pdbx_struct_sheet_hbond.range_1_label_asym_id', '_pdbx_struct_sheet_hbond.range_1_label_seq_id', '_pdbx_struct_sheet_hbond.range_1_PDB_ins_code', '_pdbx_struct_sheet_hbond.range_1_auth_atom_id', '_pdbx_struct_sheet_hbond.range_1_auth_comp_id', '_pdbx_struct_sheet_hbond.range_1_auth_asym_id', '_pdbx_struct_sheet_hbond.range_1_auth_seq_id', '_pdbx_struct_sheet_hbond.range_2_label_atom_id', '_pdbx_struct_sheet_hbond.range_2_label_comp_id', '_pdbx_struct_sheet_hbond.range_2_label_asym_id', '_pdbx_struct_sheet_hbond.range_2_label_seq_id', '_pdbx_struct_sheet_hbond.range_2_PDB_ins_code', '_pdbx_struct_sheet_hbond.range_2_auth_atom_id', '_pdbx_struct_sheet_hbond.range_2_auth_comp_id', '_pdbx_struct_sheet_hbond.range_2_auth_asym_id', '_pdbx_struct_sheet_hbond.range_2_auth_seq_id', '_struct_site.id', '_struct_site.pdbx_evidence_code', '_struct_site.pdbx_auth_asym_id', '_struct_site.pdbx_auth_comp_id', '_struct_site.pdbx_auth_seq_id', '_struct_site.pdbx_auth_ins_code', '_struct_site.pdbx_num_residues', '_struct_site.details', '_struct_site_gen.id', '_struct_site_gen.site_id', '_struct_site_gen.pdbx_num_res', '_struct_site_gen.label_comp_id', '_struct_site_gen.label_asym_id', '_struct_site_gen.label_seq_id', '_struct_site_gen.pdbx_auth_ins_code', '_struct_site_gen.auth_comp_id', '_struct_site_gen.auth_asym_id', '_struct_site_gen.auth_seq_id', '_struct_site_gen.label_atom_id', '_struct_site_gen.label_alt_id', '_struct_site_gen.symmetry', '_struct_site_gen.details', '_atom_sites.entry_id', '_atom_sites.fract_transf_matrix[1][1]', '_atom_sites.fract_transf_matrix[1][2]', '_atom_sites.fract_transf_matrix[1][3]', '_atom_sites.fract_transf_matrix[2][1]', '_atom_sites.fract_transf_matrix[2][2]', '_atom_sites.fract_transf_matrix[2][3]', '_atom_sites.fract_transf_matrix[3][1]', '_atom_sites.fract_transf_matrix[3][2]', '_atom_sites.fract_transf_matrix[3][3]', '_atom_sites.fract_transf_vector[1]', '_atom_sites.fract_transf_vector[2]', '_atom_sites.fract_transf_vector[3]', '_atom_type.symbol', '_atom_site.group_PDB', '_atom_site.id', '_atom_site.type_symbol', '_atom_site.label_atom_id', '_atom_site.label_alt_id', '_atom_site.label_comp_id', '_atom_site.label_asym_id', '_atom_site.label_entity_id', '_atom_site.label_seq_id', '_atom_site.pdbx_PDB_ins_code', '_atom_site.Cartn_x', '_atom_site.Cartn_y', '_atom_site.Cartn_z', '_atom_site.occupancy', '_atom_site.B_iso_or_equiv', '_atom_site.pdbx_formal_charge', '_atom_site.auth_seq_id', '_atom_site.auth_comp_id', '_atom_site.auth_asym_id', '_atom_site.auth_atom_id', '_atom_site.pdbx_PDB_model_num', '_pdbx_poly_seq_scheme.asym_id', '_pdbx_poly_seq_scheme.entity_id', '_pdbx_poly_seq_scheme.seq_id', '_pdbx_poly_seq_scheme.mon_id', '_pdbx_poly_seq_scheme.ndb_seq_num', '_pdbx_poly_seq_scheme.pdb_seq_num', '_pdbx_poly_seq_scheme.auth_seq_num', '_pdbx_poly_seq_scheme.pdb_mon_id', '_pdbx_poly_seq_scheme.auth_mon_id', '_pdbx_poly_seq_scheme.pdb_strand_id', '_pdbx_poly_seq_scheme.pdb_ins_code', '_pdbx_poly_seq_scheme.hetero', '_pdbx_nonpoly_scheme.asym_id', '_pdbx_nonpoly_scheme.entity_id', '_pdbx_nonpoly_scheme.mon_id', '_pdbx_nonpoly_scheme.ndb_seq_num', '_pdbx_nonpoly_scheme.pdb_seq_num', '_pdbx_nonpoly_scheme.auth_seq_num', '_pdbx_nonpoly_scheme.pdb_mon_id', '_pdbx_nonpoly_scheme.auth_mon_id', '_pdbx_nonpoly_scheme.pdb_strand_id', '_pdbx_nonpoly_scheme.pdb_ins_code', '_pdbx_struct_assembly.id', '_pdbx_struct_assembly.details', '_pdbx_struct_assembly.method_details', '_pdbx_struct_assembly.oligomeric_details', '_pdbx_struct_assembly.oligomeric_count', '_pdbx_struct_assembly_gen.assembly_id', '_pdbx_struct_assembly_gen.oper_expression', '_pdbx_struct_assembly_gen.asym_id_list', '_pdbx_struct_oper_list.id', '_pdbx_struct_oper_list.type', '_pdbx_struct_oper_list.name', '_pdbx_struct_oper_list.symmetry_operation', '_pdbx_struct_oper_list.matrix[1][1]', '_pdbx_struct_oper_list.matrix[1][2]', '_pdbx_struct_oper_list.matrix[1][3]', '_pdbx_struct_oper_list.vector[1]', '_pdbx_struct_oper_list.matrix[2][1]', '_pdbx_struct_oper_list.matrix[2][2]', '_pdbx_struct_oper_list.matrix[2][3]', '_pdbx_struct_oper_list.vector[2]', '_pdbx_struct_oper_list.matrix[3][1]', '_pdbx_struct_oper_list.matrix[3][2]', '_pdbx_struct_oper_list.matrix[3][3]', '_pdbx_struct_oper_list.vector[3]', '_pdbx_struct_conn_angle.id', '_pdbx_struct_conn_angle.ptnr1_label_atom_id', '_pdbx_struct_conn_angle.ptnr1_label_alt_id', '_pdbx_struct_conn_angle.ptnr1_label_asym_id', '_pdbx_struct_conn_angle.ptnr1_label_comp_id', '_pdbx_struct_conn_angle.ptnr1_label_seq_id', '_pdbx_struct_conn_angle.ptnr1_auth_atom_id', '_pdbx_struct_conn_angle.ptnr1_auth_asym_id', '_pdbx_struct_conn_angle.ptnr1_auth_comp_id', '_pdbx_struct_conn_angle.ptnr1_auth_seq_id', '_pdbx_struct_conn_angle.ptnr1_PDB_ins_code', '_pdbx_struct_conn_angle.ptnr1_symmetry', '_pdbx_struct_conn_angle.ptnr2_label_atom_id', '_pdbx_struct_conn_angle.ptnr2_label_alt_id', '_pdbx_struct_conn_angle.ptnr2_label_asym_id', '_pdbx_struct_conn_angle.ptnr2_label_comp_id', '_pdbx_struct_conn_angle.ptnr2_label_seq_id', '_pdbx_struct_conn_angle.ptnr2_auth_atom_id', '_pdbx_struct_conn_angle.ptnr2_auth_asym_id', '_pdbx_struct_conn_angle.ptnr2_auth_comp_id', '_pdbx_struct_conn_angle.ptnr2_auth_seq_id', '_pdbx_struct_conn_angle.ptnr2_PDB_ins_code', '_pdbx_struct_conn_angle.ptnr2_symmetry', '_pdbx_struct_conn_angle.ptnr3_label_atom_id', '_pdbx_struct_conn_angle.ptnr3_label_alt_id', '_pdbx_struct_conn_angle.ptnr3_label_asym_id', '_pdbx_struct_conn_angle.ptnr3_label_comp_id', '_pdbx_struct_conn_angle.ptnr3_label_seq_id', '_pdbx_struct_conn_angle.ptnr3_auth_atom_id', '_pdbx_struct_conn_angle.ptnr3_auth_asym_id', '_pdbx_struct_conn_angle.ptnr3_auth_comp_id', '_pdbx_struct_conn_angle.ptnr3_auth_seq_id', '_pdbx_struct_conn_angle.ptnr3_PDB_ins_code', '_pdbx_struct_conn_angle.ptnr3_symmetry', '_pdbx_struct_conn_angle.value', '_pdbx_struct_conn_angle.value_esd', '_pdbx_audit_revision_history.ordinal', '_pdbx_audit_revision_history.data_content_type', '_pdbx_audit_revision_history.major_revision', '_pdbx_audit_revision_history.minor_revision', '_pdbx_audit_revision_history.revision_date', '_pdbx_audit_revision_details.ordinal', '_pdbx_audit_revision_details.revision_ordinal', '_pdbx_audit_revision_details.data_content_type', '_pdbx_audit_revision_details.provider', '_pdbx_audit_revision_details.type', '_pdbx_audit_revision_details.description', '_pdbx_audit_revision_group.ordinal', '_pdbx_audit_revision_group.revision_ordinal', '_pdbx_audit_revision_group.data_content_type', '_pdbx_audit_revision_group.group', '_software.citation_id', '_software.classification', '_software.compiler_name', '_software.compiler_version', '_software.contact_author', '_software.contact_author_email', '_software.date', '_software.description', '_software.dependencies', '_software.hardware', '_software.language', '_software.location', '_software.mods', '_software.name', '_software.os', '_software.os_version', '_software.type', '_software.version', '_software.pdbx_ordinal', '_pdbx_validate_close_contact.id', '_pdbx_validate_close_contact.PDB_model_num', '_pdbx_validate_close_contact.auth_atom_id_1', '_pdbx_validate_close_contact.auth_asym_id_1', '_pdbx_validate_close_contact.auth_comp_id_1', '_pdbx_validate_close_contact.auth_seq_id_1', '_pdbx_validate_close_contact.PDB_ins_code_1', '_pdbx_validate_close_contact.label_alt_id_1', '_pdbx_validate_close_contact.auth_atom_id_2', '_pdbx_validate_close_contact.auth_asym_id_2', '_pdbx_validate_close_contact.auth_comp_id_2', '_pdbx_validate_close_contact.auth_seq_id_2', '_pdbx_validate_close_contact.PDB_ins_code_2', '_pdbx_validate_close_contact.label_alt_id_2', '_pdbx_validate_close_contact.dist', '_pdbx_validate_torsion.id', '_pdbx_validate_torsion.PDB_model_num', '_pdbx_validate_torsion.auth_comp_id', '_pdbx_validate_torsion.auth_asym_id', '_pdbx_validate_torsion.auth_seq_id', '_pdbx_validate_torsion.PDB_ins_code', '_pdbx_validate_torsion.label_alt_id', '_pdbx_validate_torsion.phi', '_pdbx_validate_torsion.psi', '_pdbx_validate_peptide_omega.id', '_pdbx_validate_peptide_omega.PDB_model_num', '_pdbx_validate_peptide_omega.auth_comp_id_1', '_pdbx_validate_peptide_omega.auth_asym_id_1', '_pdbx_validate_peptide_omega.auth_seq_id_1', '_pdbx_validate_peptide_omega.PDB_ins_code_1', '_pdbx_validate_peptide_omega.label_alt_id_1', '_pdbx_validate_peptide_omega.auth_comp_id_2', '_pdbx_validate_peptide_omega.auth_asym_id_2', '_pdbx_validate_peptide_omega.auth_seq_id_2', '_pdbx_validate_peptide_omega.PDB_ins_code_2', '_pdbx_validate_peptide_omega.label_alt_id_2', '_pdbx_validate_peptide_omega.omega', '_pdbx_unobs_or_zero_occ_atoms.id', '_pdbx_unobs_or_zero_occ_atoms.PDB_model_num', '_pdbx_unobs_or_zero_occ_atoms.polymer_flag', '_pdbx_unobs_or_zero_occ_atoms.occupancy_flag', '_pdbx_unobs_or_zero_occ_atoms.auth_asym_id', '_pdbx_unobs_or_zero_occ_atoms.auth_comp_id', '_pdbx_unobs_or_zero_occ_atoms.auth_seq_id', '_pdbx_unobs_or_zero_occ_atoms.PDB_ins_code', '_pdbx_unobs_or_zero_occ_atoms.auth_atom_id', '_pdbx_unobs_or_zero_occ_atoms.label_alt_id', '_pdbx_unobs_or_zero_occ_atoms.label_asym_id', '_pdbx_unobs_or_zero_occ_atoms.label_comp_id', '_pdbx_unobs_or_zero_occ_atoms.label_seq_id', '_pdbx_unobs_or_zero_occ_atoms.label_atom_id', '_pdbx_entity_nonpoly.entity_id', '_pdbx_entity_nonpoly.name', '_pdbx_entity_nonpoly.comp_id'])\n" ] } ], "source": [ "print(struc_dict.keys())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As you can see we have tons of keys.\n", "\n", "Binding sites are often annotated by the researches in their mmCIF files.\n", "\n", "```\n", "loop_\n", "_struct_site.id \n", "_struct_site.pdbx_evidence_code \n", "_struct_site.pdbx_auth_asym_id \n", "_struct_site.pdbx_auth_comp_id \n", "_struct_site.pdbx_auth_seq_id \n", "_struct_site.pdbx_auth_ins_code \n", "_struct_site.pdbx_num_residues \n", "_struct_site.details \n", "AC1 Software A NA 701 ? 5 'binding site for residue NA A 701' \n", "AC2 Software A NA 702 ? 5 'binding site for residue NA A 702' \n", "AC3 Software A CL 703 ? 4 'binding site for residue CL A 703' \n", "AC4 Software A MAL 704 ? 4 'binding site for residue MAL A 704' \n", "AC5 Software A MAL 705 ? 4 'binding site for residue MAL A 705' \n", "AC6 Software A P4G 707 ? 1 'binding site for residue P4G A 707' \n", "AC7 Software A LDP 708 ? 9 'binding site for residue LDP A 708' \n", "AC8 Software A EDO 709 ? 2 'binding site for residue EDO A 709' \n", "AC9 Software A Y01 710 ? 4 'binding site for residue Y01 A 710' \n", "AD1 Software A CLR 711 ? 5 'binding site for residue CLR A 711' \n", "AD2 Software L NA 301 ? 4 'binding site for residue NA L 301' \n", "AD3 Software A NAG 706 ? 1 'binding site for Mono-Saccharide NAG A 706 bound to ASN A 141' \n", "```" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['binding site for residue NA A 701',\n", " 'binding site for residue NA A 702',\n", " 'binding site for residue CL A 703',\n", " 'binding site for residue MAL A 704',\n", " 'binding site for residue MAL A 705',\n", " 'binding site for residue P4G A 707',\n", " 'binding site for residue LDP A 708',\n", " 'binding site for residue EDO A 709',\n", " 'binding site for residue Y01 A 710',\n", " 'binding site for residue CLR A 711',\n", " 'binding site for residue NA L 301',\n", " 'binding site for Mono-Saccharide NAG A 706 bound to ASN A 141']" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "struc_dict['_struct_site.details']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "So the binding site for LDP has ID `AC7`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now if we look at another entry in the mmCIF we can get a list of all the residues in each binding site:\n", "\n", "```\n", "loop_\n", "_struct_site_gen.id \n", "_struct_site_gen.site_id \n", "_struct_site_gen.pdbx_num_res \n", "_struct_site_gen.label_comp_id \n", "_struct_site_gen.label_asym_id \n", "_struct_site_gen.label_seq_id \n", "_struct_site_gen.pdbx_auth_ins_code \n", "_struct_site_gen.auth_comp_id \n", "_struct_site_gen.auth_asym_id \n", "_struct_site_gen.auth_seq_id \n", "_struct_site_gen.label_atom_id \n", "_struct_site_gen.label_alt_id \n", "_struct_site_gen.symmetry \n", "_struct_site_gen.details \n", "1 AC1 5 ALA A 20 ? ALA A 44 . ? 1_555 ? \n", "2 AC1 5 ASN A 25 ? ASN A 49 . ? 1_555 ? \n", "3 AC1 5 SER A 255 ? SER A 320 . ? 1_555 ? \n", "4 AC1 5 ASN A 287 ? ASN A 352 . ? 1_555 ? \n", "5 AC1 5 HOH P . ? HOH A 814 . ? 1_555 ? \n", "...\n", "...\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There are other useful entries such as the title of the publication that this structure was featured in." ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Neurotransmitter and psychostimulant recognition by the dopamine transporter.'" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "struc_dict['_citation.title']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "All entry types are documented [here](http://mmcif.wwpdb.org/dictionaries/mmcif_pdbx_v50.dic/Index/).\n", "\n", "Let's extract all residues in the LDP binding site." ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "AC7 A 46 ASP\n", "AC7 A 117 ALA\n", "AC7 A 120 VAL\n", "AC7 A 121 ASP\n", "AC7 A 124 TYR\n", "AC7 A 325 PHE\n", "AC7 A 422 SER\n", "AC7 A 425 GLY\n", "AC7 A 812 HOH\n" ] } ], "source": [ "site_ID = struc_dict['_struct_site_gen.site_id']\n", "site_chain = struc_dict['_struct_site_gen.auth_asym_id']\n", "site_resnum = struc_dict['_struct_site_gen.auth_seq_id']\n", "site_resname = struc_dict['_struct_site_gen.label_comp_id']\n", "\n", "cif_binding_residues = []\n", "for bind_id, ch, num, name in zip(site_ID, site_chain, site_resnum, site_resname):\n", " if bind_id == \"AC7\":\n", " print(bind_id, ch, num, name)\n", " try:\n", " cif_binding_residues.append(structure[0][ch][int(num)])\n", " except:\n", " continue\n", " else:\n", " continue" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's say we don't trust this annotation. We can compute our own ligand binding site and compare.\n", "\n", "NOTE: Obviously we could have done this directly with the `structure` object we obtained earlier.\n", "\n", "### Step 1: Find the LDP residue\n", "\n", "We can get all the residues of a model using the `model.get_residues()` method." ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "#finding LDP residue\n", "LDP = None\n", "for res in structure[0].get_residues():\n", " if res.resname == \"LDP\":\n", " LDP = res\n", " break\n", "print(LDP)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Step 2: find all other residues within a certain distance cutoff\n", "\n", "Let's set a distance cutoff of 10 Angstroms.\n", "\n", "We will count as binding residues any residue whose $\\alpha$-carbon is within 10 Angstrom of any atom in LDP.\n", "\n", "BioPython gives us a vector of X, Y, Z coordinates for every atom in the residue.\n", "\n", "Let's get the X, Y, Z coordinates of the alpha carbon of residue 56 in chain A.\n", "\n", "For this, we use the `coord` attribute." ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 3.7650001 -10.38899994 -31.97200012]\n" ] } ], "source": [ "res_1_CA = structure[0]['A'][56]['CA']\n", "print(res_1_CA.coord)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we can use this to compute distances!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's take another atom." ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[-12.76200008 9.25 -31.8939991 ]\n" ] } ], "source": [ "res_2_CA = structure[0]['A'][327]['CA']\n", "print(res_2_CA.coord)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The difference between the coordinates will be a 3D vector." ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 16.52700043 -19.63899994 -0.07800102]\n" ] } ], "source": [ "diff = res_1_CA.coord - res_2_CA.coord\n", "print(diff)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To get positive values we square the vector and then take the square root." ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 16.52700043 19.63899994 0.07800102]\n" ] } ], "source": [ "import numpy as np\n", "dist = np.sqrt(diff * diff)\n", "print(dist)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We now have the distance along each axis between the two CA atoms of the two residues.\n", "\n", "We can apply this to every residue." ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "collapsed": true }, "outputs": [], "source": [ "cutoff = 10\n", "\n", "binding_residues = []\n", "\n", "for res in structure[0].get_residues():\n", " #skip the LDP residue\n", " if res == LDP:\n", " continue\n", " #non-amino acid residues are tagged with an 'H' in their id tuple\n", " #we want to skip these\n", " elif res.id[0].startswith(\"H\"):\n", " continue\n", " else:\n", " alpha_carbon = res['CA']\n", " distances = []\n", " for atom in LDP:\n", " #subtract the two position vectors\n", " diff_vector = alpha_carbon.coord - atom.coord\n", " #to get a positive value we square the difference vector\n", " #we then take the square root to go back to the original scale\n", " distances.append(np.sqrt(np.sum(diff_vector * diff_vector)))\n", " #we get the nearest atom using min(distances) and see if it falls inside\n", " #the cutoff\n", " if min(distances) < cutoff:\n", " binding_residues.append(res)" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ]\n" ] } ], "source": [ "print(binding_residues)" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "87d10d1f684644d5bff9900b66c82bdd", "version_major": 2, "version_minor": 0 }, "text/plain": [ "A Jupyter Widget" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#view = nv.demo()\n", "view = nv.show_biopython(structure)\n", "\n", "# use hex values for now.\n", "residues = structure[0].get_residues()\n", "#this is a bit of a hack to set the binding residues to red in the visualization\n", "colors = ['0x0000FF' if r not in binding_residues else '0xFF0000' for r in residues]\n", "view._set_color_by_residue(colors, component_index=0, repr_index=0)\n", "view" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ok now let's compare this to our list of residues obtained from the mmCIF annotations." ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "06f9444429604a94b0e63136fce5732f", "version_major": 2, "version_minor": 0 }, "text/plain": [ "A Jupyter Widget" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "view = nv.show_biopython(structure)\n", "\n", "# use hex values for now.\n", "residues = structure[0].get_residues()\n", "#this is a bit of a hack to set the binding residues to red in the visualization\n", "colors = ['0x0000FF' if r not in cif_binding_residues else '0xFF0000' for r in residues]\n", "view._set_color_by_residue(colors, component_index=0, repr_index=0)\n", "view" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It looks like we were maybe a bit too permissive with our distance cutoff." ] } ], "metadata": { "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.2" } }, "nbformat": 4, "nbformat_minor": 2 }