MBL Molfile格式解析报错:如何修正格式并生成分子图像?
Molfile格式问题分析及修正方案
1. 当前Molfile的错误点
- 计数行原子数错误:第一行有效内容(
1 0 0 0 0 0 999 V2000)的第一个数字代表原子总数,你写了1,但实际包含3个原子(O+2H),RDKit解析时会误判原子数量,导致后续行解析失败。 - 原子行字段误用:你在原子行的第6个字段填写了
-1、1,这不符合V2000格式规范。该字段是电荷编码(0=中性,1=+1,2=-1等),而非连接关系。原子间的连接需要通过单独的键行定义,不能写在原子行中。 - 缺少键行:V2000格式要求在所有原子行之后添加键行,明确原子间的连接方式和键级,你的molfile缺少这部分内容。
2. 正确的V2000 Molfile格式(以水分子为例)
3 2 0 0 0 0 0 0 0 0999 V2000 0.0000 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 1.0000 0.8144 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 0.0000 -0.8144 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 1 2 1 0 0 0 0 1 3 1 0 0 0 0 M END
格式说明:
- 计数行
3 2 ...:第一个数3是原子总数,第二个数2是键的总数 - 键行
1 2 1 ...:表示原子1(O)和原子2(第一个H)之间是单键(第三个数字1代表单键),第二行键行对应O和第二个H的单键
3. 修正后的完整绘图代码
将molfile修正后,结合你提供的绘图逻辑,完整可运行代码如下:
from rdkit import Chem from rdkit.Chem import AllChem, Draw import matplotlib.pyplot as plt # 修正后的molfile字符串 molfile_string = """ 3 2 0 0 0 0 0 0 0 0999 V2000 0.0000 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 1.0000 0.8144 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 0.0000 -0.8144 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 1 2 1 0 0 0 0 1 3 1 0 0 0 0 M END """ # 解析molfile mol = Chem.MolFromMolBlock(molfile_string) # 生成2D坐标并绘制图像 AllChem.Compute2DCoords(mol) image = Draw.MolToImage(mol, size=(300, 300), kekulize=False) plt.imshow(image, interpolation='nearest') plt.axis('off') # 关闭坐标轴标签 plt.show()
简便替代方案
如果不想手动编写molfile,也可以通过SMILES快速生成带氢的分子结构,代码更简洁:
from rdkit import Chem from rdkit.Chem import AllChem, Draw import matplotlib.pyplot as plt # 从SMILES生成分子并添加氢原子 mol = Chem.MolFromSmiles("O") mol = Chem.AddHs(mol) # 生成2D坐标并绘制图像 AllChem.Compute2DCoords(mol) image = Draw.MolToImage(mol, size=(300, 300), kekulize=False) plt.imshow(image, interpolation='nearest') plt.axis('off') plt.show()
内容的提问来源于stack exchange,提问作者ista120
相关产品推荐
相关产品推荐

