python - 在字符串中搜索最近的序列
问题描述
在给定参考基因组的情况下,我需要将 contigs 转换为它们各自的蛋白质序列(即,我需要获取一个子字符串,其位置在字符串上已知,并且我需要找到最近的起始和终止密码子 - 一个特定的 3 个字母序列写在代码中)。
这很棘手,因为有时重叠群的第一个位置不会是三的倍数(即重叠群中的前三个核苷酸可能与密码子不完全匹配)。此外,有时重叠群可能位于基因间区域(即基因之间)。目标是分离编码和非编码 DNA。
到目前为止,这是我的代码:
from Bio.Seq import Seq
from Bio.Alphabet import generic_dna, generic_protein
start_codons = ['ATG']
stop_codons = ['TAG', 'TAA', 'TGA']
string = 'GG*TAG*CCAATT*ATG*AACGAA*TAG*GAC' #remove '*', just for visual
contigs = ['CCAA', 'TGAAC', 'GAA', 'GGAC']
positions = [5, 12, 17, 22] #position indices for each contig on string
extended_contigs = []
extended_position_contigs = []
intergenic_contigs = []
intergenic_position_contigs = []
for i in contigs:
extended_contigs.append(#some code)
extended_positions_contigs.append(#some code)
intergenic_contigs.append(#some code)
intergenic_positions_contigs.append(#some code)
我应该得到extended_contigs = ['ATGAAC', 'ATGAACGAA']
和extended_positions_contigs = [12, 17]
。这些是位于基因内的重叠群。为了将它们编码成肽,我需要回到字符串中,直到找到起始密码子并扩展初始重叠群(例如TGAAC
->ATGAAC
和GAA
-> ATGAACGAA
)
我也应该得到intergenic_contigs = ['CCAA', 'GGAC']
and intergenic_positions_contigs = [5, 22]
。当丢失的代码运行时,计算机搜索字符串的左侧并TAG
在起始密码子之前找到一个终止密码子(例如 )。因此,重叠群位于两个基因之间,无需添加任何内容。这些基因间重叠群只是存储在一个新列表中。
我的代码继续:
prot_contigs = []
for i in extended_contigs:
my_dna = Seq(i, generic_dna)
my_prot = my_dna.translate()
prot_contigs.append(str(my_prot))
在这里,不需要添加新代码。以上运行后,prot_contigs = ['MN', 'MNE']
.
代码的最后一步(我需要帮助)将转换prot_contigs
为new_prot_contigs = ['MN', 'E']
.
如何?如果对于任何重叠群(例如'TGAAC'
),开头或结尾是另一个密码子的一部分(不是 3 的完美倍数),则将保留两端的额外密码子(例如'MN'
保持'MN'
)。否则,如果重叠群(例如'GAA'
)与密码子完全匹配,则添加到其上的任何内容都将被删除(例如'MNE'
变为'E'
)。
我会尝试自己解决代码的 2 部分,但我不确定如何在字符串上占据一个位置(即 contig 的起始点)并沿着字符串查找最近的起始/终止密码子,所以我可以确定DNA 的功能和准确地将蛋白质编码重叠群测序成肽。
任何帮助,将不胜感激!
解决方案
这个答案之前好像已经回答过了
但是你真的不需要自己这样做(除非你真的想这样做)。有很多工具可以轻松做到这一点。EMBOSS 套件中的一个示例。
getorf -find 3 genome.fna genome.orf
我想如果您在 Windows 系统上执行此操作会更加棘手,但请考虑在 virtualbox 环境中执行此操作。如今,大多数生物信息学都是在 Unix 系统上完成的。
推荐阅读
- javascript - Openlayers 5 如何观察 view.center 的变化
- html - 您可以使用 selected="selected" 在加载时自动选择 selectize.js 吗?
- php - 快速单击链接会导致注销(会话锁定?)
- java - 如何在列表中的每第 n 个位置添加新行?
- azure - Azure Service Bus Subscription Filter on message body
- java - 如何检测 ScrollPane 何时完成滚动
- python - 布尔语句的困难
- yocto - Yocto / Bitbake 是否有用于食谱的“推土机”变量?
- reactjs - 异步/等待防止第二个承诺执行
- vb.net - Vb.net 不按任何特定顺序搜索字符串