PSP - 蛋白质结构预测 AlphaFold2 的结构模版 (Template) 搜索与特征逻辑

news2024/11/25 9:26:04

欢迎关注我的CSDN:https://spike.blog.csdn.net/
本文地址:https://spike.blog.csdn.net/article/details/132427617

Template
结构模版 (Template) 是一种已知的蛋白质结构,可以作为 AlphaFold2 蛋白质结构预测的参考,AlphaFold2 可以从多个数据库中搜索和选择最合适的模板,也可以使用自定义的模板。AlphaFold2 使用了一种基于深度学习的方法,利用模板和序列对齐信息来预测蛋白质的三维结构,还可以预测多聚体蛋白质的结构,这是一种由多个亚基组成的复杂蛋白质。

Monomer 模版搜索的结果文件是 pdb_hits.hhr,而 Multimer 是以 sto 格式结尾,搜索算法不同导致的。

测试 Case 是 T1104-D1_A117,来源于 CASP15。模版搜索结果的处理逻辑,位于 alphafold/data/pipeline.py 中:

  • templates_result 就是模版特征,是 AF2 的三大特征 (Sequence | MSA | Template)之一。

即:

# ...
# 加载模版文件
if os.path.isfile(pdb_hits_out_path):  # avoid to search templates
  with open(pdb_hits_out_path, "r") as f:
    pdb_templates_result = f.read()
  logging.info("[CL] use saved template. %s", pdb_hits_out_path)
# ...
# 获取pdb命中结果
pdb_template_hits = self.template_searcher.get_template_hits(
    output_string=pdb_templates_result, input_sequence=input_sequence)
# ...
# 解析模版结果
templates_result = self.template_featurizer.get_templates(
    query_sequence=input_sequence,
    hits=pdb_template_hits)
# ...

日志:

[CL] use saved template. mydata/T1104-D1_A117/msas/pdb_hits.hhr

1. get_template_hits() — 解析 hhr 文件

获取模版在 PDB 库的命中结果,主要是解析 pdb_hits.hhr 文件。逻辑位于 alphafold/data/tools/hhsearch.py,即:

def get_template_hits(self,
                      output_string: str,
                      input_sequence: str) -> Sequence[parsers.TemplateHit]:
  """Gets parsed template hits from the raw string output by the tool."""
  del input_sequence  # Used by hmmseach but not needed for hhsearch.
  return parsers.parse_hhr(output_string)

调用解析 hhr 的函数 parse_hhr(),逻辑位于alphafold/data/parsers.py,即

def parse_hhr(hhr_string: str) -> Sequence[TemplateHit]:
  """Parses the content of an entire HHR file."""
  lines = hhr_string.splitlines()

  # Each .hhr file starts with a results table, then has a sequence of hit
  # "paragraphs", each paragraph starting with a line 'No <hit number>'. We
  # iterate through each paragraph to parse each hit.

  block_starts = [i for i, line in enumerate(lines) if line.startswith('No ')]

  hits = []
  if block_starts:
    block_starts.append(len(lines))  # Add the end of the final block.
    for i in range(len(block_starts) - 1):
      hits.append(_parse_hhr_hit(lines[block_starts[i]:block_starts[i + 1]]))
  return hits

插入日志逻辑,即:

from absl import logging
logging.set_verbosity(logging.INFO)
for hit in hits:
  logging.info(f"[CL] hit: {hit}")

日志如下:

[CL] hit: TemplateHit(index=5, name='2KW0_A CcmH protein; oxidoreductase, cytochrome c maturation; NMR {Escherichia coli}', aligned_cols=38, sum_probs=30.8, query='AVAKGLEEMYANGVTEDNFKNYVKNNFAQQEISSVEEE', hit_sequence='DLRQKVYELMQEGKSKKEIVDYMVARYGNFVTYDPPLT', indices_query=[8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45], indices_hit=[43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80])

其中,pdb_hits.hhr 如下:

