From a300b8f40faf0d808ce4ae24cabfc2d42ca68e33 Mon Sep 17 00:00:00 2001 From: dominiquesydow Date: Mon, 1 Aug 2022 11:32:06 +0100 Subject: [PATCH 1/9] T029: Add talktorial draft --- .../talktorials/T029_query_gpcrdb/README.md | 55 + .../T029_query_gpcrdb/talktorial.ipynb | 5774 +++++++++++++++++ 2 files changed, 5829 insertions(+) create mode 100644 teachopencadd/talktorials/T029_query_gpcrdb/README.md create mode 100644 teachopencadd/talktorials/T029_query_gpcrdb/talktorial.ipynb diff --git a/teachopencadd/talktorials/T029_query_gpcrdb/README.md b/teachopencadd/talktorials/T029_query_gpcrdb/README.md new file mode 100644 index 00000000..e9356a41 --- /dev/null +++ b/teachopencadd/talktorials/T029_query_gpcrdb/README.md @@ -0,0 +1,55 @@ +# T029 · GPCR data acquisition (GPCRdb) + +**Note:** This talktorial is a part of TeachOpenCADD, a platform that aims to teach domain-specific skills and to provide pipeline templates as starting points for research projects. + +Authors: + +- Dominique Sydow, 2022, [Volkamer lab, Charité](https://volkamerlab.org/) + + +## Aim of this talktorial + +Add a short summary of this talktorial's content. + + +### Contents in *Theory* + +_Add Table of Contents (TOC) for Theory section._ + +* ChEMBL database +* Compound activity measures + + +
+ +Sync TOC with section titles: These points should refer to the headlines of your Theory section. + +
+ + +### Contents in *Practical* + +_Add Table of Contents (TOC) for Practical section._ + +* Connect to ChEMBL database +* Load and draw molecules + + +
+ +Sync TOC with section titles: These points should refer to the headlines of your Practical section. + +
+ + +### References + +* Paper +* Tutorial links +* Other useful resources + +*We suggest the following citation style:* +* Keyword describing resource: Journal (year), volume, pages (link to resource) + +*Example:* +* ChEMBL web services: [Nucleic Acids Res. (2015), 43, 612-620](https://academic.oup.com/nar/article/43/W1/W612/2467881) diff --git a/teachopencadd/talktorials/T029_query_gpcrdb/talktorial.ipynb b/teachopencadd/talktorials/T029_query_gpcrdb/talktorial.ipynb new file mode 100644 index 00000000..a0bff8b1 --- /dev/null +++ b/teachopencadd/talktorials/T029_query_gpcrdb/talktorial.ipynb @@ -0,0 +1,5774 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# T029 · GPCR data acquisition (GPCRdb)\n", + "\n", + "**Note:** This talktorial is a part of TeachOpenCADD, a platform that aims to teach domain-specific skills and to provide pipeline templates as starting points for research projects.\n", + "\n", + "Authors:\n", + "\n", + "- Dominique Sydow, 2022, [Volkamer lab, Charité](https://volkamerlab.org/)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Aim of this talktorial\n", + "\n", + "Add a short summary of this talktorial's content." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Contents in *Theory*\n", + "\n", + "_Add Table of Contents (TOC) for Theory section._\n", + "\n", + "* ChEMBL database\n", + "* Compound activity measures" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "
\n", + "\n", + "Sync TOC with section titles: These points should refer to the headlines of your Theory section.\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Contents in *Practical*\n", + "\n", + "_Add Table of Contents (TOC) for Practical section._\n", + "\n", + "* Connect to ChEMBL database\n", + "* Load and draw molecules" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "
\n", + "\n", + "Sync TOC with section titles: These points should refer to the headlines of your Practical section.\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### References\n", + "\n", + "* Paper \n", + "* Tutorial links\n", + "* Other useful resources\n", + "\n", + "*We suggest the following citation style:*\n", + "* Keyword describing resource: Journal (year), volume, pages (link to resource) \n", + "\n", + "*Example:*\n", + "* ChEMBL web services: [Nucleic Acids Res. (2015), 43, 612-620](https://academic.oup.com/nar/article/43/W1/W612/2467881) " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Theory" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### GPCRs\n", + "\n", + "TODO" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### GPCRdb overview \n", + "\n", + "The GPCRdb is a GPCR data resource, similar to the kinase resource KLIFS, full of receptor-level annotations:\n", + "- Links to ChEMBL, Guide to Pharmacology (GtoPDB), and UniProt\n", + "- Endogenous ligands\n", + "- Residue mutations\n", + "- Homology models (active, inactive, and/or intermediate state)\n", + "- PDB structures\n", + "- Structure-based sequence alignments across the GPCRome (using a [GPCRdb numbering scheme](https://docs.gpcrdb.org/generic_numbering.html))\n", + "- Tons of analysis tools, e.g. different tools to visualize residues within the transmembrane helices (TMs), structure comparison tools, and phylogenetic trees" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### GPCRdb programmatic access\n", + "\n", + "The GPCRdb has --- just like KLIFS --- a Swagger API (https://gpcrdb.org/services/), allowing us to fetch some of the data programmatically, e.g. using Python. I could not find a Swagger definitions that would allow us to dynamically generate a Python client with `bravado` but we can easily send requests with `requests`. \n", + "\n", + "We can send queries (e.g. for β2-adrenoceptor) based on the following terms:\n", + "- `entry_name`: UniProt entry name (adrb2_human)\n", + "- `slug`: GPCRdb slugs (001_001_003_008, i.e. *class_ligand_subfamily_subtype*)\n", + "\n", + "Let's get receptor data on different levels:\n", + "- Protein\n", + "- Drugs\n", + "- Residues\n", + "- Structure\n", + "- Interactions" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Practical" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import requests\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's define some example receptor and structure:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "query_receptor = \"adrb2_human\"\n", + "query_structure = \"3SN6\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Protein annotations for input receptor" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "def protein_by_entry_name(entry_name):\n", + " \"\"\"\n", + " From the GPCRdb, get protein annotations associated with the input UniProt entry name.\n", + "\n", + " Parameters\n", + " ----------\n", + " entry_name : str\n", + " UniProt entry name for GPCR of interest.\n", + "\n", + " Returns\n", + " -------\n", + " dict\n", + " Protein annotations deposited in the GPCRdb.\n", + " \"\"\"\n", + "\n", + " url = f\"https://gpcrdb.org/services/protein/{entry_name}/\"\n", + " response = requests.get(url)\n", + " data = response.json()\n", + " return data" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'entry_name': 'adrb2_human',\n", + " 'name': 'β2-adrenoceptor',\n", + " 'accession': 'P07550',\n", + " 'family': '001_001_003_008',\n", + " 'species': 'Homo sapiens',\n", + " 'source': 'SWISSPROT',\n", + " 'residue_numbering_scheme': 'GPCRdb(A)',\n", + " 'sequence': 'MGQPGNGSAFLLAPNGSHAPDHDVTQERDEVWVVGMGIVMSLIVLAIVFGNVLVITAIAKFERLQTVTNYFITSLACADLVMGLAVVPFGAAHILMKMWTFGNFWCEFWTSIDVLCVTASIETLCVIAVDRYFAITSPFKYQSLLTKNKARVIILMVWIVSGLTSFLPIQMHWYRATHQEAINCYANETCCDFFTNQAYAIASSIVSFYVPLVIMVFVYSRVFQEAKRQLQKIDKSEGRFHVQNLSQVEQDGRTGHGLRRSSKFCLKEHKALKTLGIIMGTFTLCWLPFFIVNIVHVIQDNLIRKEVYILLNWIGYVNSGFNPLIYCRSPDFRIAFQELLCLRRSSLKAYGNGYSSNGNTGEQSGYHVEQEKENKLLCEDLPGTEDFVGHQGTVPSDNIDSQGRNCSTNDSLL',\n", + " 'genes': ['ADRB2', 'ADRB2R', 'B2AR']}" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "protein_by_entry_name(query_receptor)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Drug annotations for input receptor" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "def drugs_by_entry_name(entry_name):\n", + " \"\"\"\n", + " From the GPCRdb, get drugs associated with input UniProt entry name.\n", + "\n", + " Parameters\n", + " ----------\n", + " entry_name : str\n", + " UniProt entry name for GPCR of interest.\n", + "\n", + " Returns\n", + " -------\n", + " pandas.DataFrame\n", + " Drug annotations deposited in the GPCRdb.\n", + " \"\"\"\n", + "\n", + " url = f\"https://gpcrdb.org/services/drugs/{entry_name}/\"\n", + " response = requests.get(url)\n", + " data = response.json()\n", + " data = pd.DataFrame(data)\n", + " return data" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
nameapprovalindicationstatusdrugtypemoanovelty
0albuterol1981chronic obstructive pulmonary disease (COPD)approvedsmall moleculeagonistestablished
1alprenolol1966Anti-Arrhythmia ; Antihypertensiveapprovedsmall moleculeantagonistestablished
2arformoterol2006Bronchodilatorapprovedsmall moleculeagonistestablished
3bitolterol1984obstructive lung diseaseapprovedsmall moleculeagonistestablished
4carteolol1988cardiovascular diseaseapprovedsmall moleculeantagonistestablished
........................
70procaterol-Bronchodilatorin trial (recruiting, 2015)small moleculeagonistestablished
71pw2101-Antihypertensivein trial (discontinued, 2005)small moleculeantagonistestablished
72syl040012-Antiglaucomicin trial (completed, 2014)sirnaantagonistestablished
73vilanterol-chronic obstructive pulmonary disease (COPD)in trial (ongoing, 2016)small moleculeagonistestablished
74cicletanine-Antihypertensivein trial (not open yet, 2016)small moleculenot availableestablished
\n", + "

75 rows × 7 columns

