制限酵素で切れるアミノ酸配列を設計する
制限酵素で切れるアミノ酸配列をPythonで設計する話。
2008年のノーベル生理学・医学賞の対象になった蛍光タンパク質は日常的に便利に使っているわけですが、当時のノーベル賞関連の記事を見ると、 GFP 遺伝子をクローニングしてアミノ酸配列を決定した Daglous Prasher 博士は職に恵まれずバスの運転手をしていたらしい。今のうちに大型二種免許取っておこうか…
それはさておき、GFPと研究対象のタンパク質をつなげる際には少し工夫が必要な場合があります。蛍光タンパク質で目印をつけるとか、蛍光タグなんて表記をされると小さくついているような印象を持ちますが、分子の大きさ(分子量)を考えると意外に大きいものです。
それが、他のタンパク質に結合してはたらく時には非常に邪魔になります。そこで、発現量を減らしたり、重複している遺伝子の一つだけ蛍光タンパク質を付けたり、別コピーのプラスミドとして導入したりします。そうするとまばらに標識されて本来の性質に近い状態で観察できます。また、蛍光タンパク質と目的のタンパク質の間にリンカー配列とよばれるフレキシブルな配列を適当に(グリシンとかセリンがよく使われる気がする)つけることで立体的な障害を減らすことが出来ます。
このように"適当な"配列を使うことがしばしばありますが、PCRなどを使ってプラスミドを作る時にいちいちシーケンスを読んでいると大変なので、制限酵素で切って調べられると都合が良いです。しかし、制限酵素できれる任意のアミノ酸配列を考えるのはとてもめんどくさい。そこで、総当たり的に制限酵素で切れる配列を探すPythonプログラムを書きました。
Javascript版を作ったのでここから使えます。
https://sites.google.com/view/morita-rikuri/ツール/Digestable-Codon-Finder
入力: アミノ酸配列
出力: 塩基配列とそれを切断する制限酵素
1.コドン表を準備する
かずさDNA研究所のデータベースから分裂酵母のコドン表を検索して、辞書形式にしました。
2.制限酵素の認識配列を準備する
これは適当に調べたものを、同じく辞書形式に。
3.リンカーとその前後のアミノ酸配列を受け取る
Pythonでは sys.argv にコマンド引数が入るのでそれを使いました。本当は値の妥当性をチェックをするべきかもしれないけれどこの規模なので手抜き。前後が不要であれば "" としてからの値を入れれば動く。ちなみに、sys.argv[0]にはスクリプト名そのものが入ってる。
4.コドン表を元に塩基配列に戻す
アミノ酸配列を一文字ずつちぎっては、辞書を引いて配列を持ってくる。
すべての組み合わせについてそれぞれつなげた配列を作るには、itertools やら chain やらを使って最後に join するという見難いコード…。これに前後の配列をつければ検索対象が完成。
5.制限酵素サイトを探す
制限酵素の辞書を引いてマッチするものを探してくる。
Javascript版を作ったのでここから使えます。
https://sites.google.com/view/morita-rikuri/ツール/Digestable-Codon-Finder
入力: アミノ酸配列
出力: 塩基配列とそれを切断する制限酵素
1.コドン表を準備する
かずさDNA研究所のデータベースから分裂酵母のコドン表を検索して、辞書形式にしました。
2.制限酵素の認識配列を準備する
これは適当に調べたものを、同じく辞書形式に。
3.リンカーとその前後のアミノ酸配列を受け取る
Pythonでは sys.argv にコマンド引数が入るのでそれを使いました。本当は値の妥当性をチェックをするべきかもしれないけれどこの規模なので手抜き。前後が不要であれば "" としてからの値を入れれば動く。ちなみに、sys.argv[0]にはスクリプト名そのものが入ってる。
4.コドン表を元に塩基配列に戻す
アミノ酸配列を一文字ずつちぎっては、辞書を引いて配列を持ってくる。
すべての組み合わせについてそれぞれつなげた配列を作るには、itertools やら chain やらを使って最後に join するという見難いコード…。これに前後の配列をつければ検索対象が完成。
5.制限酵素サイトを探す
制限酵素の辞書を引いてマッチするものを探してくる。
以下がPythonのスクリプト。
>python3 aminoacid_to_renzyme.py pre_seq post_seq insert_seq として使う
import sys
import itertools
from itertools import chain
#前側の配列
pre = sys.argv[1]
#後側の配列
post = sys.argv[2]
#挿入される配列
insert = sys.argv[3]
#分裂酵母 Schizosaccharomyces pombe のコドン表
#http://www.kazusa.or.jp/codon/cgi-bin/showcodon.cgi?species=4896&aa=1&style=N より
codonTable = {
"F": ["TTT", "TTC"],
"L": ["TTA", "TTG", "CTT", "CTC", "CTA", "CTG"],
"S": ["TCT", "TCC", "TCA", "TCG", "AGT", "AGC"],
"Y": ["TAT", "TAC"],
"*": ["TAA", "TAG", "TGA"],
"C": ["TGT", "TGC"],
"W": ["TGG"],
"P": ["CCT", "CCC", "CCA", "CCG"],
"H": ["CAT", "CAC"],
"Q": ["CAA", "CAG"],
"R": ["CGT", "CGC", "CGA", "CGG", "AGA", "AGG"],
"I": ["ATT", "ATC", "ATA"],
"M": ["ATG"],
"T": ["ACT", "ACC", "ACA", "ACG"],
"N": ["AAT", "AAC"],
"K": ["AAA", "AAG"],
"V": ["GTT", "GTC", "GTA", "GTG"],
"A": ["GCT", "GCC", "GCA", "GCG"],
"D": ["GAT", "GAC"],
"E": ["GAA", "GAG"],
"G": ["GGT", "GGC", "GGA", "GGG"]
}
#制限酵素名とその認識配列の辞書
restrictionEnzymes = {
"BamHI": "GGATCC",
"BglII": "AGATCT",
"ClaI": "ATCGAT",
"EcoRI": "GAATTC",
"EcoRV": "GATATC",
"HindIII": "AAGCTT",
"KpnI": "GGTACC",
"NaeI": "GCCGGC",
"NcoI": "CCATGG",
"NdeI": "CATATG",
"NheI": "GCTAGC",
"NotI": "GCGGCCGC",
"PstI": "CTGCAG",
"PvuI": "CGATCG",
"SacI": "GAGCTC",
"SacII": "CCGCGG",
"SalI": "GTCGAC",
"ScaI": "ACTAGT",
"SmaI": "CCCGGG",
"SpeI": "ACTAGT",
"SphI": "GCATGC",
"XbaI": "TCTAGA",
"XhoI": "CTCGAG",
}
#例:insert = "GS"
#挿入されるアミノ酸からあり得るコドンの配列に変える
insertNucleotide = [codonTable[aminoacid] for aminoacid in insert]
#例:insertNucleotide = [['GGT', 'GGC', 'GGA', 'GGG'], ['TCT', 'TCC', 'TCA', 'TCG', 'AGT', 'AGC']]
#すべてのコドンの組み合わせについて結合された文字列を得る
productedInsert = [""]
for i in range(len(insert)):
productedInsert = ["".join(list(chain.from_iterable(l))) for l in itertools.product(productedInsert, codonTable[insert[i]])]
#例:productedInsert = ['GGTTCT', 'GGTTCC', 'GGTTCA', 'GGTTCG', 'GGTAGT', 'GGTAGC', 'GGCTCT', 'GGCTCC', 'GGCTCA', 'GGCTCG', 'GGCAGT', 'GGCAGC', 'GGATCT', 'GGATCC', 'GGATCA', 'GGATCG', 'GGAAGT', 'GGAAGC', 'GGGTCT', 'GGGTCC', 'GGGTCA', 'GGGTCG', 'GGGAGT', 'GGGAGC']
print(productedInsert)
print("Combined Insert Created!")
#挿入配列の前後をつける
resultSequence = [pre + i + post for i in productedInsert]
print("Combined Sequence Created!")
#すべての塩基配列について制限酵素サイトを探す
for seq in resultSequence:
first = True
for name, recog in restrictionEnzymes.items():
f = seq.find(recog)
#無ければ次の酵素へ
if f == -1:
continue
else:
#見つかったら最初の一回だけ配列を出力
if first == True:
print(seq)
first = False
#酵素名を出力
print(name)
print("Search Completed!")
GS(グリシン、セリン)という配列について検索すると、
それぞれのアミノ酸に使われ得るコドンは、 [['GGT', 'GGC', 'GGA', 'GGG'], ['TCT', 'TCC', 'TCA', 'TCG', 'AGT', 'AGC']] のようになる。それらを組み合わせると、['GGTTCT', 'GGTTCC', 'GGTTCA', 'GGTTCG', 'GGTAGT', 'GGTAGC', 'GGCTCT', 'GGCTCC', 'GGCTCA', 'GGCTCG', 'GGCAGT', 'GGCAGC', 'GGATCT', 'GGATCC', 'GGATCA', 'GGATCG', 'GGAAGT', 'GGAAGC', 'GGGTCT', 'GGGTCC', 'GGGTCA', 'GGGTCG', 'GGGAGT', 'GGGAGC'] となる。
検索した結果、GGATCC という配列が BamHI で切れることが分かる。
あんまり頭を使わずに総当りやっているので配列が長くなると組み合わせの関係からとても時間がかかってしまう。改善するとすれば、生物によってあまり使われないレアコドンは検索対象から外すとか、使いたくない制限酵素を先に消しておくのがとりあえずの対策。適当なアミノ酸、例えばグリシンとセリンとアラニンで適当に3アミノ酸の配列を作ってくれというときにはこうすればよいです。これはさっきより処理が重くなっているので現実的には短めの配列でしか使えない。
permutationInsert = ["G", "S", "A"]
insert = "".join(["".join(list(chain.from_iterable(l))) for l in list(itertools.permutations(permutationInsert, 3))])
作ってから気がついたけれど、点変異を加える時にも使えるからこっちのほうが需要があるかもしれない。
まとめ
リンカ―配列や点変異について任意のアミノ酸配列について、制限酵素で切れるコドンを探せました。
Google日本語入力をしてでも"リンカー"が一発で変換されないし、そもそも変換候補にすら出てこないので一番上に出てきた"リンカーン大統領"でこの文章を書いた。
コメント
コメントを投稿