get_ang
?函數(kinematics.py包中)計算三組原子?a,b,c 所形成的平面角(planar angle),即?b?為頂點,?a,b,c?所確定的角度。
源代碼:
def get_ang(a, b, c):"""calculate planar angles for all consecutive triples (a[i],b[i],c[i])from Cartesian coordinates of three sets of atoms a,b,c Parameters----------a,b,c : pytorch tensors of shape [batch,nres,3]store Cartesian coordinates of three sets of atomsReturns-------ang : pytorch tensor of shape [batch,nres]stores resulting planar angles"""v = a - bw = c - bv /= torch.norm(v, dim=-1, keepdim=True)w /= torch.norm(w, dim=-1, keepdim=True)vw = torch.sum(v*w, dim=-1)return torch.acos(vw)c6d[b,i,j,torch.full_like(b,3)] = get_ang(Ca[b,i], Cb[b,i], Cb[b,j])
代碼解讀:
輸入參數
a, b, c
:形狀為?[batch, nres, 3]
?的 PyTorch 張量,表示多個樣本中各殘基的三組原子笛卡爾坐標。batch
:批量大小。nres
:每個樣本的殘基數量。3
:表示每個原子的三維坐標?(x,y,z)(x,y,z)。
輸出
ang
:形狀為?[batch, nres]
?的張量,表示每個樣本中殘基對?a,b,ca,b,c?形成的平面角(弧度)。
步驟解析
-
計算向量
v = a - b
:從?bb?指向?aa?的向量。w = c - b
:從?bb?指向?cc?的向量。
-
單位化向量
v /= torch.norm(v, dim=-1, keepdim=True)
:將向量?vv?歸一化。w /= torch.norm(w, dim=-1, keepdim=True)
:將向量?ww?歸一化。
-
計算夾角的余弦值
vw = torch.sum(v*w, dim=-1)
:向量?vv?和?ww?的點積,結果是每個殘基間的余弦值。
-
余弦值轉角度
torch.acos(vw)
:使用反余弦函數計算角度,返回弧度制的角度。
? ? ? ? ? 函數調用
c6d[b, i, j, torch.full_like(b, 3)] = get_ang(Ca[b, i], Cb[b, i], Cb[b, j])
Ca[b, i]
:第?bb?個樣本中,第?i 個殘基的?CαCα??坐標。Cb[b, i]
?和?Cb[b, j]
:第?b?個樣本中,第?i?和第?j?個殘基的?Cβ?坐標。get_ang(Ca[b, i], Cb[b, i], Cb[b, j])
:計算第?b?個樣本中,以 i 殘基?Cβ?為頂點、以 i 殘基?Cα 和 j 殘基 Cβ 確定的角度。c6d[b, i, j, torch.full_like(b, 3)]
:將計算結果存儲到一個 6D 張量(可能用于結構表征)。