蛋白质结构文件格式:PDB、mmCIF、BCIF 与 PDF 的用途
下载蛋白质结构后,文件夹里可能同时出现 .pdb、.cif、.bcif 和 PDF 报告。Python 脚本应该读取哪个?新流程优先使用 PDBx/mmCIF;工具支持二进制编码时,可以使用 BinaryCIF;下游程序要求旧式 PDB 时,再导出兼容文件。
本文解释原子数据的表示方式,下载同一个条目的三种格式,并提供可运行的检查脚本。PDF 适合作为坐标文件旁的阅读材料。资料和示例核查日期为 2026 年 10 月 9 日。
1. 根据任务选择格式
| 文件 | 表示方式 | 实际用途 |
|---|---|---|
.pdb |
固定列宽的文本记录 | 兼容要求旧式 PDB 的程序 |
.cif / .mmcif |
PDBx/mmCIF 的命名字段和表格 | 新结构处理流程的来源文件 |
.bcif |
将 CIF 类别和列编码为 BinaryCIF | 配合兼容解码器传输和处理数据 |
.pdf |
排版后的文档 | 阅读论文、验证报告或格式手册 |
wwPDB 从 2014 年起将 PDBx/mmCIF 作为标准归档格式。旧式 PDB 已冻结,无法完整表示超过 62 条链或 99,999 条 ATOM 记录的条目。PDBx/mmCIF 消除了这些固定字段容量限制。见 wwPDB 格式政策。
为了复现分析,保留下载原件、来源 URL、下载日期和 SHA-256 校验值。转换后的文件应作为派生文件保存。
2. 看懂 PDB 与 mmCIF 中的一个原子
下载的 4HHB PDB 文件中,第一条原子记录为:
ATOM 1 N VAL A 1 19.323 29.727 42.781 1.00 49.05 N
它描述作者链 A 上编号为 1 的 VAL 残基中的氮原子 N。坐标单位为 ångström,即埃;1.00 是占有率,49.05 是各向同性温度因子。PDB 通过列位置定义字段,应使用 PDB 解析器,不能把空白分隔当成通用读取方法。坐标规范定义了 ATOM、HETATM、替代构象和模型记录。
下面是使用相同坐标值的虚构、精简 mmCIF 示例,仅说明语法;它不是可交给下文脚本的完整结构文件:
data_demo
loop_
_atom_site.id
_atom_site.label_atom_id
_atom_site.label_comp_id
_atom_site.auth_asym_id
_atom_site.auth_seq_id
_atom_site.Cartn_x
_atom_site.Cartn_y
_atom_site.Cartn_z
1 N VAL A 1 19.323 29.727 42.781
loop_ 开始一张表。每个标签命名一列,后面的值按相同顺序排列。带引号的字符串和分号界定的多行文本,使简单逐行拆分并不可靠。保留特殊缺失值:? 表示缺失或未知信息;. 表示没有适当值或有意省略。见 mmCIF 语法指南。
.cif 扩展名属于更广的格式家族。应先检查数据类别,再判断其中是否包含蛋白质坐标。
3. BCIF 改变了什么
BinaryCIF 保留 CIF 的类别和列组织方式,再分别编码各列。重复字符串、连续重复整数和数值差分都可以紧凑表示,最后使用 MessagePack 保存容器。格式支持无损和有损编码,数值精度取决于编码设置。见 BinaryCIF 原始论文及格式规范。
因此,.bcif 和 .cif.gz 需要不同的读取方式。Gzip 解压后得到文本 CIF,BinaryCIF 则需要列解码。改扩展名不能完成其中任何一步。MessagePack 读取器能查看容器,但不会自动还原坐标数组和缺失值掩码。
需要直接查看结构时,可以使用支持这些表示方式的 Mol*。转换文件时,参考它的 CIF-to-BCIF 工具说明,检查编码配置和类别过滤规则,再判断导出文件是否保留了所需字段。
4. 安装依赖并下载示例
以下流程使用 4HHB 条目的未压缩文件。实际运行环境为 Python 3.14.7、Biopython 1.88 和 msgpack 1.2.3,不需要 GPU。
mkdir structure-formats-demo
cd structure-formats-demo
python3 -m venv .venv
source .venv/bin/activate
python -m pip install biopython==1.88 msgpack==1.2.3
curl -fL --retry 2 https://files.rcsb.org/download/4hhb.pdb -o 4hhb.pdb
curl -fL --retry 2 https://files.rcsb.org/download/4hhb.cif -o 4hhb.cif
curl -fL --retry 2 https://models.rcsb.org/4hhb.bcif -o 4hhb.bcif
这些地址遵循 RCSB 下载文档。并非所有条目都提供 PDB。PDF 验证报告有助于评估模型质量,但文档页面不能替代原子坐标表。
5. 用 Python 检查文件
下载 inspect_structure.py,或将以下完整脚本保存为同名文件:
"""Inspect text structures or BinaryCIF container metadata without editing."""
import argparse
import hashlib
import json
from pathlib import Path
import msgpack
from Bio.PDB import MMCIFParser, PDBParser
from Bio.PDB.MMCIF2Dict import MMCIF2Dict
def inspect(path):
suffix = path.suffix.lower()
report = {"file": path.name, "bytes": path.stat().st_size,
"sha256": hashlib.sha256(path.read_bytes()).hexdigest()}
if suffix == ".bcif":
container = msgpack.unpackb(path.read_bytes(), raw=False)
report["binarycif_version"] = container["version"]
report["blocks"] = [
{"header": block["header"],
"atom_site_tables": [
{"rows": category["rowCount"],
"columns": [column["name"] for column in category["columns"]]}
for category in block["categories"]
if category["name"] == "_atom_site"]}
for block in container["dataBlocks"]]
return report # Encoded column values and masks are NOT decoded here.
if suffix == ".pdb":
parser = PDBParser(PERMISSIVE=False)
elif suffix == ".cif":
parser = MMCIFParser(auth_chains=True, auth_residues=True)
else:
raise ValueError("Use an uncompressed .pdb, .cif, or .bcif file")
structure = parser.get_structure(path.stem, str(path))
report["models"] = [
{"parser_model_serial": int(model.serial_num),
"chain_ids": [chain.id for chain in model],
"selected_atom_objects": sum(1 for _ in model.get_atoms())}
for model in structure
]
if suffix == ".cif":
table = MMCIF2Dict(str(path))
pairs = sorted(set(zip(table["_atom_site.label_asym_id"],
table["_atom_site.auth_asym_id"])))
report["atom_site_rows"] = len(table["_atom_site.id"])
report["label_to_auth_chain_pairs"] = pairs
return report
def main():
cli = argparse.ArgumentParser(description=__doc__)
cli.add_argument("files", nargs="+", type=Path)
args = cli.parse_args()
try:
reports = [inspect(path) for path in args.files]
except Exception as error:
cli.exit(1, f"Cannot inspect structure: {error}\n")
print(json.dumps(reports, indent=2))
if __name__ == "__main__":
main()
运行:
python inspect_structure.py --help
python inspect_structure.py 4hhb.pdb 4hhb.cif 4hhb.bcif > inspection.json
文本文件使用 Biopython 结构解析器,原始 mmCIF 标签通过 MMCIF2Dict 读取。见 Biopython 结构文档。对于 BCIF,脚本只报告容器版本、原子表行数和列名,不解码二进制坐标值。脚本读取文件,将 JSON 写到标准输出。
下载文件的部分实测结果:
| 文件 | 字节数 | 检查结果 |
|---|---|---|
4hhb.pdb |
473,850 | 1 个解析模型,作者链 A–D,4,779 个选中的原子对象 |
4hhb.cif |
772,198 | 1 个解析模型,作者链 A–D,4,779 行 atom-site 数据 |
4hhb.bcif |
552,871 | BinaryCIF 0.3.0 容器,4,779 行 atom-site 数据 |
这些数字来自一次下载,不是速度基准,也不代表通用文件大小排名。文件可能修订;行数相同不能证明坐标或元数据相同。存在替代构象时,Biopython 选中的原子对象数也可能不同于原始 atom-site 行数。parser_model_serial 是解析器记录:本例 PDB 返回 0,mmCIF 返回显式模型编号 1。
6. 关联数据或转换前先检查编号
JSON 报告中,14 个不同的 mmCIF label_asym_id 映射到 4 个 auth_asym_id。例如,除了 A → A,还存在 E → A 和 K → A。查看对应行,区分蛋白质、配体和溶剂实例。
label_asym_id 标识分子实例,auth_asym_id 保留作者或 PDB 的链命名。label_seq_id 与 auth_seq_id 也使用不同的残基编号规则。PDBx/mmCIF 用户指南说明了两套命名空间。像脚本中一样,显式设置 Biopython 的 auth_chains 和 auth_residues,关联结果时保留编号映射。
接受转换结果前,比较:
- 模型数量及所需的生物学组装。
- 链映射、残基编号和插入码。
- 原子标识、替代构象标签、占有率,以及在明确容差下的坐标。
- 分析所需的配体、水、连接关系和元数据。
比较时使用相同的原子和模型选择。成功解析说明文件可读,不能证明信息完整保留。条目坐标文件与生成的生物学组装可能包含不同数量的分子副本;扩展名本身不能决定组装方式。
7. 解决常见问题
| 现象 | 具体处理 |
|---|---|
Python 无法导入 Bio 或 msgpack |
激活环境,重新运行上面的 python -m pip install 命令。 |
脚本拒绝 .gz 输入 |
下载上面的未压缩地址,或先解压另一份副本。 |
| 文本编辑器中 BCIF 显示乱码 | 使用支持 BinaryCIF 的工具,不要改名为 .cif。 |
| 不同工具的链 ID 不一致 | 检查 label_asym_id、auth_asym_id 及解析器设置。 |
| 大型结构没有 PDB 下载 | 下载 mmCIF,并使用接受该格式的软件。 |
| Biopython 提示链不连续 | 查看警告对应的记录。本例后面的配体和溶剂记录复用了作者链 ID;仅凭警告不能判定肽链断裂。 |
小结
保留原始 mmCIF 及其来源信息,作为分析起点。工具具备兼容解码器时使用 BCIF,并按分析需要核对 PDB 导出结果。将 PDF 报告与坐标一起保存,方便查看支持结构的验证信息。
- 原文作者:春江暮客
- 原文链接:https://www.bobobk.com/protein-structure-formats-pdb-cif-bcif.html
- 版权声明:本作品采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。