Msa类处理多序列比对数据

news2024/11/23 20:56:19

同源搜索,多序列比对等都是常用的方式,但是有很多的软件可以实现这些同源搜索和多序列比对,但是不同的软件输出的文件格式却是不完全一致,有熟悉的FASTA格式的,也有A2M, A3M,stockholm等格式。

详细介绍:

https://github.com/soedinglab/hh-suite/wiki#multiple-sequence-alignment-formats

A3M格式文件(.a3m)示例:

  1. 每个序列都以 > 开头的行开始,并包含序列的标识信息。
  2. 在序列标识行之后,是与该序列相关的比对信息,通常使用字母来表示氨基酸或核酸。‘-’表示缺失,小写字母表示插入。

Stockholm格式文件(.sto)示例:

import dataclasses
from typing import Sequence, Tuple
import string
import collections

# Sequence 表示序列类型,内部的 Sequence[int] 表示整数序列。
# DeletionMatrix 表示一个由整数组成的二维数组。
DeletionMatrix = Sequence[Sequence[int]]

### 1. 定义Msa类
# Python中,dataclass 是一个装饰器(Decorator),用于创建称为数据类(data class)的类。
# dataclass 装饰器自动生成一些特殊方法,如 __init__、__repr__、__eq__ 等,
# 减少了编写这些方法的样板代码。
@dataclasses.dataclass(frozen=True)
class Msa:
    """Class representing a parsed MSA file."""
    
    ## 初始化参数
    sequences: Sequence[str]
    deletion_matrix: DeletionMatrix
    descriptions: Sequence[str]

    # __post_init__ 是Python数据类(data class)中的特殊方法,
    # 用于在创建数据类的实例之后进行进一步的初始化操作
    def __post_init__(self):
        if not (len(self.sequences) ==
                len(self.deletion_matrix) ==
                len(self.descriptions)):
            raise ValueError(
                'All fields for an MSA must have the same length. '
                f'Got {len(self.sequences)} sequences, '
                f'{len(self.deletion_matrix)} rows in the deletion matrix and '
                f'{len(self.descriptions)} descriptions.')

    def __len__(self):
        return len(self.sequences)

    def truncate(self, max_seqs: int):
        return Msa(sequences=self.sequences[:max_seqs],
                   deletion_matrix=self.deletion_matrix[:max_seqs],
                   descriptions=self.descriptions[:max_seqs])

m_seq = ["AAALLL","AT-LAL","S-ALLI"] # 多序列比对后的数据

m_del_matrix = [[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0]]


m_descriptions = ["seq1","seq2","seq3"]

# 实例化
test_msa = Msa(m_seq, m_del_matrix, m_descriptions)
print(test_msa)
print(len(test_msa))
# 去除msa第三条序列
print(test_msa.truncate(2))


### 2. 定义函数,解析fasta格式字符串
def parse_fasta(fasta_string: str) -> Tuple[Sequence[str], Sequence[str]]:
    """Parses FASTA string and returns list of strings with amino-acid sequences.

    Arguments:
      fasta_string: The string contents of a FASTA file.

    Returns:
      A tuple of two lists:
      * A list of sequences.
      * A list of sequence descriptions taken from the comment lines. In the
        same order as the sequences.
    """
    sequences = []
    descriptions = []
    index = -1
    for line in fasta_string.splitlines():
        line = line.strip()
        if line.startswith('>'):
            index += 1
            descriptions.append(line[1:])  # Remove the '>' at the beginning.
            sequences.append('')
            continue
        elif not line:
            continue  # Skip blank lines.  
        sequences[index] += line

    return sequences, descriptions

with open("test_aln.a3m") as f:
    a3m_string = f.read()
sequences, description = parse_fasta(a3m_string)

print(sequences)
print(description)


## 多序列比对a3m格式:
## 1. 每个序列都以 > 开头的行开始,并包含序列的标识信息。
## 2.在序列标识行之后,是与该序列相关的比对信息,通常使用字母来表示氨基酸或核酸。
##   ‘-’表示缺失,小写字母表示插入。

### 3.定义函数,解析a3m格式的msa字符串,生成Msa实例,该函数调用parse_fasta函数
def parse_a3m(a3m_string: str) -> Msa:
    """Parses sequences and deletion matrix from a3m format alignment.

    Args:
        a3m_string: The string contents of a a3m 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.
            * A list of descriptions, one per sequence, from the a3m file.
    """
    sequences, descriptions = parse_fasta(a3m_string)
    deletion_matrix = []
    for msa_sequence in sequences:
        deletion_vec = []
        deletion_count = 0
        for j in msa_sequence:
            if j.islower():
                deletion_count += 1
            else:
                deletion_vec.append(deletion_count)
                deletion_count = 0
        deletion_matrix.append(deletion_vec)

    # Make the MSA matrix out of aligned (deletion-free) sequences.
    # string.ascii_lowercase, string模块提供的字符串常量,包含了所有小写字母的 ASCII 字符
    # str.maketrans 是 Python 字符串方法,用于创建一个字符映射表(translation table),
    # ''换成''并删除string.ascii_lowercase
    deletion_table = str.maketrans('', '', string.ascii_lowercase)
    # str.translate 使用映射表执行字符转换(删除小写字母)
    aligned_sequences = [s.translate(deletion_table) for s in sequences]
    return Msa(sequences=aligned_sequences,
               deletion_matrix=deletion_matrix,
               descriptions=descriptions)

