PSP - HHblits 算法搜索 BFD 与 UniRef30 的结果分析 (bfd_uniref_hits.a3m)

news2024/12/25 2:36:24

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

HHblits
MMseqs2HHblits 的算法比较:

  • 蛋白质序列搜索算法 MMseqs2 与 HHblits 的搜索结果差异
  • HHblits 算法搜索 BFD 与 UniRef30 的结果分析

Paper: HHblits: lightning-fast iterative protein sequence searching by HMM-HMM alignment

  • 2011.12 Nature Methods

HHblits 是一种基于 HMM-HMM 对齐的迭代蛋白质序列搜索工具,可以快速、灵敏、准确地找到数据库中与查询序列相似的蛋白质序列。HHblits 的主要特点有:

  • 使用隐马尔可夫模型(HMM)来表示查询序列和数据库序列,而不是使用简单的氨基酸序列。HMM 是一种统计模型,可以捕捉序列的进化变化和保守区域,从而提高序列相似性的检测能力。
  • 使用一种离散化的预过滤器,可以快速地筛选出与查询序列有潜在相似性的数据库序列,从而减少了 HMM-HMM 对齐的计算量。这种预过滤器可以将搜索时间提高 2500 倍,而不损失搜索灵敏度。
  • 使用迭代的方法,可以利用上一轮搜索得到的多序列比对(MSA)来构建更精确的查询 HMM,来进行下一轮搜索。这样可以不断地扩展搜索范围,找到更多的相关序列。

bfd_uniref_hits.a3m 中,以 UniRef100 开头的序列描述,即来源于 UniRef30 数据库,即:

>UniRef100_A0A2X3SLP5 Uncharacterized protein n=2 Tax=Streptococcus equi TaxID=1336 RepID=A0A2X3SLP5_STRSZ
-TNtsSQEVDQVAQALELMFDNNVSTSNFKKYVNNNFSDSEIAIAELELESRISNSrsefrvawnemggCIAGKIRDEFFAMISVGTIVKYAQKKAWKELALVVLKFVKANGLKTNAIIVAGQLALWAVQCG

a3m 文件格式是用于表示蛋白质序列比对的文本格式,是 FASTA 格式的一种扩展。在 a3m 文件格式中,蛋白质序列用单个字母表示,其中,匹配用大写字母表示,删除用横线(-) 表示,插入用小写字母表示,去掉小写字母,只保留大写字母与横线(-) ,则长度与目标序列相同。

其他序列就是来源于 BFD,以 SRR 开头的数量较多,即:

>SRR5690606_14355373 
-----QIEELAAQLEFLMEEALiiENGERTfdfEKIENEFgkeVKDEIKMLTVDAQVWqvqpgaitlaanqPWKDCMVGAIKDHFGvALVTAaleGGLWAYLEKKAYKEAAKLLVKF----AVGTNAVGIAGTLIYYGGKCT
...
>SoimicmetaTmtLPB_FD_contig_61_1212631_length_209_multi_1_in_0_out_0_1 # 2 # 76 # 1 # ID=3042713_1;partial=10;start_type=Edge;rbs_motif=None;rbs_spacer=None;gc_cont=0.693
---NEEIEQLAADLEFLMEEAAiydEKGKVVnfdfDLLEERFgYVLELEMLKEEIEAYnattegd--NDeiqlfswksCMISALKGHFGvALIEValtGGLWSYLEKKAYKEAAKLLLKI----GIEGNVIGLTAFLTWYSVDCI
...
>APFre7841882654_1041346.scaffolds.fasta_scaffold441692_2 # 291 # 482 # 1 # ID=441692_2;partial=01;start_type=ATG;rbs_motif=AGGAG;rbs_spacer=5-10bp;gc_cont=0.609
-EIPLEAqgisiFGANHCDGareserliahelAHQWFgnsvtakrwrhiwlhegFACYAEWLWSEHSGdrsaDEWAhhfHEKLASSPQDLLLADPGPRDMFddrvykrgalTLHVLRRTLGDENFFALLKDWTSRHRHGSAVTD------DFTGLAANYTDQSLRPLWDAWLYS--TEVPALDAESX-------------------------------------------------------------------------------------------------------------------
...

