2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

タンパク質の立体構造をSketchUpでモデル化 その2【アミノ酸の側鎖を描画】

Last updated at Posted at 2020-05-03

#はじめに
思い立って、PDB形式のタンパク質の構造データをもとに、SketchUpで3次元立体構造を描いてみることにしました。Rubyは素人ですが、SketchUpのAPIがrubyなので、勉強しながら作っていくつもりです。

ご意見、コメントなど頂けますと大変参考になります。

解析対象のPDBデータについては前回の記事をみてください。

タンパク質の立体構造をSketchUpでモデル化 その1
タンパク質の立体構造をSketchUpでモデル化 その2【アミノ酸の側鎖を描画】
タンパク質の立体構造をSketchUpでモデル化 その3【アミノ酸の側鎖も含めて描画】
タンパク質の立体構造をSketchUpでモデル化 その4【主鎖を立体に】
タンパク質の立体構造をSketchUpでモデル化 その5【玉の描画】
タンパク質の立体構造をSketchUpでモデル化 その6【ついでにDNAをモデル化】
タンパク質の立体構造をSketchUpでモデル化 その7【最終回】

#今回のテーマ
今回のテーマはアミノ酸の側鎖の描画です。アミノ酸20種類それぞについて処理が必要です。
例えばフェニルアラニンのデータは以下の通りです。3つめのフィールドがそれぞれの原子を意味しています。最初の一文字目が元素記号で、C(炭素)に続くアルファベットは、炭素原子を区別する記号です。A、B、G、D、E、Zは、α、β、γ、δ、ε、ζを表すようです。問題は、どの炭素原子が隣り合っているのかよくわからない、ということです。どの原子とどの原子をedgeで連結すべきでしょうか?

また20種類あるアミノ酸それぞれについて、どう描画すべきかを簡潔に整理したいと思います。

ATOM    184  N   PHE A 250     -27.579  31.712  -9.871  1.00 19.79           N  
ATOM    185  CA  PHE A 250     -27.914  30.830  -8.719  1.00 19.26           C  
ATOM    186  C   PHE A 250     -28.791  31.632  -7.752  1.00 22.63           C  
ATOM    187  O   PHE A 250     -29.974  31.534  -7.841  1.00 32.67           O  
ATOM    188  CB  PHE A 250     -26.662  30.210  -8.066  1.00 18.50           C  
ATOM    189  CG  PHE A 250     -25.814  29.377  -9.043  1.00 16.76           C  
ATOM    190  CD1 PHE A 250     -26.430  28.357  -9.799  1.00 15.96           C  
ATOM    191  CD2 PHE A 250     -24.481  29.634  -9.242  1.00 15.84           C  
ATOM    192  CE1 PHE A 250     -25.705  27.632 -10.747  1.00 15.68           C  
ATOM    193  CE2 PHE A 250     -23.749  28.829 -10.161  1.00 16.68           C  
ATOM    194  CZ  PHE A 250     -24.405  27.813 -10.836  1.00 16.39           C  

#計画

  1. アミノ酸ごとに、どの原子とどの原子を連結するかのデータをまとめる。
  2. 連結データは、配列の配列とする。

#まずはフェニルアラニン
フェニルアラニンのedgeを3つに分けて書くことにします。
主鎖はN->CA->C->0、CAから芳香環までは、CA->CB->CG、芳香環はCG->CD1->CD2->CE1->CE2->CZだとして描いてみます。それぞれのつながり方を配列にし、それをさらに配列に入れます。

まずは連想配列の使い方を調べてみました

# 連想配列(Hash)の初期化
atomsAndCoordinates = Hash.new

# 連想配列への、keyとvalueをセット
atomsAndCoordinates["key"] = "value"

データファイルの行、228行目から238行目にフェニルアラニンのデータがあります。

#モデルを取得
model = Sketchup.active_model
entities = model.active_entities

#データファイルの読み込み。chomp: true を引数にすると機能しません....parse error, unexpected ':', expecting ')'と出ます。
lines = IO.readlines("/Users/yoho/Downloads/mmdb_5EPW.pdb")

#フェニルアラニンを描いてみる
PheEdges = [["N","CA","C","O"],["CA","CB","CG"],["CG","CD1","CD2","CE1","CE2","CZ","CG"]]
atomsAndCoordinates = Hash.new
for x in 228..238 do
  data = lines[x].split
  atomsAndCoordinates[data[2]] = Geom::Point3d.new(data[6].to_f, data[7].to_f, data[8].to_f)
end

#配列の配列から、配列を取り出して処理
for pheEdge in PheEdges
    ps = []
    for atom in pheEdge
       ps.push(atomsAndCoordinates[atom])
    end
    entities.add_edges(ps)
end

こんなになりました....
image.png

右下のジグザグな部分が芳香環であると思われます。
ああ、そうか。普段意識してませんでしたが、基準となるカルボキシル基のCの隣からα、β...となるのでした。分岐がある場合は分岐を起点にして、分岐先どちらも同じギリシャ文字+数字がつくのですね。

