为什么我无法在 RDkit 中获取 3D 分子结构?
Why i can't get 3D mol structure in RDkit?
我已经根据需要编辑了分子。现在我必须导出它。但是分子块看起来总是二维的。所以我的分子变成了二维的。我想得到一个 3D 结构。有谁知道解决方案? (截图看图)
以下代码没有问题(版本 2021.03.3):
m_smiles = 'c1ccccc1'
mol = Chem.MolFromSmiles(m_smiles)
mol = Chem.AddHs(mol)
AllChem.EmbedMolecule(mol, randomSeed=0xf00d)
print(Chem.MolToMolBlock(mol))
...
RDKit 3D
12 12 0 0 0 0 0 0 0 0999 V2000
-0.2995 -1.3510 0.0141 C 0 0 0 0 0 0 0 0 0 0 0 0
-1.3055 -0.4032 0.0428 C 0 0 0 0 0 0 0 0 0 0 0 0
-1.0307 0.9497 0.0294 C 0 0 0 0 0 0 0 0 0 0 0 0
0.3037 1.3426 -0.0142 C 0 0 0 0 0 0 0 0 0 0 0 0
1.2985 0.3934 -0.0425 C 0 0 0 0 0 0 0 0 0 0 0 0
1.0206 -0.9630 -0.0291 C 0 0 0 0 0 0 0 0 0 0 0 0
-0.5031 -2.4015 0.0241 H 0 0 0 0 0 0 0 0 0 0 0 0
-2.3381 -0.7237 0.0766 H 0 0 0 0 0 0 0 0 0 0 0 0
-1.8299 1.6790 0.0523 H 0 0 0 0 0 0 0 0 0 0 0 0
0.5056 2.4116 -0.0242 H 0 0 0 0 0 0 0 0 0 0 0 0
2.3290 0.7220 -0.0763 H 0 0 0 0 0 0 0 0 0 0 0 0
1.8494 -1.6559 -0.0530 H 0 0 0 0 0 0 0 0 0 0 0 0
1 2 2 0
2 3 1 0
3 4 2 0
4 5 1 0
5 6 2 0
6 1 1 0
1 7 1 0
2 8 1 0
3 9 1 0
4 10 1 0
5 11 1 0
6 12 1 0
M END
一些要检查的东西:
检查嵌入函数returns是否为非零退出状态,该函数可能无法嵌入您的分子
result = AllChem.EmbedMolecule(mol, randomSeed=0xf00d)
assert result != 0
检查conformer是否标记为3D
result = AllChem.EmbedMolecule(mol, randomSeed=0xf00d)
c = mol.GetConformer()
print(c.Is3D())
...
True
打印conformer的坐标
result = AllChem.EmbedMolecule(mol, randomSeed=0xf00d)
c = mol.GetConformer()
print(c.GetPositions())
...
[[-0.29949394 -1.35098866 0.01410225]
[-1.30551208 -0.40318505 0.04275071]
[-1.03072469 0.949724 0.02942649]
[ 0.30371624 1.34255959 -0.01420523]
[ 1.29846541 0.39342702 -0.04249222]
[ 1.02064112 -0.96295912 -0.02906111]
[-0.50308026 -2.40153594 0.0241313 ]
[-2.33811252 -0.72370675 0.07656442]
[-1.82994742 1.67895926 0.0522682 ]
[ 0.50563305 2.41164485 -0.02424598]
[ 2.32904788 0.72199377 -0.07627234]
[ 1.8493672 -1.65593298 -0.05296649]]
我已经根据需要编辑了分子。现在我必须导出它。但是分子块看起来总是二维的。所以我的分子变成了二维的。我想得到一个 3D 结构。有谁知道解决方案? (截图看图)
以下代码没有问题(版本 2021.03.3):
m_smiles = 'c1ccccc1'
mol = Chem.MolFromSmiles(m_smiles)
mol = Chem.AddHs(mol)
AllChem.EmbedMolecule(mol, randomSeed=0xf00d)
print(Chem.MolToMolBlock(mol))
...
RDKit 3D
12 12 0 0 0 0 0 0 0 0999 V2000
-0.2995 -1.3510 0.0141 C 0 0 0 0 0 0 0 0 0 0 0 0
-1.3055 -0.4032 0.0428 C 0 0 0 0 0 0 0 0 0 0 0 0
-1.0307 0.9497 0.0294 C 0 0 0 0 0 0 0 0 0 0 0 0
0.3037 1.3426 -0.0142 C 0 0 0 0 0 0 0 0 0 0 0 0
1.2985 0.3934 -0.0425 C 0 0 0 0 0 0 0 0 0 0 0 0
1.0206 -0.9630 -0.0291 C 0 0 0 0 0 0 0 0 0 0 0 0
-0.5031 -2.4015 0.0241 H 0 0 0 0 0 0 0 0 0 0 0 0
-2.3381 -0.7237 0.0766 H 0 0 0 0 0 0 0 0 0 0 0 0
-1.8299 1.6790 0.0523 H 0 0 0 0 0 0 0 0 0 0 0 0
0.5056 2.4116 -0.0242 H 0 0 0 0 0 0 0 0 0 0 0 0
2.3290 0.7220 -0.0763 H 0 0 0 0 0 0 0 0 0 0 0 0
1.8494 -1.6559 -0.0530 H 0 0 0 0 0 0 0 0 0 0 0 0
1 2 2 0
2 3 1 0
3 4 2 0
4 5 1 0
5 6 2 0
6 1 1 0
1 7 1 0
2 8 1 0
3 9 1 0
4 10 1 0
5 11 1 0
6 12 1 0
M END
一些要检查的东西:
检查嵌入函数returns是否为非零退出状态,该函数可能无法嵌入您的分子
result = AllChem.EmbedMolecule(mol, randomSeed=0xf00d)
assert result != 0
检查conformer是否标记为3D
result = AllChem.EmbedMolecule(mol, randomSeed=0xf00d)
c = mol.GetConformer()
print(c.Is3D())
...
True
打印conformer的坐标
result = AllChem.EmbedMolecule(mol, randomSeed=0xf00d)
c = mol.GetConformer()
print(c.GetPositions())
...
[[-0.29949394 -1.35098866 0.01410225]
[-1.30551208 -0.40318505 0.04275071]
[-1.03072469 0.949724 0.02942649]
[ 0.30371624 1.34255959 -0.01420523]
[ 1.29846541 0.39342702 -0.04249222]
[ 1.02064112 -0.96295912 -0.02906111]
[-0.50308026 -2.40153594 0.0241313 ]
[-2.33811252 -0.72370675 0.07656442]
[-1.82994742 1.67895926 0.0522682 ]
[ 0.50563305 2.41164485 -0.02424598]
[ 2.32904788 0.72199377 -0.07627234]
[ 1.8493672 -1.65593298 -0.05296649]]