文章目录
- AlphaFold 服务器job的 JSON 文件格式
-
- 1,1个简单的例子模板
- 2,对例子模板参数的详细解释
-
- Job name, seeds and sequences(任务名称、种子和序列)
- Entity types 实体类型
-
- Protein chains 蛋白质链
- DNA chains DNA 链
- RNA chains RNA 链
- Ligands 配体
- Ions 离子
- 3,多job实际运用举例:我的1个实际例子
参考我之前一篇古早博客:https://blog.csdn.net/weixin_62528784/article/details/144540998?spm=1001.2014.3001.5502
现在新的需求:
我们先不讲如何本地化部署,以及调用应用程序接口的问题,也先不去谈论其他关于额度的问题(也就是ColabFold类似的问题)。
我们先来讲,如何进行批量处理、批量提交web server的问题:
参考:https://github.com/google-deepmind/alphafold/tree/main/server

AlphaFold 服务器job的 JSON 文件格式
Json格式简单来说就是字典的字典
1,1个简单的例子模板
参考:https://github.com/google-deepmind/alphafold/blob/main/server/example.json
下面就是一个简单的预测输入json文件示例
[
{
"name": "Test Fold Job Number One",
"modelSeeds": [],
"sequences": [
{
"proteinChain": {
"sequence": "PREACHINGS",
"glycans": [
{
"residues": "NAG(NAG)(BMA)",
"position": 8
},
{
"residues": "BMA",
"position": 10
}
],
"modifications": [
{
"ptmType": "CCD_HY3",
"ptmPosition": 1
},
{
"ptmType": "CCD_P1L",
"ptmPosition": 5
}
],
"count": 1,
"maxTemplateDate": "2018-01-20"
}
},
{
"proteinChain": {
"sequence": "REACHER",
"count": 1,
"useStructureTemplate": false
}
},
{
"dnaSequence": {
"sequence": "GATTACA",
"modifications": [
{
"modificationType": "CCD_6OG",
"basePosition": 1
},
{
"modificationType": "CCD_6MA",
"basePosition": 2
}
],
"count": 1
}
},
{
"dnaSequence": {
"sequence": "TGTAATC",
"count": 1
}
},
{
"rnaSequence": {
"sequence": "GUAC",
"modifications": [
{
"modificationType": "CCD_2MG",
"basePosition": 1
},
{
"modificationType": "CCD_5MC",
"basePosition": 4
}
],
"count": 1
}
},
{
"ligand": {
"ligand": "CCD_ATP",
"count": 1
}
},
{
"ligand": {
"ligand": "CCD_HEM",
"count": 2
}
},
{
"ion": {
"ion": "MG",
"count": 2
}
},
{
"ion": {
"ion": "NA",
"count": 3
}
}
],
"dialect": "alphafoldserver",
"version": 1
},
{
"name": "Test Fold Job Number Two",
"modelSeeds": [],
"sequences": [
{
"proteinChain": {
"sequence": "TEACHINGS",
"count": 1,
"maxTemplateDate": "2024-05-08"
}
},
{
"dnaSequence": {
"sequence": "TAGGACA",
"count": 1
}
}
],
"dialect": "alphafoldserver",
"version": 1
}
]
这个例子其实很简单,双字典元素的列表,这个列表里面唯二的2个字典元素,每一个就是一个job。
这个JSON 文件由一系列字典组成(即使是一个字典,也必须使用单元素列表),每个字典包含一个作业描述。所以,我们可以在一个 JSON 文件中指定多个作业。
每个作业描述包含作业名称、PRNG 种子列表(可以为空列表以实现自动随机种子分配)以及待建模实体(分子)列表。
其实,这个json文件我们在最初使用web server网页服务器的时候就遇到过,重点来了!
AlphaFold 服务器 JSON 文件特别适用于自动化重复建模任务(例如,筛选一个蛋白质与少量其他蛋白质的相互作用)。构建初始 JSON 文件最简单的方法是通过 AlphaFold 服务器 GUI 运行一个建模任务,并将其用作模板。AlphaFold 服务器将生成一个包含建模结果的 zip 文件。在 zip 文件中,您将找到一个名为 <job_name>_job_request.json 的 JSON 文件,其中包含任务输入。这些文件为生成新任务提供了便捷的起点,因为它们可以在标准文本编辑器或 Google Colab 笔记本等编程环境中轻松编辑。
比如说我这里随便拿一个古早预测job来说,

