Eastsheng's Wiki

RDKit安装与使用

2023-09-08 10:48:28

[toc]

RDKit安装

1
2
3
4
# conda install
conda install -c rdkit rdkit
# pip install
pip install rdkit

读取与写入

1
2
3
4
5
6
7
8
9
from rdkit import Chem
smi='C=CN1CCCC1=O' # PVP K90
mol = Chem.MolFromSmiles(smi) # 读取Smiles
N = mol.GetNumAtoms() # 原子个数
M = mol.GetNumBonds() # 共价键个数

# 读取mol文件写smiles
m = Chem.MolFromMolFile('data/(C6H9NO)1.mol')
Chem.MolToSmiles(m) # 'C=CN1CCCC1=O'
  • 获取原子对象:

    • GetAtomMapNum: map id 原子smarts形式冒号后面的数字,如[N:4], map id 就是4。
    • GetAtomicNum: 获取原子对应的元素编号,如碳原子的AtomicNum就是6
    • GetBonds: 该原子参与形成的键的列表。
    • GetFormalCharge: 该原子的电荷
    • GetChiralTag:原子的手性信息
    • GetDegree: 原子的度,这里的度指的是这个原子参与形成键的数目
    • GetIsAromatic: 判断原子是否是芳香性原子
    • GetIdx: 获取原子的编号
    • GetNeighbors: 获取相连的原子列表
    • GetSmarts: 获取原子的Smarts形式
    • GetSymbol:获取原子的元素符号
    • IsInRing(): 判断原子是否在环上
    • IsInRingSize(n): 判断原字是否在n-元环上
  • 获取键的信息

    • GetBondType():获取键的类型
    • GetBeginAtom(): 组成键的第一个原子
    • GetBeginAtomIdx(): 键的第一个组成原子编号
    • GetEndAtomIdx():键的第二个组成原子编号
    • GetEndAtom(): 组成键的第二个原子
    • IsInRing(): 判断是否在环上
    • IsInRingSize(n):判断是否在n-元环上

分子描述符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 描述符生成:用于表示和表征分子特性的数值特征或属性
from rdkit.Chem import Descriptors
# 计算分子质量
mol_weight = Descriptors.MolWt(mol)
print("分子质量 (Molecular Weight):", mol_weight)

# 计算分子的LogP(脂水分配系数)
logp = Descriptors.MolLogP(mol)
print("LogP:", logp)

# 计算分子的HBA(氢键受体数)
hba = Descriptors.NumHAcceptors(mol)
print("氢键受体数 (HBA):", hba)

# 计算分子的HBD(氢键供体数)
hbd = Descriptors.NumHDonors(mol)
print("氢键供体数 (HBD):", hbd)

# 计算分子的TPSA(极性表面积)
tpsa = Descriptors.TPSA(mol)
print("极性表面积 (TPSA):", tpsa)

# 计算分子的价电子数目
nve = Descriptors.NumValenceElectrons(mol)
print("分子的价电子数目:", nve)

分子指纹

Topological Fingerprints

1
2
3
4
5
6
7
8
9
10
# Topological Fingerprints
from rdkit import DataStructs

# 提取分子指纹
m1 = Chem.MolFromSmiles('CCOC')
m2 = Chem.MolFromSmiles('CCO')
fps1 = Chem.RDKFingerprint(m1) # Fingerprints
fps2 = Chem.RDKFingerprint(m2)
# 计算分子相似性
DataStructs.FingerprintSimilarity(fps1,fps2)

MACCS Keys

1
2
3
4
5
6
7
8
9
10
# MACCS Keys
from rdkit.Chem import MACCSkeys

# 提取分子指纹MACCS
ms = [Chem.MolFromSmiles('CCOC'), Chem.MolFromSmiles('CCO'), Chem.MolFromSmiles('COC')]
fps = [MACCSkeys.GenMACCSKeys(x) for x in ms]

