ChemTS環境作るのむずすぎ

# なんでPython2...
古のPython2でキレた

# 環境構築

```bash:
conda create --name chemts python=2.7
conda activate chemts
conda install -c rdkit rdkit -y
# conda install -c bioconda rdock ← これは失敗したので結局やらなかった．
pip install keras==2.0.5
# 以下は[そんなパッケージ知らないよ！]ってエラーが出る度に対策として入れた
conda install -c anaconda h5py
conda install tensorflow=1.14.0
conda install -c anaconda ipython=5.8.0 #python2ではバージョン6以上は動かないらしい...
conda install decorator=4.4.0 #バージョン5.1.0のdecorator.pyの中でpython2に互換性のないコードがあって詰んだ
conda install backports.functools_lru_cache=1.6.4 #No module named .. とか言われてキレた
conda install networkx=2.2 #同上
```

ちなみにまとめて以下の3行にしても良い
```bash:
conda create -n ChemTS -c rdkit -c anaconda rdkit h5py tensorflow=1.14.0 ipython=5.8.0 decorator=4.4.0 backports.functools_lru_cache=1.6.4 networkx=2.2 python=2.7
conda activate ChemTS
pip install keras==2.0.5
```


rDockに関しては，`conda install -c bioconda rdock`で行けるとかいう情報もあったのになんかconflictがあるとか出て無理だった．公式に乗っ取ってやろうとするも失敗...
でも今のところなぜか支障はないので入れてないままです．


# 以下は各ファイルに対して個別に行った作業
基本的に，私が「別ディレクトリにある実行スクリプトを投げる」っていうスタンスでやってるせいでバグっただけな気がするのでいらないかも．

### ChemTS/mcts_logp_improved_version/load_model.py
-  相対パス表記になっていてバグったので絶対パスに書き換える．
```python:load_model.py
json_file = open('../RNN-model/model.json', 'r')
loaded_model.load_weight('../RNN-model/model.h5')
```

### ChemTS/mcts_logp_improved_version/mcts_logp.py
-  相対パス表記になっていてバグったので絶対パスに書き換える．
```python:mcts_logp.py
logP_values = np.loadtxt('logP_values.txt')
SA_scores = np.loadtxt('SA_scores.txt')
cycle_scores = np.loadtxt('cycle_scores.txt')
```


- ~~謎のimportをコメントアウト~~
    - やっぱりPython2.7で頑張ることにしたのでいらない作業．
```python:mcts_logp.py
from types import IntType, ListType, TupleType, StringTypes
```

-  ~~以下のprintに関わる部分をpython3のprint()に~~ 
    -  やっぱりPython2.7で頑張ることにしたのでいらない作業．
```python:mcts_logp.py
print maxnum
...
print "current found max_score:",max_score
...
print "state position:,",state.position
...
print node_index
...
print "logp max found:", current_score
...
print "valid_com=",valid_compound
print "num_valid:", len(valid_compound)
print "all compounds:",len(all_simulated_compound)
print "score=", all_score
print "depth=",depth
print len(depth)
print "runtime",finished_run_time
#print "num_searched=",num_searched
print "100 max:",maxscore100,time100
print "500 max:",maxscore500,time500
print "1000 max:",maxscore1000,time1000
print "5000 max:",maxscore5000,time5000
print "10000 max:",maxscore10000,time10000
...
print val
...
print len(SA_scores)
```

### ChemTS/mcts_logp_improved_version/make_smile.py
- 相対パス表記になっていてバグったので絶対パスに書き換える．
```python:
f = open('../data/250k_rndm_zinc_drugs_clean.smi','rb')
```

-  ~~以下のprintに関わる部分をpython3のprint()に~~ 
    -  やっぱりPython2.7で頑張ることにしたのでいらない作業．
```python:make_smile.py
...
print max(logp_value)
print logp_value
...
```

# 実行スクリプト
10分でお試し実行する用のスクリプトなのでここから色々いじるとよし
```shell:Run_ChemTS.sh
#!/bin/bash
#$ -cwd
#$ -N ChemTS_result
#$ -l f_node=1
#$ -l h_rt=0:10:0
#$ -V


. /etc/profile.d/modules.sh
module load cuda/11.2.146 cudnn/8.1

source  ~/.bashrc
conda activate ChemTS
python /hoge/fuga/ChemTS/mcts_logp_improved_version/mcts_logp.py                                                                               
```

# そのほか便利にするためにやったこと
出力される`valid_compound`の重複を取り除きながら`unique_canonical.txt`ファイルにどんどん追加していくループを作成

```python：ChemTS/mcts_logp_improved_version・mcts_logp.py
...
def MCTS(root, verbose = False):
    # 初めに1行挿入
    global unique_canonical
    ....
    print("10000 max:",maxscore10000,time10000)

    # ここから挿入
    # canonical SMILESにしてからset()を噛ませることで重複を削除
    # print()は後でバグ確認するためなので気にせず
    print("\n unique_canonical length: ", len(unique_canonical))
    print("\n valid_compound length: ", len(valid_compound))
    tmp = [Chem.MolFromSmiles(smi) for smi in valid_compound]
    tmp = set([Chem.MolToSmiles(smi) for smi in tmp if smi])
    print("\n tmp length: ", len(tmp))
    unique_canonical = tmp | unique_canonical
    print("\n tmp | unique_canonical length: ", len(unique_canonical), "\n")

    # unique_canonical.txtに上書き
    with open('/hoge/fuga/unique_canonical.txt', 'w') as f:
        f.write("\n".join(unique_canonical))
    ...

if __name__ == "__main__":
    # ここから挿入
    # unique_canonical.txtから既存のデータを取得
    with open('/hoge/fuga/unique_canonical.txt', 'r') as f:
        unique_canonical = set(f.read().split("\n"))

    ....
    # この行を削除して
    # valid_compound=UCTchemical()

    # ここに新しくループを挿入．ジョブが続く限り「MCTSで作成→別ファイル（/hoge/fuga/unique_canonical.txt）に重複を削除しながら記録」を続ける
    while True:
        valid_compound=UCTchemical()

```

未来の研究室の後輩にこのページを託すんだ....（いまだにQiitaのことを便利なメモ帳だと思っている）