簡體   English   中英

選擇漢明距離為零的讀取

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM