基于片段的分子生成网络 (FLAG)使用方法及案例测评

news2025/2/26 15:04:05

本文来源于中国科技大学计算机科学与技术学院刘淇教授课题组于2023年发表在ICLR2023上的文章《MOLECULE GENERATION FOR TARGET PROTEIN BINDING WITH STRUCTURAL MOTIFS

在本文中,作者提出了一个基于片段的分子生成网络,FLAG (Fragment based LigAnd Generation framework)。在FLAG中,从数据集中提取共同的分子片段,构建了motif的词汇库。在每个生成步骤中,首先采用 3D 图神经网络对中间上下文信息(口袋)进行编码。 然后,FLAG模型选择中心motif,预测下一个motif类型,并连接motif。其中,键长/键角通过化学信息学工具快速准确地确定。 最后,根据预测的旋转角度和结构细化进一步调整分子几何形状。

本文是为数不多基于片段的分子生成技术,且能提供分子的3D结合pose。

一、文章主要结果

分子生成过程示例如下图:

motif的提取过程如下图:

作者评估的结果显示,FLAG模型在生成分子的QED,SA,docking score以及分子的真实性,特别是C-O键等二面角分布上,具有明显的优势。

分子性质结果如下图:

生成分子的docking 情况:生成的分子结构正常,且能合理占据口袋,docking score的打分与原始参考分子相近。

生成分子真实性(二面角):

作者提供了开源代码:https://github.com/zaixizhang/FLAG

二、环境安装与数据准备

首先,从GitHub中复制项目:

git clone https://github.com/zaixizhang/FLAG.git

项目目录如下:

然后根据yaml环境文件,安装conda 环境然后进行激活,因为torch和NVCC都是常见的版本,所以安装非常简单:

然后根据yaml环境文件,安装conda 环境然后进行激活,因为torch和NVCC都是常见的版本,所以安装非常简单:

conda env create -f flag_env.yaml
conda activate flag_env

