kangmg / easyEDA

Reaction coordinates에 대해서 SobEDA를 쉽게 실행할 수 있는 shell 스크립트 파일
MIT License
0 stars 0 forks source link

range issue of dihedral_angle() #1

Closed kangmg closed 1 month ago

kangmg commented 9 months ago

source/plot.py 파일 내에 아래 함수의 range가 [0,360]가 아닌 [0,180]인 문제 발견

def dihedral_angle(atom1, atom2, atom3, atom4):

    b2 = np.array(atom3) - np.array(atom2)
    b1 = np.array(atom2) - np.array(atom1)
    b3 = np.array(atom4) - np.array(atom3)

    v1 = np.cross(b1, b2)
    v2 = np.cross(b2, b3)

    angle = np.arctan2(np.linalg.norm(np.cross(v1, v2)), np.dot(v1, v2))
    angle_degrees = np.degrees(angle)

    if angle_degrees < 0:
        angle_degrees += 360.0
    return angle_degrees
kangmg commented 9 months ago

아래 함수로 대체하면 문제없이 작동하지만 조금 더 확인 필요

def dihedral_angle(atom1, atom2, atom3, atom4):

    b2 = np.array(atom3) - np.array(atom2)
    b1 = np.array(atom2) - np.array(atom1)
    b3 = np.array(atom4) - np.array(atom3)

    v1 = np.cross(b1, b2)
    v2 = np.cross(b2, b3)

    angle = np.arccos(np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2)))
    angle_degrees = np.degrees(angle)

    if np.dot(np.cross(v1, v2), b2) < 0:
        angle_degrees = 360 - angle_degrees

    return angle_degrees