PSP - AlphaFold2 根据 Species 进行 MSA Pairing 的源码解析

news2024/9/24 13:24:39

欢迎关注我的CSDN:https://spike.blog.csdn.net/
本文地址:https://blog.csdn.net/caroline_wendy/article/details/131399818

MSA Paring

AlphaFold2 Multimer 能够预测多肽链之间相互作用的方法,使用 MSA Pairing 的技术。MSA Pairing 是指通过比较 MSA 来寻找共进化的残基对,这些残基对可能反映了蛋白质之间的接触。AlphaFold2 Multimer 通过计算 MSA Pairing 的得分,来评估不同的多肽链组合的可能性,从而生成最优的三维结构。AlphaFold2 Multimer 提高蛋白质结构预测的准确性和效率,为生物学和医学研究提供了有价值的信息。

官方版本的 AlphaFold2 中 MSA Pairing 的物种信息 (Species) 只处理 uniprot_hits.sto 文件中的信息,其他 MSA 文件不作处理。

1. 解析 sto 文件

stockholm格式是msa的文件格式,解析 sto 文件,提取 MSA 序列和描述,源码如下:

def parse_stockholm(stockholm_string: str):
    """Parses sequences and deletion matrix from stockholm format alignment.

    Args:
    stockholm_string: The string contents of a stockholm file. The first
      sequence in the file should be the query sequence.

    Returns:
    A tuple of:
      * A list of sequences that have been aligned to the query. These
        might contain duplicates.
      * The deletion matrix for the alignment as a list of lists. The element
        at `deletion_matrix[i][j]` is the number of residues deleted from
        the aligned sequence i at residue position j.
      * The names of the targets matched, including the jackhmmer subsequence
        suffix.
    """
    name_to_sequence = collections.OrderedDict()
    for line in stockholm_string.splitlines():
        line = line.strip()
        if not line or line.startswith(('#', '//')):
            continue
        name, sequence = line.split()
        if name not in name_to_sequence:
            name_to_sequence[name] = ''
        name_to_sequence[name] += sequence

    msa = []
    deletion_matrix = []

    query = ''
    keep_columns = []
    for seq_index, sequence in enumerate(name_to_sequence.values()):
        if seq_index == 0:
            # Gather the columns with gaps from the query
            query = sequence
            keep_columns = [i for i, res in enumerate(query) if res != '-']

        # Remove the columns with gaps in the query from all sequences.
        aligned_sequence = ''.join([sequence[c] for c in keep_columns])

        msa.append(aligned_sequence)

        # Count the number of deletions w.r.t. query.
        deletion_vec = []
        deletion_count = 0
        for seq_res, query_res in zip(sequence, query):
            if seq_res != '-' or query_res != '-':
                if query_res == '-':
                    deletion_count += 1
                else:
                    deletion_vec.append(deletion_count)
                    deletion_count = 0
        deletion_matrix.append(deletion_vec)

    return msa, list(name_to_sequence.keys())

stockholm格式文件的描述信息,主要关注于 GS 至 DE 之间的部分,类似 a3m 中的 > 描述:

stockholm

解析出的信息如下:

[Info] sample 173 desc sp|P0C2N4|YSCX_YEREN/1-122, seq MSRIITAPHIGIEKLSAISLEELSCGLPDRYALPPDGHPVEPHLERLYPTAQSKRSLWDFASPGYTFHGLHRAQDYRRELDTLQSLLTTSQSSELQAAAALLKCQQDDDRLLQIILNLLHKV
[Info] species: YEREN
[Info] per_seq_similarity: 1.0
[Info] sample 173 desc tr|A0A0H3NZW9|A0A0H3NZW9_YERE1/1-122, seq MSRIITAPHIGIEKLSAISLEELSCGLPDRYALPPDGHPVEPHLERLYPTAQSKRSLWDFASPGYTFHGLHRAQDYRRELDTLQSLLTTSQSSELQAAAALLKCQQDDDRLLQIILNLLHKV
[Info] species: YERE1
[Info] per_seq_similarity: 1.0
[Info] sample 173 desc sp|A1JU78|YSCX_YERE8/1-122, seq MSRIITAPHIGIEKLSAISLEELSCGLPERYALPPDGHPVEPHLERLYPTAQSKRSLWDFASPGYTFHGLHRAQDYRRELDTLQSLLTTSQSSELQAAAALLKCQQDDDRLLQIILNLLHKV
[Info] species: YERE8
[Info] per_seq_similarity: 0.9918032786885246
[Info] sample 173 desc sp|P61416|YSCX_YERPE/1-122, seq MSRIITAPHIGIEKLSAISLEELSCGLPERYALPPDGHPVEPHLERLYPTAQSKRSLWDFASPGYTFHGLHRAQDYRRELDTLQSLLTTSQSSELQAAAALLKCQQDDDRLLQIILNLLHKV
[Info] species: YERPE
[Info] per_seq_similarity: 0.9918032786885246

