RDKit是一款非常强大的分子信息学工具包,其中包含了分子3D构象生成与优化的功能。通过RDKit,您可以将一个分子的2D结构转化为3D结构,并进行能量最小化优化,得到最稳定的构象。
下面是基本代码逻辑
from rdkit import Chem
from rdkit.Chem import Draw
from rdkit.Chem import AllChem
# 读入分子SMILES字符串
mol = Chem.MolFromSmiles('CC(=O)OC1=CC=CC=C1C(=O)O')
# 生成初始3D构象
AllChem.EmbedMolecule(mol)
# 进行能量最小化优化
AllChem.MMFFOptimizeMolecule(mol)
# 输出优化后的3D结构
print(Chem.MolToMolBlock(mol))
传统的距离几何(Distance Geometry)法生成构象步骤:
这种方法虽然计算速度快,也能得到分子的三维坐标,但纯粹基于距离计算会导致部分结构的扭曲,也就是结果比较丑。想得到更好的结构,需要进行更细致的力场优化,比如再使用rdkit的通用力场(Universal Force Field,UFF)进行处理。
mol = 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(mol)
print(mol.GetNumAtoms(), m3d.GetNumAtoms())
使用距离几何算法初始化3D坐标。
生成3D构象:AllChem.EmbedMolecule(mol, randomSeed, clearConfs, useExpTorsionAnglePrefs, useBasicKnowledge, …)
AllChem.EmbedMolecule(m3d, randomSeed=10, useExpTorsionAnglePrefs=False, useBasicKnowledge=False)
Draw.MolToImage(m3d, size=(250,250))
生成3D构象:AllChem.EmbedMolecule()
先用距离几何初始化3D坐标,再使用ETKDG算法优化
参数同上,默认useExpTorsionAnglePrefs
和useBasicKnowledge
为True
AllChem.EmbedMolecule(m3d, randomSeed=10)
Draw.MolToImage(m3d, size=(250,250))
生成多个构象:AllChem.EmbedMultipleConfs(mol, numConfs, maxAttempts, randomSeed, clearConfs, pruneRmsThresh, useExpTorsionAnglePrefs, useBasicKnowledge, …)
其中numConfs控制了生成构象的个数。
mol
:mol对象numConfs
:生成的构象数量maxAttempts
:尝试生成构象的最多次数randomSeed
:随机种子clearConfs
:清除已有构象pruneRmsThresh
:根据RMS进行合并ETKDG
相关参数同上cids = AllChem.EmbedMultipleConfs(m3d, numConfs=10)
print(len(cids))
获取某个构象GetConformer(id)
通过传入id获取指定构象
# 获取第n个构象
conformer = m3d.GetConformer(id=6)
# 将Conformer对象添加到Mol对象中
m3d.AddConformer(conformer)
from rdkit import Chem
# 创建一个rdkit.Chem.rdchem.Mol对象
mol = Chem.MolFromSmiles('CCOCC')
# 创建一个新的rdkit.Chem.rdchem.Mol对象,通过复制已有的Mol对象
new_mol = Chem.Mol(mol)
# 创建一个新的rdkit.Chem.rdchem.Conformer对象
conformer = Chem.Conformer()
AllChem.EmbedMolecule(mol, randomSeed=1)
# 设置Conformer对象的原子坐标
for atom_idx in range(mol.GetNumAtoms()):
position = mol.GetConformer().GetAtomPosition(atom_idx)
conformer.SetAtomPosition(atom_idx, position)
# 将Conformer对象添加到新的Mol对象中
new_mol.AddConformer(conformer)
计算不同构象间的差异:AlignMolConformers(mol, RMSlist, …)
对同一分子不同的构象先进行重叠排列,再计算RMS(root mean square)值
RMSlist:用于接收RMS的列表,它由第一个构象与剩余9个构象依次比对产生。
rmslist = []
AllChem.AlignMolConformers(m3d, RMSlist=rmslist)
print(len(rmslist))
rmslist
也可以计算任意两个指定构象的RMS值GetConformerRMS(mol, confId1, confId2, atomIds, prealigned)
confId1
:第一个构象confId2
:第二个构象atomIds
:需要对比的原子,默认全部prealigned
:构象是否已经对齐,默认False(没有时,函数会自动将它们对齐)AllChem.GetConformerRMS(m3d, 1, 9, prealigned=True)
也可以使用AllChem.AlignMol()
方法。这个方法需要两个参数,即待对齐的两个分子。
注意,
AlignMol()
方法会修改第二个分子的坐标,将其与第一个分子对齐。如果您想保留原来的分子,可以先复制一份再进行对齐。
from rdkit import Chem
from rdkit.Chem import AllChem
# 读取分子
mol1 = Chem.MolFromSmiles('CCO')
mol2 = Chem.MolFromSmiles('CC(=O)O')
AllChem.EmbedMolecule(mol1, randomSeed=1)
AllChem.EmbedMolecule(mol2, randomSeed=1)
# 对齐分子
AllChem.AlignMol(mol1, mol2)
# 打印对齐后的分子坐标
print(Chem.MolToMolBlock(mol2))
对距离几何产生的构象,进行ETKDG优化后,还可以继续使用MMFF94等力场进行优化。不过需要注意的是,MMFF力场中的原子类型编码采用了自身的芳香性模型,因此在使用MMFF相关方法后,分子的芳香属性(aromaticity flags)会改变。
使用MMFF94进行优化构象:MMFFOptimizeMolecule(mol, mmffVariant, maxIters, …)
mmffVariant
:可选"MMFF94"或"MMFF94s",默认MMFF94maxIters
:最多迭代次数,默认200AllChem.EmbedMolecule(m3d, randomSeed=10)
AllChem.MMFFOptimizeMolecule(m3d)
Draw.MolToImage(m3d, size=(250,250))
其实当使用ETKDG算法生成3D构象时,通常无需再使用MMFF94力场优化。如果执意要这么做,有一个方便的函数可以调用
使用MMFF94优化多个构象:MMFFOptimizeMoleculeConfs()
返回的结果是元组组成的列表,每个元组表示每个构象的收敛值和能量(not_converged, energy)。如果not_converged
是0,则收敛,接近最稳态,否则没有到达最稳态。
res = AllChem.MMFFOptimizeMoleculeConfs(m3d)
res
可以通过numThreads参数进行设置。
EmbedMultipleConfs(mol, numThreads)
MMFFOptimizeMoleculeConfs(mol, numThreads)
numThreads
:默认为1,表示单进程执行。设置为0表示将会使用本机最大线程数执行。cids = AllChem.EmbedMultipleConfs(m3d, numThreads=0)
res = AllChem.MMFFOptimizeMoleculeConfs(m3d, numThreads=0)