上个阶段我们进行了数据的处理、展示与拟合。那么本期课程的最后一个阶段,我们来看看代码是如何处理结构文件的。
首先我们需要知道结构文件都有哪些?大家经常听到的 PDB 文件、 mol 文件都是结构文件。今天为大家介绍另一个文件种类,是 MMCIF 文件。
MMCIF 文件
MMCIF 文件(Macromolecular Crystallographic Information File)是用于存储生物大分子(如蛋白质、核酸等)的三维结构信息的一种标准化文件格式。它是 PDB(Protein Data Bank)格式的一个扩展,通常用于描述通过 X 射线晶体学、核磁共振(NMR)等技术解析的生物分子结构。MMCIF 使用 CIF(Crystallographic Information File)格式的扩展,是一种基于标签的格式,使得数据容易解析和处理。简单来说,它是一种文本文件,使用键值对的方式存储数据。每个键代表某种结构信息(例如,原子的坐标、化学成分、晶体对称性等),对应的值则是该信息的具体数据。
为了更直观的为大家解释,大家可以在 https://www.rcsb.org/structure/1MBN 中来下载并查看。(点击右侧的 Download Files > 选择PDBx/mmCIF Format,保存在和代码相同的文件夹中)

我们可以点击右键,使用文本编辑器来查看里面的内容。mmCIF 的数据命名以_category.attribute 的形式定义,每个数据项都有唯一标识。数据组织方式第一种是通过键值对的方式,数据项后直接跟随一个值,适合描述单个实体的属性;第二种数据以表格形式呈现,适合描述多个实体的数据。这里对于数据格式就不再展开了,感兴趣的小伙伴可以深入查询了解一下。
Biopython 库
接下来为了在代码中实现结构的查看,小亚老师要介绍的是 Biopython 库,它是一个强大且多功能的工具集合,专门用于帮助生物化学家和生物学家进行计算工作。Biopython 简化了诸如处理 DNA 和蛋白质序列、与 GenBank 和 UniProt 等在线数据库交互以及读取 mmCIF 和 PDB 等分子格式文件等任务。在 Notebook 中,我们将使用 Biopython 解析 MMCIF 文件中的信息。
可以尝试以下代码来导入并使用 MMCIF2Dict 模块
from Bio.PDB.MMCIF2Dict import MMCIF2Dict什么报错了?不要急,我们看看报错内容
它提示我们:No module named ‘Bio’
可能有以下几种原因:
首先是没有安装 biopython 库
我们可以在Jupyter Notebook或终端中运行以下命令来安装 biopython:
pip install biopython如果之前已经安装了 biopython 库,可能安装了旧版本的biopython,其中不包含 MMCIF2Dict 模块。
我们可以通过以下命令升级:
pip install --upgrade biopython现在我们可以使用字典语法提取单元格信息:
from Bio.PDB.MMCIF2Dict import MMCIF2Dictpdb_info = MMCIF2Dict("1mbn.cif")print (pdb_info)
.webp)
可以看到里面有非常多的信息,我们如何找到我们想要的信息呢?
TipPython 中字典的概念
Python中的字典就像一个装着标签的盒子,每个标签(键)对应着一个东西(值)。你可以很快找到你想要的东西,只要知道标签。
就像用大括号 {} 做一个盒子。
例子:my_dict = {'名字': '小明', '年龄': 10}
你可以给盒子添加标签和东西。
例子:my_dict['城市'] = '北京'
你可以通过标签找到对应的东西。
例子:年龄 = my_dict['年龄']
你也可以把某个标签和它对应的东西拿掉。
例子:del my_dict['年龄']
我们发现这些信息是以字典的形式储存的,那我们可以输入 pdb_info.keys() 来进行查看。
.webp)
虽然还是有很多内容,每个字段对应不同的结构数据、实验数据、分子信息以及审计信息。以下是这些字段的一些分类解释:
1. 审计相关字段 (_audit_*)
这些字段记录了数据的审计信息,例如数据的版本、修订历史、以及相关的描述。
_audit_conform.*:关于数据符合性的信息。
_pdbx_audit_revision_*:修订历史,包括修订的详细信息和内容。
2. 数据库相关字段 (_database_*)
这些字段与特定数据库条目的详细信息相关联,包括数据库的ID、访问信息、DOI编号等。
_database_2.*:存储了数据库ID、代码和DOI等信息。_pdbx_database_status.*:记录了数据在数据库中的状态,例如接收日期、处理地点等。
3. 引用文献相关字段 (_citation_*)
这些字段包含关于引用文献的信息,包括文章标题、期刊名称、作者、出版年份等。
_citation.*:引用的基本信息。
_citation_author.*:引用文献的作者信息。
4. 实体相关字段 (_entity_*)
这些字段用于描述蛋白质、核酸或其他分子实体的详细信息,例如分子的类型、来源、分子量等。
_entity.*:实体的基本描述。
_entity_poly.*:描述多聚体的具体信息,例如序列、链ID等。
5. 化学成分相关字段 (_chem_comp_*)
这些字段记录了分子中化学成分的详细信息,例如原子的化学键、名称、分子式等。
_chem_comp.*:描述化学成分的信息。
_chem_comp_atom.* 和 _chem_comp_bond.*:分别描述化学成分的原子信息和键信息。
6. 实验数据相关字段 (_exptl_*)
这些字段记录了实验条件和方法的信息,包括晶体数据、辐射数据等。
_exptl.*:关于实验的总体描述,例如使用的实验方法。
_diffrn.*:关于衍射实验的数据。
7. 结构相关字段 (_struct_*)
这些字段包含了结构的详细描述,例如结构的标题、模型详情、关键字等。
_struct.*:关于结构的基本信息。
_struct_asym.* 和 _struct_biol.*:分别描述不对称单元和生物学装配的信息。
8. 原子位置和晶胞参数 (_atom_site_* 和 _cell.*)
这些字段描述了原子的位置和晶胞的几何信息,例如坐标、对称性、晶胞长度等。
_atom_site.*:记录了原子位置的相关信息。
_cell.*:晶胞的几何参数,例如晶胞的长度、角度。
9. 验证和联系信息 (_pdbx_validate_* 和 _struct_conn_*)
这些字段涉及到结构验证和原子间联系的信息,例如原子之间的距离、角度以及扭转角等。
_pdbx_validate_*:验证结构的字段,例如验证键长、键角等信息。
_struct_conn.*:关于分子内部或分子间的联系信息。
MMCIF 文件中可能包含很多不同的关键词(键),而且每个 MMCIF 文件中所包含的关键词数量可能有所不同。为了提取这些关键词中感兴趣的部分(比如那些包含“_cell”这个关键词的部分),可以使用 Python 的 for 循环。这个循环会遍历文件中的所有关键词,如果某个关键词中包含了“_cell”字样,就会打印出它对应的值。简单来说,代码的目标是从 MMCIF 文件中筛选出所有与“_cell”相关的字段并打印其值。例如,假设我们有一个 MMCIF 文件的数据,关键词类似于 _cell.length_a, _cell.angle_alpha,这些字段都包含了“_cell”,所以程序会找到并打印这些字段的对应数据。
for key, value in pdb_info.items():if "_cell." in key:print(key, value)
.webp)
具体的关键词可以通过以下链接进行查找
https://mmcif.wwpdb.org/dictionaries/mmcif_pdbx_v50.dic/Groups/index.html
小亚老师给大家一些关键的代码来查看重要的信息,各位小伙伴可以自行尝试。
common_name_1mbn = pdb_info["_entity_src_gen.gene_src_common_name"]print(common_name_1mbn)
scientific_name_1mbn = pdb_info["_entity_src_gen.pdbx_gene_src_scientific_name"]print(scientific_name_1mbn)
sequence_1mbn = pdb_info["_entity_poly.pdbx_seq_one_letter_code"]print(sequence_1mbn)
当我们有蛋白质晶体结构之后,可以通过分析分子中不同部分的坐标,来研究它们之间是如何相互作用的。在肌红蛋白中,原卟啉环(protoporphyrin)中的铁原子(Fe)可逆地结合氧分子,以将氧气输送到肌肉。我们可以使用 BioPython 来分析这个血红素基团与蛋白质的结合情况。为了执行这个分析,我们必须将蛋白质加载到称为 Biopython 结构的不同数据类型中。这次,我们将导入MMCIFParser而不是 MMCIF2Dict。这将使我们能够使用坐标进行测量。
这三行代码首先从Bio.PDB.MMCIFParser模块中导入了 MMCIFParser 类。MMCIFParser是BioPython中用于解析mmCIF文件的类,mmCIF 文件是一种存储蛋白质、核酸等分子三维结构信息的文件格式,类似于 PDB 文件格式。然后我们创建了一个 MMCIFParser 对象,并将其命名为 parser。QUIET=True 参数用于禁用警告信息,因此在解析文件时不会显示警告。最后我们使用 parser 对象解析名为 "1mbn.cif" 的 mmCIF 文件,并将解析后的结构数据存储在 structure 变量中。"myoglobin" 是结构的标识符,可以是任何描述性名称。"1mbn.cif" 是一个包含肌红蛋白结构数据的 mmCIF 文件。
我们这里获得的 structure 变量是一个 BioPython 结构对象,它包含了通过解析 mmCIF 文件获得的分子结构数据。表示了 mmCIF 文件中的分子,并且是分层的。这种层次结构遵循 SMCRA 模型,即:结构(Structure)、模型(Model)、链(Chain)、残基(Residue)、原子(Atom)。这种结构体系是许多结构生物学家和生物信息学家用来处理分子结构的常见方式。
在本次分析中,我们希望找到与铁原子相邻的原子。为了进行这个分析,首先我们需要找到铁原子的位置。可以使用 structure.get_atoms() 函数获取 mmCIF 文件中所有的原子。执行这一步后,atoms 变量是一种特殊的数据类型,称为生成器(generator)。生成器会逐个加载集合中的元素,也就是说,如果我们遍历 atoms,一次只会将一个原子加载到内存中。因为我们的蛋白质很小,并且预计会多次使用原子列表,所以我们将使用 list(atoms) 将生成器转换为列表。
atoms = structure.get_atoms()type(atoms)atom_list = list(atoms)for atom in atom_list:if atom.element == "FE":iron_atom = atomiron_coord = atom.get_coord()print(iron_atom, iron_coord)
.webp)
现在我们将使用 BioPython 进行邻居搜索。首先,我们使用 NeighborSearch(atoms) 创建一个邻居搜索变量。atoms 是我们之前从结构中提取出的所有原子。接着,我们通过输入目标原子的坐标和邻居的截断距离来进行邻居搜索。这个截断距离定义了多远范围内的原子可以被认为是目标原子的“邻居”。任何距离目标原子在指定截断距离范围内的原子都会被视为目标原子的邻居。
from Bio.PDB import NeighborSearchatoms = structure.get_atoms()cutoff_distance = 4neighbor_search = NeighborSearch(atom_list)neighbors = neighbor_search.search(iron_atom.get_coord(), cutoff_distance)print("The iron atom has", len(neighbors), "neighbor atoms. ")
.webp)
我们可以使用 for 循环来遍历邻居搜索函数找到的所有邻居原子。同时,我们也可以使用 atom.get_parent() 方法获取某个原子所属的残基。
for neighbor in neighbors:residue = neighbor.get_parent()print(residue.get_resname(), residue.get_id())
.webp)
其中标有“HEM”的行是属于血红素配体的原子。我们对配体如何与蛋白质结合感兴趣,所以我们将修改 for 循环,使其只打印那些与铁原子不属于同一残基的邻居原子。
iron_residue = iron_atom.get_parent()for neighbor in neighbors:residue = neighbor.get_parent()if residue != iron_residue:print(neighbor.element, residue.get_resname(), residue.get_id()[1])
.webp)
通过分析得出的结论,编号为93的组氨酸(HIS 93)是铁原子的邻居,并且这种组氨酸被称为“远端组氨酸”,它与血红素中的铁结合。
我们可以通过
https://sites.chem.utoronto.ca/chemistry/coursenotes/GTM/JM/myoglobin/start.htm这个网站来进行查看
好的今天的内容就到这里,大家可以尝试用这个方法来分析配体与蛋白的相互关系。我们今天通过PDB的网站下载了结构文件,那我们是不是可以不用打开网页直接下载结构呢?当然可以的,下周小亚老师将为大家介绍 API 应用程序接口(Application Programming Interface)的相关知识。



沪公网安备 31011002003500