AlphaFold3をローカルPCで実施する際、jsonファイルを作成する必要があるが、jsonファイルの作成は手動で作成した場合、ミスによりエラーを頻発させてしまうことがしたため、少しでも楽できないかと、csvファイルからjsonファイルを作る方法を検討した。素人作成ですので検証は不十分な点もあり、エラーが残っている可能性があります。
単独のアミノ酸配列の構造を予測するためのjsonファイルをcsvファイルから作成する
アミノ酸配列名とアミノ酸配列から構成される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
}
複数のアミノ酸配列と化合物との複合体構造を予測するためのjsonファイルをcsvファイルから作成する
まず、以下のような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,,,
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()