創薬向けの分子生成モデル「DiffPharma」をローカル環境に実装して試してみたいと思います。
実行環境
- OS: Ubuntu 22.04.3 LTS
- CPU: AMD Ryzen 7 5700X 8-Core Processor
- GPU: NVIDIA GeForce RTX 3060 Ti (8G)
- RAM: 32GB
DiffPharma について
DiffPharmaは、東京科学大学の関島研究室(Masami Sako ら)によって開発された “相互作用制約付きの3D分子生成モデル”です。
従来のドッキングやバーチャルスクリーニングのように候補化合物を大量に検索するのではなく、
タンパク質ポケットを条件に “結合しやすい分子そのものを3Dで生成する” というアプローチをとります。
本手法の直接の前身にあたるのが「DiffInt」です。
DiffInt では、水素結合などの特定の相互作用をpseudo-particleとして扱い、相互作用を満たす分子を生成する拡散モデルの基盤を確立しました。
DiffPharma はこれをさらに発展させ、水素結合・疎水相互作用など複数種類の “構造ベース・ファーマコフォア” を統合的に扱えるようにしたモデルとして位置づけられます。
今回は、DiffPharmaを利用した分子生成を試してみたいと思います。
環境構築
※NVIDIAのGPU環境を想定しています。NVIDIAのGPUがない、あるいはGPUドライバーをインストールしていない環境では、適切な動作となりませんのでご注意ください。
Githubの内容を参考にconda環境の構築を行います。
以下、私の環境で利用したコマンドです。パッケージの依存関係でエラーが頻発しましたが、今回コードを動かすぶんには問題ありませんでした。
conda create -n diffpharma python==3.10.4 -y
conda activate diffpharma
conda install openbabel -c conda-forge -y
conda install conda-forge/label/cf202003::oddt -y
pip install scipy==1.9.3 scikit-learn==1.1.3 --no-cache-dir --force-reinstall
pip install torch==2.0.1 --extra-index-url https://download.pytorch.org/whl/cu118
pip install torch torchvision==0.15.2 torchaudio==2.0.2 --index-url https://download.pytorch.org/whl/cu118
pip install pytorch-lightning==1.8.4
pip install rdkit==2022.9.2
pip install biopython==1.79
pip install imageio==2.21.2
pip install pyg-lib torch-scatter -f https://data.pyg.org/whl/torch-2.0.1+cu118.html
pip install networkx==2.8.6
pip install py3Dmol
pip install wandb==0.13.1
pip install seaborn
conda install jupyter -c conda-forge -y
学習済みモデル(Pytorchのckptファイル)は、別のサイトから入手することができます。
保存場所はどこでも問題ありませんが、以下のようにクローンしたリポジトリのどこかへ設置するのが無難でしょう。
cd (任意のディレクトリ)
git clone https://github.com/sekijima-lab/DiffPharma.git
cd DiffPharma
wget https://zenodo.org/record/15428723/files/DiffPharma_best.ckpt
以上で環境構築は完了です。
なお、conda環境の作成にはリポジトリのyamlファイルを利用することも可能です。
ただし、defaulのチャンネルが設定されているため営利組織で利用する際はご注意ください(参考:「Anacondaが有償化されて困っている人に贈る、Pythonのパッケージ管理」)。
DiffPharma の操作
DiffPharmaを利用した分子生成を実行します。
データのダウンロード
DiffPharmaで分子を生成するためには、標的タンパク質の構造情報(+リファレンスとなるリガンドの構造情報)が必要になります。
今回は、Protein Data Bank(PDB) から「2RH1(β2 アドレナリン受容体)」と「1H1Q(サイクリン依存性キナーゼ2)」を取得して分子生成を行います。
まずは、jupyter notebook上で次のコードを実行し、各複合体のPDBファイルを取得します。
import os
base_dir = "" # 任意の作業ディレクトリ
dp_dir = "" # DiffPharma のリポジトリのパス(ローカル)
# データのダウンロード
data_dir = base_dir + "/data"
os.makedirs(data_dir, exist_ok=True)
%cd {data_dir}
!wget https://files.rcsb.org/download/2RH1.pdb
!wget https://files.rcsb.org/download/1H1Q.pdb
%cd {base_dir}
リガンドとタンパク質の分割
PDBから取得した構造情報には、リガンドとタンパク質以外の情報(水、脂質、ペプチド、など)も含まれています。
この中から、リガンド単体のファイル(.sdf)とタンパク質単体のファイル(.pdb)を作成するために、PyMOLを利用します。
参考:PyMOLのインストール/起動方法(conda環境)
- conda create -n pymol python=3.10 -y
- conda activate pymol
- conda install pymol-open-source
- pymol
データクレンジングのために、PyMOL上で以下のコマンドを実行します。”/path/to/data”には、先程設定した”data_dir”のパスを指定します。
# 2RH1
remove resn HOH
remove resn 12P
remove resn CLR
remove resn PLM
remove resn SO4
remove resn BU1
remove resn ACM
remove resn GLC
select resn CAU
create ligand, sele
select not resn CAU
create protein, sele
save /path/to/data/2RH1_ligand.sdf, ligand
save /path/to/data/2RH1_protein, protein
delete all
# 1H1Q
remove resn HOH
remove chain C
remove chain D
select resn 2A6
create ligand, sele
select not resn 2A6
create protein, sele
save /path/to/data/1H1Q_ligand.sdf, ligand
save /path/to/data/1H1Q_protein, protein
delete all
分子生成
jupyter notebook上で次のコードを実行し、各タンパク質に対する分子生成を実行します。コード全体の実行時間は約1時間で、分子生成は1標的あたり20~30分(デフォルト設定)でした。
# パスの指定
cp_path = dp_dir + "/DiffPharma_best.ckpt" # モデルのパス
out_dir1 = base_dir + "/result_1H1Q"
os.makedirs(out_dir1, exist_ok=True)
pdb_path1 = data_dir + "/1H1Q_protein.pdb"
ligand_path1 = data_dir + "/1H1Q_ligand.sdf"
out_dir2 = base_dir + "/result_2RH1"
os.makedirs(out_dir2, exist_ok=True)
pdb_path2 = data_dir + "/2RH1_protein.pdb"
ligand_path2 = data_dir + "/2RH1_ligand.sdf"
# リガンドのクレンジング
%cd {data_dir}
!obabel {ligand_path1} -O {ligand_path1}
!obabel {ligand_path2} -O {ligand_path2}
%cd {base_dir}
# 1H1Q
%cd {dp_dir}
!python test_single.py \
--checkpoint {cp_path} \
--outdir {out_dir1} \
--pdb {pdb_path1} \
--sdf {ligand_path1}
# 2RH1
%cd {dp_dir}
!python test_single.py \
--checkpoint {cp_path} \
--outdir {out_dir2} \
--pdb {pdb_path2} \
--sdf {ligand_path2}
生成された構造について
各標的の生成構造から抜粋したものを以下に示します。
水素結合が取れそうな原子間は黄色破線で表しています。他の相互作用は自信がなかったので表示していません。


生成構造を確認した感想として、”相互作用は取りに行くものの発生構造に偏りがある”と感じました。
また、”標的によって良い構造が出やすい・出にくいがあるのかな?”と思いました(今回は、2RH1の方が良い構造が多い印象を受けました)。
今回はデフォルト設定の生成数(100構造)で実施しましたが、数を増やせばより良い構造が出てくるかもしれません。
最後に
創薬向けの分子生成モデル「DiffPharma」を試しました。
Diffusion系の分子生成モデルが非常に高性能になってきたなと感じました。現状の性能で部分構造を発生できるモデルがあれば、非常に面白いなと個人的には思います。
今回利用したコード(.ipynb)はこちらから利用可能です。参考になれば幸いです


コメント