【Python】mRNAの塩基配列から、コドンがどのアミノ酸に対応するか取得する

■概要

mRNA配列(A, U, G, C で構成される文字列)を読み込み、開始コドン(AUG)から終了コドン(UAA, UAG, UGA)までを区切って「どんなコドンか」を特定する処理をPythonで実装する。

▼検索結果イメージ

検索対象:

AUGUUUUUCUAA

検索結果:

AUG -> Met: メチオニン(開始)
UUU -> Phe: フェニルアラニン
UUC -> Phe: フェニルアラニン
UAA -> STOP: 終止

■フローチャート

実装する処理のフローチャートを以下に示す。

・メイン処理

開始
開始
テストシーケンス作成
テストシーケンス作成
テストシーケンス分繰り返し
テストシーケンス分繰り返し
テストケース名表示
テストケース名表示
コンソール
コンソール
テストケース名
テストケース名
mRNA/DNA解析処理呼び出し
mRNA/DNA解析処理呼び出し
解析結果
解析結果
なし
なし
あり
あり
解析結果なしを表示
解析結果なしを表示
解析結果なし
解析結果なし
解析結果分繰り返し
解析結果分繰り返し
解析結果個数表示
解析結果個数表示
解析結果個数
解析結果個数
解析結果のコドン分繰り返し
解析結果のコドン分繰り返し
解析結果表示
解析結果表示
解析結果
解析結果
終了
終了
Text is not SVG – cannot display

・mRNA/DNA解析処理呼び出し

開始
開始
DNAの場合、TをUに変換
DNAの場合、TをUに変換
返却用リストセット
返却用リストセット
mRNAの文字列分繰り返し
mRNAの文字列分繰り返し
文字列3桁
文字列3桁
AUG
AUG
一時リストセット
一時リストセット
開始文字列から終端まで3桁ずつ繰り返し
開始文字列から終端まで3桁ずつ繰り返し
コドン:開始文字列含む3桁取得
コドン:開始文字列含む3桁取得
コドン
コドン
AUG以外
AUG以外
3桁未満
3桁未満
その他
その他
コドン表からコドン情報を取得
コドン表からコドン情報を取得

コドン表
コドン表
一時リストにコドン情報を格納
一時リストにコドン情報を格納
コドン
コドン
終了
終了
その他
その他
return:返却用リスト
return:返却用リスト
返却用リストに一時リストの情報をセット
返却用リストに一時リストの情報をセット
終了
終了
Text is not SVG – cannot display

■サンプルコード

以下に実装する処理のコードを示す。

from codon_table import codon_list

# 終了コドン
stop_codons = {"UAA", "UAG", "UGA"}


def find_orfs(mrna: str):
    # DNAの場合TをUに変換
    mrna = mrna.upper().replace("T", "U")

    # 返却用リスト
    orfs = []

    # mRNAの文字列分繰り返し
    for start_index in range(len(mrna)):
        # 開始文字列含む3桁が開始(AUG)の場合
        if mrna[start_index:start_index + 3] == "AUG":
            # 一時配列
            codons = []

            # 開始文字列から終端まで3桁ずつ繰り返し
            for i in range(start_index, len(mrna), 3):
                # 開始文字列含む3桁を取得
                codon = mrna[i:i + 3]

                # コドンが3桁未満の場合は終了
                if len(codon) < 3:
                    break

                # コドン表からコドン情報を取得
                aa_info = codon_list.get(codon, ("???", "不明"))
                # 一時配列にコドン情報を格納
                codons.append((codon, aa_info))

                # コドンが終了の場合
                if codon in stop_codons:
                    # 返却用配列に一時配列の値を格納
                    orfs.append(codons)
                    break
    return orfs


if __name__ == '__main__':
    test_sequences = {
        "正常なORF":
            "CCCAUGUUUCUUAUCGUAAGCCCCACGGCGCAUCAGAACAAAGAUGAGUGUUAAAAA",
        "正常なORF(複数)":
            "AUGUCGUCUCUGUAAAUGUUCCAAGCGUAA",
        "正常なDNA":
            "ATGTTGCGTGGATAA",
        "未知の塩基": "AUGUGGCGAAXGGGCUAA",  # AXG → "??? 不明"
        "不完全コドン": "AUGUUUCGG",  # 終了なし"
        "開始なし": "CCCUUUUGA",  # AUGがないので翻訳開始しない
    }

    # テストシーケンス分繰り返し
    for label, seq in test_sequences.items():
        # テストケース名表示
        print(f"--- {label} ---")

        # mRNA/DNA解析
        orfs = find_orfs(seq)

        # 解析結果判定
        if not orfs:
            print("  ORFなし")
        else:
            # 解析結果分繰り返し(indexは1スタート)
            for idx, orf in enumerate(orfs, 1):
                print(f"  ORF {idx}:")
                # 解析結果のコドン分繰り返し[コドン,(英名, 和名)]
                for codon, (abbr, jp) in orf:
                    print(f"    {codon} -> {abbr}: {jp}")

・コドン表

