Msa类处理多序列比对数据

2023-11-08 17:12
文章标签 数据 处理 序列 msa

本文主要是介绍Msa类处理多序列比对数据,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

详细介绍:

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

A3M格式文件示例:

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

Stockholm格式文件示例:

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: DeletionMatrixdescriptions: 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 thesame order as the sequences."""sequences = []descriptions = []index = -1for line in fasta_string.splitlines():line = line.strip()if line.startswith('>'):index += 1descriptions.append(line[1:])  # Remove the '>' at the beginning.sequences.append('')continueelif not line:continue  # Skip blank lines.  sequences[index] += linereturn sequences, descriptionswith 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 thefile should be the query sequence.Returns:A tuple of:* A list of sequences that have been aligned to the query. Thesemight contain duplicates.* The deletion matrix for the alignment as a list of lists. The elementat `deletion_matrix[i][j]` is the number of residues deleted fromthe 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 = 0for j in msa_sequence:if j.islower():deletion_count += 1else:deletion_vec.append(deletion_count)deletion_count = 0deletion_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_lowercasedeletion_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 firstsequence in the file should be the query sequence.Returns:A tuple of:* A list of sequences that have been aligned to the query. Thesemight contain duplicates.* The deletion matrix for the alignment as a list of lists. The elementat `deletion_matrix[i][j]` is the number of residues deleted fromthe aligned sequence i at residue position j.* The names of the targets matched, including the jackhmmer subsequencesuffix."""## 有序字典,保持多序列比对中的序列顺序name_to_sequence = collections.OrderedDict()for line in stockholm_string.splitlines():line = line.strip()# 去除空行和注释行if not line or line.startswith(('#', '//')):continuename, sequence = line.split()if name not in name_to_sequence:name_to_sequence[name] = ''name_to_sequence[name] += sequencemsa = []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 queryquery = sequencekeep_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 += 1else:deletion_vec.append(deletion_count)deletion_count = 0deletion_matrix.append(deletion_vec)return Msa(sequences=msa,deletion_matrix=deletion_matrix,descriptions=list(name_to_sequence.keys()))with open("test_aln.stockholm") 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]

这篇关于Msa类处理多序列比对数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/371309

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言