[英]choosing reads with Hamming distance zero
我有一個 fastq 文件,比如reads.fastq
。 我有一個7-mer
字符串的列表。 對於reads.fastq
每次讀取,我想檢查它是否至少包含列表中的7-mer
字符串之一。 條件是,如果找到匹配項( hamming distance ==0
),則讀取被寫入數組chosen_reads
並且匹配來自 fastq 文件的下一次讀取。 如果未找到匹配項,則循環繼續直到找到匹配項。 輸出數組由唯一讀取組成,因為一旦找到第一個匹配項,匹配循環就會終止。 我編寫了以下代碼,但輸出數組中的讀取不是唯一的,因為報告了所有與漢明距離為零的匹配項。 請提出修改建議:
def hamming(s1, s2):
#Return the Hamming distance between equal-length sequences
if len(s1) != len(s2):
raise ValueError("Undefined for sequences of unequal length")
return sum(ch1 != ch2 for ch1, ch2 in zip(s1, s2))
for x in Bio.SeqIO.parse("reads.fastq","fastq"):
reads_array.append(x)
nmer = 7
l_chosen = ['gttattt','attattt','tgctagt']
chosen_reads = []
for x in reads_array:
s2 = str(x.seq)
for s in [s2[i:i+nmer] for i in range(len(s2)-nmer-1)]:
for ds in l_chosen:
dist = hamming(ds,s)
if dist == 0:
print s2, s,ds,dist
chosen_reads.append(x)
您當前的代碼在找到漢明距離為 0 的字符串時,不會跳出循環以從reads.fastq
讀取下一個read
,您應該使用標志來決定何時中斷,並在您使用該標志時將該標志指定為 True 值需要突破——
def hamming(s1, s2):
#Return the Hamming distance between equal-length sequences
if len(s1) != len(s2):
raise ValueError("Undefined for sequences of unequal length")
return sum(ch1 != ch2 for ch1, ch2 in zip(s1, s2))
for x in Bio.SeqIO.parse("reads.fastq","fastq"):
reads_array.append(x)
nmer = 7
l_chosen = ['gttattt','attattt','tgctagt']
chosen_reads = []
for x in reads_array:
s2 = str(x.seq)
breakFlag = False
for s in [s2[i:i+nmer] for i in range(len(s2)-nmer-1)]:
for ds in l_chosen:
dist = hamming(ds,s)
if dist == 0:
print s2, s,ds,dist
chosen_reads.append(x)
breakFlag = True
break;
if breakFlag:
break;
並且您確定要將x
附加到chosen_reads
,這似乎是錯誤的,為了獲得唯一匹配,也許您應該附加s2
字符串和匹配的ds
對嗎? 如果這是你想要的,你可以像下面這樣將一個元組附加到chosen_reads
中,而不是你當前的附加邏輯 -
chosen_reads.append((ds, s2))
如果我明白你在問什么,漢明距離試圖准確地找到 3 個“選擇”字符串中的至少一個。 像你這樣做的迭代很慢,試圖突破可能會很丑陋。
我可能會建議正則表達式在這里有幫助。 您可以自動創建匹配字符串:
import re
chosen_re = re.compile('|'.join(l_chosen))
chosen_reads = [x for x in reads_array if chosen_re.search(str(s.seq))]
您將很難超越正則表達式引擎的速度
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.