药物分子关于RO5等常用属性计算(LogP, TPSA, MW, QED....)+ 怎么计算Penalized LogP(plogp)? 您所在的位置:网站首页 生物化学dl是什么意思呀 药物分子关于RO5等常用属性计算(LogP, TPSA, MW, QED....)+ 怎么计算Penalized LogP(plogp)?

药物分子关于RO5等常用属性计算(LogP, TPSA, MW, QED....)+ 怎么计算Penalized LogP(plogp)?

2024-07-10 23:17| 来源: 网络整理| 查看: 265

药物早期设计中,常常需要根据类药五原则(rule of five,RO5, 亦称Lipinski规则)进行初步判断筛选,RO5是辉瑞公司资深药物化学家Christopher A. Lipinski在1997年提出,虽然随时代发展虽然其适用范围逐渐变窄,但仍然非常有参考意义。其主要内容如下:

1.分子量(Mw)小于500;

2.氢键供体(HBD)数目小于5;

3.氢键受体(HBA)数目小于10;

4.脂水分配系数(logP)小于5;【越小越好↓】

5.可旋转键(rotatable bonds)的数量不超过10个。

除了以上RO5性质,另外还有几个对于药物开发关键的性质:

6. 类药性(QED):0-1区间归一化后的数值,衡量化合物和药物相似性,虽不准确,但简单直接【越大越好↑】

7. 手性中心个数(chiral_centers):过多的手性中心,会导致合成与纯化工艺难度的大幅提高。

8. 拓扑极性表面积 TPSA

9. Bertz CT的数据分布的直方图

10.Penalized LogP 【越大越好↑】

11、SA(合成难度)

from rdkit.Chem import RDConfig import os import sys sys.path.append(os.path.join(RDConfig.RDContribDir, 'SA_Score')) # now you can import sascore! import sascorer SMILES = 'CCOC(=O)[C@@H]1CCCN(C(=O)c2nc(-c3ccc(C)cc3)n3c2CCCCC3)C1' m = Chem.MolFromSmiles(SMILES) sas = sascorer.calculateScore(m)

以下代码演示如何一次性计算以上所有性质,并批量处理数据。

1、计算单个分子性质代码: import numpy as np from rdkit.Chem import QED, Descriptors, rdMolDescriptors from rdkit import Chem from rdkit.Chem import RDConfig import os import sys sys.path.append(os.path.join(RDConfig.RDContribDir, 'SA_Score')) # now you can import sascore! import sascorer def cal_mol_props(smi, verbose=False): try: m = Chem.MolFromSmiles(smi) if not m: return None, None, None, None, None, None, None, None, None, None logp = np.round(Descriptors.MolLogP(m), 2) tpsa = np.round(Descriptors.TPSA(m), 1) mw = np.round(Descriptors.MolWt(m), 1) qed = np.round(QED.qed(m), 2) hba = rdMolDescriptors.CalcNumLipinskiHBA(m) hbd = rdMolDescriptors.CalcNumLipinskiHBD(m) rob = rdMolDescriptors.CalcNumRotatableBonds(m) chiral_center = len(Chem.FindMolChiralCenters(m, includeUnassigned=True)) # 计算Bertz CT的数据分布的直方图 bertz_ct = Descriptors.BertzCT(m) sa = sascorer.calculateScore(m) if verbose: print(smi) print('MW ', mw) print('HBD ', hbd) print('HBA ', hba) print('Logp ', logp) print('RotB ', rob) print('QED ', qed) print('chiral_center ', chiral_center) print('TPSA ', tpsa) print('bertz_ct', bertz_ct) print('SA', sa) return logp, tpsa, mw, qed, hba, hbd, rob, chiral_center, bertz_ct, sa except Exception as e: print(e) return None, None, None, None, None, None, None, None, None, None SMILES = 'CCCc1ccc(Cc2sc3c(c2C(=O)NC(C)c2ccc(C(=O)O)cc2)CCOC3)cc1' logp, tpsa, mw, qed, hba, hbd, rob, chiral_center, bertz_ct, sa = cal_mol_props(SMILES, verbose=True) 2、计算csv中分子性质,然后存入新列的代码 + 绘制直方图:

https://blog.csdn.net/weixin_43135178/article/details/129403644

