基于RO5,即Lipinski规则过滤化合物库在早期药物研发项目中已经很常用,但其适用范围往往是限制口服相关的利用度与PK性质。
本文介绍基于PAINS与警示结构的过滤方式并简单比较异同。
PAINS全称“pan-assay interference compounds”,是药物筛选过程中主要的假阳性来源,其实质包括胶体聚集化合物、自荧光化合物、荧光酶抑制剂、易反应化合物和多靶点化合物。
警示结构(structure alerts)则是更广泛意义上的有害化学结构,例如可以带来毒性的基团,或者是生物体内不稳定易降解,发生特定化学反应的基团。以上这些结构,在早期药物研发过程中,都需要尽可能提前发现筛除,从而避免不必要的实验成本浪费。
1. PAINS
PAINS的过滤已经被集成在了RDkit工具集中,可以直接调用。
from rdkit import Chem
from rdkit.Chem import FilterCatalog, PandasTools
import pandas as pd
param = FilterCatalog.FilterCatalogParams()
param.AddCatalog(FilterCatalog.FilterCatalogParams.FilterCatalogs.PAINS)
filt = FilterCatalog.FilterCatalog(param)
df = PandasTools.LoadSDF('./SDF/1uM.sdf.mol')
len(df) # 28372
df['PAINS'] = df.ROMol.map(filt.HasMatch)
df.head(2)
需要注意的是,PAINS的过滤有效性在业界中已被多次质疑有错杀太多的情形,因此PAINS滤去的结果仅当参考,有能力时需要药物化学家审查化合物被滤过的结构。
2. 警示结构(Structure alerts)
定义上不同于干扰活性与亲和力实验的PAINS结构,structure alert概念更加宽泛。例如以AI 药物发现技术闻名的公司Insilico Medicine,在短短46天内设计并筛选出了一个DDR1受体抑制剂,该结果于2019年9月发表在Nature Biotechnology上[1]。
文章中提到,Insilico Medicine公司采用了150个内部的structure alert去筛除有毒结构、活性基团或其他不利的基团,包括
- 对位或邻位卤素取代的吡啶;
- 2号位卤素取代的呋喃、噻吩、卤代烷和醛
- 二硫键(不稳定)
- 靛红或巴比妥类结构 (潜在精神系统副作用)
- 过氧化物 (不稳定)
- 其他一些杂环或融合芳香环结构等等
文章原文:
150 in-house MCFs were applied to remove potentially toxic structures and compounds containing reactive and undesirable groups. These include substrates for 1,4-addition (Michael bearing moieties) and other electrophilic species (for example, para- or orthohalogen- substituted pyridines, 2-halogen-substituted furans and thiophenes, alkylhalides, and aldehydes and anhydrides), disulfides, isatins, barbiturates, strainedheterocycles, fused polyaromatic systems, detergents, hydroxamic acids and diazo-compounds, peroxides, unstable fragments, and sulfonyl ester derivatives.
项目中对于这样的警示结构我们可以通过定义SMARTS语法的方式滤除不良化合物。
Insilico_alerts=[
'[Cl,Br,F,I]c1ccncc1', # para-substituted pyridines
'[Cl,Br,F,I]c1ccccn1', # ortho halogen-substituted pyridines
'[Cl,Br,F,I]C1=CC=CO1',
'[Cl,Br,F,I]C1=CC=CS1',
'[#16][#16]', # disulfide
'O=C1Nc2ccccc2C1=O', #isatin
'O=C1CC(=O)NC(=[O,S])N1', # barbiturates
'[A][$([#6]=[N+]=[N-]),$([#6]-[N+]#[N])]', #diazo-compounds
'[OX2,OX1-][OX2,OX1-]', #peroxides
'[OX2][$([#16X4](=[OX1])=[OX1]),$([#16X4+2]([OX1-])[OX1-])]', #sulfonyl ester
]
#另外文章中还限制了一些基团出现的频率上限
# groups should not exceed the count
count_alert={'Cl':3,'F':6, 'Br':2,'[N+](=O)[O-]':2}
定义好警示结构之后,我们可以采用rdkit中子结构匹配的方式加以滤去
alert_mols=[Chem.MolFromSmarts(smi) for smi in Insilico_alerts]
def checkAlert(smi,alert_mol_list=alert_mols, alert_dict=count_alert):
mol=Chem.MolFromSmiles(smi)
for query in alert_mol_list:
if mol.HasSubstructMatch(query):
return False
for alert in alert_dict.keys():
query=Chem.MolFromSmarts(alert)
if len(mol.GetSubstructMatches(query))>alert_dict[alert]:
#print (alert, 'num exceeded')
return False
if NumAromaticRings(mol)>=6:
#print ('too many aromatic rings')
return False
return True
对于我们的化合物待筛选库,以dataframe的方式存于SMILES格式,即可应用上面的函数加以筛选。
df['passStructureAlert']=df['SMILES'].apply(checkAlert)
df.head(2)
output:
SMILES passStructureAlert
COc1cc(OC)cc(N(CCNC(C)C)c2ccc3ncc(-c4cnn(C)c4)... True
C=CC(=O)N1CCC(n2nc(C#Cc3cc(OC)cc(OC)c3)c3c(N)n... False
和PAINS类似,警示结构也不是绝对的指标,采用之前最好有药物化学家的审核。
另外,GlaxoSmithKline (GSK) 公司从多年积累的高通量筛选结果中,以统计的方式从其公司内部化合物库200万化合物在数百项测试中的实验结果中总结了自己的一套警示结构库,可以作为扩展阅读参考[2]。
GSK的警示结构在文章中,已经存储为了SMARTS结构,省去了对SMARTS不熟悉的读者自行转换的困难。
参考文献
- Zhavoronkov, A., Ivanenkov, Y.A., Aliper, A. et al. Deep learning enables rapid identification of potent DDR1 kinase inhibitors. Nat Biotechnol 37, 1038–1040 (2019).
- Chakravorty SJ, Chan J, Greenwood MN, Popa-Burke I, Remlinger KS, Pickett SD, Green DVS, Fillmore MC, Dean TW, Luengo JI, Macarrón R. Nuisance Compounds, PAINS Filters, and Dark Chemical Matter in the GSK HTS Collection. SLAS Discov. 2018 Jul;23(6):532-545.