大学の研究でDNAの合成や点変異の導入といった作業をする機会が最近増えてきたため、頻繁にプライマーを設計している。プライマーのTmを算出したり濃度計算するために先生からExcelのファイルをもらったんだけど、イマイチ使いづらい。なのでTmや濃度を計算する簡単なスクリプトをRubyで作ってみた(既存のものを探したほうが早いかもしれないけど)。
必要な機能
- DNA合成PCRプライマーの塩基配列を入力するとTmを算出できる。
- 点変異導入PCRプライマーの塩基配列を入力するとTmを算出できる。
- A260の値を渡すことで濃度を算出できる。
- リバースプライマーの塩基配列を出力できる。
とりあえずこのくらい。
Primerクラスの定義
あまり深く考えずにクラスを作ってみた。
class Primer
def initialize(ary)
@original_ary = ary.upcase
@adenine = @original_ary.count "A"
@guanine = @original_ary.count "G"
@thymine = @original_ary.count "T"
@cytosine = @original_ary.count "C"
@abs_c = @adenine*15300+@guanine*11800+@thymine*9300+@cytosine*7400
end
#m_conメソッド:A260を引数とすることでμMスケールの濃度を算出する
def m_con(abs)
abs.fdiv(@abs_c)*1000000
end
#tmメソッド:アニーリング温度を算出して返す
def tm
60.8+0.41*(@guanine+@cytosine)/@original_ary.size*100-500.fdiv(@original_ary.size)
end
#tm_insertメソッド:点変異導入時に使用。インサート塩基数を引数としてアニーリング温度を算出して返す
def tm_insert(ins_num)
81.5 + 0.41*(@guanine+@cytosine)/@original_ary.size*100-675.fdiv(@original_ary.size-ins_num.to_f)
end
#tm_mismatchメソッド:点変異導入時に使用。ミスマッチ塩基数を引数としてアニーリング温度を算出してお返す
def tm_mismatch(mis_num)
81.5 + 0.41*(@guanine+@cytosine)/@original_ary.size*100-675.fdiv(@original_ary.size) - mis_num.fdiv(@original_ary.size)
end
#rvメソッド。initializeで与えた配列のRv配列を返す
def rv
@original_ary.tr("ATGC", "TACG").reverse
end
end
動作確認
例えばDNA合成を行うに際して、"CTCTGGACTCTAGCACTGAG"というプライマーのTmや濃度を計算する場合、
# task1という名前でインスタンスを作成。コンストラクタに塩基配列を渡す。
task1 = Primer.new "CTCTGGACTCTAGCACTGAG"
# Tmの算出。tmメソッドはTmの値を返す。
p task1.tm
# リバース配列の出力。rvメソッドはインスタンス作成時に渡した塩基配列に対するリバースの配列を返す。
p task1.rv
# 濃度の計算。m_conメソッドはA260の値を引数として受け取り、μMスケールの濃度を返す。
p task1.m_con 61.87
結果
58.349999999999994
"CTCAGTGCTAGAGTCCAGAG"
293.0838465182378
あくまで自分用に作ったものなので色々と雑ですが・・・