antiSMASHをGoogle colaboratoryで動作させる

antiSMASHは生物の持つ二次代謝産物生合成遺伝子クラスターを網羅的に予測するツールである。
主にTechnical University of Denmark、Wageningen UniversityとLeiden Universityのグループにより開発された。

antiSMASHのサイト
https://antismash.secondarymetabolites.org/#!/start

引用文献
https://academic.oup.com/nar/article/49/W1/W29/6274535?login=true

基本的にはブラウザにDNA配列ファイルを投げれば解析がスタートするために特に不自由はないが、
配列を一度に大量に解析したい場合はGoogle Colaboratoryを利用するメリットもあるだろう。
jupyterを用いてantiSMASHをローカルで動かしたいときにもこの内容は応用できる。

version ７が公開されましたので、version 7用に書き直しました。
https://qiita.com/ykguitar1002000/items/754dd62252c7d36aee38


<h2>antiSMASHと必要なアプリケーションのインストール</h2>
最初のセルには以下のスクリプトを記入する。これによりantiSMASHの動作に必要なアプリケーションをGoogle colaboratoryにインストールする。
多くはcondaで必要なアプリケーションをインストールしている。
一部、他のインストール方法と混在しているが、動作する。
インストールする項目が多いので多少時間がかかる。
原因は不明だが、biopythonのインストールの前にcondaのインストールを実行すると不具合だ生じるようである。
2023年4月20日にantiSMASH6.1.1をインストールするようにコードを変更しました。

```
%%bash

#update jsonschema
pip install --upgrade jsonschema

#install antismash
wget https://dl.secondarymetabolites.org/releases/6.1.1/antismash-6.1.1.tar.gz
tar -zxf antismash-6.1.1.tar.gz
pip install ./antismash-6.1.1

#install biopython
#pip install biopython
#2022-11-18のbiopythonのupdateでインストール時にエラーが出るようになった。
#v1.79を指定してインストールすれば問題なく動作するようである。
pip install biopython==1.79

#install blast+
sudo apt install ncbi-blast+

#setup conda
MINICONDA_INSTALLER_SCRIPT=Miniconda3-latest-Linux-x86_64.sh
MINICONDA_PREFIX=/usr/local
wget https://repo.continuum.io/miniconda/$MINICONDA_INSTALLER_SCRIPT
chmod +x $MINICONDA_INSTALLER_SCRIPT
./$MINICONDA_INSTALLER_SCRIPT -b -f -p $MINICONDA_PREFIX

#install diamond by conda
conda install -y -c bioconda diamond
conda install -y -c bioconda/label/cf201901 diamond

#install fasttree by conda
conda install -y -c bioconda fasttree
conda install -y -c bioconda/label/cf201901 fasttree

#install glimmerhmm by conda
conda install -y -c bioconda glimmerhmm
conda install -y -c bioconda/label/cf201901 glimmerhmm

#install pfam by conda
conda install -y -c bioconda pfam_scan
conda install -y -c bioconda/label/cf201901 pfam_scan

#install hmmer2 by conda
conda install -y -c bioconda hmmer2
conda install -y -c bioconda/label/cf201901 hmmer2

#install hmmer by conda
conda install -y -c bioconda hmmer
conda install -y -c bioconda/label/cf201901 hmmer

#install muscle by conda
conda install -y -c bioconda muscle
conda install -y -c bioconda/label/cf201901 muscle

#install meme by conda
#conda install -y -c bioconda meme
#conda install -y -c bioconda/label/cf201901 meme

#install prodigal by conda
conda install -y -c bioconda prodigal
conda install -y -c bioconda/label/cf201901 prodigal

#dwonload antiSMASHdatabase
download-antismash-databases
```

次のセルで動作確認をすることを推奨する。
fimoとmemeのversionが現在のversionのantiSMASHが要求するversionと異なるので、エラーが出てしまう。
ダウングレード版をインストールすればおそらく動作するが、その方法は現在検討中である。
これらのプログラムが関連するオプションは使えないがほとんどの機能は動作する。

```
#@title antismashに必要な要素が揃っているか確認。
!antismash --check-prereqs
```

<h2>動作させる</h2>
fimoとmeme以外に関連するエラーメッセージが出ない様なら解析対象となるファイルをアップロードし、動作させることができる。
必要最低限の解析を行う場合は次のセルに以下の記述をし実行する。
xxxx.gbが解析に用いるファイル名をyyyyがファイルの出力先の名前を表す。

```
#antiSMASHを動作させる。
!antismash xxxx.gb --output-dir yyyy
```

オプションも全て含めて動作させる場合は以下のセルを動作させる。

```
#オプションも含めて動作させる場合
!antismash xxxx.gb --output-dir yyyy --fullhmmer --clusterhmmer --tigrfam --smcog-trees --cb-general --cb-subclusters --cb-knownclusters --asf --pfam2go --cc-mibig
```

出力結果はyyyyの名前のフォルダの中に格納される。
フォルダを圧縮してダウンロードする必要があるため、別途フォルダ、圧縮用のスクリプトを走らせる必要がある。
例としてzip圧縮する際のスクリプトを掲載する。

```
import shutil 
shutil.make_archive('yyyy','zip',root_dir='yyyy')
```

<h2>google drive上のファイルを一括に解析にかける</h2>
解析対象となるファイルが一つであれば、特に問題ないが、複数ある場合は解析操作が煩雑である。
多数のファイルがある場合は自身のgoogle driveに解析対象となるファイルをアップロードし、
そこのファイルを一括で解析するように設定するとよい。
以下にその操作を実行するためのスクリプトの例を掲載する。

```
#必要なモジュールのインポート
from google.colab import drive
import subprocess
from subprocess import Popen
import os

#ドライブのマウント、googleから許可を要求される
drive.mount('/content/drive')

#yyyyに自身のデータの格納先を指定する。
DRIVE = 'MyDrive/yyyy'

#DRIVEの最後に「/」がない場合は追加する
if DRIVE[-1] == '/':
  pass
else:
  DRIVE = DRIVE + '/'
DRIVE_2 = '/content/drive/' + DRIVE

#antiSMASHを実行するためのdefを作成する。オプションもフルに利用する設定である。利用しない場合は「anti_smash_opt = ''」とするとよい。 
def antiS(fn,drive):
  anti_smash_opt = ' --fullhmmer --clusterhmmer --tigrfam --smcog-trees --cb-general --cb-subclusters --cb-knownclusters --asf --pfam2go --cc-mibig'
  nn = fn.rfind('.') # [.]の位置の取得
  out = fn[:nn]
  cmd = 'antismash ' + drive + fn + ' --output-dir ' + drive + out + anti_smash_opt
  print(cmd)#コマンドを出力する。
  test = subprocess.Popen(cmd, shell=True, text=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE)
  outs, errs = test.communicate()
  if drive[-1] == '/':
    drive_2 = drive
    pass
    #print('good')
  else:
    drive_2 = drive + '/'
  #念の為logをlog.txtとして記録する。
  with open(drive_2 + 'log.txt','a') as f:
    f.write(outs)
    f.write('\n')
    f.write(errs)
    f.write('\n')

#格納先のファイルのリストを取得する。この設定ではgbとgbkファイルのみリスト化する。
files = os.listdir(DRIVE_2)
files2 = []  #これにフォルダの中の情報が格納される
#目的のファイルのみを持つリストを作る
for i in files:
    if '.gb' in i:
      files2.append(i)
    elif '.gbk' in i:
      files2.append(i)
#ファイルのリストを確認のためにプリントする。
print(files2)

#antiSMASHの実行
for i in files2:
  antiS(i,DRIVE_2)
```