The Metabolic Disassembler を Google Colaboratory 上で使う

The Metabolic Disassembler は、生合成経路不明な天然物（二次代謝産物）に対して、その構造を「生合成単位」に分解して、代謝の出発物質を推定するプログラムです。2019年12月23日に、BMC Bioinformatics誌にてパブリッシュされました。

<b>Metabolic disassembler for understanding and predicting the biosynthetic units of natural products</b>
https://bmcbioinformatics.biomedcentral.com/articles/10.1186/s12859-019-3183-9


日本語での解説動画もあります

* 統合TV版 http://togotv.dbcls.jp/ja/20191217.html
* YouTube版 https://www.youtube.com/watch?v=JsMC6tGbbqA

コードはPythonで書かれており、以下のGitHubのページから参照できます。
https://github.com/the-metabolic-disassembler/metadisassembler

この Qiita 記事では、GitHub に上げてある Google Colaboratory で使う方法に、ちょっとだけ日本語での説明を加えたいと思います。

# RDKit のインストール

5分ほどかかります。

```python
import sys
import os
import requests
import subprocess
import shutil
from logging import getLogger, StreamHandler, INFO


logger = getLogger(__name__)
logger.addHandler(StreamHandler())
logger.setLevel(INFO)


def install(
        chunk_size=4096,
        file_name="Miniconda3-4.7.12-Linux-x86_64.sh",
        url_base="https://repo.continuum.io/miniconda/",
        conda_path=os.path.expanduser(os.path.join("~", "miniconda")),
        rdkit_version=None,
        add_python_path=True,
        force=False):
    """install rdkit from miniconda
    ```
    import rdkit_installer
    rdkit_installer.install()
    ```
    """

    python_path = os.path.join(
        conda_path,
        "lib",
        "python{0}.{1}".format(*sys.version_info),
        "site-packages",
    )

    if add_python_path and python_path not in sys.path:
        logger.info("add {} to PYTHONPATH".format(python_path))
        sys.path.append(python_path)

    if os.path.isdir(os.path.join(python_path, "rdkit")):
        logger.info("rdkit is already installed")
        if not force:
            return

        logger.info("force re-install")

    url = url_base + file_name
    python_version = "{0}.{1}.{2}".format(*sys.version_info)

    logger.info("python version: {}".format(python_version))

    if os.path.isdir(conda_path):
        logger.warning("remove current miniconda")
        shutil.rmtree(conda_path)
    elif os.path.isfile(conda_path):
        logger.warning("remove {}".format(conda_path))
        os.remove(conda_path)

    logger.info('fetching installer from {}'.format(url))
    res = requests.get(url, stream=True)
    res.raise_for_status()
    with open(file_name, 'wb') as f:
        for chunk in res.iter_content(chunk_size):
            f.write(chunk)
    logger.info('done')

    logger.info('installing miniconda to {}'.format(conda_path))
    subprocess.check_call(["bash", file_name, "-b", "-p", conda_path])
    logger.info('done')

    logger.info("installing rdkit")
    subprocess.check_call([
        os.path.join(conda_path, "bin", "conda"),
        "install",
        "--yes",
        "-c", "rdkit",
        "python=={}".format(python_version),
        "rdkit" if rdkit_version is None else "rdkit=={}".format(rdkit_version)])
    logger.info("done")

    import rdkit
    logger.info("rdkit-{} installation finished!".format(rdkit.__version__))
```


```python
install(rdkit_version='2019.09.2.0', force=True)
```


# The Metabolic Disassembler のインストール

```python
!pip install metadisassembler
```

# 各種ライブラリのインポート

```python
import glob

from IPython.display import Image, display_png
from rdkit.Chem.Draw import IPythonConsole

import metadisassembler as medi
```

# 使用例１： KEGG IDを用いた入力

