java生成csv文件_利用RDKit与DScribe包生成分子描述符

3ef61a6e5df134cf63526918cfa18b5d.png

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

将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

62d4c7d094fb1a8a1984de924a141230.png

如果还有别的问题,欢迎私聊。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值