2025 - AIDD - python的autodock vina 批量分子对接改进版本2.0-全自动对接,完全全自动对接

2025 - AIDD - python的autodock vina 批量分子对接改进版本2.0-全自动对接,完全全自动对接

import warnings
from pathlib import Path
import subprocess
from itertools import product
import numpy as np
import pandas as pd
from MDAnalysis import Universe
from openbabel import pybel
import os
import requests  # 用于下载文件# 清楚 warning 信息# Filter warnings
warnings.filterwarnings("ignore")# 设置工作目录
HERE = Path(os.getcwd())
DATA = HERE / 'data'
DATA.mkdir(parents=True, exist_ok=True)# CSV 文件路径
RESULT_CSV = DATA / 'result_dock.csv'# 初始化 CSV 文件
if not RESULT_CSV.exists():pd.DataFrame(columns=['pdb', 'ligand_resnames', 'smiles', 'dock_info']).to_csv(RESULT_CSV, index=False)class Structure(Universe):"""Core object to load structures with."""@classmethoddef from_string(cls, pdb_path):"""Load a structure from a local PDB file."""return cls(pdb_path)def download_pdb(pdb_id, save_path):"""从 RCSB PDB 数据库下载 PDB 文件."""url = f"https://files.rcsb.org/download/{pdb_id}.pdb"response = requests.get(url)if response.status_code == 200:with open(save_path, "wb") as file:file.write(response.content)print(f"{pdb_id} 下载成功.")else:raise ValueError(f"无法下载 {pdb_id}: {response.status_code}")# 提取蛋白质并保存为 PDB 格式
def extract_protein_to_pdb(structure, protein_path):"""Extract protein from structure and save it as PDB."""protein = structure.select_atoms("protein")protein.write(str(protein_path))# 自动检测所有配体残基
def find_all_ligand_resnames(structure):"""返回所有非蛋白质和非水分子的残基名称列表"""ligand_atoms = structure.select_atoms("not protein and not resname HOH")return list(set(ligand_atoms.resnames))def pdb_to_pdbqt(pdb_path, pdbqt_path, pH=7.4):"""Convert a PDB file to a PDBQT file."""molecule = list(pybel.readfile("pdb", str(pdb_path)))[0]molecule.OBMol.CorrectForPH(pH)molecule.addh()for atom in molecule.atoms:atom.OBAtom.GetPartialCharge()molecule.write("pdbqt", str(pdbqt_path), overwrite=True)def smiles_to_pdbqt(smiles, pdbqt_path, pH=7.4):"""Convert a SMILES string to a PDBQT file."""molecule = pybel.readstring("smi", smiles)molecule.OBMol.CorrectForPH(pH)molecule.addh()molecule.make3D(forcefield="mmff94s", steps=10000)for atom in molecule.atoms:atom.OBAtom.GetPartialCharge()molecule.write("pdbqt", str(pdbqt_path), overwrite=True)def run_smina(ligand_path, protein_path, out_path, pocket_center, pocket_size):"""Perform docking with Smina."""output_text = subprocess.check_output(["smina","--receptor", str(protein_path),"--ligand", str(ligand_path),"--out", str(out_path),"--center_x", str(pocket_center[0]),"--center_y", str(pocket_center[1]),"--center_z", str(pocket_center[2]),"--size_x", str(pocket_size[0]),"--size_y", str(pocket_size[1]),"--size_z", str(pocket_size[2])])return output_text.decode("utf-8")def parse_dock_info(dock_output):"""解析 Smina 输出中的对接信息"""dock_lines = dock_output.splitlines()dock_data = []capture = Falsefor line in dock_lines:if "mode" in line and "affinity" in line:  # 开始捕获表格数据capture = Truecontinueif capture:if line.strip() == "" or "Refine time" in line or "Loop time" in line:breakdock_data.append(line.strip())return "\n".join(dock_data)def split_sdf_file(sdf_path):"""Split an SDF file into separate files for each molecule."""sdf_path = Path(sdf_path)stem = sdf_path.stemparent = sdf_path.parentmolecules = pybel.readfile("sdf", str(sdf_path))for i, molecule in enumerate(molecules, 1):molecule.write("sdf", str(parent / f"{stem}_{i}.sdf"), overwrite=True)pdb_list = pd.read_csv('data/pdb.csv')['pdb_id']
# 读取 data 里面的 pic50_greater_equal_9.0.csv 文件,获取其中的 SMILES,前面的 20 个
smiles_list = pd.read_csv('data/pic50_greater_equal_9.0.csv')['smiles'][:20]# 遍历所有 PDB 和 SMILES 的笛卡尔积
for pdb_id, smiles in product(pdb_list, smiles_list):# 创建每个 PDB 的独立目录pdb_dir = DATA / f"data_{pdb_id}"pdb_dir.mkdir(parents=True, exist_ok=True)# 定义 PDB 文件路径pdb_path = pdb_dir / f"{pdb_id}.pdb"# 如果 PDB 文件不存在,则从 RCSB 下载if not pdb_path.exists():print(f"{pdb_id} 文件不存在,正在下载...")download_pdb(pdb_id, pdb_path)# 加载结构structure = Structure.from_string(pdb_path)# 提取并保存蛋白质部分protein_path = pdb_dir / "protein.pdb"extract_protein_to_pdb(structure, protein_path)# 转换蛋白质为 PDBQT 格式protein_pdbqt_path = pdb_dir / "protein.pdbqt"pdb_to_pdbqt(protein_path, protein_pdbqt_path)# 检测所有 ligandall_ligands = find_all_ligand_resnames(structure)# all_ligands[0]变为shape为(1,)的数组,方便后续循环# all_ligands = ["VX6"]print(f"{pdb_id} - Detected Ligands: {all_ligands}")# 对所有 ligand 进行处理for ligand_resname in all_ligands:# 创建 ligand-specific 子目录ligand_dir = pdb_dir / f"ligand_{ligand_resname}"ligand_dir.mkdir(parents=True, exist_ok=True)# 自动检测口袋中心和大小ligand = structure.select_atoms(f"resname {ligand_resname}")print(f"Processing {pdb_id} {smiles} {ligand_resname}")pocket_center = (ligand.positions.max(axis=0) + ligand.positions.min(axis=0)) / 2pocket_size = ligand.positions.max(axis=0) - ligand.positions.min(axis=0) + 5# 创建针对 SMILES 的子目录smiles_hash = smiles.replace("(", "").replace(")", "").replace("=", "").replace("-", "").replace("/","").replace("\\", "").replace(".", "").replace(",", "").replace(":", "")smiles_dir = ligand_dir / f"smiles_{smiles_hash}"smiles_dir.mkdir(parents=True, exist_ok=True)# 定义文件路径ligand_path = smiles_dir / "ligand.pdbqt"docking_out_path = smiles_dir / "ligand_docking.sdf"log_path = smiles_dir / "docking_log.txt"# 转换配体为 PDBQT 格式smiles_to_pdbqt(smiles, ligand_path)# 运行对接并保存日志docking_output = run_smina(ligand_path, protein_pdbqt_path, docking_out_path, pocket_center, pocket_size)with open(log_path, "w") as log_file:log_file.write(f"PDB: {pdb_id}\nSMILES: {smiles}\nLigand Resname: {ligand_resname}\n")log_file.write(f"Pocket Center: {pocket_center}\nPocket Size: {pocket_size}\n\nDocking Output:\n")log_file.write(docking_output)# 拆分 SDF 文件split_sdf_file(docking_out_path)# 提取对接结果并更新到 CSVdock_info = parse_dock_info(docking_output)new_row = {'pdb': pdb_id, 'ligand_resnames': ligand_resname, 'smiles': smiles, 'dock_info': dock_info}result_df = pd.read_csv(RESULT_CSV)result_df = pd.concat([result_df, pd.DataFrame([new_row])], ignore_index=True)# 保存更新的结果到 CSV 文件result_df.to_csv(RESULT_CSV, index=False)print("Docking workflow completed successfully!")

在这里插入图片描述

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

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

相关文章

【uniapp】轮播图

前言 Uniapp的swiper组件是一个滑块视图容器组件&#xff0c;可以在其中放置多个轮播图或滑动卡片。它是基于微信小程序的swiper组件进行封装&#xff0c;可以在不同的平台上使用&#xff0c;如微信小程序、H5、App等。 效果图 前端代码 swiper组件 <template><vi…

由于导包而引发的错误

今天在调试时发现删除功能无论如何都无法实现&#xff0c;于是调试找到了mapper层的错误但不知道为什么报错。以下是报错信息。 Caused by: org.apache.ibatis.binding.BindingException: Parameter userIds not found. Available parameters are [arg0, collection, list]at o…

STM32 ADC --- 知识点总结

STM32 ADC — 知识点总结 文章目录 STM32 ADC --- 知识点总结cubeMX中配置注解单次转换模式、连续转换模式、扫描模式单通道采样的情况单次转换模式&#xff1a;连续转换模式&#xff1a; 多通道采样的情况禁止扫描模式&#xff08;单次转换模式或连续转换模式&#xff09;单次…

Web day02 Js Vue Ajax

目录 1.javascript: 1.js的引入方式&#xff1a; 2.js变量 & 数据类型 & 输出语句&#xff1a; 模板字符串&#xff1a; 3.函数 & 自定义对象&#xff1a; 4. json 字符串 & DOM操作&#xff1a; 5. js事件监听&#xff1a; 6.js的模块化导入或者导出&a…

