{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Data Curation" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# from IPython.display import display_html\n", "\n", "import logging\n", "import warnings\n", "import re\n", "import os\n", "import numpy as np\n", "import pandas as pd\n", "import pickle\n", "import pickle\n", "import requests\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "from rdkit import Chem\n", "from rdkit.Chem import AllChem\n", "from typing import Literal, Union, List, Dict, Any, Callable\n", "from collections import defaultdict\n", "from tqdm.auto import tqdm\n", "from rdkit import RDLogger\n", "\n", "RDLogger.DisableLog('rdApp.*')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Filter out some warnings..." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "def set_global_logging_level(level=logging.ERROR, prefices=[\"\"]):\n", " \"\"\"\n", " Override logging levels of different modules based on their name as a prefix.\n", " It needs to be invoked after the modules have been loaded so that their loggers have been initialized.\n", "\n", " Args:\n", " - level: desired level. e.g. logging.INFO. Optional. Default is logging.ERROR\n", " - prefices: list of one or more str prefices to match (e.g. [\"transformers\", \"torch\"]). Optional.\n", " Default is `[\"\"]` to match all active loggers.\n", " The match is a case-sensitive `module_name.startswith(prefix)`\n", " \"\"\"\n", " prefix_re = re.compile(fr'^(?:{ \"|\".join(prefices) })')\n", " for name in logging.root.manager.loggerDict:\n", " if re.match(prefix_re, name):\n", " logging.getLogger(name).setLevel(level)\n", "\n", "\n", "# Filter out annoying Pytorch Lightning printouts\n", "warnings.filterwarnings('ignore')\n", "warnings.filterwarnings(\n", " 'ignore', '.*Covariance of the parameters could not be estimated.*')\n", "warnings.filterwarnings(\n", " 'ignore', '.*You seem to be using the pipelines sequentially on GPU.*')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Setup working directories:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "data_dir = os.path.join(os.getcwd(), '..', 'data')\n", "src_dir = os.path.join(os.getcwd(), '..', 'src')\n", "fig_dir = os.path.join(data_dir, 'figures')\n", "checkpoint_dir = os.path.join(os.getcwd(), '..', 'checkpoints')\n", "dirs_to_make = [\n", " data_dir,\n", " os.path.join(data_dir, 'raw'),\n", " os.path.join(data_dir, 'processed'),\n", " fig_dir,\n", " # os.path.join(data_dir, 'train'),\n", " # os.path.join(data_dir, 'val'),\n", " # os.path.join(data_dir, 'test'),\n", " # src_dir,\n", " # checkpoint_dir,\n", "]\n", "for d in dirs_to_make:\n", " if not os.path.exists(d):\n", " os.makedirs(d)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Download or load the raw PROTAC-DB dataset:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Loaded protac.csv\n" ] } ], "source": [ "protacdb_file = os.path.join(data_dir, 'PROTAC-DB.csv')\n", "protacdb_url = 'http://cadd.zju.edu.cn/protacdb/statics/binaryDownload/csv/protac/protac.csv'\n", "if os.path.exists(protacdb_file):\n", " protac_df = pd.read_csv(protacdb_file).reset_index(drop=True)\n", " print(f'Loaded protac.csv')\n", "else:\n", " print(f'Downloading {protacdb_url}')\n", " !wget {protacdb_url} {protacdb_file}\n", " protac_df = pd.read_csv(protacdb_file).reset_index(drop=True)\n", " print(f'PROTAC-DB loaded')\n", "\n", "old2new = {\n", " 'E3 ligase': 'E3 Ligase',\n", "}\n", "protac_df = protac_df.rename(columns=old2new)" ] }, { "cell_type": "code", "execution_count": 5, "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", "
Compound IDTargetPercent degradation (%)Article DOIDC50 (nM)Dmax (%)Assay (DC50/Dmax)Assay (Percent degradation)
01BRD720/12 (WB)10.1021/acs.jmedchem.8b01413NaNNaNNaN% BRD7 degradation in HeLa cells after 4/16 h ...
11BRD919/30 (WB)10.1021/acs.jmedchem.8b01413NaNNaNNaN% BRD9 degradation in HeLa cells after 4/16 h ...
22BRD719/27 (WB)10.1021/acs.jmedchem.8b01413NaNNaNNaN% BRD7 degradation in HeLa cells after 4/16 h ...
32BRD95/21 (WB)10.1021/acs.jmedchem.8b01413NaNNaNNaN% BRD9 degradation in HeLa cells after 4/16 h ...
43BRD994/93 (WB)10.1021/acs.jmedchem.8b01413NaNNaNNaN% BRD9 degradation in HeLa cells after 4/16 h ...
\n", "
" ], "text/plain": [ " Compound ID Target Percent degradation (%) Article DOI \\\n", "0 1 BRD7 20/12 (WB) 10.1021/acs.jmedchem.8b01413 \n", "1 1 BRD9 19/30 (WB) 10.1021/acs.jmedchem.8b01413 \n", "2 2 BRD7 19/27 (WB) 10.1021/acs.jmedchem.8b01413 \n", "3 2 BRD9 5/21 (WB) 10.1021/acs.jmedchem.8b01413 \n", "4 3 BRD9 94/93 (WB) 10.1021/acs.jmedchem.8b01413 \n", "\n", " DC50 (nM) Dmax (%) Assay (DC50/Dmax) \\\n", "0 NaN NaN NaN \n", "1 NaN NaN NaN \n", "2 NaN NaN NaN \n", "3 NaN NaN NaN \n", "4 NaN NaN NaN \n", "\n", " Assay (Percent degradation) \n", "0 % BRD7 degradation in HeLa cells after 4/16 h ... \n", "1 % BRD9 degradation in HeLa cells after 4/16 h ... \n", "2 % BRD7 degradation in HeLa cells after 4/16 h ... \n", "3 % BRD9 degradation in HeLa cells after 4/16 h ... \n", "4 % BRD9 degradation in HeLa cells after 4/16 h ... " ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "PROTAC-DB scraped len: 6000\n" ] } ], "source": [ "scraped_protac_df = pd.read_csv(os.path.join(\n", " data_dir, 'PROTAC-DB-Scraped.csv'))\n", "# Rename columns\n", "old2new = {\n", " \"Assay (Percent degradation)\": \"Percent degradation (%)\",\n", " \"PROTAC to Target\": \"Assay (Percent degradation)\",\n", " \"DOI\": \"Article DOI\",\n", " \"DC50\": \"DC50 (nM)\",\n", " \"Dmax\": \"Dmax (%)\",\n", "}\n", "scraped_protac_df = scraped_protac_df.rename(columns=old2new)\n", "\n", "display(scraped_protac_df.head())\n", "print(f'PROTAC-DB scraped len: {len(scraped_protac_df)}')" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Merged df len: 5343\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Compound IDUniprotTargetE3 LigasePDBNameSmilesIC50 (nM, Protac to Target)Assay (Protac to Target, IC50)EC50 (nM, Protac to Target)...Rotatable Bond CountTopological Polar Surface AreaMolecular FormulaInChIInChI KeyPercent degradation (%)DC50 (nM)Dmax (%)Assay (DC50/Dmax)Assay (Percent degradation)
01Q9NPI1BRD7VHLNaNNaNCOC1=CC(C2=CN(C)C(=O)C3=CN=CC=C23)=CC(OC)=C1CN...NaNNaNNaN...19189.92C50H64N8O9SInChI=1S/C50H64N8O9S/c1-32-45(68-31-53-32)34-1...RPMQBLMPGMFXLD-PDUNVWSESA-N20/12 (WB)NaNNaNNaN% BRD7 degradation in HeLa cells after 4/16 h ...
11Q9H8M2BRD9VHLNaNNaNCOC1=CC(C2=CN(C)C(=O)C3=CN=CC=C23)=CC(OC)=C1CN...NaNNaNNaN...19189.92C50H64N8O9SInChI=1S/C50H64N8O9S/c1-32-45(68-31-53-32)34-1...RPMQBLMPGMFXLD-PDUNVWSESA-N19/30 (WB)NaNNaNNaN% BRD9 degradation in HeLa cells after 4/16 h ...
22Q9NPI1BRD7VHLNaNNaNCOC1=CC(C2=CN(C)C(=O)C3=CN=CC=C23)=CC(OC)=C1CN...NaNNaNNaN...25208.38C54H72N8O11SInChI=1S/C54H72N8O11S/c1-36-49(74-35-57-36)38-...NGWWVKZONFCNQP-SHPBXJAASA-N19/27 (WB)NaNNaNNaN% BRD7 degradation in HeLa cells after 4/16 h ...
32Q9H8M2BRD9VHLNaNNaNCOC1=CC(C2=CN(C)C(=O)C3=CN=CC=C23)=CC(OC)=C1CN...NaNNaNNaN...25208.38C54H72N8O11SInChI=1S/C54H72N8O11S/c1-36-49(74-35-57-36)38-...NGWWVKZONFCNQP-SHPBXJAASA-N5/21 (WB)NaNNaNNaN% BRD9 degradation in HeLa cells after 4/16 h ...
43Q9H8M2BRD9CRBNNaNNaNCOC1=CC(C2=CN(C)C(=O)C3=CN=CC=C23)=CC(OC)=C1CN...NaNNaNNaN...18202.97C43H50N8O10InChI=1S/C43H50N8O10/c1-48-24-31(28-9-10-44-23...RMBNUDOJPQLHMV-UHFFFAOYSA-N94/93 (WB)NaNNaNNaN% BRD9 degradation in HeLa cells after 4/16 h ...
\n", "

5 rows × 89 columns

\n", "
" ], "text/plain": [ " Compound ID Uniprot Target E3 Ligase PDB Name \\\n", "0 1 Q9NPI1 BRD7 VHL NaN NaN \n", "1 1 Q9H8M2 BRD9 VHL NaN NaN \n", "2 2 Q9NPI1 BRD7 VHL NaN NaN \n", "3 2 Q9H8M2 BRD9 VHL NaN NaN \n", "4 3 Q9H8M2 BRD9 CRBN NaN NaN \n", "\n", " Smiles \\\n", "0 COC1=CC(C2=CN(C)C(=O)C3=CN=CC=C23)=CC(OC)=C1CN... \n", "1 COC1=CC(C2=CN(C)C(=O)C3=CN=CC=C23)=CC(OC)=C1CN... \n", "2 COC1=CC(C2=CN(C)C(=O)C3=CN=CC=C23)=CC(OC)=C1CN... \n", "3 COC1=CC(C2=CN(C)C(=O)C3=CN=CC=C23)=CC(OC)=C1CN... \n", "4 COC1=CC(C2=CN(C)C(=O)C3=CN=CC=C23)=CC(OC)=C1CN... \n", "\n", " IC50 (nM, Protac to Target) Assay (Protac to Target, IC50) \\\n", "0 NaN NaN \n", "1 NaN NaN \n", "2 NaN NaN \n", "3 NaN NaN \n", "4 NaN NaN \n", "\n", " EC50 (nM, Protac to Target) ... Rotatable Bond Count \\\n", "0 NaN ... 19 \n", "1 NaN ... 19 \n", "2 NaN ... 25 \n", "3 NaN ... 25 \n", "4 NaN ... 18 \n", "\n", " Topological Polar Surface Area Molecular Formula \\\n", "0 189.92 C50H64N8O9S \n", "1 189.92 C50H64N8O9S \n", "2 208.38 C54H72N8O11S \n", "3 208.38 C54H72N8O11S \n", "4 202.97 C43H50N8O10 \n", "\n", " InChI \\\n", "0 InChI=1S/C50H64N8O9S/c1-32-45(68-31-53-32)34-1... \n", "1 InChI=1S/C50H64N8O9S/c1-32-45(68-31-53-32)34-1... \n", "2 InChI=1S/C54H72N8O11S/c1-36-49(74-35-57-36)38-... \n", "3 InChI=1S/C54H72N8O11S/c1-36-49(74-35-57-36)38-... \n", "4 InChI=1S/C43H50N8O10/c1-48-24-31(28-9-10-44-23... \n", "\n", " InChI Key Percent degradation (%) DC50 (nM) Dmax (%) \\\n", "0 RPMQBLMPGMFXLD-PDUNVWSESA-N 20/12 (WB) NaN NaN \n", "1 RPMQBLMPGMFXLD-PDUNVWSESA-N 19/30 (WB) NaN NaN \n", "2 NGWWVKZONFCNQP-SHPBXJAASA-N 19/27 (WB) NaN NaN \n", "3 NGWWVKZONFCNQP-SHPBXJAASA-N 5/21 (WB) NaN NaN \n", "4 RMBNUDOJPQLHMV-UHFFFAOYSA-N 94/93 (WB) NaN NaN \n", "\n", " Assay (DC50/Dmax) Assay (Percent degradation) \n", "0 NaN % BRD7 degradation in HeLa cells after 4/16 h ... \n", "1 NaN % BRD9 degradation in HeLa cells after 4/16 h ... \n", "2 NaN % BRD7 degradation in HeLa cells after 4/16 h ... \n", "3 NaN % BRD9 degradation in HeLa cells after 4/16 h ... \n", "4 NaN % BRD9 degradation in HeLa cells after 4/16 h ... \n", "\n", "[5 rows x 89 columns]" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Merge scraped data with PROTAC-DB on Compound ID and get non-assay columns\n", "param_cols = [\n", " \"Percent degradation (%)\",\n", " \"Dmax (%)\",\n", " \"DC50 (nM)\",\n", " \"Assay (Percent degradation)\",\n", " \"Assay (DC50/Dmax)\",\n", "]\n", "cols = [c for c in protac_df.columns if c not in param_cols]\n", "on_cols = [c for c in scraped_protac_df.columns if c not in param_cols]\n", "scraped_protac_df = protac_df[cols].merge(\n", " scraped_protac_df,\n", " on=on_cols,\n", ").drop_duplicates()\n", "print(f'Merged df len: {len(scraped_protac_df)}')\n", "scraped_protac_df.head()" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "362\n", "737\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", "
Percent degradation (%)Assay (Percent degradation)
020/12 (WB)% BRD7 degradation in HeLa cells after 4/16 h ...
119/30 (WB)% BRD9 degradation in HeLa cells after 4/16 h ...
219/27 (WB)% BRD7 degradation in HeLa cells after 4/16 h ...
35/21 (WB)% BRD9 degradation in HeLa cells after 4/16 h ...
494/93 (WB)% BRD9 degradation in HeLa cells after 4/16 h ...
.........
486154 (WB)% JAK3 degradation in MHH-CALL-4 cells at 100 nM
486342 (WB)% JAK3 degradation in MHH-CALL-4 cells at 100 nM
48641/32/69/19 (WB)% JAK2 degradation in MHH-CALL-4 cells at 1/10...
48810/30/30/53/29 (WB)% EGFR del19 degradation in HCC827 cells at 5/...
488210/7/7/27/34 (WB)% EGFR EGFR L858R/T790M degradation in H1975 c...
\n", "

334 rows × 2 columns

\n", "
" ], "text/plain": [ " Percent degradation (%) \\\n", "0 20/12 (WB) \n", "1 19/30 (WB) \n", "2 19/27 (WB) \n", "3 5/21 (WB) \n", "4 94/93 (WB) \n", "... ... \n", "4861 54 (WB) \n", "4863 42 (WB) \n", "4864 1/32/69/19 (WB) \n", "4881 0/30/30/53/29 (WB) \n", "4882 10/7/7/27/34 (WB) \n", "\n", " Assay (Percent degradation) \n", "0 % BRD7 degradation in HeLa cells after 4/16 h ... \n", "1 % BRD9 degradation in HeLa cells after 4/16 h ... \n", "2 % BRD7 degradation in HeLa cells after 4/16 h ... \n", "3 % BRD9 degradation in HeLa cells after 4/16 h ... \n", "4 % BRD9 degradation in HeLa cells after 4/16 h ... \n", "... ... \n", "4861 % JAK3 degradation in MHH-CALL-4 cells at 100 nM \n", "4863 % JAK3 degradation in MHH-CALL-4 cells at 100 nM \n", "4864 % JAK2 degradation in MHH-CALL-4 cells at 1/10... \n", "4881 % EGFR del19 degradation in HCC827 cells at 5/... \n", "4882 % EGFR EGFR L858R/T790M degradation in H1975 c... \n", "\n", "[334 rows x 2 columns]" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "print(len(scraped_protac_df.dropna(\n", " subset=['DC50 (nM)', 'Dmax (%)']).dropna(how='all')))\n", "print(len(scraped_protac_df.dropna(\n", " subset=['Percent degradation (%)']).dropna(how='all')))\n", "\n", "tmp = scraped_protac_df.dropna(subset=['Percent degradation (%)'])\n", "\n", "tmp[tmp['Percent degradation (%)'].str.contains(\n", " 'WB')][['Percent degradation (%)', 'Assay (Percent degradation)']].drop_duplicates()" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "protac_pedia_df len: 1203\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
PROTACDB IDPROTAC SMILESActive/InactiveBest PROTACCellscLogPCommentsCuratorDc50Dmax...Proteomics Data AvailableSecondary PubmedStatusTargetTested A Non Binding E3 ControlTested Competition With LigandTested Engagement In CellsTested Proteaseome InhibitorTimeTPSA
01Cc1ncsc1-c1ccc([C@H](C)NC(=O)[C@@H]2C[C@@H](O)...InactiveNoMOLT-410.83732IC50's are for cell viability assaysRonen GabizonNaNNaN...NoNaNReviewedQ07817NoNoNoNo48251.07
12Cc1ncsc1-c1ccc([C@H](C)NC(=O)[C@@H]2C[C@@H](O)...InactiveNoMOLT-411.22742IC50's are for cell viability assaysRonen GabizonNaNNaN...NoNaNReviewedQ07817NoNoNoNo48251.07
23Cc1ncsc1-c1ccc([C@H](C)NC(=O)[C@@H]2C[C@@H](O)...InactiveNoMOLT-411.61752IC50's are for cell viability assaysRonen GabizonNaNNaN...NoNaNReviewedQ07817NoNoNoNo48251.07
34Cc1ncsc1-c1ccc([C@H](C)NC(=O)[C@@H]2C[C@@H](O)...ActiveNoMOLT-412.00762IC50's are for cell viability assaysRonen GabizonNaNNaN...NoNaNReviewedQ07817NoNoNoNo48251.07
45Cc1ncsc1-c1ccc([C@H](C)NC(=O)[C@@H]2C[C@@H](O)...ActiveNoMOLT-412.39772IC50's are for cell viability assaysRonen Gabizon53 nM~ 100 %...NoNaNReviewedQ07817NoNoYesNo48251.07
\n", "

5 rows × 43 columns

\n", "
" ], "text/plain": [ " PROTACDB ID PROTAC SMILES \\\n", "0 1 Cc1ncsc1-c1ccc([C@H](C)NC(=O)[C@@H]2C[C@@H](O)... \n", "1 2 Cc1ncsc1-c1ccc([C@H](C)NC(=O)[C@@H]2C[C@@H](O)... \n", "2 3 Cc1ncsc1-c1ccc([C@H](C)NC(=O)[C@@H]2C[C@@H](O)... \n", "3 4 Cc1ncsc1-c1ccc([C@H](C)NC(=O)[C@@H]2C[C@@H](O)... \n", "4 5 Cc1ncsc1-c1ccc([C@H](C)NC(=O)[C@@H]2C[C@@H](O)... \n", "\n", " Active/Inactive Best PROTAC Cells cLogP \\\n", "0 Inactive No MOLT-4 10.83732 \n", "1 Inactive No MOLT-4 11.22742 \n", "2 Inactive No MOLT-4 11.61752 \n", "3 Active No MOLT-4 12.00762 \n", "4 Active No MOLT-4 12.39772 \n", "\n", " Comments Curator Dc50 Dmax ... \\\n", "0 IC50's are for cell viability assays Ronen Gabizon NaN NaN ... \n", "1 IC50's are for cell viability assays Ronen Gabizon NaN NaN ... \n", "2 IC50's are for cell viability assays Ronen Gabizon NaN NaN ... \n", "3 IC50's are for cell viability assays Ronen Gabizon NaN NaN ... \n", "4 IC50's are for cell viability assays Ronen Gabizon 53 nM ~ 100 % ... \n", "\n", " Proteomics Data Available Secondary Pubmed Status Target \\\n", "0 No NaN Reviewed Q07817 \n", "1 No NaN Reviewed Q07817 \n", "2 No NaN Reviewed Q07817 \n", "3 No NaN Reviewed Q07817 \n", "4 No NaN Reviewed Q07817 \n", "\n", " Tested A Non Binding E3 Control Tested Competition With Ligand \\\n", "0 No No \n", "1 No No \n", "2 No No \n", "3 No No \n", "4 No No \n", "\n", " Tested Engagement In Cells Tested Proteaseome Inhibitor Time TPSA \n", "0 No No 48 251.07 \n", "1 No No 48 251.07 \n", "2 No No 48 251.07 \n", "3 No No 48 251.07 \n", "4 Yes No 48 251.07 \n", "\n", "[5 rows x 43 columns]" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_file = os.path.join(data_dir, 'PROTAC-Pedia.csv')\n", "protac_pedia_df = pd.read_csv(df_file)\n", "print(f'protac_pedia_df len: {len(protac_pedia_df)}')\n", "protac_pedia_df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Utilities" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[-100.0, -5.0, nan, 90.317, 1000.0, nan]\n", "[0.0]\n", "[96.0, 73.0]\n", "[1.0, 3.14]\n" ] } ], "source": [ "def clean_string(s: str) -> str:\n", " \"\"\" Clean a string by removing <, >, =, NaN, and ranges like 100-200.\n", " Args:\n", " s(str): string to clean\n", " Returns:\n", " str: cleaned string\n", " \"\"\"\n", " if pd.isnull(s) or s in {'nan', 'n/a', 'NaN', ''}:\n", " return np.nan\n", " if 'N.D.' in s:\n", " return '0'\n", " s = s.strip('(WB)').strip()\n", " # # Combine regex operations for efficiency\n", " # s = re.sub(r'[<=>]|NaN|[\\d]+[-~]', '', s) # Remove <, >, =, NaN, and ranges like 100-200\n", " # Remove <, >, =, NaN\n", " s = re.sub(r'[<=>]|NaN', '', s)\n", " # Replace ranges like 100-200 or 1~3 with the left-most value in the range\n", " s = re.sub(r'\\b(\\d+)[-~]\\d+\\b', r'\\1', s)\n", " # Replace (n/a) with nan\n", " s = s.replace('(n/a)', 'nan')\n", " s = re.sub(r'[~<=>% ]', '', s) # Remove ~, <, >, =, % and spaces\n", " return s\n", "\n", "\n", "def split_clean_str(s: str, return_floats: bool = False) -> Union[List[str], List[float]]:\n", " \"\"\" Split a string by '/' and clean each part.\n", " Args:\n", " s(str): string to split\n", " return_floats(bool): whether to return floats or strings\n", " Returns:\n", " list: list of cleaned strings or floats\n", " \"\"\"\n", " if pd.isnull(s) or s in {'nan', 'n/a', 'NaN', ''}:\n", " return np.nan\n", " cleaned_values = [clean_string(part.strip())\n", " for part in s.replace('(n/a)', 'nan').split('/')]\n", " return [float(value) if return_floats else value for value in cleaned_values]\n", "\n", "\n", "print(split_clean_str('-100-200/-5/(n/a)/<=90.317/>1000/NaN', return_floats=True))\n", "print(split_clean_str('N.D.', return_floats=True))\n", "print(split_clean_str('96/73 (WB)', return_floats=True))\n", "print(split_clean_str('1.0~3/3.14', return_floats=True))" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "True\n", "False\n" ] } ], "source": [ "def is_active(DC50: float, Dmax: float, oring=False) -> bool:\n", " \"\"\" Check if a PROTAC is active based on DC50 and Dmax.\t\n", " Args:\n", " DC50(float): DC50 in nM\n", " Dmax(float): Dmax in %\n", " Returns:\n", " bool: True if active, False if inactive, np.nan if either DC50 or Dmax is NaN\n", " \"\"\"\n", " pDC50 = -np.log10(DC50 * 1e-9) if pd.notnull(DC50) else np.nan\n", " Dmax = Dmax / 100\n", " if pd.notnull(pDC50):\n", " if pDC50 < 7.0:\n", " return False\n", " if pd.notnull(Dmax):\n", " if Dmax < 0.8:\n", " return False\n", " if oring:\n", " if pd.notnull(pDC50):\n", " return True if pDC50 >= 7.0 else False\n", " elif pd.notnull(Dmax):\n", " return True if Dmax >= 0.8 else False\n", " else:\n", " return np.nan\n", " else:\n", " if pd.notnull(pDC50) and pd.notnull(Dmax):\n", " return True if pDC50 >= 7.0 and Dmax >= 0.8 else False\n", " else:\n", " return np.nan\n", "\n", "\n", "print(is_active(20, 80))\n", "print(is_active(100, 70))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Clean PROTAC-Pedia" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "# Rename columns in PROTAC-Pedia dataframe\n", "old2new = {\n", " \"Cells\": \"Cell Type\",\n", " \"MW\": \"Molecular Weight\",\n", " \"TPSA\": \"Topological Polar Surface Area\",\n", " \"Time\": \"Treatment Time (h)\",\n", " \"Dc50\": \"DC50 (nM)\",\n", " \"Dmax\": \"Dmax (%)\",\n", " \"Hbond acceptors\": \"Hydrogen Bond Acceptor Count\",\n", " \"Hbond donors\": \"Hydrogen Bond Donor Count\",\n", " \"PROTACDB ID\": \"Compound ID\",\n", " \"PROTAC SMILES\": \"Smiles\",\n", " 'Target': 'Uniprot',\n", "}\n", "protac_pedia_df = protac_pedia_df.rename(columns=old2new)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "# Rename Cereblon to CRBN in E3 Ligase column\n", "protac_pedia_df['E3 Ligase'] = protac_pedia_df['E3 Ligase'].replace(\n", " 'Cereblon', 'CRBN')\n", "protac_pedia_df['E3 Ligase'] = protac_pedia_df['E3 Ligase'].str.replace('Iap', 'IAP')" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of rows with single cell types: 925\n" ] } ], "source": [ "# Get all rows that do not contain \", \" nor \"; \" in \"Cell Type\" column\n", "multiple_cells_idx = protac_pedia_df['Cell Type'].str.contains(\n", " ', |; |\\sand\\s|/', regex=True, na=False,\n", ")\n", "nan_comments_idx = protac_pedia_df['Comments'].isna()\n", "protac_pedia_df[multiple_cells_idx & ~\n", " nan_comments_idx][['Compound ID', 'Cell Type', 'Comments', 'DC50 (nM)', 'Dmax (%)']].to_csv(\n", " os.path.join(data_dir, 'processed', 'multiple_cell_types.csv'), index=False)\n", "\n", "multiple_cells_df = protac_pedia_df[multiple_cells_idx].copy()\n", "\n", "protac_pedia_df = protac_pedia_df[~multiple_cells_idx]\n", "print(f'Number of rows with single cell types: {len(protac_pedia_df)}')" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Index(['Compound ID', 'Smiles', 'Active/Inactive', 'Best PROTAC', 'Cell Type',\n", " 'cLogP', 'Comments', 'Curator', 'DC50 (nM)', 'Dmax (%)',\n", " 'E3 Binder SMILES', 'E3 Ligase', 'Ec50 of Ligand Cells',\n", " 'Ec50 of PROTAC Cells', 'exit_vector', 'Hydrogen Bond Acceptor Count',\n", " 'Hydrogen Bond Donor Count', 'Ic50 of Ligand', 'Ic50 of PROTAC',\n", " 'Ligand Name', 'Ligand SMILES', 'Linker', 'Linker Type', 'linker_ha',\n", " 'linker_no', 'linker_rb', 'Molecular Weight', 'Off Targets Reported',\n", " 'PATENT', 'Ligand PDB', 'Ligand ID', 'Pubmed', 'PROTAC Name',\n", " 'Proteomics Data Available', 'Secondary Pubmed', 'Status', 'Uniprot',\n", " 'Tested A Non Binding E3 Control', 'Tested Competition With Ligand',\n", " 'Tested Engagement In Cells', 'Tested Proteaseome Inhibitor',\n", " 'Treatment Time (h)', 'Topological Polar Surface Area'],\n", " dtype='object')" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "multiple_cells_df.columns" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "RS4;11, MOLM-13\n", "MV4-11, MOLM-13, KG1\n", "MOLT-4, MOLM14\n", "MOLM14, MV4-11\n", "Panc02.13, H23, A549, H1792, H2110, HCC827\n", "NAMALWA, XLA\n", "MV4;11, SUM149, SUM159, MOLM13, MM1.SCRBN−/−, MM1.SW\n", "MV4;11, 293FT, 293FTCRBN−/−\n", "MV-4-11 SK-MEL-5, NCI-H1568\n", "HeLa, DLBCL\n", "Jurkat and Panc Tu‐I\n", "HeLa, Mino, Jeko-1, HUVEC, MDA-MB-231, MM.1S\n", "Hela, MM.1S\n", "HeLa, MV4;11, A549\n", "AML cells, CRBN-/-\n", "SU-DHL-1 and NCI-H2228\n", "MCF-7, MM.1S\n", "DU145/Cy\n", "PC3, MDA-MB-231\n", "Namalwa, CA-46, Ramos\n", "HBL1, Ramos, Mino, IgE MM\n", "Ramos, THP-1\n", "MV4-11, MOLM-14\n", "MDA-MB-231, HeLa\n", "HEK293, CAMA-1, ZR-75-1\n", "MiaPaCa2, HPNE\n", "MCF-7, MDA-MB-231, HepG2, LO2, B16\n", "Karpas 422,ULA, SUDHL4, OCI-Ly1, Ramos\n", "SR, H2228, NCI–H69, NCI–H1688, NCI–H446\n", "OVCAR8 (WT EGFR), HeLa (EGFR Exon 20 Ins), SKBr3 (HER2)\n", "HCC827 (Exon 19 del), H3255 (L858R)\n", "MDA-MB-231, GTL16\n", "RS4;11, MV4;11, MOLM-13,\n", "MCF-7, U2OS, MDA-MB-231, MDA-MB-435, Flag-Cdc20, MDA-MB-231, 22Rv1, LNCaP\n", "Hella, RI-1\n", "Hella, RI-1, EOL-1, A-204\n", "MM1S, HEK293T, CRBNY384A/W386A\n", "Molm-16, SU-DHL-1\n", "RS4;11, MV4;11\n", "LNCaP, VCaP, and 22Rv\n", "MV4-11, Molm-13\n", "Mino, Ramos\n", "MCF7, A549\n", "HOP62/INC-H23\n", "E14 mouse embryonic stem cells; Human colon cancer cell line HCT116\n", "Pancreatic cancer cell lines BxPC-3; MIA PaCa-2\n", "KYSE520 esophageal cancer cell line; MV4;11 cell line\n", "HeLa, HL60, MV4;11\n", "HeLa, HEK293, U2OS\n", "MDA-MB-231, A549, A549/DDP, HUVEC\n", "HeLa, HEK293\n", "231MFP breast cancer cells, HeLa\n", "K562, A549, HCT116, MCF-7, HEK293T\n", "MM1S; Mouse 4935 cells\n", "PC9; HCC827; H1975\n", "T47D, BT474, MDAMB231, MCF7, HS578T, LS180, HCT116, HCT15, DLD1, SW480, LOVO, SW620, HEL, KCL22, THP1, K562, ML2, NOMO1, MONOMAC6, MOLM13, LAMA84, SHI1, MV411, KU812, KG1, KBM7, HL60, BV173, HUH7, NCIH460, A549, NCIH2228, PC9, NCIH446, HELA, T98G, MCF10A, HAP1, DU145, PC3, LNCaP, A375, LOXIMVI\n", "5W1573; NCI-H2030; NCI-H358; HCT116; MIA-PaCa-2\n", "Fibroblasts from patients; HeLa\n", "SU-DHL-1; H3122\n", "IgEMM; hTERT-RPE1; HeLa; Jurkat; RPMI8226; MM.1S\n", "Jurkat; Molt4; Granta-519; Mino; Jeko; Rec1; Maver\n", "Mice primary Sertoli cells and primary Germ cells\n", "Ba/F3; H1975\n", "Ba/F3\n", "HT1080, IMR-32, MCF-7\n", "HT1080, IMR-32\n", "BxPC3, DLD-1, HCT-116, MDA-MB-231, A549, PC-9\n", "MDA-MB-231; K562\n", "MOLT4; BT549; HCC1806; COV362; Kuramochi; OVCAR8\n", "SRD15; Huh7\n", "SW480, HCT116\n", "K562, BaF3\n", "BBL358, T47D\n", "A549; H1299; B16-F10; MDAMB231; Jurkat\n" ] } ], "source": [ "for c in multiple_cells_df['Cell Type'].unique():\n", " print(c)" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Direct degration studies in this paper only conducted for first and final compounds; during the med chem campaign cell viability was used as the read out. Complex structure with the ligand was modeled based on 4Z93. IC50 of the ligand is between 2nM and 7nM, depending on which BRD. DC50 is between 3nM-10nM.\n", "RS4;11, MOLM-13\n", "100 %\n", "< 10 nM\n", "--------------------\n", "General kinase PROTAC, DCmax is for the most degraded kinase. IC50 of the ligand is for 193 kinases in the panel. IC50 of the PROTAC is by FLT3 kinase activity.\n", "MOLT-4, MOLM14\n", "> 85 %\n", "< 100 nM\n", "--------------------\n", "DC50 is 9.1 nM (WT BTK, NAMALWA cells), 14.6 nM (WT BTK, XLA cells), 14.9 nM (C481S, XLA cells). IC50 of PROTAC is 46.9 (WT BTK), 20.9 (C481S). IC50 of ligand is 51.0 nM (WT BTK), 30.7 (C481S)\n", "NAMALWA, XLA\n", "> 99 %\n", "< 14.9 nM\n", "--------------------\n", "EC50 of PROTAC is 28nM in MV-4-11, 68nM in NCI-H1568. DC50 is (SMARCA2 6nM, SMARCA4 11nM, PBRM1 32nM in MV-4-11; SMARCA2 3.3nM, PBRM1 15.6nM in NCI-H1568)\n", "MV-4-11 SK-MEL-5, NCI-H1568\n", "nan\n", "< 32 nM\n", "--------------------\n", "DC50 value is for HeLa cells. DC50 is 0.61 uM for DLBCL cells. DMAX value is for HeLa cells. DMAX is 96 % for DLBCL cells.\n", "HeLa, DLBCL\n", "92 %\n", "0.79 uM\n", "--------------------\n", "proteomics of PDEdelta degradation show upregulation of enzymes involved in lipid metabolism - deltasonamide 1 also causes this. Dmax was measured in Panc-Tu-1 cell line. DC50 is 83.4% (24 h, Panc-Tu-1), 85% (24 h, 1 uM, Jurkat). IC50 Deltasonamide 1 is 203 pM, and of the Bn derivative is 8 nM.\n", "Jurkat and Panc Tu‐I\n", "> 83.4 %\n", "48 nM\n", "--------------------\n", "DC50 is 1-3nM\n", "HeLa, MV4;11, A549\n", "100 %\n", "< 3 nM\n", "--------------------\n", "DC50 is 10-30nM\n", "HeLa, MV4;11, A549\n", "99 %\n", "< 30 nM\n", "--------------------\n", "competition with ligand only slightly rescued protein degradation. EC50 of ligand and PROTAC is measured on SUDHL-1 cell line. DC50 is SU-DHL-1: 3 ± 1 nM, NCI-H2228: 34 ± 9 nM.\n", "SU-DHL-1 and NCI-H2228\n", "> 90 %\n", "< 34 nM\n", "--------------------\n", "competition with ligand only slightly rescued protein degradation. EC50 of ligand and PROTAC is measured on SUDHL-1 cell line. DC50 is SU-DHL-1: 11 ± 2 nM, NCI-H2228: 59 ± 16 nM.\n", "SU-DHL-1 and NCI-H2228\n", "> 90 %\n", "< 59 nM\n", "--------------------\n", "\n", "\n", "DC50 and Dmax are for MCF-7 cells\n", "MCF-7, MM.1S\n", "70.5 %\n", "34 nM\n", "--------------------\n", "also degrades ibrutinib-resistant C481S BTK. DC50 is 6.3 nM (HBL1), 8.5 nM (Ramos), 9.2 nM (Mino), 11.4 nM (IgE MM)\n", "HBL1, Ramos, Mino, IgE MM\n", "94 %\n", "< 11.4 nM\n", "--------------------\n", "Ligand name is from PMID 24068666. DCmax is 18-33%\n", "Ramos, THP-1\n", "< 33 %\n", "nan\n", "--------------------\n", "Ligand name is from PMID 24068666. DCmax is 15-34%\n", "Ramos, THP-1\n", "< 34 %\n", "nan\n", "--------------------\n", "Ligand name is from PMID 24068666. DCmax is 36-64%. DC50 is 1487 - 1994.5 nM.\n", "Ramos, THP-1\n", "< 64 %\n", "< 1994.5 nM\n", "--------------------\n", "Ligand name is from PMID 24068666. DCmax is 68-85%. DC50 is 36.9 - 398.5 nM.\n", "Ramos, THP-1\n", "> 68 %\n", "< 398.5 nM\n", "--------------------\n", "Ligand name is from PMID 24068666. DCmax is 63-84%. DC50 is 21.8 - 469.9 nM.\n", "Ramos, THP-1\n", "> 63 %\n", "< 469.9 nM\n", "--------------------\n", "Ligand name is from PMID 24068666. DCmax is 75-87%. DC50 is 4.5 - 90.5 nM.\n", "Ramos, THP-1\n", "> 75 %\n", "< 90.5 nM\n", "--------------------\n", "Ligand name is from PMID 24068666. DCmax is 71-85%. DC50 is 5.9 - 217.7 nM.\n", "Ramos, THP-1\n", "> 71 %\n", "< 217.7 nM\n", "--------------------\n", "Ligand name is from PMID 24068666. DCmax is 80-87%. DC50 is 1.1 - 37.4 nM.\n", "Ramos, THP-1\n", "> 80 %\n", "< 37.4 nM\n", "--------------------\n", "\n", "\n", "Ligand name is from PMID 24068666. DCmax is 70-85%. DC50 is 9.7 - 184.1 nM.\n", "Ramos, THP-1\n", "> 70 %\n", "< 184.1 nM\n", "--------------------\n", "DC50 error ± 1.0 nM. DMAX error ± 1.1 %.\n", "MDA-MB-231, HeLa\n", "99.6 %\n", "9.5 nM\n", "--------------------\n", "DC50 error ± 81.3 nM. DMAX error ± 10.1 %.\n", "MDA-MB-231, HeLa\n", "34.5 %\n", "45.9 nM\n", "--------------------\n", "DC50 is for WT EGFR. DC50 for EGFR Exon 20 Ins is 736.2 nM. DMAX is for WT EGFR. DMAX for EGFR Exon 20 Ins is 68.8 %.\n", "OVCAR8 (WT EGFR), HeLa (EGFR Exon 20 Ins), SKBr3 (HER2)\n", "97.6 %\n", "39.2 nM\n", "--------------------\n", "DC50 is for EGFR (Exon 19 del). DC50 for EGFR (L858R) 22.3 nM. DMAX is for EGFR (Exon 19 del). DMAX for EGFR (L858R) 96.6 %.\n", "HCC827 (Exon 19 del), H3255 (L858R)\n", "98.9 %\n", "11.7 nM\n", "--------------------\n", "DC50 is 1.76 nM and 4.5 nM\n", "Hella, RI-1, EOL-1, A-204\n", "90 %\n", "< 4.5 nM\n", "--------------------\n", "DC50 is 0.86nM in LNCaP, 0.76 in VCaP and 10.4 nM at 1uM in 22Rv1. EC50 in cells is 0.25nM for LNCaP, 0.34 nM for VCaP, 183nM for 22Rv1.\n", "LNCaP, VCaP, and 22Rv\n", "> 95 %\n", "< 10.4 nM\n", "--------------------\n", "XD2-149 was initially designed to degrade STAT3. However, experiments showed that XD2-149 down-regulate STAT3 level in a proteasome-independent manner. Proteomics data revealed that an E3 ligase, ZFP91, was the true substrate for this PROTAC. This paper reported a total of 22 PROTACs, which differed from each other in linker design and E3 binder choices (pomalidomide/thalidomide/lenalidomide). However, the authors didn't mention whether the remaining 21 molecules could degrade ZFP91 or not. It is also interesting that pomalidomide itself can induce the degradation of CRBN neo-substrates like ZFP91 (DC50: 0.42uM, 5-fold less potent than XD2-149), since pomalidomide can remodel CRBN surface for binding proteins like ZFP91 (Nat Med., 2019, doi: 10.1038/s41591-019-0668-z).\n", "Pancreatic cancer cell lines BxPC-3; MIA PaCa-2\n", "> 90 %\n", "~ 70 nM\n", "--------------------\n", "DC50 for KYSE520 cell: 6.0nM;DC50 for MV4;11 cell: 2.6nM; EC50 for KYSE520 cell: 0.66uM; EC50 for MV4;11 cell: 9.9nM;\n", "KYSE520 esophageal cancer cell line; MV4;11 cell line\n", "100 %\n", "6.0 nM\n", "--------------------\n", "pEC50 for MV4;11 and HL60 cells: 6.75±0.03 and 5.84±0.06, respectively.\n", "pDC50 for Brd4 short/Brd4 long/Brd3/Brd2: 7.0/7.0/6.5/6.2, respectively (24h, HeLa cells).\n", "Dmax for Brd4 short/Brd4 long/Brd3/Brd2: 96%/97%/97%/93%, respectively (HeLa cells).\n", "HeLa, HL60, MV4;11\n", "> 93 %\n", "< 0.1 uM\n", "--------------------\n", "\n", "\n", "pEC50 for MV4;11 and HL60 cells: 7.57±0.03 and 6.66±0.05, respectively. pDC50 for Brd4 short/Brd4 long/Brd3/Brd2: 8.1/8.6/7.0/7.4, respectively (24h, HeLa cells). Dmax for Brd4 short/Brd4 long/Brd3/Brd2: 98%/100%/100%/98%, respectively (HeLa cells).\n", "HeLa, HL60, MV4;11\n", "> 98 %\n", "< 2.5 nM\n", "--------------------\n", "pEC50 for MV4;11 and HL60 cells: 6.91±0.04 and 5.90±0.05, respectively. pDC50 for Brd4 short/Brd4 long/Brd3/Brd2: 8.4/8.0/6.5/6.7, respectively (24h, HeLa cells). Dmax for Brd4 short/Brd4 long/Brd3/Brd2: 99%/100%/99%/97%, respectively (HeLa cells).\n", "HeLa, HL60, MV4;11\n", "> 97 %\n", "< 4 nM\n", "--------------------\n", "pEC50 for MV4;11 and HL60 cells: 7.77±0.06 and 7.46±0.03, respectively. pDC50 for Brd4 short/Brd4 long/Brd3/Brd2: 9.2/9.0/9.1/8.2, respectively (24h, HeLa cells). Dmax for Brd4 short/Brd4 long/Brd3/Brd2: 97%/100%/98%/83%, respectively (HeLa cells).\n", "HeLa, HL60, MV4;11\n", "> 83 %\n", "< 1 nM\n", "--------------------\n", "pEC50 for MV4;11 and HL60 cells: 6.24±0.05 and 6.17±0.03, respectively. pDC50 for Brd4 short/Brd4 long/Brd3/Brd2: 6.9/6.7/6.8/NA, respectively (24h, HeLa cells). Dmax for Brd4 short/Brd4 long/Brd3/Brd2: 94%/78%/74%/37%, respectively (HeLa cells).\n", "HeLa, HL60, MV4;11\n", "nan\n", "~ 0.1 uM\n", "--------------------\n", "pEC50 for MV4;11 and HL60 cells: 7.31±0.03 and 6.57±0.02, respectively. pDC50 for Brd4 short/Brd4 long/Brd3/Brd2: 8.1/7.6/7.3/NA, respectively (24h, HeLa cells). Dmax for Brd4 short/Brd4 long/Brd3/Brd2: 98%/95%/91%/43%, respectively (HeLa cells).\n", "HeLa, HL60, MV4;11\n", "> 90 %\n", "~ 7.9 nM\n", "--------------------\n", "pEC50 for MV4;11 and HL60 cells: 7.08±0.05 and 6.37±0.03, respectively. pDC50 for Brd4 short/Brd4 long/Brd3/Brd2: 8.1/7.5/7.7/NA, respectively (24h, HeLa cells). Dmax for Brd4 short/Brd4 long/Brd3/Brd2: 95%/93%/92%/26%, respectively (HeLa cells).\n", "HeLa, HL60, MV4;11\n", "> 90 %\n", "~ 7.9 nM\n", "--------------------\n", "Reported DC50 and Dmax above are in HeLa cells. DC50 for HEK293 cells: 230nM; Dmax for HEK293 cells: 98%. 14a can degrade VHL at higher concentration. See Target UniprotID P40337 for details.\n", "HeLa, HEK293\n", "88 %\n", "200 nM\n", "--------------------\n", "EC50/DC50/Dmax reported above were obtained using NCI-H2030 cells. DC50: 0.25~0.76uM; Dmax: ~75%-90%, specific value depends on the cell line.\n", "5W1573; NCI-H2030; NCI-H358; HCT116; MIA-PaCa-2\n", "~ 80 %\n", "0.59 uM\n", "--------------------\n", "38\n" ] } ], "source": [ "cnt = 0\n", "for i, row in multiple_cells_df.dropna(subset=['Comments', 'Cell Type', 'Dmax (%)', 'DC50 (nM)'], how='all').iterrows():\n", " if pd.isnull(row['Comments']):\n", " continue\n", " if 'DC' in row['Comments'].upper() or 'max' in row['Comments'].upper():\n", " cnt += 1\n", " print(row['Comments'])\n", " print(row['Cell Type'])\n", " print(row['Dmax (%)'])\n", " print(row['DC50 (nM)'])\n", " print('-' * 20)\n", " if cnt % 10 == 0:\n", " print('\\n')\n", "print(cnt)" ] }, { "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", "
Cell TypeCommentsDmax (%)DC50 (nM)
105RS4;11, MOLM-13Direct degration studies in this paper only co...100 %< 10 nM
106RS4;11, MOLM-13Complex structure with the ligand was modeled ...100 %< 1 nM
107RS4;11, MOLM-13Complex structure with the ligand was modeled ...100 %< 1 nM
108RS4;11, MOLM-13Complex structure with the ligand was modeled ...NaN~ 3 nM
109RS4;11, MOLM-13Complex structure with the ligand was modeled ...NaN~ 10 nM
...............
1182A549; H1299; B16-F10; MDAMB231; JurkatNaNNaNNaN
1185A549; H1299; B16-F10; MDAMB231; JurkatNaNNaNNaN
1194A549; H1299; B16-F10; MDAMB231; JurkatNaNNaNNaN
1195A549; H1299; B16-F10; MDAMB231; JurkatNaNNaNNaN
1198A549; H1299; B16-F10; MDAMB231; JurkatNaNNaNNaN
\n", "

278 rows × 4 columns

\n", "
" ], "text/plain": [ " Cell Type \\\n", "105 RS4;11, MOLM-13 \n", "106 RS4;11, MOLM-13 \n", "107 RS4;11, MOLM-13 \n", "108 RS4;11, MOLM-13 \n", "109 RS4;11, MOLM-13 \n", "... ... \n", "1182 A549; H1299; B16-F10; MDAMB231; Jurkat \n", "1185 A549; H1299; B16-F10; MDAMB231; Jurkat \n", "1194 A549; H1299; B16-F10; MDAMB231; Jurkat \n", "1195 A549; H1299; B16-F10; MDAMB231; Jurkat \n", "1198 A549; H1299; B16-F10; MDAMB231; Jurkat \n", "\n", " Comments Dmax (%) DC50 (nM) \n", "105 Direct degration studies in this paper only co... 100 % < 10 nM \n", "106 Complex structure with the ligand was modeled ... 100 % < 1 nM \n", "107 Complex structure with the ligand was modeled ... 100 % < 1 nM \n", "108 Complex structure with the ligand was modeled ... NaN ~ 3 nM \n", "109 Complex structure with the ligand was modeled ... NaN ~ 10 nM \n", "... ... ... ... \n", "1182 NaN NaN NaN \n", "1185 NaN NaN NaN \n", "1194 NaN NaN NaN \n", "1195 NaN NaN NaN \n", "1198 NaN NaN NaN \n", "\n", "[278 rows x 4 columns]" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "multiple_cells_df[['Cell Type', 'Comments', 'Dmax (%)', 'DC50 (nM)']]" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "def convert_mole_to_nM(s: str) -> float:\n", " \"\"\" Clean a string by removing <, >, =, NaN, and ranges like 100-200. Then convert to nM.\n", " Args:\n", " s(str): string to clean\n", " Returns:\n", " float: cleaned string\n", " \"\"\"\n", " s = clean_string(str(s))\n", " if pd.isnull(s) or s in {'nan', 'n/a', 'NaN', ''}:\n", " return np.nan\n", " if 'nM' in s:\n", " return float(s.replace('nM', '').strip())\n", " elif 'uM' in s:\n", " tmp = float(s.replace('uM', '').strip())\n", " # Convert from uM to nM\n", " return float(tmp) * 1e3\n", " else:\n", " return float(s) * 1e9\n", "\n", "\n", "protac_pedia_df['DC50 (nM)'] = protac_pedia_df['DC50 (nM)'].apply(\n", " convert_mole_to_nM)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "protac_pedia_df['Dmax (%)'] = protac_pedia_df['Dmax (%)'].apply(\n", " lambda s: float(clean_string(s)))" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Non-Nan Active: 297\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjsAAAHFCAYAAAAUpjivAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAzRElEQVR4nO3de1xVZd7///dWEJCARJSDImC3xzBLSYtpRjyhllZaox1Hy5rKdDJ1Gs1pBGv0zu7MRs3umRs1y1MnzSbHQjPT0FJGS/PUAU8jRCgnk1Dh+v3Rj/1tB2jghr25ej0fj/UY97WutdZnXTDsd9daa2+HMcYIAADAUo08XQAAAEBdIuwAAACrEXYAAIDVCDsAAMBqhB0AAGA1wg4AALAaYQcAAFiNsAMAAKxG2AEAAFYj7ABebPHixXI4HNqxY0eV6wcPHqzY2FiXttjYWI0aNapGx8nIyFBKSooKCgpqV+gv0MqVK3X55ZcrICBADodDu3btuuA2a9askcPhUPPmzVVaWlqr454+fVopKSn64IMPKq2r+H05dOhQrfYN2IqwA1hm1apVeuKJJ2q0TUZGhlJTUwk7P9O3336ru+++W5dddpnWrVunrVu3qn379hfcLi0tTZJ08uRJrV69ulbHPn36tFJTU6sMOzfccIO2bt2qyMjIWu0bsJWPpwsA4F5XXXWVp0uosbNnz8rhcMjHp2H8STp48KDOnj2ru+66S7169fpZ2+Tk5Gjt2rXq06ePMjIylJaWphEjRri1rhYtWqhFixZu3SdgA2Z2AMv89DJWeXm5nnrqKXXo0EEBAQG69NJLdcUVV+j555+XJKWkpOiPf/yjJCkuLk4Oh0MOh8M5c1BeXq5Zs2apY8eO8vPzU8uWLfW73/1Ox44dczmuMUYzZsxQTEyM/P39lZCQoPT0dCUlJSkpKcnZ74MPPpDD4dDLL7+siRMnqlWrVvLz89OXX36pb7/9VmPGjFHnzp11ySWXqGXLlurTp482b97scqxDhw7J4XDomWee0dNPP63Y2FgFBAQoKSnJGUQmT56sqKgohYSEaOjQocrNzf1Z47dmzRpde+21atq0qYKCgtS/f39t3brVuX7UqFG67rrrJEkjRoyQw+FwOb/qvPTSSzp37pweffRRDRs2TBs2bNDhw4cr9SsoKNDEiRPVtm1b53hff/312r9/vw4dOuQMM6mpqc6fVcXP+6eXscaPH6/AwEAVFRVVOs6IESMUHh6us2fPOttWrlypa6+9VoGBgbrkkks0YMAA7dy582eNG+DNCDtAA1BWVqZz585VWowxF9x21qxZSklJ0e2336533nlHK1eu1OjRo52XrO677z6NGzdOkvTmm29q69at2rp1q7p16yZJeuihh/SnP/1J/fv315o1a/Tkk09q3bp1SkxMVF5envM4U6dO1dSpUzVw4EC99dZbevDBB3Xffffp4MGDVdY1ZcoUHTlyRC+++KLefvtttWzZUidPnpQkTZs2Te+8844WLVqktm3bKikpqcrLNvPnz9dHH32k+fPn6//+7/+0f/9+DRkyRKNHj9a3336rhQsXatasWVq/fr3uu+++C47VsmXLdNNNNyk4OFjLly9XWlqa8vPzlZSUpC1btkiSnnjiCc2fP1+SNGPGDG3dulUvvPDCBfe9cOFCRUZGatCgQbr33ntVXl6uxYsXu/QpLi7Wddddp//93//VPffco7ffflsvvvii2rdvr+zsbEVGRmrdunWSpNGjRzt/VtVdtrz33nt1+vRpvfrqqy7tBQUFeuutt3TXXXfJ19fXeS633367OnfurFdffVUvv/yyiouL9etf/1p79+694PkBXs0A8FqLFi0yks67xMTEuGwTExNjRo4c6Xw9ePBgc+WVV573OM8884yRZLKyslza9+3bZySZMWPGuLR//PHHRpJ5/PHHjTHGnDx50vj5+ZkRI0a49Nu6dauRZHr16uVs27hxo5FkfvOb31zw/M+dO2fOnj1r+vbta4YOHepsz8rKMpJM165dTVlZmbN9zpw5RpK58cYbXfYzfvx4I8kUFhZWe6yysjITFRVlunTp4rLP4uJi07JlS5OYmFjpHF577bULnoMxxnz44YdGkpk8ebIxxpjy8nITFxdnYmJiTHl5ubPf9OnTjSSTnp5e7b6+/fZbI8lMmzat0rqK35cf/xy7devmUrsxxrzwwgtGktm9e7cxxpgjR44YHx8fM27cOJd+xcXFJiIiwgwfPvxnnSfgrZjZARqAJUuWaPv27ZWWissp59OjRw99+umnGjNmjN59990qL2lUZ+PGjZJU6emuHj16qFOnTtqwYYMkadu2bSotLdXw4cNd+l1zzTWVnharcMstt1TZ/uKLL6pbt27y9/eXj4+PfH19tWHDBu3bt69S3+uvv16NGv2/P2OdOnWS9MONuj9W0X7kyJFqzlQ6cOCAjh8/rrvvvttln5dccoluueUWbdu2TadPn652+/OpuDH53nvvlSTnpafDhw87x1CS/vWvf6l9+/bq169frY5TlXvuuUcZGRk6cOCAs23RokW6+uqrFR8fL0l69913de7cOf3ud79zmTn09/dXr169qpxVAxoSwg7QAHTq1EkJCQmVlpCQkAtuO2XKFP3P//yPtm3bpkGDBql58+bq27dvtY+z/9iJEyckqcqne6KiopzrK/43PDy8Ur+q2qrb5+zZs/XQQw+pZ8+eeuONN7Rt2zZt375dAwcOVElJSaX+oaGhLq+bNGly3vbvv/++ylp+fA7VnWt5ebny8/Or3b46xcXFeu2119SjRw+1aNFCBQUFKigo0NChQ+VwOJxBSPrhKa/WrVvX+Bjnc+edd8rPz895yWzv3r3avn277rnnHmefb775RpJ09dVXy9fX12VZuXKly+VKoCFqGI8+AKg1Hx8fTZgwQRMmTFBBQYHWr1+vxx9/XAMGDNDRo0fVtGnTardt3ry5JCk7O7vSm/Dx48cVFhbm0q/iTfPHcnJyqpzdcTgcldpeeeUVJSUlacGCBS7txcXF5z9JN/jxuf7U8ePH1ahRIzVr1qzG+12+fLlOnz6tTz75pMrtV61apfz8fDVr1kwtWrSodOP3xWrWrJluuukmLVmyRE899ZQWLVokf39/3X777c4+FT/H119/XTExMW49PuANmNkBfkEuvfRS3XrrrXr44Yd18uRJ51M7fn5+klRp9qRPnz6SfgghP7Z9+3bt27dPffv2lST17NlTfn5+WrlypUu/bdu2VfnEUXUcDoezlgqfffaZy9NQdaVDhw5q1aqVli1b5nLj93fffac33njD+YRWTaWlpSkoKEgbNmzQxo0bXZZnnnlGpaWlWrp0qSRp0KBBOnjwoN5///1q91fdz+p87rnnHh0/flxr167VK6+8oqFDh+rSSy91rh8wYIB8fHz01VdfVTmDmJCQUOPzBrwJMzuA5YYMGaL4+HglJCSoRYsWOnz4sObMmaOYmBi1a9dOktSlSxdJ0vPPP6+RI0fK19dXHTp0UIcOHfT73/9ec+fOVaNGjTRo0CAdOnRITzzxhKKjo/Xoo49K+uGy0YQJEzRz5kw1a9ZMQ4cO1bFjx5SamqrIyEiXe2DOZ/DgwXryySc1bdo09erVSwcOHND06dMVFxenc+fO1c0A/f8aNWqkWbNm6c4779TgwYP1wAMPqLS0VM8884wKCgr03//93zXe5549e/TJJ5/ooYcecgbHH/vVr36lZ599VmlpaRo7dqzGjx+vlStX6qabbtLkyZPVo0cPlZSUaNOmTRo8eLB69+6toKAgxcTE6K233lLfvn0VGhqqsLCwau+NkqTk5GS1bt1aY8aMUU5OjsslLOmHjyuYPn26pk6dqq+//loDBw5Us2bN9M033+iTTz5RYGCgUlNTa3z+gNfw9B3SAKpX8XTN9u3bq1x/ww03XPBprGeffdYkJiaasLAw06RJE9OmTRszevRoc+jQIZftpkyZYqKiokyjRo2MJLNx40ZjzA9PKT399NOmffv2xtfX14SFhZm77rrLHD161GX78vJy89RTT5nWrVubJk2amCuuuML885//NF27dnV5kup8TzKVlpaaSZMmmVatWhl/f3/TrVs3s3r1ajNy5EiX86x4GuuZZ55x2b66fV9oHH9s9erVpmfPnsbf398EBgaavn37mo8++uhnHeenKp4C27VrV7V9Jk+ebCSZzMxMY4wx+fn55pFHHjFt2rQxvr6+pmXLluaGG24w+/fvd26zfv16c9VVVxk/Pz8jyfnzrupprAqPP/64kWSio6Ndnjb76bn37t3bBAcHGz8/PxMTE2NuvfVWs379+vOeJ+DtHMb8jA/qAIBayMrKUseOHTVt2jQ9/vjjni4HwC8UYQeAW3z66adavny5EhMTFRwcrAMHDmjWrFkqKirSnj17qn0qCwDqGvfsAHCLwMBA7dixQ2lpaSooKFBISIiSkpL017/+laADwKOY2QEAAFbj0XMAAGA1wg4AALAaYQcAAFiNG5QllZeX6/jx4woKCqryI+wBAID3McaouLhYUVFR5//wUg9+xo+ZMWOGSUhIMJdccolp0aKFuemmm1w+OMsYY0aOHGkkuSw9e/Z06fP999+bsWPHmubNm5umTZuaIUOGVPrAs/M5evRopWOwsLCwsLCwNIzlQu/5Hp3Z2bRpkx5++GFdffXVOnfunKZOnark5GTt3btXgYGBzn4DBw7UokWLnK8rvsG4wvjx4/X2229rxYoVat68uSZOnKjBgwcrMzNTjRs3vmAdQUFBkqSjR48qODjYTWcHAADq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//53PVfe8NR0rCsUFBSYtm3bmuTkZNO1a9f6KbYBq80433jjjaZnz54mPT3dZGVlmY8//th89NFH9Vh1w1PTcd68ebNp1KiRef75583XX39tNm/ebC6//HJz880313PlDcvatWvN1KlTzRtvvGEkmVWrVp23vyfeCwk7F6FHjx7mwQcfdGnr2LGjmTx5cpX9H3vsMdOxY0eXtgceeMBcc801dVajDWo6zlXp3LmzSU1NdXdp1qntWI8YMcL8+c9/NtOmTSPs/Aw1Hed//etfJiQkxJw4caI+yrNGTcf5mWeeMW3btnVp+9vf/mZat25dZzXa5ueEHU+8F3IZq5bOnDmjzMxMJScnu7QnJycrIyOjym22bt1aqf+AAQO0Y8cOnT17ts5qbchqM84/VV5eruLiYoWGhtZFidao7VgvWrRIX331laZNm1bXJVqhNuO8Zs0aJSQkaNasWWrVqpXat2+vSZMmqaSkpD5KbpBqM86JiYk6duyY1q5dK2OMvvnmG73++uu64YYb6qPkXwxPvBda8wnK9S0vL09lZWWVvlk9PDy80jewV8jJyamy/7lz55SXl6fIyMg6q7ehqs04/9Szzz6r7777TsOHD6+LEq1Rm7H+4osvNHnyZG3evFk+Pvw5+TlqM85ff/21tmzZIn9/f61atUp5eXkaM2aMTp48yX071ajNOCcmJmrp0qUaMWKEvv/+e507d0433nij5s6dWx8l/2J44r2QmZ2L5HA4XF4bYyq1Xah/Ve1wVdNxrrB8+XKlpKRo5cqVatmyZV2VZ5WfO9ZlZWW64447lJqaqvbt29dXedaoye90eXm5HA6Hli5dqh49euj666/X7NmztXjxYmZ3LqAm47x371794Q9/0F/+8hdlZmZq3bp1ysrK4kul60B9vxfyn2K1FBYWpsaNG1f6L4Tc3NxKibVCRERElf19fHzUvHnzOqu1IavNOFdYuXKlRo8erddee039+vWryzKtUNOxLi4u1o4dO7Rz506NHTtW0g9vysYY+fj46L333lOfPn3qpfaGpDa/05GRkWrVqpVCQkKcbZ06dZIxRseOHVO7du3qtOaGqDbjPHPmTP3qV7/SH//4R0nSFVdcocDAQP3617/WU089xey7m3jivZCZnVpq0qSJunfvrvT0dJf29PR0JSYmVrnNtddeW6n/e++9p4SEBPn6+tZZrQ1ZbcZZ+mFGZ9SoUVq2bBnX23+mmo51cHCwdu/erV27djmXBx98UB06dNCuXbvUs2fP+iq9QanN7/SvfvUrHT9+XKdOnXK2HTx4UI0aNVLr1q3rtN6GqjbjfPr0aTVq5Pq22LhxY0n/b+YBF88j74V1duvzL0DFY41paWlm7969Zvz48SYwMNAcOnTIGGPM5MmTzd133+3sX/G43aOPPmr27t1r0tLSePT8Z6jpOC9btsz4+PiY+fPnm+zsbOdSUFDgqVNoMGo61j/F01g/T03Hubi42LRu3drceuut5vPPPzebNm0y7dq1M/fdd5+nTqFBqOk4L1q0yPj4+JgXXnjBfPXVV2bLli0mISHB9OjRw1On0CAUFxebnTt3mp07dxpJZvbs2Wbnzp3OR/y94b2QsHOR5s+fb2JiYkyTJk1Mt27dzKZNm5zrRo4caXr16uXS/4MPPjBXXXWVadKkiYmNjTULFiyo54obppqMc69evYykSsvIkSPrv/AGqKa/0z9G2Pn5ajrO+/btM/369TMBAQGmdevWZsKECeb06dP1XHXDU9Nx/tvf/mY6d+5sAgICTGRkpLnzzjvNsWPH6rnqhmXjxo3n/ZvrDe+FDmOYmwMAAPbinh0AAGA1wg4AALAaYQcAAFiNsAMAAKxG2AEAAFYj7AAAAKsRdgAAgNUIOwB+ERYvXqxLL73U02UA8ADCDgCvlZGRocaNG2vgwIE12i42NlZz5sxxaRsxYoQOHjzoxuoANBSEHQBea+HChRo3bpy2bNmiI0eOXNS+AgIC1LJlSzdVBqAhIewA8ErfffedXn31VT300EMaPHiwFi9e7LJ+zZo1SkhIkL+/v8LCwjRs2DBJUlJSkg4fPqxHH31UDodDDodDkutlrAMHDsjhcGj//v0u+5w9e7ZiY2Od33C9d+9eXX/99brkkksUHh6uu+++W3l5eXV74gDcjrADwCutXLlSHTp0UIcOHXTXXXdp0aJFzhDyzjvvaNiwYbrhhhu0c+dObdiwQQkJCZKkN998U61bt9b06dOVnZ2t7OzsSvvu0KGDunfvrqVLl7q0L1u2THfccYccDoeys7PVq1cvXXnlldqxY4fWrVunb775RsOHD6/7kwfgVj6eLgAAqpKWlqa77rpLkjRw4ECdOnVKGzZsUL9+/fTXv/5Vt912m1JTU539u3btKkkKDQ1V48aNFRQUpIiIiGr3f+edd2revHl68sknJUkHDx5UZmamlixZIklasGCBunXrphkzZji3WbhwoaKjo3Xw4EG1b9/e7ecMoG4wswPA6xw4cECffPKJbrvtNkmSj4+PRowYoYULF0qSdu3apb59+17UMW677TYdPnxY27ZtkyQtXbpUV155pTp37ixJyszM1MaNG3XJJZc4l44dO0qSvvrqq4s6NoD6xcwOAK+Tlpamc+fOqVWrVs42Y4x8fX2Vn5+vgICAiz5GZGSkevfurWXLlumaa67R8uXL9cADDzjXl5eXa8iQIXr66aer3BZAw0HYAeBVzp07pyVLlujZZ59VcnKyy7pbbrlFS5cu1RVXXKENGzbonnvuqXIfTZo0UVlZ2QWPdeedd+pPf/qTbr/9dn311VfOmSRJ6tatm9544w3FxsbKx4c/lUBDxmUsAF7ln//8p/Lz8zV69GjFx8e7LLfeeqvS0tI0bdo0LV++XNOmTdO+ffu0e/duzZo1y7mP2NhYffjhh/rPf/5z3qenhg0bpqKiIj300EPq3bu3y0zSww8/rJMnT+r222/XJ598oq+//lrvvfee7r333p8VpAB4D8IOAK+Slpamfv36KSQkpNK6W265Rbt27VJwcLBee+01rVmzRldeeaX69Omjjz/+2Nlv+vTpOnTokC677DK1aNGi2mMFBwdryJAh+vTTT3XnnXe6rIuKitJHH32ksrIyDRgwQPHx8XrkkUcUEhKiRo340wk0JA5T8SwnAACAhfjPEwAAYDXCDgAAsBphBwAAWI2wAwAArEbYAQAAViPsAAAAqxF2AACA1Qg7AADAaoQdAABgNcIOAACwGmEHAABYjbADAACs9v8BaWKkNsPfoWEAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "protac_pedia_df['Active'] = protac_pedia_df.apply(\n", " lambda row: is_active(row['DC50 (nM)'], row['Dmax (%)']),\n", " axis=1,\n", ")\n", "\n", "protac_pedia_df['Active'] = protac_pedia_df.apply(\n", " lambda row: row['Active/Inactive'] if pd.isnull(\n", " row['Active']) and row['Active/Inactive'] == False else row['Active'],\n", " axis=1,\n", ")\n", "\n", "print(\n", " f'Non-Nan Active: {len(protac_pedia_df[protac_pedia_df[\"Active\"].notnull()])}')\n", "\n", "# Histogram of Active\n", "sns.histplot(data=protac_pedia_df, x='Active', bins=16)\n", "plt.title('Histogram of Active')\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "270288154fa2473a8a0151a8c4e93ecb", "version_major": 2, "version_minor": 0 }, "text/plain": [ " 0%| | 0/97 [00:00 List[str]:\n", " tmp = df[assay_column].dropna()\n", " if tmp.empty:\n", " return []\n", " return tmp.unique().tolist()\n", "\n", "\n", "def clean_assay_text(assay):\n", " tmp = assay.replace('/', ' and ')\n", " tmp = tmp.replace('BRD4 BD1 and 2', 'BRD4 BD1 and BRD4 BD2')\n", " tmp = tmp.replace('(Ba and F3 WT)', '(Ba/F3 WT)')\n", " tmp = tmp.replace('(EGFR L858R and T790M)', '(EGFR L858R/T790M)')\n", " return tmp\n", "\n", "\n", "assays = {}\n", "for c in protac_df.columns:\n", " if 'Assay' in c:\n", " assays[c] = get_assay_texts(protac_df, c)\n", "texts = list(set([x for y in assays.values() for x in y]))\n", "print(len(texts))\n", "print(sum([len(x) for x in assays.values()]))" ] }, { "cell_type": "code", "execution_count": 25, "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", "
Assay (Ternary complex, IC50)IC50 (nM, Ternary complex)
539Inhibition of CRBN in the presence of BRD4 BD1...1800/4100
1185TR-FRET220
1186TR-FRET/AlphaLISA205/120
1187TR-FRET/AlphaLISA230/330
1188TR-FRET28
1189TR-FRET/AlphaLISA45/120
1190TR-FRET/AlphaLISA76/240
1191TR-FRET/AlphaLISA26/730
1192TR-FRET/AlphaLISA51/720
1193TR-FRET42
1508FP3750
1526FP2570
1528FP2170
2300Titrations of PROTAC over an immobilised VCB s...290
2858FP3040
2859FP2980
2860FP2460
4883IC50 between VHL and the complex of protac and...5.01
4884IC50 between VHL and the complex of protac and...2
4885IC50 between VHL and the complex of protac and...7.94
4886IC50 between VHL and the complex of protac and...6.31
4887IC50 between VHL and the complex of protac and...10
4888IC50 between VHL and the complex of protac and...1.26
\n", "
" ], "text/plain": [ " Assay (Ternary complex, IC50) \\\n", "539 Inhibition of CRBN in the presence of BRD4 BD1... \n", "1185 TR-FRET \n", "1186 TR-FRET/AlphaLISA \n", "1187 TR-FRET/AlphaLISA \n", "1188 TR-FRET \n", "1189 TR-FRET/AlphaLISA \n", "1190 TR-FRET/AlphaLISA \n", "1191 TR-FRET/AlphaLISA \n", "1192 TR-FRET/AlphaLISA \n", "1193 TR-FRET \n", "1508 FP \n", "1526 FP \n", "1528 FP \n", "2300 Titrations of PROTAC over an immobilised VCB s... \n", "2858 FP \n", "2859 FP \n", "2860 FP \n", "4883 IC50 between VHL and the complex of protac and... \n", "4884 IC50 between VHL and the complex of protac and... \n", "4885 IC50 between VHL and the complex of protac and... \n", "4886 IC50 between VHL and the complex of protac and... \n", "4887 IC50 between VHL and the complex of protac and... \n", "4888 IC50 between VHL and the complex of protac and... \n", "\n", " IC50 (nM, Ternary complex) \n", "539 1800/4100 \n", "1185 220 \n", "1186 205/120 \n", "1187 230/330 \n", "1188 28 \n", "1189 45/120 \n", "1190 76/240 \n", "1191 26/730 \n", "1192 51/720 \n", "1193 42 \n", "1508 3750 \n", "1526 2570 \n", "1528 2170 \n", "2300 290 \n", "2858 3040 \n", "2859 2980 \n", "2860 2460 \n", "4883 5.01 \n", "4884 2 \n", "4885 7.94 \n", "4886 6.31 \n", "4887 10 \n", "4888 1.26 " ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "protac_df[[\"Assay (Cellular activities, EC50)\",\n", " \"EC50 (nM, Cellular activities)\"]].dropna(how='all').drop_duplicates()\n", "\n", "protac_df[[\"Assay (Ternary complex, IC50)\", \"IC50 (nM, Ternary complex)\"]].dropna(\n", " how='all').drop_duplicates()" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Non-assay columns: ['E3 Ligase', 'Heavy Atom Count', 'Hydrogen Bond Acceptor Count', 'Compound ID', 'Molecular Formula', 'Rotatable Bond Count', 'Molecular Weight', 'InChI Key', 'Target', 'XLogP3', 'Smiles', 'Article DOI', 'Ring Count', 'Name', 'Hydrogen Bond Donor Count', 'Uniprot', 'PDB', 'InChI', 'Topological Polar Surface Area', 'Exact Mass']\n", "Assay columns: ['DC50 (nM)', 'Dmax (%)', 'Assay (DC50/Dmax)', 'Percent degradation (%)', 'Assay (Percent degradation)', 'IC50 (nM, Protac to Target)', 'Assay (Protac to Target, IC50)', 'EC50 (nM, Protac to Target)', 'Assay (Protac to Target, EC50)', 'Kd (nM, Protac to Target)', 'Assay (Protac to Target, Kd)', 'Ki (nM, Protac to Target)', 'Assay (Protac to Target, Ki)', 'delta G (kcal/mol, Protac to Target)', 'delta H (kcal/mol, Protac to Target)', '-T*delta S (kcal/mol, Protac to Target)', 'Assay (Protac to Target, G/H/-TS)', 'kon (1/Ms, Protac to Target)', 'koff (1/s, Protac to Target)', 't1/2 (s, Protac to Target)', 'Assay (Protac to Target, kon/koff/t1/2)', 'IC50 (nM, Protac to E3)', 'Assay (Protac to E3, IC50)', 'EC50 (nM, Protac to E3)', 'Assay (Protac to E3, EC50)', 'Kd (nM, Protac to E3)', 'Assay (Protac to E3, Kd)', 'Ki (nM, Protac to E3)', 'Assay (Protac to E3, Ki)', 'delta G (kcal/mol, Protac to E3)', 'delta H (kcal/mol, Protac to E3)', '-T*delta S (kcal/mol, Protac to E3)', 'Assay (Protac to E3, G/H/-TS)', 'kon (1/Ms, Protac to E3)', 'koff (1/s, Protac to E3)', 't1/2 (s, Protac to E3)', 'Assay (Protac to E3, kon/koff/t1/2)', 'IC50 (nM, Ternary complex)', 'Assay (Ternary complex, IC50)', 'EC50 (nM, Ternary complex)', 'Assay (Ternary complex, EC50)', 'Kd (nM, Ternary complex)', 'Assay (Ternary complex, Kd)', 'Ki (nM, Ternary complex)', 'Assay (Ternary complex, Ki)', 'delta G (kcal/mol, Ternary complex)', 'delta H (kcal/mol, Ternary complex)', '-T*delta S (kcal/mol, Ternary complex)', 'Assay (Ternary complex, G/H/-TS)', 'kon (1/Ms, Ternary complex)', 'koff (1/s, Ternary complex)', 't1/2 (s, Ternary complex)', 'Assay (Ternary complex, kon/koff/t1/2)', 'IC50 (nM, Cellular activities)', 'Assay (Cellular activities, IC50)', 'EC50 (nM, Cellular activities)', 'Assay (Cellular activities, EC50)', 'GI50 (nM, Cellular activities)', 'Assay (Cellular activities, GI50)', 'ED50 (nM, Cellular activities)', 'Assay (Cellular activities, ED50)', 'GR50 (nM, Cellular activities)', 'Assay (Cellular activities, GR50)', 'PAMPA Papp (nm/s, Permeability)', 'Assay (Permeability, PAMPA Papp)', 'Caco-2 A2B Papp (nm/s, Permeability)', 'Assay (Permeability, Caco-2 A2B Papp)', 'Caco-2 B2A Papp (nm/s, Permeability)', 'Assay (Permeability, Caco-2 B2A Papp)']\n" ] } ], "source": [ "assay_to_parameters = {\n", " \"Assay (DC50/Dmax)\": [\"DC50 (nM)\", \"Dmax (%)\"],\n", " \"Assay (Percent degradation)\": [\"Percent degradation (%)\"],\n", " \"Assay (Protac to Target, IC50)\": [\"IC50 (nM, Protac to Target)\"],\n", " \"Assay (Protac to Target, EC50)\": [\"EC50 (nM, Protac to Target)\"],\n", " \"Assay (Protac to Target, Kd)\": [\"Kd (nM, Protac to Target)\"],\n", " \"Assay (Protac to Target, Ki)\": [\"Ki (nM, Protac to Target)\"],\n", " \"Assay (Protac to Target, G/H/-TS)\": [\"delta G (kcal/mol, Protac to Target)\", \"delta H (kcal/mol, Protac to Target)\", \"-T*delta S (kcal/mol, Protac to Target)\"],\n", " \"Assay (Protac to Target, kon/koff/t1/2)\": [\"kon (1/Ms, Protac to Target)\", \"koff (1/s, Protac to Target)\", \"t1/2 (s, Protac to Target)\"],\n", " \"Assay (Protac to E3, IC50)\": [\"IC50 (nM, Protac to E3)\"],\n", " \"Assay (Protac to E3, EC50)\": [\"EC50 (nM, Protac to E3)\"],\n", " \"Assay (Protac to E3, Kd)\": [\"Kd (nM, Protac to E3)\"],\n", " \"Assay (Protac to E3, Ki)\": [\"Ki (nM, Protac to E3)\"],\n", " \"Assay (Protac to E3, G/H/-TS)\": [\"delta G (kcal/mol, Protac to E3)\", \"delta H (kcal/mol, Protac to E3)\", \"-T*delta S (kcal/mol, Protac to E3)\"],\n", " \"Assay (Protac to E3, kon/koff/t1/2)\": [\"kon (1/Ms, Protac to E3)\", \"koff (1/s, Protac to E3)\", \"t1/2 (s, Protac to E3)\"],\n", " \"Assay (Ternary complex, IC50)\": [\"IC50 (nM, Ternary complex)\"],\n", " \"Assay (Ternary complex, EC50)\": [\"EC50 (nM, Ternary complex)\"],\n", " \"Assay (Ternary complex, Kd)\": [\"Kd (nM, Ternary complex)\"],\n", " \"Assay (Ternary complex, Ki)\": [\"Ki (nM, Ternary complex)\"],\n", " \"Assay (Ternary complex, G/H/-TS)\": [\"delta G (kcal/mol, Ternary complex)\", \"delta H (kcal/mol, Ternary complex)\", \"-T*delta S (kcal/mol, Ternary complex)\"],\n", " \"Assay (Ternary complex, kon/koff/t1/2)\": [\"kon (1/Ms, Ternary complex)\", \"koff (1/s, Ternary complex)\", \"t1/2 (s, Ternary complex)\"],\n", " \"Assay (Cellular activities, IC50)\": [\"IC50 (nM, Cellular activities)\"],\n", " \"Assay (Cellular activities, EC50)\": [\"EC50 (nM, Cellular activities)\"],\n", " \"Assay (Cellular activities, GI50)\": [\"GI50 (nM, Cellular activities)\"],\n", " \"Assay (Cellular activities, ED50)\": [\"ED50 (nM, Cellular activities)\"],\n", " \"Assay (Cellular activities, GR50)\": [\"GR50 (nM, Cellular activities)\"],\n", " \"Assay (Permeability, PAMPA Papp)\": [\"PAMPA Papp (nm/s, Permeability)\"],\n", " \"Assay (Permeability, Caco-2 A2B Papp)\": [\"Caco-2 A2B Papp (nm/s, Permeability)\"],\n", " \"Assay (Permeability, Caco-2 B2A Papp)\": [\"Caco-2 B2A Papp (nm/s, Permeability)\"]\n", "}\n", "assay_cols = []\n", "for assay_col, param_cols in assay_to_parameters.items():\n", " assay_cols += param_cols + [assay_col]\n", "non_assay_cols = list(set(protac_df) - set(assay_cols))\n", "print(f'Non-assay columns: {non_assay_cols}')\n", "print(f'Assay columns: {assay_cols}')" ] }, { "cell_type": "code", "execution_count": 27, "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", "
Assay (DC50/Dmax)DC50 (nM)Dmax (%)
19Degradation of BRD9 in HeLa cells after 4 h tr...56080
40Degradation of BRD9 in RI-1 cells after 8 h tr...1.7695
41Degradation of HiBiT-BRD9 in HEK293 cells afte...4NaN
42Degradation of BRD9 in EOL-1/A-204 cells after...2/8NaN
43Degradation of BRD7 in RI-1 cells after 8 h tr...4.595
\n", "
" ], "text/plain": [ " Assay (DC50/Dmax) DC50 (nM) Dmax (%)\n", "19 Degradation of BRD9 in HeLa cells after 4 h tr... 560 80\n", "40 Degradation of BRD9 in RI-1 cells after 8 h tr... 1.76 95\n", "41 Degradation of HiBiT-BRD9 in HEK293 cells afte... 4 NaN\n", "42 Degradation of BRD9 in EOL-1/A-204 cells after... 2/8 NaN\n", "43 Degradation of BRD7 in RI-1 cells after 8 h tr... 4.5 95" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Number of (unique) rows: 854\n", "--------------------------------------------------------------------------------\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", "
Assay (Percent degradation)Percent degradation (%)
129% AR degradation in LNCaP cells after 6 h trea...26/35/28
130% AR degradation in LNCaP cells after 6 h trea...15/23/23
131% AR degradation in LNCaP cells after 6 h trea...16/20/25
132% AR degradation in LNCaP cells after 6 h trea...11/25/29
133% AR degradation in LNCaP cells after 6 h trea...54/84/64
\n", "
" ], "text/plain": [ " Assay (Percent degradation) Percent degradation (%)\n", "129 % AR degradation in LNCaP cells after 6 h trea... 26/35/28\n", "130 % AR degradation in LNCaP cells after 6 h trea... 15/23/23\n", "131 % AR degradation in LNCaP cells after 6 h trea... 16/20/25\n", "132 % AR degradation in LNCaP cells after 6 h trea... 11/25/29\n", "133 % AR degradation in LNCaP cells after 6 h trea... 54/84/64" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Number of (unique) rows: 298\n", "--------------------------------------------------------------------------------\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", "
Assay (Protac to Target, IC50)IC50 (nM, Protac to Target)
234Inhibition of SIRT2 in a fluorescence-based de...250
307Inhibition of CDK6/Cyciln D3 by cell-free kina...6.61
311Inhibition of ERRalpha by TR-FRET Coactivator ...7.33
312Inhibition of ERRalpha by TR-FRET Coactivator ...6.33
313Inhibition of ERRalpha by TR-FRET Coactivator ...12.67
\n", "
" ], "text/plain": [ " Assay (Protac to Target, IC50) \\\n", "234 Inhibition of SIRT2 in a fluorescence-based de... \n", "307 Inhibition of CDK6/Cyciln D3 by cell-free kina... \n", "311 Inhibition of ERRalpha by TR-FRET Coactivator ... \n", "312 Inhibition of ERRalpha by TR-FRET Coactivator ... \n", "313 Inhibition of ERRalpha by TR-FRET Coactivator ... \n", "\n", " IC50 (nM, Protac to Target) \n", "234 250 \n", "307 6.61 \n", "311 7.33 \n", "312 6.33 \n", "313 12.67 " ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Number of (unique) rows: 728\n", "--------------------------------------------------------------------------------\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", "
Assay (Protac to Target, EC50)EC50 (nM, Protac to Target)
545EC50 of BRD4 BD1/2 was tested by TR-FRET95/298
5282EC50 was tested by TR-FRET coactivator assays31
\n", "
" ], "text/plain": [ " Assay (Protac to Target, EC50) \\\n", "545 EC50 of BRD4 BD1/2 was tested by TR-FRET \n", "5282 EC50 was tested by TR-FRET coactivator assays \n", "\n", " EC50 (nM, Protac to Target) \n", "545 95/298 \n", "5282 31 " ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Number of (unique) rows: 2\n", "--------------------------------------------------------------------------------\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", "
Assay (Protac to Target, Kd)Kd (nM, Protac to Target)
1ITC15
19ITC8.8
40ITC5.1
71SPR30
286Kd was assessed by competition binding assays310
\n", "
" ], "text/plain": [ " Assay (Protac to Target, Kd) Kd (nM, Protac to Target)\n", "1 ITC 15\n", "19 ITC 8.8\n", "40 ITC 5.1\n", "71 SPR 30\n", "286 Kd was assessed by competition binding assays 310" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Number of (unique) rows: 172\n", "--------------------------------------------------------------------------------\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", "
Assay (Protac to Target, Ki)Ki (nM, Protac to Target)
1059Ki was determined by AlphaScreen competitive b...0.009
1946Ki was tested by the AlphaScreen competitive b...1.9
2190Ki was assessed using a radio-ligand displacem...11
2197Ki was assessed using a radio-ligand displacem...5
4864FP5.5
\n", "
" ], "text/plain": [ " Assay (Protac to Target, Ki) \\\n", "1059 Ki was determined by AlphaScreen competitive b... \n", "1946 Ki was tested by the AlphaScreen competitive b... \n", "2190 Ki was assessed using a radio-ligand displacem... \n", "2197 Ki was assessed using a radio-ligand displacem... \n", "4864 FP \n", "\n", " Ki (nM, Protac to Target) \n", "1059 0.009 \n", "1946 1.9 \n", "2190 11 \n", "2197 5 \n", "4864 5.5 " ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Number of (unique) rows: 35\n", "--------------------------------------------------------------------------------\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", "
Assay (Protac to Target, G/H/-TS)delta G (kcal/mol, Protac to Target)delta H (kcal/mol, Protac to Target)-T*delta S (kcal/mol, Protac to Target)
1ITC-10.7-12.51.8
19ITC-11-11.40.44
40ITC-11.35-12.81.485
347ITC in BRD2 BD1-9.57-13.74.2
349ITC in BRD4 BD2-10.3-10.40.1
\n", "
" ], "text/plain": [ " Assay (Protac to Target, G/H/-TS) delta G (kcal/mol, Protac to Target) \\\n", "1 ITC -10.7 \n", "19 ITC -11 \n", "40 ITC -11.35 \n", "347 ITC in BRD2 BD1 -9.57 \n", "349 ITC in BRD4 BD2 -10.3 \n", "\n", " delta H (kcal/mol, Protac to Target) \\\n", "1 -12.5 \n", "19 -11.4 \n", "40 -12.8 \n", "347 -13.7 \n", "349 -10.4 \n", "\n", " -T*delta S (kcal/mol, Protac to Target) \n", "1 1.8 \n", "19 0.44 \n", "40 1.485 \n", "347 4.2 \n", "349 0.1 " ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Number of (unique) rows: 24\n", "--------------------------------------------------------------------------------\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", "
Assay (Protac to Target, kon/koff/t1/2)kon (1/Ms, Protac to Target)koff (1/s, Protac to Target)t1/2 (s, Protac to Target)
71SPR490000.00.015NaN
1526NaN1.40.770NaN
2869NaN1.80.400NaN
\n", "
" ], "text/plain": [ " Assay (Protac to Target, kon/koff/t1/2) kon (1/Ms, Protac to Target) \\\n", "71 SPR 490000.0 \n", "1526 NaN 1.4 \n", "2869 NaN 1.8 \n", "\n", " koff (1/s, Protac to Target) t1/2 (s, Protac to Target) \n", "71 0.015 NaN \n", "1526 0.770 NaN \n", "2869 0.400 NaN " ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Number of (unique) rows: 3\n", "--------------------------------------------------------------------------------\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", "
Assay (Protac to E3, IC50)IC50 (nM, Protac to E3)
361Inhibition of CRBN2200
511Inhibition of VHL by competition binding assay656
539Inhibition of CRBN by competition binding assay800
800FP1200
805FP2400
\n", "
" ], "text/plain": [ " Assay (Protac to E3, IC50) IC50 (nM, Protac to E3)\n", "361 Inhibition of CRBN 2200\n", "511 Inhibition of VHL by competition binding assay 656\n", "539 Inhibition of CRBN by competition binding assay 800\n", "800 FP 1200\n", "805 FP 2400" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Number of (unique) rows: 141\n", "--------------------------------------------------------------------------------\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", "
Assay (Protac to E3, EC50)EC50 (nM, Protac to E3)
1943EC50 was tested using a BRD4 BRD2-eGFP-mCherry...576.0
1944EC50 was tested using a BRD4 BRD2-eGFP-mCherry...641.0
1945EC50 was tested using a BRD4 BRD2-eGFP-mCherry...703.0
\n", "
" ], "text/plain": [ " Assay (Protac to E3, EC50) \\\n", "1943 EC50 was tested using a BRD4 BRD2-eGFP-mCherry... \n", "1944 EC50 was tested using a BRD4 BRD2-eGFP-mCherry... \n", "1945 EC50 was tested using a BRD4 BRD2-eGFP-mCherry... \n", "\n", " EC50 (nM, Protac to E3) \n", "1943 576.0 \n", "1944 641.0 \n", "1945 703.0 " ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Number of (unique) rows: 3\n", "--------------------------------------------------------------------------------\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", "
Assay (Protac to E3, Kd)Kd (nM, Protac to E3)
1ITC/FP33/24
19ITC/FP87/70
40ITC/FP26/35
293SPR5000
295SPR3500
\n", "
" ], "text/plain": [ " Assay (Protac to E3, Kd) Kd (nM, Protac to E3)\n", "1 ITC/FP 33/24\n", "19 ITC/FP 87/70\n", "40 ITC/FP 26/35\n", "293 SPR 5000\n", "295 SPR 3500" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Number of (unique) rows: 61\n", "--------------------------------------------------------------------------------\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", "
Assay (Protac to E3, Ki)Ki (nM, Protac to E3)
522FP77.0
525FP72.0
1185FP210.0
1188FP490.0
1191FP450.0
\n", "
" ], "text/plain": [ " Assay (Protac to E3, Ki) Ki (nM, Protac to E3)\n", "522 FP 77.0\n", "525 FP 72.0\n", "1185 FP 210.0\n", "1188 FP 490.0\n", "1191 FP 450.0" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Number of (unique) rows: 6\n", "--------------------------------------------------------------------------------\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", "
Assay (Protac to E3, G/H/-TS)delta G (kcal/mol, Protac to E3)delta H (kcal/mol, Protac to E3)-T*delta S (kcal/mol, Protac to E3)
1ITC-10.20-15.204.9
19ITC-9.64-6.56-3.1
40ITC-10.40-7.04-3.4
347ITC-9.01-7.90-1.1
350ITC-8.49-5.00-3.7
\n", "
" ], "text/plain": [ " Assay (Protac to E3, G/H/-TS) delta G (kcal/mol, Protac to E3) \\\n", "1 ITC -10.20 \n", "19 ITC -9.64 \n", "40 ITC -10.40 \n", "347 ITC -9.01 \n", "350 ITC -8.49 \n", "\n", " delta H (kcal/mol, Protac to E3) -T*delta S (kcal/mol, Protac to E3) \n", "1 -15.20 4.9 \n", "19 -6.56 -3.1 \n", "40 -7.04 -3.4 \n", "347 -7.90 -1.1 \n", "350 -5.00 -3.7 " ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Number of (unique) rows: 17\n", "--------------------------------------------------------------------------------\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", "
Assay (Protac to E3, kon/koff/t1/2)kon (1/Ms, Protac to E3)koff (1/s, Protac to E3)t1/2 (s, Protac to E3)
457SPR600000.00.06017.0
525SPR700000.00.01943.0
2312SPR270000.00.01548.0
\n", "
" ], "text/plain": [ " Assay (Protac to E3, kon/koff/t1/2) kon (1/Ms, Protac to E3) \\\n", "457 SPR 600000.0 \n", "525 SPR 700000.0 \n", "2312 SPR 270000.0 \n", "\n", " koff (1/s, Protac to E3) t1/2 (s, Protac to E3) \n", "457 0.060 17.0 \n", "525 0.019 43.0 \n", "2312 0.015 48.0 " ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Number of (unique) rows: 3\n", "--------------------------------------------------------------------------------\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", "
Assay (Ternary complex, IC50)IC50 (nM, Ternary complex)
539Inhibition of CRBN in the presence of BRD4 BD1...1800/4100
1185TR-FRET220
1186TR-FRET/AlphaLISA205/120
1187TR-FRET/AlphaLISA230/330
1188TR-FRET28
\n", "
" ], "text/plain": [ " Assay (Ternary complex, IC50) \\\n", "539 Inhibition of CRBN in the presence of BRD4 BD1... \n", "1185 TR-FRET \n", "1186 TR-FRET/AlphaLISA \n", "1187 TR-FRET/AlphaLISA \n", "1188 TR-FRET \n", "\n", " IC50 (nM, Ternary complex) \n", "539 1800/4100 \n", "1185 220 \n", "1186 205/120 \n", "1187 230/330 \n", "1188 28 " ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Number of (unique) rows: 23\n", "--------------------------------------------------------------------------------\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Assay (Ternary complex, EC50)EC50 (nM, Ternary complex)
\n", "
" ], "text/plain": [ "Empty DataFrame\n", "Columns: [Assay (Ternary complex, EC50), EC50 (nM, Ternary complex)]\n", "Index: []" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Number of (unique) rows: 0\n", "--------------------------------------------------------------------------------\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", "
Assay (Ternary complex, Kd)Kd (nM, Ternary complex)
1ITC/FP73/98
19ITC/FP83/60
40ITC/FP27/35
293SPR1200
295SPR436
\n", "
" ], "text/plain": [ " Assay (Ternary complex, Kd) Kd (nM, Ternary complex)\n", "1 ITC/FP 73/98\n", "19 ITC/FP 83/60\n", "40 ITC/FP 27/35\n", "293 SPR 1200\n", "295 SPR 436" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Number of (unique) rows: 53\n", "--------------------------------------------------------------------------------\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", "
Assay (Ternary complex, Ki)Ki (nM, Ternary complex)
525Ki between VHL and MZ1-BRD2 BD1/BD2 was tested...33/2.5
526Ki between VHL and MZ1-BRD3 BD1/BD2 was tested...18/8
527Ki between VHL and MZ1-BRD4 BD1/BD2 was tested...13/1.3
1185FP79
1186FP48
\n", "
" ], "text/plain": [ " Assay (Ternary complex, Ki) \\\n", "525 Ki between VHL and MZ1-BRD2 BD1/BD2 was tested... \n", "526 Ki between VHL and MZ1-BRD3 BD1/BD2 was tested... \n", "527 Ki between VHL and MZ1-BRD4 BD1/BD2 was tested... \n", "1185 FP \n", "1186 FP \n", "\n", " Ki (nM, Ternary complex) \n", "525 33/2.5 \n", "526 18/8 \n", "527 13/1.3 \n", "1185 79 \n", "1186 48 " ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Number of (unique) rows: 9\n", "--------------------------------------------------------------------------------\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", "
Assay (Ternary complex, G/H/-TS)delta G (kcal/mol, Ternary complex)delta H (kcal/mol, Ternary complex)-T*delta S (kcal/mol, Ternary complex)
1ITC between VHL and BRD9-BD:PROTAC-9.7-6.4-3.3
40ITC between VHL and BRD9-BD:PROTAC-10.33-5.1-5.3
347ITC between VHL and BRD2 BD1:PROTAC-9.85-9.17-0.6
349ITC between VHL and BRD4 BD2:PROTAC-10.13-10.9-0.6
350ITC between VHL and BRD2 BD1:PROTAC-8.6-5.1-3.6
\n", "
" ], "text/plain": [ " Assay (Ternary complex, G/H/-TS) delta G (kcal/mol, Ternary complex) \\\n", "1 ITC between VHL and BRD9-BD:PROTAC -9.7 \n", "40 ITC between VHL and BRD9-BD:PROTAC -10.33 \n", "347 ITC between VHL and BRD2 BD1:PROTAC -9.85 \n", "349 ITC between VHL and BRD4 BD2:PROTAC -10.13 \n", "350 ITC between VHL and BRD2 BD1:PROTAC -8.6 \n", "\n", " delta H (kcal/mol, Ternary complex) -T*delta S (kcal/mol, Ternary complex) \n", "1 -6.4 -3.3 \n", "40 -5.1 -5.3 \n", "347 -9.17 -0.6 \n", "349 -10.9 -0.6 \n", "350 -5.1 -3.6 " ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Number of (unique) rows: 24\n", "--------------------------------------------------------------------------------\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", "
Assay (Ternary complex, kon/koff/t1/2)kon (1/Ms, Ternary complex)koff (1/s, Ternary complex)t1/2 (s, Ternary complex)
293SPR701000.0728
295SPR396000.01838
457SPR between VHL and AT1-BRD4 BD1/21.6E+6/1.4E+60.9/0.030.8/26
525SPR between VHL and MZ1-BRD2 BD1/23.9E+8/1.2E+7>1/0.01<0.7/67.4
526SPR between VHL and MZ1-BRD3 BD1/21.4E+8/1.6E+7>1/0.12<0.7/6
\n", "
" ], "text/plain": [ " Assay (Ternary complex, kon/koff/t1/2) kon (1/Ms, Ternary complex) \\\n", "293 SPR 70100 \n", "295 SPR 39600 \n", "457 SPR between VHL and AT1-BRD4 BD1/2 1.6E+6/1.4E+6 \n", "525 SPR between VHL and MZ1-BRD2 BD1/2 3.9E+8/1.2E+7 \n", "526 SPR between VHL and MZ1-BRD3 BD1/2 1.4E+8/1.6E+7 \n", "\n", " koff (1/s, Ternary complex) t1/2 (s, Ternary complex) \n", "293 0.072 8 \n", "295 0.018 38 \n", "457 0.9/0.03 0.8/26 \n", "525 >1/0.01 <0.7/67.4 \n", "526 >1/0.12 <0.7/6 " ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Number of (unique) rows: 8\n", "--------------------------------------------------------------------------------\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", "
Assay (Cellular activities, IC50)IC50 (nM, Cellular activities)
72Inhibit growth of RS4;11 cells10
73Inhibit growth of RS4;11 cells7
74Inhibit growth of RS4;11 cells68.4
75Inhibit growth of RS4;11 cells15
76Inhibit growth of RS4;11 cells9
\n", "
" ], "text/plain": [ " Assay (Cellular activities, IC50) IC50 (nM, Cellular activities)\n", "72 Inhibit growth of RS4;11 cells 10\n", "73 Inhibit growth of RS4;11 cells 7\n", "74 Inhibit growth of RS4;11 cells 68.4\n", "75 Inhibit growth of RS4;11 cells 15\n", "76 Inhibit growth of RS4;11 cells 9" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Number of (unique) rows: 919\n", "--------------------------------------------------------------------------------\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", "
Assay (Cellular activities, EC50)EC50 (nM, Cellular activities)
4Inhibit proliferation of EOL-1/A-402 cells35/305
40Inhibit proliferation of EOL-1/A-402 cells3/40
212Inhibit viability of MDA-MB-468/MDA-MB-231 cells0.5146/0.881
347Inhibit proliferation of MV4;11 cells316
473Inhibit viability of K562 cells4.4
\n", "
" ], "text/plain": [ " Assay (Cellular activities, EC50) \\\n", "4 Inhibit proliferation of EOL-1/A-402 cells \n", "40 Inhibit proliferation of EOL-1/A-402 cells \n", "212 Inhibit viability of MDA-MB-468/MDA-MB-231 cells \n", "347 Inhibit proliferation of MV4;11 cells \n", "473 Inhibit viability of K562 cells \n", "\n", " EC50 (nM, Cellular activities) \n", "4 35/305 \n", "40 3/40 \n", "212 0.5146/0.881 \n", "347 316 \n", "473 4.4 " ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Number of (unique) rows: 95\n", "--------------------------------------------------------------------------------\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", "
Assay (Cellular activities, GI50)GI50 (nM, Cellular activities)
379Inhibit viability of HBL-1/RAMOS cells>200/>1000
380Inhibit viability of HBL-1 cells expressing BT...28.8
381Inhibit viability of HBL-1/RAMOS cells1.5/>1000
382Inhibit viability of HBL-1/RAMOS cells71.1/>1000
384Inhibit viability of HBL-1 cells109.9
\n", "
" ], "text/plain": [ " Assay (Cellular activities, GI50) \\\n", "379 Inhibit viability of HBL-1/RAMOS cells \n", "380 Inhibit viability of HBL-1 cells expressing BT... \n", "381 Inhibit viability of HBL-1/RAMOS cells \n", "382 Inhibit viability of HBL-1/RAMOS cells \n", "384 Inhibit viability of HBL-1 cells \n", "\n", " GI50 (nM, Cellular activities) \n", "379 >200/>1000 \n", "380 28.8 \n", "381 1.5/>1000 \n", "382 71.1/>1000 \n", "384 109.9 " ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Number of (unique) rows: 78\n", "--------------------------------------------------------------------------------\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", "
Assay (Cellular activities, ED50)ED50 (nM, Cellular activities)
1754Inhibit proliferation of TMD8/Maver-1/Granta-5...44.3/193/203
1755Inhibit proliferation of TMD8 cells with C481S...149
1756Inhibit proliferation of Mino/TMD8/Maver-1 cells12/29.2/47.7
1757Inhibit proliferation of TMD8 cells with C481S...128
1758Inhibit proliferation of Mino cells69
\n", "
" ], "text/plain": [ " Assay (Cellular activities, ED50) \\\n", "1754 Inhibit proliferation of TMD8/Maver-1/Granta-5... \n", "1755 Inhibit proliferation of TMD8 cells with C481S... \n", "1756 Inhibit proliferation of Mino/TMD8/Maver-1 cells \n", "1757 Inhibit proliferation of TMD8 cells with C481S... \n", "1758 Inhibit proliferation of Mino cells \n", "\n", " ED50 (nM, Cellular activities) \n", "1754 44.3/193/203 \n", "1755 149 \n", "1756 12/29.2/47.7 \n", "1757 128 \n", "1758 69 " ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Number of (unique) rows: 5\n", "--------------------------------------------------------------------------------\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", "
Assay (Cellular activities, GR50)GR50 (nM, Cellular activities)
1360Inhibit proliferation of ZR-75-1/T47D/LNCaP cells16/178/130
1651Inhibit growth of OVCAR8/OVSAHO/FUOV1 cells96.6/33.3/53
1694Inhibit growth of OVCAR8 cells33.1
461111aNaN
461211bNaN
\n", "
" ], "text/plain": [ " Assay (Cellular activities, GR50) \\\n", "1360 Inhibit proliferation of ZR-75-1/T47D/LNCaP cells \n", "1651 Inhibit growth of OVCAR8/OVSAHO/FUOV1 cells \n", "1694 Inhibit growth of OVCAR8 cells \n", "4611 11a \n", "4612 11b \n", "\n", " GR50 (nM, Cellular activities) \n", "1360 16/178/130 \n", "1651 96.6/33.3/53 \n", "1694 33.1 \n", "4611 NaN \n", "4612 NaN " ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Number of (unique) rows: 20\n", "--------------------------------------------------------------------------------\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", "
Assay (Permeability, PAMPA Papp)PAMPA Papp (nm/s, Permeability)
18Compounds were administered at 10000 nM and in...0.01
30Compounds were administered at 10000 nM and in...0.02
395Compounds were administered at 10000 nM and in...<1
482PAMPA assay0.2
513PAMPA assay0.01
\n", "
" ], "text/plain": [ " Assay (Permeability, PAMPA Papp) \\\n", "18 Compounds were administered at 10000 nM and in... \n", "30 Compounds were administered at 10000 nM and in... \n", "395 Compounds were administered at 10000 nM and in... \n", "482 PAMPA assay \n", "513 PAMPA assay \n", "\n", " PAMPA Papp (nm/s, Permeability) \n", "18 0.01 \n", "30 0.02 \n", "395 <1 \n", "482 0.2 \n", "513 0.01 " ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Number of (unique) rows: 10\n", "--------------------------------------------------------------------------------\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", "
Assay (Permeability, Caco-2 A2B Papp)Caco-2 A2B Papp (nm/s, Permeability)
395Compounds were administered at 10000 nM and in...0.35
397Compounds were administered at 5000 nM and inc...0.081
506Compounds were administered at 10000 nM and in...11.6
711Compounds were administered at 10000 nM and in...0.02
2188Compounds were administered at 10000 nM and in...1.7
\n", "
" ], "text/plain": [ " Assay (Permeability, Caco-2 A2B Papp) \\\n", "395 Compounds were administered at 10000 nM and in... \n", "397 Compounds were administered at 5000 nM and inc... \n", "506 Compounds were administered at 10000 nM and in... \n", "711 Compounds were administered at 10000 nM and in... \n", "2188 Compounds were administered at 10000 nM and in... \n", "\n", " Caco-2 A2B Papp (nm/s, Permeability) \n", "395 0.35 \n", "397 0.081 \n", "506 11.6 \n", "711 0.02 \n", "2188 1.7 " ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Number of (unique) rows: 25\n", "--------------------------------------------------------------------------------\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", "
Assay (Permeability, Caco-2 B2A Papp)Caco-2 B2A Papp (nm/s, Permeability)
395Compounds were administered at 10000 nM and in...0.24
711Compounds were administered at 10000 nM and in...0.07
2188Compounds were administered at 10000 nM and in...14.1
2190Compounds were administered at 10000 nM and in...1.4
2191Compounds were administered at 10000 nM and in...<0.79
\n", "
" ], "text/plain": [ " Assay (Permeability, Caco-2 B2A Papp) \\\n", "395 Compounds were administered at 10000 nM and in... \n", "711 Compounds were administered at 10000 nM and in... \n", "2188 Compounds were administered at 10000 nM and in... \n", "2190 Compounds were administered at 10000 nM and in... \n", "2191 Compounds were administered at 10000 nM and in... \n", "\n", " Caco-2 B2A Papp (nm/s, Permeability) \n", "395 0.24 \n", "711 0.07 \n", "2188 14.1 \n", "2190 1.4 \n", "2191 <0.79 " ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Number of (unique) rows: 12\n", "--------------------------------------------------------------------------------\n" ] } ], "source": [ "for assay, cols in assay_to_parameters.items():\n", " tmp = protac_df[[assay] + cols].dropna(how='all').drop_duplicates()\n", " display(tmp.head())\n", " print(f'Number of (unique) rows: {len(tmp)}')\n", " print('-' * 80)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### DC50 and Dmax" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Degradation of ENL in MV4;11 cells after 24 h treatment\n", "['ENL'] | ['MV4;11'] | [24.0]\n", "--------------------------------------------------------------------------------\n", "Degradation of BRD4 in HEK293T cells after 8 h treatment\n", "['BRD4'] | ['HEK293T'] | [8.0]\n", "--------------------------------------------------------------------------------\n", "Degradation of BRD4 in 231MFP/HAP1 cells after 8 h treatment\n", "['BRD4'] | ['231MFP', 'HAP1'] | [8.0]\n", "--------------------------------------------------------------------------------\n", "Degradation of ER in ER-positive breast cancer cell lines\n", "['ER'] | ['ER-positive breast cancer cell lines'] | nan\n", "--------------------------------------------------------------------------------\n", "Degradation of AR in LNCaP cells\n", "['AR'] | ['LNCaP'] | nan\n", "--------------------------------------------------------------------------------\n", "Degradation of AR in LNCaP/VCaP AR+ cells after 6 h treatment\n", "['AR'] | ['LNCaP', 'VCaP AR+'] | [6.0]\n", "--------------------------------------------------------------------------------\n", "Degradation of BRD4 BD1/2 assessed by EGFP/mCherry reporter assay\n", "['BRD4 BD1', 'BRD4 BD2'] | nan | nan\n", "--------------------------------------------------------------------------------\n", "Degradation of BRD4 BD1 assessed by EGFP/mCherry reporter assay\n", "['BRD4 BD1'] | nan | nan\n", "--------------------------------------------------------------------------------\n", "Degradation of PARP1 in Primary Cardiomyocytes after 24 h treatment\n", "['PARP1'] | ['Primary Cardiomyocytes'] | [24.0]\n", "--------------------------------------------------------------------------------\n", "Degradation of HDAC6 in MM1S after 6 h treatment by in-cell ELISA analysis\n", "['HDAC6'] | ['MM.1S'] | [6.0]\n", "--------------------------------------------------------------------------------\n", "Degradation of total tau/P-tau in A152T neurons after 24 h treatment\n", "['tau/P-tau'] | ['A152T neurons'] | [24.0]\n", "--------------------------------------------------------------------------------\n", "Degradation of Rpn13 in MM.1S after 16 h treatment\n", "['Rpn13'] | ['MM.1S'] | [16.0]\n", "--------------------------------------------------------------------------------\n", "Degradation of HDAC6 in MM1S after 6 h treatment by in-cell ELISA analysis\n", "['HDAC6'] | ['MM.1S'] | [6.0]\n", "--------------------------------------------------------------------------------\n" ] } ], "source": [ "def extract_dc50_info(sentence):\n", " # Regex patterns for proteins/genes, cell types, and treatment hours\n", " protein_regex = r\"Degradation of total\\s(.+?)\\s(in|after|using|proteins)\"\n", " cell_regex = r\"in\\s([A-Za-z0-9-/.;\\(\\)\\s\\+]+)\\scells\"\n", " treatment_regex = r\"after\\s(\\d+/?\\d*?/?\\d*?\\s?h)\"\n", "\n", " # Extracting protein information\n", " if 'total' in sentence.lower():\n", " protein_match = re.search(protein_regex, sentence)\n", " proteins = protein_match.group(1).split(' and ') if protein_match else [\n", " re.search(r\"Degradation of\\s([A-Za-z0-9-]+)\", sentence).group(1)]\n", " else:\n", " if ' in ' in sentence.lower():\n", " proteins = sentence.split(' in ')[0].split('Degradation of ')[-1]\n", " proteins = proteins.split('/') if '/' in proteins else [proteins]\n", " else:\n", " protein_match = re.search(protein_regex, sentence)\n", " proteins = protein_match.group(1).split(\n", " '/') if protein_match else [re.search(r\"Degradation of\\s([A-Za-z0-9-\\/]+)\", sentence).group(1)]\n", " # Handle special cases...\n", " if 'BRD4 short/long' in sentence:\n", " proteins = ['BRD4 short', 'BRD4 long']\n", " if 'BRD4 BD1/2' in sentence:\n", " proteins = ['BRD4 BD1', 'BRD4 BD2']\n", " elif 'BRD4 BD1' in sentence:\n", " proteins = ['BRD4 BD1']\n", " if 'EGFR L858R/T790M' in sentence:\n", " proteins = ['EGFR L858R/T790M']\n", " if 'EGFR del19/T790M/C797S' in sentence:\n", " proteins = ['EGFR del19/T790M/C797S']\n", "\n", " # Extracting cell types\n", " cell_match = re.search(cell_regex, sentence)\n", " cells = cell_match.group(1).split('/') if cell_match else np.nan\n", " # Handle special cases...\n", " if 'Ba/F3' in sentence:\n", " # Replace any occurences that contain 'Ba' or 'F3' with 'Ba/F3' and remove duplicates while preserving the order in the other cells\n", " cells = ['Ba/F3' if 'Ba' in c or 'F3' in c else c for c in cells]\n", " cells.pop(cells.index('Ba/F3'))\n", " if 'ER-positive breast cancer cell lines' in sentence:\n", " cells = ['ER-positive breast cancer cell lines']\n", " if 'LNCaP (AR T878A)' in sentence:\n", " cells = ['LNCaP']\n", " if 'in A152T neurons' in sentence:\n", " cells = ['A152T neurons']\n", " if 'of Rpn13 in MM.1S after' in sentence:\n", " cells = ['MM.1S']\n", " if 'Primary Cardiomyocytes' in sentence:\n", " cells = ['Primary Cardiomyocytes']\n", " if ' HDAC6 in MM1S after' in sentence:\n", " cells = ['MM.1S']\n", "\n", " # Extracting treatment hours\n", " treatment_hours_match = re.search(treatment_regex, sentence)\n", " if treatment_hours_match:\n", " treatment_hours = treatment_hours_match.group(1).strip('h')\n", " treatment_hours = split_clean_str(treatment_hours, return_floats=True)\n", " else:\n", " treatment_hours = np.nan\n", "\n", " return {\n", " 'Target (Parsed)': proteins,\n", " 'Cell Type': cells,\n", " 'Treatment Time (h)': treatment_hours,\n", " }\n", "\n", "\n", "corner_cases = [\n", " # 'Degradation of BRD4',\n", " # 'Degradation of BRD4 short/long in HeLa cells after 24 h treatment',\n", " # 'Degradation of BRD4 BD1 assessed by EGFP/mCherry reporter assay',\n", " # 'Degradation of BRD4 BD1/2 assessed by EGFP/mCherry reporter assay',\n", " # 'Degradation of WT/Exon 20 Ins EGFR in OVCAR8/HeLa cells after 24 h treatment',\n", " # 'Degradation of TPM3-TRKA/TRKA in KM12/HEL cells after 6 h treatment',\n", " # 'Degradation of Exon 19 del/L858R EGFR in HCC827/H3255 cells after 24 h treatment',\n", " # 'Degradation of NPM-ALK/EML4-ALK in SU-DHL-1/NCI-H2228 cells after 16 h treatment',\n", " # 'Degradation of BCR-ABL T315I in Ba/F3 cells after 24 h treatment',\n", " # 'Degradation of BCR-ABL T315I in MOL/(Ba/F3)/R4;11 cells after 24 h treatment',\n", " # 'Degradation of ALK in H3122/Karpas 299/Kelly cells 16 h treatment',\n", " 'Degradation of AR in LNCaP/VCaP AR+ cells after 6 h treatment',\n", " 'Degradation of BRD4 BD1/2 assessed by EGFP/mCherry reporter assay',\n", " 'Degradation of BRD4 BD1 assessed by EGFP/mCherry reporter assay',\n", " 'Degradation of PARP1 in Primary Cardiomyocytes after 24 h treatment',\n", " 'Degradation of HDAC6 in MM1S after 6 h treatment by in-cell ELISA analysis',\n", " 'Degradation of total tau/P-tau in A152T neurons after 24 h treatment',\n", " 'Degradation of Rpn13 in MM.1S after 16 h treatment',\n", " 'Degradation of HDAC6 in MM1S after 6 h treatment by in-cell ELISA analysis',\n", "]\n", "\n", "for assay in assays[\"Assay (DC50/Dmax)\"][-5:] + corner_cases:\n", " if len(assay) < 5:\n", " continue\n", " print(assay)\n", " extracted_info = extract_dc50_info(assay)\n", " proteins, cells, treatment_hours = extracted_info[\n", " 'Target (Parsed)'], extracted_info['Cell Type'], extracted_info['Treatment Time (h)']\n", " print(proteins, \"|\", cells, \"|\", treatment_hours)\n", " print('-' * 80)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's first remove all entries with _all_ missing values in the `DC50 (nM)`, `Dmax (%)`, and `Assay (DC50/Dmax)` columns:" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1019" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "param_cols = assay_to_parameters[\"Assay (DC50/Dmax)\"]\n", "dc50_dmax_df = pd.concat([protac_df, scraped_protac_df]).dropna(\n", " subset=param_cols + [\"Assay (DC50/Dmax)\"], how='all')\n", "dc50_dmax_df = dc50_dmax_df[dc50_dmax_df[\"Assay (DC50/Dmax)\"].notnull()]\n", "# Drop all \"assay columns\" in assay_to_parameters except for \"Assay (DC50/Dmax)\" and its parameters\n", "dc50_dmax_df = dc50_dmax_df.drop(\n", " columns=[col for col in assay_cols if col not in param_cols + [\"Assay (DC50/Dmax)\"]])\n", "dc50_dmax_df = dc50_dmax_df.drop_duplicates()\n", "len(dc50_dmax_df)" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "8dc21c335d764482b9c202ad0ddce4c5", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Extracting DC50/Dmax info: 0%| | 0/1019 [00:00\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Compound IDUniprotTargetE3 LigasePDBNameSmilesDC50 (nM)Dmax (%)Assay (DC50/Dmax)...Hydrogen Bond Acceptor CountHydrogen Bond Donor CountRotatable Bond CountTopological Polar Surface AreaMolecular FormulaInChIInChI KeyTarget (Parsed)Cell TypeTreatment Time (h)
011Q9H8M2BRD9VHLNaNNaNCOC1=CC(C2=CN(C)C(=O)C3=CN=CC=C23)=CC(OC)=C1CN...560.0080.0Degradation of BRD9 in HeLa cells after 4 h tr......16322199.15C54H69FN8O10SInChI=1S/C54H69FN8O10S/c1-34-47(74-33-58-34)35...MXAKQOVZPDLCDK-UDVNCTHFSA-NBRD9HeLa4.0
122Q9H8M2BRD9VHLNaNVZ185COC1=CC(C2=CN(C)C(=O)C3=CN=CC=C23)=CC(OC)=C1CN...1.7695.0Degradation of BRD9 in RI-1 cells after 8 h tr......14319180.69C53H67FN8O8SInChI=1S/C53H67FN8O8S/c1-33-46(71-32-57-33)34-...ZAGCLFXBHOXXEN-JPTLTNPLSA-NBRD9RI-18.0
222Q9H8M2BRD9VHLNaNVZ185COC1=CC(C2=CN(C)C(=O)C3=CN=CC=C23)=CC(OC)=C1CN...4.00NaNDegradation of HiBiT-BRD9 in HEK293 cells afte......14319180.69C53H67FN8O8SInChI=1S/C53H67FN8O8S/c1-33-46(71-32-57-33)34-...ZAGCLFXBHOXXEN-JPTLTNPLSA-NHiBiT-BRD9HEK29324.0
322Q9H8M2BRD9VHLNaNVZ185COC1=CC(C2=CN(C)C(=O)C3=CN=CC=C23)=CC(OC)=C1CN...2.00NaNDegradation of BRD9 in EOL-1/A-204 cells after......14319180.69C53H67FN8O8SInChI=1S/C53H67FN8O8S/c1-33-46(71-32-57-33)34-...ZAGCLFXBHOXXEN-JPTLTNPLSA-NBRD9EOL-118.0
422Q9H8M2BRD9VHLNaNVZ185COC1=CC(C2=CN(C)C(=O)C3=CN=CC=C23)=CC(OC)=C1CN...8.00NaNDegradation of BRD9 in EOL-1/A-204 cells after......14319180.69C53H67FN8O8SInChI=1S/C53H67FN8O8S/c1-33-46(71-32-57-33)34-...ZAGCLFXBHOXXEN-JPTLTNPLSA-NBRD9A-20418.0
\n", "

5 rows × 26 columns

\n", "" ], "text/plain": [ " Compound ID Uniprot Target E3 Ligase PDB Name \\\n", "0 11 Q9H8M2 BRD9 VHL NaN NaN \n", "1 22 Q9H8M2 BRD9 VHL NaN VZ185 \n", "2 22 Q9H8M2 BRD9 VHL NaN VZ185 \n", "3 22 Q9H8M2 BRD9 VHL NaN VZ185 \n", "4 22 Q9H8M2 BRD9 VHL NaN VZ185 \n", "\n", " Smiles DC50 (nM) Dmax (%) \\\n", "0 COC1=CC(C2=CN(C)C(=O)C3=CN=CC=C23)=CC(OC)=C1CN... 560.00 80.0 \n", "1 COC1=CC(C2=CN(C)C(=O)C3=CN=CC=C23)=CC(OC)=C1CN... 1.76 95.0 \n", "2 COC1=CC(C2=CN(C)C(=O)C3=CN=CC=C23)=CC(OC)=C1CN... 4.00 NaN \n", "3 COC1=CC(C2=CN(C)C(=O)C3=CN=CC=C23)=CC(OC)=C1CN... 2.00 NaN \n", "4 COC1=CC(C2=CN(C)C(=O)C3=CN=CC=C23)=CC(OC)=C1CN... 8.00 NaN \n", "\n", " Assay (DC50/Dmax) ... \\\n", "0 Degradation of BRD9 in HeLa cells after 4 h tr... ... \n", "1 Degradation of BRD9 in RI-1 cells after 8 h tr... ... \n", "2 Degradation of HiBiT-BRD9 in HEK293 cells afte... ... \n", "3 Degradation of BRD9 in EOL-1/A-204 cells after... ... \n", "4 Degradation of BRD9 in EOL-1/A-204 cells after... ... \n", "\n", " Hydrogen Bond Acceptor Count Hydrogen Bond Donor Count \\\n", "0 16 3 \n", "1 14 3 \n", "2 14 3 \n", "3 14 3 \n", "4 14 3 \n", "\n", " Rotatable Bond Count Topological Polar Surface Area Molecular Formula \\\n", "0 22 199.15 C54H69FN8O10S \n", "1 19 180.69 C53H67FN8O8S \n", "2 19 180.69 C53H67FN8O8S \n", "3 19 180.69 C53H67FN8O8S \n", "4 19 180.69 C53H67FN8O8S \n", "\n", " InChI \\\n", "0 InChI=1S/C54H69FN8O10S/c1-34-47(74-33-58-34)35... \n", "1 InChI=1S/C53H67FN8O8S/c1-33-46(71-32-57-33)34-... \n", "2 InChI=1S/C53H67FN8O8S/c1-33-46(71-32-57-33)34-... \n", "3 InChI=1S/C53H67FN8O8S/c1-33-46(71-32-57-33)34-... \n", "4 InChI=1S/C53H67FN8O8S/c1-33-46(71-32-57-33)34-... \n", "\n", " InChI Key Target (Parsed) Cell Type Treatment Time (h) \n", "0 MXAKQOVZPDLCDK-UDVNCTHFSA-N BRD9 HeLa 4.0 \n", "1 ZAGCLFXBHOXXEN-JPTLTNPLSA-N BRD9 RI-1 8.0 \n", "2 ZAGCLFXBHOXXEN-JPTLTNPLSA-N HiBiT-BRD9 HEK293 24.0 \n", "3 ZAGCLFXBHOXXEN-JPTLTNPLSA-N BRD9 EOL-1 18.0 \n", "4 ZAGCLFXBHOXXEN-JPTLTNPLSA-N BRD9 A-204 18.0 \n", "\n", "[5 rows x 26 columns]" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Parsed table len: 1216\n" ] } ], "source": [ "parsed_table = []\n", "\n", "for i, row in tqdm(dc50_dmax_df.iterrows(), total=len(dc50_dmax_df), desc='Extracting DC50/Dmax info'):\n", " assay = row[\"Assay (DC50/Dmax)\"]\n", " if len(assay) < 5:\n", " continue\n", " extracted_info = extract_dc50_info(assay)\n", " extracted_info['DC50 (nM)'] = split_clean_str(\n", " row['DC50 (nM)'], return_floats=True)\n", " extracted_info['Dmax (%)'] = split_clean_str(\n", " row['Dmax (%)'], return_floats=True)\n", "\n", " # Get the max len of each list in the extracted info\n", " max_len = max([len(v)\n", " for v in extracted_info.values() if isinstance(v, list)])\n", " for i in range(max_len):\n", " row_tmp = row.copy().to_dict()\n", " row_tmp.update({k: v[i % len(v)] if isinstance(v, list)\n", " else v for k, v in extracted_info.items()})\n", " parsed_table.append(row_tmp)\n", "\n", "parsed_table = pd.DataFrame(parsed_table)\n", "display(parsed_table.head())\n", "print(f'Parsed table len: {len(parsed_table)}')" ] }, { "cell_type": "code", "execution_count": 31, "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", "
Assay (DC50/Dmax)TargetTarget (Parsed)
2Degradation of HiBiT-BRD9 in HEK293 cells afte...BRD9HiBiT-BRD9
6Degradation of HiBiT-BRD7 in HEK293 cells afte...BRD7HiBiT-BRD7
77Degradation of NPM-ALK/EML4-ALK in SU-DHL-1/NC...ALKNPM-ALK
78Degradation of NPM-ALK/EML4-ALK in SU-DHL-1/NC...ALKEML4-ALK
102Degradation of Fak in PC3 cells after 24 h tre...FAKFak
111Degradation of WT/Exon 20 Ins EGFR in OVCAR8/H...EGFRWT
112Degradation of WT/Exon 20 Ins EGFR in OVCAR8/H...EGFRExon 20 Ins EGFR
113Degradation of Exon 19 del/L858R EGFR in HCC82...EGFRExon 19 del
114Degradation of Exon 19 del/L858R EGFR in HCC82...EGFRL858R EGFR
115Degradation of L858R, T790M EGFR in H1975 cell...EGFRL858R, T790M EGFR
122Degradation of C481S BTK in XLA cells after 24...BTK C481SC481S BTK
141Degradation of BRD4 short/long in HeLa cells a...BRD4BRD4 short
142Degradation of BRD4 short/long in HeLa cells a...BRD4BRD4 long
144Degradation of BRD4 BD1/2 assessed by EGFP/mCh...BRD4BRD4 BD1
145Degradation of BRD4 BD1/2 assessed by EGFP/mCh...BRD4BRD4 BD2
208Degradation of total STAT3 and p-STAT3Y705 pro...STAT3p-STAT3Y705
212Degradation of total STAT3 and p-STAT3Y705 pro...STAT3p-STAT3Y705
262Degradation of G1202R ALK in 293T cellsALK G1202RG1202R ALK
356Degradation of SMARCA2 in MV-4-11 cells after ...SMARCA4SMARCA2
365Degradation of ERalpha in MCF-7/T47D cells aft...ERERalpha
367Degradation of ERalpha in MCF-7 cells after 6 ...ERERalpha
368Degradation of ERalpha in MCF-7 cells after 6h...ERERalpha
387Degradation of pVHL30 in HeLa cells after 24 h...VHLpVHL30
388Degradation of TrkC in Hs578t cells after 24 h...TRKCTrkC
389Degradation of HADC6 in MM.1S cells after 24 h...HDAC6HADC6
408Degradation of ERalpha in MCF-7 cells after 4/...ERERalpha
411Degradation of ERalpha in MCF-7 cells after 4h...ERERalpha
412Degradation of ERalpha in MCF-7 cells after 4/...ERERalpha
495Degradation of total tau/P-tau in A152T neuron...Tautau/P-tau
523Degradation of ERalpha in MCF7 cellsERERalpha
536Degradation of Fak in primary Sertoli/germ cel...FAKFak
620Degradation of Fak in HLE/HuH-7/SNU-423 cells ...FAKFak
623Degradation of Fak in HUH-1/HepG2/SK-Hep-1 cel...FAKFak
626Degradation of Fak in A549/Hep3B2.1-7/SNU-387 ...FAKFak
629Degradation of Fak in HLF/SNU-398/HUCCT1 cells...FAKFak
663Degradation of TPM3-TRKA/TRKA in KM12/HEL cell...TRKATPM3-TRKA
718Degradation of EGFR del19 in HCC827 cells afte...EGFR e19dEGFR del19
769Degradation of ERalpha in MCF-7 cellsERERalpha
806Degradation of WDR5-HiBiT in MV4-11 (WDR5-HiBi...WDR5WDR5-HiBiT
824Degradation of BRD4 long in HEK293 cells after...BRD4BRD4 long
892Degradation of PYK2 in SR cells after 24 h tre...PTK2BPYK2
896Degradation of RSK1 in NCI-H2228/A549/Calu-1 c...RPS6KA1RSK1
899Degradation of EGFR del19 in HCC-827 cells aft...EGFR e19dEGFR del19
1014Degradation of total AKT in BT474 cells after ...AKT2AKT
1015Degradation of total AKT in BT474 cells after ...AKT1AKT
1016Degradation of total AKT in BT474 cells after ...AKT3AKT
1058Degradation of GSK3B in SH-SY5Y cells after 24...GSK-3betaGSK3B
1145Degradation of SMARCA2 HiBiT in HT1080 cells a...SMARCA2SMARCA2 HiBiT
1191Degradation of Tau5 in HEK293-hTau cells after...TauTau5
1192Degradation of ENL in MV4;11 cells after 24 h ...MLLT1ENL
\n", "
" ], "text/plain": [ " Assay (DC50/Dmax) Target \\\n", "2 Degradation of HiBiT-BRD9 in HEK293 cells afte... BRD9 \n", "6 Degradation of HiBiT-BRD7 in HEK293 cells afte... BRD7 \n", "77 Degradation of NPM-ALK/EML4-ALK in SU-DHL-1/NC... ALK \n", "78 Degradation of NPM-ALK/EML4-ALK in SU-DHL-1/NC... ALK \n", "102 Degradation of Fak in PC3 cells after 24 h tre... FAK \n", "111 Degradation of WT/Exon 20 Ins EGFR in OVCAR8/H... EGFR \n", "112 Degradation of WT/Exon 20 Ins EGFR in OVCAR8/H... EGFR \n", "113 Degradation of Exon 19 del/L858R EGFR in HCC82... EGFR \n", "114 Degradation of Exon 19 del/L858R EGFR in HCC82... EGFR \n", "115 Degradation of L858R, T790M EGFR in H1975 cell... EGFR \n", "122 Degradation of C481S BTK in XLA cells after 24... BTK C481S \n", "141 Degradation of BRD4 short/long in HeLa cells a... BRD4 \n", "142 Degradation of BRD4 short/long in HeLa cells a... BRD4 \n", "144 Degradation of BRD4 BD1/2 assessed by EGFP/mCh... BRD4 \n", "145 Degradation of BRD4 BD1/2 assessed by EGFP/mCh... BRD4 \n", "208 Degradation of total STAT3 and p-STAT3Y705 pro... STAT3 \n", "212 Degradation of total STAT3 and p-STAT3Y705 pro... STAT3 \n", "262 Degradation of G1202R ALK in 293T cells ALK G1202R \n", "356 Degradation of SMARCA2 in MV-4-11 cells after ... SMARCA4 \n", "365 Degradation of ERalpha in MCF-7/T47D cells aft... ER \n", "367 Degradation of ERalpha in MCF-7 cells after 6 ... ER \n", "368 Degradation of ERalpha in MCF-7 cells after 6h... ER \n", "387 Degradation of pVHL30 in HeLa cells after 24 h... VHL \n", "388 Degradation of TrkC in Hs578t cells after 24 h... TRKC \n", "389 Degradation of HADC6 in MM.1S cells after 24 h... HDAC6 \n", "408 Degradation of ERalpha in MCF-7 cells after 4/... ER \n", "411 Degradation of ERalpha in MCF-7 cells after 4h... ER \n", "412 Degradation of ERalpha in MCF-7 cells after 4/... ER \n", "495 Degradation of total tau/P-tau in A152T neuron... Tau \n", "523 Degradation of ERalpha in MCF7 cells ER \n", "536 Degradation of Fak in primary Sertoli/germ cel... FAK \n", "620 Degradation of Fak in HLE/HuH-7/SNU-423 cells ... FAK \n", "623 Degradation of Fak in HUH-1/HepG2/SK-Hep-1 cel... FAK \n", "626 Degradation of Fak in A549/Hep3B2.1-7/SNU-387 ... FAK \n", "629 Degradation of Fak in HLF/SNU-398/HUCCT1 cells... FAK \n", "663 Degradation of TPM3-TRKA/TRKA in KM12/HEL cell... TRKA \n", "718 Degradation of EGFR del19 in HCC827 cells afte... EGFR e19d \n", "769 Degradation of ERalpha in MCF-7 cells ER \n", "806 Degradation of WDR5-HiBiT in MV4-11 (WDR5-HiBi... WDR5 \n", "824 Degradation of BRD4 long in HEK293 cells after... BRD4 \n", "892 Degradation of PYK2 in SR cells after 24 h tre... PTK2B \n", "896 Degradation of RSK1 in NCI-H2228/A549/Calu-1 c... RPS6KA1 \n", "899 Degradation of EGFR del19 in HCC-827 cells aft... EGFR e19d \n", "1014 Degradation of total AKT in BT474 cells after ... AKT2 \n", "1015 Degradation of total AKT in BT474 cells after ... AKT1 \n", "1016 Degradation of total AKT in BT474 cells after ... AKT3 \n", "1058 Degradation of GSK3B in SH-SY5Y cells after 24... GSK-3beta \n", "1145 Degradation of SMARCA2 HiBiT in HT1080 cells a... SMARCA2 \n", "1191 Degradation of Tau5 in HEK293-hTau cells after... Tau \n", "1192 Degradation of ENL in MV4;11 cells after 24 h ... MLLT1 \n", "\n", " Target (Parsed) \n", "2 HiBiT-BRD9 \n", "6 HiBiT-BRD7 \n", "77 NPM-ALK \n", "78 EML4-ALK \n", "102 Fak \n", "111 WT \n", "112 Exon 20 Ins EGFR \n", "113 Exon 19 del \n", "114 L858R EGFR \n", "115 L858R, T790M EGFR \n", "122 C481S BTK \n", "141 BRD4 short \n", "142 BRD4 long \n", "144 BRD4 BD1 \n", "145 BRD4 BD2 \n", "208 p-STAT3Y705 \n", "212 p-STAT3Y705 \n", "262 G1202R ALK \n", "356 SMARCA2 \n", "365 ERalpha \n", "367 ERalpha \n", "368 ERalpha \n", "387 pVHL30 \n", "388 TrkC \n", "389 HADC6 \n", "408 ERalpha \n", "411 ERalpha \n", "412 ERalpha \n", "495 tau/P-tau \n", "523 ERalpha \n", "536 Fak \n", "620 Fak \n", "623 Fak \n", "626 Fak \n", "629 Fak \n", "663 TPM3-TRKA \n", "718 EGFR del19 \n", "769 ERalpha \n", "806 WDR5-HiBiT \n", "824 BRD4 long \n", "892 PYK2 \n", "896 RSK1 \n", "899 EGFR del19 \n", "1014 AKT \n", "1015 AKT \n", "1016 AKT \n", "1058 GSK3B \n", "1145 SMARCA2 HiBiT \n", "1191 Tau5 \n", "1192 ENL " ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "parsed_table[parsed_table['Target'] !=\n", " parsed_table['Target (Parsed)']][['Assay (DC50/Dmax)', 'Target', 'Target (Parsed)']].drop_duplicates()" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Non-Nan Active: 790\n" ] }, { "data": { "image/png": "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6anNmzfr0KFD5frecccdatTo//6MdenSRdK3N+p+V1n7iRMnKjlT6fDhwzp9+rTGjBnjss+mTZvqnnvu0c6dO3Xx4sVKt7+SshuTH3roIUlyXno6fvy4cwwl6Z///Kc6duyoAQMGVOs4FRk3bpwyMjJ0+PBhZ9uyZct0yy23KCoqSpL0zjvv6PLly/rFL37hMnPo4+Ojfv36VTirBjQkhB2gAejSpYtiYmLKLYGBgVfddsaMGfrv//5v7dy5U4MHD1aLFi0UHx9f6ePs3/XVV19JUoVP94SFhTnXl/1vcHBwuX4VtVW2zwULFujRRx9Vnz599Prrr2vnzp3atWuXbr/9dhUWFpbr37x5c5fXXl5eV2z/5ptvKqzlu+dQ2bmWlpYqNze30u0rU1BQoNdee029e/dWy5Ytdf78eZ0/f1533323HA6HMwhJ3z7l1aZNmyof40pGjx4tb29v5yWzgwcPateuXRo3bpyzz5kzZyRJt9xyizw9PV2WtWvXulyuBBqihvHoA4Bq8/Dw0JQpUzRlyhSdP39emzZt0lNPPaVBgwbp5MmTatKkSaXbtmjRQpKUlZVV7k349OnTCgoKculX9qb5XdnZ2RXO7jgcjnJtK1asUFxcnF566SWX9oKCgiufZA347rl+3+nTp9WoUSM1a9asyvtdvXq1Ll68qI8++qjC7detW6fc3Fw1a9ZMLVu2LHfj9/Vq1qyZ7rrrLr3yyiuaM2eOli1bJh8fH91///3OPmU/x7/+9a9q165djR4fqA+Y2QF+QG644Qbde++9euyxx3Tu3DnnUzve3t6SVG725LbbbpP0bQj5rl27dunQoUOKj4+XJPXp00fe3t5au3atS7+dO3dW+MRRZRwOh7OWMp9++qnL01C1pVOnTmrdurVWrVrlcuP3119/rddff935hFZVpaamyt/fX5s3b9aWLVtclueee05FRUVauXKlJGnw4ME6cuSI3n333Ur3V9nP6krGjRun06dP6+2339aKFSt0991364YbbnCuHzRokDw8PPT5559XOIMYExNT5fMG6hNmdgDLDR06VFFRUYqJiVHLli11/PhxLVy4UO3atVNkZKQkqVu3bpKkF154QWPHjpWnp6c6deqkTp066Ze//KUWLVqkRo0aafDgwTp27JiefvpphYeH64knnpD07WWjKVOmaO7cuWrWrJnuvvtu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XgsXLnRpGzlypI4cOVKD1QFoKAg7AOqtpUuXatKkSdq+fbtOnDhxXfvy9fVVq1ataqgyAA0JYQdAvfT111/rL3/5ix599FENGTJEaWlpLuvXr1+vmJgY+fj4KCgoSMOHD5ckxcXF6fjx43riiSfkcDjkcDgkuV7GOnz4sBwOhz777DOXfS5YsEDt27d3fsP1wYMHdccdd6hp06YKDg7WmDFjlJOTU7snDqDGEXYA1Etr165Vp06d1KlTJz3wwANatmyZM4T84x//0PDhw3XnnXdqz5492rx5s2JiYiRJb7zxhtq0aaPZs2crKytLWVlZ5fbdqVMnRUdHa+XKlS7tq1at0qhRo+RwOJSVlaV+/fqpZ8+e2r17tzZs2KAzZ85oxIgRtX/yAGqUh7sLAICKpKam6oEHHpAk3X777bpw4YI2b96sAQMG6JlnntF9992n5ORkZ/8ePXpIkpo3b67GjRvL399fISEhle5/9OjRWrx4sX7/+99Lko4cOaLMzEy98sorkqSXXnpJvXr1UkpKinObpUuXKjw8XEeOHFHHjh1r/JwB1A5mdgDUO4cPH9ZHH32k++67T5Lk4eGhkSNHaunSpZKkvXv3Kj4+/rqOcd999+n48ePauXOnJGnlypXq2bOnunbtKknKzMzUli1b1LRpU+fSuXNnSdLnn39+XccGULeY2QFQ76Smpury5ctq3bq1s80YI09PT+Xm5srX1/e6jxEaGqr+/ftr1apVuvXWW7V69WpNmDDBub60tFRDhw7Vs88+W+G2ABoOwg6AeuXy5ct65ZVXNH/+fCUkJLisu+eee7Ry5Up1795dmzdv1rhx4yrch5eXl0pKSq56rNGjR+s3v/mN7r//fn3++efOmSRJ6tWrl15//XW1b99eHh78qQQaMi5jAahX/v73vys3N1fjx49XVFSUy3LvvfcqNTVVs2bN0urVqzVr1iwdOnRI+/bt07x585z7aN++vd5//3395z//ueLTU8OHD1d+fr4effRR9e/f32Um6bHHHtO5c+d0//3366OPPtIXX3yhjRs36qGHHrqmIAWg/iDsAKhXUlNTNWDAAAUGBpZbd88992jv3r0KCAjQa6+9pvXr16tnz5667bbb9OGHHzr7zZ49W8eOHdONN96oli1bVnqsgIAADR06VJ988olGjx7tsi4sLEwffPCBSkpKNGjQIEVFRWny5MkKDAxUo0b86QQaEocpe5YTAADAQvzzBAAAWI2wAwAArEbYAQAAViPsAAAAqxF2AACA1Qg7AADAaoQdAABgNcIOAACwGmEHAABYjbADAACsRtgBAABWI+wAAACr/T+++W+vnnu3ggAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "parsed_table['Active'] = parsed_table.apply(\n", " lambda row: is_active(row['DC50 (nM)'], row['Dmax (%)']),\n", " axis=1,\n", ")\n", "\n", "print(f'Non-Nan Active: {len(parsed_table[parsed_table[\"Active\"].notnull()])}')\n", "\n", "# Histogram of Active\n", "sns.histplot(data=parsed_table, x='Active', bins=4)\n", "plt.title('Histogram of Active')\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [], "source": [ "parsed_table['Database'] = 'PROTAC-DB'" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Merge Parsed DataFrames" ] }, { "cell_type": "code", "execution_count": 34, "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", "
Compound IDUniprotSmilesE3 LigaseInChIInChI KeyMolecular WeightHeavy Atom CountRing CountRotatable Bond Count...DatabaseMolecular FormulacLogPTargetPDBNameAssay (DC50/Dmax)Exact MassXLogP3Target (Parsed)
01Q07817Cc1ncsc1-c1ccc([C@H](C)NC(=O)[C@@H]2C[C@@H](O)...VHLInChI=1S/C73H88ClF3N10O10S4/c1-47(49-13-15-51(...SXPDUCVNMGMWBJ-FMZBIETASA-N1486.2821011024...PROTAC-PediaC73H88ClF3N10O10S410.83732NaNNaNNaNNaNNaNNaNNaN
12Q07817Cc1ncsc1-c1ccc([C@H](C)NC(=O)[C@@H]2C[C@@H](O)...VHLInChI=1S/C74H90ClF3N10O10S4/c1-48(50-13-15-52(...HQKUMELJMUNTTF-NMKDNUEVSA-N1500.3091021025...PROTAC-PediaC74H90ClF3N10O10S411.22742NaNNaNNaNNaNNaNNaNNaN
23Q07817Cc1ncsc1-c1ccc([C@H](C)NC(=O)[C@@H]2C[C@@H](O)...VHLInChI=1S/C75H92ClF3N10O10S4/c1-49(51-16-18-53(...ATQCEJKUPSBDMA-QARNUTPLSA-N1514.3361031026...PROTAC-PediaC75H92ClF3N10O10S411.61752NaNNaNNaNNaNNaNNaNNaN
34Q07817Cc1ncsc1-c1ccc([C@H](C)NC(=O)[C@@H]2C[C@@H](O)...VHLInChI=1S/C76H94ClF3N10O10S4/c1-50(52-17-19-54(...FNKQAGMHNFFSEI-DTTPTBRMSA-N1528.3631041027...PROTAC-PediaC76H94ClF3N10O10S412.00762NaNNaNNaNNaNNaNNaNNaN
45Q07817Cc1ncsc1-c1ccc([C@H](C)NC(=O)[C@@H]2C[C@@H](O)...VHLInChI=1S/C77H96ClF3N10O10S4/c1-51(53-18-20-55(...PXVFFBGSTYQHRO-REQIQPEASA-N1542.3901051028...PROTAC-PediaC77H96ClF3N10O10S412.39772NaNNaNNaNNaNNaNNaNNaN
..................................................................
21362342O60885CC1=C(C2=CC=C(CNC(=O)[C@@H]3C[C@@H](O)CN3C(=O)...VHLInChI=1S/C50H61ClN8O8S2/c1-29-31(3)69-49-42(29...VRVWHAZIBGEPEK-DPSJZEHMSA-N1001.67369720...PROTAC-DBC50H61ClN8O8S2NaNBRD4NaNNaNDegradation of BRD4 long in HEK293 cells after...1000.3742316.76BRD4 long
21372887Q05397CNC(=O)C1=CC=CC=C1NC1=CC(NC2=CC=C(N3CCN(CCOCCO...VHLInChI=1S/C58H75F3N10O10S/c1-37(39-12-14-40(15-...FOOHAGZPIHCYKX-ZSFXBAAMSA-N1161.35982727...PROTAC-DBC58H75F3N10O10SNaNFAKNaNNaNDegradation of FAK in A549 cells after 24 h tr...1160.5340446.81FAK
21382889Q05397CNC(=O)C1=CC=CC=C1NC1=CC(NC2=CC=C(N3CCN(CCOCCO...VHLInChI=1S/C54H67F3N10O8S/c1-33(35-12-14-36(15-1...RDCVMTUYWQXPEC-FSHOLZCKSA-N1073.25376721...PROTAC-DBC54H67F3N10O8SNaNFAKNaNNaNDegradation of FAK in A549 cells after 24 h tr...1072.4816157.11FAK
21392890Q05397CNC(=O)C1=CC=CC=C1NC1=CC(NC2=CC=C(N3CCN(CCOCC(...VHLInChI=1S/C52H63F3N10O7S/c1-31(33-12-14-34(15-1...SLSLLSIRBMAERC-MGVZSLQJSA-N1029.20073718...PROTAC-DBC52H63F3N10O7SNaNFAKNaNNaNDegradation of FAK in A549 cells after 24 h tr...1028.4554007.26FAK
21402891Q05397CNC(=O)C1=CC=CC=C1NC1=CC(NC2=CC=C(N3CCN(CCC(=O...VHLInChI=1S/C51H61F3N10O6S/c1-30(32-12-14-33(15-1...ASRIXACKPXMNKY-FCFVTTBASA-N999.17471716...PROTAC-DBC51H61F3N10O6SNaNFAKNaNNaNDegradation of FAK in A549 cells after 24 h tr...998.4448357.31FAK
\n", "

2141 rows × 30 columns

\n", "
" ], "text/plain": [ " Compound ID Uniprot Smiles \\\n", "0 1 Q07817 Cc1ncsc1-c1ccc([C@H](C)NC(=O)[C@@H]2C[C@@H](O)... \n", "1 2 Q07817 Cc1ncsc1-c1ccc([C@H](C)NC(=O)[C@@H]2C[C@@H](O)... \n", "2 3 Q07817 Cc1ncsc1-c1ccc([C@H](C)NC(=O)[C@@H]2C[C@@H](O)... \n", "3 4 Q07817 Cc1ncsc1-c1ccc([C@H](C)NC(=O)[C@@H]2C[C@@H](O)... \n", "4 5 Q07817 Cc1ncsc1-c1ccc([C@H](C)NC(=O)[C@@H]2C[C@@H](O)... \n", "... ... ... ... \n", "2136 2342 O60885 CC1=C(C2=CC=C(CNC(=O)[C@@H]3C[C@@H](O)CN3C(=O)... \n", "2137 2887 Q05397 CNC(=O)C1=CC=CC=C1NC1=CC(NC2=CC=C(N3CCN(CCOCCO... \n", "2138 2889 Q05397 CNC(=O)C1=CC=CC=C1NC1=CC(NC2=CC=C(N3CCN(CCOCCO... \n", "2139 2890 Q05397 CNC(=O)C1=CC=CC=C1NC1=CC(NC2=CC=C(N3CCN(CCOCC(... \n", "2140 2891 Q05397 CNC(=O)C1=CC=CC=C1NC1=CC(NC2=CC=C(N3CCN(CCC(=O... \n", "\n", " E3 Ligase InChI \\\n", "0 VHL InChI=1S/C73H88ClF3N10O10S4/c1-47(49-13-15-51(... \n", "1 VHL InChI=1S/C74H90ClF3N10O10S4/c1-48(50-13-15-52(... \n", "2 VHL InChI=1S/C75H92ClF3N10O10S4/c1-49(51-16-18-53(... \n", "3 VHL InChI=1S/C76H94ClF3N10O10S4/c1-50(52-17-19-54(... \n", "4 VHL InChI=1S/C77H96ClF3N10O10S4/c1-51(53-18-20-55(... \n", "... ... ... \n", "2136 VHL InChI=1S/C50H61ClN8O8S2/c1-29-31(3)69-49-42(29... \n", "2137 VHL InChI=1S/C58H75F3N10O10S/c1-37(39-12-14-40(15-... \n", "2138 VHL InChI=1S/C54H67F3N10O8S/c1-33(35-12-14-36(15-1... \n", "2139 VHL InChI=1S/C52H63F3N10O7S/c1-31(33-12-14-34(15-1... \n", "2140 VHL InChI=1S/C51H61F3N10O6S/c1-30(32-12-14-33(15-1... \n", "\n", " InChI Key Molecular Weight Heavy Atom Count \\\n", "0 SXPDUCVNMGMWBJ-FMZBIETASA-N 1486.282 101 \n", "1 HQKUMELJMUNTTF-NMKDNUEVSA-N 1500.309 102 \n", "2 ATQCEJKUPSBDMA-QARNUTPLSA-N 1514.336 103 \n", "3 FNKQAGMHNFFSEI-DTTPTBRMSA-N 1528.363 104 \n", "4 PXVFFBGSTYQHRO-REQIQPEASA-N 1542.390 105 \n", "... ... ... ... \n", "2136 VRVWHAZIBGEPEK-DPSJZEHMSA-N 1001.673 69 \n", "2137 FOOHAGZPIHCYKX-ZSFXBAAMSA-N 1161.359 82 \n", "2138 RDCVMTUYWQXPEC-FSHOLZCKSA-N 1073.253 76 \n", "2139 SLSLLSIRBMAERC-MGVZSLQJSA-N 1029.200 73 \n", "2140 ASRIXACKPXMNKY-FCFVTTBASA-N 999.174 71 \n", "\n", " Ring Count Rotatable Bond Count ... Database Molecular Formula \\\n", "0 10 24 ... PROTAC-Pedia C73H88ClF3N10O10S4 \n", "1 10 25 ... PROTAC-Pedia C74H90ClF3N10O10S4 \n", "2 10 26 ... PROTAC-Pedia C75H92ClF3N10O10S4 \n", "3 10 27 ... PROTAC-Pedia C76H94ClF3N10O10S4 \n", "4 10 28 ... PROTAC-Pedia C77H96ClF3N10O10S4 \n", "... ... ... ... ... ... \n", "2136 7 20 ... PROTAC-DB C50H61ClN8O8S2 \n", "2137 7 27 ... PROTAC-DB C58H75F3N10O10S \n", "2138 7 21 ... PROTAC-DB C54H67F3N10O8S \n", "2139 7 18 ... PROTAC-DB C52H63F3N10O7S \n", "2140 7 16 ... PROTAC-DB C51H61F3N10O6S \n", "\n", " cLogP Target PDB Name \\\n", "0 10.83732 NaN NaN NaN \n", "1 11.22742 NaN NaN NaN \n", "2 11.61752 NaN NaN NaN \n", "3 12.00762 NaN NaN NaN \n", "4 12.39772 NaN NaN NaN \n", "... ... ... ... ... \n", "2136 NaN BRD4 NaN NaN \n", "2137 NaN FAK NaN NaN \n", "2138 NaN FAK NaN NaN \n", "2139 NaN FAK NaN NaN \n", "2140 NaN FAK NaN NaN \n", "\n", " Assay (DC50/Dmax) Exact Mass XLogP3 \\\n", "0 NaN NaN NaN \n", "1 NaN NaN NaN \n", "2 NaN NaN NaN \n", "3 NaN NaN NaN \n", "4 NaN NaN NaN \n", "... ... ... ... \n", "2136 Degradation of BRD4 long in HEK293 cells after... 1000.374231 6.76 \n", "2137 Degradation of FAK in A549 cells after 24 h tr... 1160.534044 6.81 \n", "2138 Degradation of FAK in A549 cells after 24 h tr... 1072.481615 7.11 \n", "2139 Degradation of FAK in A549 cells after 24 h tr... 1028.455400 7.26 \n", "2140 Degradation of FAK in A549 cells after 24 h tr... 998.444835 7.31 \n", "\n", " Target (Parsed) \n", "0 NaN \n", "1 NaN \n", "2 NaN \n", "3 NaN \n", "4 NaN \n", "... ... \n", "2136 BRD4 long \n", "2137 FAK \n", "2138 FAK \n", "2139 FAK \n", "2140 FAK \n", "\n", "[2141 rows x 30 columns]" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "merged_df = pd.concat([protac_pedia_df[ppedia_cols],\n", " parsed_table], ignore_index=True)\n", "merged_df" ] }, { "cell_type": "code", "execution_count": 35, "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", "
UniprotTargetTarget (Parsed)Article DOI
1125NaNBCR-ABLBCR-ABL10.1021/acs.jmedchem.9b01264
1300NaNBCR-ABLBCR-ABL10.1158/0008-5472.CAN-19-1236
1321NaNBCR-ABLBCR-ABL10.1111/cas.13284
1463NaNBCR-ABLBCR-ABL10.1021/acs.jmedchem.9b02058
1498NaNBCR-ABLBCR-ABL10.1021/acs.jmedchem.0c00967
1526NaNBCR-ABLBCR-ABL10.1039/d0cc02201b
1960NaNBCR-ABLBCR-ABL10.1016/j.ejmech.2021.113645
2083NaNBCR-ABL T315IBCR-ABL T315I10.1016/j.apsb.2020.11.009
\n", "
" ], "text/plain": [ " Uniprot Target Target (Parsed) Article DOI\n", "1125 NaN BCR-ABL BCR-ABL 10.1021/acs.jmedchem.9b01264\n", "1300 NaN BCR-ABL BCR-ABL 10.1158/0008-5472.CAN-19-1236\n", "1321 NaN BCR-ABL BCR-ABL 10.1111/cas.13284\n", "1463 NaN BCR-ABL BCR-ABL 10.1021/acs.jmedchem.9b02058\n", "1498 NaN BCR-ABL BCR-ABL 10.1021/acs.jmedchem.0c00967\n", "1526 NaN BCR-ABL BCR-ABL 10.1039/d0cc02201b\n", "1960 NaN BCR-ABL BCR-ABL 10.1016/j.ejmech.2021.113645\n", "2083 NaN BCR-ABL T315I BCR-ABL T315I 10.1016/j.apsb.2020.11.009" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "merged_df[merged_df['Target'].str.contains(\n", " 'BCR') | merged_df['Target'].str.contains('ABL')][['Uniprot', 'Target', 'Target (Parsed)', 'Article DOI']].drop_duplicates()" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [], "source": [ "target2uniprot = {\n", " 'BCR-ABL': 'P00520',\n", " 'BCR-ABL T315I': 'P00520',\n", " 'NS3': 'A8DG50',\n", " 'HSP90': 'P07900',\n", "}\n", "# Fill in Uniprot column based on Target column if Uniprot is NaN\n", "merged_df['Uniprot'] = merged_df.apply(\n", " lambda row: target2uniprot.get(row['Target'], row['Uniprot']), axis=1)" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Print NaN percentage per column\n", "tmp = merged_df.isna().sum() / len(merged_df) * 100\n", "# Plot tmp as a horizontal bar plot\n", "tmp.plot(kind='barh')\n", "plt.title('Percentage of NaN values per column')\n", "plt.grid(axis='x', alpha=0.5)\n", "plt.show()\n", "\n", "# plt.figure(figsize=(10, 5))\n", "# sns.barplot(x=tmp.index, y=tmp.values)\n", "# plt.xticks(rotation=90)\n", "# plt.title('NaN percentage per column')\n", "# plt.grid(axis='y', alpha=0.5)\n", "# plt.show()" ] }, { "cell_type": "code", "execution_count": 38, "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", "
Compound IDTargetCell TypeAssay (DC50/Dmax)
227250NaNNaNNaN
229252NaNNaNNaN
230253NaNNaNNaN
231254NaNNaNNaN
232255NaNNaNNaN
...............
1089340BRD4NaNDegradation of BRD4 BD1/2 assessed by EGFP/mCh...
1090342BRD4 BD1NaNDegradation of BRD4 BD1 assessed by EGFP/mCher...
1091343BRD4NaNDegradation of BRD4 BD1/2 assessed by EGFP/mCh...
1092343BRD4NaNDegradation of BRD4 BD1/2 assessed by EGFP/mCh...
1093350BRD4 BD1NaNDegradation of BRD4 BD1 assessed by EGFP/mCher...
\n", "

88 rows × 4 columns

\n", "
" ], "text/plain": [ " Compound ID Target Cell Type \\\n", "227 250 NaN NaN \n", "229 252 NaN NaN \n", "230 253 NaN NaN \n", "231 254 NaN NaN \n", "232 255 NaN NaN \n", "... ... ... ... \n", "1089 340 BRD4 NaN \n", "1090 342 BRD4 BD1 NaN \n", "1091 343 BRD4 NaN \n", "1092 343 BRD4 NaN \n", "1093 350 BRD4 BD1 NaN \n", "\n", " Assay (DC50/Dmax) \n", "227 NaN \n", "229 NaN \n", "230 NaN \n", "231 NaN \n", "232 NaN \n", "... ... \n", "1089 Degradation of BRD4 BD1/2 assessed by EGFP/mCh... \n", "1090 Degradation of BRD4 BD1 assessed by EGFP/mCher... \n", "1091 Degradation of BRD4 BD1/2 assessed by EGFP/mCh... \n", "1092 Degradation of BRD4 BD1/2 assessed by EGFP/mCh... \n", "1093 Degradation of BRD4 BD1 assessed by EGFP/mCher... \n", "\n", "[88 rows x 4 columns]" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# List the Nan cell types in merged_df\n", "merged_df[merged_df['Cell Type'].isna()][['Compound ID', 'Target', 'Cell Type', 'Assay (DC50/Dmax)']]" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Empty \"Cell Type\" values: 88\n", "PROTAC-Pedia 75\n", "PROTAC-DB 13\n", "Name: Database, dtype: int64\n", "--------------------------------------------------------------------------------\n", "Empty \"Treatment Time (h)\" values: 229\n", "PROTAC-Pedia 115\n", "PROTAC-DB 114\n", "Name: Database, dtype: int64\n", "--------------------------------------------------------------------------------\n", "Empty \"DC50 (nM)\" values: 791\n", "PROTAC-Pedia 703\n", "PROTAC-DB 88\n", "Name: Database, dtype: int64\n", "--------------------------------------------------------------------------------\n", "Empty \"Dmax (%)\" values: 1329\n", "PROTAC-DB 702\n", "PROTAC-Pedia 627\n", "Name: Database, dtype: int64\n", "--------------------------------------------------------------------------------\n", "Empty \"Active\" values: 1054\n", "PROTAC-Pedia 628\n", "PROTAC-DB 426\n", "Name: Database, dtype: int64\n", "--------------------------------------------------------------------------------\n", "Empty \"Article DOI\" values: 3\n", "PROTAC-Pedia 3\n", "Name: Database, dtype: int64\n", "--------------------------------------------------------------------------------\n", "Empty \"Comments\" values: 1774\n", "PROTAC-DB 1216\n", "PROTAC-Pedia 558\n", "Name: Database, dtype: int64\n", "--------------------------------------------------------------------------------\n", "Empty \"cLogP\" values: 1216\n", "PROTAC-DB 1216\n", "Name: Database, dtype: int64\n", "--------------------------------------------------------------------------------\n", "Empty \"Target\" values: 925\n", "PROTAC-Pedia 925\n", "Name: Database, dtype: int64\n", "--------------------------------------------------------------------------------\n", "Empty \"PDB\" values: 2119\n", "PROTAC-DB 1194\n", "PROTAC-Pedia 925\n", "Name: Database, dtype: int64\n", "--------------------------------------------------------------------------------\n", "Empty \"Name\" values: 1576\n", "PROTAC-Pedia 925\n", "PROTAC-DB 651\n", "Name: Database, dtype: int64\n", "--------------------------------------------------------------------------------\n", "Empty \"Assay (DC50/Dmax)\" values: 925\n", "PROTAC-Pedia 925\n", "Name: Database, dtype: int64\n", "--------------------------------------------------------------------------------\n", "Empty \"Exact Mass\" values: 925\n", "PROTAC-Pedia 925\n", "Name: Database, dtype: int64\n", "--------------------------------------------------------------------------------\n", "Empty \"XLogP3\" values: 925\n", "PROTAC-Pedia 925\n", "Name: Database, dtype: int64\n", "--------------------------------------------------------------------------------\n", "Empty \"Target (Parsed)\" values: 925\n", "PROTAC-Pedia 925\n", "Name: Database, dtype: int64\n", "--------------------------------------------------------------------------------\n" ] } ], "source": [ "for c in merged_df.columns:\n", " num_nulls = merged_df[c].isnull().sum()\n", " if num_nulls:\n", " print(f'Empty \"{c}\" values: {num_nulls}')\n", " print(merged_df[merged_df[c].isnull()]['Database'].value_counts())\n", " print('-' * 80)" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjsAAAHFCAYAAAAUpjivAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA7k0lEQVR4nO3de1iUdf7/8dfEYUSESTzMOElKLqUJpqJr2gFLxCiysjIPlSa1FmZLarquW9EJ0tbDpt9s64egkmG1UW6brlqGkR2QstRcrdU8FCP2DQGNAPH+/dHl/W3EI4IDt8/Hdd3X5f253/O5P58pmBf3aWyGYRgCAACwqPN8PQAAAICGRNgBAACWRtgBAACWRtgBAACWRtgBAACWRtgBAACWRtgBAACWRtgBAACWRtgBAACWRtgBLOT555+XzWZTVFRUnfv44YcflJqaqg0bNtTalpqaKpvNdgYjbJyOzOvHH3/09VD0wgsvKCsrq1b7d999J5vNdsxtAE6MsANYyIIFCyRJmzdv1qefflqnPn744Qc98cQTxww79957rz7++OMzGSJO4nhhp127dvr44491ww03nP1BAU0cYQewiPXr1+vLL780PwwzMjLqfR/t27fX5ZdfXu/94uTsdrsuv/xytWnTxtdDAZocwg5gEUfCzbPPPqt+/fopJydHP//8c62677//Xn/4wx8UHh6uwMBAud1u3Xbbbdq7d68++OAD9e7dW5J0zz33yGazyWazKTU1VVLt01g333yzOnTooMOHD9faT58+fdSzZ09z3TAMvfDCC+revbuCgoLUsmVL3Xbbbdq+ffsJ5/XWW2/JZrPpvffeq7Vt/vz5stls+uqrryRJ27dv17Bhw+R2u2W32+V0OjVgwIBjHqU6mf79+ysqKkoFBQW66qqr1Lx5c1100UV69tlnveb7yy+/aOLEierevbscDofCwsLUt29fvf3227X6PHz4sObOnWu+B+eff74uv/xyLVu2TJLUsWNHbd68WXl5eeZ737FjR0m1T2Odzvsi/RqGBw8erLCwMDVr1kw9evTQa6+9dtrvC9AUEXYAC6ioqNCrr76q3r17KyoqSmPGjFF5eblef/11r7rvv/9evXv3Vm5uriZMmKDly5drzpw5cjgcKikpUc+ePZWZmSlJ+stf/qKPP/5YH3/8se69995j7nfMmDHatWuX3n//fa/2//znP/rss890zz33mG1jx45VSkqK4uLi9NZbb+mFF17Q5s2b1a9fP+3du/e4c0tMTFTbtm3Ncf1WVlaWevbsqW7dukmSrr/+ehUWFmrGjBlatWqV5s+frx49emj//v2n9D4ezePxaOTIkbrzzju1bNkyJSQkaOrUqcrOzjZrKisr9dNPP2nSpEl666239Oqrr+rKK6/UkCFDtGjRIq/+Ro8erT/+8Y/q3bu3li5dqpycHA0ePFjfffedJCk3N1cXXXSRevToYb73ubm5Z/y+rFmzRldccYX279+vF198UW+//ba6d++uO+64g2uAcG4wADR5ixYtMiQZL774omEYhlFeXm60aNHCuOqqq7zqxowZYwQEBBhff/31cfsqKCgwJBmZmZm1tj3++OPGb39tVFdXG06n0xgxYoRX3eTJk43AwEDjxx9/NAzDMD7++GNDkjFz5kyvut27dxtBQUHG5MmTTzi/CRMmGEFBQcb+/fvNtq+//tqQZMydO9cwDMP48ccfDUnGnDlzTtjXsRyZ1759+8y22NhYQ5Lx6aefetVeeumlxqBBg47b16FDh4zq6mojKSnJ6NGjh9m+du1aQ5Ixbdq0E46la9euRmxsbK32HTt21Prvcirvi2EYRufOnY0ePXoY1dXVXn0mJiYa7dq1M2pqak44JqCp48gOYAEZGRkKCgrSsGHDJEktWrTQ7bffrg8//FDffPONWbd8+XJdc8016tKlS73s19/fX3feeafefPNNlZaWSpJqamq0ePFi3XTTTWrVqpUk6Z133pHNZtOdd96pQ4cOmYvL5dJll12mDz744IT7GTNmjCoqKrR06VKzLTMzU3a7XSNGjJAkhYWFqVOnTnruuec0a9YsffHFF8c8vXY6XC6Xfv/733u1devWTTt37vRqe/3113XFFVeoRYsW8vf3V0BAgDIyMrRlyxazZvny5ZKkcePGndGYfutU3pdvv/1W//nPfzRy5EhJ8nr/r7/+ehUVFWnr1q31NiagMSLsAE3ct99+q7Vr1+qGG26QYRjav3+/9u/fr9tuu03S/92hJUn79u1T+/bt63X/Y8aM0S+//KKcnBxJ0r///W8VFRV5ncLau3evDMOQ0+lUQECA1/LJJ5+c9Jbvrl27qnfv3uYpm5qaGmVnZ+umm25SWFiYJJnXrwwaNEgzZsxQz5491aZNGz300EMqLy+v09yOhLXfstvtqqioMNfffPNNDR06VBdccIGys7P18ccfq6CgwHxfjti3b5/8/PzkcrnqNJZjOZX35cgpwkmTJtV675OTkyWpUdxyDzQkf18PAMCZWbBggQzD0BtvvKE33nij1vaFCxfq6aeflp+fn9q0aaM9e/bU6/4vvfRS/f73v1dmZqbGjh2rzMxMud1uxcfHmzWtW7eWzWbThx9+KLvdXquPY7Ud7Z577lFycrK2bNmi7du31wpUktShQwfzQu1t27bptddeU2pqqqqqqvTiiy+e4UyPLTs7WxEREVq6dKnXxduVlZVedW3atFFNTY08Ho/atWtXb/s/2fvSunVrSdLUqVM1ZMiQY/ZxySWX1Nt4gMaIIztAE1ZTU6OFCxeqU6dOWrNmTa1l4sSJKioqMk+hJCQkaM2aNSc8bXEkePz26MXJ3HPPPfr000+Vn5+vf/7znxo1apT8/PzM7YmJiTIMQ99//7169epVa4mOjj7pPoYPH65mzZopKytLWVlZuuCCC7wC1dEuvvhi/eUvf1F0dLQ+//zzU57L6bLZbAoMDPQKOh6Pp9bdWAkJCZJ+vVPqRI4+cnQyJ3tfLrnkEkVGRurLL7885nvfq1cvhYSEnPL+gKaIIztAE7Z8+XL98MMPmj59uvr3719re1RUlObNm6eMjAwlJibqySef1PLly3X11Vfrz3/+s6Kjo7V//36tWLFCEyZMUOfOndWpUycFBQXplVdeUZcuXdSiRQu53W653e7jjmP48OGaMGGChg8frsrKSo0ePdpr+xVXXKE//OEPuueee7R+/XpdffXVCg4OVlFRkfLz8xUdHa0HHnjghHM9//zzdcsttygrK0v79+/XpEmTdN55//f32ldffaUHH3xQt99+uyIjIxUYGKj3339fX331lf70pz+d1vt6OhITE/Xmm28qOTlZt912m3bv3q2nnnpK7dq187pe6qqrrtJdd92lp59+Wnv37lViYqLsdru++OILNW/eXOPHj5ckRUdHKycnR0uXLtVFF12kZs2anTAMnux9kaS///3vSkhI0KBBgzR69GhdcMEF+umnn7RlyxZ9/vnnte7aAyzHt9dHAzgTN998sxEYGGgUFxcft2bYsGGGv7+/4fF4DMP49Q6oMWPGGC6XywgICDDcbrcxdOhQY+/eveZrXn31VaNz585GQECAIcl4/PHHDcOofTfWb40YMcKQZFxxxRXHHcuCBQuMPn36GMHBwUZQUJDRqVMn4+677zbWr19/SvNduXKlIcmQZGzbts1r2969e43Ro0cbnTt3NoKDg40WLVoY3bp1M2bPnm0cOnTohP0e726srl271qodNWqU0aFDB6+2Z5991ujYsaNht9uNLl26GC+//PIx36uamhpj9uzZRlRUlBEYGGg4HA6jb9++xj//+U+z5rvvvjPi4+ONkJAQQ5K5r2PdjXUq78sRX375pTF06FCjbdu2RkBAgOFyuYxrr73WvIMPsDKbYRiGj3IWAABAg+OaHQAAYGmEHQAAYGmEHQAAYGmEHQAAYGmEHQAAYGmEHQAAYGk8VFDS4cOH9cMPPygkJMTrKagAAKDxMgxD5eXlcrvdtR6m+VuEHUk//PCDwsPDfT0MAABQB7t37z7hlxwTdiTze2F2796t0NBQH48GAACcirKyMoWHh5/0+90IO5J56io0NJSwAwBAE3OyS1C4QBkAAFgaYQcAAFgaYQeWcOjQIf3lL39RRESEgoKCdNFFF+nJJ5/U4cOHzRrDMJSamiq3262goCD1799fmzdvNrd/9913stlsx1xef/11X0wLAFAPCDuwhOnTp+vFF1/UvHnztGXLFs2YMUPPPfec5s6da9bMmDFDs2bN0rx581RQUCCXy6WBAweqvLxckhQeHq6ioiKv5YknnlBwcLASEhJ8NTUAwBmyGYZh+HoQvlZWViaHw6HS0lIuUG6iEhMT5XQ6lZGRYbbdeuutat68uRYvXizDMOR2u5WSkqIpU6ZIkiorK+V0OjV9+nSNHTv2mP326NFDPXv29OoXANA4nOrnN0d2YAlXXnml3nvvPW3btk2S9OWXXyo/P1/XX3+9JGnHjh3yeDyKj483X2O32xUbG6t169Yds8/CwkJt2LBBSUlJDT8BAECD4dZzWMKUKVNUWlqqzp07y8/PTzU1NXrmmWc0fPhwSZLH45EkOZ1Or9c5nU7t3LnzmH1mZGSoS5cu6tevX8MOHgDQoAg7sISlS5cqOztbS5YsUdeuXbVhwwalpKTI7XZr1KhRZt3Rz2IwDOOYz2eoqKjQkiVL9Oijjzb42AEADYuwA0t45JFH9Kc//UnDhg2TJEVHR2vnzp1KT0/XqFGj5HK5JP16hKddu3bm64qLi2sd7ZGkN954Qz///LPuvvvuszMBAECD4ZodWMLPP/9c60vg/Pz8zFvPIyIi5HK5tGrVKnN7VVWV8vLyjnmaKiMjQ4MHD1abNm0aduAAgAbHkR1Ywo033qhnnnlGF154obp27aovvvhCs2bN0pgxYyT9evoqJSVFaWlpioyMVGRkpNLS0tS8eXONGDHCq69vv/1Wa9eu1bvvvuuLqQAA6hlhB5Ywd+5cPfroo0pOTlZxcbHcbrfGjh2rxx57zKyZPHmyKioqlJycrJKSEvXp00crV66s9QVyCxYs0AUXXOB15xYAoOniOTviOTsAADRFTeI5O/XxiH/p14fDjR8/Xq1bt1ZwcLAGDx6sPXv2nO3pAACARsinYac+HvEvSSkpKcrNzVVOTo7y8/N14MABJSYmqqamxhfTAgAAjYhPT2PVxyP+S0tL1aZNGy1evFh33HGHJOmHH35QeHi43n33XQ0aNOik4zhbp7FiHlnUYH0DTVXhc9zeD6BumsRprPp4xH9hYaGqq6u9atxut6Kioo77NQAAAODc4dO7serjEf8ej0eBgYFq2bJlrZojrz9aZWWlKisrzfWysrJ6mxMAAGhcfHpk57eP+P/888+1cOFC/fWvf9XChQu96k71Ef+nWpOeni6Hw2Eu4eHhZzYRAADQaPk07Pz2Ef/R0dG666679PDDDys9PV2SvB7x/1u/fcS/y+VSVVWVSkpKjltztKlTp6q0tNRcdu/eXd9TAwAAjYRPw059POI/JiZGAQEBXjVFRUXatGnTcb+t2m63KzQ01GsBAADW5NNrdurjEf8Oh0NJSUmaOHGiWrVqpbCwME2aNEnR0dGKi4vz5fQAAEAj4NOwU1+P+J89e7b8/f01dOhQVVRUaMCAAcrKypKfn58vpgUAABoRvi5CPGcH8CWeswOgrprEc3YAAAAaGmEHAABYGmEHAABYGmEHAABYGmEHAABYGmEHAABYGmEHAABYGmEHAABYGmEHAABYGmEHAABYGmEHAABYGmEHAABYGmEHAABYGmEHAABYGmEHAABYGmEHAABYGmEHAABYGmEHAABYGmEHAABYGmEHAABYGmEHAABYGmEHAABYGmEHAABYGmEHAABYGmEHAABYGmEHAABYGmEHAABYGmEHAABYGmEHAABYGmEHAABYGmEHAABYGmEHAABYGmEHAABYmk/DTseOHWWz2Wot48aNkyQZhqHU1FS53W4FBQWpf//+2rx5s1cflZWVGj9+vFq3bq3g4GANHjxYe/bs8cV0AABAI+TTsFNQUKCioiJzWbVqlSTp9ttvlyTNmDFDs2bN0rx581RQUCCXy6WBAweqvLzc7CMlJUW5ubnKyclRfn6+Dhw4oMTERNXU1PhkTgAAoHHxadhp06aNXC6Xubzzzjvq1KmTYmNjZRiG5syZo2nTpmnIkCGKiorSwoUL9fPPP2vJkiWSpNLSUmVkZGjmzJmKi4tTjx49lJ2drY0bN2r16tW+nBoAAGgkGs01O1VVVcrOztaYMWNks9m0Y8cOeTwexcfHmzV2u12xsbFat26dJKmwsFDV1dVeNW63W1FRUWbNsVRWVqqsrMxrAQAA1tRows5bb72l/fv3a/To0ZIkj8cjSXI6nV51TqfT3ObxeBQYGKiWLVset+ZY0tPT5XA4zCU8PLweZwIAABqTRhN2MjIylJCQILfb7dVus9m81g3DqNV2tJPVTJ06VaWlpeaye/fuug8cAAA0ao0i7OzcuVOrV6/Wvffea7a5XC5JqnWEpri42Dza43K5VFVVpZKSkuPWHIvdbldoaKjXAgAArKlRhJ3MzEy1bdtWN9xwg9kWEREhl8tl3qEl/XpdT15envr16ydJiomJUUBAgFdNUVGRNm3aZNYAAIBzm7+vB3D48GFlZmZq1KhR8vf/v+HYbDalpKQoLS1NkZGRioyMVFpampo3b64RI0ZIkhwOh5KSkjRx4kS1atVKYWFhmjRpkqKjoxUXF+erKQEAgEbE52Fn9erV2rVrl8aMGVNr2+TJk1VRUaHk5GSVlJSoT58+WrlypUJCQsya2bNny9/fX0OHDlVFRYUGDBigrKws+fn5nc1pAACARspmGIbh60H4WllZmRwOh0pLSxv0+p2YRxY1WN9AU1X43N2+HgKAJupUP78bxTU7AAAADYWwAwAALI2wAwAALI2wAwAALI2wAwAALI2wAwAALI2wAwAALI2wAwAALI2wAwAALI2wAwAALI2wAwAALI2wAwAALI2wAwAALI2wAwAALI2wAwAALI2wAwAALI2wAwAALI2wAwAALI2wAwAALI2wAwAALI2wAwAALI2wAwAALI2wAwAALI2wAwAALI2wAwAALI2wAwAALI2wAwAALI2wAwAALI2wAwAALI2wAwAALI2wAwAALI2wAwAALI2wAwAALM3nYef777/XnXfeqVatWql58+bq3r27CgsLze2GYSg1NVVut1tBQUHq37+/Nm/e7NVHZWWlxo8fr9atWys4OFiDBw/Wnj17zvZUAABAI+TTsFNSUqIrrrhCAQEBWr58ub7++mvNnDlT559/vlkzY8YMzZo1S/PmzVNBQYFcLpcGDhyo8vJysyYlJUW5ubnKyclRfn6+Dhw4oMTERNXU1PhgVgAAoDHx9+XOp0+frvDwcGVmZpptHTt2NP9tGIbmzJmjadOmaciQIZKkhQsXyul0asmSJRo7dqxKS0uVkZGhxYsXKy4uTpKUnZ2t8PBwrV69WoMGDTqrcwIAAI2LT4/sLFu2TL169dLtt9+utm3bqkePHnr55ZfN7Tt27JDH41F8fLzZZrfbFRsbq3Xr1kmSCgsLVV1d7VXjdrsVFRVl1hytsrJSZWVlXgsAALAmn4ad7du3a/78+YqMjNS///1v3X///XrooYe0aNEiSZLH45EkOZ1Or9c5nU5zm8fjUWBgoFq2bHncmqOlp6fL4XCYS3h4eH1PDQAANBI+DTuHDx9Wz549lZaWph49emjs2LG67777NH/+fK86m83mtW4YRq22o52oZurUqSotLTWX3bt3n9lEAABAo+XTsNOuXTtdeumlXm1dunTRrl27JEkul0uSah2hKS4uNo/2uFwuVVVVqaSk5Lg1R7Pb7QoNDfVaAACANfk07FxxxRXaunWrV9u2bdvUoUMHSVJERIRcLpdWrVplbq+qqlJeXp769esnSYqJiVFAQIBXTVFRkTZt2mTWAACAc5dP78Z6+OGH1a9fP6WlpWno0KH67LPP9NJLL+mll16S9Ovpq5SUFKWlpSkyMlKRkZFKS0tT8+bNNWLECEmSw+FQUlKSJk6cqFatWiksLEyTJk1SdHS0eXcWAAA4d/k07PTu3Vu5ubmaOnWqnnzySUVERGjOnDkaOXKkWTN58mRVVFQoOTlZJSUl6tOnj1auXKmQkBCzZvbs2fL399fQoUNVUVGhAQMGKCsrS35+fr6YFgAAaERshmEYvh6Er5WVlcnhcKi0tLRBr9+JeWRRg/UNNFWFz93t6yEAaKJO9fPb518XAQAA0JAIOwAAwNIIOwAAwNIIOwAAwNIIOwAAwNIIOwAAwNIIOwAAwNIIOwAAwNIIOwAAwNIIOwAAwNIIOwAAwNIIOwAAwNIIOwAAwNIIOwAAwNIIOwAAwNIIOwAAwNIIOwAAwNIIOwAAwNIIOwAAwNIIOwAAwNIIOwAAwNIIOwAAwNIIOwAAwNIIOwAAwNIIOwAAwNIIOwAAwNIIOwAAwNIIOwAAwNIIOwAAwNIIOwAAwNIIOwAAwNIIOwAAwNJ8GnZSU1Nls9m8FpfLZW43DEOpqalyu90KCgpS//79tXnzZq8+KisrNX78eLVu3VrBwcEaPHiw9uzZc7anAgAAGimfH9np2rWrioqKzGXjxo3mthkzZmjWrFmaN2+eCgoK5HK5NHDgQJWXl5s1KSkpys3NVU5OjvLz83XgwAElJiaqpqbGF9MBAACNjL/PB+Dv73U05wjDMDRnzhxNmzZNQ4YMkSQtXLhQTqdTS5Ys0dixY1VaWqqMjAwtXrxYcXFxkqTs7GyFh4dr9erVGjRo0FmdCwAAaHx8fmTnm2++kdvtVkREhIYNG6bt27dLknbs2CGPx6P4+Hiz1m63KzY2VuvWrZMkFRYWqrq62qvG7XYrKirKrAEAAOc2nx7Z6dOnjxYtWqSLL75Ye/fu1dNPP61+/fpp8+bN8ng8kiSn0+n1GqfTqZ07d0qSPB6PAgMD1bJly1o1R15/LJWVlaqsrDTXy8rK6mtKAACgkfFp2ElISDD/HR0drb59+6pTp05auHChLr/8ckmSzWbzeo1hGLXajnaymvT0dD3xxBNnMHIAANBU+Pw01m8FBwcrOjpa33zzjXkdz9FHaIqLi82jPS6XS1VVVSopKTluzbFMnTpVpaWl5rJ79+56ngkAAGgsGlXYqays1JYtW9SuXTtFRETI5XJp1apV5vaqqirl5eWpX79+kqSYmBgFBAR41RQVFWnTpk1mzbHY7XaFhoZ6LQAAwJp8ehpr0qRJuvHGG3XhhRequLhYTz/9tMrKyjRq1CjZbDalpKQoLS1NkZGRioyMVFpampo3b64RI0ZIkhwOh5KSkjRx4kS1atVKYWFhmjRpkqKjo827swAAwLnNp2Fnz549Gj58uH788Ue1adNGl19+uT755BN16NBBkjR58mRVVFQoOTlZJSUl6tOnj1auXKmQkBCzj9mzZ8vf319Dhw5VRUWFBgwYoKysLPn5+flqWgAAoBGxGYZh+HoQvlZWViaHw6HS0tIGPaUV88iiBusbaKoKn7vb10MA0ESd6ud3o7pmBwAAoL4RdgAAgKURdgAAgKURdgAAgKURdgAAgKURdgAAgKURdgAAgKURdgAAgKURdgAAgKURdgAAgKXVKexce+212r9/f632srIyXXvttWc6JgAAgHpTp7DzwQcfqKqqqlb7L7/8og8//PCMBwUAAFBfTutbz7/66ivz319//bU8Ho+5XlNToxUrVuiCCy6ov9EBAACcodMKO927d5fNZpPNZjvm6aqgoCDNnTu33gYHAABwpk4r7OzYsUOGYeiiiy7SZ599pjZt2pjbAgMD1bZtW/n5+dX7IAEAAOrqtMJOhw4dJEmHDx9ukMEAAADUt9MKO7+1bds2ffDBByouLq4Vfh577LEzHhgAAEB9qFPYefnll/XAAw+odevWcrlcstls5jabzUbYAQAAjUadws7TTz+tZ555RlOmTKnv8QAAANSrOj1np6SkRLfffnt9jwUAAKDe1Sns3H777Vq5cmV9jwUAAKDe1ek01u9+9zs9+uij+uSTTxQdHa2AgACv7Q899FC9DA4AAOBM1SnsvPTSS2rRooXy8vKUl5fntc1msxF2AABAo1GnsLNjx476HgcAAECDqNM1OwAAAE1FnY7sjBkz5oTbFyxYUKfBAAAA1Lc6hZ2SkhKv9erqam3atEn79+8/5heEAgAA+Eqdwk5ubm6ttsOHDys5OVkXXXTRGQ8KAACgvtTbNTvnnXeeHn74Yc2ePbu+ugQAADhj9XqB8n//+18dOnSoPrsEAAA4I3U6jTVhwgSvdcMwVFRUpH/9618aNWpUvQwMAACgPtQp7HzxxRde6+edd57atGmjmTNnnvROLQAAgLOpTmFnzZo19T0OAACABnFG1+zs27dP+fn5+uijj7Rv374zGkh6erpsNptSUlLMNsMwlJqaKrfbraCgIPXv31+bN2/2el1lZaXGjx+v1q1bKzg4WIMHD9aePXvOaCwAAMA66hR2Dh48qDFjxqhdu3a6+uqrddVVV8ntdispKUk///zzafdXUFCgl156Sd26dfNqnzFjhmbNmqV58+apoKBALpdLAwcOVHl5uVmTkpKi3Nxc5eTkKD8/XwcOHFBiYqJqamrqMjUAAGAxdQo7EyZMUF5env75z39q//792r9/v95++23l5eVp4sSJp9XXgQMHNHLkSL388stq2bKl2W4YhubMmaNp06ZpyJAhioqK0sKFC/Xzzz9r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T0hI0Ouvv26uR0RE6KmnntIDDzxw3L/cdu3apUceeUSdO3eWJEVGRprbnnvuOY0YMUIpKSnmtueff16xsbGaP3++mjVr1gCzAnCqUlJSNGTIkNN6zVNPPaWZM2ear4uIiNDXX3+tv//97xo1alRDDBONAGEHTdY111yj+fPnm+vBwcFas2aN0tLS9PXXX6usrEyHDh3SL7/8ooMHDyo4OLhWHxMmTNC9996rxYsXKy4uTrfffrs6deokSSosLNS3336rV155xaw3DEOHDx/Wjh071KVLl4afJIDj6tWr12nV79u3T7t371ZSUpLuu+8+s/3QoUOn9M3ZaLoIO2iygoOD9bvf/c5c37lzp66//nrdf//9euqppxQWFqb8/HwlJSWpurr6mH2kpqZqxIgR+te//qXly5fr8ccfV05Ojm655RYdPnxYY8eO1UMPPVTrdRdeeGGDzQvAqTn6D5jzzjtPR38D0m9/9g8fPizp11NZffr08arz8/NroFGiMSDswDLWr1+vQ4cOaebMmTrvvF8vR3vttddO+rqLL75YF198sR5++GENHz5cmZmZuuWWW9SzZ09t3rzZK1ABaLzatGkjj8cjwzBks9kkSRs2bDC3O51OXXDBBdq+fbtGjhzpo1HCFwg7sIxOnTrp0KFDmjt3rm688UZ99NFHevHFF49bX1FRoUceeUS33XabIiIitGfPHhUUFOjWW2+V9OvFj5dffrnGjRun++67T8HBwdqyZYtWrVqluXPnnq1pAThF/fv31759+zRjxgzddtttWrFihZYvX67Q0FCzJjU1VQ899JBCQ0OVkJCgyspKrV+/XiUlJZowYYIPR4+GxN1YsIzu3btr1qxZmj59uqKiovTKK68oPT39uPV+fn763//9X9199926+OKLNXToUCUkJOiJJ56QJHXr1k15eXn65ptvdNVVV6lHjx569NFH1a5du7M1JQCnoUuXLnrhhRf0P//zP7rsssv02WefadKkSV419957r/7f//t/ysrKUnR0tGJjY5WVlaWIiAgfjRpng804+gQnAACAhXBkBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphB8A5ISsrS+eff76vhwHABwg7ABqtdevWyc/PT9ddd91pva5jx46aM2eOV9sdd9yhbdu21ePoADQVhB0AjdaCBQs0fvx45efna9euXWfUV1BQkNq2bVtPIwPQlBB2ADRKBw8e1GuvvaYHHnhAiYmJysrK8tq+bNky9erVS82aNVPr1q01ZMgQSb9+GeTOnTv18MMPy2azmd9+/dvTWFu3bpXNZtN//vMfrz5nzZqljh076si36Hz99de6/vrr1aJFCzmdTt1111368ccfG3biAOodYQdAo7R06VJdcskluuSSS3TnnXcqMzPTDCH/+te/NGTIEN1www364osv9N5776lXr16SpDfffFPt27fXk08+qaKiIhUVFdXq+5JLLlFMTIxeeeUVr/YlS5ZoxIgRstlsKioqUmxsrLp3767169drxYoV2rt3r4YOHdrwkwdQr/x9PQAAOJaMjAzdeeedkqTrrrtOBw4c0Hvvvae4uDg988wzGjZsmPkN9ZJ02WWXSZLCwsLk5+enkJAQuVyu4/Y/cuRIzZs3T0899ZQkadu2bSosLNSiRYskSfPnz1fPnj2VlpZmvmbBggUKDw/Xtm3bdPHFF9f7nAE0DI7sAGh0tm7dqs8++0zDhg2TJPn7++uOO+7QggULJEkbNmzQgAEDzmgfw4YN086dO/XJJ59Ikl555RV1795dl156qSSpsLBQa9asUYsWLcylc+fOkqT//ve/Z7RvAGcXR3YANDoZGRk6dOiQLrjgArPNMAwFBASopKREQUFBZ7yPdu3a6ZprrtGSJUt0+eWX69VXX9XYsWPN7YcPH9aNN96o6dOnH/O1AJoOwg6ARuXQoUNatGiRZs6cqfj4eK9tt956q1555RV169ZN7733nu65555j9hEYGKiampqT7mvkyJGaMmWKhg8frv/+97/mkSRJ6tmzp/7xj3+oY8eO8vfnVyXQlHEaC0Cj8s4776ikpERJSUmKioryWm677TZlZGTo8ccf16uvvqrHH39cW7Zs0caNGzVjxgyzj44dO2rt2rX6/vvvT3j31JAhQ1RWVqYHHnhA11xzjdeRpHHjxumnn37S8OHD9dlnn2n79u1auXKlxowZc0pBCkDjQdgB0KhkZGQoLi5ODoej1rZbb71VGzZsUGhoqF5//XUtW7ZM3bt317XXXqtPP/3UrHvyySf13XffqVOnTmrTps1x9xUaGqobb7xRX375pUaOHOm1ze1266OPPlJNTY0GDRqkqKgo/fGPf5TD4dB55/GrE2hKbMaRezkBAAAsiD9PAACApRF2AACApRF2AACApRF2AACApRF2AACApRF2AACApRF2AACApRF2AACApRF2AACApRF2AACApRF2AACApRF2AACApf1/DsFYFO/6WCMAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Plot active vs inactive in merged_df\n", "sns.countplot(data=merged_df, x='Active')\n", "# Put the number of active and inactive on top of the bars\n", "for i, count in enumerate(merged_df['Active'].value_counts()):\n", " plt.text(i, count, count, ha='center', va='bottom')\n", "plt.title('Active vs Inactive')\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "merged_df[merged_df['Uniprot'].isnull()]['Target'].unique().tolist()" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "merged_df[merged_df['Uniprot'].isnull() & merged_df['Target'].str.contains(\n", " 'FGFR3_HUMAN-TACC3_HUMAN')]['Article DOI'].unique().tolist()" ] }, { "cell_type": "code", "execution_count": 43, "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", "
Compound IDUniprotSmilesE3 LigaseInChIInChI KeyMolecular WeightHeavy Atom CountRing CountRotatable Bond Count...DatabaseMolecular FormulacLogPTargetPDBNameAssay (DC50/Dmax)Exact MassXLogP3Target (Parsed)
\n", "

0 rows × 30 columns

\n", "
" ], "text/plain": [ "Empty DataFrame\n", "Columns: [Compound ID, Uniprot, Smiles, E3 Ligase, InChI, InChI Key, Molecular Weight, Heavy Atom Count, Ring Count, Rotatable Bond Count, Topological Polar Surface Area, Hydrogen Bond Acceptor Count, Hydrogen Bond Donor Count, Cell Type, Treatment Time (h), DC50 (nM), Dmax (%), Active, Article DOI, Comments, Database, Molecular Formula, cLogP, Target, PDB, Name, Assay (DC50/Dmax), Exact Mass, XLogP3, Target (Parsed)]\n", "Index: []\n", "\n", "[0 rows x 30 columns]" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "merged_df[merged_df['Uniprot'] == 'FGFR3_HUMAN-TACC3_HUMAN']" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [], "source": [ "def canonize_smiles(smi):\n", " return Chem.MolToSmiles(Chem.MolFromSmiles(smi))\n", "\n", "\n", "merged_df['Smiles'] = merged_df['Smiles'].apply(canonize_smiles)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Remove duplicates in UniProt ID column, _i.e._, keep the first entry:" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [], "source": [ "def clean_uniprot(uniprot):\n", " return uniprot.split(',')[0].strip() if ',' in uniprot else uniprot.strip()\n", "\n", "\n", "merged_df['Uniprot'] = merged_df['Uniprot'].apply(clean_uniprot)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Get Amino Acid Sequence" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Scrape FASTA sequence from UniProt database.\n", "\n", "NOTE: The Uniprot ID can be referring to both E3 and POI target, but we assume it's referring to the POI target." ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "8ac0afc72e254a3fb0dd7efeca7cb3ac", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Web-scraping sequences: 0%| | 0/106 [00:00 str:\n", " \"\"\"Apply the mutation to the sequence, if possible.\"\"\"\n", " # Check if both gene and sequence are not nan\n", " if pd.isna(gene) or pd.isna(seq) or gene.startswith('BRD') or len(gene.split(' ')) == 1:\n", " return seq\n", " # TODO: Just use a dictionary and replace these sequences straightaway...\n", " uniprot_exceptions = {\n", " ('O60885', 'BRD4 BD1'): uniprot2sequence['O60885'],\n", " ('P25440', 'BRD2 BD2'): uniprot2sequence['P25440'],\n", " ('P10275', 'AR-V7'): uniprot2sequence['P10275'],\n", " # TODO: Not working... why???\n", " ('P00533', 'EGFR e19d'): uniprot2sequence['P10275'],\n", " }\n", " # Handle exceptions\n", " if (uniprot, gene) in uniprot_exceptions:\n", " return uniprot_exceptions[(uniprot, gene)]\n", " original_seq = seq\n", " mutation = gene.split(' ')[1]\n", " operations = mutation.split('/') if '/' in mutation else [mutation]\n", " del_ops = 0\n", " # print(\n", " # f'Applying mutation {mutation} from gene {gene} to {uniprot}... sequence: {seq}')\n", " for op in operations:\n", " if 'del' in op.lower():\n", " idx = int(op.split('del')[1]) - 1\n", " # print(\n", " # f'Operation: {op} on ...{seq[idx-8:idx]}[{seq[idx]}]{seq[idx+1:idx+8]}...')\n", " seq = seq[:idx] + seq[idx + 1:]\n", " del_ops += 1\n", " else:\n", " # Replace aminoacid at a specific index\n", " # NOTE: The indexing starts from one, not zero.\n", " # NOTE: If a deletion has happened before, the index is still\n", " # relative to the whole sequence lenght (weird...)\n", " curr, idx, new = op[0].upper(), int(op[1:-1])-1, op[-1].upper()\n", " idx -= del_ops\n", " print(\n", " f'Operation: {op} on ...{seq[idx-8:idx]}[{seq[idx]} -> {new}]{seq[idx+1:idx+8]}...')\n", " if curr != seq[idx]:\n", " msg = f'Replacement at position {idx} failed. Expected \"{curr}\", found: \"{seq[idx]}\".'\n", " if on_error == 'raise':\n", " raise ValueError('ERROR. ' + msg)\n", " else:\n", " print('WARNING. ' + msg + ' No mutation is applied.')\n", " return original_seq\n", " seq = seq[:idx] + new + seq[idx + 1:]\n", " return seq\n", "\n", "\n", "# example = merged_df.iloc[protac_df['Target'].str.contains('EGFR'), :].iloc[0]\n", "# uniprot, gene, seq = example['Uniprot'], example['Target'], example['POI Sequence']\n", "# print(seq)\n", "# print(apply_mutation(uniprot, gene, seq, on_error='ignore'))\n", "# print(apply_mutation(uniprot, 'EGFR del19/T790M/C797S', seq, on_error='ignore'))\n", "# print(apply_mutation(uniprot, 'EGFR', seq, on_error='ignore'))\n", "\n", "# merged_df['POI Sequence'] = merged_df.apply(lambda row: apply_mutation(\n", "# row['Uniprot'], row['Target'], row['POI Sequence'], on_error='ignore'), axis=1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Apply mutations to POI sequences:\n", "\n", "TODO: Some mutations are still failing... ignoring them for now..." ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Operation: C481S on ...ITEYMANG[C -> S]LLNYLRE...\n", "Operation: G1202R on ...ILLELMAG[G -> R]DLKSFLR...\n", "Operation: L858R on ...HVKITDFG[L -> R]AKLLGAE...\n", "Operation: T790M on ...LTSTVQLI[T -> M]QLMPFGC...\n", "Operation: L858R on ...HVKITDFG[L -> R]AKLLGAE...\n", "Operation: T790M on ...LTSTVQLI[T -> M]QLMPFGC...\n", "Operation: L858R on ...HVKITDFG[L -> R]AKLLGAE...\n", "Operation: T790M on ...LTSTVQLI[T -> M]QLMPFGC...\n", "Operation: L858R on ...HVKITDFG[L -> R]AKLLGAE...\n", "Operation: T790M on ...LTSTVQLI[T -> M]QLMPFGC...\n", "Operation: L858R on ...HVKITDFG[L -> R]AKLLGAE...\n", "Operation: T790M on ...LTSTVQLI[T -> M]QLMPFGC...\n", "Operation: L858R on ...HVKITDFG[L -> R]AKLLGAE...\n", "Operation: T790M on ...LTSTVQLI[T -> M]QLMPFGC...\n", "Operation: L858R on ...HVKITDFG[L -> R]AKLLGAE...\n", "Operation: T790M on ...LTSTVQLI[T -> M]QLMPFGC...\n", "Operation: L858R on ...HVKITDFG[L -> R]AKLLGAE...\n", "Operation: T790M on ...LTSTVQLI[T -> M]QLMPFGC...\n", "Operation: L858R on ...HVKITDFG[L -> R]AKLLGAE...\n", "Operation: T790M on ...LTSTVQLI[T -> M]QLMPFGC...\n", "Operation: L858R on ...HVKITDFG[L -> R]AKLLGAE...\n", "Operation: T790M on ...LTSTVQLI[T -> M]QLMPFGC...\n", "Operation: L858R on ...HVKITDFG[L -> R]AKLLGAE...\n", "Operation: T790M on ...LTSTVQLI[T -> M]QLMPFGC...\n", "Operation: L858R on ...HVKITDFG[L -> R]AKLLGAE...\n", "Operation: T790M on ...LTSTVQLI[T -> M]QLMPFGC...\n", "Operation: L858R on ...HVKITDFG[L -> R]AKLLGAE...\n", "Operation: T790M on ...LTSTVQLI[T -> M]QLMPFGC...\n", "Operation: L858R on ...HVKITDFG[L -> R]AKLLGAE...\n", "Operation: T790M on ...LTSTVQLI[T -> M]QLMPFGC...\n", "Operation: L858R on ...HVKITDFG[L -> R]AKLLGAE...\n", "Operation: T790M on ...LTSTVQLI[T -> M]QLMPFGC...\n", "Operation: L858R on ...HVKITDFG[L -> R]AKLLGAE...\n", "Operation: T790M on ...LTSTVQLI[T -> M]QLMPFGC...\n", "Operation: L858R on ...HVKITDFG[L -> R]AKLLGAE...\n", "Operation: L858R on ...HVKITDFG[L -> R]AKLLGAE...\n", "Operation: V600E on ...IGDFGLAT[V -> E]KSRWSGS...\n", "Operation: V600E on ...IGDFGLAT[V -> E]KSRWSGS...\n", "Operation: V600E on ...IGDFGLAT[V -> E]KSRWSGS...\n", "Operation: V600E on ...IGDFGLAT[V -> E]KSRWSGS...\n", "Operation: G12C on ...YKLVVVGA[G -> C]GVGKSAL...\n", "Operation: G12C on ...YKLVVVGA[G -> C]GVGKSAL...\n", "Operation: G12C on ...YKLVVVGA[G -> C]GVGKSAL...\n", "Operation: G12C on ...YKLVVVGA[G -> C]GVGKSAL...\n", "Operation: G12C on ...YKLVVVGA[G -> C]GVGKSAL...\n", "Operation: G12C on ...YKLVVVGA[G -> C]GVGKSAL...\n", "Operation: G12C on ...YKLVVVGA[G -> C]GVGKSAL...\n", "Operation: G12C on ...YKLVVVGA[G -> C]GVGKSAL...\n", "Operation: G12C on ...YKLVVVGA[G -> C]GVGKSAL...\n", "Operation: G12C on ...YKLVVVGA[G -> C]GVGKSAL...\n", "Operation: L858R on ...HVKITDFG[L -> R]AKLLGAE...\n", "Operation: T790M on ...LTSTVQLI[T -> M]QLMPFGC...\n", "Operation: L858R on ...HVKITDFG[L -> R]AKLLGAE...\n", "Operation: T790M on ...LTSTVQLI[T -> M]QLMPFGC...\n", "Operation: V600E on ...IGDFGLAT[V -> E]KSRWSGS...\n", "Operation: V600E on ...IGDFGLAT[V -> E]KSRWSGS...\n", "Operation: V600E on ...IGDFGLAT[V -> E]KSRWSGS...\n", "Operation: V600E on ...IGDFGLAT[V -> E]KSRWSGS...\n", "Operation: V600E on ...IGDFGLAT[V -> E]KSRWSGS...\n", "Operation: V600E on ...IGDFGLAT[V -> E]KSRWSGS...\n", "Operation: V600E on ...IGDFGLAT[V -> E]KSRWSGS...\n", "Operation: G466V on ...TVGQRIGS[G -> V]SFGTVYK...\n", "Operation: G466V on ...TVGQRIGS[G -> V]SFGTVYK...\n", "Operation: G469A on ...QRIGSGSF[G -> A]TVYKGKW...\n", "Operation: V600E on ...IGDFGLAT[V -> E]KSRWSGS...\n", "Operation: G1202R on ...ILLELMAG[G -> R]DLKSFLR...\n", "Operation: L858R on ...HVKITDFG[L -> R]AKLLGAE...\n", "Operation: T790M on ...LTSTVQLI[T -> M]QLMPFGC...\n", "Operation: L858R on ...HVKITDFG[L -> R]AKLLGAE...\n", "Operation: T790M on ...LTSTVQLI[T -> M]QLMPFGC...\n", "Operation: L858R on ...HVKITDFG[L -> R]AKLLGAE...\n", "Operation: T790M on ...LTSTVQLI[T -> M]QLMPFGC...\n", "Operation: L858R on ...HVKITDFG[L -> R]AKLLGAE...\n", "Operation: T790M on ...LTSTVQLI[T -> M]QLMPFGC...\n", "Operation: G1202R on ...ILLELMAG[G -> R]DLKSFLR...\n", "Operation: L858R on ...HVKITDFG[L -> R]AKLLGAE...\n", "Operation: T790M on ...LTSTVQLI[T -> M]QLMPFGC...\n", "Operation: T878A on ...IARELHQF[T -> A]FDLLIKS...\n", "Operation: T878A on ...IARELHQF[T -> A]FDLLIKS...\n", "Operation: T878A on ...IARELHQF[T -> A]FDLLIKS...\n", "Operation: T878A on ...IARELHQF[T -> A]FDLLIKS...\n", "Operation: T878A on ...IARELHQF[T -> A]FDLLIKS...\n", "Operation: T878A on ...IARELHQF[T -> A]FDLLIKS...\n", "Operation: L858R on ...HVKITDFG[L -> R]AKLLGAE...\n", "Operation: T790M on ...LTSTVQLI[T -> M]QLMPFGC...\n", "Operation: G12C on ...YKLVVVGA[G -> C]GVGKSAL...\n", "Operation: G12C on ...YKLVVVGA[G -> C]GVGKSAL...\n", "Operation: C481S on ...ITEYMANG[C -> S]LLNYLRE...\n", "Operation: C481S on ...ITEYMANG[C -> S]LLNYLRE...\n", "Operation: C481S on ...ITEYMANG[C -> S]LLNYLRE...\n", "Operation: C481S on ...ITEYMANG[C -> S]LLNYLRE...\n", "Operation: C481S on ...ITEYMANG[C -> S]LLNYLRE...\n", "Operation: C481S on ...ITEYMANG[C -> S]LLNYLRE...\n", "Operation: R683G on ...CAKNILLI[R -> G]EEDRKTG...\n", "Operation: T790M on ...LTSTVQLI[T -> M]QLMPFGC...\n", "Operation: C797S on ...IMQLMPFG[C -> S]LLDYVRE...\n", "Operation: G12C on ...YKLVVVGA[G -> C]GVGKSAL...\n", "Operation: G12C on ...YKLVVVGA[G -> C]GVGKSAL...\n", "Operation: V600E on ...IGDFGLAT[V -> E]KSRWSGS...\n", "Operation: V600E on ...IGDFGLAT[V -> E]KSRWSGS...\n", "Operation: V600E on ...IGDFGLAT[V -> E]KSRWSGS...\n", "Operation: V600E on ...IGDFGLAT[V -> E]KSRWSGS...\n", "Operation: V600E on ...IGDFGLAT[V -> E]KSRWSGS...\n", "Operation: V600E on ...IGDFGLAT[V -> E]KSRWSGS...\n", "Operation: T315I on ...REPPFYII[T -> I]EFMTYGN...\n", "Operation: C481S on ...ITEYMANG[C -> S]LLNYLRE...\n", "Operation: C481T on ...ITEYMANG[C -> T]LLNYLRE...\n", "Operation: C481G on ...ITEYMANG[C -> G]LLNYLRE...\n", "Operation: C481W on ...ITEYMANG[C -> W]LLNYLRE...\n", "Operation: C481A on ...ITEYMANG[C -> A]LLNYLRE...\n" ] } ], "source": [ "merged_df['POI Sequence'] = merged_df.apply(lambda row: apply_mutation(\n", " row['Uniprot'], row['Target'], row['POI Sequence'], on_error='ignore'), axis=1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### E3 Ligase Sequence" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['VHL',\n", " 'CRBN',\n", " 'Iap',\n", " 'Mdm2',\n", " 'Ubr1',\n", " 'RNF114',\n", " 'cIAP1',\n", " 'MDM2',\n", " 'IAP',\n", " 'XIAP',\n", " 'FEM1B']" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "merged_df['E3 Ligase'].unique().tolist()" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 P40337\n", "1 P40337\n", "2 P40337\n", "3 P40337\n", "4 P40337\n", " ... \n", "2136 P40337\n", "2137 P40337\n", "2138 P40337\n", "2139 P40337\n", "2140 P40337\n", "Name: E3 Ligase Uniprot, Length: 2141, dtype: object" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "e3ligase2genes = {\n", " 'VHL': 'P40337',\n", " 'CRBN': 'Q96SW2',\n", " 'DCAF11': 'Q8TEB1',\n", " 'DCAF15': 'Q66K64',\n", " 'DCAF16': 'Q9NXF7',\n", " 'MDM2': 'Q00987',\n", " 'Mdm2': 'Q00987',\n", " 'XIAP': 'P98170',\n", " 'cIAP1': 'Q7Z460',\n", " 'IAP': 'P98170', # I couldn't find the Uniprot ID for IAP, so it's XIAP instead\n", " 'Iap': 'P98170', # I couldn't find the Uniprot ID for IAP, so it's XIAP instead\n", " 'AhR': 'P35869',\n", " 'RNF4': 'P78317',\n", " 'RNF114': 'Q9Y508',\n", " 'FEM1B': 'Q9UK73',\n", " 'Ubr1': 'Q8IWV7',\n", "}\n", "merged_df['E3 Ligase Uniprot'] = merged_df['E3 Ligase'].map(e3ligase2genes)\n", "merged_df['E3 Ligase Uniprot']" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "79f14bb2b87d45b2ad1902d11cd6c341", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Getting E3 ligase sequences: 0%| | 0/8 [00:00\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Cell TypeCell Line Identifier
0MOLT-4MOLT-4
55H1975H1975/WR
71PBMCsPH1-PBMCs-hiPSC4F1
77THP-1THP-1
81K562EGFP-K562
.........
2035BaF3 FLT3-ITDBa/F3
2064HEK293AHEK293A mRFP-ATG9
2116HEK293-hTauNaN
2124HAP1HAP1
2128ER-positive breast cancer cell linesCGBC 01
\n", "

181 rows × 2 columns

\n", "" ], "text/plain": [ " Cell Type Cell Line Identifier\n", "0 MOLT-4 MOLT-4\n", "55 H1975 H1975/WR\n", "71 PBMCs PH1-PBMCs-hiPSC4F1\n", "77 THP-1 THP-1\n", "81 K562 EGFP-K562\n", "... ... ...\n", "2035 BaF3 FLT3-ITD Ba/F3\n", "2064 HEK293A HEK293A mRFP-ATG9\n", "2116 HEK293-hTau NaN\n", "2124 HAP1 HAP1\n", "2128 ER-positive breast cancer cell lines CGBC 01\n", "\n", "[181 rows x 2 columns]" ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Assign cell line identifiers to each cell line\n", "merged_df['Cell Line Identifier'] = merged_df['Cell Type'].map(\n", " cell2identifier\n", ")\n", "merged_df[['Cell Type', 'Cell Line Identifier']].drop_duplicates()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Apply Active - ORed Version" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [], "source": [ "merged_df['Active - OR'] = merged_df.apply(\n", " lambda row: is_active(row['DC50 (nM)'], row['Dmax (%)'], oring=True), axis=1,\n", ")" ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [ { "data": { "image/png": "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Xm9nzpypevXqycfHR76+vqpRo4Zeeumlax5LUUaIcQJfX1+NHj1aX331Va7h6VvVrVs31atXT5988on69++vqVOnavDgwXrooYfUqVMnLV++XA8++KBefPFFLVu2LNf9X3rpJR08eFBz5szRnDlzdOLECYWHh+vgwYP2PuvWrVOLFi109uxZzZo1S59++qnq16+vf/zjH3kGrj59+sjNzU0LFy7U0qVLrzrlcurUKTVv3lxr1qzRq6++qs8++0xt2rTRsGHDNGjQIElSw4YNtWnTJgUHB6tFixbatGmTNm3alK/ppBdeeEEVKlTQ8OHDr9nvxIkTCggI0BtvvKHVq1drxowZcnV1VdOmTbV379487zNx4kT98ccfmjx58nXr+KvIyEgFBgZq/vz5ubbFxcWpYcOGuueeeyT9+cZVvXp1TZs2TV999ZUmTpyokydPqnHjxgW27uby5cvq0qWL3njjDUVHR2vlypV64403tHbtWoWHhys9Pd1eS6dOneTu7q558+Zp9erVeuONN+Tt7a3MzMybeuwZM2Zo7dq1mjZtmt5//32dP39eHTt2dHiDuhmNGzdW+fLltWHDBklSdna2vv32WzVq1EihoaH53k96erqCg4Pl4uKiv/3tbxo0aJDDuhlJ2rVrlySpbt26Du3ly5dX2bJl7duvJmd/Y8aM0cqVKzV//nzdfffdCg8Pz3ONU36es7i4OPXu3Vs1a9bUJ598otGjR+vVV18tsNeeqKgoWZaVK2h98cUXmjNnjt544w0tXrxY586dU6dOnTR06FD93//9n6ZPn67Zs2drz549euSRR2RZlv2+Bw4cULNmzTRz5kytWbNGr7zyir7//nv9/e9/t68t8vT01EcffaSkpCT16dNH0p+/v0888YQsy9LixYvl4uJy1bqPHz+uxo0ba/ny5RoyZIhWrVqladOmyc/PT8nJyZLy95pUUH788UeNHDnS/trs5+enhx9+WGPGjNGcOXMUGxur999/XykpKYqMjLSfizmysrIUFRWl1q1b69NPP1WfPn00depUTZw40d5nyZIlGjhwoFq2bKnly5drxYoVGjx4sM6fP1+gx1KonDoOVMzkTCdt3brVysjIsO6++27r3nvvtU+vXDlsmzNdMX/+/Fz70hVDlzlTF2+++aZDv/r161uSrGXLltnbsrKyrHLlyjlMreQMyTds2NBhuufw4cOWm5ub1a9fP3tbjRo1rAYNGlhZWVkOjxUZGWmVL1/eys7OdjjeJ598Ml/Pz4gRIyxJ1vfff+/Q/swzz1g2m83au3evva1ixYpWp06d8rXfv/Z99913LUnW559/7nDc15pOunTpkpWZmWmFhYVZgwcPtrfn/HwmT55sWZZlPfHEE5a3t7d18uRJy7LyP500ZMgQy8vLyzp79qy9bc+ePZYk66233rpmXWlpaZa3t7f1n//8x96e13RSy5YtrZYtW+bax5VTCosXL7YkWZ988olDv61bt1qSrLffftuyLMtaunSpJSnXlGh+XFlLzvNYt25d69KlS/b2LVu2WJKsxYsXX3N/+fkZNm3a1PLy8rIsy7ISExMtSVb37t3zXfOUKVOsKVOmWGvWrLHWrFljjRo1yipZsqRVo0YN69y5c/Z+/fv3tzw8PPLcR7Vq1ayIiIh8P6Zl/fkzzsrKslq3bm117drV3p7f5yw7O9sKCQm56nl9q9NJlmVZq1atsiRZEydOtLdJsoKDg620tDR724oVKyxJVv369R1qmTZtmiXJYbrvry5fvmxlZWVZCQkJliSHaT7LsqwPP/zQkmRNmzbNeuWVV6wSJUpYa9asue5x9enTx3Jzc7P27Nlz1T438pp0tdfkK+W8Lh46dMjeVrFiRcvLy8s6duyYvW3nzp2WJKt8+fLW+fPn7e05z+Nnn31mb+vZs6clyfroo48cHqtjx45W9erV7bcHDRpklS5d+qrHayJGYpzE3d1dr732mrZt25ZrGuZWREZGOtyuWbOmbDabOnToYG9zdXVV1apV85yGiI6OdhgCrVixopo3b65169ZJ+nOq5ddff7Uvkrx06ZL9X8eOHXXy5MlcoxWPPPJIvmr/9ttvVatWLTVp0sShvVevXrIsq0D+cuzdu7dq1aqlESNGXHU4+NKlS4qNjVWtWrXk7u4uV1dXubu7a9++ffrll1+uuu/XXntNWVlZGjdu3A3V1KdPH6Wnp+vDDz+0t82fP18eHh6Kjo62t6WlpenFF19U1apV5erqKldXV/n4+Oj8+fPXrOtGfPHFFypdurQ6d+7s8LOtX7++goOD7aMB9evXl7u7u5566iktWLDAYaTuZnXq1MnhL+ecEaj8TJddj/WXv/JvxuDBgzV48GC1bdtWbdu21Wuvvab33ntPv/76q959912HvnlNIeRnW45Zs2apYcOG8vT0lKurq9zc3PTNN9/k+TO+3nO2d+9enThx4qrndUG42nPbqlUreXt722/XrFlTktShQweHWnLa//pzTkpK0tNPP63Q0FD7c1CxYkVJyvU8dOvWTc8884z+9a9/6bXXXtNLL72ktm3bXrfuVatWqVWrVvbHz0thvCblqF+/vipUqGC/nVNXeHi4SpYsmav9yvPCZrOpc+fODm333HOPQ78mTZro7Nmzevzxx/Xpp58W+pWTtwMhxom6d++uhg0batSoUQV2+aW/v7/DbXd3d5UsWVKenp652i9evJjr/sHBwXm2nT59WpLsc8XDhg2Tm5ubw7+BAwdKUq4TIz9TPZJ0+vTpPPuGhITYt98qFxcXxcbGavfu3VqwYEGefYYMGaKXX35ZDz30kD7//HN9//332rp1q+rVq5drCPevKlWqpIEDB2rOnDnat29fvmuqXbu2GjdubJ9Sys7O1qJFi9SlSxeHn2d0dLSmT5+ufv366auvvtKWLVu0detWlStX7pp13Yjff/9dZ8+elbu7e66fb2Jiov1nW6VKFX399dcKDAzUs88+qypVqqhKlSr6z3/+c9OPHRAQ4HA7Z61KQRzbkSNH7L9HZcuWVcmSJXXo0KFb2mfXrl3l7e3tsAYlICBAFy9ezHNd0JkzZ3Kdn1eaMmWKnnnmGTVt2lSffPKJNm/erK1bt6p9+/Z5Pg/Xe85yzpmrndcFIedNMuf5zZHXa9G12nNejy5fvqyIiAgtW7ZMw4cP1zfffKMtW7bYn+e8noc+ffooKytLrq6uev755/NV96lTp/S3v/3tmn0K4zUpx80+Xznyep338PBw6NejRw/NmzdPCQkJeuSRRxQYGKimTZtq7dq1BXYchY1LrJ3IZrNp4sSJatu2bZ6XXub8Ql65MKsgT5wrJSYm5tmW82JZtmxZSdLIkSP18MMP57mPKy9hzs9fn9KfL8gnT57M1X7ixAmHx75VXbp0UYsWLTRmzJg8n/dFixbpySefVGxsrEP7H3/8odKlS19z36NHj9a8efP00ksvqXbt2vmuqXfv3ho4cKB++eUXHTx4UCdPnnRYHJqSkqIvvvhCY8aM0YgRI+ztGRkZudZl5MXT0zPPtSVXBs6yZcsqICBAq1evznM/vr6+9v/ff//9uv/++5Wdna1t27bprbfeUkxMjIKCgtS9e/fr1lRYtmzZosTERPXt21fSn0G2devWWrVqlY4dO3bdN7JrsSxLJUr8/78Fc9bC/Pzzz2ratKm9PScAXu9zoBYtWqTw8HDNnDnTof1GF4znyDlvr3ZeF4TPPvtMNptNDzzwQIHsb9euXfrxxx8VFxennj172tuvXPyb4/z58+rRo4eqVaum33//Xf369dOnn3563ccpV66cjh07ds0+t/Ka9NfX778uHnf26Efv3r3Vu3dvnT9/Xhs2bNCYMWMUGRmp3377zT7aZRJGYpysTZs2atu2rcaPH6+0tDSHbUFBQfL09LRfnZIjPyfozVq8eLHD8HBCQoLi4+PtV5NUr15dYWFh+vHHH3Xvvffm+e+vb3Q3onXr1tqzZ49++OEHh/b33ntPNptNrVq1uunjutLEiRN19OhR/fe//821zWaz5bpiZeXKlTp+/Ph195tz1dnSpUu1ZcuWfNfz+OOPy9PTU3FxcYqLi1OFChUUERHhUJNlWbnqmjNnznWvwJD+HCX67bffHALx6dOnFR8f79AvMjJSp0+fVnZ2dp4/27w+Y8fFxUVNmzbVjBkzJCnXz8+Zzpw5o6efflpubm4aPHiwvX3kyJGyLEv9+/fPcyFyVlaWPv/882vue+nSpbpw4YLuu+8+e1v79u3tP8e/yrki5aGHHrrmPvP63fvpp5+0adOma97vaqpXr67y5ctf9by+VfPnz9eqVav0+OOP66677rrl/Un//4+eK5+Hd955J8/+Tz/9tI4cOaJly5Zp7ty5+uyzzxyuRLuaDh06aN26dVddrC/d2mtSzlV/V75+X+/3qrB4e3urQ4cOGjVqlDIzM7V7925nl3RTGIkpAiZOnKhGjRopKSnJ4a93m82mf/7zn5o3b56qVKmievXqacuWLfrggw9uWy1JSUnq2rWr+vfvr5SUFI0ZM0aenp4aOXKkvc8777yjDh06qF27durVq5cqVKigM2fO6JdfftEPP/ygjz/++KYee/DgwXrvvffUqVMnjR8/XhUrVtTKlSv19ttv65lnnlG1atUK6jDVokULdenSJc9AGBkZqbi4ONWoUUP33HOPtm/frsmTJ+f7L/aYmBjNmDFDq1atync9pUuXVteuXRUXF6ezZ89q2LBhDn/hlypVSg888IAmT56ssmXLqlKlSlq/fr3mzp173dEh6c9h5HfeeUf//Oc/1b9/f50+fVqTJk1SqVKlHPp1795d77//vjp27KgXXnhBTZo0kZubm44dO6Z169apS5cu6tq1q2bNmqVvv/1WnTp10l133aWLFy9q3rx5kv4M5s6wb98+bd68WZcvX7Z/2N3cuXOVmpqq9957z+HcyrnyZeDAgWrUqJGeeeYZ1a5dW1lZWdqxY4dmz56tOnXqqHPnzkpISFB0dLS6d++uqlWrymazaf369Zo2bZpq166tfv362ffr7++v0aNH6+WXX5a/v7/9w+7Gjh2rfv36qVatWtc8hsjISL366qsaM2aMWrZsqb1792r8+PGqXLmyLl26dMPPSYkSJfTqq6+qX79+9vP67NmzGjt27A1NJ6WnpztM5xw8eFArVqzQF198oZYtW2rWrFk3XNvV1KhRQ1WqVNGIESNkWZb8/f31+eef5znlMWfOHC1atEjz589X7dq1Vbt2bQ0aNEgvvviiWrRokWsty1+NHz9eq1at0gMPPKCXXnpJdevW1dmzZ7V69WoNGTJENWrUuKXXpI4dO8rf3199+/bV+PHj5erqqri4OB09erRAnqeb0b9/f3l5ealFixYqX768EhMTNWHCBPn5+alx48ZOq+uWOGtFcXH016uTrhQdHW1JynUVQEpKitWvXz8rKCjI8vb2tjp37mwdPnz4qivhr7wS5mof0nXlFQc5V3gsXLjQev75561y5cpZHh4e1v33329t27Yt1/1//PFHq1u3blZgYKDl5uZmBQcHWw8++KA1a9asfB3v1SQkJFjR0dFWQECA5ebmZlWvXt2aPHmy/YqnHDd7ddJf7dmzx3Jxccl1ZUtycrLVt29fKzAw0CpZsqT197//3fruu++uelVNztVJfzV79mxL0g192N2aNWvs9/ntt99ybT927Jj1yCOPWGXKlLF8fX2t9u3bW7t27bIqVqxo9ezZ097vah92t2DBAqtmzZqWp6enVatWLevDDz/M8wPPsrKyrH//+99WvXr1LE9PT8vHx8eqUaOGNWDAAGvfvn2WZVnWpk2brK5du1oVK1a0PDw8rICAAKtly5YOV0xczY08j1f+nucl53hz/rm6uloBAQFWs2bNrJdeesk6fPjwVe+7c+dOq2fPntZdd91lubu7W97e3laDBg2sV155xUpKSrIsy7LOnDljde3a1apUqZLl5eVlubu7W2FhYdbw4cMdrij7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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Plot the number of \n", "\n", "# Plot the number of NaN values in Dmax and DC50 columns\n", "tmp = merged_df[['DC50 (nM)', 'Dmax (%)']].isna().sum()\n", "tmp.plot(kind='bar')\n", "plt.title('Number of NaN values in DC50 and Dmax columns')\n", "plt.grid(axis='y', alpha=0.5)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA1IAAAHUCAYAAAAwUBnrAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAABPOElEQVR4nO3de1hVVf7H8c+RyxEQSFHPkZGUCrOE0tQx7SIlapaaY0Vmd62xoSy8pDl2wSYhnUQmHO0ypCQRzvQbK2t01C6UqYWkpWZ2M29BWCF4QUBcvz/MMx6BZCNyAN+v59nPM2fvdfZZy4f4zoe1zto2Y4wRAAAAAKDGmnm6AwAAAADQ2BCkAAAAAMAighQAAAAAWESQAgAAAACLCFIAAAAAYBFBCgAAAAAsIkgBAAAAgEUEKQAAAACwiCAFAAAAABYRpIB69Oyzz8pmsykyMrJW7//hhx+UkJCgDRs2VLqWkJAgm812ij0EADRkp1pHpKZTS37++WdNmTJFF154ofz9/RUUFKRLL71Uf//731VeXl6pvc1mczuCgoLUp08fvfrqqx7oPZoCghRQj1566SVJ0ubNm/Xxxx9bfv8PP/ygadOmVVn87rnnHq1Zs+ZUuwgAaMBOtY5ITaOWfPnll+rWrZuef/553XrrrXr77beVlZWlSy65RA899JD69++vgwcPVnrfjTfeqDVr1mj16tV67rnnVFxcrJEjRyozM9MDo0BjR5AC6sm6dev02Wef6brrrpMkpaWl1en927dvr0svvbRO7wkAaDhOdx2RGkctqaio0A033KDi4mKtXbtWU6dO1VVXXaVrr71Wc+fO1SuvvKLs7GyNHz++0nsdDocuvfRS9e7dWyNHjtTbb78tSXr++efrexhoAghSQD05VvCefvpp9enTR1lZWZX+WrZ792798Y9/VFhYmHx9fRUaGqobb7xRP/74o95//3317NlTknT33Xe7liYkJCRIqrwcY9iwYerQoYOOHDlSqS+9evXSJZdc4nptjNHcuXPVtWtX+fn5qWXLlrrxxhv13Xff1fU/AwCglmpSR6SmX0sWL16sL774Qo888og6depU6frNN9+sAQMGKC0tTfn5+b95rw4dOqhNmzb68ccf67SPODMQpIB6UFJSoldffVU9e/ZUZGSkRo0apX379ulf//qXq83u3bvVs2dPLV68WOPHj9fSpUuVkpKi4OBgFRYW6pJLLtH8+fMlSY8++qjWrFmjNWvW6J577qnyM0eNGqUdO3bo3XffdTv/5Zdf6pNPPtHdd9/tOjdmzBjFx8crJiZGr7/+uubOnavNmzerT58+FBcAaABqUkekM6OWrFixQtLRkFedYcOG6fDhw3r//fd/815FRUX65ZdfqgxkwEkZAKfdyy+/bCSZ5557zhhjzL59+0yLFi3MFVdc4WozatQo4+PjY7744otq75OTk2Mkmfnz51e69sQTT5jj/5MuLy83DofDjBw50q3dpEmTjK+vr/npp5+MMcasWbPGSDKzZs1ya7dz507j5+dnJk2aZHm8AIC6VZM6YsyZUUuuueYaI8kcOnSo2jZLly41ksyMGTNc5ySZuLg4U15ebsrKysxXX31lhg4dagIDA826devqrH84czAjBdSDtLQ0+fn5acSIEZKkFi1a6KabbtKHH36or7/+WpK0dOlSXXXVVbrgggvq5DO9vb1122236d///reKiookHV1XvnDhQl1//fUKCQmRJL311luy2Wy67bbbdPjwYdfhdDp18cUXn/SveQCA068mdURqvLXk+PccPnxYxphT6vex95+4A+HcuXPl4+MjX19fderUSUuXLtWrr76q7t27n9Ln4cxEkAJOs2+++UYffPCBrrvuOhljtHfvXu3du1c33nijpP/twLRnzx61b9++Tj971KhROnTokLKysiRJ//3vf5WXl+e2FOPHH3+UMUYOh0M+Pj5ux9q1a/XTTz/VaZ8AANbUtI5IjbOWfP/995Xek52dXW37s88+W5K0bdu237ynJIWFhbmdj42NVU5OjlavXq3nn39egYGBGjFihFsYBWrK29MdAJq6l156ScYYvfbaa3rttdcqXU9PT9dTTz2lNm3aaNeuXXX62RdeeKF+//vfa/78+RozZozmz5+v0NBQDRgwwNWmdevWstls+vDDD2W32yvdo6pzAID6U9M64uXl1ShrSWhoqHJyctzOnX/++dW279+/v1544QW9/vrreuSRR6ps8/rrr8vb21vR0dFu59u0aaMePXpIknr37q0LLrhAffv21bhx4/TWW29V+5lAVQhSwGlUUVGh9PR0nXvuufrHP/5R6fpbb72lWbNmaenSpRo0aJAWLlyorVu3VltAjhWikpKSGvfh7rvv1p/+9CetWrVKS5Ys0fjx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NiUkJCghIaHaNs2bN1dqaqpSU1PruHcAgDPNsd1kO3XqpB9//FFPPfWU+vTpo82bN//mbrLbt2+XVPvdZKWjO8pOmzatDkcDADidGtR3pAAA8CRP7SYrsaMsADQ2BCkAAKpRX7vJSuwoCwCNDUEKAIBqsJssAKA6Hv2OFAAADQm7yQIAaoogBQDAr47tJvvTTz+pTZs2uvTSSyvtJltSUqK4uDgVFhaqV69eVe4m6+3trdjYWJWUlKhfv35asGABu8kCQBNDkAIA4FfsJgsAqCm+IwUAAAAAFhGkAAAAAMAighQAAAAAWESQAgAAAACLahWkrr76au3du7fS+eLiYl199dWn2icAACyhLgEA6lutgtT777+vsrKySucPHTqkDz/88JQ7BQCAFdQlAEB9s7T9+eeff+7631988YXy8/NdrysqKrRs2TL97ne/q7veAQDwG6hLAABPsRSkunbtKpvNJpvNVuVSCT8/P56bAQCoN9QlAICnWApS27ZtkzFG55xzjj755BO1adPGdc3X11dt27blye0AgHpDXQIAeIqlINWhQwdJ0pEjR05LZwAAsIK6BADwFEtB6nhfffWV3n//fRUUFFQqYI8//vgpdwwAACuoSwCA+lSrIPXiiy/qT3/6k1q3bi2n0ymbzea6ZrPZKFgAgHpFXQIA1LdaBamnnnpK06dP1+TJk+u6PwAAWEZdAgDUt1o9R6qwsFA33XRTXfcFAIBaoS4BAOpbrYLUTTfdpOXLl9d1XwAAqBXqEgCgvtVqad95552nxx57TGvXrlVUVJR8fHzcrj/44IN10jkAAGqCugQAqG+1ClIvvPCCWrRooezsbGVnZ7tds9lsFCwAQL2iLgEA6lutgtS2bdvquh8AANQadQkAUN9q9R0pAAAAADiT1WpGatSoUb95/aWXXqpVZwAAqA3qEgCgvtUqSBUWFrq9Li8v16ZNm7R3715dffXVddIxAABqiroEAKhvtQpSixcvrnTuyJEjiouL0znnnHPKnQIAwArqEgCgvtXZd6SaNWumcePGafbs2XV1SwAAao26BAA4nep0s4lvv/1Whw8frstbAgBQa9QlAMDpUqulfePHj3d7bYxRXl6e3n77bd1555110jEAAGqKugQAqG+1ClLr1693e92sWTO1adNGs2bNOunOSQAA1DXqEgCgvtUqSL333nt13Q8A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BARUusf48eN1zz33aOHChYqJidFNN92kc889V5KUm5urb775Rq+88oqrvTFGR44c0bZt23TBBRec/kHijNajRw9L7ffs2aOdO3dq9OjRuvfee13nDx8+rODg4LruHoAqUJvQ1FGbGi6CFGosICBA5513nuv19u3bde211+q+++7TX/7yF7Vq1UqrVq3S6NGjVV5eXuU9EhISNHLkSL399ttaunSpnnjiCWVlZekPf/iDjhw5ojFjxujBBx+s9L6zzz77tI0LOObE/4PVrFkzGWPczh3/s33kyBFJR5dQ9OrVy62dl5fXaeolgONRm9DUUZsaLoIUam3dunU6fPiwZs2apWbNjn7d7p///OdJ39epUyd16tRJ48aN0y233KL58+frD3/4gy655BJt3rzZrSACntSmTRvl5+fLGCObzSZJ2rBhg+u6w+HQ7373O3333Xe69dZbPdRLAMejNqGpozY1HAQp1Nq5556rw4cPKzU1VUOGDNFHH32k5557rtr2JSUlevjhh3XjjTcqPDxcu3btUk5Ojm644QZJR79Meemll+r+++/Xvffeq4CAAG3ZskUrVqxQampqfQ0LcImOjtaePXs0c+ZM3XjjjVq2bJmWLl2qoKAgV5uEhAQ9+OCDCgoK0qBBg1RaWqp169apsLBQ48eP92DvgTMTtQlNHbWp4WDXPtRa165dlZycrBkzZigyMlKvvPKKkpKSqm3v5eWln3/+WXfccYc6deqk2NhYDRo0SNOmTZMkXXTRRcrOztbXX3+tK664Qt26ddNjjz2mdu3a1deQADcXXHCB5s6dq7///e+6+OKL9cknn2jixIlube655x794x//0IIFCxQVFaW+fftqwYIFCg8P91CvgTMbtQlNHbWp4bCZExdZAgAAAAB+EzNSAAAAAGARQQoAAAAALCJIAQAAAIBFBCkAAAAAsIggBQAAAAAWEaQAAAAAwCKCFAAAAABYRJACAAAAAIsIUkATsWDBAp111lme7gYAoImgrgC/jSAFeNDq1avl5eWla665xtL7OnbsqJSUFLdzN998s7766qs67B0AoDGpbU2RGkddeeuttxQdHa3AwED5+/urZ8+eWrBggVub77//XjabzXUEBwfr0ksv1ZIlSzzTaTRpBCnAg1566SWNHTtWq1at0o4dO07pXn5+fmrbtm0d9QwA0NjUZU2RGlZdSU1N1fXXX68+ffro448/1ueff64RI0bovvvu08SJEyu1X7lypfLy8vTxxx/r97//vW644QZt2rTJAz1Hk2YAeMT+/ftNYGCg+fLLL83NN99spk2b5nb9jTfeMN27dzd2u92EhISYP/zhD8YYY/r27WskuR3GGDN//nwTHBxsjDHmyy+/NJLMli1b3O45a9Ys06FDB3PkyBFjjDGbN282gwYNMgEBAaZt27bmtttuM3v27DnNIwcA1LWT1RRjGm9d2bFjh/Hx8THjx4+vdO3ZZ581kszatWuNMcZs27bNSDLr1693tSkuLjaSzLPPPntK/QBOxIwU4CGLFi3S+eefr/PPP1+33Xab5s+fL2OMJOntt9/W8OHDdd1112n9+vV655131KNHD0nSv//9b7Vv315PPvmk8vLylJeXV+ne559/vrp3765XXnnF7XxmZqZGjhwpm82mvLw89e3bV127dtW6deu0bNky/fjjj4qNjT39gwcA1KnfqilS464rr732msrLy6uceRozZoxatGihV199tcr3lpeX68UXX5Qk+fj4nFI/gEo8neSAM1WfPn1MSkqKMcaY8vJy07p1a7NixQpjjDG9e/c2t956a7Xv7dChg5k9e7bbueP/cmiMMcnJyeacc85xvd66dauRZDZv3myMMeaxxx4zAwYMcLvHzp07jSSzdevWUxkaAKCe/VZNMaZx15X77rvPrR8nuuiii8ygQYOMMf+bkfLz8zMBAQGmWbNmRpLp2LGj+fnnn2vdB6AqzEgBHrB161Z98sknGjFihCTJ29tbN998s1566SVJ0oYNG9SvX79T+owRI0Zo+/btWrt2rSTplVdeUdeuXXXhhRdKknJzc/Xee++pRYsWrqNz586SpG+//faUPhsAUH9OVlOkhltXjm9733331apfxhjZbDa3c4sWLdL69ev15ptv6rzzztM//vEPtWrVqlb3B6rj7ekOAGeitLQ0HT58WL/73e9c54wx8vHxUWFhofz8/E75M9q1a6errrpKmZmZuvTSS/Xqq69qzJgxrutHjhzRkCFDNGPGjCrfCwBoHE5WU1q2bNlg68qGDRtc/zsoKKjKNp06dVJRUZF++OEHhYaGul0rKyvTd999p6uvvtrtfFhYmCIiIhQREaEWLVrohhtu0BdffNFgNs9A08CMFFDPDh8+rJdfflmzZs3Shg0bXMdnn32mDh066JVXXtFFF12kd955p9p7+Pr6qqKi4qSfdeutt2rRokVas2aNvv32W9dfKyXpkksu0ebNm9WxY0edd955bkdAQECdjBUAcHrVpKZIarB15fg21YWcG264Qd7e3po1a1ala88995wOHDigW265pdo+9+3bV5GRkZo+ffpJxwdY4uGlhcAZZ/HixcbX19fs3bu30rU///nPpmvXrua9994zzZo1M48//rj54osvzOeff25mzJjhate/f38zdOhQs2vXLtduSCeuZTfGmKKiItO8eXNz8cUXm379+rld2717t2nTpo258cYbzccff2y+/fZb89///tfcfffd5vDhw3U/cABAnatJTTHGNPq6kpycbJo1a2b+/Oc/my1btphvvvnGzJo1y9jtdjNhwgRXu6p27TPGmDfffNPY7Xaza9euU+oHcDxmpIB6lpaWppiYGAUHB1e6dsMNN2jDhg0KCgrSv/71L7355pvq2rWrrr76an388ceudk8++aS+//57nXvuuWrTpk21nxUUFKQhQ4bos88+06233up2LTQ0VB999JEqKio0cOBARUZG6qGHHlJwcLCaNeNXAwA0BjWpKZ9++qmio6MbdV0ZN26cFi9erA8//FA9evRQZGSkMjMzNW/ePD3zzDMnff/gwYPVsWNHZqVQp2zGHLc3JgAAAADgpPizMwAAAABYRJACAAAAAIsIUgAAAABgEUEKAAAAACwiSAEAAACARQQpAAAAALCIIAUAAAAAFhGkAAAAAMAighQAAAAAWESQAgAAAACLCFIAAAAAYNH/AxV7Hv0CAnsQAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# plot the columns Active and 'Active - OR' side by side\n", "fig, axes = plt.subplots(1, 2, figsize=(10, 5))\n", "axes[0].set_title('Active')\n", "axes[1].set_title('Active - OR')\n", "sns.countplot(data=merged_df, x='Active', ax=axes[0])\n", "sns.countplot(data=merged_df, x='Active - OR', ax=axes[1])\n", "# Add the number of active and inactive on top of the bars\n", "for i, count in enumerate(merged_df['Active'].value_counts()):\n", " axes[0].text(i, count, count, ha='center', va='bottom')\n", "for i, count in enumerate(merged_df['Active - OR'].value_counts()):\n", " axes[1].text(i, count, count, ha='center', va='bottom')\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlAAAAGxCAYAAACtEoj/AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA6U0lEQVR4nO3de3zO9eP/8edlm2vnmdNmNja1opypITXnnEr5lEqFTh+llEoi3z6NspVK+qToiA4khSSnOTR8zMfSUak+9UHEKGmGNTav3x9+1/vjcm14bbss9bjfbu/bbdfrer3f79f7/Lzep7mMMUYAAAA4ZVUquwEAAABnGgIUAACAJQIUAACAJQIUAACAJQIUAACAJQIUAACAJQIUAACAJQIUAACAJQIUAACAJasANW3aNLlcLqcLDAxUfHy8brrpJv3000/+auNp8/XXXystLU1btmyp7KZUqOXLl6t169YKCwuTy+XSvHnzKrtJFebXX3/Vtddeq9q1a8vlcumKK66o7Cb5+Oijj+RyufTuu++etO6gQYOUmJhoPY7ExET17t27DK07yuVyadq0ac6w0tLSSqw3f/58uVwu1ahRQ4WFhWUa18GDB5WWlqaPPvrI5zvPPsaf22BaWpozjz3j+yNJTEzUoEGDTlrvr7TMKsqBAwf0+OOPq0WLFgoPD1dYWJiaN2+u9PR0HThwwKd+YmKi1zEvLCxMLVu21KRJk3T8P/HwbOdbtmzRli1b5HK5SpxfZwJP+z3rl3R0uzl+Wzl06JBuv/121alTRwEBAWrevLmkM2O/7LFw4cJSt52TKdMZqKlTpyo7O1uZmZm67bbbNHPmTF188cUlroBnkq+//lpjxow5I3YEp8oYo379+ikoKEjz589Xdna2UlNTK7tZFebRRx/V3Llz9cwzzyg7O1vjx4+v7CaVy8MPP6y5c+dWdjNK9eqrr0o6uoMsaxA/ePCgxowZU+LBpVevXsrOzladOnXK0Uoci2V21K5du9SmTRuNHTtWl156qebOnat58+apR48eeuyxx9SmTRvt2rXLp7+LLrpI2dnZys7O1htvvKHQ0FANHTpUGRkZlTAVlefWW29Vdna2V9nkyZP14osvavTo0VqzZo3eeOMNSWfWfnnhwoUaM2ZMmfoNLEtPjRs3VuvWrSVJHTt2VHFxsR599FHNmzdP119/fZka4nHw4EGFhoaWaxj4nx07dujXX3/VlVdeqc6dO1v3f/jwYeds4x/Rxo0bddZZZ5V7vfMwxuj3339XSEhIhQzP1llnnVUp4z0Vubm5WrhwoTp16qS1a9fq1Vdf1TXXXFOh46hVq5Zq1apVocP8K2OZ/c+AAQP0zTffaOXKlWrfvr1T3rVrV/Xq1UsdO3bUwIEDtXjxYq/+qlWrpjZt2jifu3Tponr16unFF1/UQw89dNraf7zi4mIVFRXJ7XaflvHFx8crPj7eq2zjxo0KCQnRXXfd5VNekftlSSooKKi0/XJpKuQeKM/KtXXrVklHD0IvvPCCmjdvrpCQEEVHR+uqq67Sf//7X6/+OnTooMaNG2vVqlVq166dQkNDdfPNN0uSfvvtN91///1q0KCB3G63ateurZ49e+qbb75x+j906JAee+wxNWzYUG63W7Vq1dJNN92kn3/+2Ws8nssbixcvVsuWLRUSEqKGDRvqtddec+pMmzZNV199taSjodBzytZzCjMzM1N9+vRRfHy8goODdfbZZ2vw4MH65ZdffObH+++/r6ZNm8rtdqtBgwZ69tlnSzz9earzqTRr1qxR586dFRERodDQULVr104ffvih831aWpqzwj/44INyuVwnvDzkOQX9xhtv6P7771fdunXldrv1/fffS5Jee+01NWvWTMHBwapevbquvPJKbdq0yen/ww8/lMvlUk5OjlP23nvvyeVyqVevXl7jatq0qf72t785n2fPnq2UlBRFRUUpNDRUDRo0cNaFknhOMS9btkybNm1ylpfnF/Kvv/6qIUOGqG7duqpataoaNGig0aNH+1zCcLlcuuuuuzRlyhQ1atRIbrdb06dPL3GcDzzwgKKiolRcXOyUDR06VC6XS08++aRTtmfPHlWpUkXPPfecV/+HDx/W6NGjFRcXp8jISHXp0kXffvutV52SLuEdOXJEzz33nLOeeHbo8+fP92njidbx8po+fbqKiop07733qm/fvlq+fLmzzR/rRNvuli1bnIPtmDFjnOXmuWR1/OWgYcOGKSwsTPv27fMZzzXXXKOYmBgdPnzYKZs1a5batm2rsLAwhYeH69JLL9Wnn35a7mn/+OOPde211yoxMVEhISFKTEzUdddd5zP9nvavXLlSd9xxh2rWrKkaNWqob9++2rFjh1fdw4cPa8SIEYqNjVVoaKjat2+v9evXl7utx/orL7Njffzxx1q6dKluueUWr/Dk0b59e918881asmSJNmzYcMJhRUZG6pxzzinxbJWtn3/+WUOGDNF5552n8PBw1a5dW506ddLq1au96nn2d+PHj9djjz2mpKQkud1urVy50pm+yy+/XNWrV1dwcLBatGihd95555TasGPHDvXr108RERGKiorSNddco9zcXJ96xx/DXC6XXnnlFRUUFHgdL0+0X7Y9Zs+ZM0ctWrRQcHCwc5YoNzdXgwcPVnx8vKpWraqkpCSNGTNGRUVFPvPrqaee0oQJE5SUlKTw8HC1bdtW69atc+oNGjRIzz//vDM9nu6Ur0IZC1OnTjWSTE5Ojlf5s88+aySZl156yRhjzG233WaCgoLM/fffbxYvXmxmzJhhGjZsaGJiYkxubq7TX2pqqqlevbpJSEgwzz33nFm5cqXJysoy+/btM+eff74JCwszY8eONUuWLDHvvfeeueeee8yKFSuMMcYUFxeb7t27m7CwMDNmzBiTmZlpXnnlFVO3bl1z3nnnmYMHDzrjqV+/vomPjzfnnXeeef31182SJUvM1VdfbSSZrKwsY4wxu3fvNunp6UaSef755012drbJzs42u3fvNsYYM3nyZJORkWHmz59vsrKyzPTp002zZs3Mueeeaw4dOuSMa9GiRaZKlSqmQ4cOZu7cuWb27NkmJSXFJCYmmuNn96nOp5J89NFHJigoyLRq1crMmjXLzJs3z3Tr1s24XC7z9ttvG2OM2bZtm5kzZ46RZIYOHWqys7PNJ598UuowV65caSSZunXrmquuusrMnz/fLFiwwOzZs8eZN9ddd5358MMPzeuvv24aNGhgoqKizHfffWeMMSY/P98EBQWZ9PR0Z5i33367CQkJMWFhYc582rVrl3G5XOaFF14wxhizdu1a43K5zLXXXmsWLlxoVqxYYaZOnWpuvPHGUtv6+++/m+zsbNOiRQvToEEDZ3nl5eWZgoIC07RpUxMWFmaeeuops3TpUvPwww+bwMBA07NnT6/heKa3adOmZsaMGWbFihVm48aNJY5z8eLFRpJZu3atU9awYUMTEhJiunbt6pTNmjXLSDJff/2113xNTEw0119/vfnwww/NzJkzTb169UxycrIpKipy+h04cKCpX7++13hvvPFG43K5zK233mref/99s2jRIjNu3Djz7LPPOnVOZR0vr3POOcfUqVPHFBUVmWXLlhlJJi0tzavOybbd33//3ZmPt9xyi7Pcvv/+e2PM//YxmzdvNsYY8/nnnxtJ5uWXX/Yaz969e43b7Tb33XefUzZu3DjjcrnMzTffbBYsWGDmzJlj2rZta8LCwsxXX31VrmmfPXu2+cc//mHmzp1rsrKyzNtvv21SU1NNrVq1zM8//+zU87S/QYMGZujQoWbJkiXmlVdeMdHR0aZjx45ewxw4cKBxuVzmgQceMEuXLjUTJkwwdevWNZGRkWbgwIHlaq/HX3mZHcuz/1q0aFGpdRYuXGgkmYyMDKesfv36plevXl71Dh8+bGJjY02TJk3K3a5vvvnG3HHHHebtt982H330kVmwYIG55ZZbTJUqVczKlSudeps3b3b2VR07djTvvvuuWbp0qdm8ebNZsWKFqVq1qrn44ovNrFmzzOLFi82gQYOMJDN16tQTjv/gwYOmUaNGJioqyjz33HNmyZIl5u677zb16tXz6f+RRx7xOoZlZ2ebnj17mpCQEGedyM3NLXW/bHvMrlOnjmnQoIF57bXXzMqVK8369evNzp07TUJCgqlfv7558cUXzbJly8yjjz5q3G63GTRokM/8SkxMNN27dzfz5s0z8+bNM02aNDHR0dHmt99+M8YY8/3335urrrrKSHLamp2dbX7//fdTWn5lClDr1q0zhw8fNvn5+WbBggWmVq1aJiIiwpl5kszTTz/t1e+2bdtMSEiIGTFihFOWmppqJJnly5d71R07dqyRZDIzM0tty8yZM40k895773mV5+TkGEnOwdmYowsjODjYbN261SkrKCgw1atXN4MHD3bKZs+ebSR5rbglOXLkiDl8+LDZunWrkWTef/9957sLLrjAJCQkmMLCQqcsPz/f1KhRw2flO9X5VJI2bdqY2rVrm/z8fKesqKjING7c2MTHx5sjR44YY/63Ij355JMnHJ4x/zvQX3LJJV7le/fuNSEhIT7h48cffzRut9v079/fKWvfvr3p1KmT8/nss882DzzwgKlSpYpzIH/rrbeMJCd4PfXUU0aSs1LbSE1NNeeff75X2ZQpU4wk884773iVP/HEE0aSWbp0qVMmyURFRZlff/31pOM6cOCAqVq1qhk7dqwxxpjt27cbSebBBx80ISEhzkZ32223mbi4OKc/z3w9fv698847zobrcXyAWrVqlZFkRo8efcK2neo6XlaedowcOdIYc3QbSEpKMvXr13fWNWNObdv9+eefjSTzyCOP+Hx3/MHYGGNatmxp2rVr51XvhRdeMJLMl19+aYw5ui4GBgaaoUOHetXLz883sbGxpl+/fraTfEJFRUVm//79JiwszCvIeto/ZMgQr/rjx483kszOnTuNMcZs2rTJSDL33nuvVz3PtlERAYpl9j+33367kWS++eabUut4lskdd9zhlNWvX9/07NnTHD582Nnne374LliwoMLa51FUVGQOHz5sOnfubK688kqn3LMfP+uss7x+sBtz9EdcixYtzOHDh73Ke/fuberUqWOKi4tLHd/kyZN9jmHGHN2HnSxAGXN0fxUWFuYz3JL2y7bH7ICAAPPtt9961R08eLAJDw/32s8Z879jiCd0e+ZXkyZNvH6grl+/3kgyM2fOdMruvPNOn+k6VWW6hNemTRsFBQUpIiJCvXv3VmxsrBYtWqSYmBgtWLBALpdLN9xwg4qKipwuNjZWzZo187kJMTo6Wp06dfIqW7Rokc455xx16dKl1DYsWLBA1apV02WXXeY1nubNmys2NtZnPM2bN1e9evWcz8HBwTrnnHNKPJ1dkt27d+v2229XQkKCAgMDFRQUpPr160uScxnrwIED+vjjj3XFFVeoatWqTr/h4eG67LLLfNpvM5+OdeDAAf373//WVVddpfDwcKc8ICBAN954o7Zv3+5zacjGsZfWJCk7O1sFBQU+TwYlJCSoU6dOWr58uVPWuXNn/etf/1JBQYG2bt2q77//Xtdee62aN2+uzMxMSdKyZctUr149JScnS5IuuOACSVK/fv30zjvvlPuJzhUrVigsLExXXXWVV7mn/ce2V5I6deqk6Ojokw43NDRUbdu21bJlyyQdvaxbrVo1PfDAAzp06JDWrFnjTF9J6+7ll1/u9blp06aSdMJ1cNGiRZKkO++886TtK+86fiKeG5E9l1U9l3C2bt3qNT9PZdu1ddNNN2nt2rVe6/TUqVN1wQUXqHHjxpKkJUuWqKioSAMGDPDanoKDg5Wamlrup6H279+vBx98UGeffbYCAwMVGBio8PBwHThwwOsytsfJlrXn0svx94j069evwu43/LMvs2P7KSoq8nkqzpan/+NvtVi4cKGCgoKcff7LL7+s5557zue2hLKaMmWKWrZsqeDgYOfYsnz58lLXq6CgIOfz999/r2+++cZZj46dHz179tTOnTtPeCxYuXKlIiIifNbX/v37V8i0Hcv2mN20aVOdc845PsPo2LGj4uLivIbRo0cPSVJWVpZX/V69eikgIMBrmNKJ97k2yhSgXn/9deXk5OjTTz/Vjh079MUXX+iiiy6SdPRJB2OMYmJinJXO061bt87nnqGSntz4+eeffW5WO96uXbv022+/qWrVqj7jyc3N9RlPjRo1fIbhdrtVUFBw0uk9cuSIunXrpjlz5mjEiBFavny51q9f71xL9Qxj7969zrQf7/gy2/l0LM94Spp3cXFxko7eh1NWxw/XM6zSxnfsuLp06aLCwkKtWbNGmZmZqlmzplq0aKEuXbo4wWP58uVeO+tLLrlE8+bNc3am8fHxaty4sWbOnFmm9u/Zs0exsbE+O8LatWsrMDDQZ97YPD3UpUsXrVu3TgcOHNCyZcvUqVMn1ahRQ61atdKyZcu0efNmbd68ucSD0fHroOfmzxOtgz///LMCAgIUGxt70raVZx0/kfz8fM2ePVsXXnihatWqpd9++02//fabrrzySrlcLudA7WnvybZdW9dff73cbrdzP+LXX3+tnJwc3XTTTU4dz/0oF1xwgc/2NGvWrBNuT6eif//+mjRpkm699VYtWbJE69evV05OjmrVqlXi/D3Zsvasg8cv18DAwBKXo62/wjI7vp/S7l2U5Pyw2Lx5c6l1PPe9JCQkeJW3b99eOTk5Wrdund544w0lJibqrrvucn4wlceECRN0xx13KCUlRe+9957WrVunnJwcde/evcT16vh9lWceDh8+3Gd+DBkyRJJOOB/37NlT4vHqVPY3tmyP2SXtl3ft2qUPPvjAp//zzz9fku+0lmWfa6NMP3UaNWrkPIV3vJo1a8rlcmn16tUlPh1wfFlJ72CpVauWtm/ffsI2eG7OPP6JCY+IiIgT9m9j48aN+vzzzzVt2jQNHDjQKffcXO0RHR0tl8tV4s2Fx9+UZzufjh9PlSpVtHPnTp/vPDeq1qxZ88QTdQLHLxPPSlja+I4dV0pKisLDw7Vs2TJt2bJFnTt3lsvlUufOnfX0008rJydHP/74o0/A6NOnj/r06aPCwkKtW7dOGRkZ6t+/vxITE9W2bVur9teoUUP//ve/ZYzxmpbdu3erqKjIZ97YvAeoc+fOevjhh7Vq1SotX75cjzzyiFO+dOlSJSUlOZ8rQq1atVRcXKzc3NxKe0x85syZOnjwoNavX1/imbq5c+dq7969io6OPqVt11Z0dLT69Omj119/XY899pimTp2q4OBgXXfddU4dzzJ99913nTPDFSUvL08LFizQI488opEjRzrlhYWF+vXXX8s0TM82lZubq7p16zrlRUVF5frx4/FXWGbHPqwiydn2StK1a1c99NBDmjdvnrp3715iHc8rHrp27epVHhUV5RzvUlJSlJKSombNmmnIkCH67LPPVKVK2Z/FevPNN9WhQwdNnjzZqzw/P7/E+sfvqzzzcNSoUerbt2+J/Zx77rmljr9GjRolPrhQ0k3k5WV7zC5pv1yzZk01bdpU48aNK3EYnhMIp0uFv4m8d+/eMsbop59+UuvWrX26Jk2anHQYPXr00HfffacVK1accDx79uxRcXFxieM50UpTmtLSqWdBHh9qXnzxRa/PYWFhat26tebNm6dDhw455fv379eCBQt82l/W+RQWFqaUlBTNmTPHq61HjhzRm2++qfj4eJ9Tn+XRtm1bhYSE6M033/Qq3759u1asWOEVFoKCgnTJJZcoMzNTK1ascHZGF198sQIDA/V///d/TqAqidvtVmpqqp544glJKtPTOJ07d9b+/ft93nnz+uuvO9+X1YUXXqjIyEhNnDhRubm5zvR16dJFn376qd555x2dd955FbYhe05NH7+DPZ1effVVRUREaPny5Vq5cqVX9+STT6qwsFBvvfWW096Tbbtl+RV40003aceOHVq4cKHefPNNXXnllapWrZrz/aWXXqrAwED98MMPJW5Ppf3gOxUul0vGGJ/t/5VXXvF6ItNGhw4dJMmZbx7vvPOO19NEZfVXWGbH1z3RmbvWrVurW7duevXVV/Wvf/3L5/s1a9botddeU/fu3dWqVasTjjc5OVkjRozQl19+qVmzZp14JpyEy+XyWa+++OILn/ctlebcc89VcnKyPv/881Ln4YlOJnTs2FH5+fk+T/TOmDHDfmJOoiKO2b1793ZekVDSMMqy3y3PWakKf7nPRRddpL///e+66aab9PHHH+uSSy5RWFiYdu7cqTVr1qhJkya64447TjiMYcOGadasWerTp49GjhypCy+8UAUFBcrKylLv3r3VsWNHXXvttXrrrbfUs2dP3XPPPbrwwgsVFBSk7du3a+XKlerTp4+uvPJKq7Z7rs2/9NJLioiIUHBwsJKSktSwYUOdddZZGjlypIwxql69uj744APnnp5jjR07Vr169dKll16qe+65R8XFxXryyScVHh7u9Wu1vPMpIyNDXbt2VceOHTV8+HBVrVpVL7zwgjZu3KiZM2dW6NuVq1WrpocfflgPPfSQBgwYoOuuu0579uzRmDFjFBwc7JyF8ejcubPuv/9+SXLONIWEhKhdu3ZaunSpmjZtqtq1azv1//GPf2j79u3q3Lmz4uPj9dtvv+nZZ59VUFBQmV76OWDAAD3//PMaOHCgtmzZoiZNmmjNmjVKT09Xz549y3WvR0BAgFJTU/XBBx8oKSnJeW/TRRddJLfbreXLl+vuu+8u8/CPd/HFF+vGG2/UY489pl27dql3795yu9369NNPnRf6+dPGjRu1fv163XHHHT73KkpHp/vpp5/Wq6++qrvuuuuUtt2IiAjVr19f77//vjp37qzq1aurZs2aJ3zFRrdu3RQfH68hQ4YoNzfX61KQdPSx57Fjx2r06NH673//q+7duys6Olq7du3S+vXrFRYWVuaX5UVGRuqSSy7Rk08+6bQzKytLr776qlcgsNGoUSPdcMMNmjhxooKCgtSlSxdt3LhRTz31lCIjI8s0TA+WWclef/11denSRd26ddPdd9/t/JBasWKFnn32WTVs2NDrzdsnMnz4cE2ZMkVjxoxRv379vO6zsdG7d289+uijeuSRR5Samqpvv/1WY8eOVVJS0ikH6RdffFE9evTQpZdeqkGDBqlu3br69ddftWnTJn3yySeaPXt2qf0OGDBAzzzzjAYMGKBx48YpOTlZCxcu1JIlS8o0PSdSEcfssWPHKjMzU+3atdPdd9+tc889V7///ru2bNmihQsXasqUKdaXoz0nK5544gn16NFDAQEBatq0qdd9zKWyueO8tNcYlOS1114zKSkpJiwszISEhJizzjrLDBgwwHz88cdOnZLu1PfYu3evueeee0y9evVMUFCQqV27tunVq5fXUxSHDx82Tz31lGnWrJkJDg424eHhpmHDhmbw4MHmP//5j1OvpEdRPeNPTU31Kps4caJJSkoyAQEBXk8hfP3116Zr164mIiLCREdHm6uvvtr8+OOPJT6ZMnfuXNOkSRNTtWpVU69ePfP444+bu+++20RHR5dpPpVm9erVplOnTk6/bdq0MR98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JQIUAACAJQIUAACAJQIUAACAJQIUAACAJQIUAACAJQIUAACAJQIUAACAJQIUAACAJQIUAACAJQIUAACAJQIUAACAJQIUAACAJQIUAACAJQIUAACAJQIUAACAJQIUAACAJQIUAACAJQIUAACAJQIUAACAJQIUAACAJQIUAACAJQIUAACAJQIUAACAJQIUAACAJQIUAACAJQIUAACAJQIUAACAJQIUAACAJQIUAACAJQIUAACAJQIUAACAJQIUAACAJQIUAACAJQIUAACAJQIUAACAJQIUAACAJQIUAACAJQIUAACAJQIUAACAJQIUAACAJQIUAACAJQIUAACAJQIUAACAJQIUAACAJQIUAACAJQIUAACAJQIUAACAJQIUAACAJQIUAACAJQIUAACAJQIUAACAJQIUAACAJQIUAACAJQIUAACApdMSoDIyMuRyuTRs2DCnzBijtLQ0xcXFKSQkRB06dNBXX311OpoDAABQLn4PUDk5OXrppZfUtGlTr/Lx48drwoQJmjRpknJychQbG6uuXbsqPz/f300CAAAoF78GqP379+v666/Xyy+/rOjoaKfcGKOJEydq9OjR6tu3rxo3bqzp06fr4MGDmjFjRqnDKyws1L59+7w6AACA082vAerOO+9Ur1691KVLF6/yzZs3Kzc3V926dXPK3G63UlNTtXbt2lKHl5GRoaioKKdLSEjwW9sBAABK47cA9fbbb+uTTz5RRkaGz3e5ubmSpJiYGK/ymJgY57uSjBo1Snl5eU63bdu2im00AADAKQj0x0C3bdume+65R0uXLlVwcHCp9Vwul9dnY4xP2bHcbrfcbneFtRMAAKAs/HIGasOGDdq9e7datWqlwMBABQYGKisrS//85z8VGBjonHk6/mzT7t27fc5KAQAA/NH4JUB17txZX375pT777DOna926ta6//np99tlnatCggWJjY5WZmen0c+jQIWVlZaldu3b+aBIAAECF8cslvIiICDVu3NirLCwsTDVq1HDKhw0bpvT0dCUnJys5OVnp6ekKDQ1V//79/dEkAACACuOXAHUqRowYoYKCAg0ZMkR79+5VSkqKli5dqoiIiMpqEgAAwClxGWNMZTeirPbt26eoqCjl5eUpMjKyspsD4AyUOPLDym4C8Ie25fFeFT7MP8Pxm/+FBwAAYIkABQAAYIkABQAAYIkABQAAYIkABQAAYIkABQAAYIkABQAAYIkABQAAYIkABQAAYIkABQAAYIkABQAAYIkABQAAYIkABQAAYIkABQAAYIkABQAAYIkABQAAYIkABQAAYIkABQAAYIkABQAAYIkABQAAYIkABQAAYIkABQAAYIkABQAAYIkABQAAYIkABQAAYIkABQAAYIkABQAAYIkABQAAYIkABQAAYIkABQAAYIkABQAAYIkABQAAYIkABQAAYIkABQAAYIkABQAAYIkABQAAYIkABQAAYIkABQAAYIkABQAAYIkABQAAYIkABQAAYIkABQAAYIkABQAAYIkABQAAYIkABQAAYIkABQAAYIkABQAAYIkABQAAYIkABQAAYIkABQAAYIkABQAAYIkABQAAYIkABQAAYIkABQAAYIkABQAAYIkABQAAYIkABQAAYIkABQAAYIkABQAAYMlvASojI0MXXHCBIiIiVLt2bV1xxRX69ttvveoYY5SWlqa4uDiFhISoQ4cO+uqrr/zVJAAAgArhtwCVlZWlO++8U+vWrVNmZqaKiorUrVs3HThwwKkzfvx4TZgwQZMmTVJOTo5iY2PVtWtX5efn+6tZAAAA5RborwEvXrzY6/PUqVNVu3ZtbdiwQZdccomMMZo4caJGjx6tvn37SpKmT5+umJgYzZgxQ4MHD/ZX0wAAAMrltN0DlZeXJ0mqXr26JGnz5s3Kzc1Vt27dnDput1upqalau3ZticMoLCzUvn37vDoAAIDT7bQEKGOM7rvvPrVv316NGzeWJOXm5kqSYmJivOrGxMQ43x0vIyNDUVFRTpeQkODfhgMAAJTgtASou+66S1988YVmzpzp853L5fL6bIzxKfMYNWqU8vLynG7btm1+aS8AAMCJ+O0eKI+hQ4dq/vz5WrVqleLj453y2NhYSUfPRNWpU8cp3717t89ZKQ+32y232+3fBgMAAJyE385AGWN01113ac6cOVqxYoWSkpK8vk9KSlJsbKwyMzOdskOHDikrK0vt2rXzV7MAAADKzW9noO68807NmDFD77//viIiIpz7mqKiohQSEiKXy6Vhw4YpPT1dycnJSk5OVnp6ukJDQ9W/f39/NQsAAKDc/BagJk+eLEnq0KGDV/nUqVM1aNAgSdKIESNUUFCgIUOGaO/evUpJSdHSpUsVERHhr2YBAACUm98ClDHmpHVcLpfS0tKUlpbm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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Plot the percentage of rows for which the columns 'Active' and 'Active - OR' are different\n", "\n", "# Isolate the ones having Active not nan\n", "merged_df_active = merged_df[merged_df['Active'].notnull()]\n", "\n", "tmp = (merged_df_active['Active'] != merged_df_active['Active - OR']).sum() / len(merged_df_active) * 100\n", "plt.bar(['Different', 'Equal'], [tmp, 100-tmp])\n", "plt.title('Percentage of rows for which \"Active\" and \"Active - OR\" are different')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Save to HF Dataset (TODO)" ] }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [], "source": [ "# Save to csv\n", "merged_df.to_csv(\n", " os.path.join(data_dir, 'PROTAC-Degradation-DB.csv'),\n", " index=False,\n", ")" ] }, { "cell_type": "code", "execution_count": 132, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "155614202614452bab052cc0ac717aba", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Uploading the dataset shards: 0%| | 0/1 [00:00\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Compound IDUniprotTargetE3 ligasePDBNameSmilesPercent degradation (%)Assay (Percent degradation)Article DOI...Hydrogen Bond Donor CountRotatable Bond CountTopological Polar Surface AreaMolecular FormulaInChIInChI KeyTarget (Parsed)Cell TypeTreatment Time (h)Concentration (nM)
094P10275ARVHLNaNNaNCC1=C(C2=CC=C(CNC(=O)[C@@H]3C[C@@H](O)CN3C(=O)...26.0/35.0/28.0% AR degradation in LNCaP cells after 6 h trea...10.1021/acs.jmedchem.8b01631...412188.07C45H46F4N8O6S2InChI=1S/C45H46F4N8O6S2/c1-24-36(65-23-53-24)2...GHDHSFXBWJJYAN-XTYUYLDHSA-NARLNCaP6100/1000/10000
195P10275ARVHLNaNNaNCC1=C(C2=CC=C(CNC(=O)[C@@H]3C[C@@H](O)CN3C(=O)...15.0/23.0/23.0% AR degradation in LNCaP cells after 6 h trea...10.1021/acs.jmedchem.8b01631...413188.07C46H48F4N8O6S2InChI=1S/C46H48F4N8O6S2/c1-25-37(66-24-54-25)2...IWXCCOWEXFTLEC-HTSYFKMQSA-NARLNCaP6100/1000/10000
296P10275ARVHLNaNNaNCC1=C(C2=CC=C(CNC(=O)[C@@H]3C[C@@H](O)CN3C(=O)...16.0/20.0/25.0% AR degradation in LNCaP cells after 6 h trea...10.1021/acs.jmedchem.8b01631...414188.07C47H50F4N8O6S2InChI=1S/C47H50F4N8O6S2/c1-26-38(67-25-55-26)2...ZFWHPGQSSVNCFB-KZBBYPRMSA-NARLNCaP6100/1000/10000
397P10275ARVHLNaNNaNCC1=C(C2=CC=C(CNC(=O)[C@@H]3C[C@@H](O)CN3C(=O)...11.0/25.0/29.0% AR degradation in LNCaP cells after 6 h trea...10.1021/acs.jmedchem.8b01631...415188.07C48H52F4N8O6S2InChI=1S/C48H52F4N8O6S2/c1-27-39(68-26-56-27)2...LBGRZWNYLZVZQM-HOLFLANQSA-NARLNCaP6100/1000/10000
498P10275ARVHLNaNNaNCC1=C(C2=CC=C(CNC(=O)[C@@H]3C[C@@H](O)CN3C(=O)...54.0/84.0/64.0% AR degradation in LNCaP cells after 6 h trea...10.1021/acs.jmedchem.8b01631...416188.07C49H54F4N8O6S2InChI=1S/C49H54F4N8O6S2/c1-28-40(69-27-57-28)3...QPHYYAFAFYEWMM-RHMQSKSJSA-NARLNCaP6100/1000/10000
\n", "

5 rows × 26 columns

\n", "" ], "text/plain": [ " Compound ID Uniprot Target E3 ligase PDB Name \\\n", "0 94 P10275 AR VHL NaN NaN \n", "1 95 P10275 AR VHL NaN NaN \n", "2 96 P10275 AR VHL NaN NaN \n", "3 97 P10275 AR VHL NaN NaN \n", "4 98 P10275 AR VHL NaN NaN \n", "\n", " Smiles Percent degradation (%) \\\n", "0 CC1=C(C2=CC=C(CNC(=O)[C@@H]3C[C@@H](O)CN3C(=O)... 26.0/35.0/28.0 \n", "1 CC1=C(C2=CC=C(CNC(=O)[C@@H]3C[C@@H](O)CN3C(=O)... 15.0/23.0/23.0 \n", "2 CC1=C(C2=CC=C(CNC(=O)[C@@H]3C[C@@H](O)CN3C(=O)... 16.0/20.0/25.0 \n", "3 CC1=C(C2=CC=C(CNC(=O)[C@@H]3C[C@@H](O)CN3C(=O)... 11.0/25.0/29.0 \n", "4 CC1=C(C2=CC=C(CNC(=O)[C@@H]3C[C@@H](O)CN3C(=O)... 54.0/84.0/64.0 \n", "\n", " Assay (Percent degradation) \\\n", "0 % AR degradation in LNCaP cells after 6 h trea... \n", "1 % AR degradation in LNCaP cells after 6 h trea... \n", "2 % AR degradation in LNCaP cells after 6 h trea... \n", "3 % AR degradation in LNCaP cells after 6 h trea... \n", "4 % AR degradation in LNCaP cells after 6 h trea... \n", "\n", " Article DOI ... Hydrogen Bond Donor Count \\\n", "0 10.1021/acs.jmedchem.8b01631 ... 4 \n", "1 10.1021/acs.jmedchem.8b01631 ... 4 \n", "2 10.1021/acs.jmedchem.8b01631 ... 4 \n", "3 10.1021/acs.jmedchem.8b01631 ... 4 \n", "4 10.1021/acs.jmedchem.8b01631 ... 4 \n", "\n", " Rotatable Bond Count Topological Polar Surface Area Molecular Formula \\\n", "0 12 188.07 C45H46F4N8O6S2 \n", "1 13 188.07 C46H48F4N8O6S2 \n", "2 14 188.07 C47H50F4N8O6S2 \n", "3 15 188.07 C48H52F4N8O6S2 \n", "4 16 188.07 C49H54F4N8O6S2 \n", "\n", " InChI \\\n", "0 InChI=1S/C45H46F4N8O6S2/c1-24-36(65-23-53-24)2... \n", "1 InChI=1S/C46H48F4N8O6S2/c1-25-37(66-24-54-25)2... \n", "2 InChI=1S/C47H50F4N8O6S2/c1-26-38(67-25-55-26)2... \n", "3 InChI=1S/C48H52F4N8O6S2/c1-27-39(68-26-56-27)2... \n", "4 InChI=1S/C49H54F4N8O6S2/c1-28-40(69-27-57-28)3... \n", "\n", " InChI Key Target (Parsed) Cell Type \\\n", "0 GHDHSFXBWJJYAN-XTYUYLDHSA-N AR LNCaP \n", "1 IWXCCOWEXFTLEC-HTSYFKMQSA-N AR LNCaP \n", "2 ZFWHPGQSSVNCFB-KZBBYPRMSA-N AR LNCaP \n", "3 LBGRZWNYLZVZQM-HOLFLANQSA-N AR LNCaP \n", "4 QPHYYAFAFYEWMM-RHMQSKSJSA-N AR LNCaP \n", "\n", " Treatment Time (h) Concentration (nM) \n", "0 6 100/1000/10000 \n", "1 6 100/1000/10000 \n", "2 6 100/1000/10000 \n", "3 6 100/1000/10000 \n", "4 6 100/1000/10000 \n", "\n", "[5 rows x 26 columns]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "parsed_table = []\n", "\n", "for i, row in tqdm(dc50_dmax_df.iterrows(), total=len(dc50_dmax_df), desc='Extracting Percent degradation info'):\n", " assay = row[\"Assay (Percent degradation)\"]\n", " if len(assay) < 5:\n", " continue\n", " extracted_info = extract_degradation_info(assay)\n", "\n", " extracted_info['Percent degradation (%)'] = split_clean_str(\n", " row['Percent degradation (%)'], return_floats=True)\n", "\n", " # For now, store them as strings\n", " extracted_info['Percent degradation (%)'] = '/'.join(\n", " [str(f) for f in extracted_info['Percent degradation (%)']])\n", " extracted_info['Concentration (nM)'] = '/'.join(\n", " [str(f) for f in extracted_info['Concentration (nM)']])\n", "\n", " # Update the row with the extracted info\n", " parsed_table.append({**row.to_dict(), **extracted_info})\n", "\n", "parsed_table = pd.DataFrame(parsed_table)\n", "print(f'Number of rows after parsing: {len(parsed_table)}')\n", "display(parsed_table.head())" ] }, { "cell_type": "code", "execution_count": 97, "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", "
TargetTarget (Parsed)
46BRAFB-Raf
167TRKATPM3-TRKA
256EGFR L858R/T790MNaN
258EGFR e19dNaN
305GSK-3betaGSK3B
\n", "
" ], "text/plain": [ " Target Target (Parsed)\n", "46 BRAF B-Raf\n", "167 TRKA TPM3-TRKA\n", "256 EGFR L858R/T790M NaN\n", "258 EGFR e19d NaN\n", "305 GSK-3beta GSK3B" ] }, "execution_count": 97, "metadata": {}, "output_type": "execute_result" } ], "source": [ "parsed_table[parsed_table['Target'] !=\n", " parsed_table['Target (Parsed)']][['Target', 'Target (Parsed)']].drop_duplicates()" ] }, { "cell_type": "code", "execution_count": 98, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Index(['Compound ID', 'Uniprot', 'Target', 'E3 ligase', 'PDB', 'Name',\n", " 'Smiles', 'Percent degradation (%)', 'Assay (Percent degradation)',\n", " 'Article DOI', 'Molecular Weight', 'Exact Mass', 'XLogP3',\n", " 'Heavy Atom Count', 'Ring Count', 'Hydrogen Bond Acceptor Count',\n", " 'Hydrogen Bond Donor Count', 'Rotatable Bond Count',\n", " 'Topological Polar Surface Area', 'Molecular Formula', 'InChI',\n", " 'InChI Key', 'Target (Parsed)', 'Cell Type', 'Treatment Time (h)',\n", " 'Concentration (nM)'],\n", " dtype='object')" ] }, "execution_count": 98, "metadata": {}, "output_type": "execute_result" } ], "source": [ "parsed_table.columns" ] } ], "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.11.0" } }, "nbformat": 4, "nbformat_minor": 2 }