在这个结果的文件夹中,有一个特殊的json格式文件:

打开之后是这样的:格式和上面的完全类似,就是一个单字典元素的列表(因为只有一个job,所以是单元素列表)
[{
"name": "Q2M1K9_DNA",
"modelSeeds": [
"2025"
],
"sequences": [
{
"dnaSequence": {
"sequence": "GCTCCCTGGGGAG",
"count": 1
}
},
{
"ion": {
"ion": "ZN",
"count": 30
}
},
{
"dnaSequence": {
"sequence": "CTCCCCAGGGAGC",
"count": 1
}
},
{
"proteinChain": {
"sequence": "MHKKRVEEGEASDFSLAWDSSVTAAGGLEGEPECDQKTSRALEDRNSVTSQEERNEDDEDMEDESIYTCDHCQQDFESLADLTDHRAHRCPGDGDDDPQLSWVASSPSSKDVASPTQMIGDGCDLGLGEEEGGTGLPYPCQFCDKSFIRLSYLKRHEQIHSDKLPFKCTYCSRLFKHKRSRDRHIKLHTGDKKYHCHECEAAFSRSDHLKIHLKTHSSSKPFKCTVCKRGFSSTSSLQSHMQAHKKNKEHLAKSEKEAKKDDFMCDYCEDTFSQTEELEKHVLTRHPQLSEKADLQCIHCPEVFVDENTLLAHIHQAHANQKHKCPMCPEQFSSVEGVYCHLDSHRQPDSSNHSVSPDPVLGSVASMSSATPDSSASVERGSTPDSTLKPLRGQKKMRDDGQGWTKVVYSCPYCSKRDFNSLAVLEIHLKTIHADKPQQSHTCQICLDSMPTLYNLNEHVRKLHKNHAYPVMQFGNISAFHCNYCPEMFADINSLQEHIRVSHCGPNANPSDGNNAFFCNQCSMGFLTESSLTEHIQQAHCSVGSAKLESPVVQPTQSFMEVYSCPYCTNSPIFGSILKLTKHIKENHKNIPLAHSKKSKAEQSPVSSDVEVSSPKRQRLSASANSISNGEYPCNQCDLKFSNFESFQTHLKLHLELLLRKQACPQCKEDFDSQESLLQHLTVHYMTTSTHYVCESCDKQFSSVDDLQKHLLDMHTFVLYHCTLCQEVFDSKVSIQVHLAVKHSNEKKMYRCTACNWDFRKEADLQVHVKHSHLGNPAKAHKCIFCGETFSTEVELQCHITTHSKKYNCKFCSKAFHAIILLEKHLREKHCVFDAATENGTANGVPPMATKKAEPADLQGMLLKNPEAPNSHEASEDDVDASEPMYGCDICGAAYTMEVLLQNHRLRDHNIRPGEDDGSRKKAEFIKGSHKCNVCSRTFFSENGLREHLQTHRGPAKHYMCPICGERFPSLLTLTEHKVTHSKSLDTGTCRICKMPLQSEEEFIEHCQMHPDLRNSLTGFRCVVCMQTVTSTLELKIHGTFHMQKLAGSSAASSPNGQGLQKLYKCALCLKEFRSKQDLVKLDVNGLPYGLCAGCMARSANGQVGGLAPPEPADRPCAGLRCPECSVKFESAEDLESHMQVDHRDLTPETSGPRKGTQTSPVPRKKTYQCIKCQMTFENEREIQIHVANHMIEEGINHECKLCNQMFDSPAKLLCHLIEHSFEGMGGTFKCPVCFTVFVQANKLQQHIFAVHGQEDKIYDCSQCPQKFFFQTELQNHTMSQHAQ",
"count": 1,
"useStructureTemplate": true
}
}
],
"dialect": "alphafoldserver",
"version": 1
}
]
2,对例子模板参数的详细解释
还是前面第1个例子:
[
{
"name": "Test Fold Job Number One",
"modelSeeds": [],
"sequences": [
{
"proteinChain": {
"sequence": "PREACHINGS",
"glycans": [
{
"residues": "NAG(NAG)(BMA)",
"position": 8
},
{
"residues": "BMA",
"position": 10
}
],
"modifications": [
{
"ptmType": "CCD_HY3",
"ptmPosition": 1
},
{
"ptmType": "CCD_P1L",
"ptmPosition": 5
}
],
"count": 1,
"maxTemplateDate": "2018-01-20"
}
},
{
"proteinChain": {
"sequence": "REACHER",
"count": 1,
"useStructureTemplate": false
}
},
{
"dnaSequence": {
"sequence": "GATTACA",
"modifications": [
{
"modificationType": "CCD_6OG",
"basePosition": 1
},
{
"modificationType": "CCD_6MA",
"basePosition": 2
}
],
"count": 1
}
},
{
"dnaSequence": {
"sequence": "TGTAATC",
"count": 1
}
},
{
"rnaSequence": {
"sequence": "GUAC",
"modifications": [
{
"modificationType": "CCD_2MG",
"basePosition": 1
},
{
"modificationType": "CCD_5MC",
"basePosition": 4
}
],
"count": 1
}
},
{
"ligand": {
"ligand": "CCD_ATP",
"count": 1
}
},
{
"ligand": {
"ligand": "CCD_HEM",
"count": 2
}
},
{
"ion": {
"ion": "MG",
"count": 2
}
},
{
"ion": {
"ion": "NA",
"count": 3
}
}
],
"dialect": "alphafoldserver",
"version": 1
},
{
"name": "Test Fold Job Number Two",
"modelSeeds": [],
"sequences": [
{
"proteinChain": {
"sequence": "TEACHINGS",
"count": 1,
"maxTemplateDate": "2024-05-08"
}
},
{
"dnaSequence": {
"sequence": "TAGGACA",
"count": 1
}
}
],
"dialect": "alphafoldserver",
"version": 1
}
]
Job name, seeds and sequences(任务名称、种子和序列)
我们先不看具体的任务内容,先将所有的键值对抽象出来,就是下面的这个形式
{
"name": "Test Fold Job Number One",
"modelSeeds": [],
"sequences": […],
"dialect": "alphafoldserver",
"version": 1
}
name:一个包含任务名称的字符串。这是任务在任务历史表中的显示方式,我的例子中就是{uniprot id}_DNA,示意简洁明了

