Seq

Biopython で利用する配列オブジェクトは IUPAC の基準に従うことが推奨されている。このため、核酸あるいはアミノ酸配列を変数に代入するとき、Bio.Alphabet.IUPAC を利用する。

配列オブジェクトの生成

配列を生成するときは以下のように Seq メソッドを利用し、1 番目の変数に配列、2 番目の変数に配列の分子タイプを指定する。


from Bio.Alphabet import IUPAC
from Bio.Seq import Seq

# DNA 配列
dna_seq = Seq("AATTATATAGCGCGCCG", IUPAC.unambiguous_dna)

# RNA 配列
rna_seq = Seq("AAUUAAGCAUCCUUCCG", IUPAC.unambiguous_dna)

# アミノ酸配列(タンパク質)
aa_seq = Seq("AAWTCWSSP", IUPAC.protein)

配列オブジェクトの基本的なメソッド

Seq メソッドによって作成された配列オブジェクトは、その部分文字列や文字列長などを簡単に計算することができる。以下にいくつかの例を示す。

from Bio.Alphabet import IUPAC
from Bio.Seq import Seq

# DNA 配列オブジェクト生成
seq = Seq("AATTATATAGCGCGCCG", IUPAC.unambiguous_dna)

# 生成されたオブジェクトを出力してみる
seq
## Seq('AATTATATAGCGCGCCG', IUPACUnambiguousDNA())

# 配列長を求める
len(seq)
## 17

# 配列の特定の位置の塩基を取得(Python の文字列と同じように扱える)
seq[0]
## A
seq[2]
## T
seq[-2]
## C

# 2 から 6 までの部分文字列を取得
seq[2:6]
##Seq('TTAT', IUPACUnambiguousDNA())


# すべての塩基と位置を取得する
for index, base in enumerate(seq):
        print index, base
## 0 A
## 1 A
## ...
## 15 C
## 16 G

# AA の出現頻度
seq.count("AA")
## 1

# TA の出現頻度
seq.count("TA")
## 3

# GC 含量
100 * float(seq.count("G") + seq.count("C")) / len(seq)
## 47.0588235294

# IUPAC 配列オブジェクトを普通の文字列オブジェクトに変換する
str(seq)
## 'AATTATATAGCGCGCCG'

# 小文字に変更する
seq.lower()
## Seq('aattatgcgcgc', DNAAlphabet())

# 大文字に変更する
seq.upper()
## Seq('AATTATGCGCGC', IUPACUnambiguousDNA())

配列オブジェクトの種類

配列オブジェクトを生成するときに、DNA、RNA あるいはタンパク質かを指定した。これは非常に重要なことである。例えば、2 つの文字列を結合する場合は + を利用すればよいが、+ を利用するとタンパク質を DNA 配列に結合させたりすることができるようになる。これに対して、Seq メソッドによって生成されたオブジェクトを利用すれば、このような「無茶」な操作ができなくなる。

from Bio.Alphabet import IUPAC
from Bio.Seq import Seq


# アミノ酸配列と DNA 配列を結合させる(エラーが発生する)
aa_seq  = Seq("EVRNAKSS", IUPAC.protein)
dna_seq = Seq("ACCAGT", IUPAC.unambiguous_dna)

aa_seq + dna_seq
## Traceback (most recent call last):
##   File "<stdin>", line 1, in <module>
##   File "/usr/local/lib/python3.3/site-packages/Bio/Seq.py", line 253, in __add__
##     % (repr(self.alphabet), repr(other.alphabet)))
## TypeError: Incompatible alphabets IUPACProtein() and IUPACUnambiguousDNA()


# DNA 配列と DNA 配列を結合させる
dna_seq1 = Seq("AAACCCA", IUPAC.unambiguous_dna)
dna_seq2 = Seq("TTGGTTG", IUPAC.unambiguous_dna)

dna_seq1 + dna_seq2
#Seq('AAACCCATTGGTTG', IUPACUnambiguousDNA())

相補鎖・転写・翻訳

DNA として生成されたオブジェクトに対して、転写や翻訳、相補鎖を求めるなどのメソッドが用意されている。RNA として生成されたオブジェクトは翻訳や転写などのメソッドが用意されている。

from Bio.Alphabet import IUPAC
from Bio.Seq import Seq

# 相補鎖3'->5'
seq = Seq("AATTGGCC", IUPAC.unambiguous_dna)
seq.complement()
#Seq('TTAACCGG', IUPACUnambiguousDNA())

# 相補鎖5'->3'
seq.reverse_complement()
#Seq('GGCCAATT', IUPACUnambiguousDNA())

# タンパク質型配列オブジェクトにはcomplementメソッドを適応できない(エラーが生じる)
protein = Seq("VVVRADAS", IUPAC.protein)
protein.complement()
## Traceback (most recent call last):
##   File "<stdin>", line 1, in <module>
##   File "/usr/local/lib/python3.3/site-packages/Bio/Seq.py", line 723, in complement
##     raise ValueError("Proteins do not have complements!")
## ValueError: Proteins do not have complements!

# DNAコーディング領域
cds = Seq("ATGGCCACATTAAAGGCATTACGGCTATAG", IUPAC.unambiguous_dna)
cds.reverse_complement()
#Seq('CTATAGCCGTAATGCCTTTAATGTGGCCAT', IUPACUnambiguousDNA())

# 転写
mRNA = cds.transcribe()
mRNA
#Seq('AUGGCCACAUUAAAGGCAUUACGGCUAUAG', IUPACUnambiguousRNA())

# 逆転写
mRNA.back_transcribe()
#Seq('ATGGCCACATTAAAGGCATTACGGCTATAG', IUPACUnambiguousDNA())

# DNA から翻訳
cds.translate()
#Seq('MATLKALRL*', HasStopCodon(IUPACProtein(), '*'))

# mRNA から翻訳
mRNA.translate()
#Seq('MATLKALRL*', HasStopCodon(IUPACProtein(), '*'))

# DNA 暗号表の指定、省略の場合は1となる
cds.translate(table = 1) #standard
cds.translate(table = 2) #Vertebrate Mitochondrial

配列オブジェクトの編集

Seq メソッドによって生成されたオブジェクトに対して、塩基やアミノ酸の変更が行えない。そのため、配列の変更したい場合は編集可能な形に変更する必要がある。

from Bio.Seq import Seq
from Bio.Seq import MutableSeq
from Bio.Alphabet import IUPAC

seq = Seq("AAAATTTATA", IUPAC.unambiguous_dna)
seq[3] = "G"
## Traceback (most recent call last):
##   File "<stdin>", line 1, in <module>
## TypeError: 'Seq' object does not support item assignment

mutable_seq = seq.tomutable()
mutable_seq
## MutableSeq('AAAATTTATA', IUPACUnambiguousDNA())

mutable_seq[3] = "G"
mutable_seq
## MutableSeq('AAAGTTTATA', IUPACUnambiguousDNA())

mutable_seq.remove("G")
mutable_seq
## MutableSeq('AAATTTATA', IUPACUnambiguousDNA())

mutable_seq.reverse()
mutable_seq
## MutableSeq('ATATTTAAA', IUPACUnambiguousDNA())