cleanUrl: "peptide-bond-geometry"
description: "Peptide bond를 이루는 원자들의 이상적인 결합 길이와 결합 각을 정리합니다."

출처

출처

출처

출처

출처

출처

출처

출처

출처

출처

출처

출처

결합각

결합 각도 (º)
Ca - N - C 122 ~ 123
Ca - C - N 114 ~ 116
C - Ca - N 111

결합길이

결합 길이 (A)
Ca - C 1.51 ~ 1.53
C - N 1.32 ~ 1.33
N - Ca 1.45 ~ 1.47

코드 예시

def get_ideal_coords(center=False):
    N = torch.tensor([[0, 0, -1.458]], dtype=float)
    A = torch.tensor([[0, 0, 0]], dtype=float)
    B = torch.tensor([[0, 1.426, 0.531]], dtype=float)
    C = place_fourth_atom(
        B,
        A,
        N,
        torch.tensor(2.460),   # length
        torch.tensor(0.615),   # planar
        torch.tensor(-2.143),  # dihedral
    )  # this produces tensor([[-1.1932, -0.7685, 0.551]])

    coords = torch.cat([N, A, C, B]).float()

    if center:
        coords -= coords.mean(
            dim=0,
            keepdim=True,
        )

    return coords

def place_fourth_atom(
    a_coord: torch.Tensor,
    b_coord: torch.Tensor,
    c_coord: torch.Tensor,
    length: torch.Tensor,
    planar: torch.Tensor,
    dihedral: torch.Tensor,
) -> torch.Tensor:
    """
    Given 3 coords + a length + a planar angle + a dihedral angle, compute a fourth coord
    """
    bc_vec = b_coord - c_coord
    bc_vec = bc_vec / bc_vec.norm(dim=-1, keepdim=True)

    n_vec = (b_coord - a_coord).expand(bc_vec.shape).cross(bc_vec)
    n_vec = n_vec / n_vec.norm(dim=-1, keepdim=True)

    m_vec = [bc_vec, n_vec.cross(bc_vec), n_vec]
    d_vec = [
        length * torch.cos(planar),
        length * torch.sin(planar) * torch.cos(dihedral),
        -length * torch.sin(planar) * torch.sin(dihedral)
    ]

    d_coord = c_coord + sum([m * d for m, d in zip(m_vec, d_vec)])

    return d_coord

$$ d_{CN}=\sqrt{d_{NC_a}^2+d_{C_aC}^2-2*d_{NC_a}*d_{C_aC}*cos(\theta_{NC_aC})} = 2.439 $$