「日拱一码」036 RDKit

目录

分子的读-写-创建 

从 Smiles/SMARTS/MolBlock/SDF 读入

写出为 Smiles/SDF/PDB/MolBlock

手工拼装分子(空分子、逐个加原子/键)

分子基本查询与遍历 

原子列表 GetAtoms()

键列表 GetBonds()

指定索引原子 GetAtomWithIdx(i)

邻居原子 GetNeighbors()

环信息 GetRingInfo

分子编辑(增删改原子/键) 

增加 AddAtom() 、 AddBond()

删除 RemoveAtom()

修改 ReplaceAtom()

3D 构象生成与优化 

单构象

多构象(并行)

力场优化(UFF / MMFF94)

RMSD、对齐

分子指纹 & 相似性 

拓扑指纹 Chem.RDKFingerprint  

MACCS 166  MACCSkeys.GenMACCSKeys 

Morgan ECPP AllChem.GetMorganFingerprint  

E-state EState.Fingerprinter 

描述符 & QSAR 特征

1D/2D 描述符:分子量、LogP、TPSA、可旋转键数……

3D 描述符:PMI、NPR、半径、表面积……

自定义描述符:可注册到  rdkit.Chem.Descriptors  命名空间

子结构搜索 & 匹配 

化学反应(SMARTS 模板) 

定义反应: AllChem.ReactionFromSmarts 

运行反应: rxn.RunReactants 

保护原子、映射编号、收率过滤

分子分解 / 片段化 

Recap 基于常见反应断键

BRICS  基于合成可及键 

自定义键 Chem.FragmentOnBonds  

绘图 & 可视化 

2D 坐标: Chem.Compute2DCoords 

高亮原子/键: Draw.MolToImage(mol, highlightAtoms=[...]) 

Jupyter 内嵌: Draw.MolsToGridImage(ms, molsPerRow=4) 

SVG 矢量: Draw.MolToSVG 

高级主题

手性与立体信息  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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值