翻訳の際、成熟mRNA中のコドンは必ず特定のアミノ酸をコードしますが、一つのアミノ酸に対して複数のコドンが存在するため、翻訳終了後のアミノ酸配列から塩基配列を予測することはほぼ不可能です。
今回はその予測がどれほど難しいことなのかを具体的に算出していきます。その際、組み合わせの桁数が膨大になってしまうため、剰余演算を利用してmodulo (1B+7) の値を取得します。
目次
(1)対象配列
seq に全コドンパターン算出に使用するアミノ酸配列を代入します。
seq = "MEYPTQLTQPFSYAFLHYFTYGVFYSNVTSPQRYEAAQNAMPHGNTADAAHVHTFIGWFNMRNAVVGHWGILFSWDYSRKCQPQSSCQGAWWDQFEQDGETAYDMPNPLTQTVMNFSHALVKIKTQVHSSIQLEPCPNHKPVLQQYIVSVAMSHEVAMGILIMNQTAQMTPWQENTMCSMHPKCLNRVCCDFLLQTFHAQLCMACLCLGVNQWWKACHSTHPAMARELWMQNFDQNNHVDDPSYAGQASGGCGNQNVFYMMYVKIKHGWYWWMCGTSRAFVRNFSMGRDVSMMLFTCKDPPWTYENYKALMLRFHWQGPCAFASQFDMIRKDKRHIRQKPWKKLFGICSHGKMPNAWETYQHFYQFCFHSPGCNNPVSMKHKISRPTQPDEEYGCGRQTVRVITCQLNNGWDPVQIYMCWPLDACDDGSMHIYIYVVHKSTMEWATPCNEYNNGQFLTYVKGSRSIQFWDTAMLQQEQGSRWWSAGDKANWYWIPFPCNAPFMYPFVLYIHMKKLDCQMPITDENPVEIILYYKGINQSRIRCFGSNDMIQMQTLKDSESRVVINQCCVNMRDTRQCADYGSVWWFVYKDQATWYISVDAAEHSAIIEVKLKKPHLISEARHDYTVNDNGWCQIRSVAFDNQNMPGYRSNRTIFHNVYGIMWSPIKNIPVKHEDAELLTNQQMAFPWFSACIVIRNEVEMEMGWLLHVWAVMLDCSGVGQQSMNLCHWRCFWVKPFPAEDALFYHNRTEYQSGVTMFDNCQAYVTPHTVEDRIYNHSHCQVCQNTNTFTYLLNCVHWLGQHRKDLPKPPRRIHKYFTNGWRKLNFKSKGYNCICLVTLIPEAPDQFCYRDLWSQPIYILAAGYMEMMNGYWKCDEVFHPWHKKGYPRAGFGYWSLAKQCKHKHCTWQWAIHNIFPDMDTPNKDEILYGARTDTLSHPQNAIWYFEVEPHAATRIDKDFWVNNDGVYERVRMVRKDYVDEDRKWGEQGEHTWTGGGVA"
(2)関数の作成
今回は、以下のように引数をアミノ酸とし、対応するコドンの種類をnumとして代入し返値とする関数a2Nを作成しました。
def a2N(aminoacid):
num = 0
if aminoacid == "Y" or aminoacid == "H" or aminoacid == "Q" or aminoacid == "N" or aminoacid == "K" or aminoacid == "D" or aminoacid == "E" or aminoacid == "F" or aminoacid == "C":
num = 2
elif aminoacid == "L" or aminoacid == "S" or aminoacid == "R":
num = 6
elif aminoacid == "V" or aminoacid == "P" or aminoacid == "T" or aminoacid == "A" or aminoacid == "G":
num = 4
elif aminoacid == "I":
num = 3
elif aminoacid == "W":
num = 1
elif aminoacid == "M":
num = 1
else:
pass
return num
(3)パターン数の算出
上記で作成した配列および関数をインポートし、全パターン数を計算します。
計算方法は至ってシmプルで、対応するコドンの個数を変数mに掛けていき、最後にmodulo 1Mを出します。
from seq import seq
from functions import a2N
m = 1
modulo = 1000000007
for amino_idx in range(len(seq)):
m *= a2N(seq[amino_idx])
print((m*3)%modulo)
#終止コドンは3種類あるため3をかけます。
計算結果
以下が全パターン数をmodulo (1B+7)した値です。
[box05 title=”計算結果”]613969049[/box05]今回はpythonを使用して計算したため、int64オーバーフローは起こりませんでしたが、他の言語でやるときはオーバーフローしないように桁数を調整しながら掛けていく必要があります。
パターン数とその桁数(追記)
上記の通り、オーバーフローしなかったため、全コドンパターン数を取得することができました。
そこで、以下に取得したパターン数とその桁数を示します。
[box05 title=”パターン数”]パターン1366759998540726042338954774581887846908838175448233765871269495405452364272372275215356201108712302779517357309035868224410413697928772705130216756790280885759445067246824732930612923781155103145998892067289286694478474139042874800637223781468957480849871075149031261319052301732896432718304646916792866420558282533664844500671300052805812637504729634983625581687415849503673326975227530181759349387798647318695976728460695437312(通り)桁数:430[/box05]
もう少し膨大になると思っていましたが、意外と収まりました。