【Biopython】2本の遺伝子やタンパク質の配列間の比較(ペアワイズアライメント)[Python]

  • URLをコピーしました!
目次

Biopython

前回、Biopythonでコドン表の表示と各生物のコドン表を使った翻訳方法を紹介しました。

今回は2本の遺伝子やタンパク質の配列を比較するペアワイズアライメントの方法を紹介します。

色々みていくうちに「Alignモジュール」を使う方法と「pairwais2モジュール」を使う方法を見つけたのでそれぞれ見てみましょう。

それでは始めていきましょう。

Alignモジュールを使う方法

まずはAlignモジュールを使う方法です。

「from Bio import Align」でモジュールをインポートします。

そして「aligner = Align.PairwiseAligner(match_score=スコア)」でインスタンスを作成し、「aligner.align(配列1, 配列2)」でアライメントを行います。

結果は複数得られるので、for文を使って一つずつ取り出します。

from Bio import Align

DNA_seq1 = "GAATTCGAATTC"
DNA_seq2 = "ATCG"

aligner = Align.PairwiseAligner(match_score=1.0)
alignments = aligner.align(DNA_seq1, DNA_seq2)

for alignment in alignments:
    print(alignment)

実行結果
target            0 GAATTCGAATTC 12
                  0 -|-|-||----- 12
query             0 -A-T-CG-----  4

target            0 GAATTCGAATTC 12
                  0 --||-||----- 12
query             0 --AT-CG-----  4

target            0 GAATTCGAATTC 12
                  0 -|--|||----- 12
query             0 -A--TCG-----  4

target            0 GAATTCGAATTC 12
                  0 --|-|||----- 12
query             0 --A-TCG-----  4

「Align.PairwiseAligner」の場合、基本的には「グローバルアライメント」となり、2つの配列を全体で合わせようとします。

「ローカルアライメント」、つまり部分的にマッチする部分を探す場合は「aligner.mode = “local”」を追加します。

from Bio import Align

DNA_seq1 = "GAATTCGAATTC"
DNA_seq2 = "ATCG"

aligner = Align.PairwiseAligner(match_score=1.0)

aligner.mode = "local"
alignments = aligner.align(DNA_seq1, DNA_seq2)

for alignment in alignments:
    print(alignment)

実行結果
target            1 AATTCG 7
                  0 |-|-|| 6
query             0 A-T-CG 4

target            2 ATTCG 7
                  0 ||-|| 5
query             0 AT-CG 4

target            1 AATTCG 7
                  0 |--||| 6
query             0 A--TCG 4

target            2 ATTCG 7
                  0 |-||| 5
query             0 A-TCG 4

アライメントのスコアを表示する場合は「aligner.score(配列1, 配列2)」を用います。

from Bio import Align

DNA_seq1 = "GAATTCGAATTC"
DNA_seq2 = "ATCG"

aligner = Align.PairwiseAligner(match_score=1.0)

score = aligner.score(DNA_seq1, DNA_seq2)
print(score)

実行結果
4.0

ちなみに前回のコドン表を変えて翻訳した配列比較の場合はこうなります。

from Bio import SeqIO, Align

for record in SeqIO.parse("AAA27722.1.fasta", "fasta"):
    DNA_seq =record.seq
    default_seq = DNA_seq.translate()
    im_seq = DNA_seq.translate(table="Invertebrate Mitochondrial")

aligner = Align.PairwiseAligner(match_score=1.0)
alignments = aligner.align(default_seq, im_seq)

for alignment in alignments:
    print(alignment)

実行結果
target            0 MSKGEELFTGVVPILVELDGDVNGHKFSVSGEGEGDATYGKLTLKFICTTGKLPVPWPTL
                  0 ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
query             0 MSKGEELFTGVVPILVELDGDVNGHKFSVSGEGEGDATYGKLTLKFICTTGKLPVPWPTL

target           60 VTTFSYGVQCFSR-YPDHMKQHDFFKSAMPEGYVQER-TI-FYKDDGNYKSRAEVKFEGD
                 60 ||||||||||||--||||||||||||||||||||||--|--|||||||||||||||||||
query            60 VTTFSYGVQCFS-SYPDHMKQHDFFKSAMPEGYVQE-ST-MFYKDDGNYKSRAEVKFEGD

target          117 TLVNR-IELKGIDFKEDGNILGHKMEYNYNSHNVYIMADKQKNGIKVNFKIR-HNIEDGS
                120 ||||--|||||||||||||||||||||||||||||||||||||||||||||--|||||||
query           117 TLVN-SIELKGIDFKEDGNILGHKMEYNYNSHNVYIMADKQKNGIKVNFKI-SHNIEDGS

target          175 VQLADHYQQNTPIGDGPVLLPDNHYLSTQSALSKDPNEKR-DHMILLEFVTAAGITHGMD
                180 |||||||||||||||||||||||||||||||||||||||--|||||||||||||||||||
query           175 VQLADHYQQNTPIGDGPVLLPDNHYLSTQSALSKDPNEK-SDHMILLEFVTAAGITHGMD

target          234 ELYK* 239
                240 ||||| 245
query           234 ELYK* 239

target            0 MSKGEELFTGVVPILVELDGDVNGHKFSVSGEGEGDATYGKLTLKFICTTGKLPVPWPTL
                  0 ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
query             0 MSKGEELFTGVVPILVELDGDVNGHKFSVSGEGEGDATYGKLTLKFICTTGKLPVPWPTL

