目录
从 Smiles/SMARTS/MolBlock/SDF 读入
MACCS 166 MACCSkeys.GenMACCSKeys
Morgan ECPP AllChem.GetMorganFingerprint
1D/2D 描述符:分子量、LogP、TPSA、可旋转键数……
自定义描述符:可注册到 rdkit.Chem.Descriptors 命名空间
定义反应: AllChem.ReactionFromSmarts
高亮原子/键: Draw.MolToImage(mol, highlightAtoms=[...])
Jupyter 内嵌: Draw.MolsToGridImage(ms, molsPerRow=4)
手性与立体信息 Chem.AssignStereochemistry
同分异构枚举 AllChem.EnumerateStereoisomers
3D 药效团 AllChem.Pharm2D , AllChem.Pharm3D
分子对齐 AllChem.GetBestRMS , AllChem.AlignMol
自定义指纹 rdkit.DataStructs.cDataStructs.ExplicitBitVect
并行计算 joblib , concurrent.futures
RDKit 是一个开源的化学信息学工具包,广泛用于分子处理、分子描述符计算、分子相似性分析、化学反应处理等任务。下面是对 RDKit 主要方法的介绍:
分子的读-写-创建
-
从 Smiles/SMARTS/MolBlock/SDF 读入
-
写出为 Smiles/SDF/PDB/MolBlock
-
手工拼装分子(空分子、逐个加原子/键)
## 分子的读-写-创建
from rdkit import Chem
# 1) 读
mol = Chem.MolFromSmiles('c1ccccc1O')
mol2 = Chem.MolFromSmarts('[#6][#6][#8]')
mol3 = Chem.MolFromMolBlock('''
RDKit 2D
2 1 0 0 0 0 0 0 0 0999 V2000
0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
1.2990 0.7500 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
1 2 1 0
M END
''')
# 2) 写
print(Chem.MolToSmiles(mol)) # Oc1ccccc1
print(Chem.MolToMolBlock(mol)[:100]) # MolBlock 头100字符
# 3) 手动创建
mb = Chem.RWMol()
a1 = mb.AddAtom(Chem.Atom(6))
a2 = mb.AddAtom(Chem.Atom(6))
mb.AddBond(a1, a2, Chem.BondType.SINGLE)
print(Chem.MolToSmiles(mb)) # CC
分子基本查询与遍历
-
原子列表 GetAtoms()
-
键列表 GetBonds()
-
指定索引原子 GetAtomWithIdx(i)
-
邻居原子 GetNeighbors()
-
环信息 GetRingInfo
## 分子基本查询与遍历
from rdkit import Chem
mol = Chem.MolFromSmiles('c1ccccc1O') # 苯酚
# 获取原子列表
for a in mol.GetAtoms():
print(a.GetIdx(), a.GetSymbol(), a.GetAtomicNum())
# 0 C 6
# 1 C 6
# 2 C 6
# 3 C 6
# 4 C 6
# 5 C 6
# 6 O 8
# 获取键列表
for b in mol.GetBonds():
print(b.GetIdx(), b.GetBeginAtomIdx(), b.GetEndAtomIdx(), b.GetBondType())
# 0 0 1 AROMATIC
# 1 1 2 AROMATIC
# 2 2 3 AROMATIC
# 3 3 4 AROMATIC
# 4 4 5 AROMATIC
# 5 5 6 SINGLE
# 6 5 0 AROMATIC
# 获取指定索引原子
atom = mol.GetAtomWithIdx(6) # 第 7 个原子(索引从 0)
print(atom.GetSymbol(), atom.GetDegree()) # O 1
# 获取邻居原子
for a in mol.GetAtoms():
print('原子', a.GetIdx(), '邻居索引:', [n.GetIdx() for n in a.GetNeighbors()])
# 原子 0 邻居索引: [1, 5]
# 原子 1 邻居索引: [0, 2]
# 原子 2 邻居索引: [1, 3]
# 原子 3 邻居索引: [2, 4]
# 原子 4 邻居索引: [3, 5]
# 原子 5 邻居索引: [4, 6, 0]
# 原子 6 邻居索引: [5]
# 环信息
ri = mol.GetRingInfo()
for i in range(mol.GetNumAtoms()):
print('原子', i, '所在的环数量:', ri.NumAtomRings(i))
# 原子 0 所在的环数量: 1
# 原子 1 所在的环数量: 1
# 原子 2 所在的环数量: 1
# 原子 3 所在的环数量: 1
# 原子 4 所在的环数量: 1
# 原子 5 所在的环数量: 1
# 原子 6 所在的环数量: 0
分子编辑(增删改原子/键)
-
增加 AddAtom() 、 AddBond()
-
删除 RemoveAtom()
-
修改 ReplaceAtom()
## 分子编辑(增删改原子/键)
from rdkit import Chem
mol = Chem.MolFromSmiles('CCO')
rw = Chem.RWMol(mol)
# 1. 删除氧原子及其键
rw.RemoveAtom(2)
print(Chem.MolToSmiles(rw)) # CC
# 2. 把第一个碳换成氮
rw.ReplaceAtom(0, Chem.Atom(7))
print(Chem.MolToSmiles(rw)) # CN
# 3. 新增一个 F 并与新 N 连接
f = rw.AddAtom(Chem.Atom(9))
print(Chem.MolToSmiles(rw)) # CN.F
rw.AddBond(0, f, Chem.BondType.SINGLE)
print(Chem.MolToSmiles(rw)) # CNF
3D 构象生成与优化
-
单构象
-
多构象(并行)
-
力场优化(UFF / MMFF94)
-
RMSD、对齐
## 3D构象生成与优化
from rdkit import Chem
from rdkit.Chem import AllChem
mol = Chem.MolFromSmiles('CCCC1=CC=CC=C1')
mol = Chem.AddHs(mol)
# 1) 生成 50 个构象,4 线程
cids = AllChem.EmbedMultipleConfs(mol, numConfs=50, numThreads=4)
print(cids)
# 2) MMFF94 优化(返回 (energy, converged) 列表)
res = AllChem.MMFFOptimizeMoleculeConfs(mol, numThreads=0)
print(res)
# [(0, 17.757500652069837), (0, 17.83009035186883), (0, 17.830090345507244), (0, 17.830090357295116), (0, 17.830090345425745), (0, 17.83009034603927), (0, 17.830090376883334), (0, 17.75750064711013), (0, 17.75750065102975), (0, 17.830090346427795), (0, 17.757500674555022), (0, 17.830090350979034), (0, 17.83009035713104), (0, 17.757500652678377), (0, 17.757500649889586), (0, 17.75750065634367), (0, 17.830090347163317), (0, 17.75750065092653), (0, 17.757500650688), (0, 17.757500649550348), (0, 17.757500649066575), (0, 17.830090348040603), (0, 17.757500697813885), (0, 17.75750065079582), (0, 17.830090345335307), (0, 17.757500654124463), (0, 17.757500649091526), (0, 17.757500660858618), (0, 17.75750066673939), (0, 17.830090345026285), (0, 17.83009035218999), (0, 17.830090351059443), (0, 17.75750064755085), (0, 17.830090358108464), (0, 17.83009034502284), (0, 17.757500651299992), (0, 17.830090345202468), (0, 17.83009036350319), (0, 17.7575006477693), (0, 17.830090345221866), (0, 17.75750064951322), (0, 17.757500647980972), (0, 17.757500650649796), (0, 17.75750064746019), (0, 17.83009034956549), (0, 17.75750065072525), (0, 17.830090348872375), (0, 17.757500648925465), (0, 17.757500658480204), (0, 17.757500647602765)]
# 3) 计算 RMSD(全部以第 0 个构象为基准)
rmslis