官方地址
http://www.rdkit.org/
本文不再给出安装方法,读者可自行网上搜索。
教程
说明:如果某一行有注释,则该注释表示该行的输出
读取文件
RDKit能读取各种各样的化学结构文件,类和方法主要在rdkit.Chem.rdmolfiles
这个模块下,因此需要先导入包
from rdkit import Chem
以sdf文件为例,官方给出了4种等价的读取方法,这些方法返回一个或多个rdkit.Chem.rdchem.Mol
对象(http://www.rdkit.org/docs/source/rdkit.Chem.rdmolfiles.html#rdkit.Chem.rdmolfiles.SDMolSupplier)
suppl = Chem.SDMolSupplier('in.sdf')
mol = suppl[0]
print(mol.GetNumAtoms()) # 9
奇怪,原子数怎么只有9个?输出所有原子之后发现氢原子被省略了,因此如果你不希望省略氢原子,按照以下方式读取
suppl = Chem.SDMolSupplier('in.sdf', removeHs=False)
mol = suppl[0]
print(mol.GetNumAtoms()) # 23
对分子进行操作
访问单个原子
如果要访问单个原子,可以通过GetAtomWithIndex()
获得原子对象rdkit.Chem.rdchem.Atom
,以第一个原子碳原子为例,获取它的标签、价电子、原子元素周期编号
atom = mol.GetAtomWithIdx(0)
print(atom.GetSymbol()) # C
print(atom.GetExplicitValence()) # 4
print(atom.GetAtomicNum()) # 6
如果要访问所有原子,可以通过GetAtoms()
方法遍历
for atom in mol.GetAtoms():
print(atom.GetSymbol())
获取所有原子坐标,该方法返回一个numpy
数组
mol.GetConformers()[0].GetPositions() # return a numpy array
其他可能用到的属性
atom.GetHybridization() # 返回杂化类型
atom.GetIsAromatic () # 该原子是否在芳香烃内
atom.GetTotalNumHs() # 与该原子连接的氢原子个数
atom.GetNeighbors() # 返回该原子的所有邻居原子,以元祖的形式返回
访问化学键
通过GetBondBetweenAtoms()
可以返回一个化学键的对象rdkit.Chem.rdchem.Bond
,这个方法的输入参数是两个原子在数组中的编号,如果化学键不存在,则返回None
bond1 = mol.GetBondBetweenAtoms(0,1)
bond2 = mol.GetBondBetweenAtoms(0,2)
print(bond1) # <rdkit.Chem.rdchem.Bond object at 0x000000000084D850>
print(bond2) # None
获得化学键的类型
print(bond1.GetBondType()) # rdkit.Chem.rdchem.BondType.SINGLE
化学键的键长我暂时没有找到相应的方法,但是可以根据原子的坐标手动计算。
化学特征提取
重新打开一个Python文件进行操作。
对于有些原子的特征,其在原子层面上无法判断化学特征,因此需要在分子层面上进行提取。例如化学中的donor和acceptor概念(具体是什么意思我也不知道,没有化学背景,但知道有这些类别就行,并且这些类别是原子的特征)
首先导入包,然后设定特征的参考文件,并实例化一个特征工厂。
from rdkit import Chem
from rdkit.Chem import ChemicalFeatures
from rdkit import RDConfig
import os
fdefName = os.path.join(RDConfig.RDDataDir,'BaseFeatures.fdef')
factory = ChemicalFeatures.BuildFeatureFactory(fdefName)
默认情况下对任何化合物都不需要改动上面的代码。
利用MolFromSmiles
方法读取分子。Smiles(Simplified molecular-input line-entry system)
是一种描述分子的字符串描述符,和高中学过的分子结构式差不多。更多关于Smiles
的信息可以参见百度百科或维基百科
m = Chem.MolFromSmiles('OCc1ccccc1CN')
feats = factory.GetFeaturesForMol(m)
len(feats) # 8
这里分子为OCc1ccccc1CN
,我们最终生成了8个特征,每个特征的提取方法如下所示
feats[0].GetFamily() # 'Donor'
feats[0].GetType() # 'SingleAtomDonor'
feats[0].GetAtomIds() # (0,)
feats[4].GetFamily() # 'Aromatic'
feats[4].GetAtomIds() # (2, 3, 4, 5, 6, 7)
更多关于特征方法请参阅这里