因此,使用 MMseqs2 分别搜索 BFD 和 UniRef30,再合并,与使用 HHblits 一起搜索两个库的效果相同,同时也可以计算不同搜索算法的结果差异,即:

  • 测试序列来源于 CASP15 提供的官方序列。
  • MMseqs2 的搜索参数,num_iterations 是 3,sensitivity 是 8,即 i3s8,其余默认。
  • HHblits 使用 AF2 默认的搜索工具,数据库也保持一致。

即:

Img

源码如下:

#!/usr/bin/env python
# -- coding: utf-8 --
"""
Copyright (c) 2022. All rights reserved.
Created by C. L. Wang on 2023/8/1
"""
import os

from myutils.project_utils import read_file
from root_dir import DATA_DIR


class BfdUniref30Overlap(object):
    """
    计算 MMseqs2 与 HHblits 搜索结果之间的重叠度
    """
    def __init__(self):
        pass

    @staticmethod
    def count_seqs(data_lines):
        return len(data_lines) // 2 - 1

    def split_hhblits(self, data_lines):
        """
        拆分 Uniref30 与 BFD 数据
        """
        n = len(data_lines)
        n = n // 2 * 2

        u_desc_list, u_seq_list = [], []
        b_desc_list, b_seq_list = [], []
        for i in range(2, n, 2):
            desc = data_lines[i][1:]
            seq = data_lines[i+1]
            seq = seq.replace("-", "")
            if desc.startswith("UniRef100"):
                desc = desc.split(" ")[0]
                u_desc_list.append(desc)
                u_seq_list.append(seq)
            else:
                items = desc.split("|")
                if len(items) > 1:
                    desc = items[1]
                b_desc_list.append(desc)
                b_seq_list.append(seq)

        unique_u_seq = len(list(set(u_seq_list)))
        unique_u_desc = len(list(set(u_desc_list)))
        print(f"[Info] unique uniref30 desc: {unique_u_desc} / {len(u_desc_list)}")
        print(f"[Info] unique uniref30 seqs: {unique_u_seq} / {len(u_seq_list)}")

        unique_b_seq = len(list(set(b_seq_list)))
        unique_b_desc = len(list(set(b_desc_list)))
        print(f"[Info] unique bfd desc: {unique_b_desc} / {len(b_desc_list)}")
        print(f"[Info] unique bfd seqs: {unique_b_seq} / {len(b_seq_list)}")
        return u_desc_list, u_seq_list, b_desc_list, b_seq_list

    def process(self, uniref30_path, bfd_path, hhblits_path):
        assert os.path.isfile(uniref30_path) and os.path.isfile(bfd_path) and os.path.isfile(hhblits_path)
        print(f"[Info] mmseqs uniref30: {uniref30_path}")
        print(f"[Info] mmseqs bfd: {bfd_path}")
        print(f"[Info] hhblits bfd and uniref30: {hhblits_path}")
        uniref30_lines = read_file(uniref30_path)
        bfd_lines = read_file(bfd_path)
        hhblits_lines = read_file(hhblits_path)
        print(f"[Info] uniref30: {self.count_seqs(uniref30_lines)}, bfd: {self.count_seqs(bfd_lines)}, "
              f"hhblits: {self.count_seqs(hhblits_lines)}")

        # ---------- 统计 MMseqs2 Uniref30 ---------- #
        u_desc_list, u_seq_list = [], []
        n = len(uniref30_lines)
        n = n // 2 * 2
        for i in range(2, n, 2):
            u_name = uniref30_lines[i][1:].split("\t")[0]
            u_seq = uniref30_lines[i+1].replace("-", "")
            assert u_name.startswith("UniRef100")
            u_desc_list.append(u_name)
            u_seq_list.append(u_seq)
        assert len(u_desc_list) == self.count_seqs(uniref30_lines)
        unique_u_seq = len(list(set(u_seq_list)))
        unique_u_desc = len(list(set(u_desc_list)))
        print(f"[Info] unique uniref30 desc: {unique_u_desc} / {len(u_desc_list)}")
        print(f"[Info] unique uniref30 seqs: {unique_u_seq} / {len(u_seq_list)}")
        # ---------- 统计 MMseqs2 Uniref30 ---------- #

        # ---------- 统计 BFD Uniref30 ---------- #
        b_desc_list, b_seq_list = [], []
        n = len(bfd_lines)
        n = n // 2 * 2
        for i in range(2, n, 2):
            b_name = bfd_lines[i][1:].split("\t")[0]
            b_seq = bfd_lines[i+1].replace("-", "")
            b_desc_list.append(b_name)
            b_seq_list.append(b_seq)
        assert len(b_desc_list) == self.count_seqs(bfd_lines)
        unique_b_seq = len(list(set(b_seq_list)))
        unique_b_desc = len(list(set(b_desc_list)))
        print(f"[Info] unique bfd desc: {unique_b_desc} / {len(b_desc_list)}")
        print(f"[Info] unique bfd seqs: {unique_b_seq} / {len(b_seq_list)}")
        # ---------- 统计 BFD Uniref30 ---------- #

        # ---------- 统计 HHblits BFD and Uniref30 ---------- #
        hu_desc_list, hu_seq_list, hb_desc_list, hb_seq_list = self.split_hhblits(hhblits_lines)
        assert len(hu_desc_list) + len(hb_desc_list) == self.count_seqs(hhblits_lines)
        # ---------- 统计 HHblits BFD and Uniref30 ---------- #

        # ---------- 统计 交集 ---------- #
        num_u_desc_is = len(set(u_desc_list).intersection(set(hu_desc_list)))
        print(f"[Info] uniref30 desc intersection: {num_u_desc_is}")
        num_u_seqs_is = len(set(u_seq_list).intersection(set(hu_seq_list)))
        print(f"[Info] uniref30 seqs intersection: {num_u_seqs_is}")

        num_b_desc_is = len(set(b_desc_list).intersection(set(hb_desc_list)))
        print(f"[Info] bfd desc intersection: {num_b_desc_is}")
        num_b_seqs_is = len(set(b_seq_list).intersection(set(hb_seq_list)))
        print(f"[Info] bfd seqs intersection: {num_b_seqs_is}")
        # ---------- 统计 交集 ---------- #

        # ---------- 统计 总数 ---------- #
        unique_mmseqs_seqs = list(set(u_seq_list + b_seq_list))
        unique_hhblits_seqs = list(set(hu_seq_list + hb_seq_list))
        print(f"[Info] unique_mmseqs_ses: {len(unique_mmseqs_seqs)}")
        print(f"[Info] unique_hhblis_ses: {len(unique_hhblits_seqs)}")
        # ---------- 统计 总数 ---------- #


