2015-06-19 100 views
2

我有一個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) 

回答

2

您目前的代碼不會跳出循環讀取下一個readreads.fastq時,它已經發現了漢明距離0的字符串,則應該使用標誌來決定何時爆發,並指定該標誌的真值,當你需要打破 -

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; 

而且你確定你想成爲追加xchosen_reads,似乎是錯誤的是,以獲得獨特的比賽,也許你應該追加s2字符串和匹配的ds反而對嗎?如果這是你想要的,你可以追加一個元組chosen_reads像下面,而不是當前的追加邏輯 -

chosen_reads.append((ds, s2)) 
+0

我刪除的spead最後,如果breakFlag:打破;因爲這不是通過讀取迭代,其他建議工作。我希望將整個記錄寫入chosen_reads以備後用 – Ssank

+0

哦,對不起,不,你不需要最後一個'如果breakFlag',將會修復答案。 –

0

如果我理解你的要求,海明距離爲試圖找到的至少一個3「精確選擇」字符串。迭代,因爲你正在做的很慢,試圖爆發可能是醜陋的。

我也許會建議a regex是什麼在這裏會有所幫助。您可以自動創建匹配的字符串:

import re 
chosen_re = re.compile('|'.join(l_chosen)) 

chosen_reads = [x for x in reads_array if chosen_re.search(str(s.seq))] 

你會很很難擊敗正則表達式引擎