[C05557 Isopenicillin N](https://www.genome.jp/dbget-bin/www_bget?C05557) を例にします。

```python
# Create an instance and input a query molecule

test1 = medi.MetaDisassembler()
test1.input_query('C05557')
test1.cpds[0].mol
```


![output_7_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211162/1187c231-d84f-5b0a-2217-843ca77ebf21.png)

この入力化合物を disassemble しましょう。

## Disassemble

```python
# Disassemble the query molecule
# It takes about 30 sec.

test1.disassemble()
```

## 結果の出力

Disassemble結果が複数ある場合は複数出力されます。

```python
# List output files

sorted(glob.glob('./output/' + test1.name + '/*'))
```




    ['./output/C05557/0.png',
     './output/C05557/1.png',
     './output/C05557/10.png',
     './output/C05557/11.png',
     './output/C05557/12.png',
     './output/C05557/2.png',
     './output/C05557/3.png',
     './output/C05557/4.png',
     './output/C05557/5.png',
     './output/C05557/6.png',
     './output/C05557/7.png',
     './output/C05557/8.png',
     './output/C05557/9.png',
     './output/C05557/C05557.mol',
     './output/C05557/result.txt']


最有力候補は次のようにして図示できます。異なる色が、異なるフラグメント（異なる生合成単位由来）を示します。

```python
# Display the first image

display_png(Image('./output/' + test1.name + '/0.png'))
```

![output_10_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211162/f14474a2-938c-c98a-be16-bfdeaf0ef469.png)


フラグメントがどの化合物由来かを確認するには次のようにします。

```python
bu_info = test1.output_matched_bu(result_id=0)
```

たとえば最有力候補のフラグメントの由来化合物を知るには

```python
n = 0

print('Biosynthetic Unit IDs:')
print(bu_info[n]['bu_id'])

bu_info[n]['mol']
```

    Biosynthetic Unit IDs:
    ['C00956_01', 'C01251_04']



![output_12_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211162/5f5c9086-b84e-b92a-07f3-28eef6d54b41.png)

上記の C00956 や C01251 が、由来化合物のKEGG IDです。
  
C00956_01 → C00956  
https://www.genome.jp/dbget-bin/www_bget?cpd:C00956 ★  
  
C01251_04 → C01251  
https://www.genome.jp/dbget-bin/www_bget?cpd:C01251


# 使用例２： SMILESを用いた入力

入力化合物の KEGG ID が分からない場合、あるいは、KEGGデータベースに存在しない化合物でも、SMILES形式を用いて入力できます。 例として [Dihydroclavaminic acid](https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:15424) を使ってみましょう。

```python
# Create an instance and input a query molecule

test2 = medi.MetaDisassembler()
test2.input_query('[H][C@]12CC(=O)N1[C@@H]([C@@H](CCN)O2)C(O)=O')
test2.cpds[0].mol
```


![output_20_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211162/2b09a9dc-abd5-0132-92fd-29319ad59fdb.png)

この入力化合物を disassemble しましょう。


```python
# Disassemble the query molecule
# It takes about 2 min.

test2.disassemble()
```

```python
# List output files

sorted(glob.glob('./output/' + test2.name + '/*'))
```




    ['./output/C8H12N2O4/0.png',
     './output/C8H12N2O4/1.png',
     './output/C8H12N2O4/10.png',
     './output/C8H12N2O4/2.png',
     './output/C8H12N2O4/3.png',
     './output/C8H12N2O4/4.png',
     './output/C8H12N2O4/5.png',
     './output/C8H12N2O4/6.png',
     './output/C8H12N2O4/7.png',
     './output/C8H12N2O4/8.png',
     './output/C8H12N2O4/9.png',
     './output/C8H12N2O4/C8H12N2O4.mol',
     './output/C8H12N2O4/result.txt']


最有力候補はこちら。

```python
# Display the first image

display_png(Image('./output/' + test2.name + '/0.png'))
```

![output_23_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211162/a59c7582-cb18-3922-ae6b-894385a29cd8.png)


由来化合物は

```python
bu_info = test2.output_matched_bu(result_id=0)
```


```python
n = 0

print('Biosynthetic Unit IDs:')
print(bu_info[n]['bu_id'])

bu_info[n]['mol']
```

    Biosynthetic Unit IDs:
    ['C00062_01', 'C00077']



![output_25_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211162/f29574e9-fe3f-ac40-647b-0188d37e2d97.png)


https://www.genome.jp/dbget-bin/www_bget?cpd:C00062 ★  
https://www.genome.jp/dbget-bin/www_bget?cpd:C00077  


# 使用例３： InChI を用いた入力

同様に、入力化合物の KEGG ID が分からない場合、あるいは、KEGGデータベースに存在しない化合物でも、InChI形式を用いて入力できます。 例として [Curcumin diglucoside](https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:81315) を使ってみましょう。


```python
# Create an instance and input a query molecule

test3 = medi.MetaDisassembler()
test3.input_query('InChI=1S/C33H40O16/c1-44-22-11-16(5-9-20(22)46-32-30(42)28(40)26(38)24(14-34)48-32)3-7-18(36)13-19(37)8-4-17-6-10-21(23(12-17)45-2)47-33-31(43)29(41)27(39)25(15-35)49-33/h3-13,24-36,38-43H,14-15H2,1-2H3/b7-3+,8-4+,18-13-/t24-,25-,26-,27-,28+,29+,30-,31-,32-,33-/m1/s1')
test3.cpds[0].mol
```


![output_32_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211162/007f0293-90a1-8a5d-3813-0b936dd6b5ae.png)


この入力化合物を disassemble しましょう。


```python
# Disassemble the query molecule

test3.disassemble()
```


```python
# List output files

sorted(glob.glob('./output/' + test3.name + '/*'))
```




    ['./output/C33H40O16/0.png',
     './output/C33H40O16/1.png',
     './output/C33H40O16/10.png',
     './output/C33H40O16/11.png',
     './output/C33H40O16/12.png',
     './output/C33H40O16/13.png',
     './output/C33H40O16/2.png',
     './output/C33H40O16/3.png',
     './output/C33H40O16/4.png',
     './output/C33H40O16/5.png',
     './output/C33H40O16/6.png',
     './output/C33H40O16/7.png',
     './output/C33H40O16/8.png',
     './output/C33H40O16/9.png',
     './output/C33H40O16/C33H40O16.mol',
     './output/C33H40O16/result.txt']



最有力候補はこちら。

```python
# Display the first image

display_png(Image('./output/' + test3.name + '/0.png'))
```

![output_35_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211162/3e1e6a97-2802-5a5e-cd9a-6891a9248016.png)


由来化合物は


```python
bu_info = test3.output_matched_bu(result_id=0)
```


```python
n = 0

print('Biosynthetic Unit IDs:')
print(bu_info[n]['bu_id'])

bu_info[n]['mol']
```

    Biosynthetic Unit IDs:
    ['C00029_04', 'C00031_05']



![output_37_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211162/a3750415-5e56-c287-0c43-a3d25815452f.png)




https://www.genome.jp/dbget-bin/www_bget?cpd:C00029  
https://www.genome.jp/dbget-bin/www_bget?cpd:C00031 ★  


# 使用例４： KNApSAcK ID を用いた入力

二次代謝物データベースとして有名な KNApSAcK データベースの ID も入力に使えます。例として [C00011250 Fumigaclavine C](http://kanaya.naist.jp/knapsack_jsp/information.jsp?word=C00011250) を使ってみましょう。

```python
# Create an instance and input a query molecule

test4 = medi.MetaDisassembler()
test4.input_query('C00011250')
test4.cpds[0].mol
```



![output_47_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211162/08c80249-905a-5771-7a3c-90971a87a763.png)


この入力化合物を disassemble しましょう。



```python
# Disassemble the query molecule

test4.disassemble()
```


```python
# List output files

sorted(glob.glob('./output/' + test4.name + '/*'))
```




    ['./output/C00011250/0.png',
     './output/C00011250/1.png',
     './output/C00011250/2.png',
     './output/C00011250/3.png',
     './output/C00011250/4.png',
     './output/C00011250/5.png',
     './output/C00011250/C00011250.mol',
     './output/C00011250/result.txt']

この化合物については、３番目の候補が正しい答えでした。」

```python
# Display the "third" image

display_png(Image('./output/' + test4.name + '/2.png'))
```

![output_51_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211162/febc3dbd-582b-e7cc-28c1-4727036a9ca4.png)

その由来化合物は


```python
bu_info = test4.output_matched_bu(result_id=2)
```


```python
n = 0

print('Biosynthetic Unit IDs:')
print(bu_info[n]['bu_id'])

bu_info[n]['mol']
```

    Biosynthetic Unit IDs:
    ['C00078_01', 'C00398']




![output_53_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211162/906577f8-a07f-79ad-ac15-36099aa296fd.png)




https://www.genome.jp/dbget-bin/www_bget?cpd:C00078 ★  
https://www.genome.jp/dbget-bin/www_bget?cpd:C00398  


# 計算結果をローカルコンピュータに保存



```python
!zip -r /content/result.zip /content/output
```


```python
from google.colab import files

files.download('/content/result.zip')
```