Kylin Server V10 下 RocketMQ 主备自动切换模式部署

一、NameServer简介 NameServer 是一个注册中心,提供服务注册和服务发现的功能。NameServer 可以集群部署,集群中每个节点都是对等的关系,节点之间互不通信。 服务注册 Broker 启动的时候会向所有的 NameServer 节点进行注册,注意这里是向集群中所有的 NameServer 节点注册…

芯片测试-RF中的S参数,return loss, VSWR,反射系数,插入损耗,隔离度等

RF中的S参数&#xff0c;return loss, VSWR&#xff0c;反射系数&#xff0c;插入损耗&#xff0c;隔离度 &#x1f4a2;S参数&#x1f4a2;&#x1f4a2;S11与return loss&#xff0c;VSWR&#xff0c;反射系数&#x1f4a2;&#x1f4a2;S21&#xff0c;插入损耗和增益&#…

一个开源轻量级的服务器资源监控平台,支持告警推送

大家好&#xff0c;今天给大家分享一款开源的轻量级服务器资源监控工具Beszel&#xff0c;提供历史数据记录、Docker容器统计信息监控以及多种警报功能&#xff0c;用于监控服务器资源。 项目介绍 Beszel由hub&#xff08;中心服务器端应用&#xff0c;基于PocketBase构建&…

linux centos nginx编译安装

编译安装nginx&#xff08;Centos&#xff09; 编译需要的基础环境yum -y install pcre-devel openssl openssl-devel gd-devel gcc gcc-c1.下载nginx源码包 Nginx源码包下载地址&#xff1a;nginx源码包下载 2. 上传nginx源码包到服务器 我上传的地址是/home/chenhao/nginx…

【面试重难点问题】c++中为什么可以函数重载,但是c语言中不可以

本文章是对于“c中为什么可以函数重载&#xff0c;但是c语言中不可以”这个问题的探究&#xff1a; 当然这是一个值得深入探讨的问题。在面对难题时&#xff0c;我们常常会竭尽全力寻找答案&#xff0c;不惜挖掘三尺以探究竟。面对上面这个问题时&#xff0c;理解计算机系统的…

AI实践项目——图片视频自动上色系统,让旧照片焕然一新

1.主要内容 &#xff08;1&#xff09;项目概述 在图片处理的世界中&#xff0c;AI不仅用于识别和分析&#xff0c;还可以赋予灰度照片色彩&#xff0c;为其注入新的生命。今天&#xff0c;我们将探讨一种通过深度学习模型为灰度图片上色的技术。 ①参考文献 Colorful Image…

评分规则的建模,用户全选就是满分10分(分数可自定义), 选2个5分, 选2个以下0分

