如何将RDKit转换对象保存为sdf文件?



我为一个分子生成了一堆构象。对于每个符合条件的坐标,我想将其保存在一个SDF文件中。我尝试了以下操作,但是sdf文件中的坐标与conformer中的坐标不一致

from rdkit import Chem
from rdkit.Chem import AllChem
from rdkit.Chem.EnumerateStereoisomers import EnumerateStereoisomers
from rdkit.Chem.EnumerateStereoisomers import StereoEnumerationOptions

aspirin = 'CC(=O)OC1=CC=CC=C1C(=O)O'
mol = Chem.AddHs(Chem.MolFromSmiles(aspirin))
conformers = AllChem.EmbedMultipleConfs(mol, numConfs=8)
conformer_i = mol.GetConformer(0)  # This is the conformer that I wanted to save in a SDF file.
print(conformer_i.GetPositions())

[[ 3.55910965  0.20840444  0.20174025]
[ 2.13148034 -0.07274183 -0.11680036]
[ 1.81233825 -0.09134332 -1.32465968]
[ 1.16950868 -0.30747936  0.83214171]
[-0.12944319 -0.55824117  0.41262056]
[-0.53676538 -1.86517356  0.15656512]
[-1.82111824 -2.14574436 -0.26154327]
[-2.69581394 -1.09437287 -0.4203516 ]
[-2.35275981  0.20578091 -0.18448083]
[-1.05455197  0.45649503  0.23480361]
[-0.64543959  1.83612099  0.49878179]
[ 0.50523818  2.10782743  0.87545738]
[-1.54126908  2.879518    0.33273924]
[ 4.15835976 -0.73143248  0.14404327]
[ 3.62587517  0.63489849  1.2047807 ]
[ 3.98056046  0.90402053 -0.55673262]
[ 0.20229068 -2.6478098   0.3014611 ]
[-2.09903401 -3.17965212 -0.45066362]
[-3.71036497 -1.30377103 -0.74938855]
[-3.04003996  1.04851376 -0.30756941]
[-1.51816102  3.71618233  0.87474425]]

但是当我试图将具有这种构象结构的分子保存到SDF文件中时,

w = Chem.SDWriter('conformer.sdf')
mol.AddConformer(conformer_i)
w.write(mol)
w.close()

我有以下:


RDKit          3D
21 21  0  0  0  0  0  0  0  0999 V2000
-2.8028   -2.2971    0.2528 C   0  0  0  0  0  0  0  0  0  0  0  0
-1.9196   -1.1193    0.3821 C   0  0  0  0  0  0  0  0  0  0  0  0
-1.9380   -0.4309    1.4053 O   0  0  0  0  0  0  0  0  0  0  0  0
-1.0329   -0.6957   -0.5799 O   0  0  0  0  0  0  0  0  0  0  0  0
-0.2038    0.3759   -0.5076 C   0  0  0  0  0  0  0  0  0  0  0  0
-0.5008    1.6592   -0.9114 C   0  0  0  0  0  0  0  0  0  0  0  0
0.4068    2.6946   -0.8011 C   0  0  0  0  0  0  0  0  0  0  0  0
1.6647    2.4889   -0.2762 C   0  0  0  0  0  0  0  0  0  0  0  0
1.9781    1.2093    0.1330 C   0  0  0  0  0  0  0  0  0  0  0  0
1.0695    0.1765    0.0217 C   0  0  0  0  0  0  0  0  0  0  0  0
1.4778   -1.1541    0.4786 C   0  0  0  0  0  0  0  0  0  0  0  0
0.6542   -2.1230    0.3851 O   0  0  0  0  0  0  0  0  0  0  0  0
2.7241   -1.3647    1.0002 O   0  0  0  0  0  0  0  0  0  0  0  0
-2.9017   -2.5297   -0.8210 H   0  0  0  0  0  0  0  0  0  0  0  0
-3.7860   -2.0195    0.6858 H   0  0  0  0  0  0  0  0  0  0  0  0
-2.4405   -3.1762    0.7986 H   0  0  0  0  0  0  0  0  0  0  0  0
-1.4956    1.7914   -1.3196 H   0  0  0  0  0  0  0  0  0  0  0  0
0.1087    3.6835   -1.1386 H   0  0  0  0  0  0  0  0  0  0  0  0
2.3837    3.2960   -0.1858 H   0  0  0  0  0  0  0  0  0  0  0  0
2.9838    1.0330    0.5554 H   0  0  0  0  0  0  0  0  0  0  0  0
3.5700   -1.4979    0.4428 H   0  0  0  0  0  0  0  0  0  0  0  0
1  2  1  0
2  3  2  0
2  4  1  0
4  5  1  0
5  6  2  0
6  7  1  0
7  8  2  0
8  9  1  0
9 10  2  0
10 11  1  0
11 12  2  0
11 13  1  0
10  5  1  0
1 14  1  0
1 15  1  0
1 16  1  0
6 17  1  0
7 18  1  0
8 19  1  0
9 20  1  0
13 21  1  0
M  END
$$$$

分子sdf文件中的坐标与conformer_i中的坐标不一致。有人对这个问题有什么见解吗?谢谢你!

当您使用SDWriter.write时,您需要提供您希望写入文件的转换器的ID:

writer = Chem.SDWriter('aspirin_confs.sdf')
for cid in range(mol.GetNumConformers()):
writer.write(mol, confId=cid)

编辑:

如果你只想把这个属性写入文件,那么为什么不每次迭代都重写分子属性呢?

writer = Chem.SDWriter('aspirin_confs.sdf')
for cid in range(mol.GetNumConformers()):
mol.SetProp('ID', f'aspirin_conformer_{cid}')
writer.write(mol, confId=cid)

最新更新