In [1]:
import pickle
from rdkit import Chem
In [2]:
m = Chem.MolFromSmiles('Cc1ccccc1')
m
Out[2]:
导出为 SMILES¶
使用 Chem.MolToSmiles(mol, parameters)
可以将对象 mol
转换为 SMILES 字符串,可选参数包括
isomericSmiles=True
:是否区分同分异构体kekuleSmiles=False
:是否以 Kekule 式输出rootedAtAtom=-1
:非负时以指定的原子作为起始点canonical=True
:是否以标准 SMILES 输出allBondsExplicit=False
:是否表示出各个键allHsExplicit=False
:是否表示出各个氢原子
In [3]:
print("%-15s" % "SMILES: ", Chem.MolToSmiles(m))
print("%-15s" % "Kekule: ", Chem.MolToSmiles(m, kekuleSmiles=True))
print("%-15s" % "Rooted atiom: ", Chem.MolToSmiles(m, rootedAtAtom=2))
print("%-15s" % "Non canonical: ", Chem.MolToSmiles(m, canonical=False))
print("%-15s" % "All bonds: ", Chem.MolToSmiles(m, allBondsExplicit=True))
print("%-15s" % "All H: ", Chem.MolToSmiles(m, allHsExplicit=True))
In [4]:
binary_m = m.ToBinary()
with open("./binary_m.pkl", "wb") as f:
pickle.dump(m, f)
binary_m
Out[4]:
从二进制导入分子¶
Chem.mol()
:将二进制字符串转为分子pickle.load()
:读取.pkl
文件中存储的对象
In [5]:
m = Chem.Mol(binary_m)
m
Out[5]:
In [6]:
with open("./binary_m.pkl", "rb") as f:
binary_m = f.read()
m = pickle.loads(binary_m)
m
Out[6]:
.mol 格式¶
Chem.MolToMolBlock(mol)
:输出分子的 .mol
信息
Chem.MolToMolFile(mol, filename)
:导出分子的 .mol
文件
In [7]:
print(Chem.MolToMolBlock(m))
.mol
格式便于在其中添加信息,导入其他软件。此外,在生成 .mol
文件时会自动生成原子的坐标,避免导入其他软件时因为立体化学而出现问题。
In [8]:
m.SetProp("_Name", "Toluene")
print(Chem.MolToMolBlock(m))
In [9]:
mols_smiles = [ "Cc1ccccc1", "C1CCCCC1", "c1cocc1"]
mols = [Chem.MolFromSmiles(mol) for mol in mols_smiles]
mols[0]
Out[9]:
分子集(化合物库)的主流保存格式是 .smi
与 .sdf
,其中 .smi
直接保存了化合物的 SMILES 与名字,格式也十分简单,首行为标题,后续每行保存一个 SMILES,空格后为化合物名称,也可使用制表符作为分隔符,格式比较自由:
SMILES Name
Cc1ccccc1 Toluene
C1CCCCC1 molecule2
c1cocc1 molecule3
{SIMLES} {name}
RDKit 没有提供导出为 .smi
文件的函数,那么就需要根据自己的要求来生成。
In [10]:
mols[0].SetProp("_Name", "Toluene")
with open("./mols.smi", "w") as f:
title = " ".join(["SMILES", "Name\n"])
f.write(title)
for mol in mols:
try:
name = "".join([mol.GetProp("_Name"), "\n"])
except KeyError:
name = "\n"
line = " ".join([Chem.MolToSmiles(mol), name])
f.write(line)
导入 SMILES 分子集¶
Chem.SmilesMolSupplier(filename, parameters)
提供了读取 .smi
文件的快捷方法,返回一个可迭代对象。
filename
:读取的文件路径delimiter=' '
:分隔符smilesColumn=0
:SMILES 所在列的索引nameColumn=1
:SMILES 对应名称所在列的索引titleLine=True
:是否有标题行sanitize=True
:是否检查 SMILES 数据正确性
In [11]:
mols_read = Chem.SmilesMolSupplier("./mols.smi")
print(mols_read[0].GetProp("_Name"))
mols_read[0]
Out[11]:
In [12]:
with Chem.SDWriter("./mols.sdf") as f:
for mol in mols:
f.write(mol)
.sdf
文件保存的数据更为详细,文件中使用 $$$$
分隔不同分子:
Toluene
RDKit 2D
7 7 0 0 0 0 0 0 0 0999 V2000
3.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
1.5000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
0.7500 -1.2990 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
-0.7500 -1.2990 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
-1.5000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
-0.7500 1.2990 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
0.7500 1.2990 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
1 2 1 0
2 3 2 0
3 4 1 0
4 5 2 0
5 6 1 0
6 7 2 0
7 2 1 0
M END
$$$$
RDKit 2D
6 6 0 0 0 0 0 0 0 0999 V2000
1.5000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
0.7500 -1.2990 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
-0.7500 -1.2990 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
-1.5000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
-0.7500 1.2990 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
0.7500 1.2990 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
1 2 1 0
2 3 1 0
3 4 1 0
4 5 1 0
5 6 1 0
6 1 1 0
M END
$$$$
RDKit 2D
5 5 0 0 0 0 0 0 0 0999 V2000
1.2760 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
0.3943 1.2135 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
-1.0323 0.7500 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0
-1.0323 -0.7500 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
0.3943 -1.2135 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
1 2 2 0
2 3 1 0
3 4 1 0
4 5 2 0
5 1 1 0
M END
$$$$
从 .sdf 导入分子集¶
与导入 .smi
文件相似,导入 .sdf
文件也有 Chem.SDMolSupplier()
函数,使用方法也类似。
In [13]:
mols_read = Chem.SDMolSupplier("./mols.sdf")
print(mols_read[0].GetProp("_Name"))
mols_read[0]
Out[13]: