技术背景

在前面的这一篇博客中,比较全面的介绍了组成蛋白质的各种氨基酸的三维结构。由于每个氨基酸大小不一,在传统的蛋白质折叠预测的方案中,一般会考虑全原子方案或者是粗粒化方案。对于全原子方案而言,即时去除了氢原子,也包含了极大的原子数,对于计算量来说是一个非常大的考验。而将一个氨基酸近似为一个点的方案,因为往往忽略了太多的信息,比如氨基酸之间的二面角等,因此无法达到很好的预测效果。在AlphaFold中,将每一个氨基酸在主链上的位置,用一个三角形刚体来表示。这个三角形的三个顶点分别是C原子、N原子和\(\alpha\)位的C原子。由于一个三角形就可以确定一个平面,因此每一个氨基酸可以通过一个三角形的内坐标和一个顶点的笛卡尔坐标来完整的表示出来。

算法实现

这里我们使用MindSpore复现一下AlphaFold2中的算法21,也就是刚体表示算法。由于是一个刚体,我们可以将其中除了用于定位顶点的笛卡尔坐标以外的内坐标做一个归一化处理。该算法的基本流程为:

  1. 输入三角形\(\Delta CC_{\alpha}N\)的笛卡尔坐标;
  2. 计算\(\vec{C_{\alpha}C}\)的单位向量,表示为\(\vec{e_1}\);
  3. 计算\(\vec{C_{\alpha}C}\)到\(N\)的垂向量的单位向量,表示为\(\vec{e_2}\);
  4. 计算\(\vec{e_1}\)和\(\vec{e_2}\)的叉乘,得到一个跟三角形\(\Delta CC_{\alpha}N\)平面相垂直的单位向量\(\vec{e_3}\);
  5. 用\(\vec{e_1}\)、\(\vec{e_2}\)和\(\vec{e_3}\)表示当前氨基酸的空间位置,保留\(C_{\alpha}\)的坐标用于表示当前氨基酸在空间中的绝对位置。

    具体算法实现如下所示:
# algorithm21.py

# 关闭MindSpore的Warning信息
import os
os.environ['GLOG_v'] = '4' import numpy as np
import mindspore as ms
from mindspore import Tensor, ops
from mindspore import numpy as msnp def rigidFrom3Points(crd):
""" Transform the coordinates formulation. """
v1 = crd[:, 2] - crd[:, 1]
v2 = crd[:, 0] - crd[:, 1]
e1 = v1 / v1.norm(axis=-1, keep_dims=True)
u2 = v2 - e1 * ops.Einsum('ij,ij->i')((e1, v2))[:, None]
e2 = u2 / u2.norm(axis=-1, keep_dims=True)
e3 = msnp.cross(e1, e2, axisc=-1)
R = ops.Concat(axis=-2)((e1[:, None], e2[:, None], e3[:, None]))
t = crd[:, 1][:, None]
new_crd = ops.Concat(axis=-2)((R, t))
return new_crd if __name__ == '__main__':
np.random.seed(1)
BATCHES = 2
DIMENSIONS = 3
ATOMS = 3
# 定义原始坐标
origin_crd = Tensor(np.random.random((BATCHES, ATOMS, DIMENSIONS)), ms.float32)
print ('The original coordinates is: \n{}'.format(origin_crd))
trans_crd = rigidFrom3Points(origin_crd)
print ('The transformed coordinates is: \n{}'.format(trans_crd))

该算法的输出结果为:

The original coordinates is:
[[[4.17021990e-01 7.20324516e-01 1.14374816e-04]
[3.02332580e-01 1.46755889e-01 9.23385918e-02]
[1.86260208e-01 3.45560730e-01 3.96767467e-01]] [[5.38816750e-01 4.19194520e-01 6.85219526e-01]
[2.04452246e-01 8.78117442e-01 2.73875929e-02]
[6.70467496e-01 4.17304814e-01 5.58689833e-01]]]
The transformed coordinates is:
[[[-0.30411592 0.5208795 0.79762024]
[ 0.30775824 0.8461014 -0.43519795]
[-0.90155333 0.11312358 -0.41761786]
[ 0.30233258 0.14675589 0.09233859]] [[ 0.55235845 -0.5461919 0.6297417 ]
[-0.73928094 0.02810205 0.67281044]
[-0.38518062 -0.8371886 -0.38826686]
[ 0.20445225 0.87811744 0.02738759]]]

如此一来,我们就可以通过调整给定蛋白质坐标的\(C_{\alpha}\)位置和旋转用于表示氨基酸内坐标的三个向量\(\vec{e_1}\)、\(\vec{e_2}\)和\(\vec{e_3}\),以得到一个使得整体模型的Loss最低的采样器,就可以用于预测生成一系列给定氨基酸序列的蛋白质构象。

总结概要

本文主要通过MindSpore复现了一个AlphaFold2文章中的算法21,该算法可以用于将蛋白质构象中的每一个氨基酸转化成一个归一化的空间三角形表示,更方便用于深度学习模型中的参数优化。有了这样一个抽象的模型,再定义一系列的梯度优化和损失函数,就可以得到一个用于预测蛋白质构象的生成模型。

版权声明

本文首发链接为:https://www.cnblogs.com/dechinphy/p/rigid-res.html

作者ID:DechinPhy

更多原著文章请参考:https://www.cnblogs.com/dechinphy/

打赏专用链接:https://www.cnblogs.com/dechinphy/gallery/image/379634.html

腾讯云专栏同步:https://cloud.tencent.com/developer/column/91958

CSDN同步链接:https://blog.csdn.net/baidu_37157624?spm=1008.2028.3001.5343

51CTO同步链接:https://blog.51cto.com/u_15561675

AlphaFold2中的残基刚体表示的更多相关文章

  1. Unity中Collider和刚体Collider性能对比

    测试方式: 每个对象做大范围正弦移动,创建1000-5000个对象,保证场景分割树的实时更新,并测试帧率 测试脚本: 移动脚本: using UnityEngine; using System.Col ...

  2. 关于Cocos2d-x中多边形物理刚体的设置

    1.如果想要设置某个物体有多边形的刚体,这样可以更精确地进行碰撞检测,可以用以下的方法 auto hero = PlaneHero::create(); addChild(hero, 0, HERO_ ...

  3. Unity中关于作用力方式ForceMode的功能注解

    功能注解:ForceMode为枚举类型,用来控制力的作用方式,有4个枚举成员,在以下举例中均设刚体质量为m=2.0f,力向量为f=(10.0f,0.0f,0.0f). (1)ForceMode.For ...

  4. Egret中使用P2物理引擎

    游戏中的对象按照物理规律移动,体现重力.引力.反作用力.加速度等物体特性,实现自由落体.摇摆运动.抛物线运动,以及物理碰撞现象的模拟.用于模拟物理碰撞.物理运动的引擎称为物理引擎. 来自瑞典斯德哥尔摩 ...

  5. Cocos2d Box2D之动态刚体

    |   版权声明:本文为博主原创文章,未经博主允许不得转载. b2_dynamicBody 动态物体可以进行全模拟.用户可以用手手动移动动态刚体,也可以由动态刚体自己受力而自运动.动态物体可以和任何物 ...

  6. [原创]cocos2d-x研习录-第三阶 特性之物理引擎

    游戏物理引擎是指在游戏中涉及物理现象的逻辑处理,它用于模拟现实世界的各种物理规律(如赛车碰撞.子弹飞行.物体掉落等),让玩家能够在游戏中有真实的体验. Cocos2D-x中支持Box2D和Chipmu ...

  7. 01.Box2dWeb入门教程

    1.下载box2dweb.直接在页面中引用即可. -Box2D.js是未压缩版 -Box2d.min.js是压缩版 2.编写HelloWorld代码. <!DOCTYPE HTML> &l ...

  8. unity, 由5.2.1f1升级到5.3.5f1,2d物理不正常解法

    由5.2.1f1升级到5.3.5f1,物理不正常. 最后发现问题出在我的游戏中的下面一段代码:   Vector2 targetPosition=...;   Vector2 targetVeloci ...

  9. Cocos2d-x3.2 使用物理引擎进行碰撞检测[转]

    通常在游戏简单逻辑判断和模拟真实的物理世界时,我们只需要在定时器中判断游戏中各个精灵的条件是否满足判断条件就可以了.例如,在飞机大战中,判断我方子弹和敌机是否发生碰撞一般在定时器中通过敌机所在位置的矩 ...

  10. Unity3D脚本中文系列教程(九)

    Unity3D脚本中文系列教程(八) name 对象名称hideFlags 该物体是否被隐藏,保存在场景中或被用户修改继承的函数 GetInstanceID 返回该物体的实例id继承的类函数 oper ...

随机推荐

  1. 使用C++进行冒泡排序

    #include "pch.h" #include <iostream> using namespace std;手动输入10个数,进行冒泡排序 int main() ...

  2. 微信小程序云开发,快速生成短信验证码

    使用微信小程序云函数实现注册短信验证码的管理,并不是一件分分钟的事,目前想要存储验证码只能放到数据库中,因为存储后才能和用户提交上来的验证码做比较. 管理验证码主要涉及到:生成.存储.校验.有效期管理 ...

  3. SpringCloud设置随机端口后的问题

    问题描述 SpringCloud服务提供者,设定了随机端口配置后,在EurekaServer中的注册端口.Tomcat的web端口.运行中获取到的server.port配置端口,共出现了4个不同的端口 ...

  4. JS笔记(三):函数与对象

    镇楼图 Pixiv:torino 四.Function类型 Rest语法 一些函数如Math.max可以支持任意数量的参数,JS中对于这样的参数可以简单使用...来实现,使用剩余参数,它支持收集剩余的 ...

  5. vue导出文件

    /**导出 */ async toExcel() { // let result = await this.axios({ // method: 'get', // url: `issdc-manag ...

  6. Java的流程控制

    Scanner对象 next(); 一定要读取到有效字符后才可以结束输入. 对输入有效字符之前遇到的空白,next()方法会自动将其去掉(). 只有输入有效字符后才将其后面输入的空白作为分隔符或者结束 ...

  7. SQLServer 远程链接MySql数据库

    第一步:安装MySQL odbc driver 在SQL SERVER所在主机上安装MYSQL ODBC Driver; 下载地址:http://dev.mysql.com/downloads/con ...

  8. Shell脚本实现模拟并发及并发数控制

    #!/bin/bash #by inmoonlight@163.com #下面的代码控制并发数.其实是利用令牌原理实现 #一个线程要运行,首先要拿到令牌在该代码中即read一行数据,读取不到就会暂停, ...

  9. .NET实验二

    实验名称:实验二 面向对象程序设计 一. 实验目的 1. 理解类的定义.继承等面向对象的的基本概念: 2. 掌握 C#语言定义类及其各种成员(字段,属性,方法)的方法: 3. 掌握方法覆盖的应用: 4 ...

  10. sql运算符优先级

    1.() 2.* / % 3.+正 -负 +  - +连接(字符串) 4.= > < >= <= <> != !> !< 5.not 6.and 7.b ...