榴蓮忘返 2014
蛋白質(zhì)和配體之間的相互作用就像一把鑰匙開一把鎖油湖,只有完美契合才能發(fā)揮最佳效果。想要設計出高效的藥物,深入了解這些相互作用至關重要嚣鄙。
今天,我們將以 PD-L1 和幾種小分子配體的共晶結構為例串结,帶你一步步利用 PLIP 和 PLIF 等工具哑子,了解蛋白質(zhì)和配體相互作用。
讀完本文肌割,你將學習到:
- 了解 PLIP 和 PLIF 的基本概念及應用卧蜓。
- 掌握利用 RDKit 分析 PLIF 數(shù)據(jù)的方法。
- 學習如何識別關鍵氨基酸殘基以及它們參與的相互作用類型把敞。
引言
我們希望能夠以某種更直觀的方式利用蛋白和配體結合的信息弥奸。在一番搜索之后,找到了一個可以識別相互作用分析方法:Protein-Ligand Interaction Profiler (PLIP)先巴。
PLIP 的文獻:Adasme, Melissa F., et al. "PLIP 2021: expanding the scope of the protein–ligand interaction profiler to DNA and RNA." Nucleic Acids Res., vol. 49, no. W1, 2 July 2021, pp. W530-W534, doi:10.1093/nar/gkab294.
PLIP 看起來能夠很好地分析蛋白配體相互作用其爵。
PLIP?
首先伸蚯,我們來看一下 PLIP 的網(wǎng)頁界面:
嘗試著將復合體(PDB ID: 5J89)提交到 PLIP 中進行分析摩渺,結果如下:
PLIP 看起來能夠很好地將相互作用分類并列出來。分析結果可以下載下來剂邮,并用 PyMol 進行查看摇幻。真心不錯!
識別交互作用的類型
根據(jù) Supplementary Information,默認情況下绰姻,PLIP 可以識別以下非共價相互作用:
相互作用英文基準變量疏水相互作用Hydrophobic interactions距離 (≤ 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°)
環(huán)中心距離 (≤ 2.0?)PISTACK_DIST_MAX
PISTACK_ANG_DEV
PISTACK_OFFSET_MAXπ-陽離子相互作用Pi-Cation interactions距離 (≤ 6.0?)
(三級胺需要考慮角度)PICATION_DIST_MAX鹽橋Salt Bridges電荷中心距離 (≤ 5.5?)SALTBRIDGE_DIST_MAX水介導的氫鍵Water-brodged hydrogen bonds水分子位置 (2.5?~4.0?)
角度 (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
本地安裝 PLIP
安裝環(huán)境要求
PLIP 可以從命令行使用,趕緊嘗試在我的電腦上安裝它狂芋。
根據(jù) Github 上的說明[1]榨馁,PLIP 使用 OpenBabel 來識別原子屬性,因此需要安裝 OpenBabel(>= 2.3.2)帜矾。此外翼虫,PLIP 還依賴于以下可選軟件包:
- PyMOL(>=1.7.x 且支持 Python bindings)
- Imagemagick(>=1.7.x)
- swig
在 Python 2.7.x 環(huán)境下,可以使用以下命令安裝 PLIP:
pip install plip但是屡萤,在嘗試使用 pip3 進行安裝時珍剑,遇到了 OpenBabel wheel 文件相關的錯誤。
安裝過程中遇到的問題及解決方法
在運行 PLIP 時遇到了以下錯誤:
File "/usr/local/lib/python3.7/site-packages/plip/modules/supplemental.py", line 388, in read_pdbresource.setrlimit(resource.RLIMIT_STACK, (min(2 ** 28, maxsize), maxsize))
ValueError: current limit exceeds maximum limit
不太明白錯誤的原因死陆,查看相應的代碼可以發(fā)現(xiàn):
def read_pdb(pdbfname, as_string=False):"""Reads a given PDB file and returns a Pybel Molecule."""
pybel.ob.obErrorLog.StopLogging()
if os.name != 'nt':
maxsize = resource.getrlimit(resource.RLIMIT_STACK)[-1]
resource.setrlimit(resource.RLIMIT_STACK, (min(2 ** 28, maxsize), maxsize))
sys.setrecursionlimit(10 ** 5)
return readmol(pdbfname, as_string=as_string)
這段代碼是一個讀取 PDB 文件的函數(shù)招拙。根據(jù) Python 資源庫 resource[2] 的說明,報錯的代碼似乎是在限制程序使用的系統(tǒng)資源措译。如果限制的是讀取 PDB 文件的資源别凤,那么應該可以注釋掉這段代碼。
修改后的代碼如下:
def read_pdb(pdbfname, as_string=False):"""Reads a given PDB file and returns a Pybel Molecule."""
pybel.ob.obErrorLog.StopLogging()
sys.setrecursionlimit(10 ** 5)
return readmol(pdbfname, as_string=as_string)
保存文件后再次運行领虹,程序不再報錯闻妓,并成功輸出了 XML 文件。雖然不確定這樣做是否妥當掠械,但至少程序可以正常運行了由缆。
另外還有一種很好的辦法,那就是使用:docker 猾蒂。它非常簡單均唉,一行命令就能搞定。這里就不再贅述肚菠。
分析共晶體結構數(shù)據(jù)
這次我想要分析的共晶體結構是 PD-L1 和小分子的共晶體結構舔箭。整理小分子的信息如下:
PDB entryResolution (?)ChainPositions配體配體 ID文獻5J892.20A/B/C/D2-134BMS-2026GXOncotarget 2016(7)303235J8O2.30A/B18-134BMS-86GZOncotarget 2016(7)303235N2D2.35A/B/C/D2-134BMS-378J8J. Med. Chem. 2017(60)58575N2F1.70A/B18-134BMS-2008HWJ. Med. Chem. 2017(60)58575NIU2.01A/B/C/D18-134BMS-10018YZOncotarget 2017(8)721675NIX2.20A/B/C/D18-134BMS-11668YQOncotarget 2017(8)72167運行分析
命令行使用方法
PLIP 可以通過 PDB ID 從 PDB 服務器上獲取數(shù)據(jù)并進行分析,因此在終端中運行以下命令:
alias plip='python ~/pliptool/plip/plipcmd.py'plip -i 5J89 -x
-i PDBID 用于指定要分析的結構的 ID蚊逢,-x 用于將結果輸出為 XML 報告文件层扶。
RDKit 與 PLIF 計算
PLIF 是什么?
PLIF(Protein-Ligand Interaction Fingerprints)是一種使用指紋描述配體-受體相互作用類型和強度的統(tǒng)計方法烙荷,用于分析多個結合狀態(tài)镜会。
它可以分析對接結果或多個復合物結構中包含的相互作用,以:
- 檢測與活性/非活性相關的相互作用
- 提取對活性/非活性進行分類的相互作用組合規(guī)則
- 檢測符合規(guī)則的活性 pose 共有的藥效團
其他類似方法
除了 PLIF 之外终抽,還有其他類似的方法戳表,例如:
- SIFt (JMC2004(47)337[3])
- aPLIF
- aPLIED
- Pharm-IF (JCIM2010(50)170[4])
分析之提取信息
import xml.etree.ElementTree as ETdef generate_plif_lists(report_file, residue_list, lig_ident):
plif_list_all = []
tree = ET.parse(report_file)
root = tree.getroot()
for binding_site in root.findall('bindingsite'):
nest = binding_site.find('identifiers')
lig_code = nest.find('hetid')
if str(lig_code.text) == str(lig_ident):
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
if res_id not in residue_list:
residue_list.append(res_id)
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 = []
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_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
print(contact_res_dict.keys())
print(contact_res_dict['5J89'])
print(len(bs_res_list))
結果分析:結合位點氨基酸殘基
- 代碼首先定義了一個函數(shù)generate_plif_lists桶至,用于從 PLIP 的分析結果(XML 文件)中提取信息。
- 然后創(chuàng)建了一個空列表bs_res_list匾旭,用于存儲結合位點的所有氨基酸殘基镣屹,以及一個字典P_L_dict,用于存儲 PDB ID 和配體 ID 的對應關系价涝。
- 接下來女蜈,代碼遍歷P_L_dict中的所有鍵值對,并調(diào)用generate_plif_lists函數(shù)色瘩,將結果存儲在contact_res_dict字典中鞭光。
- contact_res_dict字典的鍵是 PDB ID,值是與配體接觸的殘基列表泞遗。
- 最后,代碼打印了contact_res_dict字典的鍵席覆、contact_res_dict['5J89']的值史辙,以及bs_res_list的長度。
結果顯示佩伤,bs_res_list的長度為 136聊倔,表明結合位點包含 136 個氨基酸殘基。
共晶體結構中的配體似乎以 PD-L1 二聚體為中心對稱排列生巡。如果確實是這種情況耙蔑,那么氨基酸序列的位置就比區(qū)分 CHAIN 更重要。因此孤荣,我們嘗試在不區(qū)分 CHAIN 信息的情況下重新進行分析甸陌。
實際上,這只需要從提取信息中提取的殘基信息中刪除最后一個字母即可盐股。
bs_res_list_num = []for i in bs_res_list:
# 去除CHAIN信息
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)
接下來钱豁,我們從相互作用的殘基信息中刪除 CHAIN 信息,并去除重復信息疯汁。
contact_res_dict_num_unique = {}for k, v in contact_res_dict.items():
tmp_list = []
for i in v:
# 從相互作用殘基中去除CHAIN信息
j = i[:-1]
tmp_list.append(int(j))
tmp_unique = sorted(set(tmp_list))
contact_res_dict_num_unique[k] = tmp_unique
獲取比特列表
直接使用 RDKit 的 BitVect 并將其轉(zhuǎn)換回 numpy 數(shù)組會導致殘基編號信息的丟失牲尺。為了解決這個問題,創(chuàng)建一個新的函數(shù)來生成比特列表幌蚊。
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
然后谤碳,我們創(chuàng)建一個 DataFrame,其中行表示 PDB ID溢豆,列表示殘基編號蜒简。
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)
結果如下:
為了方便觀察哪些殘基在多個共晶體結構中都參與了相互作用,我們計算每個殘基的比特和漩仙。
FP_df_num.loc['bit_sum']=FP_df_num.sum()最后臭蚁,使用熱圖可視化結果:
%matplotlib inlinesns.heatmap(FP_df_num)
尋找重要殘基
根據(jù)之前的分析最铁,6 個共晶體結構可以分為 3 組。因此垮兑,bit_sum大于等于5的殘基意味著它至少在 3 組中的每一組中都出現(xiàn)過一次冷尉。
Frequent_residues = list(FP_df_num.T.query('bit_sum >= 5').index)print(Frequent_residues)
這些殘基具體涉及哪些相互作用呢?我們以包含所有這些殘基的PDB ID: 5NIX (配體: 8YQ)為例系枪,使用 PLIP 網(wǎng)站進行分析雀哨。
5NIX是一個「PD-L1 4: Ligand 2」的復合體,包含兩個配體私爷。分析結果如下表所示:
殘基編號氨基酸距離相互作用
殘基編號氨基酸距離相互作用8YQ
(chain A/B)
8YQ
(chain C/D)54CILE3.89疏水相互作用
56BTYR3.82疏水相互作用
56CTYR3.42/3.62疏水相互作用
115A/BMET3.70/3.80疏水相互作用
115C/DMET3.85/3.82疏水相互作用
121A/BALA3.69/3.75疏水相互作用
121C/DALA3.96/3.57疏水相互作用
123ATYR3.80/3.52/3.85疏水相互作用
123DTYR3.72疏水相互作用
分析結果顯示雾棺,除了預期的與配體芳香環(huán)的 π-π 相互作用外,還觀察到多個與甲硫氨酸和丙氨酸的相互作用衬浑。
接下來捌浩,我們將bit_sum的門檻降低到 4,看看會有什么新的發(fā)現(xiàn)工秩。
Frequent_residues4 = list(FP_df_num.T.query('bit_sum >= 4').index)print(Frequent_residues4)
結果中新增了殘基66和124尸饺,對應如下表所示:
殘基編號氨基酸距離相互作用
殘基編號氨基酸距離相互作用8YQ
(chain A/B)66BGLN3.72疏水相互作用8YQ
(chain C/D)
124ALYS5.03/3.18π-陽離子/鹽橋
124DLys3.70水橋/鹽橋
除了疏水相互作用外,新增了親水性殘基 Lys助币,使相互作用類型更加多樣化浪听。
以下是 PLIP 分析結果的截圖,展示了這些相互作用的具體情況:
總結
本文介紹了蛋白質(zhì)-配體相互作用指紋(PLIF)方法眉菱,該方法結合了蛋白質(zhì)-配體相互作用分析軟件(PLIP)和化學信息學工具包 RDKit迹栓,用于分析蛋白質(zhì)-配體相互作用。
首先俭缓,利用 PLIP 軟件分析了 6 個 PD-L1 共晶體結構克伊,獲得了配體與蛋白質(zhì)殘基之間的相互作用信息。然后华坦,根據(jù) OPIG 博客介紹的方法答毫,利用 RDKit 將 PLIP 的分析結果轉(zhuǎn)換為 PLIF。
為了便于比較不同共晶體結構之間的相互作用模式季春,將 PLIF 表示為位向量洗搂,并使用熱圖可視化。結果表明载弄,根據(jù)位向量的分布耘拇,6 個共晶體結構可以分為 3 組,這與配體的分子量和蛋白質(zhì)鏈的數(shù)量有關宇攻。
為了進一步分析惫叛,去除了蛋白質(zhì)鏈信息,僅根據(jù)殘基編號重新生成了 PLIF逞刷。結果表明嘉涌,殘基 54妻熊、56、115仑最、121扔役、123 在所有 6 個共晶體結構中都參與了相互作用,而殘基 66 和 124 在至少 4 個結構中參與了相互作用警医。
通過分析 PLIP 的交互圖亿胸,發(fā)現(xiàn)這些殘基主要參與了疏水相互作用、π-陽離子相互作用预皇、鹽橋和水橋等相互作用侈玄。
PLIF 方法可以用于分析多個共晶體結構,識別關鍵的蛋白質(zhì)-配體相互作用殘基吟温,并為藥物設計提供指導序仙。未來可以進一步探索 PLIF 在以下方面的應用:
- 結合虛擬篩選結果,優(yōu)化化合物庫的設計和篩選策略鲁豪。
- 建立定量構效關系模型潘悼,預測化合物的活性。
- 分析蛋白質(zhì)-蛋白質(zhì)相互作用呈昔,研究蛋白質(zhì)的功能和調(diào)控機制。
— 完 —你一般是如何識別關鍵殘基? 歡迎大家在評論區(qū)留言友绝,分享您的想法和經(jīng)驗堤尾!
對相關內(nèi)容感興趣的讀者,可以添加小編微信加入讀者實名交流互助群迁客。添加時請主動注明姓名-企業(yè)-職位/崗位 或 姓名-學校-職務/研究方向郭宝。
參考資料
[1]Github 上的說明: https://github.com/ssalentin/plip
[2]resource: https://docs.python.org/ja/3.8/library/resource.html
[3]JMC2004(47)337: https://pubs.acs.org/doi/abs/10.1021/jm030331x
[4]JCIM2010(50)170: https://pubs.acs.org/doi/abs/10.1021/ci900382e