def main():
    fasta_name = "T1104-D1_A117"
    # fasta_name = "T1137s8-D1_A251"
    # fasta_name = "T1188-D1_A573"
    # fasta_name = "T1157s1_A1029"
    uniref30_path = os.path.join(DATA_DIR, "overlap", fasta_name, f"{fasta_name}-uniref30-i3s8.a3m")
    bfd_path = os.path.join(DATA_DIR, "overlap", fasta_name, f"{fasta_name}-bfd-i3s8.a3m")
    hhblits_path = os.path.join(DATA_DIR, "overlap", fasta_name, "bfd_uniref_hits.a3m")
    buo = BfdUniref30Overlap()
    buo.process(uniref30_path, bfd_path, hhblits_path)


if __name__ == "__main__":
    main()

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

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

相关文章

Vulnhub: Wayne Manor:1靶机

kali:192.168.111.111 靶机:192.168.111.172 信息收集 端口扫描 nmap -A -sC -v -sV -T5 -p- --scripthttp-enum 192.168.111.172 根据提示修改hosts文件 访问目标80,在主页发现三组数字,结合端口扫描的结果中21端口被过滤&am…

Java 线程的多种状态

前言 在前文中详细介绍了线程的启动、中断、休眠、等待。本文详细介绍线程的多种状态。 获取线程的当前状态代码是: 线程对象.getState(); 目录 前言 一、NEW 二、RUNNABLE 三、BLOCKED 四、WAITNG 五、TIMED_WAITNG 六、TERMINATED 结语 一、NEW Thread 对…

