Rosalindを解く - DNAからRNAへの転写

Rosalindの紹介はこちらから。

本日は基礎中の基礎第2弾、DNA配列をRNA配列に転写するコードを書いていきたいと思います。

生物学的知識のおさらい


参考:リボ核酸 - Wikipedia

前回のおさらいでは、DNAは、アデニン(A)、シトシン(C)、グアニン(G)、およびチミン(T)から構成されていることを学びました。

類似した核酸として、RNAという分子が存在します。 リボースと呼ばれる別の糖を持っているこの分子は、リボース核酸として知られるようになりました。RNAは、チミン(T)の代わりにウラシル(U)と呼ばれる塩基を含むという点でDNAとは異なります。

DNAはメッセンジャーRNA(mRNA)と呼ばれる特別な種類のRNA分子を作成するための鋳型として使用されることから、DNAとRNAの一次構造は非常に似ています。mRNAは、RNAの転写中に作成されます。この間、DNAの鎖は、ヌクレオチドを1つずつコピーしてRNAの鎖を構築するためのテンプレートとして使用され、チミン(T)の代わりにウラシル(U)が使用されます。

DNAとRNAはともにヌクレオチドの重合体である核酸ですが、両者の生体内の役割は明確に異なっています。DNAは主に核の中で情報の蓄積・保存、RNAはその情報の一時的な処理を担い、DNAと比べて、必要に応じて合成・分解される頻度は顕著となっています。

問題

NA文字列は、「A」、「C」、「G」、および「U」を含むアルファベットから形成された文字列です。 コード鎖に対応するDNA文字列 $t$ が与えられると、その転写されたRNA文字列 $u$ は、 $t$ 内の「T」を $u$ 内の「U」に置き換えることによって形成されます。

「長さが最大1000塩基長のDNA配列が与えられる。転写後のRNA配列を出力しなさい」

Given: A DNA string $t$ having length at most 1000 nt.
Return: The transcribed RNA string of $t$.

0. ディレクトリ構成

今回のディレクトリ構成は下記とします。

$ tree 
.
├── main.py # 実行ファイル
├── data 
│   └── rosalind_rna.txt # 入力データ
└── utils
    └── file_handler.py # 実行ファイルで使用するモジュール

1. 塩基配列ファイルを読むためのutil関数を使いまわす

以前のDNA塩基数カウントの際に使用したfile_handlerモジュールのload_seq関数を使い回します。

再記するとこんな関数。塩基配列のファイルを読んでSeqオブジェクトを返しています。

#!/usr/bin/env python

import os
from Bio.Seq import Seq

def load_seq(file_name: str, dir_name: str="data") -> Seq:
    """
    Arguments:
        file_name: Input file name
        dir_name: Input directory name

    Returns:
        Bio.Seq.Seq instance
    """
    # os.pathモジュールでディレクトリ名・ファイル名からファイルパスを作成
    file_path = os.path.join(dir_name, file_name)
    # with句で安全にファイルを開く
    with open(file_path, "r") as rf:
        # .strip()メソッドで余計な空白を除去
        seq_str = rf.read().strip()
    # Bio.Seq.Seqインスタンスを生成
    seq = Seq(seq_str)
    return seq

2. メイン関数を作成する

main.py ではload_seq()関数を使用して、data/rosalind_rna.txtファイルに対してDNA塩基配列からRNA塩基配列への変換を実行しています。

def transcribe_DNA_to_RNA(seq:Seq) -> str:
    """ Transcribe DNA to RNA

    Arguments: Bio.Seq.Seq instance
    Returns: str 
    """
    # SeqオブジェクトのtranscribeメソッドによりDNA→RNAへ転写
    return seq.transcribe()

# 標準出力に出力
print(transcribe_DNA_to_RNA(load_seq("rosalind_rna.txt"))

実行

$ cat data/rosalind_dna.txt
GATGGAACTTGACTACGTAAATT

$ python main.py
## GAUGGAACUUGACUACGUAAAUU

コード例

下記で公開しているので参考にしてみて下さい。