M1 MacでDocker使ってAutodocktoolsを用いてドッキングシミュレーションをしよう

# M1 Macでドッキングシミュレーションをしたい！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2519906/bb6611d9-9999-3e61-45d1-36a9461f5e51.png" alt="docking master" width="500" height="200">

リガンド・・・レセプター・・・標的決定・・・
生物系研究者として避けて通れない道が分子間相互作用の解析ですね。

そこで使われるのがドッキングシミュレーションです！
やり方はネットで紹介されています。しかし、説明されている**やり方がM1 Macに対応しているかといったら微妙です。**

従来よく使われるGUIのプログラムAutodocktoolsは、Intel Macだと動かせられるのですが、M1 Macは動かないです。どうやらCPUが対応してないらしいです。Rosseta入れてるのになんでって感じですが。このAutodocktoolsは知見が豊富なので、ドッキング入門者はこれ使いたいですよね。

そんなわけで！
今回はM1 MacでAutodocktoolsを起動方法とドッキングシミュレーションのやり方を紹介します！

# 説明に入る前の準備
以下、必要なプログラムです。Autodocktools以外はダウンロードしてください。
- docker desktop
- XQuartz（AutodocktoolsをMacで表示するため）
- Autodocktools（リガンド、レセプターのファイル作成用、ドッキング範囲の決定用）
- Chemdraw（化合物描画）
- Avogadro（化合物構造最適化ソフト）
- Autodock-vina（ドッキング用プログラム）
- pymol（可視化用）

docker desktop、XQuartz、Chemdraw、Avogadro、pymolは各サイトのdmgファイルでdownloadすればOKです。
もし、「開発元の不明なプログラムです・・・」みたいメッセージが出てきたら「閉じる」を押し、「システム設定→プライバシーとセキュリティ→このまま開く（下にスライドしたらある）」をすれば大丈夫です。

Autodock-vinaはterminal上で動かすプログラムです。インストール方法は自由です。筆者は`conda install`で入れました。

# Autodocktoolsの起動方法
参考にした記事はこちらです。
[Dockerを導入してGUI操作可能なLinux(Ubuntu)コンテナを作成する](https://qiita.com/ryoya-s/items/ee1daf9cab18c100c990)
[Mac OSX Catalinaに導入したDocker上でAutoDock Toolsを動かす](https://itsuka-naritai.com/2020/10/27/mac-osx-catalina%E3%81%AB%E5%B0%8E%E5%85%A5%E3%81%97%E3%81%9Fdocker%E4%B8%8A%E3%81%A7autodock-tools%E3%82%92%E5%8B%95%E3%81%8B%E3%81%99/)
dockerについて知りたい方はこちら
[いまさらだけどDockerに入門したので分かりやすくまとめてみた](https://qiita.com/gold-kou/items/44860fbda1a34a001fc1)

大まかな流れはこんな感じです。
1. `XQuartz`を起動し、ホストにXサーバに接続する権限を渡す
1. `socatコマンド`でホストとXサーバーとのポートを作成
1. dockerでコンテナを作成（OSはubuntu：Liunx）
1. コンテナにAutodocktoolsをインストール
1. 起動

`XQuartz`とか`socat`がなんのこっちゃって感じだと思うので、**イメージ**を説明します。
上述したようにAutodocktoolsはGUIツール（視覚的に操作できるプログラム）です。M1では開けないですが、Linuxで開けます。
そこで、Linux環境のコンテナでAutodocktoolsを導入して起動します。しかし問題点として、コンテナはterminal上で操作します。つまり、コンテナ内で起動されたGUIの画面は見ることができないのです。

それを可能にするのが、XQuartzとsocatです。こいつらのイメージ図で説明します。
コンテナ内部は外から見えないです。そこで、**コンテナにケーブル（socatで作ったポート）を引いて外部のモニター（XQuartz）に繋ぐことで外部からでもコンテナ内のGUIが見られるようになります！**専門的な話は筆者もよくわからないですが,以下のイメージ図くらいの認識でいいと思ってます。。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2519906/fc86a763-2bd1-68fd-ccc9-c1cca17756bd.jpeg" alt="docking master" width="500" height="200">

##### XQurtzとsocat
以下の通りにやりましょう。
```
# ホストのterminalで。XQuartzに関してインストールしたら再起動すること。
brew install socat # socatをインストール
open -a XQuartz # XQuartzを起動、MacのDock（アプリのメニューバー）にXQuartzが出てくるはず。
echo $DISPLAY #$DISPLAYにパスが入ってることを確認
socat TCP-LISTEN:6000,reuseaddr,fork UNIX-CLIENT:\"$DISPLAY\" #XQuartzのterminalが立ち上がるはず。出てこなければ、XQuartzのアイコンを長押しクリックしてterminal起動を選択。

# XQuartzのterminalで
xhost Host_IP_address # ホストのIPアドレスを入力、IPアドレスは「システム設定→ネットワーク」で見れるはず。
# access control enabled, only authorized clients can connectって出ればOK
```

::: note warn
**XQuartzの不具合**
筆者のパソコンでは、XQuartzが起動したり消えたりを永遠に繰り返すエラーが見られました。
どうやら、Macでちょくちょく見られるようです。何がトリガーかは不明です。

[記事](https://qiita.com/hirami/items/4c79791a42def48f8d76)を参考にXQuartzをアンインストールして、再度インストールしたら直りました。
**ただしやり方に注意です。**
```
#Xquartzの自動起動を停止
launchctl unload /Library/LaunchAgents/org.macosforge.xquartz.startx.plist
sudo launchctl unload /Library/LaunchDaemons/org.macosforge.xquartz.privileged_startx.plist

#作成されたファイルを削除
sudo rm -rf /opt/X11* /Library/Launch*/org.macosforge.xquartz.* /Applications/Utilities/XQuartz.app /etc/*paths.d/*XQuartz

#パッケージのインストール情報を削除
sudo pkgutil --forget org.macosforge.xquartz.pkg
```

特に、2番目に注意してください。これらのファイルを全て削除しなければいけないです。ORGファイルの名前が若干違ったりするので注意です（org.xquartzとか）。
:::

##### Ubuntuのコンテナ作成
まず、ubuntuのimageをdockerにpull
```
docker pull ubuntu
```

コンテナを作成
```
# Dockerコンテナの作成・起動
# 下記xxx.xxx.xxx.xxxをホストのIPアドレスに変更して実行
docker run --platform=linux/amd64 -it -e DISPLAY="xxx.xxx.xxx.xxx:0" ubuntu
```
::: note warn
platformの指定は重要。
やらないとautodocktoolsのインストール時にエラーが出ます。
:::

自動でコンテナに入ります。terminalの左端の名前がコンテナID（root@xxxxxxx:/#）に変わっているのを確認し、以下を実行。
```
# コンテナ内で実行
root@xxxxxxx:/# apt-get update
root@xxxxxxx:/# apt-get install ubuntu-desktop
root@xxxxxxx:/# exit #コンテナを再起動するためexit
```
```
docker restart xxxxxxx # コンテナを再起動
docker exec -it xxxxxxx /bin/bash　#　コンテナに入る
```

##### Autodocktoolsを導入・起動
```
#　コンテナ内で実行
# mgltoolsのサイトからx86_64のソースコードのURLを取得。
cd /root
wget http://mgltools.scripps.edu/downloads/downloads/tars/releases/REL1.5.6/mgltools_x86_64Linux2_1.5.6.tar.gz
tar -zxvf ./mgltools_x86_64Linux2_1.5.6.tar.gz
cd ./mgltools_x86_64Linux2_1.5.6
./install.sh
```
::: note info
ソースコードだが、ホストでダウンロードしといて
```
docker cp  mgltools_x86_64Linux2_1.5.6.tar.gz xxxxxxx:/root/
```
でコピーしても良い。コンテナ内でダウンロードうまくいかない時におすすめ。
:::
コンテナ内の/root/.bashrcに以下コードを`vim`記入し、`source .bashrc`でどのディレクトリでもコマンド出せるようにする。`vim`と`source`がなければ`apt-get`でインストールしておく。
```
export PATH=/home/autodock_tools/mgltools_x86_64Linux2_1.5.6/bin:$PATH
alias pmv='/home/autodock_tools/mgltools_x86_64Linux2_1.5.6/bin/pmv'
alias adt='/home/autodock_tools/mgltools_x86_64Linux2_1.5.6/bin/adt'
alias vision='/home/autodock_tools/mgltools_x86_64Linux2_1.5.6/bin/vision'
alias cadd='/home/autodock_tools/mgltools_x86_64Linux2_1.5.6/bin/cadd'
alias pythonsh='/home/autodock_tools/mgltools_x86_64Linux2_1.5.6/bin/pythonsh'
```

ホストのterminalに移動し、以下コマンド
```
#ホストで
defaults write org.macosforge.xquartz.X11 enable_iglx -bool true 
# ORGファイルの名前が違うかもしれない。筆者は org.xquartz.X11だった。
```

コンテナに移動して`adt`で起動。
以下の画面が見えたら勝ちです。とりあえずお疲れ様でした！！！
![スクリーンショット 2023-06-29 1.27.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2519906/f2f6938d-03f7-6f0c-5289-830f715a893c.png)


# ドッキングまでの流れ
ドッキングシミュレーションは以下の流れで行いました。プロトコールは[こちら](https://computational-chemistry.com/top/blog/2017/04/26/autodock-vina/)のサイトを参考にしました。 

##### リガンド作成
1. Chemdrawでリガンドの構造を作成し、「Edit→copy as→SMILE」で構造情報をSMILE形式でクリップボードにコピーした。
1. Avogadroを開き、「ビルド→挿入→SMILE...」でSMILE形成をペーストした。
1. 「Extensions→ジオメトリ最適化」で構造を最適化した後、「file→save as」でPDB形式で保存した。
1. PDBファイルを`docker cp`でコンテナにコピーした。
1. コンテナに`docker exec`で入り、Autodocktoolsを`adt`で起動した。
1. 「Ligand→input」でPDBファイルを開いた。
1. 「Ligand→Torsion・・・→Choose Torisons」で、すべての結合を回転可能に設定した。
1. 「Ligand→output」でPDBQTファイルで保存した。
以上によって、`ligand.pdbqt`を作成した。

##### レセプター作成
1. Protein date bankからダウンロードするなどしてPDBファイルを取得した。ファイルはコンテナに移動した。
1. コンテナでAutodocktoolsを起動後、 「File→open」でファイルを開いた。
1. 水素が消えていたので、「edit→Hydrogen→Add」を押し、「Polar Only」を選択した。これによって、極性のある水素（ヒドロキシ基とか）をつけた。この水素残基が結合に関わる可能性があるためだ。
1. 「File→save→Write PDBQT」で`receptor_Had.pdbqt`でとして保存した。
1. 左下のメニュー欄のレセプター名を右クリックして「delete」
1. 「Grid→Macromolecule→Open」でPDBを開いた。注意ウインドウが出てくるので、エンターで消した（クリックだと認識されないことがあった）。注意ウインドウを消した後、PDBQTファイルで保存した。
1. 左下のメニュー欄のレセプター名を右クリックして「delete」
1. 「Flexible Residues→Input→open Macromolecule」でPDBQTファイルを開いた
1. **動かすアミノ酸残基**を選択するため、左下メニュー欄のアミノ酸残基の右の⚪︎を選択した（一番左の⚪︎）。「Flexible Residues→Choose Torsions・・・」で確定。
1. 「Flexible Residues→output→Save Flexible」で動く残基のPDBQTファイルで保存し、`receptor_Had_fle.pdbqt`とした。
1. 「Flexible Residues→output→Save rigid」で`receptor_Had_rig.pdbqt`として保存した。

##### グリッドボックス作成
ドッキングする範囲をAutodocktoolsで決定する。
1. Autodocktoolsで「Grid→macromolecule→open」で`receptor_Had_rig.pdbqt`を開き、「Flexible Residues→Input→Open Macromolecule」で`receptor_Had_fle.pdbqt`を開いた。
1. 「Grid→Grid Box」を開いて、グリッドボックスを調整した。この時の、各数値（x,y,z-dimension、x,y,z centor）を記録。

##### ドッキング
ホストのデバイスでAutodock-vinaでドッキングする。
CONFファイルを作成する。グリッドボックス数値や各オプションを記入した。以下みたいな感じ
```input.conf
center_x = 31.768
center_y = 7.529
center_z = -35.661

size_x = 30
size_y = 40
size_z = 40

cpu = 8
exhaustiveness = 8
num_modes = 100
energy_range = 3
```
2. コンテナから`ligand.pdbqt`、`receptor_Had_fle.pdbqt`、`receptor_Had_rig.pdbqt`を`docker cp`でホストデバイスにコピーした。
3. `vina --config input.conf --receptor receptor_Had_rig.pdbqt --flex receptor_Had_fle.pdbqt --ligand ligand.pdbqt --out result.pdbqt --log result.log`でドッキング開始した。
3. 得られてPDBQTファイル`result.pdbqt`を`pymol`で開いた。

# 結果の解釈（筆者なりに）

vinaでは、結合構造の候補がいくつか出力されます。
では、どの結果を抽出すべきなのでしょうか。
計算化学の専門に聞いたところ、「vinaはそれっぽい構造を出すのが目的で、最適構造を出すわけじゃないよ〜」とのこと。

なので、筆者的にはvinaの結果は、wetのデータなど他の結果を踏まえて解釈するのが良いかと思いました。
要は、vinaの結果が全てじゃないよということ。vinaの結果は仮説の証明ではなく、裏付け程度に使うべきと考えました。

# 終わりに
今回はM1 MacでAutodocktoolsでのドッキングの仕方を紹介しました。
晴れて、皆さんもドッキングマスターといったところでしょうか（笑）
いや、M1は早いのがいいですが、プログラムのセットを頑張る必要がよく出ますよね。研究のものだと特にね。

今後も紹介していきます！