PSP - 蛋白质复合物 AlphaFold2 Multimer MSA Pairing 逻辑与优化
欢迎关注我的CSDN:https://spike.blog.csdn.net/
本文地址:https://spike.blog.csdn.net/article/details/134144591

在蛋白质复合物结构预测中,当序列 (Sequence) 是异源多链时,无论是AB,还是AABB,都需要 MSA 配对,即 MSA Pairing。在 MSA 的搜索过程中,按照单链维度进行搜索,通过 MSA Pairing 进行合并,作为特征输入至 Multimer 结构预测。
控制 MSA 数量,包括需要 3 个超参数:
max_msa_crop_size,用于确定 MSA 的长度,默认设置 2048max_msa_clusters,用于确定推理中 MSA 特征的长度,默认设置 252max_extra_msa,用于限制推理中 Extra MSA 特征的长度,默认设置 1024
这 3 个参数,依次设定,从前到后相互包含,可以根据不同情况进行调节,其中 第1个参数 > (第2个参数 + 第3个参数)。
默认单链的搜索文件如下:
bfd_uniref_hits.a3m
mgnify_hits.sto
pdb_hits.sto
uniprot_hits.sto
uniref90_hits.sto
其中 uniref90_hits.sto 用于 MSA Pairing,pdb_hits.sto 用于 模版 (Template) 特征,bfd_uniref_hits.a3m、mgnify_hits.sto、uniref90_hits.sto,用于单链 MSA 特征。我们以 ABAB 格式的 4 链 PDB 进行假设。
优化1:MSA Pairing 默认只使用 uniprot_hits.sto,当数量较少时,可以使用 uniref90_hits.sto 作为补充。
源码 openfold/data/data_pipeline.py,如下:
# ++++++++++ 补充 MSA Pairing 源的逻辑 ++++++++++ #
# 标准的 AF2 Multimer 流程中没用 target_seq,即 target_seq 是 None
# logger.info(f"[CL] target_seq: {target_seq}")
msa = parsers.parse_stockholm(result, query_seq=target_seq)
msa = msa.truncate(max_seqs=self._max_uniprot_hits)msa_extra = parsers.parse_stockholm(result_extra, query_seq=target_seq)
msa_extra = msa_extra.truncate(max_seqs=self._max_uniprot_hits)logger.info(f"[CL] all_seq msa: {len(msa.sequences)}, add uniref msa: {len(msa_extra.sequences)}")
all_seq_features = make_msa_features([msa, msa_extra])
logger.info(f"[CL] all_seq msa: {all_seq_features['msa'].shape}")
# ++++++++++ 补充 MSA Pairing 源的逻辑 ++++++++++ #
优化2:当单链 MSA 数量较少时,使用 uniprot_hits.sto 作为 MSA 的补充。
源码 openfold/data/data_pipeline.py,如下:
# ++++++++++ 补充单链 MSA 序列的逻辑 ++++++++++ #
msa_seq_list = set()
for _, msa in msa_dict.items():for sequence_index, sequence in enumerate(msa.sequences):msa_seq_list.add(sequence)
msa_seq_list = list(msa_seq_list)
thr = 64 # 这影响没有 pairing 的序列,数值不宜过大
msa_size = len(msa_seq_list)
if msa_size < thr and uniprot_path:logger.info(f"[CL] single msa too small {msa_size} < {thr} (thr), uniprot_path: {uniprot_path}")with open(uniprot_path) as f:sto_string = f.read()msa_obj = parsers.parse_stockholm(sto_string)msa_seq_list += msa_obj.sequencesmsa_seq_list = list(set(msa_seq_list))diff_size = len(msa_seq_list) - msa_sizelogger.info(f"[CL] single msa from {msa_size} to {len(msa_seq_list)}, add {diff_size}")if diff_size > 0:msa_list.append(msa_obj) # 加入额外的数据
# ++++++++++ 补充单链 MSA 序列的逻辑 ++++++++++ #
优化3:当 MSA Pairing 数量过少时,尤其是 全链 Pairing 数量过少时,使用 其他物种 的 MSA 作为 MSA Pairing 的补充。
源码 openfold/data/msa_pairing.py,如下:
# ++++++++++ 补充 MSA Pairing 的逻辑 ++++++++++ #
thr = 128
num_all_pairing = len(tmp_dict1[num_examples])
if num_all_pairing < thr:logger.info(f"[CL] full msa pairing ({num_examples} chains) is too little ({num_all_pairing}<{thr}), "f"so add more!")tmp_dict2 = process_species(num_examples, common_species, all_chain_species_dict, prokaryotic, is_fake=True)# all_paired_msa_rows_dict = tmp_dict2tmp_item = list(tmp_dict1[num_examples]) + list(tmp_dict2[num_examples]) # 增补部分 MSAtmp_item = np.unique(tmp_item, axis=0) # 先去重tmp_item = tmp_item[:thr] # 再截取if len(tmp_item) > num_all_pairing:all_paired_msa_rows_dict[num_examples] = tmp_itemlogger.info(f"[CL] full msa pairing ({num_examples} chains) add to {len(tmp_item)}! ")
# ++++++++++ 补充 MSA Pairing 的逻辑 ++++++++++ #
假设序列是 AABB,顺序不重要,也可以是 ABAB,链式是 N c N_{c} Nc,MSA Pairing 只考虑 msa_all_seq 字段 (uniprot_hits 和 uniref90_hits 优化),即,A 链包括 MSA 数量是 L A L_{A} LA,B 链包括 MSA 数量是 L B L_{B} LB,MSA Pairing 数量是 L P a b L_{P_{ab}} LPab 。其中 MSA Pairing 包括 2 至 N c N_{c} Nc 个,例如 4 链,就是可以 Pairing 成2链、3链、4链等 4 种情况,只有 1 链时,被抛弃。
源码 openfold/data/msa_pairing.py,即:
# Skip species that are present in only one chain.
if species_dfs_present <= 1:continue
在 MSA Pairing 的过程中,修改 msa_all_seq 字段的 MSA 顺序,同时去除 只有 1 链 (没有配对) 的情况,假设最终 MSA Pairing 的数量是 L P a b L_{P_{ab}} LPab,全部链都是相同的,填补空位。
通过 msa_pairing.merge_chain_features() 函数,将单链 MSA 的合并至一起,即 bfd_uniref_hits.a3m、mgnify_hits.sto、uniref90_hits.sto 的全部 MSA,组成 msa 字段特征。其中 MSA 参数1 即 max_msa_crop_size,表示合并 MSA 的最大数量。例如 链 A 的 msa_all_seq 数量是 900,最大是 2048,则 单链 msa 字段的数量最多是 1148,其余随机舍弃,即1148+900=2048。
源码 openfold/data/msa_pairing.py,注意 feat_all_seq 在前,feat 在后,即 MSA Pairing 更重要,即:
def _concatenate_paired_and_unpaired_features(example: pipeline.FeatureDict,
) -> pipeline.FeatureDict:"""Merges paired and block-diagonalised features."""features = MSA_FEATURESfor feature_name in features:if feature_name in example:feat = example[feature_name]feat_all_seq = example[feature_name + "_all_seq"]merged_feat = np.concatenate([feat_all_seq, feat], axis=0)example[feature_name] = merged_featexample["num_alignments"] = np.array(example["msa"].shape[0], dtype=np.int32)return example
通过 openfold/data/data_transforms_multimer.py 函数,将输入的 msa 特征 (合并 msa 和 msa_all_seq) 进行截取,先截取 max_seq,再截取 max_extra_msa_seq,即第 2 个和第 3 个参数,max_msa_clusters 和 max_extra_msa,作为最终的训练或推理 msa 特征。
logits += cluster_bias_mask * inf
index_order = gumbel_argsort_sample_idx(logits, generator=g)
logger.info(f"[CL] truly use msa raw size: {len(index_order)}, msa: {max_seq}, extra_msa: {max_extra_msa_seq}")
sel_idx = index_order[:max_seq]
extra_idx = index_order[max_seq:][:max_extra_msa_seq]for k in ["msa", "deletion_matrix", "msa_mask", "bert_mask"]:if k in batch:batch["extra_" + k] = batch[k][extra_idx]batch[k] = batch[k][sel_idx]
通过不同的训练模型,与不同的参数,进行蛋白质复合物的结构预测。
相关文章:
PSP - 蛋白质复合物 AlphaFold2 Multimer MSA Pairing 逻辑与优化
欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/134144591 在蛋白质复合物结构预测中,当序列 (Sequence) 是异源多链时,无论是AB,还是AABB,都需要 …...
C++中vec.size()-1的坑
问题描述:如下代码, #include <iostream> #include <vector>using namespace std;int main() {vector<int> vec {};for (int i 0; i < vec.size() - 1; i) {cout << "i " << i << ", vec[i] …...
Flask Shell 操作 SQLite
一、前言 这段时间在玩Flask Web,发现用Flask Shell去操作SQLite还是比较方便的。今天简单地介绍一下。 二、SQLite SQLite是一种嵌入式数据库,它的数据库就是一个文件,处理速度快,经常被集成在各种应用程序中,在IO…...
Mybatis—XML配置文件、动态SQL
学习完Mybatis的基本操作之后,继续学习Mybatis—XML配置文件、动态SQL。 目录 Mybatis的XML配置文件XML配置文件规范XML配置文件实现MybatisX的使用 Mybatis动态SQL动态SQL-if条件查询 \<if\>与\<where\>更新员工 \<set\>小结 动态SQL-\<forea…...
excel求差公式怎么使用?
利用excel求差,可能有许多的小伙伴已经会了,不过还是存在一些不太熟悉的朋友们,所以这里有必要讲解一下。其实求差的实现主要就是一个公式,就是用一个单元格中的数字“减去”另一个单元格中的数字“等于”第三个单元格。此公式掌握…...
高效分割分段视频:提升您的视频剪辑能力
在数字媒体时代,视频剪辑已经成为一项重要的技能。无论是制作个人影片、广告还是其他类型的视频内容,掌握高效的视频剪辑技巧都是必不可少的。本文将介绍如何引用云炫AI智剪高效地分割和分段视频,以提升您的视频剪辑能力。以下是详细的操作步…...
【c++|opencv】二、灰度变换和空间滤波---2.直方图和均衡化
every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 图像直方图、直方图均衡化 1. 图像直方图 #include <iostream> #include <opencv2/opencv.hpp>using namespace cv; using namespace std;…...
【Windows】线程同步之信号量(Semaphores)
概述: semaphores 的说明和使用 微软官方文档: Semaphore Objects - Win32 apps | Microsoft Learn Semaphores是解决各种 producer/consumer问题的关键要素。这种问题会存有一个缓冲区,可能在同一时间内被读出数据或被写入数据。 理论可以证…...
二叉树问题——前中后遍历数组构建二叉树
摘要 利用二叉树的前序,中序,后序,有序数组来构建相关二叉树的问题。 一、构建二叉树题目 105. 从前序与中序遍历序列构造二叉树 106. 从中序与后序遍历序列构造二叉树 889. 根据前序和后序遍历构造二叉树 617. 合并二叉树 226. 翻转二…...
Java保留n位小数的方法(超简洁)
要输出double类型保留n位小数的几种方法如下: 我们以保留6位小数为例 方法一:使用DecimalFormat类 import java.text.DecimalFormat;public class Main {public static void main(String[] args) {double number 3.141592653589793;DecimalFormat df …...
JavaEE-博客系统1(数据库和后端的交互)
本部分内容包括网站设计总述,数据库和后端的交互; 数据库操作代码如下: -- 编写SQL完成建库建表操作 create database if not exists java_blog_system charset utf8; use java_blog_system; -- 建立两张表,一个存储博客信息&am…...
【unity/vufornia】Duplicate virtual buttons with name.../同一个ImageTarget上多个按钮失灵
问题:在同一个ImageTarget上添加多个按钮时无法触发对应按钮的事件。 解决过程: 1.查看报错:“Duplicate virtual buttons with name...”这一行,顾名思义,命名重复。 2.英文搜索到以下文章,应该在inspe…...
Apache ActiveMQ 远程代码执行漏洞复现(CNVD-2023-69477)
Apache ActiveMQ 远程代码执行RCE漏洞复现(CNVD-2023-69477) 上周爆出来的漏洞,正好做一下漏洞复现,记录一下 1.漏洞描述 Apache ActiveMQ 中存在远程代码执行漏洞,具有 Apache ActiveMQ 服务器TCP端口ÿ…...
项目管理-科学管理基础-线性规划介绍及例题
项目管理中的线性规划是什么? 在项目管理中,线性规划是一种数学建模和优化技术,用于解决资源分配和进度规划的问题。线性规划的目标是在给定的资源限制下,找到最佳的资源分配方案,以满足项目的需求并优化特定的目标,如成本最小化或时间最短化。 线性规划的基本元素包括…...
如何利用自定义数据对象(元数据)实现全场景身份数据治理
在数字化时代背景下,5G、云计算、大数据、物联网、人工智能等技术的发展,为企业数据管理提供了基础技术支撑。数字化浪潮推动企业快速升级迭代,在数据管理和数字化转型过程中,企业内部的数据情况常常错综复杂,并伴随着…...
腾讯云轻量级服务器哪个镜像比较好?
腾讯云轻量应用服务器镜像是什么?镜像就是操作系统,轻量服务器镜像系统怎么选择?如果是用来搭建网站腾讯云百科txybk.com建议选择选择宝塔Linux面板腾讯云专享版,镜像系统根据实际使用来选择,腾讯云百科来详细说下腾讯…...
SC密封件的材料成分
SC密封件也称为轴密封件,是许多机械系统中的关键组件,提供防止润滑剂泄漏和污染物进入的屏障。但SC密封件是由什么材料制成的呢? SC密封型材由带有橡胶涂层的单个金属保持架和带有集成弹簧的主密封唇组成。这种材料的组合为密封件提供了其基本特性&…...
常用 sqlite3 命令
本次将向您讲解 SQLite 编程人员所使用的简单却有用的命令。这些命令被称为 SQLite 的点命令,这些命令的不同之处在于它们不以分号 ; 结束。 让我们在命令提示符下键入一个简单的 sqlite3 命令,在 SQLite 命令提示符下,您可以使 用各种 …...
SpringMVC Day 08 : 文件上传下载
前言 文件上传和下载是 Web 开发中的重要环节,但它们往往不那么容易实现。幸运的是,Spring MVC 提供了一套简单而又强大的解决方案,让我们可以专注于业务逻辑,而不必过多关注底层的文件处理细节。 在本篇博客中,我们…...
【热带气旋】基本介绍:定义、标准、结构等
热带气旋基本介绍 热带气旋(Tropical Cyclone, TC)1 热带气旋定义2 热带气旋标准2.1 热带低压(Tropical Depression)2.2 热带风暴(Tropical storm)2.3 强热带风暴(Severe tropical storm&#x…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...
Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换
目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...
android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...
【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...
