raziのDocker-composeで創薬レイドバトル2018用のJupyter Notebookからアクセスできる化合物データベースを作った話

# 概要
創薬レイドバトル 2018で使えそうな化合物データベースを作りました。Jupyter Notebookから簡単に呼び出せます。いいなと思った人ぜひ使ってみてください。

# 創薬レイドバトル 2018とは
_in sillico_ screening でPD-1/PD-L1タンパク質-タンパク質間相互作用を阻害する化合物を見つけよう！というお祭りです。参加者は自分が阻害剤になりそうと決めた化合物を提出するとアッセイしてもらえます。

主催者は[創薬ちゃん(@souyakuchan)](https://twitter.com/souyakuchan)
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">⚔創薬レイドバトル 2018: 免疫チェックポイント阻害薬探索⚔<br>イベントのスケジュールやルールをまとめたページを公開した。化合物ライブラリのファイルも直接ダウンロード可能にしてあるぞ。<br>連休のお供に！<a href="https://twitter.com/hashtag/souyakuRB2018?src=hash&amp;ref_src=twsrc%5Etfw">#souyakuRB2018</a><a href="https://twitter.com/hashtag/ddraids?src=hash&amp;ref_src=twsrc%5Etfw">#ddraids</a><a href="https://t.co/KrWkvbhkhq">https://t.co/KrWkvbhkhq</a></p>&mdash; 創薬ちゃん (@souyakuchan) <a href="https://twitter.com/souyakuchan/status/1040842753192583173?ref_src=twsrc%5Etfw">2018年9月15日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">アスピリン（アセチルサリチル酸）の阻害様式を示す。アスピリンはシクロオキシゲナーゼの活性部位のセリンをアセチル化することで酵素機能を不可逆的に阻害するんだ（アセチル化セリン: 黄色、サリチル酸: 緑色）。血小板ちゃんは新たにタンパク質を合成できないので、酵素活性は戻らない。(5F19.PDB) <a href="https://t.co/GilL2QN7Yr">pic.twitter.com/GilL2QN7Yr</a></p>&mdash; 創薬ちゃん (@souyakuchan) <a href="https://twitter.com/souyakuchan/status/1040976651717271552?ref_src=twsrc%5Etfw">2018年9月15日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
博識でtweetを見てるだけで楽しい。創薬ちゃん！すごい！本当にすごいんだ！

詳しい説明はこちらの[github](https://gist.github.com/souyakuchan/7f9add656d9d6b91f02f6939b88aa2c8)に書かれています。みんなでワイワイ楽しみましょう！

# 背景
創薬ちゃんからいただけるscreening候補のSDFは４つにわかれているし塩も含まれているので前処理芸人として苦労しそうです。そこで脱塩までしたデータベースを用意してみんなで楽しいscreeningのみに注力できたらいいなと思って作ってみました。

# 環境
MacBook Pro (15-inch, 2017) プロセッサ 2.9 GHz, Intel Core i7, メモリ 16GB
OS: High Sierra (ver. 10.13.6)
Docker version 18.06.1-ce
Dockerで動いているのでおそらくDockerさえインストールされていたらどの環境でも動くと思います。

# データベース作成手順
## 1. リポジトリをダウンロードする
[リポジトリ](https://github.com/yamasakih/docker-compose-razi/tree/feature/customize-for-souyakuRB2018)はこちらです。
`git clone` でダウンロードするなら以下のようにしましょう。

```
git clone -b feature/customize-for-souyakuRB2018 https://github.com/yamasakih/docker-compose-razi.git
```

## 2. 創薬ちゃんから提供されたライブラリのSDFをリポジトリ内にダウンロードする
wgetやcurlでとってきたりクリックしてダウンロードしたものを解凍してdocker-compose-razi/workディレクトリの中に入れてください。以下の状態になっていればOKです。

```
cd docker-compose-razi
ls work/
souyakuRB2018/       souyakuchan_library/ tutorial/
```

## 3. OpenBabelなどを用いてSDFをSMILESに変換する
OpenBabelがインストールされているなら以下のスクリプトを実行したら変換ができます。idnumberあるいはIDタグを名前としています。

```
cd work/souyakuRB2018
./cvt2smi.sh ../souyakuchan_library/ 
```

OpenBabelは有志の方によってDockerで配布もされています。例えば以下のようにしても実行できます。

```
cd docker-compose-razi
PWD=`pwd`
docker run -it --rm -v $PWD:/tmp wpayne/openbabel /bin/bash
cd /tmp
work/souyakuRB2018/cvt2smi.sh ../souyakuchan_library/
(実行後)
exit
```

SDFと同じディレクトリにsmiファイルがあるのが確認できます。

```
ls work/souyakuchan_library
Enamine_Advanced_collection.sdf        Enamine_HTS_collection.sdf
Enamine_Premium_collection.sdf         UOS_HTS.sdf
Enamine_Advanced_collection.smi        Enamine_HTS_collection.smi
Enamine_Premium_collection.smi         UOS_HTS.smi
```

## 4. 脱塩処理をする
提供されたライブラリには塩を含むものなどがあります。今回は一つのSMILESに複数分子が存在する場合、原子数の少ない方を塩とみなして除去するというルールで除去してみます。その処理をまとめたスクリプトである `desalt.py` を作成しましたので~~多少雑な~~その処理でいいよって方は以下のように実行してみてください。

```
cd docker-compose-razi
docker-compose exec web /bin/bash
cd souyakuRB2018
python desalt.py -i ../souyakuchan_library/Enamine_Advanced_collection.smi
python desalt.py -i ../souyakuchan_library/Enamine_HTS_collection.smi
python desalt.py -i ../souyakuchan_library/Enamine_Premium_collection.smi
python desalt.py -i ../souyakuchan_library/UOS_HTS.smi
(実行後)
exit
```

仮想環境内には並列処理するためのモジュールであるjoblibもインストールされていますので仮想環境内なら並列処理できます。例えば6個のCPUを用いて脱塩処理したい場合は `-n 6` と指定してください。もちろんご自身のローカルにjoblibがあれば同様に処理できます。

```
python desalt.py -i ../souyakuchan_library/Enamine_Advanced_collection.smi -n 6
```

ちなみに私のパソコンの場合 `-n 10` ぐらいで実行するとパソコンが唸り声をあげました。私のパソコンの場合、 `-n 10` で全部で１時間ぐらいで処理が終わりました。RDKitで読み込めない化合物が50個ぐらいありそれらはファイルから取り除かれています。

脱塩されたsmiファイルはおしりに `_desalt.smi` とついています。

```
cd docker-compose-razi
ls work/souyakuchan_library
Enamine_Advanced_collection.sdf        Enamine_HTS_collection.sdf
Enamine_Premium_collection.sdf         UOS_HTS.sdf
Enamine_Advanced_collection.smi        Enamine_HTS_collection.smi
Enamine_Premium_collection.smi         UOS_HTS.smi
Enamine_Advanced_collection_desalt.smi        Enamine_HTS_collection_desalt.smi
Enamine_Premium_collection_desalt.smi         UOS_HTS_desalt.smi
```

## 5. データベースを作成する
最後にデータベースを作成します。データベースを作成するコマンドをまとめた `setup.sh` を実行してください。4で作った`_desalt.smi`をみつけてデータベースに登録します。

4で紹介した方法と異なる方法で脱塩した場合はファイルの名前をそろえるか `setup.sh` をテキストエディタなどで開き読み込むファイル名を編集してから実行してください。

```
cd docker-compose-razi
work/souyakuRB2018/setup.sh
```

自動で２〜3時間ほどで作業が終わると思います。RDKitで読み込めない化合物が1個だけありそれは登録されません。
登録後にデータベースにアクセスするにはdocker-composeを起動している状態で `http://localhost:8888` から jupyter notebookを起動します。(Windowsなら`http://192.168.99.100:8888`かな？)

docker-compose/work フォルダが仮想環境にマウントされるようになっていますので別途必要なファイルなどもworkフォルダに入れておくと自動でマウントされます。

創薬バトルレイド用とは別に以前から作っておいた tutorial フォルダのチュートリアルを読んだり souyakuRB2018 フォルダの [test-db.ipynb](https://github.com/yamasakih/docker-compose-razi/blob/feature/customize-for-souyakuRB2018/work/souyakuRB2018/test-db.ipynb) を読んだりしたらだいたい使い方はわかるかなと思います。色々触って遊んでみてみてください。(tutorialフォルダの例に出てくるtableは後述のデータベース構造とは少し異なります)

# データベース構造
## Compounds table
Compounds tableには提供されたライブラリの化合物を登録してます。以下のカラムがあります。

| カラム       |       型 | 
|:-----------------:|:------------------:|
| id             |              Integer |  
| structure           |            mol |  
| name           |             String |
| library_id           |             Integer |  
| mfp2             |              bfp |
| ffp2             |              bfp |
| atompair             |              bfp |
| torsion             |              bfp |  
(*bfp: binary fingerprint)

id: 自動で割り振られたこのテーブル上だけのID。いわゆるPrimary keyです。元々の化合物ライブラリで割り振られていたIDはnameカラムにあります。
structure: smilesキーで示された化学構造。[razi](https://github.com/rvianello/razi)により部分構造検索や、類似構造検索が可能です。
name: 化合物の名前として提供されたSDFのIDタグに保存されているIDを名前にしています。
library_id: 後述するlibraries tableと紐づいておりどのSDF由来かが記録されています。
mfp2: RDKitでMorgan fingerprintと呼ばれるfingerprint。ECFP4と呼ぶ人の方が多いと思います。RDKitでは半径を指定するのでMorgan fingerprint `radius=2` でECFP4相当です。
ffp2: RDKitでFeature Morgan fingerprintと呼ばれるfingerprint。Morgan fingerprint同様FCFP4と呼ぶ人の方が多いと思います。
atompair: Atompairと呼ばれるfingerprint
torsion: 二面角を考慮したfingerprint

## Library table
Compounds table の化合物が提供された４つのSDFのどれ由来かなのが保存されています。最後にアッセイしてもらう化合物を提出するときなどに使いましょう。

| カラム       |       型 | 
|:-----------------:|:------------------:|
| id             |              Integer |  
| name           |            String|  

id: このテーブル上だけのID。いわゆるPrimary keyです。Compound tableのlibrary_idはこのidの値を参照しています。
name: 元のSDFのファイル名が保存されています。

# 仮想環境がいらなくなったら

```
cd docker-compose-razi
docker-compose down
```

で仮想環境を破棄してください。仮想環境のデータもいらない場合は

```
docker volume rm docker-compose-razi_dbdata
```

でデータも破棄できます。
詳しくは[README](https://github.com/yamasakih/docker-compose-razi)をご覧ください。

# まとめ
少し触ってみて便利そうだなと感じたらぜひご活用ください！よき創薬ライフを！

# 参考
[RDKit database cartridge](http://www.rdkit.org/docs/Cartridge.html)
[razi](https://github.com/rvianello/razi)
[創薬レイドバトル](https://gist.github.com/souyakuchan/7f9add656d9d6b91f02f6939b88aa2c8)