2. 提取物种信息

使用序列描述提取物种信息,即|所分割的第3部分中的后半段,源码如下:

  • 例如描述是sp|P0C2N4|YSCX_YEREN/1-122,物种是YEREN
# Sequences coming from UniProtKB database come in the
# `db|UniqueIdentifier|EntryName` format, e.g. `tr|A0A146SKV9|A0A146SKV9_FUNHE`
# or `sp|P0C2L1|A3X1_LOXLA` (for TREMBL/Swiss-Prot respectively).
_UNIPROT_PATTERN = re.compile(
    r"""
    ^
    # UniProtKB/TrEMBL or UniProtKB/Swiss-Prot
    (?:tr|sp)
    \|
    # A primary accession number of the UniProtKB entry.
    (?P<AccessionIdentifier>[A-Za-z0-9]{6,10})
    # Occasionally there is a _0 or _1 isoform suffix, which we ignore.
    (?:_\d)?
    \|
    # TREMBL repeats the accession ID here. Swiss-Prot has a mnemonic
    # protein ID code.
    (?:[A-Za-z0-9]+)
    _
    # A mnemonic species identification code.
    (?P<SpeciesIdentifier>([A-Za-z0-9]){1,5})
    # Small BFD uses a final value after an underscore, which we ignore.
    (?:_\d+)?
    $
    """,
    re.VERBOSE)


def _parse_sequence_identifier(msa_sequence_identifier: str):
    """Gets species from an msa sequence identifier.

    The sequence identifier has the format specified by
    _UNIPROT_TREMBL_ENTRY_NAME_PATTERN or _UNIPROT_SWISSPROT_ENTRY_NAME_PATTERN.
    An example of a sequence identifier: `tr|A0A146SKV9|A0A146SKV9_FUNHE`

    Args:
        msa_sequence_identifier: a sequence identifier.

    Returns:
        An `Identifiers` instance with species_id. These
        can be empty in the case where no identifier was found.
    """
    matches = re.search(_UNIPROT_PATTERN, msa_sequence_identifier.strip())
    if matches:
        return matches.group('SpeciesIdentifier')
    return ""


def _extract_sequence_identifier(description: str):
    """Extracts sequence identifier from description. Returns None if no match."""
    split_description = description.split()
    if split_description:
        return split_description[0].partition('/')[0]
    else:
        return None


def get_identifiers(description: str):
    """Computes extra MSA features from the description."""
    sequence_identifier = _extract_sequence_identifier(description)
    if sequence_identifier is None:
        return ""
    else:
        return _parse_sequence_identifier(sequence_identifier)

3. 计算序列相似度

按照氨基酸一致性百分比计算相似度,完全相同是1.0,源码如下:

def msa_seq_similarity(query_seq, msa_seq):
    """
    MSA 序列相似度
    """
    query_seq = np.array(list(query_seq))
    msa_seq = np.array(list(msa_seq))
    seq_similarity = np.sum(query_seq == msa_seq) / float(len(query_seq))
    return seq_similarity

测试脚本,如下:

class MultimerSpeciesParser(object):
    def __init__(self):
        pass

    def process(self, a_path, b_path):
        assert os.path.isfile(a_path)
        assert os.path.isfile(b_path)
        print(f"[Info] A 链路径: {a_path}")
        print(f"[Info] B 链路径: {b_path}")
        with open(a_path) as f:
            sto_string = f.read()
        a_msa, a_desc = parse_stockholm(sto_string)
        assert len(a_msa) == len(a_desc)
        for i in range(1, 5):
            print(f"[Info] sample {len(a_msa)} desc {a_desc[i]}, seq {a_msa[i]}")
            sid = get_identifiers(a_desc[i])
            print(f"[Info] species: {sid}")
            per_seq_similarity = msa_seq_similarity(a_msa[0], a_msa[i])
            print(f"[Info] per_seq_similarity: {per_seq_similarity}")

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

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

相关文章

C# 实现全局鼠标钩子操作以及发送键盘事件

全局钩子定义 using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading; using System.Threading.Tasks;namespace WindowsFormsApp1 {public static class GlobalMousePositi…

【云原生 | 55】Docker三剑客之Docker Swarm简介和安装

&#x1f341;博主简介&#xff1a; &#x1f3c5;云计算领域优质创作者 &#x1f3c5;2022年CSDN新星计划python赛道第一名 &#x1f3c5;2022年CSDN原力计划优质作者 &#x1f3c5;阿里云ACE认证高级工程师 &#x1f3c5;阿里云开发者社区专…

chatgpt赋能python:Python如何获取激光雷达数据

Python如何获取激光雷达数据 激光雷达数据在机器学习和自动驾驶领域中扮演着重要的角色。Python作为一种功能强大而又易于学习的编程语言&#xff0c;在获取激光雷达数据方面也表现出极高的效率和灵活性。下面我们将介绍如何使用Python获取激光雷达数据。 什么是激光雷达数据…

vue-li问题记录

Starting development server... ERROR ValidationError: webpack Dev Server Invalid Options options should NOT have additional properties options should NOT have additional properties 大概是package.json或者是vue.config.js文件出现类问题&#xff0c;我把这两…

chatgpt赋能python:Python计算BMI-一篇完整的指南

Python 计算BMI - 一篇完整的指南 我们都知道&#xff0c;BMI是身体质量指数的简称&#xff0c;它是以身高和体重计算的一个数值&#xff0c;用来评估一个人的身体状况。在本文中&#xff0c;我们将介绍如何使用Python计算BMI&#xff0c;并提供一些关于BMI的背景知识。 什么…

[Selenium] 通过Java+Selenium查询某个博主的Top100文章质量分

系列文章目录 通过JavaSelenium查询文章质量分 通过JavaSelenium查询某个博主的Top40文章质量分 通过JavaSelenium查询某个博主的Top100文章质量分 文章目录 系列文章目录前言一、环境准备二、查询某个博主的Top100文章2.1、修改pom.xml配置2.2、配置Chrome驱动2.3、引入浏览器…

数据结构C语言版本(下)

第七章 图 第一节 图的定义 一、逻辑结构 1、逻辑结构 ①定义&#xff1a;G(V,E)。V是顶点集&#xff0c;E是顶点间二元关系的集合。 &#xff08;内涵越小&#xff0c;外延越大&#xff09; ②与树的区别&#xff1a; ①树有特殊的根结点&#xff1b; ②树的结点和关系能分成…

津津乐道设计模式 - 桥接模式详解

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

选择C#还是Qt作为上位机开发工具:如何做出最佳决策?

选择C#还是Qt作为上位机开发工具取决于你的具体需求和偏好。以下是一些优化因素供你考虑&#xff1a;跨平台支持&#xff1a;如果你的应用程序需要在多个操作系统上运行&#xff0c;Qt可能是更好的选择&#xff0c;因为它具有强大的跨平台能力。Qt可以帮助你开发具备一致性和可…

演讲实录丨神策数据桑文锋:双引擎赋能数字化客户经营

在「开放融合&#xff0c;引领营销 5.0 新纪元——暨 2023 年金融营销科技价值发现论坛」现场&#xff0c;神策数据创始人 & CEO 桑文锋发表了《双引擎赋能数字化客户经营》的主题演讲&#xff0c;围绕“用户/客户数据平台”和“旅程编排引擎”双引擎做了详细介绍。 本文根…

SpringBoot项目-双人对战五子棋实验报告

简单五子棋Web项目报告 课 程 Web应用程序设计 项目名称 简单双人五子棋对战 成绩 专业班级 XXX 组别 无 学号 XXX 指导教师 XXX 姓 名 XXX 同组人姓名 无 完成日期 XXX 功能描述 1.用户的注册及登录功能 玩家可以在完成游戏账户的注册&#xff0c…

uni-app 数字输入框组件封装

文章目录 前言一、创建数字输入框文件二、制作数字输入框组件三、父组件调用 前言 数字输入框是一个项目中常见的需求&#xff0c;其中的耦合度很高&#xff0c;完全可以将其封装起来使用&#xff0c;在使用的时候传入五个参数&#xff0c;分别为&#xff1a; 最大值最小值默…

RUST 运行是报 linker `link.exe` not found

如下图所示&#xff1a; 解决方法&#xff1a; 第一步&#xff1a; rustup toolchain install stable-x86_64-pc-windows-gnu 第二步&#xff1a; rustup default stable-x86_64-pc-windows-gnu 验证&#xff1a;

关于全局异常提示

项目中客户端请求如果后端出现技术上的bug&#xff0c;会报出网络异常&#xff0c;这对客户是很不友好的&#xff0c;比方说请求参数格式校验&#xff0c;如下&#xff1a; import com.fasterxml.jackson.annotation.JsonFormat; 假如日期格式传的不对&#xff0c;这个注解校验…

I3C协议手册研读-1

0 前言 对于I3C&#xff0c;我觉得有必要仔细分析一下手册&#xff0c;通过博客的方式来进行&#xff0c;可以更好的督促自己进行学习。 本次研读的I3C手册版本如下图所示。 1 介绍 阿兴分析如下&#xff1a; 目前比较成熟的协议有I2C、SPI、USART等&#xff0c;但是因为有一…

网络安全合规-ISO 27701(二)

隐私信息安全管理体系&#xff08;PIMS&#xff09;认证 是在隐私保护方面对 ISO/IEC 27001 和ISO/IEC 27002 的扩展&#xff0c;针对保护可能受到个人信息收集和处理影响的隐私提供了更多相关指南。获得PIMS认证的企业标志着其在保护用户数据和个人信息安全方面符合国际标准IS…

怎么学习和提升后端开发能力? - 易智编译EaseEditing

学习和提升后端开发能力可以通过以下步骤进行&#xff1a; 学习编程语言&#xff1a; 选择一种常用的后端编程语言&#xff0c;如Python、Java、C#等&#xff0c;并深入学习该语言的语法、特性和最佳实践。掌握基本的编程概念和技巧是提升后端开发能力的基础。 学习数据库&am…

微信小程序:期末大作业,毕业设计茶客堂商城微信小程序

1. 项目简介 茶客堂微信小程序是一个为茶叶爱好者提供优质茶叶和茶文化知识的平台。茶作为中国的传统文化&#xff0c;越来越受到各个年龄层的人们的喜爱。而传统的茶叶销售方式有一定的局限性&#xff0c;如茶叶品质无法保证、价格不透明等。茶客堂微信小程序应运而生&#x…

【软考网络管理员】2023年软考网管初级常见知识考点(23)- 路由器的配置

涉及知识点 华为路由器的配置&#xff0c;华为路由器命令大全&#xff0c;软考大纲路由命令&#xff0c;静态路由和动态路由的配置命令&#xff0c;软考网络管理员常考知识点&#xff0c;软考网络管理员网络安全&#xff0c;网络管理员考点汇总。 原创于&#xff1a;CSDN博主-…

GPT快速分区

经过刚刚的“转换分区表类型为GUID格式”设置之后&#xff0c;现在分区的分区表类型已经是GPT格式了。我们设置想要分区的数目&#xff0c;例如我想要分两个区&#xff0c;点击自定选择2个分区&#xff0c;系统C盘分了80G&#xff0c;剩下空间留给了D盘。默认勾选“创建新ESP分…