target           60 VTTFSYGVQCFS-RYPDHMKQHDFFKSAMPEGYVQER-TI-FYKDDGNYKSRAEVKFEGD
                 60 ||||||||||||--||||||||||||||||||||||--|--|||||||||||||||||||
query            60 VTTFSYGVQCFSS-YPDHMKQHDFFKSAMPEGYVQE-ST-MFYKDDGNYKSRAEVKFEGD

target          117 TLVNR-IELKGIDFKEDGNILGHKMEYNYNSHNVYIMADKQKNGIKVNFKIR-HNIEDGS
                120 ||||--|||||||||||||||||||||||||||||||||||||||||||||--|||||||
query           117 TLVN-SIELKGIDFKEDGNILGHKMEYNYNSHNVYIMADKQKNGIKVNFKI-SHNIEDGS

target          175 VQLADHYQQNTPIGDGPVLLPDNHYLSTQSALSKDPNEKR-DHMILLEFVTAAGITHGMD
                180 |||||||||||||||||||||||||||||||||||||||--|||||||||||||||||||
query           175 VQLADHYQQNTPIGDGPVLLPDNHYLSTQSALSKDPNEK-SDHMILLEFVTAAGITHGMD

target          234 ELYK* 239
                240 ||||| 245
query           234 ELYK* 239

(以下略)

pairwise2モジュールを使う方法

ペアワイズアライメントをするにはもう一つ「pairwise2モジュール」を使う方法があります。

この場合、「from Bio import pairwise2」で「pairwise2モジュール」をインポートし、「pairwise2.align.globalxx(配列1, 配列2)」でグローバルアライメントを行います。

from Bio import pairwise2

DNA_seq1 = "GAATTCGAATTC"
DNA_seq2 = "ATCG"

results = pairwise2.align.globalxx(DNA_seq1, DNA_seq2)

for result in results:
    print(result)

実行結果
Alignment(seqA='GAATTCGAATTC', seqB='--A-TCG-----', score=4.0, start=0, end=12)
Alignment(seqA='GAATTCGAATTC', seqB='-A--TCG-----', score=4.0, start=0, end=12)
Alignment(seqA='GAATTCGAATTC', seqB='--AT-CG-----', score=4.0, start=0, end=12)
Alignment(seqA='GAATTCGAATTC', seqB='-A-T-CG-----', score=4.0, start=0, end=12)

ローカルアライメントの場合は「pairwise2.align.localxx(配列1, 配列2)」となります。

from Bio import pairwise2

DNA_seq1 = "GAATTCGAATTC"
DNA_seq2 = "ATCG"

results = pairwise2.align.localxx(DNA_seq1, DNA_seq2)

for result in results:
    print(result)

実行結果
Alignment(seqA='GAATTCGAATTC', seqB='--A-TCG-----', score=4.0, start=2, end=7)
Alignment(seqA='GAATTCGAATTC', seqB='-A--TCG-----', score=4.0, start=1, end=7)
Alignment(seqA='GAATTCGAATTC', seqB='--AT-CG-----', score=4.0, start=2, end=7)
Alignment(seqA='GAATTCGAATTC', seqB='-A-T-CG-----', score=4.0, start=1, end=7)

このままでは見づらいので表示のフォーマットを変更します。

「from Bio.pairwise2 import format_alignment」で「format_alignmentモジュール」をインポートします。

そして結果を表示する際に「format_alignment(*結果)」とします。

from Bio import pairwise2
from Bio.pairwise2 import format_alignment

DNA_seq1 = "GAATTCGAATTC"
DNA_seq2 = "ATCG"

results = pairwise2.align.globalxx(DNA_seq1, DNA_seq2)

for result in results:
    print(format_alignment(*result))

実行結果
GAATTCGAATTC
  | |||     
--A-TCG-----
  Score=4

GAATTCGAATTC
 |  |||     
-A--TCG-----
  Score=4

GAATTCGAATTC
  || ||     
--AT-CG-----
  Score=4

GAATTCGAATTC
 | | ||     
-A-T-CG-----
  Score=4

ちなみに変数の前に「*」がついています(*result)が、これは変数がリストであり、アンパックをしています。

また「gloablxx」、「localxx」と最後に「xx」がついていますが、これらを変えることでマッチのパラメータやギャップのパラメータを変更することができます。

詳しくはこちらのページをどうぞ(ただしBiopythonのバージョンが古いので注意)。

例えば「pairwise2.align.globalms(配列1, 配列2, マッチ, ミスマッチ, ギャップ開始, ギャップ伸長)」という形で用いる。

from Bio import pairwise2
from Bio.pairwise2 import format_alignment

DNA_seq1 = "GAATTCGAATTC"
DNA_seq2 = "ATCG"

results = pairwise2.align.globalms(DNA_seq1, DNA_seq2, 2, -1, -0.5, -0.1)

for result in results:
    print(format_alignment(*result))

実行結果
GAATTCGAATTC
  | |||     
--A-TCG-----
  Score=6

GAATTCGAATTC
 |  |||     
-A--TCG-----
  Score=6

GAATTCGAATTC
  || ||     
--AT-CG-----
  Score=6

これでとりあえず配列比較まではできるようになったので、一旦Biopythonはここまでにします。

また何かやりたいことが出てきたら、色々試して紹介します。

次回はPandasで外れ値を除外したり、置換したりする方法を紹介します。

ではでは今回はこんな感じで。

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

目次