質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.98%

  • Ruby

    6391questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Rubyでアミノ酸配列に変換したい

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 128

benigmaet

score 5

前提・実現したいこと

rubyで遺伝子の塩基配列をアミノ酸配列に翻訳するプログラムを作ろうと思ってます。

入力するファイルは各遺伝子の塩基配のデータが入っています。ファイル形式はFASTAです。ファイルの名前はU00096.ffnです。
ファイルは
>遺伝子の名前
塩基配列
の形式です。

(例)
>gi|48994873|gb|U00096.2|:190-255 Escherichia coli str. K-12 substr. MG1655, complete genome
ATGAAACGCATTAGCACCACCATTACCACCACCATCACCATTACCACAGGTAACGGTGCGGGCTGA

以上の例が数回繰り返しているようなものです。

発生している問題

>遺伝子の名前
を保存する。
また、塩基配列を保存してアミノ酸配列に翻訳して表示
を繰り返したい

(例)
>遺伝子の名前
アミノ酸配列
>遺伝子の名前
アミノ酸配列
...
と繰り返したい

該当のソースコード

#-*- coding: utf-8 -*-

#DNAからアミノ酸への翻訳
def dna2aa_1(codon)

  aa=''#alanine
  if codon=~/GC./i
    aa='A'#cysteine
  elsif codon=~/TG[TC]/i
    aa='C'#aspartic acid
  elsif codon=~/GA[TC]/i
    aa='D'#glutamic acid
  elsif codon=~/GA[AG]/i
    aa='E'#phenylalanine
  elsif codon=~/TT[TC]/i
    aa='F'
  elsif codon=~/GG./i
    aa='G'
  elsif codon=~/CA[TC]/i
    aa='H'
  elsif codon=~/AT[TCA]/i
    aa='I'
  elsif codon=~/AA[AG]/i
    aa='K'
  elsif codon=~/TT[AG]|CT./i
    aa='L'
  elsif codon=~/ATG/i
    aa='M'
  elsif codon=~/AA[TC]/i
    aa='N'
  elsif codon=~/CC./i
    aa='P'
  elsif codon=~/CA[AG]/i
    aa='Q'
  elsif codon=~/CG.|AG[AG]/i
    aa='R'
  elsif codon=~/TC.|AG[TC]/i
    aa='S'
  elsif codon=~/AC./i
    aa='T'
  elsif codon=~/GT./i
    aa='V'
  elsif codon=~/TGG/i
    aa='W'
  elsif codon=~/TA[TC]/i
    aa='Y'
  elsif codon=~/TA[AG]|TGA/i
    aa='_'
  else
    print("Bad codon",codon,"!!\n")
  end
  return aa
end



#DNA配列を三文字ずつ取得する
#DNA配列dna_seqと読み枠iを引数として受け取る
def codon_while(dna_seq,i)

  aa_seq=[]

  #読み枠の三文字目dna_seq[i+2]がなくなるまで処理を繰り返す
  while dna_seq[i+2]
    #DNA配列の3文字分を取得
    codon=dna_seq[i]+dna_seq[i+1]+dna_seq[i+2]
    #メソッドdna2aa_1を呼び足している
    aa=dna2aa_1(codon)
    #翻訳したアミノ酸名を配列に追加
    aa_seq.push(aa)
#3文字分iを移動
    i=i+3

  end
  #翻訳したアミノ酸を返す
  return aa_seq
end



dna_seq_1=[]
 line_data_name=""


###メインプログラム
#ファイルからデータを取得
#text=File.read('U00096.fna')
#text=File.read('U00096.fna').partition("\n")[2]

i=0
File.open('U00096.ffn'){|file_name|
  file_name.each{|line_data|
    if line_data=~/^>/ and i=0
      #>改行を読み飛ばす
      i=1
      line_data_name=line_data.chomp
    else
      #DNA配列を改行を除いて保存
      ##"<<"文字列を追加
      dna_seq_1[i] << line_data.chomp 
    end
  }
}
#改行を除いた配列データの作成
#text_1=text.gsub("\n","")

#DNAデータを配列dna_hairetsu1へ代入
dna_hairetsu_1=dna_seq_1.split("")


#読み枠1の翻訳後を出力
aa_seq_1=codon_while(dna_hairetsu_1,0)
aa_seq_str_1=aa_seq_1.join('')

print(line_data_name,"\n")
print('aa_seq_1=',"\n")
print(aa_seq_str_1,"\n")

#読み枠2の翻訳後を出力
aa_seq_2=codon_while(dna_hairetsu_1,1)
aa_seq_str_2=aa_seq_2.join('')

print('aa_seq_2=',"\n")
print(aa_seq_str_2,"\n")
#読み枠3の翻訳後を出力                                                        
aa_seq_3=codon_while(dna_hairetsu_1,2)
aa_seq_str_3=aa_seq_3.join('')
print('aa_seq_3=',"\n")
print(aa_seq_str_3,"\n")

上のプログラムの結果

一部抜粋
ELVTRNTLKSIFEAEGYDVFEATDGAEMHQILSEYDINLVIMDINLPGKNGLLLARELREQANVALMFLTGRDNEVDKILGLEIGADDYITKPFNPRELTIRARNLLSRTMNLGTVSEERRSVESYKFNGWELDINSRSLIGPDGEQYKLPRSEFRAMLHFCENPGKIQSRAELLKKMTGRELKPHDRTVDVTIRRIRKHFESTPDTPEIIATIHGEGYRFCGDLED_MTKVRNCVLDALSINVNNIISLVVGTFPQDPTVSKTAVILTILTAT_MRITIILVAPARAENIGAAARAMKTMGFSDLRIVDSQAHLEPATRWVAHGSGDIIDNIKVFPTLAESLHDVDFTVATTARSRAKYHYYATPVELVPLLEEKSSWMSHAALVFGREDSGLTNEELALADVLTGVPMVADYPSLNLGQAVMVYCYQLATLIQQPAKSDATADQHQLQALRERAMTLLTTLAVADDIKLVDWLQQRLGLLEQRDTAMLHRLLHDIEKNITK_

となる。
ここに
>遺伝子の名前は表示されない....

補足情報(言語/FW/ツール等のバージョンなど)

Ruby初心者なのでわかりやすくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

この種の処理については既存のライブラリがあるので、それを使いましょう。
http://bioruby.org/archive/doc/Japanese/BR040824-jst/bioruby-tutorial.pdf
このテキストの最終ページに書かれているfastaファイル読み込みプログラムと、2ページ目に書かれているna2aa.rb を組み合わせれば目的は達せられるはずです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.98%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Ruby

    6391questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。