Query         A 
Match_columns 117
No_of_seqs    22 out of 29
Neff          2.94667
Searched_HMMs 80799
Date          Tue May  9 10:08:54 2023
Command       /root/miniconda3/envs/alphafold/bin/hhsearch -i /tmp/tmp7qe78wbc/query.a3m -o /tmp/tmp7qe78wbc/output.hhr -maxseq 1000000 -d /nfs_baoding/chenlong/af2_data_dir/pdb70/pdb70 

 No Hit                             Prob E-value P-value  Score    SS Cols Query HMM  Template HMM
  1 2HL7_A Cytochrome C-type bioge  31.3      41 0.00051   24.1   0.0   34    9-42     47-80  (84)
  2 3D3M_A Eukaryotic translation   26.6      56 0.00069   24.7   0.0   33    9-41      3-35  (168)
  3 3JVN_A Acetyltransferase (E.C.  25.8      59 0.00073   21.0   0.0   31   70-100    94-124 (166)
  4 3OAO_A uncharacterized protein  24.7      64 0.00079   23.7   0.0   43   11-53     56-98  (147)
  5 2KW0_A CcmH protein; oxidoredu  23.4      70 0.00087   23.3   0.0   38    9-46     44-81  (90)
  6 3F0A_A N-ACETYLTRANSFERASE; N-  22.9      73 0.00091   20.4   0.0   39    2-40     11-53  (162)
  7 5LXU_A Transcription factor LU  22.4      76 0.00094   20.3   0.0   26   11-36     29-54  (57)
  8 2DXQ_A Acetyltransferase; acet  22.0      78 0.00097   19.6   0.0   25   75-99     92-116 (150)
  9 2DXQ_B Acetyltransferase; acet  22.0      78 0.00097   19.6   0.0   25   75-99     92-116 (150)
 10 5UN0_3 Proteasome Activator; A  19.9      92  0.0011   25.3   0.0   24   78-101    88-111 (251)

No 1
>2HL7_A Cytochrome C-type biogenesis protein CcmH; Three-helices bundle, OXIDOREDUCTASE; HET: PG4; 1.7A {Pseudomonas aeruginosa}
Probab=31.28  E-value=41  Score=24.06  Aligned_cols=34  Identities=9%  Similarity=0.188  Sum_probs=27.6  Template_Neff=6.200

Q A                 9 AVAKGLEEMYANGVTEDNFKNYVKNNFAQQEISS   42 (117)
Q Consensus         9 ~VA~~LEkMF~nGVse~Nf~~Yv~~Nfs~~EIs~   42 (117)
                      ..-.++.+|...|-|++-+.+|+.+.|++.=+..
T Consensus        47 ~~R~~I~~~l~~G~s~~eI~~~~v~~YG~~IL~~   80 (84)
T 2HL7_A           47 DLRKQIYGQLQQGKSDGEIVDYMVARYGDFVRYK   80 (84)
T ss_dssp             HHHHHHHHHHHHTCCHHHHHHHHHHHHTTTCEEC
T ss_pred             HHHHHHHHHHHCCCCHHHHHHHHHHHHCccceeC
Confidence            3445678899999999999999999998765443


No 2
>3D3M_A Eukaryotic translation initiation factor 4; HEAT repeat domain, Structural Genomics; 1.9A {Homo sapiens}
Probab=26.65  E-value=56  Score=24.68  Aligned_cols=33  Identities=12%  Similarity=0.157  Sum_probs=27.2  Template_Neff=8.500

Q A                 9 AVAKGLEEMYANGVTEDNFKNYVKNNFAQQEIS   41 (117)
Q Consensus         9 ~VA~~LEkMF~nGVse~Nf~~Yv~~Nfs~~EIs   41 (117)
                      .|-.+|++++..|-+.+.+.+|+.+|.+++...
T Consensus         3 ~~~~~L~~~l~~~~~~~~i~~wi~~~v~~~~~~   35 (168)
T 3D3M_A            3 KLEKELLKQIKLDPSPQTIYKWIKDNISPKLHV   35 (168)
T ss_pred             HHHHHHHHHHhhCCCHHHHHHHHHHhCCHHHcC
Confidence            355689999999999999999999998876543

# ...

2. get_templates() — 提取模版特征

核心逻辑位于 alphafold/data/templates.py 中,get_templates() 循环处理 hit,调用 _process_single_hit(),即:

def get_templates(
    self,
    query_sequence: str,
    hits: Sequence[parsers.TemplateHit]) -> TemplateSearchResult:
  """Computes the templates for given query sequence (more details above)."""
	# ...
  for hit in sorted(hits, key=lambda x: x.sum_probs, reverse=True):
    # We got all the templates we wanted, stop processing hits.
    if num_hits >= self._max_hits:
      break
    result = _process_single_hit(
        query_sequence=query_sequence,
        hit=hit,
        mmcif_dir=self._mmcif_dir,
        max_template_date=self._max_template_date,
        release_dates=self._release_dates,
        obsolete_pdbs=self._obsolete_pdbs,
        strict_error_check=self._strict_error_check,
        kalign_binary_path=self._kalign_binary_path)
#...

核心逻辑位于 _process_single_hit() 中,生成单个模版特征,具体在 _extract_template_features() 函数中,生成特征,即:

# ...
mapping = _build_query_to_hit_index_mapping(
    hit.query, hit.hit_sequence, hit.indices_hit, hit.indices_query,
    query_sequence)
# ...
template_sequence = hit.hit_sequence.replace('-', '')
# ...
cif_path = os.path.join(mmcif_dir, hit_pdb_code + '.cif')
# ...
parsing_result = mmcif_parsing.parse(
    file_id=hit_pdb_code, mmcif_string=cif_string)
# ...
# 核心逻辑
features, realign_warning = _extract_template_features(
    mmcif_object=parsing_result.mmcif_object,
    pdb_id=hit_pdb_code,
    mapping=mapping,
    template_sequence=template_sequence,
    query_sequence=query_sequence,
    template_chain_id=hit_chain_id,
    kalign_binary_path=kalign_binary_path)
# ...

插入日志逻辑,即:

from absl import logging
logging.set_verbosity(logging.INFO)
logging.info(f"[CL] hit_pdb_code: {hit_pdb_code}, hit_chain_id: {hit_chain_id}, cif_path: {cif_path}, query_sequence: {query_sequence}")

日志如下:

[CL] hit_pdb_code: 2kw0, hit_chain_id: A, cif_path: af2_data_dir/pdb_mmcif/mmcif_files/2kw0.cif, query_sequence: QLEDSEVEAVAKGLEEMYANGVTEDNFKNYVKNNFAQQEISSVEEELNVNISDSCVANKIKDEFFAMISISAIVKAAQKKAWKELAVTVLRFAKANGLKTNAIIVAGQLALWAVQCG

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/912870.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

构建系统自动化-autoreconf

autoreconf简介 autoreconf是一个GNU Autotools工具集中的一个命令&#xff0c;用于自动重新生成构建系统的配置脚本和相关文件。 Autotools是一组用于自动化构建系统的工具&#xff0c;包括Autoconf、Automake和Libtool。它们通常用于跨平台的软件项目&#xff0c;以便在不同…

AIR001开箱测试

最近&#xff0c;合宙的动作还是挺大的&#xff0c;又出了两款AIR001和RP2040&#xff0c;而且前段时间还出了AIR32F103系列&#xff0c;记的21年要采购STM32F1103的时候&#xff0c;1片的价格从开发时的5块涨到了生产阶段的100多&#xff0c;即使最后无奈采用了别的芯片&#…

容器化微服务:用Kubernetes实现弹性部署

随着云计算的迅猛发展&#xff0c;容器化和微服务架构成为了构建现代应用的重要方式。而在这个过程中&#xff0c;Kubernetes&#xff08;常简称为K8s&#xff09;作为一个开源的容器编排平台&#xff0c;正在引领着容器化微服务的部署和管理革命。本文将深入探讨容器化微服务的…

LeetCode150道面试经典题-- 二叉树的最大深度(简单)

1.题目 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 2.示例 3.思路 深度优先遍历 一个二叉树要查询到最大深度&#xff0c;可以将问题转为从根节点出发&#xff0c;查看左右子树的最大深度&am…

php 系列题目,包含查看后端源代码

一、弱类型比较问题 原则&#xff1a; 1.字符串和数字比较&#xff0c;字符串回被转换成数字。 "admin" 0&#xff08;true) admin被转换成数字&#xff0c;由于admin是字符串&#xff0c;转换失败&#xff0c;变成0 int(admin)0,所以比较结果是ture 2.混合字符串转…

opencv 进阶17-使用K最近邻和比率检验过滤匹配(图像匹配)

K最近邻&#xff08;K-Nearest Neighbors&#xff0c;简称KNN&#xff09;和比率检验&#xff08;Ratio Test&#xff09;是在计算机视觉中用于特征匹配的常见技术。它们通常与特征描述子&#xff08;例如SIFT、SURF、ORB等&#xff09;一起使用&#xff0c;以在图像中找到相似…

【C#学习笔记】匿名函数和lambda表达式

文章目录 匿名函数匿名函数的定义匿名函数作为参数传递匿名函数的缺点 lambda表达式什么是lambda表达式闭包 匿名函数 为什么我们要使用匿名函数&#xff1f;匿名函数存在的意义是为了简化一些函数的定义&#xff0c;特别是那些定义了之后只会被调用一次的函数&#xff0c;与其…

【Unity3D赛车游戏制作】初步导入,资源很哇塞【一】

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

位运算相关总结

371. 两整数之和 给你两个整数 a 和 b &#xff0c;不使用 运算符 和 - ​​​​​​​&#xff0c;计算并返回两整数之和。 class Solution { public:int getSum(int a, int b) {while (b ! 0) {// 计算进位&#xff1a;将 a 和 b 进行位与操作&#xff0c;然后左移 1 位。u…

ExoPlayer如何使用MediaExtractor的思路

本文主要针对于&#xff0c;自己的设备解码能力&#xff08;比如底层集成ffmpeg 、qti、android 、需要付费的格式等等&#xff09;大于ExoPlayer自己封装的固有Extractor&#xff0c;基于现在Android架构通俗的来说&#xff0c;就是MediaPlayer可以播&#xff0c;但是ExoPlaye…

解码客厅:知名设计师带你探索其历史与设计风格

会客厅又称接待室&#xff0c;&#xff0c;它们是宾客和家人享受下午或晚上娱乐时光的天然聚会场所。由于会客厅反映了每个家庭的个性&#xff0c;因此在家具和设计上花费了很多心思。装饰品、复古艺术品、三角钢琴以及雕塑和花瓶等其他装饰元素在今天的会客厅中已司空见惯。 下…

UE4 地形编辑基础知识 学习笔记

之前自己写过这样的功能&#xff0c;今天看到一个UE现成的 点击地形&#xff0c;选择样条 按住CTRL键点击屏幕中某一个点会在场景内生成一个这样的图标 再点两次&#xff0c;会生成B样条的绿线条 点击号再选择一个模型&#xff0c;会生成对应的链条状的mesh 拉高最远处的一个图…

2023国赛数学建模思路 - 案例:粒子群算法

文章目录 1 什么是粒子群算法&#xff1f;2 举个例子3 还是一个例子算法流程算法实现建模资料 # 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 什么是粒子群算法&#xff1f; 粒子群算法&#xff08;Pa…

无涯教程-PHP - preg_split()函数

preg_split() - 语法 array preg_split (string pattern, string string [, int limit [, int flags]]); preg_split()函数的操作与split()完全相同&#xff0c;只不过正则表达式被接受为pattern的输入参数。 如果指定了可选的输入参数limit&#xff0c;则仅返回子字符串的限…

测试框架pytest教程(11)-pytestAPI

常量 pytest.__version__ #输出pytest版本 pytest.version_tuple #输出版本的元组形式 功能 pytest.approx pytest.approx 是一个用于进行数值近似比较的 pytest 断言工具。 在测试中&#xff0c;有时候需要对浮点数或其他具有小数部分的数值进行比较。然而&#xff0c;由于…

正中优配:散户也算股东吗?能不能参加股东大会?

股市上&#xff0c;常有散户自称韭菜&#xff0c;长一波被股市收割一波&#xff0c;不可谓不惨。但要较真的话&#xff0c;散户仍是有必定身份的&#xff0c;最少他是所持股的股东。有人会好奇&#xff0c;原来散户也算股东吗&#xff1f;那他能不能参与公司的股东大会&#xf…

一篇文章教你自动化测试如何解析excel文件?

前言 自动化测试中我们存放数据无非是使用文件或者数据库&#xff0c;那么文件可以是csv&#xff0c;xlsx&#xff0c;xml&#xff0c;甚至是txt文件&#xff0c;通常excel文件往往是我们的首选&#xff0c;无论是编写测试用例还是存放测试数据&#xff0c;excel都是很方便的。…

怎么测试app?app的测试技巧是什么?

前言 今天笔者想和大家来唠唠app测试&#xff0c;现在的app有非常的多&#xff0c;这些app都是需要经过测试之后才能发布到应用市场中&#xff0c;app已经成为了我们日常生活中不可或缺的一部分了&#xff0c;但它的功能必须强大&#xff0c;才能受到消费者的重视&#xff0c;并…

深度学习3:激活函数

一、激活函数的简介与由来 激活函数&#xff1a;是用来加入非线性因素的&#xff0c;解决线性模型所不能解决的问题。 线性函数的组合解决的问题太有限了&#xff0c;碰到非线性问题就束手无策了。如下图。 通过激活函数映射之后&#xff0c;可以输出非线性函数。 最后再通过…

Ubuntu下跑Aplaca报错:torch.cuda.0utofMemoryError: CUDA out of memory.解决办法(查看CUDA占用情况清除GPU缓存)

缓存不够&#xff01;&#xff01;&#xff01;&#xff01;并非内存容量不够 错误提示&#xff1a; torch.cuda.0utofMemoryError: CUDA out of memory.Tried to allocate 2.00 MiB (PU 0; 23.69 GiB total capacity; 237 BiB already allocated; 18.38 MiB fre; 2.50 GiB re…