python如何计算分子描述符_RDKit|分子描述符计算与可视化

文章目录

一、描述符计算模块1.rdkit.Chem.Lipinski模块

2.rdkit.Chem.Descriptors模块

3.rdkit.ML.Descriptors.MoleculeDescriptors模块

二、原子描述符可视化1.原子partial charge可视化

2.原子logP可视化

一、描述符计算模块

1.rdkit.Chem.Lipinski模块

rdkit中提供了许多描述符的计算方法,可用于分子筛选、成药性评估等。以lipinski类药的相关规则为例,可以通过rdkit.Chem.Lipinski模块进行计算。常用的一些性质举例:氢键受体数NumHAcceptors

氢键供体数NumHDonors

可旋转键数NumRotatableBonds

脂肪环数量NumAliphaticRings

芳香环数量NumAromaticRings

SP3杂化碳原子比例FractionCSP3

……

>>> from rdkit import Chem

>>> from rdkit.Chem import Lipinski

>>> mol = Chem.MolFromSmiles('c1ccccc1C(=O)O')

>>> Lipinski.NumHAcceptors(mol)

1将描述符名称(key)和值(val)添加到分子属性中:m.SetProp(key, val)

获取分子属性:m.GetProp(key)

>>> Ha = Lipinski.NumHAcceptors(mol)

>>> mol.SetProp('Ha', '%s'%Ha)

>>> mol.GetProp('Ha')

'1'

2.rdkit.Chem.Descriptors模块

大部分的描述符都可以通过rdkit.Chem.Descriptors模块进行计算。该模块也包含了Lipinski的描述符。常用的一些描述符举例:分子量MolWt

脂水分配系数MolLogP

拓扑极表面积TPSA

以计算TPSA为例:Descriptors.TPSA()

>>> from rdkit.Chem import Descriptors

>>> print(Descriptors.TPSA(mol), Descriptors.MolLogP(mol), Descriptors.MolWt(mol))

37.3 1.3848 122.12299999999998

3.rdkit.ML.Descriptors.MoleculeDescriptors模块

该模块可以批量计算描述符。先指定一个列表des_list,包含所要计算的描述符名称

使用MolecularDescriptorCalculator创建一个计算描述符的对象,传入要计算的des_list

调用对象的CalcDescriptors方法,传入要计算的mol对象,得到所需的描述符

>>> from rdkit.ML.Descriptors import MoleculeDescriptors

>>> des_list = ['MolWt', 'NumHAcceptors', 'NumHDonors', 'MolLogP', 'NumRotatableBonds']

>>> calculator = MoleculeDescriptors.MolecularDescriptorCalculator(des_list)

>>> calculator.CalcDescriptors(mol)

(122.12299999999998, 1, 1, 1.3848, 1)查看各种描述符的含义:GetDescriptorSummaries()

>>> calculator.GetDescriptorSummaries()

['The average molecular weight of the molecule',

'Number of Hydrogen Bond Acceptors',

'Number of Hydrogen Bond Donors',

'Wildman-Crippen LogP value',

'Number of Rotatable Bonds']获取所有描述符:Descriptors._descList

>>> des_list = [x[0] for x in Descriptors._descList]

>>> len(des_list)

200将calculator保存起来:SaveState(filename)

再次调用该calculator:pickle.load()

>>> import pickle

>>> calculator.SaveState('data/descriptor_calculator')

>>> with open('data/descriptor_calculator', 'rb') as f:

>>> calc = pickle.load(f)

>>> calc.CalcDescriptors(mol)

(122.12299999999998, 1, 1, 1.3848, 1)

二、原子描述符可视化

可以用相似性地图来查看每个原子对描述符的贡献,更多相似性地图的应用可以查看这篇文章的第二部分。

1.原子partial charge可视化

计算partial charge要复杂一点。计算出的partial charge存储在每个原子的属性中,可以通过GetDoubleProp(浮点数)或GetProp(字符串)来获取。

partial charge可以表示电子的分布。分子中的化学键是由分布在相连原子周围的电子对组成的。但由于原子的电负性不同,成键电子并不是均匀分布。电负性大的原子吸电子能力强,成键的电子对会更偏向该原子,导致该原子带有负电的性质。相对应的,电负性小的原子则带有正电性质。Partial charge衡量了电子偏向的程度。先计算partial charge:AllChem.ComputeGasteigerCharges()

获取某一个原子:GetAtomWithIdx()

获取原子的partial charge:GetDoubleProp('_GasteigerCharge')

>>> from rdkit.Chem import AllChem

>>> mol = Chem.MolFromSmiles('COc1cccc2cc(C(=O)NCCCCN3CCN(c4cccc5nccnc54)CC3)oc21')

>>> AllChem.ComputeGasteigerCharges(mol)

>>> atom = mol.GetAtomWithIdx(0)

>>> atom.GetDoubleProp('_GasteigerCharge')

0.07771844728655561获取每个原子的partial charge,放到contribs中

>>> contribs = [round(mol.GetAtomWithIdx(i).GetDoubleProp('_GasteigerCharge'), 2) for i in range(mol.GetNumAtoms())]

>>> print(contribs)

[0.08, -0.49, 0.16, -0.02, -0.06, ...]根据给定的权重,生成分子权重图:GetSimilarityMapFromWeights(mol, weights, colorMap, contourLines, ...) mol:要绘制的mol对象 weights:权重 colorMap:matplotlib中的色系 contourLines:等高线数量

>>> from rdkit.Chem.Draw import SimilarityMaps

>>> fig = SimilarityMaps.GetSimilarityMapFromWeights(mol, contribs, contourLines=10)

2.原子logP可视化

LogP表示脂水分配系数,该值认为与细胞通透性有一定相关性。rdkit中提供的Descriptors.MolLogP()方法可以粗略计算logP值,该方法首先做了一个原子分类系统,根据原子及其相连原子的不同而进行分类,再对化学性质相似、logP贡献相似的类别做合并,最终得到了68种精确的原子类别和4种通配类别,并用SMARTS表示。计算时,对一个分子中所有原子进行分类,再乘以每一类的权重并加和,最终得到LogP值。该方法在9920个分子的训练集上的r2为0.918,标准差为0.667。此外摩尔折射率(molar refractivity,MR)也可以通过这种方法计算得到。计算每个原子的logP和MR值:rdMolDescriptors._CalcCrippenContribs

返回结果是每个原子logP和MR元组的列表

>>> from rdkit.Chem import rdMolDescriptors

>>> contribs = rdMolDescriptors._CalcCrippenContribs(mol)

>>> contribs[:3]

[(-0.2035, 2.753), (-0.4195, 1.182), (0.5437, 3.853)]生成分子权重图:GetSimilarityMapFromWeights()

>>> fig = SimilarityMaps.GetSimilarityMapFromWeights(mol, [x for x,y in contribs])

本文参考自rdkit官方文档。 代码及源文件在这里。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值