magattacaのブログ

日付以外誤報

共結晶構造でPLIFを作ろうとした話

これまで化合物ライブラリーの①指標での絞り込み、②部分構造での絞り込みを行なって来ました。今まではリガンド側のことしか考えていなかったので、そろそろタンパク質との関係を考慮に入れたいと思います。ですが、いきなりドッキング(?)はハードルが高いので、まずは共結晶構造をもとに重要な相互作用を確認することから始めたいと思います。

以前、RCSB PDBのviewerを使ってリガンド-受容体相互作用を眺めて遊びました。こんな図が見られます。(PDB id: 5J89)*1

f:id:magattaca:20190223234238p:plain

こういう情報をなんとか格好いい感じで利用したい!!ということで色々と検索していると似たような相互作用解析方法を見つけました。

Protein-Ligand Interaction Profiler(PLIP)というものです。 文献はこちらNucleic Acids Res. 2015(43)W443-447

いい感じで相互作用を解析してくれるみたいなのでPLIPで遊んでみたいと思います。

PLIP?

まずはページの見た目から・・・こんなページです。

f:id:magattaca:20190223234456p:plain

試しに上の複合体(PDB id: 5J89)を投げ込んで見ます。

f:id:magattaca:20190223234335p:plain

相互作用を形式に分けてリストアップしてくれるみたいです。結果をダウンロードしてPyMolで眺めることもできるそうです。プロファイラー格好良い!

認識される相互作用

Supplementary Informationによるとデフォルトで以下のような非共有結合性の相互作用を認識してくれるそうです。

相互作用 基準 変数
疎水性相互作用 Hydrophobic interacrtions 距離 (4.0Å以下) HYDROPH_DIST_MAX
水素結合 Hydrogen Bonds 距離 (4.1Å以下)
角度 (100°以上)
HBOND_DIST_MAX
HBOND_DON_ANGLE_MIN
π-πスタッキング Aromatic Stacking 距離 (7.5Å以下)
角度
(T-stacking 90°±30°、
P-stacking 180°±30°)
環の中心同士の距離 (2.0Å以下)
PISTACK_DIST_MAX
PISTACK_ANG_DEV
PISTACK_OFFSET_MAX
π-カチオン相互作用 Pi-Cation interactions 距離 (6.0Å以下)
(3級アミンは角度も)
PICATION_DIST_MAX
塩橋 Salt Bridges 電荷の中心間の距離 (5.5Å以下) SALTBRIDGE_DIST_MAX
水を介した水素結合 Water-brodged hydrogen bonds 水分子の位置 (2.5Å~4.0Å)
角度2つ
(75°<ω<140°, 100°<θ) )
WATER_BRIDGE_MINDIST, WATER_BRIDGE_MAXDIST
WATER_BRIDGE_OMEGA_MIN, WATER_BRIDGE_OMEGA_MAX
WATER_BRIDGE_THETA_MIN
ハロゲン結合 Halogen bonds 距離 (4.0Å以下)
角度
(Donor 165°±30°,
Acceptor 120°±30°)
HALOGEN_DIST_MAX,
HALOGEN_DON_ANGLE, HALOGEN_ACC_ANGLE, HALOGEN_ANG_DEV

自分のPCにインストール

コマンドラインからも使えるそうなのでインストールしてみます。

Githubの説明によると原子の属性の判別にOpenBabelを使っているそうで、OpenBabel(>= 2.3.2)のインストールが必要だそうです。他にはオプションですが

などに依存しているそうです。

pip install plip

とすることでインストールできますが、Python 2.7.x.で実行してくださいとのことで、pip3としてみたらOpenBabelのwheelがどうのこうのというエラーで止まりました。

解析対象の共結晶構造

今回、相互作用解析を行いたい結晶構造はPD-L1と低分子の共結晶構造です。以前、UniProtの情報をもとに作成した記事から、低分子のものを取り出すと以下となります。

PDB entry Resolution (Å) Chain Positions リガンド リガンドID 文献
5J89 2.20 A/B/C/D 2-134 BMS-202 6GX Oncotarget 2016(7)30323
5J8O 2.30 A/B 18-134 BMS-8 6GZ Oncotarget 2016(7)30323
5N2D 2.35 A/B/C/D 2-134 BMS-37 8J8 J. Med. Chem. 2017(60)5857
5N2F 1.70 A/B 18-134 BMS-200 8HW J. Med. Chem. 2017(60)5857
5NIU 2.01 A/B/C/D 18-134 BMS-1001 8YZ Oncotarget 2017(8)72167
5NIX 2.20 A/B/C/D 18-134 BMS-1166 8YQ Oncotarget 2017(8)72167

