BioPython で塩基配列またはアミノ酸配列を扱うとき、Seq 型で扱うことが推奨されている。Seq 型でシーケンスを取り扱うことで、例えば AAGAAGA という配列をあったとき、これが DNA なのか、RNA なのか、それともアミノ酸なのかを区別できるようになる。また、Seq 型のオブジェクトには、逆相補鎖を求めたり、転写や翻訳したりするメソッドが用意されている。
Seq 型のオブジェクトの生成
Seq 型のオブジェクトを作成するとき、Seq
メソッドを利用し、1 番目の変数に配列、2 番目の変数に配列の分子タイプを指定する。分子タイプとして指定できるのは、protein
、ambiguous_dna
や ambiguous_rna
などがある。その他に指定できるタイプは Bio.Alphabet.IUPAC のクラスドキュメントに書かれている。
from Bio.Alphabet import IUPAC
from Bio.Seq import Seq
dna_seq = Seq("AATTATATAGCGCGCCG", IUPAC.ambiguous_dna)
dna_seq
## Seq('AATTATATAGCGCGCCG', IUPACAmbiguousDNA())
rna_seq = Seq("AAUUAAGCAUCCUUCCG", IUPAC.ambiguous_rna)
rna_seq
## Seq('AAUUAAGCAUCCUUCCG', IUPACAmbiguousRNA())
aa_seq = Seq("AAWTCWSSP", IUPAC.protein)
aa_seq
## Seq('AAWTCWSSP', IUPACProtein())
シーケンスの各位置にある塩基またはアミノ酸は添え字を指定して取り出せる。また、for
ループを利用して、1 ずつ取り出すこともできる。
from Bio.Alphabet import IUPAC
from Bio.Seq import Seq
seq = Seq("AATTATATAGCGCGCCG", IUPAC.ambiguous_dna)
seq[0]
## A
seq[2]
## T
seq[-2]
## C
seq[2:6]
##Seq('TTAT', IUPACAmbiguousDNA())
for index, base in enumerate(seq):
print index, base
## 0 A
## 1 A
## ...
## 15 C
## 16 G
Seq 型のオブジェクトを Python 標準の文字列型に変更する場合 str
メソッドを利用してキャストすればよい。
str(seq)
## 'AATTATATAGCGCGCCG'
Seq 型のオブジェクトを生成するときに分子のタイプを指定した。これは Seq 型のオブジェクトに保存されているシーケンスは DNA なのか、RNA なのか、それともアミノ酸なのかを知ることで、シーケンスに対する操作を行う上で重要である。例えば、普通の文字列で定義された DNA 配列とアミノ酸配列であれば +
演算子で結合することはできるが、Seq 型では DNA 配列とアミノ酸配列を +
演算子で結合することはできない。
from Bio.Alphabet import IUPAC
from Bio.Seq import Seq
dna_seq1 = Seq('AAACCCA', IUPAC.ambiguous_dna)
dna_seq2 = Seq('TTGGTTG', IUPAC.ambiguous_dna)
dna_seq1 + dna_seq2
#Seq('AAACCCATTGGTTG', IUPACAmbiguousDNA())
aa_seq = Seq('EVRNAKSS', IUPAC.protein)
dna_seq = Seq('ACCAGT', IUPAC.ambiguous_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 IUPACAmbiguousDNA()
Seq 型オブジェクトのメソッド
シーケンスの長さ
シーケンスの長さは len
メソッドで求めることができる。
from Bio.Alphabet import IUPAC
from Bio.Seq import Seq
seq = Seq('AATTATATAGCGCGCCG', IUPAC.ambiguous_dna)
len(seq)
## 17
出現頻度
シーケンス中に現れる特定の組み合わせをした塩基パターンまたはアミノ酸パターンの出現頻度は、count
メソッドを利用すると簡単に計算できる。
seq.count('AA')
## 1
seq.count('TA')
## 3
G と C の塩基の頻度をそれぞれ求めて、その和をシーケンスの長さで割れば、GC 含量として求めることができる。
100 * float(seq.count('G') + seq.count('C')) / len(seq)
## 47.0588235294
大文字・小文字の交互変換
Seq 型のオブジェクトに保存されているシーケンスを大文字または小文字に変更する場合は、upper
または lower
メソッドを利用する。
seq.lower()
## Seq('aattatgcgcgc', IUPACAmbiguousDNA())
seq.upper()
## Seq('AATTATGCGCGC', IUPACAmbiguousDNA())
相補鎖・転写・翻訳
DNA として生成された Seq 型のオブジェクトに対して、転写や翻訳、相補鎖を求めるなどのメソッドが用意されている。RNA として生成されたオブジェクトは翻訳や転写などのメソッドが用意されている。
from Bio.Alphabet import IUPAC
from Bio.Seq import Seq
seq = Seq('AATTGGCC', IUPAC.ambiguous_dna)
seq.complement()
## Seq('TTAACCGG', IUPACAmbiguousDNA())
seq.reverse_complement()
## Seq('GGCCAATT', IUPACAmbiguousDNA())
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!
cds = Seq('ATGGCCACATTAAAGGCATTACGGCTATAG', IUPAC.Ambiguous_dna)
cds.reverse_complement()
#Seq('CTATAGCCGTAATGCCTTTAATGTGGCCAT', IUPACAmbiguousDNA())
mRNA = cds.transcribe()
mRNA
#Seq('AUGGCCACAUUAAAGGCAUUACGGCUAUAG', IUPACAmbiguousRNA())
mRNA.back_transcribe()
#Seq('ATGGCCACATTAAAGGCATTACGGCTATAG', IUPACAmbiguousDNA())
cds.translate()
#Seq('MATLKALRL*', HasStopCodon(IUPACProtein(), '*'))
mRNA.translate()
#Seq('MATLKALRL*', HasStopCodon(IUPACProtein(), '*'))
cds.translate(table = 1) # standard codon table
cds.translate(table = 2) # vertebrate mitochondrial codon table
配列オブジェクトの編集
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', IUPACAmbiguousDNA())
mutable_seq[3] = 'G'
mutable_seq
## MutableSeq('AAAGTTTATA', IUPACAmbiguousDNA())
mutable_seq.remove('G')
mutable_seq
## MutableSeq('AAATTTATA', IUPACAmbiguousDNA())
mutable_seq.reverse()
mutable_seq
## MutableSeq('ATATTTAAA', IUPACAmbiguousDNA())