2017-01-10 6 views
3

私はDNA配列と配列の名前を持つFASTAファイルを持っており、重複スコアのマトリックスを作る必要があります。 Biopythonでモジュールpairwise2が見つかりましたが、これはかなりうまくいくようです。私の配列は既に整列されていることを除いて、pairwise2を使用すると、それは非常に長くかかる配列を再び整列させようとし、各整列について同じ重複スコアを明らかに得ます。だから私の質問は、シーケンスを再調整しようとせずにオーバーラップスコアを取得する方法です。ここ は、私がこれまで持っているものです。重複スコアマトリックスbiopython

from Bio.Alphabet import IUPAC 
from Bio import SeqIO 
from Bio import pairwise2 

fasta_file = SeqIO.parse('unambiguous.fasta', 'fasta', alphabet=IUPAC.ambiguous_dna) 

all_seq = [] 
for seq_record in fasta_file: 
    all_seq += [str(seq_record.seq)] 

compare = pairwise2.align.globalms(all_seq[0], all_seq[1], 2, -1, -1, 0) 
print(compare) 

私はここにトライアウトとしてFASTAファイルからのみ第一および第二の配列を使用しました。あなたがスクリプトで見ることができるように、マッチは2ポイント、ミスマッチとギャップ-1に報酬を与えるべきです。両方の配列が同じ位置にギャップを持つ場合、0は報酬でなければなりません。私は4位に0を入れても望みの結果は得られませんが、まだその問題の解決策はありません。この時点でアライメントの問題が大きくなっているようです。 pairwise2や他のpython/biopythonモジュールの経験がある人なら、重複スコアを得ることができますか?

+0

'unambiguous.fasta'に整列した配列が含まれていることを意味しますか? –

+0

あなたの質問を編集して、あなたの問題を示す例入力を含めてください。 – MattDMo

答えて

0

私が理解する限り、unambiguous.fastaは整列した遺伝子配列を含む。あなたは、あなたのニーズに合ったスコアリング機能を使用してそれらを得点することができます

from itertools import starmap, combinations 


def score(seq1, seq2): 
    def score_(a, b): 
     return (0 if a == b == "-" # both are gaps 
       else -1 if a != b # mismatch or gap 
       else 2)   # match 

    return sum(starmap(score_, zip(seq1, seq2))) 

あなたは、人々が通常そうであるように、あいまいな塩基との位置を無視するように変更する場合があります。ここでは、すべての配列を比較するためにきちんとした方法は次のとおりです。

一度実行
sequences = SeqIO.parse('unambiguous.fasta', 'fasta', alphabet=IUPAC.ambiguous_dna) 
scores = starmap(score, combinations(sequences, 2)) 

scores(それは怠惰なイテレータであることに注意)スコアのペアワイズ行列の平坦化された上位三角形を生成します。 scoreは非常に速く動作するはずですが、何千ものシーケンス(計算するために数百万の比較)がある場合は、CythonまたはNumbaを使用して再実装する必要があります。

編集zipizipに置き換えることができます。

+0

ありがとう、それは簡単で分かりやすい方法でトリックを行うようだ。 何が意味するのか考えてみませんか? – JDh

+0

@JDhよろしくお願いします。答えでは、私は書いています: "それは怠惰な反復子であることに注意してください"。あなたはそれを反復して、スコアを一つずつ行うことができます(すべてのスコアを一度にRAMにロードしたくない場合はそうします)、それを非遅延コンテナに変換します。 'list(得点)'。 Pythonは遅延評価を頻繁に使用します。言語を効率的に使用したい場合は、コンセプトに慣れ親しんでください。 –