Python Boltz/Protenix/Seedfold Input Generator (简称 PyBIP) 是一个Python脚本,旨在简化为生物信息学工具 Boltz-2 (输出YAML格式)、Protenix (输出JSON格式) 和 Seedfold (输出JSON格式) 生成输入文件的过程。它能够解析FASTA格式的蛋白质、DNA、RNA序列文件,CCD配体信息,以及包含化合物ID和SMILES的CSV文件,然后根据所选工具的要求生成相应的结构化输入文件。
- 多类型序列支持: 从FASTA文件读取蛋白质、DNA、RNA序列,并支持指定每个序列的复制数量。
- CCD配体支持: 支持通过命令行指定CCD配体及其数量。
- 化合物数据集成: 从CSV文件中读取化合物ID和SMILES,并将其整合到生成的输入文件中。
- Boltz-2 YAML生成:
- 为每种序列和CCD配体生成带有唯一ID的条目。
- 为CSV中的每个化合物生成一个独立的YAML文件,化合物在YAML中固定ID为
B。
- Protenix JSON生成:
- 为每种序列和CCD配体生成条目,不包含ID字段。
- 将CSV中的每个化合物作为一个独立条目整合到一个JSON文件中,化合物不包含ID字段。
- 在输出JSON文件同目录下生成一个随机种子文件
seed.txt。
- Seedfold JSON生成:
- 为每种序列和CCD配体生成条目,不包含ID字段。
- 为CSV中的每个化合物生成一个独立的JSON文件。
- 文件命名格式为
[所有序列文件基础名用下划线连接]_[化合物ID].json。
- 统一错误处理: 使用自定义异常
InputGeneratorError和错误码,提供清晰的错误信息。 - 详细日志: 提供生成过程中的信息、警告和错误日志。
- PEP8兼容: 代码风格符合Python PEP8规范。
- 类型注解: 广泛使用类型注解,增强代码可读性和可维护性。
- 单元测试: 包含完整的单元测试,确保代码质量和功能正确性。
当前版本: 0.3.0
- 克隆仓库:
git clone https://gitee.com/coding_playground/pybip.git cd pybip - 安装依赖:
pip install -r requirements.txt
- 安装包:
pip install -e .
如果您不想安装包,也可以直接使用 pybip.py 脚本:
- 下载脚本:
将
pybip.py文件下载到您的本地目录。 - 安装依赖:
pip install pyyaml
脚本通过子命令的方式工作,支持 boltz、protenix 和 seedfold 三个主命令。
以下参数可用于 boltz、protenix 和 seedfold 子命令,用于指定输入数据:
--protein "PATH:COUNT[,PATH:COUNT]...": 蛋白质FASTA文件路径和数量。例如:"protein1.fasta:1,protein2.fasta:2"--dna "PATH:COUNT[,PATH:COUNT]...": DNA FASTA文件路径和数量。格式同上。--rna "PATH:COUNT[,PATH:COUNT]...": RNA FASTA文件路径和数量。格式同上。--ccd "NAME:COUNT[,NAME:COUNT]...": CCD配体名称和数量。例如:"CCD_P4G:1,CCD_6OI:2"--ion "NAME:COUNT[,NAME:COUNT]...": 离子名称和数量。例如:"CCD_NA:1,CCD_CL:2"--csv CSV_FILE_PATH: (必需) 包含化合物ID和SMILES的CSV文件路径。CSV文件必须包含id和smiles两列。
使用 boltz 子命令生成 Boltz-2 YAML 文件。
特定参数:
--output DIR_PATH: YAML文件的输出目录(默认:.当前目录)。--pocket FILE_PATH: 口袋约束YAML文件路径,其内容将被直接添加到生成的YAML文件末尾。--affinity true|false: 是否在输出YAML中包含亲和力计算部分(默认:true)。
输出文件结构:
- 每个化合物会生成一个独立的YAML文件,命名格式为
[所有序列文件基础名用下划线连接]_[化合物ID].yaml。 - YAML文件中的序列(蛋白质、DNA、RNA)和CCD配体都会被分配一个唯一的
id(如P1,D2,CCD_P4G)。 - 从CSV读取的化合物在YAML中将固定使用
id: B。 - 当
--affinity为true(默认) 时,YAML文件会包含properties部分,用于指定亲和力计算的binder。 - 当
--affinity为false时,YAML文件不会包含properties部分。
示例:
假设您有以下文件:
protein.fasta(包含一个蛋白质序列)compounds.csv(内容如下:id,smiles COMP1,CCCC COMP2,O=C(N)C)pocket.yaml(包含口袋约束信息)
python pybip.py boltz \
--protein "protein.fasta:1" \
--ccd "P4G:1" \
--csv compounds.csv \
--output boltz_inputs \
--pocket pocket.yaml示例 (不包含亲和力计算部分):
python pybip.py boltz \
--protein "protein.fasta:1" \
--ccd "P4G:1" \
--csv compounds.csv \
--output boltz_inputs \
--pocket pocket.yaml \
--affinity false这将会在 boltz_inputs 目录下生成类似的文件:
protein_COMP1.yamlprotein_COMP2.yaml
protein_COMP1.yaml 的大致内容:
version: 1
sequences:
- protein:
id: P1
sequence: YOUR_PROTEIN_SEQUENCE_HERE
count: 1
- ligand:
id: P4G
ligand: P4G
count: 1
- ligand:
id: B
smiles: CCCC
count: 1
properties:
- affinity:
binder: B
constraints:
- pocket:
binder: B # Ligand chain
contacts: [[P1, AA No.], [P1, AA No.], [P1, AA No.]...] # Contact residues
max_distance: x # Angstroms
force: true # Use potential to enforce使用 protenix 子命令生成 Protenix JSON 文件。
特定参数:
--output FILE_PATH: 输出JSON文件的名字(默认:input.json)。
输出文件结构:
- 所有化合物的条目都会被整合到一个JSON文件中。
- JSON文件中的序列(蛋白质、DNA、RNA)和CCD配体 不会 包含
id字段。 - JSON文件中的化合物也不会包含
id字段,只有ligand和count。 - 在输出JSON文件所在的目录下,会生成一个名为
seed.txt的文件,其中包含一个随机生成的整数种子。
示例:
python pybip.py protenix \
--protein "protein.fasta:1" \
--dna "dna.fasta:1" \
--ccd "CCD_6OI:2" \
--ion "CCD_NA:1,CCD_CL:2" \
--csv compounds.csv \
--output protenix_data.json这将在当前目录下生成 protenix_data.json 和 seed.txt。
protenix_data.json 的大致内容:
[
{
"sequences": [
{
"proteinChain": {
"sequence": "YOUR_PROTEIN_SEQUENCE_HERE",
"count": 1
}
},
{
"dnaSequence": {
"sequence": "YOUR_DNA_SEQUENCE_HERE",
"count": 1
}
},
{
"ligand": {
"ligand": "CCD_6OI",
"count": 2
}
},
{
"ion": {
"ion": "CCD_NA",
"count": 1
}
},
{
"ion": {
"ion": "CCD_CL",
"count": 2
}
},
{
"ligand": {
"ligand": "CCCC",
"count": 1
}
}
],
"name": "protein_COMP1"
},
{
"sequences": [
{
"proteinChain": {
"sequence": "YOUR_PROTEIN_SEQUENCE_HERE",
"count": 1
}
},
{
"dnaSequence": {
"sequence": "YOUR_DNA_SEQUENCE_HERE",
"count": 1
}
},
{
"ligand": {
"ligand": "CCD_6OI",
"count": 2
}
},
{
"ion": {
"ion": "CCD_NA",
"count": 1
}
},
{
"ion": {
"ion": "CCD_CL",
"count": 2
}
},
{
"ligand": {
"ligand": "O=C(N)C",
"count": 1
}
}
],
"name": "protein_dna_COMP2"
}
]使用 seedfold 子命令生成 Seedfold JSON 文件。
特定参数:
--output DIR_PATH: JSON文件的输出目录(默认:.当前目录)。
输出文件结构:
- 每个化合物会生成一个独立的JSON文件,命名格式为
[所有序列文件基础名用下划线连接]_[化合物ID].json。 - JSON文件是一个数组,包含一个完整的任务对象。
- 任务对象包含
job_name、model和entities字段。 job_name格式为[所有序列文件基础名用下划线连接]_[化合物ID]。model默认值为SeedFold-Linear_v1.0.0。entities数组中的每个实体包含entity、copies和sequence字段。- 实体类型包括:
Protein、DNA、RNA、Ligand/Ion-CCD和Ligand-Smiles。
示例:
python pybip.py seedfold \
--protein "protein.fasta:4" \
--dna "dna.fasta:1" \
--rna "rna.fasta:1" \
--ccd "SO4:2" \
--csv compounds.csv \
--output seedfold_inputs这将会在 seedfold_inputs 目录下生成类似的文件:
protein_COMP1.jsonprotein_COMP2.json
protein_COMP1.json 的大致内容:
[
{
"job_name": "protein_COMP1",
"model": "SeedFold-Linear_v1.0.0",
"entities": [
{
"entity": "Protein",
"copies": 4,
"sequence": "YOUR_PROTEIN_SEQUENCE_HERE"
},
{
"entity": "DNA",
"copies": 1,
"sequence": "YOUR_DNA_SEQUENCE_HERE"
},
{
"entity": "RNA",
"copies": 1,
"sequence": "YOUR_RNA_SEQUENCE_HERE"
},
{
"entity": "Ligand/Ion-CCD",
"copies": 2,
"sequence": "SO4"
},
{
"entity": "Ligand-Smiles",
"copies": 1,
"sequence": "CCCC"
}
]
}
]pybip/
├── pybip.py # 主脚本文件
├── exceptions.py # 自定义异常类
├── commands/ # 命令相关模块
│ ├── __init__.py
│ ├── base.py # 命令基类
│ ├── boltz.py # Boltz命令实现
│ ├── protenix.py # Protenix命令实现
│ └── seedfold.py # Seedfold命令实现
├── utils/ # 工具函数
│ ├── __init__.py
│ ├── fasta.py # FASTA文件读取
│ ├── csv_reader.py # CSV文件读取
│ └── seed.py # 随机种子生成
├── requirements.txt # 依赖列表
├── setup.py # 安装配置
└── README.md # 项目文档
脚本使用自定义的 InputGeneratorError 异常来处理各种预期错误,例如文件未找到、CSV格式错误、参数解析失败等。当发生此类错误时,脚本会输出详细的错误信息到标准错误流,并以相应的错误码退出。
本项目采用 GNU General Public License v3 (GPLv3) 许可证。详见 LICENSE 文件。
如有问题或建议,请通过以下方式联系我们: