LoginSignup
2
0

More than 1 year has passed since last update.

RDKitを使ってペプチドをアミノ酸単位で色付けしてみた

Last updated at Posted at 2022-08-16

はじめに

ペプチドを描画してみたけど、化学になじみがないため、アミノ酸の区切りが良く分からないためアミノ酸単位で色付けしてみたメモ。

まずは普通に描画してみよう

まずはHELM形式で書かれたペプチドをMolに変換し描画してみよう。

mol = Chem.MolFromHELM("PEPTIDE1{C.Y.I.Q.N.C.P.L.G}$$$$")
rdCoordGen.AddCoords(mol)
d2d = rdMolDraw2D.MolDraw2DSVG(450,400)
d2d.DrawMolecule(mol)
d2d.FinishDrawing()
SVG(d2d.GetDrawingText())

はい、どん。

image.png

複数のアミノ酸がペプチド結合でつながっているのは分かるが、どうつながっているのかがいまいちわからない。そこで、アミノ酸単位でハイライトしてみよう。

アミノ酸単位でハイライトしよう

はい、どん。解説はソースのコメントを見てくれ(手抜き)


from rdkit import Chem
from rdkit.Chem import AllChem, Draw, Descriptors, PandasTools,rdCoordGen
from rdkit.Chem.Draw import rdMolDraw2D
from IPython.display import SVG
from io import BytesIO
from PIL import Image
from matplotlib.colors import ColorConverter
import matplotlib
import random

# 指定数分の色を生成する関数
def choose_colors(num_colors):
    # matplotlib.colors.CSS4_COLORSの値だけをリストにする
    tmp = list(matplotlib.colors.CSS4_COLORS.values())
    random.shuffle(tmp)
    # 必要な数だけ先頭から取り出してreturnする
    label2color = tmp[:num_colors]
    return label2color

# とりあえず20色分の色を生成
colorList = [ColorConverter.to_rgb(color) for color in choose_colors(20)]    

# ペプチドをMolオブジェクトに変換
mol = Chem.MolFromHELM("PEPTIDE1{C.Y.I.Q.N.C.P.L.G}$$$$")
rdCoordGen.AddCoords(mol)

# molの結合を読み込み、両端の原子のPDBResidueInfoオブジェクトのResidueNumberを元にハイライトを設定

highlightBonds = []
highlightColors = {}
for bond in mol.GetBonds():
    infoBegin = bond.GetBeginAtom().GetPDBResidueInfo()
    residueNumberBegin = infoBegin.GetResidueNumber()
    nameBegin = infoBegin.GetResidueName()

    infoEnd = bond.GetEndAtom().GetPDBResidueInfo()
    residueNumberEnd = infoEnd.GetResidueNumber()
    nameEnd = infoEnd.GetResidueName()
    
    # 両端の原子が同じResidueNumberを持つ場合のみハイライト
    # (別のResidueNumberを持つ場合、ペプチド結合部であるため)
    if residueNumberBegin == residueNumberEnd:
        highlightBonds.append(bond.GetIdx())
        highlightColors[bond.GetIdx()] = colorList[residueNumberBegin]
    
view = rdMolDraw2D.MolDraw2DSVG(500, 400)
tm = rdMolDraw2D.PrepareMolForDrawing(mol)

# オプションの設定
option = view.drawOptions()
option.multipleBondOffset = 0.09
option.padding = 0.11

# 描画
view.DrawMolecule(tm, highlightAtoms=[], highlightBonds=highlightBonds, highlightBondColors=highlightColors)
view.FinishDrawing()
SVG(view.GetDrawingText())

はい、こんな感じ。

image.png

うーん、微妙。
その原因は以下の通り

  • ハイライトの色のコントラストが弱い。
  • ハイライトの幅が狭い。
  • ハイライトが下の原子や結合と重なって分かりづらい。
  • これら改善点が分かっているにもかかわらず、筆者のRDKitのハンドンリングスキルが弱い(笑)。

ということで、またいつか、リベンジしたいと思います。

参考

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