登録されている低分子の構造がおかしいのではないか?といった問題はありますが、今回はそのあたりは無視します。(ご興味のある方は以前の記事をご参照いただければと思います。記事1 記事2 記事3

解析実行

PLIPはPDB idさえあればPDBのサーバーからデータをとってきて解析してくれるとのことなので、以下のコマンドをターミナルで実行しました。 (Pythonのパス?の通し方がわからなくてJupyter notebookから使えなかった・・・)

alias plip='python ~/pliptool/plip/plipcmd.py'
plip -i 5J89 -x

「-i PDBID」で解析したい構造のIDを、「-x」とすることで結果をXMLレポートファイルで出力できます。

このまま実行しようとしたところ、以下のようなエラーが出て来ました。

File "/usr/local/lib/python3.7/site-packages/plip/modules/supplemental.py", line 388, in read_pdb
    resource.setrlimit(resource.RLIMIT_STACK, (min(2 ** 28, maxsize), maxsize))
ValueError: current limit exceeds maximum limit

よくわからないので該当の箇所を確認して見ました。

def read_pdb(pdbfname, as_string=False):
    """Reads a given PDB file and returns a Pybel Molecule."""
    pybel.ob.obErrorLog.StopLogging()  # Suppress all OpenBabel warnings
    if os.name != 'nt':  # Resource module not available for Windows
        maxsize = resource.getrlimit(resource.RLIMIT_STACK)[-1]
        resource.setrlimit(resource.RLIMIT_STACK, (min(2 ** 28, maxsize), maxsize))
    sys.setrecursionlimit(10 ** 5)  # increase Python recoursion limit
    return readmol(pdbfname, as_string=as_string)

PDBファイルを読み込むための関数のようです。Pythonライブラリのresourceの説明を見るかぎり、エラーとなっている箇所はプログラムによって使用されているシステムリソースを制限する処理のようです。PDBファイルを読み込むリソースの制限なら外してしまっても良さそうなので、コメントアウトして見ました。

def read_pdb(pdbfname, as_string=False):
    """Reads a given PDB file and returns a Pybel Molecule."""
    pybel.ob.obErrorLog.StopLogging()  # Suppress all OpenBabel warnings
    #if os.name != 'nt':  # Resource module not available for Windows
        #maxsize = resource.getrlimit(resource.RLIMIT_STACK)[-1]
        #resource.setrlimit(resource.RLIMIT_STACK, (min(2 ** 28, maxsize), maxsize))
    sys.setrecursionlimit(10 ** 5)  # increase Python recoursion limit
    return readmol(pdbfname, as_string=as_string)

保存して再度実行したらエラーで止まらずに動き、無事XMLファイルが出力されました。こんな雑なことしていいのかよくわかりませんが、とりあえず動いたので良しとします。

RDKitと組み合わせてPLIFを計算

共結晶構造、全6構造に対して実行し、相互作用の情報を持つXMLファイルを手に入れたもののこれをどうしよう???と思っていたところOxford Protein Informatics Group(OPIG)のブログ記事(How to Calculate PLIFs Using RDKit and PLIP )に行き当たりました。PLIPのデータとRDKitを使ってProtein-Ligand interaction fingerprints (PLIFs)というのを計算できるそうです。

PLIF?

株式会社MOLSISのMOEの機能紹介にPLIFの説明がありました。

「リガンド-受容体間の相互作用の種類と強さをフィンガープリントで表現し、複数の結合状態を統計的に解析します。ドッキング結果や複数の複合体構造に含まれる相互作用を解析することで、活性/不活性に関連する相互作用の検出や、活性/不活性を分類する相互作用組み合わせルールの抽出、ルールに適合する活性ポーズに共通するファーマコフォアの検出などが行えます。」

化合物間の類似性評価にフィンガープリントが用いていましたが、タンパク質との相互作用解析にも拡張した、ということのようです。SAR News No.18の記事「実験と連携できる SBDD へ向けて」によるとPLIFの他にもSIFt(JMC2004(47)337)、aPLIF、aPLIED、Pharm-IF(JCIM2010(50)170)といった手法があるようです。*2

OPIGの真似をする

OPIGで紹介されていた方法は、

  1. PLIPの解析結果を使って結合サイトに含まれるアミノ酸残基と、リガンドとの相互作用に関わる残基を抜き出す
  2. 1.の情報をもとにRDKitでフィンガープリントにする
  3. 2.のフィンガープリントで複合体間の相互作用の類似性を評価

といった流れでした。

早速OPIGのコードをコピペしていきます。(日本語の部分は備忘録として私が加えたものです。)

解析ステップ1

PLIPの解析結果(XMLファイル)から情報を取得します。

# XMLを扱う標準ライブラリ(ElementTree)を使う
import xml.etree.ElementTree as ET

# 結合サイトのアミノ酸残基情報を取り出すための関数を定義
def generate_plif_lists(report_file, residue_list, lig_ident):
    # uses report.xml from PLIP to return list of interacting residues 
    # and update list of residues in binding site
    plif_list_all = []
        
    tree = ET.parse(report_file) #ファイルの読み込み
        
    root = tree.getroot() #ルート要素を取得する
        
    # list of residue keys that form an interaction
        
    for binding_site in root.findall('bindingsite'): #findall()で直接の子要素を検索
                
        nest = binding_site.find('identifiers') #find()で最初の子要素にアクセス
                
        lig_code = nest.find('hetid') #<hetid>タグに記載されたリガンドIDを取得

        if str(lig_code.text) == str(lig_ident):
            #関数の引数に与えたlig_identとリガンドIDが等しい時だけ情報を取得
            #get the plifs stuff here
            nest_residue = binding_site.find('bs_residues')
            #結合サイトに含まれるアミノ酸残基のリストを取得
            residue_list_tree = nest_residue.findall('bs_residue')

            for residue in residue_list_tree:
                res_id = residue.text
                                
                dict_res_temp = residue.attrib #要素の属性(attribute)を取得

                #結合サイトの残基一覧に含まれていない場合は残基を追加する
                if res_id not in residue_list:
                    residue_list.append(res_id)

                #リガンドとの相互作用(contact)TRUEのものだけPLIFリストに追加
                if dict_res_temp['contact'] == 'True':
                    if res_id not in plif_list_all:
                        plif_list_all.append(res_id)

    return plif_list_all, residue_list

では定義した関数を使いましょう。まずは結合サイトに含まれるアミノ酸残基(リガンドとの相互作用の有無は関係なし)を格納するための空のリストを作っておきます。

bs_res_list = [] 

PDBの6つの構造についてPDB IDと、リガンドIDの組み合わせの辞書を作ります。

P_L_dict = {"5J89":"6GX","5J8O":"6GZ","5N2D":"8J8",
            "5N2F":"8HW","5NIU":"8YZ","5NIX":"8YQ"}

contact_res_dict = {}
for pdb_id, lig_id in P_L_dict.items():
    pl = "conres_" + pdb_id
    
    # xmlファイルは各PDB ID名のフォルダにそれぞれ格納した
    xml_path = "PLIP_results/" + pdb_id + "/report.xml"

    pl, bs_res_list = generate_plif_lists(xml_path, bs_res_list, lig_id)
    
    contact_res_dict[pdb_id] = pl

得られた辞書(contact_res_dict)はPDB IDをキーとして、リガンドと接触する残基を値としています。

print(contact_res_dict.keys())
# dict_keys(['5J89', '5J8O', '5N2D', '5N2F', '5NIU', '5NIX'])

print(contact_res_dict['5J89'])
# ['66B', '56B', '121B', '121A', '56A', '115A', '54B', '123A', '115D', '121D', '115C', '121C', '124C', '54D', '56D', '123C', '20C', '56C', '66D']

結合サイトに含まれるアミノ酸残基の全体はbs_res_listに格納されています。

print(len(bs_res_list))
# 136

136個と非常に多いように思います。今回用いた共結晶構造ではPD-L1の2量体に対してリガンドが1つ結合しています。配列の位置としては等しくても、CHAIN名が異なるものを別の残基としてカウントしているため、多くなっているのではないかと思います。

解析ステップ2

残基のリストが得られたのでRDKitのPLIFとします。

以下の関数では結合サイトに含まれるアミノ酸残基全体の長さの次元のビットベクトルを用意し、相互作用に関わっている残基についてビットを立てます。

from rdkit import Chem,  DataStructs
from rdkit.DataStructs import cDataStructs

def generate_rdkit_plif(residue_list, plif_list_all):
    #generates RDKit plif given list of residues in binding site and list of interacting residues
    
    plif_rdkit = DataStructs.ExplicitBitVect(len(residue_list), False)
    for index, res in enumerate(residue_list):
        if res in plif_list_all:
            # print('here') もともとのコードにはあったが面倒なのでコメントアウト
            plif_rdkit.SetBit(index)
        else:
            continue
    return plif_rdkit

rdkit_plif_dict = {}
for pdb_id in contact_res_dict.keys():
    con_res = contact_res_dict[pdb_id]
    
    generated_plif = generate_rdkit_plif(bs_res_list, con_res)
    rdkit_plif_dict [pdb_id] = generated_plif

print(rdkit_plif_dict.keys())
# dict_keys(['5J89', '5J8O', '5N2D', '5N2F', '5NIU', '5NIX'])

6つとも計算されていそうです。一つ取り出して確認してみます。

print(len(rdkit_plif_dict['5J89']))
# 136
print(rdkit_plif_dict['5J89'])
# <rdkit.DataStructs.cDataStructs.ExplicitBitVect object at 0x10d246d88>

長さ136のベクトルが生成されています。ExplictiBitVectオブジェクトの扱い方は「化学の新しいカタチ」さんのこちらの記事RDKitでフィンガープリントを使った分子類似性の判定に記載されていました。

どんな情報が含まれているのか見てみます。

print("全体の長さ:", rdkit_plif_dict['5J89'].GetNumBits())
# 全体の長さ: 136

print("ONビット:", list(rdkit_plif_dict['5J89'].GetOnBits()))
print("ONビットの数:", rdkit_plif_dict['5J89'].GetNumOnBits())
print("OFFビットの数:",rdkit_plif_dict['5J89'].GetNumOffBits())
print("相互作用残基の数:",len(contact_res_dict['5J89']))
# ONビット: [5, 9, 14, 17, 20, 23, 33, 36, 45, 46, 49, 58, 64, 73, 77, 79, 80, 82, 84]
# ONビットの数: 19
# OFFビットの数: 117
# 相互作用残基の数: 19

PDB id 5J89における相互作用に関わる残基の数とRDKitで変換後のONビットの数が一致しています。

DataFrameとheatmapで可視化

ビットベクトルをもう少しわかりやすく眺めたいと思います。目標は先に見た株式会社MOLSISのページのページのように複数の共結晶構造間におけるONビットの位置の違いを並べて可視化することです。

  1. BitVectをnumpyのarrayに変換
  2. データフレームに変換
  3. heatmapで図示

という手順を行ってみます。

import numpy as np

# DataFrameのindex としてPDBのIDを使うためにリストを作成
PDB_id_list = []
finger_print_arrays = []
for pdb_id in rdkit_plif_dict.keys():
    PDB_id_list.append(pdb_id)
    
    # RDKitのBitVectそのままではDataFrameにできなさそうなのでarrayに変換する。
    fp = rdkit_plif_dict[pdb_id]
    arr = np.zeros((1,))
    DataStructs.ConvertToNumpyArray(fp, arr)
    finger_print_arrays.append(arr)

import pandas as pd

#DataFrameを作成
FP_df = pd.DataFrame(finger_print_arrays, index=PDB_id_list)

FP_df

f:id:magattaca:20190223234215p:plain

うまくできていそうです。0ばっかり・・・これがスパースという奴か!!!(適当)

可視化します。

import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

sns.heatmap(FP_df)

f:id:magattaca:20190223234615p:plain

おお!それっぽい!y軸は各複合体(PDB id)で、x軸方向にビットベクトルが並んでいます。各ビットが結合サイトに含まれるアミノ酸残基相当し、黒いところがビットベクトルが立っているリガンドと相互作用する残基となっています。

(私の理解が正しければ・・・X軸方向の並びがアミノ酸配列の並びと正確に一致するかはわかりません。)

各複合体で共通してビットが立っているアミノ酸残基が、複数の複合体で相互作用が維持されている重要な残基と解釈できる・・・はず?

図から雑に解釈

上の図をみると5J8O、5N2FがもっともONビットの分散が小さく、5NIU、5NIXがよりベクトル全体に広がってビットが立っています。

先に、今回のPLIFの方法ではCHAIN毎に区別を行っていると述べました。6つの共結晶構造は全てPD-L1の2量体とリガンド1つとの2対1の複合体ですが、より詳しく見ると

  • 5J8O、5N2Fは「PD-L1 2: Ligand 1」
  • 5J89、5N2D、5NIU、5NIXは「PD-L1 4: Ligand 2」

という違いがあります。タンパク質側のCHAINが4つ含まれている他の複合体と比較して2つしか含まれていない5J8O、5N2Fではとりうるビットベクトルの範囲がそもそも小さいため以上のような結果となっていそうです。

また、5NIU、5NIXでは結合しているリガンドが、他の複合体よりも大きいものとなっています。リガンドが大きい分相互作用する残基が広がっているのかもしれません。

一覧を再掲します。

PDB entry Chain リガンド リガンドID リガンド分子量
5J89 A/B/C/D BMS-202 6GX 419.52
5J8O A/B  BMS-8 6GZ 494.42
5N2D A/B/C/D BMS-37 8J8 448.55
5N2F A/B BMS-200 8HW 497.49
5NIU A/B/C/D BMS-1001 8YZ 594.65
5NIX A/B/C/D BMS-1166 8YQ 643.13

だいたい分子量とビットの広がりが相関があるような気もします。なんとなく3つのグループ(①5J89と5N2D、②5J8Oと5N2F、③5NIUと5NIX)に分かれそうです。

図をぼんやりと眺めていても定性的な類似性しかわかりませんので、定量的な評価を行いたいと思います。

解析ステップ3

フィンガープリント間の類似性評価をTanimoto係数を計算して比較します。関数をコピペ・・・

def similarity_plifs(plif_1, plif_2):

    sim = DataStructs.TanimotoSimilarity(plif_1, plif_2)

    print(sim)

    return sim

6つの構造から2つ取り出してTanimoto係数を計算しますが、一つずつやるのは大変なのでitertoolsを使ってみます。

import itertools

# 重複無しの順列 itertools.permutations(PDB_id_list, 2)
# 重複順列 itertools.product(PDB_id_list, repeat = 2)
# 今回は可視化のために重複ありの組み合わせを使う
tanimoto_list = []

for v in itertools.combinations_with_replacement(PDB_id_list, 2):
    #6つから2つ取り出しi, j とする。
    i, j = v[0], v[1]
    
    plif_i = rdkit_plif_dict[i]
    plif_j = rdkit_plif_dict[j]
    sim = similarity_plifs(plif_i, plif_j)
    
    #用いた2つの構造とTanimoto係数をもつリストを作成
    temp_list = [i, j, sim]
    
    #リストのリストを作成
    tanimoto_list.append(temp_list)

#DataFrameとする
tanimoto_df = pd.DataFrame()
for k in tanimoto_list:
    tanimoto_df.at[k[0], k[1]] = k[2]

#heatmapで可視化
sns.heatmap(tanimoto_df)

f:id:magattaca:20190223234905p:plain

f:id:magattaca:20190223234923p:plain

色の濃い組み合わせを見ると

  1. 5J89、5N2D、0.63
  2. 5J8O、5N2F、0.42
  3. 5NIU、5NIZ、0.56

となっています。ビットベクトルをそのまま可視化した際の定性的な解釈と似た結果となっており、うまく数値化できていそうです。

残基番号のみで再解析

ところで、共結晶構造を見る限りリガンドを挟んでPD-L1の二量体が対称的に配置されているように見えます。対称的ならば配列の番号が大事で、CHAINを区別していることでむしろ同じ相互作用を別のものと判断しているかもしれません。そこでCHAINの情報を取り除いて同じことをやってみたいと思います。

・・・といってもStep 1で取り出した残基の情報から最後のアルファベットを除くだけですが。。。

# 結合サイトの残基からCHAINの情報を除く
bs_res_list_num = []
for i in bs_res_list:
    #文字列から最後の一文字の手前まで取り出す
    j = i[:-1]
    #後でソートしたいので整数型に変換してからリストに加える
    bs_res_list_num.append(int(j))

重複している情報を取り除き、ソートします。

bs_res_list_num_unique = sorted(set(bs_res_list_num))

print(len(bs_res_list_num_unique))
print(bs_res_list_num_unique)

# 40
# [18, 19, 20, 21, 22, 23, 26, 53, 54, 55, 56, 57, 58, 60, 61, 62, 63, 65, 66, 67, 68, 73, 75, 76, 77, 78, 112, 113, 114, 115, 116, 117, 118, 120, 121, 122, 123, 124, 125, 126]

相互作用の残基からCHAINの情報を除きます。今回は重複も先に除きます。

contact_res_dict_num_unique = {}

for k, v in contact_res_dict.items():
    tmp_list = []
    
    for i in v:
        j = i[:-1]
        tmp_list.append(int(j))
    
    tmp_unique = sorted(set(tmp_list))
    contact_res_dict_num_unique[k] = tmp_unique

ビットのリストを取得

RDKitのBitVectを介してからnumpyのarrayに戻すと残基番号の情報が失われてしまうので、OPIGの関数を参考に新しくビットのリストを返す関数を作成してみたいと思います。

def PLIF_list_generator(bs_residues, contact_residues):
    tmp = []
    
    for i in bs_residues:
        if i in contact_residues:
            tmp.append(1)
        else:
            tmp.append(0)
    return tmp

PDB idを行、残基番号を列とするDataFrameを作成します。

FP_df_num = pd.DataFrame(index =PDB_id_list, columns = bs_res_list_num_unique)

for k, v in contact_res_dict_num_unique.items():
    FP_df_num.loc[k] = PLIF_list_generator(bs_res_list_num_unique, v)

f:id:magattaca:20190223235334p:plain

複数の共結晶構造で各残基が相互作用に使われているかを確認したいので、残基ごとのビットの足し算も行っておきます。

FP_df_num.loc['bit_sum']=FP_df_num.sum()

%matplotlib inline
sns.heatmap(FP_df_num)

f:id:magattaca:20190223235423p:plain

なんだかいい感じになってきました!

大事そうな残基を探す

先のBitVectを眺めた際の解釈で、6つの共構造は3つのグループに分かれそうだということでした。ということはbit_sumが5以上のものは3つのグループのすべてで少なくとも一度は使われている残基です。(たぶん・・・)(最初4以上にしていましたが5以上の間違いでした)

取り出して見ましょう。

# queryメソッドは行の抽出なので転置してから使う
# bitの合計5以上を取り出し、indexをリスト化
Frequent_residues = list(FP_df_num.T.query('bit_sum >= 5').index)
print(Frequent_residues)
#[54, 56, 115, 121, 123]

これらは具体的にどんな相互作用なのでしょうか?すべての残基を含んでいそうな「PDB id:5NIX(Ligand:8YQ)」をPLIPのサイトで解析してみましょう。(コマンドラインでの解析を諦めた)

PD-L1 4: Ligand 2」の複合体なのでリガンドが2つ含まれています。結果をテーブルにまとめました。

残基番号 アミノ酸 距離 相互作用 残基番号 アミノ酸 距離 相互作用
8YQ
(chain A/B)
8YQ
(chain C/D)
54C ILE 3.89 Hydrophobic
56B TYR 3.82 Hydrophobic 56C TYR 3.42/3.62 Hydrophobic
115A/B MET 3.70/3.80 Hydrophobic 115C/D MET 3.85/3.82 Hydrophobic
121A/B ALA 3.69/3.75 Hydrophobic 121C/D ALA 3.96/3.57 Hydrophobic
123A TYR 3.80/3.52/3.85 Hydrophobic 123D TYR 3.72 Hydrophobic

リガンドの芳香環が目立っていたのでπ-π相互作用ばかりかと思っていましたが、予想外にメチオニンやアラニンとの相互作用が複数見られました。

もう少し広くカウント数4以上の残基として見ます。

# bitの合計4以上の場合
Frequent_residues4 = list(FP_df_num.T.query('bit_sum >= 4').index)
print(Frequent_residues4)
# [54, 56, 66, 115, 121, 123, 124]

先の結果に66124が加わりました。アミノ酸残基でいうと以下となります。

残基番号 アミノ酸 距離 相互作用 残基番号 アミノ酸 距離 相互作用
8YQ
(chain A/B)
66B GLN 3.72 Hydrophobic 8YQ
(chain C/D)
124A LYS 5.03/3.18 π-cation/Salt Bridges 124D Lys 3.70 Water Bridges/Salt Bridges

疎水性相互作用ばかりだったところに親水性残基のLysが加わりました。こちらの方がバラエティがあって良さそうです。

PLIPのスナップショットを貼っておきます。こんな相互作用です・・・

f:id:magattaca:20190223235835p:plain

まとめ

以上、今回はタンパク質とリガンドの相互作用情報を考察するためPLIP、PLIFといった手法を導入して見ました(コピペですが・・・)。この情報をうまく使えばファーマコフォア(?)を考察できるはず・・・?

色々と間違いがあると思うのでご指摘いただければ幸いです。

*1:AS Rose et al. (2018) NGL viewer: web-based molecular graphics for large complexes. Bioinformatics dio:10.1093/bioinformatics/bty419

*2:他の参考になりそうなスライド