LoginSignup
3
3

More than 3 years have passed since last update.

DNAやタンパク質の立体構造をRubyで表示すっゾ - GR.rbの場合

Last updated at Posted at 2020-09-05

はじめに

タンパク質の立体構造をRubyで表示するということは古来から人類の夢であり、以前よりいろいろな試みが行われてきました。

この記事では、私がメンテナンスしているグラフ描出ツールGR.rbを利用してタンパク質などの立体構造を表示する方法を説明します。

GR.rb で xyz ファイルを表示しよう

video.gif

GR.rb でDNAの立体構造が記述されている xyz ファイルを表示するスクリプトを動かしたところ。

xyzファイルを入手する

最初にxyz 形式のファイルを保存します。ブラウザからダウンロードしたい方はこちら

wget https://raw.githubusercontent.com/red-data-tools/GR.rb/master/examples/assets/dna.xyz

Rubyスクリプトを作る

次にRubyスクリプトを作成します。ここでは仮に mol.rb としましょう。

ライブラリを読み込みます。

mol.rb
require 'gr'
require 'gr3'
require 'numo/narray'
require 'optparse'

今回は割と真面目にコマンドラインオプションつけてみました。

# コマンドラインオプション
options = { radius: 1.0, size: 500 }
OptionParser.new do |opt|
  opt.on('-o', '--output PATH', String) { |v| options[:save_path] = v }
  opt.on('-r', '--radius VALUE', Float) { |v| options[:radius] = v }
  opt.on('-s', '--size VALUE', Integer) { |v| options[:size] = v }
  opt.on('-t', '--title TITLE', String) { |v| options[:title] = v }
  opt.parse!(ARGV)
  options[:title] ||= ARGV[0]
end

ファイルを読み込みます。ここで残念なお知らせがあって、Rubyではよくあることなのですが、xyz のパーサーは見つかりませんでした。なので自分でファイルからデータを読み込みます。しかし、もともとのファイルの形式が単純なので超簡単です。
原子の表示用の色や、サイズはGR3モジュールに定数にデフォルトの値が保存されているので、それを使いましょう。

# ファイルの読み込み
data = readlines
nrows = data.shift.to_i
puts data.shift
data = data.take(nrows)
data.map! { |row| row.split(/\s+/) }

positions = data.map { |row| row[1..3].map(&:to_f) }
atoms     = data.map { |row| row[0] }.map { |a| GR3::ATOM_NUMBERS[a.upcase] }
colors    = atoms.map { |a| GR3::ATOM_COLORS[a] }
radii     = atoms.map { |a| GR3::ATOM_RADII[a] * options[:radius] }

実際に表示する部分です。ここは、GR.jlのサンプルを参考に書きました。

GR.initgr
GR.setviewport(0, 1, 0, 1)

# ビデオファイル保存
GR.beginprint(options[:save_path]) if options[:save_path]

360.times do |i|
  GR.clearws
  GR3.clear
  GR3.drawmolecule(positions, colors, radii, nil, nil, nil, 2, true, i, 45)
  GR3.drawimage(0, 1, 0, 1, options[:size], options[:size], GR3::DRAWABLE_GKS)
  GR.settextcolorind(0)
  GR.settextalign(GR::TEXT_HALIGN_CENTER, GR::TEXT_VALIGN_TOP)
  GR.text(0.5, 1, options[:title])
  GR.updatews
end

# ファイル保存おわり
GR.endprint if options[:save_path]

GR3.terminate

以上です。
スクリプト全体はこちらのgistになります。

実行する

そのまま半径が少し小さい気がするので、-r 2 として半径を2倍にしてみます。

ruby mol.rb -r2 dna.xyz

output.gif

こんな画面が出てくれれば成功です!

ヘモグロビンの立体構造を表示してみよう

他の分子も表示してみましょう。ここでは有名なタンパク質としてヘモグロビンの構造を表示してみます。

酸素が結合していいない時のヘモグロビンの構造を記述したファイルを日本蛋白質構造データバンク(PDBj: Protein Data Bank Japan)からダウンロードします。

ここでは pdb2hhb.ent というPDBファイル形式のファイルをダウンロードします。
これをOpen Babelというツールを利用して、xyz 形式のファイルに変換します。

# Open Babelのインストール
sudo apt install openbabel

pdb2hhb.ent を xyz ファイルに変換する。

obabel pdb2hhb.ent -O hb.xyz

そして mol.rb で表示します。

ruby mol.rb hb.xyz -s 1000 -o hemoglobin.mp4 -t hemoglobin

GIFアニメに変換する過程でカクカクしてしまっていますが、実際にはもう少し綺麗な動画が保存されます。
-s オプションを上げれば動画はきれいになります。

output.gif

一方で -s を小さくすると、それはそれでドット絵のような味のある動画になります。DNAの例でやるとこんな感じです。

output.gif

往年のゲームのワンシーンみたいです。すみません。とくに学術的な意味はありませんね…。

最後に

さて、Rubyでも実は分子の構造を表示する方法はあるよ〜

という話をしました。「なぜRuby?」という疑問があるかも知れませんが、それについては深く考えないことにしましょう。

最後になりますが、私、こうやって喜んで立体構造のデータを表示していますけど、私、特に分子の構造に詳しいわけではなく完全なる素人です。xyz形式や、PDFファイル形式についても今回はじめて知りました。

なので、もし間違っているところをみつけたら遠慮なくコメント欄に指摘してください。よろしくおねがいします。

この記事は以上です

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3