# 计算分子相似性
from rdkit import DataStructs
DataStructs.FingerprintSimilarity(fps[0],fps[1])

Atom Pairs and Topological Torsions

1
2
3
4
5
6
7
8
9
10
11
# Atom Pairs and Topological Torsions
from rdkit.Chem.AtomPairs import Pairs

# 提取分子指纹MACCS
ms = [Chem.MolFromSmiles('CCOC'), Chem.MolFromSmiles('CCO'), Chem.MolFromSmiles('COC')]
pairFps = [Pairs.GetAtomPairFingerprint(x) for x in ms]
#pairFps = [Pairs.GetAtomPairFingerprintAsBitVect(x) for x in ms]

# 计算分子相似性
from rdkit import DataStructs
DataStructs.DiceSimilarity(pairFps[0],pairFps[1])

可视化分子

显示分子中原子的编号

1
2
3
4
from rdkit import Chem
for atom in mol.GetAtoms():
atom.SetProp('atomLabel',str(atom.GetIdx()))
mol

多个分子按照grid显示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from rdkit.Chem import Draw
from rdkit import Chem
smis=[
'COC1=C(C=CC(=C1)NS(=O)(=O)C)C2=CN=CN3C2=CC=C3',
'C1=CC2=C(C(=C1)C3=CN=CN4C3=CC=C4)ON=C2C5=CC=C(C=C5)F',
'COC(=O)C1=CC2=CC=CN2C=N1',
'C1=C2C=C(N=CN2C(=C1)Cl)C(=O)O',
]
mols=[]
for smi in smis:
mol = Chem.MolFromSmiles(smi)
mols.append(mol)
img=Draw.MolsToGridImage(mols,molsPerRow=4,subImgSize=(200,200),legends=['' for x in mols])
img

多个分子基于公共骨架按照grid显示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from rdkit.Chem import Draw
from rdkit import Chem
smis=[
'COC1=C(C=CC(=C1)NS(=O)(=O)C)C2=CN=CN3C2=CC=C3',
# 'CCN(CC1=C(C=CC(=C1)C(F)(F)F)C2=CC(=C3N2C=NC=C3)CC(=O)O)C(=O)C4CC4',
'C1=CC2=C(C(=C1)C3=CN=CN4C3=CC=C4)ON=C2C5=CC=C(C=C5)F',
'COC(=O)C1=CC2=CC=CN2C=N1',
'C1=C2C=C(N=CN2C(=C1)Cl)C(=O)O',
]
template = Chem.MolFromSmiles('c1nccc2n1ccc2')
AllChem.Compute2DCoords(template)
mols=[]
for smi in smis:
mol = Chem.MolFromSmiles(smi)
AllChem.GenerateDepictionMatching2DStructure(mol,template)
mols.append(mol)


img=Draw.MolsToGridImage(mols,molsPerRow=4,subImgSize=(200,200),legends=['' for x in mols])
img

原子对性质的贡献可视化

1
2
3
4
5
from rdkit.Chem.Draw import SimilarityMaps
mol = Chem.MolFromSmiles('COc1cccc2cc(C(=O)NCCCCN3CCN(c4cccc5nccnc54)CC3)oc21')
AllChem.ComputeGasteigerCharges(mol) # Gasteiger partial 电荷
contribs = [float(mol.GetAtomWithIdx(i).GetProp('_GasteigerCharge')) for i in range(mol.GetNumAtoms())]
fig = SimilarityMaps.GetSimilarityMapFromWeights(mol, contribs, colorMap='jet', contourLines=10)

编辑分子

1
2
3
4
5
6
7
8
m = Chem.MolFromSmiles('c1ccccc1')
print("修改前的分子:")
display(m)

m.GetAtomWithIdx(5).SetAtomicNum(7)
Chem.SanitizeMol(m)
print("修改后的分子:")
display(m)

参考

[1] RDKit 中文教程

[2] RDKit介绍及使用