我正在寻找帮助,以便有效地处理一些高通量DNA测序数据。 数据分为5个文件,每个文件有几十万个序列,每个序列的格式如下:
@ M01102:307:000000000-BCYH3:1:1102:19202:1786 1:N:0:TAGAGGCA + CTCTCTCT
TAATACGACTCACTATAGGGTTAACTTTAAGAGGGAGATATACATATGAGTCTTTTGGGTAAGAAGCCTTTTTGTCTGCTTTATGGTCCTATCTGCGGCAGGGCCAGCGGCAGCTAGGACGGGGGGCGGATAAGATCGGAAGAGCACTCGTCTGAACTCCAGTCACTAGAGGCAATCTCGT
+
AAABBFAABBBFGGGGFGGGGGAG5GHHHCH54BEEEEA5GGHDHHHH5BAE5DF5GGCEB33AF3313GHHHE255D55D55D53 @ 5 @ B5DBD5 @ E / @ //>?/ 1 ?? / / E @ /// FDF0B CC ?? CAAA; --./; / BBE; AFFA ./;/; ; AEA // BFFFF / BB /////; / ..:9999;
我现在正在做的是迭代,检查第一个和最后一个字母是否是DNA序列允许的字符(A / C / G / T或N),然后进行模糊搜索两个引物序列位于我感兴趣的编码序列片段的侧翼。最后一步是出现问题的部分......
当我搜索完全匹配时,我会在合理的时间范围内获得可用数据。但是,我知道由于引物序列中的一个错配,我错过了许多被跳过的数据。发生这种情况是因为读取质量随着长度而降低,因此更难以读取的基础(“N”)突然出现。这在我的分析中不是问题,但是在简单的直接字符串搜索方法中存在问题 - 从DNA角度来看,N应该被允许匹配任何东西,但不是从字符串搜索的角度来看(我不太关心关于插入或删除)。出于这个原因,我试图实现某种模糊或更具生物学意义的搜索方法,但还没有找到一种有效的方法。
我现在所做的工作对测试数据集起作用,但对于全尺寸真实数据集来说太慢了。代码的相关片段是:
from Bio import pairwise2
Sequence = 'NNNNNTAATACGACTCACTATAGGGTTAACTTTAAGAGGGAGATATACATATGAGTCTTTTGGGTAAGAAGCCTTTTTGTCTGCTTTATGGTCCTATCTGCGGCAGGGCCAGCGGCAGCTAGGACGGGGGGCGGATAAGATCGGAAGAGCACTCGTCTGAACTCCAGTCACTAGAGGCAATCTCGT'
fwdprimer = 'TAATACGACTCACTATAGGGTTAACTTTAAGAAGGAGATATACATATG'
revprimer = 'TAGGACGGGGGGCGGAAA'
if Sequence.endswith(('N','A','G','T','G')) and Sequence.startswith(('N','A','G','T','G')):
fwdalign = pairwise2.align.localxs(Sequence,fwdprimer,-1,-1, one_alignment_only=1)
revalign = pairwise2.align.localxs(Sequence,revprimer,-1,-1, one_alignment_only=1)
if fwdalign[0][2]>45 and revalign[0][2]>15:
startIndex = fwdalign[0][3]+45
endIndex = revalign[0][3]+3
Sequence = Sequence[startIndex:endIndex]
print Sequence
(显然在这个例子中不需要第一个条件,但有助于过滤掉没有DNA序列的其他3/4行,因此不需要搜索)
这种方法使用biopython中的成对比对方法,该方法用于发现允许错配的DNA序列的比对。那部分它做得很好,但是因为它需要用两个引物对每个序列进行序列比对,所以它需要太长时间才能实用。我需要做的就是找到匹配的序列,允许一个或两个不匹配。有没有其他方法可以实现我的目标,但在计算上更可行?为了进行比较,以前的版本中的以下代码可以快速完成我的完整数据集:
if ('TAATACGACTCACTATAGGGTTAACTTTAAGAAGGAGATATACATATG' in Line) and ('TAGGACGGGGGGCGGAAA' in Line):
startIndex = Line.find('TAATACGACTCACTATAGGGTTAACTTTAAGAAGGAGATATACATATG')+45
endIndex = Line.find('TAGGACGGGGGGCGGAAA')+3
Line = Line[startIndex:endIndex]
print Line
这不是我经常运行的东西,所以不要介意它是否有点低效,但不想让它运行一整天。我想在几秒钟或几分钟内得到一个结果,而不是几小时。
答案 0 :(得分:1)
tre library提供快速approximate matching功能。您可以使用maxerr
指定不匹配字符的最大数量,如下例所示:
https://github.com/laurikari/tre/blob/master/python/example.py
还有regex module,它支持模糊搜索选项:https://pypi.org/project/regex/#additional-features
此外,您还可以使用简单的正则表达式来允许替换字符,如:
# Allow any character to be N
pattern = re.compile('[TN][AN][AN][TN]')
if pattern.match('TANN'):
print('found')