["CG","CD1","CD2","CE1","CE2","CZ","CG"]ではなくて、["CG","CD1","CE1","CZ","CE2","CD2","CG"]のようです。ここを変更してもう一度描画してみます。

image.png

これでOKですね。側鎖だけ考えれば、描画するのは["CA","CB","CG"]と["CG","CD1","CD2","CE1","CE2","CZ","CG"]で良いことになります。

20種類のアミノ酸それぞれについて、側鎖の原子のつながり方情報を準備します。主鎖は主鎖で別に描画しますので、どうしましょうかね。C=Oは残すことにして、主鎖情報をindex 0にして、C=Oを index 1にすることにします。それ以降は側鎖のデータです。側鎖データを、いくつかに区切った方が良いのかわかりませんが、芳香環は、芳香環として、分けておいたほうが良い気がするので分けます。

PheEdges = [["N","CA","C"],["C","O"],["CA","CB","CG"],["CG","CD1","CE1","CZ","CE2","CD2","CG"]]

同じように20種のアミノ酸全部について、データを整備します。以下のようなデータ形式でまとめます。20種類やるのか....めんどくさいなあ。まあやるか。

aminoacidAndBonds = {
    "PHE" => [["N","CA","C","O"],["CA","CB","CG"],["CG","CD1","CE1","CZ","CE2","CD2","CG"]],
    "GLY" => [["N","CA","C"],["C","O"]]
}

以下のようなコードで、アミノ酸の構造が正しく描画できるかチェック。最初のFor文では、調べたいアミノ酸がファイルの何行目にあるかを記述する(indexが0から始まるので、行番号から1を引いたもの)

atomsAndCoordinates = Hash.new
for x in 719..723 do
  data = lines[x].split
  atomsAndCoordinates[data[2]] = Geom::Point3d.new(data[6].to_f, data[7].to_f, data[8].to_f)
end

for bonds in aminoacidAndBonds["ALA"]
    ps = []
    for atom in bonds
       ps.push(atomsAndCoordinates[atom])
    end
    entities.add_edges(ps)
end

#20種類のアミノ酸データ

aminoacidAndBonds = {
"ALA" => [["N","CA","C"],["C","O"],["CA","CB"]],#A
"CYS" => [["N","CA","C"],["C","O"],["CA","CB","SG"]],#C
"ASP" => [["N","CA","C"],["C","O"],["CA","CB","CG"],["CG","OD1"],["CG","OD2"]],#D
"GLU" => [["N","CA","C"],["C","O"],["CA","CB","CG","CD"],["CD","OE1"],["CD","OE2"]],#E
"PHE" => [["N","CA","C"],["C","O"],["CA","CB","CG"],["CG","CD1","CE1","CZ","CE2","CD2","CG"]],#F
"GLY" => [["N","CA","C"],["C","O"] ],#G
"HIS" => [["N","CA","C"],["C","O"],["CA","CB","CG","ND1","CE1","NE2","CD2","CG"]],#H
"ILE" => [["N","CA","C"],["C","O"],["CA","CB"],["CB","CG1","CD1"],["CB","CG2"]],#I
"LYS" => [["N","CA","C"],["C","O"],["CA","CB","CG","CD","CE","NZ"]],#K
"LEU" => [["N","CA","C"],["C","O"],["CA","CB","CG"],["CG","CD1"],["CG","CD2"]],#L
"MET" => [["N","CA","C"],["C","O"],["CA","CB","CG","SD","CE"]],#M
"ASN" => [["N","CA","C"],["C","O"],["CA","CB","CG"],["CG","OD1"],["CG","ND2"]],#N
"PRO" => [["N","CA","C"],["C","O"],["CA","CB","CG","CD","N"]],#P
"GLN" => [["N","CA","C"],["C","O"],["CA","CB","CG","CD"],["CD","OE1"],["CD","NE2"]],#Q
"ARG" => [["N","CA","C"],["C","O"],["CA","CB","CG","CD","NE","CZ"],["CZ","NH1"],["CZ","NH2"]],#R
"SER" => [["N","CA","C"],["C","O"],["CA","CB","OG"]],#S
"THR" => [["N","CA","C"],["C","O"],["CA","CB"],["CB","OG1"],["CB","CG2"]],#T
"VAL" => [["N","CA","C"],["C","O"],["CA","CB"],["CB","CG1"],["CB","CG2"]],#V
"TRP" => [["N","CA","C"],["C","O"],["CA","CB","CG"],["CG","CD2","CE2","CZ2","CH2","CZ3","CE3","CD2"],["CG","CD1","NE1","CE2"]],#W
"TYR" => [["N","CA","C"],["C","O"],["CA","CB","CG"],["CG","CD1","CE1","CZ","CE2","CD2","CG"],["CZ","OH"]]#Y
}

となりました。これで側鎖も描画しやすくなりました。

#終わりに
次回は、側鎖も含めて立体構造を描画してみたいと思います。

2
0
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
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?