子夜(603***854) 15:11:40 和各位讨论一下设计问题: 有个有业务场景: 有一组产品共4个产品(数目用户可自定义), 需要一套规则,比如如果用户全选就是满分10分(分数可自定义), 选2个5分, 选2个以下0分 又比如另一组产品 产品有个必选属性,如果选了其中所有的必选则5分, 其他项每1…

计算机网络:数据链路层(二)

网课资源&#xff1a; 湖科大教书匠 1、网络适配器和MAC地址 习题1 1 以下哪个地址是广播MAC地址 A. 00-00-00-00-00-00 B. AB-CD-EF-11-22-33 C. FF-FF-FF-FF-FF-FF D. 29-29-29-29-29-29 2 以下哪个地址是多播MAC地址 A. 00-00-00-00-00-00 B. A9-8B-7C-6D-5E-4F C. FF-FF-…

# issue 6 网络编程基础

一、网络的物理结构和光纤千兆网络 首先&#xff0c;我们需要知道网络的物理结构——数据是如何从一台机器传输到另外一台机器的 这个过程是非常重要的。现在很多人做软件开发&#xff0c;只会软件角度&#xff0c;这导致讲软件原理头头是道&#xff0c;但是连数据线都不会接&a…

彻底理解quadtree四叉树、Octree八叉树 —— 点云的空间划分的标准做法

1.参考文章&#xff1a; &#xff08;1&#xff09;https://www.zhihu.com/question/25111128 这里面的第一个回答&#xff0c;有一幅图&#xff1a; 只要理解的四叉树的构建&#xff0c;对于八叉树的构建原理类比方法完全一样&#xff1a;对于二维平面内的随机分布的这些点&…

飞塔防火墙只允许国内IP访问

飞塔防火墙只允许国内IP访问 方法1 新增地址对象&#xff0c;注意里面已经细分为中国内地、中国香港、中国澳门和中国台湾 方法2 手动新增国内IP的对象组&#xff0c;目前好像一共有8632个&#xff0c;每个对象最多支持600个IP段

超详细ensp配置VRRP和MSTP协议

一、简介 1、什么是VRRP&#xff1a; &#xff08;1&#xff09;VRRP&#xff08;Virtual Router Redundancy Protocol&#xff09;的概念&#xff1a; VRRP&#xff08;Virtual Router Redundancy Protocol&#xff09;指的是一种实现路由器冗余备份的协议&#xff0c;常用于…

东风破捉妖师横空出世

一.异动拉升实时监测 东风破就像是一个大盘监测平台&#xff0c;是现实版的捉妖师&#xff0c;一旦妖股横空出世&#xff0c;就会在东风破面前原形毕露。东风破AI算法逻辑是监测存在异动拉升的股票&#xff0c;实时分析上证&#xff0c;深证&#xff0c;创业和科创板的股票数据…

Scala—数组(不可变数组Array、可变数组ArrayBuffer)用法详解

Scala集合概述-链接 大家可以点击上方链接&#xff0c;先对Scala的集合有一个整体的概念&#x1f923;&#x1f923;&#x1f923; 在 Scala 中&#xff0c;数组是一种特殊的集合类型&#xff0c;可以是可变的也可以是不可变的。 1. 不可变数组 在 Scala 中&#xff0c;不可变…

数据库期末复习题库

1. Mysql日志功能有哪些? 记录日常操作和错误信息&#xff0c;以便了解Mysql数据库的运行情况&#xff0c;日常操作&#xff0c;错误信息和进行相关的优化。 2. 数据库有哪些备份方法 完全备份&#xff1a;全部都备份一遍表备份&#xff1a;只提取数据库中的数据&#xff0…

TsingtaoAI具身智能高校实训方案通过华为昇腾技术认证

日前&#xff0c;TsingtaoAI推出的“具身智能高校实训解决方案-从AI大模型机器人到通用具身智能”基于华为技术有限公司AI框架昇思MindSpore&#xff0c;完成并通过昇腾相互兼容性技术认证。 TsingtaoAI&华为昇腾联合解决方案 本项目“具身智能高校实训解决方案”以实现高…