Your local changes to the following files would be overwritten by checkout

Git 之 Your local changes to the following files would be overwritten by checkout 今天在切换分支时遇到了这样一个问题: 首先翻译下: Your local changes to the following files would be overwritten by checkout 大致意思就是: 当…

中海油集团,建设与中国特色国际一流能源公司相匹配的供应管理体系

近日,由中国物流与采购联合会主办、北京筑龙承办的主题为“数智赋能创新发展”的“第四届国有企业数智化采购与智慧供应链论坛”在北京盛大举行。中国海油工程与物装部供应商管理处处长张彬出席论坛并发表讲话。 张彬处长出席在国有企业数字化采购与供应链论坛&…

电子邮件模板?如何做EDM邮件营销模板?

制作EDM电子邮件推广模板的方法?怎么写EDM电子邮件推销模板? 随着数字化时代的来临,EDM邮件营销模板已成为企业推广和客户沟通的重要工具。在本文中,我将分享一些关于如何制作高效的EDM邮件营销模板的技巧和建议,希望…

Kafka的安装和使用(Windows中)

1.安装Kafka 1.1下载安装包 通过百度网盘分享的文件:复制链接打开「百度网盘APP 即可获取」 链接:https://pan.baidu.com/s/1vC6Di3Pml6k1KMbnK0OE1Q?pwdhuan 提取码:huan 也可以访问官网,下载kafka2.4.0的安装文件 1.2解压…

Linux:shell脚本:基础使用(1)

Shell的作用 命令解释器,“翻译官”,介于系统内核与用户之间,负责解释命令行 用户的登录Shell 登录后默认使用的Shell程序,一般为 /bin/bash 不同Shell的内部指令、运行环境等会有所区别 cat /etc/shells 编写第一个Shell脚本 …

装饰器模式(Decorator)

装饰器模式是一种结构型设计模式,用来动态地给一个对象增加一些额外的职责。就增加对象功能来说,装饰器模式比生成子类实现更为灵活。装饰器模式的别名为包装器(Wrapper),与适配器模式的别名相同,但它们适用于不同的场合。 Decor…

P1219 [USACO1.5] 八皇后 Checker Challenge

题目 思路 非常经典的dfs题&#xff0c;需要一点点的剪枝 剪枝①&#xff1a;行、列&#xff0c;对角线的标记 剪枝②&#xff1a;记录每个皇后位置 代码 #include<bits/stdc.h> using namespace std; const int maxn105; int a[maxn];int n,ans; bool vis1[maxn],vis…

如何使用无线通信设备实现室内外精准定位管理?

巡更功能的意义 电子巡更系统的建立&#xff0c;使巡逻安防工作更加科学合理&#xff0c;使安全管理更加规范化、标准化制度化。例如&#xff0c;当管理人员设置巡更线路&#xff0c;在巡更线路上设置巡更点&#xff0c;通过巡更管理系为巡更人员排班在巡更区域内形成了一张防范…

《Java-SE-第二十三章》之单例模式