with open("test_aln.a3m") as f:
    a3m_string = f.read()

msa1 = parse_a3m(a3m_string)
print(msa1)

### 4.定义函数, 解析stockholm格式的msa字符串,生成Msa实例
def parse_stockholm(stockholm_string: str) -> Msa:
    """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()):
        ## 第一行为query序列
        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
        
        # query序列相对于每一个同源序列,氨基酸位置的缺失情况,累加连续缺失
        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(sequences=msa,
               deletion_matrix=deletion_matrix,
               descriptions=list(name_to_sequence.keys()))
             

with open("test_aln.sto") as f:
    stockholm_string = f.read()
print(stockholm_string)
             
msa2 = parse_stockholm(stockholm_string) 
print(msa2)
 

## 注:parse_stockholm 和 parse_a3m 函数生成Msa对象中,
##    deletion_matrix中在查询序列deletion位置填上缺失的个数,
##    下一个氨基酸位置的0跳过,所以总长度相等
##    如函数输入msa中第一条序列(query序列)为:“A--CE-H”, 则函数输出的第一条序列为:“ACEH”, 
##    deletion_matrix的第一个元素为:[0,2,0,1]

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

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

相关文章

算法进阶指南图论 通信线路

通信线路 思路:我们考虑需要升级的那条电缆的花费,若其花费为 w ,那么从 1 到 n 的路径上,至多存在 k 条路径的价值大于 w ,这具有一定的单调性,当花费 w 越大,我们路径上价值大于 w 的花费会越…

Spring笔记(一)(黑马)(Ioc基础容器)

01、传统Javaweb开发的困惑 1.1 传统Javaweb开发困惑及解决方案 😖问题一:层与层之间紧密耦合在了一起,接口与具体实现紧密耦合在了一起 解决思路:程序代码中不要手动new对象,第三方根据要求为程序提供需要的Bean对象…

SQL Server SSIS的安装

标题SQL SERVER 安装 下载SQL SERVER数据库:(以SQL SERVER 2022 Developer版本)(https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads?rtc1) 以administrator权限安装: 下载完成后,会出现以下界面&a…

docker容器中运行jar 出现invalid or corrupt jarfile

1,背景: 在本地java开发完毕之后,想要打包成docker镜像,方便安装。由于本地没有docker环境,也懒得装了。有一台测试的linux机器可以使用,所以先在本地打包生成xxx.jar,然后拷贝到有docker环境的…

BIM、建筑机器人、隧道工程施工关键技术

一、BIM简介 (一)BIM概念 BIM(Building Information Modeling),建筑信息模型。该技术通过数字化手段,在计算机中建立虚拟建筑,该虚拟建筑提供从单一到完整、包含逻辑关系的建筑信息库。信息库…

11.把学生的信息 (学号,姓名,性别,住址) 放入结构体[???]

#include<stdio.h>struct stu { long int num; //学号 char name[3]; //姓名 char sex; //性别 char add[4]; //地址 }a;int main(){scanf("%ld,%s,%c,%s\n",&a.num,a.name,&a.sex,a.add);printf("%ld,%s,%c,%s\n",a.num,a.name,a.…

Java对象的拷贝与克隆

Java对象的拷贝与克隆 在日常开发中&#xff0c;我们经常需要给对象进行赋值&#xff0c;通常会调用其 set/get 方法&#xff0c;有些时候&#xff0c;为了简化代码&#xff0c;我们会采用第三方工具类进行属性拷贝。但是面对如此多的拷贝工具和方法&#xff0c;其性能差异如何…

yo!这里是STL::unordered系列简单模拟实现

目录 前言 相关概念介绍 哈希概念 哈希冲突与哈希函数 闭散列 框架 核心函数 开散列 框架 核心函数 哈希表&#xff08;开散列&#xff09;的修改 迭代器实现 细节修改 unordered系列封装 后记 前言 我们之前了解过map和set知道&#xff0c;map、set的底层结构是…

亚信科技斩获“鼎新杯”多项大奖!AntDB数据库在信创赛道再创佳绩

近日&#xff0c;第二届“鼎新杯”数字化转型应用大赛全国总决赛在北京落下帷幕&#xff0c;亚信科技成功收获一等奖1项、二等奖1项、三等奖3项、行业标杆奖1项。 “两江协同创新区智慧园区项目&#xff08;二期&#xff09;”斩获两项殊荣 在“行业数字化融合方向-智慧园区”…

Java并发工具-4-并发框架(ExecutorForkJoin)

一 Executor 并发框架介绍 1 整体结构介绍 executor [ɪɡˈzekjətə(r)] 执行者 execute [ˈeksɪkjuːt] 执行 从 JDK 1.5 开始&#xff0c;java 中将工作单元和执行机制做了分离&#xff0c;于是 Executor 并行框架出现。 什么是工作单元&#xff08;或称为任务&#xff…

Leetcode 第 369 场周赛题解

Leetcode 第 369 场周赛题解 Leetcode 第 369 场周赛题解题目1&#xff1a;2917. 找出数组中的 K-or 值思路代码复杂度分析 题目2&#xff1a;2918. 数组的最小相等和思路代码复杂度分析 题目3&#xff1a;2919. 使数组变美的最小增量运算数思路代码复杂度分析 题目4&#xff1…

合并两个有序链表OJ

合并两个有序链表OJ 文章目录 合并两个有序链表OJ一、题目及要求二、思路分析三、代码实现 一、题目及要求 二、思路分析 其次&#xff0c;题目里说了新链表是通过拼接原来的结点形成的&#xff0c;所以说我们不需要开辟新的空间。 三、代码实现 if (list1 NULL) {return li…

在字节4年,一个27岁女软件测试工程师的心路历程

个人经验分享 简单的先说一下&#xff0c;坐标深圳&#xff0c;18届本科毕业&#xff0c;算上在字节的面试&#xff0c;一共有面试了5家公司&#xff08;不想请假&#xff0c;所以只是每个晚上去其他公司面试&#xff0c;面试的公司就比较少&#xff09; 其中面试成功的有3家&…

vue基础知识十八:说说你对keep-alive的理解是什么?

一、Keep-alive 是什么 keep-alive是vue中的内置组件&#xff0c;能在组件切换过程中将状态保留在内存中&#xff0c;防止重复渲染DOM keep-alive 包裹动态组件时&#xff0c;会缓存不活动的组件实例&#xff0c;而不是销毁它们 keep-alive可以设置以下props属性&#xff1a…

js各种简单事件处理(整理)

**## 获取当天昨天日期** // 当天日期 const today new Date();// 格式化当天日期为 YYYY-MM-DD 格式 const formattedToday today.toISOString().slice(0, 10);// 昨天日期 const yesterday new Date(); yesterday.setDate(yesterday.getDate() - 1);// 格式化昨天日期为 Y…

2023年11月在线IDE流行度最新排名

点击查看最新在线IDE流行度最新排名&#xff08;每月更新&#xff09; 2023年11月在线IDE流行度最新排名 TOP 在线IDE排名是通过分析在线ide名称在谷歌上被搜索的频率而创建的 在线IDE被搜索的次数越多&#xff0c;人们就会认为它越受欢迎。原始数据来自谷歌Trends 如果您相…

广和通5G模组FM650助力阿里云打造无影魔方Pro

随着云基础设施的完善及云电脑体验的不断优化&#xff0c;越来越多的个人和企业选择无影云电脑进行办公。基于云原生的云网端技术架构&#xff0c;无影云电脑相比传统PC&#xff0c;具有弹性、安全、保障个人数据等产品优势。 10月31日&#xff0c;阿里云在杭州云栖大会上宣布…

易货:一种古老而新颖的交易方式

在当今快速发展的经济环境中&#xff0c;易货模式正逐渐引起人们的关注。这种古老而新颖的交易方式&#xff0c;不仅为企业提供了新的商业机会&#xff0c;还为消费者带来了更多的选择。本文将详细介绍易货模式的概念、优势以及如何实现易货交易&#xff0c;并探讨这种模式未来…

精解括号匹配问题与极致栈设计:揭开最大栈和最小栈的奥秘

目录 括号匹配问题最小栈最大栈 最大栈和最小栈是极致栈的两个重要变种。最大栈用于存储当前匹配的最大值&#xff0c;而最小栈用于存储当前匹配的最小值。 括号匹配问题 这个问题我们来看力扣20题的描述&#xff1a; 给定一个只包括 ‘(’&#xff0c;‘)’&#xff0c;‘{’…

如何修改文件的修改日期?

如何修改文件的修改日期&#xff1f;文件的修改日期指的是文件最近一次被修改的日期和时间。当文件内容被修改、编辑或更新时&#xff0c;系统会自动更新文件的修改日期。这个日期记录了文件内容的实际修改时间&#xff0c;可以帮助用户了解文件的更新情况以及文件版本的管理。…