本記事はDockstringを使ったIn silico screeningの記事です。この記事が理解できると、コードだけでIn silicoスクリーニングができます。 ぜひ、トライしてみてください!
Apple M1 Pro, MacOS 14.6.1, JupyterLab
自宅でできるin silico創薬の技術書を販売中
新薬探索を試したい方必読!
ITエンジニアである著者の視点から、wetな研究者からもdryの創薬研究をわかりやすく身近に感じられるように解説しています
目次
In silico screeningとは?
In silico screening(インシリコスクリーニング)とは、バーチャルスクリーニングの一種で、コンピューターシミュレーションを使用して、大規模な分子ライブラリーから、特定の生物学的標的に対して有望な化合物を選別するプロセスです。
In silico screeningでは、コンピューターモデルを用いて、大量の化合物の構造情報や生物学的活性を予測し、検討対象とするターゲットに対して最適な化合物を探索することができます。
このプロセスは、実験的に合成する前に、有望な化合物を選別し、合成の労力や費用を節約することができます。また、実験的なスクリーニングよりも高速であり、より多くの化合物を同時に検討できるため、薬物開発の効率を高めることができます。
In silico screeningは、薬剤の探索や、化学物質の特性予測、新しい材料の設計など、様々な分野で活用されています。
今回はプログラムを使って、簡単に分子ドッキングを行うことのできるDockstringを使って、In silicoスクリーニングを行います。
Dockstringとは?
Dockstringは、化合物のSMILES表記を使って分子ドッキングを簡単に実行できるPythonパッケージです。薬物設計のためのデータセットとベンチマークタスクを提供し、ドッキング結果を基にした評価をサポートします。このツールはLinuxとMacに対応しており、分子の結合評価やリガンド設計に役立ちます。インストールはCondaで行い、RDKitやOpenBabelというソフトウェアを使います。
Anacondaによる環境構築
環境はAnacondaに入っているJupyterLabを使って行います。
まずこちらからAnacondaをダウンロードしてください。
メールを登録すれば、ダウンロードページに行き、Anacondaをダウンロードできます。
以下はダウンロードページ
downloadできると、Anacondaを開き、
特に何もすることなく、続けるを押して、インストールをしていってください。
インストールが完了するとAnaconda-Navigatorのアイコンがあると思うので、クリックして起動してください。
開くと以下の画面になっていると思うので、JupyterLabのLaunchを押してください。
開くと以下の画面になっています。
Python3を押して、NoteBookを開いてください。
以下の画面になっていると思います。青の四角に囲まれている箇所にpythonのCodeを書いて実行していきます。左にはWorking Directoryがあります。
Dockstringの使用環境の準備
# dockstringのインストール
!conda install -y -q -c conda-forge dockstring
!
- これはJupyter NotebookやGoogle Colabのセルでシステムコマンドを実行するための記号です。通常、
conda
コマンドはターミナルで実行しますが、Jupyter Notebookなどのインターフェースで使用する場合は、先頭に!
をつけることで実行できます。
conda
conda
はパッケージマネージャの名前です。conda
を使ってパッケージをインストール、更新、削除、管理することができます。
install
- これは
conda
に「パッケージをインストールして」という指示です。install
の後には、インストールしたいパッケージ名が続きます。
y
y
は「yes」の短縮形で、すべてのプロンプトに対して自動的に「はい」と回答するオプションです。通常、Condaはパッケージのインストール時に「このパッケージを本当にインストールしますか?」と確認を求めますが、このオプションをつけることでユーザーの手動入力を不要にしています。
q
q
は「quiet(静かに)」の意味で、実行中に余計なメッセージやログを表示しないようにするオプションです。これにより、ログの出力が少なくなり、必要最低限の情報だけが表示されます。
c conda-forge
c
は「チャンネル(channel)」を指定するためのオプションです。Condaは複数のリポジトリ(パッケージが保存されている場所)を持っていて、どこからパッケージをインストールするかを指定することができます。conda-forge
は、Condaの人気のあるコミュニティベースのチャンネルの1つで、多くのパッケージがここで管理・配布されています。このコマンドでは、dockstring
パッケージをconda-forge
チャンネルからインストールするよう指示しています。
dockstring
- これはインストールしたいパッケージの名前です。
dockstring
を指定しています。
Shift + Enterを押して、コードを実行しつつ、新しいCellを作成してください。
# 各ライブラリをインストール
from dockstring import load_target
from rdkit import Chem
from rdkit.Chem import Draw
from dockstring import load_target
dockstring
というライブラリからload_target
関数をインポートしています。load_target
関数は、指定されたターゲット(通常はタンパク質や酵素)の情報をロードするために使います。
from rdkit import Chem
rdkit
は化学構造の操作や可視化に特化したライブラリです。この行は、Chem
モジュールをインポートしています。Chem
モジュールには、SMILES表記から分子を作成したり、分子操作を行ったりするための関数が含まれています。
from rdkit.Chem import Draw
Draw
は、RDKitの中のモジュールで、分子の構造を画像として描画するために使用します。これにより、SMILES表記や分子オブジェクトを視覚的に表示できます。
以上でDockstringの使用環境の準備は終了です。
In silicoスクリーニング
PyRxではタンパク質の準備と低分子化合物の準備が必要でしたが、Dockstringではタンパク質は名称を指定(Dockstring内で定義してあれば)、低分子化合物はSMILE表記で指定するだけでIn silicoスクリーニングすることができます。
今回はできるだけ簡単にするために、3つの化合物からなる小規模ライブラリを作成しています。
リストの中に化合物を増やせば、もっと数の多くの化合物をスクリーニング可能です。
以下を実行してください。
# 標的タンパク質DPP4を指定
target = load_target('DPP4')
# 3つのリガンドのSMILES表記を指定
ligands = [
"CC1=NN2C=C(C=NC2=C1)C(=O)NCC(C)(C)NCC(=O)N3CCC[C@H]3C#N", # Anagliptin
"CS(=O)(=O)n1cc2c(n1)CN([C@H]1CO[C@H](c3cc(F)ccc3F)[C@@H](N)C1)C2", # Omarigriptin
"C1[C@@H]([C@@H]([C@H]([C@@H]([C@]1(CO)O)O)O)O)NC(CO)CO" # Voglibose
]
target = load_target('DPP4')
load_target
関数を使って、「DPP4」(Dipeptidyl Peptidase-4、ジペプチジルペプチダーゼ4)というタンパク質を指定しています。- DPP4 は、糖尿病などの代謝疾患に関連する酵素で、インクレチンというホルモンの分解に関与します。DPP4を阻害することで血糖値をコントロールする薬が開発されています。
ligands = [...]
- この部分で、3つのリガンド(化合物)のSMILES表記をリストとして定義しています。それぞれの化合物は、DPP4をターゲットとする医薬品やその候補物質です。
各リガンドの説明:
- Anagliptin:
- SMILES表記:
"CC1=NN2C=C(C=NC2=C1)C(=O)NCC(C)(C)NCC(=O)N3CCC[C@H]3C#N"
- 説明: アナグリプチンはDPP4阻害薬の一つで、2型糖尿病の治療薬として用いられます。DPP4の活性を阻害することで、血糖値を調節するホルモン(インクレチン)の作用を延長し、血糖値のコントロールを改善します。
- SMILES表記:
- Omarigliptin:
- SMILES表記:
"CS(=O)(=O)n1cc2c(n1)CN([C@H]1CO[C@H](c3cc(F)ccc3F)[C@@H](N)C1)C2"
- 説明: オマリグリプチンもDPP4阻害薬で、主に糖尿病の管理に使用されます。週に1度の投与で効果を発揮するのが特徴で、血糖値の長期的な管理を目指した薬です。
- SMILES表記:
- Voglibose:
- SMILES表記:
"C1[C@@H]([C@@H]([C@H]([C@@H]([C@]1(CO)O)O)O)O)NC(CO)CO"
- 説明: ボグリボースは、α-グルコシダーゼ阻害薬で、糖の吸収を遅らせることで食後の血糖値上昇を抑えるために使用されます。DPP4阻害薬とは作用機序が異なりますが、糖尿病治療に用いられることが多いです。こちらは通常はDPP4に作用しないNegativeコントロールとして入れています。
- SMILES表記:
続いて、以下のコードを実行してください。
# 最も低いスコアを探すための変数
best_score = float('inf')
best_ligand = None
best_smiles = None
# 各リガンドに対してドッキングを実行し、最も低いスコアのリガンドを特定
for smiles in ligands:
score, aux = target.dock(smiles)
print(f"SMILES: {smiles}")
print(f"Docking Score: {score}\\n")
# 最も低いスコアを持つリガンドを更新
if score < best_score:
best_score = score
best_ligand = Chem.MolFromSmiles(smiles)
best_smiles = smiles
コード全体の流れ:
- 初期化:
best_score
を無限大に設定し、最初にドッキングシミュレーションを行ったリガンドのスコアで初期値が設定されるようにしています。 - ループ:リガンドのSMILES表記を使ってドッキングシミュレーションを実行し、各リガンドのスコアを計算します。
- スコア比較:計算したスコアがこれまでの最も低いスコアよりも低ければ、そのリガンドを新しい「最良のリガンド」として更新します。
- 結果の保存:最も低いスコアのリガンドのSMILES表記とその分子構造を保存しておきます。
コードの詳細な説明:
best_score
:最も低いスコアを記録するための変数です。float('inf')
は無限大を表しており、最初に最も低いスコアを見つけるために無限大に設定しています。これにより、最初のスコアが自動的に最低スコアとして更新されるようになります。best_ligand
:最も低いスコアを持つリガンドの分子構造を保存するための変数です。初期状態ではNone
(何もない状態)に設定されています。best_smiles
:最も低いスコアを持つリガンドのSMILES表記を保存するための変数です。これも初期状態ではNone
に設定されています。for smiles in ligands
:リストligands
に含まれている全てのSMILES表記(リガンドの化学構造を表す文字列)に対してループ処理を行います。ligands
リストには3つのリガンドが含まれています。score, aux = target.dock(smiles)
:target.dock(smiles)
は、指定されたリガンド(SMILES表記)に対してドッキングシミュレーションを実行します。score
はドッキングのスコア(結合の強さを示す数値)で、aux
には追加のデータ(補足情報)が格納されますが、この例ではscore
のみを使用しています。print(f"SMILES: {smiles}")
:現在処理しているリガンドのSMILES表記を出力します。print(f"Docking Score: {score}\\n")
:ドッキングのスコアを出力します。スコアが低いほど、リガンドがターゲットに強く結合することを意味します。if score < best_score
:この条件は、新しく計算されたドッキングスコアscore
が、これまでの最も低いスコアbest_score
より小さいかどうかを確認します。もし小さい場合は、次の処理を実行します。best_score = score
:新しい最も低いスコアをbest_score
に保存します。best_ligand = Chem.MolFromSmiles(smiles)
:SMILES表記をもとに、RDKitのChem.MolFromSmiles
関数を使ってリガンドの分子構造を生成し、それをbest_ligand
に保存します。best_smiles = smiles
:最も低いスコアを持つリガンドのSMILES表記をbest_smiles
に保存します。
実行すると以下のような出力が出てきます。
/Users/kshinba/opt/anaconda3/lib/python3.9/site-packages/dockstring/utils.py:77: DockstringWarning: Although Mac use is supported, docking scores on Mac do not always perfectly match scores from Linux. Therefore, extra care should be taken when comparing results to other platforms. In particular, the baselines in the DOCKSTRING paper were computed on Linux, so please do not directly compare your docking scores to the scores reported on the paper.
warnings.warn(
SMILES: CC1=NN2C=C(C=NC2=C1)C(=O)NCC(C)(C)NCC(=O)N3CCC[C@H]3C#N
Docking Score: -7.9
/Users/kshinba/opt/anaconda3/lib/python3.9/site-packages/dockstring/utils.py:77: DockstringWarning: Although Mac use is supported, docking scores on Mac do not always perfectly match scores from Linux. Therefore, extra care should be taken when comparing results to other platforms. In particular, the baselines in the DOCKSTRING paper were computed on Linux, so please do not directly compare your docking scores to the scores reported on the paper.
warnings.warn(
SMILES: CS(=O)(=O)n1cc2c(n1)CN([C@H]1CO[C@H](c3cc(F)ccc3F)[C@@H](N)C1)C2
Docking Score: -9.7
/Users/kshinba/opt/anaconda3/lib/python3.9/site-packages/dockstring/utils.py:77: DockstringWarning: Although Mac use is supported, docking scores on Mac do not always perfectly match scores from Linux. Therefore, extra care should be taken when comparing results to other platforms. In particular, the baselines in the DOCKSTRING paper were computed on Linux, so please do not directly compare your docking scores to the scores reported on the paper.
warnings.warn(
SMILES: C1[C@@H]([C@@H]([C@H]([C@@H]([C@]1(CO)O)O)O)O)NC(CO)CO
Docking Score: -6.2
SMILES: CS(=O)(=O)n1cc2c(n1)CN([C@H]1COC@HC@@HC1)C2 Docking Score: -9.7のOmarigliptinが最も強く結合していることが分かります。
注釈は
Dockstringの警告:Macでの使用はサポートされていますが、MacでのドッキングスコアはLinuxのスコアと完全に一致しない場合があります。そのため、他のプラットフォームと結果を比較する際は注意が必要です。特に、DOCKSTRINGの論文で報告されている基準値はLinuxで計算されたものなので、論文でのスコアと直接比較しないでください。
とあります。なので、正確にやるならば、Linuxで行うと良いです。
リガンド情報の可視化
# 最も低いスコアのリガンド情報を表示
if best_ligand is not None:
print(f"Best SMILES: {best_smiles}")
print(f"Best Docking Score: {best_score}")
# リガンドの構造を可視化
img = Draw.MolToImage(best_ligand, size=(300, 300))
img.show()
全体の流れ:
- 条件確認:
best_ligand
がNone
でない場合、つまり最低スコアのリガンドが見つかった場合に情報を表示します。 - SMILES表記とスコアの表示:最も低いスコアのリガンドのSMILES表記と、そのドッキングスコアをコンソールに出力します。
- 分子構造の可視化:最も低いスコアのリガンドの分子構造を画像として描画し、表示します。
コードの詳細な説明:
if best_ligand is not None
:best_ligand
がNone
でない場合、つまり最も低いスコアのリガンドが存在する場合に処理を進めます。None
はPythonで「値が存在しない」ことを示します。この条件があることで、何もリガンドが見つからなかった場合のエラーを防ぎます。print(f"Best SMILES: {best_smiles}")
:best_smiles
に格納された最も低いスコアのリガンドのSMILES表記を出力します。SMILESは化合物の構造を文字列で表現する方法です。print(f"Best Docking Score: {best_score}")
:best_score
に格納された最も低いドッキングスコアを出力します。このスコアが低いほど、リガンドがターゲット(DPP4)に強く結合する可能性が高いことを示します。Draw.MolToImage(best_ligand, size=(300, 300))
:best_ligand
に保存されているリガンドの分子構造を画像として描画します。この関数はRDKitのDraw
モジュールから提供され、リガンドの構造を視覚的に確認するために使用されます。size=(300, 300)
は画像の大きさを指定しています。img.show()
:生成された画像を表示します。通常、これを使うとJupyter NotebookやGoogle Colabなどのインターフェースで画像が表示されます。
以下のように出力されて、化合物の構造Omarigliptinが出てきます。
Best SMILES: CS(=O)(=O)n1cc2c(n1)CN([C@H]1CO[C@H](c3cc(F)ccc3F)[C@@H](N)C1)C2
Best Docking Score: -9.7
最後に
DockstringではSMILE表記だけで分子ドッキングできるのはありがたいですね。AutoDockやPyRx、Swissdockを使って、さらなる解析をしてみてください!
参考文献
Docking Simulation Using Dockstring
DOCKSTRING: Easy Molecular Docking Yields Better Benchmarks for Ligand Design
自宅でできるin silico創薬の技術書を販売中
新薬探索を試したい方必読!
ITエンジニアである著者の視点から、wetな研究者からもdryの創薬研究をわかりやすく身近に感じられるように解説しています