文章目录 单例模式概述饿汉模式懒汉模式单线程版懒汉单例多线程版枚举实现单例 单例模式概述 单例模式是设计模式中的一种,其作用能保证某个类在程序中只存在唯一一份实例,而不会创建多份实例。单例模式具体的实现方式, 分成 “饿汉” 和 “懒汉” 两种.。饿汉模式中的饿不并不…

R语言【Tidyverse、Tidymodel】的机器学习方法

机器学习已经成为继理论、实验和数值计算之后的科研“第四范式”&#xff0c;是发现新规律&#xff0c;总结和分析实验结果的利器。机器学习涉及的理论和方法繁多&#xff0c;编程相当复杂&#xff0c;一直是阻碍机器学习大范围应用的主要困难之一&#xff0c;由此诞生了Python…

深入浅出对话系统——大规模开放域对话模型PLATO

引言 今天主要介绍百度退出的大模型开放领域对话模型PLATO的三篇论文&#xff0c;分别对应三个模型。 PLATO 132M parameters8M samples问题&#xff1a;训练稳定性和效率 PLATO-2 1.6B, 314M and 93M parameters684M samples PLATO-XL 11B parameters811M samples for en1.2…

JavaWeb(8)——前端综合案例2(节流和防抖)

目录 一、节流和防抖概念 二、实例演示 三、需要注意的 一、节流和防抖概念 二、实例演示 Lodash 简介 | Lodash中文文档 | Lodash中文网 (lodashjs.com) <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><m…

vivo传便签数据到OPPO新手机上怎么操作

一般来说&#xff0c;一台手机在使用了三年之后&#xff0c;就容易出现各种各样的问题&#xff0c;这时候就需要考虑换手机了。而在更换手机的时候&#xff0c;有相当一部分消费者都会选择更换与旧手机不同品牌的手机使用&#xff0c;例如之前使用的手机是vivo的&#xff0c;现…

【云原生-制品管理】制品管理的优势

制品介绍制品管理-DevOps制品管理优势总结 制品介绍 制品管理指的是存储、版本控制和跟踪在软件开发过程中产生的二进制文件或“制品”的过程。这些制品可以包括编译后的源代码、库和文档&#xff0c;包括操作包、NPM 和 Maven 包&#xff08;或像 Docker 这样的容器镜像&…

Adobe Camera Raw 常用快捷键

戳下方链接&#xff0c;后台回复“230707PS插件”获取相关插件应用 回复“230708PS插件教程”获取教学链接; 回复“230730camera快捷键”获取快捷键链接。 原文链接&#xff1a;https://mp.weixin.qq.com/s/tVNDBPUtKrUtfGmPKJ0Tdw 目标调整工具 作用WindowsmacOS选取目标调整工…

WilliamNing - 电脑办公环境 - 以及个人工作/开发习惯 - Windows/Mac

主要是记录个人的办公环境习惯&#xff0c;方便到新的环境&#xff0c;快速搭建自己熟悉的环境&#xff0c;从而提高工作效率 1. Windows 深圳客友 腾讯外包 家里电脑 TBD 2. Mac SeekAsia[深圳就业网络] Kumu[成都脑海科技] 2.1 桌面软件列表 后调整 -- 加了一些软件 同时…

轻松构建全栈观测,从容应对咖啡产业竞争

1964 年&#xff0c;Tim Hortons 咖啡馆诞生于多伦多的宁静小镇汉密尔顿&#xff0c;由传奇冰球运动员 Tim Horton 先生创立。经过近 60 年的发展&#xff0c;Tim Hortons 已成为全球著名咖啡连锁品牌。在英国权威品牌评估机构 Brand Finance 发布的“全球最有价值的 25 个餐厅…

KVM创建新的虚拟机(图形化)

1.启动kvm管理器 [rootlocalhost ~]# virt-manager2.点击创建虚拟机 3.选择所需os安装镜像 4.选择合适的内存大小和CPU 5.创建所需磁盘 6.命名创建的虚拟机