怎么计算Penalized LogP(plogp)? 论文一这么写:

错误计算方式:

来源于论文Retmol:RETRIEVAL-BASED CONTROLLABLE MOLECULE GENERATION

它的plogp的计算方式是:

print("pLogP is : ", Descriptors.MolLogP(m) - sascorer.calculateScore(m))

但是它的logp,我使用上述的计算方式计算出的结果与他们提供的表格中的数据不符 ,但是它全程优化的是plogp,并没有优化logp,所以这里可以不必关注这个logp值的正确与否,直接使用上面的计算logp的方式进行计算得了

smiles,logp,sa,qed,logp-sa CC(C)(C)c1ccc2occ(CC(=O)Nc3ccccc3F)c2c1,3.139905716,2.084094572,0.731900844,2.966505428 C[C@@H]1CC(Nc2cncc(-c3nncn3C)c2)C[C@@H](C)C1,0.172386357,3.432003819,0.941111611,-0.318303819 N#Cc1ccc(-c2ccc(O[C@@H](C(=O)N3CCCC3)c3ccccc3)cc2)cc1,2.618422872,2.470632608,0.626104542,2.497147392 CCOC(=O)[C@@H]1CCCN(C(=O)c2nc(-c3ccc(C)cc3)n3c2CCCCC3)C1,-1.974846617,2.822753311,0.7162245,1.177466689 N#CC1=C(SCC(=O)Nc2cccc(Cl)c2)N=C([O-])[C@H](C#N)C12CCCCC2,-0.20555512,4.035182138,0.809571812,-0.425622138

正确计算方式:

论文二和论文三的计算方式是正确的,到时候直接引用这个就可以了

论文二这么写:

来源于论文:ChemSpacE: Interpretable and Interactive Chemical Space Exploration

查看数据:https://github.com/yuanqidu/ChemSpacE/blob/main/data/zinc250k_properties.csv

smile,qed,plogp,MolLogP,MolWt,sa,drd2,jnk3,gsk3b CC(C)(C)c1ccc2occ(CC(=O)Nc3ccccc3F)c2c1,0.7319008436872337,3.1399057164163766,5.050600000000004,325.38300000000004,2.084094572072681,0.0004917081965318,0.01,0.03 C[C@@H]1CC(Nc2cncc(-c3nncn3C)c2)C[C@@H](C)C1,0.9411116113894996,0.172386356591488,3.113700000000001,285.39500000000004,3.4320038192747795,0.0160646704832029,0.01,0.16 N#Cc1ccc(-c2ccc(O[C@@H](C(=O)N3CCCC3)c3ccccc3)cc2)cc1,0.626104542084784,2.6184228720536984,4.967780000000004,382.463,2.4706326078252,0.0128573558238024,0.03,0.03

 论文三这么写:

该论文是模仿下面的论文进行计算的:Junction Tree Variational Autoencoder for Molecular Graph Generation(https://github.com/wengong-jin/icml18-jtnn/blob/master/data/zinc/opt.valid.logP-SA)

from rdkit.Chem import Descriptors from rdkit.Chem.QED import qed as computer_qed_score from rdkit import Chem from rdkit.Chem import RDConfig import os import sys sys.path.append(os.path.join(RDConfig.RDContribDir, 'SA_Score')) # now you can import sascore! import sascorer import networkx as nx # normalization constants, statistics from 250k_rndm_zinc_drugs_clean.smi logP_mean = 2.4570953396190123 logP_std = 1.434324401111988 SA_mean = -3.0525811293166134 SA_std = 0.8335207024513095 cycle_mean = -0.0485696876403053 cycle_std = 0.2860212110245455 # 定义用于计算属性的函数 def calculate_properties(smiles): mol = Chem.MolFromSmiles(smiles) logp = Descriptors.MolLogP(mol) sa = sascorer.calculateScore(mol) qed = computer_qed_score(mol) # plogp(m) = logP(m) − SA(m) − cycle(m) where cycle(m) counts the number of rings that have more than six atoms. cycle_list = nx.cycle_basis(nx.Graph(Chem.rdmolops.GetAdjacencyMatrix(mol))) if len(cycle_list) == 0: cycle_length = 0 else: cycle_length = max([len(j) for j in cycle_list]) if cycle_length


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有