Skip to content

Instantly share code, notes, and snippets.

@dominiquesydow
Created April 19, 2021 05:25
Show Gist options
  • Select an option

  • Save dominiquesydow/11f002a03ccba8e7558e2d60f8f28a94 to your computer and use it in GitHub Desktop.

Select an option

Save dominiquesydow/11f002a03ccba8e7558e2d60f8f28a94 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# `kissim` demo"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Installation\n",
"\n",
"- At the moment via `pip` install in `conda` environment:\n",
"https://kissim.readthedocs.io/en/latest/installing.html\n",
"\n",
"- Ultimatively via `conda-forge`."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Get structure KLIFS IDs for example kinases"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Example kinases"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"kinase_names = [\"EGFR\", \"ErbB2\", \"BRAF\", \"CDK2\"]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Query local KILFS download"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"from opencadd.databases.klifs import setup_remote\n",
"klifs_session = setup_remote()"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th></th>\n",
" <th>structure.klifs_id</th>\n",
" <th>structure.pdb_id</th>\n",
" <th>structure.alternate_model</th>\n",
" <th>structure.chain</th>\n",
" <th>species.klifs</th>\n",
" <th>kinase.klifs_id</th>\n",
" <th>kinase.klifs_name</th>\n",
" <th>kinase.family</th>\n",
" <th>kinase.group</th>\n",
" <th>structure.pocket</th>\n",
" <th>...</th>\n",
" <th>structure.bp_ii_b_in</th>\n",
" <th>structure.bp_ii_out</th>\n",
" <th>structure.bp_ii_b</th>\n",
" <th>structure.bp_iii</th>\n",
" <th>structure.bp_iv</th>\n",
" <th>structure.bp_v</th>\n",
" <th>structure.grich_distance</th>\n",
" <th>structure.grich_angle</th>\n",
" <th>structure.grich_rotation</th>\n",
" <th>structure.filepath</th>\n",
" </tr>\n",
" <tr>\n",
" <th>kinase.klifs_name</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">BRAF</th>\n",
" <th>1330</th>\n",
" <td>8679</td>\n",
" <td>6b8u</td>\n",
" <td>-</td>\n",
" <td>A</td>\n",
" <td>Human</td>\n",
" <td>509</td>\n",
" <td>BRAF</td>\n",
" <td>&lt;NA&gt;</td>\n",
" <td>&lt;NA&gt;</td>\n",
" <td>QRIGSGSFGTVYKVAVKMLAFKNEVGVLRKTRVNILLFMGYAIVTQ...</td>\n",
" <td>...</td>\n",
" <td>False</td>\n",
" <td>True</td>\n",
" <td>False</td>\n",
" <td>True</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>18.645201</td>\n",
" <td>59.471500</td>\n",
" <td>30.828199</td>\n",
" <td>&lt;NA&gt;</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1331</th>\n",
" <td>3120</td>\n",
" <td>4h58</td>\n",
" <td>B</td>\n",
" <td>B</td>\n",
" <td>Human</td>\n",
" <td>509</td>\n",
" <td>BRAF</td>\n",
" <td>&lt;NA&gt;</td>\n",
" <td>&lt;NA&gt;</td>\n",
" <td>QRIGSGSFGTVYKVAVKMLAFKNEVGVLRKTRVNILLFMGYAIVTQ...</td>\n",
" <td>...</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>15.343800</td>\n",
" <td>51.058601</td>\n",
" <td>63.019199</td>\n",
" <td>&lt;NA&gt;</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">CDK2</th>\n",
" <th>0</th>\n",
" <td>4554</td>\n",
" <td>3my5</td>\n",
" <td>A</td>\n",
" <td>A</td>\n",
" <td>Human</td>\n",
" <td>198</td>\n",
" <td>CDK2</td>\n",
" <td>&lt;NA&gt;</td>\n",
" <td>&lt;NA&gt;</td>\n",
" <td>EKIGEGTYGVVYKVALKKITAIREISLLKELNPNIVKLLDVYLVFE...</td>\n",
" <td>...</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>16.611700</td>\n",
" <td>54.976398</td>\n",
" <td>69.569702</td>\n",
" <td>&lt;NA&gt;</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>3998</td>\n",
" <td>2btr</td>\n",
" <td>-</td>\n",
" <td>A</td>\n",
" <td>Human</td>\n",
" <td>198</td>\n",
" <td>CDK2</td>\n",
" <td>&lt;NA&gt;</td>\n",
" <td>&lt;NA&gt;</td>\n",
" <td>EKIGEGTYGVVYKVALKKITAIREISLLKELNPNIVKLLDVYLVFE...</td>\n",
" <td>...</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>14.785300</td>\n",
" <td>50.712200</td>\n",
" <td>59.492298</td>\n",
" <td>&lt;NA&gt;</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">EGFR</th>\n",
" <th>880</th>\n",
" <td>7511</td>\n",
" <td>5uga</td>\n",
" <td>B</td>\n",
" <td>A</td>\n",
" <td>Human</td>\n",
" <td>406</td>\n",
" <td>EGFR</td>\n",
" <td>&lt;NA&gt;</td>\n",
" <td>&lt;NA&gt;</td>\n",
" <td>KVLGSGAFGTVYKVAIKELEILDEAYVMASVDPHVCRLLGIQLIMQ...</td>\n",
" <td>...</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>16.777300</td>\n",
" <td>55.743401</td>\n",
" <td>49.054401</td>\n",
" <td>&lt;NA&gt;</td>\n",
" </tr>\n",
" <tr>\n",
" <th>881</th>\n",
" <td>782</td>\n",
" <td>3w33</td>\n",
" <td>A</td>\n",
" <td>A</td>\n",
" <td>Human</td>\n",
" <td>406</td>\n",
" <td>EGFR</td>\n",
" <td>&lt;NA&gt;</td>\n",
" <td>&lt;NA&gt;</td>\n",
" <td>KVLGSGAFGTVYKVAIKELEILDEAYVMASVDPHVCRLLGIQLITQ...</td>\n",
" <td>...</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>14.820200</td>\n",
" <td>48.159698</td>\n",
" <td>43.046001</td>\n",
" <td>&lt;NA&gt;</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">ErbB2</th>\n",
" <th>1322</th>\n",
" <td>9322</td>\n",
" <td>3rcd</td>\n",
" <td>-</td>\n",
" <td>B</td>\n",
" <td>Human</td>\n",
" <td>407</td>\n",
" <td>ErbB2</td>\n",
" <td>&lt;NA&gt;</td>\n",
" <td>&lt;NA&gt;</td>\n",
" <td>KVLGSGAFGTVYKVAIKVLEILDEAYVMAGVGPYVSRLLGIQLVTQ...</td>\n",
" <td>...</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>16.714100</td>\n",
" <td>53.271301</td>\n",
" <td>38.962399</td>\n",
" <td>&lt;NA&gt;</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1323</th>\n",
" <td>9324</td>\n",
" <td>3rcd</td>\n",
" <td>-</td>\n",
" <td>D</td>\n",
" <td>Human</td>\n",
" <td>407</td>\n",
" <td>ErbB2</td>\n",
" <td>&lt;NA&gt;</td>\n",
" <td>&lt;NA&gt;</td>\n",
" <td>KVLGSGAFGTVYKVAIKVLEILDEAYVMAGVGPYVSRLLGIQLVTQ...</td>\n",
" <td>...</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>16.752800</td>\n",
" <td>53.382099</td>\n",
" <td>38.729500</td>\n",
" <td>&lt;NA&gt;</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>8 rows × 41 columns</p>\n",
"</div>"
],
"text/plain": [
" structure.klifs_id structure.pdb_id \\\n",
"kinase.klifs_name \n",
"BRAF 1330 8679 6b8u \n",
" 1331 3120 4h58 \n",
"CDK2 0 4554 3my5 \n",
" 1 3998 2btr \n",
"EGFR 880 7511 5uga \n",
" 881 782 3w33 \n",
"ErbB2 1322 9322 3rcd \n",
" 1323 9324 3rcd \n",
"\n",
" structure.alternate_model structure.chain \\\n",
"kinase.klifs_name \n",
"BRAF 1330 - A \n",
" 1331 B B \n",
"CDK2 0 A A \n",
" 1 - A \n",
"EGFR 880 B A \n",
" 881 A A \n",
"ErbB2 1322 - B \n",
" 1323 - D \n",
"\n",
" species.klifs kinase.klifs_id kinase.klifs_name \\\n",
"kinase.klifs_name \n",
"BRAF 1330 Human 509 BRAF \n",
" 1331 Human 509 BRAF \n",
"CDK2 0 Human 198 CDK2 \n",
" 1 Human 198 CDK2 \n",
"EGFR 880 Human 406 EGFR \n",
" 881 Human 406 EGFR \n",
"ErbB2 1322 Human 407 ErbB2 \n",
" 1323 Human 407 ErbB2 \n",
"\n",
" kinase.family kinase.group \\\n",
"kinase.klifs_name \n",
"BRAF 1330 <NA> <NA> \n",
" 1331 <NA> <NA> \n",
"CDK2 0 <NA> <NA> \n",
" 1 <NA> <NA> \n",
"EGFR 880 <NA> <NA> \n",
" 881 <NA> <NA> \n",
"ErbB2 1322 <NA> <NA> \n",
" 1323 <NA> <NA> \n",
"\n",
" structure.pocket \\\n",
"kinase.klifs_name \n",
"BRAF 1330 QRIGSGSFGTVYKVAVKMLAFKNEVGVLRKTRVNILLFMGYAIVTQ... \n",
" 1331 QRIGSGSFGTVYKVAVKMLAFKNEVGVLRKTRVNILLFMGYAIVTQ... \n",
"CDK2 0 EKIGEGTYGVVYKVALKKITAIREISLLKELNPNIVKLLDVYLVFE... \n",
" 1 EKIGEGTYGVVYKVALKKITAIREISLLKELNPNIVKLLDVYLVFE... \n",
"EGFR 880 KVLGSGAFGTVYKVAIKELEILDEAYVMASVDPHVCRLLGIQLIMQ... \n",
" 881 KVLGSGAFGTVYKVAIKELEILDEAYVMASVDPHVCRLLGIQLITQ... \n",
"ErbB2 1322 KVLGSGAFGTVYKVAIKVLEILDEAYVMAGVGPYVSRLLGIQLVTQ... \n",
" 1323 KVLGSGAFGTVYKVAIKVLEILDEAYVMAGVGPYVSRLLGIQLVTQ... \n",
"\n",
" ... structure.bp_ii_b_in structure.bp_ii_out \\\n",
"kinase.klifs_name ... \n",
"BRAF 1330 ... False True \n",
" 1331 ... False False \n",
"CDK2 0 ... False False \n",
" 1 ... False False \n",
"EGFR 880 ... False False \n",
" 881 ... False False \n",
"ErbB2 1322 ... False False \n",
" 1323 ... False False \n",
"\n",
" structure.bp_ii_b structure.bp_iii structure.bp_iv \\\n",
"kinase.klifs_name \n",
"BRAF 1330 False True False \n",
" 1331 False False False \n",
"CDK2 0 False False False \n",
" 1 False False False \n",
"EGFR 880 False False False \n",
" 881 False False False \n",
"ErbB2 1322 False False False \n",
" 1323 False False False \n",
"\n",
" structure.bp_v structure.grich_distance \\\n",
"kinase.klifs_name \n",
"BRAF 1330 False 18.645201 \n",
" 1331 False 15.343800 \n",
"CDK2 0 False 16.611700 \n",
" 1 False 14.785300 \n",
"EGFR 880 False 16.777300 \n",
" 881 False 14.820200 \n",
"ErbB2 1322 False 16.714100 \n",
" 1323 False 16.752800 \n",
"\n",
" structure.grich_angle structure.grich_rotation \\\n",
"kinase.klifs_name \n",
"BRAF 1330 59.471500 30.828199 \n",
" 1331 51.058601 63.019199 \n",
"CDK2 0 54.976398 69.569702 \n",
" 1 50.712200 59.492298 \n",
"EGFR 880 55.743401 49.054401 \n",
" 881 48.159698 43.046001 \n",
"ErbB2 1322 53.271301 38.962399 \n",
" 1323 53.382099 38.729500 \n",
"\n",
" structure.filepath \n",
"kinase.klifs_name \n",
"BRAF 1330 <NA> \n",
" 1331 <NA> \n",
"CDK2 0 <NA> \n",
" 1 <NA> \n",
"EGFR 880 <NA> \n",
" 881 <NA> \n",
"ErbB2 1322 <NA> \n",
" 1323 <NA> \n",
"\n",
"[8 rows x 41 columns]"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"structures = klifs_session.structures.by_kinase_name(kinase_names)\n",
"structures = structures.groupby(\"kinase.klifs_name\").apply(lambda x: x.head(2))\n",
"structures"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[8679, 3120, 4554, 3998, 7511, 782, 9322, 9324]"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"structure_klifs_ids = structures[\"structure.klifs_id\"].to_list()\n",
"structure_klifs_ids"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Encode structures to fingerprints"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### CLI"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"usage: kissim encode [-h] -i INPUT [INPUT ...] -o OUTPUT [-l LOCAL]\n",
" [-c NCORES]\n",
"\n",
"optional arguments:\n",
" -h, --help show this help message and exit\n",
" -i INPUT [INPUT ...], --input INPUT [INPUT ...]\n",
" List of structure KLIFS IDs or path to txt file\n",
" containing structure KLIFS IDs.\n",
" -o OUTPUT, --output OUTPUT\n",
" Path to output json file containing fingerprint data.\n",
" -l LOCAL, --local LOCAL\n",
" Path to KLIFS download folder. If set local KLIFS data\n",
" is used, else remote KLIFS data.\n",
" -c NCORES, --ncores NCORES\n",
" Number of cores. If 1 fingerprint generation in\n",
" sequence, else in parallel.\n"
]
}
],
"source": [
"!kissim encode -h"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"INFO:opencadd.databases.klifs.api:Set up remote session...\n",
"INFO:opencadd.databases.klifs.api:Remote session is ready!\n",
"INFO:kissim.encoding.fingerprint_generator:GENERATE FINGERPRINTS\n",
"INFO:kissim.encoding.fingerprint_generator:Number of input structures: 8\n",
"INFO:kissim.encoding.fingerprint_generator:Fingerprint generation started at: 2021-04-19 07:19:38.273952\n",
"INFO:kissim.utils:Number of cores used: 4.\n",
"INFO:kissim.encoding.fingerprint_generator:8185: Generate fingerprint...\n",
"INFO:kissim.encoding.fingerprint_generator:8186: Generate fingerprint...\n",
"INFO:kissim.encoding.fingerprint_generator:9408: Generate fingerprint...\n",
"INFO:kissim.encoding.fingerprint_generator:9409: Generate fingerprint...\n",
"INFO:opencadd.structure.pocket.base:Pocket None (set pocket residues): The following input residues PDB IDs were assigned to the value None because they cannot be cast to an integer (residue PDB ID, residue index): [('_', 18), ('_', 50)]\n",
"INFO:opencadd.structure.pocket.base:Pocket None (set pocket residues): The following input residues PDB IDs were assigned to the value None because they cannot be cast to an integer (residue PDB ID, residue index): [('_', 18), ('_', 50)]\n",
"INFO:opencadd.structure.pocket.base:Pocket 9408 (set pocket residues): The following input residues PDB IDs were assigned to the value None because they cannot be cast to an integer (residue PDB ID, residue index): [(None, 18), (None, 50)]\n",
"INFO:opencadd.structure.pocket.base:Pocket 9409 (set pocket residues): The following input residues PDB IDs were assigned to the value None because they cannot be cast to an integer (residue PDB ID, residue index): [(None, 18), (None, 50)]\n",
"INFO:opencadd.structure.pocket.core:Pocket 9408: Missing pocket CA atoms. The pocket center is calculated based on 83 CA atoms (total number of pocket residues is 85).\n",
"INFO:kissim.encoding.fingerprint_generator:9427: Generate fingerprint...\n",
"INFO:opencadd.structure.pocket.core:Pocket 9409: Missing pocket CA atoms. The pocket center is calculated based on 83 CA atoms (total number of pocket residues is 85).\n",
"INFO:kissim.encoding.fingerprint_generator:9428: Generate fingerprint...\n",
"INFO:kissim.encoding.fingerprint_generator:4815: Generate fingerprint...\n",
"INFO:kissim.encoding.fingerprint_generator:4816: Generate fingerprint...\n",
"INFO:kissim.encoding.fingerprint_generator:Number of output fingerprints: 8\n",
"INFO:kissim.encoding.fingerprint_generator:Runtime: 0:00:05.922005\n",
"INFO:kissim.api.encode:Write fingerprints to file: fingerprints.json\n"
]
}
],
"source": [
"!kissim encode -i 8185 8186 9408 9409 9427 9428 4815 4816 -o fingerprints.json -c 4"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Python API (quick start)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "1137126cb23f4d6e9ff08f27af031e2d",
"version_major": 2,
"version_minor": 0
},
"text/plain": []
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from kissim.api import encode"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<function kissim.api.encode.encode(structure_klifs_ids, fingerprints_json_filepath=None, local_klifs_download_path=None, n_cores=1)>"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"encode"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<kissim.encoding.fingerprint_generator.FingerprintGenerator at 0x7fb3f80c1af0>"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"encode(structure_klifs_ids, n_cores=4)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Python API"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"from kissim.encoding import FingerprintGenerator"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"kissim.encoding.fingerprint_generator.FingerprintGenerator"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"FingerprintGenerator"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
"from opencadd.databases.klifs import setup_remote\n",
"klifs_session = setup_remote()"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 61.3 ms, sys: 33.4 ms, total: 94.7 ms\n",
"Wall time: 5.82 s\n"
]
}
],
"source": [
"%%time\n",
"fingerprint_generator = FingerprintGenerator.from_structure_klifs_ids(structure_klifs_ids, klifs_session, 4)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{8679: <kissim.encoding.fingerprint.Fingerprint at 0x7fb395d10940>,\n",
" 3120: <kissim.encoding.fingerprint.Fingerprint at 0x7fb395b66220>,\n",
" 4554: <kissim.encoding.fingerprint.Fingerprint at 0x7fb395b1dac0>,\n",
" 3998: <kissim.encoding.fingerprint.Fingerprint at 0x7fb395d10430>,\n",
" 7511: <kissim.encoding.fingerprint.Fingerprint at 0x7fb395bc2f10>,\n",
" 782: <kissim.encoding.fingerprint.Fingerprint at 0x7fb395bc2b20>,\n",
" 9322: <kissim.encoding.fingerprint.Fingerprint at 0x7fb395bc2f70>,\n",
" 9324: <kissim.encoding.fingerprint.Fingerprint at 0x7fb395b1d610>}"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fingerprint_generator.data"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<kissim.encoding.fingerprint.Fingerprint at 0x7fb395d10940>"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fingerprint_generator.data[8679]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Compare fingerprint pairs (all-against-all)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Generate feature distances"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
"from kissim.comparison import FeatureDistancesGenerator"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"kissim.comparison.feature_distances_generator.FeatureDistancesGenerator"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"FeatureDistancesGenerator"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [],
"source": [
"feature_distances_generator = FeatureDistancesGenerator.from_fingerprint_generator(fingerprint_generator, 4)"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>feature_type</th>\n",
" <th>feature_name</th>\n",
" <th>distance</th>\n",
" <th>bit_coverage</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>physicochemical</td>\n",
" <td>size</td>\n",
" <td>0.000000</td>\n",
" <td>1.00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>physicochemical</td>\n",
" <td>hbd</td>\n",
" <td>0.000000</td>\n",
" <td>1.00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>physicochemical</td>\n",
" <td>hba</td>\n",
" <td>0.000000</td>\n",
" <td>1.00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>physicochemical</td>\n",
" <td>charge</td>\n",
" <td>0.000000</td>\n",
" <td>1.00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>physicochemical</td>\n",
" <td>aromatic</td>\n",
" <td>0.000000</td>\n",
" <td>1.00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>physicochemical</td>\n",
" <td>aliphatic</td>\n",
" <td>0.000000</td>\n",
" <td>1.00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>physicochemical</td>\n",
" <td>sco</td>\n",
" <td>0.186667</td>\n",
" <td>0.88</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>physicochemical</td>\n",
" <td>exposure</td>\n",
" <td>0.376471</td>\n",
" <td>1.00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>distances</td>\n",
" <td>distance_to_centroid</td>\n",
" <td>0.127443</td>\n",
" <td>1.00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>distances</td>\n",
" <td>distance_to_hinge_region</td>\n",
" <td>0.119747</td>\n",
" <td>1.00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>distances</td>\n",
" <td>distance_to_dfg_region</td>\n",
" <td>0.178341</td>\n",
" <td>1.00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>distances</td>\n",
" <td>distance_to_front_pocket</td>\n",
" <td>0.126844</td>\n",
" <td>1.00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>moments</td>\n",
" <td>moment1</td>\n",
" <td>0.195272</td>\n",
" <td>1.00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>moments</td>\n",
" <td>moment2</td>\n",
" <td>0.042640</td>\n",
" <td>1.00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>moments</td>\n",
" <td>moment3</td>\n",
" <td>0.871815</td>\n",
" <td>1.00</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" feature_type feature_name distance bit_coverage\n",
"0 physicochemical size 0.000000 1.00\n",
"1 physicochemical hbd 0.000000 1.00\n",
"2 physicochemical hba 0.000000 1.00\n",
"3 physicochemical charge 0.000000 1.00\n",
"4 physicochemical aromatic 0.000000 1.00\n",
"5 physicochemical aliphatic 0.000000 1.00\n",
"6 physicochemical sco 0.186667 0.88\n",
"7 physicochemical exposure 0.376471 1.00\n",
"8 distances distance_to_centroid 0.127443 1.00\n",
"9 distances distance_to_hinge_region 0.119747 1.00\n",
"10 distances distance_to_dfg_region 0.178341 1.00\n",
"11 distances distance_to_front_pocket 0.126844 1.00\n",
"12 moments moment1 0.195272 1.00\n",
"13 moments moment2 0.042640 1.00\n",
"14 moments moment3 0.871815 1.00"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"feature_distances_generator.data[0].data"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Generate fingerprint distances"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [],
"source": [
"from kissim.comparison import FingerprintDistanceGenerator"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"kissim.comparison.fingerprint_distance_generator.FingerprintDistanceGenerator"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"FingerprintDistanceGenerator"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [],
"source": [
"fingerprint_distance_generator = FingerprintDistanceGenerator.from_feature_distances_generator(feature_distances_generator)"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th>structure2</th>\n",
" <th>782</th>\n",
" <th>3120</th>\n",
" <th>3998</th>\n",
" <th>4554</th>\n",
" <th>7511</th>\n",
" <th>8679</th>\n",
" <th>9322</th>\n",
" <th>9324</th>\n",
" </tr>\n",
" <tr>\n",
" <th>structure1</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>782</th>\n",
" <td>0.000000</td>\n",
" <td>0.248146</td>\n",
" <td>0.197639</td>\n",
" <td>0.243581</td>\n",
" <td>0.081592</td>\n",
" <td>0.287769</td>\n",
" <td>0.148486</td>\n",
" <td>0.147356</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3120</th>\n",
" <td>0.248146</td>\n",
" <td>0.000000</td>\n",
" <td>0.254233</td>\n",
" <td>0.192198</td>\n",
" <td>0.276061</td>\n",
" <td>0.148349</td>\n",
" <td>0.292056</td>\n",
" <td>0.289144</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3998</th>\n",
" <td>0.197639</td>\n",
" <td>0.254233</td>\n",
" <td>0.000000</td>\n",
" <td>0.126993</td>\n",
" <td>0.220072</td>\n",
" <td>0.289361</td>\n",
" <td>0.288083</td>\n",
" <td>0.286977</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4554</th>\n",
" <td>0.243581</td>\n",
" <td>0.192198</td>\n",
" <td>0.126993</td>\n",
" <td>0.000000</td>\n",
" <td>0.261044</td>\n",
" <td>0.277540</td>\n",
" <td>0.294829</td>\n",
" <td>0.291931</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7511</th>\n",
" <td>0.081592</td>\n",
" <td>0.276061</td>\n",
" <td>0.220072</td>\n",
" <td>0.261044</td>\n",
" <td>0.000000</td>\n",
" <td>0.307801</td>\n",
" <td>0.172333</td>\n",
" <td>0.171271</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8679</th>\n",
" <td>0.287769</td>\n",
" <td>0.148349</td>\n",
" <td>0.289361</td>\n",
" <td>0.277540</td>\n",
" <td>0.307801</td>\n",
" <td>0.000000</td>\n",
" <td>0.248805</td>\n",
" <td>0.246634</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9322</th>\n",
" <td>0.148486</td>\n",
" <td>0.292056</td>\n",
" <td>0.288083</td>\n",
" <td>0.294829</td>\n",
" <td>0.172333</td>\n",
" <td>0.248805</td>\n",
" <td>0.000000</td>\n",
" <td>0.004445</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9324</th>\n",
" <td>0.147356</td>\n",
" <td>0.289144</td>\n",
" <td>0.286977</td>\n",
" <td>0.291931</td>\n",
" <td>0.171271</td>\n",
" <td>0.246634</td>\n",
" <td>0.004445</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
"structure2 782 3120 3998 4554 7511 8679 \\\n",
"structure1 \n",
"782 0.000000 0.248146 0.197639 0.243581 0.081592 0.287769 \n",
"3120 0.248146 0.000000 0.254233 0.192198 0.276061 0.148349 \n",
"3998 0.197639 0.254233 0.000000 0.126993 0.220072 0.289361 \n",
"4554 0.243581 0.192198 0.126993 0.000000 0.261044 0.277540 \n",
"7511 0.081592 0.276061 0.220072 0.261044 0.000000 0.307801 \n",
"8679 0.287769 0.148349 0.289361 0.277540 0.307801 0.000000 \n",
"9322 0.148486 0.292056 0.288083 0.294829 0.172333 0.248805 \n",
"9324 0.147356 0.289144 0.286977 0.291931 0.171271 0.246634 \n",
"\n",
"structure2 9322 9324 \n",
"structure1 \n",
"782 0.148486 0.147356 \n",
"3120 0.292056 0.289144 \n",
"3998 0.288083 0.286977 \n",
"4554 0.294829 0.291931 \n",
"7511 0.172333 0.171271 \n",
"8679 0.248805 0.246634 \n",
"9322 0.000000 0.004445 \n",
"9324 0.004445 0.000000 "
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fingerprint_distance_generator.structure_distance_matrix()"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th>kinase2</th>\n",
" <th>BRAF</th>\n",
" <th>CDK2</th>\n",
" <th>EGFR</th>\n",
" <th>ErbB2</th>\n",
" </tr>\n",
" <tr>\n",
" <th>kinase1</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>BRAF</th>\n",
" <td>0.000000</td>\n",
" <td>0.192198</td>\n",
" <td>0.248146</td>\n",
" <td>0.246634</td>\n",
" </tr>\n",
" <tr>\n",
" <th>CDK2</th>\n",
" <td>0.192198</td>\n",
" <td>0.000000</td>\n",
" <td>0.197639</td>\n",
" <td>0.286977</td>\n",
" </tr>\n",
" <tr>\n",
" <th>EGFR</th>\n",
" <td>0.248146</td>\n",
" <td>0.197639</td>\n",
" <td>0.000000</td>\n",
" <td>0.147356</td>\n",
" </tr>\n",
" <tr>\n",
" <th>ErbB2</th>\n",
" <td>0.246634</td>\n",
" <td>0.286977</td>\n",
" <td>0.147356</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
"kinase2 BRAF CDK2 EGFR ErbB2\n",
"kinase1 \n",
"BRAF 0.000000 0.192198 0.248146 0.246634\n",
"CDK2 0.192198 0.000000 0.197639 0.286977\n",
"EGFR 0.248146 0.197639 0.000000 0.147356\n",
"ErbB2 0.246634 0.286977 0.147356 0.000000"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fingerprint_distance_generator.kinase_distance_matrix(by=\"minimum\")"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th>kinase2</th>\n",
" <th>BRAF</th>\n",
" <th>CDK2</th>\n",
" <th>EGFR</th>\n",
" <th>ErbB2</th>\n",
" </tr>\n",
" <tr>\n",
" <th>kinase1</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>BRAF</th>\n",
" <td>0.000000</td>\n",
" <td>0.265887</td>\n",
" <td>0.281915</td>\n",
" <td>0.268975</td>\n",
" </tr>\n",
" <tr>\n",
" <th>CDK2</th>\n",
" <td>0.265887</td>\n",
" <td>0.000000</td>\n",
" <td>0.231826</td>\n",
" <td>0.290007</td>\n",
" </tr>\n",
" <tr>\n",
" <th>EGFR</th>\n",
" <td>0.281915</td>\n",
" <td>0.231826</td>\n",
" <td>0.000000</td>\n",
" <td>0.159879</td>\n",
" </tr>\n",
" <tr>\n",
" <th>ErbB2</th>\n",
" <td>0.268975</td>\n",
" <td>0.290007</td>\n",
" <td>0.159879</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
"kinase2 BRAF CDK2 EGFR ErbB2\n",
"kinase1 \n",
"BRAF 0.000000 0.265887 0.281915 0.268975\n",
"CDK2 0.265887 0.000000 0.231826 0.290007\n",
"EGFR 0.281915 0.231826 0.000000 0.159879\n",
"ErbB2 0.268975 0.290007 0.159879 0.000000"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fingerprint_distance_generator.kinase_distance_matrix(by=\"median\")"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"import seaborn as sns"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 1080x288 with 6 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"structure_to_kinase_mapping = [\"minimum\", \"mean\", \"median\"]\n",
"n = len(structure_to_kinase_mapping)\n",
"fig, axes = plt.subplots(1, n, figsize=(5*n,4))\n",
"for i, by in enumerate(structure_to_kinase_mapping):\n",
" sns.heatmap(\n",
" fingerprint_distance_generator.kinase_distance_matrix(by), \n",
" linewidths=0, \n",
" annot=True, \n",
" square=True, cbar_kws={\"label\": f\"KiSSim kinase distances (by {by})\"}, \n",
" cmap=\"viridis\", \n",
" ax=axes[i]\n",
" )\n",
"plt.show()"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.6"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment