![3ef61a6e5df134cf63526918cfa18b5d.png](https://i-blog.csdnimg.cn/blog_migrate/875785c253754d5573fe088bb329f8c4.jpeg)
1.前言
DScribe包目前只支持Linux以及macOS,并不能在Windows平台使用,因此本次教程演示在Linux操作系统下如何使用Python中的RDKit和DScribe两个包来生成一些分子描述符。
2.环境
1.Linux(笔者使用的是国产的Deepin 15.11)
2.Anaconda 3.7
教程中用到的主要是三个包:ase,rdkit以及dscribe
安装了anaconda之后base环境中就自带有ase,在终端内分别输入以下命令安装rdkit以及dscribe。
conda install -c rdkit rdkit
pip install dscribe
3.描述符生成
假设我们的分子都存在一个名为molecules.sdf的sdf文件中。
我们利用以下函数调用rdkit生成这个sdf文件中所有分子的描述符,描述符包含分子指纹,相对分子质量和部分电荷等200维。生成的描述符以csv的格式保存,如存成rdkit.csv。
import pandas as pd
from rdkit import Chem
from rdkit.Chem import Descriptors
from rdkit.ML.Descriptors import MoleculeDescriptors
def GetRdkitDescriptors(sdf_file:str,csv_file:str):
suppl = Chem.SDMolSupplier(sdf_file)
mols = [mol for mol in suppl]
smiles_list = [Chem.MolToSmiles(mol) for mol in mols]
descs = [desc_name[0] for desc_name in Descriptors._descList]
desc_calc = MoleculeDescriptors.MolecularDescriptorCalculator(descs)
descriptors = pd.DataFrame([desc_calc.CalcDescriptors(mol) for mol in mols])
descriptors.columns = descs
descriptors.index = smiles_list
index_list = list(map(str,list(range(len(mols)))))
y = pd.DataFrame(index_list)
y.index = smiles_list
y.columns = ["index"]
dataset = pd.concat([y, descriptors], axis=1)
dataset.to_csv(csv_file)
sdf_file:molecules.sdf文件的路径
csv_file:rdkit.csv文件的路径
利用rdkit生成的以上描述符,与分子的构像无关,只要分子中原子的种类和键连关系确定,以上所有性质就相同。
为了引入描述三维构象的描述符,我们使用dscribe包生成库伦矩阵(Coulomb Matrix)。
在这里我们需要使用ase为每个分子生成Atoms对象,供dscribe生成库伦矩阵,由于ase读取sdf时只能读取文件中的第一个分子,因此我们需要将之前的molecules.sdf拆分成单独的sdf文件,即一个sdf中只包含一个分子结构。
笔者使用openbabel将molecules.sdf拆分成molecule-0.sdf,molecule-1.sdf等一组文件,详细的介绍可以参考笔者之前写的文章
SillyCheng:Windows下用Anaconda安装Openbabel并结合Python进行分子文件格式转化zhuanlan.zhihu.com![9fa1810921aec3352d6bcf76c158adc6.png](https://i-blog.csdnimg.cn/blog_migrate/b8208140876bfffd5d804da5ba9c2014.jpeg)
将sdf文件拆分之后,利用以下函数将每一个分子sdf文件转化为对应的库伦矩阵,并保存成CM.csv
from dscribe.descriptors import CoulombMatrix
import glob
import numpy as np
import pandas as pd
from ase import io
def GetCM(sdf_file_folder:str,csv_file:str):
sdf_files = glob.glob(sdf_file_folder+'*.sdf')
cm_init = CoulombMatrix(n_atoms_max=40)
cm_array = []
for sdf_file in sdf_files:
tmp_atoms = io.read(sdf_file,format='sdf')
tmp_cm = list(cm_init.create(tmp_atoms)[0])
cm_array.append(tmp_cm)
cm_array = np.array(cm_array)
columns_num = cm_array.shape[1]
columns = ["CM_%d"%i for i in range(columns_num)]
cm_df = pd.DataFrame(cm_array,columns=columns)
cm_df.to_csv(csv_file)
sdf_file_folder:保存拆分出来的sdf文件的文件夹路径
csv_file:CM.csv的文件路径
生成的两张csv表格大致如下:
![cfe1ea2e4f02af35eb1d249daa80ccaa.png](https://i-blog.csdnimg.cn/blog_migrate/f37dc6738c11a2c559cd49435e613c68.jpeg)
![62d4c7d094fb1a8a1984de924a141230.png](https://i-blog.csdnimg.cn/blog_migrate/23f640f51028b16f7e299fa600308313.jpeg)
如果还有别的问题,欢迎私聊。