AlphaFold3で解析を実施するときに少し楽をするための自作python toolの備忘録

AlphaFold3をローカルPCで実施する際、jsonファイルを作成する必要があるが、jsonファイルの作成は手動で作成した場合、ミスによりエラーを頻発させてしまうことがしたため、少しでも楽できないかと、csvファイルからjsonファイルを作る方法を検討した。素人作成ですので検証は不十分な点もあり、エラーが残っている可能性があります。

<h1>単独のアミノ酸配列の構造を予測するためのjsonファイルをcsvファイルから作成する</h1>

アミノ酸配列名とアミノ酸配列から構成されるcsvファイルを読み込みjsonファイルを作成する。

csvファイルの例
```
sequence_name1,amino_acid_sequence1
sequence_name2,amino_acid_sequence2
sequence_name3,amino_acid_sequence3
sequence_name3,amino_acid_sequence3
```

実際のコード
VS codeなどのJupyter上で動作させることを想定している。
python上で辞書オブジェクトを作成し、jsonモジュールを使ってjsonとして保存する操作が楽そうである。

```
#必要なモジュールのimport
import json
import csv

#csvファイルの保存先
TAGET_FOLDER = "sub_folder/"

#csvファイルの名前
FILE_NAME = "example.csv"

#鋳型となる辞書の作成
empty_dictionary = {"name": "",\
                    "modelSeeds": [1],\
                    "sequences": [],\
                    "dialect": "alphafold3",\
                    "version": 1 }

#配列情報のcsvファイルからの読み込み
seq_list = []
with open (TAGET_FOLDER + FILE_NAME, "r", encoding="utf-8-sig") as f:
    data = csv.reader(f)
    for i in data:
        seq_list.append(i)

#配列ファイルの鋳型への挿入とjsonファイルの保存
for i in seq_list:
    out_put = empty_dictionary
    protein_info = [{"protein": {"id": ["A"],"sequence":i[1]}}]
    out_put["name"] = i[0]
    out_put["sequences"] = protein_info
    with open(TAGET_FOLDER + i[0] + ".json", "w", encoding="utf-8") as f:
        json.dump(out_put, f, ensure_ascii=False, indent=4)
```

この操作により、以下のような内容のjsonファイルが生成されるはずである。
```
{
    "name": "sequence_name1",
    "modelSeeds": [
        1
    ],
    "sequences": [
        {
            "protein": {
                "id": [
                    "A"
                ],
                "sequence": "amino_acid_sequence1"
            }
        }
    ],
    "dialect": "alphafold3",
    "version": 1
}
```

<h1>複数のアミノ酸配列と化合物との複合体構造を予測するためのjsonファイルをcsvファイルから作成する</h1>

まず、以下のようなcsvファイルを良いする。
```
file_name,type,sequence,ccd,smiles,count,unpairedMsaPath,pairedMsaPath,memo
example1,protein,amino_acid_sequence1,,,1,,,
example1,ligand,,HEM,,1,,,
example1,protein,amino_acid_sequence2,,,1,,,
example1,ligand,,,C1=CC(=CC=C1/C=C/C(=O)O)O,1,,,
example2,protein,amino_acid_sequence3,,,1,,,
example2,protein,,HEM,,1,,,
example2,ligand,amino_acid_sequence4,,,1,,,
example2,protein,,,C1=CC(=CC=C1/C=C/C(=O)O)O,1,,,
```

エクセルファイルで開くと以下のように見える。
![スクリーンショット 2025-03-04 15.34.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1825372/90b16192-ea6a-48f1-8586-b9ade3b59f85.png)

file_nameにはファイルの名前を記入します。
同じfile_nameの行の情報は同じjsonファイルに格納されます。
複数のfile_nameを指定することで複数のjsonファイルをまとめて作ることができます。

