# PyBIP **Repository Path**: coding_playground/pybip ## Basic Information - **Project Name**: PyBIP - **Description**: Python Boltz/Protenix/Seedfold Input Generator 是一个Python脚本,旨在简化为生物信息学工具 Boltz-2 (输出YAML格式) 和 Protenix、SeedFold (输出JSON格式) 生成输入文件的过程。 - **Primary Language**: Python - **License**: GPL-3.0 - **Default Branch**: 0.5.0 - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-07-09 - **Last Updated**: 2026-09-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Python Boltz/Protenix/Seedfold/AlphaFold3/OpenFold3/OpenDDE Input Generator ## 简介 `Python Boltz/Protenix/Seedfold/AlphaFold3/OpenFold3/OpenDDE Input Generator` (简称 PyBIP) 是一个Python脚本,旨在简化为生物信息学工具 **Boltz-2** (输出YAML格式)、**Protenix** (输出JSON格式)、**Seedfold** (输出JSON格式)、**AlphaFold3** (输出JSON格式)、**OpenFold3** (输出JSON格式) 和 **OpenDDE** (输出JSON格式) 生成输入文件的过程。它能够解析FASTA格式的蛋白质、DNA、RNA序列文件,CCD配体信息,以及包含化合物ID和SMILES的CSV文件,然后根据所选工具的要求生成相应的结构化输入文件。 ## 功能特性 - **多类型序列支持**: 从FASTA文件读取蛋白质、DNA、RNA序列,并支持指定每个序列的复制数量。 - **CCD配体支持**: 支持通过命令行指定CCD配体及其数量;命令行中**直接填裸CCD码**(如 `P4G`、`ATP`),无需 `CCD_` 前缀,程序会按各模型的规范自动添加或省略前缀。 - **化合物数据集成**: 从CSV文件中读取化合物ID和SMILES,并将其整合到生成的输入文件中。 - **可选配体场景**: 所有子命令的 `--csv` 参数均为可选,不提供时生成无配体的纯结构输入文件。 - **Boltz-2 YAML生成**: - 为每种序列和CCD配体生成带有唯一ID的条目。 - 为CSV中的每个化合物生成一个独立的YAML文件,化合物在YAML中固定ID为`B`。 - 无CSV时生成单个 `{base_name}.yaml`,不含binder和亲和力部分。 - **Protenix JSON生成**: - 为每种序列和CCD配体生成条目,**不包含ID字段**。 - 将CSV中的每个化合物作为一个独立条目整合到一个JSON文件中,化合物不包含ID字段。 - 在输出JSON文件同目录下生成一个随机种子文件 `seed.txt`。 - 无CSV时生成单条目JSON,`name` 为 `base_name`。 - **Seedfold JSON生成**: - 为每种序列和CCD配体生成条目,**不包含ID字段**。 - 为CSV中的每个化合物生成一个独立的JSON文件。 - 文件命名格式为 `[所有序列文件基础名用下划线连接]_[化合物ID].json`。 - 无CSV时生成单个 `{base_name}.json`,不含 Ligand-Smiles 实体。 - **AlphaFold3 JSON生成**: - 输出符合 AlphaFold3 官方 JSON 格式 (`dialect: alphafold3`, `version: 4`)。 - 随机生成 `modelSeeds` 字段(101–999999 范围)。 - 链ID按输入顺序分配大写字母 (A, B, C...),多拷贝时使用列表 (如 `["A", "B"]`)。 - 离子/配体通过 `ccdCodes` 字段处理,SMILES化合物通过 `smiles` 字段处理。 - 为CSV中的每个化合物生成一个独立的JSON文件,无CSV时生成单个 `{base_name}.json`。 - **OpenFold3 JSON生成**: - 输出符合 OpenFold3 推理 JSON 格式(顶层 `seeds` 字段 + `queries` 字典)。 - 顶层随机生成 `seeds` 字段(101–999999 范围),无需命令行参数。 - 链使用 `molecule_type` + `chain_ids` 结构。 - 配体支持 `ccd_codes` (CCD) 和 `smiles` (SMILES) 两种定义方式。 - 链ID按输入顺序分配大写字母,多拷贝时使用列表;每个 query 的链ID独立从 `A` 开始。 - 多个预测任务(CSV中的每个化合物/组合)合并写入**单个JSON文件**的 `queries` 字典,每个任务一个 query。 - `--output` 为输出**文件路径**(默认 `input.json`),与 `protenix` 子命令一致;仅在该路径的父目录不存在时创建,不额外生成文件夹。 - **OpenDDE JSON生成**: - 输出符合 OpenDDE 推理 JSON 格式(顶层为 job 数组)。 - 实体键为 `proteinChain`、`dnaSequence`、`rnaSequence`、`ligand`(CCD 或 SMILES)和 `ion`。 - `--ccd` 的值缺少 `CCD_`/`FILE_` 前缀时自动补齐;`--ion` 的值输出时自动去掉 `CCD_` 前缀。 - 每个 job 随机生成 `modelSeeds` 字段(101–999999 范围)。 - 不输出实体 `id` 字段,链ID由 OpenDDE 自动分配。 - 多个预测任务(CSV中的每个化合物/组合)作为多个 job 合并写入**单个JSON文件**;`--output` 为输出**文件路径**(默认 `input.json`),与 `protenix` 子命令一致。 - 可选 `--covalent-bonds` 传入共价键JSON文件(顶层为数组),其内容原样注入每个 job 的 `covalent_bonds` 字段。 - **统一错误处理**: 使用自定义异常 `InputGeneratorError` 和错误码,提供清晰的错误信息。 - **详细日志**: 提供生成过程中的信息、警告和错误日志。 - **PEP8兼容**: 代码风格符合Python PEP8规范。 - **类型注解**: 广泛使用类型注解,增强代码可读性和可维护性。 ## 版本 当前版本: 0.5.0 ## 安装 ### 1. 从源代码安装 1. **克隆仓库**: ```bash git clone https://gitee.com/coding_playground/pybip.git cd pybip ``` 2. **安装依赖**: ```bash pip install -r requirements.txt ``` 3. **安装包**: ```bash pip install -e . ``` ### 2. 直接使用脚本 如果您不想安装包,也可以直接使用 `pybip.py` 脚本: 1. **下载脚本**: 将 `pybip.py` 文件下载到您的本地目录。 2. **安装依赖**: ```bash pip install pyyaml ``` ## 使用方法 脚本通过子命令的方式工作,支持 `boltz`、`protenix`、`seedfold`、`alphafold3`、`openfold3` 和 `opendde` 六个主命令。 ### 通用参数 以下参数可用于所有子命令,用于指定输入数据: - `--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码,无需 `CCD_` 前缀**。例如: `"P4G:1,6OI:2"`。程序会按模型自动处理前缀:`protenix`/`opendde` 的配体会补上 `CCD_`(`P4G` → `CCD_P4G`),`boltz`/`seedfold`/`alphafold3`/`openfold3` 保持裸码。写成 `CCD_P4G` 也能识别(会自动去前缀后再按模型重加)。`protenix`/`opendde` 还支持 `FILE_` 前缀的结构文件路径(保持原样,不加前缀)。 - `--ion "NAME:COUNT[,NAME:COUNT]..."`: 离子名称和数量(仅 `protenix` 和 `opendde` 子命令支持),同样**直接填裸CCD码**。例如: `"NA:1,CL:2"`。这两个模型的 `ion` 字段都**不带** `CCD_` 前缀,写成 `CCD_NA` 也会自动去前缀。 - `--csv "PATH[,PATH]..."`: **(可选)** 包含化合物ID和SMILES的CSV文件路径,可传多个,格式同 `--protein`。CSV文件必须包含 `id` 和 `smiles` 两列。提供多个CSV时,生成文件中的配体为各CSV文件SMILES的笛卡尔积组合(每个CSV取一个),同一CSV内的SMILES不重复出现在同一文件中。不提供时生成无配体的纯结构输入文件。 ### 1. 生成 Boltz-2 YAML 输入文件 使用 `boltz` 子命令生成 Boltz-2 YAML 文件。 **特定参数**: - `--output DIR_PATH`: YAML文件的输出目录(默认: `.` 当前目录)。 - `--pocket FILE_PATH`: 口袋约束YAML文件路径,其内容将被直接添加到生成的YAML文件末尾。 - `--affinity true|false`: 是否在输出YAML中包含亲和力计算部分(默认: `false`)。仅在提供 `--csv` 时生效。 **输出文件结构**: - 提供 `--csv` 时:每个化合物生成一个独立的YAML文件,命名格式为 `[所有序列文件基础名用下划线连接]_[化合物ID].yaml`。 - YAML文件中的序列(蛋白质、DNA、RNA)和CCD配体都会被分配一个唯一的 `id` (如 `P1`, `D2`, `P4G`)。 - 从CSV读取的化合物:第一个CSV的配体固定使用 `id: B`,后续CSV的配体依次使用 `id: L1`、`L2`... - 当 `--affinity` 为 `true` 时,YAML文件会包含 `properties` 部分,用于指定亲和力计算的binder。 - 当 `--affinity` 为 `false` 时,YAML文件不会包含 `properties` 部分。 - 多CSV组合时,文件/entry命名为 `[所有序列文件基础名用下划线连接]_[各CSV配体ID按下划线连接]`;若不同CSV存在相同ID导致命名冲突,自动回退为 `[基础名]_[CSV文件名]_[ID]_...` 形式,仍冲突则追加数字后缀。 - 不提供 `--csv` 时:生成单个 `{base_name}.yaml`,仅包含序列和CCD配体,不含binder和亲和力部分。 **示例**: 假设您有以下文件: - `protein.fasta` (包含一个蛋白质序列) - `compounds.csv` (内容如下: `id,smiles COMP1,CCCC COMP2,O=C(N)C`) - `pocket.yaml` (包含口袋约束信息) ```bash python pybip.py boltz \ --protein "protein.fasta:1" \ --ccd "P4G:1" \ --csv compounds.csv \ --output boltz_inputs \ --pocket pocket.yaml ``` **示例 (不包含亲和力计算部分)**: ```bash python pybip.py boltz \ --protein "protein.fasta:1" \ --ccd "P4G:1" \ --csv compounds.csv \ --output boltz_inputs \ --pocket pocket.yaml \ --affinity false ``` **示例 (无配体纯结构预测)**: ```bash python pybip.py boltz \ --protein "protein.fasta:1" \ --output boltz_inputs ``` 这将会在 `boltz_inputs` 目录下生成类似的文件: - `protein_COMP1.yaml` - `protein_COMP2.yaml` `protein_COMP1.yaml` 的大致内容: ```yaml version: 1 sequences: - protein: id: P1 sequence: YOUR_PROTEIN_SEQUENCE_HERE count: 1 - ligand: id: P4G ccd: 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 ``` ### 2. 生成 Protenix JSON 输出文件 使用 `protenix` 子命令生成 Protenix JSON 文件。 **特定参数**: - `--output FILE_PATH`: 输出JSON文件的名字(默认: `input.json`)。 **输出文件结构**: - 提供 `--csv` 时:所有化合物的条目都会被整合到一个JSON文件中。 - JSON文件中的序列(蛋白质、DNA、RNA)和CCD配体 **不会** 包含 `id` 字段。 - JSON文件中的化合物也不会包含 `id` 字段,只有 `ligand` 和 `count`。 - 多CSV组合时,文件/entry命名为 `[所有序列文件基础名用下划线连接]_[各CSV配体ID按下划线连接]`;若不同CSV存在相同ID导致命名冲突,自动回退为 `[基础名]_[CSV文件名]_[ID]_...` 形式,仍冲突则追加数字后缀。 - 不提供 `--csv` 时:生成单条目JSON,`name` 为 `base_name`,仅包含序列、CCD配体和离子。 - 在输出JSON文件所在的目录下,会生成一个名为 `seed.txt` 的文件,其中包含一个随机生成的整数种子。 **示例**: ```bash python pybip.py protenix \ --protein "protein.fasta:1" \ --dna "dna.fasta:1" \ --ccd "6OI:2" \ --ion "NA:1,CL:2" \ --csv compounds.csv \ --output protenix_data.json ``` 这将在当前目录下生成 `protenix_data.json` 和 `seed.txt`。 `protenix_data.json` 的大致内容: ```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": "NA", "count": 1 } }, { "ion": { "ion": "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": "NA", "count": 1 } }, { "ion": { "ion": "CL", "count": 2 } }, { "ligand": { "ligand": "O=C(N)C", "count": 1 } } ], "name": "protein_dna_COMP2" } ] ``` ### 3. 生成 Seedfold JSON 输入文件 使用 `seedfold` 子命令生成 Seedfold JSON 文件。 **特定参数**: - `--output DIR_PATH`: JSON文件的输出目录(默认: `.` 当前目录)。 **输出文件结构**: - 提供 `--csv` 时:每个化合物生成一个独立的JSON文件,命名格式为 `[所有序列文件基础名用下划线连接]_[化合物ID].json`。 - 多CSV组合时,文件/entry命名为 `[所有序列文件基础名用下划线连接]_[各CSV配体ID按下划线连接]`;若不同CSV存在相同ID导致命名冲突,自动回退为 `[基础名]_[CSV文件名]_[ID]_...` 形式,仍冲突则追加数字后缀。 - 不提供 `--csv` 时:生成单个 `{base_name}.json`,不含 Ligand-Smiles 实体。 - JSON文件是一个数组,包含一个完整的任务对象。 - 任务对象包含 `job_name`、`model` 和 `entities` 字段。 - `job_name` 格式为 `[所有序列文件基础名用下划线连接]_[化合物ID]`(无CSV时为 `base_name`)。 - `model` 默认值为 `SeedFold-Linear_v1.0.0`。 - `entities` 数组中的每个实体包含 `entity`、`copies` 和 `sequence` 字段。 - 实体类型包括:`Protein`、`DNA`、`RNA`、`Ligand/Ion-CCD` 和 `Ligand-Smiles`。 **示例**: ```bash 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.json` - `protein_COMP2.json` `protein_COMP1.json` 的大致内容: ```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" } ] } ] ``` ### 4. 生成 AlphaFold3 JSON 输入文件 使用 `alphafold3` 子命令生成 AlphaFold3 JSON 文件。 **特定参数**: - `--output DIR_PATH`: JSON文件的输出目录(默认: `.` 当前目录)。 **输出文件结构**: - 输出符合 AlphaFold3 官方 JSON 格式 (`dialect: "alphafold3"`, `version: 4`)。 - 随机生成 `modelSeeds` 字段(101–999999 范围的整数列表)。 - 链ID按输入顺序分配大写字母 (A, B, C...),多拷贝时使用列表 (如 `["A", "B"]`)。 - 提供 `--csv` 时:每个化合物生成一个独立的JSON文件,命名格式为 `[所有序列文件基础名用下划线连接]_[化合物ID].json`。 - 多CSV组合时,文件/entry命名为 `[所有序列文件基础名用下划线连接]_[各CSV配体ID按下划线连接]`;若不同CSV存在相同ID导致命名冲突,自动回退为 `[基础名]_[CSV文件名]_[ID]_...` 形式,仍冲突则追加数字后缀。 - 不提供 `--csv` 时:生成单个 `{base_name}.json`,仅包含序列和CCD配体。 - 蛋白质、DNA、RNA分别通过 `protein`、`dna`、`rna` 字段定义。 - CCD配体通过 `ligand.ccdCodes` 字段定义(列表形式)。 - SMILES化合物通过 `ligand.smiles` 字段定义。 **示例**: ```bash python pybip.py alphafold3 \ --protein "protein.fasta:1" \ --ccd "ATP:1" \ --csv compounds.csv \ --output af3_inputs ``` **示例 (无配体纯结构预测)**: ```bash python pybip.py alphafold3 \ --protein "protein.fasta:1" \ --output af3_inputs ``` 这将会在 `af3_inputs` 目录下生成类似的文件: - `protein_COMP1.json` - `protein_COMP2.json` `protein_COMP1.json` 的大致内容: ```json { "name": "protein_COMP1", "modelSeeds": [12345], "sequences": [ { "protein": { "id": "A", "sequence": "YOUR_PROTEIN_SEQUENCE_HERE" } }, { "ligand": { "id": "B", "ccdCodes": ["ATP"] } }, { "ligand": { "id": "C", "smiles": "CCCC" } } ], "dialect": "alphafold3", "version": 4 } ``` ### 5. 生成 OpenFold3 JSON 输入文件 使用 `openfold3` 子命令生成 OpenFold3 JSON 文件。 **特定参数**: - `--output FILE_PATH`: 输出JSON文件路径(默认: `input.json`),与 `protenix` 子命令一致。父目录不存在时自动创建,不生成额外文件夹。 **输出文件结构**: - 输出符合 OpenFold3 推理 JSON 格式(顶层 `seeds` 字段 + `queries` 字典)。 - 顶层 `seeds` 字段为随机生成的整数列表(101–999999 范围),无需命令行参数。 - 链使用 `molecule_type` + `chain_ids` 结构。 - 链ID按输入顺序分配大写字母 (A, B, C...),多拷贝时使用列表 (如 `["A", "B"]`);**每个 query 的链ID独立从 `A` 开始**。 - 提供 `--csv` 时:所有化合物/组合作为多个 query 合并写入 `--output` 指定的单个文件。 - 多CSV组合时,query 名称为 `[所有序列文件基础名用下划线连接]_[各CSV配体ID按下划线连接]`;若不同CSV存在相同ID导致命名冲突,自动回退为 `[基础名]_[CSV文件名]_[ID]_...` 形式,仍冲突则追加数字后缀。 - 不提供 `--csv` 时:`queries` 中只有一个 query,名称为 `base_name`,仅包含序列和CCD配体。 - 蛋白质、DNA、RNA分别通过 `molecule_type: "protein"/"dna"/"rna"` 定义。 - CCD配体通过 `molecule_type: "ligand"` + `ccd_codes` 字段定义。 - SMILES化合物通过 `molecule_type: "ligand"` + `smiles` 字段定义。 **示例**: ```bash python pybip.py openfold3 \ --protein "protein.fasta:1" \ --ccd "ATP:1" \ --csv compounds.csv \ --output of3_inputs.json ``` **示例 (无配体纯结构预测)**: ```bash python pybip.py openfold3 \ --protein "protein.fasta:1" \ --output of3_inputs/protein.json ``` 这将在 `of3_inputs/` 下生成单个文件 `protein.json`(CSV 中有 12 个化合物即 12 个 query)。 `of3_inputs.json` 的大致内容(多个预测任务合并为一个输入文件): ```json { "seeds": [12345], "queries": { "protein_COMP1": { "chains": [ { "molecule_type": "protein", "chain_ids": "A", "sequence": "YOUR_PROTEIN_SEQUENCE_HERE" }, { "molecule_type": "ligand", "chain_ids": "B", "ccd_codes": "ATP" }, { "molecule_type": "ligand", "chain_ids": "C", "smiles": "CCCC" } ] }, "protein_COMP2": { "chains": [ { "molecule_type": "protein", "chain_ids": "A", "sequence": "YOUR_PROTEIN_SEQUENCE_HERE" }, { "molecule_type": "ligand", "chain_ids": "B", "ccd_codes": "ATP" }, { "molecule_type": "ligand", "chain_ids": "C", "smiles": "O=C(N)C" } ] } } } ``` ### 6. 生成 OpenDDE JSON 输入文件 使用 `opendde` 子命令生成 OpenDDE JSON 文件。 **特定参数**: - `--output FILE_PATH`: 输出JSON文件路径(默认: `input.json`),与 `protenix` 子命令一致。父目录不存在时自动创建。 - `--covalent-bonds FILE_PATH`: 共价键JSON文件路径,顶层应为数组(元素字段见 OpenDDE 文档的 `covalent_bonds` 规范),其内容会被**原样注入**每个 job 的 `covalent_bonds` 字段。可选。 该子命令同样支持 `--ion` 参数。 **输出文件结构**: - 输出符合 OpenDDE 推理 JSON 格式(**顶层为 job 数组**)。 - 每个 job 包含 `name`、`modelSeeds`、`sequences`,以及可选的 `covalent_bonds`。 - `modelSeeds` 为随机生成的整数列表(101–999999 范围)。 - 实体键为 `proteinChain`、`dnaSequence`、`rnaSequence`、`ligand`(CCD 或 SMILES)和 `ion`,每个实体均含 `count`。 - **不输出**实体 `id` 字段,链ID由 OpenDDE 自动分配。 - `--ccd` 的值会自动补上 `CCD_` 前缀(如 `P4G` → `CCD_P4G`);`--ion` 的值保持裸CCD码(如 `NA`),即使写成 `CCD_NA` 也会自动去掉前缀。 - 提供 `--csv` 时:所有化合物/组合作为多个 job 合并写入 `--output` 指定的单个文件。 - 多CSV组合时,job 名称为 `[所有序列文件基础名用下划线连接]_[各CSV配体ID按下划线连接]`;若不同CSV存在相同ID导致命名冲突,自动回退为 `[基础名]_[CSV文件名]_[ID]_...` 形式,仍冲突则追加数字后缀。 - 不提供 `--csv` 时:数组中只有一个 job,名称为 `base_name`,仅包含序列、CCD配体和离子。 **示例**: ```bash python pybip.py opendde \ --protein "protein.fasta:1" \ --ccd "P4G:1" \ --ion "NA:1" \ --csv compounds.csv \ --output opendde_inputs.json ``` **示例 (无配体纯结构预测)**: ```bash python pybip.py opendde \ --protein "protein.fasta:1" \ --output opendde_inputs/protein.json ``` `opendde_inputs.json` 的大致内容(多个预测任务合并为一个输入文件): ```json [ { "name": "protein_COMP1", "modelSeeds": [428173], "sequences": [ { "proteinChain": { "sequence": "YOUR_PROTEIN_SEQUENCE_HERE", "count": 1 } }, { "ligand": { "ligand": "CCD_P4G", "count": 1 } }, { "ion": { "ion": "NA", "count": 1 } }, { "ligand": { "ligand": "CCCC", "count": 1 } } ], "covalent_bonds": [ { "entity1": "1", "copy1": 1, "position1": "2", "atom1": "SG", "entity2": "2", "copy2": 1, "position2": "1", "atom2": "C1" } ] } ] ``` ## 项目结构 ``` pybip/ ├── pybip.py # 主脚本文件 ├── exceptions.py # 自定义异常类 ├── commands/ # 命令相关模块 │ ├── __init__.py │ ├── base.py # 命令基类 │ ├── boltz.py # Boltz命令实现 │ ├── protenix.py # Protenix命令实现 │ ├── seedfold.py # Seedfold命令实现 │ ├── alphafold3.py # AlphaFold3命令实现 │ ├── openfold3.py # OpenFold3命令实现 │ └── opendde.py # OpenDDE命令实现 ├── utils/ # 工具函数 │ ├── __init__.py │ ├── fasta.py # FASTA文件读取 │ ├── csv_reader.py # CSV文件读取 │ └── seed.py # 随机种子生成 ├── requirements.txt # 依赖列表 ├── setup.py # 安装配置 └── README.md # 项目文档 ``` ## 错误处理 脚本使用自定义的 `InputGeneratorError` 异常来处理各种预期错误,例如文件未找到、CSV格式错误、参数解析失败等。当发生此类错误时,脚本会输出详细的错误信息到标准错误流,并以相应的错误码退出。 主要错误码说明: | 错误码范围 | 说明 | |-----------|------| | 1xx | FASTA/CSV/种子文件读取错误 | | 2xx | 参数解析错误(序列、配体、离子格式等) | | 3xx | 输出文件写入错误(301=Boltz, 302=Protenix, 303=Seedfold, 304=AlphaFold3, 305=OpenFold3, 308=OpenDDE) | | 307 | OpenDDE 共价键JSON文件读取/格式错误 | ## 许可证 本项目采用 GNU General Public License v3 (GPLv3) 许可证。详见 LICENSE 文件。 ## 联系方式 如有问题或建议,请通过以下方式联系我们: - 项目地址: