微信公众号如何创建视频链接优化大师使用心得
AF3
rigid_utils模块Rigid类make_transform_from_reference
方法其实是实现从全局坐标到局部坐标的变换,输入的为氨基酸残基的 N
(氮原子)、CA
(α-碳原子)、C
(羧基碳原子)三点坐标,返回一个全局坐标到局部坐标的变rigid实例。make_transform_from_reference 和
from_3_points方法都是返回一个到参考坐标系的变换rigid实例,但实现逻辑和返回值不一样。
源代码:
@staticmethoddef make_transform_from_reference(n_xyz, ca_xyz, c_xyz, eps=1e-20):"""Returns a transformation object from reference coordinates.Note that this method does not take care of symmetries. If you provide the atom positions in the non-standard way, the N atom will end up not at [-0.527250, 1.359329, 0.0] but instead at [-0.527250, -1.359329, 0.0]. You need to take care of such cases in your code.Args:n_xyz: A [*, 3] tensor of nitrogen xyz coordinates.ca_xyz: A [*, 3] tensor of carbon alpha xyz coordinates.c_xyz: A [*, 3] tensor of carbon xyz coordinates.Returns:A transformation object. After applying the translation and rotation to the reference backbone, the coordinates will approximately equal to the input coordinates.""" translation = -1 * ca_xyzn_xyz = n_xyz + translationc_xyz = c_xyz + translationc_x, c_y, c_z = [c_xyz[..., i] for i in range(3)]norm = torch.sqrt(eps + c_x ** 2 + c_y ** 2)sin_c1 = -c_y / normcos_c1 = c_x / normzeros = sin_c1.new_zeros(sin_c1.shape)ones = sin_c1.new_ones(sin_c1.shape)c1_rots = sin_c1.new_zeros((*sin_c1.shape, 3, 3))c1_rots[..., 0, 0] = cos_c1c1_rots[..., 0, 1] = -1 * sin_c1c1_rots[..., 1, 0] = sin_c1c1_rots[..., 1, 1] = cos_c1c1_rots[..., 2, 2] = 1norm = torch.sqrt(eps + c_x ** 2 + c_y ** 2 + c_z ** 2)sin_c2 = c_z / normcos_c2 = torch.sqrt(c_x ** 2 + c_y ** 2) / normc2_rots = sin_c2.new_zeros((*sin_c2.shape, 3, 3))c2_rots[..., 0, 0] = cos_c2c2_rots[..., 0, 2] = sin_c2c2_rots[..., 1, 1] = 1c2_rots[..., 2, 0] = -1 * sin_c2c2_rots[..., 2, 2] = cos_c2c_rots = rot_matmul(c2_rots, c1_rots)n_xyz = rot_vec_mul(c_rots, n_xyz)_, n_y, n_z = [n_xyz[..., i] for i in range(3)]norm = torch.sqrt(eps + n_y ** 2 + n_z ** 2)sin_n = -n_z / normcos_n = n_y / normn_rots = sin_c2.new_zeros((*sin_c2.shape, 3, 3))n_rots[..., 0, 0] = 1n_rots[..., 1, 1] = cos_n