然后进入./data目录,创建FLAG文件夹(该文件夹必须要创建,作者提供的代码使用了该目录,但是开源代码中并未创建),按照README.md说明从谷歌云盘上下载数据,并保存到 ./data/FLAG 中(链接:https://drive.google.com/drive/folders/1CzwxmTpjbrt83z_wBzcQncq84OVDPurM)

然后,进行解压:

tar -xzvf crossdocked_pocket10.tar.gz

数据预处理,motif词汇库的构建:

cd utils
python mol_tree.py

从上图可知,一共提取了517个motif,分子总数为183421个。运行结束以后,会在./data目录中,生成crossdocked_pocket10_processed.lmdb和crossdocked_pocket10_processed.lmdb-lock数据文件,./data目录如下:

同时,./utils目录下会生成语motif的语料库:vocab.txt。

注意,mol_tree.py文件有文件路径修改:

index_path = '/data/FLAG/crossdocked_pocket10/index.pkl' # wufeil
    with open(index_path, 'rb') as f:
        index = pickle.load(f)
    for i, (pocket_fn, ligand_fn, _, rmsd_str) in enumerate(tqdm(index)):
        if pocket_fn is None: continue
        try:
            path = '/data/FLAG/crossdocked_pocket10/' + ligand_fn # wufeil
            mol = Chem.MolFromMolFile(path, sanitize=False)
            moltree = MolTree(mol)
            cnt += 1
            if moltree.num_rotatable_bond > 0:
                rot += 1
        except:
            continue

改为:

index_path = '../data/FLAG/crossdocked_pocket10/index.pkl' # wufeil
    with open(index_path, 'rb') as f:
        index = pickle.load(f)
    for i, (pocket_fn, ligand_fn, _, rmsd_str) in enumerate(tqdm(index)):
        if pocket_fn is None: continue
        try:
            path = '../data/FLAG/crossdocked_pocket10/' + ligand_fn # wufeil
            mol = Chem.MolFromMolFile(path, sanitize=False)
            moltree = MolTree(mol)
            cnt += 1
            if moltree.num_rotatable_bond > 0:
                rot += 1
        except:
            continue

三、训练FLAG模型

python train.py

如果直接运行,上述训练代码,会报:ModuleNotFoundErrons No module naned chemutils错误:

这是因为,代码路径问题,需要做如下修改,增加sys.path.append("./utils"):

import sys
sys.path.append("..")
sys.path.append("./utils") # wufeil

同时,需要修改,训练的参数文件,即 ./configs/train_model.yml,修改内容如下,主要是调整了数据目录:

然后,python train.py可以正常运行,经过漫长时间的数据加载(> 1h),模型开始训练:

非常可惜,由于作者未提供训练好的checkpiont文件,所以需要我们自己先训练出一个模型,才能进行接下来的操作。

四、采样/分子生成

由于作者在GitHub上没有提供训练好的模型ckpt文件,因此只能使用我们自己训练的。在上一部训练结束以后,需要将模型的checkpoint 转移至 ./pretrained/并重命名为model.pt。然后执行如下命令:

python motif_sample.py

脚本会调用./configs/sample_test.yml下的参数配置(如下),FALG模型会加载./test_data/project_1数据集,然后从中抽取第一个体系(代码是这么写的,而结果也是这样子的),进行分子生成。输入的结果保存在:/outputs/sample-0_2023_09_06__07_32_47。其中,sample-0_2023_09_06__07_32_47为采样的时间,生成的分子为sdf格式。从pocket_info.txt中可以查到口袋的信息,为BSD_ASPTE_1_130_0/2z3h_A_rec_1wn6_bst_lig_tt_docked_3_pocket10.pdb。

dataset:
  name: pl
  path: ./test_data/project_1


model:
  checkpoint: ./pretrained/model.pt
  hidden_channels: 256
  random_alpha: True


sample:
  seed: 2022
  num_samples: 100 # 每个配体/体系采样数量
  beam_size: 300
  logp_thres: -.inf
  num_retry: 5
  max_steps: 12
  batch_size: 10
  num_workers: 4

在./configs/sample_test.yml配置文件中,设置的每个体系是采样100个,但是生成的sdf文件只有39个,说明不是每一次尝试sampling都是成功的。然后,我们将生成的分子放回到口袋中,几个示例如下:

从上述结果来看,在可以被保存成sdf的分子中,还有很多分子是不合法的。但是比较严重的是,在生成分子中,出现了大量的非常复杂的并环,这些分子的复杂程度根本就不可能合成。

可能是因为,训练不足导致的,这里使用的参数文件是经过了18000次迭代的。所以,模型的真实结果还是需要作者提供原始的ckpt文件才能知道。但是,并环在FLAG模型中,容易生成,可能是真实的,作者给出的几个案例,全部都有并环的存在,如下图:

但,必须指明的是,这不意味着作者的工作存在严重缺陷,作为一种方法的验证,作者开辟了基于分子片段的分子生成技术,是非常有参考意义的。GitHub中的代码,更是具有借鉴意义。

五、为自定义的案例生成分子

在1.2中,作者提供的是批量的是生成分子,利用的是数据预处理完成后的pl数据集中test集,然后对其中的第一个数据进行分子采样,并没有提供一个分子从数据预处理开始。为了使用自己的例子进行分子生成,新编写了一个generate_mols.py脚本。

执行: python generate_mols.py 即可。

脚本会默认使用./utils/vocab.txt片段库,同时将生成的分子保存在./tests。

generate_mols.py 会调用./configs/sample_test.yml配置文件,文件内容如下:

dataset:
  name: pl
  path: ./test_data/project_1 


model:
  checkpoint: ./pretrained/model.pt
  hidden_channels: 256
  random_alpha: True


sample:
  seed: 2022
  num_samples: 50 # 每个配体/体系采样数量,至少要大于批次大小
  beam_size: 300
  logp_thres: -.inf
  num_retry: 5
  max_steps: 12
  batch_size: 10
  num_workers: 4

其中,dataset中name必须为pl,因为原文作者设置如果数据集名字不为pl会报错。path为我们需要进行分子生成的体系保存路径,里面包含了两个体系,分别作为一个文件夹,目录如下:

./test_data/project_1
├── 3tym
│   ├── 3tym_ligand.sdf
│   └── 3tym_protein.pdb
├── 5tbo
│   ├── 5tbo_ligand.sdf
│   └── 5tbo_protein.pdb
└── index.pkl

model和sample字段下为模型相关的内容,没有做改变。sample中num_samples可以做调整,但是要大于batch_size。

在示例中,我们进行测试的两个体系是3tym和5tbo,生成的结果目录./test如下:

./tests
└── sample_test-pl_2023_09_13__02_10_37
    ├── 3tym
    │   ├── 17.sdf
    │   ├── 27.sdf
    │   ├── 37.sdf
    │   ├── 47.sdf
    │   ├── SMILES.txt
    │   └── pocket_info.txt
    ├── 5tbo
    │   ├── 19.sdf
    │   ├── 39.sdf
    │   ├── 47.sdf
    │   ├── 49.sdf
    │   ├── 9.sdf
    │   ├── SMILES.txt
    │   └── pocket_info.txt
    ├── log.txt
    └── sample_test.yml

虽然设置每个体系采样50个,但是真正生成的有小分子并不多,分别只有

5tbo生成分子的结果示例:

                  

3tym生成分子的结果示例:

            

实在是因为我们训练迭代的次数太低,结果真的没法看。如果要用FLAG真的为靶点进行分子生成,显然需要进行更多次的迭代。可能数据集以及分子的切割方式也要做改进。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1087598.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32 多功能按键中断

key1 开关实现led1亮灭,key2开关实现蜂鸣器开关,key3开关实现风扇开关 main.c #include "uart.h" #include "key_it.h" #include "led.h" int main() {char c;char *s;uart4_init();//串口初始化all_led_init();key_it_config();fengshan_init…

2023年中国脱皮芝麻生产工艺、产量及消费量分析[图]

白芝麻在一般的油脂生产中是不脱皮的,但是直接食用时最好进行脱皮处理。原因在于芝麻种皮或角质层中纤维和草酸盐含量(2%~3%草酸钙螯合物)较高,使得其油和粕不能作为人类的蛋白质资源,只能用作牛的饲料或肥料。因此&am…

MarkDown制作思维导图

MarkDown制作思维导图 很实用的markdown转xmind思维导图教程 1、markdown导出OPML文件 💡 Typora 导出,需要安装 Pandoc,安装后重启电脑即可导出 2、xmind选择导入OPML格式 💡 思维导图markdown的标题生成,因此可能要…

【嵌入式】堆栈与单片机内存

堆栈 在片内RAM中,常常要指定一个专门的区域来存放某些特别的数据 它遵循顺序存取和后进先出(LIFO/FILO)的原则,这个RAM区叫堆栈。 其实堆栈就是单片机中的一些存储单元,这些存储单元被指定保存一些特殊信息,比如地址&#xff0…

自动驾驶学习笔记(三)——场景设计

#Apollo开发者# 学习课程的传送门如下,当您也准备学习自动驾驶时,可以和我一同前往: 《自动驾驶新人之旅》免费课程—> 传送门 《2023星火培训【感知专项营】》免费课程—>传送门 文章目录 前言 场景设计平台 场景地图 场景基本…

颠覆出海营销,机器学习带来买量新变化

这几年出海营销的神话都是机器学习给的: 机器学习显著降低CPI、机器学习大幅提高下载量、机器学习低成本撬动大流量... 此前,用户增长每一步都高度依赖营销人员的运营经验;现在,机器学习正在完全颠覆买量模式拓展营销格局&#…

【线下沙龙】低成本高效率构建您的业务系统

全球企业都在向数字化迈进,但在各类行业调查中表明,只有不到20%的前沿企业通过其数字化转型而获得了成功,大部分企业都将高昂的时间和成本花费在了数字化技术的实施和培训上面。很多企业在转型的过程中面临着众多挑战:…

pycharm中快速对比两个.py文件

在学习一个算法的时候,就想着自己再敲一遍代码,结果最后出现了一个莫名其妙的错误,想跟源文件对比一下到底是在哪除了错,之前我都是大致定位一个一个对比,想起来matlab可以快速查找出两个脚本文件(.m文件)的区别&#…

基于深度学习的“语义通信编解码技术”框架分类

目录 基于神经网络的语义提取基于神经网络的语义信源编码基于神经网络的语义信源信道联合编码基于神经网络的语义编码与数字调制联合设计参考文献 基于神经网络的语义提取 在现有的信源编码前端加上一个语义提取神经网络[53] ,如图所示。语义提取神经网络的输入是原…

linux 安装python django pip 遇到的问题

Python解决SSL不可用问题 解决方案: 首先要明白python版本需要和openssl的版本需要相对匹配的,在Python3.7之后的版本,依赖的openssl,必须要是1.1或者1.0.2之后的版本,或者安装了2.6.4之后的libressl,linux…

使用AIGC快速涨粉

1、newbing 2、输入提示词: 我想拍一个抖音短视频,请帮我选题,要求吸引人的 3、根据他的回答,选中一个有代表性的。 请产生《我用抖音教你如何做出超级美味的巧克力蛋糕,只需要三分钟,简单又好吃》的脚本 …

MobaXterm使sftp目录与cmd目录同步

MobaXterm使sftp目录与cmd目录同步 创建session时在ssh菜单栏中选择Advanced SSH settings其中SSH-browser type 选择SCP(enhanced speed) 勾选Follow SSH path

人体行走电压测试仪的使用说明

人体行走电压测试仪是一种用于测试人体静电电压的仪器,通常由控制单元、传感器、显示屏等组成。以下是人体行走电压测试仪的使用说明: 连接电源:将测试仪的电源线插入电源插座,并将另一端插入测试仪的电源接口。 连接传感器&…

SpringMVC之框架搭建开发实例请求的处理流程

什么是springmvc Spring Web MVC是一种基于Java的实现了MVC设计模式的、请求驱动类型的、轻量级Web框架。 项目中加入springmvc支持 导入依赖 <properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.sourc…

应用在汽车发动机温度检测中的高精度温度传感芯片

汽车发动机是为汽车提供动力的装置&#xff0c;是汽车的心脏&#xff0c;决定着汽车的动力性、经济性、稳定性和环保性。根据动力来源不同&#xff0c;汽车发动机可分为柴油发动机、汽油发动机、电动汽车电动机以及混合动力等。 常见的车用温度传感器有进气温度传感器、变速器…

面试常考数据结构:红黑树、B树、B+树各自适用的场景

1. 磁盘基础知识 分页&#xff1a; 现代操作系统都使用虚拟内存来印射到物理内存&#xff0c;内存大小有限且价格昂贵&#xff0c;所以数据的持久化是在磁盘上。虚拟内存、物理内存、磁盘都使用页作为内存读取的最小单位。一般一页为4KB&#xff08;8个扇区&#xff0c;每个扇…

eclipse 配置selenium环境

eclipse环境 安装selenium的步骤 配置谷歌浏览器驱动 Selenium安装-如何在Java中安装Selenium chrome驱动下载 eclipse 启动配置java_home&#xff1a; 在eclipse.ini文件中加上一行 1 配置java环境&#xff0c;网上有很多教程 2 下载eclipse&#xff0c;网上有很多教程 ps&…

掌握Python爬虫实现网站关键词扩展提升曝光率

在如今激烈竞争的网络世界中&#xff0c;如何提升网站的搜索曝光率成为了每个站长和营销人员都关注的重要问题。在这方面&#xff0c;Python爬虫可成为您的得力助手&#xff0c;通过扩展网站关键词&#xff0c;更好地满足用户搜索需求&#xff0c;提升网站在搜索引擎中的曝光率…

小视频APP源码定制化攻略:让你的短视频应用独树一帜

在当今流行的短视频应用市场中&#xff0c;为了突出个性和赢得用户青睐&#xff0c;许多人采用定制化小视频APP源码的方式&#xff0c;以创建独特的平台。本文将教你如何定制化小视频APP源码&#xff0c;让你的短视频应用在竞争激烈的市场中独树一帜。 1. 理解小视频APP源码的…

PyTorch 深度学习之多分类问题Softmax Classifier(八)

1. Revision: Diabetes dataset 2. Design 10 outputs using Sigmoid? 2.1 Output a Distribution of prediction with Softmax 2.2 Softmax Layer Example, 2.3 Loss Function-Cross Entropy Cross Entropy in Numpy Cross Entropy in PyTorch 注意交叉熵损失&#xff0c;最…