\n", + "
" + ], + "text/plain": [ + " name approval indication \\\n", + "0 albuterol 1981 chronic obstructive pulmonary disease (COPD) \n", + "1 alprenolol 1966 Anti-Arrhythmia ; Antihypertensive \n", + "2 arformoterol 2006 Bronchodilator \n", + "3 bitolterol 1984 obstructive lung disease \n", + "4 carteolol 1988 cardiovascular disease \n", + ".. ... ... ... \n", + "70 procaterol - Bronchodilator \n", + "71 pw2101 - Antihypertensive \n", + "72 syl040012 - Antiglaucomic \n", + "73 vilanterol - chronic obstructive pulmonary disease (COPD) \n", + "74 cicletanine - Antihypertensive \n", + "\n", + " status drugtype moa novelty \n", + "0 approved small molecule agonist established \n", + "1 approved small molecule antagonist established \n", + "2 approved small molecule agonist established \n", + "3 approved small molecule agonist established \n", + "4 approved small molecule antagonist established \n", + ".. ... ... ... ... \n", + "70 in trial (recruiting, 2015) small molecule agonist established \n", + "71 in trial (discontinued, 2005) small molecule antagonist established \n", + "72 in trial (completed, 2014) sirna antagonist established \n", + "73 in trial (ongoing, 2016) small molecule agonist established \n", + "74 in trial (not open yet, 2016) small molecule not available established \n", + "\n", + "[75 rows x 7 columns]" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "drugs_by_entry_name(query_receptor)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Residue annotations for input receptor" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "def residues_by_entry_name(entry_name, assigned_residues_only=False):\n", + " \"\"\"\n", + " From the GPCRdb, get residue annotations for input UniProt entry name.\n", + "\n", + " Parameters\n", + " ----------\n", + " entry_name : str\n", + " UniProt entry name for GPCR of interest.\n", + " assigned_residues_only : bool\n", + " Report only residues with a generic number (default: False).\n", + "\n", + " Returns\n", + " -------\n", + " pandas.DataFrame\n", + " Residue annotations deposited in the GPCRdb.\n", + " \"\"\"\n", + "\n", + " url = f\"https://gpcrdb.org/services/residues/extended/{entry_name}/\"\n", + " response = requests.get(url)\n", + " data = response.json()\n", + " data = pd.DataFrame(data)\n", + " if assigned_residues_only:\n", + " data = data[data[\"display_generic_number\"].notna()]\n", + " return data" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
sequence_numberamino_acidprotein_segmentdisplay_generic_numberalternative_generic_numbers
2526QTM11.25x25[{'scheme': 'BW', 'label': '1.25'}, {'scheme':...
2627ETM11.26x26[{'scheme': 'BW', 'label': '1.26'}, {'scheme':...
2728RTM11.27x27[{'scheme': 'BW', 'label': '1.27'}, {'scheme':...
2829DTM11.28x28[{'scheme': 'BW', 'label': '1.28'}, {'scheme':...
2930ETM11.29x29[{'scheme': 'BW', 'label': '1.29'}, {'scheme':...
..................
336337QH88.55x55[{'scheme': 'BW', 'label': '8.55'}, {'scheme':...
337338EH88.56x56[{'scheme': 'BW', 'label': '8.56'}, {'scheme':...
338339LH88.57x57[{'scheme': 'BW', 'label': '8.57'}, {'scheme':...
339340LH88.58x58[{'scheme': 'BW', 'label': '8.58'}, {'scheme':...
340341CH88.59x59[{'scheme': 'BW', 'label': '8.59'}, {'scheme':...
\n", + "

268 rows × 5 columns

\n", + "
" + ], + "text/plain": [ + " sequence_number amino_acid protein_segment display_generic_number \\\n", + "25 26 Q TM1 1.25x25 \n", + "26 27 E TM1 1.26x26 \n", + "27 28 R TM1 1.27x27 \n", + "28 29 D TM1 1.28x28 \n", + "29 30 E TM1 1.29x29 \n", + ".. ... ... ... ... \n", + "336 337 Q H8 8.55x55 \n", + "337 338 E H8 8.56x56 \n", + "338 339 L H8 8.57x57 \n", + "339 340 L H8 8.58x58 \n", + "340 341 C H8 8.59x59 \n", + "\n", + " alternative_generic_numbers \n", + "25 [{'scheme': 'BW', 'label': '1.25'}, {'scheme':... \n", + "26 [{'scheme': 'BW', 'label': '1.26'}, {'scheme':... \n", + "27 [{'scheme': 'BW', 'label': '1.27'}, {'scheme':... \n", + "28 [{'scheme': 'BW', 'label': '1.28'}, {'scheme':... \n", + "29 [{'scheme': 'BW', 'label': '1.29'}, {'scheme':... \n", + ".. ... \n", + "336 [{'scheme': 'BW', 'label': '8.55'}, {'scheme':... \n", + "337 [{'scheme': 'BW', 'label': '8.56'}, {'scheme':... \n", + "338 [{'scheme': 'BW', 'label': '8.57'}, {'scheme':... \n", + "339 [{'scheme': 'BW', 'label': '8.58'}, {'scheme':... \n", + "340 [{'scheme': 'BW', 'label': '8.59'}, {'scheme':... \n", + "\n", + "[268 rows x 5 columns]" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "residues_by_entry_name(query_receptor, assigned_residues_only=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Structure annotations for input receptor" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "def structures_by_entry_name(entry_name):\n", + " \"\"\"\n", + " From the GPCRdb, get structure data for input UniProt entry name.\n", + "\n", + " Parameters\n", + " ----------\n", + " entry_name : str\n", + " UniProt entry name for GPCR of interest.\n", + "\n", + " Returns\n", + " -------\n", + " pandas.DataFrame\n", + " Structure annotations deposited in the GPCRdb.\n", + " \"\"\"\n", + "\n", + " url = f\"https://gpcrdb.org/services/structure/protein/{entry_name}/\"\n", + " response = requests.get(url)\n", + " data = response.json()\n", + " data = pd.DataFrame(data)\n", + " return data" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of structures: 37\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
pdb_codeproteinfamilyspeciespreferred_chainresolutionpublication_datetypestatedistancepublicationligandssignalling_protein
02RH1adrb2_human001_001_003_008Homo sapiensA2.42007-10-30X-ray diffractionInactiveNonehttps://dx.doi.org/10.1126/SCIENCE.1150577[{'name': 'Carazolol', 'type': 'small-molecule...NaN
12R4Radrb2_human001_001_003_008Homo sapiensA3.42007-11-06X-ray diffractionInactiveNonehttps://dx.doi.org/10.1038/NATURE06325[]NaN
22R4Sadrb2_human001_001_003_008Homo sapiensA3.42007-11-06X-ray diffractionInactiveNoneNone[]NaN
33D4Sadrb2_human001_001_003_008Homo sapiensA2.82008-06-17X-ray diffractionInactiveNonehttps://dx.doi.org/10.1016/J.STR.2008.05.001[{'name': 'timolol', 'type': 'small-molecule',...NaN
43KJ6adrb2_human001_001_003_008Homo sapiensA3.42010-02-16X-ray diffractionInactiveNonehttps://dx.doi.org/10.1038/NATURE08650[]NaN
\n", + "
" + ], + "text/plain": [ + " pdb_code protein family species preferred_chain \\\n", + "0 2RH1 adrb2_human 001_001_003_008 Homo sapiens A \n", + "1 2R4R adrb2_human 001_001_003_008 Homo sapiens A \n", + "2 2R4S adrb2_human 001_001_003_008 Homo sapiens A \n", + "3 3D4S adrb2_human 001_001_003_008 Homo sapiens A \n", + "4 3KJ6 adrb2_human 001_001_003_008 Homo sapiens A \n", + "\n", + " resolution publication_date type state distance \\\n", + "0 2.4 2007-10-30 X-ray diffraction Inactive None \n", + "1 3.4 2007-11-06 X-ray diffraction Inactive None \n", + "2 3.4 2007-11-06 X-ray diffraction Inactive None \n", + "3 2.8 2008-06-17 X-ray diffraction Inactive None \n", + "4 3.4 2010-02-16 X-ray diffraction Inactive None \n", + "\n", + " publication \\\n", + "0 https://dx.doi.org/10.1126/SCIENCE.1150577 \n", + "1 https://dx.doi.org/10.1038/NATURE06325 \n", + "2 None \n", + "3 https://dx.doi.org/10.1016/J.STR.2008.05.001 \n", + "4 https://dx.doi.org/10.1038/NATURE08650 \n", + "\n", + " ligands signalling_protein \n", + "0 [{'name': 'Carazolol', 'type': 'small-molecule... NaN \n", + "1 [] NaN \n", + "2 [] NaN \n", + "3 [{'name': 'timolol', 'type': 'small-molecule',... NaN \n", + "4 [] NaN " + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "structures = structures_by_entry_name(query_receptor)\n", + "print(f\"Number of structures: {len(structures)}\")\n", + "structures.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "state\n", + "Active 13\n", + "Inactive 24\n", + "dtype: int64" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "structures.groupby(\"state\").size()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Interaction annotations for input structure" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "def interactions_by_pdb_id(pdb_id):\n", + " \"\"\"\n", + " From the GPCRdb, get interactions between structure and ligand for input PDB ID.\n", + "\n", + " Parameters\n", + " ----------\n", + " pdb_id : str\n", + " PDB ID for GPCR structure of interest.\n", + "\n", + " Returns\n", + " -------\n", + " pandas.DataFrame\n", + " Interactions reported in the GPCRdb for input structure.\n", + " \"\"\"\n", + "\n", + " url = f\"https://gpcrdb.org/services/structure/{pdb_id}/interaction/\"\n", + " response = requests.get(url)\n", + " data = response.json()\n", + " data = pd.DataFrame(data)\n", + " return data" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of structures: 36\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
pdb_codeligand_nameamino_acidsequence_numberdisplay_generic_numberinteraction_type
03SN6BI-167107W1093.28x28accessible
13SN6BI-167107W1093.28x28hydrophobic
23SN6BI-167107T1103.29x29accessible
33SN6BI-167107D1133.32x32polar (charge-charge)
43SN6BI-167107D1133.32x32accessible
\n", + "
" + ], + "text/plain": [ + " pdb_code ligand_name amino_acid sequence_number display_generic_number \\\n", + "0 3SN6 BI-167107 W 109 3.28x28 \n", + "1 3SN6 BI-167107 W 109 3.28x28 \n", + "2 3SN6 BI-167107 T 110 3.29x29 \n", + "3 3SN6 BI-167107 D 113 3.32x32 \n", + "4 3SN6 BI-167107 D 113 3.32x32 \n", + "\n", + " interaction_type \n", + "0 accessible \n", + "1 hydrophobic \n", + "2 accessible \n", + "3 polar (charge-charge) \n", + "4 accessible " + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "interactions = interactions_by_pdb_id(query_structure)\n", + "print(f\"Number of structures: {len(interactions)}\")\n", + "interactions.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Case study: Receptor interaction profile for β2-adrenoceptor" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "def interactions_by_entry_name(entry_name, state=None):\n", + " \"\"\"\n", + " From the GPCRdb, get interactions for all structures associated with\n", + " the input UniProt entry name.\n", + "\n", + " Parameters\n", + " ----------\n", + " pdb_id : str\n", + " PDB ID for GPCR structure of interest.\n", + " state : None or str\n", + " Optional: Filter for structures in a specific receptor state (active, inactive).\n", + "\n", + " Returns\n", + " -------\n", + " pandas.DataFrame\n", + " Interactions reported in the GPCRdb for all structures for the input GPCR.\n", + " \"\"\"\n", + "\n", + " # Get all structures\n", + " structures = structures_by_entry_name(entry_name)\n", + " structures[\"state\"] = structures[\"state\"].str.lower()\n", + " states = structures[\"state\"].unique().tolist()\n", + "\n", + " # Select state\n", + " if state is None:\n", + " pass\n", + " elif state.lower() in states:\n", + " structures = structures[structures[\"state\"] == state.lower()]\n", + " else:\n", + " raise KeyError(f\"Unknown state {state}; choose from {states}\")\n", + "\n", + " # Get interactions for all structures\n", + " pdb_ids = structures[\"pdb_code\"].to_list()\n", + " receptor_interactions = []\n", + " for pdb_id in pdb_ids:\n", + " structure_interactions = interactions_by_pdb_id(pdb_id)\n", + " receptor_interactions.append(structure_interactions)\n", + " receptor_interactions = pd.concat(receptor_interactions)\n", + "\n", + " # Discard residues without generic numbering\n", + " receptor_interactions = receptor_interactions[\n", + " receptor_interactions[\"display_generic_number\"].notna()\n", + " ]\n", + "\n", + " return receptor_interactions" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
pdb_codeligand_nameamino_acidsequence_numberdisplay_generic_numberinteraction_type
02RH1CarazololW1093.28x28accessible
12RH1CarazololT1103.29x29accessible
22RH1CarazololD1133.32x32polar (charge-charge)
32RH1CarazololD1133.32x32accessible
42RH1CarazololD1133.32x32polar (charge-assisted hydrogen bond)
.....................
177DHRLEVISOPRENALINEF2906.52x52accessible
187DHRLEVISOPRENALINEN2936.55x55accessible
207DHRLEVISOPRENALINEN3127.39x38polar (hydrogen bond)
217DHRLEVISOPRENALINEN3127.39x38accessible
227DHRLEVISOPRENALINEY3167.43x42accessible
\n", + "

1149 rows × 6 columns

\n", + "
" + ], + "text/plain": [ + " pdb_code ligand_name amino_acid sequence_number \\\n", + "0 2RH1 Carazolol W 109 \n", + "1 2RH1 Carazolol T 110 \n", + "2 2RH1 Carazolol D 113 \n", + "3 2RH1 Carazolol D 113 \n", + "4 2RH1 Carazolol D 113 \n", + ".. ... ... ... ... \n", + "17 7DHR LEVISOPRENALINE F 290 \n", + "18 7DHR LEVISOPRENALINE N 293 \n", + "20 7DHR LEVISOPRENALINE N 312 \n", + "21 7DHR LEVISOPRENALINE N 312 \n", + "22 7DHR LEVISOPRENALINE Y 316 \n", + "\n", + " display_generic_number interaction_type \n", + "0 3.28x28 accessible \n", + "1 3.29x29 accessible \n", + "2 3.32x32 polar (charge-charge) \n", + "3 3.32x32 accessible \n", + "4 3.32x32 polar (charge-assisted hydrogen bond) \n", + ".. ... ... \n", + "17 6.52x52 accessible \n", + "18 6.55x55 accessible \n", + "20 7.39x38 polar (hydrogen bond) \n", + "21 7.39x38 accessible \n", + "22 7.43x42 accessible \n", + "\n", + "[1149 rows x 6 columns]" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "receptor_interactions = interactions_by_entry_name(\"adrb2_human\", state=None)\n", + "receptor_interactions" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Found the following interaction types:\n", + "- accessible\n", + "- aromatic (edge-to-face)\n", + "- aromatic (face-to-edge)\n", + "- aromatic (face-to-face)\n", + "- hydrophobic\n", + "- polar (charge-assisted hydrogen bond)\n", + "- polar (charge-charge)\n", + "- polar (hydrogen bond with backbone)\n", + "- polar (hydrogen bond)\n" + ] + } + ], + "source": [ + "# Report interaction types\n", + "print(\"\\nFound the following interaction types:\")\n", + "interaction_types = receptor_interactions[\"interaction_type\"].unique().tolist()\n", + "for interaction_type in sorted(interaction_types):\n", + " print(f\"- {interaction_type}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Interactions count per structure and residue (heatmap)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "def get_interactions_for_structures_vs_residues(interactions_df, interactions_type=None):\n", + " \"\"\"\n", + " Get interaction count matrix per structure and residue.\n", + "\n", + " Parameters\n", + " ----------\n", + " interactions_df : pandas.DataFrame\n", + " Output DataFrame from `interactions_by_entry_name` function.\n", + " interactions_type : None or str\n", + " Optional: Filter by a certain interaction type (can be a substring).\n", + "\n", + " Returns\n", + " -------\n", + " pandas.DataFrame\n", + " Structures vs residue matrix counting number of interactions for input interaction type.\n", + " \"\"\"\n", + "\n", + " if interactions_type is None:\n", + " pass\n", + " else:\n", + " interactions_type = interactions_type.lower()\n", + " interactions_df = interactions_df[\n", + " interactions_df[\"interaction_type\"].str.contains(interactions_type)\n", + " ]\n", + "\n", + " structures_vs_interactions_df = (\n", + " interactions_df.groupby([\"pdb_code\", \"display_generic_number\"])[\"interaction_type\"]\n", + " .apply(len)\n", + " .reset_index()\n", + " .pivot(index=\"pdb_code\", columns=\"display_generic_number\", values=\"interaction_type\")\n", + " .fillna(0)\n", + " .astype(int)\n", + " )\n", + " return structures_vs_interactions_df" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
display_generic_number1.53x531.56x561.57x571.60x6012.49x4912.50x502.37x372.39x392.40x402.42x422.43x432.53x532.61x602.64x632.65x6423.50x503.28x283.29x293.32x323.33x333.36x363.37x373.41x413.44x443.45x453.48x483.49x493.52x523.56x5634.52x5234.53x5334.56x5634.57x574.41x414.44x444.45x454.48x4845.50x5045.51x5145.52x525.38x395.39x405.42x435.43x445.45x465.46x4615.49x495.50x505.53x536.33x336.36x366.37x376.48x486.51x516.52x526.55x556.58x587.31x307.32x317.35x347.36x357.39x387.40x397.43x427.53x537.55x558.47x478.48x488.49x498.50x508.52x528.53x53
pdb_code                                                                        
2RH1000000000000000011322100000000000000000221210100000012210001030200000000
3D4S000000000001000011321200000000000000000211110100000012220001030200000000
3NY8000000000001000011222100000000000000000210110100000012210001040200000000
3NY9000000000001000011322100000000000000000211110100000012230001040100000000
3NYA000000000001000011322100000000000000000211110100000012210001040200000000
3P0G000000000000010021321100000000000000011211310200000012210011140100000000
3PDS000000000000121121221000000000000000011211410200000012220001141100000000
3SN6000000000000000021221100000000000000011211310200000012220011140100000000
4GBR000000000000000011322100000000000000000211210100000012210001020200000000
4LDE000000000000010021321100000000000000011211410200000012220001140100000000
4LDL000000000000010021321100000000000000002210210200000012210011130200000000
4LDO000000000000000010321100000000000000000200210100000012220001040100000000
4QKX000000000000131120321100000000000000021210310200000012110001131200000000
5D5A000000000000000011322100000000000000000221210100000012210001030200000000
5D5B000000000000000011322100000000000000000221210100000012210001030100000000
5D6L000000000000000011322100000000000000000221210100000012210001030200000000
5JQH000000000000000021322100000000000000000211210100000012210001030100000000
5X7D111122112021000011322100000000000000000211210100022212210001040121212211
6E67000000000000000021321100000000000000001212410200000012220011130100000000
6MXT000000000000010011321100000000000000001211410200000012212112230100000000
6N48000000000100010011321100111211221212111211310200000012220001140200000000
6NI3000000000000010021321100000000000000001201210200000002120011120100000000
6OBA000000000000000011222121120000000000000211112221100012210001040100000000
6PRZ000000000000000011321100000000000000000211110100000012210001040100000000
6PS0000000000001000011322100000000000000000211210100000012210000030100000000
6PS1000000000001000011321200000000000000000211110100000012220001030100000000
6PS2000000000001000011321100000000000000000211110100000012210001040100000000
6PS3000000000000121021322100000000000000001221210100000012210001251100000000
6PS4000000000000000011322100000000000000000210110100000012210001040100000000
6PS5000000000000000011321100000000000000000211110100000012210001040100000000
6PS6000000000001000011311200000000000000000211110100000012230001030100000000
7BZ2000000000000020021121100000000000000001211310100000001210001010300000000
7DHI000000000000000011321100000000000000000210310200000012210001020100000000
7DHR000000000000000011311100000000000000000210110200000010210000020100000000
\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "structures_vs_interactions_df = get_interactions_for_structures_vs_residues(\n", + " receptor_interactions, interactions_type=None\n", + ")\n", + "structures_vs_interactions_df.style.background_gradient()" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
display_generic_number12.49x492.40x402.64x633.32x323.33x333.37x373.41x414.41x4145.51x5145.52x525.39x405.42x435.45x465.46x4616.36x366.55x557.39x387.43x428.47x478.49x49
pdb_code                    
2RH100020000000100002100
3D4S00020100000000012100
3NY800010000000000003100
3NY900020000000000023000
3NYA00020000000000003100
3P0G00020000000201003000
3PDS00110000000301013000
3SN600010000000201013000
4GBR00020000000100001100
4LDE00020000000301013000
4LDL00020000100101002100
4LDO00020000000100013000
4QKX00220000000201002100
5D5A00020000000100002100
5D5B00020000000100002000
5D6L00020000000100002100
5JQH00020000000100002000
5X7D11020000000100103011
6E6700020000001301012000
6MXT00020000010301002000
6N4800020001000201013100
6NI300020000000101011000
6OBA00010010000010003000
6PRZ00020000000000003000
6PS000020000000100002000
6PS100021100000000012000
6PS200020000000000003000
6PS300020000000100004000
6PS400020000000000003000
6PS500020000000000003000
6PS600020100000000022000
7BZ200000000000200000200
7DHI00020000000201001000
7DHR00020000000001001000
\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "structures_vs_interactions_df = get_interactions_for_structures_vs_residues(\n", + " receptor_interactions, interactions_type=\"polar\"\n", + ")\n", + "structures_vs_interactions_df.style.background_gradient()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Interaction type count per residue (barplot)\n", + "\n", + "Just like we did in TeachOpenCADD for KLIFS: https://projects.volkamerlab.org/teachopencadd/talktorials/T012_query_klifs.html#2.-Average-interaction-fingerprint" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "def get_residues_vs_interactions(interactions_df):\n", + " \"\"\"\n", + " Get interaction type count per residue (summarized over all structures for a given receptor).\n", + "\n", + " Parameters\n", + " ----------\n", + " interactions_df : pandas.DataFrame\n", + " Output DataFrame from `interactions_by_entry_name` function.\n", + "\n", + " Returns\n", + " -------\n", + " pandas.DataFrame\n", + " Residues vs interaction type matrix counting the number of structures showing interactions.\n", + " \"\"\"\n", + "\n", + " # Simplify interaction types\n", + " interactions_df[\"interaction_type\"] = interactions_df[\"interaction_type\"].apply(\n", + " lambda x: x.split(\" (\")[0]\n", + " )\n", + "\n", + " # Is interaction present per structure and residue (do not keep count)\n", + " interactions_deduplicated_df = (\n", + " interactions_df[[\"pdb_code\", \"display_generic_number\", \"interaction_type\"]]\n", + " .drop_duplicates()\n", + " .copy()\n", + " )\n", + " interactions_deduplicated_df\n", + "\n", + " # Transform DataFrame into presence/absence matrix residues vs interaction types\n", + " residues_vs_interactions_df = (\n", + " interactions_deduplicated_df.groupby([\"display_generic_number\", \"interaction_type\"])\n", + " .apply(len)\n", + " .reset_index()\n", + " .rename(columns={0: \"count\"})\n", + " .pivot(index=\"display_generic_number\", columns=\"interaction_type\", values=\"count\")\n", + " .fillna(0)\n", + " .astype(int)\n", + " )\n", + "\n", + " return residues_vs_interactions_df" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
interaction_typeaccessiblearomatichydrophobicpolar
display_generic_number
1.53x531000
1.56x561000
1.57x571000
1.60x601000
12.49x491001
\n", + "
" + ], + "text/plain": [ + "interaction_type accessible aromatic hydrophobic polar\n", + "display_generic_number \n", + "1.53x53 1 0 0 0\n", + "1.56x56 1 0 0 0\n", + "1.57x57 1 0 0 0\n", + "1.60x60 1 0 0 0\n", + "12.49x49 1 0 0 1" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "residues_vs_interactions_df = get_residues_vs_interactions(receptor_interactions)\n", + "residues_vs_interactions_df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA3UAAAFiCAYAAABRQvEqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAAsTAAALEwEAmpwYAABi/0lEQVR4nO3deZgU1dn38e8NoiwiIiKiiKBBkX0TUYhCcNeA4EJcomiUuJtNJU9UFLPoE2OCGjWYKCaPC+IuRqOgoMSNVZRFcUH0RRE3FlkUuN8/qmZsmuqZqp6pnm7m97muvqa7+q7Td51TVdOnq+qUuTsiIiIiIiJSmurUdAIiIiIiIiKSP3XqRERERERESpg6dSIiIiIiIiVMnToREREREZESpk6diIiIiIhICVOnTkREREREpIRtU9MJxLHzzjt7mzZtajoNERERERGRGjFz5szP3L151Hsl0alr06YNM2bMqOk0REREREREaoSZfZDrvdROvzSzfc1sTsZjpZn9zMx2MrNnzWxR+LdpWjmIiIiIiIhs7VLr1Ln7W+7ezd27AT2BNcAjwEhgsru3AyaHr0VERERERCQPhRooZSDwrrt/AAwG7g6n3w0cV6AcREREREREtjqFuqbuR8B94fMW7v4xgLt/bGa7RM1gZiOAEQCtW7cuSJIiIiIiIrXZt99+y0cffcS6detqOpVaq379+rRq1Yp69erFnsfcPcWUwMy2BZYCHd19mZl95e47Zrz/pbtXeF1dr169XAOliIiIiIik6/3336dx48Y0a9YMM6vpdGodd+fzzz9n1apVtG3bdrP3zGymu/eKmq8Qp18eBcxy92Xh62Vm1jJMrCXwaQFyEBERERGRSqxbt04duhpkZjRr1izxkdJCdOpO5rtTLwEeB84In58BPFaAHEREREREJAZ16GpWPvWfaqfOzBoChwEPZ0y+DjjMzBaF712XZg4iIiIiIiJbs1Q7de6+xt2bufuKjGmfu/tAd28X/v0izRxERERERKT6HHTQQZXG/OUvf2HNmjWp5vHVV19x6623lr9eunQpJ5xwQrV+xu9///tqLS8thbqlgYiIiIiIbAVeeumlSmPy6dRt3LgxUXx2p2633XbjwQcfTFRGZdSpExERERGRrc72228PwJQpU+jfvz8nnHAC7du359RTT8Xduemmm1i6dCkDBgxgwIABADzzzDMceOCB9OjRgxNPPJHVq1cD0KZNG0aPHk2/fv2YMGECd9xxB/vvvz9du3bl+OOPL+8YLlu2jCFDhtC1a1e6du3KSy+9xMiRI3n33Xfp1q0bl156KYsXL6ZTp05AMODLmWeeSefOnenevTvPP/88AOPGjWPo0KEceeSRtGvXjssuuyznco4cOZK1a9fSrVs3Tj31VK688krGjBlT/v5vfvMbbrrpJqZMmcLBBx/MkCFD6NChA+eeey6bNm2qcLmrnbsX/aNnz54uIiIim+sxs0fkQ0QkX/Pnz680plGjRu7u/vzzz/sOO+zgH374oW/cuNH79OnjL774oru777nnnr58+XJ3d1++fLl///vf99WrV7u7+3XXXefXXHNNedz1119fXvZnn31W/vw3v/mN33TTTe7uftJJJ/mf//xnd3ffsGGDf/XVV/7+++97x44dy+MzX99www0+fPhwd3dfsGCB77HHHr527Vq/6667vG3btv7VV1/52rVrvXXr1r5kyZJKl7Ws/O7du7u7+8aNG32vvfbyzz77zJ9//nnfbrvt/N133/UNGzb4oYce6hMmTKhwuSsT1Q7ADM/RXyrUzcdFRERERGQr07t3b1q1agVAt27dWLx4Mf369dss5pVXXmH+/Pn07dsXgG+++YYDDzyw/P1hw4aVP3/zzTe54oor+Oqrr1i9ejVHHHEEAM899xz//Oc/Aahbty5NmjThyy+/zJnXtGnTuOiiiwBo3749e+65J2+//TYAAwcOpEmTJgB06NCBDz74gD322KPSZW3Tpg3NmjVj9uzZLFu2jO7du9OsWbPyethrr70AOPnkk5k2bRr169evcLmrkzp1IiIiIiKSl+222678ed26ddmwYcMWMe7OYYcdxn333bfFewCNGjUqfz58+HAeffRRunbtyrhx45gyZUpeeQUHtvLPOZezzz6bcePG8cknn3DWWWeVT8++DYGZVbrc1UnX1InUMj1n9Yx8iEjpmdlwVuRDRLZ+xf7/vHHjxqxatQqAPn368N///pd33nkHgDVr1pQfNcu2atUqWrZsybfffss999xTPn3gwIHcdtttQDCgysqVKzf7jGwHH3xw+fxvv/02S5YsYd999028HPXq1ePbb78tfz1kyBCefvpppk+fXn4UEeC1117j/fffZ9OmTYwfP55+/folWu6qUqdORERERESq1YgRIzjqqKMYMGAAzZs3Z9y4cZx88sl06dKFPn36sHDhwsj5rr32Wg444AAOO+ww2rdvXz59zJgxPP/883Tu3JmePXsyb948mjVrRt++fenUqROXXnrpZuWcf/75bNy4kc6dOzNs2DDGjRu32RG6JMvRpUsXTj31VAC23XZbBgwYwEknnUTdunXL4w488EBGjhxJp06daNu2LUOGDEm03FVlFR2aLBa9evXyGTNm1HQaIluFXL/izewxs8CZiEiVLbTo6e2L/3+7iFRNWv/PFyxYwH777VelMrZmmzZtokePHkyYMIF27doBwSigN9xwAxMnTqy2z4lqBzOb6e69ouJ1pE5ERERERKQS8+fP53vf+x4DBw4s79AVCw2UIiIV0pE9ERGpdlFHmXWEWWrQAQccwPr16zeb9q9//YvOnTuXv+7QoQPvvffeFvP279+f/v37p51ihdSpExERERGRWu3VV1+t6RSqRKdfioiIiIiIlDB16kREREREREqYTr8UkQrpnlciIlIpjcQqUqN0pE5ERERERCTDjBkzuPjiiwG4+uqrueGGG7aIWbx4MZ06dSp0apF0pE5ERERERCJdc8011VreqFGjqrW8tPTq1YtevSJvCVeUdKRORERERESKynHHHUfPnj3p2LEjY8eOBeDpp5+mR48edO3alYEDBwKwevVqzjzzTDp37kyXLl146KGHAHjmmWc48MAD6dGjByeeeCKrV68GYOTIkXTo0IEuXbrwq1/9CoAJEybQqVMnunbtysEHHwwENxQ/9thjy/N5/fXX+cEPfkC7du244447tsh348aNXHrppey///506dKFv/3tb+lVToRYR+rMbHdgz8x4d38hraRERERERKT2uvPOO9lpp51Yu3Yt+++/P4MHD+acc87hhRdeoG3btnzxxRcAXHvttTRp0oQ33ngDgC+//JLPPvuM3/72t0yaNIlGjRpx/fXXc+ONN3LhhRfyyCOPsHDhQsyMr776CoDRo0fzn//8h9133718Wra5c+fyyiuv8PXXX9O9e3eOOeaYzd7/xz/+QZMmTZg+fTrr16+nb9++HH744bRt2za1OspUaafOzK4HhgHzgY3hZAfUqRMRERERkWp300038cgjjwDw4YcfMnbsWA4++ODyTtJOO+0EwKRJk7j//vvL52vatCkTJ05k/vz59O3bF4BvvvmGAw88kB122IH69etz9tlnc8wxx5Qfievbty/Dhw/npJNOYujQoZH5DB48mAYNGtCgQQMGDBjAa6+9Rrdu3crff+aZZ5g7dy4PPvggACtWrGDRokXF06kDjgP2dff1lQWKiIiIiIhUxZQpU5g0aRIvv/wyDRs2pH///nTt2pW33npri1h3x8y2mHbYYYdx3333bRH/2muvMXnyZO6//35uueUWnnvuOW6//XZeffVVnnzySbp168acOXO2mC/7M6I+8+abb+aII47IY4mrLs41de8B9dJOREREREREZMWKFTRt2pSGDRuycOFCXnnlFdavX8/UqVN5//33AcpPvzz88MO55ZZbyuf98ssv6dOnD//973955513AFizZg1vv/02q1evZsWKFRx99NH85S9/Ke+8vfvuuxxwwAGMHj2anXfemQ8//HCLnB577DHWrVvH559/zpQpU9h///03e/+II47gtttu49tvvwXg7bff5uuvv672usklzpG6NcAcM5sMlB+tc/eLU8tKRERERERqpSOPPJLbb7+dLl26sO+++9KnTx+aN2/O2LFjGTp0KJs2bWKXXXbh2Wef5YorruCCCy6gU6dO1K1bl1GjRjF06FDGjRvHySefzPr1Qfflt7/9LY0bN2bw4MGsW7cOd+fPf/4zAJdeeimLFi3C3Rk4cCBdu3Zl6tSpm+XUu3dvjjnmGJYsWcKVV17JbrvtxuLFi8vfP/vss1m8eDE9evTA3WnevDmPPvpooaoMc6/4ppBmdkbUdHe/O5WMIvTq1ctnzJhRqI8T2ar1nNUzcvrMHjOjZ9ANZUWKl7ZPKRZJ18WoeK23iST+fx7TggUL2G+//apUhlRdVDuY2Ux3j7zPQqVH6tz9bjPbFtgnnPSWu39b5UxFRERERESkyuKMftkfuBtYDBiwh5mdoVsaiIiIiIiI1Lw419T9CTjc3d8CMLN9gPuA6GO+IiIiIiIiUjBxRr+sV9ahA3D3t9FomCIiIiIiIkUhzpG6GWb2D+Bf4etTgapdgSkiIiIiIiLVIk6n7jzgAuBigmvqXgBuTTMpERERERERiafS0y/dfb273+juQ919iLv/2d3XVzYfgJntaGYPmtlCM1tgZgea2U5m9qyZLQr/Nq36YoiIiIiIiFTNnDlz+Pe//13++vHHH+e6666rwYziyXmkzswecPeTzOwNYIsbh7h7lxjljwGedvcTwtsiNAT+B5js7teZ2UhgJHB5fumLiIiIiEhazrn1i2ot747zd6qWcjZu3EjdunWrpaxMc+bMYcaMGRx99NEADBo0iEGDBlX751S3io7UXRL+PRb4YcSjQma2A3Aw8A8Ad//G3b8CBhPcIoHw73F55C0iIiIiIlup4447jp49e9KxY0fGjh0LwPbbb89VV13FAQccwMsvv8yNN95Ip06d6NSpE3/5y18AWLx4Me3bt+fss8+mU6dOnHrqqUyaNIm+ffvSrl07XnvtNQBee+01DjroILp3785BBx3EW2+9xTfffMNVV13F+PHj6datG+PHj2fcuHFceOGFACxbtowhQ4bQtWtXunbtyksvvVQjdRMlZ6fO3T8On57v7h9kPoDzY5S9F7AcuMvMZpvZ382sEdCirOzw7y5RM5vZCDObYWYzli9fnmihRERERESkdN15553MnDmTGTNmcNNNN/H555/z9ddf06lTJ1599VUaNGjAXXfdxauvvsorr7zCHXfcwezZswF45513uOSSS5g7dy4LFy7k3nvvZdq0adxwww38/ve/B6B9+/a88MILzJ49m9GjR/M///M/bLvttowePZphw4YxZ84chg0btllOF198MYcccgivv/46s2bNomPHjgWvl1zi3NLgsIhpR8WYbxugB3Cbu3cHviY41TIWdx/r7r3cvVfz5s3jziYiIiIiIiXupptuomvXrvTp04cPP/yQRYsWUbduXY4//ngApk2bxpAhQ2jUqBHbb789Q4cO5cUXXwSgbdu2dO7cmTp16tCxY0cGDhyImdG5c2cWL14MwIoVKzjxxBPp1KkTP//5z5k3b16lOT333HOcd955ANStW5cmTZqks/B5yNmpM7Pzwuvp2pvZ3IzH+8AbMcr+CPjI3V8NXz9I0MlbZmYtw89oCXxatUUQEREREZGtxZQpU5g0aRIvv/wyr7/+Ot27d2fdunXUr1+//Do69y2G/Ci33XbblT+vU6dO+es6deqwYcMGAK688koGDBjAm2++yRNPPMG6detSXKL0VXSk7l6Ca+ceY/Nr6Xq6+6mVFezunwAfmtm+4aSBwHzgceCMcNoZYfkiIiIiIiKsWLGCpk2b0rBhQxYuXMgrr7yyRczBBx/Mo48+ypo1a/j666955JFH+P73v5/oM3bffXcAxo0bVz69cePGrFq1KnKegQMHcttttwHBQC0rV65MsFTpquiauhXuvphgBMsvMq6n+9bMDohZ/kXAPWY2F+gG/B64DjjMzBYRnNpZ/GOEioiIiEi1Oee5z7d4iJQ58sgj2bBhA126dOHKK6+kT58+W8T06NGD4cOH07t3bw444ADOPvtsunfvHvszLrvsMn7961/Tt29fNm7cWD59wIABzJ8/v3yglExjxozh+eefp3PnzvTs2TPWKZuFYhUdugQws9lADw8DzawOMMPdexQgPwB69erlM2bMKNTHiWzVes7qGTl9Zo+Z0TMstOjp7Sved4hIAWj7lGKRcF2MGia/uoa6ry0S/z+PacGCBey3335VKkOqLqodzGymu/eKio8zUIp5Rs/P3TdRwf3tREREREREpHDidOreM7OLzaxe+LgEeC/txERERERERKRycTp15wIHAf+PYETLA4ARaSYlIiIiIiIi8VR6GqW7fwr8qAC5iIiIiIiISEKVdurMrD7wE6AjUL9suruflWJeIiIiIiIiEkOc0y//BewKHAFMBVoB0TdvEBERERERkYKK06n7nrtfCXzt7ncDxwCd001LRERERERqo8WLF9OpU6e85p0yZQrHHntsteQxbtw4LrzwwkTzbL/99pHTr7rqKiZNmlQdaUWKc2uCb8O/X5lZJ+AToE1qGYmIiIiISHHIdQ/CfNXQfTQ3bNjANtvU3F3ZRo8enWr5cY7UjTWzpsAVwOPAfOD6VLMSEREREZFaa+PGjZxzzjl07NiRww8/nHnz5tGjR4/y9xctWkTPnsEN2J9++mnat29Pv379ePjhh8tjrr76akaMGMHhhx/O6aefzgcffMDAgQPp0qULAwcOZMmSJQAMHz6cc889l+9///vss88+TJw4sbyMpUuXcuSRR9KuXTsuu+yy8un33XcfnTt3plOnTlx++eWb5f7LX/6SHj16MHDgQJYvX17+GQ8++CAA06dP56CDDqJr16707t2bVauqfmVbhZ06M6sDrHT3L939BXffy913cfe/VfmTRUREZKvRc1bPyIeISD4WLVrEBRdcwLx589hxxx2ZPXs2TZo0Yc6cOQDcddddDB8+nHXr1nHOOefwxBNP8OKLL/LJJ59sVs7MmTN57LHHuPfee7nwwgs5/fTTmTt3LqeeeioXX3xxedzixYuZOnUqTz75JOeeey7r1q0DYM6cOYwfP5433niD8ePH8+GHH7J06VIuv/xynnvuOebMmcP06dN59NFHAfj666/p0aMHs2bN4pBDDuGaa67ZLJ9vvvmGYcOGMWbMGF5//XUmTZpEgwYNqlxfFXbq3H0TkOxEUhERERERkSpo27Yt3bp1A6Bnz54sXryYs88+m7vuuouNGzcyfvx4TjnlFBYuXEjbtm1p164dZsZpp522WTmDBg0q7zS9/PLLnHLKKQD8+Mc/Ztq0aeVxJ510EnXq1KFdu3bstddeLFy4EICBAwfSpEkT6tevT4cOHfjggw+YPn06/fv3p3nz5myzzTaceuqpvPDCCwDUqVOHYcOGAXDaaadt9hkAb731Fi1btmT//fcHYIcddqiW00LjnH75rJn9ysz2MLOdyh5V/mQREREREZEI2223XfnzunXrsmHDBo4//nieeuopJk6cSM+ePWnWrBkAZrmv+2vUqFHO9zLnyy6j7HVUHu7xrwvMLtfdK8w3X3E6dWcBFwAvADPDx4xqz0RERERERCSH+vXrc8QRR3Deeedx5plnAtC+fXvef/993n33XSC41i2Xgw46iPvvvx+Ae+65h379+pW/N2HCBDZt2sS7777Le++9x7777puznAMOOICpU6fy2WefsXHjRu677z4OOeQQADZt2lR+7dy999672WeU5bt06VKmT58OwKpVq9iwYUPSqthCpcf63L1tlT9FRERERESkik499VQefvhhDj/8cCDo6I0dO5ZjjjmGnXfemX79+vHmm29GznvTTTdx1lln8cc//pHmzZtz1113lb+37777csghh7Bs2TJuv/126tevnzOHli1b8oc//IEBAwbg7hx99NEMHjwYCI4Mzps3j549e9KkSRPGjx+/2bzbbrst48eP56KLLmLt2rU0aNCASZMm5bwVQlxW2eFDM2sI/AJo7e4jzKwdsK+7T6xwxmrUq1cvnzFDBwdFqkOugQtm9pgZPUOuoYxraEhiEclQRNtn4n2LbF0Srovn3PrFFtPuOF9X9ySR1ja3YMEC9ttvvyqVkaYbbriBFStWcO2111ZbmcOHD+fYY4/lhBNOqLYyqyqqHcxsprv3ioqPc1XeXQSnXB4Uvv4ImAAUrFMnIiIiIiK125AhQ3j33Xd57rnnajqVohOnU7e3uw8zs5MB3H2tpXF1n4iIiIiISA6PPPJIKuWOGzculXILKc5AKd+YWQPAAcxsb2B9qlmJiIiIiIhILHGO1F0NPA3sYWb3AH2BM9NMSkREREREROKJM/rlM2Y2E+gDGHCJu3+WemYiIiIiIiJSqUpPvzSzye7+ubs/6e4T3f0zM5tciORERERERESkYjk7dWZW38x2AnY2s6ZmtlP4aAPsVrAMRUREREREcujfvz+1/fZnFZ1++VPgZwQduJkEp14CrAT+mm5aIiIiIiJS03LdDy9fxXDvyo0bN1K3bt2aTqNa5TxS5+5j3L0t8Ct338vd24aPru5+SwFzFBERERGRWmLx4sW0b9+eM844gy5dunDCCSewZs0aJk+eTPfu3encuTNnnXUW69dvOSD/eeedR69evejYsSOjRo0qn96mTRtGjx5Nv379mDBhQiEXpyAqvabO3W82s4PM7BQzO73sUYjkRERERESk9nnrrbcYMWIEc+fOZYcdduDGG29k+PDhjB8/njfeeIMNGzZw2223bTHf7373O2bMmMHcuXOZOnUqc+fOLX+vfv36TJs2jR/96EeFXJSCiDNQyr+AG4B+wP7ho1fKeYmIiIiISC21xx570LdvXwBOO+00Jk+eTNu2bdlnn30AOOOMM3jhhRe2mO+BBx6gR48edO/enXnz5jF//vzy94YNG1aY5GtAnPvU9QI6uLunnYyIiIiIiIiZVR6U5f333+eGG25g+vTpNG3alOHDh7Nu3bry9xs1alSdKRaVSo/UAW8Cu6adiIiIiIiICMCSJUt4+eWXAbjvvvs49NBDWbx4Me+88w4A//rXvzjkkEM2m2flypU0atSIJk2asGzZMp566qmC511T4hyp2xmYb2avAeVXI7r7oNSyEhERERGRWmu//fbj7rvv5qc//Snt2rVjzJgx9OnThxNPPJENGzaw//77c+655242T9euXenevTsdO3Zkr732Kj99szaI06m7Ot/CzWwxsArYCGxw917hve/GA22AxcBJ7v5lvp8hIiIiIiLpqKlbENSpU4fbb799s2kDBw5k9uzZW8ROmTKl/Pm4ceMiy1u8eHE1Zld8Ku3UufvUKn7GAHf/LOP1SGCyu19nZiPD15dX8TNERERERERqpZzX1JnZtPDvKjNbmfFYZWYrq/CZg4G7w+d3A8dVoSwREREREdmKtGnThjfffLOm0ygpOY/UuXu/8G/jKpTvwDNm5sDf3H0s0MLd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RUREREREtmZxbmlwrZkNAg4OJ01x94lxCjezegQdunvc/eFw8jIzaxkepWsJfJpP4iIiIiIiIhJj9Esz+wNwCTA/fFwSTqtsPgP+ASxw98zTNx8HzgifnwE8ljRpERERERERCVR6pA44Bujm7psAzOxuYDbw60rm6wv8GHjDzOaE0/4HuA54wMx+AiwBTswjbxERERERESFepw5gR+CL8HmTODO4+zSyRszMMDDm54qIiIiIiEgF4nTq/gDMNrPnCTppB1P5UToREREREREpgDgDpdxnZlOA/Qk6dZe7+ydpJyYiIiIiIiKVi3X6ZXhfucdTzkVEREREREQSqnT0SxERERERESle6tSJiIiIiIiUsAo7dWZWx8zeLFQyIiIiIiIikkyFnbrw3nSvm1nrAuUjIiIiIiIiCcQZKKUlMM/MXgO+Lpvo7oNSy0pERERERERiidOpuyb1LERERERERCQvce5TN9XM9gTaufskM2sI1E0/NREREREREalMpaNfmtk5wIPA38JJuwOPppiTiIiIiIiIxBTnlgYXAH2BlQDuvgjYJc2kREREREREJJ44nbr17v5N2Qsz2wbw9FISERERERGRuOJ06qaa2f8ADczsMGAC8ES6aYmIiIiIiEgccTp1I4HlwBvAT4F/A1ekmZSIiIiIiIjEE2f0y01mdjfwKsFpl2+5u06/FBERERERKQKVdurM7BjgduBdwIC2ZvZTd38q7eRERERERESkYnFuPv4nYIC7vwNgZnsDTwLq1MlWpeesnpHTZ/aYWeBMRERERETii3NN3adlHbrQe8CnKeUjIiIiIiIiCeQ8UmdmQ8On88zs38ADBNfUnQhML0BuIiIiIiIiUomKTr/8YcbzZcAh4fPlQNPUMhIREREREZHYcnbq3P3MQiYiIiIi0df36tpekVpgoUVPb69B56VycUa/bAtcBLTJjHf3QemlJSIiIiIiInHEGf3yUeAfwBPAplSzERERERERkUTidOrWuftNqWciIiIiIiIiicXp1I0xs1HAM8D6sonuPiu1rERqQI9Xns3xRmHzEJHabdATEVc3aD8kIiIViNOp6wz8GPgB351+6eFrERERERERqUFxOnVDgL3c/Zu0kxEREREREZFk6sSIeR3YMeU8REREREREJA9xjtS1ABaa2XQ2v6auwlsamNmdwLHAp+7eKZy2EzCe4PYIi4GT3P3LvDIXEREREdlKXDP+6sjpo0YVNg8pTXE6dfmuSuOAW4B/ZkwbCUx29+vMbGT4+vI8yxcREREREan1Ku3UufvUfAp29xfMrE3W5MFA//D53cAU1KkTERERERHJW6WdOjNbRTDaJcC2QD3ga3ffIY/Pa+HuHwO4+8dmtksFnzsCGAHQunXrPD5KJJlWy2/O8Y7OexARERGR4hXnSF3jzNdmdhzQO62EMj53LDAWoFevXl5JuIiIiIiISK0UZ/TLzbj7o+R/j7plZtYSIPz7aZ7liIiIiIiICPFOvxya8bIO0IvvTsdM6nHgDOC68O9jeZYjIiIiIiIixBv98ocZzzcQ3IpgcGUzmdl9BIOi7GxmHxFcmHQd8ICZ/QRYApyYMF+p5a655prI6aM03q+IiIiI1FJxrqk7M5+C3f3kHG8NzKc8ERERERER2VLOTp2ZXVXBfO7u16aQj4iIiIiIiCRQ0ZG6ryOmNQJ+AjQD1KkTERERERGpYTk7de7+p7LnZtYYuAQ4E7gf+FOu+URERERERKRwKrymzsx2An4BnArcDfRw9y8LkZiIiIiIiIhUrqJr6v4IDCW4AXhnd19dsKxEREREREQklopuPv5LYDfgCmCpma0MH6vMbGVh0hMREREREZGKVHRNXUUdPhEREYljoUVPb++FzUNERLZa6riJiIiIiIiUMHXqRERERERESpg6dSIiIiIiIiWswlsaiIiISNVcM/7qyOmjRhU2DxGpumuuuSZy+iht0FLDdKRORERERESkhKlTJyIiIiIiUsLUqRMRERERESlh6tSJiIiIiIiUMHXqRERERERESpg6dSIiIiIiIiVMnToREREREZESpk6diIiIiIhICVOnTkREREREpISpUyciIiIiIlLCtqnpBETScs0110ROHzVqVGrlV1fZUuQWWvT09l7YPERERGLS95atm47UiYiIiIiIlDB16kREREREREqYOnUiIiIiIiIlTNfUFUjPWT0jp8/sMTN6hiK6Zidx7kkU0XKmKe3r+2qLqHWxWtZDkrXRNeOvzhFbLalwzq1fRE6/4/ydqucDkojaRnNtnyluz6nuh6DW7ItKVY20f020fcL1sJS/W6SpqPahtUWJ7v+3pm1IR+pERERERERKmDp1IiIiIiIiJUydOhERERERkRJWI9fUmdmRwBigLvB3d78u7ryJrntJeB1TmvGDnhgUGUuP6MlJr9lJcu+RpMuZJPfEdZjytUmydYlcF3NtQ0V0HWPSXFotvzlHSTWwn4vYRnPuh6phv5Url8T70BT3RcW0btUWSds/qUTreYrbXNJtKO3vFqUqzX2oREtzH5rm/r+Uv59nK/iROjOrC/wVOAroAJxsZh0KnYeIiIiIiMjWoCZOv+wNvOPu77n7N8D9wOAayENERERERKTkmXthh+A0sxOAI9397PD1j4ED3P3CrLgRwIjw5b7AWxHF7Qx8FvOjk8SmHV9bcqkty1lMudSW5SymXGrLchZTLrVlOYspl9qynMWUS21ZzmLKpbYsZzHlUluWs7py2dPdm0fO4e4FfQAnElxHV/b6x8DNeZY1I43YtONrSy61ZTmLKZfaspzFlEttWc5iyqW2LGcx5VJblrOYcqkty1lMudSW5SymXGrLcqadi7vXyOmXHwF7ZLxuBSytgTxERERERERKXk106qYD7cysrZltC/wIeLwG8hARERERESl5Bb+lgbtvMLMLgf8Q3NLgTnefl2dxY1OKTTu+tuRSW5YzaXyplp00vrbkUluWM2l8qZadNL625FJbljNpfKmWnTS+tuRSW5YzaXyplp00vpRzKfxAKSIiIiIiIlJ9auL0SxEREREREakm6tSJiIiIiIiUMHXqRERERERESpg6dSIiIiIiIiVMnboSZmY75jlfczPrbmadzWz7GPEtzKxHOE+LfD4zZl47VWdsVfJOmMugSt5vb2aXm9lNZjYmfL5fjthtMp5vb2a9KsslaXvmK2GdfM/MjjezDjne37Gacoq1vJW1UVZsZfVdlG1UWZ2HMe3NbGB2DmZ2ZERsbzPbP3zewcx+YWZH5yj3ADPbIXzewMyuMbMnzOx6M2uSFXuxme0RVU5SMfdfsds+jK+29k+y7VfymWdWUH6s9sx4L/a6WCz70KzYStfzCubNVY8F+59Y3f/nMmJz1ks++9t89nM5yqn2/V1176Or0p6ZnxMjpsb2RWFMQb4rhJ9VLet50nW3EP+fq2N9iSOf7S3RncqL7QHslCD2e8DxQIeI93bM8/NbAD2A7kCLCuL2Bn4FjAH+BJwLNKkgvj1wOXBTOM/lwH4RcRuAScBP4iwD0CGMfwf4BngVeB8YF5UP0A14BVgQzjcJWBhO65EV2zmc/iHBMKxNM957LaLsvmG584ADgGeB98L5D8w3NmneeeQyNOtxPPBJ2euIsi8H5gAjgdPCx8iyaVmxw4HPgbeBo8IcJod5nFwN7Rm7jfKo8+eBncPnPw6X4e/AG8BFVV13K1inl0RMi91GwBVZ9fl2WIeLgQMiyk6tjZK0T551fjHwFvBouHyDM96blRU7KsxlBvAH4DngKuAF4DcRZc8DtgmfjwX+AvQLy3k4K3YFsBR4ETgfaF5d7Z+k7dNufxJs+3mu57HbM491sRvFsw9NtJ4nXF9S+5+YR72kts8l+XeF4STYzyWs86T7uTS30UTtmXA5i2lflNp3hTzW86TLGXvdTbre5lEvsdeXNOuwwjpIstLW5CPpApPuDi9Jw14c5noF8BJwK/A7YD7QP6LsJJ2AN4BjgXvCFfkxgpu5N8iR9yvAvuHz3sDd4fNzgAcj4ufk2Mj6AK9nTZsGHAnsSNCBnQfsHb43O6KM18KV/kDgM6BfOL0H8N98Y5PmnUcuG4CJwJ3AXeFjVfj3zoiy3wbqRUzfFlgU0Z47A22BlRn11wKYWw3tGbuN8qjzNzOeTweahc8b5sg99roL/CLH45fAFxHxsduIjC+/wJPAURn1+VKOvFNpoyTtU4U63z583oagw3ZJjvZ/g+A+og3D5dwhnN4gR9kLouq0bHvMej2b4CyRw4F/AMuBp4EzgMZVaf8kbZ92+5Ng2w+nz83xeANYX5X2zGNdnEPx7EOTruex6zFJnRSgXlLb55L8u0LS/VySbTTpfi7NbTRpe5bqvii17wp5rOf5LGfc7wppf4eKvb6kWYcVPWIFFcMj6QKT7g4vScO+AdTN+Owp4fPWORo2SScgc+NoAJwEPBwuw70RZWTnljn//Ij4Lb54ZLz3TnadZL0eACwK6yTqV+PZGc8X5MoraWzSvPPIZX+CX37O47v7PL5fwectBPaMmL4n8FauOgSWZr0XtUNK2p6x2yiPOp8N7B4+fx6oHz6vC8yLiI+97gLrgGsJjvpkP76KKDt2G2XlMTt7mSqqw+puo3y2oYR1nv152xN0pm6M+OzZUc+j8gynTQDODJ/fBfQKn+8DTK9o/QHqAYOA+4DlEWXHbv8kbZ92+5Ng2w+nLyP4wXDPrEeb7M9K2p55rIvFtA9Nup7HrsckdVKAeokdm7ReSP5dIfZ6Hk5Lso1m72sq28+luY0mbc9S3Rel9l0hj/U86XIm+a6QdL0tye/EFT3Kzz0tAfXc/Q0AM1vu7tMA3H2WmTWIiP/WzHZ39/8HrAa+DqevJ9jpbRbr7hOBiWFZPyTo1P3VzP7j7qdkxTdy91ezP9DdXzGzRhG5bANsBLYDGoexS8ysXkTsJmA34IOs6S3D9zJZxmevBR4AHgivYTkuoux3zexKgh3NUILOKWEeUevCU2b2JPBPgiOiAHsApxN8edgsFzNr4u4rwnyeN7PjgYeAqPOCM6/n/HXWe9tWITZp3onKd/fpZnYYcBHwnJldDnhEmWV+Bkw2s0UZubQmOB34wqzYJWb2B4J1ZKGZ/Ylg53Uo8HFE2UnbM0kbJa3znwPPmNlDBL9IPWdmTwPfJ/iSv0UuZU9irLuzgEfdfWbEAp2dPS1hG+1lZo+H+bQys4buviZ8L2r7TLONkm5DSev8EzPr5u5zwvJXm9mxBL8kd86K/SajLnpmJNiELfdDAGcDY8zsCoIf3V42sw8J1vnsNrLMF+7+LfA48HiOfXns9s9j+0yz/X9G/G0fgl/1ty9rn6zlnBIRn6Q9Idm6WEz70KTreZJ6TPN/IqT7fy5JvST9rpB0P5dkH510P5fmNpq0PUt1X5TmdwVItu4mXc4k627a36GK5TtxbnF7fzX9IKNHDRyX9d6bEfH9CXZ0o4FbCE59vIrgVMhf5eohZ01vApwRMf0mgsPGw4CDwsewcNotWbGXEJz6MZbgl9uyX7ObAy9ElH0kwfm9T4XzjCVYWd4BjsyK/VVU3hXU4Y7A/xL80/sd4alO4XL2yTHPUcDtwBPhfLcDR0fEnRJVBsGXmDsipg8CGkZM3xu4LN/YpHnnW374/u4EO5j3Kqn3OgS/zhwPnBA+rxsRtwPBxjyS4Ff348Pc/wq0rGp7JmmjPOu8CcGvkn8GbiY4lbh9jtjY6y6wL+Gp1BHv5byWNXx/t4raCDgk61F2OlsL4IJCtlHSbSiPOm8F7Jrjvb5Zr7fLEbcz0LmC+m4MdCXoCEa2DbBP3LavSvtX1vYFav9Y234+jyTtmXRdDKcXYh9aaRslXc8T1mGiOkmzXvKpw7j1QvLvCknX89jbKMm/K1TXNnprjtyTtOe+5LgGOHs5k67naS5n0vU8jzZKsp4nXc4k3xVS/Q6VZH1Jsw4repQdEi56FowaNMm/69GXTd8bON7d/zdiniYEFbsPQa/7I+Axd1+YFfcrd78hYT5HAYMJvthbWPbj7v7viNiOwH4Enc+F2e9HxNchOL83s+zp7r4xSY5SnMxsJ3f/oqbzEEmyLiZdb9Msu1SlWYf5xNcGZvY9gh8aFrj7/JrOR0QkNXF7f3pU3wMYlDA+cpRPgmv0LgMuBeoTjPzzOMEvD9tXNT7HZ76dIO/YsRXFA10yntcjGHTmceD3RP+ycSHfDZKzN8GIfV8SjGy0xVGGrPjvhfFfhfGdYsRWVHbskZ4ITgv+KcE5+9lHTq6IKDsz/qAY8bHbvxrWrTPSXBera90qdNnVvJ4njU+yLiYdoSy1sku4PVOrwzzja8U2RxVHy6yk7NS20aTtExGfc59b1bavznpJsw6roc6r7f9WmmXXpvZPmktVYktpPc/1KKUjdV3cfW74vB7BaQa9gTeB3/qWR/Bix+dR9oXA/e7+WXik8C6CaxjeBs728Nq/MHZo9qIQHAo+H8DdH84q+wp3/234vAPBcNX1wvmGeca1fGb2AMF5vQ0ITgtYQHCI/4cEp+X8OKvspPGrCM4Bz7wGpiGwJkjdd4iIJSM+MjZpvJnNcvce4fM/Ac0I6vw4ggFwTs8qe567dwyfPwn83d0fMbP+wO/cvW++8XmUnZl72em5T5lZb+Av7n5QRuzfwzp4jeDLyFR3/0V2OVWIj93+BVi3kuSS5roVex1POz6P9bwq8ZWti7FjC1B2Pu1ZaWxWfNrtWa11mGd8Pttc0nqBmm+jN929U/h8OsFlC5+bWUPgFXfvUoWyU9tGU96Hpva/P4/lLOR+rpTqvJhySbqNptn+xfT/vGjW85w8QQ+2Jh9sPirNnwjuI3EIwbnk/6xKfB5lz8t4/iQwJHzen6oP3xx7uFfC0XUIVshPoLyTbkSP9JM0/maCC0JbZEx7P0f7xI7No+zZmctAODpoBXm/lfE8e+S9KsXnUXbskZ4y5yc4XXgswUW+22XH5hkfu/0LsG4lySXNdSu1sguwnieNT7IuVmWEsuouu1TbM7U6zDO+tmxzs4k/KmTisjPrM8Y2Fzs+Sfvk0Z5Jy06tXtKswxKv82LKpZjav6j2LcWynud6lNLol5k96YHA/u7+rZm9ALxexfikZWfW2y7u/giAu08xs8ZZsQcC1xHcVuF2d3cz6+/uZ+ZYzky7uftTYdmvWfTIcIRl/tvDNSB87bkKjRvv7heZWU/gPjN7lGDAmchyk8TmEd/EzIYQDDqwnQej5VW0nA+a2TiCQXIeMbOfEXR2BgJLqhiftOwkIz2Vj3Dk7huAEWZ2FcGNn7ePKDtpfFls7PUlrXUrSXya61bK623a63nS+CTrYtIRylIru4TbM806zCe+bBm26m2OBKNC5lF22ttoqvvcNP7357GcaddhSdZ5MeVSTO1fZPuWYlrPI5VSpy7NCkqt0+DpDms7w8y2d/fV7n5W2UQLTgldFVF20njcfaaZHUpwLdlUgvOxIyWJTRg/lWBkIIBXzKyFuy8zs10Jhk/PLvc3Zjac4L5XexMcuRpBcCrrqVWJT1o2wWA6meoAmFkL4Las92aY2ZHuXj40rruPNrOlEbH5xsdt/7TXrUTxKa5bqZadMD7Rep5HfJJ1MUls2mWXanumWYf5xNeKbc6DH1cPIhgkrTEwk+BWRhd5xEBlCXNJcxtNcx+a6v/+hMuZ9n6uVOu8mHIppvYvmn1LysuZuF6ilNI1dXdlTRqZscD3uPvAfOOTlh3OM5xgKOGyL/YfEnyxv97D+1JEzLM7wSmdvdx9rxwxh2RNmunB/YdaACe4+1+j5osoxzxB48aJN7OWQHePGOGzKrH5xJcaM6vv7uuypu3s7rE31jQlWV/SWLeSxKe5bqW93hbDep5kXUy63qZZdkZMSbVnmnWYT3yOMrbabS6JYtg+o6S5z63u//1bi5qu82LKpZjav1T3LQXjMc/T1KNqD8Lz+rOmRd7XJWk8weiH22S83gG4q4Ky84mvGyc+SWwxlV2AXN4g454lBPdPyTVqXiHaM1Z8EeZSLO1ZyrkkWRdjxxag7GKqwyS5pFaHVajHrX6by5q3whHwimx9Kbb9eUm2f4nXeTHlUnLtX4TrVkH2c+6+2R3MS4KZXWtmdTNe7xBxpC2v+DTLBqabWZ+M2OMJboieS5L4bYBXzayLmR1OcP3ezArKzif+tZjxSWKLqey0czkFuNnM/mhm9wDnAD+ooOy02zNufLHlUiztWcq5JFkXk8SmXXYx1WGS+DTrMJ/4rXqbM7NVZrYy/LvKghHu9i6bXgPLmTS+2PbnJdX+VcilmOq8mHIpxfYvtnUrzVw2F7f3VywP4A/hAnYBDgfeAi6sjviUy+4cNs4fgXuAp4FWFZSdNP5QYC2wFPhejHpMLb5Uyy5ALscRnL++tS9nSeZSW5Yzj3UxdmwByi6mOkySS2p1WMr1mEbZJBzRrkjXl5IsW7nU7uUsplxqy3JuMW+S4GJ5lGrlk9I/auBgglG+fg3cS9AB3K0m4ku17ALk8g9gCtAWOILgPjEXbIXLWZK51JblzGNdjB1bgLKLqQ6T5JJaHZZyPaZcdk+CUYAvJhhA5r1c5Rbh+lKSZSuX2r2cxZRLbVnOyPnjBhbLo1Qrn3S/HL0GdMh4PRRYWEHZqcWXatkFyOXnhAMTha+bAP/YCpezJHOpLcuZx7oYO7YAZRdTHSbJJbU6LOV6LEAb1SHo1L0ILM0VV4TrS0mWrVxq93IWUy61ZTkj548bWCyPUq180v1yVDdiWrMKyk4tvlTLTjuXJI9SXs5SzaW2LGchH9WdQzHVYbHWeSnVY6HqHGgJHF1ddVLK9VJblrOYcqkty1lMudSW5Yx6lMwtDcqYWV1335g1rZm7f17V+DTLToOZXQw84u4fJphnb2AIsAewAVgE3Oe5b8PQnuB+SLsT3F9vKfC4uy/IEbs78Kq7r86Yvtm91DKm9ya4HeB0M+sAHEnQKf53VWIrWf4z3f2uGHH/dPfTY8T1A3oDb7r7MxHvNyE4knscsAtBHX4KPAZc5+5fZcRuC/yI4FflSWZ2CnAQwVHasR7ePzGr/HzaM1YbJWyfA4AF7r7SzBqEy9wdmA/8PjuffNbdHMtT6PZMtY0Stk/SOt8hjGkFPOXu92a8d6u7n5/xeldgFLAJuIrgPpvHh8t5ibt/nFX2dcAN7v6ZmfUCHgjnrQec7u5TM2JnEdzX8z53fze7DpKI0/5x2z6Mrbb2T7Ltx8jrKXc/Kmta7PZMmnsYXxT7lojPqbCNMuKuBa4u+x8d1tcYdz+zGpYz1v/EpMua1j436f42n/1cBWVtsY0m/a6QNW+176Pj5l2V3GPknWh/Hs6T9H9LKuttPvEJ6iX2ulvA71A1/p04Zx2UUqeuWHZ44TyxGtbMtgcuI/hC1Ar4BngXuN3dx0WUm6QTsAL4OizvPmCCuy+vIOeLgR8S3OTwaGAO8CXBCn2+u0/Jir8cOBm4H/gonNyKYKO5392vyyr7AoKNpxvBF7/HwvdmuXuPrLJHAUcRjPTzLHAAwemmhwL/cfff5RNbGTNb4u6ts6Y9nh0GDCC4JgN3H5QR+5q79w6fnxMu8yMEA+U8kVknYcx/wnLudvdPwmm7AmcAh7r7YRmx94TL2BD4Ctie725qb+5+RlbZSdszdhslrXMzmwd0dfcNZjYWWAM8GObe1d2HZsUnWndzqYH2TK2N8tiGktb5QwT/sF4BzgK+BU5x9/UR7f808CTQiGB0xXsI2mkwwXo7OKvsN9y9c/j8eeCycD+9D3Cvu/fKiH0feAg4CfgkLHe8uy8loez2T9L2YXxq7Z9k2w/f26x9s5Zhoru3zIqP3Z555F5M+5ZEbZQx3x/CmDOBXQkGULnZ3W+pwnLG/p+YdFnT3Ofm8V0h0X6uIhHbaNL9XKr76Lh5J809j7yT7s+T/G9Jbb1NGp9HvcRedwvwHaoovhNXyGMe0qvpB8Gvxq8AMwhGnXyO4BfkF4DfRMTPI7wfBzAW+AvQLyzn4azYFQSdsheB84HmleRyedj4I4HTwsfIsmlZsY8Bw8OG/wVwJdAOuJugc5ld9n/C8nfNmLZrOO3ZrNjZBNcNHE5wDd5yguv6zgAaR5T9BuGhXYKVfkr4vDUwOyL+baBexPRtgUURZW8fPm8TttMlZXnmyiXMYyWwQzi9ATA339hw+twcjzeA9RHxs4D/A/oDh4R/Pw6fH5Jd5xnPp5etKwRfft+IKPutCtajt7LzDv9uAyzLaCvLsZxJ2zN2G+VR5wsy6zPrvTkR8bHX3SJrz9TaKEn75Fnnc7Je/wb4L9AsYv7MelkSo+yFfLe/fSV7ubLbJ+P594FbCTp3zwMjouo8bvsnafu0258E2344bSPB/7XnIx5rq9KeeeReTPuWRG2UNW+FA5nlsZyx/ycmXdY86iX29k/y7wpJ93NJttGk+7k0t9Gk/1uSrOdJ8066P0/yvyW19TaP9TxpvST6rpBwvS3J78QVPbahdJxA0NvdjuALQCsPjsL9EXgVyO7F1nH3DeHzXv5dr3iamc3Jin2PYLSsQ4FhwDVmNpPgV4GH3X1VVvxPgI6+5ekqNxJ0JjN/aWjj3x2Ru9HMprv7tWZ2JsFRw//JKruNu1+fOcGDX3mvN7OzsmLd3TcBzwDPmFk9gp7+ycANQHO2tA3Bl4ftgMZhIUvCebNtAnYDPsia3jJ8L1NdDw8vu/tiM+sPPGhmexJsUNk2eHBazBoze9fdV4bzrjWz7LKTxAK0IBhc5sus6Ub0vf56AZcQfCm61N3nmNlazzhlLEMdM2tKsJMxD38xcvevzWxDRPwHZnYZwa/1ywDMrAVBRz/7yHCd8PSBRgQbdhPgC4K2imofSNaeSdooaZ2/ad+drvK6mfVy9xnhkZqo012SrLvF1J5ptlHSbShpnW9nZnXCesfdf2dmHxH8MLZ99nJmPP9nBe+V+SvwbwtOw3zazP7Cd7+QzomIJ8zhReBFM7sIOIxg/zs2KyxJ+ydpe0i3/ZNs+xD8ovtTd1+U/YaZRcUnac+kuUPx7FuSthEAZnYwMAYYTXCLoFvM7Czf8ohwWv8Tky5rmvvcpN8Vkq4rSbbRpPu5NLfRpP9bkuSeNO+k+3OIv+6mud4mjU9aL0nW3bS/QxXLd+KcSqlTV0w7vCQN+7WZ9XP3aWb2Q4IVDHffZGZRDZvki8Bm84edzMeBxy045TTb3wluav4Kwcid14flNy/LK8vPgMlmtijjs1sD3wMuzIr9xMy6ufucMJfVZnYscCfBP9Rs35hZQ3dfQ9ChJsylCVvWYZJYgIkEv5DMyX7DzKZkTwvb/s9mNiH8u4zc20YTgnsTGuBmtqu7f2LBabZR7TmM4CjuVDPbJZy2jKCdTsqK/QfBEY+6BF9KJ5jZe0AfgsP92ZK2Z5I2SlrnZwNjzOwK4DPg5fCL6Ifhe9mSrLvF1J5ptlHSbShpnT9BcFPqSWUT3P3usH5uzop9zMy2d/fV7n5F2UQz+x7Br5WbcfebzewN4DxgH4L63hd4FPhtVnjU/BsJfn2NuiYldvsnbHtIt/2TbPsAVxPdYYbgmsZsSdozae7FtG9J2kZlbgBOdPf5YflDCY6Etq/Ccv6M+P8Tky5rmvvcpN8Vku7nkuyjk+7n0txGE/1vSZh70ryT7s+TrLs/I731Nml80npJsu6m/R3qZxTHd+KcSuaaOjN7FRjg7mss49fJcIGf9y3PT21C8Cvd9wk2kB4EjfAhcLG7v54RO9vdu+f43AbuvjZr2pHALQTXM2zRsJ5xAaSZdSFYcfYB3gTOcve3w5XmZHe/KavspgRfBAYTXFMH330RuN7dv8iI3cfdt/iCVBEz6wjsR3BR6sIY8XUILmLdnWDj+giY7lsOENOKoOP9SUQZfd39v1nTtnP39RGxOwMt3f2NfGKrg5kdA/R19+yjqBXN05DgZrfvV/GzdwNw96VmtiPB0eMl7v5ajvjY7ZmkjfKtczNrDOxF8EX6o7IfJiLiEq+7+aru9kyrjZJuQxnvxarz2iiftg/nq7b2LyZJci+2fUtEfIX7XIs5kFla/xPD2NT/z8XZ/vP8rpDKep7vfi4ituDbaHXkHmO9jb0/T7iNprLe5hOfI7/Iekm67qb5HSqMr/HvxBXymOdp1vQD2C7H9J2BzhXM1xjoStDzbZEjZp888qlD0Ps/nuDU0D5EDEVaA/W0U8rxg9KIzaPs2HkTdLaPJ+P2E9UVn0fZ/QiurTy8pteVPOox7XUrSS5prluplZ1HLmnWYex1Mel6m2bZpdqeadZhFeoxze2/RtqIYICBzOtRRhMc1bweaJJCLmluo8VUdmr1UmT/W0qy7DxySXu/WBTrYokvZ6J4dy+dTl2hKyhhbNIv9v9MUHbOf9RAX4LrMOaF/8ieJbg+8EPgwGqIHxrx+KTseSWxx+eKTRoPXJHxvAPB6VvvA4uBAyLKfh7YOXz+4zD+7wQXol5Ulfg8yn4t4/k5BNcXjSIY0CB7UJ0uBIMBfUhwXVHTqHKqEB+7/QuwbiXJparrVo2stwVYz5PGJ1kXY8cWoOwkdRi77QvQnqnVYZ7xaW7/VWmj6t7mkgySlrTs1LbRPOq8KNozj+VMez9XqnVeyP+h1b1fTLP9i2nfUjTrea5HrKBieKRZQXmUnaQT8HjW4wlgddnriLITfTkiODf3QIJTTPuF03sA/40qO2H8BoJzzu8E7gofq8K/d+Ybm0fZmaPlPQkcFT7vDbwUUfabGc+nE964keDC2agRkGLH51H27Kz4nCM9AdMIbtOxI/Argp313tnlVCE+dvsXYN1Kkkua61ZqZRdgPU8an2RdjB1bgLJLtT1Tq8M849Pc/oupjZKMCpm07NS20TzqvCjaM4/lTHs/V6p1XpL/QwvQ/sW0byma9TzXI1ZQMTzSrKA8yk7SCZhFSkNsZ8UuyLVMVYjfH5hMMPhB2fWX7+don9ixeZSd2T6zs96bHRE/G9g9fP48UD98XheYV5X4PMp+HWhKMMz4jIpyZ8svHAMIrtvsk6N9ksbHbv8CrFtJcklz3Uqt7AKs50njk6yLsWMLUHaptmdqdZhn/OyM59W9/RdTG00Azgyf30Uw+jUE17VPr2LZqW2jedR5UbRnHsuZ9n6uVOs8zVzS3ubSbP9i2rcUzXqe61GH0rSbuz8F4MHFj1GjN+UbHyf2WzPbPXy+muDGiADrCb7cZ+pFMNLPb4AVHtzMcK27T/UKhlg3s2aw+XCvBL8qbBab8fzXWe9tG1V2knh3n04wzPi2wHMW3vw9otxEsXnE72Vmj5vZE0Cr8ILaMlHDzv6cYBTT0QRHr54zs6sIRta7q4rxSctuQtD+M4CdLLj5MDlGerJwgB8A3P15gtMB/gXsGVF20vgk7Z/qupUkPs11K+X1Nu31PGl8knUxSWyqZZdwe6ZZh/nEp7b9F1MbEYwUeIiZvUtw5s3LFoyAdwdZowjmUXaa22ia+9zU2jOUZDnT3s+VZJ2nGV+AbS619i+yfUsxrec5F6okHgR3hy87fXE50DDjvTerEp9H2f0JvtCPJhgF8yWCG6E/C/wqR/6tCH5BvIWsm/lmxS0mOC/6/fDvruH07dnyyMygzFwzpu8NXBYxPVF8VsxuwAPAezHaKnZsnHjCo5oZj7IbOrYALsgxTxOCX1/+TDC89+VA+wpyiB2ftOwcZTQE2mZNOwXoExHbGrgjYnrS+Njtn/a6le+6WN3rVqHKTmM9z2e7iLsuVkdsGmWXUnvWRB1WFJ/m9l+MbUSMQdKSlp3mNpq0zoupPRMuZ6r7uVKt87Tj89mGiqH988291JazKvWS+SilWxockjVppgf3fWgBnODuf803PmnZ4TxNCL5Ul92T6SPgMa98WNlqH2JbREREopnZIHd/vKbzEBFJU8mcfunh6YoZj7I7tS+L6nQliU9advjeCne/zd1/7u4Xufv1lXXowvmeTNqhC+dbk6RDZ2YjkpSfZnypll2AXCamWHYxLWdJ5lJbljOMT7Iuxo4tQNnFVIdJckmtDvOML4p6rI6yzWxo9gMYm/G8YLlUV3yplq1cCl+2cil82cWUS8l06ipSqpWf8j/qqGsqaiq+VMtOGp+07HNSLLuYlrNUc6ktywnJ1sUksWmXXUx1mCQ+zTrMJ75Y6rE6yn4AOAs4Fvhh+GgU/j22wLlUV3yplp00vrbkUluWM2l8qZadND69suOep1nMD+CnacWnXHbLhGVvEQ+0BwYSnn+bMf3IHGWkFl+qZaedS8I27g3sHz7vQHCPwqNrIr625FJbljPH/LukEVuAspPc6zN2bCHii+VBid58vrJ4Eo5oV6jlrCyeLW+afg0V3DQ9SXyaZZd4LhcDeyTYZmLHp1l2LctlW+B04NDw9SkEY1NcANTLNzbt+LRzyfUomWvqKmJmZ7r7XWnEp1l2VZnZxQQNvgDoBlzi7o+F781y9x6Fii/VsguQy64E9xncRDCYzkUEI1QuCOf9OCN2FHAUwTWazxL8c5oCHAr8x91/l1V2avG1JZfaspxh/E5szghGT+xO8OX3i3xiC1B29rVQBgwAngNw90H5xKYdb2ZHuvvT4fMmwI0EHY43gZ+7+7KsstOOf83de4fPzyHYjz0CHA484e7X5RNbTGVnzFOHYF97HMFAVve7+14RcanmkrBe5gFd3X2DmY0F1gAPEvyA2NXdh2aVHTs+zbJLPJcVBKOXvwvcB0zwcMTxKEni0yy7luVyD8H/uIYEgxpuDzxM0J64+/B8YtOOTzuXnDxm76+YH1QwmmRV46taNrAD8AeCYeZPyXrv1oj5Y8cT3Oy8bIScNgRDW18Svp4dUXZq8aVadgFyeZrgy8VIYC7BF4zW4bTHIsquS7BRr2TzXxujbmyeWnxtyaW2LGc4fRPBqLqZj2/Dv+/lG1uAsmPf6zNJbNrxbH7fob8DvyW41cjPgUejyk45fnbG81K6+Xyi+Kx5KxtxNtVcEtZL7JumJ41Ps+wSz2U2wWVIhwP/IBj9/GngDKBxVHvGjU+z7FqWy9zw7zbAMqBu+NrY8n9o7Ni049POJdejZK6pM7O5OR5vEAz5mXd8mmUT3LvMgIeAH5nZQ2a2Xfhen4hFTRJf178b1GUxwReMo8zsRqLPwU0zvlTLTjuXFu5+swe/yO7owYA6S9z9Zra8l9wGd9/o7muAd919Zfg5awm+CGdLM7625FJblhPgMuAtYJC7t3X3tsBH4fPsoxhJYtMuO8m9PpPeFzTt+PL53P0Kd//A3f9M8INQRdKIT3QP1ASxxVT2Ztx9qbuflGO9KkQuSeLfNLMzw+evm1kvADPbh+BHj2xJ4tMsu5RzcXff5O7PuPtPCH4EuBU4kuCWUtmSxKdZdm3KpY6ZbUtwi5KGBLeUAtiOiPsOJohNOz7tXKJ5zN5fTT8Ieq7dCL4IZz7aAEurEp9y2XOyXv8G+C/QjKxfkZLGE5zy0y1r2jbAP4GNEWWnFl+qZRcgl9cznv82673sX2pfJbzvDFAnY3qTHOtKavG1JZfaspwZ75XdL/NGgn8eFd2TJ3Zs2mVnzVPhvT6TxqYVT3Cbm18AvyT4smIZ70X9Upt2/GLi3wM1dmwxlR2j3UYUMpeE9dIEGEdwWtqrBB2Q94CpBKcNZpcdOz7Nsks8l9kVrCsNIqbFjk+z7FqWy8/D9vuA4Hq8ycAdBGeqjMo3Nu34tHPJWYdxA2v6QXCYtl+O9+6tSnzKZS8g4wtXOO0MgpuXfxAxf+x4gi8Wu+bIo2/EtNTiS7XsAuQymqwBVcLp3wMezJq2XY5ydwY6R0xPLb625FJbljMi5ofAK8AnFcUljU277HCeY4DfV3dsdccTXEub+Sg79W5XIgZXSTu+gmUomZvPVyU+nCfWQGZp51JRPMlvmh47Ps2ySzEXYJ+E60/s+DTLrk25hPPsBuwWPt8ROAHoXdXYtOPTziXqsVUMlFLMzOx/gWfcfVLW9COBm929XVXipfiZWXtgd+BVD0/dDKeXD3QgUghm1pvg9JfpZtYZGExwVO/fVYlNu+ythZn9091PL5b42sDM+hGMEvumuz9T0/mIiKRFnboaZEU8sqZUDzO7CLiQmKNliqTFthwtszfBKUlxRuLMGZt22aXKthwpE+AHxB9Zs1rjawvLY7RMEZGtgTp1NcjMlrh767TipeaFg+cc6O6rzawNwdDK/3L3MWY2292712yGUluE62I3gguvPwFauftKM2tAcBS5Sz6xaZddqsxsNsFp838HnGAgpfuAHwF41sAqacfXFpn7VTObTnDfxuVm1gh4xd0712yGIiLp2KamE9jamdncXG+RY2TNJPFS9DYbLdPM+gMPmtmeRI+WKZKWDe6+EVhjZpuNlmlmkSNxxoxNu+xS1RO4hGCwq0vdfY6Zra2gs5V2fG1Rx8yaEgybvtmIk2ZW4WiZIiKlTJ269LUAjgC+zJpuwEvVEC/F7RMz6+bucwDCI3bHAncC+sVYCukbM2vowS0QepZNtODG1dmdqSSxaZddktx9E/BnM5sQ/l1GBf9z046vRZoQ3HbCADezXd39EzPbHv2QJiJbMf0DSN9EgtEP52S/YWZTqiFeitvpZN2PyN03AKeb2d9qJiWppQ529/VQ3iEoU49ghN18Y9Muu6S5+0fAiWZ2DMFN4ms0fmvn7m1yvLUJGFLAVERECkrX1ImIiIiIiJSwOjWdgIiIiIiIiORPnToREREREZESpk6diEgBmVkLM7vXzN4zs5lm9rKZDQnf629mK8xstpktCO/pVjZfbzN7wczeMrOFZvZ3M2toZsPNbLmZzQmn/zyFnHczswdzvDfFzHpV92dmlN/AzKaaWd3wdTszm2hm74b197yZHRy+l1kX88P7lJWVc5SZzQjrdaGZ3RBOv9rM/l/GPCfnyKONmb2Z8Tm3pLXMVRGuFx2KII/VVZx/kJmNrML895tZu6rkICJSStSpExEpEDMz4FHgBXffy917EtxXrFVG2IvhfbZ6AaeZWU8zawFMAC53932B/YCngcbhPOPdvRvQF/iNme1RSR6JBsly96XufkKSearRWcDD7r7RzOoDTwJj3X3vsP4uAvbKiC+ri/7A78NOdCfgFuA0d98P6AS8lzHPn8N5BgN/M7N6aS9UGsysrruf7e7zazqXqjCzbdz98SreKPw24LLqyklEpNipUyciUjg/AL5x99vLJrj7B+5+c3agu39NMDT73sAFwN3u/nL4nrv7g+6+LGuez4F3gJbZ5YVHpMaa2TPAP82suZk9ZGbTw0ffMO6Q8KjVnPCIYeOso1QNwqMgc81sPNAg4zNWZzw/wczGhc9jf1ZEnZ0KPJbx/GV3fzxjmd9093ER9fcp8C6wJ8GX+9+5+8LwvQ3ufmvEPIuANUDTML+eZva6mb0ctkGmPczs6fDI6ajsssL5f2Jmb4dHM+8oO7pXQX1cbWZ3hvHvmdnFGWWdZmavhXX1t4wjl6vNbLSZvQocmHnk1MyONLNZ4TJMjshvuJk9HC7HIjP734z3crXlODO7LTxC+l7YhneGR0DHZZX/p/DzJ5tZ83Da3uHnzTSzF82sfUa5N5rZ88D1mUdDw/duMrOXws88IZxex8xuNbN5Fhy9/XfZe8CLwKFJf8AQESlV6tSJiBROR2BWnEAzawb0AeYRHFmaGWOe1kB9YG6OkJ7AYHc/BRhDcIRqf+B44O9hzK+AC8IjV98H1maVcR6wxt27AL8j415zFcjrs8xsW2Avd18cTkpSf3sRHMF7h/j11wNYFHYIAe4CLnb3AyPCexN0MrsR3FJgs1NQzWw34EqCNjwMaJ/xdq76IIw7Iix/lJnVM7P9gGFA37CuNoafDdAIeNPdD3D3aRmf3xy4Azje3bsCJ+ZY7G5h2Z2BYVbJUd5QU4IfKH4OPAH8maBtOptZt4y8Zrl7D2AqUNbxHQtcFB5l/RWQ2bneBzjU3X8Z8ZktgX7AsUDZEbyhQJsw97OB8nYKb5fxDtA1xvKIiJQ8/YIlIlJDzOyvBF9Uvwm/4AN838xmE9xX6zp3n2dW6T2Th5nZAGBf4Bx3X5cj7nF3L+s4HQp0yCh7h/BI2X+BG83sHoLTHj/K+vyDgZsA3H2umeXqQGaK/VlZ8+0MfJWrUDN7BGgHvO3uQ8PJw8ysH7Ae+Km7fxGj/n5uwfV3ewFHhmU3AXZ096lhzL+AozLmeTY8MoqZPUzQjjMy3u8NTHX3L8KYCQSdlorqA+DJ8D5+683sU6AFMJCg8zw9nKcBUNbx3Ag8FLFMfQhO830foCyPCJPdfUWY43yCI5sf5ogt84S7u5m9ASxz9zfC+ecRdLLmEKy/48P4/wMetuAG4AcBEzKWfbuMcie4+8Ycn/lo2FGbb8HpyBDU+YRw+ifhUb5MnwK7EaNDLyJS6tSpExEpnHkER2YAcPcLzGxnNu8MvOjux0bM15PvTkPMNt7dLzSzA4Enzewpd/8kIu7rjOd1gAMzOnllrjOzJ4GjgVfM7FAgu5OY6wanmdPr5/NZZadIhtZmlTOPoFMZfJj7kPAI2Q0ZMePd/cKszymrv9dz5P1nd7/BzIYSnJq6N2DkXk4i3st+XVFPMrI+wo7O+oxJGwn+TxvB6be/jihrXY6OUGX5l4n6PMjdlpnzbMqafxO5v1c4wXJ/FR5tjPJ1junZeVrW31zqs+WRZhGRrZJOvxQRKZzngPpmdl7GtIYx5rsFOMPMDiibEF5jtWtmUHjN3b+AS2KU+QxQ3vkpO23OzPZ29zfc/XqCzmb7rPleIDz1z4IBSLpkvLfMzPYzszrAkKp+lrt/CdS1YIAUgHuBvmY2KCMsTv39EfgfM9sn/Nw6ZvaL7CB3fzjM4wx3/wpYER71g+9OdyxzmJntZGYNgOMIjjpmeg04xMyahtd1HZ/xXmR9VGAycIKZ7RLG72Rme1Yyz8vh57ctm6eS+Gy52jKuOkDZ9W2nANPcfSXwvpmdGOZkZlaV0yOnAceH7dmCYHCcTPsQdOhFRLZ66tSJiBSIuztBB+AQM3vfzF4D7gYur2S+ZQSjZN5gwcAcCwiuQVsZEX49cKZFDzqS6WKglwUDnswHzg2n/8zM3jSz1wmOcjyVNd9twPbhaZeXEXReyowEJhJ0Xj+uhs+CoAPUL6yHtQTXVJ0bDpjxMnAF8NuKFtTd5wI/A+4L6+5NIgaTCY0GfhF2Zs4E/hp+TvYRn2kEHeg5wEPunnm0FXf/f8DvgVeBScB8YEUl9ZEr//nhcj4T1vuzFeRfNs9yYATBaY+v892pkHHlasu4vgY6mtlMguvvRofTTwV+EuY0j2DE0Xw9BHxE0J5/I6jrslNJWwBr3T2f3EVESo4F3zFERESKj5l1B37h7j+u6VySMrPt3X11eKTuEeBOd3+kpvPammTUcTOCHxj6uvsnFtyvcaW7/6OGUxQRKQhdUyciIkXL3WdbMHx+3QoG0ShWV4fXJNYnOOL4aM2ms1WaaGY7AtsC12ZcS/oVwZFUEZFaQUfqRERERERESpiuqRMRERERESlh6tSJiIiIiIiUMHXqRERERERESpg6dSIiIiIiIiVMnToREREREZESpk6diIiIiIhICfv/PB2ZWphbsDMAAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "residues_vs_interactions_df.plot.bar(\n", + " figsize=(15, 5),\n", + " stacked=True,\n", + " xlabel=\"GPCR residues (GPCRdb generic numbering)\",\n", + " ylabel=\"Number of structures displaying interaction\",\n", + " color=[\"grey\", \"cornflowerblue\", \"gold\", \"limegreen\"],\n", + ");" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Interaction type count per residue by receptor state (barplots)" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
stateactiveinactive
interaction_typeaccessiblearomatichydrophobicpolaraccessiblearomatichydrophobicpolar
display_generic_number
2.42x4210000000
2.61x6010002000
2.64x6381012101
2.65x6410002000
23.50x5010001000
...........................
8.48x4800001000
8.49x4900001001
8.50x5000001010
8.52x5200001000
8.53x5300001000
\n", + "

72 rows × 8 columns

\n", + "
" + ], + "text/plain": [ + "state active inactive \\\n", + "interaction_type accessible aromatic hydrophobic polar accessible \n", + "display_generic_number \n", + "2.42x42 1 0 0 0 0 \n", + "2.61x60 1 0 0 0 2 \n", + "2.64x63 8 1 0 1 2 \n", + "2.65x64 1 0 0 0 2 \n", + "23.50x50 1 0 0 0 1 \n", + "... ... ... ... ... ... \n", + "8.48x48 0 0 0 0 1 \n", + "8.49x49 0 0 0 0 1 \n", + "8.50x50 0 0 0 0 1 \n", + "8.52x52 0 0 0 0 1 \n", + "8.53x53 0 0 0 0 1 \n", + "\n", + "state \n", + "interaction_type aromatic hydrophobic polar \n", + "display_generic_number \n", + "2.42x42 0 0 0 \n", + "2.61x60 0 0 0 \n", + "2.64x63 1 0 1 \n", + "2.65x64 0 0 0 \n", + "23.50x50 0 0 0 \n", + "... ... ... ... \n", + "8.48x48 0 0 0 \n", + "8.49x49 0 0 1 \n", + "8.50x50 0 1 0 \n", + "8.52x52 0 0 0 \n", + "8.53x53 0 0 0 \n", + "\n", + "[72 rows x 8 columns]" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "receptor_interactions_by_state = {}\n", + "for state in [\"active\", \"inactive\"]:\n", + " _df = interactions_by_entry_name(query_receptor, state=state)\n", + " _df2 = get_residues_vs_interactions(_df)\n", + " # Add multicolumn (state and interaction type)\n", + " _df2 = pd.concat([_df2.transpose()], keys=[state], names=[\"state\"]).transpose()\n", + " receptor_interactions_by_state[state] = _df2\n", + "\n", + "# Concat both DataFrames in order to align residues\n", + "_tmp = pd.concat(list(receptor_interactions_by_state.values()), axis=1).fillna(0).astype(int)\n", + "_tmp" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
stateactiveinactive
interaction_typeaccessiblearomatichydrophobicpolaraccessiblearomatichydrophobicpolar
10.53x5300001000
10.56x5600001000
10.57x5700001000
10.60x6000001000
12.49x4900001001
...........................
80.48x4800001000
80.49x4900001001
80.50x5000001010
80.52x5200001000
80.53x5300001000
\n", + "

72 rows × 8 columns

\n", + "
" + ], + "text/plain": [ + "state active inactive \\\n", + "interaction_type accessible aromatic hydrophobic polar accessible aromatic \n", + "10.53x53 0 0 0 0 1 0 \n", + "10.56x56 0 0 0 0 1 0 \n", + "10.57x57 0 0 0 0 1 0 \n", + "10.60x60 0 0 0 0 1 0 \n", + "12.49x49 0 0 0 0 1 0 \n", + "... ... ... ... ... ... ... \n", + "80.48x48 0 0 0 0 1 0 \n", + "80.49x49 0 0 0 0 1 0 \n", + "80.50x50 0 0 0 0 1 0 \n", + "80.52x52 0 0 0 0 1 0 \n", + "80.53x53 0 0 0 0 1 0 \n", + "\n", + "state \n", + "interaction_type hydrophobic polar \n", + "10.53x53 0 0 \n", + "10.56x56 0 0 \n", + "10.57x57 0 0 \n", + "10.60x60 0 0 \n", + "12.49x49 0 1 \n", + "... ... ... \n", + "80.48x48 0 0 \n", + "80.49x49 0 1 \n", + "80.50x50 1 0 \n", + "80.52x52 0 0 \n", + "80.53x53 0 0 \n", + "\n", + "[72 rows x 8 columns]" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Sort residues (index)\n", + "# Requires the trick of replacing 1. with 10. etc for correct sorting\n", + "_index_tmp = []\n", + "for i in _tmp.index:\n", + " i1, i2 = i.split(\".\")[0], i.split(\".\")[1]\n", + " if len(i1) == 1:\n", + " i_new = f\"{i1}0.{i2}\"\n", + " else:\n", + " i_new = i\n", + " _index_tmp.append(i_new)\n", + "_tmp.index = _index_tmp\n", + "_tmp = _tmp.sort_index()\n", + "_tmp" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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x+GHH84hhxxSMp+DDjqIrl270rVrV0aPHs1DDz3E4MGD65bffvvtzJs3jz/96U8AvPHGGzz++OM26iRJkiR1PNOmTWPq1Kncf//9bLDBBowaNYpBgwbx6KOPrhGbUqIwktrq8/baay+uvvrqNeIfeugh7rzzTq655hp+85vfcNddd3HxxRfz4IMP8pe//IXBgwczd+7cNdZr+BmlPvPXv/41++yzTwu2uPV8pk6SJElS1XjjjTfYZJNN2GCDDVi8eDEPPPAA77//Pvfccw9PP/00QN3tl3vvvTe/+c1v6tZ97bXX2HXXXbnvvvt44oknAHj33Xd57LHHePvtt3njjTfYb7/9OP/88+sab08++SS77LILZ511FpttthnPPffcGjnddNNNLFu2jFdffZVp06ax0047rbZ8n3324aKLLuLDDz8E4LHHHuOdd95p833TGK/USZIkSSqpPYYg2Hfffbn44osZOHAg22+/Pbvuuis9e/Zk0qRJHHLIIaxcuZKPfvSj3HHHHZx22ml861vfon///nTu3JmJEydyyCGHMHnyZI488kjef/99AH784x+z0UYbcdBBB7Fs2TJSSvzqV78C4JRTTuHxxx8npcSYMWMYNGgQ99xzz2o57bzzzuy///48++yz/OhHP2LLLbdkyZIldcuPO+44lixZwtChQ0kp0bNnT2688cZK7TIipeq/f3n48OFp5syZ7Z2GtFbI/KxJqecewGcfpGpQRednNT3HVk25qBE+U9dqeR3nixYtYocddmhVGWq9UvUQEbNSSiXHWfD2S0mSJEmqYTbqJEmSJKmG2aiTJEmSpBpmo06SJEmSapi9X0qSJKl1qqjTHqkj8kqdJEmSJNUwr9RJkiRJKun43/27Tcu75Jubtml5bW3u3Lm88MIL7LfffgDcfPPNPPLII0yYMKGdM2uaV+okSZIk1ZQVK1bkUu7cuXP561//Wvf+wAMPrPoGHdiokyRJklRlDj74YIYNG0a/fv2YNGkSAN26deP0009nl1124f777+e8886jf//+9O/fn/PPPx+AJUuW0LdvX4477jj69+/PUUcdxdSpUxkxYgR9+vThoYceAuChhx5i9913Z8iQIey+++48+uijfPDBB5x++ulMmTKFwYMHM2XKFCZPnsyJJ54IwNKlSxk7diyDBg1i0KBB/POf/2yXfVOKjTpJkiRJVeUPf/gDs2bNYubMmVx44YW8+uqrvPPOO/Tv358HH3yQrl27ctlll/Hggw/ywAMPcMkllzBnzhwAnnjiCU4++WTmzZvH4sWLueqqq5g+fTrnnnsuP/3pTwHo27cv9957L3PmzOGss87iBz/4Aeuttx5nnXUWRxxxBHPnzuWII45YLaeTTjqJPffck4cffpjZs2fTr1+/iu+XxvhMnSRJkqSqcuGFF3LDDTcA8Nxzz/H444/TuXNnvvCFLwAwffp0xo4dy4YbbgjAIYccwj/+8Q8OPPBAevfuzYABAwDo168fY8aMISIYMGAAS5YsAeCNN97g6KOP5vHHHyci+PDDD5vN6a677uKKK64AoHPnznTv3r2tN7vFvFInSZIkqWpMmzaNqVOncv/99/Pwww8zZMgQli1bRpcuXejcuTMAKTU+XMb6669fN92pU6e69506dWL58uUA/OhHP2L06NEsWLCAW265hWXLluW4RfmzUSdJkiSparzxxhtssskmbLDBBixevJgHHnhgjZg99tiDG2+8kXfffZd33nmHG264gU9/+tOZPmOrrbYCYPLkyXXzN9poI956662S64wZM4aLLroIKHTU8uabb2bYqnx5+6UkSZKkktpjCIJ9992Xiy++mIEDB7L99tuz6667rhEzdOhQxo0bx8477wzAcccdx5AhQ+pur2zO9773PY4++mjOO+88PvOZz9TNHz16NOeccw6DBw/m+9///mrrXHDBBYwfP55LL72Uzp07c9FFF7Hbbru1fEPbUDR16bJaDB8+PM2cObO905DWCsNmDys5f9bQWaVXWByl5/et/u8Oaa1XRedn5u+WHFVTLh1G1mOxVLy/VzLJ6zhftGgRO+ywQ6vKUOuVqoeImJVSGl4q3tsvJUmSJKmG2aiTJEmSpBpmo06SJEmSalizjbqIOCwiNipOnxYR10fE0PxTkyRJkiQ1p5wrdT9KKb0VESOBfYDLgYvyTUuSJEmSVI5yGnUrij/3By5KKd0ErJdfSpIkSZKkcpXTqPvfiPg9cDjw14hYv8z1JEmSJNWyxdG2rzIsWbKE/v37tyjdadOmccABB7Ro3YYmT57MiSeemGmdbt26lZx/+umnM3Xq1LZIq6RyBh8/HNgXODel9HpEbAGckltGkqpq7ClJkqRat3z5ctZZp5ymTz7OOuusXMtv9opbSuld4F/AyOKs5cDjeSYlSZIkqeNasWIFxx9/PP369WPvvfdm4cKFDB36n74aH3/8cYYNKwzAftttt9G3b19GjhzJ9ddfXxdzxhlnMH78ePbee2+++tWv8swzzzBmzBgGDhzImDFjePbZZwEYN24cJ5xwAp/+9KfZbrvtuPXWW+vKeOGFF9h3333p06cP3/ve9+rmX3311QwYMID+/ftz6qmnrpb7d77zHYYOHcqYMWN4+eWX6z7jT3/6EwAzZsxg9913Z9CgQey888689dZbrd5f5fR+ORE4Ffh+cda6wP9r9SdLkiRJUgmPP/443/rWt1i4cCEf+chHmDNnDt27d2fu3LkAXHbZZYwbN45ly5Zx/PHHc8stt/CPf/yDl156abVyZs2axU033cRVV13FiSeeyFe/+lXmzZvHUUcdxUknnVQXt2TJEu655x7+8pe/cMIJJ7Bs2TIA5s6dy5QpU5g/fz5Tpkzhueee44UXXuDUU0/lrrvuYu7cucyYMYMbb7wRgHfeeYehQ4cye/Zs9txzT84888zV8vnggw844ogjuOCCC3j44YeZOnUqXbt2bfX+KufZuLHAgcA7ACmlF4CNWv3JkiRJklRC7969GTx4MADDhg1jyZIlHHfccVx22WWsWLGCKVOm8KUvfYnFixfTu3dv+vTpQ0Tw5S9/ebVyDjzwwLpG0/3338+XvvQlAL7yla8wffr0urjDDz+cTp060adPH7bddlsWL14MwJgxY+jevTtdunRhxx135JlnnmHGjBmMGjWKnj17ss4663DUUUdx7733AtCpUyeOOOIIAL785S+v9hkAjz76KFtssQU77bQTABtvvHGb3BZaTqPug5RSAhJARGzY6k+VJEmSpEasv/76ddOdO3dm+fLlfOELX+Bvf/sbt956K8OGDaNHjx4ARDTeAcuGGzbedKm/XsMyVr0vlUehaVSehuWmlJrMt6XKadRdW+z98iMRcTwwFbikzTORJEmSpEZ06dKFffbZh2984xscc8wxAPTt25enn36aJ598Eig869aY3XffnWuuuQaAK6+8kpEjR9Ytu+6661i5ciVPPvkkTz31FNtvv32j5eyyyy7cc889vPLKK6xYsYKrr76aPffcE4CVK1fWPTt31VVXrfYZq/J94YUXmDFjBgBvvfUWy5cvz7or1tDktb4oNCOnAH2BN4HtgdNTSnc0V3BE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XireK3WSJEmSytatWzcApk2bxqhRozj00EPp27cvRx11FCklLrzwQl544QVGjx7N6NGjAbj99tvZbbfdGDp0KIcddlhdQ6lXr16cddZZjBw5kuuuu45LLrmEnXbaiUGDBvGFL3yh7mrf0qVLGTt2LIMGDWLQoEH885//ZMKECTz55JMMHjyYU045hSVLltC/f3+g0IvnMcccw4ABAxgyZAh33303AJMnT+aQQw5h3333pU+fPnzve99rdDsnTJjAe++9x+DBgznqqKP40Y9+xAUXXFC3/Ic//CEXXngh06ZNY4899mDs2LHsuOOOnHDCCaxcubLJ7W5rNuokSZIktcicOXM4//zzeeSRR3jqqae47777OOmkk9hyyy25++67ufvuu3nllVf48Y9/zNSpU5k9ezbDhw/nvPPOqyujS5cuTJ8+nS9+8YsccsghzJgxg4cffpgddtiBSy+9FICTTjqJPffck4cffpjZs2fTr18/zjnnHD75yU8yd+5cfvGLX6yW129/+1sA5s+fz9VXX83RRx9dN0zA3LlzmTJlCvPnz2fKlCk899xzJbftnHPOoWvXrsydO5crr7ySr33ta1x++eUArFy5kmuuuYajjjoKgIceeohf/vKXzJ8/nyeffJLrr7++2e1uSw4+LkmSJKlFdt55Z7beemsABg8ezJIlSxg5cuRqMQ888ACPPPIII0aMAOCDDz5gt912q1t+xBFH1E0vWLCA0047jddff523336bffbZB4C77rqLK664AoDOnTvTvXt3XnvttUbzmj59Ot/+9rcB6Nu3L5/4xCd47LHHABgzZgzdu3cHYMcdd+SZZ57h4x//eLPb2qtXL3r06MGcOXNYunQpQ4YMoUePHnX7YdtttwXgyCOPZPr06XTp0qXJ7W5LNuokSZIktcj6669fN925c2eWL1++RkxKib322ourr766ZBkbbrhh3fS4ceO48cYbGTRoEJMnT2batGktyqupfkPKybkxxx13HJMnT+all17i2GOPrZvfcGy5iGh2u9uSt19KatKw2cNKviRJkhqz0UYb8dZbbwGw6667ct999/HEE08A8O6779ZdNWvorbfeYosttuDDDz/kyiuvrJs/ZswYLrroIqDQocqbb7652mc0tMcee9St/9hjj/Hss8+y/fbbZ96Oddddlw8//LDu/dixY7ntttuYMWNG3VVEKNx++fTTT7Ny5UqmTJnCyJEjM213a9mokyRJktSmxo8fz+c+9zlGjx5Nz549mTx5MkceeSQDBw5k1113ZfHixSXXO/vss9lll13Ya6+96Nu3b938Cy64gLvvvpsBAwYwbNgwFi5cSI8ePRgxYgT9+/fnlFNOWa2cb37zm6xYsYIBAwZwxBFHMHny5NWu0GXZjoEDB9Y9O7feeusxevRoDj/88NV66txtt92YMGEC/fv3p3fv3owdOzbTdreWQxpIHUzWLpAdAkGqYg5poGrhkAYVV+1DGqytVq5cydChQ7nuuuvo06cPUOgF9Nxzz+XWW29ts8+puiENIqJzRMyJiFuL7zeNiDsi4vHiz03yzkGSJEmSWuORRx7hU5/6FGPGjKlr0FWLSnSUcjKwCNi4+H4CcGdK6ZyImFB8f2oF8pAkSZKkNeyyyy68//77q8374x//yIABA+re77jjjjz11FNrrDtq1ChGjRqVd4pNyrVRFxFbA/sDPwH+pzj7IGBUcfpyYBo26iRJkiS1kwcffLC9U2iVvK/UnQ98D9io3rzNU0ovAqSUXoyIj5ZaMSLGA+MBttlmm5zTlNSYWRvMbu8UJEmS1ITcnqmLiAOAf6WUWvS0ZkppUkppeEppeM+ePds4O0mSJElaO+R5pW4EcGBE7Ad0ATaOiP8HLI2ILYpX6bYA/pVjDpIkSZK0VsutUZdS+j7wfYCIGAV8N6X05Yj4BXA0cE7x50155SBJkiSp5c4888w2LW/ixIltWl5eZs6cyRVXXMGFF17IGWecQbdu3fjud7+7WsySJUs44IADWLBgQTtl+R+V6P2yoXOAayPia8CzwGHtkIMkSZIklTR8+HCGDy85JFxVyn2cOoCU0rSU0gHF6VdTSmNSSn2KP/9diRwkSZIk1YaDDz6YYcOG0a9fPyZNmgTAbbfdxtChQxk0aBBjxowB4O233+aYY45hwIABDBw4kD//+c8A3H777ey2224MHTqUww47jLfffhuACRMmsOOOOzJw4MC6K2/XXXcd/fv3Z9CgQeyxxx5AYUDxAw44oC6fhx9+mM985jP06dOHSy65ZI18V6xYwSmnnMJOO+3EwIED+f3vf5/fzimhPa7USZIkqQM7/q5X15h3Sd92SERV6w9/+AObbrop7733HjvttBMHHXQQxx9/PPfeey+9e/fm3/8uXBc6++yz6d69O/Pnzwfgtdde45VXXuHHP/4xU6dOZcMNN+TnP/855513HieeeCI33HADixcvJiJ4/fXXATjrrLP4+9//zlZbbVU3r6F58+bxwAMP8M477zBkyBD233//1ZZfeumldO/enRkzZvD+++8zYsQI9t57b3r37p3bPqrPRp0kSZKkqnLhhRdyww03APDcc88xadIk9thjj7pG0qabbgrA1KlTueaaa+rW22STTbj11lt55JFHGDFiBAAffPABu+22GxtvvDFdunThuOOOY//996+7EjdixAjGjRvH4YcfziGHHFIyn4MOOoiuXbvStWtXRo8ezUMPPcTgwYPrlt9+++3MmzePP/3pTwC88cYbPP744zbqJEmSJHU806ZNY+rUqdx///1ssMEGjBo1ikGDBvHoo4+uEZtSIiLWmLfXXntx9dVXrxH/0EMPceedd3LNNdfwm9/8hrvuuouLL76YBx98kL/85S8MHjyYuXPnrrFew88o9Zm//vWv2WeffVqwxa1XkWfqJEmSJKkcb7zxBptssgkbbLABixcv5oEHHuD999/nnnvu4emnnwaou/1y77335je/+U3duq+99hq77ror9913H0888QQA7777Lo899hhvv/02b7zxBvvttx/nn39+XePtySefZJddduGss85is80247nnnlsjp5tuuolly5bx6quvMm3aNHbaaafVlu+zzz5cdNFFfPjhhwA89thjvPPOO22+bxrjlTpJkiRJJbXHEAT77rsvF198MQMHDmT77bdn1113pWfPnkyaNIlDDjmElStX8tGPfpQ77riD0047jW9961v079+fzp07M3HiRA455BAmT57MkUceyfvvvw/Aj3/8YzbaaCMOOuggli1bRkqJX/3qVwCccsopPP7446SUGDNmDIMGDeKee+5ZLaedd96Z/fffn2effZYf/ehHbLnllixZsqRu+XHHHceSJUsYOnQoKSV69uzJjTfeWKldRqSUKvZhLTV8+PA0c+bM9k5DWisMmz2s5PxZQ2eVXmFxlJ7ft/q/O6S1nuenqkXGY/H4363Z+fkl39y0LTNa62X+fV6mRYsWscMOO7SqDLVeqXqIiFkppZLjLHj7pSRJkiTVMBt1kiRJklTDbNRJkiRJUg2zUSdJkiRJNcxGnSRJkiTVMBt1kiRJklTDHKdOkiRJUkmlhp9ojWofumLu3Lm88MIL7LfffgDcfPPNPPLII0yYMKGdM2uaV+okSZIk1ZQVK1bkUu7cuXP561//Wvf+wAMPrPoGHdiokyRJklRlDj74YIYNG0a/fv2YNGkSAN26deP0009nl1124f777+e8886jf//+9O/fn/PPPx+AJUuW0LdvX4477jj69+/PUUcdxdSpUxkxYgR9+vThoYceAuChhx5i9913Z8iQIey+++48+uijfPDBB5x++ulMmTKFwYMHM2XKFCZPnsyJJ54IwNKlSxk7diyDBg1i0KBB/POf/2yXfVOKjTpJkiRJVeUPf/gDs2bNYubMmVx44YW8+uqrvPPOO/Tv358HH3yQrl27ctlll/Hggw/ywAMPcMkllzBnzhwAnnjiCU4++WTmzZvH4sWLueqqq5g+fTrnnnsuP/3pTwHo27cv9957L3PmzOGss87iBz/4Aeuttx5nnXUWRxxxBHPnzuWII45YLaeTTjqJPffck4cffpjZs2fTr1+/iu+XxvhMnSRJkqSqcuGFF3LDDTcA8Nxzz/H444/TuXNnvvCFLwAwffp0xo4dy4YbbgjAIYccwj/+8Q8OPPBAevfuzYABAwDo168fY8aMISIYMGAAS5YsAeCNN97g6KOP5vHHHyci+PDDD5vN6a677uKKK64AoHPnznTv3r2tN7vFvFInSZIkqWpMmzaNqVOncv/99/Pwww8zZMgQli1bRpcuXejcuTMAKaVG119//fXrpjt16lT3vlOnTixfvhyAH/3oR4wePZoFCxZwyy23sGzZshy3KH+ZGnUR0SkiNs4rGUmSJEkd2xtvvMEmm2zCBhtswOLFi3nggQfWiNljjz248cYbeffdd3nnnXe44YYb+PSnP53pM7baaisAJk+eXDd/o4024q233iq5zpgxY7jooouAQkctb775Zoatylezt19GxFXACcAKYBbQPSLOSyn9opn1ugD3AusXP+dPKaWJEXEGcDzwcjH0Bymlv5YuRZIkSVJ7aY8hCPbdd18uvvhiBg4cyPbbb8+uu+66RszQoUMZN24cO++8MwDHHXccQ4YMqbu9sjnf+973OProoznvvPP4zGc+Uzd/9OjRnHPOOQwePJjvf//7q61zwQUXMH78eC699FI6d+7MRRddxG677dbyDW1D0dSlS4CImJtSGhwRRwHDgFOBWSmlgc2sF8CGKaW3I2JdYDpwMrAv8HZK6dxykxw+fHiaOXNmueGSmjBs9rCS82cNnVV6hcVRen7fpr87JFWA56eqRcZjsdTYZ9U+flm1yfz7vEyLFi1ihx12aFUZar1S9RARs1JKw0vFl3P75brFRtnBwE0ppQ+BZn9bpIK3V5VRfPlbRpIkSZLaUDmNut8DS4ANgXsj4hNAWTeQRkTniJgL/Au4I6X0YHHRiRExLyL+EBGbNLLu+IiYGREzX3755VIhkqrN4ij9kiRJUm6abdSllC5MKW2VUtqvePXtGWB0OYWnlFaklAYDWwM7R0R/4CLgk8Bg4EXgl42sOymlNDylNLxnz57lbY0kSZIkdTDNNuoiYvOIuDQi/lZ8vyNwdJYPSSm9DkwD9k0pLS029lYClwA7Z85akiRJkgSUd/vlZODvwJbF948B/9XcShHRMyI+UpzuCnwWWBwRW9QLGwssKD9dSZIkSVJ9zQ5pAGyWUro2Ir4PkFJaHhErylhvC+DyiOhMofF4bUrp1oj4Y0QMptBpyhLg6y1LXZIkSZJUTqPunYjoQbHnyojYFXijuZVSSvOAISXmfyVrkpIkSZLaQVt3eFbGkCtLlizhgAMOYMGC7Df0TZs2jXPPPZdbb721JdmtZvLkycycOZPf/OY3Za/TrVs33n777TXmn3766eyxxx589rOfbXVepZTTqPsf4GbgkxFxH9ATODSXbCRJkiSpjS1fvpx11imn6ZOPs846K9fym3ymrnjr5J7F1+4UbpXsV7wKJ0mSJEltbsWKFRx//PH069ePvffem4ULFzJ06NC65Y8//jjDhhUGYL/tttvo27cvI0eO5Prrr6+LOeOMMxg/fjx77703X/3qV3nmmWcYM2YMAwcOZMyYMTz77LMAjBs3jhNOOIFPf/rTbLfddqtd5XvhhRfYd9996dOnD9/73vfq5l999dUMGDCA/v37c+qpp66W+3e+8x2GDh3KmDFjWDU027hx4/jTn/4EwIwZM9h9990ZNGgQO++8M2+99Var91eTjbqU0grgoJTS8pTSwpTSguLg45IkSZKUi8cff5xvfetbLFy4kI985CPMmTOH7t27M3fuXAAuu+wyxo0bx7Jlyzj++OO55ZZb+Mc//sFLL720WjmzZs3ipptu4qqrruLEE0/kq1/9KvPmzeOoo47ipJNOqotbsmQJ99xzD3/5y1844YQTWLZsGQBz585lypQpzJ8/nylTpvDcc8/xwgsvcOqpp3LXXXcxd+5cZsyYwY033gjAO++8w9ChQ5k9ezZ77rknZ5555mr5fPDBBxxxxBFccMEFPPzww0ydOpWuXbu2en+V0/vlfRHxm4j4dEQMXfVq9SdLkiRJUgm9e/dm8ODBAAwbNowlS5Zw3HHHcdlll7FixQqmTJnCl770JRYvXkzv3r3p06cPEcGXv/zl1co58MAD6xpN999/P1/60pcA+MpXvsL06dPr4g4//HA6depEnz592HbbbVm8eDEAY8aMoXv37nTp0oUdd9yRZ555hhkzZjBq1Ch69uzJOuusw1FHHcW9994LQKdOnTjiiCMA+PKXv7zaZwA8+uijbLHFFuy0004AbLzxxm1yW2g5Jexe/Fn/RtAEfKbVny5JkiRJDay//vp10507d+a9997jC1/4AmeeeSaf+cxnGDZsGD169OC5554jovHOXDbccMNGl9Vfr2EZq943zGP58uWk1HxnL42Vm1JqMt+WavZKXUppdImXDTpJkiRJFdOlSxf22WcfvvGNb3DMMccA0LdvX55++mmefPJJoPCsW2N23313rrnmGgCuvPJKRo4cWbfsuuuuY+XKlTz55JM89dRTbL/99o2Ws8suu3DPPffwyiuvsGLFCq6++mr23HNPAFauXFn37NxVV1212mesyveFF15gxowZALz11lssX748665YQ7NX6iLi9FLzU0r5duEiSZIkqX2VMQRBJR111FFcf/317L333kChoTdp0iT2339/NttsM0aOHNnoUAgXXnghxx57LL/4xS/o2bMnl112Wd2y7bffnj333JOlS5dy8cUX06VLl0Zz2GKLLfjZz37G6NGjSSmx3377cdBBBwGFK4MLFy5k2LBhdO/enSlTpqy27nrrrceUKVP49re/zXvvvUfXrl2ZOnUq3bp1a9V+ieYuH0bEd+q97QIcACxKKR3bqk/OYPjw4WnmzJmV+jhprTZs9rCS82cNnVV6hcbGpyn1JZ8lVlLrec6pWmQ8Fo//3b/XmHfJNzdty4zWepl/n5dp0aJF7LDDDq0qI0/nnnsub7zxBmeffXablTlu3DgOOOAADj20ekZtK1UPETErpTS8VHyzV+pSSr9sUNi5FMatkyRJkqSKGDt2LE8++SR33XVXe6dSdVrS1coGwLZtnYgkSZIkNeaG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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "f, (ax1, ax2) = plt.subplots(2, 1, figsize=(15, 10), sharex=True)\n", + "for ax, state in zip([ax1, ax2], [\"active\", \"inactive\"]):\n", + " _tmp[state].plot.bar(\n", + " ax=ax,\n", + " stacked=True,\n", + " xlabel=\"GPCR residues (GPCRdb generic numbering)\",\n", + " ylabel=f\"Number of {state.upper()} structures\",\n", + " color=[\"grey\", \"cornflowerblue\", \"gold\", \"limegreen\"],\n", + " );" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Discussion\n", + "\n", + "Wrap up the talktorial's content here and discuss pros/cons and open questions/challenges." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Quiz\n", + "\n", + "Ask three questions that the user should be able to answer after doing this talktorial. Choose important take-aways from this talktorial for your questions.\n", + "\n", + "1. Question\n", + "2. Question\n", + "3. Question" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "
\n", + "\n", + "Useful checks at the end: \n", + " \n", + "
    \n", + "
  • Clear output and rerun your complete notebook. Does it finish without errors?
  • \n", + "
  • Check if your talktorial's runtime is as excepted. If not, try to find out which step(s) take unexpectedly long.
  • \n", + "
  • Flag code cells with # NBVAL_CHECK_OUTPUT that have deterministic output and should be tested within our Continuous Integration (CI) framework.
  • \n", + "
\n", + "\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.9.13" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "state": {}, + "version_major": 2, + "version_minor": 0 + } + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} From bc8aa2e0c4cd01683e6c636631300f14b8cf1933 Mon Sep 17 00:00:00 2001 From: dominiquesydow Date: Mon, 1 Aug 2022 11:32:36 +0100 Subject: [PATCH 2/9] CI: Temporarily restrict CI to T029 --- .github/workflows/ci.yml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c1d5e230..263dbbf4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -76,11 +76,12 @@ jobs: shell: bash -l {0} run: | PYTEST_ARGS="--nbval-lax --current-env --dist loadscope --numprocesses 2" - if [ "$RUNNER_OS" != "Windows" ]; then - pytest $PYTEST_ARGS teachopencadd/talktorials/T*/talktorial.ipynb - else - pytest $PYTEST_ARGS teachopencadd/talktorials/ --ignore=teachopencadd/talktorials/T008_md_simulation/talktorial.ipynb --ignore=teachopencadd/talktorials/T019_md_simulation/talktorial.ipynb - fi + pytest $PYTEST_ARGS teachopencadd/talktorials/T029_query_gpcrdb/talktorial.ipynb + #if [ "$RUNNER_OS" != "Windows" ]; then + # pytest $PYTEST_ARGS teachopencadd/talktorials/T*/talktorial.ipynb + #else + # pytest $PYTEST_ARGS teachopencadd/talktorials/ --ignore=teachopencadd/talktorials/T008_md_simulation/talktorial.ipynb --ignore=teachopencadd/talktorials/T019_md_simulation/talktorial.ipynb + #fi format: name: Black From adebcd59813c37d73454a12a1be6b105d7e8e5ab Mon Sep 17 00:00:00 2001 From: dominiquesydow Date: Wed, 3 Aug 2022 14:46:47 +0100 Subject: [PATCH 3/9] Test (verified commit?) From 06b7e8c9ee84ff03bafffdcd445658c1ffd5db9b Mon Sep 17 00:00:00 2001 From: dominiquesydow Date: Wed, 3 Aug 2022 15:17:47 +0100 Subject: [PATCH 4/9] Test From 5c522ca3eb14024d6fdf7776b6e6d06a6275cd0c Mon Sep 17 00:00:00 2001 From: dominiquesydow Date: Wed, 3 Aug 2022 15:19:52 +0100 Subject: [PATCH 5/9] Test [skip ci] From 7f246a35b4ad1ae9ffe4c93de6f8f6d497dab71e Mon Sep 17 00:00:00 2001 From: dominiquesydow Date: Wed, 3 Aug 2022 15:23:11 +0100 Subject: [PATCH 6/9] Test [skip ci] From 607351c6116d005f92e0a2404a2309d5269eb20e Mon Sep 17 00:00:00 2001 From: dominiquesydow Date: Wed, 3 Aug 2022 15:27:12 +0100 Subject: [PATCH 7/9] Test [skip ci] From 7caaeb1e14e0748d88695a8b3b727f15800e892e Mon Sep 17 00:00:00 2001 From: dominiquesydow Date: Wed, 3 Aug 2022 15:31:13 +0100 Subject: [PATCH 8/9] Test [skip ci] From 3f38ae2d21fdd7bca3b0ad67177d8edc87436e20 Mon Sep 17 00:00:00 2001 From: dominiquesydow Date: Thu, 4 Aug 2022 10:06:57 +0100 Subject: [PATCH 9/9] Trigger CI