# コドン表(略号: 日本語名)
codon_list = {
    # 開始コドン
    "AUG": ("Met", "メチオニン(開始)"),

    # フェニルアラニン
    "UUU": ("Phe", "フェニルアラニン"),
    "UUC": ("Phe", "フェニルアラニン"),

    # ロイシン
    "UUA": ("Leu", "ロイシン"), "UUG": ("Leu", "ロイシン"),
    "CUU": ("Leu", "ロイシン"), "CUC": ("Leu", "ロイシン"),
    "CUA": ("Leu", "ロイシン"), "CUG": ("Leu", "ロイシン"),

    # イソロイシン
    "AUU": ("Ile", "イソロイシン"), "AUC": ("Ile", "イソロイシン"),
    "AUA": ("Ile", "イソロイシン"),

    # バリン
    "GUU": ("Val", "バリン"), "GUC": ("Val", "バリン"),
    "GUA": ("Val", "バリン"), "GUG": ("Val", "バリン"),

    # セリン
    "UCU": ("Ser", "セリン"), "UCC": ("Ser", "セリン"),
    "UCA": ("Ser", "セリン"), "UCG": ("Ser", "セリン"),
    "AGU": ("Ser", "セリン"), "AGC": ("Ser", "セリン"),

    # プロリン
    "CCU": ("Pro", "プロリン"), "CCC": ("Pro", "プロリン"),
    "CCA": ("Pro", "プロリン"), "CCG": ("Pro", "プロリン"),

    # トレオニン
    "ACU": ("Thr", "トレオニン"), "ACC": ("Thr", "トレオニン"),
    "ACA": ("Thr", "トレオニン"), "ACG": ("Thr", "トレオニン"),

    # アラニン
    "GCU": ("Ala", "アラニン"), "GCC": ("Ala", "アラニン"),
    "GCA": ("Ala", "アラニン"), "GCG": ("Ala", "アラニン"),

    # チロシン
    "UAU": ("Tyr", "チロシン"), "UAC": ("Tyr", "チロシン"),

    # 終止コドン
    "UAA": ("STOP", "終止"), "UAG": ("STOP", "終止"), "UGA": ("STOP", "終止"),

    # ヒスチジン
    "CAU": ("His", "ヒスチジン"), "CAC": ("His", "ヒスチジン"),

    # グルタミン
    "CAA": ("Gln", "グルタミン"), "CAG": ("Gln", "グルタミン"),

    # アスパラギン
    "AAU": ("Asn", "アスパラギン"), "AAC": ("Asn", "アスパラギン"),

    # リシン
    "AAA": ("Lys", "リシン"), "AAG": ("Lys", "リシン"),

    # アスパラギン酸
    "GAU": ("Asp", "アスパラギン酸"), "GAC": ("Asp", "アスパラギン酸"),

    # グルタミン酸
    "GAA": ("Glu", "グルタミン酸"), "GAG": ("Glu", "グルタミン酸"),

    # システイン
    "UGU": ("Cys", "システイン"), "UGC": ("Cys", "システイン"),

    # トリプトファン
    "UGG": ("Trp", "トリプトファン"),

    # アルギニン
    "CGU": ("Arg", "アルギニン"), "CGC": ("Arg", "アルギニン"),
    "CGA": ("Arg", "アルギニン"), "CGG": ("Arg", "アルギニン"),
    "AGA": ("Arg", "アルギニン"), "AGG": ("Arg", "アルギニン"),

    # グリシン
    "GGU": ("Gly", "グリシン"), "GGC": ("Gly", "グリシン"),
    "GGA": ("Gly", "グリシン"), "GGG": ("Gly", "グリシン"),
}

■実行結果

--- 正常なORF ---
  ORF 1:
    AUG -> Met: メチオニン(開始)
    UUU -> Phe: フェニルアラニン
    CUU -> Leu: ロイシン
    AUC -> Ile: イソロイシン
    GUA -> Val: バリン
    AGC -> Ser: セリン
    CCC -> Pro: プロリン
    ACG -> Thr: トレオニン
    GCG -> Ala: アラニン
    CAU -> His: ヒスチジン
    CAG -> Gln: グルタミン
    AAC -> Asn: アスパラギン
    AAA -> Lys: リシン
    GAU -> Asp: アスパラギン酸
    GAG -> Glu: グルタミン酸
    UGU -> Cys: システイン
    UAA -> STOP: 終止
--- 正常なORF(複数) ---
  ORF 1:
    AUG -> Met: メチオニン(開始)
    UCG -> Ser: セリン
    UCU -> Ser: セリン
    CUG -> Leu: ロイシン
    UAA -> STOP: 終止
  ORF 2:
    AUG -> Met: メチオニン(開始)
    UUC -> Phe: フェニルアラニン
    CAA -> Gln: グルタミン
    GCG -> Ala: アラニン
    UAA -> STOP: 終止
--- 正常なDNA ---
  ORF 1:
    AUG -> Met: メチオニン(開始)
    UUG -> Leu: ロイシン
    CGU -> Arg: アルギニン
    GGA -> Gly: グリシン
    UAA -> STOP: 終止
--- 未知の塩基 ---
  ORF 1:
    AUG -> Met: メチオニン(開始)
    UGG -> Trp: トリプトファン
    CGA -> Arg: アルギニン
    AXG -> ???: 不明
    GGC -> Gly: グリシン
    UAA -> STOP: 終止
--- 不完全コドン ---
  ORFなし
--- 開始なし ---
  ORFなし

■参考

本記事を記載するにあたり、参考とさせていただいたURLを以下に示す。

コメント

タイトルとURLをコピーしました