typeにはproteinかligandどちらかの情報を記入する。
proteinの場合はsequenceにアミノ酸配列を記入する。a3mのmsaデータがある場合はunpairedMsaPathとpairedMsaPathにmsaのpathを記入するとmsaをそこから利用して予測し、msaを省略できる。
このversionでmsa情報なしで解析を実施するとmsaなしで構造予測を実施してしまい、構造予測の精度が下がる可能性がある。AF3でmsaを実施させる場合はprotein中のmsaに関連する項目は削除して解析を実施したほうが良さそうである。
ligandの場合はccdかsmilesのどちらか一方にリガンド情報を記入する。
countには基本的に1を記入する。ダイマーである場合は2にすると良い。

以下のコードでjsonを作れます。同様にVS codeなどのJupyter上で動作させることを想定しています。かくに

```
#必要なモジュールのインポート
import csv
import json
import copy
import subprocess
from subprocess import Popen
import sys
import json
import csv

#csvファイルの保存先
folder = "subfolder/"
#csvファイルの名前
csv_file = "example.csv"

#csvファイル内の情報の取得
#file_nameのリストとcsvの中身のリストを同時に取得する。
with open(folder + csv_file,"r", encoding="utf-8-sig") as f:
    record = csv.reader(f)
    file_name_list = []
    imported_list = []
    for i in record:
        #print(i)
        imported_list.append(i)
        if i[0] == "file_name":
            continue
        if i[0] in file_name_list:
            pass
        else:
            file_name_list.append(i[0])
print(file_name_list)

#json作成用の辞書オブジェクトの鋳型。ここで用意する意味はないかもしれないが、備忘録としてここに残す。
empty_dictionary = {"name": "","modelSeeds": [1],"sequences": [],"dialect": "alphafold3","version": 1 }
empty_protein = {"protein": {"id": [],"sequence": "","unpairedMsa":"","unpairedMsaPath": "","pairedMsa": "","pairedMsaPath": "","templates": []}}
empty_ligand_ccd = {"ligand": {"id": [],"ccdCodes": []}}        
empty_ligand_smiles = {"ligand": {"id": [],"smiles": ""}}

for i in file_name_list:
    print("making json for " + folder + i)
    count = 0
    #new_json = empty_dictionary
    new_json = {"name": "","modelSeeds": [1],"sequences": [],"dialect": "alphafold3","version": 1 }
    new_json["name"] = i
    #print(new_json)
    for j in imported_list:
        #print(j)
        if j[0] != i:
            continue
        if j[1] == "protein":
            new_protein = empty_protein
            new_protein["protein"]["sequence"] = j[2]
            countID = 0
            tempIDList = []
            temp_info_list = []
            while countID < int(j[5]):
                #print(chr(65 + count))
                tempIDList.append(chr(65 + count))
                count += 1
                countID += 1
                #print(count)
            #print(tempIDList)
            new_protein["protein"]["id"] = tempIDList
            new_protein["protein"]["unpairedMsaPath"] = j[6]
            new_protein["protein"]["pairedMsaPath"] = j[7]
            #print(new_protein)
            new_json["sequences"].append(copy.deepcopy(new_protein))
        elif j[1] == "ligand":
            if j[4] == "":
                new_ligand = empty_ligand_ccd
                new_ligand["ligand"]["ccdCodes"] = [j[3]]
            elif j[3] == "":
                new_ligand = empty_ligand_smiles
                new_ligand["ligand"]["smiles"] = j[4]
            countID = 0
            tempIDList = []
            while countID < int(j[5]):
                #print(chr(65 + count))
                tempIDList.append(chr(65 + count))
                count += 1
                countID += 1
                #print(count)
            #print(tempIDList)
            new_ligand["ligand"]["id"] = tempIDList
            new_json["sequences"].append(copy.deepcopy(new_ligand))
        #print(new_json)
    with open(folder + i + ".json", "w", encoding="utf-8") as f:
        json.dump(new_json, f, ensure_ascii=False, indent=4)
    new_json.clear()

```