modelSeeds:一个包含 uint32 种子值字符串的列表(例如 [“1593933729”, “4273”] )。种子值用于运行建模。官方是建议提供一个空列表,在这种情况下将使用一个随机种子,而且这个是推荐选项。
当然,随机数种子这玩意,其实现在也有玄学可讲,有人用科幻小说的42,有人用机器学习炼丹通用seed,也有人用年份。我在批量处理时候习惯统一用年份。

Entity types 实体类型
有效的实体类型与 AlphaFold Server 网页界面中可用的类型相同:
- proteinChain – 用于蛋白质
- dnaSequence – 用于 DNA(单链)
- rnaSequence – 用于 RNA(单链)
- ligand – 用于允许的配体
- ion – 用于允许的离子
- dialect – 输入 JSON 的dialect。应设置为 alphafoldserver
- version – 输入 JSON 的版本。应设置为 1。
Protein chains 蛋白质链
sequence 是一个包含蛋白质序列的字符串;与 UI 中的限制相同,例如,仅允许与氨基酸对应的字母,如 IUPAC 所定义。仅支持 20 种标准氨基酸类型。
count 表示该蛋白质链的拷贝数(整数)。

glycans 是一个可选的字典列表,用于描述蛋白质糖基化。
- residues 是一个定义聚糖的字符串。细节参考https://alphafoldserver.com/faq

- position 是聚糖连接的氨基酸的位置(整数,1-based index)。

modifications 是一个可选的字典列表,用于描述翻译后修饰。
- ptmType 是一个包含修饰物 CCD code(参考https://www.wwpdb.org/data/ccd)的字符串;与 UI 中允许的格式相同。
- position 是修饰的氨基酸的位置(整数)。

- 允许的修饰: CCD_SEP , CCD_TPO , CCD_PTR , CCD_NEP , CCD_HIP , CCD_ALY , CCD_MLY , CCD_M3L , CCD_MLZ , CCD_2MR , CCD_AGM , CCD_MCS , CCD_HYP , CCD_HY3 , CCD_LYZ , CCD_AHB , CCD_P1L , CCD_SNN , CCD_SNC , CCD_TRF , CCD_KCR , CCD_CIR , CCD_YHA
useStructureTemplate 是一个可选的布尔值,用于确定模型是否应使用 PDB 模板,其默认值为 true 。

maxTemplateDate 是一个可选的 ISO 8601 日期字符串(YYYY-MM-DD),用于指定考虑 PDB 模板的日期上限。只有在此日期或之前发布的模板才会被使用。日期的下限是 1976-01-01(这实际上会排除所有模板),而目前可以设置的最新日期是 2025-02-03(用于生成模板的 PDB 最后下载日期)。

DNA chains DNA 链
请注意, dnaSequence类型指的是单链 DNA。如果我们希望建模双链 DNA,请添加第二个 dnaSequence ,其中包含反向互补链的序列。
比如说转录因子/蛋白质结合DNA,我们有ChIP-seq等Peak的数据,其实不可能只用单peak,用的是double strand序列数据

sequence 是一个包含 DNA 序列的字符串;与 UI 中的限制相同,即仅允许字母 A、T、G、C。
count 表示该 DNA 链的拷贝数量(整数)。
modifications 是一个可选的字典列表,用于描述 DNA 化学修饰。
- modificationType 是一个包含修饰物 CCD code(参考https://www.wwpdb.org/data/ccd)的字符串;与 UI 中允许同样
- basePosition 是修饰核苷酸的位置(整数)。
- 允许的修饰: CCD_5CM , CCD_C34 , CCD_5HC , CCD_6OG , CCD_6MA , CCD_1CC , CCD_8OG , CCD_5FC , CCD_3DR

RNA chains RNA 链
sequence 是一个包含 RNA 序列(单链)的字符串;与 UI 中的限制相同,例如仅允许字母 A、U、G、C。
count表示该 RNA 链的拷贝数(整数)。
modifications 是一个可选的字典列表,用于描述 RNA 化学修饰。
- modificationType 是一个包含修饰物 CCD code(https://www.wwpdb.org/data/ccd)的字符串;与 UI 中允许的类型一样。
- basePosition 是修饰核苷酸的位置(整数)。
- 允许的修饰: CCD_PSU , CCD_5MC , CCD_OMC , CCD_4OC , CCD_5MU , CCD_OMU , CCD_UR3 , CCD_A2M , CCD_MA6 , CCD_6MZ , CCD_2MG , CCD_OMG , CCD_7MG , CCD_RSQ

Ligands 配体
ligand 是一个包含配体 CCD code(https://www.wwpdb.org/data/ccd)的字符串;UI 中允许使用相同的代码。
count是该配体的副本数量(整数)。
允许的配体: CCD_ADP , CCD_ATP , CCD_AMP , CCD_GTP , CCD_GDP , CCD_FAD , CCD_NAD , CCD_NAP , CCD_NDP , CCD_HEM , CCD_HEC , CCD_PLM , CCD_OLA , CCD_MYR , CCD_CIT , CCD_CLA , CCD_CHL , CCD_BCL , CCD_BCB

Ions 离子
ion 是一个包含离子 CCD code(https://www.wwpdb.org/data/ccd)的字符串;与 UI 中允许的代码相同。离子的电荷由 CCD 码隐含指定。
count 表示该离子的副本数量(整数)。
允许的离子: MG , ZN , CL , CA , NA , MN , K , FE , CU , CO

3,多job实际运用举例:我的1个实际例子
下面是一个蛋白质+其结合位点一致性序列的对应数据:

这个tsv数据是我用API从公共数据库爬取下来的,然后导出为tsv格式。
下面为了方便演示,我们再重头开始导入。
对于这个数据,此处假设为变量c2h2_zfp_NCR_af3,
每一行就是一个蛋白质,我们想要看一下在有TFBS序列前以及后的结构,

如果我们一个一个在alphafold3 web server手动输入的话,肯定得累死,并且浪费时间。
所以我们正好用本篇博客介绍的json批量处理方法,
将这155个任务x2(DNA有或无)=310个job,直接用脚本进行处理。
首先,我们先明确一下我们待输入的目标对象:
- DNA序列:motif_consensus列以及其互补序列,此处序列数据是从Jaspar2026爬取的,本来是有anti-consensus序列的,但我在实际check的时候发现anti-consensus序列其实并不总是和consensus序列互补,有点反常理。所以我写了个函数,简单调用处理:
def complement(seq: str) -> str:
return seq.translate(str.maketrans("ATCGatcg", "TAGCtagc"))
# 示例
print(complement("AGCT")) # TCGA

- 蛋白质序列:也就是sequence列
- 其他配体列:比如说我这里要加Zn2+,也就是锌离子
这里因为Jaspar的motif数据中其实有一些蛋白质的id是重复的,所以我需要将id处理一下,
# 是否有重复
c2h2_zfp_NCR_af3["protein_id"].duplicated().any()
# 重复的 protein_id 及其出现次数
c2h2_zfp_NCR_af3["protein_id"].value_counts().loc[lambda s: s > 1]
# 查看所有重复行的具体内容
c2h2_zfp_NCR_af3.loc[
c2h2_zfp_NCR_af3["protein_id"].duplicated(keep=False)
].sort_values("protein_id")

我先通过一些简单的加后缀的方式来处理这些文件,
# 通过添加后缀的方法来解决protein_id重复的问题
c2h2_zfp_NCR_af3["_dup_idx"] = c2h2_zfp_NCR_af3.groupby("protein_id").cumcount()
mask = c2h2_zfp_NCR_af3["_dup_idx"] > 0
c2h2_zfp_NCR_af3.loc[mask, "protein_id"] = (
c2h2_zfp_NCR_af3.loc[mask, "protein_id"] + "_" + (c2h2_zfp_NCR_af3.loc[mask, "_dup_idx"] + 1).astype(str)
)
c2h2_zfp_NCR_af3 = c2h2_zfp_NCR_af3.drop(columns="_dup_idx")
c2h2_zfp_NCR_af3
接下来就是将这个数据框pandas中的dataframe转化为字典格式的数据,
c2h2_zfp_NCR_af3_dict = c2h2_zfp_NCR_af3.set_index('protein_id')[['motif_consensus', 'zf_count', 'sequence']].to_dict('index')

下面就是重点了,批量构建一个字典元素的列表,也就是构建json格式数据,
注意python中bool的True和False,和json格式中的小写其实是可以转化的,所以我们前面模板中虽然json格式是小写的,但是我们正常代码处理用大写的就可以了
c2h2_zfp_ncr_af3_json = []
for protein_id, data in c2h2_zfp_NCR_af3_dict.items():
noDNA_job = {"name": f"{protein_id}_noDNA",
"modelSeeds": ["2025"],
"sequences": [
{
"ion": {
"ion": "ZN",
"count": data['zf_count']
}
},
{
"proteinChain": {
"sequence": data['sequence'],
"count": 1,
"useStructureTemplate": True
}
}
],
"dialect": "alphafoldserver",
"version": 1
}
DNA_job = {"name": f"{protein_id}_DNA",
"modelSeeds": ["2025"],
"sequences": [
{
"dnaSequence": {
"sequence": data['motif_consensus'],
"count": 1
}
},
{
"dnaSequence": {
"sequence": complement(data['motif_consensus']),
"count": 1
}
},
{
"ion": {
"ion": "ZN",
"count": data['zf_count']
}
},
{
"proteinChain": {
"sequence": data['sequence'],
"count": 1,
"useStructureTemplate": True
}
}
],
"dialect": "alphafoldserver",
"version": 1
}
c2h2_zfp_ncr_af3_json.append(noDNA_job)
c2h2_zfp_ncr_af3_json.append(DNA_job)
# 每个json只能提供100个job
import json
with open("xxxx.json", "w") as f:
json.dump(c2h2_zfp_ncr_af3_json, f)
主要是后面需要import json模块来处理一下,进行格式转换。
就这样,我们手头上拿到了批量的json设置文件:

另外注意,因为alphafold3 server暂时json文件上传值支持100job/次,
所以建议将json按照每100个字典元素进行划分,也就是100个字典设置/每批次。
然后回到网页服务器这边,将批量100份的json设置文件从这里上传就可以了

然后会自动建立job,但是这些job并没有执行,只是draft草稿,相当于是创建了100个任务,在队列中排队等着。

等到你的每日30次消费额度空出来了,你只需要在下面的排队任务list中一个一个任务的点击,然后confirm要不要执行递交就可以了。
总而言之,json批量处理只是简化了你每一次手动设置输入数据以及格式、尽可能避免浪费时间、同时在计算机上批量处理json文件其实也能够避免输错序列,比人工一个一个输入靠谱多了,
然后你只需要每天点击运行-确认30次就可以了,这样就能够将几个小时的手动劳作减少到几分钟点击鼠标运行!



