如何将RDKit构象对象保存到sdf文件中?

我为一个分子生成了许多构象。我想为每个构象将其坐标保存到一个SDF文件中。我尝试了以下方法,但sdf文件中的坐标与构象的坐标不同。

from rdkit import Chemfrom rdkit.Chem import AllChemfrom rdkit.Chem.EnumerateStereoisomers import EnumerateStereoisomersfrom rdkit.Chem.EnumerateStereoisomers import StereoEnumerationOptionsaspirin = '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)  # 这是我想保存到SDF文件中的构象。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  0M  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)

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注