{
"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",
"
Compound ID
\n",
"
Target
\n",
"
Percent degradation (%)
\n",
"
Article DOI
\n",
"
DC50 (nM)
\n",
"
Dmax (%)
\n",
"
Assay (DC50/Dmax)
\n",
"
Assay (Percent degradation)
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
1
\n",
"
BRD7
\n",
"
20/12 (WB)
\n",
"
10.1021/acs.jmedchem.8b01413
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
% BRD7 degradation in HeLa cells after 4/16 h ...
\n",
"
\n",
"
\n",
"
1
\n",
"
1
\n",
"
BRD9
\n",
"
19/30 (WB)
\n",
"
10.1021/acs.jmedchem.8b01413
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
% BRD9 degradation in HeLa cells after 4/16 h ...
\n",
"
\n",
"
\n",
"
2
\n",
"
2
\n",
"
BRD7
\n",
"
19/27 (WB)
\n",
"
10.1021/acs.jmedchem.8b01413
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
% BRD7 degradation in HeLa cells after 4/16 h ...
\n",
"
\n",
"
\n",
"
3
\n",
"
2
\n",
"
BRD9
\n",
"
5/21 (WB)
\n",
"
10.1021/acs.jmedchem.8b01413
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
% BRD9 degradation in HeLa cells after 4/16 h ...
\n",
"
\n",
"
\n",
"
4
\n",
"
3
\n",
"
BRD9
\n",
"
94/93 (WB)
\n",
"
10.1021/acs.jmedchem.8b01413
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
% BRD9 degradation in HeLa cells after 4/16 h ...
\n",
"
\n",
" \n",
"
\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",
"
Compound ID
\n",
"
Uniprot
\n",
"
Target
\n",
"
E3 Ligase
\n",
"
PDB
\n",
"
Name
\n",
"
Smiles
\n",
"
IC50 (nM, Protac to Target)
\n",
"
Assay (Protac to Target, IC50)
\n",
"
EC50 (nM, Protac to Target)
\n",
"
...
\n",
"
Rotatable Bond Count
\n",
"
Topological Polar Surface Area
\n",
"
Molecular Formula
\n",
"
InChI
\n",
"
InChI Key
\n",
"
Percent degradation (%)
\n",
"
DC50 (nM)
\n",
"
Dmax (%)
\n",
"
Assay (DC50/Dmax)
\n",
"
Assay (Percent degradation)
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
1
\n",
"
Q9NPI1
\n",
"
BRD7
\n",
"
VHL
\n",
"
NaN
\n",
"
NaN
\n",
"
COC1=CC(C2=CN(C)C(=O)C3=CN=CC=C23)=CC(OC)=C1CN...
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
...
\n",
"
19
\n",
"
189.92
\n",
"
C50H64N8O9S
\n",
"
InChI=1S/C50H64N8O9S/c1-32-45(68-31-53-32)34-1...
\n",
"
RPMQBLMPGMFXLD-PDUNVWSESA-N
\n",
"
20/12 (WB)
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
% BRD7 degradation in HeLa cells after 4/16 h ...
\n",
"
\n",
"
\n",
"
1
\n",
"
1
\n",
"
Q9H8M2
\n",
"
BRD9
\n",
"
VHL
\n",
"
NaN
\n",
"
NaN
\n",
"
COC1=CC(C2=CN(C)C(=O)C3=CN=CC=C23)=CC(OC)=C1CN...
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
...
\n",
"
19
\n",
"
189.92
\n",
"
C50H64N8O9S
\n",
"
InChI=1S/C50H64N8O9S/c1-32-45(68-31-53-32)34-1...
\n",
"
RPMQBLMPGMFXLD-PDUNVWSESA-N
\n",
"
19/30 (WB)
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
% BRD9 degradation in HeLa cells after 4/16 h ...
\n",
"
\n",
"
\n",
"
2
\n",
"
2
\n",
"
Q9NPI1
\n",
"
BRD7
\n",
"
VHL
\n",
"
NaN
\n",
"
NaN
\n",
"
COC1=CC(C2=CN(C)C(=O)C3=CN=CC=C23)=CC(OC)=C1CN...
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
...
\n",
"
25
\n",
"
208.38
\n",
"
C54H72N8O11S
\n",
"
InChI=1S/C54H72N8O11S/c1-36-49(74-35-57-36)38-...
\n",
"
NGWWVKZONFCNQP-SHPBXJAASA-N
\n",
"
19/27 (WB)
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
% BRD7 degradation in HeLa cells after 4/16 h ...
\n",
"
\n",
"
\n",
"
3
\n",
"
2
\n",
"
Q9H8M2
\n",
"
BRD9
\n",
"
VHL
\n",
"
NaN
\n",
"
NaN
\n",
"
COC1=CC(C2=CN(C)C(=O)C3=CN=CC=C23)=CC(OC)=C1CN...
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
...
\n",
"
25
\n",
"
208.38
\n",
"
C54H72N8O11S
\n",
"
InChI=1S/C54H72N8O11S/c1-36-49(74-35-57-36)38-...
\n",
"
NGWWVKZONFCNQP-SHPBXJAASA-N
\n",
"
5/21 (WB)
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
% BRD9 degradation in HeLa cells after 4/16 h ...
\n",
"
\n",
"
\n",
"
4
\n",
"
3
\n",
"
Q9H8M2
\n",
"
BRD9
\n",
"
CRBN
\n",
"
NaN
\n",
"
NaN
\n",
"
COC1=CC(C2=CN(C)C(=O)C3=CN=CC=C23)=CC(OC)=C1CN...
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
...
\n",
"
18
\n",
"
202.97
\n",
"
C43H50N8O10
\n",
"
InChI=1S/C43H50N8O10/c1-48-24-31(28-9-10-44-23...
\n",
"
RMBNUDOJPQLHMV-UHFFFAOYSA-N
\n",
"
94/93 (WB)
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
% BRD9 degradation in HeLa cells after 4/16 h ...
\n",
"
\n",
" \n",
"
\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",
"
Percent degradation (%)
\n",
"
Assay (Percent degradation)
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
20/12 (WB)
\n",
"
% BRD7 degradation in HeLa cells after 4/16 h ...
\n",
"
\n",
"
\n",
"
1
\n",
"
19/30 (WB)
\n",
"
% BRD9 degradation in HeLa cells after 4/16 h ...
\n",
"
\n",
"
\n",
"
2
\n",
"
19/27 (WB)
\n",
"
% BRD7 degradation in HeLa cells after 4/16 h ...
\n",
"
\n",
"
\n",
"
3
\n",
"
5/21 (WB)
\n",
"
% BRD9 degradation in HeLa cells after 4/16 h ...
\n",
"
\n",
"
\n",
"
4
\n",
"
94/93 (WB)
\n",
"
% BRD9 degradation in HeLa cells after 4/16 h ...
\n",
"
\n",
"
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
\n",
"
\n",
"
4861
\n",
"
54 (WB)
\n",
"
% JAK3 degradation in MHH-CALL-4 cells at 100 nM
\n",
"
\n",
"
\n",
"
4863
\n",
"
42 (WB)
\n",
"
% JAK3 degradation in MHH-CALL-4 cells at 100 nM
\n",
"
\n",
"
\n",
"
4864
\n",
"
1/32/69/19 (WB)
\n",
"
% JAK2 degradation in MHH-CALL-4 cells at 1/10...
\n",
"
\n",
"
\n",
"
4881
\n",
"
0/30/30/53/29 (WB)
\n",
"
% EGFR del19 degradation in HCC827 cells at 5/...
\n",
"
\n",
"
\n",
"
4882
\n",
"
10/7/7/27/34 (WB)
\n",
"
% EGFR EGFR L858R/T790M degradation in H1975 c...
\n",
"
\n",
" \n",
"
\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",
"
PROTACDB ID
\n",
"
PROTAC SMILES
\n",
"
Active/Inactive
\n",
"
Best PROTAC
\n",
"
Cells
\n",
"
cLogP
\n",
"
Comments
\n",
"
Curator
\n",
"
Dc50
\n",
"
Dmax
\n",
"
...
\n",
"
Proteomics Data Available
\n",
"
Secondary Pubmed
\n",
"
Status
\n",
"
Target
\n",
"
Tested A Non Binding E3 Control
\n",
"
Tested Competition With Ligand
\n",
"
Tested Engagement In Cells
\n",
"
Tested Proteaseome Inhibitor
\n",
"
Time
\n",
"
TPSA
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
1
\n",
"
Cc1ncsc1-c1ccc([C@H](C)NC(=O)[C@@H]2C[C@@H](O)...
\n",
"
Inactive
\n",
"
No
\n",
"
MOLT-4
\n",
"
10.83732
\n",
"
IC50's are for cell viability assays
\n",
"
Ronen Gabizon
\n",
"
NaN
\n",
"
NaN
\n",
"
...
\n",
"
No
\n",
"
NaN
\n",
"
Reviewed
\n",
"
Q07817
\n",
"
No
\n",
"
No
\n",
"
No
\n",
"
No
\n",
"
48
\n",
"
251.07
\n",
"
\n",
"
\n",
"
1
\n",
"
2
\n",
"
Cc1ncsc1-c1ccc([C@H](C)NC(=O)[C@@H]2C[C@@H](O)...
\n",
"
Inactive
\n",
"
No
\n",
"
MOLT-4
\n",
"
11.22742
\n",
"
IC50's are for cell viability assays
\n",
"
Ronen Gabizon
\n",
"
NaN
\n",
"
NaN
\n",
"
...
\n",
"
No
\n",
"
NaN
\n",
"
Reviewed
\n",
"
Q07817
\n",
"
No
\n",
"
No
\n",
"
No
\n",
"
No
\n",
"
48
\n",
"
251.07
\n",
"
\n",
"
\n",
"
2
\n",
"
3
\n",
"
Cc1ncsc1-c1ccc([C@H](C)NC(=O)[C@@H]2C[C@@H](O)...
\n",
"
Inactive
\n",
"
No
\n",
"
MOLT-4
\n",
"
11.61752
\n",
"
IC50's are for cell viability assays
\n",
"
Ronen Gabizon
\n",
"
NaN
\n",
"
NaN
\n",
"
...
\n",
"
No
\n",
"
NaN
\n",
"
Reviewed
\n",
"
Q07817
\n",
"
No
\n",
"
No
\n",
"
No
\n",
"
No
\n",
"
48
\n",
"
251.07
\n",
"
\n",
"
\n",
"
3
\n",
"
4
\n",
"
Cc1ncsc1-c1ccc([C@H](C)NC(=O)[C@@H]2C[C@@H](O)...
\n",
"
Active
\n",
"
No
\n",
"
MOLT-4
\n",
"
12.00762
\n",
"
IC50's are for cell viability assays
\n",
"
Ronen Gabizon
\n",
"
NaN
\n",
"
NaN
\n",
"
...
\n",
"
No
\n",
"
NaN
\n",
"
Reviewed
\n",
"
Q07817
\n",
"
No
\n",
"
No
\n",
"
No
\n",
"
No
\n",
"
48
\n",
"
251.07
\n",
"
\n",
"
\n",
"
4
\n",
"
5
\n",
"
Cc1ncsc1-c1ccc([C@H](C)NC(=O)[C@@H]2C[C@@H](O)...
\n",
"
Active
\n",
"
No
\n",
"
MOLT-4
\n",
"
12.39772
\n",
"
IC50's are for cell viability assays
\n",
"
Ronen Gabizon
\n",
"
53 nM
\n",
"
~ 100 %
\n",
"
...
\n",
"
No
\n",
"
NaN
\n",
"
Reviewed
\n",
"
Q07817
\n",
"
No
\n",
"
No
\n",
"
Yes
\n",
"
No
\n",
"
48
\n",
"
251.07
\n",
"
\n",
" \n",
"
\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",
"
Cell Type
\n",
"
Comments
\n",
"
Dmax (%)
\n",
"
DC50 (nM)
\n",
"
\n",
" \n",
" \n",
"
\n",
"
105
\n",
"
RS4;11, MOLM-13
\n",
"
Direct degration studies in this paper only co...
\n",
"
100 %
\n",
"
< 10 nM
\n",
"
\n",
"
\n",
"
106
\n",
"
RS4;11, MOLM-13
\n",
"
Complex structure with the ligand was modeled ...
\n",
"
100 %
\n",
"
< 1 nM
\n",
"
\n",
"
\n",
"
107
\n",
"
RS4;11, MOLM-13
\n",
"
Complex structure with the ligand was modeled ...
\n",
"
100 %
\n",
"
< 1 nM
\n",
"
\n",
"
\n",
"
108
\n",
"
RS4;11, MOLM-13
\n",
"
Complex structure with the ligand was modeled ...
\n",
"
NaN
\n",
"
~ 3 nM
\n",
"
\n",
"
\n",
"
109
\n",
"
RS4;11, MOLM-13
\n",
"
Complex structure with the ligand was modeled ...
\n",
"
NaN
\n",
"
~ 10 nM
\n",
"
\n",
"
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
\n",
"
\n",
"
1182
\n",
"
A549; H1299; B16-F10; MDAMB231; Jurkat
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
\n",
"
\n",
"
1185
\n",
"
A549; H1299; B16-F10; MDAMB231; Jurkat
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
\n",
"
\n",
"
1194
\n",
"
A549; H1299; B16-F10; MDAMB231; Jurkat
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
\n",
"
\n",
"
1195
\n",
"
A549; H1299; B16-F10; MDAMB231; Jurkat
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
\n",
"
\n",
"
1198
\n",
"
A549; H1299; B16-F10; MDAMB231; Jurkat
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
\n",
" \n",
"
\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": [
"
"
],
"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",
"
Assay (DC50/Dmax)
\n",
"
DC50 (nM)
\n",
"
Dmax (%)
\n",
"
\n",
" \n",
" \n",
"
\n",
"
19
\n",
"
Degradation of BRD9 in HeLa cells after 4 h tr...
\n",
"
560
\n",
"
80
\n",
"
\n",
"
\n",
"
40
\n",
"
Degradation of BRD9 in RI-1 cells after 8 h tr...
\n",
"
1.76
\n",
"
95
\n",
"
\n",
"
\n",
"
41
\n",
"
Degradation of HiBiT-BRD9 in HEK293 cells afte...
\n",
"
4
\n",
"
NaN
\n",
"
\n",
"
\n",
"
42
\n",
"
Degradation of BRD9 in EOL-1/A-204 cells after...
\n",
"
2/8
\n",
"
NaN
\n",
"
\n",
"
\n",
"
43
\n",
"
Degradation of BRD7 in RI-1 cells after 8 h tr...
\n",
"
4.5
\n",
"
95
\n",
"
\n",
" \n",
"
\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",
"
Assay (Percent degradation)
\n",
"
Percent degradation (%)
\n",
"
\n",
" \n",
" \n",
"
\n",
"
129
\n",
"
% AR degradation in LNCaP cells after 6 h trea...
\n",
"
26/35/28
\n",
"
\n",
"
\n",
"
130
\n",
"
% AR degradation in LNCaP cells after 6 h trea...
\n",
"
15/23/23
\n",
"
\n",
"
\n",
"
131
\n",
"
% AR degradation in LNCaP cells after 6 h trea...
\n",
"
16/20/25
\n",
"
\n",
"
\n",
"
132
\n",
"
% AR degradation in LNCaP cells after 6 h trea...
\n",
"
11/25/29
\n",
"
\n",
"
\n",
"
133
\n",
"
% AR degradation in LNCaP cells after 6 h trea...
\n",
"
54/84/64
\n",
"
\n",
" \n",
"
\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",
"
Assay (Protac to Target, IC50)
\n",
"
IC50 (nM, Protac to Target)
\n",
"
\n",
" \n",
" \n",
"
\n",
"
234
\n",
"
Inhibition of SIRT2 in a fluorescence-based de...
\n",
"
250
\n",
"
\n",
"
\n",
"
307
\n",
"
Inhibition of CDK6/Cyciln D3 by cell-free kina...
\n",
"
6.61
\n",
"
\n",
"
\n",
"
311
\n",
"
Inhibition of ERRalpha by TR-FRET Coactivator ...
\n",
"
7.33
\n",
"
\n",
"
\n",
"
312
\n",
"
Inhibition of ERRalpha by TR-FRET Coactivator ...
\n",
"
6.33
\n",
"
\n",
"
\n",
"
313
\n",
"
Inhibition of ERRalpha by TR-FRET Coactivator ...
\n",
"
12.67
\n",
"
\n",
" \n",
"
\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",
"
Assay (Protac to Target, EC50)
\n",
"
EC50 (nM, Protac to Target)
\n",
"
\n",
" \n",
" \n",
"
\n",
"
545
\n",
"
EC50 of BRD4 BD1/2 was tested by TR-FRET
\n",
"
95/298
\n",
"
\n",
"
\n",
"
5282
\n",
"
EC50 was tested by TR-FRET coactivator assays
\n",
"
31
\n",
"
\n",
" \n",
"
\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": [
"
"
],
"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",
"
Assay (Permeability, Caco-2 A2B Papp)
\n",
"
Caco-2 A2B Papp (nm/s, Permeability)
\n",
"
\n",
" \n",
" \n",
"
\n",
"
395
\n",
"
Compounds were administered at 10000 nM and in...
\n",
"
0.35
\n",
"
\n",
"
\n",
"
397
\n",
"
Compounds were administered at 5000 nM and inc...
\n",
"
0.081
\n",
"
\n",
"
\n",
"
506
\n",
"
Compounds were administered at 10000 nM and in...
\n",
"
11.6
\n",
"
\n",
"
\n",
"
711
\n",
"
Compounds were administered at 10000 nM and in...
\n",
"
0.02
\n",
"
\n",
"
\n",
"
2188
\n",
"
Compounds were administered at 10000 nM and in...
\n",
"
1.7
\n",
"
\n",
" \n",
"
\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",
"
Assay (Permeability, Caco-2 B2A Papp)
\n",
"
Caco-2 B2A Papp (nm/s, Permeability)
\n",
"
\n",
" \n",
" \n",
"
\n",
"
395
\n",
"
Compounds were administered at 10000 nM and in...
\n",
"
0.24
\n",
"
\n",
"
\n",
"
711
\n",
"
Compounds were administered at 10000 nM and in...
\n",
"
0.07
\n",
"
\n",
"
\n",
"
2188
\n",
"
Compounds were administered at 10000 nM and in...
\n",
"
14.1
\n",
"
\n",
"
\n",
"
2190
\n",
"
Compounds were administered at 10000 nM and in...
\n",
"
1.4
\n",
"
\n",
"
\n",
"
2191
\n",
"
Compounds were administered at 10000 nM and in...
\n",
"
<0.79
\n",
"
\n",
" \n",
"
\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, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
Compound ID
\n",
"
Uniprot
\n",
"
Target
\n",
"
E3 Ligase
\n",
"
PDB
\n",
"
Name
\n",
"
Smiles
\n",
"
DC50 (nM)
\n",
"
Dmax (%)
\n",
"
Assay (DC50/Dmax)
\n",
"
...
\n",
"
Hydrogen Bond Acceptor Count
\n",
"
Hydrogen Bond Donor Count
\n",
"
Rotatable Bond Count
\n",
"
Topological Polar Surface Area
\n",
"
Molecular Formula
\n",
"
InChI
\n",
"
InChI Key
\n",
"
Target (Parsed)
\n",
"
Cell Type
\n",
"
Treatment Time (h)
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
11
\n",
"
Q9H8M2
\n",
"
BRD9
\n",
"
VHL
\n",
"
NaN
\n",
"
NaN
\n",
"
COC1=CC(C2=CN(C)C(=O)C3=CN=CC=C23)=CC(OC)=C1CN...
\n",
"
560.00
\n",
"
80.0
\n",
"
Degradation of BRD9 in HeLa cells after 4 h tr...
\n",
"
...
\n",
"
16
\n",
"
3
\n",
"
22
\n",
"
199.15
\n",
"
C54H69FN8O10S
\n",
"
InChI=1S/C54H69FN8O10S/c1-34-47(74-33-58-34)35...
\n",
"
MXAKQOVZPDLCDK-UDVNCTHFSA-N
\n",
"
BRD9
\n",
"
HeLa
\n",
"
4.0
\n",
"
\n",
"
\n",
"
1
\n",
"
22
\n",
"
Q9H8M2
\n",
"
BRD9
\n",
"
VHL
\n",
"
NaN
\n",
"
VZ185
\n",
"
COC1=CC(C2=CN(C)C(=O)C3=CN=CC=C23)=CC(OC)=C1CN...
\n",
"
1.76
\n",
"
95.0
\n",
"
Degradation of BRD9 in RI-1 cells after 8 h tr...
\n",
"
...
\n",
"
14
\n",
"
3
\n",
"
19
\n",
"
180.69
\n",
"
C53H67FN8O8S
\n",
"
InChI=1S/C53H67FN8O8S/c1-33-46(71-32-57-33)34-...
\n",
"
ZAGCLFXBHOXXEN-JPTLTNPLSA-N
\n",
"
BRD9
\n",
"
RI-1
\n",
"
8.0
\n",
"
\n",
"
\n",
"
2
\n",
"
22
\n",
"
Q9H8M2
\n",
"
BRD9
\n",
"
VHL
\n",
"
NaN
\n",
"
VZ185
\n",
"
COC1=CC(C2=CN(C)C(=O)C3=CN=CC=C23)=CC(OC)=C1CN...
\n",
"
4.00
\n",
"
NaN
\n",
"
Degradation of HiBiT-BRD9 in HEK293 cells afte...
\n",
"
...
\n",
"
14
\n",
"
3
\n",
"
19
\n",
"
180.69
\n",
"
C53H67FN8O8S
\n",
"
InChI=1S/C53H67FN8O8S/c1-33-46(71-32-57-33)34-...
\n",
"
ZAGCLFXBHOXXEN-JPTLTNPLSA-N
\n",
"
HiBiT-BRD9
\n",
"
HEK293
\n",
"
24.0
\n",
"
\n",
"
\n",
"
3
\n",
"
22
\n",
"
Q9H8M2
\n",
"
BRD9
\n",
"
VHL
\n",
"
NaN
\n",
"
VZ185
\n",
"
COC1=CC(C2=CN(C)C(=O)C3=CN=CC=C23)=CC(OC)=C1CN...
\n",
"
2.00
\n",
"
NaN
\n",
"
Degradation of BRD9 in EOL-1/A-204 cells after...
\n",
"
...
\n",
"
14
\n",
"
3
\n",
"
19
\n",
"
180.69
\n",
"
C53H67FN8O8S
\n",
"
InChI=1S/C53H67FN8O8S/c1-33-46(71-32-57-33)34-...
\n",
"
ZAGCLFXBHOXXEN-JPTLTNPLSA-N
\n",
"
BRD9
\n",
"
EOL-1
\n",
"
18.0
\n",
"
\n",
"
\n",
"
4
\n",
"
22
\n",
"
Q9H8M2
\n",
"
BRD9
\n",
"
VHL
\n",
"
NaN
\n",
"
VZ185
\n",
"
COC1=CC(C2=CN(C)C(=O)C3=CN=CC=C23)=CC(OC)=C1CN...
\n",
"
8.00
\n",
"
NaN
\n",
"
Degradation of BRD9 in EOL-1/A-204 cells after...
\n",
"
...
\n",
"
14
\n",
"
3
\n",
"
19
\n",
"
180.69
\n",
"
C53H67FN8O8S
\n",
"
InChI=1S/C53H67FN8O8S/c1-33-46(71-32-57-33)34-...
\n",
"
ZAGCLFXBHOXXEN-JPTLTNPLSA-N
\n",
"
BRD9
\n",
"
A-204
\n",
"
18.0
\n",
"
\n",
" \n",
"
\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",
"
Assay (DC50/Dmax)
\n",
"
Target
\n",
"
Target (Parsed)
\n",
"
\n",
" \n",
" \n",
"
\n",
"
2
\n",
"
Degradation of HiBiT-BRD9 in HEK293 cells afte...
\n",
"
BRD9
\n",
"
HiBiT-BRD9
\n",
"
\n",
"
\n",
"
6
\n",
"
Degradation of HiBiT-BRD7 in HEK293 cells afte...
\n",
"
BRD7
\n",
"
HiBiT-BRD7
\n",
"
\n",
"
\n",
"
77
\n",
"
Degradation of NPM-ALK/EML4-ALK in SU-DHL-1/NC...
\n",
"
ALK
\n",
"
NPM-ALK
\n",
"
\n",
"
\n",
"
78
\n",
"
Degradation of NPM-ALK/EML4-ALK in SU-DHL-1/NC...
\n",
"
ALK
\n",
"
EML4-ALK
\n",
"
\n",
"
\n",
"
102
\n",
"
Degradation of Fak in PC3 cells after 24 h tre...
\n",
"
FAK
\n",
"
Fak
\n",
"
\n",
"
\n",
"
111
\n",
"
Degradation of WT/Exon 20 Ins EGFR in OVCAR8/H...
\n",
"
EGFR
\n",
"
WT
\n",
"
\n",
"
\n",
"
112
\n",
"
Degradation of WT/Exon 20 Ins EGFR in OVCAR8/H...
\n",
"
EGFR
\n",
"
Exon 20 Ins EGFR
\n",
"
\n",
"
\n",
"
113
\n",
"
Degradation of Exon 19 del/L858R EGFR in HCC82...
\n",
"
EGFR
\n",
"
Exon 19 del
\n",
"
\n",
"
\n",
"
114
\n",
"
Degradation of Exon 19 del/L858R EGFR in HCC82...
\n",
"
EGFR
\n",
"
L858R EGFR
\n",
"
\n",
"
\n",
"
115
\n",
"
Degradation of L858R, T790M EGFR in H1975 cell...
\n",
"
EGFR
\n",
"
L858R, T790M EGFR
\n",
"
\n",
"
\n",
"
122
\n",
"
Degradation of C481S BTK in XLA cells after 24...
\n",
"
BTK C481S
\n",
"
C481S BTK
\n",
"
\n",
"
\n",
"
141
\n",
"
Degradation of BRD4 short/long in HeLa cells a...
\n",
"
BRD4
\n",
"
BRD4 short
\n",
"
\n",
"
\n",
"
142
\n",
"
Degradation of BRD4 short/long in HeLa cells a...
\n",
"
BRD4
\n",
"
BRD4 long
\n",
"
\n",
"
\n",
"
144
\n",
"
Degradation of BRD4 BD1/2 assessed by EGFP/mCh...
\n",
"
BRD4
\n",
"
BRD4 BD1
\n",
"
\n",
"
\n",
"
145
\n",
"
Degradation of BRD4 BD1/2 assessed by EGFP/mCh...
\n",
"
BRD4
\n",
"
BRD4 BD2
\n",
"
\n",
"
\n",
"
208
\n",
"
Degradation of total STAT3 and p-STAT3Y705 pro...
\n",
"
STAT3
\n",
"
p-STAT3Y705
\n",
"
\n",
"
\n",
"
212
\n",
"
Degradation of total STAT3 and p-STAT3Y705 pro...
\n",
"
STAT3
\n",
"
p-STAT3Y705
\n",
"
\n",
"
\n",
"
262
\n",
"
Degradation of G1202R ALK in 293T cells
\n",
"
ALK G1202R
\n",
"
G1202R ALK
\n",
"
\n",
"
\n",
"
356
\n",
"
Degradation of SMARCA2 in MV-4-11 cells after ...
\n",
"
SMARCA4
\n",
"
SMARCA2
\n",
"
\n",
"
\n",
"
365
\n",
"
Degradation of ERalpha in MCF-7/T47D cells aft...
\n",
"
ER
\n",
"
ERalpha
\n",
"
\n",
"
\n",
"
367
\n",
"
Degradation of ERalpha in MCF-7 cells after 6 ...
\n",
"
ER
\n",
"
ERalpha
\n",
"
\n",
"
\n",
"
368
\n",
"
Degradation of ERalpha in MCF-7 cells after 6h...
\n",
"
ER
\n",
"
ERalpha
\n",
"
\n",
"
\n",
"
387
\n",
"
Degradation of pVHL30 in HeLa cells after 24 h...
\n",
"
VHL
\n",
"
pVHL30
\n",
"
\n",
"
\n",
"
388
\n",
"
Degradation of TrkC in Hs578t cells after 24 h...
\n",
"
TRKC
\n",
"
TrkC
\n",
"
\n",
"
\n",
"
389
\n",
"
Degradation of HADC6 in MM.1S cells after 24 h...
\n",
"
HDAC6
\n",
"
HADC6
\n",
"
\n",
"
\n",
"
408
\n",
"
Degradation of ERalpha in MCF-7 cells after 4/...
\n",
"
ER
\n",
"
ERalpha
\n",
"
\n",
"
\n",
"
411
\n",
"
Degradation of ERalpha in MCF-7 cells after 4h...
\n",
"
ER
\n",
"
ERalpha
\n",
"
\n",
"
\n",
"
412
\n",
"
Degradation of ERalpha in MCF-7 cells after 4/...
\n",
"
ER
\n",
"
ERalpha
\n",
"
\n",
"
\n",
"
495
\n",
"
Degradation of total tau/P-tau in A152T neuron...
\n",
"
Tau
\n",
"
tau/P-tau
\n",
"
\n",
"
\n",
"
523
\n",
"
Degradation of ERalpha in MCF7 cells
\n",
"
ER
\n",
"
ERalpha
\n",
"
\n",
"
\n",
"
536
\n",
"
Degradation of Fak in primary Sertoli/germ cel...
\n",
"
FAK
\n",
"
Fak
\n",
"
\n",
"
\n",
"
620
\n",
"
Degradation of Fak in HLE/HuH-7/SNU-423 cells ...
\n",
"
FAK
\n",
"
Fak
\n",
"
\n",
"
\n",
"
623
\n",
"
Degradation of Fak in HUH-1/HepG2/SK-Hep-1 cel...
\n",
"
FAK
\n",
"
Fak
\n",
"
\n",
"
\n",
"
626
\n",
"
Degradation of Fak in A549/Hep3B2.1-7/SNU-387 ...
\n",
"
FAK
\n",
"
Fak
\n",
"
\n",
"
\n",
"
629
\n",
"
Degradation of Fak in HLF/SNU-398/HUCCT1 cells...
\n",
"
FAK
\n",
"
Fak
\n",
"
\n",
"
\n",
"
663
\n",
"
Degradation of TPM3-TRKA/TRKA in KM12/HEL cell...
\n",
"
TRKA
\n",
"
TPM3-TRKA
\n",
"
\n",
"
\n",
"
718
\n",
"
Degradation of EGFR del19 in HCC827 cells afte...
\n",
"
EGFR e19d
\n",
"
EGFR del19
\n",
"
\n",
"
\n",
"
769
\n",
"
Degradation of ERalpha in MCF-7 cells
\n",
"
ER
\n",
"
ERalpha
\n",
"
\n",
"
\n",
"
806
\n",
"
Degradation of WDR5-HiBiT in MV4-11 (WDR5-HiBi...
\n",
"
WDR5
\n",
"
WDR5-HiBiT
\n",
"
\n",
"
\n",
"
824
\n",
"
Degradation of BRD4 long in HEK293 cells after...
\n",
"
BRD4
\n",
"
BRD4 long
\n",
"
\n",
"
\n",
"
892
\n",
"
Degradation of PYK2 in SR cells after 24 h tre...
\n",
"
PTK2B
\n",
"
PYK2
\n",
"
\n",
"
\n",
"
896
\n",
"
Degradation of RSK1 in NCI-H2228/A549/Calu-1 c...
\n",
"
RPS6KA1
\n",
"
RSK1
\n",
"
\n",
"
\n",
"
899
\n",
"
Degradation of EGFR del19 in HCC-827 cells aft...
\n",
"
EGFR e19d
\n",
"
EGFR del19
\n",
"
\n",
"
\n",
"
1014
\n",
"
Degradation of total AKT in BT474 cells after ...
\n",
"
AKT2
\n",
"
AKT
\n",
"
\n",
"
\n",
"
1015
\n",
"
Degradation of total AKT in BT474 cells after ...
\n",
"
AKT1
\n",
"
AKT
\n",
"
\n",
"
\n",
"
1016
\n",
"
Degradation of total AKT in BT474 cells after ...
\n",
"
AKT3
\n",
"
AKT
\n",
"
\n",
"
\n",
"
1058
\n",
"
Degradation of GSK3B in SH-SY5Y cells after 24...
\n",
"
GSK-3beta
\n",
"
GSK3B
\n",
"
\n",
"
\n",
"
1145
\n",
"
Degradation of SMARCA2 HiBiT in HT1080 cells a...
\n",
"
SMARCA2
\n",
"
SMARCA2 HiBiT
\n",
"
\n",
"
\n",
"
1191
\n",
"
Degradation of Tau5 in HEK293-hTau cells after...
\n",
"
Tau
\n",
"
Tau5
\n",
"
\n",
"
\n",
"
1192
\n",
"
Degradation of ENL in MV4;11 cells after 24 h ...
\n",
"
MLLT1
\n",
"
ENL
\n",
"
\n",
" \n",
"
\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": "iVBORw0KGgoAAAANSUhEUgAAAjsAAAHFCAYAAAAUpjivAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA0n0lEQVR4nO3de1xVVf7/8fdRriKQinJRVGzwFl4S0mQuYihmqU3WQ0tzzOw7luVI6jSa0wiO4WRfzUatvjNfFMvrNGU5M42JZqahpaTlLZ0pryNoJAImgcL6/dGP8+0EqCBwYPV6Ph77MZ211977sxcM5+3ae5/jMMYYAQAAWKqRuwsAAACoTYQdAABgNcIOAACwGmEHAABYjbADAACsRtgBAABWI+wAAACrEXYAAIDVCDsAAMBqhB2gHktLS5PD4dDu3bsrXD9kyBC1b9/epa19+/Z68MEHq3ScjIwMJSUl6fz589Ur9Ado7dq1uummm+Tr6yuHw6G9e/dedZv169fL4XCoRYsWKioqqtZxL168qKSkJL333nvl1pX9vhw7dqxa+wZsRdgBLLNu3To9/fTTVdomIyNDycnJhJ1r9OWXX2rMmDG68cYbtWHDBu3YsUMdO3a86napqamSpHPnzunNN9+s1rEvXryo5OTkCsPOnXfeqR07dig0NLRa+wZs5eHuAgDUrJtvvtndJVTZpUuX5HA45OHRMP4kHTlyRJcuXdIDDzygfv36XdM22dnZevvtt3XbbbcpIyNDqampGjlyZI3W1bJlS7Vs2bJG9wnYgJkdwDLfv4xVWlqqOXPmqFOnTvL19dUNN9yg7t2764UXXpAkJSUl6de//rUkKSIiQg6HQw6HwzlzUFpaqnnz5qlz587y9vZWq1at9Itf/EKnTp1yOa4xRikpKWrXrp18fHwUExOj9PR0xcXFKS4uztnvvffek8Ph0KuvvqqpU6eqdevW8vb21r///W99+eWXmjhxorp27aqmTZuqVatWuu2227Rt2zaXYx07dkwOh0PPPfecnn32WbVv316+vr6Ki4tzBpHp06crLCxMgYGBuvvuu3X27NlrGr/169erb9++atKkifz9/TVw4EDt2LHDuf7BBx/UT37yE0nSyJEj5XA4XM6vMsuXL9fly5f1xBNPaPjw4dq8ebOOHz9ert/58+c1depUdejQwTned9xxhz777DMdO3bMGWaSk5OdP6uyn/f3L2MlJibKz89P+fn55Y4zcuRIBQcH69KlS862tWvXqm/fvvLz81PTpk01aNAg7dmz55rGDajPCDtAA1BSUqLLly+XW4wxV9123rx5SkpK0v33369//OMfWrt2rcaPH++8ZPXwww9r0qRJkqQ33nhDO3bs0I4dO9SrVy9J0qOPPqrf/OY3GjhwoNavX6/f//732rBhg2JjY5WTk+M8zsyZMzVz5kzdfvvteuutt/TII4/o4Ycf1pEjRyqsa8aMGTpx4oRefvll/e1vf1OrVq107tw5SdKsWbP0j3/8Q8uWLVOHDh0UFxdX4WWbJUuW6IMPPtCSJUv0v//7v/rss880dOhQjR8/Xl9++aWWLl2qefPmadOmTXr44YevOlarVq3SXXfdpYCAAK1evVqpqanKzc1VXFyctm/fLkl6+umntWTJEklSSkqKduzYoRdffPGq+166dKlCQ0M1ePBgPfTQQyotLVVaWppLn4KCAv3kJz/R//zP/2jcuHH629/+ppdfflkdO3ZUVlaWQkNDtWHDBknS+PHjnT+ryi5bPvTQQ7p48aL+8pe/uLSfP39eb731lh544AF5eno6z+X+++9X165d9Ze//EWvvvqqCgoK9NOf/lQHDx686vkB9ZoBUG8tW7bMSLri0q5dO5dt2rVrZ8aOHet8PWTIENOzZ88rHue5554zkszRo0dd2g8dOmQkmYkTJ7q0f/jhh0aSeeqpp4wxxpw7d854e3ubkSNHuvTbsWOHkWT69evnbNuyZYuRZH72s59d9fwvX75sLl26ZOLj483dd9/tbD969KiRZHr06GFKSkqc7QsXLjSSzLBhw1z2k5iYaCSZvLy8So9VUlJiwsLCTLdu3Vz2WVBQYFq1amViY2PLncNrr7121XMwxpj333/fSDLTp083xhhTWlpqIiIiTLt27Uxpaamz3+zZs40kk56eXum+vvzySyPJzJo1q9y6st+X7/4ce/Xq5VK7Mca8+OKLRpLZt2+fMcaYEydOGA8PDzNp0iSXfgUFBSYkJMSMGDHims4TqK+Y2QEagFdeeUW7du0qt5RdTrmS3r1765NPPtHEiRP1zjvvVHhJozJbtmyRpHJPd/Xu3VtdunTR5s2bJUk7d+5UUVGRRowY4dLv1ltvLfe0WJl77rmnwvaXX35ZvXr1ko+Pjzw8POTp6anNmzfr0KFD5frecccdatTo//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": [
"