先来了解两种rdkit生成3D构象的方法:
传统的距离几何(Distance Geometry)法生成构象步骤:
这种方法虽然计算速度快,也能得到分子的三维坐标,但纯粹基于距离计算会导致部分结构的扭曲,也就是结果比较丑。想得到更好的结构,需要进行更细致的力场优化,比如再使用rdkit的通用力场(Universal Force Field,UFF)进行处理。
Riniker和Landrum开发了一种(Experimental-Torsion Basic Knowledge Distance Geometry,ETKDG)的方法。他们从晶体结构数据库的小分子结构中总结了一些规则(扭转角的倾向性,torsion angle preference,符合某种SMARTS的结构更倾向于生成某种固定的构象),并用这套规则来修正距离几何算法产生的构象。如果使用了ETKDG,就可以不再使用力场进行优化了。
在rdkit中,目前已经将ETKDG作为默认的构象生成方法。使用代码实现这种方法比上面的废话都要简单,几行代码就能搞定了。
>>> from rdkit import Chem
>>> from rdkit.Chem import AllChem
>>> from rdkit.Chem import Draw
>>> m = Chem.MolFromSmiles('c1ccccc1')
>>> m3d=Chem.AddHs(m)
>>> AllChem.EmbedMolecule(m3d, randomSeed=1)
>>> Draw.MolToImage(m3d, size=(250,250))
>>> m = Chem.MolFromSmiles('CC1=CC=C(C=C1)NC2=C3C(=C(C=C2)NC4=CC=C(C=C4)C)C(=O)C5=CC=CC=C5C3=O')
>>> m3d = Chem.AddHs(m)
>>> print(m.GetNumAtoms(), m3d.GetNumAtoms())
32 54
使用距离几何算法初始化3D坐标。
>>> AllChem.EmbedMolecule(m3d, randomSeed=10, useExpTorsionAnglePrefs=False, useBasicKnowledge=False)
>>> Draw.MolToImage(m3d, size=(250,250))
>>> AllChem.EmbedMolecule(m3d, randomSeed=10)
>>> Draw.MolToImage(m3d, size=(250,250))
无论使用哪种方法,都可以对一个分子生成许多构象,实现也很简单,无非使用不同的随机种子,多跑几次距离几何的计算过程就行了。
>>> cids = AllChem.EmbedMultipleConfs(m3d, numConfs=10)
>>> print(len(cids))
10
>>> conf1 = m3d.GetConformer(id=1)
>>> rmslist = []
>>> AllChem.AlignMolConformers(m3d, RMSlist=rmslist)
>>> print(len(rmslist))
9
>>> AllChem.GetConformerRMS(m2, 1, 9, prealigned=True)
1.5515373147254072
对距离几何产生的构象,进行ETKDG优化后,还可以继续使用MMFF94等力场进行优化。不过需要注意的是,MMFF力场中的原子类型编码采用了自身的芳香性模型,因此在使用MMFF相关方法后,分子的芳香属性(aromaticity flags)会改变。
>>> AllChem.EmbedMolecule(m3d, randomSeed=10)
>>> AllChem.MMFFOptimizeMolecule(m3d)
>>> Draw.MolToImage(m3d, size=(250,250))
其实当使用ETKDG算法生成3D构象时,通常无需再使用MMFF94力场优化。如果执意要这么做,有一个方便的函数可以调用
>>> res = AllChem.MMFFOptimizeMoleculeConfs(m3d)
>>> res
[(0, 102.4284038486388),
(1, 102.42249902079311),...]
可以通过numThreads参数进行设置。
>>> cids = AllChem.EmbedMultipleConfs(m3d, numThreads=0)
>>> res = AllChem.MMFFOptimizeMoleculeConfs(m3d, numThreads=0)
最后需要注意的是,构象生成是一项复杂且漫长的工作。rdkit生成的3D结构并不能取代真实的构象,它仅仅为需要3D结构的场景提供了一种快速实现的方法。不过,rdkit提供的ETKDG方法还是可以满足大多数3D需求场景的。
本文参考自rdkit官方文档。
代码及源文件在这里。