Rosalindの紹介はこちらから。
本日は基礎中の基礎第2弾、DNA配列をRNA配列に転写するコードを書いていきたいと思います。
生物学的知識のおさらい
前回のおさらいでは、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
コード例
下記で公開しているので参考にしてみて下さい。