Rosetta Match:几何约哈希算法原理解析,如何利用哈希函数预测博彩走势束的处理与从头酶设计

2026-02-17

  哈希算法,SHA256,哈希函数,加密哈希,哈希预测/哈希算法是博彩游戏公平性的核心,本文详细解析 SHA256 哈希函数的运作原理,并提供如何通过哈希技术进行博彩预测的方法!

Rosetta Match:几何约哈希算法原理解析,如何利用哈希函数预测博彩走势束的哈希处理与从头酶设计

  算法最早发表于2006年。两年后,David Baker课题组先后使用该算法在Nature和Science上报道了催化Kemp消除反应和Retro-Aldol反应的de novo可以非常高效地处理预先给定的几何约束信息,简单快速地生成对应结构模型以用于后续的序列/结构设计等,因此仍具有广泛的用途,并与机器学习等算法相互补充。本文系统详尽地介绍了Rosetta Match的应用目的、算法细节、使用经验和操作方法,并给出了相关运行实例。

  Rosetta Match应用程序可以在蛋白支架 (scaffold) 上搜索,以找到一组位点,在这一组位点上引入的氨基酸残基能够满足蛋白与目标小分子之间的相互作用。例如,目标小分子上含有一个氨基,用户想要某氨基酸残基的羧基侧链与这个氨基形成氢键。这种相互作用可通过一个约束文件 (*.cst, constraint) 进行定义,Matcher将按照此约束搜索并输出一组构象,构象包含了目标小分子在蛋白支架中的结合位置,以及按照约束文件指定的含有羧基侧链的残基位置。倘若Matcher并未找到合适的构象,则不产生输出。Matcher能在大量支架的库中迭代搜索,但每个任务只处理一个支架。

  Match算法最早用于酶改造设计:酶促反应的过渡态由若干氨基酸残基与底物的相互作用构成,每个残基都具有特定的几何构型,这种酶的理论几何描述也称为“Theozyme”模型。Match算法的目标是在给定的蛋白支架上找到一组主链位置,能将这些催化残基嫁接到支架上,从而能以类似的几何构型来维持、稳定反应的过渡态。那么,这种嫁接了催化残基后的新蛋白就有可能也能催化该酶促反应。 例如,某底物过渡态 (Transition State, TS) 与Asp、Asn和His三个催化残基相互作用,用户希望设计一个催化该反应的酶,并且已知过渡态与催化残基之间的几何关系,但不知道应在哪种蛋白的哪些位置引入这些残基。用户需要给Matcher提供能描述TS与催化残基之间几何关系的信息,即“外部几何”关系,该信息由1个距离、2个键角和3个二面角共计6个参数组成。如下图所示:

  设想当催化残基侧链的特定构象(如上图Residue1)被给出时,满足上述几何约束的过渡态坐标(如上图Residue2)将被随之确定,即从某个侧链的末端“生长”出来。通常,用户可能会对6个参数中的每一个指定多个可能值,Matcher将考虑这些值所有的排列组合,并计算出TS所有可能的位置。例如,某催化残基与TS的理想距离distance_AB是2.0Å,用户可指定Matcher考虑2.0 Å,并同时考虑1.95 Å和2.05 Å。

  Matcher每轮处理一个几何约束。首先,在用户指定的每个活性位点,对满足几何约束条件的一个或多个氨基酸构建旋转异构体 (rotamer) ,这里的“多个”是指,假设需要一个羧基侧链形成氢键时,可以构建Asp或Glu的rotamers。对于每一个构建的rotamer,Matcher从其末端“长出”TS的构象。Matcher会进行一个快速的collision检测,排除掉那些与蛋白骨架有冲突的TS构象。倘若构象不发生冲突,则记录TS的6维坐标,既然可以用6个参数来描述几何约束,则可以用一个6维坐标来完全描述TS的位置。那么在给定TS结构的情况下,TS的6维坐标与其欧几里得坐标之间是完全可转换的。同时,Matcher可对6D坐标进行分箱 (bin the coordinate) :如果两个TS的6D坐标很接近,它们会被放到同一个bin中。这就是领悟Match算法的核心:对于每个几何约束 (即每个催化残基) ,Matcher会迭代地长出不同的TS,这些TS被称为“hit”,当每个约束长出的TS (包含各种hits) 均被放入了同一个bin,即可认为这样的一组hits同时满足了所有的几何约束 (换言之,这样的一组hits在空间上足够邻近,或理解为“足够像”) ,则得到了一组符合要求的TS构象,也就是一个“match”。据此可以想见,假如向Matcher输入了N个几何约束,则每个“match”中会包含N个hits,每个hit对应一个几何约束。

  更一般的情况下,match为每个几何约束搜索hit。酶设计范例中的蛋白支架可以推广到任何大分子聚合物支架,移植催化残基的rotamers可以推广为“上游”组分的多个构象;过渡态可以推广为“下游”组分,也可以包含多个构象。“上游”和“下游”实际表示坐标被确定的顺序:先构建rotamers上游坐标,然后按照几何约束从其上“长出”下游TS坐标;对上游坐标的更改会传播到下游坐标。理论上来说,下游组分也可以是整个蛋白,并能拥有像rotamers一样的不同状态。例如,用户可能希望给支架上的某个氢键供体匹配下游蛋白的Ser侧链。此时,下游蛋白应能够对上游氢键供体残基的每个rotamer,搜索Ser侧链的一系列rotamers来与之匹配,不过目前Matcher暂不能实现将整个蛋白作为下游组分。

  每个生成的hit包含离散和连续两部分信息。离散部分由四个整数组成:蛋白支架活性位点索引(index)、上游组分的rotamer索引、外部几何索引以及下游组分的rotamer索引;连续部分包括描述下游位置的6维双精度坐标:特定原子的xyz坐标及其所处位置坐标系的phi、psi和theta角 (三个欧拉角) 。可以想象,在给定TS的构象时,只需要一个特定原子的xyz坐标和三个旋转角,就可以完全“长出”、描述这个TS在空间中的位置。当某个hit被分bin时,bin的宽度由两套参数定义:欧几里得bin宽度 (单位为Å) 描述xyz坐标,欧拉bin宽度 (单位为角度°) 描述三个欧拉角。

  如图所示,Matcher读入不含配体的支架*.pdb文件,定义TS结构的*.params文件 (还可以输入描述TS各种可能构象的PDB rotamers,Matcher将在每个TS构象间进行迭代) ,以及一个定义几何约束的*.cst文件。所有的约束应被放入一个*.cst文件中,例如约束1描述Glu的羧基指向TS的氨基,约束2描述Tyr的羟基指向TS的羰基。Matcher算法主要分为两步:首先对每个约束条件生成“hits”,然后进行枚举,找到能满足所有约束的一组hits (出现在同一个6D bin中) ,将之作为一个“match”。下面对算法的两个步骤进行详细说明:

  生成hit的经典算法由Zanghellini等人开发,概括地说,经典算法的核心是嵌套的循环。首先,Matcher按顺序依次处理每个几何约束 (loop1) ;对于每个约束,在用户指定的所有允许的位点(由*.pos文件指定)建立rotamers (loop2) ,用户可为每个几何约束分别选择需要考虑的位点,或者直接输入一组位点,每个约束都将考虑所有这组位点;对于每个需要考虑的位点,遍历所有需要考虑的残基种类 (loop3) ,例如用户需要一个羧基来催化某反应,可以为这个位点指定构建Asp或Glu,matcher将分别考虑这两种情况;对于每种残基类型,遍历其所有可能的rotamers (loop4) ;随后考虑TS从每种rotamer“长出”的所有可能方式 (loop5) ,例如从Asp残基的侧链“长出”配体时,从羧基的两个氧原子OD1和OD2均能“长出”。

  此时,我们已经确定对于某一约束,从某一位点建立了某种氨基酸残基的某种rotamer,并确定了以何种形式长出TS。下一步循环 (loop6) 即考虑所有外部几何的组合:例如我们为6个几何参数 (如前文,一个距离、两个角度、三个二面角) 中的每一个指定了两种可能值,那么matcher将进行排列组合,长出2^6种可能的TS三原子结构,并通过配体所有输入的构象 (loop7) ,长出剩下的TS完整构象。此时,每种构象均可能成为一个hit,Matcher使用五个标准来检测这些构象是否符合要求:

  来调节,float值越大,对碰撞的容忍度越高,缺省值为0.0,即不允许任何碰撞。

  倘若此时检查的hit并不是产生于第一个几何约束,则判断TS的6D坐标 (如前文,3个欧几里得坐标和3个欧拉坐标) 是否落在无法产生有效match的6D区域之中。倘若这个hit无法最终形成一个有效的match,那么便不需要存储它。这实际上是Match算法的巧妙之处,Matcher将会追踪所有可能产生有效match的6D坐标及其体积元素空间 (voxel,体素) ,倘若此时检查的hit来自于几何约束i,那么假如先前的每个几何约束1,2…i-1都产生了至少一个落在体素v中的hit,那么体素v就有可能产生有效match;反之,但凡某一个几何约束在体素v中未产生hit,那么体素v就一定不会得到任何Match。所以,Matcher总会保存并追踪第一个几何约束产生的所有hits,随后的约束产生的hits便会进行这种有效性检测,倘若其落在了6D空间中的某个区域,这个区域内没有先前每一个几何约束产生过的hits,那么这个hit便不需要储存。这种体素的数据结构的存储位于

  src/protocols/match/OccupiedSpaceHash.hh

  ,它是动态更新的,一旦先前占据的体素在某一轮约束中未产生hit,则这些体素最终也将不会产生Match,将被标记为非生产性,并删除此前约束在该体素内产生的所有hits。Note:这也是有些社友经常问到的,第一个约束产生了大量hits,但第二个、第三个约束只产生极少或0个hits的原因。 Tip1:据此,在安排几何约束的顺序时,应该按照采样多样性增序排列,即最明确定义的约束应该放在

  文件的最前面,如此可占用最少的生产性体素,在随后的hit生成步骤便可过滤掉更多的非生产性hits,以加快运行时间。笔者经验来看,对诸如Lys/Glu等多chi角的残基,激进的采样策略(如

  至少一个关键的TS原子位于支架活性位点(也称配体网格,ligand grid)之外。关键配体原子可通过

  -required_active_site_atom_names fname

  选项指定。支架活性位点可通过Rosetta++风格的配体网格指定,或列出结构中所有的活性位点残基。

  倘若hit通过了这五个过滤器,它将会被添加到hits的列表中。这个列表最终将会到达最外层循环。每一轮约束产生的有效hits将被保存以供枚举阶段使用。

  除经典算法外,还可使用Secondary Match来生成hits,其核心是重用先前约束中已经生成的hits,来代替每轮约束中重新从头生成hits的过程。例如,用户可能不需要为某些几何约束指定全部6个自由度去进行搜索,因为这些自由度并不重要;或者,用户可能希望约束1中,与TS接触的Asp能与约束2中蛋白上的另一个His形成氢键,即几何约束关系发生在蛋白的两个催化残基之间,此时即可使用Secondary Match将约束1中,Asp约束产生的hits直接用于约束2,相当于在采样约束2中His的构象,以找到那些能与Asp形成氢键的rotamers。总之,Secondary Match将先前几何约束产生的hits结构作为后续几何约束的hits来源,即进行前文所述的几轮循环,构建了rotamers之后,检查rotamers与先前生成的hits的几何构型,满足几何构型的hits被认为是这一轮产生的hits,故使用时不必指定全部6个自由度参数。

  另一种类型的Secondary Match可以指定新一轮约束产生的rotamers与先前约束产生的几何结构之间形成特定相互作用,这里先前约束产生的几何结构包括下游伙伴TS的结构和上游残基rotamer的结构,可以为这些相互作用设置能量项的cutoff进行更高级的筛选。这些高级算法的指定通过几何约束文件的ALGORITHM_INFO模块进行。 Tip2:Classic Match与Secondary Match算法各有优缺点。Classic Match的每个hit生成阶段都是独立的,无需检查来自先前几何约束的每个hit,但必须为每个自由度指定采样值,当所需的相互作用不甚明确的情况下 (例如氢键相互作用,只有distance_AB/angle_A/angle_B和某个可能的二面角很重要) ,必须对不重要的那些自由度大量采样,以确保找到所有可能的Match。Secondary Match算法则避免了这个缺点,不重要的自由度可以直接置空,即任意值都可以被接受,也可以跳过检查先前生成的hit步骤,但依赖于先前生成的hit,故无法用于第一个被采样的几何约束。

  如前文所述,每个match会包含N个hits,其中的每一个hit都与*.cst中的每一个几何约束相对应。程序通过使用哈希表来找到match:每个hit的6D坐标将被分箱,这些分箱随后被转化为一个64-bit的整数,这个整数将作为哈希表的键,从而使得哈希表建立了从分箱索引到N维vector1之间的映射,以确保第i轮生成的hit能被正确地插入到vector1的第i个位置。如此,所有包含有效match的6D体素即可通过遍历哈希表的每个元素来得到。举个例子进一步说明:经过哈希散列后,哈希表的每个元素都是一个hits的列表,如指定了3个几何约束,在某个体中每个约束都产生了2个有效的hits,那么这总共6个hits最多可产生222=8个Matches;倘若每个约束产生了3个有效的hits,则最多可产生27个Matches (换言之,可以想见只要一系列hits落在了同一个有效体素内,两两组合这些hits都可以作为一个Match输出) 。所以,所有可能的matches都会在这些hits组合的枚举中产生,所以这个阶段被称为Match Enumeration。

  将hits散列到一系列bins中的一个问题是,两个hits可能在6D空间中非常接近,但可能由于分箱的边界问题,被分到不同的bin中。设想1D空间中的情况,倘若有一系列宽度为1,原点为0的bins。在这种情况下,某个坐标为1.125的hit将会与另一个坐标为1.35的hit落入同一个分箱,即坐标在1~2之间的分箱,并成为某个match的一部分。但是,坐标为0.95的某个hit不会与坐标为1.125的hit落入一个分箱,但即便它们也足够接近。那么,在1D空间中解决这个问题非常容易,进行两次哈希即可。第一次散列原点设在0,产生一系列分箱0~1,1~2,2~3等;第二次散列原点设为0.5,产生另一系列分箱0.5~1.5,1.5~2.5,2.5~3.5等。这样,任意两个足够接近的hit都将至少在某一次哈希时被分为同一个bin,如0.95和1.125的两个hits将在第二次哈希中被分到0.5~1.5的箱中。第二次哈希分箱的原点设为分箱宽度的一半长度即可。

  那么,1D空间中这样的操作产生2^1=2次散列,6D空间中就会产生2^6=64次散列。分箱的原点分别沿着6个维度移动半个bin的宽度,并且需要移动2^6次,每种组合都需要被考虑以确保不会漏掉某两个足够接近的hits。显然,如前文所言这种方法确保了任意两个足够接近的hit都将至少在某一次哈希时被分到同一个bin中,但也会使某些hits的组合被多次分到一个bin中,如1D空间中的1.125和1.35两个hits将在第一次哈希中被分到1~2的箱中,又在第二次哈希中被分到0.5~1.5的箱中,Matcher通过MatchOutputTracker类跟踪已经产生的match来避免重复输出同样的match。

  Matches的输出被分为两个部分。Matcher本身将负责迭代64次哈希,并且如前文所述保证每种match只被考虑一次 。随后,这些Matches将被传递给MatchProcessor,由MatchProcessor负责确定每个Match的输出与否。 值得专门指出的是有两种类型的matches输出方式,它们在如何将两种matches解释为同一个match上有所不同。在第一种定义中,每个match被定义为来自N个几何约束的N个hits的独一无二的组合 (the unique combination of N hits from the N geometric constraints) 。在这种定义中,match-m和match-m’可以描述来自N个几何约束的N个完全相同的上游rotamers,但在下游残基 (TS) 的位置上不同。倘若下游坐标被较为充分地采样,那么许多matches将看起来非常相同,准确地说是非常相似,但实际上是不同的matches。在第二种定义中,每个match被定义为N个hits上游rotamers部分独一无二的组合,下游TS则由几个约束中的某一个采样到的下游构象来定义。在这种定义下,许多组hits经过枚举后可被映射到同一个match,代码中称为“match_dspos1”定义,因为下游残基的位置仅由单个几何约束确定,这可以显著减少需要输出matches的数量,并且避免了第一种定义中输出一系列极为接近构象的问题,方便了后续步骤的处理。此外,由于许多matches往往彼此之间高度相似,Matcher默认采用所谓CloudPDB的输出格式;简而言之,matches将被MatchGrouper分组,所有落到同一组的matches将默认以CloudPDB的特殊格式输出,它将包含所有TS的构象,并把rotamers作为额外结构模型输出。

  值得指出的是,Matcher不保证能得到结果。显然,加入的约束条件越多,产生match的难度就越大,运行时间也会更长,但采样不足很可能会丢失有价值的hit。一般来说,计算成本的限制因素是内存大小。

  gen_lig_grids和gen_apo_grids可以自动创建*.pos文件,但也可以手动生成,以尽可能利用先验知识。.pos文件可使用两种不同的格式:

  Note:注意,*.pos文件的编号采取从1开始的Rosetta编号而非PDB编号,建议对输入Matcher的PDB文件全部重新编号。

  对于每个相互作用,都需要一个代码块来在*.cst文件中进行描述,下面的例子描述了组氨酸残基和三字母缩写为D2N的配体之间的相互作用:

  TEMPLATE:: ATOM_MAP:表明哪些原子受到约束以及这些原子所在的残基类型,第三列的数字表明上下游,它必须是1或2,与坐标确定的先后顺序有关。atom_name标签准确指定需要约束残基的哪三个原子,故必须列出约束残基三个原子的名称;atom_type是atom_name标签的替代,它可以更灵活地定义受约束的原子,故必须列出受约束残基的第一个原子所对应的Rosetta atom type,关于Rosetta atom type的更多内容详见此页面。当使用atom_type标签时,Rosetta会将第二个受约束原子设为列出的第一个受约束原子的基原子,并将第三个受约束原子设为第二个原子的基原子。使用atom_type标签有两个优点:它允许使用同一个文件约束不同的残基类型,如约束催化残基和配体之间的氢键,但用户并不关心它是由Ser-OH还是由Thr-OH介导,使用atom_type即可同时指定S/T两种残基类型;其次,催化残基包含多个相同类型的原子,如Asp/Glu的羧基,但这些原子中的哪一个介导受约束的相互作用并不重要,使用atom_type: OOC即可同时考虑两个氧原子的情况。

  residue1或residue3标签指定了受约束的残基类型。residue3后需要给出残基名称的三字母缩写,而residue1后需要给出单字母缩写。为方便起见,如果几种残基都可以满足约束,则residue1标签后可以列出一串允许残基的单字母缩写,如ED表示考虑Asp和Glu。

  指令的第五列数字) 应始终设置为0,因为运行期间,每种采样值的组合都将构建一组rotamers,例如前文所列的示例

  代码块,17820种不同的组合将被写入同一个模型,这将导致可视化时非常混乱,倘若采样水平更高,还可能填满磁盘。

  文件必须为每个约束代码块指定全部6个自由度,倘若某个约束使用Secondary Match,必须暂时为那些未定义的自由度添加一个值

  此应用程序不进行能量计算,产生的模型可能存在clash,但并不意味着该theozyme不能产生非冲突的match

  总而言之,该应用程序的作用在于确保Rosetta以用户期望的方式解读了*.cst文件,在进行Match的生产运行时,需注意修改回期望的采样数和Secondary Match的算法指令等。

  由于并不确定期望的几何约束能否成功匹配到任意给定的蛋白支架,Matcher可以在不输出任何match的情况下完成运行,但无论如何都将输出日志信息,且最后一行为“Matcher ran for x seconds”。倘若没有输出这一行信息表明计算过程中出现问题。

  如果找到任何matches,Matcher可以用三种不同的格式进行输出:PDB、CloudPDB和Kinemage,默认为CloudPDB并由选项-match:output_format指定。任何时候都应该明确,match只是一组hits,即一组残基的rotamers和配体对应位置的集合。受蛋白上rotamers和*.cst文件指定的配体放置采样密度的影响,有可能大量的hits被散列到同一个bin中,对这些相似hits的枚举会进而产生海量相似的matches。

  CloudPDB输出格式:在CloudPDB中,Matcher将会按照-match:match_grouper指定的分组器,对所有matches进行聚类,为每个聚类中心输出一个multi-model PDB文件,包含该聚类中所有独特的蛋白rotamers和配置,倘若某聚类中心有超过100个独特的配置,将分别为每100个独特的位置写入一个文件。CloudPDB是推荐的默认输出格式。

  PDB输出格式:在PDB中,每个match都将作为单独的PDB文件输出,如前文所述,当枚举过程产生数百万个matches的情况下,这种输出格式会快速填满外存。为防止这种情况发生,使用PDB输出格式时建议将下述两个选项设置为真:-match:output_matchres_only True将仅输出被Matcher处理的残基和配体,而不包含蛋白支架的其余部分,可以使用其它脚本将这部分输出重新插入到整个蛋白支架中;-match:match_consolidate_matches True将仅输出matches的子集,Matcher将根据-match:match_grouper指定的值进行聚类,然后随机输出每个聚类中心由-match:output_matches_per_group指定数量的matches。

  酶设计过程的第一步是对反应过渡态进行建模,并确定一组理想的活性位点描述,这种描述包含催化侧链和若干稳定过渡态的其它残基,如可以稳定过渡态所带有的负电荷的正电性残基。上述描述可通过量子化学的过渡态计算 (鞍点求解) 获得,已有文献的先验知识或化学直觉也可以引入。

  作为演示,以磷酸丙糖异构酶 (Triose Phosphate Isomerase, TIM) 为例,该反应是糖酵解的重要组成部分,也是酶学研究最深入的反应模型之一。基于酿酒酵母TIM的晶体结构 (PDB ID:1ney) ,可以获得几何约束信息:1) Glu 165位羧基侧链用于进行两次质子转移;2) His 95位咪唑环NH用于极化发生质子转移的两个氧原子O1和O2;3) Lys 12位用于进一步极化O2并稳定烯醇中间体的形成。

  对于相互作用1,Asp/Glu的羧基负离子需要从C1上提取氢,这将规定distance_AB/angle_A/torsion_A的值;此外,去质子化是由羧酸负离子中O原子的反键sp2轨道发生的,此时angle_B/torsion_B也被明确定义;最后,torsion_AB有较大的自由度,Matcher可以对这个二面角进行更大范围的采样。

  对于相互作用2,咪唑环的质子化NH需要与O1和O2同时形成氢键,氢键方向性直接规定了distance_AB/angle_A/torsion_A的值;由于质子化N的sp2轨道指向两个氧原子之间,angle_B/torsion_B的值也随之确定;torsion_AB控制咪唑环和底物平面的相对取向,拥有更大的自由度,被设置为0°和180°附近数值。

  对于相互作用3,其作用强度小于前两项相互作用,参考文献对这一约束采用Secondary Match,从前两轮约束得到的hits中找出满足相互作用3的子集。Lys氨基与O2所需的氢键约束了distance_AB/angle_A/angle_B在较小的范围内;此外,为了将Lys放在底物平面与Asp/Glu相反的另一侧,torsion_A也受到限制;torsion_AB和torsion_B对酶促反应没有太大影响,可以在Secondary Match中设置为任意值。

  上述几何约束的参数确定往往是酶设计过程中最具技巧性的部分,更多实例代码请参见参考文献及rosetta/main/tests/integration/tests/match/中给出的示例。

  此外,还需要获取酿酒酵母TIM晶体结构中的配体信息,从PDB ID:1ney中拆分出配体,保存为LIG.mol,随后使用Rosetta中的脚本将其转化为对应的*.params文件:

  参考文献显示在PDB ID:1tml蛋白支架上成功找到了若干matches,晶体结构显示该蛋白不含天然配体,使用gen_apo_grids生成对应的*.gridlig和*.pos文件:

  可以看到Matcher依据Theozyme找到了与原始酶非常相似的催化结构。

地址:广东省广州市天河区88号 客服热线:400-123-4567 传真:+86-123-4567 QQ:1234567890

Copyright © 2012-2025 哈希游戏推荐 版权所有 非商用版本